68k exception handling
See 68k vector table.
Divide by zero/Illegal instruction
(DIVU or DIVS by zero, or bad opcode)
6 bytes stack frame: 0:SR.w, 2:PC.l
ErrDivZero: move.l 2(a7),PCERROR movem.l d0-d7/a0-a6,-(a7) lea ERR_DIVZERO,a0 jmp DispErr
Address error/Bus error
(Misaligned read/writes, hardware fault ?)
14 bytes stack frame: 0:R/W.w, 2:Access address.l, 6:Instruction.l, 8:SR.w, 10:PC.l
ErrAddr: move.l 10(a7),PCERROR movem.l d0-d7/a0-a6,-(a7) lea ERR_ADDR,a0 jmp DispErr
Displaying for debug
Don't forget to mask out all interrupts as soon as an exception is raised:
ori.w #$0700,sr
All register values can be retrieved from the previous MOVEMs and displayed on the fix layer:
;D0: 32bit value ;VRAM address needs to be set before Write32bit: move.w #$20,VRAM_MOD move.l d0,d1 move.l #8-1,d7 .writerlp: move.b d0,REG_DIPSW ;Watchdog andi.l #$F0000000,d0 ;x0000000 lsl.l #4,d0 ;0000000x jsr .hexshift addi.w #ASCIISTART,d0 ori.w #$F000,d0 ;Palette $F move.w d0,VRAM_RW lsl.l #4,d1 move.l d1,d0 dbra d7,.writerlp rts .hexshift: cmp.b #$A,d0 blt.b .r addq.b #7,d0 .r: rts