mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Z280 Work in Progress
- Fixed PEEK/POKE - Misc. cleanup
This commit is contained in:
@@ -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
|
||||
|
||||
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
|
||||
#IF (CPUFAM == CPU_Z280)
|
||||
PUSH HL
|
||||
PUSH BC
|
||||
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)
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user