Skip to content

Commit b161ada

Browse files
committed
F18A Detection Improvements, Issue #649
The F18A detection had a side effect of triggering errant interrupts. Should be resolved in this commit.
1 parent da97551 commit b161ada

1 file changed

Lines changed: 76 additions & 78 deletions

File tree

Source/HBIOS/tms.asm

Lines changed: 76 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@
4949
; Sprite Attributes: $???? $????
5050
; Unused: $???? $????
5151
;
52-
TMSCTRL1: .EQU 1 ; CONTROL BITS
53-
TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT
52+
TMSCTRL1: .EQU 1 ; CONTROL BITS
53+
TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT
5454
;
5555
TMSKBD_NONE .EQU 0
5656
TMSKBD_KBD .EQU 1
@@ -269,9 +269,9 @@ TMS_PREINIT:
269269
; DISABLE INTERRUPT GENERATION UNTIL AFTER INTERRUPT HANDLER
270270
; HAS BEEN INSTALLED.
271271
LD A, (TMS_INITVDU_REG_1)
272-
RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT
273-
LD (TMS_INITVDU_REG_1), A
274-
LD C, TMSCTRL1
272+
RES TMSINTEN, A ; RESET INTERRUPT ENABLE BIT
273+
LD (TMS_INITVDU_REG_1),A
274+
LD C, TMSCTRL1
275275
JP TMS_SET_X ; SET REG W/O INT MGMT
276276
;
277277
TMS_INIT:
@@ -345,56 +345,20 @@ TMS_INIT1:
345345
CALL PRTSTRD
346346
.TEXT " VDP=$"
347347

348+
HB_DI
348349
CALL TMS_GETTYP ; A <- 0: TMS9918A, 1: V9938, 2: V9958, 3: SUPER V9958, 4:F18A
349350
LD (TMS_ATTRIB),A ; SET VDP_ID IN LOW BYTE OF DEVICE ATTRIBUTES
351+
HB_EI
350352

351-
PUSH AF
352-
CALL TMS_CRTINIT ; SETUP THE TMS/V99x8 CHIP REGISTERS
353-
; THIS IS BEST DONE BEFORE DETECTION OF TYPE
354-
; AND VRAM SIZE
355-
POP AF
356-
357-
358-
INC A
359-
DEC A
360-
JR NZ, TMS_NOT9918
361-
362-
CALL PRTSTRD
363-
.TEXT "TMS9918A$"
364-
JR TMS_INIT3
365-
366-
TMS_NOT9918:
367-
DEC A
368-
JR NZ, TMS_NOT9938
369-
370-
CALL PRTSTRD
371-
.TEXT "V9938$"
372-
JR TMS_INIT2
373-
374-
TMS_NOT9938:
375-
DEC A
376-
JR NZ, TMS_NOTV9958
353+
; PRINT THE CHIP TYPE DETECTED
354+
LD DE,TMS_CHIPSTR
355+
CALL PRTIDXDEA
377356

378-
CALL PRTSTRD
379-
.TEXT "V9958$"
380-
JR TMS_INIT2
381-
382-
TMS_NOTV9958:
383-
DEC A
384-
JR NZ, TMS_NOTSV9958
385-
386-
CALL PRTSTRD
387-
.TEXT "SUPER V9958 VRAM=8MB$"
388-
JR TMS_INIT3
389-
390-
TMS_NOTSV9958:
391-
; ASSUME F18A
392-
CALL PRTSTRD
393-
.TEXT "F18A$"
394-
JR TMS_INIT3
395-
357+
CALL TMS_CRTINIT ; SETUP THE TMS/V99x8 CHIP REGISTERS
396358

397359
TMS_INIT2:
360+
JR TMS_INIT3 ; SKIPPING THIS FOR NOW...
361+
398362
CALL PRTSTRD
399363
.TEXT " VRAM=$"
400364

