Browse Source

Z280 Work in Progress

- Fixed PEEK/POKE
- Misc. cleanup
pull/199/head
Wayne Warthen 5 years ago
parent
commit
bbb986c48f
  1. 606
      Source/HBIOS/hbios.asm
  2. 2
      Tools/unix/uz80as/uz80as.h

606
Source/HBIOS/hbios.asm

@ -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
;
@ -330,19 +327,10 @@ HBX_INVOKE:
.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
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)
;

2
Tools/unix/uz80as/uz80as.h

@ -8,7 +8,7 @@
#ifndef UZ80AS_H
#define UZ80AS_H
int verbose;
static int verbose;
/* matchtab.flags */
enum {

Loading…
Cancel
Save