diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 61144d64..78bde396 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -250,7 +250,7 @@ CB_BIDROMDN .DB BID_ROMDN ; ; DEFINITIONS ; -HBX_BUFSIZ .EQU $40 ; INTERBANK COPY BUFFER SIZE +HBX_BUFSIZ .EQU $40 ; INTERBANK COPY BOUNCE BUFFER SIZE ; ; HBIOS IDENTIFICATION DATA BLOCK ; @@ -263,19 +263,25 @@ HBX_IDENT: ; HBIOS ENTRY FOR RST 08 PROCESSING ;================================================================================================== ; +; NOTE: THE SIZE OF HBX_TMPSTK (TYPICALLY 20 BYTES) IS INSUFFICIENT FOR +; FREERTOS IF AN INTERRUPT STRIKES WHILE THE TEMPORARY STACK IS ACTIVE. +; BELOW, HBX_BUF HAS BEEN USURPED TO PROVIDE A LARGER TEMP STACK TO +; ACCOMMODATE FREERTOS. HBX_BUF IS ONLY USED AS A BOUNCE BUFFER, SO IT'S +; USE WILL NEVER OVERLAP WITH BELOW. +; HBX_INVOKE: LD (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME LD A,(HB_CURBNK) ; GET CURRENT BANK LD (HB_INVBNK),A ; SAVE INVOCATION BANK - LD SP,HBX_TMPSTK ; BORROW HBX_BUF FOR STACK IN HIGH MEMORY + LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK LD A,BID_BIOS ; HBIOS BANK CALL HBX_BNKSEL ; SELECT IT LD SP,HB_STACK ; NOW USE FULL HBIOS STACK IN HBIOS BANK CALL HB_DISPATCH ; CALL HBIOS FUNCTION DISPATCHER - LD SP,HBX_TMPSTK ; BORROW HBX_BUF FOR STACK IN HIGH MEMORY + LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK PUSH AF ; SAVE AF (FUNCTION RETURN) LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK @@ -376,7 +382,6 @@ HBX_BNKSEL1: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; Copy Data - Possibly between banks. This resembles CP/M 3, but ; usage of the HL and DE registers is reversed. -; Caller MUST ensure stack is already in high memory. ; Caller MUST preset HBX_SRCBNK and HBX_DSTBNK. ; Caller MUST disable ints if IM1 active ; Enter: @@ -390,7 +395,7 @@ HBX_BNKSEL1: ; HBX_BNKCPY: LD (HBX_BC_SP),SP ; PUT STACK - LD SP,HBX_BNKSTK ; TEMPORARY STACK IN HIGH MEMORY (NOT IN HBX_BUF) + LD SP,HBX_TMPSTK ; ... IN HI MEM LD A,(HB_CURBNK) ; GET CURRENT BANK PUSH AF ; AND SAVE TO RESTORE LATER @@ -471,7 +476,7 @@ HBX_TGTADR .EQU $ + 1 ; HBX_PEEK: LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME - LD SP,HBX_TMPSTK ; BORROW HBX_BUF FOR STACK IN HIGH MEMORY + LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM LD A,(HB_CURBNK) PUSH AF LD A,D @@ -481,7 +486,7 @@ HBX_PEEK: ; HBX_POKE: LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME - LD SP,HBX_TMPSTK ; BORROW HBX_BUF FOR STACK IN HIGH MEMORY + LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM LD A,(HB_CURBNK) PUSH AF LD A,D @@ -498,12 +503,12 @@ HBX_PPSP .EQU $ - 2 ; PRIVATE STACK AT END OF HBIOS CODE ; OCCUPIES SPACE BEFORE IVT ; -HBX_STKSIZ .EQU $FF00 - $ - .ECHO "HBIOS PROXY STACK space: " - .ECHO HBX_STKSIZ +HBX_INTSTKSIZ .EQU $FF00 - $ + .ECHO "HBIOS INT STACK space: " + .ECHO HBX_INTSTKSIZ .ECHO " bytes.\n" - .FILL HBX_STKSIZ,$FF -HBX_STACK .EQU $ + .FILL HBX_INTSTKSIZ,$FF +HBX_INTSTK .EQU $ ; #IF (INTMODE == 2) ; @@ -585,7 +590,7 @@ HBX_INT: ; COMMON INTERRUPT ROUTING CODE EX (SP),HL ; SAVE HL AND GET INT JP TABLE OFFSET LD (HBX_INT_SP),SP ; SAVE ORIGINAL STACK FRAME - LD SP,HBX_STACK ; USE STACK FRAME IN HI MEM + LD SP,HBX_INTSTK ; USE DEDICATED INT STACK FRAME IN HI MEM ; SAVE STATE (HL SAVED PREVIOUSLY ON ORIGINAL STACK FRAME) PUSH AF ; SAVE AF @@ -620,25 +625,23 @@ HBX_INT_SP .EQU $ - 2 ; #ENDIF ; -; FILL TO START OF BOUNCE BUFFER +; SMALL TEMPORARY STACK FOR USE BY BNKCPY, PEEK, AND POKE ; -HBX_PROXYFILL .EQU (HBX_XFC - HBX_BUFSIZ - $) - .ECHO "HBIOS PROXY space remaining: " - .ECHO HBX_PROXYFILL +HBX_TMPSTKSIZ .EQU (HBX_XFC - HBX_BUFSIZ - $) + .ECHO "HBIOS TEMP STACK space: " + .ECHO HBX_TMPSTKSIZ .ECHO " bytes.\n" - .FILL HBX_PROXYFILL,$FF -; -; TEMPORARY STACK FOR USE BY HBX_BNKCPY (NOT IN HBX_BUF) + .FILL HBX_TMPSTKSIZ,$CC +HBX_TMPSTK .EQU $ ; -HBX_BNKSTK .EQU $ +; INTERBANK COPY BOUNCE BUFFER (64 BYTES) ; -; INTERBANK COPY BUFFER (64 BYTES) +; N.B., THIS BUFFER IS ALSO USED AS A TEMPORARY STACK BY HBX_INVOKE. +; THEREFORE, THIS BUFFER *CANNOT* BE USED TO PASS DATA OUTSIDE OF +; HBIOS FUNCTION CALLS. ; HBX_BUF .FILL HBX_BUFSIZ,0 -; -; TEMPORARY STACK FOR USE BY INVOKE, PEEK, AND POKE -; -HBX_TMPSTK .EQU $ +HBX_BUF_END .EQU $ ; ; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES) ;