From b45e531127c69b8a2db80aca098393df82bfc484 Mon Sep 17 00:00:00 2001 From: Phillip Stevens Date: Wed, 4 Mar 2020 18:33:19 +1100 Subject: [PATCH 1/4] hbios - wrap hbx_bnkcpy --- Source/HBIOS/hbios.asm | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 8e49d713..7bdab35a 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -383,7 +383,7 @@ HBX_BNKSEL1: ; Copy Data - Possibly between banks. This resembles CP/M 3, but ; usage of the HL and DE registers is reversed. ; Caller MUST preset HBX_SRCBNK and HBX_DSTBNK. -; Caller MUST disable ints if IM1 active +; Interrupts are disabled if IM1/IM2 active. ; Enter: ; HL = Source Address ; DE = Destination Address @@ -394,6 +394,11 @@ HBX_BNKSEL1: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; HBX_BNKCPY: +#IF (INTMODE > 0) + LD A,I + DI + PUSH AF +#ENDIF LD (HBX_BC_SP),SP ; PUT STACK LD SP,HBX_TMPSTK ; ... IN HI MEM @@ -423,6 +428,11 @@ HBX_BC_LAST: LD SP,$FFFF ; RESTORE STACK HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE +#IF (INTMODE > 0) + POP AF + JP PO,$+4 + EI +#ENDIF RET ; HBX_BC_ITER: @@ -2221,17 +2231,7 @@ SYS_BNKCPY: LD HL,(HB_CPYLEN) ; HL := COPY LEN (SAVED IN SETCPY) EX (SP),HL ; RESTORE HL & SET (SP) TO COPY LEN POP BC ; BC := COPY LEN -#IF (INTMODE > 0) - LD A,I - DI - PUSH AF -#ENDIF CALL HB_BNKCPY -#IF (INTMODE > 0) - POP AF - JP PO,$+4 - EI -#ENDIF XOR A RET ; From f8d0fda1798e3bc4c9a48c3c8a54005f1ab6bdb6 Mon Sep 17 00:00:00 2001 From: Phillip Stevens Date: Wed, 4 Mar 2020 21:18:48 +1100 Subject: [PATCH 2/4] hbios - adjust hbx_peek hbx_poke guards --- Source/HBIOS/hbios.asm | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 7bdab35a..bdeb6fe6 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -383,7 +383,7 @@ HBX_BNKSEL1: ; Copy Data - Possibly between banks. This resembles CP/M 3, but ; usage of the HL and DE registers is reversed. ; Caller MUST preset HBX_SRCBNK and HBX_DSTBNK. -; Interrupts are disabled if IM1/IM2 active. +; IM1/IM2 interrupts are disabled during HBX_BNKCPY. ; Enter: ; HL = Source Address ; DE = Destination Address @@ -482,9 +482,14 @@ HBX_TGTADR .EQU $ + 1 ; ; PEEK & POKE ROUTINES ; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED -; CALLER MUST DISABLE INTS IF IM1 AND ACCESSING PAGE W/O IM1 INT VECTOR +; IM1/IM2 INTERRUPTS ARE DISABLED DURING HBX_PEEK & HBX_POKE. ; HBX_PEEK: +#IF (INTMODE > 0) + LD A,I + DI + PUSH AF +#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) @@ -495,6 +500,11 @@ HBX_PEEK: JR HBX_PPRET ; HBX_POKE: +#IF (INTMODE > 0) + LD A,I + DI + PUSH AF +#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) @@ -508,6 +518,11 @@ HBX_PPRET: CALL HBX_BNKSEL LD SP,0 ; RESTORE ORIGINAL STACK FRAME HBX_PPSP .EQU $ - 2 +#IF (INTMODE > 0) + POP AF + JP PO,$+4 + EI +#ENDIF RET ; ; PRIVATE STACK AT END OF HBIOS CODE @@ -2440,17 +2455,7 @@ SYS_SETSECS: ; RETURN: E=BYTE VALUE ; SYS_PEEK: -#IF (INTMODE > 0) - LD A,I - DI - PUSH AF -#ENDIF CALL HBX_PEEK ; IMPLEMENTED IN PROXY -#IF (INTMODE > 0) - POP AF - JP PO,$+4 - EI -#ENDIF XOR A RET ; @@ -2458,17 +2463,7 @@ SYS_PEEK: ; ENTRY: D=BANK ID, HL=ADDRESS IN HBIOS BANK, E=BYTE VALUE ; SYS_POKE: -#IF (INTMODE > 0) - LD A,I - DI - PUSH AF -#ENDIF CALL HBX_POKE ; IMPLEMENTED IN PROXY -#IF (INTMODE > 0) - POP AF - JP PO,$+4 - EI -#ENDIF XOR A RET ; From a8357047b283b16590b208375b0c603e12e139ae Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 4 Mar 2020 13:00:35 -0800 Subject: [PATCH 3/4] Update hbios.asm Adjusted used of DI/EI for PEEK and POKE to regain a bit of INTSTK space. Added code so that HB_INVBNK can be used as a flag indicating if HBIOS is active, $FF is inactive, anything else means active. --- Source/HBIOS/hbios.asm | 80 ++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 31 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index bdeb6fe6..80376b43 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -269,10 +269,16 @@ HBX_IDENT: ; ACCOMMODATE FREERTOS. HBX_BUF IS ONLY USED AS A BOUNCE BUFFER, SO IT'S ; USE WILL NEVER OVERLAP WITH BELOW. ; +; HBX_INVOKE IS NOT RE-ENTRANT! HB_INVBNK CAN BE USED GLOBALLY TO DETERMINE +; IF HBIOS IS ALREADY ACTIVE. HB_INVBNK WILL HAVE A VALUE != $FF WHEN HBIOS +; IS ACTIVE. ON RETURN, HB_INVBNK IS SET TO $FF TO INDICATE HBIOS IS NOT +; ACTIVE. +; 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 (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK LD A,BID_BIOS ; HBIOS BANK @@ -290,6 +296,11 @@ HBX_INVOKE: LD SP,0 ; RESTORE ORIGINAL STACK FRAME HBX_INVSP .EQU $ - 2 + PUSH AF ; SAVE AF + OR $FF ; CLEAR INVBNK TO INACTIVE VALUE + LD (HB_INVBNK),A ; SAVE IT + POP AF ; RESTORE AF + RET ; RETURN TO CALLER ; ;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @@ -482,14 +493,11 @@ HBX_TGTADR .EQU $ + 1 ; ; PEEK & POKE ROUTINES ; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED -; IM1/IM2 INTERRUPTS ARE DISABLED DURING HBX_PEEK & HBX_POKE. +; THESE ROUTINES ARE NOT INTENDED TO BE CALLED DIRECTLY -- THEY ARE +; HELPERS FOR THE HBIOS API AND ARE CALLED BY HBIOS BANK CODE. THE +; HBIOS BANK CODE BRACKETS THE USE OF THESE ROUTINES WITH DI/EI. ; HBX_PEEK: -#IF (INTMODE > 0) - LD A,I - DI - PUSH AF -#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) @@ -500,11 +508,6 @@ HBX_PEEK: JR HBX_PPRET ; HBX_POKE: -#IF (INTMODE > 0) - LD A,I - DI - PUSH AF -#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) @@ -518,11 +521,6 @@ HBX_PPRET: CALL HBX_BNKSEL LD SP,0 ; RESTORE ORIGINAL STACK FRAME HBX_PPSP .EQU $ - 2 -#IF (INTMODE > 0) - POP AF - JP PO,$+4 - EI -#ENDIF RET ; ; PRIVATE STACK AT END OF HBIOS CODE @@ -671,23 +669,23 @@ HBX_BUF_END .EQU $ ; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES) ; #IFDEF ROMBOOT - .DB BID_BOOT ; CURRENTLY ACTIVE LOW MEMORY BANK ID + .DB BID_BOOT ; HB_CURBNK: CURRENTLY ACTIVE LOW MEMORY BANK ID #ELSE - .DB BID_USR ; CURRENTLY ACTIVE LOW MEMORY BANK ID -#ENDIF - .DB 0 ; BANK ACTIVE AT TIME OF HBIOS CALL INVOCATION - .DW 0 ; BNKCPY SOURCE ADDRESS - .DB BID_USR ; BNKCPY SOURCE BANK ID - .DW 0 ; BNKCPY DESTINATION ADDRESS - .DB BID_USR ; BNKCPY DESTINATION BANK ID - .DW 0 ; BNKCPY LENGTH + .DB BID_USR ; HB_CURBNK: CURRENTLY ACTIVE LOW MEMORY BANK ID +#ENDIF + .DB $FF ; HB_INVBNK: BANK ACTIVE AT TIME OF HBIOS CALL INVOCATION + .DW 0 ; HB_SRCADR: BNKCPY SOURCE ADDRESS + .DB BID_USR ; HB_SRCBNK: BNKCPY SOURCE BANK ID + .DW 0 ; HB_DSTADR: BNKCPY DESTINATION ADDRESS + .DB BID_USR ; HB_DSTBNK: BNKCPY DESTINATION BANK ID + .DW 0 ; HB_CPYLEN: BNKCPY LENGTH .FILL 6,0 ; FILLER, RESERVED FOR FUTURE HBIOS USE - JP HBX_INVOKE ; FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08) - JP HBX_BNKSEL ; FIXED ADR ENTRY FOR HBX_BNKSEL - JP HBX_BNKCPY ; FIXED ADR ENTRY FOR HBX_BNKCPY - JP HBX_BNKCALL ; FIXED ADR ENTRY FOR HBX_BNKCALL + JP HBX_INVOKE ; HB_INVOKE: FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08) + JP HBX_BNKSEL ; HB_BNKSEL: FIXED ADR ENTRY FOR HBX_BNKSEL + JP HBX_BNKCPY ; HB_BNKCPY: FIXED ADR ENTRY FOR HBX_BNKCPY + JP HBX_BNKCALL ; HB_BNKCALL: FIXED ADR ENTRY FOR HBX_BNKCALL .DW HBX_IDENT ; ADDRESS OF HBIOS PROXY START (DEPRECATED) - .DW HBX_IDENT ; ADDRESS OF HBIOS IDENT INFO DATA BLOCK + .DW HBX_IDENT ; HB_IDENT: ADDRESS OF HBIOS IDENT INFO DATA BLOCK ; .FILL MEMTOP - $ ; FILL TO END OF MEMORY (AS NEEDED) .ORG HBX_IMG + HBX_SIZ ; RESET ORG @@ -2455,7 +2453,17 @@ SYS_SETSECS: ; RETURN: E=BYTE VALUE ; SYS_PEEK: +#IF (INTMODE > 0) + LD A,I + DI + PUSH AF +#ENDIF CALL HBX_PEEK ; IMPLEMENTED IN PROXY +#IF (INTMODE > 0) + POP AF + JP PO,$+4 + EI +#ENDIF XOR A RET ; @@ -2463,7 +2471,17 @@ SYS_PEEK: ; ENTRY: D=BANK ID, HL=ADDRESS IN HBIOS BANK, E=BYTE VALUE ; SYS_POKE: +#IF (INTMODE > 0) + LD A,I + DI + PUSH AF +#ENDIF CALL HBX_POKE ; IMPLEMENTED IN PROXY +#IF (INTMODE > 0) + POP AF + JP PO,$+4 + EI +#ENDIF XOR A RET ; From 8e99303e2fa2800e45fb76d98c2221a50fadc24b Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Wed, 4 Mar 2020 16:42:06 -0800 Subject: [PATCH 4/4] Add HBIOS MuTex --- Source/HBIOS/hbios.asm | 61 +++++++++++++++++++++++++++++++----------- Source/HBIOS/hbios.inc | 1 + 2 files changed, 46 insertions(+), 16 deletions(-) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 80376b43..654d3739 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -69,6 +69,8 @@ ; #INCLUDE "std.asm" ; +HBIOS_MUTEX .EQU TRUE +; ; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. ; MODCNT .EQU 0 @@ -275,10 +277,18 @@ HBX_IDENT: ; ACTIVE. ; HBX_INVOKE: + +#IF (HBIOS_MUTEX == TRUE) + PUSH HL ; SAVE HL + LD HL,HB_LOCK ; POINT TO LOCK + SRA (HL) ; TEST/ACQUIRE MUTEX LOCK + JR C,$-2 ; KEEP TRYING ON FAILURE + POP HL ; RESTORE HL +#ENDIF + + LD (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME LD A,(HB_CURBNK) ; GET CURRENT BANK LD (HB_INVBNK),A ; SAVE INVOCATION BANK - - LD (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK LD A,BID_BIOS ; HBIOS BANK @@ -296,10 +306,12 @@ HBX_INVOKE: LD SP,0 ; RESTORE ORIGINAL STACK FRAME HBX_INVSP .EQU $ - 2 - PUSH AF ; SAVE AF - OR $FF ; CLEAR INVBNK TO INACTIVE VALUE - LD (HB_INVBNK),A ; SAVE IT - POP AF ; RESTORE AF +#IF (HBIOS_MUTEX == TRUE) + PUSH HL ; SAVE HL + LD HL,HB_LOCK ; POINT TO LOCK + LD (HL),$FE ; RELEASE MUTEX LOCK + POP HL ; RESTORE HL +#ENDIF RET ; RETURN TO CALLER ; @@ -493,13 +505,21 @@ HBX_TGTADR .EQU $ + 1 ; ; PEEK & POKE ROUTINES ; ADDRESS IN HL, BANK IN D, VALUE IN/OUT IN E, A IS TRASHED -; THESE ROUTINES ARE NOT INTENDED TO BE CALLED DIRECTLY -- THEY ARE -; HELPERS FOR THE HBIOS API AND ARE CALLED BY HBIOS BANK CODE. THE -; HBIOS BANK CODE BRACKETS THE USE OF THESE ROUTINES WITH DI/EI. +; +; THESE ROUTINES ARE NOT INTENDED TO BE CALLED DIRECTLY -- THEY ARE +; HELPERS FOR THE HBIOS API AND ARE CALLED BY HBIOS BANK CODE. THE +; HBIOS BANK CODE BRACKETS THE USE OF THESE ROUTINES WITH DI/EI IF +; NECESSARY FOR THE CURRENT INTERRUPT MODE. +; +; 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_PEEK: LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME - LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM + LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK LD A,(HB_CURBNK) PUSH AF LD A,D @@ -509,7 +529,7 @@ HBX_PEEK: ; HBX_POKE: LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME - LD SP,HBX_TMPSTK ; USE SMALL TEMP STACK FRAME IN HI MEM + LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK LD A,(HB_CURBNK) PUSH AF LD A,D @@ -679,7 +699,8 @@ HBX_BUF_END .EQU $ .DW 0 ; HB_DSTADR: BNKCPY DESTINATION ADDRESS .DB BID_USR ; HB_DSTBNK: BNKCPY DESTINATION BANK ID .DW 0 ; HB_CPYLEN: BNKCPY LENGTH - .FILL 6,0 ; FILLER, RESERVED FOR FUTURE HBIOS USE + .FILL 5,0 ; FILLER, RESERVED FOR FUTURE HBIOS USE + .DB $FE ; HB_LOCK: HBIOS MUTEX LOCK JP HBX_INVOKE ; HB_INVOKE: FIXED ADR ENTRY FOR HBX_INVOKE (ALT FOR RST 08) JP HBX_BNKSEL ; HB_BNKSEL: FIXED ADR ENTRY FOR HBX_BNKSEL JP HBX_BNKCPY ; HB_BNKCPY: FIXED ADR ENTRY FOR HBX_BNKCPY @@ -2452,14 +2473,18 @@ SYS_SETSECS: ; ENTRY: D=BANK ID, HL=ADDRESS ; RETURN: E=BYTE VALUE ; +; IF WE ARE USING INTERRUPT MODE 1, WE NEED TO PREVENT INTERRUPTS +; BECAUSE THE LOW MEMORY BANK CONTAINING THE IM1 VECTOR WILL PROBABLY +; GET BANKED OUT DURING THE PEEK PROCESSING. +; SYS_PEEK: -#IF (INTMODE > 0) +#IF (INTMODE == 1) LD A,I DI PUSH AF #ENDIF CALL HBX_PEEK ; IMPLEMENTED IN PROXY -#IF (INTMODE > 0) +#IF (INTMODE == 1) POP AF JP PO,$+4 EI @@ -2470,14 +2495,18 @@ SYS_PEEK: ; WRITE A BYTE OF MEMORY TO SPECIFIED BANK ; ENTRY: D=BANK ID, HL=ADDRESS IN HBIOS BANK, E=BYTE VALUE ; +; IF WE ARE USING INTERRUPT MODE 1, WE NEED TO PREVENT INTERRUPTS +; BECAUSE THE LOW MEMORY BANK CONTAINING THE IM1 VECTOR WILL PROBABLY +; GET BANKED OUT DURING THE POKE PROCESSING. +; SYS_POKE: -#IF (INTMODE > 0) +#IF (INTMODE == 1) LD A,I DI PUSH AF #ENDIF CALL HBX_POKE ; IMPLEMENTED IN PROXY -#IF (INTMODE > 0) +#IF (INTMODE == 1) POP AF JP PO,$+4 EI diff --git a/Source/HBIOS/hbios.inc b/Source/HBIOS/hbios.inc index 441cfcc2..d47d53f9 100644 --- a/Source/HBIOS/hbios.inc +++ b/Source/HBIOS/hbios.inc @@ -180,6 +180,7 @@ HB_SRCBNK .EQU HBX_XFCDAT + 4 ; BNKCPY: SOURCE BANK ID HB_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS HB_CPYLEN .EQU HBX_XFCDAT + 8 ; BNKCPY: COPY LENGTH +HB_LOCK .EQU HBX_XFCDAT + 15 ; HBIOS MUTEX LOCK ; HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION