Browse Source

BPBIOS Sync

pull/259/head
Wayne Warthen 4 years ago
parent
commit
04acb4102a
  1. 1
      Doc/ChangeLog.txt
  2. 27
      Source/BPBIOS/bpbio-ww.z80
  3. 63
      Source/BPBIOS/cboot-ww.z80
  4. 12
      Source/BPBIOS/deblock.z80
  5. 20
      Source/BPBIOS/hard-ww.z80
  6. 336
      Source/BPBIOS/hbios.z80
  7. 66
      Source/BPBIOS/ibmv-ww.z80
  8. 10
      Source/BPBIOS/ramd-ww.z80
  9. 52
      Source/BPBIOS/romwbw.lib
  10. 7
      Source/BPBIOS/util.z80
  11. 11
      Source/BPBIOS/wboot-ww.z80
  12. 16
      Source/BPBIOS/zst.zex
  13. 14
      Source/BPBIOS/zstf.zex

1
Doc/ChangeLog.txt

@ -54,6 +54,7 @@ Version 3.1.1
- WBW: Add interrupt receive support to UART driver
- PMS: Add XModem transfer within Debug Monitor
- PMS & AJL: Add DMAMON test application
- LWN: Substantial BPBIOS cleanup
Version 3.1
-----------

27
Source/BPBIOS/bpbio-ww.z80

@ -157,7 +157,8 @@ BIOSJT: JP CBOOT ; 00 Cold Boot
ELSE
JP ISTRUE ; 26..return 0FFH (No Clock) if No code
ENDIF ;clock
JP SELMEM ; 27 Select Alternate Memory Bank
;JP SELMEM ; 27 Select Alternate Memory Bank
JP HB_SELMEM ; 27 Select Alternate Memory Bank
JP SETBNK ; 28 Select DMA Memory bank
JP XMOVE ; 29 Set Source/Destination Banks for Move
@ -224,6 +225,10 @@ JBSTRN: JP BSTRN ; BIOS Sectran
; << Insert the Cold boot routines >>
INCLUDE CBOOT-WW.Z80 ; << in file CBOOT-xx.Z80 >>
; << ****** Hardware Specific ****** >>
; << HBIOS interface routines in >>
INCLUDE HBIOS.Z80 ; << HBIOS.Z80 >>
; Deblocking Buffer Allocation
IF [BANKED OR INROM]
@ -338,6 +343,21 @@ FRPUTW: LD (HL),E
RET
ENDIF ;(not) banked
IF HB_DEBUG
; << ****** Hardware Specific ****** >>
; << HBIOS Diagnostic Support >>
INCLUDE UTIL.Z80 ; << Routines >>
ELSE ; If Not Debug, Use these hooks
CSEG
PANIC: DI
HALT
ENDIF ; HB_DEBUG
PAGE
;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
; Core BIOS Code
@ -358,8 +378,6 @@ RETBIO: LD BC,BIOSJT ; Get address of bios base
; Return DPH Table Address
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
INCLUDE UTIL.Z80
DRVTBL: LD HL,DPHTBL ; Point to DPH table
RET
@ -398,9 +416,6 @@ DRVTBL: LD HL,DPHTBL ; Point to DPH table
; << Enter Warm Boot routines in >>
INCLUDE WBOOT-WW.Z80 ; << WBOOT-xx.Z80 >>
; << ****** Hardware Specific ****** >>
; << HBIOS interface routines in >>
INCLUDE HBIOS.Z80 ; << HBIOS.Z80 >>
;.....
; Status bytes of general use placed at end of Data area

63
Source/BPBIOS/cboot-ww.z80