@@ -771,7 +735,7 @@ TMS_SET_X:
771735
;
772736
TMS_WR:
773737
#IF (TMS80COLS)
774-
; CLEAR R#14 FOR V9958
738+
; CLEAR R#14 FOR V9958
775739
HB_DI
776740
XOR A
777741
EZ80_IO
@@ -850,39 +814,42 @@ TMS_GETTYP:
850814
; Code sourced from https://map.grauw.nl/sources/vdp_detection.php
851815
CALL TMS_IS9918 ; USE A DIFFERENT WAY TO DETECT TMS9918A
852816
JR Z,TMS_ISF18A ; IF TMS9918A CHECK FOR F18A VARIANT
817+
;
818+
; NOT A 9918 OR F18A, SO USE VDP ID
853819
LD A,1 ; SELECT S#1
854820
EZ80_IO
855821
OUT (TMS_CMDREG),A
856822
LD A,15 + 128
857823
EZ80_IO
858824
OUT (TMS_CMDREG),A
859825
EZ80_IO
860-
IN A,(TMS_CMDREG) ; READ S#1
861-
AND 00111110B ; GET VDP ID
826+
IN A,(TMS_CMDREG) ; READ S#1
827+
AND 00111110B ; GET VDP ID
862828
RRCA ; 00000 - V9938 1
863829
; 00010 - V9958 2
864830
; 10010 - v9958 3
865-
866-
EX AF,AF'
867-
XOR A ; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER
831+
;
832+
; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER
833+
PUSH AF
834+
XOR A
868835
EZ80_IO
869836
OUT (TMS_CMDREG),A
870837
LD A,15 + 128
871838
EZ80_IO
872839
OUT (TMS_CMDREG),A
873-
EX AF,AF'
874-
840+
POP AF
841+
;
842+
; RETURN THE IDENTIFIED CHIP ID
875843
JR Z, TMS_ISV9938
876844
CP 2
877845
RET Z ; RETURN 2 FOR V9958
878-
879846
LD A, 3
880847
RET ; RETURN 3 FOR SUPER V9958
881848

