68k vector table: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
mNo edit summary
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Default ASM vector tables for [[68k]] binaries. $C00426 is a [[BIOS calls|BIOS call]] for a complete reset on every systems (?).
The vector table consists of a 256 bytes long vector list specific to the [[68k]].


== For cartridge systems ==
Each vector is a 32-bit address, meaning the table holds '''64 vectors'''. Each entry is used by the 68k in precise cases.
<pre>
 
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 calls|BIOS call]] for a complete reset ?
 
=Stack frames=
 
See [[68k exception handling]].
 
==Format A==
 
{|class="wikitable"
!Offset from SP
!Size
!Value
|-
| +0
|Word
|Flags:{{16BitRegister| |11|0:Write 1:Read |1|0:Instruction|1|Function code|3}}
|-
| +2
|Longword
|Access address
|-
| +6
|Word
|IR
|-
| +8
|Word
|SR
|-
| +10
|Longword
|PC
|}
 
==Format B==
 
{|class="wikitable"
!Offset from SP
!Size
!Value
|-
| +0
|Word
|SR
|-
| +2
|Longword
|PC
|}
 
=Vector list=
 
{|class="regdef"
|'''Vector #'''
|'''Address'''
|'''Exception name'''
|'''Trigger condition'''
|'''[[68k stack frames|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
|rowspan=3|Reserved/Unused on 68000
|rowspan=3|
|rowspan=3|
|-
|13
|000034
|-
|14
|000038
|-
|15
|00003C
|Uninitialized interrupt vector
|Default vector used by uninitialized peripherals.
|B?
|-
|16
|000040
|rowspan=8|Reserved
|rowspan=5|
|rowspan=8|
|-
|17
|000044
|-
|18
|000048
|-
|19
|00004C
|-
|20
|000050
|-
|21
|000054
|rowspan="3"|Normally reserved but used on the NeoGeo CD. See [[68k interrupts]].
|-
|22
|000058
|-
|23
|00005C
|-
|24
|000060
|Spurious interrupt
|No acknowledge from hardware.
|
|-
|25
|000064
|Level 1 [[68k interrupts|interrupt]] autovector
|[[68k interrupts|V-Blank]] (cart) / [[Timer interrupt]] (CD).
|
|-
|26
|000068
|Level 2 interrupt autovector
|Timer interrupt (cart) / V-Blank (CD).
|
|-
|27
|00006C
|Level 3 interrupt autovector
|Cold boot (cart).
|
|-
|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==
<syntaxhighlight>
     org  $0
     org  $0
     dc.l $0010F300            ; Initial SP
     dc.l $0010F300            ; Initial SP
Line 32: Line 282:
     dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
     dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
     dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
     dc.l $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF
</pre>
</syntaxhighlight>


== For CD systems ==
==For CD systems==
<pre>
<syntaxhighlight>
     org  $0
     org  $0
     dc.l $0010F300,$00C00402,$00C00408,$00C0040E
     dc.l $0010F300,$00C00402,$00C00408,$00C0040E
Line 53: Line 303:
     dc.l $00C00426,$00C00426,$00C00426,$00C00426
     dc.l $00C00426,$00C00426,$00C00426,$00C00426
     dc.l $00C00426,$00C00426,$00C00426,$00C00426
     dc.l $00C00426,$00C00426,$00C00426,$00C00426
</pre>
</syntaxhighlight>


[[Category:Base system]]
[[Category:Code]]
[[Category:Code]]

Latest revision as of 16:01, 30 July 2018

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. See 68k interrupts.
22 000058
23 00005C
24 000060 Spurious interrupt No acknowledge from hardware.
25 000064 Level 1 interrupt autovector V-Blank (cart) / Timer interrupt (CD).
26 000068 Level 2 interrupt autovector Timer interrupt (cart) / V-Blank (CD).
27 00006C Level 3 interrupt autovector Cold boot (cart).
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