68k vector table

From NeoGeo Development Wiki
Jump to: navigation, search

The vector table consists of a 256 bytes long vector list specific to the 68k.

Each vector is a 32-bit address, meaning the table holds 64 vectors. Each entry is used by the 68k in precise cases.

All bootable 68k programs must have a vector table at their very beginning. The system ROM and games have their own.

Is $C00426 an universal BIOS call for a complete reset ?

Stack frames

See 68k exception handling.

Format A

Offset from SP Size Value
+0 Word Flags:
Bit 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Def 0:Write 1:Read 0:InstructionFunction code
+2 Longword Access address
+6 Word IR
+8 Word SR
+10 Longword PC

Format B

Offset from SP Size Value
+0 Word SR
+2 Longword PC

Vector list

Vector # Address Exception name Trigger condition Stack frame
0 000000 Reset SP Not really a vector. Used to initialize the stack pointer.
1 000004 Reset PC Reset/startup
2 000008 Bus error Bus cycle couldn't complete properly. A
3 00000C Address error Misaligned (odd) word or longword memory access. A
4 000010 Illegal instruction Tried executing an invalid opcode. B
5 000014 Division by zero DIVUed or DIVSed by zero. B
6 000018 CHK instruction CHK resulted in "out of bounds". B
7 00001C TRAPV instruction TRAPV with overflow flag set. B
8 000020 Privilege violation Use of privileged instruction. Never happens on the NeoGeo since the 68k always runs in supervisor mode. B
9 000024 Trace After each executed instruction when 68k is in trace mode (debugger function). B
10 000028 Unimplemented instruction (line A) Used to implement 680xx instructions in software. Not used on the NeoGeo. B
11 00002C Unimplemented instruction (line F) Used to implement 680xx instructions in software. Not used on the NeoGeo. B
12 000030 Reserved/Unused on 68000
13 000034
14 000038
15 00003C Uninitialized interrupt vector Default vector used by uninitialized peripherals. B?
16 000040 Reserved
17 000044
18 000048
19 00004C
20 000050
21 000054 Normally reserved but used on the NeoGeo CD as vectored interrupt (sector transfer complete ?).
22 000058 Normally reserved but used on the NeoGeo CD as vectored interrupt (initiates CD drive command/status exchange).
23 00005C Normally reserved but used on the NeoGeo CD as vectored interrupt (retrieves word value from $FF010C).
24 000060 Spurious interrupt No acknowledge from hardware.
25 000064 Level 1 interrupt autovector V-Blank (MVS) / Timer interrupt (CD).
26 000068 Level 2 interrupt autovector Timer interrupt (MVS) / V-Blank (CD).
27 00006C Level 3 interrupt autovector Cold boot.
28 000070 Level 4 interrupt autovector Not used on the NeoGeo.
29 000074 Level 5 interrupt autovector Not used on the NeoGeo.
30 000078 Level 6 interrupt autovector Not used on the NeoGeo.
31 00007C Level 7 interrupt autovector Not used on the NeoGeo.
32 000080 TRAP #0~15 TRAP instructions. 2
48~63 0000C0~0000FC Reserved/Unused on 68000
64~255 000100~0003FF User interrupt vectors

Templates

For cartridge systems

    org  $0
    dc.l $0010F300            ; Initial SP
    dc.l $00C00402            ; Initial PC
    dc.l $00C00408            ; Bus error
    dc.l $00C0040E            ; Address error
    dc.l $00C0040E            ; Illegal Instruction
    dc.l $0000034C            ; Divide by 0
    dc.l $0000034E            ; CHK Instruction
    dc.l $0000034E            ; TRAPV Instruction
    dc.l $00C0041A            ; Privilege Violation
    dc.l $00C00420            ; Trace
    dc.l $0000034E,$0000034E  ; Emu
    dc.l $00C00426,$00C00426,$00C00426  ; Reserved
    dc.l $00C0042C            ; Uninit. Int. Vector.
    dc.l $00C00426,$00C00426,$00C00426,$00C00426  ; Reserved
    dc.l $00C00426,$00C00426,$00C00426,$00C00426  ; Reserved
    dc.l $00C00432            ; Spurious Interrupt
    dc.l VBlank               ; Level 1
    dc.l IRQ2                 ; Level 2
    dc.l $00C00426            ; Level 3
    dc.l $00C00426,$00C00426,$00C00426,$00C00426  ; Level 4~7
    dc.l $0000056E,$0000056E,$0000056E,$0000056E  ; Traps...
    dc.l $0000056E,$0000056E,$FFFFFFFF,$FFFFFFFF
    dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
    dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
    dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
    dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
    dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
    dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF

For CD systems

    org  $0
    dc.l $0010F300,$00C00402,$00C00408,$00C0040E
    dc.l $00C00414,$00C00426,$00C00426,$00C00426
    dc.l $00C0041A,$00C00420,$00C00426,$00C00426
    dc.l $00C00426,$00C00426,$00C00426,$00C0042C
    dc.l $00C00522,$00C00528,$00C0052E,$00C00534
    dc.l $00C0053A,$00C004F2,$00C004EC,$00C004E6
    dc.l $00C004E0,     IRQ2,   VBlank,     IRQ3
    dc.l   Generic,  Generic,  Generic,  Generic
    dc.l   Generic,  Generic,  Generic,  Generic
    dc.l   Generic,  Generic,  Generic,  Generic
    dc.l   Generic,  Generic,  Generic,  Generic
    dc.l   Generic,  Generic,  Generic,  Generic
    dc.l $00C00426,$00C00426,$00C00426,$00C00426
    dc.l $00C00426,$00C00426,$00C00426,$00C00426
    dc.l $00C00426,$00C00426,$00C00426,$00C00426
    dc.l $00C00426,$00C00426,$00C00426,$00C00426