|
|
|
@ -115,12 +115,23 @@ MODCNT .SET MODCNT + 1 |
|
|
|
; NO INTERRUPT HANDLING |
|
|
|
#DEFINE HB_DI ; |
|
|
|
#DEFINE HB_EI ; |
|
|
|
#ENDIF |
|
|
|
#IF ((INTMODE == 1) | (INTMODE == 2) | (INTMODE == 3)) |
|
|
|
; MODE 1 OR 2 OR 3 INTERRUPT HANDLING |
|
|
|
#ELSE |
|
|
|
#IF (CPUFAM == CPU_Z280) |
|
|
|
#IF (INTMODE == 3) |
|
|
|
; Z280 MODE 3 INTERRUPT HANDLING (INTA & UART ENABLED) |
|
|
|
#DEFINE HB_DI DI |
|
|
|
#DEFINE HB_EI .DB $ED,$F7,$09 |
|
|
|
#ELSE |
|
|
|
; Z280 MODE 1/2 INTERRUPT HANDLING |
|
|
|
#DEFINE HB_DI DI |
|
|
|
#DEFINE HB_EI EI |
|
|
|
#ENDIF |
|
|
|
#ELSE |
|
|
|
#DEFINE HB_DI DI |
|
|
|
#DEFINE HB_EI EI |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (INTMODE > 3) |
|
|
|
.ECHO "*** ERROR: INVALID INTMODE SETTING!!!\n" |
|
|
|
!!! ; FORCE AN ASSEMBLY ERROR |
|
|
|
@ -300,10 +311,7 @@ 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. |
|
|
|
; WARNING: HBX_INVOKE IS *NOT* REENTRANT! |
|
|
|
; |
|
|
|
HBX_INVOKE: |
|
|
|
|
|
|
|
@ -500,10 +508,10 @@ HBX_BNKCPY: |
|
|
|
.DB $ED,$66 ; LDCTL HL,(C) |
|
|
|
POP BC |
|
|
|
EX (SP),HL |
|
|
|
DI |
|
|
|
HB_DI |
|
|
|
#ELSE |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
HB_DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
LD (HBX_BC_SP),SP ; PUT STACK |
|
|
|
@ -545,7 +553,7 @@ HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE |
|
|
|
#ELSE |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
EI |
|
|
|
HB_EI |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
; |
|
|
|
@ -576,6 +584,48 @@ HBX_BC_ITER: |
|
|
|
; ON INPUT A=TARGET BANK, IX=TARGET ADDRESS |
|
|
|
; |
|
|
|
HBX_BNKCALL: |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
JR HBX_BNKCALL2 |
|
|
|
|
|
|
|
CP BID_BIOS ; CALLING HBIOS? |
|
|
|
JR NZ,HBX_BNKCALL2 ; NOPE, DO NORMAL PROCESSING |
|
|
|
|
|
|
|
;PUSH AF |
|
|
|
;LD A,'[' |
|
|
|
;.DB $ED,$71 ; SC |
|
|
|
;.DW COUT ; SC PARAMETER |
|
|
|
;POP AF |
|
|
|
|
|
|
|
; |
|
|
|
;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 |
|
|
|
|
|
|
|
LD (HBX_BNKCALL1+2),IX ; SETUP TARGET ADDRESS |
|
|
|
HBX_BNKCALL1: |
|
|
|
.DB $ED,$71 ; SC |
|
|
|
.DW $FFFF ; SC PARAMETER (SET ABOVE) |
|
|
|
|
|
|
|
;PUSH AF |
|
|
|
;LD A,']' |
|
|
|
;.DB $ED,$71 ; SC |
|
|
|
;.DW COUT ; SC PARAMETER |
|
|
|
;POP AF |
|
|
|
|
|
|
|
;PUSH AF |
|
|
|
;LD A,(HB_INVBNK) |
|
|
|
;LD (HB_CURBNK),A |
|
|
|
;POP AF |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
HBX_BNKCALL2: |
|
|
|
LD (HBX_TGTBNK),A ; STUFF TARGET BANK TO CALL INTO CODE BELOW |
|
|
|
LD (HBX_TGTADR),IX ; STUFF ADDRESS TO CALL INTO CODE BELOW |
|
|
|
LD A,(HB_CURBNK) ; GET CURRENT BANK |
|
|
|
@ -956,7 +1006,7 @@ HB_START: |
|
|
|
; INITIALIZE MMU |
|
|
|
; START BY SELECTING I/O PAGE $FF |
|
|
|
LD L,$FF ; MMU AND DMA PAGE I/O REG IS $FF |
|
|
|
LD C,$08 ; REG C POINTS TO I/O PAGE REGISTER |
|
|
|
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
; |
|
|
|
; INITIALIZE ALL OF THE SYSTEM PAGE DESCRIPTORS WITH BLOCK MOVE |
|
|
|
@ -979,13 +1029,18 @@ HB_START: |
|
|
|
LD C,Z280_MMUMCR ; MMU MASTER CONTROL REGISTER |
|
|
|
LD HL,$BBFF ; ENABLE USER & SYSTEM TRANSLATE |
|
|
|
.DB $ED,$BF ; OUTW (C),HL |
|
|
|
; |
|
|
|
; |
|
|
|
; DISABLE MEMORY REFRESH CYCLES |
|
|
|
LD A,$08 ; DISABLED |
|
|
|
OUT (Z280_RRR),A ; SET REFRESH RATE REGISTER |
|
|
|
|
|
|
|
; RESTORE I/O PAGE TO $00 |
|
|
|
LD L,$00 ; NORMAL I/O REG IS $00 |
|
|
|
LD C,$08 ; REG C POINTS TO I/O PAGE REGISTER |
|
|
|
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
; |
|
|
|
; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER |
|
|
|
; WILL POINT TO ROM COPY FOR NOW, UPDATED TO RAM LATER ON |
|
|
|
LD C,Z280_VPR |
|
|
|
LD HL,Z280_IVT >> 8 ; TOP 16 BITS OF PHYSICAL ADR OF IVT |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
@ -2037,6 +2092,9 @@ HB_PCINITTBL: |
|
|
|
#IF (ACIAENABLE) |
|
|
|
.DW ACIA_PREINIT |
|
|
|
#ENDIF |
|
|
|
#IF (Z2UENABLE) |
|
|
|
.DW Z2U_PREINIT |
|
|
|
#ENDIF |
|
|
|
#IF (PIO_4P | PIO_ZP) |
|
|
|
.DW PIO_PREINIT |
|
|
|
#ENDIF |
|
|
|
@ -2080,6 +2138,9 @@ HB_INITTBL: |
|
|
|
#IF (ACIAENABLE) |
|
|
|
.DW ACIA_INIT |
|
|
|
#ENDIF |
|
|
|
#IF (Z2UENABLE) |
|
|
|
.DW Z2U_INIT |
|
|
|
#ENDIF |
|
|
|
#IF (DSRTCENABLE) |
|
|
|
.DW DSRTC_INIT |
|
|
|
#ENDIF |
|
|
|
@ -2798,7 +2859,7 @@ SYS_VER: |
|
|
|
; SET ACTIVE MEMORY BANK AND RETURN PREVIOUSLY ACTIVE MEMORY BANK |
|
|
|
; NOTE THAT IT GOES INTO EFFECT AS HBIOS FUNCTION IS EXITED |
|
|
|
; HERE, WE JUST SET THE CURRENT BANK |
|
|
|
; CALLER MUST ESTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! |
|
|
|
; CALLER MUST EXTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! |
|
|
|
; |
|
|
|
SYS_SETBNK: |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
@ -3189,10 +3250,10 @@ SYS_PEEK: |
|
|
|
LD C,Z280_MSR |
|
|
|
.DB $FD,$ED,$66 ; LDCTL IY,(C) |
|
|
|
PUSH IY |
|
|
|
DI |
|
|
|
HB_DI |
|
|
|
#ELSE |
|
|
|
LD A,I ; SAVE THE INTERRUPT STATUS |
|
|
|
DI ; COPY IFF2 TO P/V FLAG |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
@ -3204,9 +3265,9 @@ SYS_PEEK: |
|
|
|
.DB $FD,$ED,$6E ; LDCTL (C),IY |
|
|
|
POP IY |
|
|
|
#ELSE |
|
|
|
POP AF ; RECALL INITIAL INTERRUPT STATUS |
|
|
|
JP PO,$+4 ; RETURN TO INITIAL STATE |
|
|
|
EI |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
HB_EI |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
XOR A |
|
|
|
@ -3226,10 +3287,10 @@ SYS_POKE: |
|
|
|
LD C,Z280_MSR |
|
|
|
.DB $FD,$ED,$66 ; LDCTL IY,(C) |
|
|
|
PUSH IY |
|
|
|
DI |
|
|
|
HB_DI |
|
|
|
#ELSE |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
HB_DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
@ -3243,7 +3304,7 @@ SYS_POKE: |
|
|
|
#ELSE |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
EI |
|
|
|
HB_EI |
|
|
|
#ENDIF |
|
|
|
#ENDIF |
|
|
|
XOR A |
|
|
|
@ -3495,63 +3556,65 @@ Z280_BADINTSTR .TEXT "\n\n*** Z280 BAD INT @$" |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
Z280_PRIVINST: |
|
|
|
; SAVE HL AND MSR FOR POSSIBLE RETURN VIA RETIL |
|
|
|
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 |
|
|
|
|
|
|
|
; |
|
|
|
.DB $ED,$96 ; LDUP A,(HL) |
|
|
|
INC HL ; BUMP PAST PRIV INST |
|
|
|
|
|
|
|
;CALL PC_LBKT |
|
|
|
;CALL PRTHEXBYTE |
|
|
|
;CALL PC_RBKT |
|
|
|
|
|
|
|
; |
|
|
|
; HANDLE DI |
|
|
|
CP $F3 ; DI? |
|
|
|
JR NZ,Z280_PRIVINST2 |
|
|
|
DI ; DO THE DI |
|
|
|
HB_DI ; DO THE DI |
|
|
|
INC HL ; BUMP PAST IT |
|
|
|
JR Z280_PRIVINSTX |
|
|
|
|
|
|
|
; |
|
|
|
Z280_PRIVINST2: |
|
|
|
; HANDLE EI |
|
|
|
CP $FB ; EI? |
|
|
|
JR NZ,Z280_PRIVINST_HALT |
|
|
|
EI ; DO THE EI |
|
|
|
JR NZ,Z280_PRIVINST3 |
|
|
|
HB_EI ; DO THE EI |
|
|
|
INC HL ; BUMP PAST IT |
|
|
|
JR Z280_PRIVINSTX |
|
|
|
|
|
|
|
Z280_PRIVINST_HALT: |
|
|
|
; |
|
|
|
Z280_PRIVINST3: |
|
|
|
; SOMETHING ELSE, DIAGNOSE & HALT SYSTEM |
|
|
|
|
|
|
|
PUSH HL |
|
|
|
LD DE,Z280_PRIVSTR |
|
|
|
CALL WRITESTR |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
; |
|
|
|
; DUMP 16 BYTES OF USER ADDRESS SPACE |
|
|
|
CALL PC_SPACE |
|
|
|
CALL PC_LBKT |
|
|
|
CALL PRTHEXBYTE |
|
|
|
LD B,$10 |
|
|
|
Z280_PRIVINST4: |
|
|
|
.DB $ED,$96 ; LDUP A,(HL) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
INC HL |
|
|
|
.DB $ED,$96 ; LDUP A,(HL) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
DJNZ Z280_PRIVINST4 |
|
|
|
CALL PC_RBKT |
|
|
|
POP HL |
|
|
|
|
|
|
|
CALL NEWLINE |
|
|
|
LD DE,Z280_PRIVSTR |
|
|
|
CALL WRITESTR |
|
|
|
DEC HL |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
|
|
|
|
; |
|
|
|
; GO NO FURTHER |
|
|
|
DI |
|
|
|
HALT |
|
|
|
|
|
|
|
Z280_PRIVINSTX: |
|
|
|
; |
|
|
|
Z280_PRIVINSTX: |
|
|
|
; RESTORE REGISTERS |
|
|
|
POP DE |
|
|
|
POP BC |
|
|
|
POP AF |
|
|
|
|
|
|
|
; |
|
|
|
; RECOVER HL AND MSR, THEN RETURN VIA RETIL |
|
|
|
EX (SP),HL ; RECOVER HL, ADR TO STK |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD HL,(HB_MSRSAV) ; GET SAVED MSR |
|
|
|
@ -3560,7 +3623,7 @@ Z280_PRIVINSTX: |
|
|
|
; |
|
|
|
HB_MSRSAV .DW 0 |
|
|
|
; |
|
|
|
Z280_PRIVSTR .TEXT "\n\n*** Privileged Instruction @$" |
|
|
|
Z280_PRIVSTR .TEXT "\r\n\r\n*** Privileged Instruction @$" |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
@ -3737,7 +3800,7 @@ HB_TMPREF .DW 0 |
|
|
|
; Z280 INTERRUPT VECTOR TABLE |
|
|
|
;================================================================================================== |
|
|
|
; |
|
|
|
#IF (MEMMGR = MM_Z280) |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
.FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED! |
|
|
|
; |
|
|
|
@ -3834,19 +3897,17 @@ Z280_BNKSEL: |
|
|
|
LD C,Z280_IOPR ; I/O PAGE REGISTER TO C |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
; |
|
|
|
; POINT HL TO PORTION OF TABLE TO PROGRAM PDRS WITH |
|
|
|
LD HL,Z280_PDRTBL ; POINT TO PDR TABLE |
|
|
|
SLA A ; BANK ID TIMES TWO, RAM BIT TO C |
|
|
|
JR NC,Z280_BNKSEL1 ; IF ROM, SKIP AHEAD |
|
|
|
INC H ; HANDLE RAM OFFSET |
|
|
|
; POINT HL TO STARTING ENTRY TO PROGRAM |
|
|
|
; OPTIMIZED TO ASSUME HL IS PAGE ALIGNED! |
|
|
|
LD H,Z280_PDRTBL >> 8 |
|
|
|
SLA A |
|
|
|
JR NC,Z280_BNKSEL1 |
|
|
|
INC H |
|
|
|
Z280_BNKSEL1: |
|
|
|
RLCA |
|
|
|
RLCA |
|
|
|
RLCA |
|
|
|
ADD A,L |
|
|
|
LD L,A |
|
|
|
JR NC,Z280_BNKSEL2 ; NO CARRY, SKIP AHEAD |
|
|
|
INC H ; HANDLE CARRY |
|
|
|
; |
|
|
|
Z280_BNKSEL2: |
|
|
|
; POINT TO FIRST PDR TO PROGRAM ($00=USER, $10=SYSTEM) |
|
|
|
@ -3867,6 +3928,11 @@ Z280_BNKSEL2: |
|
|
|
POP BC |
|
|
|
RET |
|
|
|
; |
|
|
|
#IF (($ & $FF) != 0) |
|
|
|
; PAGE ALIGN THE TABLE |
|
|
|
.FILL $100 - ($ & $FF) |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (($ % 2) == 1) |
|
|
|
; BYTE ALIGN THE TABLE |
|
|
|
.DB 0 |
|
|
|
@ -4172,7 +4238,7 @@ Z280_BNKSEL: |
|
|
|
PUSH DE |
|
|
|
PUSH BC |
|
|
|
LD L,$FF ; MMU PAGE I/O REG IS $FF |
|
|
|
LD C,8 ; REG C POINTS TO I/O PAGE REGISTER |
|
|
|
LD C,Z280_IOPR ; REG C POINTS TO I/O PAGE REGISTER |
|
|
|
.DB $ED,$6E ; OP CODE FOR LDCTL (C),HL |
|
|
|
LD E,0 ; DE IS TEMPLATE |
|
|
|
BIT 7,A |
|
|
|
@ -4236,7 +4302,7 @@ W_MMU1: |
|
|
|
W_MMU2: |
|
|
|
;.DB $ED,$65 ; PCACHE |
|
|
|
LD L,0 ; RESTORE I/O PAGE REG TO 0 |
|
|
|
LD C,8 |
|
|
|
LD C,Z280_IOPR |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
POP BC |
|
|
|
POP DE |
|
|
|
@ -4453,6 +4519,15 @@ SIZ_ACIA .EQU $ - ORG_ACIA |
|
|
|
.ECHO " bytes.\n" |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (Z2UENABLE) |
|
|
|
ORG_Z2U .EQU $ |
|
|
|
#INCLUDE "z2u.asm" |
|
|
|
SIZ_Z2U .EQU $ - ORG_Z2U |
|
|
|
.ECHO "Z2U occupies " |
|
|
|
.ECHO SIZ_Z2U |
|
|
|
.ECHO " bytes.\n" |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (VGAENABLE) |
|
|
|
ORG_VGA .EQU $ |
|
|
|
#INCLUDE "vga.asm" |
|
|
|
@ -5483,8 +5558,8 @@ PS_FLP_DSTR: .TEXT "SD$" ; PS_FLPSD |
|
|
|
; CHARACTER DEVICE STRINGS |
|
|
|
; |
|
|
|
PS_SDSTRREF: |
|
|
|
.DW PS_SDUART, PS_SDASCI, PS_SDTERM |
|
|
|
.DW PS_SDPRPCON, PS_SDPPPCON, PS_SDSIO, PS_SDACIA, PS_SDPIO,PS_SDUF,PS_SDDUART |
|
|
|
.DW PS_SDUART, PS_SDASCI, PS_SDTERM, PS_SDPRPCON, PS_SDPPPCON |
|
|
|
.DW PS_SDSIO, PS_SDACIA, PS_SDPIO, PS_SDUF, PS_SDDUART, PS_SDZ2U |
|
|
|
; |
|
|
|
PS_SDUART .TEXT "UART$" |
|
|
|
PS_SDASCI .TEXT "ASCI$" |
|
|
|
@ -5496,6 +5571,7 @@ PS_SDACIA .TEXT "ACIA$" |
|
|
|
PS_SDPIO .TEXT "PORT$" |
|
|
|
PS_SDUF .TEXT "UF$" |
|
|
|
PS_SDDUART .TEXT "DUART$" |
|
|
|
PS_SDZ2U .TEXT "Z2U$" |
|
|
|
; |
|
|
|
; CHARACTER SUB TYPE STRINGS |
|
|
|
; |
|
|
|
|