From 5a1fd00c0450f6b8d009dc0bf480a68a66ee6182 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Fri, 15 Oct 2021 16:02:39 -0700 Subject: [PATCH] BPBIOS Dynamic RAM/ROM Disk Sizing --- Source/BPBIOS/bpbio-ww.z80 | 54 ++++++++++++- Source/BPBIOS/cboot-ww.z80 | 150 +++++++++++++++++++++++++++---------- Source/BPBIOS/dpbhd-ww.lib | 32 ++------ Source/BPBIOS/hbios.z80 | 117 +++++------------------------ Source/BPBIOS/ibmv-ww.z80 | 10 +++ Source/BPBIOS/romwbw.lib | 8 +- 6 files changed, 196 insertions(+), 175 deletions(-) diff --git a/Source/BPBIOS/bpbio-ww.z80 b/Source/BPBIOS/bpbio-ww.z80 index f06b3587..33c67a4b 100644 --- a/Source/BPBIOS/bpbio-ww.z80 +++ b/Source/BPBIOS/bpbio-ww.z80 @@ -310,12 +310,22 @@ NRDPB EQU [$-DPB]/DPBSIZ ; Calc number of DPB's INCLUDE IBMV-WW.Z80 ; << routines in IBMV-xxx.Z80 >> ELSE ; If Not Banked, Use these hooks + + CSEG MOVE: LDIR RET -SETBNK: SELMEM: + IF HB_DEBUG AND FALSE + CALL PRTSTRD + DEFB '[SELMEM (STUB): $' + CALL PRTHEXBYTE + CALL PRTSTRD + DEFB ']',CR,LF,'$' + ENDIF + +SETBNK: RETMEM: XMOVE: GOSYSB: @@ -459,6 +469,44 @@ NSECTS EQU ($+INITCS-BIOSJT)/128+1 IF INROM INCLUDE BOOTRAM.Z80 ENDIF ;INROM - END - \ No newline at end of file + IF HB_DEBUG + + CSEG +XORG DEFL $ + ORG 0 +ORG_CSEG EQU $ + ORG XORG + + DSEG +XORG DEFL $ + ORG 0 +ORG_DSEG EQU $ + ORG XORG + + IF BANKED + + COMMON /BANK2/ +XORG DEFL $ + ORG 0 +ORG_BANK2 EQU $ + ORG XORG + + COMMON /B2RAM/ +XORG DEFL $ + ORG 0 +ORG_B2RAM EQU $ + ORG XORG + + COMMON /RESVD/ +XORG DEFL $ + ORG 0 +ORG_RESVD EQU $ + ORG XORG + + ENDIF ; BANKED + + ENDIF ; HB_DEBUG + + END + \ No newline at end of file diff --git a/Source/BPBIOS/cboot-ww.z80 b/Source/BPBIOS/cboot-ww.z80 index 9cae3bb7..9e5c31a9 100644 --- a/Source/BPBIOS/cboot-ww.z80 +++ b/Source/BPBIOS/cboot-ww.z80 @@ -13,44 +13,6 @@ ; 1.0 - 13 Aug 96 - Initial Release for P112. HFB ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - IF HB_DEBUG - - CSEG -XORG DEFL $ - ORG 0 -ORG_CSEG EQU $ - ORG XORG - - DSEG -XORG DEFL $ - ORG 0 -ORG_DSEG EQU $ - ORG XORG - - IF BANKED - - COMMON /BANK2/ -XORG DEFL $ - ORG 0 -ORG_BANK2 EQU $ - ORG XORG - - COMMON /B2RAM/ -XORG DEFL $ - ORG 0 -ORG_B2RAM EQU $ - ORG XORG - - COMMON /RESVD/ -XORG DEFL $ - ORG 0 -ORG_RESVD EQU $ - ORG XORG - - ENDIF ; BANKED - - ENDIF ; HB_DEBUG - DSEG ;..... ; Cold boot entry. This code is executed only once and so may be @@ -73,8 +35,6 @@ CBOOT: LD SP,80H ; Set stack in Low memory ENDIF ; BANKED - CALL HB_INIT - LD HL,(IOBYT) ; Get IOBYTE, Default Drive & User LD (3),HL ; Set values in TPA bank @@ -95,10 +55,12 @@ CBOOT: XOR A LD (BIOSTK),A ; Init bank switcher LD (3),HL ; Set IOBYTE and Default DU in System bank + CALL HB_INIT ; Do HBIOS initialization CALL CBOOT0 ; Execute main part of Cold Setup LD A,(TPABNK) CALL SELBNK ; Insure TPA is in context ELSE + CALL HB_INIT ; Do HBIOS initialization CALL CBOOT0 ; Execute main part of Cold Setup ENDIF ; Banked @@ -445,6 +407,112 @@ CALCOF: ADD HL,DE ; Add offset to Base ENV Addr LD H,(HL) ; and grab LD L,C ; Ptr to Segment now in HL RET ; return to caller + +;..... +; HBIOS Initialization + +HB_INIT: + IF HB_DEBUG AND FALSE + CALL PRTSTRD + DEFB '[HB_INIT]',CR,LF,'$' + ENDIF + + ;; Setup RST 08 vector + ;LD A,0C3H ; $C3 = JP + ;LD (08H),A + ;LD HL,HBX_INVOKE + ;LD (09H),HL + + ;IF BANKED + ; + ;; Copy vectors from TPA page zero to SYS page zero + ;LD BC,(TPABNK) ; C := TPABNK, B := SYSBNK + ;CALL XMOVE ; Set source/dest banks for copy + ;LD HL,0 ; Source address is zero + ;LD DE,0 ; Destination address is zero + ;LD BC,40H ; Copy 40H bytes + ;CALL MOVE ; Do it + ; + ;ENDIF ;BANKED + + IF HB_DEBUG + + CALL NEWLINE2 + LD DE,HB_STR_TAG + CALL WRITESTR + + LD DE,HB_STR_CSEG + CALL WRITESTR + LD BC,ORG_CSEG + CALL PRTHEXWORD + LD DE,HB_STR_DSEG + CALL WRITESTR + LD BC,ORG_DSEG + CALL PRTHEXWORD + + IF BANKED + LD DE,HB_STR_BANK2 + CALL WRITESTR + LD BC,ORG_BANK2 + CALL PRTHEXWORD + LD DE,HB_STR_B2RAM + CALL WRITESTR + LD BC,ORG_B2RAM + CALL PRTHEXWORD + LD DE,HB_STR_RESVD + CALL WRITESTR + LD BC,ORG_RESVD + CALL PRTHEXWORD + ENDIF ;BANKED + + CALL NEWLINE + + ENDIF ; [HB_DEBUG] + + ; Update RAM and ROM DPB for true RAM/ROM sizes + LD BC,HBF_MEMINFO ; HBIOS Memory Information + CALL HBX_INVOKE ; Do it, D=ROM Banks, E=RAM Banks + PUSH DE ; Save results + LD HL,DPBROM+4 ; EXM byte of ROM DPB + LD A,D ; ROM bank count to accum + SUB HB_ROMRESV ; Less reserved ROM banks + CALL HB_FIXDPB ; Adjust ROM DPB + POP DE ; Recover memory info + LD HL,DPBRAM+4 ; EXM byte of RAM DPB + LD A,E ; ROM bank count to accum + SUB HB_RAMRESV ; Less reserved RAM banks + CALL HB_FIXDPB ; Adjust RAM DPB + RET + +HB_FIXDPB: + CP 16 ; 16 banks = 256 blocks + LD E,0 ; Init EXM value to zero + RL E ; Put CF in E + LD (HL),E ; Save EXM + LD D,0 ; Init blk cnt to bank cnt + LD E,A ; " + LD B,4 ; Multiply by 4 +HB_FIXDPB1: + SLA E ; ... to convert to + RL D ; ... 2K block cnt + DJNZ HB_FIXDPB1 ; Loop + DEC DE ; Convert to blk cnt - 1 + INC HL ; Point to LSB of DSM + LD (HL),E ; Save LSB + INC HL ; Point to MSB of DSM + LD (HL),D ; Save it + RET + + IF HB_DEBUG + +HB_STR_TAG: DB "HBIOS: $" +HB_STR_CSEG: DB "CSEG=$" +HB_STR_DSEG: DB ", DSEG=$" +HB_STR_BANK2: DB ", BANK2=$" +HB_STR_B2RAM: DB ", B2RAM=$" +HB_STR_RESVD: DB ", RESVD=$" + + ENDIF ; HB_DEBUG ; Block Move Parameters @@ -720,4 +788,4 @@ BTTBL: DEFS 8 ; Initial WB DMA Block ENDIF ;======================== End of CBOOT ============================= - \ No newline at end of file + \ No newline at end of file diff --git a/Source/BPBIOS/dpbhd-ww.lib b/Source/BPBIOS/dpbhd-ww.lib index 278065ba..fbb53a5d 100644 --- a/Source/BPBIOS/dpbhd-ww.lib +++ b/Source/BPBIOS/dpbhd-ww.lib @@ -147,23 +147,13 @@ DEFB 16 ; Physical # sectors/trk (16*512=8k per 'track') DEFB 0 ; Physical tracks/side (No Meaning in HD) -MSIZR EQU HB_RAMBLKS ; # of blocks in Drive (by Memory/Block size) - ; 2x128k = 64 (128k) - 48 (96k) w/User Bank - ; 2x128k = 80 (160k) - 64 (128k) w/User Bank - ; 1x512k = 192 (384k) - 176 (352k) w/User Bank - ; 2x512k = 448 (896k) - 432 (864k) w/User Bank +MSIZR EQU (32*16) ; Maximum blocks in RAM drive (assume 1MB) DPBRAM: DEFW 64 ; Records/Track (16 sectors*4 records/sector) DEFB 4 ; Block Shift Factor (2k per block) DEFB 0FH ; Block Mask - IF (MSIZR-1)<256 - DEFB 1 ; Extent Mask - ELSE - DEFB 0 ; Extent Mask - ENDIF - DEFW MSIZR-1 ; Disk Size-1 128 kB 256 kB 512 kB - ; Dir Max -or- 64 128 256 - ; Alloc 0, 1 80H,0 0C0H,0 0F0H,0 + DEFB 1 ; Extent Mask (updated at boot by HB_INIT) + DEFW MSIZR-1 ; Disk Blocks (updated at boot by HB_INIT) DEFW 255 ; Dir Max-1 4 blocks DEFB 0F0H,0 ; Alloc 0,1 DEFW 0000 ; Check Size @@ -184,23 +174,13 @@ DPBRAM: DEFW 64 ; Records/Track (16 sectors*4 records/sector) DEFB 16 ; Physical # sectors/trk (32=4k per 'track') DEFB 0 ; Physical tracks/side (No Meaning in HD) -MSIZO EQU HB_ROMBLKS ; # of blocks in Drive (by Memory/Block size) - ; 2x128k = 64 (128k) - 48 (96k) w/User Bank - ; 2x128k = 80 (160k) - 64 (128k) w/User Bank - ; 1x512k = 192 (384k) - 176 (352k) w/User Bank - ; 2x512k = 448 (896k) - 432 (864k) w/User Bank +MSIZO EQU (32*16) ; Maximum blocks in ROM drive (assume 1MB) DPBROM: DEFW 64 ; Sectors/Track DEFB 4 ; Block Shift Factor (2k per block) DEFB 0FH ; Block Mask - IF (MSIZO-1)<256 - DEFB 1 ; Extent Mask - ELSE - DEFB 0 ; Extent Mask - ENDIF - DEFW MSIZO-1 ; Disk Size-1 128 kB 256 kB 512 kB - ; Dir Max -or- 64 128 256 - ; Alloc 0, 1 80H,0 0C0H,0 0F0H,0 + DEFB 1 ; Extent Mask (updated at boot by HB_INIT) + DEFW MSIZO-1 ; Disk Blocks (updated at boot by HB_INIT) DEFW 255 ; Dir Max-1 4 blocks DEFB 0F0H,0 ; Alloc 0,1 DEFW 0000 ; Check Size diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index 4d895a06..aeacf43a 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_MEMINFO EQU 0F8F1H ; HBIOS Func: Get Memory Info HBF_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank Info ; ; HBIOS Proxy Addresses @@ -58,6 +59,14 @@ HB_SELMEM: PUSH DE PUSH HL + IF HB_DEBUG AND FALSE + CALL PRTSTRD + DEFB '[HB_SELMEM: $' + CALL PRTHEXBYTE + CALL PRTSTRD + DEFB ']',CR,LF,'$' + ENDIF + LD BC,HBF_BNKINFO ; HBIOS BNKINFO function CALL HBX_INVOKE ; DO IT, D=BID_BIOS, E=BID_USER LD A,D ; BID_BIOS @@ -111,6 +120,14 @@ HB_MOVE: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: HB_XMOVE: + IF HB_DEBUG AND FALSE + CALL PRTSTRD + DEFB '[HB_XMOVE: $' + CALL PRTHEXWORD + CALL PRTSTRD + DEFB ']',CR,LF,'$' + ENDIF + LD (HB_SRCBNK),BC RET @@ -119,106 +136,6 @@ HB_XMOVE: ; HBIOS INITIALIZATION ;================================================================================================== ; -HB_INIT: - ;; Setup RST 08 vector - ;LD A,0C3H ; $C3 = JP - ;LD (08H),A - ;LD HL,HBX_INVOKE - ;LD (09H),HL - - ;IF BANKED - ; - ;; Copy vectors from TPA page zero to SYS page zero - ;LD BC,(TPABNK) ; C := TPABNK, B := SYSBNK - ;CALL XMOVE ; Set source/dest banks for copy - ;LD HL,0 ; Source address is zero - ;LD DE,0 ; Destination address is zero - ;LD BC,40H ; Copy 40H bytes - ;CALL MOVE ; Do it - ; - ;ENDIF ;BANKED - - IF HB_DEBUG - - CSEG -XORG DEFL $ - ORG 0 -ORG_CSEG EQU $ - ORG XORG - - DSEG -XORG DEFL $ - ORG 0 -ORG_DSEG EQU $ - ORG XORG - - IF BANKED - - COMMON /BANK2/ -XORG DEFL $ - ORG 0 -ORG_BANK2 EQU $ - ORG XORG - - COMMON /B2RAM/ -XORG DEFL $ - ORG 0 -ORG_B2RAM EQU $ - ORG XORG - - COMMON /RESVD/ -XORG DEFL $ - ORG 0 -ORG_RESVD EQU $ - ORG XORG - - ENDIF - - CALL NEWLINE2 - LD DE,HB_STR_TAG - CALL WRITESTR - - LD DE,HB_STR_CSEG - CALL WRITESTR - LD BC,ORG_CSEG - CALL PRTHEXWORD - LD DE,HB_STR_DSEG - CALL WRITESTR - LD BC,ORG_DSEG - CALL PRTHEXWORD - - IF BANKED - LD DE,HB_STR_BANK2 - CALL WRITESTR - LD BC,ORG_BANK2 - CALL PRTHEXWORD - LD DE,HB_STR_B2RAM - CALL WRITESTR - LD BC,ORG_B2RAM - CALL PRTHEXWORD - LD DE,HB_STR_RESVD - CALL WRITESTR - LD BC,ORG_RESVD - CALL PRTHEXWORD - ENDIF ;BANKED - - CALL NEWLINE - - RET - -HB_STR_TAG: DB "HBIOS: $" -HB_STR_CSEG: DB "CSEG=$" -HB_STR_DSEG: DB ", DSEG=$" -HB_STR_BANK2: DB ", BANK2=$" -HB_STR_B2RAM: DB ", B2RAM=$" -HB_STR_RESVD: DB ", RESVD=$" - - ELSE ; [HB_DEBUG] - - RET - - ENDIF ; [HB_DEBUG] - CSEG HB_SRCBNK: DEFS 1 ; Move Source Bank # diff --git a/Source/BPBIOS/ibmv-ww.z80 b/Source/BPBIOS/ibmv-ww.z80 index 38b8e648..2c984758 100644 --- a/Source/BPBIOS/ibmv-ww.z80 +++ b/Source/BPBIOS/ibmv-ww.z80 @@ -100,6 +100,16 @@ RETMEM: LD A,(CURBNK) SELMEM: LD (USRBNK),A ; Update user bank ;..fall thru to set specified bank.. + IF HB_DEBUG AND FALSE + + CALL PRTSTRD + DEFB '[SELMEM: $' + CALL PRTHEXBYTE + CALL PRTSTRD + DEFB ']$' + + ENDIF + ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; SELBNK - Switch Memory Bank to Bank in A and show as current. ; Must preserve all Registers including Flags. diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index 864042be..9da7d1ef 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -54,12 +54,10 @@ HB_HDDEV2 EQU 4 ; Third hard disk is HBIOS Disk Device #4 DRV_O SET NO ; YES if system has flopy drives DRV_P SET NO ; YES if system has flopy drives ; -; RAM/ROM disk sizes expressed as count of 2K blocks. These values -; are simply derived from values set previously and should. These -; lines should not need to be changed. +; RAM/ROM Bank Reserve ; -HB_RAMBLKS EQU (HB_RAMBANKS - 8) * 16 -HB_ROMBLKS EQU (HB_ROMBANKS - 4) * 16 +HB_RAMRESV EQU 8 ; RAM reserve is 8 banks +HB_ROMRESV EQU 4 ; ROM reserve is 4 banks ; ; Layout of RAM banks ;