@ -13,6 +13,44 @@
; 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
@ -35,11 +73,23 @@ CBOOT:
LD SP,80H ; Set stack in Low memory
ENDIF ; BANKED
CALL HBX_INIT
CALL HB_INIT
LD HL,(IOBYT) ; Get IOBYTE, Default Drive & User
LD (3),HL ; Set values in TPA bank
IF BANKED
; Copy vectors from TPA page zero to SYS page zero
; This is done very early to ensure interrupt mode 1
; vector is available.
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 BANKED
CALL GOSYSB ; Turn on the System bank
XOR A
@ -61,16 +111,19 @@ CBOOT:
; Grab a copy of command processor from TPA and
; cache it in (SYSBNK):100H. We assume that the
; original copy of command processor is in high memory.
;
; It is critical that we use the HB variants of MOVE and XMOVE
; because we are moving between banks even in a non-banked
; system!
LD A,(TPABNK) ; Source bank is TPABNK
LD C,A ; Put it in C
LD A,(SYSBNK) ; Destination bank is SYSBNK
LD B,A ; Put it in B
CALL HBX_XCOPY ; Set banks for extended copy
CALL HB_XMOVE ; Set banks for extended copy
LD HL,(CPADR) ; Copy from start of command processor
LD DE,100H ; .. to $100 in system bank
LD BC,(CPLEN) ; Length of command processor
CALL HBX_COPY ; Do it
CALL HB_MOVE ; Do it
JP WBOOTV ; move it and commence execution
ELSE
@ -378,7 +431,7 @@ MEMOK:
ENDIF ;BIOERM
DEFB CR,LF+80H
;WW EI ; Turn Interrupts back on
EI ; Turn Interrupts back on
RET ; ..and return
;.....
; Offset to and get ENV Address and respective element size

12
Source/BPBIOS/deblock.z80

@ -268,8 +268,9 @@ MATCH: LD A,(SECMSK) ; Get the sector mask
;
; Modified to use HBIOS host buffer
;
;LD A,BID_HB ; HSTBUF is in HBIOS
LD A,(HBX_BNKBIOS) ; HSTBUF is in HBIOS
; HSTBUF is always in HBIOS bank where I/O is done
LD A,(TPABNK) ; TPA BANK
DEC A ; HBIOS bank is one below
LD C,A
IF BANKED
LD A,(DMABNK) ; Set Read Destination Bank
@ -283,8 +284,7 @@ MATCH: LD A,(SECMSK) ; Get the sector mask
LD A,B ; Else reverse banks
LD B,C
LD C,A
OKBNKS: CALL HBX_XCOPY ; Set source & destination banks
; LD DE,HBBUF ; Host buffer address in HBIOS bank
OKBNKS: CALL HB_XMOVE ; Set source & destination banks
LD DE,(HB_DSKBUF) ; Host buffer address in HBIOS bank
ADD HL,DE ; Point to the sector
LD DE,(DMAADR) ; User's buffer
@ -301,9 +301,11 @@ OKBNKS: CALL HBX_XCOPY ; Set source & destination banks
; Move the data
RWMOVE: CALL HBX_COPY ; Handle possible inter-bank move
RWMOVE:
CALL HB_MOVE ; Handle possible inter-bank move
ELSE ; HBIOS
IF BANKED
IF INROM
LD A,(TPABNK) ; If bank in ROM, HSTBUF is in TPA

20
Source/BPBIOS/hard-ww.z80

@ -139,23 +139,9 @@ HDREAD:
ENDIF
;
;==================================================================================================
; HDSK DISK DRIVER
; HBIOS Disk Driver Interface
;==================================================================================================
;;
;; HBIOS HDSK equates
;;
;HDSK_IO EQU 0FDH
;;
;HDSK_CMDNONE EQU 0
;HDSK_CMDRESET EQU 1
;HDSK_CMDREAD EQU 2
;HDSK_CMDWRITE EQU 3
;HDSK_CMDPARAM EQU 4
;;
;; STATUS
;;
;HDSKRC_OK EQU 0
;;
;
; HBIOS disk commands
;
HB_DSKRD EQU 13H
@ -198,7 +184,7 @@ HDSK_RW1:
RET NZ ; ABORT IF SEEK RETURNED AN ERROR W/ ERROR IN A
LD HL,(HB_DSKBUF) ; GET BUFFER ADDRESS
;LD D,BID_HB ; BUFFER IN HBIOS BANK
LD A,(HBX_BNKBIOS) ; BUFFER IN HBIOS BANK
LD A,(HB_BNKBIOS) ; BUFFER IN HBIOS BANK
LD D,A ; PUT IN D
LD E,1 ; ONE SECTOR
CALL HBX_INVOKE ; DO IT

