diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index bcca366c..72d55f97 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -5635,13 +5635,14 @@ PIO_MODE_STR: .TEXT "Output$" ; VIDEO DEVICE STRINGS ; PS_VDSTRREF: - .DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA + .DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA, PS_VDV9958 ; PS_VDVDU .TEXT "VDU$" PS_VDCVDU .TEXT "CVDU$" PS_VDNEC .TEXT "NEC$" PS_VDTMS .TEXT "TMS$" PS_VDVGA .TEXT "VGA$" +PS_VDV9958 .TEXT "V9958-$" ; ; VIDEO TYPE STRINGS ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 78678921..ffb6bb9d 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -200,6 +200,7 @@ VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 +VDADEV_V9958 .EQU $50 ; V9958 VDU ; ; SOUND DEVICE IDS ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index f31412a2..c8e09bf9 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -199,7 +199,8 @@ AYMODE_MSX .EQU 5 ; RC2014 SOUND MODULE REV6 BY ED BRINDLEY ON Z80/Z180 AT MSX TMSMODE_NONE .EQU 0 TMSMODE_SCG .EQU 1 ; SCG ECB BOARD TMSMODE_N8 .EQU 2 ; N8 BUILT-IN VIDEO -TMSMODE_RC .EQU 3 ; RC2014 BUILT-IN VIDEO +TMSMODE_RC .EQU 3 ; RC2014 TMS9918 VIDEO BOARD +TMSMODE_RCV9958 .EQU 4 ; RC2014 V9958 VIDEO BOARD ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; @@ -427,7 +428,7 @@ SYSTIM .SET TM_CTC #IF (TMSENABLE & (INTMODE == 1)) #IF (TMSTIMENABLE) SYSTIM .SET TM_TMS - .ECHO " TMS9918" + .ECHO " TMS9918/V9958" #ENDIF #ENDIF ; diff --git a/Source/HBIOS/tms.asm b/Source/HBIOS/tms.asm index 62aab029..44d21d83 100644 --- a/Source/HBIOS/tms.asm +++ b/Source/HBIOS/tms.asm @@ -1,5 +1,5 @@ ;====================================================================== -; N8 VDU DRIVER FOR SBC PROJECT +; TM9918 AND V9958 VDU DRIVER ; ; WRITTEN BY: DOUGLAS GOODALL ; UPDATED BY: WAYNE WARTHEN -- 4/7/2013 @@ -19,10 +19,10 @@ TMSCTRL1: .EQU 1 ; CONTROL BITS TMSINTEN: .EQU 5 ; INTERRUPT ENABLE BIT #IF TMSTIMENABLE - .ECHO "TMS INTERRUPTS ENABLED\n" + .ECHO "TMS/V9958 INTERRUPTS ENABLED\n" #ENDIF -#IF (TMSMODE == TMSMODE_RC) +#IF ((TMSMODE == TMSMODE_RC) | (TMSMODE == TMSMODE_RCV9958)) TMS_DATREG .EQU $98 ; READ/WRITE DATA TMS_CMDREG .EQU $99 ; READ STATUS / WRITE REG SEL TMS_PPIA .EQU 0 ; PPI PORT A @@ -58,14 +58,21 @@ TMS_PPIX .EQU 0 ; PPI CONTROL PORT #ENDIF ; TMS_ROWS .EQU 24 + +#IF (TMSMODE == TMSMODE_RCV9958) +TMS_FNTVADDR .EQU $1000 ; VRAM ADDRESS OF FONT DATA +TMS_COLS .EQU 80 +#ELSE +TMS_FNTVADDR .EQU $0800 ; VRAM ADDRESS OF FONT DATA TMS_COLS .EQU 40 +#ENDIF ; #DEFINE USEFONT8X8 #DEFINE TMS_FONT FONT8X8 ; TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER ; -; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918 ACCESSES +; TMS_IODELAY IS USED TO ADD RECOVERY TIME TO TMS9918/V9958 ACCESSES ; IF YOU SEE SCREEN CORRUPTION, ADJUST THIS!!! ; #IF (CPUFAM == CPU_Z180) @@ -73,7 +80,11 @@ TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER #DEFINE TMS_IODELAY EX (SP),HL \ EX (SP),HL ; 38 W/S #ELSE ; BELOW WAS TUNED FOR SBC AT 8MHZ -#DEFINE TMS_IODELAY NOP \ NOP ; 8 W/S +#IF (TMSMODE == TMSMODE_RCV9958) +#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 ; ;====================================================================== @@ -101,7 +112,11 @@ TMS_INIT: LD IY,TMS_IDAT ; POINTER TO INSTANCE DATA ; CALL NEWLINE ; FORMATTING +#IF (TMSMODE == TMSMODE_RCV9958) + PRTS("V9958: IO=0x$") +#ELSE PRTS("TMS: IO=0x$") +#ENDIF LD A,TMS_DATREG CALL PRTHEXBYTE CALL TMS_PROBE ; CHECK FOR HW EXISTENCE @@ -149,12 +164,6 @@ TMS_INIT1: ; XOR A ; SIGNAL SUCCESS RET - -#IF TMSTIMENABLE - ; DISABLE INTERRUPT -TMS_INT_DIS: - -#ENDIF ; ;====================================================================== ; TMS DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS @@ -230,7 +239,11 @@ TMS_VDARES1: ; ENTRY POINT TO AVOID TMS_Z180IO RECURSION RET TMS_VDADEV: +#IF (TMSMODE == TMSMODE_RCV9958) + LD D, VDADEV_V9958 +#ELSE LD D,VDADEV_TMS ; D := DEVICE TYPE +#ENDIF LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO LD H,TMSMODE ; H := MODE LD L,TMS_DATREG ; L := BASE I/O ADDRESS @@ -366,6 +379,14 @@ TMS_SET: ;---------------------------------------------------------------------- ; TMS_WR: +#IF (TMSMODE == TMSMODE_RCV9958) + ; CLEAR R#14 FOR V9958 + XOR A + OUT (TMS_CMDREG), A + LD A, $80 | 14 + OUT (TMS_CMDREG), A +#ENDIF + PUSH HL SET 6,H ; SET WRITE BIT CALL TMS_RD @@ -450,8 +471,8 @@ TMS_CRTINIT2: ;---------------------------------------------------------------------- ; TMS_LOADFONT: - ; SET WRITE ADDRESS TO $800 - LD HL,$800 + ; SET WRITE ADDRESS TO TMS_FNTVADDR + LD HL,TMS_FNTVADDR CALL TMS_WR #IF USELZSA2 @@ -470,8 +491,8 @@ TMS_LOADFONT: LD HL,TMS_FONT ; START OF FONT DATA #ENDIF ; - ; FILL $800 BYTES FROM FONTDATA - LD DE,$800 + ; FILL TMS_FNTVADDR BYTES FROM FONTDATA + LD DE,TMS_FNTVADDR TMS_LOADFONT1: LD A,(HL) OUT (TMS_DATREG),A @@ -532,7 +553,7 @@ 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,$800 ; 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 @@ -545,7 +566,7 @@ TMS_SETCUR1: ; READ GLYPH LOOP DJNZ TMS_SETCUR1 ; LOOP FOR 8 BYTES ; ; NOW WRITE INVERTED GLYPH INTO FONT INDEX 255 - LD HL,$800 + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 + LD HL,TMS_FNTVADDR + (255 * 8) ; LOC OF GLPYPH DATA FOR CHAR 255 CALL TMS_WR ; SETUP TO WRITE THE INVERTED GLYPH LD B,8 ; 8 BYTES PER GLYPH LD HL,TMS_BUF ; POINT TO BUFFER @@ -891,16 +912,33 @@ TMS_PORTS: ; 5S Fifth sprite (not displayed) detected. Value in FS* is valid. ; INT Set at each screen update, used for interrupts. ; +#IF (TMSMODE == TMSMODE_RCV9958) TMS_INIT9918: + .DB $04 ; REG 0 - NO EXTERNAL VID, SET M4 = 1 +TMS_INIT9918_REG_1: + .DB $50 ; REG 1 - ENABLE SCREEN, SET MODE 1 + .DB $03 ; REG 2 - PATTERN NAME TABLE := 0 + .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 .DB $00 ; REG 0 - NO EXTERNAL VID TMS_INIT9918_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 $800 + .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 +#ENDIF ; TMS_INIT9918LEN .EQU $ - TMS_INIT9918 ; @@ -909,6 +947,10 @@ TMS_INIT9918LEN .EQU $ - TMS_INIT9918 TMS_DCNTL .DB $00 ; SAVE Z180 DCNTL AS NEEDED #ENDIF +#IF (TMSMODE == TMSMODE_RCV9958) + .ECHO "V9958 instance data occupies " +#ELSE .ECHO "TMS instance data occupies " +#ENDIF .ECHO $ - TMS_IDAT .ECHO " bytes\n"