|
|
|
@ -113,12 +113,12 @@ MODCNT .SET MODCNT + 1 |
|
|
|
#DEFINE HB_DI ; |
|
|
|
#DEFINE HB_EI ; |
|
|
|
#ENDIF |
|
|
|
#IF ((INTMODE == 1) | (INTMODE == 2)) |
|
|
|
; MODE 1 OR 2 INTERRUPT HANDLING |
|
|
|
#IF ((INTMODE == 1) | (INTMODE == 2) | (INTMODE == 3)) |
|
|
|
; MODE 1 OR 2 OR 3 INTERRUPT HANDLING |
|
|
|
#DEFINE HB_DI DI |
|
|
|
#DEFINE HB_EI EI |
|
|
|
#ENDIF |
|
|
|
#IF (INTMODE > 2) |
|
|
|
#IF (INTMODE > 3) |
|
|
|
.ECHO "*** ERROR: INVALID INTMODE SETTING!!!\n" |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
#ENDIF |
|
|
|
@ -377,6 +377,25 @@ HBX_INVOKE: |
|
|
|
POP HL ; RESTORE HL |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
;#IF (MEMMGR == MM_Z280) |
|
|
|
#IF 0 |
|
|
|
|
|
|
|
LD A,(HB_CURBNK) ; GET CURRENT BANK |
|
|
|
LD (HB_INVBNK),A ; SAVE INVOCATION BANK |
|
|
|
|
|
|
|
LD A,BID_BIOS ; HBIOS BANK |
|
|
|
LD (HB_CURBNK),A ; SET AS CURRENT BANK |
|
|
|
|
|
|
|
.DB $ED,$71 ; SC |
|
|
|
.DW HB_DISPATCH ; SC PARAMETER |
|
|
|
|
|
|
|
PUSH AF ; SAVE AF (FUNCTION RETURN) |
|
|
|
LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK |
|
|
|
LD (HB_CURBNK),A |
|
|
|
POP AF ; RESTORE AF |
|
|
|
|
|
|
|
#ELSE |
|
|
|
|
|
|
|
LD (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME |
|
|
|
LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK |
|
|
|
|
|
|
|
@ -398,6 +417,8 @@ HBX_INVOKE: |
|
|
|
LD SP,0 ; RESTORE ORIGINAL STACK FRAME |
|
|
|
HBX_INVSP .EQU $ - 2 |
|
|
|
|
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#IF (HBIOS_MUTEX == TRUE) |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,HB_LOCK ; POINT TO LOCK |
|
|
|
@ -496,7 +517,17 @@ HBX_BNKSEL1: |
|
|
|
RET ; DONE |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
JP Z280_BNKSEL ; DO THE REAL WORK |
|
|
|
.DB $ED,$71 ; SC |
|
|
|
.DW Z280_BNKSEL ; SC PARAMETER |
|
|
|
RET |
|
|
|
; |
|
|
|
Z280_SYSCALL: |
|
|
|
EX (SP),HL |
|
|
|
LD (Z280_SCADR),HL |
|
|
|
POP HL |
|
|
|
Z280_SCADR .EQU $ + 1 |
|
|
|
CALL $FFFF |
|
|
|
.DB $ED,$55 ; RETIL |
|
|
|
#ENDIF |
|
|
|
#IF (MEMMGR == MM_ZRC) |
|
|
|
BIT 7,A ; BIT 7 SET REQUESTS RAM PAGE |
|
|
|
@ -524,19 +555,9 @@ HBX_ROM: |
|
|
|
;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|
|
|
; |
|
|
|
HBX_BNKCPY: |
|
|
|
#IF (CPUFAM == CPU_Z280) |
|
|
|
PUSH IY |
|
|
|
PUSH BC |
|
|
|
LD C,Z280_MSR |
|
|
|
.DB $FD,$ED,$66 ; LDCTL IY,(C) |
|
|
|
POP BC |
|
|
|
PUSH IY |
|
|
|
DI |
|
|
|
#ELSE |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
LD (HBX_BC_SP),SP ; PUT STACK |
|
|
|
LD SP,HBX_TMPSTK ; ... IN HI MEM |
|
|
|
|
|
|
|
@ -566,18 +587,9 @@ HBX_BC_LAST: |
|
|
|
|
|
|
|
LD SP,$FFFF ; RESTORE STACK |
|
|
|
HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE |
|
|
|
#IF (CPUFAM == CPU_Z280) |
|
|
|
POP IY |
|
|
|
PUSH BC |
|
|
|
LD C,Z280_MSR |
|
|
|
.DB $FD,$ED,$6E ; LDCTL (C),IY |
|
|
|
POP BC |
|
|
|
POP IY |
|
|
|
#ELSE |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
EI |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
; |
|
|
|
HBX_BC_ITER: |
|
|
|
@ -678,7 +690,7 @@ HBX_INTSTK .EQU $ |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
#IF ((INTMODE == 2) | (INTMODE == 3)) |
|
|
|
; |
|
|
|
; HBIOS INTERRUPT SLOT ASSIGNMENTS |
|
|
|
; |
|
|
|
@ -750,47 +762,83 @@ INT_IM1: |
|
|
|
; |
|
|
|
#IF (INTMODE > 0) |
|
|
|
; |
|
|
|
; COMMON INTERRUPT DISPATCHING CODE |
|
|
|
; SETUP AND CALL HANDLER IN BIOS BANK |
|
|
|
; |
|
|
|
HBX_INT: ; COMMON INTERRUPT ROUTING CODE |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
EX (SP),HL ; SAVE HL AND GET INT JP TABLE OFFSET |
|
|
|
|
|
|
|
; SAVE STATE (HL SAVED PREVIOUSLY ON ORIGINAL STACK FRAME) |
|
|
|
PUSH AF ; SAVE AF |
|
|
|
PUSH BC ; SAVE BC |
|
|
|
PUSH DE ; SAVE DE |
|
|
|
PUSH IY ; SAVE IY |
|
|
|
; |
|
|
|
; HANDLE INT VIA JP TABLE IN HBIOS |
|
|
|
LD L,(HL) ; OFFSET INTO JP TABLE FOR THIS INT |
|
|
|
LD H,HB_IVT >> 8 ; MSB OF HBIOS INT JP TABLE |
|
|
|
CALL JPHL ; CALL HANDLER VIA INT JP TABLE |
|
|
|
; |
|
|
|
; RESTORE STATE |
|
|
|
POP IY ; RESTORE IY |
|
|
|
POP DE ; RESTORE DE |
|
|
|
POP BC ; RESTORE BC |
|
|
|
POP AF ; RESTORE AF |
|
|
|
POP HL ; RESTORE HL |
|
|
|
; |
|
|
|
; BURN THE REASON CODE |
|
|
|
EX (SP),HL ; HL TO STK, RC TO HL |
|
|
|
POP HL ; RESTORE HL |
|
|
|
|
|
|
|
CALL HBX_RETI ; RETI FOR Z80 PERIPHERALS |
|
|
|
.DB $ED,$55 ; BACK TO USER LAND |
|
|
|
; |
|
|
|
HBX_RETI: |
|
|
|
RETI |
|
|
|
; |
|
|
|
#ELSE |
|
|
|
; |
|
|
|
; COMMON INTERRUPT DISPATCHING CODE |
|
|
|
; SETUP AND CALL HANDLER IN BIOS BANK |
|
|
|
; |
|
|
|
EX (SP),HL ; SAVE HL AND GET INT JP TABLE OFFSET |
|
|
|
; |
|
|
|
LD (HBX_INT_SP),SP ; SAVE ORIGINAL STACK FRAME |
|
|
|
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 |
|
|
|
PUSH BC ; SAVE BC |
|
|
|
PUSH DE ; SAVE DE |
|
|
|
PUSH IY ; SAVE IY |
|
|
|
|
|
|
|
; |
|
|
|
LD A,BID_BIOS ; HBIOS BANK |
|
|
|
CALL HBX_BNKSEL_INT ; SELECT IT |
|
|
|
|
|
|
|
; |
|
|
|
LD L,(HL) ; OFFSET INTO JP TABLE FOR THIS INT |
|
|
|
LD H,HB_IVT >> 8 ; MSB OF HBIOS INT JP TABLE |
|
|
|
|
|
|
|
; |
|
|
|
CALL JPHL ; CALL HANDLER VIA INT JP TABLE |
|
|
|
|
|
|
|
; |
|
|
|
LD A,(HB_CURBNK) ; GET PRE-INT BANK |
|
|
|
CALL HBX_BNKSEL ; SELECT IT |
|
|
|
|
|
|
|
; |
|
|
|
; RESTORE STATE |
|
|
|
POP IY ; RESTORE IY |
|
|
|
POP DE ; RESTORE DE |
|
|
|
POP BC ; RESTORE BC |
|
|
|
POP AF ; RESTORE AF |
|
|
|
|
|
|
|
; |
|
|
|
LD SP,$FFFF ; RESTORE ORIGINAL STACK FRAME |
|
|
|
HBX_INT_SP .EQU $ - 2 |
|
|
|
|
|
|
|
; |
|
|
|
POP HL ; RESTORE HL |
|
|
|
|
|
|
|
; |
|
|
|
HB_EI ; ENABLE INTERRUPTS |
|
|
|
RETI ; AND RETURN |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY |
|
|
|
@ -899,7 +947,7 @@ HB_IVT: |
|
|
|
; NOTE THAT EACH ENTRY HAS A FILLER BYTE OF VALUE ZERO. THIS BYTE |
|
|
|
; HAS NO FUNCTION. IT IS JUST USED TO MAKE ENTRIES AN EVEN 4 BYTES. |
|
|
|
; |
|
|
|
#IF (INTMODE == 2) |
|
|
|
#IF ((INTMODE == 2) | (INTMODE == 3)) |
|
|
|
; |
|
|
|
HB_IVT: |
|
|
|
HB_IVT00: JP HB_BADINT \ .DB 0 |
|
|
|
@ -982,8 +1030,21 @@ HB_START: |
|
|
|
; LD BC,Z280_BNKSELZ-Z280_BNKSEL ; BYTE COUNT TO COPY |
|
|
|
; LDIR ; COPY |
|
|
|
; |
|
|
|
DIAG(%11111110) |
|
|
|
; JP XZ280_BNKSELZ ; JUMP TO CODE CONTINUATION |
|
|
|
|
|
|
|
; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER |
|
|
|
LD C,Z280_VPR |
|
|
|
LD HL,$0010 ; TOP 16 BITS OF PHYSICAL ADR OF IVT |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
|
|
|
|
;; TEST SYSTEM CALL |
|
|
|
;.DB $ED,$71 ; SC |
|
|
|
;.DW Z280_BNKSEL ; SC PARAMETER |
|
|
|
; |
|
|
|
;LD A,%10101010 |
|
|
|
;OUT (DIAGPORT),A |
|
|
|
;DI |
|
|
|
;HALT |
|
|
|
|
|
|
|
JR Z280_INITZ ; JUMP TO CODE CONTINUATION |
|
|
|
; |
|
|
|
Z280_PDRTBL: |
|
|
|
@ -1006,6 +1067,58 @@ Z280_PDRTBL: |
|
|
|
.DW ($0FE << 4) | $A |
|
|
|
.DW ($0FF << 4) | $A |
|
|
|
; |
|
|
|
Z280_PRIVINST: |
|
|
|
EX (SP),HL ; GET MSR, SAVE HL |
|
|
|
LD (HB_MSRSAV),HL ; SAVE IT |
|
|
|
POP HL ; RECOVER HL, POP STACK |
|
|
|
EX (SP),HL ; GET ADR, SAVE HL |
|
|
|
|
|
|
|
PUSH AF |
|
|
|
PUSH BC |
|
|
|
PUSH DE |
|
|
|
|
|
|
|
LD A,(HL) |
|
|
|
INC HL ; BUMP PAST PRIV INST |
|
|
|
|
|
|
|
; HANDLE DI |
|
|
|
CP $F3 ; DI? |
|
|
|
JR NZ,Z280_PRIVINST2 |
|
|
|
DI ; DO THE DI |
|
|
|
JR Z280_PRIVINSTX |
|
|
|
|
|
|
|
Z280_PRIVINST2: |
|
|
|
; HANDLE EI |
|
|
|
CP $FB ; EI? |
|
|
|
JR NZ,Z280_PRIVINST_HALT |
|
|
|
EI ; DO THE EI |
|
|
|
JR Z280_PRIVINSTX |
|
|
|
|
|
|
|
Z280_PRIVINST_HALT: |
|
|
|
; SOMETHING ELSE, DIAGNOSE & HALT SYSTEM |
|
|
|
|
|
|
|
CALL NEWLINE |
|
|
|
LD DE,Z280_PRIVSTR |
|
|
|
CALL WRITESTR |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
|
|
|
|
DI |
|
|
|
HALT |
|
|
|
|
|
|
|
Z280_PRIVINSTX: |
|
|
|
POP DE |
|
|
|
POP BC |
|
|
|
POP AF |
|
|
|
|
|
|
|
EX (SP),HL ; RECOVER HL, ADR TO STK |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,(HB_MSRSAV) ; GET SAVED MSR |
|
|
|
EX (SP),HL ; MSR TO STK, RECOVER HL |
|
|
|
.DB $ED,$55 ; RETIL |
|
|
|
; |
|
|
|
HB_MSRSAV .DW 0 |
|
|
|
; |
|
|
|
Z280_PRIVSTR .TEXT "\n\n*** Privileged Instruction @$" |
|
|
|
; |
|
|
|
Z280_INITZ: |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
@ -1443,6 +1556,17 @@ HB_CPU2: |
|
|
|
IM 2 ; SWITCH TO INT MODE 2 |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (INTMODE == 3) |
|
|
|
; |
|
|
|
; SETUP Z280 INT A FOR VECTORED INTERRUPTS |
|
|
|
LD HL,%0010000000000000 |
|
|
|
LD C,Z280_ISR |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
; |
|
|
|
.DB $ED,$4E ; IM 3 |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (PLATFORM == PLT_SBC) |
|
|
|
; |
|
|
|
#IF (HTIMENABLE) ; SIMH TIMER |
|
|
|
@ -1858,6 +1982,63 @@ IS_REC_M1: |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
INITSYS3: |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; LEAVE SYSTEM MODE STACK POINTING TO AN OK PLACE |
|
|
|
LD SP,HB_STACK - $40 ; *** FIX *** |
|
|
|
|
|
|
|
HB_DI |
|
|
|
|
|
|
|
; FIXUP BNKSEL TO WORK ON USER MODE PDRS |
|
|
|
XOR A |
|
|
|
LD (W_MMU0+1),A |
|
|
|
LD (W_MMU1+1),A |
|
|
|
|
|
|
|
;DIAG(%10000001) |
|
|
|
;DI |
|
|
|
;HALT |
|
|
|
|
|
|
|
; MAKE USER MODE BANK CORRECT |
|
|
|
LD A,(HB_CURBNK) ; GET CURRENT BANK |
|
|
|
CALL HBX_BNKSEL |
|
|
|
|
|
|
|
;DIAG(%10000011) |
|
|
|
;DI |
|
|
|
;HALT |
|
|
|
|
|
|
|
;LD C,Z280_TCR |
|
|
|
;.DB $ED,$66 ; LDCTL HL,(C) |
|
|
|
;LD A,L |
|
|
|
;CALL PC_SPACE |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
|
|
|
|
LD HL,HBX_LOC |
|
|
|
.DB $ED,$8F ; LDCTL USP,HL |
|
|
|
|
|
|
|
;DIAG(%10000111) |
|
|
|
;DI |
|
|
|
;HALT |
|
|
|
|
|
|
|
HB_EI |
|
|
|
|
|
|
|
; SWITCH TO USER MODE NOW |
|
|
|
LD C,Z280_MSR |
|
|
|
LD HL,$407F |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
;LD A,%10001111 |
|
|
|
;OUT (DIAGPORT),A |
|
|
|
|
|
|
|
;DI |
|
|
|
;HALT |
|
|
|
LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY |
|
|
|
|
|
|
|
;DIAG(%10001111) |
|
|
|
;CALL LDELAY |
|
|
|
|
|
|
|
;DIAG(%10011111) |
|
|
|
;CALL LDELAY |
|
|
|
|
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE |
|
|
|
; |
|
|
|
@ -2107,6 +2288,11 @@ IDLE: |
|
|
|
; |
|
|
|
HB_DISPATCH: |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
HB_EI |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; |
|
|
|
#IF 0 ; *DEBUG* START |
|
|
|
; |
|
|
|
CALL HB_DISPATCH1 ; DO THE WORK |
|
|
|
@ -3541,6 +3727,46 @@ HB_TMPSZ .DW 0 |
|
|
|
HB_TMPREF .DW 0 |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; Z280 INTERRUPT VECTOR TABLE |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
#IF (MEMMGR = MM_Z280) |
|
|
|
; |
|
|
|
.FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED! |
|
|
|
; |
|
|
|
Z280_IVT: |
|
|
|
.DW 0, 0 ; RESERVED |
|
|
|
.DW 0 ; NMI MSR |
|
|
|
.DW 0 ; NMI VECTOR |
|
|
|
.DW $0000 ; INT A MSR |
|
|
|
.DW 0 ; INT A VECTOR |
|
|
|
.FILL $50 - ($ - Z280_IVT),0 ; SKIP TO SYS CALL TRAP VECTOR |
|
|
|
.DW $0000 ; SYS CALL, NEW MSR |
|
|
|
.DW Z280_SYSCALL ; SYS CALL, VECTOR ADR |
|
|
|
.DW $0000 ; PRIV INST TRAP, NEW MSR |
|
|
|
.DW Z280_PRIVINST ; PRIV INST, VECTOR ADR |
|
|
|
.FILL $70 - ($ - Z280_IVT),0 ; SKIP TO START OF NMI/INTA VECTORS |
|
|
|
.DW HBX_IV00 |
|
|
|
.DW HBX_IV01 |
|
|
|
.DW HBX_IV02 |
|
|
|
.DW HBX_IV03 |
|
|
|
.DW HBX_IV04 |
|
|
|
.DW HBX_IV05 |
|
|
|
.DW HBX_IV06 |
|
|
|
.DW HBX_IV07 |
|
|
|
.DW HBX_IV08 |
|
|
|
.DW HBX_IV09 |
|
|
|
.DW HBX_IV0A |
|
|
|
.DW HBX_IV0B |
|
|
|
.DW HBX_IV0C |
|
|
|
.DW HBX_IV0D |
|
|
|
.DW HBX_IV0E |
|
|
|
.DW HBX_IV0F |
|
|
|
.FILL $370 - ($ - Z280_IVT),0 ; FILL REMAINDER OF Z280 IVT |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
;================================================================================================== |
|
|
|
; DEVICE DRIVERS |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
|