From 2225847212715d939d09c60c95e480ce9a76f282 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Thu, 7 Dec 2023 12:58:44 -0800 Subject: [PATCH] Additional Improvement to BPBIOS Bank Management --- Source/BPBIOS/cboot-ww.z80 | 3 +++ Source/BPBIOS/deblock.z80 | 10 +++---- Source/BPBIOS/hbios.z80 | 53 +++++++++++++++++++------------------- Source/BPBIOS/ibmv-ww.z80 | 10 ++----- Source/BPBIOS/romwbw.lib | 27 ++++++++++++------- Source/ver.inc | 2 +- Source/ver.lib | 2 +- 7 files changed, 55 insertions(+), 52 deletions(-) diff --git a/Source/BPBIOS/cboot-ww.z80 b/Source/BPBIOS/cboot-ww.z80 index 9e5c31a9..d8dee6fd 100644 --- a/Source/BPBIOS/cboot-ww.z80 +++ b/Source/BPBIOS/cboot-ww.z80 @@ -102,6 +102,9 @@ CBOOT: ; BPCNFG to configure a generic IMG file for specific Hard Drive Partitions. CBOOT0: + LD BC,HBF_SYSRES_INT ; HB Func: Internal Reset + CALL HBX_INVOKE ; Do it + LD HL,BRAME ; Get end of banked RAM LD (HISAV),HL ; and save for later use IF HARDDSK diff --git a/Source/BPBIOS/deblock.z80 b/Source/BPBIOS/deblock.z80 index 3d1f6062..9f6a5bec 100644 --- a/Source/BPBIOS/deblock.z80 +++ b/Source/BPBIOS/deblock.z80 @@ -269,16 +269,14 @@ MATCH: LD A,(SECMSK) ; Get the sector mask ; Modified to use HBIOS host buffer ; ; HSTBUF is always in HBIOS bank where I/O is actually done - ; We need to refer to HBIOS bank using BPBIOS bank id - LD A,(HB_BNKEND) ; Undo the bank adjustment - SUB 80h ; ... and refer to HBIOS bank id + LD A,(HB_BNKBIOS) ; HBIOS bank id LD C,A ; Set Read Source Bank IF BANKED - LD A,(DMABNK) ; Set Read Destination Bank + LD A,(DMABNK) ; Read Destination Bank ELSE - LD A,(TPABNK) ; Set Read Destination Bank + LD A,(TPABNK) ; Read Destination Bank ENDIF - LD B,A + LD B,A ; Set Read Destination Bank LD A,(READOP) ; Direction? OR A JR NZ,OKBNKS ; ..jump if read diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index 9c9e7ecb..2d0acf90 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/Source/BPBIOS/hbios.z80 @@ -9,6 +9,7 @@ HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory HBF_PEEK EQU 0FAH ; HBIOS Func: Peek Byte HBF_POKE EQU 0FBH ; HBIOS Func: Poke Byte +HBF_SYSRES_INT EQU 0F000H ; HBIOS Func: Internal Reset HBF_MEMINFO EQU 0F8F1H ; HBIOS Func: Get Memory Info HBF_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank Info ; @@ -44,20 +45,22 @@ HBX_CPYLEN EQU 0FFE8H ; 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. +; When called, the incoming bank id will be the original hard-coded +; bank id prior to any adjustments. These original bank id's are +; coded to be an offset from the ending HBIOS RAM bank id which +; is (80h + RAM banks). See romwbw.lib. We update the requested +; bank id for this initial call to make it the proper absolute +; HBIOS bank id. ; ; See romwbw.lib for additional RAM bank layout information. HB_SELMEM: - PUSH AF PUSH BC PUSH DE PUSH HL + PUSH AF ; Save incoming bank request + IF HB_DEBUG AND FALSE CALL PRTSTRD DEFB '[HB_SELMEM: $' @@ -67,24 +70,30 @@ HB_SELMEM: ENDIF LD BC,HBF_BNKINFO ; HBIOS BNKINFO function - CALL HBX_INVOKE ; DO IT, D=BID_BIOS, E=BID_USER - LD A,D ; BID_BIOS - LD (HB_BNKBIOS),A ; SET HB_BNKBIOS - LD A,E ; BID_USER - ADD 2 ; ... + 2 - LD (HB_BNKEND),A ; ... is the ending RAM bank - IF BANKED - LD (BNKADJ+1),A ; Dynamically update SELBNK - ENDIF - + CALL HBX_INVOKE ; Do it, D=BIOS bank, E=USER (TPA) bank + LD A,D ; BIOS bank + LD (HB_BNKBIOS),A ; Save it for later (deblock & hard-ww) + LD A,E ; USER (TPA) bank + LD (TPABNK),A ; Update BP register + DEC A ; SYS bank is one below USER + LD (SYSBNK),A ; Update BP register + DEC A ; HBIOS BUF bank is one more below + ;LD (UABNK),A ; Set BPBIOS USER bank + LD (RAMBNK),A ; Update BP RAM disk bank register + LD (MAXBNK),A ; Update ending bank register + LD HL,SELMEM ; Future SELMEM calls will LD (BIOSJT+(27*3)+1),HL ; ... go to real SELMEM + POP BC ; Recover requested bank to B + LD A,(TPABNK) ; Get TPA bank + ADD 2 ; Offset to ending RAM bank id + ADD B ; Adjust for incoming request + POP HL POP DE POP BC - POP AF - JP SELMEM + JP SELMEM ; Continue to normal SELMEM ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Move Data - Possibly between banks. This resembles CP/M 3, but @@ -97,17 +106,10 @@ HB_SELMEM: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 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 CALL HBX_BNKCPY PUSH HL LD HL,(TPABNK) ; Get TPA Bank # @@ -143,6 +145,5 @@ HB_XMOVE: HB_SRCBNK: DEFS 1 ; Move Source Bank # HB_DSTBNK: DEFS 1 ; Move Destination Bank # HB_BNKBIOS: DEFS 1 ; Bank id of HBIOS bank -HB_BNKEND: DEFS 1 ; End of available RAM banks (last bank + 1) HB_DSKBUF: DEFS 2 ; Address of physical disk buffer in HBIOS bank  \ No newline at end of file diff --git a/Source/BPBIOS/ibmv-ww.z80 b/Source/BPBIOS/ibmv-ww.z80 index bcf30bb3..8e388268 100644 --- a/Source/BPBIOS/ibmv-ww.z80 +++ b/Source/BPBIOS/ibmv-ww.z80 @@ -120,8 +120,6 @@ SELMEM: LD (USRBNK),A ; Update user bank SELBNK: PUSH AF ; Save regs SELBN0: LD (CURBNK),A ; Save as current bank # - NEG -BNKADJ: ADD A,0FFH ; Adjust for HBIOS bank ids IF HB_DEBUG AND FALSE @@ -186,9 +184,7 @@ FRGETB: PUSH BC ; Save BC PUSH DE ; Save DE LD B,0FAH ; HBIOS Peek function - LD A,(HB_BNKEND) ; Adjust BP bank id - SUB C ; ... to HBIOS bank id - LD D,A ; Put in D + LD D,C CALL HBX_INVOKE ; Do it LD A,E ; Value to A POP DE ; Restore DE @@ -220,9 +216,7 @@ FRPUTB: PUSH DE ; Save DE LD B,0FBH ; HBIOS Poke function 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 + LD D,C 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 c0b846df..dcecd53d 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -53,21 +53,28 @@ HB_ROMRESV EQU 4 ; ROM reserve is 4 banks ; ; Layout of RAM banks ; -; These are BPBIOS bank ids. They map to HBIOS bank ids +; The BID_xxx values below are used to set the initial values of +; the BPBIOS bank registers (see def-ww-xxx.lib and HB_SELMEM in +; hbios.z80). The running values of the BPBIOS bank registers (TPABNK, +; SYSBNK, etc.) are set to absolute HBIOS bank ids in hbios.z80 during +; startup. +; +; The values below are expressed as an offset from the ending HBIOS +; RAM bank id. 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) +; 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/ver.inc b/Source/ver.inc index 5b16860a..0ecf9b3c 100644 --- a/Source/ver.inc +++ b/Source/ver.inc @@ -2,7 +2,7 @@ #DEFINE RMN 4 #DEFINE RUP 0 #DEFINE RTP 0 -#DEFINE BIOSVER "3.4.0-dev.28" +#DEFINE BIOSVER "3.4.0-dev.29" #define rmj RMJ #define rmn RMN #define rup RUP diff --git a/Source/ver.lib b/Source/ver.lib index 0ba89db6..281ab314 100644 --- a/Source/ver.lib +++ b/Source/ver.lib @@ -3,5 +3,5 @@ rmn equ 4 rup equ 0 rtp equ 0 biosver macro - db "3.4.0-dev.28" + db "3.4.0-dev.29" endm