|
|
|
@ -1,11 +1,11 @@ |
|
|
|
;====================================================================== |
|
|
|
; VIDEO DRIVER FOR FPGA VGA |
|
|
|
; VIDEO DRIVER FOR TRION VGA |
|
|
|
; http://s100computers.com/My%20System%20Pages/FPGA%20Z80%20SBC/FPGA%20Z80%20SBC.htm |
|
|
|
; |
|
|
|
; WRITTEN BY: WAYNE WARTHEN -- 9/2/2024 |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
; FPGA VGA EXPOSES A FRAME BUFFER STARTING AT $E000. |
|
|
|
; TRION VGA EXPOSES A FRAME BUFFER STARTING AT $E000. |
|
|
|
; PORT $08 CONTROLS ACCESS TO THE FRAME BUFFER. |
|
|
|
; - WHEN $01, FRAME BUFFER APPEARS AT $E000 IN CPU ADDRESS SPACE |
|
|
|
; - WHEN $00, FRAME BUFFER IS INACCESSIBLE BY CPU |
|
|
|
@ -25,226 +25,226 @@ |
|
|
|
; TODO: |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; FPGA VGA DRIVER - CONSTANTS |
|
|
|
; TRION VGA DRIVER - CONSTANTS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FV_FBUF .EQU $E000 ; ADDRESS OF FRAME BUFFER |
|
|
|
FV_BASE .EQU $C0 ; BASE I/O ADDRESS |
|
|
|
FV_CCOL .EQU FV_BASE+0 ; CUR COL PORT |
|
|
|
FV_CROW .EQU FV_BASE+1 ; CUR ROW PORT |
|
|
|
FV_CTL .EQU FV_BASE+2 ; VGA CONTROL PORT |
|
|
|
TVGA_FBUF .EQU $E000 ; ADDRESS OF FRAME BUFFER |
|
|
|
TVGA_BASE .EQU $C0 ; BASE I/O ADDRESS |
|
|
|
TVGA_CCOL .EQU TVGA_BASE+0 ; CUR COL PORT |
|
|
|
TVGA_CROW .EQU TVGA_BASE+1 ; CUR ROW PORT |
|
|
|
TVGA_CTL .EQU TVGA_BASE+2 ; VGA CONTROL PORT |
|
|
|
; |
|
|
|
FV_BUFCTL .EQU $08 |
|
|
|
TVGA_BUFCTL .EQU $08 |
|
|
|
; |
|
|
|
FV_KBDDATA .EQU $03 ; KBD CTLR DATA PORT |
|
|
|
FV_KBDST .EQU $02 ; KBD CTLR STATUS/CMD PORT |
|
|
|
TVGA_KBDDATA .EQU $03 ; KBD CTLR DATA PORT |
|
|
|
TVGA_KBDST .EQU $02 ; KBD CTLR STATUS/CMD PORT |
|
|
|
; |
|
|
|
FV_ROWS .EQU 40 |
|
|
|
FV_COLS .EQU 80 |
|
|
|
TVGA_ROWS .EQU 40 |
|
|
|
TVGA_COLS .EQU 80 |
|
|
|
; |
|
|
|
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER |
|
|
|
KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT |
|
|
|
; |
|
|
|
DEVECHO "FV: IO=" |
|
|
|
DEVECHO FV_BASE |
|
|
|
DEVECHO ", KBD MODE=FV" |
|
|
|
DEVECHO "TVGA: IO=" |
|
|
|
DEVECHO TVGA_BASE |
|
|
|
DEVECHO ", KBD MODE=T35" |
|
|
|
DEVECHO ", KBD IO=" |
|
|
|
DEVECHO FV_KBDDATA |
|
|
|
DEVECHO TVGA_KBDDATA |
|
|
|
DEVECHO "\n" |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; FPGA VGA DRIVER - INITIALIZATION |
|
|
|
; TRION VGA DRIVER - INITIALIZATION |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FV_INIT: |
|
|
|
LD IY,FV_IDAT ; POINTER TO INSTANCE DATA |
|
|
|
TVGA_INIT: |
|
|
|
LD IY,TVGA_IDAT ; POINTER TO INSTANCE DATA |
|
|
|
; |
|
|
|
OR $FF ; CLEAR THE |
|
|
|
LD (FV_UNIT),A ; ... UNIT NUMBER |
|
|
|
LD (TVGA_UNIT),A ; ... UNIT NUMBER |
|
|
|
; |
|
|
|
CALL NEWLINE ; FORMATTING |
|
|
|
PRTS("FV: IO=0x$") |
|
|
|
LD A,FV_BASE |
|
|
|
PRTS("TVGA: IO=0x$") |
|
|
|
LD A,TVGA_BASE |
|
|
|
CALL PRTHEXBYTE |
|
|
|
CALL FV_PROBE ; CHECK FOR HW PRESENCE |
|
|
|
JR Z,FV_INIT1 ; CONTINUE IF HW PRESENT |
|
|
|
CALL TVGA_PROBE ; CHECK FOR HW PRESENCE |
|
|
|
JR Z,TVGA_INIT1 ; CONTINUE IF HW PRESENT |
|
|
|
; |
|
|
|
; HARDWARE NOT PRESENT |
|
|
|
PRTS(" NOT PRESENT$") |
|
|
|
OR $FF ; SIGNAL FAILURE |
|
|
|
RET |
|
|
|
; |
|
|
|
FV_INIT1: |
|
|
|
TVGA_INIT1: |
|
|
|
;;; ; RECORD DRIVER ACTIVE |
|
|
|
;;; OR $FF |
|
|
|
;;; LD (FV_ACTIVE),A |
|
|
|
;;; LD (TVGA_ACTIVE),A |
|
|
|
; DISPLAY CONSOLE DIMENSIONS |
|
|
|
LD A,FV_COLS |
|
|
|
LD A,TVGA_COLS |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PRTDECB |
|
|
|
LD A,'X' |
|
|
|
CALL COUT |
|
|
|
LD A,FV_ROWS |
|
|
|
LD A,TVGA_ROWS |
|
|
|
CALL PRTDECB |
|
|
|
PRTS(" TEXT$") |
|
|
|
|
|
|
|
; HARDWARE INITIALIZATION |
|
|
|
CALL FV_CRTINIT ; SETUP THE FPGA VGA CHIP REGISTERS |
|
|
|
CALL FV_VDAINI ; INITIALIZE |
|
|
|
CALL TVGA_CRTINIT ; SETUP THE TRION VGA REGISTERS |
|
|
|
CALL TVGA_VDAINI ; INITIALIZE |
|
|
|
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER |
|
|
|
|
|
|
|
; ADD OURSELVES TO VDA DISPATCH TABLE |
|
|
|
LD BC,FV_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|
|
|
LD DE,FV_IDAT ; DE := FPGA VGA INSTANCE DATA PTR |
|
|
|
LD BC,TVGA_FNTBL ; BC := FUNCTION TABLE ADDRESS |
|
|
|
LD DE,TVGA_IDAT ; DE := TRION VGA INSTANCE DATA PTR |
|
|
|
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED |
|
|
|
|
|
|
|
; INITIALIZE EMULATION |
|
|
|
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM |
|
|
|
LD DE,FV_FNTBL ; DE := FUNCTION TABLE ADDRESS |
|
|
|
LD HL,FV_IDAT ; HL := FPGA VGA INSTANCE DATA PTR |
|
|
|
LD DE,TVGA_FNTBL ; DE := FUNCTION TABLE ADDRESS |
|
|
|
LD HL,TVGA_IDAT ; HL := TRION VGA INSTANCE DATA PTR |
|
|
|
CALL TERM_ATTACH ; DO IT |
|
|
|
CP $FF ; ERROR? |
|
|
|
JR NZ,FV_INIT2 ; CONTINUE IF ALL GOOD |
|
|
|
JR NZ,TVGA_INIT2 ; CONTINUE IF ALL GOOD |
|
|
|
OR A ; IF ERROR, SET FLAGS |
|
|
|
RET ; AND RETURN |
|
|
|
|
|
|
|
FV_INIT2: |
|
|
|
LD (FV_UNIT),A ; RECORD OUR UNIT NUMBER |
|
|
|
TVGA_INIT2: |
|
|
|
LD (TVGA_UNIT),A ; RECORD OUR UNIT NUMBER |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; FPGA VGA DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS |
|
|
|
; TRION VGA DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
FV_FNTBL: |
|
|
|
.DW FV_VDAINI |
|
|
|
.DW FV_VDAQRY |
|
|
|
.DW FV_VDARES |
|
|
|
.DW FV_VDADEV |
|
|
|
.DW FV_VDASCS |
|
|
|
.DW FV_VDASCP |
|
|
|
.DW FV_VDASAT |
|
|
|
.DW FV_VDASCO |
|
|
|
.DW FV_VDAWRC |
|
|
|
.DW FV_VDAFIL |
|
|
|
.DW FV_VDACPY |
|
|
|
.DW FV_VDASCR |
|
|
|
.DW FV_STAT |
|
|
|
.DW FV_FLUSH |
|
|
|
.DW FV_READ |
|
|
|
.DW FV_VDARDC |
|
|
|
#IF (($ - FV_FNTBL) != (VDA_FNCNT * 2)) |
|
|
|
.ECHO "*** INVALID FV FUNCTION TABLE ***\n" |
|
|
|
TVGA_FNTBL: |
|
|
|
.DW TVGA_VDAINI |
|
|
|
.DW TVGA_VDAQRY |
|
|
|
.DW TVGA_VDARES |
|
|
|
.DW TVGA_VDADEV |
|
|
|
.DW TVGA_VDASCS |
|
|
|
.DW TVGA_VDASCP |
|
|
|
.DW TVGA_VDASAT |
|
|
|
.DW TVGA_VDASCO |
|
|
|
.DW TVGA_VDAWRC |
|
|
|
.DW TVGA_VDAFIL |
|
|
|
.DW TVGA_VDACPY |
|
|
|
.DW TVGA_VDASCR |
|
|
|
.DW TVGA_STAT |
|
|
|
.DW TVGA_FLUSH |
|
|
|
.DW TVGA_READ |
|
|
|
.DW TVGA_VDARDC |
|
|
|
#IF (($ - TVGA_FNTBL) != (VDA_FNCNT * 2)) |
|
|
|
.ECHO "*** INVALID TVGA FUNCTION TABLE ***\n" |
|
|
|
!!!!! |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
FV_VDAINI: |
|
|
|
TVGA_VDAINI: |
|
|
|
; RESET VDA |
|
|
|
CALL FV_VDARES ; RESET VDA |
|
|
|
CALL TVGA_VDARES ; RESET VDA |
|
|
|
LD HL,0 ; ZERO |
|
|
|
LD (FV_POS),HL ; ... TO POSITION |
|
|
|
LD (TVGA_POS),HL ; ... TO POSITION |
|
|
|
LD A,' ' ; BLANK THE SCREEN |
|
|
|
LD DE,FV_ROWS*FV_COLS ; FILL ENTIRE BUFFER |
|
|
|
CALL FV_FILL ; DO IT |
|
|
|
LD DE,TVGA_ROWS*TVGA_COLS ; FILL ENTIRE BUFFER |
|
|
|
CALL TVGA_FILL ; DO IT |
|
|
|
LD DE,0 ; ROW = 0, COL = 0 |
|
|
|
CALL FV_XY ; SEND CURSOR TO TOP LEFT |
|
|
|
CALL FV_SHOWCUR ; NOW SHOW THE CURSOR |
|
|
|
CALL TVGA_XY ; SEND CURSOR TO TOP LEFT |
|
|
|
CALL TVGA_SHOWCUR ; NOW SHOW THE CURSOR |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDAQRY: |
|
|
|
TVGA_VDAQRY: |
|
|
|
LD C,$00 ; MODE ZERO IS ALL WE KNOW |
|
|
|
LD D,FV_ROWS ; ROWS |
|
|
|
LD E,FV_COLS ; COLS |
|
|
|
LD D,TVGA_ROWS ; ROWS |
|
|
|
LD E,TVGA_COLS ; COLS |
|
|
|
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDARES: |
|
|
|
CALL FV_CRTINIT |
|
|
|
TVGA_VDARES: |
|
|
|
CALL TVGA_CRTINIT |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDADEV: |
|
|
|
LD D,VDADEV_FV ; D := DEVICE TYPE |
|
|
|
TVGA_VDADEV: |
|
|
|
LD D,VDADEV_TVGA ; D := DEVICE TYPE |
|
|
|
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO |
|
|
|
LD H,0 ; H := 0, DRIVER HAS NO MODES |
|
|
|
LD L,FV_BASE ; L := BASE I/O ADDRESS |
|
|
|
LD L,TVGA_BASE ; L := BASE I/O ADDRESS |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDASCS: |
|
|
|
TVGA_VDASCS: |
|
|
|
SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED (YET) |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDASCP: |
|
|
|
CALL FV_XY ; SET CURSOR POSITION |
|
|
|
TVGA_VDASCP: |
|
|
|
CALL TVGA_XY ; SET CURSOR POSITION |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDASAT: |
|
|
|
TVGA_VDASAT: |
|
|
|
; ATTRIBUTES NOT SUPPORTED BY HARDWARE |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDASCO: |
|
|
|
TVGA_VDASCO: |
|
|
|
; CHARACTER COLOR NOT SUPPORT BY HARDWARE |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
|
|
|
|
FV_VDAWRC: |
|
|
|
TVGA_VDAWRC: |
|
|
|
LD A,E ; CHARACTER TO WRITE GOES IN A |
|
|
|
CALL FV_PUTCHAR ; PUT IT ON THE SCREEN |
|
|
|
CALL TVGA_PUTCHAR ; PUT IT ON THE SCREEN |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDAFIL: |
|
|
|
TVGA_VDAFIL: |
|
|
|
LD A,E ; FILL CHARACTER GOES IN A |
|
|
|
EX DE,HL ; FILL LENGTH GOES IN DE |
|
|
|
CALL FV_FILL ; DO THE FILL |
|
|
|
CALL TVGA_FILL ; DO THE FILL |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_VDACPY: |
|
|
|
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS FV_POS |
|
|
|
TVGA_VDACPY: |
|
|
|
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS TVGA_POS |
|
|
|
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT |
|
|
|
PUSH HL ; SAVE LENGTH |
|
|
|
CALL FV_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL |
|
|
|
CALL TVGA_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL |
|
|
|
POP BC ; RECOVER LENGTH IN BC |
|
|
|
LD DE,(FV_POS) ; PUT DEST IN DE |
|
|
|
JP FV_BLKCPY ; DO A BLOCK COPY |
|
|
|
LD DE,(TVGA_POS) ; PUT DEST IN DE |
|
|
|
JP TVGA_BLKCPY ; DO A BLOCK COPY |
|
|
|
|
|
|
|
FV_VDASCR: |
|
|
|
TVGA_VDASCR: |
|
|
|
LD A,E ; LOAD E INTO A |
|
|
|
OR A ; SET FLAGS |
|
|
|
RET Z ; IF ZERO, WE ARE DONE |
|
|
|
PUSH DE ; SAVE E |
|
|
|
JP M,FV_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL |
|
|
|
CALL FV_SCROLL ; SCROLL FORWARD ONE LINE |
|
|
|
JP M,TVGA_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL |
|
|
|
CALL TVGA_SCROLL ; SCROLL FORWARD ONE LINE |
|
|
|
POP DE ; RECOVER E |
|
|
|
DEC E ; DECREMENT IT |
|
|
|
JR FV_VDASCR ; LOOP |
|
|
|
FV_VDASCR1: |
|
|
|
CALL FV_RSCROLL ; SCROLL REVERSE ONE LINE |
|
|
|
JR TVGA_VDASCR ; LOOP |
|
|
|
TVGA_VDASCR1: |
|
|
|
CALL TVGA_RSCROLL ; SCROLL REVERSE ONE LINE |
|
|
|
POP DE ; RECOVER E |
|
|
|
INC E ; INCREMENT IT |
|
|
|
JR FV_VDASCR ; LOOP |
|
|
|
JR TVGA_VDASCR ; LOOP |
|
|
|
|
|
|
|
FV_STAT: |
|
|
|
IN A,(FV_KBDST) ; GET STATUS |
|
|
|
TVGA_STAT: |
|
|
|
IN A,(TVGA_KBDST) ; GET STATUS |
|
|
|
AND $01 ; ISOLATE DATA WAITING BIT |
|
|
|
JP Z,CIO_IDLE ; NO DATA, EXIT VIA IDLE PROCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_FLUSH: |
|
|
|
TVGA_FLUSH: |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
|
|
|
|
FV_READ: |
|
|
|
CALL FV_STAT ; GET STATUS |
|
|
|
JR Z,FV_READ ; LOOP TILL DATA READY |
|
|
|
IN A,(FV_KBDDATA) ; GET BYTE |
|
|
|
TVGA_READ: |
|
|
|
CALL TVGA_STAT ; GET STATUS |
|
|
|
JR Z,TVGA_READ ; LOOP TILL DATA READY |
|
|
|
IN A,(TVGA_KBDDATA) ; GET BYTE |
|
|
|
LD E,A ; PUT IN E FOR RETURN |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
@ -254,25 +254,25 @@ FV_READ: |
|
|
|
; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
|
|
|
|
FV_VDARDC: |
|
|
|
CALL FV_GETCHAR ; GET THE CHARACTER AT CUR CUR POS |
|
|
|
TVGA_VDARDC: |
|
|
|
CALL TVGA_GETCHAR ; GET THE CHARACTER AT CUR CUR POS |
|
|
|
LD E,A ; PUT IN E |
|
|
|
LD BC,0 ; COLOR AND ATTR NOT SUPPORTED |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET |
|
|
|
; |
|
|
|
;====================================================================== |
|
|
|
; FPGA VGA DRIVER - PRIVATE DRIVER FUNCTIONS |
|
|
|
; TRION VGA DRIVER - PRIVATE DRIVER FUNCTIONS |
|
|
|
;====================================================================== |
|
|
|
; |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; PROBE FOR FPGA VGA HARDWARE |
|
|
|
; PROBE FOR TRION VGA HARDWARE |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
; ON RETURN, ZF SET INDICATES HARDWARE FOUND |
|
|
|
; |
|
|
|
FV_PROBE: |
|
|
|
TVGA_PROBE: |
|
|
|
XOR A ; ASSUME H/W EXISTS |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -280,9 +280,9 @@ FV_PROBE: |
|
|
|
; CRTC DISPLAY CONTROLLER CHIP INITIALIZATION |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_CRTINIT: |
|
|
|
TVGA_CRTINIT: |
|
|
|
LD A,%11001111 ; WHITE ON BLACK, CURSOR ON, ENABLE OUTPUT |
|
|
|
OUT (FV_CTL),A ; WRITE TO CONTROL PORT |
|
|
|
OUT (TVGA_CTL),A ; WRITE TO CONTROL PORT |
|
|
|
XOR A ; ZERO ACCUM |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
@ -290,32 +290,32 @@ FV_CRTINIT: |
|
|
|
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_XY: |
|
|
|
CALL FV_HIDECUR ; HIDE THE CURSOR |
|
|
|
TVGA_XY: |
|
|
|
CALL TVGA_HIDECUR ; HIDE THE CURSOR |
|
|
|
PUSH DE ; SAVE NEW POSITION FOR NOW |
|
|
|
CALL FV_XY2IDX ; CONVERT ROW/COL TO BUF IDX |
|
|
|
LD (FV_POS),HL ; SAVE THE RESULT (DISPLAY POSITION) |
|
|
|
CALL TVGA_XY2IDX ; CONVERT ROW/COL TO BUF IDX |
|
|
|
LD (TVGA_POS),HL ; SAVE THE RESULT (DISPLAY POSITION) |
|
|
|
POP DE ; RECOVER INCOMING ROW/COL |
|
|
|
LD A,D ; GET ROW |
|
|
|
OUT (FV_CROW),A ; SET ROW REGISTER |
|
|
|
OUT (TVGA_CROW),A ; SET ROW REGISTER |
|
|
|
LD A,E ; GET COL |
|
|
|
INC A ; 1..79,0 (WHY???) |
|
|
|
CP 80 ; COL 80? |
|
|
|
JR NZ, FV_XY1 ; SKIP IF NOT |
|
|
|
JR NZ, TVGA_XY1 ; SKIP IF NOT |
|
|
|
XOR A ; ELSE MAKE IT ZERO! |
|
|
|
FV_XY1: |
|
|
|
OUT (FV_CCOL),A ; SET COL REGISTER |
|
|
|
JP FV_SHOWCUR ; SHOW THE CURSOR AND EXIT |
|
|
|
TVGA_XY1: |
|
|
|
OUT (TVGA_CCOL),A ; SET COL REGISTER |
|
|
|
JP TVGA_SHOWCUR ; SHOW THE CURSOR AND EXIT |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL |
|
|
|
; D=ROW, E=COL |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_XY2IDX: |
|
|
|
TVGA_XY2IDX: |
|
|
|
LD A,E ; SAVE COLUMN NUMBER IN A |
|
|
|
LD H,D ; SET H TO ROW NUMBER |
|
|
|
LD E,FV_COLS ; SET E TO ROW LENGTH |
|
|
|
LD E,TVGA_COLS ; SET E TO ROW LENGTH |
|
|
|
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET, H * E = HL, E=0, B=0 |
|
|
|
LD E,A ; GET COLUMN BACK |
|
|
|
ADD HL,DE ; ADD IT IN |
|
|
|
@ -325,17 +325,17 @@ FV_XY2IDX: |
|
|
|
; SHOW OR HIDE CURSOR |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_SHOWCUR: |
|
|
|
TVGA_SHOWCUR: |
|
|
|
LD A,%11001111 ; CONTROL PORT VALUE |
|
|
|
;;;LD A,%11111111 ; CONTROL PORT VALUE |
|
|
|
OUT (FV_CTL),A ; SET REGISTER |
|
|
|
OUT (TVGA_CTL),A ; SET REGISTER |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
FV_HIDECUR: |
|
|
|
TVGA_HIDECUR: |
|
|
|
LD A,%11001111 ; CONTROL PORT VALUE |
|
|
|
;;;LD A,%11111111 ; CONTROL PORT VALUE |
|
|
|
OUT (FV_CTL),A ; SET REGISTER |
|
|
|
OUT (TVGA_CTL),A ; SET REGISTER |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
@ -343,17 +343,17 @@ FV_HIDECUR: |
|
|
|
; (DE)SELECT FRAME BUFFER |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_BUFSEL: |
|
|
|
TVGA_BUFSEL: |
|
|
|
PUSH AF |
|
|
|
LD A,$01 |
|
|
|
OUT (FV_BUFCTL),A |
|
|
|
OUT (TVGA_BUFCTL),A |
|
|
|
POP AF |
|
|
|
RET |
|
|
|
; |
|
|
|
FV_BUFDESEL: |
|
|
|
TVGA_BUFDESEL: |
|
|
|
PUSH AF |
|
|
|
XOR A |
|
|
|
OUT (FV_BUFCTL),A |
|
|
|
OUT (TVGA_BUFCTL),A |
|
|
|
POP AF |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -361,36 +361,36 @@ FV_BUFDESEL: |
|
|
|
; WRITE VALUE IN A TO CURRENT VDU BUFFER POSITION, ADVANCE CURSOR |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_PUTCHAR: |
|
|
|
TVGA_PUTCHAR: |
|
|
|
; WRITE CHAR AT CURRENT CURSOR POSITION. |
|
|
|
PUSH AF ; SAVE INCOMING CHAR |
|
|
|
CALL FV_HIDECUR ; HIDE CURSOR |
|
|
|
CALL FV_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
CALL TVGA_HIDECUR ; HIDE CURSOR |
|
|
|
CALL TVGA_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
POP AF |
|
|
|
LD HL,(FV_POS) ; GET CUR BUF POSITION |
|
|
|
LD DE,FV_FBUF ; START OF FRAME BUF |
|
|
|
LD HL,(TVGA_POS) ; GET CUR BUF POSITION |
|
|
|
LD DE,TVGA_FBUF ; START OF FRAME BUF |
|
|
|
ADD HL,DE ; ADD IT IN |
|
|
|
LD (HL),A ; PUT THE CHAR |
|
|
|
; |
|
|
|
; SET NEW POSITION |
|
|
|
LD HL,(FV_POS) ; GET POSITION |
|
|
|
LD HL,(TVGA_POS) ; GET POSITION |
|
|
|
INC HL ; BUMP POSITION |
|
|
|
LD (FV_POS),HL ; SAVE NEW POSITION |
|
|
|
LD (TVGA_POS),HL ; SAVE NEW POSITION |
|
|
|
; |
|
|
|
; PUT CUROR IN PLACE |
|
|
|
LD DE,FV_COLS ; COLS PER LINE |
|
|
|
LD DE,TVGA_COLS ; COLS PER LINE |
|
|
|
CALL DIV16 ; BC=ROW, HL=COL |
|
|
|
LD D,C |
|
|
|
LD E,L |
|
|
|
CALL FV_XY |
|
|
|
CALL FV_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
JP FV_SHOWCUR ; SHOW IT AND RETURN |
|
|
|
CALL TVGA_XY |
|
|
|
CALL TVGA_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
JP TVGA_SHOWCUR ; SHOW IT AND RETURN |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; GET CHAR VALUE TO A FROM CURRENT VDU BUFFER POSITION |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_GETCHAR: |
|
|
|
TVGA_GETCHAR: |
|
|
|
XOR A |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -401,107 +401,107 @@ FV_GETCHAR: |
|
|
|
; DE: NUMBER OF CHARACTERS TO FILL |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_FILL: |
|
|
|
TVGA_FILL: |
|
|
|
PUSH AF ; SAVE INCOMING FILL CHAR |
|
|
|
CALL FV_HIDECUR ; HIDE CURSOR |
|
|
|
CALL FV_BUFSEL ; SELECT BUFFER |
|
|
|
LD HL,(FV_POS) ; CUR POS TO HL |
|
|
|
LD BC,FV_FBUF ; ADR OF FRAME |
|
|
|
CALL TVGA_HIDECUR ; HIDE CURSOR |
|
|
|
CALL TVGA_BUFSEL ; SELECT BUFFER |
|
|
|
LD HL,(TVGA_POS) ; CUR POS TO HL |
|
|
|
LD BC,TVGA_FBUF ; ADR OF FRAME |
|
|
|
ADD HL,BC ; ADD IT IN |
|
|
|
POP AF |
|
|
|
LD C,A ; FILL CHAR TO C |
|
|
|
FV_FILL1: |
|
|
|
TVGA_FILL1: |
|
|
|
LD A,D ; CHECK FILL |
|
|
|
OR E ; ... COUNTER |
|
|
|
JR Z,FV_FILL2 ; DONE IF ZERO |
|
|
|
JR Z,TVGA_FILL2 ; DONE IF ZERO |
|
|
|
LD (HL),C ; FILL ONE CHAR |
|
|
|
INC HL ; BUMP BUF PTR |
|
|
|
DEC DE ; DEC FILL COUNTER |
|
|
|
JR FV_FILL1 ; LOOP |
|
|
|
JR TVGA_FILL1 ; LOOP |
|
|
|
; |
|
|
|
FV_FILL2: |
|
|
|
CALL FV_BUFDESEL ; DESELECT BUFFER |
|
|
|
JP FV_SHOWCUR ; EXIT VIA SHOW CURSOR |
|
|
|
TVGA_FILL2: |
|
|
|
CALL TVGA_BUFDESEL ; DESELECT BUFFER |
|
|
|
JP TVGA_SHOWCUR ; EXIT VIA SHOW CURSOR |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED) |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_SCROLL: |
|
|
|
CALL FV_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
TVGA_SCROLL: |
|
|
|
CALL TVGA_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
; |
|
|
|
; COPY "UP" ONE LINE |
|
|
|
LD HL,FV_FBUF + FV_COLS ; FROM SECOND LINE |
|
|
|
LD DE,FV_FBUF ; TO FIRST LINE |
|
|
|
LD BC,+(FV_ROWS - 1) * FV_COLS ; ALL BUT ONE LINE |
|
|
|
LD HL,TVGA_FBUF + TVGA_COLS ; FROM SECOND LINE |
|
|
|
LD DE,TVGA_FBUF ; TO FIRST LINE |
|
|
|
LD BC,+(TVGA_ROWS - 1) * TVGA_COLS ; ALL BUT ONE LINE |
|
|
|
LDIR ; DO IT |
|
|
|
; |
|
|
|
; FILL LAST LINE OF SCREEN |
|
|
|
LD HL,FV_FBUF + ((FV_ROWS - 1) * FV_COLS) ; LAST LINE |
|
|
|
LD HL,TVGA_FBUF + ((TVGA_ROWS - 1) * TVGA_COLS) ; LAST LINE |
|
|
|
LD A,' ' ; FILL CHAR |
|
|
|
LD (HL),A ; COPY 1 CHAR |
|
|
|
LD DE,FV_FBUF + ((FV_ROWS - 1) * FV_COLS) + 1 ; SECOND POS IN LAST LINE |
|
|
|
LD BC,FV_COLS - 1 ; COLS PER LINE - 1 |
|
|
|
LD DE,TVGA_FBUF + ((TVGA_ROWS - 1) * TVGA_COLS) + 1 ; SECOND POS IN LAST LINE |
|
|
|
LD BC,TVGA_COLS - 1 ; COLS PER LINE - 1 |
|
|
|
LDIR ; FILL IT |
|
|
|
; |
|
|
|
CALL FV_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
CALL TVGA_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED) |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_RSCROLL: |
|
|
|
CALL FV_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
TVGA_RSCROLL: |
|
|
|
CALL TVGA_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
; |
|
|
|
; COPY "DOWN" ONE LINE |
|
|
|
LD HL,FV_FBUF + (FV_COLS * (FV_ROWS - 1)) - 1 ; FROM END OF SECOND TO LAST LINE |
|
|
|
LD DE,FV_FBUF + (FV_COLS * FV_ROWS) - 1 ; TO END OF LAST LINE |
|
|
|
LD BC,+(FV_ROWS - 1) * FV_COLS ; ALL BUT ONE LINE |
|
|
|
LD HL,TVGA_FBUF + (TVGA_COLS * (TVGA_ROWS - 1)) - 1 ; FROM END OF SECOND TO LAST LINE |
|
|
|
LD DE,TVGA_FBUF + (TVGA_COLS * TVGA_ROWS) - 1 ; TO END OF LAST LINE |
|
|
|
LD BC,+(TVGA_ROWS - 1) * TVGA_COLS ; ALL BUT ONE LINE |
|
|
|
LDDR ; DO IT IN REVERSE |
|
|
|
; |
|
|
|
; FILL FIRST LINE OF SCREEN |
|
|
|
LD HL,FV_FBUF ; FIRST LINE |
|
|
|
LD HL,TVGA_FBUF ; FIRST LINE |
|
|
|
LD A,' ' ; FILL CHAR |
|
|
|
LD (HL),A ; COPY 1 CHAR |
|
|
|
LD DE,FV_FBUF + 1 ; SECOND POS IN FIRST LINE |
|
|
|
LD BC,FV_COLS - 1 ; COLS PER LINE - 1 |
|
|
|
LD DE,TVGA_FBUF + 1 ; SECOND POS IN FIRST LINE |
|
|
|
LD BC,TVGA_COLS - 1 ; COLS PER LINE - 1 |
|
|
|
LDIR ; FILL IT |
|
|
|
; |
|
|
|
CALL FV_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
CALL TVGA_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; BLOCK COPY BC BYTES FROM HL TO DE |
|
|
|
;---------------------------------------------------------------------- |
|
|
|
; |
|
|
|
FV_BLKCPY: |
|
|
|
TVGA_BLKCPY: |
|
|
|
|
|
|
|
CALL FV_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
CALL TVGA_BUFSEL ; SELECT FRAME BUFFER |
|
|
|
PUSH BC ; SAVE LENGTH |
|
|
|
LD BC,FV_FBUF ; FRAME BUFFER ADR |
|
|
|
LD BC,TVGA_FBUF ; FRAME BUFFER ADR |
|
|
|
ADD HL,BC ; ADD TO SOURCE |
|
|
|
EX DE,HL ; EXCHANGE |
|
|
|
ADD HL,BC ; ADD TO DEST |
|
|
|
EX DE,HL ; EXCHANGE |
|
|
|
POP BC ; RECOVER LENGTH |
|
|
|
LDIR ; LDIR DOES THE COPY |
|
|
|
CALL FV_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
CALL TVGA_BUFDESEL ; DESELECT FRAME BUFFER |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; FPGA VGA DRIVER - DATA |
|
|
|
; TRION VGA DRIVER - DATA |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
FV_POS .DW 0 ; CURRENT DISPLAY POSITION |
|
|
|
;;;FV_ACTIVE .DB FALSE ; FLAG FOR DRIVER ACTIVE |
|
|
|
FV_UNIT .DB $FF ; ASSIGNED UNIT NUMBER |
|
|
|
TVGA_POS .DW 0 ; CURRENT DISPLAY POSITION |
|
|
|
;;;TVGA_ACTIVE .DB FALSE ; FLAG FOR DRIVER ACTIVE |
|
|
|
TVGA_UNIT .DB $FF ; ASSIGNED UNIT NUMBER |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; VGA DRIVER - INSTANCE DATA |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
FV_IDAT: |
|
|
|
.DB KBDMODE_FV ; FPGA VGA KEYBOARD CONTROLLER |
|
|
|
.DB FV_KBDST |
|
|
|
.DB FV_KBDDATA |
|
|
|
TVGA_IDAT: |
|
|
|
.DB KBDMODE_T35 ; S100 T35 KEYBOARD CONTROLLER |
|
|
|
.DB TVGA_KBDST |
|
|
|
.DB TVGA_KBDDATA |