From b98ee17e1453f1d2e831d941a74d2e3ad3930d70 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 4 Apr 2022 11:54:34 -0700 Subject: [PATCH] Plumbing for uPD7220 GDC Driver --- Source/HBIOS/cfg_dyno.asm | 2 +- Source/HBIOS/cfg_ezz80.asm | 2 +- Source/HBIOS/cfg_master.asm | 4 +- Source/HBIOS/cfg_mbc.asm | 2 +- Source/HBIOS/cfg_mk4.asm | 2 +- Source/HBIOS/cfg_n8.asm | 2 +- Source/HBIOS/cfg_rcz180.asm | 2 +- Source/HBIOS/cfg_rcz280.asm | 2 +- Source/HBIOS/cfg_rcz80.asm | 2 +- Source/HBIOS/cfg_rph.asm | 4 +- Source/HBIOS/cfg_sbc.asm | 2 +- Source/HBIOS/cfg_scz180.asm | 2 +- Source/HBIOS/cfg_zeta.asm | 2 +- Source/HBIOS/cfg_zeta2.asm | 2 +- Source/HBIOS/gdc.asm | 331 ++++++++++++++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 24 +-- Source/HBIOS/hbios.inc | 2 +- Source/HBIOS/std.asm | 12 ++ Source/ver.inc | 2 +- Source/ver.lib | 2 +- 20 files changed, 376 insertions(+), 29 deletions(-) create mode 100644 Source/HBIOS/gdc.asm diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index d9421fea..a5d8b9e4 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -116,7 +116,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_ezz80.asm b/Source/HBIOS/cfg_ezz80.asm index d5339255..45643c7e 100644 --- a/Source/HBIOS/cfg_ezz80.asm +++ b/Source/HBIOS/cfg_ezz80.asm @@ -153,7 +153,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index abc83e15..486f853b 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -211,7 +211,9 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH] +GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA] TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index 7a7f80f8..30065fe2 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -141,7 +141,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU TRUE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) CVDUMODE .EQU CVDUMODE_MBC ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_CGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 73aaa8e2..f85a8924 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -141,7 +141,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index acc3aaa5..fd3886de 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -143,7 +143,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU TRUE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 4c0ee626..e39f4f4e 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -160,7 +160,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index cfe8bbff..ea4a1b2b 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -175,7 +175,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 3628aae0..9b3430c1 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -164,7 +164,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index a6d8fe5d..dc012643 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -141,7 +141,9 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU TRUE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) +GDCMODE .EQU GDCMODE_RPH ; GDC: GDC MODE: GDCMODE_[NONE|ECB|RPH] +GDCMON .EQU GDCMON_EGA ; GDC: GDC MONITOR SETUP: GDCMON_[NONE|CGA|EGA] TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_N8 ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 1df79bc0..70fd499f 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -141,7 +141,7 @@ VDUSIZ .EQU V80X25 ; VDU: DISPLAY FORMAT [V80X24|V80X25|V80X30] CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) CVDUMODE .EQU CVDUMODE_ECB ; CVDU: CVDU MODE: CVDUMODE_[NONE|ECB|MBC] CVDUMON .EQU CVDUMON_EGA ; CVDU: CVDU MONITOR SETUP: CVDUMON_[NONE|CGA|EGA] -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_SCG ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index a801d14d..f3156f6c 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -155,7 +155,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_RC ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 1e6a3f80..e514f97d 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -114,7 +114,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index a0cc2896..cda1d368 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -125,7 +125,7 @@ XIOCFG .EQU DEFSERCFG ; XIO: SERIAL LINE CONFIG ; VDUENABLE .EQU FALSE ; VDU: ENABLE VDU VIDEO/KBD DRIVER (VDU.ASM) CVDUENABLE .EQU FALSE ; CVDU: ENABLE CVDU VIDEO/KBD DRIVER (CVDU.ASM) -NECENABLE .EQU FALSE ; NEC: ENABLE NEC UPD7220 VIDEO/KBD DRIVER (NEC.ASM) +GDCENABLE .EQU FALSE ; GDC: ENABLE 7220 GDC VIDEO/KBD DRIVER (GDC.ASM) TMSENABLE .EQU FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) TMSMODE .EQU TMSMODE_NONE ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|RC|RCV9958|RCKBD] TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) diff --git a/Source/HBIOS/gdc.asm b/Source/HBIOS/gdc.asm new file mode 100644 index 00000000..1bd57ce4 --- /dev/null +++ b/Source/HBIOS/gdc.asm @@ -0,0 +1,331 @@ +;====================================================================== +; 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. +; +#IF (GDCMON == GDCMON_CGA) + #DEFINE USEFONTCGA + #DEFINE GDC_FONT FONTCGA +#ENDIF +; +#IF (GDCMON == GDCMON_EGA) + #DEFINE USEFONT8X16 + #DEFINE GDC_FONT FONT8X16 +#ENDIF +; +TERMENABLE .SET TRUE ; INCLUDE TERMINAL PSEUDODEVICE DRIVER +; +;====================================================================== +; GDC DRIVER - INITIALIZATION +;====================================================================== +; +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, CLEAR SCREEN, + ; CURSOR TO TOP LEFT, CLEAR ATTRIBUTES + 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 + CALL SYSCHK ; NOT IMPLEMENTED (YET) + LD A,ERR_NOTIMPL + OR A + 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 + LD A,E ; GET THE INCOMING COLOR + LD (GDC_COLOR),A ; AND SAVE FOR LATER + 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 GDC_KBDST + .DB GDC_KBDDATA diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index b2e8ed35..8fcc5a53 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2987,8 +2987,8 @@ HB_INITTBL: #IF (VGAENABLE) .DW VGA_INIT #ENDIF -#IF (NECENABLE) - .DW NEC_INIT +#IF (GDCENABLE) + .DW GDC_INIT #ENDIF #IF (TMSENABLE) .DW TMS_INIT @@ -5839,12 +5839,12 @@ SIZ_TMS .EQU $ - ORG_TMS .ECHO " bytes.\n" #ENDIF ; -#IF (NECENABLE) -ORG_NEC .EQU $ - ;#INCLUDE "nec.asm" -SIZ_NEC .EQU $ - ORG_NEC - .ECHO "NEC occupies " - .ECHO SIZ_NEC +#IF (GDCENABLE) +ORG_GDC .EQU $ + #INCLUDE "gdc.asm" +SIZ_GDC .EQU $ - ORG_GDC + .ECHO "GDC occupies " + .ECHO SIZ_GDC .ECHO " bytes.\n" #ENDIF ; @@ -5908,7 +5908,7 @@ SIZ_FONTS .EQU $ - ORG_FONTS .ECHO SIZ_FONTS .ECHO " bytes.\n" ; -#IF (CVDUENABLE | VGAENABLE) | (TMSENABLE & (TMSMODE == TMSMODE_RCKBD)) +#IF (CVDUENABLE | VGAENABLE) | GDCENABLE | (TMSENABLE & (TMSMODE == TMSMODE_RCKBD)) ORG_KBD .EQU $ #INCLUDE "kbd.asm" SIZ_KBD .EQU $ - ORG_KBD @@ -6133,7 +6133,7 @@ SIZ_AY38910 .EQU $ - ORG_AY38910 ; ; INCLUDE LZSA2 decompression engine if required. ; -#IF ((VGAENABLE | CVDUENABLE | TMSENABLE) & USELZSA2) +#IF ((VGAENABLE | CVDUENABLE | TMSENABLE | GDCENABLE) & USELZSA2) #INCLUDE "unlzsa2s.asm" #ENDIF ; @@ -6927,11 +6927,11 @@ PIO_MODE_STR: .TEXT "Output$" ; VIDEO DEVICE STRINGS ; PS_VDSTRREF: - .DW PS_VDVDU, PS_VDCVDU, PS_VDNEC, PS_VDTMS, PS_VDVGA + .DW PS_VDVDU, PS_VDCVDU, PS_VDGDC, PS_VDTMS, PS_VDVGA ; PS_VDVDU .TEXT "VDU$" PS_VDCVDU .TEXT "CVDU$" -PS_VDNEC .TEXT "NEC$" +PS_VDGDC .TEXT "GDC$" PS_VDTMS .TEXT "TMS$" PS_VDVGA .TEXT "VGA$" ; diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index bce5c5ff..93a9ef4a 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -218,7 +218,7 @@ RTCDEV_RP5 .EQU $50 ; RP5C01 ; VDADEV_VDU .EQU $00 ; ECB VDU - MOTOROLA 6545 VDADEV_CVDU .EQU $10 ; ECB COLOR VDU - MOS 8563 -VDADEV_NEC .EQU $20 ; ECB UPD7220 - NEC UPD7220 +VDADEV_GDC .EQU $20 ; GRAPHICS DISPLAY CTLR - UPD7220 VDADEV_TMS .EQU $30 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $40 ; ECB VGA3 - HITACHI HD6445 ;VDADEV_V9958 .EQU $50 ; V9958 VDU diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 3b51c666..5dac28cc 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -225,6 +225,18 @@ CVDUMON_NONE .EQU 0 CVDUMON_CGA .EQU 1 ; CGA MONITOR TIMING (16.000 MHZ OSC) CVDUMON_EGA .EQU 2 ; EGA MONITOR TIMING (16.257 MHZ OSC) ; +; GDC VIDEO MODE SELECTIONS +; +GDCMODE_NONE .EQU 0 +GDCMODE_ECB .EQU 1 ; ECB GDC +GDCMODE_RPH .EQU 2 ; RPH GDC +; +; GDC MONITOR SELECTIONS +; +GDCMON_NONE .EQU 0 +GDCMON_CGA .EQU 1 ; CGA MONITOR TIMING (16.000 MHZ OSC) +GDCMON_EGA .EQU 2 ; EGA MONITOR TIMING (16.257 MHZ OSC) +; ; DMA MODE SELECTIONS ; DMAMODE_NONE .EQU 0 diff --git a/Source/ver.inc b/Source/ver.inc index a7451543..89e6f101 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,4 +2,4 @@ #DEFINE RMN 1 #DEFINE RUP 1 #DEFINE RTP 0 -#DEFINE BIOSVER "3.1.1-pre.168" +#DEFINE BIOSVER "3.1.1-pre.169" diff --git a/Source/ver.lib b/Source/ver.lib index dc0185e8..6e1fdee3 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 1 rup equ 1 rtp equ 0 biosver macro - db "3.1.1-pre.168" + db "3.1.1-pre.169" endm