Browse Source

BPBIOS and Date Stamping Cleanups

- Improved BPBIOS compatibility
- Enhanced STAMPS.DAT w/ NZT stamp
pull/3/head
Wayne Warthen 9 years ago
parent
commit
4ab1cadfad
  1. 4
      Source/BPBIOS/Build.cmd
  2. 216
      Source/BPBIOS/hbios.z80
  3. 12
      Source/BPBIOS/ibmv-ww.z80
  4. 14
      Source/BPBIOS/romwbw.lib
  5. 135
      Source/HBIOS/hbios.asm
  6. BIN
      Source/Images/hd0/s1/u0/LDNZT.COM
  7. BIN
      Source/Images/hd0/s1/u0/STAMPS.DAT
  8. BIN
      Source/ZSDOS/Clock/LDNZT.COM
  9. 2
      Source/ZSDOS/Clock/ReadMe.txt
  10. BIN
      Source/ZSDOS/Clock/STAMPS.DAT
  11. 5
      Tools/simh/Sim.cfg

4
Source/BPBIOS/Build.cmd

@ -10,7 +10,7 @@ set ZXINCDIR=../../tools/cpm/include/
pushd ZCPR33 && call Build.cmd && popd pushd ZCPR33 && call Build.cmd && popd
pause
rem pause
call :makebp 33t call :makebp 33t
call :makebp 33tbnk call :makebp 33tbnk
@ -25,7 +25,7 @@ call :makebp 34nbnk
call :makebp 41tbnk call :makebp 41tbnk
call :makebp 41nbnk call :makebp 41nbnk
pause
rem pause
cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:ws*.* cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:ws*.*

216
Source/BPBIOS/hbios.z80

