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;
5555TMSKBD_NONE .EQU 0
5656TMSKBD_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;
277277TMS_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
397359TMS_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;
772736TMS_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
882849TMS_ISV9938:
883- INC A ; RETURN 1 FOR V9938
850+ INC A ; RETURN 1 FOR V9938
884851 RET
885-
852+
886853TMS_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;
948933TMS_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
15401531TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
15411532TMS_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
15451543TMS_COLOR_TBL .DB $ 01 , $ 08 , $ 02 , $ 0A , $ 04 , $ 06 , $ 0C , $ 0F , $ 0E , $ 09 , $ 03 , $ 0B , $ 05 , $ 0D , $ 07 , $ 0F
0 commit comments