336
Source/BPBIOS/hbios.z80

@ -7,6 +7,8 @@
; HBIOS Functions
;
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_BNKINFO EQU 0F8F2H ; HBIOS Func: Get Bank Info
;
; HBIOS Proxy Addresses
@ -16,99 +18,187 @@ HBX_BNKSEL EQU 0FFF3H
HBX_BNKCPY EQU 0FFF6H
HBX_BNKCALL EQU 0FFF9H
HB_CURBNK EQU 0FFE0H
HB_INVBNK EQU 0FFE1H
HB_SRCADR EQU 0FFE2H
HB_SRCBNK EQU 0FFE4H
HB_DSTADR EQU 0FFE5H
HB_DSTBNK EQU 0FFE7H
HB_CPYLEN EQU 0FFE8H
HBX_CURBNK EQU 0FFE0H
HBX_INVBNK EQU 0FFE1H
HBX_SRCADR EQU 0FFE2H
HBX_SRCBNK EQU 0FFE4H
HBX_DSTADR EQU 0FFE5H
HBX_DSTBNK EQU 0FFE7H
HBX_CPYLEN EQU 0FFE8H
CSEG
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Trap initial SELMEM call and fixup HBIOS bank ids.
; A = Bank
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; LDSYS calls the SELMEM entry point of BIOSJT in order to
; place memory contents in SYSBNK. It does this prior to
; calling CBOOT to start the system. Since we need to adjust
; the bank numbers on-the-fly at startup to adjust for
; HBIOS actual RAM size, we intercept the initial HB_SELMEM
; call here, make required changes, then update the
; BIOSJT to point directly to the normal SELMEM routine for
; all subsequent calls.
; BPBIOS HBIOS Typical
; ------------ -------------- --------------
; -1: <COMMON> BID_COM 90h - 1 = 8Fh
; -2: TPABNK BID_USR 90h - 2 = 8Eh
; -3: <HBIOS> BID_BIOS 90h - 3 = 8Dh
; -4: SYSBNK BID_AUX 90h - 4 = 8Ch
; -9: BNKM BID_AUX-5 90h - 9 = 87h
; -16: RAMBNK RAMD0 90h - 16 = 80h
HB_SELMEM:
PUSH AF
PUSH BC
PUSH DE
PUSH HL
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
ADD A,3 ; HBIOS + 3
LD (HB_BNKEND),A ; ... is the ending RAM bank
IF BANKED
LD (BNKADJ+1),A ; Dynamically update SELBNK
ENDIF
LD HL,SELMEM ; Future SELMEM calls will
LD (BIOSJT+(27*3)+1),HL ; ... go to real SELMEM
POP HL
POP DE
POP BC
POP AF
JP SELMEM
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Move Data - Possibly between banks. This resembles CP/M 3, but
; usage of the HL and DE registers is reversed.
; Enter: HL = Source Address
; DE = Destination Address
; BC = Number of bytes to move
; Exit : None
; Uses : AF,BC,DE,HL
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
HB_MOVE:
PUSH HL
LD HL,HB_BNKEND
LD A,(HB_SRCBNK)
ADD A,(HL) ; Adjust for HBIOS bank ids
LD (HBX_SRCBNK),A
LD A,(HB_DSTBNK)
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 #
LD H,L ; .to both H and L
LD (HB_SRCBNK),HL ; ..set Source & Destination Bank # to TPA
POP HL
RET
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Set Banks for Inter-Bank Xfer. Save all Registers.
; B = Destination Bank, C = Source Bank
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
HB_XMOVE:
LD (HB_SRCBNK),BC
RET
;
;==================================================================================================
; HBIOS INITIALIZATION
;==================================================================================================
;
; This code should be moved to follow CBOOT so that it will be reused
; by RAM data.
HB_INIT:
;; Setup RST 08 vector
;LD A,0C3H ; $C3 = JP
;LD (08H),A
;LD HL,HBX_INVOKE
;LD (09H),HL
;IF BANKED
;
HBX_INIT:
; Setup RST 08 vector
LD A,0C3H ; $C3 = JP
LD (08H),A
LD HL,HBX_INVOKE
LD (09H),HL
;; Init HB data fields
;LD A,BID_USR
;LD (HB_CURBNK),A
;LD (HB_SRCBNK),A
;LD (HB_DSTBNK),A
; Initialize BPBIOS bank numbers from HBIOS
; BNKU (UABNK) --> 0 (DISABLED)
; BNK0 (TPABNK) --> BID_USR
; BNK1 --> BID_COM
; BNK2 (SYSBNK) --> BID_AUX (BID_BIOS - 1)
; BNK3 (RAMBNK) --> BID_RAMD0 (0x80)
; BNKM (MAXBNK) --> BID_RAMDN (BID_BIOS - 5)
LD BC,HBF_BNKINFO ; HBIOS BNKINFO function
CALL HBX_INVOKE ; DO IT, D=BID_BIOS, E=BID_USER
LD A,E ; BID_USR
LD (TPABNK),A ; SET BNK0 (TPABNK)
LD A,D ; BID_BIOS
LD (HBX_BNKBIOS),A ; SET HBX_BNKBIOS
DEC A ; BID_AUX
LD (SYSBNK),A ; SET BNK2 (SYSBNK)
SUB 4 ; BID_RAMDN
LD (MAXBNK),A ; SET BNKM (MAXBNK)
LD A,80H ; FIRST PHYSICAL RAM BANK IS ALWAYS 0x80
LD (RAMBNK),A ; SET BNK3 (RAMBNK)
;; 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
; 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
LD A,(TPABNK) ; Set all Bank regs to TPA
COMMON /BANK2/
XORG DEFL $
ORG 0
ORG_BANK2 EQU $
ORG XORG
ENDIF ;BANKED
COMMON /B2RAM/
XORG DEFL $
ORG 0
ORG_B2RAM EQU $
ORG XORG
; begin debug
COMMON /RESVD/
XORG DEFL $
ORG 0
ORG_RESVD EQU $
ORG XORG
ENDIF
CALL NEWLINE2
LD DE,HB_STR_TAG
CALL WRITESTR
CALL NEWLINE
LD DE,HB_STR_CSEG
CALL WRITESTR
LD BC,BIOSJT
LD BC,ORG_CSEG
CALL PRTHEXWORD
LD DE,HB_STR_DSEG
CALL WRITESTR
LD BC,CBOOT
LD BC,ORG_DSEG
CALL PRTHEXWORD
IF BANKED
LD DE,HB_STR_BANK2
CALL WRITESTR
LD BC,ROMJT
LD BC,ORG_BANK2
CALL PRTHEXWORD
LD DE,HB_STR_B2RAM
CALL WRITESTR
LD BC,CBOOT0
LD BC,ORG_B2RAM
CALL PRTHEXWORD
LD DE,HB_STR_RESVD
CALL WRITESTR
LD BC,ALV$50
LD BC,ORG_RESVD
CALL PRTHEXWORD
ENDIF ;BANKED
@ -123,129 +213,17 @@ HB_STR_BANK2: DB ", BANK2=$"
HB_STR_B2RAM: DB ", B2RAM=$"
HB_STR_RESVD: DB ", RESVD=$"
; end debug
ELSE ; [HB_DEBUG]
CSEG
HBX_BNKBIOS DEFB 0 ; Bank id of HBIOS bank
;
;==================================================================================================
; HBIOS INTERFACE
;==================================================================================================
;
; TODO: Move the following into ibmv-ww.z80 which is where it belongs.
;
HBX_XCOPY:
LD A,C
LD (HB_SRCBNK),A
LD A,B
LD (HB_DSTBNK),A
RET
HBX_COPY:
JP HBX_BNKCPY
;==================================================================================================
; LD A,(C:HL)
;==================================================================================================
HBX_FRGETB:
LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_TMPSTK ; Activate our private stack
LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank
PUSH BC
LD A,C
HB_DI
CALL HBX_BNKSEL
LD C,(HL)
LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL
HB_EI
LD A,C
POP BC
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET
;==================================================================================================
; LD DE,(C:HL)
;==================================================================================================
HBX_FRGETW:
LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_TMPSTK ; Activate our private stack
LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank
LD A,C
HB_DI
CALL HBX_BNKSEL
LD E,(HL)
INC HL
LD D,(HL)
DEC HL
LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL
HB_EI
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET
;==================================================================================================
; LD (C:HL),A
;==================================================================================================
HBX_FRPUTB:
LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_TMPSTK ; Activate our private stack
PUSH AF
LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank
POP AF
PUSH BC
LD B,A
LD A,C
HB_DI
CALL HBX_BNKSEL
LD (HL),B
LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL
HB_EI
POP BC
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET
;==================================================================================================
; LD (C:HL),DE
;==================================================================================================
HBX_FRPUTW:
LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_TMPSTK ; Activate our private stack
LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank
LD A,C
HB_DI
CALL HBX_BNKSEL
LD (HL),E
INC HL
LD (HL),D
DEC HL
LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL
HB_EI
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET
;==================================================================================================
; PRIVATE DATA
;==================================================================================================
DSEG
ENDIF ; [HB_DEBUG]
HB_DSKBUF: DEFW 0 ; Address of physical disk buffer in HBIOS bank
HBX_BNKSAV: DEFB 0 ; Saved bank id during HBIOS calls
HBX_STKSAV: DEFW 0 ; Saved stack pointer during HBIOS calls
DEFS 32 ; Private stack for HBIOS
HBX_TMPSTK EQU $ ; Top of private stack
CSEG

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


