mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user