diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index d522bab0..aa3a4ccf 100644 --- a/Source/HBIOS/hbios.asm +++ b/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 ; @@ -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) ; diff --git a/Tools/unix/uz80as/uz80as.h b/Tools/unix/uz80as/uz80as.h index 511da085..19e71764 100644 --- a/Tools/unix/uz80as/uz80as.h +++ b/Tools/unix/uz80as/uz80as.h @@ -8,7 +8,7 @@ #ifndef UZ80AS_H #define UZ80AS_H -int verbose; +static int verbose; /* matchtab.flags */ enum {