66
Source/BPBIOS/ibmv-ww.z80

@ -16,8 +16,7 @@
; Uses : AF,BC,DE,HL
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
MOVE:
JP HBX_COPY
MOVE EQU HB_MOVE ; Defer to HBIOS (see HBIOS.Z80)
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Routine to Switch to Local Stack for Banked Operations
@ -34,7 +33,8 @@ BIOSTK: DEFB 0 ; NOP if not currently in bank,
LD (USP),SP ; Save User's Stack Pointer
LD SP,USP-1 ; ..and point locally, saving 1 byte for Bank
PUSH AF ; Save entry A and Flags
LD A,(HB_CURBNK) ; Get current bank
;LD A,(HB_CURBNK) ; Get current bank
LD A,(CURBNK) ; Get current bank
LD (USP-1),A ; ..and save for exitting
LD A,0C9H ; Disable other calls here
LD (BIOSTK),A ; ..by poking a RETurn at entry
@ -50,7 +50,7 @@ BIOSTK: DEFB 0 ; NOP if not currently in bank,
USRSTK: PUSH AF
LD A,(USP-1) ; Get bank control byte from entry
CALL HBX_BNKSEL
CALL SELBNK
XOR A
LD (BIOSTK),A ; Patch NOP back in at start of code
POP AF
@ -63,7 +63,7 @@ USRSTK: PUSH AF
FRCLR: PUSH AF ; Save any entry in AF
LD A,(USP-1) ; Get bank control byte
CALL HBX_BNKSEL
CALL SELBNK
XOR A
LD (BIOSTK),A ; Patch NOP to enable stack switcher
POP AF
@ -88,9 +88,10 @@ ABORT: LD SP,USP ; Insure stack is in Common Memory
; Uses : AF
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
RETMEM: LD A,(HB_CURBNK)
RETMEM: LD A,(CURBNK)
RET
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Set Bank into context. Save all Registers.
; A = Bank
@ -106,7 +107,9 @@ SELMEM: LD (USRBNK),A ; Update user bank
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
SELBNK: PUSH AF ; Save regs
SELBN0: CALL HBX_BNKSEL
SELBN0: LD (CURBNK),A ; Save as current bank #
BNKADJ: ADD A,90H ; Adjust for HBIOS bank ids
CALL HBX_BNKSEL
POP AF ; restore regs
RET
@ -123,8 +126,7 @@ SETBNK: LD (DMABNK),A
; B = Destination Bank, C = Source Bank
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
XMOVE:
JP HBX_XCOPY
XMOVE: EQU HB_XMOVE ; Defer to HBIOS (see HBIOS.Z80)
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Select System Bank
@ -157,37 +159,75 @@ FRJP: CALL BIOSTK ; Insure we are in a common stack
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FRGETB:
JP HBX_FRGETB
PUSH BC ; Save BC
PUSH DE ; Save DE
LD B,0FAH ; HBIOS Peek function
LD D,C ; Bank in D
CALL HBX_INVOKE ; Do it
LD A,E ; Value to A
POP DE ; Restore DE
POP BC ; Restore BC
RET
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Load DE,(HL) from Alternate Bank
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FRGETW:
JP HBX_FRGETW
PUSH AF ; Save AF
CALL FRGETB ; Get LSB
LD E,A ; ... into E
INC HL ; Next address
CALL FRGETB ; Get MSB
LD D,A ; ... into D
DEC HL ; Restore HL
POP AF ; Restore AF
RET
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Load (HL),A to Alternate Bank (in Reg C)
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FRPUTB:
JP HBX_FRPUTB
PUSH AF ; Save AF
PUSH BC ; Save BC
PUSH DE ; Save DE
LD B,0FBH ; HBIOS Poke function
LD D,C ; Bank in D
LD E,A ; Value in E
CALL HBX_INVOKE ; Do it
POP DE ; Restore DE
POP BC ; Restore BC
POP AF ; Restore AF
RET
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; Load (HL),DE to Alternate Bank
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
FRPUTW:
JP HBX_FRPUTW
PUSH AF ; Save AF
LD A,E ; LSB to A
CALL FRPUTB ; Put LSB
LD A,D ; MSB to A
INC HL ; Next address
CALL FRPUTB ; Put MSB
DEC HL ; Restore HL
POP AF ; Restore AF
RET
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
DSEG
JPBNK: DEFS 1 ; Bank # for Far Jump or Call
USRBNK: DEFS 1 ; User's selected bank #
CURBNK: DEFS 1 ; Current bank #
SRCBNK: EQU HB_SRCBNK ; Move Source Bank #
DSTBNK: EQU HB_DSTBNK ; Move Destination Bank #
DMABNK: DEFS 1 ; Target bank # for disk xfers
DEFS 64 ; 32 level stack
USP: DEFS 2 ; User stack pointer
;======================= End of IBMV-WW ===========================


