Browse Source

F18A Detection Improvements, Issue #649

The F18A detection had a side effect of triggering errant interrupts.  Should be resolved in this commit.
pull/656/head
Wayne Warthen 4 days ago
parent
commit
b161ada16a
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 154
      Source/HBIOS/tms.asm

154
Source/HBIOS/tms.asm

@ -49,8 +49,8 @@
; Sprite Attributes: $???? $???? ; Sprite Attributes: $???? $????
; Unused: $???? $???? ; 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_NONE .EQU 0
TMSKBD_KBD .EQU 1 TMSKBD_KBD .EQU 1
@ -269,9 +269,9 @@ TMS_PREINIT:
; DISABLE INTERRUPT GENERATION UNTIL AFTER INTERRUPT HANDLER ; DISABLE INTERRUPT GENERATION UNTIL AFTER INTERRUPT HANDLER
; HAS BEEN INSTALLED. ; HAS BEEN INSTALLED.
LD A, (TMS_INITVDU_REG_1) 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 JP TMS_SET_X ; SET REG W/O INT MGMT
; ;
TMS_INIT: TMS_INIT:
@ -345,56 +345,20 @@ TMS_INIT1:
CALL PRTSTRD CALL PRTSTRD
.TEXT " VDP=$" .TEXT " VDP=$"
HB_DI
CALL TMS_GETTYP ; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: SUPER V9958, 4:F18A 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 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: TMS_INIT2:
JR TMS_INIT3 ; SKIPPING THIS FOR NOW...
CALL PRTSTRD CALL PRTSTRD
.TEXT " VRAM=$" .TEXT " VRAM=$"
@ -771,7 +735,7 @@ TMS_SET_X:
; ;
TMS_WR: TMS_WR:
#IF (TMS80COLS) #IF (TMS80COLS)
; CLEAR R#14 FOR V9958
; CLEAR R#14 FOR V9958
HB_DI HB_DI
XOR A XOR A
EZ80_IO EZ80_IO
@ -850,6 +814,8 @@ TMS_GETTYP:
; Code sourced from https://map.grauw.nl/sources/vdp_detection.php ; Code sourced from https://map.grauw.nl/sources/vdp_detection.php
CALL TMS_IS9918 ; USE A DIFFERENT WAY TO DETECT TMS9918A CALL TMS_IS9918 ; USE A DIFFERENT WAY TO DETECT TMS9918A
JR Z,TMS_ISF18A ; IF TMS9918A CHECK FOR F18A VARIANT 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 LD A,1 ; SELECT S#1
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
@ -857,32 +823,33 @@ TMS_GETTYP:
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
EZ80_IO 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 RRCA ; 00000 - V9938 1
; 00010 - V9958 2 ; 00010 - V9958 2
; 10010 - v9958 3 ; 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 EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
LD A,15 + 128 LD A,15 + 128
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
EX AF,AF'
POP AF
;
; RETURN THE IDENTIFIED CHIP ID
JR Z, TMS_ISV9938 JR Z, TMS_ISV9938
CP 2 CP 2
RET Z ; RETURN 2 FOR V9958 RET Z ; RETURN 2 FOR V9958
LD A, 3 LD A, 3
RET ; RETURN 3 FOR SUPER V9958 RET ; RETURN 3 FOR SUPER V9958
TMS_ISV9938: TMS_ISV9938:
INC A ; RETURN 1 FOR V9938
INC A ; RETURN 1 FOR V9938
RET RET
TMS_ISF18A: TMS_ISF18A:
; CHECK FOR F18A FPGA/EMULATOR VARIANT ; CHECK FOR F18A FPGA/EMULATOR VARIANT
; THE VDP REGISTERS MUST BE (RE)INITIALIZED AFTER THE CHECK ; THE VDP REGISTERS MUST BE (RE)INITIALIZED AFTER THE CHECK
@ -901,6 +868,7 @@ TMS_ISF18A:
LD A,57 + 128 ; REGISTER #57 LD A,57 + 128 ; REGISTER #57
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
;
; GET VDP ID ; GET VDP ID
LD A,1 ; SELECT S#1 LD A,1 ; SELECT S#1
EZ80_IO EZ80_IO
@ -909,17 +877,35 @@ TMS_ISF18A:
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
EZ80_IO 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? 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 ; RESTORE STATUS REGISTER S#0 FOR INT HANDLER
XOR A ; SELECT S#0 / NOT F18A
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
LD A,15 + 128 LD A,15 + 128
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
;
; RELOCK THE F18A ; RELOCK THE F18A
XOR A ; LOCK VALUE XOR A ; LOCK VALUE
EZ80_IO EZ80_IO
@ -927,8 +913,7 @@ TMS_ISF18A:
LD A,57 + 128 ; REGISTER #57 LD A,57 + 128 ; REGISTER #57
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
POP AF
RET NZ ; NOT F18A: A=0
;
LD A,4 ; F18A: A=4 LD A,4 ; F18A: A=4
RET RET
@ -946,15 +931,19 @@ TMS_ISF18A:
; F <- Z: TMS9918A, NZ: V99X8 ; F <- Z: TMS9918A, NZ: V99X8
; ;
TMS_IS9918: TMS_IS9918:
LD C,TMS_CMDREG ; POINT TO CMD REG PORT
;
TMSIS9918_WAIT1:
EZ80_IO 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 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 LD A,2 ; SELECT S#2 ON V9938
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
@ -963,16 +952,18 @@ TMS_IS9918_WAIT:
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
EZ80_IO EZ80_IO
IN A,(TMS_CMDREG) ; READ S#2 / S#0 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 EZ80_IO
OUT (TMS_CMDREG),A OUT (TMS_CMDREG),A
LD A,15 + 128 LD A,15 + 128
EZ80_IO EZ80_IO
OUT (TMS_CMDREG),A 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) AND 01000000B ; CHECK IF BIT 6 WAS 0 (S#0 5S) OR 1 (S#2 VR)
RET RET
@ -1540,6 +1531,13 @@ TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
TMS_BUF .FILL 256,0 ; COPY BUFFER 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 ; ### JLC Mod
; ANSI-->TMS Color Conversion Table ; 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_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F

Loading…
Cancel
Save