|
|
|
@ -49,8 +49,8 @@ |
|
|
|
; Sprite Attributes: $???? $???? |
|
|
|
; Unused: $???? $???? |
|
|
|
; |
|
|
|
TMSCTRL1: .EQU 1 ; CONTROL BITS |
|
|
|
TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT |
|
|
|
TMSCTRL1: .EQU 1 ; CONTROL BITS |
|
|
|
TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT |
|
|
|
; |
|
|
|
TMSKBD_NONE .EQU 0 |
|
|
|
TMSKBD_KBD .EQU 1 |
|
|
|
@ -269,9 +269,9 @@ TMS_PREINIT: |
|
|
|
; DISABLE INTERRUPT GENERATION UNTIL AFTER INTERRUPT HANDLER |
|
|
|
; HAS BEEN INSTALLED. |
|
|
|
LD A, (TMS_INITVDU_REG_1) |
|
|
|
RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT |
|
|
|
LD (TMS_INITVDU_REG_1), A |
|
|
|
LD C, TMSCTRL1 |
|
|
|
RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT |
|
|
|
LD (TMS_INITVDU_REG_1),A |
|
|
|
LD C, TMSCTRL1 |
|
|
|
JP TMS_SET_X ; SET REG W/O INT MGMT |
|
|
|
; |
|
|
|
TMS_INIT: |
|
|
|
@ -345,56 +345,20 @@ TMS_INIT1: |
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT " VDP=$" |
|
|
|
|
|
|
|
HB_DI |
|
|
|
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 |
|
|
|
HB_EI |
|
|
|
|
|
|
|
PUSH AF |
|
|
|
CALL TMS_CRTINIT ; SETUP THE TMS/V99x8 CHIP REGISTERS |
|
|
|
; THIS IS BEST DONE BEFORE DETECTION OF TYPE |
|
|
|
; AND VRAM SIZE |
|
|
|
POP AF |
|
|
|
|
|
|
|
|
|
|
|
INC A |
|
|
|
DEC A |
|
|
|
JR NZ, TMS_NOT9918 |
|
|
|
|
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT "TMS9918A$" |
|
|
|
JR TMS_INIT3 |
|
|
|
|
|
|
|
TMS_NOT9918: |
|
|
|
DEC A |
|
|
|
JR NZ, TMS_NOT9938 |
|
|
|
|
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT "V9938$" |
|
|
|
JR TMS_INIT2 |
|
|
|
|
|
|
|
TMS_NOT9938: |
|
|
|
DEC A |
|
|
|
JR NZ, TMS_NOTV9958 |
|
|
|
; PRINT THE CHIP TYPE DETECTED |
|
|
|
LD DE,TMS_CHIPSTR |
|
|
|
CALL PRTIDXDEA |
|
|
|
|
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT "V9958$" |
|
|
|
JR TMS_INIT2 |
|
|
|
|
|
|
|
TMS_NOTV9958: |
|
|
|
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 |
|
|
|
|
|
|
|
CALL TMS_CRTINIT ; SETUP THE TMS/V99x8 CHIP REGISTERS |
|
|
|
|
|
|
|
TMS_INIT2: |
|
|
|
JR TMS_INIT3 ; SKIPPING THIS FOR NOW... |
|
|
|
|
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT " VRAM=$" |
|
|
|
|
|
|
|
@ -771,7 +735,7 @@ TMS_SET_X: |
|
|
|
; |
|
|
|
TMS_WR: |
|
|
|
#IF (TMS80COLS) |
|
|
|
; CLEAR R#14 FOR V9958 |
|
|
|
; CLEAR R#14 FOR V9958 |
|
|
|
HB_DI |
|
|
|
XOR A |
|
|
|
EZ80_IO |
|
|
|
@ -850,6 +814,8 @@ TMS_GETTYP: |
|
|
|
; Code sourced from https://map.grauw.nl/sources/vdp_detection.php |
|
|
|
CALL TMS_IS9918 ; USE A DIFFERENT WAY TO DETECT TMS9918A |
|
|
|
JR Z,TMS_ISF18A ; IF TMS9918A CHECK FOR F18A VARIANT |
|
|
|
; |
|
|
|
; NOT A 9918 OR F18A, SO USE VDP ID |
|
|
|
LD A,1 ; SELECT S#1 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
@ -857,32 +823,33 @@ TMS_GETTYP: |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
EZ80_IO |
|
|
|
IN A,(TMS_CMDREG) ; READ S#1 |
|
|
|
AND 00111110B ; GET VDP ID |
|
|
|
IN A,(TMS_CMDREG) ; READ S#1 |
|
|
|
AND 00111110B ; GET VDP ID |
|
|
|
RRCA ; 00000 - V9938 1 |
|
|
|
; 00010 - V9958 2 |
|
|
|
; 10010 - v9958 3 |
|
|
|
|
|
|
|
EX AF,AF' |
|
|
|
XOR A ; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER |
|
|
|
; |
|
|
|
; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER |
|
|
|
PUSH AF |
|
|
|
XOR A |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,15 + 128 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
EX AF,AF' |
|
|
|
|
|
|
|
POP AF |
|
|
|
; |
|
|
|
; RETURN THE IDENTIFIED CHIP ID |
|
|
|
JR Z, TMS_ISV9938 |
|
|
|
CP 2 |
|
|
|
RET Z ; RETURN 2 FOR V9958 |
|
|
|
|
|
|
|
LD A, 3 |
|
|
|
RET ; RETURN 3 FOR SUPER V9958 |
|
|
|
|
|
|
|
TMS_ISV9938: |
|
|
|
INC A ; RETURN 1 FOR V9938 |
|
|
|
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 |
|
|
|
@ -901,6 +868,7 @@ TMS_ISF18A: |
|
|
|
LD A,57 + 128 ; REGISTER #57 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
; |
|
|
|
; GET VDP ID |
|
|
|
LD A,1 ; SELECT S#1 |
|
|
|
EZ80_IO |
|
|
|
@ -909,17 +877,35 @@ TMS_ISF18A: |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
EZ80_IO |
|
|
|
IN A,(TMS_CMDREG) ; READ S#1 |
|
|
|
AND 11110000B ; MASK HIGH NIBBLE |
|
|
|
IN A,(TMS_CMDREG) ; READ S#1 |
|
|
|
; |
|
|
|
; CHECK FOR F18A |
|
|
|
AND 11110000B ; MASK HIGH NIBBLE |
|
|
|
CP $E0 ; IS IT A F18A? |
|
|
|
LD A,0 ; SELECT S#0 / NOT F18A |
|
|
|
PUSH AF |
|
|
|
JR Z,TMS_ISF18A1 ; HANDLE IT IF SO |
|
|
|
; |
|
|
|
; ON A TRUE 9918, THE F18A UNLOCK CODE ABOVE WILL ENABLE |
|
|
|
; INTERRUPTS (REGISTER 57 ON A REAL 9918 WILL BE TREATED |
|
|
|
; AS REGISTER 1!). HERE WE GET INTERRUPTS TURNED BACK OFF. |
|
|
|
LD A, (TMS_INITVDU_REG_1) |
|
|
|
RES TMSINTEN,A ; RESET INTERRUPT ENABLE BIT |
|
|
|
LD C, TMSCTRL1 |
|
|
|
CALL TMS_SET_X ; SET REG W/O INT MGMT |
|
|
|
|
|
|
|
; WE DON'T BOTHER TO RESET THE STATUS REGISTER SELECTION OR |
|
|
|
; RELOCK BECAUSE THIS IS NOT AN F18A! |
|
|
|
XOR A ; CHIP ID FOR 9918A |
|
|
|
RET ; NOT F18A: A=0 |
|
|
|
|
|
|
|
TMS_ISF18A1: |
|
|
|
; RESTORE STATUS REGISTER S#0 FOR INT HANDLER |
|
|
|
XOR A ; SELECT S#0 / NOT F18A |
|
|
|
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 |
|
|
|
@ -927,8 +913,7 @@ TMS_ISF18A: |
|
|
|
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 |
|
|
|
|
|
|
|
@ -946,15 +931,19 @@ TMS_ISF18A: |
|
|
|
; F <- Z: TMS9918A, NZ: V99X8 |
|
|
|
; |
|
|
|
TMS_IS9918: |
|
|
|
LD C,TMS_CMDREG ; POINT TO CMD REG PORT |
|
|
|
; |
|
|
|
TMSIS9918_WAIT1: |
|
|
|
EZ80_IO |
|
|
|
IN A,(TMS_CMDREG) ; READ S#0, MAKE SURE INTERRUPT FLAG (F) IS RESET |
|
|
|
|
|
|
|
TMS_IS9918_WAIT: |
|
|
|
IN A,(C) ; READ S#0, MAKE SURE INTERRUPT FLAG (F) IS RESET |
|
|
|
JP M,TMSIS9918_WAIT1 ; LOOP UNTIL INT FLAG (F) IS RESET |
|
|
|
; |
|
|
|
TMS_IS9918_WAIT2: |
|
|
|
EZ80_IO |
|
|
|
IN A,(TMS_CMDREG) ; READ S#0 |
|
|
|
AND A ; WAIT UNTIL INTERRUPT FLAG (F) IS SET |
|
|
|
JP P,TMS_IS9918_WAIT |
|
|
|
|
|
|
|
IN A,(C) ; READ S#0 |
|
|
|
JP P,TMS_IS9918_WAIT2 ; WAIT UNTIL INTERRUPT FLAG (F) IS SET |
|
|
|
; |
|
|
|
; READ VB STATUS |
|
|
|
LD A,2 ; SELECT S#2 ON V9938 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
@ -963,16 +952,18 @@ TMS_IS9918_WAIT: |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
EZ80_IO |
|
|
|
IN A,(TMS_CMDREG) ; READ S#2 / S#0 |
|
|
|
|
|
|
|
EX AF,AF' |
|
|
|
XOR A ; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER |
|
|
|
; |
|
|
|
; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER |
|
|
|
PUSH AF |
|
|
|
XOR A |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
LD A,15 + 128 |
|
|
|
EZ80_IO |
|
|
|
OUT (TMS_CMDREG),A |
|
|
|
EX AF,AF' |
|
|
|
|
|
|
|
POP AF |
|
|
|
; |
|
|
|
; SET ZF APPROPRIATELY AND RETURN |
|
|
|
AND 01000000B ; CHECK IF BIT 6 WAS 0 (S#0 5S) OR 1 (S#2 VR) |
|
|
|
RET |
|
|
|
|
|
|
|
@ -1540,6 +1531,13 @@ TMS_POS .DW 0 ; CURRENT DISPLAY POSITION |
|
|
|
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR |
|
|
|
TMS_BUF .FILL 256,0 ; COPY BUFFER |
|
|
|
; |
|
|
|
TMS_CHIPSTR: |
|
|
|
TMS_STR9918 .TEXT "TMS9918A$" |
|
|
|
TMS_STR9938 .TEXT "V9938$" |
|
|
|
TMS_STR9958 .TEXT "V9958$" |
|
|
|
TMS_STR9958X .TEXT "SUPER V9958$" |
|
|
|
TMS_STRF18A .TEXT "F18A$" |
|
|
|
; |
|
|
|
; ### JLC Mod |
|
|
|
; 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 |
|
|
|
|