Browse Source

Additional Improvement to BPBIOS Bank Management

patch v3.4.0-dev.29
Wayne Warthen 2 years ago
parent
commit
2225847212
  1. 3
      Source/BPBIOS/cboot-ww.z80
  2. 10
      Source/BPBIOS/deblock.z80
  3. 51
      Source/BPBIOS/hbios.z80
  4. 10
      Source/BPBIOS/ibmv-ww.z80
  5. 27
      Source/BPBIOS/romwbw.lib
  6. 2
      Source/ver.inc
  7. 2
      Source/ver.lib

3
Source/BPBIOS/cboot-ww.z80

@ -102,6 +102,9 @@ CBOOT:
; BPCNFG to configure a generic IMG file for specific Hard Drive Partitions. ; BPCNFG to configure a generic IMG file for specific Hard Drive Partitions.
CBOOT0: CBOOT0:
LD BC,HBF_SYSRES_INT ; HB Func: Internal Reset
CALL HBX_INVOKE ; Do it
LD HL,BRAME ; Get end of banked RAM LD HL,BRAME ; Get end of banked RAM
LD (HISAV),HL ; and save for later use LD (HISAV),HL ; and save for later use
IF HARDDSK IF HARDDSK

10
Source/BPBIOS/deblock.z80

@ -269,16 +269,14 @@ MATCH: LD A,(SECMSK) ; Get the sector mask
; Modified to use HBIOS host buffer ; Modified to use HBIOS host buffer
; ;
; HSTBUF is always in HBIOS bank where I/O is actually done ; 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 LD C,A ; Set Read Source Bank
IF BANKED IF BANKED
LD A,(DMABNK) ; Set Read Destination Bank
LD A,(DMABNK) ; Read Destination Bank
ELSE ELSE
LD A,(TPABNK) ; Set Read Destination Bank
LD A,(TPABNK) ; Read Destination Bank
ENDIF ENDIF
LD B,A
LD B,A ; Set Read Destination Bank
LD A,(READOP) ; Direction? LD A,(READOP) ; Direction?
OR A OR A
JR NZ,OKBNKS ; ..jump if read JR NZ,OKBNKS ; ..jump if read

51
Source/BPBIOS/hbios.z80

@ -9,6 +9,7 @@
HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory HBF_ALLOC EQU 0F6H ; HBIOS Func: ALLOCATE Heap Memory
HBF_PEEK EQU 0FAH ; HBIOS Func: Peek Byte HBF_PEEK EQU 0FAH ; HBIOS Func: Peek Byte
HBF_POKE EQU 0FBH ; HBIOS Func: Poke 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_MEMINFO EQU 0F8F1H ; HBIOS Func: Get Memory Info
HBF_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank 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 ; BIOSJT to point directly to the normal SELMEM routine for
; all subsequent calls. ; 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. ; See romwbw.lib for additional RAM bank layout information.
HB_SELMEM: HB_SELMEM:
PUSH AF
PUSH BC PUSH BC
PUSH DE PUSH DE
PUSH HL PUSH HL
PUSH AF ; Save incoming bank request
IF HB_DEBUG AND FALSE IF HB_DEBUG AND FALSE
CALL PRTSTRD CALL PRTSTRD
DEFB '[HB_SELMEM: $' DEFB '[HB_SELMEM: $'
@ -67,24 +70,30 @@ HB_SELMEM:
ENDIF ENDIF
LD BC,HBF_BNKINFO ; HBIOS BNKINFO function 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 HL,SELMEM ; Future SELMEM calls will
LD (BIOSJT+(27*3)+1),HL ; ... go to real SELMEM 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 HL
POP DE POP DE
POP BC POP BC
POP AF
JP SELMEM
JP SELMEM ; Continue to normal SELMEM
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Move Data - Possibly between banks. This resembles CP/M 3, but ; Move Data - Possibly between banks. This resembles CP/M 3, but
@ -97,17 +106,10 @@ HB_SELMEM:
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
HB_MOVE: HB_MOVE:
PUSH HL
LD HL,HB_BNKEND
LD A,(HB_SRCBNK) LD A,(HB_SRCBNK)
NEG
ADD A,(HL) ; Adjust for HBIOS bank ids
LD (HBX_SRCBNK),A LD (HBX_SRCBNK),A
LD A,(HB_DSTBNK) LD A,(HB_DSTBNK)
NEG
ADD A,(HL) ; Adjust for HBIOS bank ids
LD (HBX_DSTBNK),A LD (HBX_DSTBNK),A
POP HL
CALL HBX_BNKCPY CALL HBX_BNKCPY
PUSH HL PUSH HL
LD HL,(TPABNK) ; Get TPA Bank # LD HL,(TPABNK) ; Get TPA Bank #
@ -143,6 +145,5 @@ HB_XMOVE:
HB_SRCBNK: DEFS 1 ; Move Source Bank # HB_SRCBNK: DEFS 1 ; Move Source Bank #
HB_DSTBNK: DEFS 1 ; Move Destination Bank # HB_DSTBNK: DEFS 1 ; Move Destination Bank #
HB_BNKBIOS: DEFS 1 ; Bank id of HBIOS 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 HB_DSKBUF: DEFS 2 ; Address of physical disk buffer in HBIOS bank
 

