From 55a41ec0a38fe25ad409d2876b3cff368943714a Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 24 Nov 2023 17:15:29 -0800 Subject: [PATCH] TMS Driver Enhancement by Jose Collado - The 40 column mode of the TMS driver now conforms to the memory map from the TMS9918 documentation and is also now consistent with the existing TMS9918 video programs from the RC2014 forum. --- Source/HBIOS/tms.asm | 336 +++++++++++++++++++++++++------------------ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 3 files changed, 198 insertions(+), 142 deletions(-) diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 48205e5e..89b8521e 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -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 $9C ; 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 (CTRL-Z) - XOR A ; SIGNAL SUCCESS + LD E,26 ; RETURN (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 DLY64 ; 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 DLY64 ; DELAY CP C ; COMPARE RET NZ ; RETURN ON MISCOMPARE IN A,(TMS_DATREG) ; READ SECOND BYTE - ;CALL PRTHEXBYTE ;TMS_IODELAY ; DELAY CALL DLY64 ; 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 VRAM 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 $0E ; 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 diff --git a/Source/ver.inc b/Source/ver.inc index e2f398e9..8b4e4d9e 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 4 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.4.0-dev.23" +#DEFINE BIOSVER "3.4.0-dev.24" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 6c9b9eff..0944f99c 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 4 rup equ 0 rtp equ 0 biosver macro - db "3.4.0-dev.23" + db "3.4.0-dev.24" endm