@ -8,7 +8,8 @@ HB_DEFBNK EQU BID_USR ; Default bank number
; ;
; LOCATION OF DISPATCH ENTRY IN HBIOS BANK ; LOCATION OF DISPATCH ENTRY IN HBIOS BANK
; ;
HB_DISPATCH EQU 0403H
HB_DISPATCH EQU 403H
HB_STACK EQU 500H
; ;
; PLATFORM SPECIFIC CONSTANTS ; PLATFORM SPECIFIC CONSTANTS
; ;
@ -76,7 +77,7 @@ HBX_BNKCPY EQU 0FFF6H
HBX_BNKCALL EQU 0FFF9H HBX_BNKCALL EQU 0FFF9H
HB_CURBNK EQU 0FFE0H HB_CURBNK EQU 0FFE0H
;HB_PRVBNK EQU 0FFE1H
HB_INVBNK EQU 0FFE1H
HB_SRCADR EQU 0FFE2H HB_SRCADR EQU 0FFE2H
HB_SRCBNK EQU 0FFE4H HB_SRCBNK EQU 0FFE4H
HB_DSTADR EQU 0FFE5H HB_DSTADR EQU 0FFE5H
@ -114,6 +115,19 @@ HBX_INIT:
LD (HB_SRCBNK),A LD (HB_SRCBNK),A
LD (HB_DSTBNK),A LD (HB_DSTBNK),A
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
ENDIF
RET RET
HBX_XCOPY: HBX_XCOPY:
@ -124,16 +138,14 @@ HBX_XCOPY:
RET RET
HBX_COPY: HBX_COPY:
LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_STACK ; Activate our private stack
CALL HBX_BNKCPY ; Do the work with private stack active
LD SP,(HBX_STKSAV) ; Back to original stack
RET
JP HBX_BNKCPY
IF INTPXY IF INTPXY
;
;==================================================================================================
; SELECT MEMORY BANK FOR LOWER 32K
;==================================================================================================
HBX_BNKSEL: HBX_BNKSEL:
LD (HB_CURBNK),A LD (HB_CURBNK),A
@ -186,136 +198,131 @@ HBX_ROM:
RLCA RLCA
OUT0 (CPU_BBR),A OUT0 (CPU_BBR),A
RET RET
ENDIF ENDIF
;==================================================================================================
; INTERBANK MEMORY COPY
;==================================================================================================
HBX_BNKCPY:
HB_DI ; NOTE: ONLY REQUIRED WHEN USING IM 1
LD (HBX_STKSAV),SP
LD SP,HBX_TMPSTK
LD A,(HB_CURBNK) ; GET CURRENT BANK
PUSH AF ; AND SAVE TO RESTORE LATER
PUSH BC ; CUR LEN -> (SP)
; ;
; Entry point HBX_BNKCPY is for use internally and
; assumes a valid stack already exists in upper 32K.
HBX_BC_LOOP:
EX (SP),HL ; HL := CUR LEN, (SP) := CUR SRC
LD BC,HBX_BUFSIZ ; SET BC TO BOUNCE BUFFER SIZE
OR A ; CLEAR CARRY FLAG
SBC HL,BC ; CUR LEN := CUR LEN - BBUF SIZE
JR C,HBX_BC_LAST ; END GAME, LESS THAN BBUF BYTES LEFT
EX (SP),HL ; HL := CUR SRC, (SP) := REM LEN
CALL HBX_BC_ITER ; DO A FULL BBUF SIZE CHUNK
JR HBX_BC_LOOP ; AND REPEAT TILL DONE
; ;
HBX_BNKCPY:
; Save current bank to restore at end
LD A,(HB_CURBNK)
LD (HBX_CPYBNK),A
; Setup for copy loop
LD (HB_SRCADR),HL ; Init working source adr
LD (HB_DSTADR),DE ; Init working dest adr
LD H,B ; Move bytes to copy from BC...
LD L,C ; to HL to use as byte counter
HBX_COPY2: ; Copy loop
LD A,L ; Low byte of count to A
AND 7FH ; Isolate bits relevant to 128 byte buf
LD BC,80H ; Assume full buf copy
JR Z,HBX_COPY3 ; If full buf copy, go do it
LD C,A ; Otherwise, BC := bytes to copy
HBX_COPY3:
PUSH HL ; Save bytes left to copy
CALL HBX_COPY4 ; Do it
POP HL ; Recover bytes left to copy
XOR A ; Clear CF
SBC HL,BC ; Reflect bytes copied in HL
JR NZ,HBX_COPY2 ; If any left, then loop
; FIX: this should be done elsewhere!!!
LD A,HB_DEFBNK ; Default bank id
LD (HB_SRCBNK),A ; ... to source bank id
LD (HB_DSTBNK),A ; ... and destination bank id
LD A,0FFH ; Load original bank ($FF is replaced at entry)
HBX_CPYBNK EQU $ - 1
JR HBX_BNKSEL ; Return via bank set
HBX_COPY4:
; Switch to source bank
LD A,(HB_SRCBNK) ; Get source bank
CALL HBX_BNKSEL ; Set bank without making it current
; Copy BC bytes from HL -> BUF
; Allow HL to increment
PUSH BC ; Save copy length
LD HL,(HB_SRCADR) ; Point to source adr
LD DE,HBX_BUF ; Setup buffer as interim destination
LDIR ; Copy BC bytes: src -> buffer
LD (HB_SRCADR),HL ; Update source adr
POP BC ; Recover copy length
HBX_BC_LAST:
; HL IS BETWEEN -(BBUF SIZE) AND -1, BC = BBUF SIZE
OR A ; CLEAR CARRY
ADC HL,BC ; HL := REM LEN (0 - 127)
EX (SP),HL ; HL := CUR SRC, (SP) := REM LEN
POP BC ; BC := REM LEN
CALL NZ,HBX_BC_ITER ; DO FINAL CHUNK, BUT ONLY IF NOT ZERO BYTES
POP AF ; RECOVER ORIGINAL BANK
CALL HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT
LD SP,(HBX_STKSAV)
; Switch to dest bank
LD A,(HB_DSTBNK) ; Get destination bank
CALL HBX_BNKSEL ; Set bank without making it current
; Copy BC bytes from BUF -> HL
; Allow DE to increment
PUSH BC ; Save copy length
LD HL,HBX_BUF ; Use the buffer as source now
LD DE,(HB_DSTADR) ; Setup final destination for copy
LDIR ; Copy BC bytes: buffer -> dest
LD (HB_DSTADR),DE ; Update dest adr
POP BC ; Recover copy length
RET ; Done
HB_EI ; NOTE: ONLY REQUIRED WHEN USING IM 1
RET
; ;
HBX_BC_ITER:
; HL = SRC ADR, DE = DEST ADR, BC = LEN
PUSH BC ; SAVE COPY LEN
PUSH DE ; FINAL DEST ON STACK
LD DE,HBX_BUF ; SET DEST TO BUF
LD A,(HB_SRCBNK) ; GET SOURCE BANK
CALL HBX_BNKSEL ; SWITCH TO SOURCE BANK
LDIR ; HL -> BUF (DE), BC BYTES, HL UPDATED SRC ADR
POP DE ; DE := FINAL DEST
POP BC ; GET LEN BACK IN BC
PUSH HL ; SAVE UPDATED SRC ADR
LD HL,HBX_BUF ; SET SRC ADR TO BUF
LD A,(HB_DSTBNK) ; GET DEST BANK
CALL HBX_BNKSEL ; SWITCH TO DEST BANK
LDIR ; BUF (HL) -> DE, BC BYTES, DE UPDATED DEST ADR
POP HL ; RECOVER UPDATED SRC ADR
; HL = UPD SRC, DE = UPD DEST, BC = 0
RET
;==================================================================================================
; ENTRY POINT FOR BIOS FUNCTIONS (TARGET OF RST 08) ; ENTRY POINT FOR BIOS FUNCTIONS (TARGET OF RST 08)
;
;==================================================================================================
HBX_INVOKE: HBX_INVOKE:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME
LD A,(HB_CURBNK) ; GET CURRENT BANK LD A,(HB_CURBNK) ; GET CURRENT BANK
LD (HB_INVBNK),A ; SAVE INVOCATION BANK LD (HB_INVBNK),A ; SAVE INVOCATION BANK
;DI
LD SP,HBX_STACK ; SETUP NEW STACK FRAME
; HB_DI
LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM FOR BANK SWITCH
LD A,BID_HB ; HBIOS BANK LD A,BID_HB ; HBIOS BANK
CALL HBX_BNKSEL ; SELECT IT CALL HBX_BNKSEL ; SELECT IT
;EI
LD SP,HB_STACK ; NOW USE FULL HBIOS STACK IN HBIOS BANK
; HB_EI
CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER
;DI
; HB_DI
LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM FOR BANK SWITCH
PUSH AF ; SAVE AF (FUNCTION RETURN) PUSH AF ; SAVE AF (FUNCTION RETURN)
LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK
CALL HBX_BNKSEL ; SELECT IT CALL HBX_BNKSEL ; SELECT IT
POP AF ; RESTORE AF POP AF ; RESTORE AF
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
;EI
LD SP,0 ; RESTORE ORIGINAL STACK FRAME
HBX_INVSP EQU $ - 2
; HB_EI
RET ; RETURN TO CALLER RET ; RETURN TO CALLER
ENDIF ENDIF
;================================================================================================== ;==================================================================================================
; Load A,(HL) from Alternate Bank (in Reg C)
; LD A,(C:HL)
;================================================================================================== ;==================================================================================================
HBX_FRGETB: HBX_FRGETB:
LD (HBX_STKSAV),SP ; Save current stack LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_STACK ; Activate our private stack
LD SP,HBX_TMPSTK ; Activate our private stack
LD A,(HB_CURBNK) ; Get current bank LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank LD (HBX_BNKSAV),A ; Save current bank
PUSH BC PUSH BC
LD A,C LD A,C
;DI
HB_DI
CALL HBX_BNKSEL CALL HBX_BNKSEL
LD C,(HL) LD C,(HL)
LD A,(HBX_BNKSAV) LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL CALL HBX_BNKSEL
;EI
HB_EI
LD A,C LD A,C
POP BC POP BC
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET RET
;================================================================================================== ;==================================================================================================
; Load DE,(HL) from Alternate Bank
; LD DE,(C:HL)
;================================================================================================== ;==================================================================================================
HBX_FRGETW: HBX_FRGETW:
LD (HBX_STKSAV),SP ; Save current stack LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_STACK ; Activate our private stack
LD SP,HBX_TMPSTK ; Activate our private stack
LD A,(HB_CURBNK) ; Get current bank LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank LD (HBX_BNKSAV),A ; Save current bank
LD A,C LD A,C
;DI
HB_DI
CALL HBX_BNKSEL CALL HBX_BNKSEL
LD E,(HL) LD E,(HL)
INC HL INC HL
@ -323,17 +330,17 @@ HBX_FRGETW:
DEC HL DEC HL
LD A,(HBX_BNKSAV) LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL CALL HBX_BNKSEL
;EI
HB_EI
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET RET
;================================================================================================== ;==================================================================================================
; Load (HL),A to Alternate Bank (in Reg C)
; LD (C:HL),A
;================================================================================================== ;==================================================================================================
HBX_FRPUTB: HBX_FRPUTB:
LD (HBX_STKSAV),SP ; Save current stack LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_STACK ; Activate our private stack
LD SP,HBX_TMPSTK ; Activate our private stack
PUSH AF PUSH AF
LD A,(HB_CURBNK) ; Get current bank LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank LD (HBX_BNKSAV),A ; Save current bank
@ -341,27 +348,27 @@ HBX_FRPUTB:
PUSH BC PUSH BC
LD B,A LD B,A
LD A,C LD A,C
;DI
HB_DI
CALL HBX_BNKSEL CALL HBX_BNKSEL
LD (HL),B LD (HL),B
LD A,(HBX_BNKSAV) LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL CALL HBX_BNKSEL
;EI
HB_EI
POP BC POP BC
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET RET
;================================================================================================== ;==================================================================================================
; Load (HL),DE to Alternate Bank
; LD (C:HL),DE
;================================================================================================== ;==================================================================================================
HBX_FRPUTW: HBX_FRPUTW:
LD (HBX_STKSAV),SP ; Save current stack LD (HBX_STKSAV),SP ; Save current stack
LD SP,HBX_STACK ; Activate our private stack
LD SP,HBX_TMPSTK ; Activate our private stack
LD A,(HB_CURBNK) ; Get current bank LD A,(HB_CURBNK) ; Get current bank
LD (HBX_BNKSAV),A ; Save current bank LD (HBX_BNKSAV),A ; Save current bank
LD A,C LD A,C
;DI
HB_DI
CALL HBX_BNKSEL CALL HBX_BNKSEL
LD (HL),E LD (HL),E
INC HL INC HL
@ -369,26 +376,25 @@ HBX_FRPUTW:
DEC HL DEC HL
LD A,(HBX_BNKSAV) LD A,(HBX_BNKSAV)
CALL HBX_BNKSEL CALL HBX_BNKSEL
;EI
HB_EI
LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME
RET RET
;================================================================================================== ;==================================================================================================
;
; PRIVATE DATA ; PRIVATE DATA
;
;==================================================================================================
DSEG DSEG
HB_DSKBUF DEFW 0 ; Address of physical disk buffer in HBIOS bank HB_DSKBUF DEFW 0 ; Address of physical disk buffer in HBIOS bank
HBX_BNKSAV DEFB 0 ; Saved bank id during HBIOS calls HBX_BNKSAV DEFB 0 ; Saved bank id during HBIOS calls
HBX_STKSAV DEFW 0 ; Saved stack pointer during HBIOS calls HBX_STKSAV DEFW 0 ; Saved stack pointer during HBIOS calls
DEFS 64 ; Private stack for HBIOS
HBX_STACK EQU $ ; Top of private stack
DEFS 32 ; Private stack for HBIOS
HBX_TMPSTK EQU $ ; Top of private stack
IF INTPXY IF INTPXY
HBX_RETBNK DEFB 0 ; Bank to activate on return from BNKCPY
HBX_BUF DEFS 80H ; Interbank copy buffer
HBX_BUFSIZ EQU 40H
HBX_BUF DEFS HBX_BUFSIZ ; Interbank copy buffer
ENDIF ENDIF