10
Source/BPBIOS/ibmv-ww.z80

@ -120,8 +120,6 @@ SELMEM: LD (USRBNK),A ; Update user bank
SELBNK: PUSH AF ; Save regs SELBNK: PUSH AF ; Save regs
SELBN0: LD (CURBNK),A ; Save as current bank # SELBN0: LD (CURBNK),A ; Save as current bank #
NEG
BNKADJ: ADD A,0FFH ; Adjust for HBIOS bank ids
IF HB_DEBUG AND FALSE IF HB_DEBUG AND FALSE
@ -186,9 +184,7 @@ FRGETB:
PUSH BC ; Save BC PUSH BC ; Save BC
PUSH DE ; Save DE PUSH DE ; Save DE
LD B,0FAH ; HBIOS Peek function 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 CALL HBX_INVOKE ; Do it
LD A,E ; Value to A LD A,E ; Value to A
POP DE ; Restore DE POP DE ; Restore DE
@ -220,9 +216,7 @@ FRPUTB:
PUSH DE ; Save DE PUSH DE ; Save DE
LD B,0FBH ; HBIOS Poke function LD B,0FBH ; HBIOS Poke function
LD E,A ; Value in E 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 CALL HBX_INVOKE ; Do it
POP DE ; Restore DE POP DE ; Restore DE
POP BC ; Restore BC POP BC ; Restore BC

27
Source/BPBIOS/romwbw.lib

@ -53,21 +53,28 @@ HB_ROMRESV EQU 4 ; ROM reserve is 4 banks
; ;
; Layout of RAM 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 ; 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 ; 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 ; typical layout assumes 16 banks of RAM starting at HBIOS bank id 80h
; and ending at bank id 90h (N = 90h). ; and ending at bank id 90h (N = 90h).
; ;
; BPBIOS HBIOS (TYPICAL)
; ---------------------------------------------- ---------------
; <HBIOS> 80h (80h)
; <RAMD> 81h (81h)
; <RAMM> 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)
; -------------------------------------- ---------------
; <HBIOS> 80h (80h)
; <RAMD> 81h (81h)
; <RAMM> 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 HB_EI MACRO
EI EI

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 4 #DEFINE RMN 4
#DEFINE RUP 0 #DEFINE RUP 0
#DEFINE RTP 0 #DEFINE RTP 0
#DEFINE BIOSVER "3.4.0-dev.28"
#DEFINE BIOSVER "3.4.0-dev.29"
#define rmj RMJ #define rmj RMJ
#define rmn RMN #define rmn RMN
#define rup RUP #define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 4
rup equ 0 rup equ 0
rtp equ 0 rtp equ 0
biosver macro biosver macro
db "3.4.0-dev.28"
db "3.4.0-dev.29"
endm endm

Loading…
Cancel
Save