|
|
|
|
@@ -1,15 +1,19 @@
|
|
|
|
|
;======================================================================
|
|
|
|
|
; VDU DRIVER FOR SBC PROJECT
|
|
|
|
|
; VDU DRIVER FOR ECB-VDU PROJECT
|
|
|
|
|
;
|
|
|
|
|
; ORIGINALLY WRITTEN BY: ANDREW LYNCH
|
|
|
|
|
; REVISED/ENHANCED BY DAN WERNER -- 11/7/2009
|
|
|
|
|
; ROMWBW ADAPTATION BY: WAYNE WARTHEN -- 11/9/2012
|
|
|
|
|
; 80X25, 80X30 AND MODE INFO AT BOOT ADDED BY: PHIL SUMMERS -- 2/3/2019
|
|
|
|
|
;======================================================================
|
|
|
|
|
;
|
|
|
|
|
; VDU-DW.ZIP IS THE DEFAULY 10X8 FONT THAT SUITS 80X25 AND 80X26 MODE.
|
|
|
|
|
; IN 80X30 MODE THE DESCENDERS ARE MISSING. AN ALTERNATE 8x8 FONT MAY
|
|
|
|
|
; DISPLAY BETTER. THIS CAN BE ADDED TO THE ECB-VDU FONT EPROM AND
|
|
|
|
|
; SELECTED VIA ONBOARD JUMPERS.THE FONT ROM CAN CONTAIN EIGHT 2Kb FONTS.
|
|
|
|
|
;
|
|
|
|
|
; TODO:
|
|
|
|
|
; - ADD REMAINING REGISTERS TO INIT
|
|
|
|
|
; - TRY 25 ROW MODE?
|
|
|
|
|
; - IMPLEMENT CONSTANTS FOR SCREEN DIMENSIONS
|
|
|
|
|
; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION
|
|
|
|
|
; - IMPLEMENT ALTERNATE DISPLAY MODES?
|
|
|
|
|
;
|
|
|
|
|
@@ -30,6 +34,22 @@ VDU_PPIC .EQU VDU_BASE + $06 ; PPI PORT C
|
|
|
|
|
VDU_PPIX .EQU VDU_BASE + $07 ; PPI CONTROL PORT
|
|
|
|
|
;
|
|
|
|
|
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
|
|
|
|
|
|
|
|
|
#IF (VDUSIZ=V80X24)
|
|
|
|
|
DLINES .EQU 24
|
|
|
|
|
DROWS .EQU 80
|
|
|
|
|
DSCANL .EQU 10
|
|
|
|
|
#ENDIF
|
|
|
|
|
#IF (VDUSIZ=V80X25)
|
|
|
|
|
DLINES .EQU 25
|
|
|
|
|
DROWS .EQU 80
|
|
|
|
|
DSCANL .EQU 10
|
|
|
|
|
#ENDIF
|
|
|
|
|
#IF (VDUSIZ=V80X30)
|
|
|
|
|
DLINES .EQU 30
|
|
|
|
|
DROWS .EQU 80
|
|
|
|
|
DSCANL .EQU 8
|
|
|
|
|
#ENDIF
|
|
|
|
|
;
|
|
|
|
|
;======================================================================
|
|
|
|
|
; VDU DRIVER - INITIALIZATION
|
|
|
|
|
@@ -42,6 +62,14 @@ VDU_INIT:
|
|
|
|
|
PRTS("VDU: IO=0x$")
|
|
|
|
|
LD A,VDU_RAMRD
|
|
|
|
|
CALL PRTHEXBYTE
|
|
|
|
|
|
|
|
|
|
PRTS(" MODE= $") ; OUTPUT DISPLAY FORMAT
|
|
|
|
|
LD A,DROWS
|
|
|
|
|
CALL PRTDECB
|
|
|
|
|
PRTS("X$")
|
|
|
|
|
LD A,DLINES
|
|
|
|
|
CALL PRTDECB
|
|
|
|
|
|
|
|
|
|
CALL VDU_PROBE ; CHECK FOR HW EXISTENCE
|
|
|
|
|
JR Z,VDU_INIT1 ; CONTINUE IF HW PRESENT
|
|
|
|
|
;
|
|
|
|
|
@@ -101,10 +129,10 @@ VDU_VDAINI:
|
|
|
|
|
RET
|
|
|
|
|
|
|
|
|
|
VDU_VDAQRY:
|
|
|
|
|
LD C,$00 ; MODE ZERO IS ALL WE KNOW
|
|
|
|
|
LD DE,$1850 ; 24 ROWS ($18), 80 COLS ($50)
|
|
|
|
|
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED
|
|
|
|
|
XOR A ; SIGNAL SUCCESS
|
|
|
|
|
LD C,$00 ; MODE ZERO IS ALL WE KNOW
|
|
|
|
|
LD DE,(DLINES*256)+DROWS ; D=DLINES, E=DROWS
|
|
|
|
|
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED
|
|
|
|
|
XOR A ; SIGNAL SUCCESS
|
|
|
|
|
RET
|
|
|
|
|
|
|
|
|
|
VDU_VDARES:
|
|
|
|
|
@@ -281,7 +309,7 @@ VDU_CRTINIT1:
|
|
|
|
|
VDU_XY2IDX:
|
|
|
|
|
LD A,E ; SAVE COLUMN NUMBER IN A
|
|
|
|
|
LD H,D ; SET H TO ROW NUMBER
|
|
|
|
|
LD E,80 ; SET E TO ROW LENGTH
|
|
|
|
|
LD E,DROWS ; SET E TO ROW LENGTH
|
|
|
|
|
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
|
|
|
|
LD E,A ; GET COLUMN BACK
|
|
|
|
|
ADD HL,DE ; ADD IT IN
|
|
|
|
|
@@ -294,7 +322,7 @@ VDU_XY2IDX:
|
|
|
|
|
VDU_XY:
|
|
|
|
|
LD A,E ; SAVE COLUMN NUMBER IN A
|
|
|
|
|
LD H,D ; SET H TO ROW NUMBER
|
|
|
|
|
LD E,80 ; SET E TO ROW LENGTH
|
|
|
|
|
LD E,DROWS ; SET E TO ROW LENGTH
|
|
|
|
|
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
|
|
|
|
LD E,A ; GET COLUMN BACK
|
|
|
|
|
ADD HL,DE ; ADD IT IN
|
|
|
|
|
@@ -317,7 +345,7 @@ VDU_PUTCHAR:
|
|
|
|
|
ADD HL,DE
|
|
|
|
|
INC DE ; INC
|
|
|
|
|
LD (VDU_POS),DE ; SAVE NEW SCREEN POSITION
|
|
|
|
|
LD C,18 ; UPDATE ADDRESS REGISTER PAIR
|
|
|
|
|
LD C,18 ; UPDATE ADDRESS REGISTER PAIR ????????????????????
|
|
|
|
|
CALL VDU_WRREGX ; DO IT
|
|
|
|
|
INC HL ; NEW CURSOR POSITION
|
|
|
|
|
LD C,14 ; CURSOR POSITION REGISTER PAIR
|
|
|
|
|
@@ -428,7 +456,7 @@ VDU_BLKCPY2: ; BUFFER -> VIDEO RAM COPY LOOP
|
|
|
|
|
VDU_SCROLL:
|
|
|
|
|
; SCROLL FORWARD BY ADDING ONE ROW TO DISPLAY START ADDRESS
|
|
|
|
|
LD HL,(VDU_OFFSET)
|
|
|
|
|
LD DE,80
|
|
|
|
|
LD DE,DROWS
|
|
|
|
|
ADD HL,DE
|
|
|
|
|
LD (VDU_OFFSET),HL
|
|
|
|
|
LD C,12
|
|
|
|
|
@@ -437,9 +465,9 @@ VDU_SCROLL:
|
|
|
|
|
; FILL EXPOSED LINE
|
|
|
|
|
LD HL,(VDU_POS)
|
|
|
|
|
PUSH HL
|
|
|
|
|
LD HL,23*80
|
|
|
|
|
LD HL,(DLINES-1)*DROWS
|
|
|
|
|
LD (VDU_POS),HL
|
|
|
|
|
LD DE,80
|
|
|
|
|
LD DE,DROWS
|
|
|
|
|
LD A,' '
|
|
|
|
|
CALL VDU_FILL
|
|
|
|
|
POP HL
|
|
|
|
|
@@ -459,7 +487,7 @@ VDU_SCROLL:
|
|
|
|
|
VDU_RSCROLL:
|
|
|
|
|
; SCROLL BACKWARD BY SUBTRACTING ONE ROW FROM DISPLAY START ADDRESS
|
|
|
|
|
LD HL,(VDU_OFFSET)
|
|
|
|
|
LD DE,-80
|
|
|
|
|
LD DE,-DROWS
|
|
|
|
|
ADD HL,DE
|
|
|
|
|
LD (VDU_OFFSET),HL
|
|
|
|
|
LD C,12
|
|
|
|
|
@@ -470,7 +498,7 @@ VDU_RSCROLL:
|
|
|
|
|
PUSH HL
|
|
|
|
|
LD HL,0
|
|
|
|
|
LD (VDU_POS),HL
|
|
|
|
|
LD DE,80
|
|
|
|
|
LD DE,DROWS
|
|
|
|
|
LD A,' '
|
|
|
|
|
CALL VDU_FILL
|
|
|
|
|
POP HL
|
|
|
|
|
@@ -491,22 +519,20 @@ VDU_POS .DW 0 ; CURRENT DISPLAY POSITION
|
|
|
|
|
VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION
|
|
|
|
|
VDU_BUF .FILL 256,0 ; COPY BUFFER
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
#IF (VDUSIZ=V80X24)
|
|
|
|
|
;==================================================================================================
|
|
|
|
|
; VDU DRIVER - SY6845 REGISTER INITIALIZATION
|
|
|
|
|
; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x24 10x8
|
|
|
|
|
;==================================================================================================
|
|
|
|
|
;
|
|
|
|
|
VDU_INIT6845:
|
|
|
|
|
; DB 07FH, 50H, 60H, 7CH, 19H, 1FH, 19H, 1AH, 78H, 09H, 60H, 09H, 00H, 00H, 00H, 00H
|
|
|
|
|
;
|
|
|
|
|
; CCIR 625/50 VERSION (USED IN MOST OF THE WORLD)
|
|
|
|
|
; JUMPER K1 2-3, K2 1-2 FOR 2MHz CHAR CLOCK
|
|
|
|
|
.DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC)
|
|
|
|
|
.DB 050H ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED (80 COLUMNS)
|
|
|
|
|
.DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED (80 COLUMNS)
|
|
|
|
|
.DB 060H ; R2 HORIZONTAL SYNC POSITION
|
|
|
|
|
.DB 00CH ; R3 SYNC WIDTHS
|
|
|
|
|
.DB 01EH ; R4 VERTICAL TOTAL (TOTAL CHARS IN A FRAME -1)
|
|
|
|
|
.DB 002H ; R5 VERTICAL TOTAL ADJUST (
|
|
|
|
|
.DB 018H ; R6 VERTICAL DISPLAYED (24 ROWS)
|
|
|
|
|
.DB DLINES ; R6 VERTICAL DISPLAYED (24 ROWS)
|
|
|
|
|
.DB 01AH ; R7 VERTICAL SYNC
|
|
|
|
|
.DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING
|
|
|
|
|
; B6=1 PIN 34 IS UPDATE STROBE
|
|
|
|
|
@@ -515,14 +541,76 @@ VDU_INIT6845:
|
|
|
|
|
; B3=1 TRANSPARENT MEMORY ADDRESSING
|
|
|
|
|
; B2=0 RAM STRAIGHT BINARY ADDRESSING
|
|
|
|
|
; B1,B0=0 NON-INTERLACE
|
|
|
|
|
.DB 009H ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1)
|
|
|
|
|
.DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1)
|
|
|
|
|
.DB 060H ; R10 CURSOR START RASTER
|
|
|
|
|
.DB 009H ; R11 CURSOR END RASTER
|
|
|
|
|
.DB DSCANL-1 ; R11 CURSOR END RASTER
|
|
|
|
|
.DB 00H ; R12 START ADDRESS HI
|
|
|
|
|
.DB 00H ; R13 START ADDRESS LO
|
|
|
|
|
.DB 00H ; R14 CURSOR ADDRESS HI
|
|
|
|
|
.DB 00H ; R15 CURSOR ADDRESS LO
|
|
|
|
|
;
|
|
|
|
|
#ENDIF
|
|
|
|
|
#IF (VDUSIZ=V80X25)
|
|
|
|
|
;==================================================================================================
|
|
|
|
|
; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x25 10x8
|
|
|
|
|
;==================================================================================================
|
|
|
|
|
VDU_INIT6845:
|
|
|
|
|
.DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC)
|
|
|
|
|
.DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED =80
|
|
|
|
|
.DB 060H ; R2 HORIZONTAL SYNC POSITION
|
|
|
|
|
.DB 00CH ; R3 SYNC WIDTHS
|
|
|
|
|
.DB 01EH ; R4 VERTICAL TOTAL (TOTAL CHARS IN A FRAME -1)
|
|
|
|
|
.DB 002H ; R5 VERTICAL TOTAL ADJUST (
|
|
|
|
|
.DB DLINES ; R6 VERTICAL DISPLAYED (25 ROWS)
|
|
|
|
|
.DB 01BH ; R7 VERTICAL SYNC
|
|
|
|
|
.DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING
|
|
|
|
|
; ; B6=1 PIN 34 IS UPDATE STROBE
|
|
|
|
|
; ; B5=1 DELAY CURSOR 1 CHARACTER
|
|
|
|
|
; ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER
|
|
|
|
|
; ; B3=1 TRANSPARENT MEMORY ADDRESSING
|
|
|
|
|
; ; B2=0 RAM STRAIGHT BINARY ADDRESSING
|
|
|
|
|
; ; B1,B0=0 NON-INTERLACE
|
|
|
|
|
.DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1)
|
|
|
|
|
.DB 060H ; R10 CURSOR START RASTER
|
|
|
|
|
.DB DSCANL-1 ; R11 CURSOR END RASTER
|
|
|
|
|
.DB 00H ; R12 START ADDRESS HI
|
|
|
|
|
.DB 00H ; R13 START ADDRESS LO
|
|
|
|
|
.DB 00H ; R14 CURSOR ADDRESS HI
|
|
|
|
|
.DB 00H ; R15 CURSOR ADDRESS LO
|
|
|
|
|
;
|
|
|
|
|
#ENDIF
|
|
|
|
|
#IF (VDUSIZ=V80X30)
|
|
|
|
|
;==================================================================================================
|
|
|
|
|
; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x30 8x8
|
|
|
|
|
;==================================================================================================
|
|
|
|
|
VDU_INIT6845:
|
|
|
|
|
.DB 07FH ; R0 TOTAL NUMBER OF HORIZONTAL CHARACTERS (DETERMINES HSYNC)
|
|
|
|
|
.DB DROWS ; R1 NUMBER OF HORIZONTAL CHARACTERS DISPLAYED =80
|
|
|
|
|
.DB 060H ; R2 HORIZONTAL SYNC POSITION
|
|
|
|
|
.DB 00CH ; R3 SYNC WIDTHS
|
|
|
|
|
.DB 26H ; R4 VERTICAL TOTAL (TOTAL CHARS IN A FRAME -1) (39-1)
|
|
|
|
|
.DB 00H ; R5 VERTICAL TOTAL ADJUST (
|
|
|
|
|
.DB DLINES ; R6 VERTICAL DISPLAYED (30 ROWS)
|
|
|
|
|
.DB 22H ; R7 VERTICAL SYNC
|
|
|
|
|
.DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING
|
|
|
|
|
; ; B6=1 PIN 34 IS UPDATE STROBE
|
|
|
|
|
; ; B5=1 DELAY CURSOR 1 CHARACTER
|
|
|
|
|
; ; B4=1 DELAY DISPLAY ENABLE 1 CHARACTER
|
|
|
|
|
; ; B3=1 TRANSPARENT MEMORY ADDRESSING
|
|
|
|
|
; ; B2=0 RAM STRAIGHT BINARY ADDRESSING
|
|
|
|
|
; ; B1,B0=0 NON-INTERLACE
|
|
|
|
|
.DB DSCANL-1 ; R9 SCAN LINE (LINES PER CHAR AND SPACING -1)
|
|
|
|
|
.DB 060H ; R10 CURSOR START RASTER
|
|
|
|
|
.DB DSCANL-1 ; R11 CURSOR END RASTER
|
|
|
|
|
.DB 00H ; R12 START ADDRESS HI
|
|
|
|
|
.DB 00H ; R13 START ADDRESS LO
|
|
|
|
|
.DB 00H ; R14 CURSOR ADDRESS HI
|
|
|
|
|
.DB 00H ; R15 CURSOR ADDRESS LO
|
|
|
|
|
;
|
|
|
|
|
#ENDIF
|
|
|
|
|
; CCIR 625/50 VERSION (USED IN MOST OF THE WORLD)
|
|
|
|
|
; JUMPER K1 2-3, K2 1-2 FOR 2MHz CHAR CLOCK
|
|
|
|
|
;
|
|
|
|
|
; THE CCIR 625/50 TELEVISION STANDARD HAS 625 LINES INTERLACED AT 50 FIELDS PER SECOND. THIS WORKS
|
|
|
|
|
; OUT AS 50 FIELDS OF 312.5 LINES PER SECOND NON-INTERLACED AS USED HERE.
|
|
|
|
|
; HORIZONTAL LINE WIDTH IS 64uS. FOR A 2 MHz CHARACTER CLOCK (R0+1)/2000000 = 64uS
|
|
|
|
|
|