882849
TMS_ISV9938:
883-
INC A ; RETURN 1 FOR V9938
850+
INC A ; RETURN 1 FOR V9938
884851
RET
885-
852+
886853
TMS_ISF18A:
887854
; CHECK FOR F18A FPGA/EMULATOR VARIANT
888855
; THE VDP REGISTERS MUST BE (RE)INITIALIZED AFTER THE CHECK
@@ -901,6 +868,7 @@ TMS_ISF18A:
901868
LD A,57 + 128 ; REGISTER #57
902869
EZ80_IO
903870
OUT (TMS_CMDREG),A
871+
;
904872
; GET VDP ID
905873
LD A,1 ; SELECT S#1
906874
EZ80_IO
@@ -909,26 +877,43 @@ TMS_ISF18A:
909877
EZ80_IO
910878
OUT (TMS_CMDREG),A
911879
EZ80_IO
912-
IN A,(TMS_CMDREG) ; READ S#1
913-
AND 11110000B ; MASK HIGH NIBBLE
880+
IN A,(TMS_CMDREG) ; READ S#1
881+
;
882+
; CHECK FOR F18A
883+
AND 11110000B ; MASK HIGH NIBBLE
914884
CP $E0 ; IS IT A F18A?
915-
LD A,0 ; SELECT S#0 / NOT F18A
916-
PUSH AF
885+
JR Z,TMS_ISF18A1 ; HANDLE IT IF SO
886+
;
887+
; ON A TRUE 9918, THE F18A UNLOCK CODE ABOVE WILL ENABLE
888+
; INTERRUPTS (REGISTER 57 ON A REAL 9918 WILL BE TREATED
889+
; AS REGISTER 1!). HERE WE GET INTERRUPTS TURNED BACK OFF.
890+
LD A, (TMS_INITVDU_REG_1)
891+
RES TMSINTEN,A ; RESET INTERRUPT ENABLE BIT
892+
LD C, TMSCTRL1
893+
CALL TMS_SET_X ; SET REG W/O INT MGMT
894+
895+
; WE DON'T BOTHER TO RESET THE STATUS REGISTER SELECTION OR
896+
; RELOCK BECAUSE THIS IS NOT AN F18A!
897+
XOR A ; CHIP ID FOR 9918A
898+
RET ; NOT F18A: A=0
899+
900+
TMS_ISF18A1:
917901
; RESTORE STATUS REGISTER S#0 FOR INT HANDLER
902+
XOR A ; SELECT S#0 / NOT F18A
918903
EZ80_IO
919904
OUT (TMS_CMDREG),A
920905
LD A,15 + 128
921906
EZ80_IO
922907
OUT (TMS_CMDREG),A
908+
;
923909
; RELOCK THE F18A
924910
XOR A ; LOCK VALUE
925911
EZ80_IO
926912
OUT (TMS_CMDREG),A
927913
LD A,57 + 128 ; REGISTER #57
928914
EZ80_IO
929915
OUT (TMS_CMDREG),A
930-
POP AF
931-
RET NZ ; NOT F18A: A=0
916+
;
932917
LD A,4 ; F18A: A=4
933918
RET
934919
@@ -946,15 +931,19 @@ TMS_ISF18A:
946931
; F <- Z: TMS9918A, NZ: V99X8
947932
;
948933
TMS_IS9918:
934+
LD C,TMS_CMDREG ; POINT TO CMD REG PORT
935+
;
936+
TMSIS9918_WAIT1:
949937
EZ80_IO
950-
IN A,(TMS_CMDREG) ; READ S#0, MAKE SURE INTERRUPT FLAG (F) IS RESET
951-
952-
TMS_IS9918_WAIT:
938+
IN A,(C) ; READ S#0, MAKE SURE INTERRUPT FLAG (F) IS RESET
939+
JP M,TMSIS9918_WAIT1 ; LOOP UNTIL INT FLAG (F) IS RESET
940+
;
941+
TMS_IS9918_WAIT2:
953942
EZ80_IO
954-
IN A,(TMS_CMDREG) ; READ S#0
955-
AND A ; WAIT UNTIL INTERRUPT FLAG (F) IS SET
956-
JP P,TMS_IS9918_WAIT
957-
943+
IN A,(C) ; READ S#0
944+
JP P,TMS_IS9918_WAIT2 ; WAIT UNTIL INTERRUPT FLAG (F) IS SET
945+
;
946+
; READ VB STATUS
958947
LD A,2 ; SELECT S#2 ON V9938
959948
EZ80_IO
960949
OUT (TMS_CMDREG),A
@@ -963,16 +952,18 @@ TMS_IS9918_WAIT:
963952
OUT (TMS_CMDREG),A
964953
EZ80_IO
965954
IN A,(TMS_CMDREG) ; READ S#2 / S#0
966-
967-
EX AF,AF'
968-
XOR A ; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER
955+
;
956+
; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER
957+
PUSH AF
958+
XOR A
969959
EZ80_IO
970960
OUT (TMS_CMDREG),A
971961
LD A,15 + 128
972962
EZ80_IO
973963
OUT (TMS_CMDREG),A
974-
EX AF,AF'
975-
964+
POP AF
965+
;
966+
; SET ZF APPROPRIATELY AND RETURN
976967
AND 01000000B ; CHECK IF BIT 6 WAS 0 (S#0 5S) OR 1 (S#2 VR)
977968
RET
978969

@@ -1540,6 +1531,13 @@ TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
15401531
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
15411532
TMS_BUF .FILL 256,0 ; COPY BUFFER
15421533
;
1534+
TMS_CHIPSTR:
1535+
TMS_STR9918 .TEXT "TMS9918A$"
1536+
TMS_STR9938 .TEXT "V9938$"
1537+
TMS_STR9958 .TEXT "V9958$"
1538+
TMS_STR9958X .TEXT "SUPER V9958$"
1539+
TMS_STRF18A .TEXT "F18A$"
1540+
;
15431541
; ### JLC Mod
15441542
; ANSI-->TMS Color Conversion Table
15451543
TMS_COLOR_TBL .DB $01,$08,$02,$0A,$04,$06,$0C,$0F,$0E,$09,$03,$0B,$05,$0D,$07,$0F

0 commit comments

Comments
 (0)