Browse Source

Merge pull request #236 from wwarthen/dev

BPBIOS Dynamic RAM/ROM Disk Sizing
pull/252/head
b1ackmai1er 4 years ago
committed by GitHub
parent
commit
74d7733138
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 54
      Source/BPBIOS/bpbio-ww.z80
  2. 150
      Source/BPBIOS/cboot-ww.z80
  3. 32
      Source/BPBIOS/dpbhd-ww.lib
  4. 117
      Source/BPBIOS/hbios.z80
  5. 10
      Source/BPBIOS/ibmv-ww.z80
  6. 8
      Source/BPBIOS/romwbw.lib

54
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

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


150
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 =============================



32
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

117
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 #

10
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.

8
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
;

Loading…
Cancel
Save