diff --git a/Doc/ChangeLog.txt b/Doc/ChangeLog.txt index 27ab4262..c2cfc6a6 100644 --- a/Doc/ChangeLog.txt +++ b/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 ----------- diff --git a/Source/BPBIOS/bpbio-ww.z80 b/Source/BPBIOS/bpbio-ww.z80 index 18deff98..f06b3587 100644 --- a/Source/BPBIOS/bpbio-ww.z80 +++ b/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 diff --git a/Source/BPBIOS/cboot-ww.z80 b/Source/BPBIOS/cboot-ww.z80 index 570f6331..9cae3bb7 100644 --- a/Source/BPBIOS/cboot-ww.z80 +++ b/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 diff --git a/Source/BPBIOS/deblock.z80 b/Source/BPBIOS/deblock.z80 index d0e2d8ad..35dc4cbd 100644 --- a/Source/BPBIOS/deblock.z80 +++ b/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,17 +301,19 @@ 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 + + IF BANKED + IF INROM LD A,(TPABNK) ; If bank in ROM, HSTBUF is in TPA LD C,A - ELSE + ELSE LD A,(SYSBNK) ; If bank in RAM, HSTBUF is in System Bank LD C,A - ENDIF ;INROM + ENDIF ;INROM LD A,(DMABNK) ; Set Read Destination Bank LD B,A LD A,(READOP) ; Direction? @@ -321,7 +323,7 @@ RWMOVE: CALL HBX_COPY ; Handle possible inter-bank move LD B,C LD C,A OKBNKS: CALL XMOVE ; Set source & destination banks - ENDIF ;BANKED + ENDIF ;BANKED LD DE,HSTBUF ; Host buffer address ADD HL,DE ; Point to the sector LD DE,(DMAADR) ; User's buffer diff --git a/Source/BPBIOS/hard-ww.z80 b/Source/BPBIOS/hard-ww.z80 index 565aab52..133520f6 100644 --- a/Source/BPBIOS/hard-ww.z80 +++ b/Source/BPBIOS/hard-ww.z80 @@ -139,24 +139,10 @@ 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 +; +; HBIOS disk commands ; HB_DSKRD EQU 13H HB_DSKWR EQU 14H @@ -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 diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index acc46cca..4d895a06 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/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,101 +18,189 @@ 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 -; -;================================================================================================== -; HBIOS INITIALIZATION -;================================================================================================== -; -; This code should be moved to follow CBOOT so that it will be reused -; by RAM data. -; -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) + +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; 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: BID_COM 90h - 1 = 8Fh + ; -2: TPABNK BID_USR 90h - 2 = 8Eh + ; -3: 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,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) + 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 - IF BANKED +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; 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 - ; 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 +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +; Set Banks for Inter-Bank Xfer. Save all Registers. +; B = Destination Bank, C = Source Bank +;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - ENDIF ;BANKED +HB_XMOVE: + LD (HB_SRCBNK),BC + RET -; begin debug +; +;================================================================================================== +; 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 - 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 + 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 + ENDIF ;BANKED CALL NEWLINE @@ -123,129 +213,17 @@ HB_STR_BANK2: DB ", BANK2=$" HB_STR_B2RAM: DB ", B2RAM=$" HB_STR_RESVD: DB ", RESVD=$" -; end 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 + ELSE ; [HB_DEBUG] + 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 -;================================================================================================== + ENDIF ; [HB_DEBUG] -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 - -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 - \ No newline at end of file +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 + \ No newline at end of file diff --git a/Source/BPBIOS/ibmv-ww.z80 b/Source/BPBIOS/ibmv-ww.z80 index 400090fb..38b8e648 100644 --- a/Source/BPBIOS/ibmv-ww.z80 +++ b/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 ===========================  \ No newline at end of file diff --git a/Source/BPBIOS/ramd-ww.z80 b/Source/BPBIOS/ramd-ww.z80 index 35566c46..2cdc8267 100644 --- a/Source/BPBIOS/ramd-ww.z80 +++ b/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 diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index 059b6191..864042be 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/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 - \ No newline at end of file + \ No newline at end of file diff --git a/Source/BPBIOS/util.z80 b/Source/BPBIOS/util.z80 index 7df8ceba..b5ba21fb 100644 --- a/Source/BPBIOS/util.z80 +++ b/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 diff --git a/Source/BPBIOS/wboot-ww.z80 b/Source/BPBIOS/wboot-ww.z80 index dbdb5509..d23743d3 100644 --- a/Source/BPBIOS/wboot-ww.z80 +++ b/Source/BPBIOS/wboot-ww.z80 @@ -16,20 +16,27 @@ WBOOT: ELSE 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 diff --git a/Source/BPBIOS/zst.zex b/Source/BPBIOS/zst.zex index 3241aeeb..01cf9858 100644 --- a/Source/BPBIOS/zst.zex +++ b/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 diff --git a/Source/BPBIOS/zstf.zex b/Source/BPBIOS/zstf.zex index e573e700..1e811865 100644 --- a/Source/BPBIOS/zstf.zex +++ b/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