Browse Source

hbios/tms: Added detection and reporting of vdp type (TMS9918/V9938/V9958)

pull/643/head
Dean Netherton 3 weeks ago
parent
commit
0c13a056b4
  1. 110
      Source/HBIOS/tms.asm

110
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
;----------------------------------------------------------------------

Loading…
Cancel
Save