Browse Source

V9958: Updated TMS driver to support V9958

pull/199/head
Dean Netherton 5 years ago
parent
commit
3e0771acf3
  1. 3
      Source/HBIOS/hbios.asm
  2. 1
      Source/HBIOS/hbios.inc
  3. 5
      Source/HBIOS/std.asm
  4. 78
      Source/HBIOS/tms.asm

3
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
;

1
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
;

5
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
;

78
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"

Loading…
Cancel
Save