10
Source/BPBIOS/ramd-ww.z80

@ -68,9 +68,9 @@ RAMWR2:
ADD A,C ; COMBINE TO GET ACTUAL SOURCE BANK NUM
; SETUP FOR INTERBANK COPY
LD C,A ; SOURCE BANK TO C
;LD B,BID_HB ; DEST BANK TO B (HSTBUF IN HBIOS)
LD A,(HBX_BNKBIOS) ; DEST BANK (HSTBUF IN HBIOS)
LD B,A ; PUT IN B
LD B,BID_HB ; DEST BANK TO B (HSTBUF IN HBIOS)
;LD A,(HB_BNKBIOS) ; DEST BANK (HSTBUF IN HBIOS)
;LD B,A ; PUT IN B
LD DE,(HB_DSKBUF) ; DEST ADDRESS TO DE; HL ALREADY HAS SOURCE ADDRESS
; REVERSE VALUES IF WRITE
POP AF ; Read or Write?
@ -81,9 +81,9 @@ RAMWR2:
LD B,A
RAMWR3:
; PERFORM THE COPY
CALL HBX_XCOPY ; SET BANKS FOR COPY
CALL XMOVE ; SET BANKS FOR COPY
LD BC,128 ; SET LENGTH OF COPY (ONE SECTOR)
CALL HBX_COPY ; DO THE COPY
CALL MOVE ; DO THE COPY
; CLEAN UP AND RETURN
XOR A ; SIGNAL SUCCESS
RET ; AND RETURN

