From b161ada16aca5228f815faad9928b38098ecfeef Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Sun, 1 Feb 2026 14:05:37 -0800 Subject: [PATCH] F18A Detection Improvements, Issue #649 The F18A detection had a side effect of triggering errant interrupts. Should be resolved in this commit. --- Source/HBIOS/tms.asm | 154 +++++++++++++++++++++---------------------- 1 file changed, 76 insertions(+), 78 deletions(-) diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 89c5da88..b8404122 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -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