@ -1,9 +1,10 @@
;======================================================================
; TM9918 AND V9958 VDU DRIVER
;
; WRITTEN BY: DOUGLAS GOODALL
; UPDATED BY: WAYNE WARTHEN -- 4/7/2013
; UPDATED BY: DEAN NETHERTON -- 5/26/2021 - V9958 SUPPORT
; WRITTEN BY: DOUGLAS GOODALL
; UPDATED BY: WAYNE WARTHEN -- 4/7/2013
; UPDATED BY: DEAN NETHERTON -- 5/26/2021 - V9958 SUPPORT
; UPDATED BY: JOSE L. COLLADO -- 11/15/2023 - MEMORY MAP CHANGES
;======================================================================
;
; TODO:
@ -15,14 +16,36 @@
; TMS DRIVER - CONSTANTS
;======================================================================
;
;
;
; 40 Column Video Memory Map
; -----------------------------------
; Start Length
; Pattern Table: $0000 $0800 Font data (8 x 256)
; Unused: $0800 $1000
; Sprite Patterns: $1800 $0800
; Color Table: $2000 $1800
; Name Table: $3800 $0400 Display characters (40 x 25)
; Sprite Attributes: $3B00 $0100
; Unused: $3C00 $0400
;
; 80 Column Video Memory Map (MSX like)
; -------------------------------------
; Start Length
; Pattern Table: $1000 $0800 Font data (8 x 256)
; Sprite Patterns: $???? $????
; Color Table: $???? $????
; Name Table: $0000 $0800 Display characters (80 x 25)
; Sprite Attributes: $???? $????
; Unused: $???? $????
;
TMSCTRL1: .EQU 1 ; CONTROL BITS
TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT
;
# IF TMSTIMENABLE
.ECHO "TMS INTERRUPTS ENABLED\n"
# ENDIF
;
# IF (( TMSMODE = = TMSMODE_MSX ) | ( TMSMODE = = TMSMODE_MSX9958 ))
TMS_DATREG .EQU $ 98 ; READ/WRITE DATA
TMS_CMDREG .EQU $ 99 ; READ STATUS / WRITE REG SEL
@ -31,8 +54,8 @@ TMS_PPIB .EQU 0 ; PPI PORT B
TMS_PPIC .EQU 0 ; PPI PORT C
TMS_PPIX .EQU 0 ; PPI CONTROL PORT
# ENDIF
# IF ( TMSMODE = = TMSMODE_COLECO ))
;
# IF ( TMSMODE = = TMSMODE_COLECO )
TMS_DATREG .EQU $ BE ; READ/WRITE DATA
TMS_CMDREG .EQU $ BF ; READ STATUS / WRITE REG SEL
TMS_PPIA .EQU 0 ; PPI PORT A
@ -40,14 +63,14 @@ TMS_PPIB .EQU 0 ; PPI PORT B
TMS_PPIC .EQU 0 ; PPI PORT C
TMS_PPIX .EQU 0 ; PPI CONTROL PORT
# ENDIF
;
# IF ( TMSMODE = = TMSMODE_MSXKBD )
TMS_DATREG .EQU $ 98 ; READ/WRITE DATA
TMS_CMDREG .EQU $ 99 ; READ STATUS / WRITE REG SEL
TMS_KBDDATA .EQU $ E0 ; KBD CTLR DATA PORT
TMS_KBDST .EQU $ E1 ; KBD CTLR STATUS/CMD PORT
# ENDIF
;
# IF ( TMSMODE = = TMSMODE_N8 )
TMS_DATREG .EQU $ 98 ; READ/WRITE DATA
TMS_CMDREG .EQU $ 99 ; READ STATUS / WRITE REG SEL
@ -56,7 +79,7 @@ TMS_PPIB .EQU $85 ; PPI PORT B
TMS_PPIC .EQU $ 86 ; PPI PORT C
TMS_PPIX .EQU $ 87 ; PPI CONTROL PORT
# ENDIF
;
# IF ( TMSMODE = = TMSMODE_SCG )
TMS_DATREG .EQU $ 98 ; READ/WRITE DATA
TMS_CMDREG .EQU $ 99 ; READ STATUS / WRITE REG SEL
@ -68,7 +91,6 @@ TMS_PPIX .EQU 0 ; PPI CONTROL PORT
# ENDIF
;
# IF ( TMSMODE = = TMSMODE_MBC )
TMS_DATREG .EQU $ 98 ; READ/WRITE DATA
TMS_CMDREG .EQU $ 99 ; READ STATUS / WRITE REG SEL
TMS_ACR .EQU $ 9 C ; AUX CONTROL REGISTER
@ -79,14 +101,20 @@ TMS_PPIX .EQU 0 ; PPI CONTROL PORT
TMS_KBDDATA .EQU $ E2 ; KBD CTLR DATA PORT
TMS_KBDST .EQU $ E3 ; KBD CTLR STATUS/CMD PORT
# ENDIF
;
TMS_ROWS .EQU 24
;
# IF (( TMSMODE = = TMSMODE_MSX9958 ) | ( TMSMODE = = TMSMODE_MBC ))
TMS_FNTVADDR .EQU $ 1000 ; VRAM ADDRESS OF FONT DATA
TMS_FNTSIZE .EQU 8 * 256 ; ### JLC Mod for JBL compatibility ### = 8x8 Font 256 Chars
TMS_CHRVADDR .EQU $ 0000 ; VRAM ADDRESS OF CHAR SCREEN DATA (NEW CONSTANT) = REG2 * $400
TMS_COLS .EQU 80
# ELSE
TMS_FNTVADDR .EQU $ 0800 ; VRAM ADDRESS OF FONT DATA
# ELSE ; ALL OTHER MODES...
;TMS_FNTVADDR .EQU $0800 ; VRAM ADDRESS OF FONT DATA
TMS_FNTVADDR .EQU $ 0000 ; VRAM ADDRESS OF FONT DATA ### JLC Mod for JBL compatibility ### = REG4 * $800
TMS_FNTSIZE .EQU 8 * 256 ; ### JLC Mod for JBL compatibility ### = 8x8 Font 256 Chars
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
TMS_CHRVADDR .EQU $ 3800 ; VRAM ADDRESS OF CHAR SCREEN DATA (NEW CONSTANT) = REG2 * $400
TMS_COLS .EQU 40
# ENDIF
;
@ -99,15 +127,16 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!!
;
# IF ( CPUFAM = = CPU_Z180 )
; BELOW WAS TUNED FOR Z180 AT 18MHZ
# DEFINE TMS_IODELAY EX ( SP ), HL \ EX ( SP ), HL ; 38 W/S
; BELOW WAS TUNED FOR Z180 AT 18MHZ
# DEFINE TMS_IODELAY EX ( SP ), HL \ EX ( SP ), HL ; 38 W/S
;#DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP ; 20 W/S ### JLC Mod for Clock/2 (9 MHz) ###
# ELSE
; BELOW WAS TUNED FOR SBC AT 8MHZ
# IF (( TMSMODE = = TMSMODE_MSX9958 ) | ( TMSMODE = = TMSMODE_MBC ))
# DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; V9958 NEEDS AT WORST CASE, APPROX 4us (28T) DELAY BETWEEN I/O (WHEN IN TEXT MODE)
# ELSE
# DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S
# ENDIF
; BELOW WAS TUNED FOR SBC AT 8MHZ
# IF (( TMSMODE = = TMSMODE_MSX9958 ) | ( TMSMODE = = TMSMODE_MBC ))
# DEFINE TMS_IODELAY NOP \ NOP \ NOP \ NOP \ NOP \ NOP \ NOP ; V9958 NEEDS AT WORST CASE, APPROX 4us (28T) DELAY BETWEEN I/O (WHEN IN TEXT MODE)
# ELSE
# DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S
# ENDIF
# ENDIF
;
;======================================================================
@ -155,6 +184,9 @@ TMS_INIT:
# IF ( TMSMODE = = TMSMODE_MSX )
PRTS ( "MSX$" )
# ENDIF
# IF ( TMSMODE = = TMSMODE_COLECO ) ; ### JLC Mod for completeness ###
PRTS ( "COLECO$" )
# ENDIF
# IF ( TMSMODE = = TMSMODE_MSXKBD )
PRTS ( "RCKBD$" )
# ENDIF
@ -166,9 +198,10 @@ TMS_INIT:
LD A , TMS_DATREG
CALL PRTHEXBYTE
CALL TMS_PROBE ; CHECK FOR HW EXISTENCE
;JP TMS_INIT1 ; ### JLC DEBUG: ALLWAYS CONTINUE ###
JR Z , TMS_INIT1 ; CONTINUE IF PRESENT
;
; HARDWARE NOT PRESENT
; *** HARDWARE NOT PRESENT ***
PRTS ( " NOT PRESENT$" )
OR $ FF ; SIGNAL FAILURE
RET
@ -193,9 +226,9 @@ TMS_INIT1:
CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST
LD A , ( TMS_INITVDU_REG_1 )
SET TMSINTEN , A ; SET INTERRUPT ENABLE BIT
LD ( TMS_INITVDU_REG_1 ), A
LD C , TMSCTRL1
SET TMSINTEN , A ; SET INTERRUPT ENABLE BIT
LD ( TMS_INITVDU_REG_1 ), A
LD C , TMSCTRL1
CALL TMS_SET
# ENDIF
;
@ -266,11 +299,11 @@ TMS_VDAINI:
RET
TMS_VDAQRY:
LD C , $ 00 ; MODE ZERO IS ALL WE KNOW
LD D , TMS_ROWS ; ROWS
LD E , TMS_COLS ; COLS
LD HL , 0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
XOR A ; SIGNAL SUCCESS
LD C , $ 00 ; MODE ZERO IS ALL WE KNOW
LD D , TMS_ROWS ; ROWS
LD E , TMS_COLS ; COLS
LD HL , 0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
XOR A ; SIGNAL SUCCESS
RET
TMS_VDARES:
@ -294,11 +327,11 @@ TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION
RET
TMS_VDADEV:
LD D , VDADEV_TMS ; D := DEVICE TYPE
LD E , 0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
LD H , TMSMODE ; H := MODE
LD L , TMS_DATREG ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
LD D , VDADEV_TMS ; D := DEVICE TYPE
LD E , 0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
LD H , TMSMODE ; H := MODE
LD L , TMS_DATREG ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
TMS_VDASCS:
@ -310,28 +343,28 @@ TMS_VDASCP:
CALL TMS_Z180IO
# ENDIF
CALL TMS_CLRCUR
CALL TMS_XY ; SET CURSOR POSITION
CALL TMS_XY ; SET CURSOR POSITION
CALL TMS_SETCUR
XOR A ; SIGNAL SUCCESS
XOR A ; SIGNAL SUCCESS
RET
TMS_VDASAT:
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
RET
TMS_VDASCO:
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
XOR A ; NOT POSSIBLE, JUST SIGNAL SUCCESS
RET
TMS_VDAWRC:
# IF ( CPUFAM = = CPU_Z180 )
CALL TMS_Z180IO
# ENDIF
CALL TMS_CLRCUR ; CURSOR OFF
LD A , E ; CHARACTER TO WRITE GOES IN A
CALL TMS_PUTCHAR ; PUT IT ON THE SCREEN
CALL TMS_CLRCUR ; CURSOR OFF
LD A , E ; CHARACTER TO WRITE GOES IN A
CALL TMS_PUTCHAR ; PUT IT ON THE SCREEN
CALL TMS_SETCUR
XOR A ; SIGNAL SUCCESS
XOR A ; SIGNAL SUCCESS
RET
TMS_VDAFIL:
@ -339,11 +372,11 @@ TMS_VDAFIL:
CALL TMS_Z180IO
# ENDIF
CALL TMS_CLRCUR
LD A , E ; FILL CHARACTER GOES IN A
EX DE , HL ; FILL LENGTH GOES IN DE
CALL TMS_FILL ; DO THE FILL
LD A , E ; FILL CHARACTER GOES IN A
EX DE , HL ; FILL LENGTH GOES IN DE
CALL TMS_FILL ; DO THE FILL
CALL TMS_SETCUR
XOR A ; SIGNAL SUCCESS
XOR A ; SIGNAL SUCCESS
RET
TMS_VDACPY:
@ -353,11 +386,11 @@ TMS_VDACPY:
CALL TMS_CLRCUR
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS TMS_POS
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT
PUSH HL ; SAVE LENGTH
CALL TMS_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
POP BC ; RECOVER LENGTH IN BC
LD DE ,( TMS_POS ) ; PUT DEST IN DE
CALL TMS_BLKCPY ; DO A BLOCK COPY
PUSH HL ; SAVE LENGTH
CALL TMS_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
POP BC ; RECOVER LENGTH IN BC
LD DE ,( TMS_POS ) ; PUT DEST IN DE
CALL TMS_BLKCPY ; DO A BLOCK COPY
CALL TMS_SETCUR
XOR A
RET
@ -368,20 +401,20 @@ TMS_VDASCR:
# ENDIF
CALL TMS_CLRCUR
TMS_VDASCR0:
LD A , E ; LOAD E INTO A
OR A ; SET FLAGS
JR Z , TMS_VDASCR2 ; IF ZERO, WE ARE DONE
PUSH DE ; SAVE E
JP M , TMS_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL
CALL TMS_SCROLL ; SCROLL FORWARD ONE LINE
POP DE ; RECOVER E
DEC E ; DECREMENT IT
JR TMS_VDASCR0 ; LOOP
LD A , E ; LOAD E INTO A
OR A ; SET FLAGS
JR Z , TMS_VDASCR2 ; IF ZERO, WE ARE DONE
PUSH DE ; SAVE E
JP M , TMS_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL
CALL TMS_SCROLL ; SCROLL FORWARD ONE LINE
POP DE ; RECOVER E
DEC E ; DECREMENT IT
JR TMS_VDASCR0 ; LOOP
TMS_VDASCR1:
CALL TMS_RSCROLL ; SCROLL REVERSE ONE LINE
POP DE ; RECOVER E
INC E ; INCREMENT IT
JR TMS_VDASCR0 ; LOOP
CALL TMS_RSCROLL ; SCROLL REVERSE ONE LINE
POP DE ; RECOVER E
INC E ; INCREMENT IT
JR TMS_VDASCR0 ; LOOP
TMS_VDASCR2:
CALL TMS_SETCUR
XOR A
@ -393,23 +426,23 @@ TMS_VDASCR2:
;----------------------------------------------------------------------
TMS_VDARDC:
OR $ FF ; UNSUPPORTED FUNCTION
OR $ FF ; UNSUPPORTED FUNCTION
RET
; DUMMY FUNCTIONS BELOW BECAUSE SCG BOARD HAS NO
; KEYBOARD INTERFACE
TMS_STAT:
XOR A ; SIGNAL NOTHING READY
JP CIO_IDLE ; DO IDLE PROCESSING
XOR A ; SIGNAL NOTHING READY
JP CIO_IDLE ; DO IDLE PROCESSING
TMS_FLUSH:
XOR A ; SIGNAL SUCCESS
XOR A ; SIGNAL SUCCESS
RET
TMS_READ:
LD E , 26 ; RETURN <SUB> (CTRL-Z)
XOR A ; SIGNAL SUCCESS
LD E , 26 ; RETURN <SUB> (CTRL-Z)
XOR A ; SIGNAL SUCCESS
RET
;
;======================================================================
@ -469,7 +502,7 @@ TMS_RD:
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
;
TMS_PROBE:
; SET WRITE ADDRESS TO $0
; SET WRITE ADDRESS TO $0000
LD HL , 0
CALL TMS_WR
; WRITE TEST PATTERN TO FIRST TWO BYTES
@ -481,19 +514,18 @@ TMS_PROBE:
OUT ( TMS_DATREG ), A ; SECOND BYTE
;TMS_IODELAY ; DELAY
CALL DL Y64 ; DELAY
; SET READ ADDRESS TO $0
;
; SET READ ADDRESS TO $0000
LD HL , 0
CALL TMS_RD
; READ TEST PATTERN
LD C , $ A5 ; VALUE TO EXPECT
IN A ,( TMS_DATREG ) ; READ FIRST BYTE
;CALL PRTHEXBYTE
;TMS_IODELAY ; DELAY
CALL DL Y64 ; DELAY
CP C ; COMPARE
RET NZ ; RETURN ON MISCOMPARE
IN A ,( TMS_DATREG ) ; READ SECOND BYTE
;CALL PRTHEXBYTE
;TMS_IODELAY ; DELAY
CALL DL Y64 ; DELAY
CPL ; COMPLEMENT IT
@ -505,12 +537,12 @@ TMS_PROBE:
;----------------------------------------------------------------------
;
TMS_CRTINIT:
; SET WRITE ADDRESS TO $0
; SET WRITE ADDRESS TO $0000 Beginning of VRAM
LD HL , 0
CALL TMS_WR
;
; FILL ENTIRE RAM CONTENTS
LD DE , $ 4000
; FILL ENTIRE 16KB V RAM CONTENTS with $00 ### JLC Comment fix ###
LD DE , $ 4000 ; 16KB
TMS_CRTINIT1:
XOR A
OUT ( TMS_DATREG ), A
@ -521,9 +553,9 @@ TMS_CRTINIT1:
JR NZ , TMS_CRTINIT1
;
; INITIALIZE VDU REGISTERS
LD C , 0 ; START WITH REGISTER 0
LD C , 0 ; START WITH REGISTER 0
LD B , TMS_INITVDULEN ; NUMBER OF REGISTERS TO INIT
LD HL , TMS_INITVDU ; HL = POINTER TO THE DEFAULT VALUES
LD HL , TMS_INITVDU ; HL = POINTER TO THE DEFAULT VALUES
TMS_CRTINIT2:
LD A ,( HL ) ; GET VALUE
CALL TMS_SET ; WRITE IT
@ -565,7 +597,7 @@ TMS_LOADFONT:
# ENDIF
;
; FILL TMS_FNTVADDR BYTES FROM FONTDATA
LD DE , TMS_FNTVADDR
LD DE , TMS_FNTSIZE ; ### JLC Mod for JBL compatibility ###
TMS_LOADFONT1:
LD A ,( HL )
OUT ( TMS_DATREG ), A
@ -622,20 +654,20 @@ TMS_SETCUR:
LD HL , 0 ; ZERO HL
LD L , A ; HL IS NOW RAW CHAR INDEX
LD B , 3 ; LEFT SHIFT BY 3 BITS
TMS_SETCUR0: ; MULT BY 8 FOR FONT INDEX
TMS_SETCUR0: ; MULT BY 8 FOR FONT INDEX
SLA L ; SHIFT LSB INTO CARRY
RL H ; SHFT MSB FROM CARRY
DJNZ TMS_SETCUR0 ; LOOP 3 TIMES
LD DE , TMS_FNTVADDR ; OFFSET TO START OF FONT TABLE
LD DE , TMS_FNTVADDR ; OFFSET TO START OF FONT TABLE
ADD HL , DE ; ADD TO FONT INDEX
CALL TMS_RD ; SETUP TO READ GLYPH
LD B , 8 ; 8 BYTES
LD HL , TMS_BUF ; INTO BUFFER
TMS_SETCUR1: ; READ GLYPH LOOP
TMS_SETCUR1: ; READ GLYPH LOOP
IN A ,( TMS_DATREG ) ; GET NEXT BYTE
TMS_IODELAY ; IO DELAY
LD ( HL ), A ; SAVE VALUE IN BUF
INC HL ; BUMP BUF POINTER
INC HL ; BUMP BUF POINTER
DJNZ TMS_SETCUR1 ; LOOP FOR 8 BYTES
;
; NOW WRITE INVERTED GLYPH INTO FONT INDEX 255
@ -643,7 +675,7 @@ TMS_SETCUR1: ; READ GLYPH LOOP
CALL TMS_WR ; SETUP TO WRITE THE INVERTED GLYPH
LD B , 8 ; 8 BYTES PER GLYPH
LD HL , TMS_BUF ; POINT TO BUFFER
TMS_SETCUR2: ; WRITE INVERTED GLYPH LOOP
TMS_SETCUR2: ; WRITE INVERTED GLYPH LOOP
LD A ,( HL ) ; GET THE BYTE
INC HL ; BUMP THE BUF POINTER
XOR $ FF ; INVERT THE VALUE
@ -689,6 +721,9 @@ TMS_XY2IDX:
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
LD E , A ; GET COLUMN BACK
ADD HL , DE ; ADD IT IN
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
LD DE , TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
ADD HL , DE
RET ; RETURN
;
;----------------------------------------------------------------------
@ -735,10 +770,11 @@ TMS_FILL1:
;----------------------------------------------------------------------
;
TMS_SCROLL:
LD HL , 0 ; SOURCE ADDRESS OF CHARACER BUFFER
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
LD HL , TMS_CHRVADDR ; SOURCE ADDRESS OF CHARACTER BUFFER
LD C , TMS_ROWS - 1 ; SET UP LOOP COUNTER FOR ROWS - 1
;
TMS_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION
TMS_SCROLL0: ; READ LINE THAT IS ONE PAST CURRENT DESTINATION
PUSH HL ; SAVE CURRENT DESTINATION
LD DE , TMS_COLS
ADD HL , DE ; POINT TO NEXT ROW SOURCE
@ -786,7 +822,10 @@ TMS_SCROLL3:
;----------------------------------------------------------------------
;
TMS_RSCROLL:
; ### JLC Fix to allow Name Table Addresses other than $0000 and JBL Compatibility ###
LD HL , TMS_COLS * ( TMS_ROWS - 1 )
LD DE , TMS_CHRVADDR ; Add offset Address to start of Name Table (Char)
ADD HL , DE
LD C , TMS_ROWS - 1
;
TMS_RSCROLL0: ; READ THE LINE THAT IS ONE PRIOR TO CURRENT DESTINATION
@ -838,33 +877,33 @@ TMS_RSCROLL3:
;
TMS_BLKCPY:
; SAVE DESTINATION AND LENGTH
PUSH BC ; LENGTH
PUSH DE ; DEST
PUSH BC ; LENGTH
PUSH DE ; DEST
;
; READ FROM THE SOURCE LOCATION
TMS_BLKCPY1:
CALL TMS_RD ; SET UP TO READ FROM ADDRESS IN HL
LD DE , TMS_BUF ; POINT TO BUFFER
CALL TMS_RD ; SET UP TO READ FROM ADDRESS IN HL
LD DE , TMS_BUF ; POINT TO BUFFER
LD B , C
TMS_BLKCPY2:
IN A ,( TMS_DATREG ) ; GET THE NEXT BYTE
TMS_IODELAY ; DELAY
LD ( DE ), A ; SAVE IN BUFFER
INC DE ; BUMP BUF PTR
DJNZ TMS_BLKCPY2 ; LOOP AS NEEDED
IN A ,( TMS_DATREG ) ; GET THE NEXT BYTE
TMS_IODELAY ; DELAY
LD ( DE ), A ; SAVE IN BUFFER
INC DE ; BUMP BUF PTR
DJNZ TMS_BLKCPY2 ; LOOP AS NEEDED
;
; WRITE TO THE DESTINATION LOCATION
POP HL ; RECOVER DESTINATION INTO HL
CALL TMS_WR ; SET UP TO WRITE
LD DE , TMS_BUF ; POINT TO BUFFER
POP BC ; GET LOOP COUNTER BACK
POP HL ; RECOVER DESTINATION INTO HL
CALL TMS_WR ; SET UP TO WRITE
LD DE , TMS_BUF ; POINT TO BUFFER
POP BC ; GET LOOP COUNTER BACK
LD B , C
TMS_BLKCPY3:
LD A ,( DE ) ; GET THE CHAR FROM BUFFER
OUT ( TMS_DATREG ), A ; WRITE TO VDU
TMS_IODELAY ; DELAY
INC DE ; BUMP BUF PTR
DJNZ TMS_BLKCPY3 ; LOOP AS NEEDED
LD A ,( DE ) ; GET THE CHAR FROM BUFFER
OUT ( TMS_DATREG ), A ; WRITE TO VDU
TMS_IODELAY ; DELAY
INC DE ; BUMP BUF PTR
DJNZ TMS_BLKCPY3 ; LOOP AS NEEDED
;
RET
;
@ -915,7 +954,7 @@ TMS_INTHNDL:
; CALL MKY_INT
;#ENDIF
CALL HB_TIMINT ; RETURN NZ - HANDLED
CALL HB_TIMINT ; RETURN NZ - HANDLED
OR $ FF
RET
# ENDIF
@ -924,28 +963,27 @@ TMS_INTHNDL:
; TMS DRIVER - DATA
;==================================================================================================
;
TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
TMS_BUF .FILL 256 , 0 ; COPY BUFFER
TMS_POS .DW 0 ; CURRENT DISPLAY POSITION
TMS_CURSAV .DB 0 ; SAVES ORIGINAL CHARACTER UNDER CURSOR
TMS_BUF .FILL 256 , 0 ; COPY BUFFER
;
;==================================================================================================
; TMS DRIVER - INSTANCE DATA
;==================================================================================================
;
TMS_IDAT:
# IF (( TMSMODE = = TMSMODE_MSX ) | ( TMSMODE = = TMSMODE_MSX9958 ) | ( TMSMODE = = TMSMODE_N8 ) | ( TMSMODE = = TMSMODE_SCG ))
.DB TMS_PPIA ; PPI PORT A
.DB TMS_PPIB ; PPI PORT B
.DB TMS_PPIC ; PPI PORT C
.DB TMS_PPIX ; PPI CONTROL PORT
.DB TMS_PPIA ; PPI PORT A
.DB TMS_PPIB ; PPI PORT B
.DB TMS_PPIC ; PPI PORT C
.DB TMS_PPIX ; PPI CONTROL PORT
# ENDIF
# IF (( TMSMODE = = TMSMODE_MSXKBD ) | ( TMSMODE = = TMSMODE_MBC ))
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB TMS_KBDST ; 8242 CMD/STATUS PORT
.DB TMS_KBDDATA ; 8242 DATA PORT
.DB 0 ; FILLER
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
.DB TMS_KBDST ; 8242 CMD/STATUS PORT
.DB TMS_KBDDATA ; 8242 DATA PORT
.DB 0 ; FILLER
# ENDIF
;
.DB TMS_DATREG
@ -958,8 +996,8 @@ TMS_IDAT:
; Control Registers (write CMDREG):
;
; Reg Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Description
; 0 - - - - - - M2 EXTVID
; 1 4/16K BL GINT M1 M3 - SI MAG
; 0 - - - - - - M3 EXTVID
; 1 4/16K BL GINT M1 M2 - SI MAG
; 2 - - - - PN13 PN12 PN11 PN10
; 3 CT13 CT12 CT11 CT10 CT9 CT8 CT7 CT6
; 4 - - - - - PG13 PG12 PG11
@ -994,32 +1032,50 @@ TMS_IDAT:
; INT Set at each screen update, used for interrupts.
;
# IF (( TMSMODE = = TMSMODE_MSX9958 ) | ( TMSMODE = = TMSMODE_MBC ))
TMS_INITVDU:
.DB $ 04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1
;
; NOTE: YAMAHA 9938/58 DOCUMENTATION SAYS R3 IS SAME AS 9918 (ADR >> 10),
; BUT THIS SEEMS TO BE WRONG AND CORRECTLY DOCUMENTED AT
; https://www.msx.org/wiki/Screen_Modes_Description#SCREEN_0_in_80-column_.28Text_mode_2.29
; BITS 1-0 SHOULD BE 1. BITS 8-2 SHOULD BE (ADR >> 8).
;
TMS_INITVDU: ; V9958 REGISTER SET
.DB $ 04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 FOR 80 COLS
TMS_INITVDU_REG_1:
.DB $ 50 ; REG 1 - ENABLE SCREEN, SET MODE 1
.DB $ 03 ; REG 2 - PATTERN NAME TABLE := 0
.DB $ 50 ; REG 1 - ENABLE SCREEN, SET M1
.DB $ 03 ; REG 2 - SET PATTERN NAME TABLE TO (TMS_CHRVADDR >> 8) | $03
.DB $ 00 ; REG 3 - NO COLOR TABLE
.DB $ 02 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $1000)
.DB $ 00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT
.DB $ 00 ; REG 6 - NO SPRITE GENERATOR TABLE
.DB $ F0 ; REG 7 - WHITE ON BLACK
.DB $ 88 ; REG 8 - COLOUR BUS INPUT, DRAM 64K
.DB $ 00 ; REG 9
.DB $ 00 ; REG 10 - COLOUR TABLE A14-A16 (TMS_FNTVADDR - $1000)
# ELSE ; TMS REGISTER SET
TMS_INITVDU:
.DB $ 00 ; REG 0 - NO EXTERNAL VID
;
# ELSE ; _______TMS9918 REGISTER SET ### JLC Mod for JBL compatibility & MODE II Readiness ###_______
;
TMS_INITVDU: ; V9918 REGISTER SET
.DB $ 00 ; REG 0 - SET TEXT MODE, NO EXTERNAL VID
TMS_INITVDU_REG_1:
.DB $ 50 ; REG 1 - ENABLE SCREEN, SET MODE 1
.DB $ 00 ; REG 2 - PATTERN NAME TABLE := 0
.DB $ 00 ; REG 3 - NO COLOR TABLE
.DB $ 01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800)
.DB $ 00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT
.DB $ 00 ; REG 6 - NO SPRITE GENERATOR TABLE
.DB $ F0 ; REG 7 - WHITE ON BLACK
.DB $ D0 ; REG 1 - SET 16K VRAM, ENABLE SCREEN, NO INTERRUPTS, TEXT MODE ($50 TO BLANK SCREEN)
.DB $ 0 E ; REG 2 - SET PATTERN NAME TABLE TO (TMS_CHRVADDR >> 10)
.DB $ FF ; REG 3 - NO COLOR TABLE, SET TO MODE II DEFAULT VALUE
.DB $ 00 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0000)
.DB $ 76 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT, SET TO MODE II DEFAULT VALUE
.DB $ 03 ; REG 6 - NO SPRITE GENERATOR TABLE, SET TO MODE II DEFAULT VALUE
.DB $ E1 ; REG 7 - GREY ON BLACK ### JLC Mod Change default text color for better readability YMMV ###
;
;TMS_INITVDU:
; .DB $00 ; REG 0 - NO EXTERNAL VID
;TMS_INITVDU_REG_1:
; .DB $50 ; REG 1 - ENABLE SCREEN, SET TEXT MODE & BLANK SCREEN ### JLC comment fix (NOT MODE 1) ###
; .DB $00 ; REG 2 - PATTERN NAME TABLE := 0
; .DB $00 ; REG 3 - NO COLOR TABLE
; .DB $01 ; REG 4 - SET PATTERN GENERATOR TABLE TO (TMS_FNTVADDR -> $0800)
; .DB $00 ; REG 5 - SPRITE ATTRIBUTE IRRELEVANT
; .DB $00 ; REG 6 - NO SPRITE GENERATOR TABLE
; .DB $F0 ; REG 7 - WHITE ON TRANSPARENT
;
# ENDIF
;
TMS_INITVDULEN .EQU $ - TMS_INITVDU