52
Source/BPBIOS/romwbw.lib

@ -12,46 +12,66 @@ HBIOS EQU YES ; Use HBIOS functions
HBLOC EQU 0FE00H ; Location of HBIOS proxy
MEMTOP EQU HBLOC - 1 ; Last usable address
;
HB_DEBUG EQU FALSE ; See hbios.z80 file
;
; TODO: Query system via HBIOS API to determine actual size of
; RAM and ROM, then adjust BPBIOS operation accordingly.
;
HB_RAMBANKS EQU 16 ; For systems with 512K of RAM
;HB_RAMBANKS EQU 32 ; For systems with 1MB of RAM
HB_ROMBANKS EQU 16 ; For systems with 512K of ROM
;HB_ROMBANKS EQU 32 ; For systems with 1MB of ROM
;
; Set HB_IODEV to appropriate console device
; Set HB_IODEV to desired HBIOS character device unit number
;
; TODO: Query system via HBIOS API to determine number of serial
; devices available and assign up to 3 of them to the 3 serial
; device slots in BPBIOS at boot.
;
HB_IODEV EQU 0 ; Assume we want to use first HBIOS serial device
HB_IODEV EQU 80H ; 0x80 is current HBIOS console
;
; Set HB_MDDEV to appropriate memory disk driver
; Set HB_MDRAM/ROM to desired HBIOS disk device numbers
;
HB_MDRAM EQU 0 ; HBIOS Disk Device #0 is normally RAM Disk
HB_MDROM EQU 1 ; HBIOS Disk Device #1 is normally ROM Disk
HB_MDRAM EQU 0 ; HBIOS Disk Unit #0 is usually the RAM Disk
HB_MDROM EQU 1 ; HBIOS Disk Unit #1 is usually the ROM Disk
;
; Set HB_HDDEV to appropriate hard disk driver
; Set HB_HDDEVN to appropriate HBIOS disk device numbers
;
HB_HDDEV0 EQU 2 ; First hard disk is HBIOS Disk Device #2
; If the RomWBW system has no floppy drives, then the hard disk units
; will start right after the memory disk units. So, the first hard disk
; will be unit #2. Refer to the DPH entries to see how the HBIOS
; units are mapped to drive letters.
;
HB_HDDEV0 EQU 2 ; If no floppy drives in system, first HBIOS hard disk is unit #2
HB_HDDEV1 EQU 3 ; Second hard disk is HBIOS Disk Device #3
HB_HDDEV2 EQU 4 ; Third hard disk is HBIOS Disk Device #4
;
; Floppy disk support
;
; TODO: Query HBIOS to see if system has floppy drive(s)
; TODO: Query HBIOS to see if system has floppy drive(s). For now
; we do not really support floppy drives.
;
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
; 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.
;
HB_RAMBLKS EQU (HB_RAMBANKS - 8) * 16
HB_ROMBLKS EQU (HB_ROMBANKS - 4) * 16
;
; Layout of RAM banks
;
BID_RAMD EQU 80H
BID_RAMM EQU 80H + HB_RAMBANKS - 9
BID_SYS EQU 80H + HB_RAMBANKS - 4
BID_HB EQU 80H + HB_RAMBANKS - 3
BID_USR EQU 80H + HB_RAMBANKS - 2
BID_COM EQU 80H + HB_RAMBANKS - 1
; TODO: Query system via HBIOS API to determine the actual bank
; assignments, then adjust BPBIOS operation accordingly.
;
BID_RAMD EQU -16 ; 90h - 16 = 80h
BID_RAMM EQU -9 ; 90h - 9 = 87h
BID_SYS EQU -4 ; 90h - 4 = 8Ch
BID_HB EQU -3 ; 90h - 3 = 8Dh
BID_USR EQU -2 ; 90h - 2 = 8Eh
BID_COM EQU -1 ; 90h - 1 = 8Fh
;
HB_EI MACRO
EI
@ -59,4 +79,4 @@ HB_EI MACRO
HB_DI MACRO
DI
ENDM