12
Source/BPBIOS/ibmv-ww.z80

@ -30,11 +30,11 @@ BIOSTK: DEFB 0 ; NOP if not currently in bank,
LD (USP-7),HL ; Save entry HL LD (USP-7),HL ; Save entry HL
POP HL ; Retrieve caller's return address from stack POP HL ; Retrieve caller's return address from stack
LD (USP-5),HL ; ..and set in our stack for local return LD (USP-5),HL ; ..and set in our stack for local return
;DI ; No interrupts while we play with the stack
HB_DI ; No interrupts while we play with the stack
LD (USP),SP ; Save User's Stack Pointer LD (USP),SP ; Save User's Stack Pointer
LD SP,USP-1 ; ..and point locally, saving 1 byte for Bank LD SP,USP-1 ; ..and point locally, saving 1 byte for Bank
PUSH AF ; Save entry A and Flags PUSH AF ; Save entry A and Flags
LD A,(CURBNK) ; Get current bank
LD A,(HB_CURBNK) ; Get current bank
LD (USP-1),A ; ..and save for exitting LD (USP-1),A ; ..and save for exitting
LD A,0C9H ; Disable other calls here LD A,0C9H ; Disable other calls here
LD (BIOSTK),A ; ..by poking a RETurn at entry LD (BIOSTK),A ; ..by poking a RETurn at entry
@ -43,7 +43,7 @@ BIOSTK: DEFB 0 ; NOP if not currently in bank,
PUSH HL ; ..at USP-2 & 3 PUSH HL ; ..at USP-2 & 3
LD SP,USP-7 ; Point stack pointer to do local return LD SP,USP-7 ; Point stack pointer to do local return
POP HL ; .restoring entry HL POP HL ; .restoring entry HL
;EI ; ..enabling interrupts
HB_EI ; ..enabling interrupts
RET ; And return to caller RET ; And return to caller
; Restore User Stack and Bank Routine ; Restore User Stack and Bank Routine
@ -51,7 +51,6 @@ BIOSTK: DEFB 0 ; NOP if not currently in bank,
USRSTK: PUSH AF USRSTK: PUSH AF
LD A,(USP-1) ; Get bank control byte from entry LD A,(USP-1) ; Get bank control byte from entry
CALL HBX_BNKSEL CALL HBX_BNKSEL
LD (CURBNK),A
XOR A XOR A
LD (BIOSTK),A ; Patch NOP back in at start of code LD (BIOSTK),A ; Patch NOP back in at start of code
POP AF POP AF
@ -65,7 +64,6 @@ USRSTK: PUSH AF
FRCLR: PUSH AF ; Save any entry in AF FRCLR: PUSH AF ; Save any entry in AF
LD A,(USP-1) ; Get bank control byte LD A,(USP-1) ; Get bank control byte
CALL HBX_BNKSEL CALL HBX_BNKSEL
LD (CURBNK),A ; WW: I ADDED THIS, IS IT RIGHT???
XOR A XOR A
LD (BIOSTK),A ; Patch NOP to enable stack switcher LD (BIOSTK),A ; Patch NOP to enable stack switcher
POP AF POP AF
@ -90,7 +88,7 @@ ABORT: LD SP,USP ; Insure stack is in Common Memory
; Uses : AF ; Uses : AF
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
RETMEM: LD A,(CURBNK)
RETMEM: LD A,(HB_CURBNK)
RET RET
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@ -109,7 +107,6 @@ SELMEM: LD (USRBNK),A ; Update user bank
SELBNK: PUSH AF ; Save regs SELBNK: PUSH AF ; Save regs
SELBN0: CALL HBX_BNKSEL SELBN0: CALL HBX_BNKSEL
LD (CURBNK),A ; Save as current bank #
POP AF ; restore regs POP AF ; restore regs
RET RET
@ -188,7 +185,6 @@ FRPUTW:
JPBNK: DEFS 1 ; Bank # for Far Jump or Call JPBNK: DEFS 1 ; Bank # for Far Jump or Call
USRBNK: DEFS 1 ; User's selected bank # USRBNK: DEFS 1 ; User's selected bank #
CURBNK: DEFS 1 ; Current bank #
DMABNK: DEFS 1 ; Target bank # for disk xfers DMABNK: DEFS 1 ; Target bank # for disk xfers
DEFS 64 ; 32 level stack DEFS 64 ; 32 level stack
USP: DEFS 2 ; User stack pointer USP: DEFS 2 ; User stack pointer

