Browse Source

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.
pull/109/head
Wayne Warthen 6 years ago
parent
commit
a8357047b2
  1. 80
      Source/HBIOS/hbios.asm

80
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
;

Loading…
Cancel
Save