diff --git a/Source/Apps/RTC.asm b/Source/Apps/RTC.asm index 4d91681f..2d72482b 100644 --- a/Source/Apps/RTC.asm +++ b/Source/Apps/RTC.asm @@ -1331,9 +1331,6 @@ DELAY_LOOP: ; LOOP IS 26TS OR L ; 4TS JR NZ,DELAY_LOOP ; 12TS ; RESTART SYSTEM FROM ROM BANK 0, ADDRESS $0000 - ;LD A,BID_BOOT ; BOOT BANK - ;LD HL,0 ; ADDRESS ZERO - ;CALL HB_BNKCALL ; DOES NOT RETURN LD B,BF_SYSRESET ; SYSTEM RESTART LD C,BF_SYSRES_COLD ; COLD START CALL $FFF0 ; CALL HBIOS diff --git a/Source/HBIOS/Config/RCZ280_nat.asm b/Source/HBIOS/Config/RCZ280_nat.asm index 5c81f316..5a3a7555 100644 --- a/Source/HBIOS/Config/RCZ280_nat.asm +++ b/Source/HBIOS/Config/RCZ280_nat.asm @@ -32,14 +32,14 @@ CPUOSC .SET 24000000 ; CPU OSC FREQ IN MHZ ; MEMMGR .SET MM_Z280 ; MEMORY MANAGER: MM_[SBC|Z2|N8|Z180|Z280] ; -INTMODE .SET 1 +INTMODE .SET 3 ; Z280_MEMWAIT .SET 0 ; Z280: MEMORY WAIT STATES (0-3) Z280_IOWAIT .SET 1 ; Z280: I/O WAIT STATES TO ADD ABOVE 1 W/S BUILT-IN (0-3) Z280_INTWAIT .SET 0 ; Z280: INT ACK WAIT STATUS (0-3) ; UARTENABLE .SET TRUE ; UART: ENABLE 8250/16550-LIKE SERIAL DRIVER (UART.ASM) -ACIAENABLE .SET TRUE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) +ACIAENABLE .SET FALSE ; ACIA: ENABLE MOTOROLA 6850 ACIA DRIVER (ACIA.ASM) SIOENABLE .SET TRUE ; SIO: ENABLE ZILOG SIO SERIAL DRIVER (SIO.ASM) ; IDEENABLE .SET TRUE ; IDE: ENABLE IDE DISK DRIVER (IDE.ASM) diff --git a/Source/HBIOS/hbios.asm b/Source/HBIOS/hbios.asm index 211afa24..3f90969d 100644 --- a/Source/HBIOS/hbios.asm +++ b/Source/HBIOS/hbios.asm @@ -113,12 +113,12 @@ MODCNT .SET MODCNT + 1 #DEFINE HB_DI ; #DEFINE HB_EI ; #ENDIF -#IF ((INTMODE == 1) | (INTMODE == 2)) -; MODE 1 OR 2 INTERRUPT HANDLING +#IF ((INTMODE == 1) | (INTMODE == 2) | (INTMODE == 3)) +; MODE 1 OR 2 OR 3 INTERRUPT HANDLING #DEFINE HB_DI DI #DEFINE HB_EI EI #ENDIF -#IF (INTMODE > 2) +#IF (INTMODE > 3) .ECHO "*** ERROR: INVALID INTMODE SETTING!!!\n" !!! ; FORCE AN ASSEMBLY ERROR #ENDIF @@ -377,6 +377,25 @@ HBX_INVOKE: POP HL ; RESTORE HL #ENDIF +;#IF (MEMMGR == MM_Z280) +#IF 0 + + 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) + LD A,(HB_INVBNK) ; LOAD ORIGINAL BANK + LD (HB_CURBNK),A + POP AF ; RESTORE AF + +#ELSE + LD (HBX_INVSP),SP ; SAVE ORIGINAL STACK FRAME LD SP,HBX_BUF_END ; BORROW HBX_BUF FOR TEMP STACK @@ -398,6 +417,8 @@ HBX_INVOKE: LD SP,0 ; RESTORE ORIGINAL STACK FRAME HBX_INVSP .EQU $ - 2 +#ENDIF + #IF (HBIOS_MUTEX == TRUE) PUSH HL ; SAVE HL LD HL,HB_LOCK ; POINT TO LOCK @@ -496,7 +517,17 @@ HBX_BNKSEL1: RET ; DONE #ENDIF #IF (MEMMGR == MM_Z280) - JP Z280_BNKSEL ; DO THE REAL WORK + .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 @@ -524,19 +555,9 @@ HBX_ROM: ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ; HBX_BNKCPY: -#IF (CPUFAM == CPU_Z280) - PUSH IY - PUSH BC - LD C,Z280_MSR - .DB $FD,$ED,$66 ; LDCTL IY,(C) - POP BC - PUSH IY - DI -#ELSE LD A,I DI PUSH AF -#ENDIF LD (HBX_BC_SP),SP ; PUT STACK LD SP,HBX_TMPSTK ; ... IN HI MEM @@ -566,18 +587,9 @@ HBX_BC_LAST: LD SP,$FFFF ; RESTORE STACK HBX_BC_SP .EQU $ - 2 ; ... TO ORIGINAL VALUE -#IF (CPUFAM == CPU_Z280) - POP IY - PUSH BC - LD C,Z280_MSR - .DB $FD,$ED,$6E ; LDCTL (C),IY - POP BC - POP IY -#ELSE POP AF JP PO,$+4 EI -#ENDIF RET ; HBX_BC_ITER: @@ -678,7 +690,7 @@ HBX_INTSTK .EQU $ !!! ; FORCE AN ASSEMBLY ERROR #ENDIF ; -#IF (INTMODE == 2) +#IF ((INTMODE == 2) | (INTMODE == 3)) ; ; HBIOS INTERRUPT SLOT ASSIGNMENTS ; @@ -750,47 +762,83 @@ INT_IM1: ; #IF (INTMODE > 0) ; -; COMMON INTERRUPT DISPATCHING CODE -; SETUP AND CALL HANDLER IN BIOS BANK -; HBX_INT: ; COMMON INTERRUPT ROUTING CODE +; + #IF (MEMMGR == MM_Z280) ; EX (SP),HL ; SAVE HL AND GET INT JP TABLE OFFSET + + ; SAVE STATE (HL SAVED PREVIOUSLY ON ORIGINAL STACK FRAME) + PUSH AF ; SAVE AF + PUSH BC ; SAVE BC + PUSH DE ; SAVE DE + PUSH IY ; SAVE IY +; + ; HANDLE INT VIA JP TABLE IN HBIOS + LD L,(HL) ; OFFSET INTO JP TABLE FOR THIS INT + LD H,HB_IVT >> 8 ; MSB OF HBIOS INT JP TABLE + CALL JPHL ; CALL HANDLER VIA INT JP TABLE +; + ; RESTORE STATE + POP IY ; RESTORE IY + POP DE ; RESTORE DE + POP BC ; RESTORE BC + POP AF ; RESTORE AF + POP HL ; RESTORE HL +; + ; BURN THE REASON CODE + EX (SP),HL ; HL TO STK, RC TO HL + POP HL ; RESTORE HL + CALL HBX_RETI ; RETI FOR Z80 PERIPHERALS + .DB $ED,$55 ; BACK TO USER LAND +; +HBX_RETI: + RETI +; + #ELSE +; +; COMMON INTERRUPT DISPATCHING CODE +; SETUP AND CALL HANDLER IN BIOS BANK +; + EX (SP),HL ; SAVE HL AND GET INT JP TABLE OFFSET +; LD (HBX_INT_SP),SP ; SAVE ORIGINAL STACK FRAME LD SP,HBX_INTSTK ; USE DEDICATED INT STACK FRAME IN HI MEM - +; ; SAVE STATE (HL SAVED PREVIOUSLY ON ORIGINAL STACK FRAME) PUSH AF ; SAVE AF PUSH BC ; SAVE BC PUSH DE ; SAVE DE PUSH IY ; SAVE IY - +; LD A,BID_BIOS ; HBIOS BANK CALL HBX_BNKSEL_INT ; SELECT IT - +; LD L,(HL) ; OFFSET INTO JP TABLE FOR THIS INT LD H,HB_IVT >> 8 ; MSB OF HBIOS INT JP TABLE - +; CALL JPHL ; CALL HANDLER VIA INT JP TABLE - +; LD A,(HB_CURBNK) ; GET PRE-INT BANK CALL HBX_BNKSEL ; SELECT IT - +; ; RESTORE STATE POP IY ; RESTORE IY POP DE ; RESTORE DE POP BC ; RESTORE BC POP AF ; RESTORE AF - +; LD SP,$FFFF ; RESTORE ORIGINAL STACK FRAME HBX_INT_SP .EQU $ - 2 - +; POP HL ; RESTORE HL - +; HB_EI ; ENABLE INTERRUPTS RETI ; AND RETURN ; + #ENDIF + #ENDIF ; ; SMALL TEMPORARY STACK FOR USE BY HBX_BNKCPY @@ -899,7 +947,7 @@ HB_IVT: ; NOTE THAT EACH ENTRY HAS A FILLER BYTE OF VALUE ZERO. THIS BYTE ; HAS NO FUNCTION. IT IS JUST USED TO MAKE ENTRIES AN EVEN 4 BYTES. ; -#IF (INTMODE == 2) +#IF ((INTMODE == 2) | (INTMODE == 3)) ; HB_IVT: HB_IVT00: JP HB_BADINT \ .DB 0 @@ -982,8 +1030,21 @@ HB_START: ; LD BC,Z280_BNKSELZ-Z280_BNKSEL ; BYTE COUNT TO COPY ; LDIR ; COPY ; - DIAG(%11111110) -; JP XZ280_BNKSELZ ; JUMP TO CODE CONTINUATION + + ; CONFIGURE Z280 INT/TRAP VECTOR TABLE POINTER REGISTER + LD C,Z280_VPR + LD HL,$0010 ; TOP 16 BITS OF PHYSICAL ADR OF IVT + .DB $ED,$6E ; LDCTL (C),HL + + ;; TEST SYSTEM CALL + ;.DB $ED,$71 ; SC + ;.DW Z280_BNKSEL ; SC PARAMETER + ; + ;LD A,%10101010 + ;OUT (DIAGPORT),A + ;DI + ;HALT + JR Z280_INITZ ; JUMP TO CODE CONTINUATION ; Z280_PDRTBL: @@ -1006,6 +1067,58 @@ 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 + + LD A,(HL) + INC HL ; BUMP PAST PRIV INST + + ; 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 + + CALL NEWLINE + LD DE,Z280_PRIVSTR + CALL WRITESTR + 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 @@ -1443,6 +1556,17 @@ HB_CPU2: IM 2 ; SWITCH TO INT MODE 2 #ENDIF ; +#IF (INTMODE == 3) +; + ; SETUP Z280 INT A FOR VECTORED INTERRUPTS + LD HL,%0010000000000000 + LD C,Z280_ISR + .DB $ED,$6E ; LDCTL (C),HL +; + .DB $ED,$4E ; IM 3 +; +#ENDIF +; #IF (PLATFORM == PLT_SBC) ; #IF (HTIMENABLE) ; SIMH TIMER @@ -1858,6 +1982,63 @@ IS_REC_M1: #ENDIF ; INITSYS3: +; +#IF (MEMMGR == MM_Z280) + ; LEAVE SYSTEM MODE STACK POINTING TO AN OK PLACE + LD SP,HB_STACK - $40 ; *** FIX *** + + HB_DI + + ; FIXUP BNKSEL TO WORK ON USER MODE PDRS + XOR A + LD (W_MMU0+1),A + LD (W_MMU1+1),A + + ;DIAG(%10000001) + ;DI + ;HALT + + ; MAKE USER MODE BANK CORRECT + LD A,(HB_CURBNK) ; GET CURRENT BANK + CALL HBX_BNKSEL + + ;DIAG(%10000011) + ;DI + ;HALT + + ;LD C,Z280_TCR + ;.DB $ED,$66 ; LDCTL HL,(C) + ;LD A,L + ;CALL PC_SPACE + ;CALL PRTHEXBYTE + + LD HL,HBX_LOC + .DB $ED,$8F ; LDCTL USP,HL + + ;DIAG(%10000111) + ;DI + ;HALT + + HB_EI + + ; SWITCH TO USER MODE NOW + LD C,Z280_MSR + LD HL,$407F + .DB $ED,$6E ; LDCTL (C),HL + ;LD A,%10001111 + ;OUT (DIAGPORT),A + + ;DI + ;HALT + LD SP,HBX_LOC ; SETUP INITIAL STACK JUST BELOW HBIOS PROXY + + ;DIAG(%10001111) + ;CALL LDELAY + + ;DIAG(%10011111) + ;CALL LDELAY + +#ENDIF ; CALL PRTSUM ; PRINT UNIT/DEVICE SUMMARY TABLE ; @@ -2107,6 +2288,11 @@ IDLE: ; HB_DISPATCH: ; +#IF (MEMMGR == MM_Z280) + HB_EI +#ENDIF +; +; #IF 0 ; *DEBUG* START ; CALL HB_DISPATCH1 ; DO THE WORK @@ -3541,6 +3727,46 @@ HB_TMPSZ .DW 0 HB_TMPREF .DW 0 ; ;================================================================================================== +; Z280 INTERRUPT VECTOR TABLE +;================================================================================================== +; +#IF (MEMMGR = MM_Z280) +; + .FILL $1000 - ($ & $FFF) ; MUST BE 4K ALIGNED! +; +Z280_IVT: + .DW 0, 0 ; RESERVED + .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 + .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 HBX_IV00 + .DW HBX_IV01 + .DW HBX_IV02 + .DW HBX_IV03 + .DW HBX_IV04 + .DW HBX_IV05 + .DW HBX_IV06 + .DW HBX_IV07 + .DW HBX_IV08 + .DW HBX_IV09 + .DW HBX_IV0A + .DW HBX_IV0B + .DW HBX_IV0C + .DW HBX_IV0D + .DW HBX_IV0E + .DW HBX_IV0F + .FILL $370 - ($ - Z280_IVT),0 ; FILL REMAINDER OF Z280 IVT +; +#ENDIF +; +;================================================================================================== ; DEVICE DRIVERS ;================================================================================================== ; diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index 38ff1a29..17783fa4 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -571,13 +571,9 @@ reboot: call DSKY_SHOWSEG ; display message #endif ; - ;; switch to rom bank 0 and jump to address 0 - ;ld a,BID_BOOT ; boot bank - ;ld ix,0 ; address zero - ;call HB_BNKCALL ; does not return ; cold boot system - LD B,BF_SYSRESET ; SYSTEM RESTART - LD C,BF_SYSRES_COLD ; COLD START + ld b,BF_SYSRESET ; system restart + ld c,BF_SYSRES_COLD ; cold start rst 08 ; do it, no return #endif ; diff --git a/Source/HBIOS/sio.asm b/Source/HBIOS/sio.asm index a7c41062..aeb12f08 100644 --- a/Source/HBIOS/sio.asm +++ b/Source/HBIOS/sio.asm @@ -30,7 +30,7 @@ SIO_WR1VAL .EQU $00 ; WR1 VALUE FOR NO INTS SIO_WR1VAL .EQU $18 ; WR1 VALUE FOR INT ON RECEIVED CHARS #ENDIF ; -#IF (INTMODE == 2) +#IF ((INTMODE == 2) | (INTMODE == 3)) ; SIO0_IVT .EQU IVT(INT_SIO0) SIO1_IVT .EQU IVT(INT_SIO1) @@ -144,7 +144,7 @@ SIO_PREINIT2: CALL HB_ADDIM1 ; ADD TO IM1 CALL LIST #ENDIF ; - #IF (INTMODE == 2) + #IF ((INTMODE == 2) | (INTMODE == 3)) ; SETUP IM2 VECTORS LD HL,SIO_INT0 LD (SIO0_IVT),HL ; IVT INDEX @@ -831,7 +831,7 @@ SIO_INITGO: ; ; SET INTERRUPT VECTOR OFFSET WR2 ; -#IF (INTMODE == 2) +#IF ((INTMODE == 2) | (INTMODE == 3)) LD A,(IY+2) ; CHIP / CHANNEL SRL A ; SHIFT AWAY CHANNEL BIT LD L,SIO0_VEC ; ASSUME CHIP 0 diff --git a/Source/HBIOS/std.asm b/Source/HBIOS/std.asm index 4643ce7b..b95339bc 100644 --- a/Source/HBIOS/std.asm +++ b/Source/HBIOS/std.asm @@ -501,9 +501,9 @@ MON_SERIAL .EQU MON_LOC + (1 * 3) ; MONITOR ENTRY (SERIAL PORT) ; ; INTERRUPT MODE 2 SLOT ASSIGNMENTS ; -#IF (INTMODE == 2) +#IF ((INTMODE == 2) | (INTMODE == 3)) - #IF (CPUFAM == CPU_Z180) + #IF ((CPUFAM == CPU_Z180) | (CPUFAM == CPU_Z280)) ; Z180-BASED SYSTEMS