68k program header
ASM ROM header templates.
For cartridge systems
- $0064: VBlank handling routine pointer
- $0100: "NEO-GEO",$00 string
- $0108: NGH number
- $010A: program size (isn't read by any bios)
- $010E: pointer to debug DIPs (in user RAM) (isn't read by any bios)
- $0114: boot logo flag and tile number
- $0116: pointer to Japanese settings info block
- $011A: pointer to US settings info block
- $011E: pointer to Euro settings info block
- $0122: pointer to code start
- $0182: pointer to security code
Minimal header (from Smkdan's sources)
No need for a complete 68k vector table.
org $0064 dc.l VBLANK ;IRQ handler org $0100 dc.b "NEO-GEO",$00 org $0108 dc.w $017 ;NGH org $0122 jmp Start ;entry org $0114 dc.w $0100 ;logo flag, don't show it just go straight to the entry point org $0182 dc.l Code ;code pointer Code: 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
Full header (from some unknown example code)
org $0100 dc.b "NEO-GEO",$00 dc.w $0052 ;NGH dc.l $00080000 ;ROM p1 size dc.l $00100000 ;debug DIPs pointer dc.w $01 ;unknown dc.b $00 ;bootscreen flag, anything else than 0x00 means no logo dc.b $1B ;first tile number of the NeoGeo logo in the C ROMs dc.l JPConfig ;Japanese config menu pointer dc.l USConfig ;US config menu pointer dc.l EUConfig ;European config menu pointer jmp Start jmp Start ;? jmp Start ;? jmp Start ;? org $0182 dc.l Code ;code pointer Code: 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 ; Configuration menu layouts (soft DIPs) JPConfig: dc.b "0123456789ABCDEF" ; Game name dc.l $FFFFFFFF ; Unknown dc.w $FFFF ; dc.b $24,$02,$00,$00,$00,$00,$00,$00,$00,$00 ; Option list dc.b "LIVES " dc.b "1 " dc.b "2 " dc.b "3 " dc.b "4 " dc.b "HOW TO PLAY " dc.b "WITH " dc.b "WITHOUT " USConfig: dc.b "0123456789ABCDEF" ; Game name dc.l $FFFFFFFF ; Unknown dc.w $FFFF ; dc.b $24,$02,$00,$00,$00,$00,$00,$00,$00,$00 ; Option list dc.b "LIVES " dc.b "1 " dc.b "2 " dc.b "3 " dc.b "4 " dc.b "HOW TO PLAY " dc.b "WITH " dc.b "WITHOUT " EUConfig: dc.b "0123456789ABCDEF" ; Game name dc.l $FFFFFFFF ; Unknown dc.w $FFFF ; dc.b $24,$02,$00,$00,$00,$00,$00,$00,$00,$00 ; Option list dc.b "LIVES " dc.b "1 " dc.b "2 " dc.b "3 " dc.b "4 " dc.b "HOW TO PLAY " dc.b "WITH " dc.b "WITHOUT "
Config data description
0x00 | Game Name |
0x10 | Special entry list, see description below |
0x16 | Simple options list, up to 10 entry. 1 byte per entry. Padded with 0x00 for unused options. |
0x20 | Options string table. Strings are 12 bytes long and padded with 0x20 (space). |
Special options list description=
You can define up to 4 special optjons.
The first two words can be used to define two "timer options". You can set minutes and seconds. Upper byte define the amount of minutes and the lower byte the seconds.
The next byte can be used for a counter, from 00 to 99. The value written is the default one. (value above 0x63 will show some garbage data).
The last byte can be used for a counter plus two special value : "WITHOUT" and "INFINITE" (0x00 is without and 0x64 is infinite). The counter will go from 00 to 99 and add the text "times" after.
They all takes one string in the strings table for the description.
All those options can be disable by entering 0xFF.
Simple options list description
Each options consist of 1 byte.
The upper 4 bits specify the default value and the lower 4 bits the number of choice.
The only "special" entry list seems to be 0x64. When specified the title is still fetch from the string table but not the choice. NAM-1975 use it for the CONTINUE configuration.
TODO: See where the bios put the data (and which form) in the RAM. Bytes from $10FD84 to $10FD93 ?
Config exemples
dc.b "TEST ROM " ; Game name dc.l $FFFFFFFF ; Unknown dc.w $FFFF ; dc.b $24,$02,$00,$00,$00,$00,$00,$00,$00,$00 ; Option list dc.b "LIVES " dc.b "1 " dc.b "2 " dc.b "3 " dc.b "4 " dc.b "HOW TO PLAY " dc.b "WITH " dc.b "WITHOUT "
For CD systems
org $100 dc.b "NEO-GEO", $02 ;CDDA flag dc.w $1234 ;NGH dc.l $00500000 ;from Metal Slug 2 dc.l $0010F000 ;debug DIPs pointer dc.w $007A ;not used ? dc.w $00A1 ;not used ? org $122 jmp Start jmp Generic ;? jmp Generic ;? jmp Generic ;? org $13A dc.w $0000 ;Z80 RAM address for CDDA commands Generic: rte rts