|
|
|
@ -66,11 +66,8 @@ |
|
|
|
; |
|
|
|
; TODO |
|
|
|
; - Add remaining service routine stubs for IM3 (NMI, etc.) |
|
|
|
; - Review PEEK/POKE code for Z280 |
|
|
|
; - Review bank selection code (selectable user/sys bank?) |
|
|
|
; - Check app boot under Z280 |
|
|
|
; - Relocate Z280_PRIVINST |
|
|
|
; |
|
|
|
; - Fix app boot under Z280 |
|
|
|
; |
|
|
|
; INCLUDE GENERIC STUFF |
|
|
|
; |
|
|
|
@ -323,26 +320,17 @@ HBX_INVOKE: |
|
|
|
|
|
|
|
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) |
|
|
|
PUSH HL ; SAVE HL |
|
|
|
LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK |
|
|
|
LD HL,HB_CURBNK |
|
|
|
CP (HL) ; BANK CHANGE? |
|
|
|
POP HL ; RESTORE HL |
|
|
|
JR Z,HBX_INVOKE1 ; SKIP IF NO CHANGE |
|
|
|
CALL HBX_BNKSEL ; DO THE CHANGE |
|
|
|
JR HBX_INVOKE2 ; AND CONTINUE |
|
|
|
HBX_INVOKE1: |
|
|
|
LD (HB_CURBNK),A ; JUST UPDATE CURBNK FIELD |
|
|
|
HBX_INVOKE2: |
|
|
|
POP AF ; RESTORE AF |
|
|
|
|
|
|
|
PUSH AF |
|
|
|
LD A,(HB_INVBNK) |
|
|
|
LD (HB_CURBNK),A |
|
|
|
POP AF |
|
|
|
|
|
|
|
#ELSE |
|
|
|
|
|
|
|
@ -417,6 +405,7 @@ HBX_ROM: |
|
|
|
OUT (MPCL_ROM),A ; SET ROM PAGE SELECTOR |
|
|
|
RET ; DONE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z2) |
|
|
|
BIT 7,A ; BIT 7 SET REQUESTS RAM PAGE |
|
|
|
JR Z,HBX_ROM ; NOT SET, SELECT ROM PAGE |
|
|
|
@ -433,6 +422,7 @@ HBX_ROM: |
|
|
|
#ENDIF |
|
|
|
RET ; DONE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_N8) |
|
|
|
BIT 7,A ; TEST BIT 7 FOR RAM VS. ROM |
|
|
|
JR Z,HBX_ROM ; IF NOT SET, SELECT ROM PAGE |
|
|
|
@ -454,8 +444,8 @@ HBX_ROM: |
|
|
|
LD A,N8_DEFACR ; SELECT ROM BY CLEARING BIT 7 |
|
|
|
OUT0 (N8_ACR),A ; ... IN N8 ACR REGISTER |
|
|
|
RET ; DONE |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z180) |
|
|
|
RLCA ; RAM FLAG TO CARRY FLAG AND BIT 0 |
|
|
|
JR NC,HBX_BNKSEL1 ; IF NC, WANT ROM PAGE, SKIP AHEAD |
|
|
|
@ -466,19 +456,13 @@ HBX_BNKSEL1: |
|
|
|
OUT0 (Z180_BBR),A ; WRITE TO BANK BASE |
|
|
|
RET ; DONE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
.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 |
|
|
|
JR Z,HBX_ROM ; NOT SET, SELECT ROM PAGE |
|
|
|
@ -509,122 +493,20 @@ HBX_BNKCPY: |
|
|
|
.DB $ED,$71 ; SC |
|
|
|
.DW Z280_BNKCPY ; SC PARAMETER |
|
|
|
RET |
|
|
|
|
|
|
|
; |
|
|
|
; Z280 BANK SELECTION (CALLED FROM PROXY) |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) & FALSE |
|
|
|
; |
|
|
|
Z280_BNKCPY: |
|
|
|
; Z280 MEMORY TO MEMORY DMA |
|
|
|
; USE FLOW THROUGH MODE DMA |
|
|
|
; SINGLE BYTE TRANSFER |
|
|
|
; TRANSACTION DESCRIPTION REGISTER (TDR) |
|
|
|
; %0000 0000 0000 0000 |
|
|
|
; - AUTO INCREMENT MEMORY |
|
|
|
; - FLOWTHROUGH OPERATION |
|
|
|
; - SINGLE TRANSACTION |
|
|
|
; - 1 BYTE XFER SIZE |
|
|
|
|
|
|
|
#ELSE |
|
|
|
#IF (CPUFAM == CPU_Z280) |
|
|
|
PUSH HL |
|
|
|
PUSH DE |
|
|
|
PUSH BC |
|
|
|
|
|
|
|
PUSH BC ; SAVE COUNT |
|
|
|
PUSH HL ; SAVE SOURCE ADDRESS |
|
|
|
|
|
|
|
; SELECT I/O PAGE $FF |
|
|
|
LD L,$FF ; I/O PAGE $FF |
|
|
|
LD C,Z280_IOPR ; I/O PAGE REGISTER |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
|
|
|
|
LD C,Z280_DMA0_DSTL ; START WITH DEST REG LO |
|
|
|
|
|
|
|
LD A,(HB_DSTBNK) ; DEST BANK TO ACCUM |
|
|
|
CALL Z2DMAADR ; SETUP DEST ADR REGS |
|
|
|
|
|
|
|
POP DE ; SRC ADR TO DE |
|
|
|
LD A,(HB_SRCBNK) ; DEST BANK TO ACCUM |
|
|
|
CALL Z2DMAADR ; SETUP SOURCE ADR REGS |
|
|
|
|
|
|
|
POP HL ; COUNT TO HL |
|
|
|
.DB $ED,$BF ; OUTW (C),HL |
|
|
|
INC C ; BUMP TO TDR |
|
|
|
|
|
|
|
LD HL,$8000 ; ENABLE DMA0 TO RUN! |
|
|
|
.DB $ED,$BF ; OUTW (C),HL |
|
|
|
|
|
|
|
; WAIT FOR XFER TO COMPLETE |
|
|
|
Z2DMALOOP: |
|
|
|
.DB $ED,$B7 ; INW HL,(C) |
|
|
|
BIT 7,H ; CHECK EN BIT OF TDR |
|
|
|
JR NZ,Z2DMALOOP ; LOOP WHILE ACTIVE |
|
|
|
|
|
|
|
; RETURN TO I/O PAGE $00 |
|
|
|
XOR A ; I/O PAGE ZERO |
|
|
|
LD C,Z280_IOPR ; I/O PAGE REGISTER |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
|
|
|
|
; SETUP RETURN VALUES |
|
|
|
POP BC ; RECOVER ORIGINAL BC |
|
|
|
POP DE ; RECOVER ORIGINAL DE |
|
|
|
POP HL ; RECOVER ORIGINAL HL |
|
|
|
ADD HL,BC ; INCREMENT SRC ADR BY COUNT |
|
|
|
EX DE,HL ; SWAP |
|
|
|
ADD HL,BC ; INCREMENT DST ADR BY COUNT |
|
|
|
EX DE,HL ; SWAP BACK |
|
|
|
LD BC,0 ; COUNT IS NOW ZERO |
|
|
|
|
|
|
|
RET |
|
|
|
|
|
|
|
Z2DMAADR: |
|
|
|
; SET ADDRESS REGISTERS, BANK IN A, ADDRESS IN DE |
|
|
|
; C POINTS TO FIRST DMA ADR PORT TO SET |
|
|
|
BIT 7,D ; HIGH RAM? |
|
|
|
JR Z,Z2DMAADR0 ; NO, SKIP |
|
|
|
LD A,$8F ; SUBSTITUTE COMMON RAM BANK ID |
|
|
|
|
|
|
|
Z2DMAADR0: |
|
|
|
BIT 7,A ; RAM? |
|
|
|
JR Z,Z2DMAADR1 ; NO, SKIP |
|
|
|
RES 7,A ; CLEAR RAM BIT |
|
|
|
SET 4,A ; SET BIT FOR 512K OFFSET |
|
|
|
|
|
|
|
Z2DMAADR1: |
|
|
|
; ADR HI FROM A:DE |
|
|
|
LD L,D ; L=XAAA AAAA |
|
|
|
LD H,A ; H=BBBB BBBB |
|
|
|
SLA L ; L=AAAA AAA0 |
|
|
|
SRL H ; H=0BBB BBBB B |
|
|
|
RR L ; L=BAAA AAAA |
|
|
|
LD A,$0F ; A=0000 1111 |
|
|
|
OR L ; A=BAAA 1111 |
|
|
|
LD L,A ; L=BAAA 1111 |
|
|
|
PUSH HL ; SAVE IT FOR NOW |
|
|
|
|
|
|
|
; ADR LO FROM DE: |
|
|
|
LD L,E ; L= AAAA AAAA |
|
|
|
LD A,$F0 ; A= 1111 0000 |
|
|
|
OR D ; A= 1111 AAAA |
|
|
|
LD H,A ; HL=1111 AAAA AAAA AAAA |
|
|
|
|
|
|
|
; SET ADR LO REG |
|
|
|
.DB $ED,$BF ; OUTW (C),HL |
|
|
|
INC C ; BUMP TO ADR HI REG |
|
|
|
|
|
|
|
; SET ADR HI REG |
|
|
|
POP HL ; RECOVER THE HI VAL |
|
|
|
|
|
|
|
.DB $ED,$BF ; OUTW (C),HL |
|
|
|
INC C ; BUMP TO NEXT REG |
|
|
|
|
|
|
|
RET |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
#ELSE |
|
|
|
LD C,Z280_MSR |
|
|
|
.DB $ED,$66 ; LDCTL HL,(C) |
|
|
|
POP BC |
|
|
|
EX (SP),HL |
|
|
|
DI |
|
|
|
#ELSE |
|
|
|
LD A,I |
|
|
|
DI |
|
|
|
PUSH AF |
|
|
|
#ENDIF |
|
|
|
LD (HBX_BC_SP),SP ; PUT STACK |
|
|
|
LD SP,HBX_TMPSTK ; ... IN HI MEM |
|
|
|
|
|
|
|
@ -654,9 +536,18 @@ HBX_BC_LAST: |
|
|
|
|
|
|
|
LD SP,$FFFF ; RESTORE STACK |
|
|
|
HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE |
|
|
|
#IF (CPUFAM == CPU_Z280) |
|
|
|
EX (SP),HL ; SAVE HL, RECOVER MSR |
|
|
|
PUSH BC ; SAVE BC |
|
|
|
LD C,Z280_MSR |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
POP BC ; RECOVER BC |
|
|
|
POP HL ; RECOVER HL |
|
|
|
#ELSE |
|
|
|
POP AF |
|
|
|
JP PO,$+4 |
|
|
|
EI |
|
|
|
#ENDIF |
|
|
|
RET |
|
|
|
; |
|
|
|
HBX_BC_ITER: |
|
|
|
@ -738,11 +629,28 @@ HBX_POKE: |
|
|
|
; |
|
|
|
HBX_PPRET: |
|
|
|
POP AF |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
LD A,(HB_INVBNK) ; SPECIAL CASE FOR Z280 MEM MGR |
|
|
|
#ENDIF |
|
|
|
CALL HBX_BNKSEL |
|
|
|
LD SP,0 ; RESTORE ORIGINAL STACK FRAME |
|
|
|
HBX_PPSP .EQU $ - 2 |
|
|
|
RET |
|
|
|
; |
|
|
|
; SYSCALL VECTOR ENTRY POINT. TAKES STACK PARAMETER AS A BRANCH |
|
|
|
; ADDRESS AND CALLS IT. ALLOWS ANY USER MODE CODE TO CALL INTO AN |
|
|
|
; ARBITRARY LOCATION OF SYSTEM MODE CODE. |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
Z280_SYSCALL: |
|
|
|
EX (SP),HL |
|
|
|
LD (Z280_SYSCALL_GO+1),HL |
|
|
|
POP HL |
|
|
|
Z280_SYSCALL_GO: |
|
|
|
CALL $FFFF ; PARM SET ABOVE |
|
|
|
.DB $ED,$55 ; RETIL |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; PRIVATE STACK AT END OF HBIOS CODE |
|
|
|
; OCCUPIES SPACE BEFORE IVT |
|
|
|
; |
|
|
|
@ -1094,7 +1002,7 @@ HB_START: |
|
|
|
; |
|
|
|
; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER |
|
|
|
LD C,Z280_VPR |
|
|
|
LD HL,$0010 ; TOP 16 BITS OF PHYSICAL ADR OF IVT |
|
|
|
LD HL,Z280_IVT >> 8 ; TOP 16 BITS OF PHYSICAL ADR OF IVT |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
; |
|
|
|
JP Z280_INITZ ; JUMP TO CODE CONTINUATION |
|
|
|
@ -1119,74 +1027,6 @@ 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 |
|
|
|
|
|
|
|
.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 |
|
|
|
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 |
|
|
|
|
|
|
|
PUSH HL |
|
|
|
CALL PC_LBKT |
|
|
|
CALL PRTHEXBYTE |
|
|
|
.DB $ED,$96 ; LDUP A,(HL) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
INC HL |
|
|
|
.DB $ED,$96 ; LDUP A,(HL) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
CALL PC_RBKT |
|
|
|
POP HL |
|
|
|
|
|
|
|
CALL NEWLINE |
|
|
|
LD DE,Z280_PRIVSTR |
|
|
|
CALL WRITESTR |
|
|
|
DEC HL |
|
|
|
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 |
|
|
|
@ -1366,6 +1206,13 @@ HB_START1: ; BNKCALL ARRIVES HERE, BUT NOW RUNNING IN RAM BANK |
|
|
|
LD A,TRUE ; ACCUM := TRUE |
|
|
|
LD (HB_RAMFLAG),A ; SET RAMFLAG |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; NOW POINT TO RAM COPY OF Z280 INT/TRAP TABLE |
|
|
|
LD C,Z280_VPR |
|
|
|
LD HL,$0E80+(Z280_IVT >> 8) ; TOP 16 BITS OF PHYSICAL ADR OF IVT |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; IF APPBOOT, WE NEED TO FIX UP A FEW THINGS IN PAGE ZERO |
|
|
|
; |
|
|
|
#IFDEF APPBOOT |
|
|
|
@ -1602,7 +1449,7 @@ HB_CPU2: |
|
|
|
LD C,Z280_BTIR ; BUS TIMING AND INIT REG |
|
|
|
.DB $ED,$66 ; LDCTL HL,(C) |
|
|
|
LD A,L ; PUT IN A |
|
|
|
AND %11110011 ; CLEAR DC AND I/O FIELDS |
|
|
|
AND %11110011 ; CLEAR LOW MEM WAIT STATES |
|
|
|
OR Z280_MEMWAIT << 2 ; SET LOW MEM WAIT STATES |
|
|
|
LD L,A ; BACK TO L |
|
|
|
.DB $ED,$6E ; LDCTL (C),HL |
|
|
|
@ -1816,158 +1663,6 @@ NXTMIO: LD A,(HL) |
|
|
|
CALL PRTSTRD |
|
|
|
.TEXT "HBIOS MUTEX ENABLED$" |
|
|
|
#ENDIF |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;; |
|
|
|
;;; TEST DMA ***************************************************************************************** |
|
|
|
;;; |
|
|
|
;;TSTDMA: |
|
|
|
;; |
|
|
|
;; CALL NEWLINE |
|
|
|
;; LD DE,TSTDST |
|
|
|
;; LD A,$10 |
|
|
|
;; CALL PRTHEXBUF |
|
|
|
;; |
|
|
|
;; ; USE FLOW THROUGH MODE DMA |
|
|
|
;; ; SINGLE BYTE TRANSFER |
|
|
|
;; ; TRANSACTION DESCRIPTION REGISTER (TDR) |
|
|
|
;; ; %0000 0000 0000 0000 |
|
|
|
;; ; - AUTO INCREMENT MEMORY |
|
|
|
;; ; - FLOWTHROUGH OPERATION |
|
|
|
;; ; - SINGLE TRANSACTION |
|
|
|
;; ; - 1 BYTE XFER SIZE |
|
|
|
;; |
|
|
|
;; LD A,$8D |
|
|
|
;; LD (HB_DSTBNK),A |
|
|
|
;; LD (HB_SRCBNK),A |
|
|
|
;; LD HL,TSTSRC |
|
|
|
;; LD DE,TSTDST |
|
|
|
;; LD BC,$0010 |
|
|
|
;; |
|
|
|
;; |
|
|
|
;; |
|
|
|
;; CALL HBX_BNKCPY |
|
|
|
;; JP ENDTST |
|
|
|
;; |
|
|
|
;; PUSH BC ; SAVE COUNT |
|
|
|
;; PUSH HL ; SAVE SOURCE ADDRESS |
|
|
|
;; |
|
|
|
;; ; SELECT I/O PAGE $FF |
|
|
|
;; LD L,$FF ; I/O PAGE $FF |
|
|
|
;; LD C,Z280_IOPR ; I/O PAGE REGISTER |
|
|
|
;; .DB $ED,$6E ; LDCTL (C),HL |
|
|
|
;; |
|
|
|
;; LD C,Z280_DMA0_DSTL ; START WITH DEST REG LO |
|
|
|
;; |
|
|
|
;; LD A,(HB_DSTBNK) ; DEST BANK TO ACCUM |
|
|
|
;; CALL SETADR ; SETUP DEST ADR |
|
|
|
;; |
|
|
|
;; LD (DSTHI),IY |
|
|
|
;; LD (DSTLO),IX |
|
|
|
;; |
|
|
|
;; POP DE ; SRC ADR TO DE |
|
|
|
;; LD A,(HB_SRCBNK) ; DEST BANK TO ACCUM |
|
|
|
;; CALL SETADR |
|
|
|
;; |
|
|
|
;; LD (SRCHI),IY |
|
|
|
;; LD (SRCLO),IX |
|
|
|
;; |
|
|
|
;; POP HL ; COUNT TO HL |
|
|
|
;; .DB $ED,$BF ; OUTW (C),HL |
|
|
|
;; INC C ; BUMP TO TDR |
|
|
|
;; |
|
|
|
;; LD HL,$8000 ; ENABLE DMA0 TO RUN! |
|
|
|
;; .DB $ED,$BF ; OUTW (C),HL |
|
|
|
;; |
|
|
|
;; ; WAIT FOR XFER TO COMPLETE |
|
|
|
;;DMALOOP: |
|
|
|
;; .DB $ED,$B7 ; INW HL,(C) |
|
|
|
;; BIT 7,H ; CHECK EN BIT OF TDR |
|
|
|
;; JR NZ,DMALOOP ; LOOP WHILE ACTIVE |
|
|
|
;; |
|
|
|
;; ; RETURN TO I/O PAGE $00 |
|
|
|
;; XOR A ; I/O PAGE ZERO |
|
|
|
;; LD C,Z280_IOPR ; I/O PAGE REGISTER |
|
|
|
;; .DB $ED,$6E ; LDCTL (C),HL |
|
|
|
;; |
|
|
|
;; JR ENDTST |
|
|
|
;; |
|
|
|
;;SETADR: |
|
|
|
;; |
|
|
|
;; ; SET ADDRESS REGISTERS, BANK IN A, ADDRESS IN DE |
|
|
|
;; ; C POINTS TO FIRST DMA ADR PORT TO SET |
|
|
|
;; |
|
|
|
;; BIT 7,A ; RAM? |
|
|
|
;; JR Z,CONT ; NO, SKIP |
|
|
|
;; RES 7,A ; CLEAR RAM BIT |
|
|
|
;; SET 4,A ; SET BIT FOR 512K OFFSET |
|
|
|
;; |
|
|
|
;;CONT: |
|
|
|
;; ; ADR HI FROM A:DE |
|
|
|
;; LD L,D ; L=XAAA AAAA |
|
|
|
;; LD H,A ; H=BBBB BBBB |
|
|
|
;; SLA L ; L=AAAA AAA0 |
|
|
|
;; SRL H ; H=0BBB BBBB B |
|
|
|
;; RR L ; L=BAAA AAAA |
|
|
|
;; LD A,$0F ; A=0000 1111 |
|
|
|
;; OR L ; A=BAAA 1111 |
|
|
|
;; LD L,A ; L=BAAA 1111 |
|
|
|
;; PUSH HL ; SAVE IT FOR NOW |
|
|
|
;; |
|
|
|
;; ; ADR LO FROM DE: |
|
|
|
;; LD L,E ; L= AAAA AAAA |
|
|
|
;; LD A,$F0 ; A= 1111 0000 |
|
|
|
;; OR D ; A= 1111 AAAA |
|
|
|
;; LD H,A ; HL=1111 AAAA AAAA AAAA |
|
|
|
;; |
|
|
|
;; PUSH HL |
|
|
|
;; POP IX |
|
|
|
;; |
|
|
|
;; ; SET ADR LO REG |
|
|
|
;; .DB $ED,$BF ; OUTW (C),HL |
|
|
|
;; INC C ; BUMP TO ADR HI REG |
|
|
|
;; |
|
|
|
;; ; SET ADR HI REG |
|
|
|
;; POP HL ; RECOVER THE HI VAL |
|
|
|
;; |
|
|
|
;; PUSH HL |
|
|
|
;; POP IY |
|
|
|
;; |
|
|
|
;; .DB $ED,$BF ; OUTW (C),HL |
|
|
|
;; INC C ; BUMP TO NEXT REG |
|
|
|
;; |
|
|
|
;; RET |
|
|
|
;; |
|
|
|
;; |
|
|
|
;;TSTSRC .DB $00, $11, $22, $33, $44, $55, $66, $77 |
|
|
|
;; .DB $88, $99, $AA, $BB, $CC, $DD, $EE, $FF |
|
|
|
;; |
|
|
|
;;TSTDST .FILL 16,$12 |
|
|
|
;; |
|
|
|
;;SRCHI .DW 0 |
|
|
|
;;SRCLO .DW 0 |
|
|
|
;;DSTHI .DW 0 |
|
|
|
;;DSTLO .DW 0 |
|
|
|
;; |
|
|
|
;;ENDTST: |
|
|
|
;; CALL NEWLINE |
|
|
|
;; LD BC,(SRCHI) |
|
|
|
;; CALL PRTHEXWORD |
|
|
|
;; CALL PC_SPACE |
|
|
|
;; LD BC,(SRCLO) |
|
|
|
;; CALL PRTHEXWORD |
|
|
|
;; CALL NEWLINE |
|
|
|
;; LD BC,(DSTHI) |
|
|
|
;; CALL PRTHEXWORD |
|
|
|
;; CALL PC_SPACE |
|
|
|
;; LD BC,(DSTLO) |
|
|
|
;; CALL PRTHEXWORD |
|
|
|
;; |
|
|
|
;; CALL NEWLINE |
|
|
|
;; LD DE,TSTDST |
|
|
|
;; LD A,$10 |
|
|
|
;; CALL PRTHEXBUF |
|
|
|
; |
|
|
|
DIAG(%11111111) |
|
|
|
; |
|
|
|
@ -2209,16 +1904,26 @@ INITSYS4: |
|
|
|
; LEAVE SYSTEM MODE STACK POINTING TO AN OK PLACE |
|
|
|
LD SP,HB_STACK ; NOW USE REAL SYSTEM STACK LOC |
|
|
|
|
|
|
|
HB_DI |
|
|
|
HB_DI ; NOT SURE THIS IS NEEDED |
|
|
|
|
|
|
|
; FIXUP BNKSEL TO WORK ON USER MODE PDRS |
|
|
|
XOR A |
|
|
|
LD (W_MMU0+1),A |
|
|
|
LD (W_MMU1+1),A |
|
|
|
|
|
|
|
; FIXUP SYSCALL TO KEEP INTERRUPTS ENABLED |
|
|
|
LD HL,$007F |
|
|
|
LD (Z280_IVT + $50),HL |
|
|
|
;CALL NEWLINE |
|
|
|
;LD DE,$1050 |
|
|
|
;LD A,4 |
|
|
|
;CALL PRTHEXBUF |
|
|
|
|
|
|
|
;; FIXUP SYSCALL TO KEEP INTERRUPTS ENABLED |
|
|
|
;LD HL,$007F |
|
|
|
;LD (Z280_IVT + $50),HL |
|
|
|
|
|
|
|
;CALL NEWLINE |
|
|
|
;LD DE,$1050 |
|
|
|
;LD A,4 |
|
|
|
;CALL PRTHEXBUF |
|
|
|
|
|
|
|
; MAKE USER MODE BANK CORRECT |
|
|
|
LD A,(HB_CURBNK) ; GET CURRENT BANK |
|
|
|
@ -2228,7 +1933,7 @@ INITSYS4: |
|
|
|
LD HL,HBX_LOC |
|
|
|
.DB $ED,$8F ; LDCTL USP,HL |
|
|
|
|
|
|
|
HB_EI |
|
|
|
HB_EI ; NOT SURE THIS IS NEEDED |
|
|
|
|
|
|
|
; SWITCH TO USER MODE NOW |
|
|
|
LD C,Z280_MSR |
|
|
|
@ -2476,6 +2181,10 @@ IDLE: |
|
|
|
HB_DISPATCH: |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; FOR Z280 MEMMGR, WE DISPATCH VIA THE Z280 SYSCALL. |
|
|
|
; THE SYSCALL MECHANISM WILL CLEAR INTERRUPTS. IN |
|
|
|
; GENERAL, INTERRUPTS ARE OK DURING API PROCESSING, |
|
|
|
; SO ENABLE THEM HERE. |
|
|
|
HB_EI |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
@ -3093,6 +2802,20 @@ SYS_VER: |
|
|
|
; CALLER MUST EXTABLISH UPPER MEMORY STACK BEFORE INVOKING THIS FUNCTION! |
|
|
|
; |
|
|
|
SYS_SETBNK: |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; FOR Z280 MEMMGR, WE ARE IN SYSTEM MODE HERE, SO WE CAN UPDATE |
|
|
|
; THE USER MODE BANK WITHOUT IMPACTING THE RUNNING CODE. IT |
|
|
|
; TAKE EFFECT UPON RETURN TO USER MODE. |
|
|
|
LD A,(HB_INVBNK) ; GET PREVIOUS BANK |
|
|
|
PUSH AF ; SAVE IT |
|
|
|
LD A,C ; NEW BANK TO A |
|
|
|
LD (HB_INVBNK),A ; UPDATE INVBNK |
|
|
|
CALL Z280_BNKSEL ; DO IT |
|
|
|
POP AF ; RECOVER PREV BANK |
|
|
|
LD C,A ; PREVIOUS BANK TO C |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
#ELSE |
|
|
|
PUSH HL ; SAVE INCOMING HL |
|
|
|
LD HL,HB_INVBNK ; POINT TO HBIOS INVOKE BANK ID ADDRESS |
|
|
|
LD A,(HL) ; GET EXISTING BANK ID TO A |
|
|
|
@ -3101,6 +2824,7 @@ SYS_SETBNK: |
|
|
|
POP HL ; RESTORE ORIGINAL HL |
|
|
|
XOR A ; SIGNAL SUCCESS |
|
|
|
RET ; DONE |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; GET ACTIVE MEMORY BANK |
|
|
|
; |
|
|
|
@ -3749,6 +3473,98 @@ HB_BADINTCNT .DB 0 |
|
|
|
OR $FF ; SIGNAL INTERRUPT HANDLED |
|
|
|
RET |
|
|
|
; |
|
|
|
; Z280 BAD INT HANDLER |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
Z280_BADINT: |
|
|
|
CALL NEWLINE |
|
|
|
LD DE,Z280_BADINTSTR |
|
|
|
CALL WRITESTR |
|
|
|
POP HL ; DUMP MSR |
|
|
|
POP HL ; GET RET ADR |
|
|
|
CALL PRTHEXWORDHL |
|
|
|
DI |
|
|
|
HALT |
|
|
|
; |
|
|
|
Z280_BADINTSTR .TEXT "\n\n*** Z280 BAD INT @$" |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; Z280 PRIVILEGED INSTRUCTION HANDLER |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
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 |
|
|
|
|
|
|
|
.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 |
|
|
|
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 |
|
|
|
|
|
|
|
PUSH HL |
|
|
|
CALL PC_LBKT |
|
|
|
CALL PRTHEXBYTE |
|
|
|
.DB $ED,$96 ; LDUP A,(HL) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
INC HL |
|
|
|
.DB $ED,$96 ; LDUP A,(HL) |
|
|
|
CALL PRTHEXBYTE |
|
|
|
CALL PC_RBKT |
|
|
|
POP HL |
|
|
|
|
|
|
|
CALL NEWLINE |
|
|
|
LD DE,Z280_PRIVSTR |
|
|
|
CALL WRITESTR |
|
|
|
DEC HL |
|
|
|
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 @$" |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; COMMON API FUNCTION DISPATCH CODE |
|
|
|
; |
|
|
|
; ON ENTRY B IS API FUNCTION NUMBER AND C IS UNIT # |
|
|
|
@ -3931,13 +3747,55 @@ Z280_IVT: |
|
|
|
.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 (UPDATED @ RUNTIME) |
|
|
|
.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 Z280_BADINT ; INT A VECTOR |
|
|
|
.DW $0000 ; INT B MSR |
|
|
|
.DW Z280_BADINT ; INT B VECTOR |
|
|
|
.DW $0000 ; INT C MSR |
|
|
|
.DW Z280_BADINT ; INT C VECTOR |
|
|
|
.DW $0000 ; COUNTER/TIMER 0 MSR |
|
|
|
.DW Z280_BADINT ; COUNTER/TIMER 0 VECTOR |
|
|
|
.DW $0000 ; COUNTER/TIMER 1 MSR |
|
|
|
.DW Z280_BADINT ; COUNTER/TIMER 1 VECTOR |
|
|
|
.DW 0, 0 ; RESERVED |
|
|
|
.DW $0000 ; COUNTER/TIMER 2 MSR |
|
|
|
.DW Z280_BADINT ; COUNTER/TIMER 2 VECTOR |
|
|
|
.DW $0000 ; DMA CHANNEL 0 MSR |
|
|
|
.DW Z280_BADINT ; DMA CHANNEL 0 VECTOR |
|
|
|
.DW $0000 ; DMA CHANNEL 1 MSR |
|
|
|
.DW Z280_BADINT ; DMA CHANNEL 1 VECTOR |
|
|
|
.DW $0000 ; DMA CHANNEL 2 MSR |
|
|
|
.DW Z280_BADINT ; DMA CHANNEL 2 VECTOR |
|
|
|
.DW $0000 ; DMA CHANNEL 3 MSR |
|
|
|
.DW Z280_BADINT ; DMA CHANNEL 3 VECTOR |
|
|
|
.DW $0000 ; UART RECEIVER MSR |
|
|
|
.DW Z280_BADINT ; UART RECEIVER VECTOR |
|
|
|
.DW $0000 ; UART TRANSMITTER MSR |
|
|
|
.DW Z280_BADINT ; UART TRANSMITTER VECTOR |
|
|
|
.DW $0000 ; SINGLE STEP TRAP MSR |
|
|
|
.DW Z280_BADINT ; SINGLE STEP TRAP VECTOR |
|
|
|
.DW $0000 ; BREAK ON HALT TRAP MSR |
|
|
|
.DW Z280_BADINT ; BREAK ON HALT TRAP VECTOR |
|
|
|
.DW $0000 ; DIVISION EXCEPTION TRAP MSR |
|
|
|
.DW Z280_BADINT ; DIVISION EXCEPTION TRAP VECTOR |
|
|
|
.DW $0000 ; STACK OVERFLOW WARNING TRAP MSR |
|
|
|
.DW Z280_BADINT ; STACK OVERFLOW WARNING TRAP VECTOR |
|
|
|
.DW $0000 ; ACCESS VIOLATION TRAP MSR |
|
|
|
.DW Z280_BADINT ; ACCESS VIOLATION TRAP VECTOR |
|
|
|
.DW $0000 ; SYSTEM CALL TRAP MSR |
|
|
|
.DW Z280_SYSCALL ; SYSTEM CALL TRAP VECTOR |
|
|
|
.DW $0000 ; PRIVILEGED INSTRUCTION TRAP MSR |
|
|
|
.DW Z280_PRIVINST ; PRIVILEGED INSTRUCTION TRAP VECTOR |
|
|
|
.DW $0000 ; EPU <- MEMORY EXTENDED INSTRUCTION TRAP MSR |
|
|
|
.DW Z280_BADINT ; EPU <- MEMORY EXTENDED INSTRUCTION TRAP VECTOR |
|
|
|
.DW $0000 ; MEMORY <- EPU EXTENDED INSTRUCTION TRAP MSR |
|
|
|
.DW Z280_BADINT ; MEMORY <- EPU EXTENDED INSTRUCTION TRAP VECTOR |
|
|
|
.DW $0000 ; A <- EPU EXTENDED INSTRUCTION TRAP MSR |
|
|
|
.DW Z280_BADINT ; A <- EPU EXTENDED INSTRUCTION TRAP VECTOR |
|
|
|
.DW $0000 ; EPU INTERNAL OPERATION EXTENDED INSTRUCTION TRAP MSR |
|
|
|
.DW Z280_BADINT ; EPU INTERNAL OPERATION EXTENDED INSTRUCTION TRAP VECTOR |
|
|
|
.DW 0, 0 ; RESERVED |
|
|
|
.DW 0, 0 ; RESERVED |
|
|
|
; PROGRAM COUNTER VALUES FOR NMI/INTA |
|
|
|
.DW HBX_IV00 |
|
|
|
.DW HBX_IV01 |
|
|
|
.DW HBX_IV02 |
|
|
|
@ -3954,7 +3812,11 @@ Z280_IVT: |
|
|
|
.DW HBX_IV0D |
|
|
|
.DW HBX_IV0E |
|
|
|
.DW HBX_IV0F |
|
|
|
.FILL $370 - ($ - Z280_IVT),0 ; FILL REMAINDER OF Z280 IVT |
|
|
|
.FILL (128 - 16) * 2, 0 |
|
|
|
; PROGRAM COUNTER VALUES FOR INTB |
|
|
|
.FILL 128 * 2, 0 |
|
|
|
; PROGRAM COUNTER VALUES FOR INTC |
|
|
|
.FILL 128 * 2, 0 |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
@ -4040,7 +3902,7 @@ W_MMU2: |
|
|
|
; |
|
|
|
#ENDIF |
|
|
|
; |
|
|
|
; Z280 BANK SELECTION (CALLED FROM PROXY) |
|
|
|
; Z280 BANK COPY (CALLED FROM PROXY) |
|
|
|
; |
|
|
|
#IF (MEMMGR == MM_Z280) |
|
|
|
; |
|
|
|
|