14
Source/BPBIOS/romwbw.lib

@ -66,3 +66,17 @@ MEMTOP EQU 0FFE0H - 1 ; Start of HBIOS 32 byte control block
ELSE ELSE
MEMTOP EQU HBLOC - 1 ; Start of HBIOS 512 byte proxy MEMTOP EQU HBLOC - 1 ; Start of HBIOS 512 byte proxy
ENDIF ENDIF
IF INTPXY
HB_EI MACRO
ENDM
HB_DI MACRO
ENDM
ELSE
HB_EI MACRO
EI
ENDM
HB_DI MACRO
DI
ENDM
ENDIF

135
Source/HBIOS/hbios.asm

@ -98,7 +98,7 @@ MODCNT .SET MODCNT + 1
RET RET
.FILL (030H - $),0FFH ; RST 30 .FILL (030H - $),0FFH ; RST 30
RET RET
.FILL (038H - $),0FFH ; RST 38 / INT
.FILL (038H - $),0FFH ; RST 38 / IM1 INT
RETI RETI
.FILL (066H - $),0FFH ; NMI .FILL (066H - $),0FFH ; NMI
RETN RETN
@ -204,39 +204,42 @@ HBX_IDENT:
;================================================================================================== ;==================================================================================================
; ;
HBX_INVOKE: HBX_INVOKE:
LD (HBX_STKSAV),SP ; SAVE ORIGINAL STACK FRAME
LD (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME
LD A,(HB_CURBNK) ; GET CURRENT BANK LD A,(HB_CURBNK) ; GET CURRENT BANK
LD (HB_INVBNK),A ; SAVE INVOCATION BANK LD (HB_INVBNK),A ; SAVE INVOCATION BANK
HB_DI
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
; HB_DI
LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM FOR BANK SWITCH
LD A,BID_BIOS ; HBIOS BANK LD A,BID_BIOS ; HBIOS BANK
CALL HBX_BNKSEL ; SELECT IT CALL HBX_BNKSEL ; SELECT IT
LD SP,HB_STACK ; NOW USE FULL HBIOS STACK IN HBIOS BANK LD SP,HB_STACK ; NOW USE FULL HBIOS STACK IN HBIOS BANK
HB_EI
; HB_EI
CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER
HB_DI
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
; HB_DI
LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM FOR BANK SWITCH
PUSH AF ; SAVE AF (FUNCTION RETURN) PUSH AF ; SAVE AF (FUNCTION RETURN)
LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK
CALL HBX_BNKSEL ; SELECT IT CALL HBX_BNKSEL ; SELECT IT
POP AF ; RESTORE AF POP AF ; RESTORE AF
LD SP,0 ; RESTORE ORIGINAL STACK FRAME LD SP,0 ; RESTORE ORIGINAL STACK FRAME
HBX_STKSAV .EQU $ - 2
HB_EI
HBX_INVSP .EQU $ - 2
; HB_EI
RET ; RETURN TO CALLER RET ; RETURN TO CALLER
; ;
;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;; SETBNK - Switch Memory Bank to Bank in A.
;; BNKSEL - Switch Memory Bank to Bank in A.
;; Preserve all Registers including Flags. ;; Preserve all Registers including Flags.
;; Does NOT update current bank.
;; Interrupts should be disabled by caller
;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; ;
HBX_BNKSEL: HBX_BNKSEL:
; IF AN INTERRUPT OCCURS DURING THE BANK SWITCH CODE,
; THE BANK WILL BE SET TO (CURBNK) AS THE INTERRUPT
; RETURNS. SO, IT IS IMPORTANT THAT (HB_CURBNK) BE
; SET AS THE FIRST STEP TO AVOID ISSUES IF AN INTERRUPT
; OCCURS DURING PROCESSING.
LD (HB_CURBNK),A ; RECORD NEW CURRENT BANK LD (HB_CURBNK),A ; RECORD NEW CURRENT BANK
; ;
HBX_BNKSEL_INT: HBX_BNKSEL_INT:
@ -308,9 +311,11 @@ HBX_BNKSEL1:
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
; ;
HBX_BNKCPY: HBX_BNKCPY:
#IF (INTTYPE == IT_SIMH)
HB_DI HB_DI
#ENDIF
LD (HBX_BC_SP),SP LD (HBX_BC_SP),SP
LD SP,HBX_STACK
LD SP,HBX_TMPSTK
LD A,(HB_CURBNK) ; GET CURRENT BANK LD A,(HB_CURBNK) ; GET CURRENT BANK
PUSH AF ; AND SAVE TO RESTORE LATER PUSH AF ; AND SAVE TO RESTORE LATER
@ -337,7 +342,9 @@ HBX_BC_LAST:
CALL HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT CALL HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT
LD SP,$FFFF LD SP,$FFFF
HBX_BC_SP .EQU $ - 2 HBX_BC_SP .EQU $ - 2
#IF (INTTYPE == IT_SIMH)
HB_EI HB_EI
#ENDIF
RET RET
; ;
HBX_BC_ITER: HBX_BC_ITER:
@ -359,39 +366,39 @@ HBX_BC_ITER:
; HL = UPD SRC, DE = UPD DEST, BC = 0 ; HL = UPD SRC, DE = UPD DEST, BC = 0
RET RET
; ;
; Call a routine in another bank saving and restoring the original bank.
; Caller MUST ensure stack is already in high memory.
; On input A=target bank, HL=target address
; CALL A ROUTINE IN ANOTHER BANK.
; CALLER MUST ENSURE STACK IS ALREADY IN HIGH MEMORY AND HAS ADEQUATE SPACE.
; ON INPUT A=TARGET BANK, HL=TARGET ADDRESS
; ;
HBX_BNKCALL: HBX_BNKCALL:
HB_DI
LD (HBX_TGTBNK),A ; stuff target bank to call into code below
LD (HBX_TGTADR),HL ; stuff address to call into code below
LD A,(HB_CURBNK) ; get current bank
PUSH AF ; save for return
LD (HBX_TGTBNK),A ; STUFF TARGET BANK TO CALL INTO CODE BELOW
LD (HBX_TGTADR),HL ; STUFF ADDRESS TO CALL INTO CODE BELOW
LD A,(HB_CURBNK) ; GET CURRENT BANK
PUSH AF ; SAVE FOR RETURN
HBX_TGTBNK .EQU $ + 1 HBX_TGTBNK .EQU $ + 1
LD A,$FF ; load bank to call ($FF overlaid at entry)
CALL HBX_BNKSEL ; activate the new bank
HB_EI
LD A,$FF ; LOAD BANK TO CALL ($FF OVERLAID AT ENTRY)
CALL HBX_BNKSEL ; ACTIVATE THE NEW BANK
HBX_TGTADR .EQU $ + 1 HBX_TGTADR .EQU $ + 1
CALL $FFFF ; call routine ($FFFF is overlaid above)
CALL $FFFF ; CALL ROUTINE ($FFFF IS OVERLAID ABOVE)
HB_DI
EX (SP),HL ; save hl and get bank to restore in hl
PUSH AF ; save af
LD A,H ; bank to restore to a
CALL HBX_BNKSEL ; restore it
POP AF ; recover af
POP HL ; recover hl
HB_EI
EX (SP),HL ; SAVE HL AND GET BANK TO RESTORE IN HL
PUSH AF ; SAVE AF
LD A,H ; BANK TO RESTORE TO A
CALL HBX_BNKSEL ; RESTORE IT
POP AF ; RECOVER AF
POP HL ; RECOVER HL
RET RET
; ;
; PEEK & POKE ROUTINES ; PEEK & POKE ROUTINES
; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED ; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED
; ;
HBX_PEEK: HBX_PEEK:
#IF (INTTYPE == IT_SIMH)
HB_DI HB_DI
#ENDIF
LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM
LD A,(HB_CURBNK) LD A,(HB_CURBNK)
PUSH AF PUSH AF
LD A,D LD A,D
@ -400,7 +407,11 @@ HBX_PEEK:
JR HBX_PPRET JR HBX_PPRET
; ;
HBX_POKE: HBX_POKE:
#IF (INTTYPE == IT_SIMH)
HB_DI HB_DI
#ENDIF
LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM
LD A,(HB_CURBNK) LD A,(HB_CURBNK)
PUSH AF PUSH AF
LD A,D LD A,D
@ -410,14 +421,23 @@ HBX_POKE:
HBX_PPRET: HBX_PPRET:
POP AF POP AF
CALL HBX_BNKSEL CALL HBX_BNKSEL
LD SP,0 ; RESTORE ORIGINAL STACK FRAME
HBX_PPSP .EQU $ - 2
#IF (INTTYPE == IT_SIMH)
HB_EI HB_EI
#ENDIF
RET RET
; ;
; SMALL TEMPORARY STACK FOR USE BY HB_INVOKE
;
.FILL 20,$CC ; 10 LEVEL STACK
HBX_TMPSTK .EQU $
;
; PRIVATE STACK AT END OF HBIOS CODE ; PRIVATE STACK AT END OF HBIOS CODE
; OCCUPIES SPACE BEFORE IVT ; OCCUPIES SPACE BEFORE IVT
; ;
HBX_STKSIZ .EQU $FF00 - $ HBX_STKSIZ .EQU $FF00 - $
.ECHO "HBIOS STACK space: "
.ECHO "HBIOS PROXY STACK space: "
.ECHO HBX_STKSIZ .ECHO HBX_STKSIZ
.ECHO " bytes.\n" .ECHO " bytes.\n"
.FILL HBX_STKSIZ,$FF .FILL HBX_STKSIZ,$FF
@ -464,33 +484,30 @@ INT_BAD: ; BAD INTERRUPT HANDLER
; ;
HBX_INT: ; COMMON INTERRUPT ROUTING CODE HBX_INT: ; COMMON INTERRUPT ROUTING CODE
; ;
; SAVE STATE (ASSUMES HL SAVED PREVIOUSLY)
LD (HBX_INT_SP),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
; SAVE STATE (HL SAVED PREVIOUSLY)
PUSH AF ; SAVE AF PUSH AF ; SAVE AF
PUSH BC ; SAVE BC PUSH BC ; SAVE BC
PUSH DE ; SAVE DE PUSH DE ; SAVE DE
LD (HBX_INT_SP),SP ; SAVE ORIGINAL STACK FRAME
LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
LD A,BID_BIOS ; HBIOS BANK LD A,BID_BIOS ; HBIOS BANK
CALL HBX_BNKSEL_INT ; SELECT IT CALL HBX_BNKSEL_INT ; SELECT IT
;LD SP,HB_ISTACK ; NOW USE INT STACK IN HBIOS BANK
CALL JPHL ; CALL INTERRUPT ROUTINE CALL JPHL ; CALL INTERRUPT ROUTINE
;LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM
LD A,(HB_CURBNK) ; GET PRE-INT BANK LD A,(HB_CURBNK) ; GET PRE-INT BANK
CALL HBX_BNKSEL ; SELECT IT CALL HBX_BNKSEL ; SELECT IT
LD SP,$FFFF ; RESTORE ORIGINAL STACK FRAME
HBX_INT_SP .EQU $ - 2
; RESTORE STATE ; RESTORE STATE
POP DE ; RESTORE DE POP DE ; RESTORE DE
POP BC ; RESTORE BC POP BC ; RESTORE BC
POP AF ; RESTORE AF POP AF ; RESTORE AF
LD SP,$FFFF ; RESTORE ORIGINAL STACK FRAME
HBX_INT_SP .EQU $ - 2
POP HL ; RESTORE HL POP HL ; RESTORE HL
EI ; ENABLE INTERRUPTS EI ; ENABLE INTERRUPTS
@ -536,15 +553,20 @@ HBX_BUF .FILL HBX_BUFSIZ,0
; HBIOS CORE ; HBIOS CORE
;================================================================================================== ;==================================================================================================
; ;
HB_STKSIZ .EQU $60 ; HBIOS PRIVATE STACK SIZE
HB_ISTKSIZ .EQU $40 ; HBIOS INTERRUPT STACK SIZE
;
;================================================================================================== ;==================================================================================================
; ENTRY VECTORS (JUMP TABLE)
; ENTRY VECTORS (JUMP TABLE) AND INTERNAL PROCESSING STACK
;================================================================================================== ;==================================================================================================
;
HB_ENTRYTBL .EQU $
; ;
JP HB_START ; HBIOS INITIALIZATION JP HB_START ; HBIOS INITIALIZATION
JP HB_DISPATCH ; VECTOR TO DISPATCHER JP HB_DISPATCH ; VECTOR TO DISPATCHER
;
HB_STKSIZ .EQU HB_ENTRYTBL + 256 - $
;
.FILL HB_STKSIZ,$FF ; USE REMAINDER OF PAGE FOR HBIOS STACK
HB_STACK .EQU $ ; TOP OF HBIOS STACK
; ;
;================================================================================================== ;==================================================================================================
; SYSTEM INITIALIZATION ; SYSTEM INITIALIZATION
@ -721,9 +743,14 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK
; ;
; SETUP TIMER INT VECTOR VIA INT MODE 1 IN PAGE ZERO ; SETUP TIMER INT VECTOR VIA INT MODE 1 IN PAGE ZERO
LD A,$C3 ; JP OPCODE LD A,$C3 ; JP OPCODE
LD ($38),A ; ... AT INT VECTOR ADDRESS
;LD ($38),A ; ... AT INT VECTOR ADDRESS
LD ($30),A ; ... AT INT VECTOR ADDRESS
LD HL,INT_TIMER ; ADDRESS OF TIMER INT HANDLER LD HL,INT_TIMER ; ADDRESS OF TIMER INT HANDLER
LD ($39),HL ; ... IS TARGET OF JP
;LD ($39),HL ; ... IS TARGET OF JP
LD ($31),HL ; ... IS TARGET OF JP
LD HL,INT_TIMER
LD (HBX_IVT),HL
; ;
#ENDIF #ENDIF
; ;
@ -2932,12 +2959,6 @@ HSTHEAD .DB 0 ; HEAD (0-255)
HEAPCURB .DW 0 ; MARK HEAP ADDRESS AFTER INITIALIZATION HEAPCURB .DW 0 ; MARK HEAP ADDRESS AFTER INITIALIZATION
; ;
HB_TICKS .FILL 4,0 ; 32 BIT TICK COUNTER HB_TICKS .FILL 4,0 ; 32 BIT TICK COUNTER
;
.FILL HB_STKSIZ,$FF ; 48 ENTRY STACK FOR HBIOS FUNCTION PROCESSING
HB_STACK .EQU $ ; TOP OF HBIOS STACK
;;
; .FILL HB_ISTKSIZ,$FF ; 32 ENTRY STACK FOR INTERRUPT PROCESSING
;HB_ISTACK .EQU $ ; TOP OF INTERRUPT PROCESSING STACK
; ;
STR_BANNER .DB "RetroBrew HBIOS v", BIOSVER, ", ", TIMESTAMP, "$" STR_BANNER .DB "RetroBrew HBIOS v", BIOSVER, ", ", TIMESTAMP, "$"
STR_PLATFORM .DB PLATFORM_NAME, "$" STR_PLATFORM .DB PLATFORM_NAME, "$"

BIN
Source/Images/hd0/s1/u0/LDNZT.COM

Binary file not shown.

BIN
Source/Images/hd0/s1/u0/STAMPS.DAT

Binary file not shown.

BIN
Source/ZSDOS/Clock/LDNZT.COM

Binary file not shown.

2
Source/ZSDOS/Clock/ReadMe.txt

@ -5,3 +5,5 @@ The hbclk.z80 source file can be compiled using Build.cmd which will produce a r
The relocatable binary should be added/updated in the stamps.dat libary. The stamps.dat file is just a standard LU type library and is easily updated using NULU. The members are the relocatable binaries, but with the .REL extension removed. The relocatable binary should be added/updated in the stamps.dat libary. The stamps.dat file is just a standard LU type library and is easily updated using NULU. The members are the relocatable binaries, but with the .REL extension removed.
SETUPZST is used to create runnable executable (.COM) files. An executable has been created for DateStamper (LDDS.COM) and P2DOS (LDP2D.COM). The executables are all configured for operation as an RSX (resident system extension). SETUPZST is used to create runnable executable (.COM) files. An executable has been created for DateStamper (LDDS.COM) and P2DOS (LDP2D.COM). The executables are all configured for operation as an RSX (resident system extension).
The STAMPS.DAT file here is a version that I cobbled together. Using the STAMPS.DAT file included in the ZSDOS distribution results in a load file that does not work. It claims to load, but is not present. I found a "fixed" version of STAMPS.DAT on the Walnut Creek CD-ROM which works, but was missing the NZ and NZP2 stamp variants. So, I added those variants to the working version of STAMPS.DAT which is included here.

BIN
Source/ZSDOS/Clock/STAMPS.DAT

Binary file not shown.

5
Tools/simh/Sim.cfg

@ -33,8 +33,11 @@ set hdsk0 wrtenb
set hdsk1 wrtenb set hdsk1 wrtenb
; enable timer interrupt, 50Hz ; enable timer interrupt, 50Hz
; DDT, SID, etc. use the normal IM 1 vector 6 ($38)
; for breakpoints so we use vector 6 ($30)
d timd 20 d timd 20
d timh 38
;d timh 38
d timh 30
set simh timeron set simh timeron
; start emulation ; start emulation

Loading…
Cancel
Save