mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
385 lines
11 KiB
385 lines
11 KiB
;======================================================================
|
|
; UPD7220 GRAPHICS DEVICE CONTROLLER
|
|
;======================================================================
|
|
;
|
|
;======================================================================
|
|
; GDC DRIVER - CONSTANTS
|
|
;======================================================================
|
|
;
|
|
#IF (GDCMODE == GDCMODE_ECB)
|
|
GDC_BASE .EQU $?? ; GDC BASE I/O PORT
|
|
GDC_DAC_BASE .EQU $?? ; RAMDAC BASE I/O PORT
|
|
#ENDIF
|
|
;
|
|
#IF (GDCMODE == GDCMODE_RPH)
|
|
GDC_KBDDATA .EQU $8C ; KBD CTLR DATA PORT
|
|
GDC_KBDST .EQU $8D ; KBD CTLR STATUS/CMD PORT
|
|
GDC_BASE .EQU $90 ; GDC BASE I/O PORT
|
|
GDC_DAC_BASE .EQU $98 ; RAMDAC BASE I/O PORT
|
|
#ENDIF
|
|
;
|
|
GDC_STAT .EQU GDC_BASE + 0 ; STATUS PORT
|
|
GDC_CMD .EQU GDC_BASE + 1 ; COMMAND PORT
|
|
GDC_PARAM .EQU GDC_BASE + 0 ; PARAM PORT
|
|
GDC_READ .EQU GDC_BASE + 1 ; READ PORT
|
|
GDC_DAC_WR .EQU GDC_DAC_BASE + 0 ; RAMDAC ADR WRITE
|
|
GDC_DAC_RD .EQU GDC_DAC_BASE + 3 ; RAMDAC ADR READ
|
|
GDC_DAC_PALRAM .EQU GDC_DAC_BASE + 1 ; RAMDAC PALETTE RAM
|
|
GDC_DAC_PIXMSK .EQU GDC_DAC_BASE + 2 ; RAMDAC PIXEL READ MASK
|
|
GDC_DAC_OVL_WR .EQU GDC_DAC_BASE + 4 ; RAMDAC OVERLAY WRITE
|
|
GDC_DAC_OVL_RD .EQU GDC_DAC_BASE + 7 ; RAMDAC OVERLAY READ
|
|
GDC_DAC_OVL_RAM .EQU GDC_DAC_BASE + 5 ; RAMDAC OVERLAY RAM
|
|
;
|
|
GDC_ROWS .EQU 25
|
|
GDC_COLS .EQU 80
|
|
;
|
|
; *** TODO: CGA AND EGA ARE PLACEHOLDERS. THESE EQUATES SHOULD
|
|
; BE USED TO ALLOW FOR MULTIPLE MONITOR TIMINGS AND/OR FONT
|
|
; DEFINITIONS.
|
|
;
|
|
DEVECHO "GDC: MODE="
|
|
;
|
|
#IF (GDCMODE == GDCMODE_ECB)
|
|
DEVECHO "ECB"
|
|
#ENDIF
|
|
#IF (GDCMODE == GDCMODE_RPH)
|
|
DEVECHO "RPH"
|
|
#ENDIF
|
|
;
|
|
DEVECHO ", DISPLAY="
|
|
;
|
|
#IF (GDCMON == GDCMON_CGA)
|
|
#DEFINE USEFONTCGA
|
|
#DEFINE GDC_FONT FONTCGA
|
|
DEVECHO "CGA"
|
|
#ENDIF
|
|
;
|
|
#IF (GDCMON == GDCMON_EGA)
|
|
#DEFINE USEFONT8X16
|
|
#DEFINE GDC_FONT FONT8X16
|
|
DEVECHO "EGA"
|
|
#ENDIF
|
|
;
|
|
DEVECHO ", IO="
|
|
DEVECHO GDC_BASE
|
|
DEVECHO "\n"
|
|
;
|
|
TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER
|
|
KBDENABLE .SET TRUE ; INCLUDE KBD KEYBOARD SUPPORT
|
|
;
|
|
;--------------------------------------------------------------------------------------------------
|
|
; HBIOS MODULE HEADER
|
|
;--------------------------------------------------------------------------------------------------
|
|
;
|
|
ORG_GDC .EQU $
|
|
;
|
|
.DW SIZ_GDC ; MODULE SIZE
|
|
.DW GDC_INITPHASE ; ADR OF INIT PHASE HANDLER
|
|
;
|
|
GDC_INITPHASE:
|
|
; INIT PHASE HANDLER, A=PHASE
|
|
CP HB_PHASE_PREINIT ; PREINIT PHASE?
|
|
JP Z,GDC_PREINIT ; DO PREINIT
|
|
CP HB_PHASE_INIT ; INIT PHASE?
|
|
JP Z,GDC_INIT ; DO INIT
|
|
RET ; DONE
|
|
;
|
|
;======================================================================
|
|
; GDC DRIVER - INITIALIZATION
|
|
;======================================================================
|
|
;
|
|
GDC_PREINIT:
|
|
LD IY,GDC_IDAT ; POINTER TO INSTANCE DATA
|
|
JP KBD_PREINIT ; INITIALIZE KEYBOARD
|
|
; RET
|
|
|
|
GDC_INIT:
|
|
LD IY,GDC_IDAT ; POINTER TO INSTANCE DATA
|
|
|
|
CALL NEWLINE
|
|
PRTS("GDC: MODE=$")
|
|
#IF (GDCMODE == GDCMODE_ECB)
|
|
PRTS("ECB$")
|
|
#ENDIF
|
|
#IF (GDCMODE == GDCMODE_RPH)
|
|
PRTS("RPH$")
|
|
#ENDIF
|
|
;
|
|
#IF (GDCMON == GDCMON_CGA)
|
|
PRTS(" CGA$")
|
|
#ENDIF
|
|
#IF (GDCMON == GDCMON_EGA)
|
|
PRTS(" EGA$")
|
|
#ENDIF
|
|
;
|
|
PRTS(" IO=0x$")
|
|
LD A,GDC_BASE
|
|
CALL PRTHEXBYTE
|
|
CALL GDC_PROBE ; CHECK FOR HW PRESENCE
|
|
JR Z,GDC_INIT1 ; CONTINUE IF HW PRESENT
|
|
;
|
|
; HARDWARE NOT PRESENT
|
|
PRTS(" NOT PRESENT$")
|
|
OR $FF ; SIGNAL FAILURE
|
|
RET
|
|
;
|
|
GDC_INIT1:
|
|
CALL GDC_CRTINIT ; SETUP THE GDC CHIP REGISTERS
|
|
CALL GDC_VDARES ; RESET GDC
|
|
CALL KBD_INIT ; INITIALIZE KEYBOARD DRIVER
|
|
|
|
; ADD OURSELVES TO VDA DISPATCH TABLE
|
|
LD BC,GDC_FNTBL ; BC := FUNCTION TABLE ADDRESS
|
|
LD DE,GDC_IDAT ; DE := GDC INSTANCE DATA PTR
|
|
CALL VDA_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
|
|
|
; INITIALIZE EMULATION
|
|
LD C,A ; C := ASSIGNED VIDEO DEVICE NUM
|
|
LD DE,GDC_FNTBL ; DE := FUNCTION TABLE ADDRESS
|
|
LD HL,GDC_IDAT ; HL := GDC INSTANCE DATA PTR
|
|
CALL TERM_ATTACH ; DO IT
|
|
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
;======================================================================
|
|
; GDC DRIVER - VIDEO DISPLAY ADAPTER (VDA) FUNCTIONS
|
|
;======================================================================
|
|
;
|
|
GDC_FNTBL:
|
|
.DW GDC_VDAINI
|
|
.DW GDC_VDAQRY
|
|
.DW GDC_VDARES
|
|
.DW GDC_VDADEV
|
|
.DW GDC_VDASCS
|
|
.DW GDC_VDASCP
|
|
.DW GDC_VDASAT
|
|
.DW GDC_VDASCO
|
|
.DW GDC_VDAWRC
|
|
.DW GDC_VDAFIL
|
|
.DW GDC_VDACPY
|
|
.DW GDC_VDASCR
|
|
.DW KBD_STAT
|
|
.DW KBD_FLUSH
|
|
.DW KBD_READ
|
|
.DW GDC_VDARDC
|
|
#IF (($ - GDC_FNTBL) != (VDA_FNCNT * 2))
|
|
.ECHO "*** INVALID GDC FUNCTION TABLE ***\n"
|
|
!!!!!
|
|
#ENDIF
|
|
;
|
|
GDC_VDAINI:
|
|
; RESET VDA
|
|
CALL GDC_VDARES ; RESET VDA
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
GDC_VDAQRY: ; VIDEO INFORMATION QUERY
|
|
LD C,$00 ; MODE ZERO IS ALL WE KNOW
|
|
LD D,GDC_ROWS ; ROWS
|
|
LD E,GDC_COLS ; COLS
|
|
LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED YET
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
GDC_VDARES: ; VIDEO SYSTEM RESET
|
|
; *** TODO: RESET VIDEO SYSTEM HERE
|
|
XOR A
|
|
RET
|
|
;
|
|
GDC_VDADEV: ; VIDEO DEVICE INFORMATION
|
|
LD D,VDADEV_GDC ; D := DEVICE TYPE
|
|
LD E,0 ; E := PHYSICAL UNIT IS ALWAYS ZERO
|
|
LD H,0 ; H := 0, DRIVER HAS NO MODES
|
|
LD L,GDC_BASE ; L := BASE I/O ADDRESS
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
GDC_VDASCS: ; SET CURSOR STYLE
|
|
SYSCHKERR(ERR_NOTIMPL)
|
|
RET
|
|
|
|
GDC_VDASCP: ; SET CURSOR POSITION
|
|
CALL GDC_XY ; SET CURSOR POSITION
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
|
|
GDC_VDASAT: ; SET ATTRIBUTES
|
|
LD A,E ; GET THE INCOMING ATTRIBUTE
|
|
LD (GDC_ATTR),A ; AND SAVE FOR LATER
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
|
|
GDC_VDASCO: ; SET COLOR
|
|
; WE HANDLE ONLY PER-CHARACTER COLORS (D=0)
|
|
LD A,D ; GET CHAR/SCREEN SCOPE
|
|
OR A ; CHARACTER?
|
|
JR NZ,GDC_VDASCO_Z ; IF NOT, JUST RETURN
|
|
LD A,E ; GET THE INCOMING COLOR
|
|
LD (GDC_COLOR),A ; AND SAVE FOR LATER
|
|
GDC_VDASCO_Z:
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
|
|
GDC_VDAWRC: ; WRITE CHARACTER
|
|
LD A,E ; CHARACTER TO WRITE GOES IN A
|
|
CALL GDC_PUTCHAR ; PUT IT ON THE SCREEN
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
|
|
GDC_VDAFIL: ; FILL WITH CHARACTER
|
|
LD A,E ; FILL CHARACTER GOES IN A
|
|
EX DE,HL ; FILL LENGTH GOES IN DE
|
|
CALL GDC_FILL ; DO THE FILL
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
|
|
GDC_VDACPY: ; COPY CHARACTERS/ATTRIBUTES
|
|
; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS GDC_POS
|
|
; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT
|
|
PUSH HL ; SAVE LENGTH
|
|
CALL GDC_XY2IDX ; ROW/COL IN DE -> SOURCE ADR IN HL
|
|
POP BC ; RECOVER LENGTH IN BC
|
|
LD DE,(GDC_POS) ; PUT DEST IN DE
|
|
JP GDC_BLKCPY ; DO A BLOCK COPY
|
|
|
|
GDC_VDASCR: ; SCROLL ENTIRE SCREEN
|
|
LD A,E ; LOAD E INTO A
|
|
OR A ; SET FLAGS
|
|
RET Z ; IF ZERO, WE ARE DONE
|
|
PUSH DE ; SAVE E
|
|
JP M,GDC_VDASCR1 ; E IS NEGATIVE, REVERSE SCROLL
|
|
CALL GDC_SCROLL ; SCROLL FORWARD ONE LINE
|
|
POP DE ; RECOVER E
|
|
DEC E ; DECREMENT IT
|
|
JR GDC_VDASCR ; LOOP
|
|
GDC_VDASCR1:
|
|
CALL GDC_RSCROLL ; SCROLL REVERSE ONE LINE
|
|
POP DE ; RECOVER E
|
|
INC E ; INCREMENT IT
|
|
JR GDC_VDASCR ; LOOP
|
|
;
|
|
GDC_VDARDC: ; READ CHAR/ATTR VALUE FROM VIDEO BUFFER
|
|
OR $FF ; UNSUPPORTED FUNCTION
|
|
RET
|
|
;
|
|
;======================================================================
|
|
; GDC DRIVER - PRIVATE DRIVER FUNCTIONS
|
|
;======================================================================
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; PROBE FOR GDC HARDWARE
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; ON RETURN, ZF SET INDICATES HARDWARE FOUND
|
|
;
|
|
; *** TODO: IMPLEMENT THIS
|
|
;
|
|
GDC_PROBE:
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET ; RETURN WITH ZF SET BASED ON CP
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; DISPLAY CONTROLLER CHIP INITIALIZATION
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; *** TODO: IMPLEMENT THIS
|
|
;
|
|
GDC_CRTINIT:
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E
|
|
;----------------------------------------------------------------------
|
|
;
|
|
GDC_XY:
|
|
CALL GDC_XY2IDX ; CONVERT ROW/COL TO BUF IDX
|
|
LD (GDC_POS),HL ; SAVE THE RESULT (DISPLAY POSITION)
|
|
; *** TODO: MOVE THE CURSOR
|
|
RET
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL
|
|
; D=ROW, E=COL
|
|
;----------------------------------------------------------------------
|
|
;
|
|
GDC_XY2IDX:
|
|
LD A,E ; SAVE COLUMN NUMBER IN A
|
|
LD H,D ; SET H TO ROW NUMBER
|
|
LD E,GDC_COLS ; SET E TO ROW LENGTH
|
|
CALL MULT8 ; MULTIPLY TO GET ROW OFFSET
|
|
LD E,A ; GET COLUMN BACK
|
|
ADD HL,DE ; ADD IT IN
|
|
RET ; RETURN
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; WRITE VALUE IN A TO CURRENT VDU BUFFER POSITION, ADVANCE CURSOR
|
|
;----------------------------------------------------------------------
|
|
;
|
|
GDC_PUTCHAR:
|
|
; *** TODO: IMPLEMENT THIS
|
|
RET
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; FILL AREA IN BUFFER WITH SPECIFIED CHARACTER AND CURRENT COLOR/ATTRIBUTE
|
|
; STARTING AT THE CURRENT FRAME BUFFER POSITION
|
|
; A: FILL CHARACTER
|
|
; DE: NUMBER OF CHARACTERS TO FILL
|
|
;----------------------------------------------------------------------
|
|
;
|
|
GDC_FILL:
|
|
; *** TODO: IMPLEMENT THIS
|
|
RET
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED)
|
|
;----------------------------------------------------------------------
|
|
;
|
|
GDC_SCROLL:
|
|
; *** TODO: IMPLEMENT THIS
|
|
RET
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED)
|
|
;----------------------------------------------------------------------
|
|
;
|
|
GDC_RSCROLL:
|
|
; *** TODO: IMPLEMENT THIS
|
|
RET
|
|
;
|
|
;----------------------------------------------------------------------
|
|
; BLOCK COPY BC BYTES FROM HL TO DE
|
|
;----------------------------------------------------------------------
|
|
;
|
|
GDC_BLKCPY:
|
|
; *** TODO: IMPLEMENT THIS
|
|
RET
|
|
;
|
|
;==================================================================================================
|
|
; GDC DRIVER - DATA
|
|
;==================================================================================================
|
|
;
|
|
GDC_ATTR .DB 0 ; CURRENT ATTRIBUTES
|
|
GDC_COLOR .DB 0 ; CURRENT COLOR
|
|
GDC_POS .DW 0 ; CURRENT DISPLAY POSITION
|
|
;
|
|
;==================================================================================================
|
|
; GDC DRIVER - INSTANCE DATA
|
|
;==================================================================================================
|
|
;
|
|
GDC_IDAT:
|
|
.DB KBDMODE_PS2 ; PS/2 8242 KEYBOARD CONTROLLER
|
|
.DB GDC_KBDST
|
|
.DB GDC_KBDDATA
|
|
;
|
|
;--------------------------------------------------------------------------------------------------
|
|
; HBIOS MODULE TRAILER
|
|
;--------------------------------------------------------------------------------------------------
|
|
;
|
|
END_GDC .EQU $
|
|
SIZ_GDC .EQU END_GDC - ORG_GDC
|
|
;
|
|
MEMECHO "GDC occupies "
|
|
MEMECHO SIZ_GDC
|
|
MEMECHO " bytes.\n"
|
|
|