diff --git a/arch/z80/src/ez80/ez80_vectors.asm b/arch/z80/src/ez80/ez80_vectors.asm index 84626bf27e0..d49fc976b61 100644 --- a/arch/z80/src/ez80/ez80_vectors.asm +++ b/arch/z80/src/ez80/ez80_vectors.asm @@ -37,7 +37,16 @@ ; Constants ;************************************************************************** -NVECTORS EQU 64 ; max possible interrupt vectors +NVECTORS EQU 64 ; max possible interrupt vectors + +;* Bits in the Z80 FLAGS register ***************************************** + +EZ80_C_FLAG EQU 01h ; Bit 0: Carry flag +EZ80_N_FLAG EQU 02h ; Bit 1: Add/Subtract flag +EZ80_PV_FLAG EQU 04h ; Bit 2: Parity/Overflow flag +EZ80_H_FLAG EQU 10h ; Bit 4: Half carry flag +EZ80_Z_FLAG EQU 40h ; Bit 5: Zero flag +EZ80_S_FLAG EQU 80h ; Bit 7: Sign flag ;************************************************************************** ; Global Symbols Imported @@ -202,31 +211,36 @@ _ez80_rstcommon: ; IRQ number is in A push hl ; Offset 6: HL - ld hl, #(3*2) ; HL is the value of the stack pointer before - add hl, sp ; the interrupt occurred + ld hl, #(3*3) ; HL is the value of the stack pointer before + add hl, sp ; the interrupt occurred (3 for PC, AF, HL) push hl ; Offset 5: Stack pointer push iy ; Offset 4: IY push ix ; Offset 3: IX push de ; Offset 2: DE push bc ; Offset 1: BC - ld c, a ; Save the reset number in C - ld a, i ; Carry bit holds interrupt state - push af ; Offset 0: I with interrupt state in carry - di + ; At this point, we know that interrupts were enabled (or we wouldn't be here + ; so we can save a fake indicationn that will cause interrupts to restored when + ; this context is restored + + ld bc, #EZ80_PV_FLAG ; Parity bit. 1=parity odd, IEF2=1 + push bc ; Offset 0: I with interrupt state in carry + di ; (not necessary) ; Call the interrupt decode logic. SP points to the beggining of the reg structure ld hl, #0 ; Argument #2 is the beginning of the reg structure add hl, sp ; push hl ; Place argument #2 at the top of stack + ld bc, #0 ; BC = reset number + ld c, a ; Save the reset number in C push bc ; Argument #1 is the Reset number call _up_doirq ; Decode the IRQ ; On return, HL points to the beginning of the reg structure to restore ; Note that (1) the arguments pushed on the stack are not popped, and (2) the ; original stack pointer is lost. In the normal case (no context switch), - ; HL will contain the value of the SP before the arguments wer pushed. + ; HL will contain the value of the SP before the arguments were pushed. ld sp, hl ; Use the new stack pointer @@ -248,13 +262,15 @@ _ez80_rstcommon: ; Restore the stack pointer exx ; Use alternate BC/DE/HL + pop de ; Offset 8: Return address ld sp, hl ; Set SP = saved stack pointer value before return + push de ; Set up for reti exx ; Restore original BC/DE/HL ; Restore interrupt state ex af, af' ; Recover interrupt state - jr nc, nointenable ; No carry, IFF2=0, means disabled + jp po, nointenable ; Odd parity, IFF2=0, means disabled ex af, af' ; Restore AF (before enabling interrupts) ei ; yes reti