68k exception handling

From NeoGeo Development Wiki
Revision as of 13:38, 14 March 2012 by ElBarto (talk | contribs)
Jump to navigation Jump to search
Exception screen showing the PC where it was raised: Always better than a quiet reset !

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