68k initialization

Vectors
Vector table and header for AES/MVS roms: org $0 dc.l $0010F300	       ; Initial SP    dc.l $00C00402	        ; Initial PC    dc.l $00C00408,$00C0040E,$00C0040E,$0000034C       ; Bus error (2),Address error (3),Illegal Instruction (4),Divide by 0 (5) dc.l $0000034E,$0000034E,$00C0041A,$00C00420      ; CHK Instruction (6),TRAPV Instruction (7),Privilege Violation (8),Trace (9) dc.l $0000034E,$0000034E,$00C00426,$00C00426      ; Emu(10),Emu(11),Reserved,Reserved dc.l $00C00426,$00C0042C,$00C00426,$00C00426      ; Reserved,Reserved,Reserved,Reserved dc.l $00C00426,$00C00426,$00C00426,$00C00426      ; Reserved,Reserved,Reserved,Reserved dc.l $00C00426,$00C00426,$00C00432,VBlank         ; Reserved,Reserved,Spurious Interrupt(24) dc.l IRQ2,$00C00426,$00C00426,$00C00426 dc.l $00C00426,$00C00426,$0000056E,$0000056E      ; Auto,Auto,Trap 0, Trap1... dc.l $0000056E,$0000056E,$0000056E,$0000056E 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 dc.l $FFFFFFFF,$FFFFFFFF

org $0100 dc.b "NEO-GEO",$00

dc.w $0052		; NGH Number in BCD (0052 is ssideki) dc.l $00080000     ; ? dc.l $00100000	; ? dc.w $0000

org $0114 dc.b $01           ; Bootscreen flag ($00 skips it) dc.b $1B		; First tile number of the NeoGeo logo in the C ROM dc.l $00000200	; Japanese config menu pointer dc.l $00000200	; English config menu pointer dc.l $00000200	; European config menu pointer

jmp		Start jmp		Start  ; Not used ? jmp		Start  ; Not used ? jmp		Start  ; Not used ?

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

dc.l $00000186 	; Security code pointer ?

org $186           ; ??? dc.l $76004A6D,$0A146600,$003C206D,$0A043E2D dc.l $0A0813C0,$00300001,$32100C01,$00FF671A dc.l $30280002,$B02D0ACE,$66103028,$0004B02D dc.l $0ACF6606,$B22D0AD0,$67085088,$51CFFFD4 dc.l $36074E75,$206D0A04,$3E2D0A08,$3210E049 dc.l $0C0100FF,$671A3010,$B02D0ACE,$66123028 dc.l $0002E048,$B02D0ACF,$6606B22D,$0AD06708 dc.l $588851CF,$FFD83607 dc.w $4e75

org $200          ; Config menus, need to find format... dc.b	"0123456789ABCDEF" dc.l	$FFFFFFFF dc.w	$0364 dc.b	$14,$13,$24,$01

Basic init code
The initial PC value in your 68k binary must be $C00402 (Init BIOS call), the initial SP value must be $10F300 (end of user RAM).

The entrypoints for your 68k code start at $000122. There's usually 4 JMP instructions there (why ?).

lea    $10F300, sp    lea     $10F300, a7    move.b  d0,REG_DIPSW      ; Kick the watchdog move.w #7,REG_IRQACK     ; Acknowledge any pending interrupts move.w #$2700,sr         ; Disable all interrupts

See 68k interrupts and Watchdog for more informations.

Clearing user RAM: lea    RAMSTART,a0       ; Should be $100000 move.l #($F300/4)-1,d0   ; User RAM's size is $F300, and we clear longwords (4 bytes) clram: clr.l  (a0)+ dbra   d0,clram

Note that this function also clears the stack. Don't make a subroutine out of it unless you're sure of what addresses you're clearing.

Clearing sprites: make a BIOS call. Clearing fix: make a BIOS call too.

Don't forget to kick the watchdog regularly in your init code if the VBL interrupt isn't enabled or doesn't kick it itself.