Browse Source

Merge pull request #14 from wwarthen/master

update to master
pull/102/head
Phillip Stevens 6 years ago
committed by GitHub
parent
commit
7c2fcf6e2a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 113
      Source/HBIOS/hbios.asm
  2. 1
      Source/HBIOS/hbios.inc

113
Source/HBIOS/hbios.asm

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

1
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_DSTADR .EQU HBX_XFCDAT + 5 ; BNKCPY: DESTINATION ADDRESS
HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS HB_DSTBNK .EQU HBX_XFCDAT + 7 ; BNKCPY: SOURCE ADDRESS
HB_CPYLEN .EQU HBX_XFCDAT + 8 ; BNKCPY: COPY LENGTH 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 HBX_XFCFNS .EQU HBX_XFC + $10 ; JUMP TABLE PORTION OF HBIOS PROXY INTERFACE AREA
HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION HB_INVOKE .EQU HBX_XFCFNS + (0 * 3) ; INVOKE HBIOS FUNCTION

Loading…
Cancel
Save