|
|
@ -69,6 +69,8 @@ |
|
|
; |
|
|
; |
|
|
#INCLUDE "std.asm" |
|
|
#INCLUDE "std.asm" |
|
|
; |
|
|
; |
|
|
|
|
|
HBIOS_MUTEX .EQU TRUE |
|
|
|
|
|
; |
|
|
; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. |
|
|
; MAKE SURE EXACTLY ONE OF ROMBOOT, APPBOOT, IMGBOOT IS DEFINED. |
|
|
; |
|
|
; |
|
|
MODCNT .EQU 0 |
|
|
MODCNT .EQU 0 |
|
|
@ -269,7 +271,21 @@ HBX_IDENT: |
|
|
; ACCOMMODATE FREERTOS. HBX_BUF IS ONLY USED AS A BOUNCE BUFFER, SO IT'S |
|
|
; ACCOMMODATE FREERTOS. HBX_BUF IS ONLY USED AS A BOUNCE BUFFER, SO IT'S |
|
|
; USE WILL NEVER OVERLAP WITH BELOW. |
|
|
; 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: |
|
|
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 (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 |
|
|
@ -290,6 +306,13 @@ HBX_INVOKE: |
|
|
LD SP,0 ; RESTORE ORIGINAL STACK FRAME |
|
|
LD SP,0 ; RESTORE ORIGINAL STACK FRAME |
|
|
HBX_INVSP .EQU $ - 2 |
|
|
HBX_INVSP .EQU $ - 2 |
|
|
|
|
|
|
|
|
|
|
|
#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 |
|
|
RET ; RETURN TO CALLER |
|
|
; |
|
|
; |
|
|
;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|
|
;;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|
|
@ -482,16 +505,21 @@ HBX_TGTADR .EQU $ + 1 |
|
|
; |
|
|
; |
|
|
; 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 |
|
|
; 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 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: |
|
|
HBX_PEEK: |
|
|
#IF (INTMODE > 0) |
|
|
|
|
|
LD A,I |
|
|
|
|
|
DI |
|
|
|
|
|
PUSH AF |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME |
|
|
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) |
|
|
LD A,(HB_CURBNK) |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
LD A,D |
|
|
LD A,D |
|
|
@ -500,13 +528,8 @@ HBX_PEEK: |
|
|
JR HBX_PPRET |
|
|
JR HBX_PPRET |
|
|
; |
|
|
; |
|
|
HBX_POKE: |
|
|
HBX_POKE: |
|
|
#IF (INTMODE > 0) |
|
|
|
|
|
LD A,I |
|
|
|
|
|
DI |
|
|
|
|
|
PUSH AF |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
LD (HBX_PPSP),SP ; SAVE ORIGINAL STACK FRAME |
|
|
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) |
|
|
LD A,(HB_CURBNK) |
|
|
PUSH AF |
|
|
PUSH AF |
|
|
LD A,D |
|
|
LD A,D |
|
|
@ -518,11 +541,6 @@ HBX_PPRET: |
|
|
CALL HBX_BNKSEL |
|
|
CALL HBX_BNKSEL |
|
|
LD SP,0 ; RESTORE ORIGINAL STACK FRAME |
|
|
LD SP,0 ; RESTORE ORIGINAL STACK FRAME |
|
|
HBX_PPSP .EQU $ - 2 |
|
|
HBX_PPSP .EQU $ - 2 |
|
|
#IF (INTMODE > 0) |
|
|
|
|
|
POP AF |
|
|
|
|
|
JP PO,$+4 |
|
|
|
|
|
EI |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; PRIVATE STACK AT END OF HBIOS CODE |
|
|
; PRIVATE STACK AT END OF HBIOS CODE |
|
|
@ -671,23 +689,24 @@ HBX_BUF_END .EQU $ |
|
|
; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES) |
|
|
; HBIOS PROXY MGMT BLOCK (TOP 32 BYTES) |
|
|
; |
|
|
; |
|
|
#IFDEF ROMBOOT |
|
|
#IFDEF ROMBOOT |
|
|
.DB BID_BOOT ; CURRENTLY ACTIVE LOW MEMORY BANK ID |
|
|
|
|
|
|
|
|
.DB BID_BOOT ; HB_CURBNK: CURRENTLY ACTIVE LOW MEMORY BANK ID |
|
|
#ELSE |
|
|
#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 |
|
|
|
|
|
.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 |
|
|
|
|
|
|
|
|
.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 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 |
|
|
|
|
|
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 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) |
|
|
.FILL MEMTOP - $ ; FILL TO END OF MEMORY (AS NEEDED) |
|
|
.ORG HBX_IMG + HBX_SIZ ; RESET ORG |
|
|
.ORG HBX_IMG + HBX_SIZ ; RESET ORG |
|
|
@ -2454,16 +2473,44 @@ SYS_SETSECS: |
|
|
; ENTRY: D=BANK ID, HL=ADDRESS |
|
|
; ENTRY: D=BANK ID, HL=ADDRESS |
|
|
; RETURN: E=BYTE VALUE |
|
|
; 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: |
|
|
SYS_PEEK: |
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
|
|
|
LD A,I |
|
|
|
|
|
DI |
|
|
|
|
|
PUSH AF |
|
|
|
|
|
#ENDIF |
|
|
CALL HBX_PEEK ; IMPLEMENTED IN PROXY |
|
|
CALL HBX_PEEK ; IMPLEMENTED IN PROXY |
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
|
|
|
POP AF |
|
|
|
|
|
JP PO,$+4 |
|
|
|
|
|
EI |
|
|
|
|
|
#ENDIF |
|
|
XOR A |
|
|
XOR A |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
; WRITE A BYTE OF MEMORY TO SPECIFIED BANK |
|
|
; WRITE A BYTE OF MEMORY TO SPECIFIED BANK |
|
|
; ENTRY: D=BANK ID, HL=ADDRESS IN HBIOS BANK, E=BYTE VALUE |
|
|
; 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: |
|
|
SYS_POKE: |
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
|
|
|
LD A,I |
|
|
|
|
|
DI |
|
|
|
|
|
PUSH AF |
|
|
|
|
|
#ENDIF |
|
|
CALL HBX_POKE ; IMPLEMENTED IN PROXY |
|
|
CALL HBX_POKE ; IMPLEMENTED IN PROXY |
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
|
|
|
POP AF |
|
|
|
|
|
JP PO,$+4 |
|
|
|
|
|
EI |
|
|
|
|
|
#ENDIF |
|
|
XOR A |
|
|
XOR A |
|
|
RET |
|
|
RET |
|
|
; |
|
|
; |
|
|
|