mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
F18A Detection Improvements, Issue #649
The F18A detection had a side effect of triggering errant interrupts. Should be resolved in this commit.
This commit is contained in:
@@ -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
|
||||
|
||||
; PRINT THE CHIP TYPE DETECTED
|
||||
LD DE,TMS_CHIPSTR
|
||||
CALL PRTIDXDEA
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user