|
|
@ -1,15 +1,19 @@ |
|
|
;====================================================================== |
|
|
;====================================================================== |
|
|
; VDU DRIVER FOR SBC PROJECT |
|
|
|
|
|
|
|
|
; VDU DRIVER FOR ECB-VDU PROJECT |
|
|
; |
|
|
; |
|
|
; ORIGINALLY WRITTEN BY: ANDREW LYNCH |
|
|
; ORIGINALLY WRITTEN BY: ANDREW LYNCH |
|
|
; REVISED/ENHANCED BY DAN WERNER -- 11/7/2009 |
|
|
; REVISED/ENHANCED BY DAN WERNER -- 11/7/2009 |
|
|
; ROMWBW ADAPTATION BY: WAYNE WARTHEN -- 11/9/2012 |
|
|
; 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: |
|
|
; TODO: |
|
|
; - ADD REMAINING REGISTERS TO INIT |
|
|
; - ADD REMAINING REGISTERS TO INIT |
|
|
; - TRY 25 ROW MODE? |
|
|
|
|
|
; - IMPLEMENT CONSTANTS FOR SCREEN DIMENSIONS |
|
|
|
|
|
; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION |
|
|
; - IMPLEMENT SET CURSOR STYLE (VDASCS) FUNCTION |
|
|
; - IMPLEMENT ALTERNATE DISPLAY MODES? |
|
|
; - 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 |
|
|
VDU_PPIX .EQU VDU_BASE + $07 ; PPI CONTROL PORT |
|
|
; |
|
|
; |
|
|
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER |
|
|
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 |
|
|
; VDU DRIVER - INITIALIZATION |
|
|
@ -42,6 +62,14 @@ VDU_INIT: |
|
|
PRTS("VDU: IO=0x$") |
|
|
PRTS("VDU: IO=0x$") |
|
|
LD A,VDU_RAMRD |
|
|
LD A,VDU_RAMRD |
|
|
CALL PRTHEXBYTE |
|
|
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 |
|
|
CALL VDU_PROBE ; CHECK FOR HW EXISTENCE |
|
|
JR Z,VDU_INIT1 ; CONTINUE IF HW PRESENT |
|
|
JR Z,VDU_INIT1 ; CONTINUE IF HW PRESENT |
|
|
; |
|
|
; |
|
|
@ -101,10 +129,10 @@ VDU_VDAINI: |
|
|
RET |
|
|
RET |
|
|
|
|
|
|
|
|
VDU_VDAQRY: |
|
|
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 |
|
|
RET |
|
|
|
|
|
|
|
|
VDU_VDARES: |
|
|
VDU_VDARES: |
|
|
@ -281,7 +309,7 @@ VDU_CRTINIT1: |
|
|
VDU_XY2IDX: |
|
|
VDU_XY2IDX: |
|
|
LD A,E ; SAVE COLUMN NUMBER IN A |
|
|
LD A,E ; SAVE COLUMN NUMBER IN A |
|
|
LD H,D ; SET H TO ROW NUMBER |
|
|
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 |
|
|
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET |
|
|
LD E,A ; GET COLUMN BACK |
|
|
LD E,A ; GET COLUMN BACK |
|
|
ADD HL,DE ; ADD IT IN |
|
|
ADD HL,DE ; ADD IT IN |
|
|
@ -294,7 +322,7 @@ VDU_XY2IDX: |
|
|
VDU_XY: |
|
|
VDU_XY: |
|
|
LD A,E ; SAVE COLUMN NUMBER IN A |
|
|
LD A,E ; SAVE COLUMN NUMBER IN A |
|
|
LD H,D ; SET H TO ROW NUMBER |
|
|
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 |
|
|
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET |
|
|
LD E,A ; GET COLUMN BACK |
|
|
LD E,A ; GET COLUMN BACK |
|
|
ADD HL,DE ; ADD IT IN |
|
|
ADD HL,DE ; ADD IT IN |
|
|
@ -317,7 +345,7 @@ VDU_PUTCHAR: |
|
|
ADD HL,DE |
|
|
ADD HL,DE |
|
|
INC DE ; INC |
|
|
INC DE ; INC |
|
|
LD (VDU_POS),DE ; SAVE NEW SCREEN POSITION |
|
|
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 |
|
|
CALL VDU_WRREGX ; DO IT |
|
|
INC HL ; NEW CURSOR POSITION |
|
|
INC HL ; NEW CURSOR POSITION |
|
|
LD C,14 ; CURSOR POSITION REGISTER PAIR |
|
|
LD C,14 ; CURSOR POSITION REGISTER PAIR |
|
|
@ -428,7 +456,7 @@ VDU_BLKCPY2: ; BUFFER -> VIDEO RAM COPY LOOP |
|
|
VDU_SCROLL: |
|
|
VDU_SCROLL: |
|
|
; SCROLL FORWARD BY ADDING ONE ROW TO DISPLAY START ADDRESS |
|
|
; SCROLL FORWARD BY ADDING ONE ROW TO DISPLAY START ADDRESS |
|
|
LD HL,(VDU_OFFSET) |
|
|
LD HL,(VDU_OFFSET) |
|
|
LD DE,80 |
|
|
|
|
|
|
|
|
LD DE,DROWS |
|
|
ADD HL,DE |
|
|
ADD HL,DE |
|
|
LD (VDU_OFFSET),HL |
|
|
LD (VDU_OFFSET),HL |
|
|
LD C,12 |
|
|
LD C,12 |
|
|
@ -437,9 +465,9 @@ VDU_SCROLL: |
|
|
; FILL EXPOSED LINE |
|
|
; FILL EXPOSED LINE |
|
|
LD HL,(VDU_POS) |
|
|
LD HL,(VDU_POS) |
|
|
PUSH HL |
|
|
PUSH HL |
|
|
LD HL,23*80 |
|
|
|
|
|
|
|
|
LD HL,(DLINES-1)*DROWS |
|
|
LD (VDU_POS),HL |
|
|
LD (VDU_POS),HL |
|
|
LD DE,80 |
|
|
|
|
|
|
|
|
LD DE,DROWS |
|
|
LD A,' ' |
|
|
LD A,' ' |
|
|
CALL VDU_FILL |
|
|
CALL VDU_FILL |
|
|
POP HL |
|
|
POP HL |
|
|
@ -459,7 +487,7 @@ VDU_SCROLL: |
|
|
VDU_RSCROLL: |
|
|
VDU_RSCROLL: |
|
|
; SCROLL BACKWARD BY SUBTRACTING ONE ROW FROM DISPLAY START ADDRESS |
|
|
; SCROLL BACKWARD BY SUBTRACTING ONE ROW FROM DISPLAY START ADDRESS |
|
|
LD HL,(VDU_OFFSET) |
|
|
LD HL,(VDU_OFFSET) |
|
|
LD DE,-80 |
|
|
|
|
|
|
|
|
LD DE,-DROWS |
|
|
ADD HL,DE |
|
|
ADD HL,DE |
|
|
LD (VDU_OFFSET),HL |
|
|
LD (VDU_OFFSET),HL |
|
|
LD C,12 |
|
|
LD C,12 |
|
|
@ -470,7 +498,7 @@ VDU_RSCROLL: |
|
|
PUSH HL |
|
|
PUSH HL |
|
|
LD HL,0 |
|
|
LD HL,0 |
|
|
LD (VDU_POS),HL |
|
|
LD (VDU_POS),HL |
|
|
LD DE,80 |
|
|
|
|
|
|
|
|
LD DE,DROWS |
|
|
LD A,' ' |
|
|
LD A,' ' |
|
|
CALL VDU_FILL |
|
|
CALL VDU_FILL |
|
|
POP HL |
|
|
POP HL |
|
|
@ -491,22 +519,20 @@ VDU_POS .DW 0 ; CURRENT DISPLAY POSITION |
|
|
VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION |
|
|
VDU_OFFSET .DW 0 ; CURRENT DISPLAY POSITION |
|
|
VDU_BUF .FILL 256,0 ; COPY BUFFER |
|
|
VDU_BUF .FILL 256,0 ; COPY BUFFER |
|
|
; |
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
#IF (VDUSIZ=V80X24) |
|
|
;================================================================================================== |
|
|
;================================================================================================== |
|
|
; VDU DRIVER - SY6845 REGISTER INITIALIZATION |
|
|
|
|
|
|
|
|
; VDU DRIVER - SY6845 REGISTER INITIALIZATION -80x24 10x8 |
|
|
;================================================================================================== |
|
|
;================================================================================================== |
|
|
; |
|
|
; |
|
|
VDU_INIT6845: |
|
|
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 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 060H ; R2 HORIZONTAL SYNC POSITION |
|
|
.DB 00CH ; R3 SYNC WIDTHS |
|
|
.DB 00CH ; R3 SYNC WIDTHS |
|
|
.DB 01EH ; R4 VERTICAL TOTAL (TOTAL CHARS IN A FRAME -1) |
|
|
.DB 01EH ; R4 VERTICAL TOTAL (TOTAL CHARS IN A FRAME -1) |
|
|
.DB 002H ; R5 VERTICAL TOTAL ADJUST ( |
|
|
.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 01AH ; R7 VERTICAL SYNC |
|
|
.DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING |
|
|
.DB 078H ; R8 MODE B7=0 TRANSPARENT UPDATE DURING BLANKING |
|
|
; B6=1 PIN 34 IS UPDATE STROBE |
|
|
; B6=1 PIN 34 IS UPDATE STROBE |
|
|
@ -515,14 +541,76 @@ VDU_INIT6845: |
|
|
; B3=1 TRANSPARENT MEMORY ADDRESSING |
|
|
; B3=1 TRANSPARENT MEMORY ADDRESSING |
|
|
; B2=0 RAM STRAIGHT BINARY ADDRESSING |
|
|
; B2=0 RAM STRAIGHT BINARY ADDRESSING |
|
|
; B1,B0=0 NON-INTERLACE |
|
|
; 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 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 ; R12 START ADDRESS HI |
|
|
.DB 00H ; R13 START ADDRESS LO |
|
|
.DB 00H ; R13 START ADDRESS LO |
|
|
.DB 00H ; R14 CURSOR ADDRESS HI |
|
|
.DB 00H ; R14 CURSOR ADDRESS HI |
|
|
.DB 00H ; R15 CURSOR ADDRESS LO |
|
|
.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 |
|
|
; 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. |
|
|
; 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 |
|
|
; HORIZONTAL LINE WIDTH IS 64uS. FOR A 2 MHz CHARACTER CLOCK (R0+1)/2000000 = 64uS |
|
|
|