From 9e6780a2482896811d9022db8a0803a2fec3f7f2 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 3 Sep 2024 12:05:34 -0700 Subject: [PATCH 1/8] Add FPGA Z80 Onboard VGA/PS2 Support --- Source/HBIOS/cfg_duo.asm | 1 + Source/HBIOS/cfg_dyno.asm | 1 + Source/HBIOS/cfg_epitx.asm | 1 + Source/HBIOS/cfg_fz80.asm | 1 + Source/HBIOS/cfg_heath.asm | 1 + Source/HBIOS/cfg_master.asm | 1 + Source/HBIOS/cfg_mbc.asm | 1 + Source/HBIOS/cfg_mk4.asm | 1 + Source/HBIOS/cfg_mon.asm | 1 + Source/HBIOS/cfg_n8.asm | 1 + Source/HBIOS/cfg_nabu.asm | 1 + Source/HBIOS/cfg_rcz180.asm | 1 + Source/HBIOS/cfg_rcz280.asm | 1 + Source/HBIOS/cfg_rcz80.asm | 1 + Source/HBIOS/cfg_rph.asm | 1 + Source/HBIOS/cfg_s100.asm | 1 + Source/HBIOS/cfg_sbc.asm | 1 + Source/HBIOS/cfg_scz180.asm | 1 + Source/HBIOS/cfg_z80retro.asm | 1 + Source/HBIOS/cfg_zeta.asm | 1 + Source/HBIOS/cfg_zeta2.asm | 1 + Source/HBIOS/fv.asm | 496 ++++++++++++++++++++++++++++++++++ Source/HBIOS/hbios.asm | 13 + Source/HBIOS/hbios.inc | 1 + Source/HBIOS/std.asm | 2 + 25 files changed, 533 insertions(+) create mode 100644 Source/HBIOS/fv.asm diff --git a/Source/HBIOS/cfg_duo.asm b/Source/HBIOS/cfg_duo.asm index 935e9c3b..1fcc4177 100644 --- a/Source/HBIOS/cfg_duo.asm +++ b/Source/HBIOS/cfg_duo.asm @@ -199,6 +199,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_dyno.asm b/Source/HBIOS/cfg_dyno.asm index 6001a658..a044dd5a 100644 --- a/Source/HBIOS/cfg_dyno.asm +++ b/Source/HBIOS/cfg_dyno.asm @@ -217,6 +217,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_epitx.asm b/Source/HBIOS/cfg_epitx.asm index 12492497..29cb322f 100644 --- a/Source/HBIOS/cfg_epitx.asm +++ b/Source/HBIOS/cfg_epitx.asm @@ -219,6 +219,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_fz80.asm b/Source/HBIOS/cfg_fz80.asm index 365e9a7f..ac8f1b59 100644 --- a/Source/HBIOS/cfg_fz80.asm +++ b/Source/HBIOS/cfg_fz80.asm @@ -222,6 +222,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU TRUE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU TRUE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU FALSE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_heath.asm b/Source/HBIOS/cfg_heath.asm index 68ab5e74..e0a02a20 100644 --- a/Source/HBIOS/cfg_heath.asm +++ b/Source/HBIOS/cfg_heath.asm @@ -222,6 +222,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_master.asm b/Source/HBIOS/cfg_master.asm index 558b8d82..a1a27b1e 100644 --- a/Source/HBIOS/cfg_master.asm +++ b/Source/HBIOS/cfg_master.asm @@ -267,6 +267,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_mbc.asm b/Source/HBIOS/cfg_mbc.asm index 38d84b2d..42979884 100644 --- a/Source/HBIOS/cfg_mbc.asm +++ b/Source/HBIOS/cfg_mbc.asm @@ -196,6 +196,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_mk4.asm b/Source/HBIOS/cfg_mk4.asm index 0cc30961..cdbc26c3 100644 --- a/Source/HBIOS/cfg_mk4.asm +++ b/Source/HBIOS/cfg_mk4.asm @@ -206,6 +206,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_mon.asm b/Source/HBIOS/cfg_mon.asm index aa9edb43..1195d421 100644 --- a/Source/HBIOS/cfg_mon.asm +++ b/Source/HBIOS/cfg_mon.asm @@ -217,6 +217,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_n8.asm b/Source/HBIOS/cfg_n8.asm index ff1341e3..013c9f42 100644 --- a/Source/HBIOS/cfg_n8.asm +++ b/Source/HBIOS/cfg_n8.asm @@ -208,6 +208,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_nabu.asm b/Source/HBIOS/cfg_nabu.asm index ac92fc56..ffd17d82 100644 --- a/Source/HBIOS/cfg_nabu.asm +++ b/Source/HBIOS/cfg_nabu.asm @@ -222,6 +222,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_rcz180.asm b/Source/HBIOS/cfg_rcz180.asm index 85527376..ff4d325a 100644 --- a/Source/HBIOS/cfg_rcz180.asm +++ b/Source/HBIOS/cfg_rcz180.asm @@ -223,6 +223,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_rcz280.asm b/Source/HBIOS/cfg_rcz280.asm index b347ea71..88167ddc 100644 --- a/Source/HBIOS/cfg_rcz280.asm +++ b/Source/HBIOS/cfg_rcz280.asm @@ -227,6 +227,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_rcz80.asm b/Source/HBIOS/cfg_rcz80.asm index 83dece82..a54383a7 100644 --- a/Source/HBIOS/cfg_rcz80.asm +++ b/Source/HBIOS/cfg_rcz80.asm @@ -222,6 +222,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_rph.asm b/Source/HBIOS/cfg_rph.asm index a0dfcff0..904481d7 100644 --- a/Source/HBIOS/cfg_rph.asm +++ b/Source/HBIOS/cfg_rph.asm @@ -196,6 +196,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_s100.asm b/Source/HBIOS/cfg_s100.asm index cbe138dc..17948d0a 100644 --- a/Source/HBIOS/cfg_s100.asm +++ b/Source/HBIOS/cfg_s100.asm @@ -217,6 +217,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_sbc.asm b/Source/HBIOS/cfg_sbc.asm index 70ff423c..2a3dae88 100644 --- a/Source/HBIOS/cfg_sbc.asm +++ b/Source/HBIOS/cfg_sbc.asm @@ -196,6 +196,7 @@ VGASIZ .EQU V80X25 ; VGA: DISPLAY FORMAT [V80X25|V80X30|V80X43] VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_scz180.asm b/Source/HBIOS/cfg_scz180.asm index b5931287..d901cae0 100644 --- a/Source/HBIOS/cfg_scz180.asm +++ b/Source/HBIOS/cfg_scz180.asm @@ -217,6 +217,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_z80retro.asm b/Source/HBIOS/cfg_z80retro.asm index c72b1aba..fa527c99 100644 --- a/Source/HBIOS/cfg_z80retro.asm +++ b/Source/HBIOS/cfg_z80retro.asm @@ -203,6 +203,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_zeta.asm b/Source/HBIOS/cfg_zeta.asm index 22fdc276..9efd553b 100644 --- a/Source/HBIOS/cfg_zeta.asm +++ b/Source/HBIOS/cfg_zeta.asm @@ -172,6 +172,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/cfg_zeta2.asm b/Source/HBIOS/cfg_zeta2.asm index 6e1e6985..700f64f1 100644 --- a/Source/HBIOS/cfg_zeta2.asm +++ b/Source/HBIOS/cfg_zeta2.asm @@ -183,6 +183,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/fv.asm b/Source/HBIOS/fv.asm new file mode 100644 index 00000000..0c7b6cc5 --- /dev/null +++ b/Source/HBIOS/fv.asm @@ -0,0 +1,496 @@ +;====================================================================== +; VIDEO DRIVER FOR FPGA 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. +; 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 +; PORT $C0: SET/GET CURSOR COL +; PORT $C1: SET/GET CURSOR ROW +; PORT $C2: CONTROLS VGA OUTPUT +; BIT 0: BLUE +; BIT 1: GREEN +; BIT 2: RED +; BIT 3: UNUSED? +; BIT 4: CURSOR MODE +; BIT 5: CURSOR BLINK +; BIT 6: CURSOR ENABLE +; BIT 7: VGA SIGNAL OUTPUT ENABLE +; PORT $08: BUFFER SELECT, 1=SELECTED +; +; TODO: +; +;====================================================================== +; FPGA 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 +; +FV_BUFCTL .EQU $08 +; +FV_KBDDATA .EQU $03 +FV_KBDST .EQU $02 +; +FV_ROWS .EQU 40 +FV_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 ", KBD IO=" + DEVECHO FV_KBDDATA + DEVECHO "\n" +; +;====================================================================== +; FPGA VGA DRIVER - INITIALIZATION +;====================================================================== +; +FV_INIT: + LD IY,FV_IDAT ; POINTER TO INSTANCE DATA +; + CALL NEWLINE ; FORMATTING + PRTS("FV: IO=0x$") + LD A,FV_BASE + CALL PRTHEXBYTE + CALL FV_PROBE ; CHECK FOR HW PRESENCE + JR Z,FV_INIT1 ; CONTINUE IF HW PRESENT +; + ; HARDWARE NOT PRESENT + PRTS(" NOT PRESENT$") + OR $FF ; SIGNAL FAILURE + RET +; +FV_INIT1: + ; RECORD DRIVER ACTIVE + OR $FF + LD (FV_ACTIVE),A + ; DISPLAY CONSOLE DIMENSIONS + LD A,FV_COLS + CALL PC_SPACE + CALL PRTDECB + LD A,'X' + CALL COUT + LD A,FV_ROWS + CALL PRTDECB + PRTS(" TEXT$") + + ; HARDWARE INITIALIZATION + CALL FV_CRTINIT ; SETUP THE FPGA VGA CHIP REGISTERS + CALL FV_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 + 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 + CALL TERM_ATTACH ; DO IT + + XOR A ; SIGNAL SUCCESS + RET +; +;====================================================================== +; FPGA 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" + !!!!! +#ENDIF + +FV_VDAINI: + ; RESET VDA + CALL FV_VDARES ; RESET VDA + LD HL,0 ; ZERO + LD (FV_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,0 ; ROW = 0, COL = 0 + CALL FV_XY ; SEND CURSOR TO TOP LEFT + CALL FV_SHOWCUR ; NOW SHOW THE CURSOR + XOR A ; SIGNAL SUCCESS + RET + +FV_VDAQRY: + LD C,$00 ; MODE ZERO IS ALL WE KNOW + LD D,FV_ROWS ; ROWS + LD E,FV_COLS ; COLS + LD HL,0 ; EXTRACTION OF CURRENT BITMAP DATA NOT SUPPORTED + XOR A ; SIGNAL SUCCESS + RET + +FV_VDARES: + CALL FV_CRTINIT + XOR A ; SIGNAL SUCCESS + RET + +FV_VDADEV: + LD D,VDADEV_FV ; 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 + XOR A ; SIGNAL SUCCESS + RET + +FV_VDASCS: + SYSCHKERR(ERR_NOTIMPL) ; NOT IMPLEMENTED (YET) + RET + +FV_VDASCP: + CALL FV_XY ; SET CURSOR POSITION + XOR A ; SIGNAL SUCCESS + RET + +FV_VDASAT: + ; ATTRIBUTES NOT SUPPORTED BY HARDWARE + XOR A + RET + +FV_VDASCO: + ; CHARACTER COLOR NOT SUPPORT BY HARDWARE + XOR A ; SIGNAL SUCCESS + RET ; DONE + +FV_VDAWRC: + LD A,E ; CHARACTER TO WRITE GOES IN A + CALL FV_PUTCHAR ; PUT IT ON THE SCREEN + XOR A ; SIGNAL SUCCESS + RET + +FV_VDAFIL: + LD A,E ; FILL CHARACTER GOES IN A + EX DE,HL ; FILL LENGTH GOES IN DE + CALL FV_FILL ; DO THE FILL + XOR A ; SIGNAL SUCCESS + RET + +FV_VDACPY: + ; LENGTH IN HL, SOURCE ROW/COL IN DE, DEST IS FV_POS + ; BLKCPY USES: HL=SOURCE, DE=DEST, BC=COUNT + PUSH HL ; SAVE LENGTH + CALL FV_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 + +FV_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 + POP DE ; RECOVER E + DEC E ; DECREMENT IT + JR FV_VDASCR ; LOOP +FV_VDASCR1: + CALL FV_RSCROLL ; SCROLL REVERSE ONE LINE + POP DE ; RECOVER E + INC E ; INCREMENT IT + JR FV_VDASCR ; LOOP + +FV_STAT: + IN A,(FV_KBDST) ; GET STATUS + AND $01 ; ISOLATE DATA WAITING BIT + JP Z,CIO_IDLE ; NO DATA, EXIT VIA IDLE PROCESS + +FV_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 + LD E,A ; PUT IN E FOR RETURN + XOR A ; SIGNAL SUCCESS + RET ; DONE + +;---------------------------------------------------------------------- +; READ VALUE AT CURRENT VDU BUFFER POSITION +; RETURN E = CHARACTER, B = COLOUR, C = ATTRIBUTES +;---------------------------------------------------------------------- + +FV_VDARDC: + CALL FV_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 +;====================================================================== +; +; +;---------------------------------------------------------------------- +; PROBE FOR FPGA VGA HARDWARE +;---------------------------------------------------------------------- +; +; ON RETURN, ZF SET INDICATES HARDWARE FOUND +; +FV_PROBE: + XOR A ; ASSUME H/W EXISTS + RET +; +;---------------------------------------------------------------------- +; CRTC DISPLAY CONTROLLER CHIP INITIALIZATION +;---------------------------------------------------------------------- +; +FV_CRTINIT: + LD A,%11001111 ; WHITE ON BLACK, CURSOR ON, ENABLE OUTPUT + OUT (FV_CTL),A ; WRITE TO CONTROL PORT + XOR A ; ZERO ACCUM + RET ; DONE +; +;---------------------------------------------------------------------- +; SET CURSOR POSITION TO ROW IN D AND COLUMN IN E +;---------------------------------------------------------------------- +; +FV_XY: + CALL FV_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) + POP DE ; RECOVER INCOMING ROW/COL + LD A,D ; GET ROW + OUT (FV_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 + XOR A ; ELSE MAKE IT ZERO! +FV_XY1: + OUT (FV_CCOL),A ; SET COL REGISTER + JP FV_SHOWCUR ; SHOW THE CURSOR AND EXIT +; +;---------------------------------------------------------------------- +; CONVERT XY COORDINATES IN DE INTO LINEAR INDEX IN HL +; D=ROW, E=COL +;---------------------------------------------------------------------- +; +FV_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 + 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 + RET ; RETURN +; +;---------------------------------------------------------------------- +; SHOW OR HIDE CURSOR +;---------------------------------------------------------------------- +; +FV_SHOWCUR: + LD A,%11001111 ; CONTROL PORT VALUE + ;;;LD A,%11111111 ; CONTROL PORT VALUE + OUT (FV_CTL),A ; SET REGISTER + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +FV_HIDECUR: + LD A,%11001111 ; CONTROL PORT VALUE + ;;;LD A,%11111111 ; CONTROL PORT VALUE + OUT (FV_CTL),A ; SET REGISTER + XOR A ; SIGNAL SUCCESS + RET ; DONE +; +;---------------------------------------------------------------------- +; (DE)SELECT FRAME BUFFER +;---------------------------------------------------------------------- +; +FV_BUFSEL: + PUSH AF + LD A,$01 + OUT (FV_BUFCTL),A + POP AF + RET +; +FV_BUFDESEL: + PUSH AF + XOR A + OUT (FV_BUFCTL),A + POP AF + RET +; +;---------------------------------------------------------------------- +; WRITE VALUE IN A TO CURRENT VDU BUFFER POSITION, ADVANCE CURSOR +;---------------------------------------------------------------------- +; +FV_PUTCHAR: + ; WRITE CHAR AT CURRENT CURSOR POSITION. + PUSH AF ; SAVE INCOMING CHAR + CALL FV_HIDECUR ; HIDE CURSOR + CALL FV_BUFSEL ; SELECT FRAME BUFFER + POP AF + LD HL,(FV_POS) ; GET CUR BUF POSITION + LD DE,FV_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 + INC HL ; BUMP POSITION + LD (FV_POS),HL ; SAVE NEW POSITION +; + ; PUT CUROR IN PLACE + LD DE,FV_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 +; +;---------------------------------------------------------------------- +; GET CHAR VALUE TO A FROM CURRENT VDU BUFFER POSITION +;---------------------------------------------------------------------- +; +FV_GETCHAR: + XOR A + 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 +;---------------------------------------------------------------------- +; +FV_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 + ADD HL,BC ; ADD IT IN + POP AF + LD C,A ; FILL CHAR TO C +FV_FILL1: + LD A,D ; CHECK FILL + OR E ; ... COUNTER + JR Z,FV_FILL2 ; DONE IF ZERO + LD (HL),C ; FILL ONE CHAR + INC HL ; BUMP BUF PTR + DEC DE ; DEC FILL COUNTER + JR FV_FILL1 ; LOOP +; +FV_FILL2: + CALL FV_BUFDESEL ; DESELECT BUFFER + JP FV_SHOWCUR ; EXIT VIA SHOW CURSOR +; +;---------------------------------------------------------------------- +; SCROLL ENTIRE SCREEN FORWARD BY ONE LINE (CURSOR POSITION UNCHANGED) +;---------------------------------------------------------------------- +; +FV_SCROLL: + CALL FV_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 + LDIR ; DO IT +; + ; FILL LAST LINE OF SCREEN + LD HL,FV_FBUF + ((FV_ROWS - 1) * FV_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 + LDIR ; FILL IT +; + CALL FV_BUFDESEL ; DESELECT FRAME BUFFER + RET ; DONE +; +;---------------------------------------------------------------------- +; REVERSE SCROLL ENTIRE SCREEN BY ONE LINE (CURSOR POSITION UNCHANGED) +;---------------------------------------------------------------------- +; +FV_RSCROLL: + CALL FV_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 + LDDR ; DO IT IN REVERSE +; + ; FILL FIRST LINE OF SCREEN + LD HL,FV_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 + LDIR ; FILL IT +; + CALL FV_BUFDESEL ; DESELECT FRAME BUFFER + RET ; DONE +; +;---------------------------------------------------------------------- +; BLOCK COPY BC BYTES FROM HL TO DE +;---------------------------------------------------------------------- +; +FV_BLKCPY: + + CALL FV_BUFSEL ; SELECT FRAME BUFFER + PUSH BC ; SAVE LENGTH + LD BC,FV_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 + RET ; DONE +; +;================================================================================================== +; FPGA VGA DRIVER - DATA +;================================================================================================== +; +FV_POS .DW 0 ; CURRENT DISPLAY POSITION +FV_ACTIVE .DB FALSE ; FLAG FOR DRIVER ACTIVE +; +;================================================================================================== +; VGA DRIVER - INSTANCE DATA +;================================================================================================== +; +FV_IDAT: + .DB KBDMODE_FV ; FPGA VGA KEYBOARD CONTROLLER + .DB FV_KBDST + .DB FV_KBDDATA diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 62aa617e..07dd5ad9 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -3802,6 +3802,9 @@ HB_INITTBL: #IF (VRCENABLE) .DW VRC_INIT #ENDIF +#IF (FVENABLE) + .DW FV_INIT +#ENDIF #IF (DMAENABLE) .DW DMA_INIT #ENDIF @@ -7922,6 +7925,7 @@ PS_VDGDC .TEXT "GDC$" PS_VDTMS .TEXT "TMS$" PS_VDVGA .TEXT "VGA$" PS_VDVRC .TEXT "VRC$" +PS_VDFV .TEXT "FV$" ; ; VIDEO TYPE STRINGS ; @@ -8232,6 +8236,15 @@ SIZ_VRC .EQU $ - ORG_VRC MEMECHO " bytes.\n" #ENDIF ; +#IF (FVENABLE) +ORG_FV .EQU $ + #INCLUDE "fv.asm" +SIZ_FV .EQU $ - ORG_FV + MEMECHO "FV occupies " + MEMECHO SIZ_FV + MEMECHO " bytes.\n" +#ENDIF +; #IF (DMAENABLE) ORG_DMA .EQU $ #INCLUDE "dma.asm" diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index a6006a20..308bcb87 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -377,6 +377,7 @@ VDADEV_TMS .EQU $03 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $04 ; ECB VGA3 - HITACHI HD6445 VDADEV_VRC .EQU $05 ; VGARC VDADEV_EF .EQU $06 ; EF9345 +VDADEV_FV .EQU $07 ; S100 FPGA VGA ; ; SOUND DEVICE IDS ; diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index c5a9dea5..dd1e7f21 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -321,6 +321,7 @@ DMAMODE_VDG .EQU 7 ; VELESOFT DATAGEAR KBDMODE_NONE .EQU 0 KBDMODE_PS2 .EQU 1 ; PS/2 KEYBOARD CONTROLLER KBDMODE_VRC .EQU 2 ; VGARC KEYBOARD CONTROLLER +KBDMODE_FV .EQU 3 ; FPGA VGA KEYBOARD CONTROLLER ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; @@ -492,6 +493,7 @@ KBDENABLE .EQU FALSE ; PS/2 KEYBOARD DRIVER PPKENABLE .EQU FALSE ; PPK KEYBOARD DRIVER MKYENABLE .EQU FALSE ; MSX KEYBOARD DRIVER NABUKBENABLE .EQU FALSE ; NABU KEYBOARD DRIVER +FKBDENABLE .EQU FALSE ; FPGA KEYBOARD DRIVER ; ; VIDEO MODES ; From e07c38dc1a52c2a5bf8c8e7465592bb716746e1b Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Tue, 3 Sep 2024 15:04:50 -0700 Subject: [PATCH 2/8] Doc Fixes per HubertH See Issue #415. This commit is intended to clarify the documentation with respect to this issue. Thanks and credit to HubertH. --- Doc/RomWBW Applications.pdf | Bin 340956 -> 340956 bytes Doc/RomWBW Disk Catalog.pdf | Bin 123771 -> 123768 bytes Doc/RomWBW Errata.pdf | Bin 28575 -> 28493 bytes Doc/RomWBW System Guide.pdf | Bin 579618 -> 581563 bytes Doc/RomWBW User Guide.pdf | Bin 787759 -> 787756 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Doc/SystemGuide.md | 23 ++++++++++++++++++++--- 8 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index e03f4e0aeef728fbc22375ea180f8895586b9ed2..fb199cd55177adea195c1499535a4ead07873812 100644 GIT binary patch delta 563 zcmccfT;$GkkqK?}r}OR@@a*}m{eyY+hlS#et&J9*&EKvi<-7Vb&bquP?$zmmSCyyl&_ z`S;i3PrbE|S}J%i+9?vw8Oq9XvA|8$PrLi4$Zo}?8Z+&*ZJt}-PL}n~3A-lj{&jNO z>@Dfl)5`vwIv^3za=J%;VsjSTH@m>^VRGTiHp_1>y2+U4z^*N(`rC`mUzj6MBju-g zm1cX^FQZAO)i0K=-OWF5vG()&xblV<3d!nAg}bV4zRP?sozU@LZDN+d>j{%43eIc0 z))n@?MAc@yUTwv;>xze-%{VEl7t8i)^Tp=M$yw*` zYPV-%1Y!`)yxpFOWygC?O9Nv=6H{{|vuU4Lq!7IA%AZ&w9GxwkT+Pgkj7*K4&72I4 hoK0Mv-7K9g42(=oEsWia%?#`mYzQftzR#Fd4gl&E_6z_3 delta 563 zcmccfT;$GkkqK?}-q}wKc=kOHf5G3gx;?&0Amdiv&AnTnYq5?)WU?xW{4<&uz)N^BqF09DRDDISJO8JvYxfrI&8uAbMSR-SOW)lefBR)~ zA?3LtW2gDD)Ad<-uk^Qn(`xtH{eOOU*Qvsi+?4hE?K@AZeqAu_lVLzs zbC0I$f15kOdV1x-ANJXM&iv=R`rzYvvt9Qpna&DH-ca%6>gUU5e_5>pZyld5XvZkr zY|qqg&%_ACAewo*Jrm20_na0+=7uJwmZpZ&KCwt4c-xgfu|zmJ8#|gBTDn-68Cp0y jJDNHf8atVpI-469xj30S8yT25*(ul%QZjv?F{>N^``HE= diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 3f97fb4ae95875471c7df10c20447d6136b3aa40..7e38334b9dbdd77675ee9a545db8b403d7710cf8 100644 GIT binary patch delta 4755 zcmai1X>62b5YCo_(t@N2a)^e7SPYindmjQ-x@^5dAXre8!;RGd5eNkg5#)DFGB$`$ffmTp3UO|j0DWpa)2*EnL?0)UekVyK2PG{bkdFGkpyV{U@ zxgocDZba84mPT#~Dj)fJ_E}a?f3@gJZfQ%^X4d~q?H$j~%{x%JDQDxiyUN?!cl}g! zcwJTHlV?9ZF>%tOy47uY-NyI+d2F-Ii6mAWI-MBSHox}3(2C-UBYO1G@5@J??0aF^ z^t=%VxA%MD`E%tfw?`_bZ2zpW?7mlGdAB95)y?VK>yKeCEuKGiz;{LUwL!1Kcizms z{oad9#+;owf7y&JMSbqC8vbI>34`ycjEpJUyylAmO*0B&&6nMlQ~jQ(n{xc*k3-HK zUw&XgdDqg$A)88ju5Ep2)uGAV*NwYy?Z~#KewC|UZJju{%fMO9!&~m!z2>7g3igft zw0*(@iJFtK(u#epoBMzA=&z$@-fe#AR{z??4cmgDU(WmI)ZdRCnf7w~!IjmuGb{U) zt!_KMKL70xnm4pf-La=@OZ~#$eShomO-o=VOd9mnhxL!wou9g>fF5@6ILBE)#<{kZAsMqy>ueeG z)+^+ma|1s}55hEQ+n^(MC4|R{N;(t_V@gX)^o&OVf}T?ZALV^E76IU=VLc%f$yjksf^kN(02@2Y@Pk|_6g6W)TZWw|s2nbd)*6?D8KpzCf(&)6 z1t|^2U?Xi0&C1`0Y{PC!+fXtMsD z8VGug)Yt<-Fs$5hMapEoAQ>ymP)9KCm<;uTbmxLFtVyOMf;p0jV1^KrJ3(qJnB_QQ zkQp3wAcSM6CQJw;aY+R8q)b9sMf9{2#4+##JBDUYCX&KGY%!q?ffbl;vU?WT?-gk= z;e{nmwC9+Z!b{ho7hE5lQgVrFEFnUYo!0~zDH%ZqWEP$)YU0Fe9JGSj-%0O!|H0&P zxK2s}*62Y6(cnxJ^BwJ!?j~3pp6FRYNT_VU@MdF5F+wh7p+QkFnrXrh%>=GHQx@1o zY$3v=4Dt`**WelxP75tC`?ZjoK4@4tRMIGbCFvZkO;$-#_(OY=!JviVxOT8h9C57a zK!UC#qZ+71*bj^e$hd{wWH1Uw2!>HG+*=Y1Okm6z17j3(!3Y@isgeXC{Lr6@w4zbA zGh36p0@kM@7YzjHFoWR||C zWPpXRuSngEcaFeswI@(}Pf)OMUtwgdFqz~!?mxI)$n|0w9IB{wz?cjl0E-aVD!4|8 ztwlit{$Naw2y0>MU}Gx?k*sEh1ZZU@yRfz4J%XzBUXuIIdP~~G0tYdXtcODp1?XTg zqKrAWu$`!0*g4_-=NJ?vTM>)}oJdK|hh4(pcp;g94Bv!c%gG{gOyRi@z=P!E0%Mr1 z#IYu@!fL{^AKKWHMFe_;{f;>p!KwKdW|zDZ$;gDujH1AqCQut2!kRhZ9Oo2%4o6%j zx%B-9jtx1N9T#K+!re)3Lg!&5Wgbk=eh1SG&kD!sZ4kH{^fpXj{0#`#sUscXEkJ`D zd${Mr?9#!&Iv{7AhspupQuv2$;*(h82OV5?*)q=H@If->owX)R{<0A{KKpUgG2NF-FCp1aZqtbWBKTO5!mVFD;Ia i`hS&a(cB{Y*aRUMiJeSQsB)n*Sfi4i88G delta 4317 zcmai1dra146y9e}2L^-iwp@uhBg)HrzZj4x;nXnGv_DcA1?A>axtOSJ47J=$Cur+u zinlaNoi?lGB{N7zZe9{Ep{W?ovQ|>AX%<^_$nWEebH1(rzP;ah&wHM8p7WgZyHnr2 zwZ41RtdOgo-KQdN+zpm=`H$z0_up5XwMyMHvHaGKAIJYRernu-0~t-NZ9UTRPH*dz zJ$87W@Yj#O)3dop(u3U(E-Refwab@XD_4)2d}rUiZQV+;N}ekEtaa$RThC70H~&CV zOUVJ|V|o0$iG$`W`Mz{q@8s+0i^_|0;@<9Y@bW`rD{>kZ_M3M* zb70Bw;syB|dh{H z@~xV+eU@Ka)v}>*&g|OlXLip&l-yUJc%{A|zM}V{-9@+357nP7yR&ibl50nnZLJ*| zH}CWG*SAgmC8zxP_!F5Q?Kl0WoSblC`ua^1N1U4WTJg+dH7l!TZp)wCdraFGJ3ejv zYW%~GuN+ua{_)J8$E>-y=7pBLR}TgA-fPO=x%bY_mSvB&Htb)P`S*)iS6XT}ZRvNW z>D2OtCmTh6?GKe@GZIFxUU04VuR(LaISEH=7AJJso6se+>g&NySgsjkatO0&jHRWg z4$GTem{U+zl=?`{aKVIP9VWrChS26-CKb#XOP!S(|L+gRj8{SB=}<~9i~kZ_@?iVv zP+G_b4PcR}J6mwBt(EAES*Km+Gv=*VDj0Aklv3f*U+})c=1d7Gu$__)JIa8`7ES~U{qX_ygQ?bTW2{B3ff)Z$b_~G zyH(5zoI0&FWO`4#3+&xmWk^vcCzX z1Ub#2q#*)Y4F@8aA>`psK#8j19>F4*wKyIj9LM<;!YG_y!92;i5LOdA?L;_-(fkUa z4G(x@teCVRIRZ8s!cb^&0^dXMsGo%P9P>(e>BDx>29=UaTrgk(CxE;r$&iwfWWbqY z!GQBI8dPc*sc#1lq}G-^F9q~?ak~rhmxlI2P^EQ5+oZLO1$E$}0%s7+Nu@!*2{^^H z!HkgB8=PsyjKy}K87>@VwEECM+5`m`V!%?&OWX~h#2&*}RsezafD1xur5GWGvfSZD z*3h81wweh?AXq8G&Dc>a&7=?Cjl$9}A4KrXw=q(!h1ArCVHm0wiV$6ELsG4^B#o?80NBMYE| zbpgc$Gs|KHh8FaZ2@vH17!n>k<|4Wn0S=cP(KH7#k97uyk+#82z?g~K$Z<|{%wYrR z+?Vi_@vtI&2QEmOU`0gc5Gyo%XBW(Y+_<1RrVH;JHuo^|Fe5#4)(6e8Tmak2Y=RAg zEIb}&jtF>j3?Lr1KJ+4I#u1734vH33#&E$I?Dk0JIMh9|26t2r7EI{Q25^Cg2bgPx z6cx@41_ui_RJC)8+ZT8&icmR?3DI87$Ohff2|#05^@HN8kQw|wcN!}ohqK83(E*FY zhk**}zy*9~p1T?vS>PPcRv=lqj7v6(sT^rdu7uAQJ2D3Z++?L@{J+Vx)U2%d(z1e* WvhtFmm*P41QrY-HgPwdkH~t?0Z`$_& diff --git a/Doc/RomWBW Errata.pdf b/Doc/RomWBW Errata.pdf index e66bd0f40acc2a62cc45809eca3a6a564ba0b490..2209d8e5950f591feba3b3b0654b31d3fcf926e9 100644 GIT binary patch delta 9187 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 Jlv0t#{%?0^fV}_! delta 9296 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

