|
|
|
@ -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) |
|
|
|
; |
|
|
|
@ -2218,11 +2221,15 @@ 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 == 1) |
|
|
|
#IF (INTMODE > 0) |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
CALL HB_BNKCPY |
|
|
|
#IF (INTMODE == 1) |
|
|
|
#IF (INTMODE > 0) |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
EI |
|
|
|
#ENDIF |
|
|
|
XOR A |
|
|
|
@ -2433,11 +2440,15 @@ SYS_SETSECS: |
|
|
|
; RETURN: E=BYTE VALUE |
|
|
|
; |
|
|
|
SYS_PEEK: |
|
|
|
#IF (INTMODE == 1) |
|
|
|
#IF (INTMODE > 0) |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
CALL HBX_PEEK ; IMPLEMENTED IN PROXY |
|
|
|
#IF (INTMODE == 1) |
|
|
|
#IF (INTMODE > 0) |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
EI |
|
|
|
#ENDIF |
|
|
|
XOR A |
|
|
|
@ -2447,11 +2458,15 @@ SYS_PEEK: |
|
|
|
; ENTRY: D=BANK ID, HL=ADDRESS IN HBIOS BANK, E=BYTE VALUE |
|
|
|
; |
|
|
|
SYS_POKE: |
|
|
|
#IF (INTMODE == 1) |
|
|
|
#IF (INTMODE > 0) |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
CALL HBX_POKE ; IMPLEMENTED IN PROXY |
|
|
|
#IF (INTMODE == 1) |
|
|
|
#IF (INTMODE > 0) |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
EI |
|
|
|
#ENDIF |
|
|
|
XOR A |
|
|
|
@ -2561,9 +2576,6 @@ SYS_INTSET1: |
|
|
|
INC HL |
|
|
|
LD (HL),B ; SAVE MSB |
|
|
|
EX DE,HL ; HL := PREV VEC |
|
|
|
;#IF (INTMODE == 2) |
|
|
|
; LD DE,HBX_INT ; DE := IM2 INT ROUTING ENGINE |
|
|
|
;#ENDIF |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
|