|
|
|
@ -8,15 +8,19 @@ |
|
|
|
; UPDATED BY: DAN WERNER -- 2/11/2024 - DUODYNE SUPPORT |
|
|
|
; UPDATED BY: DAN WERNER -- 11/27/2025 - N8PC SUPPORT |
|
|
|
; UPDATED BY: DEAN NETHERTON -- 1/7/2026 - ADDED RUNTIME DETECTION OF CHIP TYPE AND VRAM SIZE |
|
|
|
; UPDATED BY: HENK BERENDS - 1/15/2026 - ADDED F18A FPGA DETECTION AND REPORT VDP_ID IN VDADEV FUNCTION |
|
|
|
|
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
; TODO: |
|
|
|
; - CAN WE AUTO DETECT TMS VS V99x8 AND THUS AUTO SELECT TMS80COLS AT RUNTIME? |
|
|
|
; - CAN WE AUTO DETECT TYPE FOR FPGA EMULATED VERSIONS? |
|
|
|
; - CAN WE SET 40/80 COLUMNS AT RUNTIME BASED ON DETECTED VDP_ID (40:ID=0 80:ID>0)? |
|
|
|
; - IS THERE A NEED TO DETECT OTHER THAN F18A FPGA? IF YES WHICH ONE(S)? |
|
|
|
; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION? |
|
|
|
; - IMPLEMENT ALTERNATE DISPLAY MODES? |
|
|
|
; - IMPLEMENT DYNAMIC READ/WRITE OF CHARACTER BITMAP DATA? |
|
|
|
; - SET REGISTERS DEPENDING ON TMSMODE AND VDP_ID (USE COLECO OR MSX DEFAULTS)? |
|
|
|
; - DETECT VRAM SIZES 4KB,16KB AND 32KB |
|
|
|
; - REPORT OTHER ATTRIBUTES IN VDADEV FUNCTION? |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; TMS DRIVER - CONSTANTS |
|
|
|
@ -341,7 +345,8 @@ TMS_INIT1: |
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT " VDP=$" |
|
|
|
|
|
|
|
CALL TMS_GETTYP ; A <- 0: TMS9918A, 1: V9938, 2: V9958, x: VDP ID |
|
|
|
CALL TMS_GETTYP ; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: SUPER V9958, 4:F18A |
|
|
|
LD (TMS_ATTRIB),A ; SET VDP_ID IN LOW BYTE OF DEVICE ATTRIBUTES |
|
|
|
|
|
|
|
PUSH AF |
|
|
|
CALL TMS_CRTINIT ; SETUP THE TMS/V99x8 CHIP REGISTERS |
|
|
|
@ -355,8 +360,8 @@ TMS_INIT1: |
|
|
|
JR NZ, TMS_NOT9918 |
|
|
|
|
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT "TMS9918 VRAM=16KB INTERRUPT=60HZ$" |
|
|
|
JR TMS_INIT4 |
|
|
|
.TEXT "TMS9918A$" |
|
|
|
JR TMS_INIT3 |
|
|
|
|
|
|
|
TMS_NOT9918: |
|
|
|
DEC A |
|
|
|
@ -375,10 +380,19 @@ TMS_NOT9938: |
|
|
|
JR TMS_INIT2 |
|
|
|
|
|
|
|
TMS_NOTV9958: |
|
|
|
; ASSUME SUPER V9958 |
|
|
|
DEC A |
|
|
|
JR NZ, TMS_NOTSV9958 |
|
|
|
|
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT "SUPER V9958 VRAM=8MB$" |
|
|
|
JR TMS_INIT3 |
|
|
|
|
|
|
|
TMS_NOTSV9958: |
|
|
|
; ASSUME F18A |
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT "F18A$" |
|
|
|
JR TMS_INIT3 |
|
|
|
|
|
|
|
|
|
|
|
TMS_INIT2: |
|
|
|
CALL PRTSTRD |
|
|
|
@ -390,14 +404,14 @@ TMS_INIT2: |
|
|
|
JR NZ, NOT_64K |
|
|
|
|
|
|
|
PRTS("64KB$") |
|
|
|
JR TMS_INIT4 |
|
|
|
JR TMS_INIT3 |
|
|
|
|
|
|
|
NOT_64K: |
|
|
|
DEC A |
|
|
|
JR NZ, NOT_128K |
|
|
|
|
|
|
|
PRTS("128KB$") |
|
|
|
JR TMS_INIT4 |
|
|
|
JR TMS_INIT3 |
|
|
|
|
|
|
|
NOT_128K: |
|
|
|
PRTS("192KB$") |
|
|
|
@ -568,6 +582,7 @@ TMS_VDARES: |
|
|
|
RET |
|
|
|
|
|
|
|
TMS_VDADEV: |
|
|
|
LD BC,(TMS_ATTRIB) ; C := DEVICE ATTRIBUTES: VDP ID (B:= 0,RESERVED) |
|
|
|
LD D,VDADEV_TMS ; D := DEVICE TYPE |
|
|
|
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO |
|
|
|
LD H,TMSMODE ; H := MODE |
|
|
|
@ -829,13 +844,12 @@ TMS_PROBE: |
|
|
|
; |
|
|
|
; ASSUMES INTERRUPTS ARE DISABLED (DI) |
|
|
|
; |
|
|
|
; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: Super V9958 |
|
|
|
; F <- z: TMS9918A, nz: other |
|
|
|
; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: Super V9958, 4: F18A |
|
|
|
; |
|
|
|
TMS_GETTYP: |
|
|
|
; Code sourced from https://map.grauw.nl/sources/vdp_detection.php |
|
|
|
CALL TMS_IS9918 ; USE A DIFFERENT WAY TO DETECT TMS9918A |
|
|
|
RET Z ; RETURN 0 FOR TMS9918 |
|
|
|
JR Z,TMS_ISF18A ; IF TMS9918A CHECK FOR F18A VARIANT |
|
|
|
LD A,1 ; SELECT S#1 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
@ -868,6 +882,56 @@ TMS_GETTYP: |
|
|
|
TMS_ISV9938: |
|
|
|
INC A ; RETURN 1 FOR V9938 |
|
|
|
RET |
|
|
|
|
|
|
|
TMS_ISF18A: |
|
|
|
; CHECK FOR F18A FPGA/EMULATOR VARIANT |
|
|
|
; THE VDP REGISTERS MUST BE (RE)INITIALIZED AFTER THE CHECK |
|
|
|
; RETURN A <- 0:TMS9918A 4:F18A |
|
|
|
; |
|
|
|
; UNLOCK THE F18A: SEND VALUE $1C TO REGISTER 57 TWICE |
|
|
|
LD A,$1C ; UNLOCK VALUE |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,57 + 128 ; REGISTER #57 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,$1C ; UNLOCK VALUE |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,57 + 128 ; REGISTER #57 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
; GET VDP ID |
|
|
|
LD A,1 ; SELECT S#1 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,15 + 128 ; REGISTER #15 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
EZ80_IO |
|
|
|
IN A,(TMS_CMDREG) ; READ S#1 |
|
|
|
AND 11110000B ; MASK HIGH NIBBLE |
|
|
|
CP $E0 ; IS IT A F18A? |
|
|
|
LD A,0 ; SELECT S#0 / NOT F18A |
|
|
|
PUSH AF |
|
|
|
; RESTORE STATUS REGISTER S#0 FOR INT HANDLER |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,15 + 128 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
; RELOCK THE F18A |
|
|
|
XOR A ; LOCK VALUE |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,57 + 128 ; REGISTER #57 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
POP AF |
|
|
|
RET NZ ; NOT F18A: A=0 |
|
|
|
LD A,4 ; F18A: A=4 |
|
|
|
RET |
|
|
|
|
|
|
|
; |
|
|
|
; TEST IF THE VDP IS A TMS9918A. |
|
|
|
; |
|
|
|
@ -1480,6 +1544,8 @@ TMS_BUF .FILL 256,0 ; COPY BUFFER |
|
|
|
; ANSI-->TMS Color Conversion Table |
|
|
|
TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F |
|
|
|
; |
|
|
|
TMS_ATTRIB .DW 0 ; VDA DEVICE ATTRIBUTES (VDP_ID,VRAM,FREQ) |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; TMS DRIVER - INSTANCE DATA |
|
|
|
;================================================================================================== |
|
|
|
|