Browse Source

Z280 Interrupt Mode 3 Work in Progress

patch
Wayne Warthen 5 years ago
parent
commit
e9ae0a8e6d
  1. 3
      Source/Apps/RTC.asm
  2. 4
      Source/HBIOS/Config/RCZ280_nat.asm
  3. 304
      Source/HBIOS/hbios.asm
  4. 8
      Source/HBIOS/romldr.asm
  5. 6
      Source/HBIOS/sio.asm
  6. 4
      Source/HBIOS/std.asm

3
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

4
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)

304
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
;==================================================================================================
;

8
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
;

6
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

4
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

Loading…
Cancel
Save