HWZ13Q= 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 C#N+<} diff --git a/ReadMe.md b/ReadMe.md index 615bd7b3..0a08366e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -3,7 +3,7 @@ **RomWBW ReadMe** \ Version 3.5 \ Wayne Warthen ([wwarthen@gmail.com](mailto:wwarthen@gmail.com)) \ -27 Aug 2024 +03 Sep 2024 # Overview diff --git a/ReadMe.txt b/ReadMe.txt index 0388635d..172dbca3 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,6 +1,6 @@ RomWBW ReadMe Wayne Warthen (wwarthen@gmail.com) -27 Aug 2024 +03 Sep 2024 diff --git a/Source/Doc/SystemGuide.md b/Source/Doc/SystemGuide.md index 018683c9..cacd3439 100644 --- a/Source/Doc/SystemGuide.md +++ b/Source/Doc/SystemGuide.md @@ -847,12 +847,19 @@ more of the defined media types. | MID_FD111 | 9 | 8" 1.11M Floppy | | MID_HD1K | 10 | Hard Disk (LBA) w/ 1024 directory entries | +**NOTE**: HBIOS does not actually differentiate between MID_HD512 and +MID_HD1K. The use of these two formats is determined by the use of a +partition table on the media and is implemented by the operating +system itself. HBIOS treats all hard disks as raw sectors. See +[Function 0x18 -- Disk Media (DIOMEDIA)] for more information on the +Media ID byte returned. + HBIOS supports both Cylinder/Head/Sector (CHS) and Logical Block Addresses (CHS) when locating a sector for I/O (see DIOSEEK function). For devices that are natively CHS (e.g., floppy disk), the HBIOS driver can convert LBA values to CHS values according to the geometry of the current media. For devices that are natively LBA (e.g., hard disk), the - HBIOS driver simulates CHS using a fictitious geometry provided by the +HBIOS driver simulates CHS using a fictitious geometry provided by the driver (typically 16 sectors per track and 16 heads per cylinder). ### Function 0x10 -- Disk Status (DIOSTATUS) @@ -1065,6 +1072,12 @@ Report the Media ID (E) for the for media in the specified Disk Unit will be performed. The Status (A) is a standard HBIOS result code. If there is no media in device, function will return an error status. +**NOTE**: This function will always return MID_HD512 for hard disk +devices. MID_HD1K is provided for use internally by operating systems +that provide different filsystem formats depending on the partition +table. This function cannot be used to determine if an HD1K formatted +partition exists on the hard disk. + ### Function 0x19 -- Disk Define Media (DIODEFMED) | **Entry Parameters** | **Returned Values** | @@ -1098,7 +1111,7 @@ DIOMEDIA function to force this if desired. | **Entry Parameters** | **Returned Values** | |----------------------------------------|----------------------------------------| | B: 0x1B | A: Status | -| C: Disk Unit | D: Heads | +| C: Disk Unit | D: Heads / LBA | | | E: Sectors | | | HL: Cylinder Count | | | BC: Block Size | @@ -1108,7 +1121,11 @@ device uses LBA mode addressing natively, then the drivers simulated geometry will be returned. The Status (A) is a standard HBIOS result code. If the media is unknown, an error will be returned. -Heads (D) refers to the number of heads per cylinder. Sectors (E) +LBA capability is indicated by D:7. When set, the device is capable +of LBA addressing. Refer to [Function 0x12 -- Disk Seek (DIOSEEK)] +for more information on specifying LBA vs. CHS addresses. + +Heads (D:6-0) refers to the number of heads per cylinder. Sectors (E) refers to the number of sectors per track. Cylinder Count (HL) is the total number of cylinders addressable for the media. Block Size (BC) is the number of bytes in one sector. From 34e472a553b70747698955bbe7536de5528a2093 Mon Sep 17 00:00:00 2001 From: drj113 Date: Wed, 4 Sep 2024 10:13:05 +1000 Subject: [PATCH 3/8] Initial Commit for Genesis Modules boards Supports GM STD Z180 and GM IDE Disk Controller --- Source/Apps/rtc.asm | 12 +- Source/HBIOS/Build.ps1 | 2 +- Source/HBIOS/Build.sh | 1 + Source/HBIOS/Config/GMZ180_std.asm | 72 +++++ Source/HBIOS/cfg_gmz180.asm | 358 +++++++++++++++++++++++ Source/HBIOS/hbios.inc | 3 +- Source/HBIOS/ide.asm | 75 ++++- Source/HBIOS/imm.asm | 8 +- Source/HBIOS/md.asm | 10 +- Source/HBIOS/ppide.asm | 24 +- Source/HBIOS/sd.asm | 78 +++-- Source/HBIOS/std.asm | 6 +- Source/HDIAG/hdsk.asm | 449 +++++++++++++++++++++++++++++ 13 files changed, 1026 insertions(+), 72 deletions(-) create mode 100644 Source/HBIOS/Config/GMZ180_std.asm create mode 100644 Source/HBIOS/cfg_gmz180.asm create mode 100644 Source/HDIAG/hdsk.asm diff --git a/Source/Apps/rtc.asm b/Source/Apps/rtc.asm index c49157f5..7d456da7 100644 --- a/Source/Apps/rtc.asm +++ b/Source/Apps/rtc.asm @@ -33,6 +33,8 @@ ; ;[2023/07/07] v1.9 Support DUODYNE ; +;[2024/09/02] v1.10 Support Genesis STD Z180 +; ; Constants ; mask_data .EQU %10000000 ; RTC data line @@ -52,6 +54,7 @@ PORT_RCZ280 .EQU $C0 ; RTC port for RCZ280 PORT_MBC .EQU $70 ; RTC port for MBC PORT_RPH .EQU $84 ; RTC port for RHYOPHYRE PORT_DUO .EQU $94 ; RTC port for DUODYNE +PORT_STDZ180 .EQU $84 ; RTC Port for STD Bus Z180 board BDOS .EQU 5 ; BDOS invocation vector @@ -1143,7 +1146,13 @@ HINIT: CP 17 ; DUODYNE JP Z,RTC_INIT2 ; - ; Unknown platform + LD C,PORT_STDZ180 + LD DE,PLT_STDZ180 + CP 21 ; STD Z180 + JP Z,RTC_INIT2 +; + +; Unknown platform LD DE,PLTERR ; BIOS error message LD C,9 ; BDOS string display function CALL BDOS ; Do it @@ -1769,6 +1778,7 @@ PLT_RCZ280 .TEXT ", RCBus Z280 RTC Module Latch Port 0xC0\r\n$" PLT_MBC .TEXT ", MBC RTC Latch Port 0x70\r\n$" PLT_RPH .TEXT ", RHYOPHYRE RTC Latch Port 0x84\r\n$" PLT_DUO .TEXT ", DUODYNE RTC Latch Port 0x70\r\n$" +PLT_STDZ180 .TEXT ", STD Z180 RTC Module latch port 0x84\r\n$" ; ; Generic FOR-NEXT loop algorithm diff --git a/Source/HBIOS/Build.ps1 b/Source/HBIOS/Build.ps1 index f6aa0a4e..e7ef3e63 100644 --- a/Source/HBIOS/Build.ps1 +++ b/Source/HBIOS/Build.ps1 @@ -28,7 +28,7 @@ $ErrorAction = 'Stop' # $PlatformListZ80 = "SBC", "MBC", "ZETA", "ZETA2", "RCZ80", "Z80RETRO", "DUO", "UNA", "HEATH", "MON", "NABU", "FZ80" -$PlatformListZ180 = "N8", "MK4", "RCZ180", "SCZ180", "DYNO", "RPH", "S100", "EPITX" +$PlatformListZ180 = "N8", "MK4", "RCZ180", "SCZ180", "DYNO", "RPH", "S100", "EPITX", "GMZ180" $PlatformListZ280 = "RCZ280" # diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index bb6dd4ad..cd9c06b2 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -51,6 +51,7 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then ROM_PLATFORM="NABU"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="FZ80"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="UNA"; ROM_CONFIG="std"; bash Build.sh + ROM_PLATFORM="GMZ180"; ROM_CONFIG="std"; bash Build.sh exit fi diff --git a/Source/HBIOS/Config/GMZ180_std.asm b/Source/HBIOS/Config/GMZ180_std.asm new file mode 100644 index 00000000..9cf083b7 --- /dev/null +++ b/Source/HBIOS/Config/GMZ180_std.asm @@ -0,0 +1,72 @@ +; +;================================================================================================== +; STD Z180 STANDARD CONFIGURATION +;================================================================================================== +; +; THE COMPLETE SET OF DEFAULT CONFIGURATION SETTINGS FOR THIS PLATFORM ARE FOUND IN THE +; CFG_.ASM INCLUDED FILE WHICH IS FOUND IN THE PARENT DIRECTORY. THIS FILE CONTAINS +; COMMON CONFIGURATION SETTINGS THAT OVERRIDE THE DEFAULTS. IT IS INTENDED THAT YOU MAKE +; YOUR CUSTOMIZATIONS IN THIS FILE AND JUST INHERIT ALL OTHER SETTINGS FROM THE DEFAULTS. +; EVEN BETTER, YOU CAN MAKE A COPY OF THIS FILE WITH A NAME LIKE _XXX.ASM AND SPECIFY +; YOUR FILE IN THE BUILD PROCESS. +; +; THE SETTINGS BELOW ARE THE SETTINGS THAT ARE MOST COMMONLY MODIFIED FOR THIS PLATFORM. +; MANY OF THEM ARE EQUAL TO THE SETTINGS IN THE INCLUDED FILE, SO THEY DON'T REALLY DO +; ANYTHING AS IS. THEY ARE LISTED HERE TO MAKE IT EASY FOR YOU TO ADJUST THE MOST COMMON +; SETTINGS. +; +; N.B., SINCE THE SETTINGS BELOW ARE REDEFINING VALUES ALREADY SET IN THE INCLUDED FILE, +; TASM INSISTS THAT YOU USE THE .SET OPERATOR AND NOT THE .EQU OPERATOR BELOW. ATTEMPTING +; TO REDEFINE A VALUE WITH .EQU BELOW WILL CAUSE TASM ERRORS! +; +; PLEASE REFER TO THE CUSTOM BUILD INSTRUCTIONS (README.TXT) IN THE SOURCE DIRECTORY (TWO +; DIRECTORIES ABOVE THIS ONE). +; +#DEFINE PLATFORM_NAME "GM STD BUS Z180", " [", CONFIG, "]" +; +#DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT +; +#include "cfg_GMZ180.asm" +; +CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ +CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +; +Z180_CLKDIV .SET 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .SET 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .SET 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +; +LEDENABLE .SET FALSE ; ENABLE STATUS LED (SINGLE LED) +LEDMODE .SET LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] +; +FPLED_ENABLE .SET FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .SET $00 ; FP: PORT ADDRESS FOR FP LEDS +; +DSRTCENABLE .SET TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +INTRTCENABLE .SET TRUE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +UARTENABLE .SET FALSE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +ASCIENABLE .SET TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +SIOENABLE .SET FALSE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +; +TMSENABLE .SET FALSE ; TMS: ENABLE TMS9918 VIDEO/KBD DRIVER (TMS.ASM) +TMSTIMENABLE .SET FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +TMSMODE .SET TMSMODE_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MBC|MSX|MSX9958|MSXKBD|COLECO] +MKYENABLE .SET FALSE ; MSX 5255 PPI KEYBOARD COMPATIBLE DRIVER (REQUIRES TMS VDA DRIVER) +EFENABLE .SET FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +VDAEMU_SERKBD .SET 0 ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +; +AY38910ENABLE .SET FALSE ; AY: AY-3-8910 / YM2149 SOUND DRIVER +AYMODE .SET AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC] +SN76489ENABLE .SET FALSE ; SN: ENABLE SN76489 SOUND DRIVER +; +FDENABLE .SET FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .SET FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPWDC] +; +IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +PPIDEENABLE .SET FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +SDENABLE .SET TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .SET SDMODE_GM ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR] +SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD & SC ONLY +; +PRPENABLE .SET FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) diff --git a/Source/HBIOS/cfg_gmz180.asm b/Source/HBIOS/cfg_gmz180.asm new file mode 100644 index 00000000..ee5ecc24 --- /dev/null +++ b/Source/HBIOS/cfg_gmz180.asm @@ -0,0 +1,358 @@ +; +;================================================================================================== +; ROMWBW 3.X CONFIGURATION DEFAULTS FOR GENESIS MODULES STD BUS BASED Z180 VARIANTS +;================================================================================================== +; +; THIS FILE CONTAINS THE FULL SET OF DEFAULT CONFIGURATION SETTINGS FOR THE PLATFORM +; INDICATED ABOVE. THIS FILE SHOULD *NOT* NORMALLY BE CHANGED. INSTEAD, YOU SHOULD +; OVERRIDE ANY SETTINGS YOU WANT USING A CONFIGURATION FILE IN THE CONFIG DIRECTORY +; UNDER THIS DIRECTORY. +; +; THIS FILE CAN BE CONSIDERED A REFERENCE THAT LISTS ALL POSSIBLE CONFIGURATION SETTINGS +; FOR THE PLATFORM. +; +#DEFINE PLATFORM_NAME "GM STD BUS Z180", " [", CONFIG, "]" +; +#INCLUDE "hbios.inc" +; +PLATFORM .EQU PLT_GMZ180 ; PLT_[SBC|ZETA|ZETA2|N8|MK4|UNA|RCZ80|RCZ180|EZZ80|SCZ180|GMZ180|DYNO|RCZ280|MBC|RPH|Z80RETRO|S100|DUO|HEATH|MON] +CPUFAM .EQU CPU_Z180 ; CPU FAMILY: CPU_[Z80|Z180|Z280] +BIOS .EQU BIOS_WBW ; HARDWARE BIOS: BIOS_[WBW|UNA] +BATCOND .EQU FALSE ; ENABLE LOW BATTERY WARNING MESSAGE +HBIOS_MUTEX .EQU FALSE ; ENABLE REENTRANT CALLS TO HBIOS (ADDS OVERHEAD) +USELZSA2 .EQU TRUE ; ENABLE FONT COMPRESSION +TICKFREQ .EQU 50 ; DESIRED PERIODIC TIMER INTERRUPT FREQUENCY (HZ) +; +BOOT_TIMEOUT .EQU -1 ; AUTO BOOT TIMEOUT IN SECONDS, -1 TO DISABLE, 0 FOR IMMEDIATE +BOOT_DELAY .EQU 0 ; FIXED BOOT DELAY IN SECONDS PRIOR TO CONSOLE OUTPUT +AUTOCON .EQU TRUE ; ENABLE CONSOLE TAKEOVER AT LOADER PROMPT +; +CPUSPDCAP .EQU SPD_FIXED ; CPU SPEED CHANGE CAPABILITY SPD_FIXED|SPD_HILO +CPUSPDDEF .EQU SPD_HIGH ; CPU SPEED DEFAULT SPD_UNSUP|SPD_HIGH|SPD_LOW +CPUOSC .EQU 18432000 ; CPU OSC FREQ IN MHZ +INTMODE .EQU 2 ; INTERRUPTS: 0=NONE, 1=MODE 1, 2=MODE 2, 3=MODE 3 (Z280) +DEFSERCFG .EQU SER_115200_8N1 | SER_RTS ; DEFAULT SERIAL LINE CONFIG (SEE STD.ASM) +; +RAMSIZE .EQU 512 ; SIZE OF RAM IN KB (MUST MATCH YOUR HARDWARE!!!) +ROMSIZE .EQU 512 ; SIZE OF ROM IN KB (MUST MATCH YOUR HARDWARE!!!) +APP_BNKS .EQU $FF ; BANKS TO RESERVE FOR APP USE ($FF FOR AUTO SIZING) +MEMMGR .EQU MM_Z180 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280|MBC|RPH|MON] +RAMBIAS .EQU ROMSIZE ; OFFSET OF START OF RAM IN PHYSICAL ADDRESS SPACE +MPGSEL_0 .EQU $78 ; Z2 MEM MGR BANK 0 PAGE SELECT REG (WRITE ONLY) +MPGSEL_1 .EQU $79 ; Z2 MEM MGR BANK 1 PAGE SELECT REG (WRITE ONLY) +MPGSEL_2 .EQU $7A ; Z2 MEM MGR BANK 2 PAGE SELECT REG (WRITE ONLY) +MPGSEL_3 .EQU $7B ; Z2 MEM MGR BANK 3 PAGE SELECT REG (WRITE ONLY) +MPGENA .EQU $7C ; Z2 MEM MGR PAGING ENABLE REGISTER (BIT 0, WRITE ONLY) +; +Z180_BASE .EQU $C0 ; Z180: I/O BASE ADDRESS FOR INTERNAL REGISTERS +Z180_CLKDIV .EQU 1 ; Z180: CHK DIV: 0=OSC/2, 1=OSC, 2=OSC*2 +Z180_MEMWAIT .EQU 0 ; Z180: MEMORY WAIT STATES (0-3) +Z180_IOWAIT .EQU 1 ; Z180: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) +Z180_TIMER .EQU TRUE ; Z180: ENABLE Z180 SYSTEM PERIODIC TIMER +; +RTCIO .EQU $84 ; RTC LATCH REGISTER ADR +; +KIOENABLE .EQU FALSE ; ENABLE ZILOG KIO SUPPORT +KIOBASE .EQU $80 ; KIO BASE I/O ADDRESS +; +CTCENABLE .EQU FALSE ; ENABLE ZILOG CTC SUPPORT +CTCDEBUG .EQU FALSE ; ENABLE CTC DRIVER DEBUG OUTPUT +CTCBASE .EQU $88 ; CTC BASE I/O ADDRESS +CTCTIMER .EQU FALSE ; ENABLE CTC PERIODIC TIMER +; +PCFENABLE .EQU FALSE ; ENABLE PCF8584 I2C CONTROLLER +PCFBASE .EQU $F0 ; PCF8584 BASE I/O ADDRESS +; +EIPCENABLE .EQU FALSE ; EIPC: ENABLE Z80 EIPC (Z84C15) INITIALIZATION +; +SKZENABLE .EQU FALSE ; ENABLE SERGEY'S Z80-512K FEATURES +; +WDOGMODE .EQU WDOG_NONE ; WATCHDOG MODE: WDOG_[NONE|EZZ80|SKZ] +; +FPLED_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL LEDS +FPLED_IO .EQU $00 ; FP: PORT ADDRESS FOR FP LEDS +FPLED_INV .EQU FALSE ; FP: LED BITS ARE INVERTED +FPLED_DSKACT .EQU FALSE ; FP: ENABLES DISK I/O ACTIVITY ON FP LEDS +FPSW_ENABLE .EQU FALSE ; FP: ENABLES FRONT PANEL SWITCHES +FPSW_IO .EQU $00 ; FP: PORT ADDRESS FOR FP SWITCHES +FPSW_INV .EQU FALSE ; FP: SWITCH BITS ARE INVERTED +; +DIAGLVL .EQU DL_CRITICAL ; ERROR LEVEL REPORTING +; +LEDENABLE .EQU FALSE ; ENABLES STATUS LED (SINGLE LED) +LEDMODE .EQU LEDMODE_STD ; LEDMODE_[STD|SC|RTC|NABU] +LEDPORT .EQU $0E ; STATUS LED PORT ADDRESS +LEDDISKIO .EQU TRUE ; ENABLES DISK I/O ACTIVITY ON STATUS LED +; +DSKYENABLE .EQU FALSE ; ENABLES DSKY FUNCTIONALITY +DSKYDSKACT .EQU FALSE ; ENABLES DISK ACTIVITY ON DSKY DISPLAY +ICMENABLE .EQU FALSE ; ENABLES ORIGINAL DSKY ICM DRIVER (7218) +ICMPPIBASE .EQU $60 ; BASE I/O ADDRESS OF ICM PPI +PKDENABLE .EQU FALSE ; ENABLES DSKY NG PKD DRIVER (8259) +PKDPPIBASE .EQU $60 ; BASE I/O ADDRESS OF PKD PPI +PKDOSC .EQU 3000000 ; OSCILLATOR FREQ FOR PKD (IN HZ) +H8PENABLE .EQU FALSE ; ENABLES HEATH H8 FRONT PANEL +LCDENABLE .EQU FALSE ; ENABLE LCD DISPLAY +LCDBASE .EQU $DA ; BASE I/O ADDRESS OF LCD CONTROLLER +LCDDSKACT .EQU TRUE ; ENABLES DISK ACTIVITY ON LCD DISPLAY +; +BOOTCON .EQU 0 ; BOOT CONSOLE DEVICE +SECCON .EQU $FF ; SECONDARY CONSOLE DEVICE +CRTACT .EQU FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP +VDAEMU .EQU EMUTYP_ANSI ; VDA EMULATION: EMUTYP_[TTY|ANSI] +VDAEMU_SERKBD .EQU $FF ; VDA EMULATION: SERIAL KBD UNIT #, OR $FF FOR HW KBD +ANSITRACE .EQU 1 ; ANSI DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKTRACE .EQU 1 ; PPK DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +KBDTRACE .EQU 1 ; KBD DRIVER TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPKKBLOUT .EQU KBD_US ; PPK KEYBOARD LANGUAGE: KBD_[US|DE] +KBDKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +MKYKBLOUT .EQU KBD_US ; KBD KEYBOARD LANGUAGE: KBD_[US|DE] +; +DSRTCENABLE .EQU TRUE ; DSRTC: ENABLE DS-1302 CLOCK DRIVER (DSRTC.ASM) +DSRTCMODE .EQU DSRTCMODE_STD ; DSRTC: OPERATING MODE: DSRTC_[STD|MFPIC|K80W] +DSRTCCHG .EQU TRUE ; DSRTC: FORCE BATTERY CHARGE ON (USE WITH CAUTION!!!) +; +DS1501RTCENABLE .EQU FALSE ; DS1501RTC: ENABLE DS-1501 CLOCK DRIVER (DS1501RTC.ASM) +DS1501RTC_BASE .EQU $50 ; DS1501RTC: I/O BASE ADDRESS +; +BQRTCENABLE .EQU FALSE ; BQRTC: ENABLE BQ4845 CLOCK DRIVER (BQRTC.ASM) +BQRTC_BASE .EQU $50 ; BQRTC: I/O BASE ADDRESS +; +INTRTCENABLE .EQU FALSE ; ENABLE PERIODIC INTERRUPT CLOCK DRIVER (INTRTC.ASM) +; +RP5RTCENABLE .EQU FALSE ; RP5C01 RTC BASED CLOCK (RP5RTC.ASM) +; +HTIMENABLE .EQU FALSE ; ENABLE SIMH TIMER SUPPORT +SIMRTCENABLE .EQU FALSE ; ENABLE SIMH CLOCK DRIVER (SIMRTC.ASM) +; +DS7RTCENABLE .EQU FALSE ; DS7RTC: ENABLE DS-1307 I2C CLOCK DRIVER (DS7RTC.ASM) +DS7RTCMODE .EQU DS7RTCMODE_PCF ; DS7RTC: OPERATING MODE: DS7RTC_[PCF] +; +DS5RTCENABLE .EQU FALSE ; DS5RTC: ENABLE DS-1305 SPI CLOCK DRIVER (DS5RTC.ASM) +; +SSERENABLE .EQU FALSE ; SSER: ENABLE SIMPLE SERIAL DRIVER (SSER.ASM) +SSERCFG .EQU SER_9600_8N1 ; SSER: SERIAL LINE CONFIG +SSERSTATUS .EQU $FF ; SSER: STATUS PORT +SSERDATA .EQU $FF ; SSER: DATA PORT +SSERIRDY .EQU %00000001 ; SSER: INPUT READY BIT MASK +SSERIINV .EQU FALSE ; SSER: INPUT READY BIT INVERTED +SSERORDY .EQU %00000010 ; SSER: OUTPUT READY BIT MASK +SSEROINV .EQU FALSE ; SSER: OUTPUT READY BIT INVERTED +; +DUARTENABLE .EQU FALSE ; DUART: ENABLE 2681/2692 SERIAL DRIVER (DUART.ASM) +DUARTCNT .EQU 1 ; DUART: NUMBER OF CHIPS TO DETECT (1-2) +DUART0BASE .EQU $A0 ; DUART 0: BASE ADDRESS OF CHIP +DUART0ACFG .EQU DEFSERCFG ; DUART 0A: SERIAL LINE CONFIG +DUART0BCFG .EQU DEFSERCFG ; DUART 0B: SERIAL LINE CONFIG +DUART1BASE .EQU $40 ; DUART 1: BASE ADDRESS OF CHIP +DUART1ACFG .EQU DEFSERCFG ; DUART 1A: SERIAL LINE CONFIG +DUART1BCFG .EQU DEFSERCFG ; DUART 1B: SERIAL LINE CONFIG +; +UARTENABLE .EQU TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) +UARTCNT .EQU 1 ; UART: NUMBER OF CHIPS TO DETECT (1-8) +UARTOSC .EQU 1843200 ; UART: OSC FREQUENCY IN MHZ +UARTINTS .EQU FALSE ; UART: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +UART4UART .EQU FALSE ; UART: SUPPORT 4UART ECB BOARD +UART4UARTBASE .EQU $C0 ; UART: BASE IO ADDRESS OF 4UART ECB BOARD +UART0BASE .EQU $80 ; UART 0: REGISTERS BASE ADR +UART0CFG .EQU DEFSERCFG ; UART 0: SERIAL LINE CONFIG +UART1BASE .EQU $88 ; UART 1: REGISTERS BASE ADR +UART1CFG .EQU DEFSERCFG ; UART 1: SERIAL LINE CONFIG +UART2BASE .EQU $A0 ; UART 2: REGISTERS BASE ADR +UART2CFG .EQU DEFSERCFG ; UART 2: SERIAL LINE CONFIG +UART3BASE .EQU $A8 ; UART 3: REGISTERS BASE ADR +UART3CFG .EQU DEFSERCFG ; UART 3: SERIAL LINE CONFIG +UART4BASE .EQU $FF ; UART 4: REGISTERS BASE ADR +UART4CFG .EQU DEFSERCFG ; UART 4: SERIAL LINE CONFIG +UART5BASE .EQU $FF ; UART 5: REGISTERS BASE ADR +UART5CFG .EQU DEFSERCFG ; UART 5: SERIAL LINE CONFIG +UART6BASE .EQU $FF ; UART 6: REGISTERS BASE ADR +UART6CFG .EQU DEFSERCFG ; UART 6: SERIAL LINE CONFIG +UART7BASE .EQU $FF ; UART 7: REGISTERS BASE ADR +UART7CFG .EQU DEFSERCFG ; UART 7: SERIAL LINE CONFIG +; +ASCIENABLE .EQU TRUE ; ASCI: ENABLE Z180 ASCI SERIAL DRIVER (ASCI.ASM) +ASCIINTS .EQU TRUE ; ASCI: INCLUDE INTERRUPT SUPPORT UNDER IM1/2/3 +ASCISWAP .EQU FALSE ; ASCI: SWAP CHANNELS +ASCIBOOT .EQU 0 ; ASCI: REBOOT ON RCV CHAR (0=DISABLED) +ASCI0CFG .EQU DEFSERCFG ; ASCI 0: SERIAL LINE CONFIG +ASCI1CFG .EQU DEFSERCFG ; ASCI 1: SERIAL LINE CONFIG +; +Z2UENABLE .EQU FALSE ; Z2U: ENABLE Z280 UART SERIAL DRIVER (Z2U.ASM) +; +ACIAENABLE .EQU FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +; +SIOENABLE .EQU TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) +SIODEBUG .EQU FALSE ; SIO: ENABLE DEBUG OUTPUT +SIOBOOT .EQU 0 ; SIO: REBOOT ON RCV CHAR (0=DISABLED) +SIOCNT .EQU 2 ; SIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +SIOINTS .EQU TRUE ; SIO: INCLUDE SIO INTERRUPT SUPPORT UNDER IM1/2/3 +SIO0MODE .EQU SIOMODE_RC ; SIO 0: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO0BASE .EQU $80 ; SIO 0: REGISTERS BASE ADR +SIO0ACLK .EQU 7372800 ; SIO 0A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0ACFG .EQU SER_115200_8N1 ; SIO 0A: SERIAL LINE CONFIG +SIO0ACTCC .EQU -1 ; SIO 0A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO0BCLK .EQU 7372800 ; SIO 0B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO0BCFG .EQU SER_115200_8N1 ; SIO 0B: SERIAL LINE CONFIG +SIO0BCTCC .EQU -1 ; SIO 0B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1MODE .EQU SIOMODE_RC ; SIO 1: CHIP TYPE: SIOMODE_[STD|RC|SMB|ZP|Z80R] +SIO1BASE .EQU $84 ; SIO 1: REGISTERS BASE ADR +SIO1ACLK .EQU 7372800 ; SIO 1A: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1ACFG .EQU SER_115200_8N1 ; SIO 1A: SERIAL LINE CONFIG +SIO1ACTCC .EQU -1 ; SIO 1A: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +SIO1BCLK .EQU 7372800 ; SIO 1B: OSC FREQ IN HZ, ZP=2457600/4915200, RC/SMB=7372800 +SIO1BCFG .EQU SER_115200_8N1 ; SIO 1B: SERIAL LINE CONFIG +SIO1BCTCC .EQU -1 ; SIO 1B: CTC CHANNEL 0=A, 1=B, 2=C, 3=D, -1 FOR NONE +; +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) +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_MSX ; TMS: DRIVER MODE: TMSMODE_[SCG|N8|MSX|MSXKBD|MSXMKY|MBC|COLECO|DUO|NABU] +TMS80COLS .EQU FALSE ; TMS: ENABLE 80 COLUMN SCREEN, REQUIRES V9958 +TMSTIMENABLE .EQU FALSE ; TMS: ENABLE TIMER INTERRUPTS (REQUIRES IM1) +VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) +VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) +SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) +EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +; +MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) +MDROM .EQU TRUE ; MD: ENABLE ROM DISK +MDRAM .EQU TRUE ; MD: ENABLE RAM DISK +MDTRACE .EQU 1 ; MD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +MDFFENABLE .EQU FALSE ; MD: ENABLE FLASH FILE SYSTEM +; +FDENABLE .EQU FALSE ; FD: ENABLE FLOPPY DISK DRIVER (FD.ASM) +FDMODE .EQU FDMODE_RCWDC ; FD: DRIVER MODE: FDMODE_[DIO|ZETA|ZETA2|DIDE|N8|DIO3|RCSMC|RCWDC|DYNO|EPFDC|MBC] +FDCNT .EQU 2 ; FD: NUMBER OF FLOPPY DRIVES ON THE INTERFACE (1-2) +FDTRACE .EQU 1 ; FD: TRACE LEVEL (0=NO,1=FATAL,2=ERRORS,3=ALL) +FDMAUTO .EQU TRUE ; FD: AUTO SELECT DEFAULT/ALTERNATE MEDIA FORMATS +FD0TYPE .EQU FDT_3HD ; FD 0: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +FD1TYPE .EQU FDT_3HD ; FD 1: DRIVE TYPE: FDT_[3DD|3HD|5DD|5HD|8] +; +RFENABLE .EQU FALSE ; RF: ENABLE RAM FLOPPY DRIVER +; +IDEENABLE .EQU TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) +IDETRACE .EQU 1 ; IDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IDECNT .EQU 1 ; IDE: NUMBER OF IDE INTERFACES TO DETECT (1-3), 2 DRIVES EACH +IDE0MODE .EQU IDEMODE_GIDE ; IDE 0: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC|GIDE] +IDE0BASE .EQU $20 ; IDE 0: IO BASE ADDRESS +IDE0DATLO .EQU $20 ; IDE 0: DATA LO PORT FOR 16-BIT I/O +IDE0DATHI .EQU $28 ; IDE 0: DATA HI PORT FOR 16-BIT I/O +IDE0A8BIT .EQU TRUE ; IDE 0A (MASTER): 8 BIT XFER +IDE0B8BIT .EQU TRUE ; IDE 0B (MASTER): 8 BIT XFER +IDE1MODE .EQU IDEMODE_NONE ; IDE 1: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC|GIDE] +IDE1BASE .EQU $00 ; IDE 1: IO BASE ADDRESS +IDE1DATLO .EQU $00 ; IDE 1: DATA LO PORT FOR 16-BIT I/O +IDE1DATHI .EQU $00 ; IDE 1: DATA HI PORT FOR 16-BIT I/O +IDE1A8BIT .EQU TRUE ; IDE 1A (MASTER): 8 BIT XFER +IDE1B8BIT .EQU TRUE ; IDE 1B (MASTER): 8 BIT XFER +IDE2MODE .EQU IDEMODE_NONE ; IDE 2: DRIVER MODE: IDEMODE_[DIO|DIDE|MK4|RC|GIDE] +IDE2BASE .EQU $00 ; IDE 2: IO BASE ADDRESS +IDE2DATLO .EQU $00 ; IDE 2: DATA LO PORT FOR 16-BIT I/O +IDE2DATHI .EQU $00 ; IDE 2: DATA HI PORT FOR 16-BIT I/O +IDE2A8BIT .EQU TRUE ; IDE 2A (MASTER): 8 BIT XFER +IDE2B8BIT .EQU TRUE ; IDE 2B (MASTER): 8 BIT XFER +; +PPIDEENABLE .EQU FALSE ; PPIDE: ENABLE PARALLEL PORT IDE DISK DRIVER (PPIDE.ASM) +PPIDETRACE .EQU 1 ; PPIDE: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPIDECNT .EQU 1 ; PPIDE: NUMBER OF PPI CHIPS TO DETECT (1-3), 2 DRIVES PER CHIP +PPIDE0BASE .EQU $20 ; PPIDE 0: PPI REGISTERS BASE ADR +PPIDE0A8BIT .EQU FALSE ; PPIDE 0A (MASTER): 8 BIT XFER +PPIDE0B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE1BASE .EQU $00 ; PPIDE 1: PPI REGISTERS BASE ADR +PPIDE1A8BIT .EQU FALSE ; PPIDE 1A (MASTER): 8 BIT XFER +PPIDE1B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +PPIDE2BASE .EQU $00 ; PPIDE 2: PPI REGISTERS BASE ADR +PPIDE2A8BIT .EQU FALSE ; PPIDE 2A (MASTER): 8 BIT XFER +PPIDE2B8BIT .EQU FALSE ; PPIDE 0B (SLAVE): 8 BIT XFER +; +SDENABLE .EQU TRUE ; SD: ENABLE SD CARD DISK DRIVER (SD.ASM) +SDMODE .EQU SDMODE_GM ; SD: DRIVER MODE: SDMODE_[JUHA|N8|CSIO|PPI|UART|DSD|MK4|SC|MT|USR|PIO|Z80R|EPITX|FZ80|GM] +SDPPIBASE .EQU $60 ; SD: BASE I/O ADDRESS OF PPI FOR PPI MODDE +SDCNT .EQU 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY +SDTRACE .EQU 1 ; SD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SDCSIOFAST .EQU FALSE ; SD: ENABLE TABLE-DRIVEN BIT INVERTER IN CSIO MODE +SDMTSWAP .EQU FALSE ; SD: SWAP THE LOGICAL ORDER OF THE SPI PORTS OF THE MT011 +; +CHENABLE .EQU FALSE ; CH: ENABLE CH375/376 USB SUPPORT +CHTRACE .EQU 1 ; CH: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHUSBTRACE .EQU 1 ; CHUSB: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHSDTRACE .EQU 1 ; CHSD: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +CHCNT .EQU 2 ; CH: NUMBER OF BOARDS TO DETECT (1-2) +CH0BASE .EQU $3E ; CH 0: BASE I/O ADDRESS +CH0USBENABLE .EQU TRUE ; CH 0: ENABLE USB DISK +CH0SDENABLE .EQU FALSE ; CH 0: ENABLE SD DISK +CH1BASE .EQU $3C ; CH 1: BASE I/O ADDRESS +CH1USBENABLE .EQU TRUE ; CH 1: ENABLE USB DISK +CH1SDENABLE .EQU FALSE ; CH 1: ENABLE SD DISK +; +PRPENABLE .EQU FALSE ; PRP: ENABLE ECB PROPELLER IO BOARD DRIVER (PRP.ASM) +PRPSDENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER SD CARD SUPPORT +PRPSDTRACE .EQU 1 ; PRP: SD CARD TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PRPCONENABLE .EQU TRUE ; PRP: ENABLE PROPIO DRIVER VIDEO/KBD SUPPORT +; +PPPENABLE .EQU FALSE ; PPP: ENABLE ZETA PARALLEL PORT PROPELLER BOARD DRIVER (PPP.ASM) +; +ESPENABLE .EQU FALSE ; ESP: ENABLE ESP32 IO BOARD DRIVER (ESP.ASM) +; +HDSKENABLE .EQU FALSE ; HDSK: ENABLE SIMH HDSK DISK DRIVER (HDSK.ASM) +; +PIOENABLE .EQU FALSE ; PIO: ENABLE ZILOG PIO DRIVER (PIO.ASM) +PIOCNT .EQU 2 ; PIO: NUMBER OF CHIPS TO DETECT (1-2), 2 CHANNELS PER CHIP +PIO0BASE .EQU $B8 ; PIO 0: REGISTERS BASE ADR +PIO1BASE .EQU $BC ; PIO 1: REGISTERS BASE ADR +; +LPTENABLE .EQU FALSE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM) +LPTMODE .EQU LPTMODE_MG014 ; LPT: DRIVER MODE: LPTMODE_[NONE|SPP|MG014] +LPTCNT .EQU 1 ; LPT: NUMBER OF CHIPS TO DETECT (1-2) +LPTTRACE .EQU 1 ; LPT: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +LPT0BASE .EQU $18 ; LPT 0: REGISTERS BASE ADR +LPT1BASE .EQU $00 ; LPT 1: REGISTERS BASE ADR +; +PPAENABLE .EQU FALSE ; PPA: ENABLE PPA DISK DRIVER (PPA.ASM) +PPACNT .EQU 1 ; PPA: NUMBER OF PPA DEVICES (1-2) +PPATRACE .EQU 1 ; PPA: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +PPAMODE .EQU PPAMODE_MG014 ; PPA: DRIVER MODE: PPAMODE_[NONE|SPP|MG014] +PPA0BASE .EQU LPT0BASE ; PPA 0: BASE I/O ADDRESS OF PPI FOR PPA +PPA1BASE .EQU LPT1BASE ; PPA 1: BASE I/O ADDRESS OF PPI FOR PPA +; +IMMENABLE .EQU FALSE ; IMM: ENABLE IMM DISK DRIVER (IMM.ASM) +IMMCNT .EQU 1 ; IMM: NUMBER OF IMM DEVICES (1-2) +IMMTRACE .EQU 1 ; IMM: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +IMMMODE .EQU IMMMODE_MG014 ; IMM: DRIVER MODE: IMMMODE_[NONE|SPP|MG014] +IMM0BASE .EQU LPT0BASE ; IMM 0: BASE I/O ADDRESS OF PPI FOR IMM +IMM1BASE .EQU LPT1BASE ; IMM 1: BASE I/O ADDRESS OF PPI FOR IMM +; +SYQENABLE .EQU FALSE ; SYQ: ENABLE IMM DISK DRIVER (SYQ.ASM) +SYQCNT .EQU 1 ; SYQ: NUMBER OF SYQ DEVICES (1-2) +SYQTRACE .EQU 1 ; SYQ: TRACE LEVEL (0=NO,1=ERRORS,2=ALL) +SYQMODE .EQU IMMMODE_MG014 ; SYQ: DRIVER MODE: SYQMODE_[NONE|SPP|MG014] +SYQ0BASE .EQU LPT0BASE ; SYQ 0: BASE I/O ADDRESS OF PPI FOR SYQ +SYQ1BASE .EQU LPT1BASE ; SYQ 1: BASE I/O ADDRESS OF PPI FOR SYQ +; +PIO_4P .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB 4P BOARD +PIO_ZP .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR ECB ZILOG PERIPHERALS BOARD (PIO.ASM) +PIO_SBC .EQU FALSE ; PIO: ENABLE PARALLEL PORT DRIVER FOR 8255 CHIP +; +UFENABLE .EQU FALSE ; UF: ENABLE ECB USB FIFO DRIVER (UF.ASM) +; +SN76489ENABLE .EQU FALSE ; SN: ENABLE SN76489 SOUND DRIVER +AUDIOTRACE .EQU FALSE ; ENABLE TRACING TO CONSOLE OF SOUND DRIVER +SN7CLK .EQU 3579545 ; SN: PSG CLOCK FREQ, ASSUME MSX STD +SNMODE .EQU SNMODE_RC ; SN: DRIVER MODE: SNMODE_[NONE|RC|VGM] +; +AY38910ENABLE .EQU FALSE ; AY: ENABLE AY-3-8910 / YM2149 SOUND DRIVER +AY_CLK .EQU 1789772 ; AY: PSG CLOCK FREQ, ASSUME MSX STD +AYMODE .EQU AYMODE_RCZ180 ; AY: DRIVER MODE: AYMODE_[SCG|N8|RCZ80|RCZ180|MSX|LINC|MBC|DUO|NABU] +; +SPKENABLE .EQU FALSE ; SPK: ENABLE RTC LATCH IOBIT SOUND DRIVER (SPK.ASM) +; +DMAENABLE .EQU FALSE ; DMA: ENABLE DMA DRIVER (DMA.ASM) +DMABASE .EQU $E0 ; DMA: DMA BASE ADDRESS +DMAMODE .EQU DMAMODE_Z180 ; DMA: DMA MODE (NONE|ECB|Z180|Z280|RC|MBC|DUO) +; +YM2612ENABLE .EQU FALSE ; YM2612: ENABLE YM2612 DRIVER +VGMBASE .EQU $C0 ; YM2612: BASE ADDRESS FOR VGM BOARD (YM2612/SN76489s/CTC) diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 308bcb87..f1a42802 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -157,7 +157,7 @@ PLT_DUO .EQU 17 ; DUODYNE Z80 SYSTEM PLT_HEATH .EQU 18 ; HEATHKIT H8 Z80 SYSTEM PLT_EPITX .EQU 19 ; Z180 MINI-ITX PLT_MON .EQU 20 ; MONSPUTER -PLT_STDZ180 .EQU 21 ; GENESIS Z180 SYSTEM +PLT_GMZ180 .EQU 21 ; GENESIS Z180 SYSTEM PLT_NABU .EQU 22 ; NABU PERSONAL COMPUTER PLT_FZ80 .EQU 23 ; S100 FPGA Z80 ; @@ -377,7 +377,6 @@ VDADEV_TMS .EQU $03 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $04 ; ECB VGA3 - HITACHI HD6445 VDADEV_VRC .EQU $05 ; VGARC VDADEV_EF .EQU $06 ; EF9345 -VDADEV_FV .EQU $07 ; S100 FPGA VGA ; ; SOUND DEVICE IDS ; diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 7abb8316..0730636d 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -18,6 +18,7 @@ ; MK4 $80 N/A N/A ; RC $10 N/A N/A ; SMB $E0 N/A N/A +; GIDE $20 $20 $28 - Genesis IDE controller - Note Read Hi Low - Write - Low High ; ; +-----------------------------------------------------------------------+ ; | CONTROL BLOCK REGISTERS | @@ -224,6 +225,9 @@ IDE_DEV0M: ; DEVICE 0, MASTER #IF (IDE0MODE == IDEMODE_DIDE) DEVECHO "DIDE" #ENDIF + #IF (IDE0MODE == IDEMODE_GIDE) + DEVECHO "GIDE" + #ENDIF #IF (IDE0MODE == IDEMODE_MK4) DEVECHO "MK4" #ENDIF @@ -259,6 +263,9 @@ IDE_DEV0S: ; DEVICE 0, SLAVE #IF (IDE0MODE == IDEMODE_DIDE) DEVECHO "DIDE" #ENDIF + #IF (IDE0MODE == IDEMODE_GIDE) + DEVECHO "GIDE" + #ENDIF #IF (IDE0MODE == IDEMODE_MK4) DEVECHO "MK4" #ENDIF @@ -297,6 +304,9 @@ IDE_DEV1M: ; DEVICE 1, MASTER #IF (IDE1MODE == IDEMODE_DIDE) DEVECHO "DIDE" #ENDIF + #IF (IDE1MODE == IDEMODE_GIDE) + DEVECHO "GIDE" + #ENDIF #IF (IDE1MODE == IDEMODE_MK4) DEVECHO "MK4" #ENDIF @@ -332,6 +342,9 @@ IDE_DEV1S: ; DEVICE 1, SLAVE #IF (IDE1MODE == IDEMODE_DIDE) DEVECHO "DIDE" #ENDIF + #IF (IDE1MODE == IDEMODE_GIDE) + DEVECHO "GIDE" + #ENDIF #IF (IDE1MODE == IDEMODE_MK4) DEVECHO "MK4" #ENDIF @@ -370,6 +383,9 @@ IDE_DEV2M: ; DEVICE 2, MASTER #IF (IDE2MODE == IDEMODE_DIDE) DEVECHO "DIDE" #ENDIF + #IF (IDE2MODE == IDEMODE_GIDE) + DEVECHO "GIDE" + #ENDIF #IF (IDE2MODE == IDEMODE_MK4) DEVECHO "MK4" #ENDIF @@ -405,6 +421,9 @@ IDE_DEV2S: ; DEVICE 2, SLAVE #IF (IDE2MODE == IDEMODE_DIDE) DEVECHO "DIDE" #ENDIF + #IF (IDE2MODE == IDEMODE_GIDE) + DEVECHO "GIDE" + #ENDIF #IF (IDE2MODE == IDEMODE_MK4) DEVECHO "MK4" #ENDIF @@ -491,6 +510,9 @@ IDE_INIT2: LD DE,IDE_STR_MODE_RC ; MODE LABEL CP IDEMODE_RC ; TEST FOR MODE JR Z,IDE_INIT2A ; IF SO, DISPLAY IT + LD DE,IDE_STR_MODE_GIDE ; MODE LABEL + CP IDEMODE_GIDE ; TEST FOR MODE + JR Z,IDE_INIT2A ; IF SO, DISPLAY IT JR IDE_INIT4 ; NO MODE? BYPASS ENTRY IDE_INIT2A: CALL WRITESTR ; DISPLAY MODE @@ -920,13 +942,13 @@ IDE_PKT_RDSEC: #ENDIF ; SETUP LBA ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -989,13 +1011,13 @@ IDE_PKT_WRSEC: #ENDIF ; SETUP LBA ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -1021,13 +1043,13 @@ IDE_PKT_WRSEC: ; IDE_SETADDR: ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_REG_LBA2-0 @@ -1253,10 +1275,17 @@ IDE_GET16: RET ; IDE_GET16A: - LD C,D ; PORT FOR LSB +#IF (IDE0MODE == IDEMODE_GIDE) ; GENESIS BOARD IS REVERSED + LD C,E ; PORT FOR MSB + INI ; GET IT, SAVE IT, AND DEC B + LD C,D ; PORT FOR LSB + INI ; GET IT, SAVE IT, AND DEC B +#ELSE + LD C,D ; PORT FOR LSB INI ; GET IT, SAVE IT, AND DEC B LD C,E ; PORT FOR MSB INI ; GET IT, SAVE IT, AND DEC B +#ENDIF DEC A JR NZ,IDE_GET16A ; LOOP TILL COUNTER EXHAUSTED RET @@ -1318,11 +1347,18 @@ IDE_PUT16: RET ; IDE_PUT16A: +#IF (IDE0MODE == IDEMODE_GIDE) ; GENESIS BOARD IS REVERSED + LD C,E ; PORT FOR MSB + OUTI ; PUT IT AND DEC B + LD C,D ; PORT FOR LSB + OUTI ; PUT IT AND DEC B +#ELSE LD C,D ; PORT FOR LSB OUTI ; PUT IT AND DEC B LD C,E ; PORT FOR MSB OUTI ; PUT IT AND DEC B DEC A +#ENDIF JR NZ,IDE_PUT16A ; LOOP TILL COUNTER EXHAUSTED RET ; @@ -1990,6 +2026,17 @@ IDE_OUT: EX (SP),HL ; GET PARM POINTER PUSH BC PUSH AF + +#IF (IDE0MODE == IDEMODE_GIDE) ; SET TOP BYTE TO 0 FOR GENESIS BOARD + + LD A,(HL) + LD C,(IY+IDE_DATAHI) + ADD A,C + LD C,A + LD A,0 + OUT (C),A + +#ENDIF LD A,(HL) INC HL LD C,(IY+IDE_IOBASE) @@ -2000,6 +2047,7 @@ IDE_OUT: POP BC EX (SP),HL ; RESTORE STACK RET + ; ;============================================================================= ; ERROR HANDLING AND DIAGNOSTICS @@ -2189,6 +2237,7 @@ IDE_STR_MODE_DIO .TEXT "DIO$" IDE_STR_MODE_DIDE .TEXT "DIDE$" IDE_STR_MODE_MK4 .TEXT "MK4$" IDE_STR_MODE_RC .TEXT "RC$" +IDE_STR_MODE_GIDE .TEXT "GIDE$" ; IDE_STR_TYPEATA .TEXT " ATA$" IDE_STR_TYPEATAPI .TEXT " ATAPI$" diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 9ab0940b..237c6ed4 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -343,13 +343,13 @@ IMM_IO: ; LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,IMM_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; ; SETUP LBA ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index 5eba934a..b7d34401 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -64,6 +64,8 @@ MD_DEVCNT .EQU ($ - MD_CFGTBL) / MD_CFGSIZ ; ; ; + + MD_INIT: #IF (MDFFENABLE) CALL MD_FINIT ; PROBE FLASH CAPABILITY @@ -301,13 +303,13 @@ MD_RW: MD_RW1: PUSH BC ; SAVE COUNTERS ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,MD_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS #IF (MDFFENABLE) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index 28a3bb99..f7d7c6c7 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -830,13 +830,13 @@ PPIDE_PKT_RDSEC: #ENDIF ; SETUP LBA ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -899,13 +899,13 @@ PPIDE_PKT_WRSEC: #ENDIF ; SETUP LBA ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -931,13 +931,13 @@ PPIDE_PKT_WRSEC: ; PPIDE_SETADDR: ; -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_REG_LBA2-0 diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index b00d969d..5e3f9d95 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -125,8 +125,8 @@ SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION SD_OPRDEF .EQU %00000001 ; QUIESCENT STATE SD_OPRMSK .EQU %10000111 ; MASK FOR BITS WE OWN IN RTC LATCH PORT SD_INPREG .EQU RTCIO ; INPUT REGISTER IS RTC -SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT -SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK +SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT +SD_CLK .EQU %00000010 ; RTC:1 IS CLOCK SD_DI .EQU %00000001 ; RTC:0 IS DATA IN (CARD <- CPU) SD_DO .EQU %10000000 ; RTC:7 IS DATA OUT (CARD -> CPU) SD_IOBASE .EQU SD_OPRREG ; IOBASE @@ -235,14 +235,28 @@ SD_DEVMAX .EQU 2 ; NUMBER OF PHYSICAL UNITS (SOCKETS) SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION SD_OPRDEF .EQU %00001100 ; QUIESCENT STATE (/CS1 & /CS2 DEASSERTED) SD_OPRMSK .EQU %00001100 ; MASK FOR BITS WE OWN IN RTC LATCH PORT -SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD -SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD -SD_CNTR .EQU Z180_CNTR -SD_TRDR .EQU Z180_TRDR +SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD +SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD +SD_CNTR .EQU Z180_CNTR +SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS DEVECHO "SC" +RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE +#ENDIF ; +#IF (SDMODE == SDMODE_GM) ; GM +SD_DEVMAX .EQU 2 ; NUMBER OF PHYSICAL UNITS (SOCKETS) +SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION +SD_OPRDEF .EQU %00000100 ; QUIESCENT STATE (/CS1 & /CS2 DEASSERTED) +SD_OPRMSK .EQU %00000100 ; MASK FOR BITS WE OWN IN RTC LATCH PORT +SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD +SD_CS1 .EQU %00000000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD +SD_CNTR .EQU Z180_CNTR +SD_TRDR .EQU Z180_TRDR +SD_IOBASE .EQU SD_OPRREG ; IOBASE +SD_INVCS .EQU TRUE ; INVERT CS + DEVECHO "GM" RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF ; @@ -608,7 +622,7 @@ SD_INIT: CALL PRTHEXBYTE #ENDIF ; -#IF (SDMODE == SDMODE_SC) +#IF ((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) PRTS(" MODE=SC$") #IF (SDCSIOFAST) PRTS(" FAST$") @@ -1132,7 +1146,7 @@ SD_INITCARD1: POP BC ; RESTORE LOOP CONTROL DJNZ SD_INITCARD1 ; LOOP AS NEEDED ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM) | (SDMODE == SDMODE_EPITX)) ; MAKE SURE CSIO IS DONE SENDING DATA CALL SD_WAITTX ; WAIT FOR TE TO CLEAR CALL DLY32 ; WAIT A BIT MORE FOR FINAL BIT @@ -1312,7 +1326,7 @@ SD_INITCARD5: ; HIGH SPEED CSIO OPERATION IS NOW SET AT THE START OF SD_IO ; -;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) ; ; PER SPEC, THE CARD SHOULD NOW BE ABLE TO HANDLE FULL SPEED OPERATION ; ; SO, FOR CSIO OPERATION, WE SET CSIO TO MAXIMUM SPEED ; CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING @@ -1497,11 +1511,11 @@ SD_SETADDR: PUSH AF ; SAVE IT LD A,SD_LBA ; OFFSET OF LBA VALUE CALL LDHLIYA ; HL := IY + A, REG A TRASHED -;;;#IF (DSKYENABLE) -;;; #IF (DSKYDSKACT) +#IF (DSKYENABLE) + #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY -;;; #ENDIF -;;;#ENDIF + #ENDIF +#ENDIF CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED POP AF ; GET CARD TYPE BACK CP SD_TYPESDHC ; IS IT V2 OR BETTER? @@ -1874,7 +1888,7 @@ SD_DONE: PUSH AF LD A,$FF CALL SD_PUT -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) ; MAKE SURE CSIO IS DONE SENDING DATA CALL SD_WAITTX ; WAIT FOR TE TO CLEAR CALL DLY32 ; WAIT A BIT MORE FOR FINAL BIT @@ -1898,14 +1912,14 @@ SD_SETUP: OUT (SD_PPIX),A #ENDIF ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) ; CSIO SETUP FOR Z180 CSIO ; LD A,2 ; DIV 80, 225KHZ @ 18MHZ CLK LD A,6 ; DIV 1280, 14KHZ @ 18MHZ CLK OUT0 (SD_CNTR),A #ENDIF ; -#IF ((SDMODE == SDMODE_JUHA) | (SDMODE == SDMODE_N8) | (SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_SC)) +#IF ((SDMODE == SDMODE_JUHA) | (SDMODE == SDMODE_N8) | (SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) LD A,(HB_RTCVAL) LD (SD_OPRVAL),A OUT (SD_OPRREG),A @@ -2004,11 +2018,11 @@ SD_CHKWP: ; SD_SELECT: ; ; FINISH SENDING BEFORE ASSERTING CS! -;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) ; CALL SD_WAITTX ;#ENDIF ; -#IF ((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_MT) | (SDMODE == SDMODE_FZ80)) +#IF ((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_MT) | (SDMODE == SDMODE_FZ80) | (SDMODE == SDMODE_GM)) LD A,(IY+SD_DEV) ; GET CURRENT DEVICE OR A ; SET FLAGS LD A,(SD_OPRVAL) ; GET CURRENT OPRVAL BACK @@ -2038,9 +2052,9 @@ SD_SELECT1: ; SD_SELECT2: ; ADJUST BIT(S) FOR INTERFACES USING INVERTED CS BITS -;#IF ((SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_UART) | (SDMODE == SDMODE_SC)) +;#IF ((SDMODE == SDMODE_PPI) | (SDMODE == SDMODE_UART) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) #IF (SD_INVCS) - #IF (((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_FZ80)) & (SD_DEVCNT > 1)) + #IF (((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_FZ80) | (SDMODE == SDMODE_GM)) & (SD_DEVCNT > 1)) XOR SD_CS0 | SD_CS1 #ELSE XOR SD_CS0 @@ -2049,7 +2063,7 @@ SD_SELECT2: LD (SD_OPRVAL),A OUT (SD_OPRREG),A ;; -;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC)) +;#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) ; CALL DLY32 ; DELAY FOR FINAL BIT ;#ENDIF ; @@ -2058,7 +2072,7 @@ SD_SELECT2: ; DESELECT CARD ; SD_DESELECT: -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) ; DON'T REMOVE CS UNTIL WE ARE DONE SENDING! CALL SD_WAITTX ; WAIT FOR TE TO CLEAR ; @@ -2077,7 +2091,7 @@ SD_DESELECT: #ENDIF ; LD A,(SD_OPRVAL) -#IF (((SDMODE == SDMODE_SC) | (SDMODE_MT)) & (SD_DEVCNT > 1)) +#IF (((SDMODE == SDMODE_SC) | (SDMODE_MT) | (SDMODE == SDMODE_GM)) & (SD_DEVCNT > 1)) AND ~(SD_CS0 | SD_CS1) #ELSE #IF (SDMODE == SDMODE_EPITX) @@ -2088,7 +2102,7 @@ SD_DESELECT: #ENDIF ; ADJUST BIT(S) FOR INTERFACES USING INVERTED CS BITS #IF (SD_INVCS) - #IF (((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_FZ80)) & (SD_DEVCNT > 1)) + #IF (((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_FZ80) | (SDMODE == SDMODE_GM)) & (SD_DEVCNT > 1)) XOR SD_CS0 | SD_CS1 #ELSE XOR SD_CS0 @@ -2098,7 +2112,7 @@ SD_DESELECT: OUT (SD_OPRREG),A RET ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) ; ; CSIO WAIT FOR TRANSMIT READY (TX REGISTER EMPTY) ; @@ -2140,7 +2154,7 @@ SD_PUT: OUT (SD_WRTR),A #ENDIF ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) CALL MIRROR ; MSB<-->LSB MIRROR BITS, RESULT IN C CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING OUT0 (SD_TRDR),C ; PUT BYTE IN BUFFER @@ -2227,7 +2241,7 @@ SD_GET: IN A,(SD_RDTR) #ENDIF ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING IN0 A,(SD_CNTR) ; GET CSIO STATUS SET 5,A ; START RECEIVER @@ -2331,7 +2345,7 @@ SD_GET1: ; SD_SPD_STD: ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) ; SET CSIO FOR DEFAULT OPERATION PUSH AF ; PRESERVE AF CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING @@ -2346,7 +2360,7 @@ SD_SPD_STD: ; SD_SPD_SLOW: ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) ; SET CSIO FOR DEFAULT OPERATION PUSH AF ; PRESERVE AF CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING @@ -2361,7 +2375,7 @@ SD_SPD_SLOW: ; SD_SPD_FAST: ; -#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) +#IF ((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) ; SET CSIO FOR HIGH SPEED OPERATION PUSH AF ; PRESERVE AF CALL SD_WAITTX ; MAKE SURE WE ARE DONE SENDING @@ -2612,7 +2626,7 @@ SD_DSKBUF .DW 0 ; ADR OF ACTIVE DISK BUFFER ; MSB<-->LSB MIRROR BITS IN A, RESULT IN C ; MIRROR: -#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) & SDCSIOFAST) +#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) & SDCSIOFAST) ; FASTEST BUT USES MOST CODE SPACE LD BC,MIRTAB ; 256 BYTE MIRROR TABLE ADD A,C ; ADD OFFSET @@ -2645,7 +2659,7 @@ MIRROR2: ; ; LOOKUP TABLE TO MIRROR BITS IN A BYTE ; -#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX)) & SDCSIOFAST) +#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4) | (SDMODE == SDMODE_SC) | (SDMODE == SDMODE_EPITX) | (SDMODE == SDMODE_GM)) & SDCSIOFAST) MIRTAB .DB 00H, 80H, 40H, 0C0H, 20H, 0A0H, 60H, 0E0H, 10H, 90H, 50H, 0D0H, 30H, 0B0H, 70H, 0F0H .DB 08H, 88H, 48H, 0C8H, 28H, 0A8H, 68H, 0E8H, 18H, 98H, 58H, 0D8H, 38H, 0B8H, 78H, 0F8H diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index dd1e7f21..5f68199c 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -22,7 +22,7 @@ ; 18. HEATH Les Bird's Heath Z80 Board ; 19. EPITX Alan Cox' Mini-ITX System ; 20. MON Jacques Pelletier's Monsputer -; 21. STDZ180 Genesis Z180 System +; 21. GMZ180 Doug Jacksons' Genesis Z180 System ; 22. NABU NABU w/ Les Bird's RomWBW Option Board ; 23. FZ80 S100 Computers FPGA Z80 ; @@ -194,6 +194,7 @@ IDEMODE_DIO .EQU 1 ; DISKIO V1 IDEMODE_DIDE .EQU 2 ; DUAL IDE IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT ONLY) IDEMODE_RC .EQU 4 ; RCBUS CF MODULE (8 BIT ONLY) +IDEMODE_GIDE .EQU 5 ; GENESIS MODULES STD BUS IDE CONTROLLER ; ; PPIDE MODE SELECTIONS ; @@ -223,6 +224,7 @@ SDMODE_PIO .EQU 11 ; Z80 PIO bitbang SDMODE_Z80R .EQU 12 ; Z80 Retro SDMODE_EPITX .EQU 13 ; Mini ITX Z180 SDMODE_FZ80 .EQU 14 ; S100 FPGA Z80 +SDMODE_GM .EQU 15 ; Genesis SD Driver ; ; AY SOUND CHIP MODE SELECTIONS ; @@ -321,7 +323,6 @@ DMAMODE_VDG .EQU 7 ; VELESOFT DATAGEAR KBDMODE_NONE .EQU 0 KBDMODE_PS2 .EQU 1 ; PS/2 KEYBOARD CONTROLLER KBDMODE_VRC .EQU 2 ; VGARC KEYBOARD CONTROLLER -KBDMODE_FV .EQU 3 ; FPGA VGA KEYBOARD CONTROLLER ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; @@ -493,7 +494,6 @@ KBDENABLE .EQU FALSE ; PS/2 KEYBOARD DRIVER PPKENABLE .EQU FALSE ; PPK KEYBOARD DRIVER MKYENABLE .EQU FALSE ; MSX KEYBOARD DRIVER NABUKBENABLE .EQU FALSE ; NABU KEYBOARD DRIVER -FKBDENABLE .EQU FALSE ; FPGA KEYBOARD DRIVER ; ; VIDEO MODES ; diff --git a/Source/HDIAG/hdsk.asm b/Source/HDIAG/hdsk.asm new file mode 100644 index 00000000..6dfc426f --- /dev/null +++ b/Source/HDIAG/hdsk.asm @@ -0,0 +1,449 @@ +; +;================================================================================================== +; HDSK DISK DRIVER +;================================================================================================== +; +; IO PORT ADDRESSES +; +HDSK_IO .EQU $FD +; +HDSK_CMDNONE .EQU 0 +HDSK_CMDRESET .EQU 1 +HDSK_CMDREAD .EQU 2 +HDSK_CMDWRITE .EQU 3 +HDSK_CMDPARAM .EQU 4 +; +; HDSK DEVICE CONFIGURATION +; +HDSK_DEVCNT .EQU 2 ; NUMBER OF HDSK DEVICES SUPPORTED +HDSK_CFGSIZ .EQU 6 ; SIZE OF CFG TBL ENTRIES +; +HDSK_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) +HDSK_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) +HDSK_LBA .EQU 2 ; OFFSET OF LBA (DWORD) +; + DEVECHO "HDSK: IO=" + DEVECHO HDSK_IO + DEVECHO ", DEVICE COUNT=" + DEVECHO HDSK_DEVCNT + DEVECHO "\n" +; +HDSK_CFGTBL: + ; DEVICE 0 + .DB 0 ; DRIVER DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DW 0,0 ; CURRENT LBA +#IF (HDSK_DEVCNT >= 2) + ; DEVICE 1 + .DB 1 ; DEVICE NUMBER + .DB 0 ; DEVICE STATUS + .DW 0,0 ; CURRENT LBA +#ENDIF +; +#IF ($ - HDSK_CFGTBL) != (HDSK_DEVCNT * HDSK_CFGSIZ) + .ECHO "*** INVALID HDSK CONFIG TABLE ***\n" +#ENDIF +; + .DB $FF ; END MARKER +; +; STATUS +; +HDSK_STOK .EQU 0 ; OK +HDSK_STNOTRDY .EQU -1 ; NOT READY +; +; +; +HDSK_INIT: + CALL NEWLINE ; FORMATTING + PRTS("HDSK:$") + PRTS(" DEVICES=$") + LD A,HDSK_DEVCNT + CALL PRTDECB +; +; SETUP THE DISPATCH TABLE ENTRIES +; + XOR A ; ZERO ACCUM + LD (HDSK_CURDEV),A ; INIT CURRENT DEVICE NUM + LD IY,HDSK_CFGTBL ; START OF DEV CFG TABLE +HDSK_INIT0: + CALL HDSK_PROBE ; HARDWARE PROBE + JR NZ,HDSK_INIT1 ; SKIP DEVICE IF NOT PRESENT + LD BC,HDSK_FNTBL ; BC := DRIVER FUNC TABLE ADDRESS + PUSH IY ; CFG ENTRY POINTER + POP DE ; ... TO DE + CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK TABLE + CALL HDSK_INITDEV ; PERFORM DEVICE INITIALIZATION +HDSK_INIT1: + LD BC,HDSK_CFGSIZ ; SIZE OF CFG ENTRY + ADD IY,BC ; BUMP IY TO NEXT ENTRY + LD HL,HDSK_CURDEV ; POINT TO CURRENT DEVICE + INC (HL) ; AND INCREMENT IT + LD A,(IY) ; GET FIRST BYTE OF ENTRY + INC A ; TEST FOR END OF TABLE ($FF) + JR NZ,HDSK_INIT0 ; IF NOT, LOOP +; + XOR A ; INIT SUCCEEDED + RET ; RETURN +; +; PROBE FOR DEVICE EXISTENCE +; +HDSK_PROBE: + XOR A ; SIGNAL SUCCESS + RET ; AND DONE +; +; INITIALIZE DEVICE +; +HDSK_INITDEV: + LD (IY+HDSK_STAT),HDSK_STNOTRDY ; STATUS := NOT READY + XOR A ; CLEAR ACCUM + LD (IY+HDSK_LBA+0),A ; ZERO LBA + LD (IY+HDSK_LBA+1),A ; ... + LD (IY+HDSK_LBA+2),A ; ... + LD (IY+HDSK_LBA+3),A ; ... + XOR A ; SIGNAL SUCCESS (REDUNDANT) + RET ; AND DONE +; +; DRIVER FUNCTION TABLE +; +HDSK_FNTBL: + .DW HDSK_STATUS + .DW HDSK_RESET + .DW HDSK_SEEK + .DW HDSK_READ + .DW HDSK_WRITE + .DW HDSK_VERIFY + .DW HDSK_FORMAT + .DW HDSK_DEVICE + .DW HDSK_MEDIA + .DW HDSK_DEFMED + .DW HDSK_CAP + .DW HDSK_GEOM +#IF (($ - HDSK_FNTBL) != (DIO_FNCNT * 2)) + .ECHO "*** INVALID HDSK FUNCTION TABLE ***\n" +#ENDIF +; +; +; +HDSK_VERIFY: +HDSK_FORMAT: +HDSK_DEFMED: + SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION + RET +; +; +; +HDSK_STATUS: + LD A,(IY+HDSK_STAT) ; LOAD STATUS + OR A ; SET FLAGS + RET +; +; +; +HDSK_RESET: + JP HDSK_DSKRESET +; +; GET DISK CAPACITY +; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE +; ASSUME 1GB MEDIA SIZE, SO 1GB / 512B +; IS $200000 SECTORS +; +HDSK_CAP: + LD DE,$20 ; BLOCK COUNT MSW + LD HL,0 ; BLOCK COUNT LSW + LD BC,512 ; 512 BYTE SECTOR + XOR A ; SIGNAL SUCCESS + RET +; +; +; +HDSK_GEOM: + ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS + ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE + CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC + LD L,H ; DIVIDE BY 256 FOR # TRACKS + LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL + LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT + LD E,16 ; SECTORS / TRACK = 16 + XOR A ; SIGNAL SUCCESS + RET +; +; +; +HDSK_DEVICE: + LD D,DIODEV_HDSK ; D := DEVICE TYPE + LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER + LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK + LD H,0 ; H := 0, DRIVER HAS NO MODES + LD L,HDSK_IO ; L := BASE I/O ADDRESS + XOR A ; SIGNAL SUCCESS + RET +; +; +; +HDSK_MEDIA: + LD E,MID_HD ; HARD DISK MEDIA + LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE + XOR A ; SIGNAL SUCCESS + RET +; +; +; +HDSK_SEEK: + BIT 7,D ; CHECK FOR LBA FLAG + CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA + RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) + LD (IY+HDSK_LBA+0),L ; SAVE NEW LBA + LD (IY+HDSK_LBA+1),H ; ... + LD (IY+HDSK_LBA+2),E ; ... + LD (IY+HDSK_LBA+3),D ; ... + XOR A ; SIGNAL SUCCESS + RET ; AND RETURN +; +; +; +HDSK_READ: + CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR + LD A,HDSK_CMDREAD + JR HDSK_RW +; +; +; +HDSK_WRITE: + CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR + LD A,HDSK_CMDWRITE + JR HDSK_RW +; +; +; +HDSK_RW: + LD (HDSK_CMD),A ; SET COMMAND BYTE + LD (HDSK_DMA),HL ; SAVE INITIAL DMA + LD A,E ; SECTOR COUNT TO A + OR A ; SET FLAGS + RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 + LD B,A ; INIT SECTOR DOWNCOUNTER + LD C,0 ; INIT SECTOR READ/WRITE COUNT + LD A,(IY+HDSK_DEV) ; GET DEVICE NUMBER + LD (HDSK_DRV),A ; ... AND SET FIELD IN HDSK PARM BLOCK + + ; RESET HDSK INTERFACE IF NEEDED + LD A,(IY+HDSK_STAT) ; GET CURRENT STATUS + OR A ; SET FLAGS + PUSH BC ; SAVE COUNTERS + CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY + POP BC ; RESTORE COUNTERS + JR NZ,HDSK_RW6 ; ABORT ON FAILURE + +HDSK_RW0: + PUSH BC ; SAVE COUNTERS + XOR A ; A = 0 + LD (HDSK_RC),A ; CLEAR RETURN CODE +; +#IF (DSKYENABLE) + #IF (DSKYDSKACT) + LD A,HDSK_LBA + CALL LDHLIYA + CALL HB_DSKACT ; SHOW ACTIVITY + #ENDIF +#ENDIF +; + ; CONVERT LBA HHHH:LLLL (4 BYTES) + ; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) + ; SAVING TO HDSK PARM BLOCK + ; (IY+HDSK_LBA+0) ==> (HDSK_SEC) + LD A,(IY+HDSK_LBA+0) + LD (HDSK_SEC),A + ; (IY+HDSK_LBA+1) ==> (HDSK_TRK+0) + LD A,(IY+HDSK_LBA+1) + LD (HDSK_TRK+0),A + ; (IY+HDSK_LBA+2) ==> (HDSK_TRK+1) + LD A,(IY+HDSK_LBA+2) + LD (HDSK_TRK+1),A + + ; EXECUTE COMMAND + LD B,7 ; SIZE OF PARAMETER BLOCK + LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK + LD C,$FD ; HDSK CMD PORT + OTIR ; SEND IT + + ; GET RESULT + IN A,(C) ; GET RESULT CODE + LD (HDSK_RC),A ; SAVE IT + OR A ; SET FLAGS + +#IF (HDSKTRACE > 0) + PUSH AF ; SAVE RETURN CODE +#IF (HDSKTRACE == 1) + CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY +#ENDIF +#IF (HDSKTRACE >= 2) + CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS +#ENDIF + POP AF ; RESTORE RETURN CODE +#ENDIF + + JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR + + ; INCREMENT LBA + LD A,HDSK_LBA ; LBA OFFSET IN CFG ENTRY + CALL LDHLIYA ; HL := IY + A, REG A TRASHED + CALL INC32HL ; INCREMENT THE VALUE + + ; INCREMENT DMA + LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA + INC (HL) ; BUMP DMA BY + INC (HL) ; ... 512 BYTES + + XOR A ; A := 0 SIGNALS SUCCESS + +HDSK_RW5: + POP BC ; RECOVER COUNTERS + JR NZ,HDSK_RW6 ; IF ERROR, GET OUT + + INC C ; RECORD SECTOR COMPLETED + DJNZ HDSK_RW0 ; LOOP AS NEEDED + +HDSK_RW6: + ; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL + LD E,C ; SECTOR READ COUNT TO E + LD HL,(HDSK_DMA) ; CURRENT DMA TO HL + OR A ; SET FLAGS BASED ON RETURN CODE + RET Z ; RETURN IF SUCCESS + LD A,ERR_IO ; SIGNAL IO ERROR + OR A ; SET FLAGS + RET ; AND DONE +; +; +; +HDSK_DSKRESET: +; +#IF (HDSKTRACE >= 2) + CALL NEWLINE + LD DE,HDSKSTR_PREFIX + CALL WRITESTR + CALL PC_SPACE + LD DE,HDSKSTR_RESET + CALL WRITESTR +#ENDIF +; + LD B,32 + LD A,HDSK_CMDRESET +HDSK_DSKRESET1: + OUT ($FD),A + DJNZ HDSK_DSKRESET1 + + XOR A ; STATUS = OK + LD (IY+HDSK_STAT),A ; SAVE IT + + RET +; +; +; +HDSK_PRT: + CALL NEWLINE + + LD DE,HDSKSTR_PREFIX + CALL WRITESTR + + CALL PC_SPACE + LD DE,HDSKSTR_CMD + CALL WRITESTR + LD A,(HDSK_CMD) + CALL PRTHEXBYTE + + CALL PC_SPACE + CALL PC_LBKT + LD A,(HDSK_CMD) + LD DE,HDSKSTR_NONE + CP HDSK_CMDNONE + JP Z,HDSK_PRTCMD + LD DE,HDSKSTR_RESET + CP HDSK_CMDRESET + JP Z,HDSK_PRTCMD + LD DE,HDSKSTR_READ + CP HDSK_CMDREAD + JP Z,HDSK_PRTCMD + LD DE,HDSKSTR_WRITE + CP HDSK_CMDWRITE + JP Z,HDSK_PRTCMD + LD DE,HDSKSTR_PARAM + CP HDSK_CMDPARAM + JP Z,HDSK_PRTCMD + LD DE,HDSKSTR_UNKCMD +HDSK_PRTCMD: + CALL WRITESTR + CALL PC_RBKT + + LD A,(HDSK_CMD) + CP HDSK_CMDREAD + JR Z,HDSK_PRTRW + CP HDSK_CMDWRITE + JR Z,HDSK_PRTRW + RET + +HDSK_PRTRW: + CALL PC_SPACE + LD A,(HDSK_DRV) + CALL PRTHEXBYTE + CALL PC_SPACE + LD BC,(HDSK_TRK) + CALL PRTHEXWORD + CALL PC_SPACE + LD A,(HDSK_SEC) + CALL PRTHEXBYTE + CALL PC_SPACE + LD BC,(HDSK_DMA) + CALL PRTHEXWORD + + CALL PC_SPACE + LD DE,HDSKSTR_ARROW + CALL WRITESTR + + CALL PC_SPACE + LD DE,HDSKSTR_RC + CALL WRITESTR + LD A,(HDSK_RC) + CALL PRTHEXBYTE + + CALL PC_SPACE + CALL PC_LBKT + LD A,(HDSK_RC) + LD DE,HDSKSTR_STOK + CP HDSK_STOK + JP Z,HDSK_PRTRC + LD DE,HDSKSTR_STUNK + +HDSK_PRTRC: + CALL WRITESTR + CALL PC_RBKT + + RET +; +; +; +HDSKSTR_PREFIX .TEXT "HDSK:$" +HDSKSTR_CMD .TEXT "CMD=$" +HDSKSTR_RC .TEXT "RC=$" +HDSKSTR_ARROW .TEXT "-->$" +HDSKSTR_NONE .TEXT "NONE$" +HDSKSTR_RESET .TEXT "RESET$" +HDSKSTR_READ .TEXT "READ$" +HDSKSTR_WRITE .TEXT "WRITE$" +HDSKSTR_PARAM .TEXT "PARAM$" +HDSKSTR_UNKCMD .TEXT "UNKCMD$" +HDSKSTR_STOK .TEXT "OK$" +HDSKSTR_STUNK .TEXT "UNKNOWN ERROR$" +; +;================================================================================================== +; HDSK DISK DRIVER - DATA +;================================================================================================== +; +HDSK_RC .DB 0 ; CURRENT RETURN CODE +HDSK_CURDEV .DB 0 ; CURRENT DEVICE NUMBER +; +HDSK_PARMBLK: +HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) +HDSK_DRV .DB 0 ; 0..7, HDSK DRIVE NUMBER +HDSK_SEC .DB 0 ; 0..255 SECTOR +HDSK_TRK .DW 0 ; 0..2047 TRACK +HDSK_DMA .DW 0 ; ADDRESS FOR SECTOR DATA EXCHANGE From 673f4358b2fc70a739d6c7a34ffd4405acd026e0 Mon Sep 17 00:00:00 2001 From: drj113 Date: Wed, 4 Sep 2024 11:16:45 +1000 Subject: [PATCH 4/8] Rectified GM configuration to support current hbios.asm Re-added commented out code in the various disk drivers now that I am using the correct hbios.asm file --- Source/HBIOS/cfg_gmz180.asm | 1 + Source/HBIOS/imm.asm | 8 ++++---- Source/HBIOS/md.asm | 8 ++++---- Source/HBIOS/ppide.asm | 24 ++++++++++++------------ Source/HBIOS/sd.asm | 8 ++++---- 5 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Source/HBIOS/cfg_gmz180.asm b/Source/HBIOS/cfg_gmz180.asm index ee5ecc24..0b30c192 100644 --- a/Source/HBIOS/cfg_gmz180.asm +++ b/Source/HBIOS/cfg_gmz180.asm @@ -217,6 +217,7 @@ VGAENABLE .EQU FALSE ; VGA: ENABLE VGA VIDEO/KBD DRIVER (VGA.ASM) VRCENABLE .EQU FALSE ; VRC: ENABLE VGARC VIDEO/KBD DRIVER (VRC.ASM) SCONENABLE .EQU FALSE ; SCON: ENABLE S100 CONSOLE DRIVER (SCON.ASM) EFENABLE .EQU FALSE ; EF: ENABLE EF9345 VIDEO DRIVER (EF.ASM) +FVENABLE .EQU FALSE ; FV: ENABLE FPGA VGA VIDEO DRIVER (FV.ASM) ; MDENABLE .EQU TRUE ; MD: ENABLE MEMORY (ROM/RAM) DISK DRIVER (MD.ASM) MDROM .EQU TRUE ; MD: ENABLE ROM DISK diff --git a/Source/HBIOS/imm.asm b/Source/HBIOS/imm.asm index 237c6ed4..5999e79f 100644 --- a/Source/HBIOS/imm.asm +++ b/Source/HBIOS/imm.asm @@ -343,13 +343,13 @@ IMM_IO: ; LD (IMM_DSKBUF),HL ; SAVE DISK BUFFER ADDRESS ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IMM_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; SETUP LBA ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN diff --git a/Source/HBIOS/md.asm b/Source/HBIOS/md.asm index b7d34401..e7e7fcea 100644 --- a/Source/HBIOS/md.asm +++ b/Source/HBIOS/md.asm @@ -303,13 +303,13 @@ MD_RW: MD_RW1: PUSH BC ; SAVE COUNTERS ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,MD_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; LD HL,(MD_RWFNADR) ; GET PENDING IO FUNCTION ADDRESS #IF (MDFFENABLE) diff --git a/Source/HBIOS/ppide.asm b/Source/HBIOS/ppide.asm index f7d7c6c7..28a3bb99 100644 --- a/Source/HBIOS/ppide.asm +++ b/Source/HBIOS/ppide.asm @@ -830,13 +830,13 @@ PPIDE_PKT_RDSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -899,13 +899,13 @@ PPIDE_PKT_WRSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,PPIDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -931,13 +931,13 @@ PPIDE_PKT_WRSEC: ; PPIDE_SETADDR: ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,PPIDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_REG_LBA2-0 diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 5e3f9d95..4865ed3f 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -1511,11 +1511,11 @@ SD_SETADDR: PUSH AF ; SAVE IT LD A,SD_LBA ; OFFSET OF LBA VALUE CALL LDHLIYA ; HL := IY + A, REG A TRASHED -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED POP AF ; GET CARD TYPE BACK CP SD_TYPESDHC ; IS IT V2 OR BETTER? From 2fd65ab4b03c28bc09af4a0c6ccee53ab267d752 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 4 Sep 2024 11:25:41 -0700 Subject: [PATCH 5/8] Miscellaneous - Cosmetic updates - Fix fv.asm keyboard status function - Bump version number --- Source/HBIOS/Build.cmd | 1 + Source/HBIOS/Build.sh | 2 +- Source/HBIOS/fv.asm | 1 + Source/HBIOS/hbios.inc | 1 + Source/HBIOS/ide.asm | 44 ++-- Source/HBIOS/sd.asm | 20 +- Source/HBIOS/std.asm | 8 +- Source/HDIAG/hdsk.asm | 449 ----------------------------------------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 10 files changed, 42 insertions(+), 488 deletions(-) delete mode 100644 Source/HDIAG/hdsk.asm diff --git a/Source/HBIOS/Build.cmd b/Source/HBIOS/Build.cmd index d04ba589..35162fd4 100644 --- a/Source/HBIOS/Build.cmd +++ b/Source/HBIOS/Build.cmd @@ -232,6 +232,7 @@ call Build SCZ180 sc131_std || exit /b call Build SCZ180 sc140_std || exit /b call Build SCZ180 sc503_std || exit /b call Build SCZ180 sc700_std || exit /b +call Build GMZ180 std || exit /b call Build DYNO std || exit /b call Build RPH std || exit /b call Build Z80RETRO std || exit /b diff --git a/Source/HBIOS/Build.sh b/Source/HBIOS/Build.sh index cd9c06b2..98c763d4 100755 --- a/Source/HBIOS/Build.sh +++ b/Source/HBIOS/Build.sh @@ -40,6 +40,7 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc140_std"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc503_std"; bash Build.sh ROM_PLATFORM="SCZ180"; ROM_CONFIG="sc700_std"; bash Build.sh + ROM_PLATFORM="GMZ180"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="DYNO"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="RPH"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="Z80RETRO"; ROM_CONFIG="std"; bash Build.sh @@ -51,7 +52,6 @@ if [ "${ROM_PLATFORM}" == "dist" ] ; then ROM_PLATFORM="NABU"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="FZ80"; ROM_CONFIG="std"; bash Build.sh ROM_PLATFORM="UNA"; ROM_CONFIG="std"; bash Build.sh - ROM_PLATFORM="GMZ180"; ROM_CONFIG="std"; bash Build.sh exit fi diff --git a/Source/HBIOS/fv.asm b/Source/HBIOS/fv.asm index 0c7b6cc5..57041386 100644 --- a/Source/HBIOS/fv.asm +++ b/Source/HBIOS/fv.asm @@ -226,6 +226,7 @@ FV_STAT: IN A,(FV_KBDST) ; GET STATUS AND $01 ; ISOLATE DATA WAITING BIT JP Z,CIO_IDLE ; NO DATA, EXIT VIA IDLE PROCESS + RET FV_FLUSH: XOR A ; SIGNAL SUCCESS diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index f1a42802..b04d610f 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -377,6 +377,7 @@ VDADEV_TMS .EQU $03 ; N8 ONBOARD VDA SUBSYSTEM - TMS 9918 VDADEV_VGA .EQU $04 ; ECB VGA3 - HITACHI HD6445 VDADEV_VRC .EQU $05 ; VGARC VDADEV_EF .EQU $06 ; EF9345 +VDADEV_FV .EQU $07 ; S100 FPGA VGA ; ; SOUND DEVICE IDS ; diff --git a/Source/HBIOS/ide.asm b/Source/HBIOS/ide.asm index 0730636d..5cc77a0d 100644 --- a/Source/HBIOS/ide.asm +++ b/Source/HBIOS/ide.asm @@ -18,7 +18,7 @@ ; MK4 $80 N/A N/A ; RC $10 N/A N/A ; SMB $E0 N/A N/A -; GIDE $20 $20 $28 - Genesis IDE controller - Note Read Hi Low - Write - Low High +; GIDE $20 $20 $28 - Genesis IDE controller - Note Read Hi Low - Write - Low High ; ; +-----------------------------------------------------------------------+ ; | CONTROL BLOCK REGISTERS | @@ -510,7 +510,7 @@ IDE_INIT2: LD DE,IDE_STR_MODE_RC ; MODE LABEL CP IDEMODE_RC ; TEST FOR MODE JR Z,IDE_INIT2A ; IF SO, DISPLAY IT - LD DE,IDE_STR_MODE_GIDE ; MODE LABEL + LD DE,IDE_STR_MODE_GIDE ; MODE LABEL CP IDEMODE_GIDE ; TEST FOR MODE JR Z,IDE_INIT2A ; IF SO, DISPLAY IT JR IDE_INIT4 ; NO MODE? BYPASS ENTRY @@ -942,13 +942,13 @@ IDE_PKT_RDSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -1011,13 +1011,13 @@ IDE_PKT_WRSEC: #ENDIF ; SETUP LBA ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; ; 3 BYTES, LITTLE ENDIAN -> BIG ENDIAN LD HL,IDE_PKTCMD_RW10+3 ; START OF LBA FIELD IN CDB (MSB) @@ -1043,13 +1043,13 @@ IDE_PKT_WRSEC: ; IDE_SETADDR: ; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) +;;;#IF (DSKYENABLE) +;;; #IF (DSKYDSKACT) LD A,IDE_LBA CALL LDHLIYA CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF +;;; #ENDIF +;;;#ENDIF ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; IDE_REG_LBA3 HAS ALREADY BEEN SET ; HSTLBA2-0 --> IDE_REG_LBA2-0 @@ -1275,13 +1275,13 @@ IDE_GET16: RET ; IDE_GET16A: -#IF (IDE0MODE == IDEMODE_GIDE) ; GENESIS BOARD IS REVERSED +#IF (IDE0MODE == IDEMODE_GIDE) ; GENESIS BOARD IS REVERSED LD C,E ; PORT FOR MSB INI ; GET IT, SAVE IT, AND DEC B - LD C,D ; PORT FOR LSB + LD C,D ; PORT FOR LSB INI ; GET IT, SAVE IT, AND DEC B #ELSE - LD C,D ; PORT FOR LSB + LD C,D ; PORT FOR LSB INI ; GET IT, SAVE IT, AND DEC B LD C,E ; PORT FOR MSB INI ; GET IT, SAVE IT, AND DEC B @@ -1347,7 +1347,7 @@ IDE_PUT16: RET ; IDE_PUT16A: -#IF (IDE0MODE == IDEMODE_GIDE) ; GENESIS BOARD IS REVERSED +#IF (IDE0MODE == IDEMODE_GIDE) ; GENESIS BOARD IS REVERSED LD C,E ; PORT FOR MSB OUTI ; PUT IT AND DEC B LD C,D ; PORT FOR LSB @@ -2026,17 +2026,16 @@ IDE_OUT: EX (SP),HL ; GET PARM POINTER PUSH BC PUSH AF - +; #IF (IDE0MODE == IDEMODE_GIDE) ; SET TOP BYTE TO 0 FOR GENESIS BOARD - LD A,(HL) LD C,(IY+IDE_DATAHI) ADD A,C LD C,A LD A,0 OUT (C),A - #ENDIF +; LD A,(HL) INC HL LD C,(IY+IDE_IOBASE) @@ -2047,7 +2046,6 @@ IDE_OUT: POP BC EX (SP),HL ; RESTORE STACK RET - ; ;============================================================================= ; ERROR HANDLING AND DIAGNOSTICS @@ -2237,7 +2235,7 @@ IDE_STR_MODE_DIO .TEXT "DIO$" IDE_STR_MODE_DIDE .TEXT "DIDE$" IDE_STR_MODE_MK4 .TEXT "MK4$" IDE_STR_MODE_RC .TEXT "RC$" -IDE_STR_MODE_GIDE .TEXT "GIDE$" +IDE_STR_MODE_GIDE .TEXT "GIDE$" ; IDE_STR_TYPEATA .TEXT " ATA$" IDE_STR_TYPEATAPI .TEXT " ATAPI$" diff --git a/Source/HBIOS/sd.asm b/Source/HBIOS/sd.asm index 4865ed3f..3873e36e 100644 --- a/Source/HBIOS/sd.asm +++ b/Source/HBIOS/sd.asm @@ -235,25 +235,25 @@ SD_DEVMAX .EQU 2 ; NUMBER OF PHYSICAL UNITS (SOCKETS) SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION SD_OPRDEF .EQU %00001100 ; QUIESCENT STATE (/CS1 & /CS2 DEASSERTED) SD_OPRMSK .EQU %00001100 ; MASK FOR BITS WE OWN IN RTC LATCH PORT -SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD -SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD -SD_CNTR .EQU Z180_CNTR -SD_TRDR .EQU Z180_TRDR +SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD +SD_CS1 .EQU %00001000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD +SD_CNTR .EQU Z180_CNTR +SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS DEVECHO "SC" RTCDEF .SET RTCDEF | SD_OPRDEF ; SET DEFAULT IN HBIOS MAINLINE #ENDIF ; -#IF (SDMODE == SDMODE_GM) ; GM +#IF (SDMODE == SDMODE_GM) ; GM SD_DEVMAX .EQU 2 ; NUMBER OF PHYSICAL UNITS (SOCKETS) SD_OPRREG .EQU RTCIO ; USES RTC LATCHES FOR OPERATION SD_OPRDEF .EQU %00000100 ; QUIESCENT STATE (/CS1 & /CS2 DEASSERTED) SD_OPRMSK .EQU %00000100 ; MASK FOR BITS WE OWN IN RTC LATCH PORT -SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD -SD_CS1 .EQU %00000000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD -SD_CNTR .EQU Z180_CNTR -SD_TRDR .EQU Z180_TRDR +SD_CS0 .EQU %00000100 ; RTC:2 IS SELECT FOR PRIMARY SPI CARD +SD_CS1 .EQU %00000000 ; RTC:3 IS SELECT FOR SECONDARY SPI CARD +SD_CNTR .EQU Z180_CNTR +SD_TRDR .EQU Z180_TRDR SD_IOBASE .EQU SD_OPRREG ; IOBASE SD_INVCS .EQU TRUE ; INVERT CS DEVECHO "GM" @@ -622,7 +622,7 @@ SD_INIT: CALL PRTHEXBYTE #ENDIF ; -#IF ((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) +#IF ((SDMODE == SDMODE_SC) | (SDMODE == SDMODE_GM)) PRTS(" MODE=SC$") #IF (SDCSIOFAST) PRTS(" FAST$") diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 5f68199c..95bc15bf 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -22,7 +22,7 @@ ; 18. HEATH Les Bird's Heath Z80 Board ; 19. EPITX Alan Cox' Mini-ITX System ; 20. MON Jacques Pelletier's Monsputer -; 21. GMZ180 Doug Jacksons' Genesis Z180 System +; 21. GMZ180 Doug Jacksons' Genesis Z180 System ; 22. NABU NABU w/ Les Bird's RomWBW Option Board ; 23. FZ80 S100 Computers FPGA Z80 ; @@ -194,7 +194,7 @@ IDEMODE_DIO .EQU 1 ; DISKIO V1 IDEMODE_DIDE .EQU 2 ; DUAL IDE IDEMODE_MK4 .EQU 3 ; MARK IV ONBOARD IDE (8 BIT ONLY) IDEMODE_RC .EQU 4 ; RCBUS CF MODULE (8 BIT ONLY) -IDEMODE_GIDE .EQU 5 ; GENESIS MODULES STD BUS IDE CONTROLLER +IDEMODE_GIDE .EQU 5 ; GENESIS MODULES STD BUS IDE CONTROLLER ; ; PPIDE MODE SELECTIONS ; @@ -224,7 +224,7 @@ SDMODE_PIO .EQU 11 ; Z80 PIO bitbang SDMODE_Z80R .EQU 12 ; Z80 Retro SDMODE_EPITX .EQU 13 ; Mini ITX Z180 SDMODE_FZ80 .EQU 14 ; S100 FPGA Z80 -SDMODE_GM .EQU 15 ; Genesis SD Driver +SDMODE_GM .EQU 15 ; Genesis SD Driver ; ; AY SOUND CHIP MODE SELECTIONS ; @@ -323,6 +323,7 @@ DMAMODE_VDG .EQU 7 ; VELESOFT DATAGEAR KBDMODE_NONE .EQU 0 KBDMODE_PS2 .EQU 1 ; PS/2 KEYBOARD CONTROLLER KBDMODE_VRC .EQU 2 ; VGARC KEYBOARD CONTROLLER +KBDMODE_FV .EQU 3 ; FPGA VGA KEYBOARD CONTROLLER ; ; SERIAL DEVICE CONFIGURATION CONSTANTS ; @@ -494,6 +495,7 @@ KBDENABLE .EQU FALSE ; PS/2 KEYBOARD DRIVER PPKENABLE .EQU FALSE ; PPK KEYBOARD DRIVER MKYENABLE .EQU FALSE ; MSX KEYBOARD DRIVER NABUKBENABLE .EQU FALSE ; NABU KEYBOARD DRIVER +FVKBDENABLE .EQU FALSE ; FPGA KEYBOARD DRIVER ; ; VIDEO MODES ; diff --git a/Source/HDIAG/hdsk.asm b/Source/HDIAG/hdsk.asm deleted file mode 100644 index 6dfc426f..00000000 --- a/Source/HDIAG/hdsk.asm +++ /dev/null @@ -1,449 +0,0 @@ -; -;================================================================================================== -; HDSK DISK DRIVER -;================================================================================================== -; -; IO PORT ADDRESSES -; -HDSK_IO .EQU $FD -; -HDSK_CMDNONE .EQU 0 -HDSK_CMDRESET .EQU 1 -HDSK_CMDREAD .EQU 2 -HDSK_CMDWRITE .EQU 3 -HDSK_CMDPARAM .EQU 4 -; -; HDSK DEVICE CONFIGURATION -; -HDSK_DEVCNT .EQU 2 ; NUMBER OF HDSK DEVICES SUPPORTED -HDSK_CFGSIZ .EQU 6 ; SIZE OF CFG TBL ENTRIES -; -HDSK_DEV .EQU 0 ; OFFSET OF DEVICE NUMBER (BYTE) -HDSK_STAT .EQU 1 ; OFFSET OF STATUS (BYTE) -HDSK_LBA .EQU 2 ; OFFSET OF LBA (DWORD) -; - DEVECHO "HDSK: IO=" - DEVECHO HDSK_IO - DEVECHO ", DEVICE COUNT=" - DEVECHO HDSK_DEVCNT - DEVECHO "\n" -; -HDSK_CFGTBL: - ; DEVICE 0 - .DB 0 ; DRIVER DEVICE NUMBER - .DB 0 ; DEVICE STATUS - .DW 0,0 ; CURRENT LBA -#IF (HDSK_DEVCNT >= 2) - ; DEVICE 1 - .DB 1 ; DEVICE NUMBER - .DB 0 ; DEVICE STATUS - .DW 0,0 ; CURRENT LBA -#ENDIF -; -#IF ($ - HDSK_CFGTBL) != (HDSK_DEVCNT * HDSK_CFGSIZ) - .ECHO "*** INVALID HDSK CONFIG TABLE ***\n" -#ENDIF -; - .DB $FF ; END MARKER -; -; STATUS -; -HDSK_STOK .EQU 0 ; OK -HDSK_STNOTRDY .EQU -1 ; NOT READY -; -; -; -HDSK_INIT: - CALL NEWLINE ; FORMATTING - PRTS("HDSK:$") - PRTS(" DEVICES=$") - LD A,HDSK_DEVCNT - CALL PRTDECB -; -; SETUP THE DISPATCH TABLE ENTRIES -; - XOR A ; ZERO ACCUM - LD (HDSK_CURDEV),A ; INIT CURRENT DEVICE NUM - LD IY,HDSK_CFGTBL ; START OF DEV CFG TABLE -HDSK_INIT0: - CALL HDSK_PROBE ; HARDWARE PROBE - JR NZ,HDSK_INIT1 ; SKIP DEVICE IF NOT PRESENT - LD BC,HDSK_FNTBL ; BC := DRIVER FUNC TABLE ADDRESS - PUSH IY ; CFG ENTRY POINTER - POP DE ; ... TO DE - CALL DIO_ADDENT ; ADD ENTRY TO GLOBAL DISK TABLE - CALL HDSK_INITDEV ; PERFORM DEVICE INITIALIZATION -HDSK_INIT1: - LD BC,HDSK_CFGSIZ ; SIZE OF CFG ENTRY - ADD IY,BC ; BUMP IY TO NEXT ENTRY - LD HL,HDSK_CURDEV ; POINT TO CURRENT DEVICE - INC (HL) ; AND INCREMENT IT - LD A,(IY) ; GET FIRST BYTE OF ENTRY - INC A ; TEST FOR END OF TABLE ($FF) - JR NZ,HDSK_INIT0 ; IF NOT, LOOP -; - XOR A ; INIT SUCCEEDED - RET ; RETURN -; -; PROBE FOR DEVICE EXISTENCE -; -HDSK_PROBE: - XOR A ; SIGNAL SUCCESS - RET ; AND DONE -; -; INITIALIZE DEVICE -; -HDSK_INITDEV: - LD (IY+HDSK_STAT),HDSK_STNOTRDY ; STATUS := NOT READY - XOR A ; CLEAR ACCUM - LD (IY+HDSK_LBA+0),A ; ZERO LBA - LD (IY+HDSK_LBA+1),A ; ... - LD (IY+HDSK_LBA+2),A ; ... - LD (IY+HDSK_LBA+3),A ; ... - XOR A ; SIGNAL SUCCESS (REDUNDANT) - RET ; AND DONE -; -; DRIVER FUNCTION TABLE -; -HDSK_FNTBL: - .DW HDSK_STATUS - .DW HDSK_RESET - .DW HDSK_SEEK - .DW HDSK_READ - .DW HDSK_WRITE - .DW HDSK_VERIFY - .DW HDSK_FORMAT - .DW HDSK_DEVICE - .DW HDSK_MEDIA - .DW HDSK_DEFMED - .DW HDSK_CAP - .DW HDSK_GEOM -#IF (($ - HDSK_FNTBL) != (DIO_FNCNT * 2)) - .ECHO "*** INVALID HDSK FUNCTION TABLE ***\n" -#ENDIF -; -; -; -HDSK_VERIFY: -HDSK_FORMAT: -HDSK_DEFMED: - SYSCHKERR(ERR_NOTIMPL) ; INVALID SUB-FUNCTION - RET -; -; -; -HDSK_STATUS: - LD A,(IY+HDSK_STAT) ; LOAD STATUS - OR A ; SET FLAGS - RET -; -; -; -HDSK_RESET: - JP HDSK_DSKRESET -; -; GET DISK CAPACITY -; RETURN DE:HL=BLOCK COUNT, BC=BLOCK SIZE -; ASSUME 1GB MEDIA SIZE, SO 1GB / 512B -; IS $200000 SECTORS -; -HDSK_CAP: - LD DE,$20 ; BLOCK COUNT MSW - LD HL,0 ; BLOCK COUNT LSW - LD BC,512 ; 512 BYTE SECTOR - XOR A ; SIGNAL SUCCESS - RET -; -; -; -HDSK_GEOM: - ; FOR LBA, WE SIMULATE CHS ACCESS USING 16 HEADS AND 16 SECTORS - ; RETURN HS:CC -> DE:HL, SET HIGH BIT OF D TO INDICATE LBA CAPABLE - CALL HDSK_CAP ; GET TOTAL BLOCKS IN DE:HL, BLOCK SIZE TO BC - LD L,H ; DIVIDE BY 256 FOR # TRACKS - LD H,E ; ... HIGH BYTE DISCARDED, RESULT IN HL - LD D,$80 | 16 ; HEADS / CYL = 16, SET LBA BIT - LD E,16 ; SECTORS / TRACK = 16 - XOR A ; SIGNAL SUCCESS - RET -; -; -; -HDSK_DEVICE: - LD D,DIODEV_HDSK ; D := DEVICE TYPE - LD E,(IY+HDSK_DEV) ; E := PHYSICAL DEVICE NUMBER - LD C,%00110000 ; C := ATTRIBUTES, NON-REMOVABLE HARD DISK - LD H,0 ; H := 0, DRIVER HAS NO MODES - LD L,HDSK_IO ; L := BASE I/O ADDRESS - XOR A ; SIGNAL SUCCESS - RET -; -; -; -HDSK_MEDIA: - LD E,MID_HD ; HARD DISK MEDIA - LD D,0 ; D:0=0 MEANS NO MEDIA CHANGE - XOR A ; SIGNAL SUCCESS - RET -; -; -; -HDSK_SEEK: - BIT 7,D ; CHECK FOR LBA FLAG - CALL Z,HB_CHS2LBA ; CLEAR MEANS CHS, CONVERT TO LBA - RES 7,D ; CLEAR FLAG REGARDLESS (DOES NO HARM IF ALREADY LBA) - LD (IY+HDSK_LBA+0),L ; SAVE NEW LBA - LD (IY+HDSK_LBA+1),H ; ... - LD (IY+HDSK_LBA+2),E ; ... - LD (IY+HDSK_LBA+3),D ; ... - XOR A ; SIGNAL SUCCESS - RET ; AND RETURN -; -; -; -HDSK_READ: - CALL HB_DSKREAD ; HOOK HBIOS DISK READ SUPERVISOR - LD A,HDSK_CMDREAD - JR HDSK_RW -; -; -; -HDSK_WRITE: - CALL HB_DSKWRITE ; HOOK HBIOS DISK WRITE SUPERVISOR - LD A,HDSK_CMDWRITE - JR HDSK_RW -; -; -; -HDSK_RW: - LD (HDSK_CMD),A ; SET COMMAND BYTE - LD (HDSK_DMA),HL ; SAVE INITIAL DMA - LD A,E ; SECTOR COUNT TO A - OR A ; SET FLAGS - RET Z ; ZERO SECTOR I/O, RETURN W/ E=0 & A=0 - LD B,A ; INIT SECTOR DOWNCOUNTER - LD C,0 ; INIT SECTOR READ/WRITE COUNT - LD A,(IY+HDSK_DEV) ; GET DEVICE NUMBER - LD (HDSK_DRV),A ; ... AND SET FIELD IN HDSK PARM BLOCK - - ; RESET HDSK INTERFACE IF NEEDED - LD A,(IY+HDSK_STAT) ; GET CURRENT STATUS - OR A ; SET FLAGS - PUSH BC ; SAVE COUNTERS - CALL NZ,HDSK_DSKRESET ; RESET IF NOT READY - POP BC ; RESTORE COUNTERS - JR NZ,HDSK_RW6 ; ABORT ON FAILURE - -HDSK_RW0: - PUSH BC ; SAVE COUNTERS - XOR A ; A = 0 - LD (HDSK_RC),A ; CLEAR RETURN CODE -; -#IF (DSKYENABLE) - #IF (DSKYDSKACT) - LD A,HDSK_LBA - CALL LDHLIYA - CALL HB_DSKACT ; SHOW ACTIVITY - #ENDIF -#ENDIF -; - ; CONVERT LBA HHHH:LLLL (4 BYTES) - ; TO HDSK TRACK/SECTOR TTTT:SS (3 BYTES) - ; SAVING TO HDSK PARM BLOCK - ; (IY+HDSK_LBA+0) ==> (HDSK_SEC) - LD A,(IY+HDSK_LBA+0) - LD (HDSK_SEC),A - ; (IY+HDSK_LBA+1) ==> (HDSK_TRK+0) - LD A,(IY+HDSK_LBA+1) - LD (HDSK_TRK+0),A - ; (IY+HDSK_LBA+2) ==> (HDSK_TRK+1) - LD A,(IY+HDSK_LBA+2) - LD (HDSK_TRK+1),A - - ; EXECUTE COMMAND - LD B,7 ; SIZE OF PARAMETER BLOCK - LD HL,HDSK_PARMBLK ; ADDRESS OF PARAMETER BLOCK - LD C,$FD ; HDSK CMD PORT - OTIR ; SEND IT - - ; GET RESULT - IN A,(C) ; GET RESULT CODE - LD (HDSK_RC),A ; SAVE IT - OR A ; SET FLAGS - -#IF (HDSKTRACE > 0) - PUSH AF ; SAVE RETURN CODE -#IF (HDSKTRACE == 1) - CALL NZ,HDSK_PRT ; DIAGNOSE ERRORS ONLY -#ENDIF -#IF (HDSKTRACE >= 2) - CALL HDSK_PRT ; DISPLAY ALL READ/WRITE RESULTS -#ENDIF - POP AF ; RESTORE RETURN CODE -#ENDIF - - JR NZ,HDSK_RW5 ; BAIL OUT ON ERROR - - ; INCREMENT LBA - LD A,HDSK_LBA ; LBA OFFSET IN CFG ENTRY - CALL LDHLIYA ; HL := IY + A, REG A TRASHED - CALL INC32HL ; INCREMENT THE VALUE - - ; INCREMENT DMA - LD HL,HDSK_DMA+1 ; POINT TO MSB OF DMA - INC (HL) ; BUMP DMA BY - INC (HL) ; ... 512 BYTES - - XOR A ; A := 0 SIGNALS SUCCESS - -HDSK_RW5: - POP BC ; RECOVER COUNTERS - JR NZ,HDSK_RW6 ; IF ERROR, GET OUT - - INC C ; RECORD SECTOR COMPLETED - DJNZ HDSK_RW0 ; LOOP AS NEEDED - -HDSK_RW6: - ; RETURN WITH SECTORS READ IN E AND UPDATED DMA ADDRESS IN HL - LD E,C ; SECTOR READ COUNT TO E - LD HL,(HDSK_DMA) ; CURRENT DMA TO HL - OR A ; SET FLAGS BASED ON RETURN CODE - RET Z ; RETURN IF SUCCESS - LD A,ERR_IO ; SIGNAL IO ERROR - OR A ; SET FLAGS - RET ; AND DONE -; -; -; -HDSK_DSKRESET: -; -#IF (HDSKTRACE >= 2) - CALL NEWLINE - LD DE,HDSKSTR_PREFIX - CALL WRITESTR - CALL PC_SPACE - LD DE,HDSKSTR_RESET - CALL WRITESTR -#ENDIF -; - LD B,32 - LD A,HDSK_CMDRESET -HDSK_DSKRESET1: - OUT ($FD),A - DJNZ HDSK_DSKRESET1 - - XOR A ; STATUS = OK - LD (IY+HDSK_STAT),A ; SAVE IT - - RET -; -; -; -HDSK_PRT: - CALL NEWLINE - - LD DE,HDSKSTR_PREFIX - CALL WRITESTR - - CALL PC_SPACE - LD DE,HDSKSTR_CMD - CALL WRITESTR - LD A,(HDSK_CMD) - CALL PRTHEXBYTE - - CALL PC_SPACE - CALL PC_LBKT - LD A,(HDSK_CMD) - LD DE,HDSKSTR_NONE - CP HDSK_CMDNONE - JP Z,HDSK_PRTCMD - LD DE,HDSKSTR_RESET - CP HDSK_CMDRESET - JP Z,HDSK_PRTCMD - LD DE,HDSKSTR_READ - CP HDSK_CMDREAD - JP Z,HDSK_PRTCMD - LD DE,HDSKSTR_WRITE - CP HDSK_CMDWRITE - JP Z,HDSK_PRTCMD - LD DE,HDSKSTR_PARAM - CP HDSK_CMDPARAM - JP Z,HDSK_PRTCMD - LD DE,HDSKSTR_UNKCMD -HDSK_PRTCMD: - CALL WRITESTR - CALL PC_RBKT - - LD A,(HDSK_CMD) - CP HDSK_CMDREAD - JR Z,HDSK_PRTRW - CP HDSK_CMDWRITE - JR Z,HDSK_PRTRW - RET - -HDSK_PRTRW: - CALL PC_SPACE - LD A,(HDSK_DRV) - CALL PRTHEXBYTE - CALL PC_SPACE - LD BC,(HDSK_TRK) - CALL PRTHEXWORD - CALL PC_SPACE - LD A,(HDSK_SEC) - CALL PRTHEXBYTE - CALL PC_SPACE - LD BC,(HDSK_DMA) - CALL PRTHEXWORD - - CALL PC_SPACE - LD DE,HDSKSTR_ARROW - CALL WRITESTR - - CALL PC_SPACE - LD DE,HDSKSTR_RC - CALL WRITESTR - LD A,(HDSK_RC) - CALL PRTHEXBYTE - - CALL PC_SPACE - CALL PC_LBKT - LD A,(HDSK_RC) - LD DE,HDSKSTR_STOK - CP HDSK_STOK - JP Z,HDSK_PRTRC - LD DE,HDSKSTR_STUNK - -HDSK_PRTRC: - CALL WRITESTR - CALL PC_RBKT - - RET -; -; -; -HDSKSTR_PREFIX .TEXT "HDSK:$" -HDSKSTR_CMD .TEXT "CMD=$" -HDSKSTR_RC .TEXT "RC=$" -HDSKSTR_ARROW .TEXT "-->$" -HDSKSTR_NONE .TEXT "NONE$" -HDSKSTR_RESET .TEXT "RESET$" -HDSKSTR_READ .TEXT "READ$" -HDSKSTR_WRITE .TEXT "WRITE$" -HDSKSTR_PARAM .TEXT "PARAM$" -HDSKSTR_UNKCMD .TEXT "UNKCMD$" -HDSKSTR_STOK .TEXT "OK$" -HDSKSTR_STUNK .TEXT "UNKNOWN ERROR$" -; -;================================================================================================== -; HDSK DISK DRIVER - DATA -;================================================================================================== -; -HDSK_RC .DB 0 ; CURRENT RETURN CODE -HDSK_CURDEV .DB 0 ; CURRENT DEVICE NUMBER -; -HDSK_PARMBLK: -HDSK_CMD .DB 0 ; COMMAND (HDSK_READ, HDSK_WRITE, ...) -HDSK_DRV .DB 0 ; 0..7, HDSK DRIVE NUMBER -HDSK_SEC .DB 0 ; 0..255 SECTOR -HDSK_TRK .DW 0 ; 0..2047 TRACK -HDSK_DMA .DW 0 ; ADDRESS FOR SECTOR DATA EXCHANGE diff --git a/Source/ver.inc b/Source/ver.inc index 56ae7445..055305ab 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.74" +#DEFINE BIOSVER "3.5.0-dev.75" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index f93ece95..d15eaaba 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.74" + db "3.5.0-dev.75" endm From 3dd394e3c99cbf38c907a65b04c133b5c525984a Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 4 Sep 2024 11:40:36 -0700 Subject: [PATCH 6/8] Update GMZ180_std.asm - Minor filename case issue caused some build scenarios to fail. --- Source/HBIOS/Config/GMZ180_std.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HBIOS/Config/GMZ180_std.asm b/Source/HBIOS/Config/GMZ180_std.asm index 9cf083b7..9e213e30 100644 --- a/Source/HBIOS/Config/GMZ180_std.asm +++ b/Source/HBIOS/Config/GMZ180_std.asm @@ -26,7 +26,7 @@ ; #DEFINE BOOT_DEFAULT "H" ; DEFAULT BOOT LOADER CMD ON OR AUTO BOOT ; -#include "cfg_GMZ180.asm" +#include "cfg_gmz180.asm" ; CPUOSC .SET 18432000 ; CPU OSC FREQ IN MHZ CRTACT .SET FALSE ; ACTIVATE CRT (VDU,CVDU,PROPIO,ETC) AT STARTUP From d152cab8c8d5d89bd710fe1f1a00e7e39321a27a Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 4 Sep 2024 12:22:58 -0700 Subject: [PATCH 7/8] Update Doc --- Doc/ChangeLog.txt | 3 +- Doc/RomWBW Applications.pdf | Bin 340956 -> 340956 bytes Doc/RomWBW Disk Catalog.pdf | Bin 123768 -> 123769 bytes Doc/RomWBW Errata.pdf | Bin 28493 -> 28493 bytes Doc/RomWBW System Guide.pdf | Bin 581563 -> 581565 bytes Doc/RomWBW User Guide.pdf | Bin 787756 -> 789903 bytes ReadMe.md | 2 +- ReadMe.txt | 2 +- Source/Doc/UserGuide.md | 35 +++++++++++++- Source/HBIOS/cfg_gmz180.asm | 94 ++++++++++++++++++------------------ 10 files changed, 85 insertions(+), 51 deletions(-) diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 48dd0df8..51efcbea 100644 --- a/Doc/ChangeLog.txt +++ b/Doc/ChangeLog.txt @@ -32,7 +32,8 @@ Version 3.5 - WBW: Substantial customization of NZ-COM disk image - WBW: Refactor build post-processing (ZRC, ZZRCC, etc.) - MAP: Improved section Real Time Clock in User Guide document -- WBW: Support for Hitachi HD44780-based LCD display +- WBW: Support for Hitachi HD44780-based LCD display +- DRJ: Added support for Genesis STD Bus Z180 platform Version 3.4 ----------- diff --git a/Doc/RomWBW Applications.pdf b/Doc/RomWBW Applications.pdf index fb199cd55177adea195c1499535a4ead07873812..3bcd177c227eb9067dca63a63d81b2c530ba8b47 100644 GIT binary patch delta 537 zcmccfT;$GkkqL9^4{cwxoZ)O{pvwPxjh&Nn-!9VNnKj9?u+3TWp{zih`kv1z`7BI_ zxH_{PLMwLr$P2g5u)HoNcTM+(|5twgczu@h^~>IW%UL)%+=f?mdTG^;3by$VHT_Wz^yZw;Emyh%mMyS{L0K&XQNZ~E#Z znQ4aelgwRu&ZiwcW43Zz?WW|;v!`kvt*EB1PxmtDpyXij-@Qrudl*YezOKJJjouyCjyyi;? zyj31#wQ$Gr;`1l3@9|UmH``@Zz2h2ZFE_Uei74%;y_aWxxU=ia!<%vDf?~&g))l-o z3Ygz3cV>1-^|PXABhz>1HU<8wd4H#F51)ypi;jbk@9J8G%$qsq>?EewE-625cW-lk z`SbsKszWXN^ya>KdtQBK%Ob%mF}BM*YrAg#w&$NdCHASWNX?zFM~mxUSyse+GP@^y zg}rX6=UKK+_qf^hk<0h{e!9glUC@qExY?em-JXdNh(R>-c6%n4UGLdV42=ve3=F4z zVv&Kdw<~{QiEwl_HF7a_F?4ouvoLjXHgk3{HFI$`GZjfPQ)IVdQjM8*+BVOvZzs!o=Y(AocKS<+vP92blXgS>@Ke0KB?VDZT z_b|EeWt-)<7u{q`b70pNQ~mA5<}b_zC0a)9M#X*Y4(@w^;jmTzSI_ zg=F=m!d=xi-(|j+PU!frHZiMS;Pr$_69wnBUF!;aU!rQWU9Yxc+jYf5&t{wy)r)0& zwfSOm<>ajMck;ZK9lIN8=2d^sdVBtQVP8H$?g=iJv*bN)wXMC${&>^*FYj&~um1M- z-Jkj8>$Q$wTswL1-=8Ye15BD`tv+tD(%-Q9|MQoVHm$aCIe2`dko@1^^9LVK+Wv8w zu-ym#SyyryRo5(skxEa zv`;KDF!pxkPb?9R&K6FtW@bi4rpC@@PKHL#Ca%tImd+LiMy93~#%{)D26hTIgp^F* IXUr-G0OOwNVgLXD diff --git a/Doc/RomWBW Disk Catalog.pdf b/Doc/RomWBW Disk Catalog.pdf index 7e38334b9dbdd77675ee9a545db8b403d7710cf8..ffb4571c118eab033f4eb596bf669dd514b4a5d4 100644 GIT binary patch delta 4165 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 Ovz>wsAtjRy@?`;g1@svJ delta 539 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 diff --git a/Doc/RomWBW User Guide.pdf b/Doc/RomWBW User Guide.pdf index 604f74b874e93a27d26e7a728cc1e756deafa676..24ba72e0f801284cf62c3e55931a9ac77b7bed30 100644 GIT binary patch delta 115502 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