7
Source/BPBIOS/util.z80

@ -306,8 +306,11 @@ COUT:
PUSH BC
PUSH DE
PUSH HL
LD C,A
CALL CONOUT
;LD C,A
;CALL CONOUT
LD E,A ; OUTPUT CHAR TO E
LD BC,0180H
CALL HBX_INVOKE
POP HL
POP DE
POP BC

11
Source/BPBIOS/wboot-ww.z80

@ -17,19 +17,26 @@ WBOOT:
LD SP,80H ; Use space below default buffer
ENDIF
;CALL PRTSTRD ; DEBUG
;DEFB '[WBOOT]$' ; DEBUG
IF FASTWB
; Restore command processor from
; cache in (SYSBNK):100H. We assume that the
; command processor lives in high memory.
;
; It is critical that we use the HB variants of MOVE and XMOVE
; because we are moving between banks even in a non-banked
; system!
LD A,(SYSBNK) ; Source bank is SYSBNK
LD C,A ; Put it in C
LD A,(TPABNK) ; Destination bank is TPABNK
LD B,A ; Put it in B
CALL HBX_XCOPY ; Set banks for extended copy
CALL HB_XMOVE ; Set banks for extended copy
LD HL,100H ; Copy from start of cache in SYS
LD DE,(CPADR) ; .. to location of command processor in TPA
LD BC,(CPLEN) ; Length of command processor
CALL HBX_COPY ; Do it
CALL HB_MOVE ; Do it
; call PRTSTRD ; DEBUG
; defb CR,LF ; DEBUG
; defb 'WB - copied C' ; DEBUG

