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