diff --git a/Source/BPBIOS/Build.cmd b/Source/BPBIOS/Build.cmd index 7b4f4607..7f06ca88 100644 --- a/Source/BPBIOS/Build.cmd +++ b/Source/BPBIOS/Build.cmd @@ -10,7 +10,7 @@ set ZXINCDIR=../../tools/cpm/include/ pushd ZCPR33 && call Build.cmd && popd -pause +rem pause call :makebp 33t call :makebp 33tbnk @@ -25,7 +25,7 @@ call :makebp 34nbnk call :makebp 41tbnk call :makebp 41nbnk -pause +rem pause cpmrm.exe -f wbw_hd0 ../../Binary/hd0.img 0:ws*.* diff --git a/Source/BPBIOS/hbios.z80 b/Source/BPBIOS/hbios.z80 index cfe8dadc..be63e92d 100644 --- a/Source/BPBIOS/hbios.z80 +++ b/Source/BPBIOS/hbios.z80 @@ -8,7 +8,8 @@ HB_DEFBNK EQU BID_USR ; Default bank number ; ; LOCATION OF DISPATCH ENTRY IN HBIOS BANK ; -HB_DISPATCH EQU 0403H +HB_DISPATCH EQU 403H +HB_STACK EQU 500H ; ; PLATFORM SPECIFIC CONSTANTS ; @@ -76,7 +77,7 @@ HBX_BNKCPY EQU 0FFF6H HBX_BNKCALL EQU 0FFF9H HB_CURBNK EQU 0FFE0H -;HB_PRVBNK EQU 0FFE1H +HB_INVBNK EQU 0FFE1H HB_SRCADR EQU 0FFE2H HB_SRCBNK EQU 0FFE4H HB_DSTADR EQU 0FFE5H @@ -114,6 +115,19 @@ HBX_INIT: LD (HB_SRCBNK),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 HBX_XCOPY: @@ -124,16 +138,14 @@ HBX_XCOPY: RET 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 -; + +;================================================================================================== +; SELECT MEMORY BANK FOR LOWER 32K +;================================================================================================== + HBX_BNKSEL: LD (HB_CURBNK),A @@ -186,136 +198,131 @@ HBX_ROM: RLCA OUT0 (CPU_BBR),A RET + 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) -; +;================================================================================================== + 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 (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 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 - ;DI +; HB_DI + LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM FOR BANK SWITCH PUSH AF ; SAVE AF (FUNCTION RETURN) LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK CALL HBX_BNKSEL ; SELECT IT 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 ENDIF ;================================================================================================== -; Load A,(HL) from Alternate Bank (in Reg C) +; LD A,(C:HL) ;================================================================================================== HBX_FRGETB: 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 (HBX_BNKSAV),A ; Save current bank PUSH BC LD A,C - ;DI + HB_DI CALL HBX_BNKSEL LD C,(HL) LD A,(HBX_BNKSAV) CALL HBX_BNKSEL - ;EI + HB_EI LD A,C POP BC LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME RET ;================================================================================================== -; Load DE,(HL) from Alternate Bank +; LD DE,(C:HL) ;================================================================================================== HBX_FRGETW: 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 (HBX_BNKSAV),A ; Save current bank LD A,C - ;DI + HB_DI CALL HBX_BNKSEL LD E,(HL) INC HL @@ -323,17 +330,17 @@ HBX_FRGETW: DEC HL LD A,(HBX_BNKSAV) CALL HBX_BNKSEL - ;EI + HB_EI LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME RET ;================================================================================================== -; Load (HL),A to Alternate Bank (in Reg C) +; LD (C:HL),A ;================================================================================================== HBX_FRPUTB: 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 LD A,(HB_CURBNK) ; Get current bank LD (HBX_BNKSAV),A ; Save current bank @@ -341,27 +348,27 @@ HBX_FRPUTB: PUSH BC LD B,A LD A,C - ;DI + HB_DI CALL HBX_BNKSEL LD (HL),B LD A,(HBX_BNKSAV) CALL HBX_BNKSEL - ;EI + HB_EI POP BC LD SP,(HBX_STKSAV) ; RESTORE ORIGINAL STACK FRAME RET ;================================================================================================== -; Load (HL),DE to Alternate Bank +; LD (C:HL),DE ;================================================================================================== HBX_FRPUTW: 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 (HBX_BNKSAV),A ; Save current bank LD A,C - ;DI + HB_DI CALL HBX_BNKSEL LD (HL),E INC HL @@ -369,26 +376,25 @@ HBX_FRPUTW: DEC HL LD A,(HBX_BNKSAV) CALL HBX_BNKSEL - ;EI + 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 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 -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 diff --git a/Source/BPBIOS/ibmv-ww.z80 b/Source/BPBIOS/ibmv-ww.z80 index 72a39f3a..540cf8a8 100644 --- a/Source/BPBIOS/ibmv-ww.z80 +++ b/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 POP HL ; Retrieve caller's return address from stack 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 SP,USP-1 ; ..and point locally, saving 1 byte for Bank 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 A,0C9H ; Disable other calls here 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 LD SP,USP-7 ; Point stack pointer to do local return POP HL ; .restoring entry HL - ;EI ; ..enabling interrupts + HB_EI ; ..enabling interrupts RET ; And return to caller ; Restore User Stack and Bank Routine @@ -51,7 +51,6 @@ 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 - LD (CURBNK),A XOR A LD (BIOSTK),A ; Patch NOP back in at start of code POP AF @@ -65,7 +64,6 @@ USRSTK: PUSH AF FRCLR: PUSH AF ; Save any entry in AF LD A,(USP-1) ; Get bank control byte CALL HBX_BNKSEL - LD (CURBNK),A ; WW: I ADDED THIS, IS IT RIGHT??? XOR A LD (BIOSTK),A ; Patch NOP to enable stack switcher POP AF @@ -90,7 +88,7 @@ ABORT: LD SP,USP ; Insure stack is in Common Memory ; Uses : AF ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -RETMEM: LD A,(CURBNK) +RETMEM: LD A,(HB_CURBNK) RET ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @@ -109,7 +107,6 @@ SELMEM: LD (USRBNK),A ; Update user bank SELBNK: PUSH AF ; Save regs SELBN0: CALL HBX_BNKSEL - LD (CURBNK),A ; Save as current bank # POP AF ; restore regs RET @@ -188,7 +185,6 @@ FRPUTW: JPBNK: DEFS 1 ; Bank # for Far Jump or Call USRBNK: DEFS 1 ; User's selected bank # -CURBNK: DEFS 1 ; Current bank # DMABNK: DEFS 1 ; Target bank # for disk xfers DEFS 64 ; 32 level stack USP: DEFS 2 ; User stack pointer diff --git a/Source/BPBIOS/romwbw.lib b/Source/BPBIOS/romwbw.lib index c6d9f83c..d666295f 100644 --- a/Source/BPBIOS/romwbw.lib +++ b/Source/BPBIOS/romwbw.lib @@ -66,3 +66,17 @@ MEMTOP EQU 0FFE0H - 1 ; Start of HBIOS 32 byte control block ELSE MEMTOP EQU HBLOC - 1 ; Start of HBIOS 512 byte proxy ENDIF + + IF INTPXY +HB_EI MACRO + ENDM +HB_DI MACRO + ENDM + ELSE +HB_EI MACRO + EI + ENDM +HB_DI MACRO + DI + ENDM + ENDIF diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 14245931..c112c4f0 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -98,7 +98,7 @@ MODCNT .SET MODCNT + 1 RET .FILL (030H - $),0FFH ; RST 30 RET - .FILL (038H - $),0FFH ; RST 38 / INT + .FILL (038H - $),0FFH ; RST 38 / IM1 INT RETI .FILL (066H - $),0FFH ; NMI RETN @@ -204,39 +204,42 @@ HBX_IDENT: ;================================================================================================== ; 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 (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 CALL HBX_BNKSEL ; SELECT IT LD SP,HB_STACK ; NOW USE FULL HBIOS STACK IN HBIOS BANK - HB_EI +; HB_EI 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) LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK CALL HBX_BNKSEL ; SELECT IT POP AF ; RESTORE AF LD SP,0 ; RESTORE ORIGINAL STACK FRAME -HBX_STKSAV .EQU $ - 2 - HB_EI +HBX_INVSP .EQU $ - 2 +; HB_EI 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. -;; Does NOT update current bank. -;; Interrupts should be disabled by caller ;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; 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 ; HBX_BNKSEL_INT: @@ -308,9 +311,11 @@ HBX_BNKSEL1: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; HBX_BNKCPY: +#IF (INTTYPE == IT_SIMH) HB_DI +#ENDIF LD (HBX_BC_SP),SP - LD SP,HBX_STACK + LD SP,HBX_TMPSTK LD A,(HB_CURBNK) ; GET CURRENT BANK PUSH AF ; AND SAVE TO RESTORE LATER @@ -337,7 +342,9 @@ HBX_BC_LAST: CALL HBX_BNKSEL ; SWITCH TO CURRENT BANK AND EXIT LD SP,$FFFF HBX_BC_SP .EQU $ - 2 +#IF (INTTYPE == IT_SIMH) HB_EI +#ENDIF RET ; HBX_BC_ITER: @@ -359,39 +366,39 @@ HBX_BC_ITER: ; HL = UPD SRC, DE = UPD DEST, BC = 0 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: - 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 - 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 - 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 ; ; PEEK & POKE ROUTINES ; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED ; HBX_PEEK: +#IF (INTTYPE == IT_SIMH) 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) PUSH AF LD A,D @@ -400,7 +407,11 @@ HBX_PEEK: JR HBX_PPRET ; HBX_POKE: +#IF (INTTYPE == IT_SIMH) 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) PUSH AF LD A,D @@ -410,14 +421,23 @@ HBX_POKE: HBX_PPRET: POP AF CALL HBX_BNKSEL + LD SP,0 ; RESTORE ORIGINAL STACK FRAME +HBX_PPSP .EQU $ - 2 +#IF (INTTYPE == IT_SIMH) HB_EI +#ENDIF 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 ; OCCUPIES SPACE BEFORE IVT ; HBX_STKSIZ .EQU $FF00 - $ - .ECHO "HBIOS STACK space: " + .ECHO "HBIOS PROXY STACK space: " .ECHO HBX_STKSIZ .ECHO " bytes.\n" .FILL HBX_STKSIZ,$FF @@ -464,33 +484,30 @@ INT_BAD: ; BAD INTERRUPT HANDLER ; 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 BC ; SAVE BC 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 CALL HBX_BNKSEL_INT ; SELECT IT - ;LD SP,HB_ISTACK ; NOW USE INT STACK IN HBIOS BANK - CALL JPHL ; CALL INTERRUPT ROUTINE - ;LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM - LD A,(HB_CURBNK) ; GET PRE-INT BANK CALL HBX_BNKSEL ; SELECT IT - LD SP,$FFFF ; RESTORE ORIGINAL STACK FRAME -HBX_INT_SP .EQU $ - 2 - ; RESTORE STATE POP DE ; RESTORE DE POP BC ; RESTORE BC POP AF ; RESTORE AF + + LD SP,$FFFF ; RESTORE ORIGINAL STACK FRAME +HBX_INT_SP .EQU $ - 2 + POP HL ; RESTORE HL EI ; ENABLE INTERRUPTS @@ -536,15 +553,20 @@ HBX_BUF .FILL HBX_BUFSIZ,0 ; 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_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 @@ -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 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 ($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 ; @@ -2932,12 +2959,6 @@ HSTHEAD .DB 0 ; HEAD (0-255) HEAPCURB .DW 0 ; MARK HEAP ADDRESS AFTER INITIALIZATION ; 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_PLATFORM .DB PLATFORM_NAME, "$" diff --git a/Source/Images/hd0/s1/u0/LDNZT.COM b/Source/Images/hd0/s1/u0/LDNZT.COM new file mode 100644 index 00000000..535d8418 Binary files /dev/null and b/Source/Images/hd0/s1/u0/LDNZT.COM differ diff --git a/Source/Images/hd0/s1/u0/STAMPS.DAT b/Source/Images/hd0/s1/u0/STAMPS.DAT index 23cd9bd7..a312ae58 100644 Binary files a/Source/Images/hd0/s1/u0/STAMPS.DAT and b/Source/Images/hd0/s1/u0/STAMPS.DAT differ diff --git a/Source/ZSDOS/Clock/LDNZT.COM b/Source/ZSDOS/Clock/LDNZT.COM new file mode 100644 index 00000000..535d8418 Binary files /dev/null and b/Source/ZSDOS/Clock/LDNZT.COM differ diff --git a/Source/ZSDOS/Clock/ReadMe.txt b/Source/ZSDOS/Clock/ReadMe.txt index 925ae7bb..05aaa67a 100644 --- a/Source/ZSDOS/Clock/ReadMe.txt +++ b/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. 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. diff --git a/Source/ZSDOS/Clock/STAMPS.DAT b/Source/ZSDOS/Clock/STAMPS.DAT new file mode 100644 index 00000000..a312ae58 Binary files /dev/null and b/Source/ZSDOS/Clock/STAMPS.DAT differ diff --git a/Tools/simh/Sim.cfg b/Tools/simh/Sim.cfg index c4b8a747..06ae10a0 100644 --- a/Tools/simh/Sim.cfg +++ b/Tools/simh/Sim.cfg @@ -33,8 +33,11 @@ set hdsk0 wrtenb set hdsk1 wrtenb ; 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 timh 38 +;d timh 38 +d timh 30 set simh timeron ; start emulation