16
Source/BPBIOS/zst.zex

@ -1,15 +1,15 @@
;; Set the ZCPR and ZSDOS paths
C15:ZPATH $$$$ A0 B0 C15 C0 /D=$$$$ C15 C0
c15:zpath $$$$ a0 b0 c15 c0 /d=$$$$ c15 c0
;; Load ZCPR segments
jetldr RCP-16H.ZRL,FCP-4T.ZRL,BPBIO.NDR,NZDEC23D.Z3T
;; Load date/time extension
jetldr rcp-16h.zrl,fcp-4t.zrl,bpbio.ndr,nzdec23d.z3t
;; Load date/time extension into user space
ldtimec
;; Initialize the RAM disk if needed and copy some useful file there
if ~EX A0:-RAM.000
putds -d=A:
fileattr a0:*.dat /nd
;; Initialize the RAM disk if needed and copy some useful files there
if ~ex a0:-ram.000
putds -d=a:
relog
save 0 a:-ram.000
rcopy ramfiles.txt A0: /Q
rcopy ramfiles.txt a0: /q
fi
;; Load the command history shell and editor
lsh

14
Source/BPBIOS/zstf.zex

@ -1,15 +1,15 @@
;; Set the ZCPR and ZSDOS paths
C15:ZPATH $$$$ A0 B0 C15 C0 /D=$$$$ C15 C0
c15:zpath $$$$ a0 b0 c15 c0 /d=$$$$ c15 c0
;; Enable clock and turn off last access stamping
zscfg2 cb +a-
;; Load ZCPR segments
jetldr FCP-4T.ZRL,BPBIO.NDR,NZDEC23D.Z3T
;; Initialize the RAM disk if needed and copy some useful file there
if ~EX A0:-RAM.000
putds -d=A:
fileattr a0:*.dat /nd
jetldr fcp-4t.zrl,bpbio.ndr,nzdec23d.z3t
;; Initialize the RAM disk if needed and copy some useful files there
if ~ex a0:-ram.000
putds -d=a:
relog
save 0 a0:-ram.000
rcopy ramfiles.txt A0: /Q
rcopy ramfiles.txt a0: /q
fi
;; Load the command history shell and editor
lsh

Loading…
Cancel
Save