From edbe7d0781f721af53b42160b84a8071597d7a40 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 6 Dec 2023 19:37:02 -0800 Subject: [PATCH] Improved BPBIOS Bank Id Management --- Source/BPBIOS/hbios.z80 | 21 ++++++++++----------- Source/BPBIOS/ibmv-ww.z80 | 24 +++++++++++++++++++++--- Source/BPBIOS/romwbw.lib | 27 ++++++++++++++++----------- Source/Images/Build.cmd | 4 ++++ 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index 0a97670d..9c9e7ecb 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/Source/BPBIOS/hbios.z80 @@ -43,18 +43,15 @@ HBX_CPYLEN EQU 0FFE8H ; call here, make required changes, then update the ; BIOSJT to point directly to the normal SELMEM routine for ; all subsequent calls. +; +; HBIOS bank ids are computed by subtracting the BPBIOS bank id +; from the ending HBIOS bank id. HBIOS RAM bank ids start at 80h. +; The ending HBIOS bank id (HB_BNKEND) is (80h + RAM banks). Since +; the number of RAM banks in a system can vary, HB_BNKEND is +; determined here at startup. +; +; See romwbw.lib for additional RAM bank layout information. - ; BPBIOS HBIOS Typical - ; ------------ -------------- -------------- - ; -1: BID_COM 90h - 1 = 8Fh - ; -2: TPABNK BID_USR 90h - 2 = 8Eh - ; -3: SYSBNK BID_SYS 90h - 3 = 8Dh - ; -4: RAMBNK BID_BUF 90h - 4 = 8Ch - ; -4: MAXBNK BID_BUF 90h - 4 = 8Ch - ; -5: BID_RAMM 90h - 5 = 8BH - ; -15: BID_RAMD 90h - 15 = 81h (varies w/ memory size) - ; -16: BID_HB 90h - 16 = 80h (varies w/ memory size) - HB_SELMEM: PUSH AF PUSH BC @@ -103,9 +100,11 @@ HB_MOVE: PUSH HL LD HL,HB_BNKEND LD A,(HB_SRCBNK) + NEG ADD A,(HL) ; Adjust for HBIOS bank ids LD (HBX_SRCBNK),A LD A,(HB_DSTBNK) + NEG ADD A,(HL) ; Adjust for HBIOS bank ids LD (HBX_DSTBNK),A POP HL diff --git a/Source/BPBIOS/ibmv-ww.z80 b/Source/BPBIOS/ibmv-ww.z80 index 2c984758..bcf30bb3 100644 --- a/Source/BPBIOS/ibmv-ww.z80 +++ b/Source/BPBIOS/ibmv-ww.z80 @@ -115,10 +115,24 @@ SELMEM: LD (USRBNK),A ; Update user bank ; Must preserve all Registers including Flags. ; All Bank Switching MUST be done by this routine ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; +; Parameter to BNKADJ (ADD) is set dynamically at initialization. SELBNK: PUSH AF ; Save regs SELBN0: LD (CURBNK),A ; Save as current bank # -BNKADJ: ADD A,90H ; Adjust for HBIOS bank ids + NEG +BNKADJ: ADD A,0FFH ; Adjust for HBIOS bank ids + + IF HB_DEBUG AND FALSE + + CALL PRTSTRD + DEFB '[SELBNK: $' + CALL PRTHEXBYTE + CALL PRTSTRD + DEFB ']$' + + ENDIF + CALL HBX_BNKSEL POP AF ; restore regs RET @@ -172,7 +186,9 @@ FRGETB: PUSH BC ; Save BC PUSH DE ; Save DE LD B,0FAH ; HBIOS Peek function - LD D,C ; Bank in D + LD A,(HB_BNKEND) ; Adjust BP bank id + SUB C ; ... to HBIOS bank id + LD D,A ; Put in D CALL HBX_INVOKE ; Do it LD A,E ; Value to A POP DE ; Restore DE @@ -203,8 +219,10 @@ FRPUTB: PUSH BC ; Save BC PUSH DE ; Save DE LD B,0FBH ; HBIOS Poke function - LD D,C ; Bank in D LD E,A ; Value in E + LD A,(HB_BNKEND) ; Adjust BP bank id + SUB C ; ... to HBIOS bank id + LD D,A ; Put in D CALL HBX_INVOKE ; Do it POP DE ; Restore DE POP BC ; Restore BC diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index ff9febb4..c0b846df 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -48,21 +48,26 @@ DRV_P SET NO ; YES if system has flopy drives ; ; RAM/ROM Bank Reserve ; -HB_RAMRESV EQU 5 ; RAM reserve is 8 banks +HB_RAMRESV EQU 5 ; RAM reserve is 5 banks HB_ROMRESV EQU 4 ; ROM reserve is 4 banks ; ; Layout of RAM banks ; -; TODO: Query system via HBIOS API to determine the actual bank -; assignments, then adjust BPBIOS operation accordingly. -; -BID_HB EQU -16 ; 90h - 16 = 80h -BID_RAMD EQU -15 ; 90h - 15 = 81h -BID_RAMM EQU -5 ; 90h - 5 = 8Bh -BID_BUF EQU -4 ; 90h - 4 = 8Ch -BID_SYS EQU -3 ; 90h - 3 = 8Dh -BID_USR EQU -2 ; 90h - 2 = 8Eh -BID_COM EQU -1 ; 90h - 1 = 8Fh +; These are BPBIOS bank ids. They map to HBIOS bank ids +; by subtracting from the ending HBIOS bank id (N). HBIOS RAM bank ids +; start at 80h. The ending HBIOS bank id is (80h + RAM banks). The +; typical layout assumes 16 banks of RAM starting at HBIOS bank id 80h +; and ending at bank id 90h (N = 90h). +; +; BPBIOS HBIOS (TYPICAL) +; ---------------------------------------------- --------------- +; 80h (80h) +; 81h (81h) +; N - 5 (8Bh) +BID_BUF EQU 4 ; BNK3 -> RAMBNK N - 4 (8Ch) +BID_SYS EQU 3 ; BNK2 -> SYSBNK N - 3 (8Dh) +BID_USR EQU 2 ; BNK0 -> TPABNK N - 2 (8Eh) +BID_COM EQU 1 ; BNK1 -> N - 1 (8Fh) ; HB_EI MACRO EI diff --git a/Source/Images/Build.cmd b/Source/Images/Build.cmd index 42e6757a..b28ecc3a 100644 --- a/Source/Images/Build.cmd +++ b/Source/Images/Build.cmd @@ -1,6 +1,10 @@ @echo off setlocal +:: call BuildDisk.cmd bp hd wbw_hd1k +:: copy /b hd1k_prefix.dat + ..\..\Binary\hd1k_bp.img + ..\..\Binary\hd1k_cpm22.img + ..\..\Binary\hd1k_zsdos.img + ..\..\Binary\hd1k_nzcom.img + ..\..\Binary\hd1k_cpm3.img + ..\..\Binary\hd1k_zpm3.img + ..\..\Binary\hd1k_ws4.img ..\..\Binary\hd1k_combo_bp.img || exit /b +:: goto :eof + echo. echo Building Floppy Disk Images... echo.