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