diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 8f89a318..cc555244 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -318,6 +318,34 @@ TMS_INIT: RET ; TMS_INIT1: + CALL PRTSTRD + .TEXT " VDP=$" + + CALL TMS_GETTYP ; A <- 0: TMS9918A, 1: V9938, 2: V9958, x: VDP ID + + INC A + DEC A + JR NZ, TMS_NOT9918 + + CALL PRTSTRD + .TEXT "TMS9918$" + JR TMS_INIT2 + +TMS_NOT9918: + DEC A + JR NZ, TMS_NOT9938 + + CALL PRTSTRD + .TEXT "V9938$" + JR TMS_INIT2 + +TMS_NOT9938: + ; ASSUME V9958 + CALL PRTSTRD + .TEXT "V9958$" + +TMS_INIT2: + #IF (TMSTIMENABLE) CALL PRTSTRD .TEXT " INTERRUPT ENABLED$" @@ -712,12 +740,10 @@ TMS_PROBE: LD A,$A5 ; FIRST BYTE EZ80_IO OUT (TMS_DATREG),A ; OUTPUT - ;TMS_IODELAY ; DELAY CALL DLY64 ; DELAY CPL ; COMPLEMENT ACCUM EZ80_IO OUT (TMS_DATREG),A ; SECOND BYTE - ;TMS_IODELAY ; DELAY CALL DLY64 ; DELAY ; ; SET READ ADDRESS TO $0000 @@ -727,18 +753,94 @@ TMS_PROBE: LD C,$A5 ; VALUE TO EXPECT EZ80_IO IN A,(TMS_DATREG) ; READ FIRST BYTE - ;TMS_IODELAY ; DELAY CALL DLY64 ; DELAY CP C ; COMPARE RET NZ ; RETURN ON MISCOMPARE EZ80_IO IN A,(TMS_DATREG) ; READ SECOND BYTE - ;TMS_IODELAY ; DELAY CALL DLY64 ; DELAY CPL ; COMPLEMENT IT CP C ; COMPARE RET ; RETURN WITH RESULT IN Z ; +; DETECT VDP VERSION +; +; ASSUMES INTERRUPTS ARE DISABLED (DI) +; +; A <- 0: TMS9918A, 1: V9938, 2: V9958, x: VDP ID +; F <- z: TMS9918A, nz: other +; +TMS_GETTYP: + ; Code sourced from https://map.grauw.nl/sources/vdp_detection.php + CALL TMS_IS9918 ; USE A DIFFERENT WAY TO DETECT TMS9918A + RET Z ; RETURN 0 FOR TMS9918 + LD A,1 ; SELECT S#1 + EZ80_IO + OUT (TMS_CMDREG),A + LD A,15 + 128 + EZ80_IO + OUT (TMS_CMDREG),A + EZ80_IO + IN A,(TMS_CMDREG) ; READ S#1 + AND 00111110B ; GET VDP ID + RRCA + + EX AF,AF' + XOR A ; RESTORE SELECT REGISTER TO S#0 FOR INT HANDLER + EZ80_IO + OUT (TMS_CMDREG),A + LD A,15 + 128 + EZ80_IO + OUT (TMS_CMDREG),A + EX AF,AF' + + RET NZ ; RETURN VDP ID FOR V9958 OR HIGHER + INC A ; RETURN 1 FOR V9938 + RET +; +; TEST IF THE VDP IS A TMS9918A. +; +; THE VDP ID NUMBER WAS ONLY INTRODUCED IN THE V9938, SO WE HAVE TO USE A +; DIFFERENT METHOD TO DETECT THE TMS9918A. WE WAIT FOR THE VERTICAL BLANKING +; INTERRUPT FLAG, AND THEN QUICKLY READ STATUS REGISTER 2 AND EXPECT BIT 6 +; (VR, VERTICAL RETRACE FLAG) TO BE SET AS WELL. THE TMS9918A HAS ONLY ONE +; STATUS REGISTER, SO BIT 6 (5S, 5TH SPRITE FLAG) WILL RETURN 0 INSTEAD. +; +; ASSUMES INTERRUPTS ARE DISABLED (DI) +; +; F <- Z: TMS9918A, NZ: V99X8 +; +TMS_IS9918: + EZ80_IO + IN A,(TMS_CMDREG) ; READ S#0, MAKE SURE INTERRUPT FLAG (F) IS RESET + +TMS_IS9918_WAIT: + EZ80_IO + IN A,(TMS_CMDREG) ; READ S#0 + AND A ; WAIT UNTIL INTERRUPT FLAG (F) IS SET + JP P,TMS_IS9918_WAIT + + LD A,2 ; SELECT S#2 ON V9938 + EZ80_IO + OUT (TMS_CMDREG),A + LD A,15 + 128 ; (THIS MIRRORS TO R#7 ON TMS9918 VDPS) + EZ80_IO + 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 + EZ80_IO + OUT (TMS_CMDREG),A + LD A,15 + 128 + EZ80_IO + OUT (TMS_CMDREG),A + EX AF,AF' + + AND 01000000B ; CHECK IF BIT 6 WAS 0 (S#0 5S) OR 1 (S#2 VR) + RET +; ;---------------------------------------------------------------------- ; TMS9918 DISPLAY CONTROLLER CHIP INITIALIZATION ;----------------------------------------------------------------------