More TMS Driver Tweaks, Issue #649

Updated the TMS driver VRAM probe code to use the pre-existing driver routines for setting registers and RAM address.  This makes the code substantially smaller and makes it consistent with the rest of the driver.

No functional changes in the VRAM detection algorithm.
This commit is contained in:
Wayne Warthen
2026-02-03 13:31:01 -08:00
parent 50858a3a7d
commit 8163311c31

View File

@@ -39,7 +39,8 @@
; PIN THAN CAN BE CONNECTED TO THE CPU. IF THIS IS USED, THEN
; THE SOFTWARE WAITS CAN POTENTIALLY BE DISABLED. HOWEVER, I
; HAVE NOT HAD SUCCESS WITH THIS IN PRACTICE. SEE THE TMS_IODELAY
; MACRO BELOW TO ADJUST THE DELAY.
; MACRO BELOW TO ADJUST THE DELAY. SEE MORE COMMENTS BELOW
; WHERE THE TMS_IODELAY MACRO IS DEFINED.
;
;======================================================================
; TMS DRIVER - CONSTANTS
@@ -240,10 +241,20 @@ USBKYBENABLE .SET TRUE ; INCLUDE USB KEYBOARD SUPPORT
; TMS_IODELAY IS USED TO ADD REQUIRED RECOVERY TIME TO TMS9918/V9958 I/O.
; THE DELAYS DEFINED BELOW ARE PRETTY CONSERVATIVE AND WILL PROBABLY BE
; OK FOR THE V9958 (SLOWEST VDP).
; THE DELAYS IMPLEMENTED HERE ARE PRETTY CONSERVATIVE AND SHOULD WORK
; IN MOST SCENARIOS.
; AT PRESENT, THE MACRO JUST INJECTS A DELAY BASED ON THE SPEED OF THE
; CPU.
; IF YOUR VDP IS NOT DETECTED OR YOU SEE SCREEN CORRUPTION, YOU MAY NEED
; TO INCREASE THE DELAY.
; DEPENDING ON YOUR SYSTEM AND YOUR VDP CHIP, YOU MAY BE ABLE TO
; DECREASE THE DELAY.
; DECREASE THE DELAY. THIS IS ESPECIALLY TRUE IF YOU ARE USING AN
; FPGA-BASED 99X8 EMULATOR -- THESE CAN NORMALLY RUN WITH NO DELAYS.
;
; TO MODIFY THE DELAY MACRO, IT IS RECOMMENDED THAT YOU JUST DEFINE
; YOUR OWN DEFINITION IN YOUR CONFIG FILE. THE FIRST INSTANCE OF A
; #DEFINE WILL "WIN", SO A DEFINE IN YOUR CONFIG FILE WILL TAKE
; PRECEDENCE.
;
#IF (CPUMHZ > 10)
#DEFINE TMS_IODELAY CALL DLY4 ; 100 T/S
@@ -973,7 +984,7 @@ TMS_IS9918_WAIT2:
; A <- 0: <UNKNOWN> 1: 4K 2: 16K 3: 32K 4: 64K 5: 128K 6: 192K 7: 1MB
;
TMS_VRMPRB:
; HANDLE EXCEPTIONS
;; HANDLE EXCEPTIONS
LD A,(TMS_VDPID) ; GET VDP ID
CP TMSVDP_TMS9918 ; IF BASIC TMS9918
JR Z,TMS_VRMPRB_UNK ; ... THEN VRAM SIZE IS UNKNOWN
@@ -989,45 +1000,34 @@ TMS_VRMPRB_UNK:
;
TMS_VRMPRB_1MB:
LD A,7 ; SET VALUE TO 1MB
RET ; AND RETUNR
RET ; AND RETURN
;
TMS_VRMPRB1:
; START OF REAL VRAM PROBING
LD A,4 ; SET RETURN VALUE FOR 64K
EX AF,AF'
; R#14=4: A16-A14=100
LD A,4
; USE 16 BIT I/O ADDRESS FOR EZ80 COMPATIBILITY
; (AVOID NEED FOR EZ80_IO MACRO)
LD BC, (IO_SEGMENT<<8)+TMS_CMDREG
OUT (C),A
CALL DLY64 ; DELAY
LD A,$8E
OUT (C),A ; R#14 = 4 -> A16 = 1, A15..A14 = 0
CALL DLY64 ; DELAY
XOR A
OUT (C),A ; A7..A0 = 0
CALL DLY64 ; DELAY
OR $40
OUT (C),A ; SET WR, A13..A8 = 0
CALL DLY64 ; DELAY
LD C,14
CALL TMS_SET_X
; A13-A0=0, MODE=WRITE
LD HL,0
CALL TMS_WR
; WRITE $76 TO VRAM
LD A,$76
CALL DLY64 ; DELAY
LD C, TMS_DATREG
OUT (C),A ; SET VRAM $10000 = $76
CALL DLY64 ; DELAY
XOR A
LD C, TMS_CMDREG
OUT (C),A ; A7..A0 = 0
CALL DLY64 ; DELAY
OUT (C),A ; SET RD, A13..A8 = 0
CALL DLY64 ; DELAY
LD C, TMS_DATREG
IN A,(C) ; A = VRAM $10000
CALL DLY64 ; DELAY
EZ80_IO
OUT (TMS_DATREG),A
TMS_IODELAY
; A13-A0=0, MODE=READ
LD HL,0
CALL TMS_RD
; READ VRAM
EZ80_IO
IN A,(TMS_DATREG)
TMS_IODELAY
; CHECK FOR VALUE WRITTEN
CP $76
JR Z,VRAMSIZE_128K ; IF ITS $76, WE HAVE AT LEAST 128K
; OTHERWISE ITS ONLY 64K
JR VRAMSIZE_DONE
@@ -1036,66 +1036,51 @@ VRAMSIZE_128K:
EX AF, AF'
INC A ; SET RETURN VALUE TO 5 FOR 128K
EX AF, AF'
LD A, $40 ; CHECK TO SEE IF WE HAVE 192K (EXPANSION RAM INSTALLED)
LD C, TMS_CMDREG
OUT (C), A ; ENABLE EXANSION MEMORY ACCESS
CALL DLY64 ; DELAY
LD A, $80 | 45
OUT (C), A ; R#45 = $40 (MXC=1, MXD,MXS,DIY,DIX,EQ,MAJ=0)
CALL DLY64 ; DELAY
; R#45=$40: ENABLE EXTENDED MEMORY ACCESS
; MXC=1, MXD,MXS,DIY,DIX,EQ,MAJ=0
LD A,$40
LD C,45
CALL TMS_SET_X
; R#14=1: A16-A14=001
LD A,1
OUT (C),A
CALL DLY64 ; DELAY
LD A,$8E
OUT (C),A ; R#14 = 4 -> A16 = 0, A15..A14 = 1
CALL DLY64 ; DELAY
XOR A
OUT (C),A ; A7..A0 = 0
CALL DLY64 ; DELAY
OR $40
OUT (C),A ; SET WR, A13..A8 = 0
CALL DLY64 ; DELAY
LD C,14
CALL TMS_SET_X
; A13-A0=0, MODE=WRITE
LD HL,0
CALL TMS_WR
; WRITE $5A TO VRAM
LD A,$5A
CALL DLY64 ; DELAY
LD C, TMS_DATREG
OUT (C),A ; SET VRAM $14000 = $76
CALL DLY64 ; DELAY
XOR A
LD C, TMS_CMDREG
OUT (C),A ; A7..A0 = 0
CALL DLY64 ; DELAY
OUT (C),A ; SET RD, A13..A8 = 0
CALL DLY64 ; DELAY
LD C, TMS_DATREG
IN A,(C) ; A = VRAM $14000
CALL DLY64 ; DELAY
EZ80_IO
OUT (TMS_DATREG),A
TMS_IODELAY
; A13-A0=0, MODE=READ
LD HL,0
CALL TMS_RD
; READ VRAM
EZ80_IO
IN A,(TMS_DATREG)
TMS_IODELAY
; CHECK FOR VALUE WRITTEN
CP $5A
JR NZ,VRAMSIZE_DONE ; IF ITS $5A, WE HAVE EXAPANSION VRAM
;
VRAMSIZE_192K:
EX AF, AF'
INC A ; SET RETURN VALUE TO 6 FOR 192K
EX AF, AF'
;
VRAMSIZE_DONE:
; R#45=$00: RESET EXTENDED MEMORY ACCESS
XOR A
LD C, TMS_CMDREG
OUT (C), A ; DISABLE EXANSION MEMORY ACCESS
CALL DLY64 ; DELAY
LD A, $80 | 45
OUT (C), A ; R#45 = $00 (MXC=0, MXD,MXS,DIY,DIX,EQ,MAJ=0)
CALL DLY64 ; DELAY
LD C,45
CALL TMS_SET_X
; R14=0: A16-A14=000
XOR A
OUT (C),A
CALL DLY64 ; DELAY
LD A,$8E
OUT (C),A ; R#14 = 0 -> A16..A14 = 0
LD C,14
CALL TMS_SET_X
;
EX AF, AF'
RET
;
;----------------------------------------------------------------------
; TMS9918 DISPLAY CONTROLLER CHIP INITIALIZATION