|
|
@ -247,7 +247,8 @@ RTCDEF .SET RTCDEF | %00001000 ; INITIAL SPEED LOW |
|
|
RET |
|
|
RET |
|
|
.FILL (038H - $),0FFH ; RST 38 / IM1 INT |
|
|
.FILL (038H - $),0FFH ; RST 38 / IM1 INT |
|
|
#IF (INTMODE == 1) |
|
|
#IF (INTMODE == 1) |
|
|
JP INT_IM1 ; JP TO INTERRUPT HANDLER IN HI MEM |
|
|
|
|
|
|
|
|
CALL HBX_INT ; HANDLE IM1 INTERRUPTS |
|
|
|
|
|
.DB $10 << 2 ; USE SPECIAL VECTOR #16 |
|
|
#ELSE |
|
|
#ELSE |
|
|
RET ; RETURN W/ INTS DISABLED |
|
|
RET ; RETURN W/ INTS DISABLED |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
@ -812,8 +813,6 @@ HBX_INTSTK .EQU $ |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
#IF ((INTMODE == 2) | (INTMODE == 3)) |
|
|
|
|
|
; |
|
|
|
|
|
; HBIOS INTERRUPT SLOT ASSIGNMENTS |
|
|
; HBIOS INTERRUPT SLOT ASSIGNMENTS |
|
|
; |
|
|
; |
|
|
; # Z80 Z180 |
|
|
; # Z80 Z180 |
|
|
@ -872,19 +871,9 @@ HBX_IV0D: CALL HBX_INT \ .DB $0D << 2 |
|
|
HBX_IV0E: CALL HBX_INT \ .DB $0E << 2 |
|
|
HBX_IV0E: CALL HBX_INT \ .DB $0E << 2 |
|
|
HBX_IV0F: CALL HBX_INT \ .DB $0F << 2 |
|
|
HBX_IV0F: CALL HBX_INT \ .DB $0F << 2 |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
INT_IM1: |
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
|
|
|
CALL HBX_INT |
|
|
|
|
|
.DB $00 |
|
|
|
|
|
#ELSE |
|
|
|
|
|
RETI ; UNEXPECTED INT, RET W/ INTS LEFT DISABLED |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
|
|
|
HBX_INT: ; COMMON INTERRUPT ROUTING CODE |
|
|
; |
|
|
; |
|
|
#IF (INTMODE > 0) |
|
|
#IF (INTMODE > 0) |
|
|
; |
|
|
|
|
|
HBX_INT: ; COMMON INTERRUPT ROUTING CODE |
|
|
|
|
|
; |
|
|
; |
|
|
#IF (MEMMGR == MM_Z280) |
|
|
#IF (MEMMGR == MM_Z280) |
|
|
; |
|
|
; |
|
|
@ -966,7 +955,11 @@ HBX_INT_SP .EQU $ - 2 |
|
|
RETI ; AND RETURN |
|
|
RETI ; AND RETURN |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
|
|
#ELSE |
|
|
|
|
|
; |
|
|
|
|
|
RET |
|
|
|
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY |
|
|
; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY |
|
|
@ -1038,34 +1031,6 @@ HB_STACK .EQU $ ; TOP OF HBIOS STACK |
|
|
; INTERRUPT VECTOR TABLE (MUST START AT PAGE BOUNDARY!!!) |
|
|
; INTERRUPT VECTOR TABLE (MUST START AT PAGE BOUNDARY!!!) |
|
|
;================================================================================================== |
|
|
;================================================================================================== |
|
|
; |
|
|
; |
|
|
; IM1 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK |
|
|
|
|
|
; LIST OF IM1 INT CALLS IS BUILT DYNAMICALLY BELOW |
|
|
|
|
|
; SEE HB_ADDIM1 ROUTINE |
|
|
|
|
|
; EACH ENTRY WILL LOOK LIKE: |
|
|
|
|
|
; CALL XXXX ; CALL INT HANDLER |
|
|
|
|
|
; RET NZ ; RETURN IF HANDLED |
|
|
|
|
|
; |
|
|
|
|
|
; NOTE THAT THE LIST IS INITIALLY FILLED WITH CALLS TO HB_BADINT. |
|
|
|
|
|
; AS THE TABLE IS POPULATED, THE ADDRESS OF HB_BADINT IS OVERLAID |
|
|
|
|
|
; WITH THE ADDRESS OF A REAL INTERRUPT HANDLER. |
|
|
|
|
|
; |
|
|
|
|
|
; THERE IS ROOM FOR 8 ENTRIES PLUS A FINAL CALL TO HB_BADINT. |
|
|
|
|
|
; |
|
|
|
|
|
#IF (INTMODE < 2) |
|
|
|
|
|
; |
|
|
|
|
|
HB_IVT: |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
; |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
; |
|
|
|
|
|
; IM2 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK |
|
|
; IM2 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK |
|
|
; THE LIST OF JP TABLE ENTRIES MATCHES THE IM2 VECTORS ONE FOR |
|
|
; THE LIST OF JP TABLE ENTRIES MATCHES THE IM2 VECTORS ONE FOR |
|
|
; ONE. ANY CALL TO THE PRIMARY IVT (HBX_IVT) WILL BE MAPPED TO |
|
|
; ONE. ANY CALL TO THE PRIMARY IVT (HBX_IVT) WILL BE MAPPED TO |
|
|
@ -1079,8 +1044,6 @@ HB_IVT: |
|
|
; NOTE THAT EACH ENTRY HAS A FILLER BYTE OF VALUE ZERO. THIS BYTE |
|
|
; 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. |
|
|
; HAS NO FUNCTION. IT IS JUST USED TO MAKE ENTRIES AN EVEN 4 BYTES. |
|
|
; |
|
|
; |
|
|
#IF ((INTMODE == 2) | (INTMODE == 3)) |
|
|
|
|
|
; |
|
|
|
|
|
HB_IVT: |
|
|
HB_IVT: |
|
|
HB_IVT00: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT00: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT01: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT01: JP HB_BADINT \ .DB 0 |
|
|
@ -1098,8 +1061,31 @@ HB_IVT0C: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT0D: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT0D: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT0E: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT0E: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT0F: JP HB_BADINT \ .DB 0 |
|
|
HB_IVT0F: JP HB_BADINT \ .DB 0 |
|
|
|
|
|
HB_IVT10: JP HB_IM1INT \ .DB 0 |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
|
|
|
|
|
|
; IM1 INTERRUPTS ARRIVE HERE AFTER BANK SWITCH TO HBIOS BANK |
|
|
|
|
|
; LIST OF IM1 INT CALLS IS BUILT DYNAMICALLY BELOW |
|
|
|
|
|
; SEE HB_ADDIM1 ROUTINE |
|
|
|
|
|
; EACH ENTRY WILL LOOK LIKE: |
|
|
|
|
|
; CALL XXXX ; CALL INT HANDLER |
|
|
|
|
|
; RET NZ ; RETURN IF HANDLED |
|
|
|
|
|
; |
|
|
|
|
|
; NOTE THAT THE LIST IS INITIALLY FILLED WITH CALLS TO HB_BADINT. |
|
|
|
|
|
; AS THE TABLE IS POPULATED, THE ADDRESS OF HB_BADINT IS OVERLAID |
|
|
|
|
|
; WITH THE ADDRESS OF A REAL INTERRUPT HANDLER. |
|
|
|
|
|
; |
|
|
|
|
|
; THERE IS ROOM FOR 8 ENTRIES PLUS A FINAL CALL TO HB_BADINT. |
|
|
|
|
|
; |
|
|
|
|
|
HB_IM1INT: |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
|
|
|
CALL HB_BADINT \ RET NZ |
|
|
; |
|
|
; |
|
|
;================================================================================================== |
|
|
;================================================================================================== |
|
|
; SYSTEM INITIALIZATION |
|
|
; SYSTEM INITIALIZATION |
|
|
@ -1711,11 +1697,14 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK |
|
|
; |
|
|
; |
|
|
; MAKE SURE IM1 INT VECTOR IS RIGHT |
|
|
; MAKE SURE IM1 INT VECTOR IS RIGHT |
|
|
#IF (INTMODE == 1) |
|
|
#IF (INTMODE == 1) |
|
|
; JP INT_IM1 IF INTERRUPT MODE ACTIVE |
|
|
|
|
|
LD A,$C3 |
|
|
|
|
|
|
|
|
; CALL HBX_INT ; HANDLE IM1 INTERRUPTS |
|
|
|
|
|
; .DB $10 << 2 ; USE SPECIAL VECTOR #16 |
|
|
|
|
|
LD A,$CD ; CALL OPCODE |
|
|
LD ($0038),A |
|
|
LD ($0038),A |
|
|
LD HL,INT_IM1 |
|
|
|
|
|
|
|
|
LD HL,HBX_INT ; ADDRESS |
|
|
LD ($0039),HL |
|
|
LD ($0039),HL |
|
|
|
|
|
LD A,$10 << 2 ; IM1 VECTOR |
|
|
|
|
|
LD ($003B),A |
|
|
#ELSE |
|
|
#ELSE |
|
|
; RETI ($ED, $4D) IF NON-INTERRUPT MODE |
|
|
; RETI ($ED, $4D) IF NON-INTERRUPT MODE |
|
|
LD HL,$0038 |
|
|
LD HL,$0038 |
|
|
@ -1809,8 +1798,8 @@ SAVE_REC_M: |
|
|
; |
|
|
; |
|
|
; TEST DEBUG *************************************************************************************** |
|
|
; TEST DEBUG *************************************************************************************** |
|
|
; |
|
|
; |
|
|
PRTS("DEBUG-IVT$") |
|
|
|
|
|
LD DE,HB_IVT |
|
|
|
|
|
|
|
|
PRTS("DEBUG-IM1INT$") |
|
|
|
|
|
LD DE,HB_IM1INT |
|
|
CALL DUMP_BUFFER |
|
|
CALL DUMP_BUFFER |
|
|
CALL NEWLINE |
|
|
CALL NEWLINE |
|
|
; |
|
|
; |
|
|
@ -2116,7 +2105,7 @@ HB_CPU3: |
|
|
; |
|
|
; |
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
#IF (CPUFAM == CPU_Z180) |
|
|
; |
|
|
; |
|
|
#IF (INTMODE == 2) |
|
|
|
|
|
|
|
|
#IF (INTMODE > 0) |
|
|
; |
|
|
; |
|
|
; MASK ALL EXTERNAL INTERRUPTS FOR NOW |
|
|
; MASK ALL EXTERNAL INTERRUPTS FOR NOW |
|
|
LD A,$01 ; INT0 ENABLED, INT1-2 DISABLED |
|
|
LD A,$01 ; INT0 ENABLED, INT1-2 DISABLED |
|
|
@ -2327,8 +2316,8 @@ NXTMIO: LD A,(HL) |
|
|
; TEST DEBUG *************************************************************************************** |
|
|
; TEST DEBUG *************************************************************************************** |
|
|
; |
|
|
; |
|
|
CALL NEWLINE2 |
|
|
CALL NEWLINE2 |
|
|
PRTS("DEBUG+IVT$") |
|
|
|
|
|
LD DE,HB_IVT |
|
|
|
|
|
|
|
|
PRTS("DEBUG+IM1INT$") |
|
|
|
|
|
LD DE,HB_IM1INT |
|
|
CALL DUMP_BUFFER |
|
|
CALL DUMP_BUFFER |
|
|
; |
|
|
; |
|
|
; TEST DEBUG *************************************************************************************** |
|
|
; TEST DEBUG *************************************************************************************** |
|
|
@ -5041,7 +5030,12 @@ SYS_INTGET1: |
|
|
INC A ; BUMP TO ADR FIELD |
|
|
INC A ; BUMP TO ADR FIELD |
|
|
LD H,0 |
|
|
LD H,0 |
|
|
LD L,A |
|
|
LD L,A |
|
|
|
|
|
#IF (INTMODE == 1) |
|
|
|
|
|
LD DE,HB_IM1INT ; DE := START OF VECTOR TABLE |
|
|
|
|
|
#ENDIF |
|
|
|
|
|
#IF (INTMODE == 2) |
|
|
LD DE,HB_IVT ; DE := START OF VECTOR TABLE |
|
|
LD DE,HB_IVT ; DE := START OF VECTOR TABLE |
|
|
|
|
|
#ENDIF |
|
|
ADD HL,DE ; HL := ADR OF VECTOR |
|
|
ADD HL,DE ; HL := ADR OF VECTOR |
|
|
XOR A ; INDICATE SUCCESS |
|
|
XOR A ; INDICATE SUCCESS |
|
|
RET |
|
|
RET |
|
|
@ -5123,7 +5117,7 @@ HB_ADDIM1: |
|
|
; |
|
|
; |
|
|
HB_IM1CNT .DB 0 ; NUMBER OF ENTRIES IN CALL LIST |
|
|
HB_IM1CNT .DB 0 ; NUMBER OF ENTRIES IN CALL LIST |
|
|
HB_IM1MAX .DB 8 ; MAX ENTRIES IN CALL LIST |
|
|
HB_IM1MAX .DB 8 ; MAX ENTRIES IN CALL LIST |
|
|
HB_IM1PTR .DW HB_IVT ; POINTER FOR NEXT IM1 ENTRY |
|
|
|
|
|
|
|
|
HB_IM1PTR .DW HB_IM1INT ; POINTER FOR NEXT IM1 ENTRY |
|
|
; |
|
|
; |
|
|
#ENDIF |
|
|
#ENDIF |
|
|
; |
|
|
; |
|
|
|