mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
BPBIOS Dynamic RAM/ROM Disk Sizing
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 =============================
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 #
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user