we`6#IY)AeuTCJ`!tdo1wZ~7$bX!abEmC8V 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 uNo(OL#q+w) Date: Wed, 4 Sep 2024 17:15:23 -0700 Subject: [PATCH 8/8] Finalize S100 FPGA Z80 Onboard VGA/PS2 Support - RomWBW will now "follow" the S100 monitors console selection for all 3 possibilities (USB Serial, Propeller Console, and Onboard VGA/PS2). --- Source/HBIOS/esp.asm | 3 ++- Source/HBIOS/hbios.asm | 61 ++++++++++++++++++++++++++++++++++-------- Source/HBIOS/ppp.asm | 3 ++- Source/HBIOS/prp.asm | 3 ++- Source/HBIOS/scon.asm | 3 ++- Source/HBIOS/term.asm | 3 ++- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 8 files changed, 62 insertions(+), 18 deletions(-) diff --git a/Source/HBIOS/esp.asm b/Source/HBIOS/esp.asm index 5a76ffb7..e8820e1d 100644 --- a/Source/HBIOS/esp.asm +++ b/Source/HBIOS/esp.asm @@ -364,7 +364,8 @@ ESPCON_INIT: PUSH IY ; COPY CONFIG ENTRY PTR POP DE ; ... TO DE CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + ;;;LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + CALL CIO_SETCRT ; SET OURSELVES AS THE CRT DEVICE ; ; ANNOUNCE OURSLEVES ; diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 07dd5ad9..37ae2ad3 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -2148,6 +2148,11 @@ HB_START2: LD (RTC_DISPACT),A ; RTC DEVICE LD (DSKY_DISPACT),A ; DSKY DEVICE ; +; INITIALIZE SOME HCB ENTRIES +; + OR $FF ; $FF TO ACCUM + LD (CB_CRTDEV),A ; RESET CRT DEVICE +; ; CLEAR INTERRUPT VECTOR TABLES ; ; THIS IS REALLY ONLY REQUIRED ON A RESTART, BUT IT DOESN'T HURT TO @@ -3324,11 +3329,27 @@ HB_WDZ: #ENDIF ; #IF (PLATFORM == PLT_FZ80) + ; IOBYTE: XXXXXVVC + ; 00- FORCE ONBOARD VGA/PS2 KBD (FV) + ; --1 FORCE PROPELLER CONSOLE (SCON) + ; 110 NORMAL USB SERIAL BOOT + ; + ; WE ASSUME THAT THE ONBOARD VGA (FV) IS ALWAYS DETECTED AND + ; WILL BE THE CURRENT CRTDEV. SCON IS ASSUMED TO BE THE + ; DEVICE AT CRTDEV + 1. THESE ARE REASONABLE ASSUMPTIONS + ; UNLESS THE DRIVER DETECTION OR DRIVER ORDER IS CHANGED. IN A,($36) ; GET IO BYTE - AND %00000001 ; ISOLATE CONSOLE BIT - JR Z,INITSYS3 ; NOT SET, BYPASS CONSOLE SWITCH + AND %00000110 ; ISOLATE BITS + JR Z,HB_CRTACT ; FORCE ONBOARD CRT + IN A,($36) ; GET IO BYTE + AND %00000001 ; ISOLATE BIT + JR Z,INITSYS3 ; NORMAL USB SERIAL BOOT + LD A,(CB_CRTDEV) ; GET CRT DEV + INC A ; SWITCH FROM FV -> SCON + LD (CB_CRTDEV),A ; SAVE IT AND DO CONSOLE SWITCH #ENDIF ; +HB_CRTACT: LD A,(CB_CRTDEV) ; GET CRT DISPLAY DEVICE LD (HB_NEWCON),A ; AND QUEUE TO SWITCH ; @@ -3805,6 +3826,15 @@ HB_INITTBL: #IF (FVENABLE) .DW FV_INIT #ENDIF +#IF (PRPENABLE) + .DW PRP_INIT +#ENDIF +#IF (PPPENABLE) + .DW PPP_INIT +#ENDIF +#IF (SCONENABLE) + .DW SCON_INIT +#ENDIF #IF (DMAENABLE) .DW DMA_INIT #ENDIF @@ -3838,15 +3868,6 @@ HB_INITTBL: #IF (SYQENABLE) .DW SYQ_INIT #ENDIF -#IF (PRPENABLE) - .DW PRP_INIT -#ENDIF -#IF (PPPENABLE) - .DW PPP_INIT -#ENDIF -#IF (SCONENABLE) - .DW SCON_INIT -#ENDIF #IF (CHENABLE) .DW CH_INIT #ENDIF @@ -3980,6 +4001,24 @@ CIO_SIZ .EQU CIO_MAX * 4 ; EACH ENTRY IS 4 BYTES CIO_CNT .DB 0 ; ENTRY COUNT PREFIX CIO_TBL .FILL CIO_SIZ,0 ; SPACE FOR ENTRIES ; +; CRT TYPE CHAR DEVICES CALL THIS TO REGISTER THAT THEY WANT TO BE THE +; DEFAULT CRT DEVICE. THIS ROUTINE WILL SET CB_CRTDEV WHEN CALLED THE +; FIRST TIME. SUBSEQUENT CALLS ARE IGNORED. THIS ENSURES THAT THE +; *FIRST* CRT DEVICE WINS. +; +CIO_SETCRT: + PUSH AF ; SAVE INCOMING CRT DEV NUM + LD A,(CB_CRTDEV) ; GET CURRENT CRT DEV NUM + INC A ; $FF -> $00 + JR NZ,CIO_SETCRT_Z ; IF ALREADY SET, LEAVE IT ALONE + POP AF ; RESTORE AF + LD (CB_CRTDEV),A ; SAVE CRT DEV NUM + RET ; AND DONE +; +CIO_SETCRT_Z: + POP AF ; RESTORE AF + RET ; AND DONE +; ;-------------------------------------------------------------------------------------------------- ; DISK I/O DEVICE FUNCTION DISPATCHER ;-------------------------------------------------------------------------------------------------- diff --git a/Source/HBIOS/ppp.asm b/Source/HBIOS/ppp.asm index 434b9e75..a4afb9e5 100644 --- a/Source/HBIOS/ppp.asm +++ b/Source/HBIOS/ppp.asm @@ -276,7 +276,8 @@ PPPCON_INIT: LD E,CIODEV_PPPCON ; DEVICE TYPE LD BC,PPPCON_FNTBL ; BC := FUNCTION TABLE ADDRESS CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + ;;;LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + CALL CIO_SETCRT ; SET OURSELVES AS THE CRT DEVICE ; XOR A RET diff --git a/Source/HBIOS/prp.asm b/Source/HBIOS/prp.asm index fb987eb9..f00557ed 100644 --- a/Source/HBIOS/prp.asm +++ b/Source/HBIOS/prp.asm @@ -150,7 +150,8 @@ PRPCON_INIT: LD E,CIODEV_PRPCON ; DEVICE TYPE LD BC,PRPCON_FNTBL ; BC := FUNCTION TABLE ADDRESS CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + ;;;LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + CALL CIO_SETCRT ; SET OURSELVES AS THE CRT DEVICE ; XOR A ; SIGNAL SUCCESS RET diff --git a/Source/HBIOS/scon.asm b/Source/HBIOS/scon.asm index bf8f2857..9d8452de 100644 --- a/Source/HBIOS/scon.asm +++ b/Source/HBIOS/scon.asm @@ -46,7 +46,8 @@ SCON_INIT: LD E,CIODEV_SCON ; DEVICE TYPE LD BC,SCON_FNTBL ; BC := FUNCTION TABLE ADDRESS CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + ;;;LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + CALL CIO_SETCRT ; SET OURSELVES AS THE CRT DEVICE ; XOR A ; SIGNAL SUCCESS RET diff --git a/Source/HBIOS/term.asm b/Source/HBIOS/term.asm index 1325cff2..6f193013 100644 --- a/Source/HBIOS/term.asm +++ b/Source/HBIOS/term.asm @@ -76,7 +76,8 @@ TERM_ATTACH: PUSH HL ; COPY VDA INSTANCE DATA PTR POP DE ; ... TO DE CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED - LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + ;;;LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE + CALL CIO_SETCRT ; SET OURSELVES AS THE CRT DEVICE ; ; INCREMENT DEVICE COUNT LD HL,TERM_DEVCNT ; POINT TO DEVICE COUNT diff --git a/Source/ver.inc b/Source/ver.inc index 055305ab..51e79644 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 5 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.5.0-dev.75" +#DEFINE BIOSVER "3.5.0-dev.76" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index d15eaaba..ed3c00ff 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 5 rup equ 0 rtp equ 0 biosver macro - db "3.5.0-dev.75" + db "3.5.0-dev.76" endm