(This is another cross-post from my blog, duplicated here because it's relevant, and for preservation in case the blog ever disappears). I've been meaning to write this for years: To my understanding, not much is commonly known about the source code of the original Sonic the Hedgehog games. As someone who's been obsessed with the programming of these games for almost ten years, I believe that I know a lot more than most people do. Unfortunately, my memory is awful, and I'm not going to be a Sonic hacker forever, so I want to preserve this information however I can before it's lost again. As of writing, the source code for the 'classic' Mega Drive Sonic the Hedgehog games has never been found. We do have an exhaustive list of disassemblies, however those do not capture all information that proper source code would give us. For example, while the logic of code is recovered by these disassemblies, the meaning of it might not be. Sometimes, the logic isn't all you need to understand code: it may do something that seems pointless or nonsensical, leaving nearby labels and comments to explain it fully. However, a disassembly cannot reproduce the original labels and comments: those are lost. Likewise, a disassembly cannot reproduce code that was never in the ROM to begin with, such as disabled (or "commented-out") prototype code. Because of this, a disassembly cannot truly replace source code. However, small snippets of source code have surfaced over the years. The most obvious example I can think of is a fully-intact copy of a single source file (likely "EDIT.ASM") in Sonic 2's "Nick Arcade" prototype. Sonic 2 "Nick Arcade" prototype's source file Inside one of Sonic 2's prototypes is a fully intact copy of the source file responsible for the game's "edit mode" (commonly known as "debug mode"): Code: addsym nolist include "equ.lib" include "macro.lib" list xref colichgpat xref ringpat,itempat,butapat,kanipat,hachipat,togepat xref fishpat,fish2pat,mogurapat,shimapat2,jyamapat xref musipat,sjumppat,kamerepat,arumapat,kagebpat,ballpat xref firepat,fblockpat,signalpat,bobinpat,yoganpat,yogan2pat xref usapat,yadopat,boxpat,bryukapat,daipat,break2pat,yogancpat xref batpat,z5daipat,dai2pat,switch2pat,z4daipat xref elevpat,pedalpat,steppat,funpat,sisoopat,hassyapat xref brobopat,unipat,yaripat,udaipat,dai3pat,kazaripat,kassyapat xref awapat,mizupat,boupat,benpat,fetamapat,mawarupat,hagurumapat xref patapat,yukafpat,nokopat,dai4pat,doorpat,yukaepat,fire6pat xref elepat,yukaipat,scolipat,imopat,savepat,bigringpat,btenpat xref actionsub,actwkchk,frameout,playpat,dualmodesub xref flicpat,usagipat,pengpat,azarpat,fbutapat,niwapat,risupat xref kaitenpat,prodaipat,buranko0dpat xref frntlitpat,gempat,wfallpat,pltfrmpat xref takipat,banepat,dai00pat xref redzpat,bfishpat,seahorsepat,horsepat xref stegopat,wasppat,gatorpat,bbatpat,octpat,wfish2pat,snailpat xdef edit ;------------------------------------------------------------------------------ edit: moveq #0,d0 move.b editmode,d0 move.w edit_move_tbl(pc,d0.w),d1 jmp edit_move_tbl(pc,d1.w) edit_move_tbl: dc.w editinit-edit_move_tbl dc.w editmove-edit_move_tbl editinit: addq.b #word,editmode move.w scralim_up,editstack move.w scralim_n_down,editstack2 move.w #$0000,scralim_up move.w #$0720,scralim_n_down andi.w #$07ff,playerwk+yposi andi.w #$07ff,scra_v_posit andi.w #$03ff,scrb_v_posit move.b #0,patno(a0) move.b #0,mstno(a0) cmpi.b #spgamemd,gmmode bne.b .jump0 * move.b #7-1,stageno * move.w #$000,rotspd * move.w #$000,rotdir moveq #7-1,d0 bra.b .jump1 .jump0: moveq #0,d0 move.b stageno,d0 .jump1: lea edittbl,a2 add.w d0,d0 adda.w (a2,d0.w),a2 move.w (a2)+,d6 cmp.b editno,d6 bhi.b .jump move.b #0,editno .jump: bsr.w editpatchg move.b #12,edittimer move.b #1,edittimer+1 editmove: moveq #7-1,d0 cmpi.b #spgamemd,gmmode beq.b .jump moveq #0,d0 move.b stageno,d0 .jump: lea edittbl,a2 add.w d0,d0 adda.w (a2,d0.w),a2 move.w (a2)+,d6 bsr.w editwalk * bsr.w dirsprset jmp actionsub editwalk: moveq #0,d4 move.w #1,d1 move.b swdata1+1,d4 andi.w #$0f,d4 bne.b .jump0 move.b swdata1,d0 andi.w #$0f,d0 bne.b .jump move.b #12,edittimer move.b #$0f,edittimer+1 bra.w .lend .jump: subq.b #1,edittimer bne.b .jump1 move.b #1,edittimer addq.b #1,edittimer+1 * cmpi.b #255,edittimer+1 bne.b .jump0 move.b #255,edittimer+1 .jump0: move.b swdata1,d4 .jump1: moveq #0,d1 move.b edittimer+1,d1 addq.w #1,d1 swap d1 asr.l #4,d1 move.l yposi(a0),d2 move.l xposi(a0),d3 btst.l #0,d4 *swdata+0 beq.b .jump2 sub.l d1,d2 *yposi bcc.b .jump2 moveq #0,d2 .jump2: btst.l #1,d4 *swdata+0 beq.b .jump3 add.l d1,d2 *yposi cmpi.l #$7ff0000,d2 bcs.b .jump3 move.l #$7ff0000,d2 .jump3: btst.l #2,d4 *swdata+0 beq.b .jump4 sub.l d1,d3 *xposi bcc.b .jump4 moveq #0,d3 .jump4: btst.l #3,d4 *swdata+0 beq.b .jump5 add.l d1,d3 *xposi .jump5: move.l d2,yposi(a0) move.l d3,xposi(a0) .lend: btst.b #6,swdata1+0 beq.b .jump7 btst.b #5,swdata1+1 * c button check beq.b .jump77 subq.b #1,editno bcc.b .jump6 add.b d6,editno bra.b .jump6 .jump77: btst.b #6,swdata1+1 beq.b .jump7 addq.b #1,editno cmp.b editno,d6 bhi.b .jump6 move.b #0,editno .jump6: bra.w editpatchg .jump7: btst.b #5,swdata1+1 * c button check beq.b .jump8 jsr actwkchk bne.b .worknai ;z=0:ok z=1:no move.w xposi(a0),xposi(a1) move.w yposi(a0),yposi(a1) move.b patbase(a0),actno(a1) move.b actflg(a0),actflg(a1) move.b actflg(a0),cddat(a1) andi.b #$7f,cddat(a1) moveq #0,d0 move.b editno,d0 lsl.w #3,d0 move.b 4(a2,d0.w),userflag(a1) rts .worknai: .jump8: btst.b #4,swdata1+1 * b button check beq.b .jump9 moveq #0,d0 move.w d0,editmode move.l #playpat,playerwk+patbase move.w #$0780,playerwk+sproffset tst.w dualmode ; dual mode check beq.b .end move.w #$0780/2,playerwk+sproffset .end: move.b d0,playerwk+mstno move.w d0,xposi+2(a0) move.w d0,yposi+2(a0) move.w editstack,scralim_up move.w editstack2,scralim_n_down cmpi.b #spgamemd,gmmode bne.b .jump9 * clr.w rotdir * move.w #$040,rotspd * move.l #playpat,playerwk+patbase * move.w #$0780,playerwk+sproffset move.b #02,playerwk+mstno bset.b #cd_ball,playerwk+cddat bset.b #cd_jump,playerwk+cddat .jump9: rts editpatchg: moveq #0,d0 move.b editno,d0 lsl.w #3,d0 move.l 0(a2,d0.w),patbase(a0) move.w 6(a2,d0.w),sproffset(a0) move.b 5(a2,d0.w),patno(a0) * move.b 4(a2,d0.w),userflag(a0) bsr.w dualmodesub rts dcblw macro \1,\2,\3,\4,\5 dc.l (\1)*$1000000+(\2) dc.w (\4)+(\5)*$100 dc.w (\3) endm edittbl: dc.w edit1tbl-edittbl dc.w edit2tbl-edittbl dc.w edit3tbl-edittbl dc.w edit4tbl-edittbl dc.w edit5tbl-edittbl dc.w edit6tbl-edittbl dc.w edit7tbl-edittbl edit1tbl: dc.w 14 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw kani_act,kanipat,$0400,0,$00 ;3: dcblw hachi_act,hachipat,$0444,0,$00 ;4: dcblw fish_act,fishpat,$0470,0,$00 ;5: dcblw toge_act,togepat,$04a0,0,$00 ;6: dcblw shima_act,shimapat2,$4000,0,$00 ;7: dcblw jyama_act,jyamapat,$66c0,0,$00 ;8: dcblw musi_act,musipat,$04e0,0,$00 ;9: dcblw sjump_act,sjumppat,$04a8,0,$00 ;10: dcblw kamere_act,kamerepat,$249b,0,$00 ;11: dcblw kageb_act,kagebpat,$434c,0,$00 ;12: dcblw save_act,savepat,$26bc,0,$01 ;13: dcblw colichg_act,colichgpat,$26bc,0,$00 ;14: edit2tbl: edit3tbl: ;zone0d dc.w 07 dcblw ring_act,ringpat,$26bc,0,$00 ;01: dcblw item_act,itempat,$0680,0,$00 ;02: dcblw sjump_act,sjumppat,$04a8,0,$00 ;03: dcblw colichg_act,colichgpat,$07bc,0,$00 ;04: dcblw kaiten_act,kaitenpat,$e000,0,$00 ;05: dcblw prodai_act,prodaipat,$e418,0,$00 ;06: dcblw buranko_act,buranko0dpat,$2418,0,$08 ;07: edit4tbl: ;zone00 dc.w 18 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw save_act,savepat,$047c,0,$01 ;3: dcblw colichg_act,colichgpat,$26bc,0,$00 ;6: dcblw taki_act,takipat,$23ae,0,$00 ;7: dcblw taki_act,takipat,$23ae,3,$02 ;7: dcblw shima_act,dai00pat,$4000,0,$01 ;8: dcblw shima_act,dai00pat,$4000,1,$0a ;8: dcblw toge_act,togepat,$2434,0,$00 ;10: dcblw sisoo_act,sisoopat,$03ce,0,$00 ;9: dcblw sjump_act,banepat,$045c,0,$80 ;3: banev dcblw sjump_act,banepat,$0470,3,$90 ;3: baneh dcblw sjump_act,banepat,$045c,6,$a0 ;3: banevr dcblw sjump_act,banepat,$043c,7,$30 ;3: bane45 dcblw sjump_act,banepat,$043c,10,$40 ;3: bane45r dcblw wasp_act,wasppat,$03e6,0,$00 ;25 "" "" dcblw snail_act,snailpat,$0402,0,$00 ;25 "" "" dcblw wfish2_act,wfish2pat,$041c,0,$00 ;21 "" "" dcblw redz_act,redzpat,$0500,0,$00 ;20: will change dcblw bfish_act,bfishpat,$2530,0,$00 ;21 "" "" dcblw seahorse_act,horsepat,$2570,0,$00 ;22 "" "" dcblw skyhorse_act,horsepat,$2570,0,$00 ;23 "" "" dcblw stego_act,stegopat,$23c4,0,$00 ;24 "" "" dcblw wasp_act,wasppat,$032c,0,$00 ;25 "" "" dcblw gator_act,gatorpat,$2300,0,$00 ;26 "" "" dcblw bbat_act,bbatpat,$2350,0,$00 ;27 "" "" dcblw oct_act,octpat,$238a,0,$00 ;28 "" "" edit5tbl: edit6tbl: edit7tbl: ;zone08 dc.w 15 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw bgspr_act,frntlitpat,$e485,3,$21 ;3: dcblw wfall_act,wfallpat,$e415,4,$04 ;4: dcblw break_act,pltfrmpat,$4475,0,$00 ;5: dcblw colichg_act,colichgpat,$26bc,0,$00 ;6: dcblw redz_act,redzpat,$0500,0,$00 ;20: will change dcblw bfish_act,bfishpat,$2530,0,$00 ;21 "" "" dcblw seahorse_act,horsepat,$2570,0,$00 ;22 "" "" dcblw skyhorse_act,horsepat,$2570,0,$00 ;23 "" "" dcblw stego_act,stegopat,$23c4,0,$00 ;24 "" "" dcblw wasp_act,wasppat,$032c,0,$00 ;25 "" "" dcblw gator_act,gatorpat,$2300,0,$00 ;26 "" "" dcblw bbat_act,bbatpat,$2350,0,$00 ;27 "" "" dcblw oct_act,octpat,$238a,0,$00 ;28 "" "" ;------------------------------------------------------------------------------ align ;------------------------------------------------------------------------------ end edit2tbl: dc.w 25 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw sjump_act,sjumppat,$0523,0,$00 ;3: dcblw fish2_act,fish2pat,$2486,0,$08 ;4: dcblw mogura_act,mogurapat,$84a6,2,$00 ;5: dcblw yari_act,yaripat,$03cc,0,$00 ;6: dcblw yari_act,yaripat,$03cc,3,$02 ;7: dcblw box_act,boxpat,$43de,0,$00 ;8: dcblw switch2_act,switch2pat,$0513,0,$00 ;9: dcblw toge_act,togepat,$051b,0,$00 ;10: dcblw dai_act,udaipat,$43bc,0,$04 ;11: dcblw dai3_act,dai3pat,$43e6,0,$01 ;12: dcblw dai3_act,dai3pat,$43e6,1,$13 ;13: dcblw dai3_act,dai3pat,$43e6,0,$05 ;14: dcblw kazari_act,kazaripat,$443e,0,$00 ;15: dcblw dai3_act,dai3pat,$43e6,2,$27 ;16: dcblw dai3_act,dai3pat,$43e6,3,$30 ;17: dcblw kassya_act,kassyapat,$03f6,0,$7f ;18: dcblw uni_act,unipat,$0467,0,$00 ;19: dcblw awa_act,awapat,$8348,19,$84 ;20: dcblw mizu_act,mizupat,$c259,2,$02 ;21: dcblw mizu_act,mizupat,$c259,9,$09 ;22: dcblw bou_act,boupat,$43de,0,$00 ;23: dcblw ben_act,benpat,$4328,0,$02 ;24: dcblw save_act,savepat,$26bc,0,$01 ;25: * dcblw dai4_act,dai4pat,$41f0,4,$80 ;25: edit3tbl: dc.w 18 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw hachi_act,hachipat,$0444,0,$00 ;3: dcblw toge_act,togepat,$051b,0,$00 ;4: dcblw sjump_act,sjumppat,$0523,0,$00 ;5: dcblw mfire_act,firepat,$0345,0,$00 ;6: dcblw fblock_act,fblockpat,$4000,0,$00 ;7: dcblw myogan_act,yoganpat,$63a8,0,$00 ;8: dcblw yogan2_act,yogan2pat,$63a8,0,$00 ;9: dcblw box_act,boxpat,$42b8,0,$00 ;10: dcblw yado_act,yadopat,$247b,0,$00 ;11: dcblw bryuka_act,bryukapat,$42b8,0,$00 ;12: dcblw dai_act,daipat,$02b8,0,$00 ;13: dcblw break2_act,break2pat,$62b8,0,$00 ;14: dcblw yoganc_act,yogancpat,$8680,0,$00 ;15: dcblw bat_act,batpat,$04b8,0,$00 ;16: dcblw imo_act,imopat,$24ff,0,$00 ;17: dcblw save_act,savepat,$26bc,0,$01 ;18: edit4tbl: dc.w 15 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw elev_act,elevpat,$4000,0,$00 ;3: dcblw break2_act,break2pat,$44e0,2,$00 ;4: dcblw shima_act,z4daipat,$4000,0,$00 ;5: dcblw pedal_act,pedalpat,$4000,0,$00 ;6: dcblw step_act,steppat,$4000,0,$00 ;7: dcblw fun_act,funpat,$43a0,0,$00 ;8: dcblw sisoo_act,sisoopat,$0374,0,$00 ;9: dcblw sjump_act,sjumppat,$0523,0,$00 ;10: dcblw mfire_act,firepat,$0480,0,$00 ;11: dcblw bgspr_act,hassyapat,$44d8,0,$00 ;12: dcblw brobo_act,brobopat,$0400,0,$00 ;13: dcblw uni_act,unipat,$2429,0,$00 ;14: dcblw save_act,savepat,$26bc,0,$01 ;15: edit5tbl: dc.w 15 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw toge_act,togepat,$051b,0,$00 ;3: dcblw sjump_act,sjumppat,$0523,0,$00 ;4: dcblw aruma_act,arumapat,$04b8,0,$00 ;5: dcblw signal_act,signalpat,$0000,0,$00 ;6: dcblw bobin_act,bobinpat,$0380,0,$00 ;7: dcblw kani_act,kanipat,$0400,0,$00 ;8: dcblw hachi_act,hachipat,$0444,0,$00 ;9: dcblw yado_act,yadopat,$247b,0,$00 ;10: dcblw shima_act,z5daipat,$4000,0,$00 ;11: dcblw dai2_act,dai2pat,$4000,0,$00 ;12: dcblw switch2_act,switch2pat,$0513,0,$00 ;13: dcblw imo_act,imopat,$24ff,0,$00 ;14: dcblw save_act,savepat,$26bc,0,$01 ;15: edit6tbl: dc.w 29 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw brobo_act,brobopat,$0400,0,$00 ;3: dcblw uni_act,unipat,$0429,0,$00 ;4: dcblw imo_act,imopat,$22b0,0,$00 ;5: dcblw buranko_act,fetamapat,$4391,2,$07 ;6: dcblw haguruma_act,hagurumapat,$c344,00,$e0 ;7: dcblw dai_act,daipat,$22c0,2,$28 ;8: dcblw switch2_act,switch2pat,$0513,0,$00 ;9: dcblw pata_act,patapat,$4492,0,$03 ;10: dcblw pata_act,yukafpat,$04df,0,$83 ;11: dcblw noko_act,nokopat,$43b5,0,$02 ;12: dcblw break2_act,break2pat,$43f5,0,$00 ;13: dcblw dai_act,daipat,$4460,3,$39 ;14: dcblw dai4_act,dai4pat,$22c0,0,$00 ;15: dcblw door_act,doorpat,$42e8,0,$00 ;16: dcblw dai4_act,dai4pat,$22c0,1,$13 ;17: dcblw noko_act,nokopat,$43b5,0,$01 ;18: dcblw dai4_act,dai4pat,$22c0,1,$24 ;19: dcblw noko_act,nokopat,$43b5,2,$04 ;20: dcblw dai4_act,dai4pat,$22c0,1,$34 ;21: dcblw yukae_act,yukaepat,$44c3,0,$00 ;22: dcblw fire6_act,fire6pat,$83d9,0,$64 ;23: dcblw fire6_act,fire6pat,$83d9,11,$64 ;24: dcblw ele_act,elepat,$047e,0,$04 ;25: dcblw yukai_act,yukaipat,$42f0,0,$00 ;26: dcblw scoli_act,scolipat,$8680,0,$11 ;27: dcblw buta_act,butapat,$2302,0,$04 ;28: dcblw save_act,savepat,$26bc,0,$01 ;29: * dcblw ring_act,playpat,$0780,50,$00 ;28: * dcblw usa_act,usapat,$0448,0,$00 ;5: * dcblw mawaru_act,mawarupat,$4348,16,$00 ;7: edit7tbl: dc.w 02 *13 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw ring_act,ringpat,$26bc,8,$00 ;2: * dcblw bobin_act,bobinpat,$0380,0,$00 ;2: * dcblw usagi_act,flicpat,$05a0,0,$0a ;3 * dcblw usagi_act,flicpat,$05a0,0,$0b ;4 * dcblw usagi_act,flicpat,$05a0,0,$0c ;5 * dcblw usagi_act,usagipat,$0553,0,$0d ;6 * dcblw usagi_act,usagipat,$0553,0,$0e ;7 * dcblw usagi_act,pengpat,$0573,0,$0f ;8 * dcblw usagi_act,pengpat,$0573,0,$10 ;9 * dcblw usagi_act,azarpat,$0585,0,$11 ;10 * dcblw usagi_act,fbutapat,$0593,0,$12 ;11 * dcblw usagi_act,niwapat,$0565,0,$13 ;12 * dcblw usagi_act,risupat,$05b3,0,$14 ;13 This source code contains everything: code, comments, labels, and even disabled prototype code that we never knew even existed before. Notably, these labels give the internal names of enemies and objects used throughout the game, while the comments elaborate on the intended level order. The source code snippet even gives some insight into the exact assembler used to build the source code into a ROM. That's not the only useful data in this prototype however... Sonic 2 "Nick Arcade" prototype's symbol list Starting at ROM address 0x418A8 is what appears to be a partial copy of the assembler's symbol table. Oddly, it doesn't appear to match the ROM, as labels that appear in the above source code are recorded in this symbol table at different addresses to where they are in the actual ROM. It can be assumed, based on this, that this symbol table is leftover from a previous execution of the assembler, rather than the one that produced the ROM that we have. From roughly 0x418A8 to 0x47B14, the symbol table follows this format: The first four bytes denote the length of the symbol identifier divided by four, and rounded up. That is to say, it denotes the number of longwords needed to hold the identifier. Notably, this length is stored in big-endian format. The following longwords contain the label. Unused bytes are set to 00. The following four bytes contain the value that is assigned to that symbol. This value is also in big-endian. Here's an example: 00 00 00 02 65 64 69 74 69 6E 69 74 00 01 AB 12 The first four bytes are 00000002, indicating an identifier that is 2 longwords (or 8 bytes) long. The next eight bytes are 65646974696E6974. When interpreted as ASCII, it is "editinit", which is one of the labels seen in the above source code. The following four bytes are 0001AB12, which is the ROM address that was assigned to this label when the assembler that produced this symbol table was ran. In the ROM we have, however, "editinit" is located at 0001BABE. Past 0x47B14, the format of the symbol table changes. Unfortunately, the entries don't seem to specify what each symbol's value is, instead containing what appears to be three pointers. This format continues to 0x50000, when actual game data resumes. The symbol table begins again at 0x50A9C, but in another format that seems to just contain identifiers and pointers. [EDIT: I'm a dummy: apparently you *can* extract meaningful data from the later parts of the symbol table, as someone else was able to and produce this massive list.] While the later symbols don't contain any useful information, they are still useful for determining the original names of various bits of code. For example, the label 'random' is certainly what we've been calling 'RandomNumber' in the Sonic 2 disassembly. Additionally, 'bgmset' and 'soundset' are more than likely 'PlayMusic' and 'PlaySound'. What's notable about that last one is that it answers the question of whether 'PlayMusic' really was intended to play music, since sometimes it's used to play sounds instead, which caused people to question whether it actually was a dedicated music-playing function, or simply a generic 'play something' function. One might be wondering why there's an intact source file and a partial symbol table in the middle of a ROM. Well, the space that this data occupies is what would normally be padding: towards the end of the ROM, the game's data is spaced-out for some reason, leaving big gaps. My theory is that whatever tool the devs were using to produce the final ROM simply malloc'd a huge buffer, and pasted data where it was needed, never initialising the unused space. This resulted in the unused space containing garbage data, leftover in memory from other programs. This isn't the only time that symbol data appears in a Sonic game: Sonic & Knuckles Collection's symbol list Unfortunately, I can't comment too much on this due to not having a copy of Sonic & Knuckles Collection on hand. However, this game contains another instance of symbol data, inside its main EXE. For the most complete set of symbols, however, one need not look further than... Sonic CD's unstripped ELF files Sonic Gems is a compilation of various emulated classic Sonic titles. Its version of Sonic CD, however, is not emulated: rather, it is a port of Sonic CD's PC port. One might be wondering how a game written in Motorola 68000 assembly could have ever been ported to anything with a different CPU architecture. The answer to that is that its code was machine-converted from assembly to C. Notably, this process preserved the original labels, and possibly even the original comments. Within the files of Sonic Gems, you can find a series of ELF files, which parallel the DLL files of Sonic CD's original PC port. What's special about these ELF files is that they are unstripped, containing huge amounts of symbol data. When loaded into something like IDA or Ghidra, this symbol data is taken advantage of while disassembling or decompiling the code. This reverse-engineered code will have its original labels intact, giving a great look into the original source code. Unfortunately, the code you'll be looking at is the disassembled/decompiled output of PowerPC/MIPS assembly which was generated from C which was converted from 68k assembly. That is to say, it's hideous and practically unreadable. Still, if you're able to draw parallels between this code and the original 68k assembly, you effectively have a pre-labelled disassembly. These ELF files also contain some debug data, such as the paths of various source files. I was able to extract a bunch of them back in 2018: Spoiler C:\project\GEMS\application\SonicCD\src\ps2\main\DLLMAIN.C C:\project\GEMS\application\SonicCD\src\ps2\main\ACTION.C C:\project\GEMS\application\SonicCD\src\ps2\main\ACTSET.C C:\project\GEMS\application\SonicCD\src\ps2\main\DAI_K.C C:\project\GEMS\application\SonicCD\src\ps2\main\DAI_RD1.C C:\project\GEMS\application\SonicCD\src\ps2\main\DIRCOL.C C:\project\GEMS\application\SonicCD\src\ps2\main\DUMMY.C C:\project\GEMS\application\SonicCD\src\ps2\main\EDIT.C C:\project\GEMS\application\SonicCD\src\ps2\main\EMIE1.C C:\project\GEMS\application\SonicCD\src\ps2\main\EMIE1CG.C C:\project\GEMS\application\SonicCD\src\ps2\main\ENEMY.C C:\project\GEMS\application\SonicCD\src\ps2\main\EQU.C C:\project\GEMS\application\SonicCD\src\ps2\main\ET1.C C:\project\GEMS\application\SonicCD\src\ps2\main\ETC.C C:\project\GEMS\application\SonicCD\src\ps2\main\FCOL.C C:\project\GEMS\application\SonicCD\src\ps2\main\GAME.C C:\project\GEMS\application\SonicCD\src\ps2\main\GOAL.C C:\project\GEMS\application\SonicCD\src\ps2\main\IO.C C:\project\GEMS\application\SonicCD\src\ps2\main\ITEM.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYER.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYPAT1.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYSP.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYSUB.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLCHG.C C:\project\GEMS\application\SonicCD\src\ps2\main\RIDECHK.C C:\project\GEMS\application\SonicCD\src\ps2\main\RING.C C:\project\GEMS\application\SonicCD\src\ps2\main\SCORE.C C:\project\GEMS\application\SonicCD\src\ps2\main\SCRCHK.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPRING.C C:\project\GEMS\application\SonicCD\src\ps2\main\SUICIDE.C C:\project\GEMS\application\SonicCD\src\ps2\main\TAKI.C C:\project\GEMS\application\SonicCD\src\ps2\main\TBL0.C C:\project\GEMS\application\SonicCD\src\ps2\main\TBL1.C C:\project\GEMS\application\SonicCD\src\ps2\main\TREE.C C:\project\GEMS\application\SonicCD\src\ps2\main\ZONE.C C:\project\GEMS\application\SonicCD\src\ps2\main\ZONETBL1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT11A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KOWASI1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZURE.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SHOOT1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SIKAKE.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\BLOCK.C C:\project\GEMS\application\SonicCD\src\ps2\main\LOADER2.C C:\project\GEMS\application\SonicCD\src\ps2\main\BMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COLI1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\SAVE.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\FRIEND1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\MOVIE1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT11B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV11D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL11D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR11D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z11DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\COL1D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR11D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT12A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12A.C C:\project\GEMS\application\SonicCD\src\ps2\main\BRANKO1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV12D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL12D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\KUZUR12D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR12D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z12DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\ACT13C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV13C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\EDTBL13C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR13C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z13ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z13CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\BOSS_1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\DEV13D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\SCR13D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R1\Z13DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BANPA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BOBIN.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BOBINB.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COLI3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ET3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\FRIEND3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\GA3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\PLAYSP3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\POCKET.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TOGEBL3A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TRAP_R3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MIRACLE.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT31A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MECASNC.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MSNCCG.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TENTOU.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\KAMA.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLPAT6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\MOVIE3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ZONETBL3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT31B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TOGEBL3B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\TOGEBL3D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\COL3D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV31D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL31D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z31DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR31D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT32A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV32D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL32D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z32DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR32D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ACT33C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV33C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\EDTBL33C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z33CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z33ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SIKAKE33.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\LIGHT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\STOPPER.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\BOSS_3.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\GATE.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\ROLLPLAT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR33C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\DEV33D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\Z33DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R3\SCR33D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT41A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COLI4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL41A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ET4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCRCHK4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SW4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SWBLK4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ZONETBL4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\GAME4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\PLAYSUB4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\AWA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\HARID4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TOBIRA4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\HARIR4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALLS.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL41A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\FUNSUI4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALL1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCREW_A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ESCAL4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BRUNKO4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TONBO.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\AMENBO.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TAGAMEB4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\YAGO.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\FRIEND4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TEKKYU.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\PLAYPAT4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\KUZURE4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\LRBLK4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT41B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL41B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\MOVIE4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\RBLK4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\UDBLK4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL41B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT41C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL41C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCREW_C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TEKKYU4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL41C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\RENKETU4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SWGUN4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\COL4D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR41D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV41D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z41DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR42A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL42A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL42A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TOBIRAS4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\OSUMIZU.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALL4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT42A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\UKIDAI.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\TEKKYU1.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WALL42.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT42B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL42B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL42B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT42C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL42C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL42C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BANEIWA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DAID4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR42C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\KOWASI4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV42D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z42DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\ACT43C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV43C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\EDTBL43C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR43C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z43ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BOSS_4.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\BOSS_4_2.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z43CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\WTBL43.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\DEV43D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\SCR43D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R4\Z43DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ACT51A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COLI5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\EDTBL5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\GAME5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\PLAYSP5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ZONETBL5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\BELTSW5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\MOVIE5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\FRIEND5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KEMUSI.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SHOOT5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KUMO.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\IWA5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\IWA5WAVE.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DENDEN.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HASHI5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HARI5F.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HARIR5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\IWA5ROLL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KOWASI5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\KUZURE5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SASORI.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\HASIRA5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ET5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\BURANKO5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DAI_RD5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\COL5D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV51D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR51D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z51DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV52D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR52D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z52DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\ACT53.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV53C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR53C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z53ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z53CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\BOSS_5.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\EDTBL53.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\DEV53D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\SCR53D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R5\Z53DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ACT61A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COLI6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL61A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SW6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOBIRA6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TRAP_R6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\KDAI6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BEEM6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BLOCK6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DAIR6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EGG6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ET6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\FRIEND6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\HACHI6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\MINOMUSI.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\MOVIE6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\PISTON6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SEMI.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SHOOT6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOBIDAI6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\UDBLK6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BATTA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SEESAW6.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLAYER6.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLCHG6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ZONETBL6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL61B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL61C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\COL6D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV61D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR61D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z61DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOGEBL6A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ACT62A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOGEBL6B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\TOGEBL6D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV62D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL62D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR62D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z62DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\ACT63.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV63C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\EDTBL63C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR63C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z63CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z63ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\BOSS_6.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\DEV63D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\SCR63D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R6\Z63DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ACT71A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\CHGBAN.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\CHGWALL7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COLI7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EDTBL7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\PLAYSP7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ZONETBL7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\WALL7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\TEKKYU7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\TEKKYU7J.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SLIGHT7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\FRIEND7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\BRANKO7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ET7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\KANABUN.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DANGO7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\MOVIE7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\KABASIRA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\HOTARU7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\COL7D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV71D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR71D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z71DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV72D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR72D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z72DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR73C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\ACT73.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EDTBL73.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z73ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\GAITOU73.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\WALL73.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EMIE7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z73CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV73C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\HARI73.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\EMIE7CG.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\BOSS_7.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\SCR73D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\DEV73D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R7\Z73DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\PLPAT8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ACT81A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COLI8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EDTBL81.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ZONETBL8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TRAP_R81.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KABUTO8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KOMA8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SW8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\OKUSIESO.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TOBIRA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KONBEA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCARAB.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KUZURE8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\NOKOGIRI.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PROPERA8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DAI8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HACHI8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ET8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\FRIEND8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PISTON.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HAGURUMA.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCRCHK8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\COL8D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR81D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z81DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV81D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PLAYSP8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ACT82A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EDTBL82.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TRAP_R82.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82ATBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\BEAM.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SHUT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SHOOT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DANGO8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\LEGMECA8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\BIGBOM8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82A.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\JETTOGE8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\PIPE8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82B.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82BTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV82D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR82D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z82DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EDTBL83.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR83C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z83ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z83CTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\BOSS_8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV83C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\ACT83.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\EMIE8.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\KONBEA83.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\TRAP_R83.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HOTA8C.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\DEV83D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\SCR83D.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\Z83DTBL.C C:\project\GEMS\application\SonicCD\src\ps2\main\R8\HOTA8D.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ACT_S.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\BACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\BMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\COLI_S.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\COMMON.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\DATA_S1.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ENS.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ETC_M.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\ETC_S.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\FADEIN.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\GAME.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\KAITEN.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\PLS.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\SPM_EQU.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\SPS_EQU.C C:\project\GEMS\application\SonicCD\src\ps2\main\SPECIAL\SIN.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIGOOD\AVIGODDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIGOOD\AVIGODEN.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIOPEN\AVIOPNDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\AVIOPEN\AVIOPNEN.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESENTRY.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTBMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTGRID.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTITEM.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTPALT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\BESTTIME\BESTSPRT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\COMMON\HMX_OEEACTL.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNBMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNENTRY.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNGRID.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\OPENING\OPNPALT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ACTM.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ASCIISET.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ASCMAP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\CHAMOV.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\DATA_M.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\ETC.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\FLASH.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\KAITEN.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\LPLMAIN.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\PALET.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\PLM.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\PLS.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\SPM_EQU.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\PLANET\SPS_EQU.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDBMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDEDIT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDENTRY.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDFILE.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDGRID.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDMENU.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDPALT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SAVEDATA\SVDSPRT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDENTRY.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDBMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDGRID.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDPALT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\SOUNDTST\SNDSPRT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGENTRY.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGBMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGGRID.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGITEM.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGPALT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\STAGETST\STGSPRT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\TA.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\FADEIN.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\TACOLOR.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\TA\TAEACTRL.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\ACT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\BM_M.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\CHRSET.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\DATA_SP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\ETC_M.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\FADE.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\GAME.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\IO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\SPM.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\THANKS\SPRMOVE.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDBMP.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDDO.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDENTRY.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDGRID.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDPALT.C C:\project\GEMS\application\SonicCD\src\ps2\main\TITLE\VISUALMD\VMDSPRT.C C:\project\GEMS\application\SonicCD\src\ps2\main\WARP\WARP.C This file list gives you a look at the layout of Sonic CD's source code. Notably, you can see 'EDIT.C', which is very likely the file that originally contained the code seen in Sonic 2's "Nick Arcade" prototype. Sonic Gems isn't the only game to contain unstripped executables like this. For instance, The Legend of Zelda Collector's Edition contains an unstripped executable for its Nintendo 64 emulator (or "simulator", as it calls itself. Yeah, sure, Nintendo). Yuji Naka's video A few years back, Yuji Naka found some old footage of him working on Sonic 1 back in February 1990. In this video, he scrolls through a portion of the game's source code, giving us yet another sighting of authentic source code: Sonic hackers looked into this footage, and were able to produce a transcription of the source code, 'FCOL3.ASM': Code: *cd_walk equ 0*2 *cd_jump equ 1*2 *cd_up equ 2*2 *cd_down equ 3*2 updotmax equ -4 downdotmax equ 4 jumpdotmax equ 8 ;sprvo equ $1c ;sprho equ $1d ;sprvs equ $1e ;sprhs equ $1f ;------------------------------------------------------------------------ ; foot colition ; ;col: move.w yposi(a0),d4 move.b sprvo(a0),d1 add.b sprvs(a0),d1 ext.w d1 add.w d1,d4 move.w xposi(a0),d5 move.b sprho(a0),d1 ext.w d1 add.w d1,d5 move.w xspeed(a0),scrhithz ?loop: move.w d4,d2 move.w d5,d3 moveq #0,d0 move.b sprhs(a0),d0 tst.w xspeed(a0) bpl.b ?jump * btst.b #cd_right,cddot(a0) * beq.b ?jump neg.w d0 ?jump: add.w d0,d3 bsr.w scdchk tst.w d1 beq.b ?end bpl.b ?down ?up: cmp.w #updotmax,d1 blt.b ?nomove add.w d1,yposi(a0) ?end: rts ?nomove: bsr.b hoseihsub bra.b ?loop move.w #0,xspeed(a0) rts ?down: move.w d1,d6 swap d6 ?down2: move.w d4,d2 move.w d6,d3 moveq #0,d0 move.b sprhs(a0),d0 tst.w xspeed(a0) bpl.b ?jump3 * btst #cd_left,cddot(a0) * bne.s ?jump3 neg.w d0 ?jump3: add.w d0,d3 bsr.w scdchk tst.w d1 beq.b ?end2 bpl.b ?down1 ?up2: cmp.w #updotmax,d1 blt.b ?nomove2 Also visible in the footage was a brief glance of a partial file list: Code: ENEMY.ASM FCOL.ASM FCOL.BAK FCOL3.ASM GAME.ASM INT.ASM LOGO.ASM MACRO.LIB MAIN.ASM ML.EVT ML.S28 OBJ¥ S S.CMD SCORE.ASM SOUND¥ TR¥ Some of these filenames may seem familiar, as they survived into Sonic CD. Note that the items ending with the Yen symbol are actually directories, and not files. This footage is also noteworthy for showing that Sonic 1 was developed on DOS. This is something that I'll come back to later. Patent US5411272A A tiny snippet of source code can be found in a patent that Sega filed around the time of Sonic 2's release. It contains two tables that are responsible for Emerald Hill Zone's spiral loops. While it's not all that insightful, it does give you a look at the original formatting of these tables, and how the data was grouped. J2ME The developers of the J2ME version of Sonic 1 appear to have had access to Sonic 1's source code, or at least its assets: this is evident through how its filenames reflect labels found in the original source code. For instance, 'scdtblwk.scd', matches the label 'scdtblwk' that is found in Sonic 2's "Nick Arcade" prototype. Most notably, however, some of the files in this version appear to be 'raw', unprocessed versions of the data found in the ROM of the Mega Drive version. For example, there's an unused function in Sonic 2 that converts the collision data from a previously-unknown format to the format that is seen in the ROM itself, and it was discovered that the collision files in the J2ME version are in this mysterious format. There are other file format oddities as well, such as block priority being stored in its own file, instead of being embedded in the chunk data. It's possible that this too is how the data was originally formatted, before being converted into its final form for inclusion in the ROM. Assembler So we have all this information about the source code itself, and the game's assets, but what about the development environment? Well, for starters, from the footage we saw earlier, we can tell that Sonic 1 was developed on DOS computers. According to LazloPsylus, Sonic 1 was very evidently assembled with the 2500AD assembler, X68k, based partly on the fact that the syntax of the code snippet seen in Yuji Naka's footage is unusual, and unlikely to have built with any other assembler. However, it does not appear that Sonic 2 was assembled with X68k, as the "Nick Arcade" source code snippet uses a different syntax. It's plausible that Sonic 2 was assembled with SN 68k, also known as asm68k, however the presence of an 'addsym' directive, which is not supported by asm68k, calls this into question. Further complicating matters is something that I discovered while writing this very blog post: the "Nick Arcade" symbol table uses big-endian integers. DOS PCs are x86, and store their integers in little-endian. This suggests that Sonic 2 wasn't assembled on a DOS PC at all, unlike Sonic 1, and rather that it was assembled on a big-endian platform like a 68k-powered Macintosh. Another indication of this is that the "Nick Arcade" source snippet uses Unix-style line endings (0x0A), instead of DOS-style line endings (0x0D 0x0A). There's some evidence to suggest that Sonic 2 used a different assembler between REV01 and REV02: cross-object-file function calls behave differently, 'dc.b' directives are automatically padded, some 'addi' and 'subi' instructions were optimised to 'addq' and 'subq' instructions, and some 'lea' instructions were unoptimised from PC-relative addressing to absolute long addressing. The cross-object-file behaviour of REV00 and REV01 matches that of the "Nick Arcade" prototype, so it can be assumed that Sonic 2 used the same assembler throughout development up until REV02. Something I just discovered while writing this blog post is that Sonic 1's machine code is similar to Sonic 2 REV02: in code that is shared between Sonic 1 and Sonic 2, the same 'addi' and 'subi' instructions are 'addq' and 'subq' in both Sonic 1 and Sonic 2 REV02. Likewise, the same 'lea' instructions are unoptimised. With this in mind, it would appear that Sonic 2 was migrated back to X68k during the development of REV02, and it would continue to use this assembler as it was used to develop Sonic 3, Knuckles in Sonic 2, and the Mega Play arcade version of Sonic 2. Sonic 2's source file boundaries While we don't have an exact list of Sonic 2's source files, we do have a way of determining where its original source files began and ended: the assembler used by Sonic 2 before REV02 would resolve cross-object-file function calls in a clunky way, basically proxying them to little 'JmpTo' functions. To put it literally, a 'bsr' instruction that referenced a label which was outside of the current object file would instead branch to a single-instruction function that was appended to the end of the object file, which would itself jump to the 'bsr' instruction's original destination. Because these 'JmpTo' functions are inserted at the end of the object file, they can be used to tell where an object file (and thus a source file) ended. From this, we can determine things like that the ring object (object 0x25), the scattered ring object (object 0x37), the big Special Stage ring object leftover from Sonic 1, and the Casino Night Zone ring prize object (object 0xDC) were all stored in the same source file. Sonic 2 "Simon Wai" prototype's unassembled Kosinski file Like the "Nick Arcade" prototype before it, Sonic 2's "Simon Wai" prototype includes another source code file. This one, however, is not entirely complete, but it contains more than enough useful information: Code: ; 圧縮前 $8000 圧縮後 $2c00 圧縮率 34.4% セル数 1024 dc.b $1d,$7f,$00,$ff,$f8,$7e,$04,$01,$fb,$02,$00,$03,$04,$05,$04,$80 dc.b $ff,$fa,$ff,$07,$54,$0b,$54,$0a,$50,$0c,$50,$ff,$8f,$0d,$54,$0f dc.b $54,$0e,$50,$10,$50,$11,$52,$19,$52,$18,$ff,$ff,$fc,$1a,$52,$1b dc.b $51,$8a,$51,$8b,$52,$1c,$02,$1e,$02,$1f,$02,$2a,$9f,$ff,$02,$2b dc.b $01,$8c,$01,$8d,$f4,$1d,$02,$2c,$02,$2d,$01,$ff,$f4,$88,$01,$89 dc.b $01,$8e,$01,$8f,$02,$1a,$e4,$02,$2e,$02,$46,$c0,$2f,$e0,$ff,$1b dc.b $ec,$fc,$dc,$00,$70,$02,$c4,$d4,$ee,$18,$02,$19,$01,$3f,$f6,$fd dc.b $e4,$e6,$04,$2e,$04,$2d,$04,$9d,$fe,$77,$bd,$00,$be,$f9,$50,$31 dc.b $54,$30,$54,$2f,$7f,$f8,$56,$03,$56,$02,$56,$01,$05,$ff,$f0,$52 dc.b $1d,$52,$1e,$e1,$9f,$52,$1f,$fc,$50,$3e,$54,$3c,$56,$04,$54,$36 dc.b $09,$e0,$c4,$9c,$f8,$ea,$1a,$50,$48,$24,$41,$ba,$a4,$b2,$fc,$fc dc.b $21,$9a,$f2,$80,$f6,$9c,$fc,$1d,$5e,$92,$68,$01,$8a,$01,$8b,$ee dc.b $fc,$68,$f2,$fd,$d5,$fd,$ce,$f7,$f7,$80,$fd,$f0,$f8,$0f,$04,$35 dc.b $f0,$f8,$0d,$54,$3f,$54,$39,$7f,$fe,$54,$38,$01,$ff,$02,$00,$06 dc.b $00,$60,$1a,$54,$43,$54,$ff,$f3,$42,$55,$fe,$55,$fd,$55,$fc,$55 dc.b $fb,$54,$46,$a4,$1c,$ff,$11,$50,$49,$54,$44,$54,$52,$50,$51,$54 dc.b $50,$80,$b2,$12,$8e,$8f,$4e,$06,$fc,$f2,$f2,$3c,$90,$fa,$58,$5c dc.b $80,$f8,$20,$60,$f8,$20,$40,$f3,$02,$0a,$02,$2c,$3c,$0b,$70,$40 dc.b $f6,$86,$2a,$54,$29,$52,$f4,$62,$f8,$11,$c0,$f1,$2a,$52,$2b,$bc dc.b $f4,$fc,$1a,$62,$f1,$72,$6e,$f2,$f2,$78,$00,$16,$bd,$fe,$00,$17 dc.b $fc,$f8,$0c,$18,$00,$19,$fc,$f8,$0c,$e0,$f8,$2e,$54,$06,$54,$04 dc.b $50,$fb,$be,$08,$50,$09,$f8,$fe,$50,$12,$50,$13,$fc,$f8,$0b,$00 dc.b $14,$00,$15,$f7,$fc,$fc,$f8,$0c,$1e,$00,$1f,$fc,$f8,$0c,$20,$00 dc.b $21,$fc,$f4,$50,$f5,$f7,$07,$50,$f6,$50,$f7,$e8,$fe,$50,$f8,$50 dc.b $87,$52,$1b,$3c,$1f,$fd,$e0,$fc,$50,$f9,$50,$85,$40,$ae,$f1,$50 dc.b $fa,$50,$fb,$07,$e1,$50,$fc,$50,$8b,$f6,$86,$f1,$2a,$1c,$50,$2f dc.b $b2,$8c,$50,$8d,$50,$8e,$24,$f1,$24,$ee,$0a,$24,$9a,$eb,$92,$f3 dc.b $7c,$f2,$0a,$f2,$e0,$ec,$af,$9f,$dc,$05,$6d,$ae,$ef,$60,$f2,$1a dc.b $06,$25,$01,$89,$45,$94,$e4,$4e,$ed,$e0,$e8,$2a,$f3,$11,$ae,$e0 dc.b $f0,$c0,$28,$02,$29,$38,$f6,$00,$8c,$c0,$fd,$ce,$e4,$a0,$59,$44 dc.b $c0,$8d,$ce,$00,$ea,$bc,$e0,$0b,$a8,$d6,$fc,$1b,$dc,$e2,$f8,$f0 dc.b $68,$ec,$ea,$bd,$f8,$e5,$20,$f0,$15,$a0,$e8,$09,$20,$f0,$16,$50 dc.b $54,$0d,$20,$f5,$1b,$52,$1c,$92,$a0,$dc,$e4,$60,$e5,$a8,$6e,$e2 dc.b $80,$6e,$e4,$82,$28,$12,$fc,$4e,$e2,$80,$6e,$e2,$44,$ee,$e7,$fa dc.b $00,$66,$8e,$fe,$56,$25,$51,$8c,$c0,$c2,$e4,$bc,$f0,$fe,$38,$02 dc.b $15,$d8,$80,$fc,$06,$f8,$9d,$59,$f0,$12,$02,$11,$02,$10,$80,$fc dc.b $f6,$5a,$30,$fe,$e0,$ee,$13,$80,$2e,$52,$2f,$f9,$6d,$7f,$f5,$05 dc.b $f9,$02,$16,$00,$23,$00,$24,$e4,$f3,$f2,$f1,$80,$ea,$50,$2b,$20 dc.b $8c,$50,$76,$5a,$f3,$84,$51,$89,$40,$a0,$5c,$58,$60,$6e,$00,$f9 dc.b $11,$95,$ae,$f5,$1b,$5a,$f6,$6a,$e3,$6a,$fc,$02,$82,$e8,$10,$96 dc.b $ee,$ea,$47,$0f,$ce,$f2,$13,$02,$14,$76,$b2,$f2,$16,$02,$17,$44 dc.b $8c,$ee,$e4,$88,$ea,$33,$fa,$d4,$04,$23,$f2,$e4,$e6,$fc,$54,$27 dc.b $54,$4f,$e4,$94,$54,$93,$04,$92,$e0,$ea,$e4,$f2,$54,$af,$af,$85 dc.b $54,$97,$04,$98,$c6,$fd,$52,$f3,$54,$87,$54,$99,$bc,$fc,$ff,$ff dc.b $00,$e8,$39,$50,$6b,$50,$6c,$50,$6d,$50,$73,$50,$74,$50,$75,$50 dc.b $76,$50,$ff,$8f,$77,$50,$78,$50,$79,$50,$15,$50,$7a,$50,$7b,$50 dc.b $7c,$5e,$51,$f8,$20,$ee,$12,$00,$13,$fc,$f8,$0c,$00,$e8,$0e,$08 dc.b $6e,$e2,$4d,$d2,$fc,$f2,$bc,$d2,$8a,$32,$ee,$f6,$60,$04,$f0,$fa dc.b $22,$fa,$00,$23,$06,$5c,$32,$fc,$80,$f1,$26,$54,$25,$67,$c1,$50 dc.b $27,$f6,$58,$20,$80,$f2,$20,$60,$d1,$51,$55,$f1,$6d,$d8,$80,$f3 dc.b $cc,$f3,$28,$f1,$80,$f0,$09,$12,$dc,$2d,$a3,$04,$e1,$d8,$ea,$18 dc.b $84,$d6,$a0,$d8,$4f,$41,$80,$f4,$02,$25,$01,$24,$ae,$05,$c0,$80 dc.b $f4,$88,$23,$f0,$25,$92,$12,$05,$fa,$ab,$02,$d6,$e0,$ff,$92,$f3 dc.b $e0,$fc,$8a,$f1,$e0,$86,$a7,$88,$10,$88,$01,$f9,$01,$fa,$80,$5d dc.b $21,$05,$fa,$60,$fc,$50,$28,$80,$fe,$e0,$e9,$fc,$2d,$1b,$94,$84 dc.b $bc,$c9,$52,$86,$c0,$ce,$64,$ea,$2a,$7c,$74,$19,$fa,$e9,$76,$d2 dc.b $58,$55,$05,$48,$01,$5d,$f9,$5e,$f2,$fc,$f4,$57,$05,$52,$85,$e9 dc.b $1b,$05,$49,$f4,$fe,$02,$d5,$ff,$f2,$f4,$f8,$09,$ff,$f8,$32,$32 dc.b $d6,$96,$ca,$ff,$d8,$38,$50,$39,$50,$3f,$a2,$49,$a2,$4a,$fc,$54 dc.b $ea,$fe,$7f,$af,$02,$0d,$02,$0e,$02,$0f,$06,$0d,$cc,$f8,$0a,$c1 dc.b $00,$c2,$bc,$f8,$0c,$d2,$f9,$f0,$f8,$2c,$c0,$e1,$f0,$07,$04,$05 dc.b $f1,$07,$51,$bf,$aa,$75,$50,$c1,$50,$c2,$54,$31,$a0,$c6,$ac,$da dc.b $ee,$f5,$46,$f2,$aa,$20,$60,$f3,$e4,$f3,$dc,$de,$d2,$cc,$6e,$de dc.b $d4,$52,$d8,$0c,$b2,$ac,$e2,$e8,$5c,$f3,$d8,$c8,$e2,$82,$b2,$20 dc.b $de,$34,$f3,$ec,$1a,$f2,$84,$db,$b8,$84,$6a,$e8,$fe,$c4,$b8,$c0 dc.b $b8,$49,$20,$fc,$c0,$b8,$10,$1b,$2d,$e8,$08,$f3,$00,$f1,$51,$fc dc.b $da,$8a,$f2,$bd,$ae,$d7,$97,$01,$73,$06,$99,$fc,$fe,$98,$f6,$e4 dc.b $04,$0a,$fc,$f6,$f4,$9b,$7f,$46,$f6,$06,$9f,$02,$e2,$0a,$98,$0a dc.b $f4,$e6,$38,$e9,$fe,$e3,$04,$00,$fa,$f4,$fc,$50,$f5,$93,$43,$e2 dc.b $06,$91,$02,$fe,$92,$f8,$f0,$07,$84,$98,$06,$96,$02,$fe,$b0,$f8 dc.b $91,$20,$06,$95,$f0,$c4,$fe,$9a,$8d,$87,$f8,$06,$9c,$f0,$e4,$02 dc.b $e5,$aa,$08,$fe,$02,$bc,$f8,$fa,$eb,$32,$50,$33,$50,$34,$9f,$ff dc.b $50,$b4,$50,$b5,$50,$b6,$fc,$b7,$50,$b8,$50,$b9,$54,$e1,$fb,$b9 dc.b $f0,$fe,$ba,$f0,$bb,$f0,$bc,$68,$d2,$06,$19,$fc,$ff,$f4,$ae,$fc dc.b $ad,$fc,$ac,$fc,$ab,$fc,$aa,$f0,$fc,$a6,$fc,$fb,$8b,$a5,$fc,$a4 dc.b $48,$d6,$30,$be,$3c,$a3,$3c,$a2,$38,$d0,$09,$c5,$56,$f0,$a1,$58 dc.b $c0,$0b,$f0,$a0,$f0,$f8,$0e,$9f,$40,$b0,$52,$58,$d5,$b5,$6e,$80 dc.b $f7,$58,$d5,$80,$f0,$0d,$f1,$72,$cc,$80,$f7,$01,$6d,$c0,$f8,$1e dc.b $58,$45,$fd,$48,$f6,$bc,$fc,$c0,$c0,$ee,$9c,$ea,$18,$a1,$6d,$01 dc.b $4b,$f8,$48,$05,$55,$8e,$cc,$a6,$f0,$52,$05,$57,$d1,$a0,$05,$56 dc.b $ec,$38,$ea,$88,$a0,$32,$cb,$c0,$fe,$ec,$fe,$c6,$f0,$ec,$fe,$01 dc.b $1f,$02,$5d,$01,$ff,$bf,$0f,$01,$10,$02,$45,$02,$30,$02,$31,$c1 dc.b $da,$c2,$33,$c2,$32,$ff,$cf,$d2,$e2,$02,$34,$02,$35,$02,$32,$c1 dc.b $db,$c2,$3c,$02,$3d,$7f,$00,$f0,$47,$02,$36,$02,$37,$c1,$dc,$e0 dc.b $ea,$0e,$ff,$f0,$44,$ce,$c5,$d8,$c1,$d9,$02,$40,$02,$f0,$ff,$41 dc.b $f0,$c1,$d4,$c1,$d5,$c1,$d6,$c1,$d7,$02,$3e,$02,$ff,$3f,$3f,$02 dc.b $46,$c0,$c1,$c0,$c2,$c2,$3a,$c2,$3b,$02,$38,$02,$39,$01,$02,$d8 dc.b $f0,$d0,$c8,$02,$7e,$c0,$c4,$f8,$30,$01,$29,$01,$2a,$02,$44,$92 dc.b $d6,$aa,$c0,$a3,$aa,$80,$d3,$8b,$2e,$ca,$d3,$a0,$c9,$9a,$d2,$a4 dc.b $cd,$aa,$eb,$80,$cf,$a4,$cd,$66,$d2,$a8,$ce,$80,$d6,$04,$5e,$72 dc.b $ce,$60,$d5,$5d,$97,$f6,$54,$61,$54,$60,$e4,$fc,$ea,$52,$1c,$e0 dc.b $a9,$63,$54,$ff,$da,$62,$54,$67,$54,$66,$54,$65,$54,$64,$f2,$bc dc.b $e0,$ac,$54,$e0,$a9,$7f,$e1,$51,$fb,$51,$fc,$51,$fd,$51,$fe,$80 dc.b $e8,$0f,$fc,$50,$ba,$5b,$50,$50,$bb,$50,$80,$e8,$14,$0c,$80,$e8 dc.b $0c,$f0,$80,$e8,$7b,$e0,$d8,$3f,$fd,$ef,$ec,$e9,$9a,$f2,$1e,$54 dc.b $9d,$54,$9c,$54,$90,$54,$8f,$92,$b7,$1c,$1f,$d5,$54,$8e,$54,$8d dc.b $50,$50,$e0,$e8,$ba,$b2,$9e,$80,$9a,$aa,$aa,$1d,$9c,$bb,$c4,$da dc.b $7c,$ea,$ba,$b2,$36,$db,$f8,$9d,$00,$be,$aa,$f4,$a0,$c8,$09,$8e dc.b $a6,$0e,$a3,$92,$c6,$c0,$9a,$d4,$04,$24,$00,$c2,$ff,$5a,$32,$f0 dc.b $09,$e6,$54,$4f,$54,$4e,$54,$4d,$54,$4c,$54,$d5,$7e,$59,$54,$9c dc.b $c3,$a8,$b1,$00,$ea,$1c,$80,$99,$57,$54,$56,$54,$5f,$11,$55,$60 dc.b $ff,$aa,$ea,$80,$9a,$a0,$fe,$06,$bc,$95,$54,$68,$d6,$5c,$d6,$12 dc.b $9c,$56,$dc,$e4,$9a,$ea,$84,$c4,$8f,$3f,$5c,$ac,$51,$09,$83,$f2 dc.b $62,$02,$63,$01,$88,$05,$7c,$a2,$f6,$51,$00,$91,$09,$24,$f2,$fc dc.b $10,$25,$05,$64,$91,$f0,$96,$b2,$ee,$61,$1d,$92,$c1,$f2,$50,$91 dc.b $a8,$c2,$fc,$fe,$f0,$96,$ac,$b0,$f0,$48,$b1,$8d,$64,$e1,$20,$c3 dc.b $f0,$00,$9e,$8c,$aa,$92,$95,$78,$f2,$60,$f8,$09,$8e,$93,$92,$f3 dc.b $d1,$f5,$72,$90,$09,$1f,$36,$44,$ef,$00,$53,$40,$b1,$fa,$f1,$50 dc.b $4a,$ff,$ff,$50,$4b,$50,$4c,$50,$4d,$50,$4e,$50,$4f,$50,$55,$50 dc.b $56,$50,$57,$3d,$48,$50,$3d,$f8,$f5,$18,$50,$40,$f6,$fc,$f7,$2a dc.b $a9,$2a,$20,$9a,$b6,$bb,$20,$90,$0a,$e8,$ee,$fe,$e8,$a4,$a4,$ff dc.b $e4,$f4,$c6,$80,$de,$0e,$b5,$50,$46,$50,$47,$50,$48,$50,$3f,$c2 dc.b $3a,$50,$3b,$50,$42,$50,$43,$a0,$ff,$51,$5f,$55,$50,$52,$50,$44 dc.b $50,$45,$d8,$f1,$3c,$f2,$e4,$c3,$2e,$f8,$09,$a0,$8e,$95,$05,$a0 dc.b $fd,$80,$88,$0a,$e0,$ef,$0e,$b2,$c5,$ce,$55,$62,$00,$bb,$5c,$f8 dc.b $0a,$60,$f6,$5c,$8a,$3c,$5a,$2b,$2a,$d2,$fe,$01,$12,$a0,$09,$52 dc.b $f3,$f0,$5a,$f3,$8e,$fe,$30,$91,$f0,$b6,$f2,$ea,$8a,$32,$c0,$d1 dc.b $96,$fd,$2e,$bd,$f0,$b2,$fe,$12,$cb,$2c,$c0,$40,$fd,$0e,$a0,$5c dc.b $8f,$be,$56,$a0,$a6,$4e,$a2,$51,$82,$b8,$09,$88,$a1,$53,$22,$b8 dc.b $2d,$c0,$82,$f5,$27,$f0,$f8,$0b,$a6,$b9,$c0,$81,$54,$34,$54,$33 dc.b $54,$32,$f0,$ed,$92,$40,$d1,$e0,$ea,$1a,$c0,$82,$54,$37,$c0,$81 dc.b $68,$68,$55,$72,$f2,$58,$aa,$81,$41,$00,$e0,$60,$8e,$b0,$0a,$c0 dc.b $80,$09,$7a,$b0,$0a,$bf,$28,$80,$c0,$40,$c0,$be,$cc,$a3,$cc,$00 dc.b $d8,$0a,$f0,$00,$d8,$0c,$8a,$ba,$f0,$00,$d8,$0c,$f0,$00,$d8,$0a dc.b $88,$fe,$54,$b4,$7f,$fd,$cc,$f4,$f4,$bc,$f4,$bb,$f4,$ba,$f4,$80 dc.b $d1,$7c,$d1,$bf,$50,$c0,$f8,$ff,$fa,$aa,$f8,$ab,$f8,$ac,$f8,$ad dc.b $f8,$ae,$d4,$91,$26,$b7,$f8,$b1,$f8,$fb,$dd,$b2,$f8,$b3,$16,$b0 dc.b $0b,$38,$af,$38,$b0,$30,$06,$b0,$0c,$38,$a9,$f0,$f8,$0e,$d6,$ed dc.b $a8,$f0,$f8,$0e,$a7,$f0,$f8,$0d,$ff,$f8,$13,$f0,$d5,$f0,$f8,$0e dc.b $d6,$f0,$f8,$0e,$d7,$fd,$ff,$05,$6e,$f2,$f8,$09,$f4,$d8,$f0,$d9 dc.b $55,$71,$55,$70,$55,$6f,$50,$dd,$7f,$7f,$f0,$de,$f0,$df,$f0,$e0 dc.b $f2,$18,$00,$f1,$72,$51,$73,$50,$ef,$f0,$d8,$f0,$ff,$f1,$f2,$00 dc.b $d9,$a2,$fe,$1f,$a1,$88,$7f,$70,$a1,$89,$a2,$2c,$a2,$2d,$a2,$1a dc.b $f4,$f8,$c8,$67,$02,$59,$5d,$ef,$a0,$6c,$f0,$fe,$f2,$5a,$00,$d4 dc.b $9b,$f8,$4c,$2d,$00,$2e,$ac,$e8,$0a,$2f,$ff,$6d,$50,$30,$50,$31 dc.b $50,$36,$50,$37,$50,$3c,$40,$df,$1e,$40,$d9,$1b,$ad,$6a,$7c,$e7 dc.b $54,$e2,$8d,$88,$94,$f8,$d4,$a0,$8c,$92,$8e,$ee,$cb,$8f,$05,$19 dc.b $ee,$bf,$2a,$e2,$f4,$80,$88,$0a,$e6,$04,$14,$f2,$e0,$ba,$f6,$ee dc.b $c0,$d3,$94,$f5,$e0,$c0,$d0,$15,$58,$85,$80,$84,$da,$ 'Kosinski' is the nickname of a compression format used by various Mega Drive games, and this source file contains data compressed in this format. The header, when translated, says... Code: ; Before compression $8000 After compression $2c00 Compression ratio 34.4% Number of cells 1024 'Cells' refers to Mega Drive tile graphics, which are 32 bytes each. It doesn't make such sense in this context, since it's not tiles that are being compressed, but rather Aquatic Ruin Zone's level chunk data. Anyway, what we can learn from this source file is that Kosinski-compressed data wasn't included into the ROM as binary data, but rather assembly data for the assembler to process. This is unusual, as every assembler that I've worked with supports including binary data directly, without requiring this odd shim. Regardless, this assembly file also possibly indicates why Kosinski files are always padded to 0x10 bytes: each 'dc.b' directive in the source file is 0x10 values long, so perhaps the tool that produced this assembly file was unable to output a 'dc.b' that was less than 0x10 values long, and so it would instead output dummy 0 values until the 'dc.b' was 'full'. Closing Aaaaaaand... that's it. I think that's all I know about Sonic the Hedgehog's source code. Hopefully this information is of use to someone.
I've been digging through the Sonic 2 Nick Arcade and Sonic CD Gems collection symbols for a bit, among other things, and gathered a little collection of what certain labels were called in the source code: Sonic 1 debug font = ascii PlaySound = bgmset PlaySound_Special = soundset ClearScreen = scrinit QueueDMATransfer = dmactrset EniDec = mapdevr RandomNumber = random CalcSine = sinset CalcAngle = atan PalLoad1 = colorset PalLoad2 = colorset2 PalPointers = colortbl Pal_FadeFromBlack = fadein Pal_FadeToBlack = fadeout Pal_FadeFromWhite = flashin Pal_FadeToWhite = flashout PalCycle_Load = clchgctr ChangeRingFrame = syspatchg LevelSizeLoad = scr_set DeformBgLayer = scroll RunDynamicLevelEvents = scrchk loadZoneBlockMaps = mapinit LoadTilesAsYouMove = scrollwrt LoadTilesFromStart = mapwrt LoadCollisionIndexes = scdset ConvertCollisionArray = scdcnv BuildSprites = patset DrawSprite = spatset RunObjects = action Obj_Index = act_tbl DisplaySprite = actionsub DeleteObject = frameout MarkObjGone = frameoutchk MarkObjGone_P1 = frameoutchkd AnimateSprite = patchg SingleObjLoad = actwkchk SingleObjLoad2 = actwkchk2 TouchResponse = pcol HurtCharacter = playdamageset KillCharacter = playdieset Sonic_ResetOnFloor = jumpcolsub DebugMode = edit JmpTbl_DbgObjLists = edittbl SolidObject = hitchk ObjectMoveAndFall = speedset ObjectMove = speedset2 Obj79_SaveData = playsave Obj79_LoadData = playload AddPoints = scoreup HudUpdate = scoreset Hud_InitRings = ringinit Hud_Base = scoreinit AniArt_Load = efectwrt LevelArtPointers = mapinittbl ArtLoadCues = divdevtbl SonicDynPLC = playwrtpat Sonic 1 ColArray = scdtbl1/scdtbl Sonic 1 ColArray2 = scdtbl2 Sonic 2 ColArray = scdtbl3 Sonic 2 ColArray2 = scdtbl4 Sonic 1 ColCurveMap = scddirtbl1 Sonic 2 ColCurveMap = scddirtbl2 Kos_Z80 (Sonic 1 PCM driver) = pcm_top (followed by pcm_end at the end) Sonic 2 Nick Arcade objects (also referenced the leaked debug mode code): Obj01/Sonic = play00 Obj02/Tails = fox (probably) Obj03/Pathswapper = colichg Obj06/EHZ corkscrew = sloop Obj09/Sonic (special stage) = play01 Obj0B/Rotating CPZ floor = kaiten Obj0C/Small CPZ platform = prodai Obj10/Sonic (proto debug object) = play02 Obj12/HPZ emerald = gem Obj13/HPZ waterfall = wfall Obj14/HTZ seesaw = sisoo Obj14/HTZ seesaw ball = sball Obj18/Platform = shima Obj1F/GHZ Crabmeat = kani Obj21/HUD = score Obj22/GHZ Buzz Bomber = hachi Obj25/Ring = ring Obj26/Monitor = item Obj2B/GHZ Chopper = fish Obj36/Spikes = toge Obj38/Shield = baria Obj38/Invincibility stars = muteki Obj3B/GHZ purple rock = jyama Obj3D/GHZ boss = boss1 Obj3E/Animal prison = masin Obj41/Sonic 1 spring = sjump Obj41/Sonic 2 spring = bane Obj42/GHZ Newtron = kamere Obj44/GHZ wall = kageb Obj48/GHZ boss ball = btama Obj49/EHZ waterfall = taki Obj4A/Octopus = oct Obj4B/Buzzer = wasp Obj4C/Batbot = bbat/ba Obj4D/Rhinobot = stego Obj4E/Alligator bot = gator Obj4F/Dinobot = redz Obj50/Seahorse = seahorse Obj51/Skyhorse = skyhorse Obj52/Pirahna = bfish/bfish2/fish2 Obj54/Snail = snail Obj55/Boss parent = bossba Obj55/EHZ boss subtype = drillerguy Obj56/Boss explosion = billbomb Obj57/EHZ boss object 1 = bossdriller Obj58/EHZ boss object 2 = driller Obj79/Checkpoint = save Obj8A/Sonic 1 credits = staff Variables: MainCharacter = playerwk Camera_X_pos = scra_h_posit Camera_Y_pos = scra_v_posit Camera_BG_X_pos = scrb_h_posit Camera_BG_Y_pos = scrb_v_posit Camera_Min_Y_pos = scralim_up Camera_Max_Y_pos = scralim_n_down Camera_Min_Y_pos_Debug_Copy = editstack Camera_Max_Y_pos_Debug_Copy = editstack2 Game_Mode = gmmode Ctrl_1_Held = swdata1 Ctrl_1_Press = swdata1+1 Current_ZoneAndAct = stageno Current_Zone = stageno Current_Act = stageno+1 Debug_object = editno Debug_Accel_Timer = edittimer Debug_Speed = edittimer+1 v_ssrotate (Sonic 1) = rotspd v_ssangle (Sonic 1) = rotdir Object variables/SSTs: id = actno render_flags = actflg art_tile = sproffset mappings = patbase x_pos = xposi y_pos = yposi x_vel = xspeed y_vel = yspeed mapping_frame = patno anim = mstno status = cddat subtype = userflag Other information: Some of these other symbols were found in other data that hasn't been really properly documented out there yet. There's a whole section other symbols and even older code (I found an earlier version of the Emerald Hill boss and documented it here). Mappings and DPLCs were definitely done in assembly, possibly by hand. Sprite mappings are generally labelled as "XXXXXpat", with labels for each sprite frame generally being labelled as "XXXXXspNN". Tile data is labelled as "XXXXXcg". Sonic 1 special stage maps are labelled as 'rotmaptblN" Zones are referred to by their ID, not their name. PLC lists are just labelled as "ddevNN". There's a function that would load the Sonic 1 collision data if it was in Green Hill Zone, but it relies on how their development hardware worked, hence why it doesn't work in the build we have. An object's main routine index table is labelled as "XXXXX_move_tbl". An object's initialization routine is labelled as "XXXXXinit". An object's main update routine is labelled as "XXXXXmove". A common local label used when a free object slot was not found is ".worknai". There's actually a reference to a totally scrapped boss that appeared to initially been made for Chemical Plant. Said symbols are "vacumeguy" and "bossvac". Due to the nature of them using linking and XREFs, there's actually a couple of reused labels that are, of course, not exported. Sonic CD developers called the functions that refer to the animals being deleted with a bad future set and the badniks being destroyed with a good future set as "friend_suicide" and "enemy_suicide" respectively. I know that English wasn't their native tongue, but I found it amusing. Amy was called "emie" in Sonic CD's source code. The "I'm outta here" in Sonic CD routine is just called "bye". Of course, this isn't every symbol that's been leaked out, and I'm lacking on Sonic CD's for now, but it's a good chunk I have documented. This should be helpful on documenting the rest later on. A while ago, I did do a quick test of setting up every label in TouchResponse/pcol here. RAM and object variables aren't set up, though, just the code labels.
Just wanted to add that running a Sonic CD ELF file through objdump with the "-l" option while disassembling adds in the filenames and line numbers. The information is there. Example: Code: 813080c0 <action>: action(): 813080c0: 94 21 ff f0 stwu r1,-16(r1) C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:40 813080c4: 7c 08 02 a6 mflr r0 813080c8: 90 01 00 14 stw r0,20(r1) 813080cc: 93 e1 00 0c stw r31,12(r1) 813080d0: 93 c1 00 08 stw r30,8(r1) C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:44 813080d4: 3c 60 81 36 lis r3,-32458 813080d8: 3b e3 c2 c4 addi r31,r3,-15676 C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:45 813080dc: 3b c0 00 00 li r30,0 813080e0: 48 00 00 40 b 81308120 <action+0x60> C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:46 813080e4: 88 1f 00 00 lbz r0,0(r31) 813080e8: 28 00 00 00 cmplwi r0,0 813080ec: 41 82 00 2c beq 81308118 <action+0x58> C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:53 813080f0: 7f e3 fb 78 mr r3,r31 813080f4: 88 9f 00 00 lbz r4,0(r31) 813080f8: 38 04 ff ff addi r0,r4,-1 813080fc: 54 05 10 3a rlwinm r5,r0,2,0,29 81308100: 3c 80 81 35 lis r4,-32459 81308104: 38 04 42 70 addi r0,r4,17008 81308108: 7c 80 2a 14 add r4,r0,r5 8130810c: 81 84 00 00 lwz r12,0(r4) 81308110: 7d 89 03 a6 mtctr r12 81308114: 4e 80 04 21 bctrl C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:56 81308118: 3b de 00 01 addi r30,r30,1 8130811c: 3b ff 00 44 addi r31,r31,68 81308120: 2c 1e 00 80 cmpwi r30,128 81308124: 41 80 ff c0 blt 813080e4 <action+0x24> C:\project\GEMS\application\SonicCD\src\gc\main\ACTION.C:57 81308128: 83 e1 00 0c lwz r31,12(r1) 8130812c: 83 c1 00 08 lwz r30,8(r1) 81308130: 80 01 00 14 lwz r0,20(r1) 81308134: 7c 08 03 a6 mtlr r0 81308138: 38 21 00 10 addi r1,r1,16 8130813c: 4e 80 00 20 blr Also, structure variables names are included in the .debug section, including the ones for objects, but I'm not quite sure how to get them extracted.
I know, double post and all, but if anyone would like to take a look at R11A's ELF file, extracted ".debug" section, and info generated from objdump, I have them here. The debug section appears to be nonstandard, and I'm not sure how I could go about figuring it out at all. EDIT: lol figured it out
Took another dive into R11A.ELF and organized the symbols by section and filename: Spoiler Code: main\ACTION.C .text action speedset_0 speedset2 actionsub frameout patset spatset main\ACTSET.C .text flagwkclr actsetchk actsetinit actset tm_setchk actnoset actwkchk actwkchk2 frameout_s frameout_s00 frameout_s0 .bss pAsetadr_dummy pAsetadr_w pAsetadrz_w main\DAI_K.C .text dai_k dai_k_init dai_k_move k_move jumpchk_d .data k_daipat0 k_daipat1 k_daipat2 k_daipat k_daichg0 k_daichg dai_k_move_tbl pattbl_20 main\DAI_RD1.C .text dodai dodai_init dodai_move dodai_ud dodai_lr dodai_ride1 dodai_ride2 dodai_nA dodai_nB dodai_fix dodai_fal dodai_up dodai_upx dodai_rm dodai_lm dodai_sub dai_fout vfuta vfuta_init vfuta_move1 vfuta_move2 .data dai11a_pat1 dai11a_pat2 dai11a_pat3 dai11a_pattbl dodai_acttbl dai_hstbl_13 dai_mcnttbl_14 dodai_mtype vfuta_pat0 vfuta_pat1 vfutapat vfuta_tbl main\DIRCOL.C .text dircolm dircol dircol2 dircol_d dircol_d3 dircol_r dircol_r2 dircol_r3 dircol_l dircol_l2 dircol_l3 dircol_u dircol_u2 dircol_u3 emycol_u emycol_d emycol_d2 emycol_d3 dircolchk dircolchk1 main\DUMMY.C .text pa_set fadeout_s main\EDIT.C .text edit .bss CKeyTogle main\EMIE1.C .text emie1 emie1_init emie1_matu emie1_dakii emie1_tobii emie1_tobim emie_play setdirect speedset speedsetx speedsety jumpchk_d_0 pljumpset dakicheck empatchg emie1clrset emie1clrsetx heartset heart1 heart1_init heart1_move .data em1_tbl emie1_clr ht1_tbl main\EMIE1CG.C .data pat0 pat1 pat2 pat3 pat4 pat5 pat6 pat7 pat8 pat9 patA patB patC patD patE patF pat10 emie1pat moji_pchg run_pchg kiss_pchg stnd2_pchg moji2_pchg kyoro_pchg em_pchg main\ENEMY.C .text ene_ari ari_init ari_fall ari_move ene_chou chou_init chou_move ene_ka ka_init ka_move ka_turn ka_down ka_stop ene_kamemusi kamemusi_init kamemusi_fall kamemusi_move area kamemusi_stop kamemusi_stop1 kamemusi_tama kamemusi_tama_init tama tama_init tama_move ene_tagame_a tagame_init tagame_wait tagame_wait1 tagame_jump tagame_jump1 ene_tama .data ari_pchg00 ari_pchg01 ari_pchg ari0 ari1 ari2 ari3 ari_pat chou_pchg00 chou_pchg01 chou_pchg chou1e chou2e chou3e chou1b chou2b chou3b e_chou_pat b_chou_pat pchg_e_0 pchg_e_1 pchg_e pchg_b_0 pchg_b_1 pchg_b ka1e ka2e ka3e ka4e ka5e ka1b ka2b ka3b ka4b ka5b b_ka_pat e_kamem_pchg00 e_kamem_pchg01 e_kamem_pchg b_kamem_pchg00 b_kamem_pchg01 b_kamem_pchg kamem_pat00e kamem_pat00b kamem_pat01 kamem_pat02 e_kamem_pat b_kamem_pat tama_pchg00 tama_pchg tama_pat00 tama_pat01 tama_pat02 tama_pat03 tama_pat e_tagame_pchg00 e_tagame_pchg01 e_tagame_pchg b_tagame_pchg00 b_tagame_pchg01 b_tagame_pchg tagame_pat00 tagame_pat01 tagame_pat02 tagame_pat03e tagame_pat04e tagame_pat05e tagame_pat03b tagame_pat04b tagame_pat05b tagame_pat06 e_tagame_pat b_tagame_pat main\EQU.C .bss ta_flag clrspflg_save flagworkcnt flagworkcnt2 pl_suu main_play pl_air pltimeover_f plring_f2 pl_suu_f plring_f pltime_f plscore_f plring plscore play_start start_flag plpower_b plpower_m plpower_s plpower_a plflag plflag_s plxposi_s plyposi_s plring_s pltime_s time_flag scralim_down_s scra_h_posit_s scra_v_posit_s scrb_h_posit_s scrb_v_posit_s scrc_h_posit_s scrc_v_posit_s scrz_h_posit_s scrz_v_posit_s waterposi_m_s water_flag_s waterflag_s plring_f2_s generate_flag plsubchg_flag enkeino projector_flag special_flag conbine_flag enecgflg emie3end extrascore markerno gf_flag chibi_s tv_flag edittimer time_stop sys_pattim sys_patno sys_pattim2 sys_patno2 sys_pattim3 sys_patno3 sys_pattim4 sys_patno4 sys_ringtimer editstack editstack2 mapcheck blkno edit_user sysdirec prio_flag init_flag boss_sound shut_flag st6clrchg chibi_flag mapwrt_cnt startcolor colorcnt int_flg linkdata cltbladr ranum cgwrtcnt cgwrttim dmastack waterposi waterposi_m watermoveposi waterspeed water_flag waterflag waterflag2 scralim_n_left scralim_n_right scralim_n_up scralim_n_down scralim_left scralim_right scralim_up scralim_down scrar_no scra_h_keep scra_v_keep scra_hz scra_vz scra_vline scrh_flag scrv_flag scra_h_count scra_v_count scrb_h_count scrb_v_count scrc_h_count scrc_v_count scrz_h_count scrz_v_count limmoveflag playpatno1 kusya_flag plmaxspdwk pladdspdwk plretspdwk playpatno playwrtflag asetposi time_item backto_cnt scr_cnt demo_adr demo_cnt swbufcnt scra_hline bossflag bossstart loopmapno loopmapno2 ballmapno ballmapno2 watercoliflag waterstop mizuflag sekichyuflag plautoflag specflag dai2rmvflag emyscorecnt timebonus ringbonus bonus_f edplayflag ms_wflg lpKeepWork lpFadeFlag lpcolorwk4 lpcolorwk3 lpcolorwk2 lpcolorwk switchflag waterdirec clchgtim clchgcnt plposiwkadr scdadr byecnt1 byecnt0 asetadrz2 asetadrz asetadr2 asetadr actset_rno dirstk scrflagz scrflagc scrflagb scrflaga scr_timer scr_die scroll_start zone_flag scrz_v_posit scrz_h_posit scrc_v_posit scrc_h_posit scrb_v_posit scrb_h_posit scra_v_posit scra_h_posit divdevwk cgchgtim cgchgcnt pauseflag intcnt hscroll vscroll swdata2 swdata1 swdata gmmode actwk lphscrollbuff playposiwk pbuffer hscrollwork flowwk blockwk pmapwk linework col_x col_y scrflagzw scrflagcw scrflagbw scrflagaw scrz_v_posiw scrz_h_posiw scrc_v_posiw scrc_h_posiw scrb_v_posiw scrb_h_posiw scra_v_posiw scra_h_posiw systemtimer editmode editno flowercnt flowerposi debugflag demoflag debugwork pltime stageno gametimer gameflag flagwork main\ET1.C .text et m_init m_wait m_die m1wait a_hover .data tpat00 tpat01 tpat07 tpat02 tpat03 tpat04 tpat05 tpat06 pat_et tbl0sproffset tbl0 pchg0 pchg main\ETC.C .text sinset atan_sonic main\FCOL.C .text fcol fcol_d fcol_r fcol_u fcol_l scdend scdchk scdchk2 scdend_r scdchk_r scdchk2_r scramapad dirchk scdcnv st_elseDataChk st_wackyDataChk st_starDataChk st_metalDataChk CCset CSset main\GAME.C .text DLL_meminit DLL_memfree Print_Msg Get_vscroll Get_scra_h_posiw Get_scrb_h_posiw SetDebugFlag game game_init play_act_set scdset syspatchg back_to_cnt bye_cnt sdfdout sdfdin da_set main .data da_tbl_189 .bss Interupt_Counter PauseIcon SetGrid EAsprset ClrSpriteDebug WaveRequest CDPlay CDPause ChangeTileBmp WaveAllStop sMemSet sMemCpy sRandom sPrintf sOutputDebugString sOpenFile sReadFile sCloseFile lpghWnd sGetFileSize main\GOAL.C .text gene gene_init gene_move0 gene_move1 kira_set kira_move gene_coli bring2 bring2init bring2move0 bring2move1 bigring bring_init bring_move0 bring_move1 bring_coli mosugu mosug_init mosug_move0 mosug_move1 offset_set goal goal_init goal_move0 goal_move1 goal_move2 goal_move3 .data gene_tbl bring2_tbl bigring_tbl mosugu_tbl goal_tbl main\IO.C .text SWdataSet scrinit main\ITEM.C .text timedisp td_init td_move t_item t_item_init t_item_move0 t_item_move1 t_item_move2 flagwkadr ride_on_chk_i item iteminit itemmove itemmove2 itemmove3 itemget powerup_init item2 item2init item2move item2die error_item .data itemchg0 itemchg1 itemchg2 itemchg3 itemchg4 itemchg5 itemchg6 itemchg7 itemchg8 itemchg9 itemchg ite00 ite01 ite02 ite03 ite04 ite05 ite06 ite07 ite08 ite09 ite0a ite0b ite0c ite0d ite0e ite0f ite10 ite11 ite12 ite13 itempat cor00 cor01 cor02 cor03 cor04 cor05 cor06 cor07 cor08 cor09 cor0a cor0b cor0c cor0d cor0e cor0f corepat main\PLAYER.C .text bye_chk play00 muteki_set play00init mizuki_set mapno_chk scr_h play00move playpowercnt playposiwkset plwaterchk playsave backto_chk play00walk play00jump ball00walk ball00jump chk11 levermove lmovecol plwalk_l plwalk_r balllmove ballwalk_l ballwalk_r jumpmove limitchk ballchk ballset jumpchk jumpchk2 keispd keispd2 fallchk direcchg jumpcolchk jumpcolsub jumpcolsub0 play00damage play00damage_sub play00die play00die_sub play00erase loopchk st7_x patchgmain patchgmain2 playrunchg playrunchg2 playrunchg3 platetc_chg little_runchg little_patchg frip_spd .bss WaveClear Brake_Req Brake_Sw main\PLAYPAT1.C .data pat00 pat01 pat02 pat03 pat04 pat05 pat06 pat07 pat08 pat09 pat0a pat0b pat0c pat0d pat0e pat0f pat10 pat11 pat12 pat13 pat14 pat15 pat16 pat17 pat18 pat19 pat1a pat1b pat1c pat1d pat1e pat1f pat20 pat21 pat22 pat23 pat24 pat25 pat26 pat27 pat28 pat29 pat2a pat2b pat2c pat2d pat2e pat2f pat30 pat31 pat32 pat33 pat34 pat35 pat36 pat37 pat38 pat39 pat3a pat3b pat3c pat3d pat3e pat3f pat40 pat41 pat42 pat43 pat44 pat45 pat46 pat47 pat48 pat49 pat4a pat4b pat4c pat4d pat4e pat4f pat50 pat51 pat52 pat53 pat54 pat55 pat56 pat57 pat58 pat59 pat5a pat5b pat5c pat5d pat5e pat5f pat60 pat61 pat62 pat63 pat64 pat65 pat66 pat67 pat68 pat69 pat6a pat6b pat6c pat6d pat6e pat6f pat70 pat71 pat72 pat73 pat74 pat75 pat76 pat77 pat78 pat79 pat7a pat7b pat7c pat7d pat7e pat7f pat80 pat81 pat82 pat83 pat84 pat85 pat86 pat87 pat88 pat89 pat8a pat8b pat8c pat8d pat8e pat8f pat90 pat91 pat92 pat93 pat94 pat95 pat96 pat97 pat98 pat99 pat9a pat9b pat9c pat9d pat9e pat9f pata0 pata1 pata2 pata3 pata4 pata5 pata6 pata7 pata8 pata9 pataa patab patac patad patae pataf patb0 patb1 patb2 patb3 patb4 patb5 patb6 patb7 patb8 patb9 patba patbb patbc patbd patbe patbf patc0 patc1 patc2 patc3 patc4 patc5 sncpat main\PLAYSP.C .text playsp main\PLAYSUB.C .text patchg playsave0 marker marker_init marker_move0 marker_move1 marker_move2 plairset tensuu_set tensuu0 bakuha baku_init baku_move baku_die flower flow_init flow_move0 flow_move1 flow_sub flow_sub1 flow_move2 flow_move3 mizukiri mizuki_init mizuki_move mizuki_move2 futa ride_on_chk_f futa_init futa_move futa_move2 futa_move3 exit2_set col_chk exit2 exit2_init exit2_move exit2_erase baria bariainit bariamove mutekimove backtomove muteki_sub actionsub0 ball ball_init ball_move ball_ball ball_rd7 ball_coli .data flowchg0 flowchg1 flowchg2 flowchg3 flowchg flo00 flo01 flo02 flo03 flo04 flo05 flo06 flo07 flow_pat main\PLCHG.C .data plchg00 plchg01 plchg02 plchg03 plchg04 plchg05 plchg06 plchg07 plchg08 plchg09 plchg10 plchg11 plchg12 plchg13 plchg14 plchg15 plchg16 plchg17 plchg18 plchg19 plchg20 plchg21 plchg22 plchg23 plchg24 plchg25 plchg26 plchg27 plchg28 plchg29 plchg30 plchg31 plchg32 plchg33 plchg34 plchg35 plchg36 plchg37 plchg38 plchg39 plchg40 plchg41 plchg42 plchg43 plchg44 plchg45 plchg46 plchg47 plchg48 plchg49 plchg50 plchg51 plchg52 plchg53 plchg54 plchg55 plchg56 plchg57 playchg main\RIDECHK.C .text ride_on_clr ride_on_set hitchk_u ridechk ride_on_chk hitchk hit_v hit_x push_set push_clr hit_y hit_yu hit_yu1 hit_yu0 hit_e side_coli hit_set hit_clr main\RING.C .text ring ringinit_0 ringmove ringget ringgetsub ringdie ringerase flyring flyringinit flyringmove flyringget flyringdie flyringerase .data ringsp0 ringsp1 ringsp2 ringsp3 ringsp4 ringsp5 ringsp6 ringsp7 ringsp8 ringpat ringchg0 ringchg1 ringchg2 ringchg main\SCORE.C .text tensuu ten_init ten_move score score_init score_move scoreup scoreset ringinit scoreinit posiwrt bonuswrt ringwrt scorewrt scorewrt2 posiwrt0 playsuuwrt timewrt1 timewrt timewrt0 .data subtbl subtblh4 tenpat0 tenpat1 tenpat2 tenpat3 tenpat4 tenpat5 tenpat scorepat0 scorepat1 scorepat2 scorepat3 scorepat scoreinittbl ringinittbl main\SCRCHK.C .text scrchk zone1chk zone11chk zone12chk zone13chk zone3chk zone31chk zone33chk zone6chk zone5chk zone51chk zone53chk zone8chk zone81chk zone83chk zone4chk zone41chk zone42chk zone4chk zone7chk zone71chk zone72chk zone73chk bossclr_scr bossclr_scrset main\SPRING.C .text iwa iwa_init iwa_move koma koma_init koma_move koma_move2 spring_d spr_d_init spr_d_move spring sjumpinit ride_on_chk_s sjumpmove sjumpmove2 sjumpmove3 ride_on_chk_s1 sdushmove sdushmove2 sdushmove3 ride_on_chk_s2 sjump2move sjump2move2 sjump2move3 sjump3move sjump3move2 sjump3move3 .data spat00 spat01 spat02 spat03 spat04 spat05 spat06 spat07 spat08 kpat00 kpat01 ipat00 spat10 spat11 spat12 spat13 spat14 spat15 spat16 spat17 spat18 springpat spring90pat spring45pat springpat2 spring90pat2 spring45pat2 komapat iwapat springchg0 springchg komachg0 komachg sjump_move_tbl main\SUICIDE.C .text enemy_suicide friend_suicide main\TAKI.C .text taki taki_init taki_move jisin_set jisin .data shibukichg0 shibukichg shibuki0 shibuki1 shibukipat taki_move_tbl main\TBL0.C .data genechg0 genechg1 genechg genepat0 genepat1 genepat2 genepat3 genepat4 genepat5 genepat6 genepat7 genepat8 genepat bringchg0 bringchg bringpat0 bringpat1 bringpat2 bringpat3 bringpat bring2chg0 bring2chg bring2pat0 bring2pat1 bring2pat2 bring2pat3 bring2pat4 bring2pat5 bring2pat6 bring2pat7 bring2pat goalchg0 goalchg goalsp0 goalsp1 goalsp2 goalsp3 goalsp4 goalsp5 goalpat main\TBL1.C .data bariachg0 bariachg1 bariachg2 bariachg3 bariachg4 bariachg5 bariachg6 bariachg7 bariachg8 bariachg bar00 bar01 bar02 bar03 bar04 bar05 bar06 bar07 bar08 bar09 bar0a bar0b bar0c bariapat exit2chg0 exit2chg1 exit2chg2 exit2chg exi00 exi01 exi02 exi03 exi04 exi05 exi06 exit2pat futachg0 futachg fut00 fut01 futapat mizukichg0 mizukichg miz00 miz01 miz02 mizukipat baku_chg0 baku_chg1 bakuchg bak00 bak01 bak02 bak03 bak04 bak05 bak06 bakupat mkchg markerchg pat00_0 pat01_0 pat02_0 pat03_0 markerpat main\TREE.C .text hoshi hoshi_init hoshi_move kasoku0 k0_init k0_move kasoku kasoku_init kasoku_move .data hoshi_tbl k0_tbl kasoku_tbl hoshipat0 hoshipat1 hoshipat kasokuchg0 kasokuchg1 kasokuchg2 kasokuchg kasokupat_a kasokupat_b kasokupat_c kasokupat_d kasokupat_e kasokupat_f kasokupat_g kasokupat_h kasokupat_i kasokupat_j kasokupat main\ZONE.C .text over over_init over_move title title_init title_move0 title_move1 title_back0 title_back1 title_wait clear clear_init0 clear_init clear_move0 clear_move1 clear_move2 clear_wait .data game0 game1 gamepat time0 time1 timepat gotpat0 gotpat1 gotpat2 gotpat3 madepat0 madepat1 madepat2 madepat3 bonuspat bonuspat0 gotpat gotpat_0 madepat madepat_0 cleartbl .bss ClearSountWait WaitCount main\ZONETBL1.C .data titletbl titlepat0 titlepat1 titlepat2 titlepat3 titlepat4 titlepat5 titlepat6 titlepat7 titlepat8 title_pat main\R1\ACT11A.C .text noact .data act_tbl main\R1\COL1A.C .text clchgctr colchg11a clchg_sub0 fadein0 fadein0_new fadein1 fadein2 fadeout_new fadeout1 fadeout2 flashin flashin_new flashin1 flashin2 flashout_new flashout1 flashout2 colorset colorset2 colorset00 FadeProc .data clst1_1a0 clst1_1a1 advacolor advacolor2 gamecolor zone1colora0 zone1colora1 zone1colora colortbl col1a0cnt col1a0col col1a1cnt col1a1col col1a2cnt col1a2col col1a3cnt col1a3col col1a4cnt col1a4col col1a5cnt col1a5col .bss FadeCount main\R1\DEV11A.C .data mapinittbl main\R1\EDTBL11A.C .data edit_tbl main\R1\KOWASI1.C .text kowasi m_init_0 m_wait_0 m_down .data spr_kowasi00 spr_kowasi01 spr_kowasi02 spr_kowasi03 spr_kowasi04 spr_kowasi05 spr_kowasi06 spr_kowasi07 spr_kowasi08 spr_kowasi09 spr_kowasi0a spr_kowasi0b spr_kowasi0c spr_kowasi0d pat_kowasi main\R1\KUZUR11A.C .data pata00 patbase_kuzure_a tbla00 tbla patc00 patc01 patc02 patc03 patc04 patc05 patc06 patc patb00 patb01 patb02 patb03 patb04 patbase_kuzure_b tblb00 tblb01 tblb02 tblb03 tblb04 tblb patd00 patd01 patd02 patd03 patd04 patd05 patd main\R1\KUZURE.C .text kuzureru_tikei acta_init acta_check actb_wait actb_down actb_init_a actb_init_b main\R1\SCR11A.C .text enecginit divdevset scr_set playposiset scrbinit scroll scroll_h scrh_move right_check left_check scroll_v sv_move_main sv_move_main1 sv_move_main2 sv_move_sub2 sv_move_sub sv_move_minus scrv_up_ch sv_move_plus scrv_down_ch scrv_move scrollb_v scrollb_h scrollc_h scrollz_h scrollwrt scrollwrtb hblockwrt hblockwrt1 vblockwrt blockwrt mapadrset mapadrset1 mapadrset99 mapadrset2 block_wrt block_chk vramadrset vramadrset1 vramadrset0 vramadrset99 scr11a_test mapwrt mapwrt2 mapwrt3 mapwrt_z81a mapwrt_sub mapinit mapset .data z81awrttbl vblockwrtbtbl mapwrt_tbl main\R1\SHOOT1.C .text kage kage_init kage_move ana kage1_init kage1_move0 kage1_move1 kage1_chk kage1_clr shooter shooterinit shootermove shootermove2 shootermove3 shooterspdset mspd_set .data kag00 kag01 kagepat ana00 kage1pat shooterposi_0 shooterposi_1 shooterposi_2 shooterpositbl main\R1\SISAKE.C .text colli_pl_sikake_d colli_pl_sikake tobita1 tobita_init tobita_stop_r tobita_stop_l tobita_ride_r tobita_ride_l tobita_yure_r tobita_yure_l hariyama hari_init hari_normal .data tobita1chg0 tobita1chg1 tobita1chg2 tobitastop1 tobitastop2 tobita1chg tobita_a tobita_b tobita_c tobita_r_a tobita_r_b tobita_r_c tobita1_pat pat0_0 hari12pat main\R1\Z11ACT.C .data dummyarea asettbl asettblz main\BLOCK.C .text block block_init block_move block_move2 block_move3 block_move4 block_move5 block_move6 block_ride ride_on_chk_b .data block_tbl blockchg0 blockchg1 blockchg2 blockchg block0 block1 block2 block3 block4 block5 blockpat main\LOADER2.C .text ShortSWAP GetRoundStr ReadBlockMap ReadScrolMap soundset .data SeToWavTbl main\BMP.C .bss SprBmp main\R1\COLI1.C .text pcol CollitblDataXchk CollitblDataYchk ColliHitChk pcolitem pcolnomal pcolplay2 pcolplay pcole playdamagechk playdamageset playdieset pcolspecial eggman_chk yago main_attack .data escoretbl colitbl .bss bCarry main\R1\Z11ATBL.C .data scddirtbl scdtblwk scdtblwk2 zone1scd mapwka mapwkb main\SAVE.C .text playloadb playload main\R1\FRIEND1.C .text t_roll rev_h set_sproffset friend t_init t_move t_movie p_init p_move p_movie .data pchg00 pchg01 pchg10 pchg0_0 pchg1 spr_flicky1 spr_flicky2 spr_ricky1 spr_ricky2 spr_ricky3 spr_ricky4 spr_friend0 spr_ricky5 pat_friend0 pat_friend1 tbl0sproffset main\R1\MOVIE1.C .text move1 die mm_init mm_wait mm_die m_baku mm1wait sub s_init s_move .data movie1_pchg00 movie1_pchg01 movie1_pchg spr_movie1 spr_movie2 spr_movie3 spr_movie4 spr_movie5 spr_movie0 pat_movie tbl0_0 Spoiler Code: main\ACTION.C RunObjects ObjectMoveAndFall ObjectMove DisplaySprite DeleteObject BuildSprites main\ACTSET.C ObjectsManager SingleObjLoad SingleObjLoad2 MarkObjGone main\DAI_K.C Spinning Platform main\DAI_RD1.C Platform Vertical flapping door main\DIRCOL.C CalcRoomInFront CalcRoomOverHead CheckFloorDist ObjCheckFloorDist CheckRightWallDist ObjCheckRightWallDist CheckCeilingDist ObjCheckCeilingDist CheckLeftWallDist ObjCheckLeftWallDist main\DUMMY.C Routine to set object's tile ID Routine to fade out music main\EDIT.C DebugMode main\EMIE1.C Amy main\EMIE1CG.C Amy mappings and animations main\ENEMY.C Anton Pata-Bata Mosqui Kamemusi Tamabboh(?) Taga-Taga main\EQU.C Level variables main\ET1.C Robot generator main\ETC.C CalcSine CalcAngle main\FCOL.C AnglePos Find_Tile FindFloor FindWall ConvertCollisionArray main\GAME.C Main level routine Routine to spawn player LoadCollisionIndexes ChangeRingFrame Routine to update time warp timer Routine to update bored timer Routine to pause music Routine to unpause music Routine to play level music main\GOAL.C Flower capsule Big ring Goal post Signpost main\IO.C ReadJoypads ClearScreen main\ITEM.C Monitor/Time post main\PLAYER.C Sonic main\PLAYPAT1.C Sonic mappings main\PLAYSP.C Routine for handling special level collision main\PLAYSUB.C AnimateSprite Checkpoint ResumeMusic Test badnik Explosion Flower Spin tunnel waterfall splash Spin tunnel door Spin tunnel door splash Powerup (shield, invincibility stars, time warp stars) Spin tunnel tag main\PLCHG.C Sonic animations main\RIDECHK.C SolidObject main\RING.C Ring Lost rings from getting hurt main\SCORE.C HUD object AddPoints HudUpdate Hud_InitRings HudBase main\SCRCHK.C RunDynamicLevelEvents main\SPRING.C Moving spring with wheel object Spring object main\SUICIDE.C Time zone checks for animals and badniks main\TAKI.C Scrapped waterfall effect Scrapped earthquake effect main\TBL0.C Flower capsule animations and mappings Big ring animations and mappings Signpost animations and mappings main\TBL1.C Powerup animations and mappings Spin tunnel door splash animations and mappings Spin tunnel door animations and mappings Spin tunnel waterfall splash animations and mappings Explosion animations and mappings Checkpoint animations and mappings main\TREE.C 3D star plant 3D loop/ramp booster main\ZONE.C Game over Title card End results card main\ZONETBL1.C Title card mappings main\R1\ACT11A.C Null object ObjectIndex main\R1\COL1A.C PalCycle_Load Pal_FadeFromBlack Pal_FadeToBlack Pal_FadeFromWhite Pal_FadeToWhite PalLoad_ForFade PalLoad_Now main\R1\DEV11A.C LevelArtPointers ArtLoadCues(?) main\R1\EDTBL11A.C JmpTbl_DbgObjLists main\R1\KOWASI1.C Breakable wall main\R1\KUZUR11A.C Collapsing platform mappings main\R1\KUZURE.C Collapsing platform main\R1\SCR11A.C Routine to initialize object graphics LoadPLC LevelSizeLoad InitCameraValues DeformBgLayer ScrollHoriz ScrollVerti Bg_Scroll_Y BGScroll_Block1 BGScroll_Block2 BGScroll_Block3 LoadTilesAsYouMove DrawBlocks_LR DrawBlocks_TB DrawBlock GetBlock Routine to place a block at a position Routine to check if a block is on screen CalcBlockVRAMPos DrawInitialBG loadZoneBlockMaps loadLevelLayout main\R1\SHOOT1.C Hollow log background Sonic shaped hole Hidden spin tunnel main\R1\SISAKE.C Springboard Spikes main\R1\Z11ACT.C Object layout data main\BLOCK.C Small platform main\LOADER2.C Gems Collection specific loading routines PlaySound main\R1\COLI1.C TouchResponse main\R1\Z11ATBL.C ColCurveMap ColArray ColArray2 Level collision data Level layout data main\SAVE.C Routine for loading data saved at checkpoint Routine for loading data saved in time travel main\R1\FRIEND1.C Animal main\R1\MOVIE1.C Metal Sonic projector
I would like to add something regarding ROM sections. I've been taking a look at Sonic Jam, and I realized that each game has been split up into different files. In Sonic 1's case, there's "AC.SN1", "ACTTBL.SN1" (also ACTTBL_E.SN1" and "ACTTBL_N.SN1", because Jam has different difficulty settings), "DATA.SN1", and "TBL.SN1". "AC" is the game code, "DATA" holds compressed graphics, tilemaps, and stage blocks/chunks. "TBL" holds collision data, uncompressed graphics, and stage layouts (including special stages), and "ACTTBL" holds object layouts. I then took a look at the disassembly, and I noticed that the padding between sections corresponds to how the game was split up in Jam. "DATA" starts off with the Sega Logo graphics, and in the original ROM, you can see the padding placed before said graphics. Code: rept $300 dc.b $FF endm Nem_SegaLogo: binclude "artnem/Sega Logo (JP1).bin" ; large Sega logo even The last piece of data in the "DATA" file is the graphics for the logo in the ending, and look at that, another piece of padding right after it in the original ROM: Code: Nem_EndStH: binclude "artnem/Ending - StH Logo.bin" even if Revision=0 rept $104 dc.b $FF ; why? endm else rept $40 dc.b $FF endm endif After this bit of padding is the stage collision data, which so happens to be the "TBL" section Code: if Revision=0 rept $104 dc.b $FF ; why? endm else rept $40 dc.b $FF endm endif ; --------------------------------------------------------------------------- ; Collision data ; --------------------------------------------------------------------------- AngleMap: binclude "collide/Angle Map.bin" even CollArray1: binclude "collide/Collision Array (Normal).bin" even ... The last bit of data in the "TBL" file is the graphics for the special stage ring, and in the original ROM, you can see another bit of padding placed after it: Code: Art_BigRing: binclude "artunc/Giant Ring.bin" even align $100 And after that are the stage object layouts, aka "ACTTBL": Code: align $100 ; --------------------------------------------------------------------------- ; Sprite locations index ; --------------------------------------------------------------------------- ObjPos_Index: ; GHZ dc.w ObjPos_GHZ1-ObjPos_Index, ObjPos_Null-ObjPos_Index dc.w ObjPos_GHZ2-ObjPos_Index, ObjPos_Null-ObjPos_Index dc.w ObjPos_GHZ3-ObjPos_Index, ObjPos_Null-ObjPos_Index dc.w ObjPos_GHZ1-ObjPos_Index, ObjPos_Null-ObjPos_Index The "ACTTBL" file ends with the last object layout, and, of course, in the original ROM, after that is some more padding: Code: ObjPos_Null: dc.b $FF, $FF, 0, 0, 0, 0 if Revision=0 rept $62A dc.b $FF endm else rept $63C dc.b $FF endm endif Which is then followed by the sound driver after. So, based on this info, you can see that the original game had multiple ROM sections: the code ("AC"), compressed graphics, tilemaps, and stage blocks and chunks ("DATA"), stage collision, layouts (both regular and special stages), and uncompressed graphics ("TBL"), stage object layouts ("ACTTBL"), and then finally the sound driver and data. This is why such "useless" padding exists. Each section was aligned. Sonic 2 works similarly, but it also adds the "RINGACT" (ring layouts) and "TBL2" (additional compressed graphics, placed between the sound driver + drum samples and music + SFX data) sections.
So, I was taking a look at the Sonic 2 patent, and I saw this (fyi, yes I know this isn't anything new, but there's just some things I feel like pointing out for the sake of this thread) The patent has some pretty interesting things to note. Objects are indeed called sprites, with its structure of variables in RAM being a "sprite status table", which definitely shows where we got that name from. Stuff related to graphics and animation line up with the official variables names as well. The patent also goes into detail about how the corkscrew, pathswapping mechanism, and 2 player mode work, including detail on how the teleportation/swap monitor works. From what I can tell, 16x16 blocks are referred to as "graphics (path) blocks", which its associated collision IDs referring to "collision blocks". Chunks don't seem to be referenced, since with collision and path swapping, that all happens on the block level, not the chunk level, so chunks are irrelevant in this case. The loop used to demonstrate the system is basically just a generic image referred to as just an "overlay path". As such, the sectioning shown in these images are on the block level. Here's this tidbit from how the corkscrew works I wanna quickly mention. (sloop = the corkscrew in EHZ, called a "shuttle loop") The "ride flag" that it refers to is bit 3 in the status SST ($22) for player 1, or bit 4 for player 2. And sure enough, the corkscrew object (Obj06) makes use of this flag to indicate that the player is running on it. Not quite sure why they refer to it or the "hit" flag as separate bytes, though.
Okay, so this is my guess for what "div" means here. Maybe it means "divide", since the main function is to effectively split graphics data into chunks that are loaded gradually as the game plays, as to avoid freezing the entire game just to load new graphics.
So, those unused variables related to camera scrolling in Sonic 1 and Sonic CD. I have their official names right here, taken from Sonic Gems Collection: scrar_no = 0xFFF730 / v_unused1 Set to first word in stage's boundary data, which is always 4, but could be changed on a per stage basis scra_h_keep = 0xFFF732 / v_limitleft Set to the initial stage's left boundary + 0x240 scrh_flag = 0xFFF740 / v_unused Cleared on initialization scrv_flag = 0xFFF741 / v_unused Cleared on initialization scr_die = 0xFFF746 / v_unused Cleared on initialization scr_timer = 0xFFF748 / v_unused1 Cleared on initialization I think it's also worth reminding that scra_v_line (0xFFF73E / v_lookshift), the variable that tracks the camera's vertical focal point (for looking up and down), is set to the last word in the stage's boundary data, which is always 0x60, but could be changed on a per stage basis. Makes me wonder what they were planning...
I took a look at the prototype Sonic 1 code, and these 2 do have some functionality. scrh_flag is set if the left and right stage boundaries are the same, and scrv_flag is set if the top and bottom stage boundaries are the same. While the stage is running, they get checked each frame. If scrh_flag is set, it jumps to loc_4258, and then comes back around to check scrv_flag, which jumps to loc_4276 if set, and then comes back around again to continue the scrolling function. loc_4258 simply just slowly scrolls the camera towards the left boundary's position. loc_4276 does the same thing, but vertically, and with the top boundary (plus 0x20, I assume this is might have been related to old HUD code that displayed on the top 32 pixels of the screen? There is unused code that draws a chain of life icons on the window plane, but it does it on the bottom 32 pixels of the screen instead...). Perhaps this is some sort of auto-scroll functionality that ended up getting removed in the final game? Interesting how it can basically do that for each individual axis, and not just none or both at the same time. And no, this code was not reused for later games that do have auto-scrolling.
So, what's up with background Z in the Sonic 1 prototype? Let's start from the top So, there's a bit of code for testing something related to H-BLANK interrupts. If we look at its code, not only can we see that it affects the H-BLANK interrupt position, but it also shifts "scrz_v_posit", or background Z's Y position. This is the only part in the prototype in which scrz_v_posit is directly manipulated. Let's take a look at scrz_h_posit, background Z's X position and its relation to stage drawing. There are 3 functions related to drawing backgrounds: scrollwrtb, scrollwrtc, and scrollwrtz. scrollwrtb and scrollwrtc are used, but scrollwrtz is completely unreferenced. scrollwrtb and scrollwrtc call the normal VDP command calculation function vramadrset, but scrollwrtz calls an alternate function that is called vramadrset2. The difference between them is that vramadrset is for writing to VRAM range 0xC000-0xFFFF, while vramadrset2 is for writing to VRAM range 0x8000-0xBFFF. scrollwrtz's functionality is that it draws a stack of 3 blocks on either the left or right side of the screen, with the Y position being calculated from scrz_v_posit. The way it calculates this Y position explains the inverted movement of its value as seen in watercnt. On top of this, there is also an unused function for initializing background Z's drawing. What's notable is that it too uses vramadrset2, and unlike the drawing update function, this actually has a little setup code that gives a bit extra information. As established before, background Z's drawing range is always 3 blocks high, and on initialization, it draws 3 rows of blocks at the bottom of the screen. But, the most interesting part to me is the 2nd line, where d2 is set to 0x6000. So, with it using vramadrset2, that means the calculated VDP command is set to affect VRAM address range 0x8000-0xBFFF. d2 is used in the drawing code to effectively pick out which segment in that address range to work with. The foreground uses 0x4000, which means starting with 0xC000 when using vramadrset, and the background uses 0x6000, which means starting from 0xE000. In this case, with d2 being 0x6000, this means background Z's segment affects range 0xA000-0xAFFF. So, now let's take a look at the unused H-BLANK interrupt handler. Here, it changes the VRAM address of the plane B and the sprite table. The stuff with the sprite table doesn't seem to effectively do anything, as it just resets the address to the same default value that it always has and loads from the same standard sprite table buffer as used throughout the game. It probably would have evolved in some way. Regardless, it does lead me to believe that background Z object sprites would have overridden the general game sprites, too. However, I would like to point out that plane B's address gets set to... 0xA000! The same base address used for background Z drawing! Now it makes sense why scrz_v_posit was used for the H-BLANK interrupt positioning function. And look here, during initialization, the H-BLANK interrupt counter is set to around 3 blocks above the bottom of the screen, much like how 3 rows of blocks are drawn at the bottom of the screen for background Z! The only other tidbits that can be explored from here are the fact that background Z's X and Y position get stored into a couple of unused variables (presumably meant to be used while swapping out plane B's address), the option for certain objects to scroll along background Z (and also B and C) and an unfinished implementation of a background Z specific object layout manager. With the last one, all it was programmed to do was continually spawn objects whose X positions are less than (scrz_h_posit + 0x200) & 0xFF80. So, from what can be gathered here, background Z was going to be this separate plane, whose graphics are drawn in 3 block tall segments, and was designed to override plane B via H-BLANK interrupt at whatever Y position it is set to (scrz_v_posit). I could not tell you for certain what exactly it's for, especially since this was clearly left unfinished, but yeah.
So, as it is documented, source code for the debug mode was found in the Sonic 2 Nick Arcade prototype. Some people have already noticed already, but Sonic 1's debug item lists are actually at the bottom, past the "end" directive (minus the one for Green Hill, but that's already normally in the ROM, so...), so if you want more Sonic 1 symbols, here you go: Code: edit1tbl: dc.w 14 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw kani_act,kanipat,$0400,0,$00 ;3: dcblw hachi_act,hachipat,$0444,0,$00 ;4: dcblw fish_act,fishpat,$0470,0,$00 ;5: dcblw toge_act,togepat,$04a0,0,$00 ;6: dcblw shima_act,shimapat2,$4000,0,$00 ;7: dcblw jyama_act,jyamapat,$66c0,0,$00 ;8: dcblw musi_act,musipat,$04e0,0,$00 ;9: dcblw sjump_act,sjumppat,$04a8,0,$00 ;10: dcblw kamere_act,kamerepat,$249b,0,$00 ;11: dcblw kageb_act,kagebpat,$434c,0,$00 ;12: dcblw save_act,savepat,$26bc,0,$01 ;13: dcblw colichg_act,colichgpat,$26bc,0,$00 ;14: ----- edit2tbl: dc.w 25 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw sjump_act,sjumppat,$0523,0,$00 ;3: dcblw fish2_act,fish2pat,$2486,0,$08 ;4: dcblw mogura_act,mogurapat,$84a6,2,$00 ;5: dcblw yari_act,yaripat,$03cc,0,$00 ;6: dcblw yari_act,yaripat,$03cc,3,$02 ;7: dcblw box_act,boxpat,$43de,0,$00 ;8: dcblw switch2_act,switch2pat,$0513,0,$00 ;9: dcblw toge_act,togepat,$051b,0,$00 ;10: dcblw dai_act,udaipat,$43bc,0,$04 ;11: dcblw dai3_act,dai3pat,$43e6,0,$01 ;12: dcblw dai3_act,dai3pat,$43e6,1,$13 ;13: dcblw dai3_act,dai3pat,$43e6,0,$05 ;14: dcblw kazari_act,kazaripat,$443e,0,$00 ;15: dcblw dai3_act,dai3pat,$43e6,2,$27 ;16: dcblw dai3_act,dai3pat,$43e6,3,$30 ;17: dcblw kassya_act,kassyapat,$03f6,0,$7f ;18: dcblw uni_act,unipat,$0467,0,$00 ;19: dcblw awa_act,awapat,$8348,19,$84 ;20: dcblw mizu_act,mizupat,$c259,2,$02 ;21: dcblw mizu_act,mizupat,$c259,9,$09 ;22: dcblw bou_act,boupat,$43de,0,$00 ;23: dcblw ben_act,benpat,$4328,0,$02 ;24: dcblw save_act,savepat,$26bc,0,$01 ;25: * dcblw dai4_act,dai4pat,$41f0,4,$80 ;25: edit3tbl: dc.w 18 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw hachi_act,hachipat,$0444,0,$00 ;3: dcblw toge_act,togepat,$051b,0,$00 ;4: dcblw sjump_act,sjumppat,$0523,0,$00 ;5: dcblw mfire_act,firepat,$0345,0,$00 ;6: dcblw fblock_act,fblockpat,$4000,0,$00 ;7: dcblw myogan_act,yoganpat,$63a8,0,$00 ;8: dcblw yogan2_act,yogan2pat,$63a8,0,$00 ;9: dcblw box_act,boxpat,$42b8,0,$00 ;10: dcblw yado_act,yadopat,$247b,0,$00 ;11: dcblw bryuka_act,bryukapat,$42b8,0,$00 ;12: dcblw dai_act,daipat,$02b8,0,$00 ;13: dcblw break2_act,break2pat,$62b8,0,$00 ;14: dcblw yoganc_act,yogancpat,$8680,0,$00 ;15: dcblw bat_act,batpat,$04b8,0,$00 ;16: dcblw imo_act,imopat,$24ff,0,$00 ;17: dcblw save_act,savepat,$26bc,0,$01 ;18: edit4tbl: dc.w 15 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw elev_act,elevpat,$4000,0,$00 ;3: dcblw break2_act,break2pat,$44e0,2,$00 ;4: dcblw shima_act,z4daipat,$4000,0,$00 ;5: dcblw pedal_act,pedalpat,$4000,0,$00 ;6: dcblw step_act,steppat,$4000,0,$00 ;7: dcblw fun_act,funpat,$43a0,0,$00 ;8: dcblw sisoo_act,sisoopat,$0374,0,$00 ;9: dcblw sjump_act,sjumppat,$0523,0,$00 ;10: dcblw mfire_act,firepat,$0480,0,$00 ;11: dcblw bgspr_act,hassyapat,$44d8,0,$00 ;12: dcblw brobo_act,brobopat,$0400,0,$00 ;13: dcblw uni_act,unipat,$2429,0,$00 ;14: dcblw save_act,savepat,$26bc,0,$01 ;15: edit5tbl: dc.w 15 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw toge_act,togepat,$051b,0,$00 ;3: dcblw sjump_act,sjumppat,$0523,0,$00 ;4: dcblw aruma_act,arumapat,$04b8,0,$00 ;5: dcblw signal_act,signalpat,$0000,0,$00 ;6: dcblw bobin_act,bobinpat,$0380,0,$00 ;7: dcblw kani_act,kanipat,$0400,0,$00 ;8: dcblw hachi_act,hachipat,$0444,0,$00 ;9: dcblw yado_act,yadopat,$247b,0,$00 ;10: dcblw shima_act,z5daipat,$4000,0,$00 ;11: dcblw dai2_act,dai2pat,$4000,0,$00 ;12: dcblw switch2_act,switch2pat,$0513,0,$00 ;13: dcblw imo_act,imopat,$24ff,0,$00 ;14: dcblw save_act,savepat,$26bc,0,$01 ;15: edit6tbl: dc.w 29 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw item_act,itempat,$0680,0,$00 ;2: dcblw brobo_act,brobopat,$0400,0,$00 ;3: dcblw uni_act,unipat,$0429,0,$00 ;4: dcblw imo_act,imopat,$22b0,0,$00 ;5: dcblw buranko_act,fetamapat,$4391,2,$07 ;6: dcblw haguruma_act,hagurumapat,$c344,00,$e0 ;7: dcblw dai_act,daipat,$22c0,2,$28 ;8: dcblw switch2_act,switch2pat,$0513,0,$00 ;9: dcblw pata_act,patapat,$4492,0,$03 ;10: dcblw pata_act,yukafpat,$04df,0,$83 ;11: dcblw noko_act,nokopat,$43b5,0,$02 ;12: dcblw break2_act,break2pat,$43f5,0,$00 ;13: dcblw dai_act,daipat,$4460,3,$39 ;14: dcblw dai4_act,dai4pat,$22c0,0,$00 ;15: dcblw door_act,doorpat,$42e8,0,$00 ;16: dcblw dai4_act,dai4pat,$22c0,1,$13 ;17: dcblw noko_act,nokopat,$43b5,0,$01 ;18: dcblw dai4_act,dai4pat,$22c0,1,$24 ;19: dcblw noko_act,nokopat,$43b5,2,$04 ;20: dcblw dai4_act,dai4pat,$22c0,1,$34 ;21: dcblw yukae_act,yukaepat,$44c3,0,$00 ;22: dcblw fire6_act,fire6pat,$83d9,0,$64 ;23: dcblw fire6_act,fire6pat,$83d9,11,$64 ;24: dcblw ele_act,elepat,$047e,0,$04 ;25: dcblw yukai_act,yukaipat,$42f0,0,$00 ;26: dcblw scoli_act,scolipat,$8680,0,$11 ;27: dcblw buta_act,butapat,$2302,0,$04 ;28: dcblw save_act,savepat,$26bc,0,$01 ;29: * dcblw ring_act,playpat,$0780,50,$00 ;28: * dcblw usa_act,usapat,$0448,0,$00 ;5: * dcblw mawaru_act,mawarupat,$4348,16,$00 ;7: edit7tbl: dc.w 02 *13 dcblw ring_act,ringpat,$26bc,0,$00 ;1: dcblw ring_act,ringpat,$26bc,8,$00 ;2: * dcblw bobin_act,bobinpat,$0380,0,$00 ;2: * dcblw usagi_act,flicpat,$05a0,0,$0a ;3 * dcblw usagi_act,flicpat,$05a0,0,$0b ;4 * dcblw usagi_act,flicpat,$05a0,0,$0c ;5 * dcblw usagi_act,usagipat,$0553,0,$0d ;6 * dcblw usagi_act,usagipat,$0553,0,$0e ;7 * dcblw usagi_act,pengpat,$0573,0,$0f ;8 * dcblw usagi_act,pengpat,$0573,0,$10 ;9 * dcblw usagi_act,azarpat,$0585,0,$11 ;10 * dcblw usagi_act,fbutapat,$0593,0,$12 ;11 * dcblw usagi_act,niwapat,$0565,0,$13 ;12 * dcblw usagi_act,risupat,$05b3,0,$14 ;13
So, in Sonic 1 (and also Sonic 2 Nick Arcade, where I got these symbols from), there's a label called "golepat" at the same location as other labels for various special stage blocks, right after the table that defines each block and its graphics. Now, I do believe that the signpost object was called "gole", and its sprite data was probably called "golepat"... so what's up with this one? My theory is that it's just some XDEF/XREF dickery happening here. For those not in the know, the Genesis Sonic games were built using an assembler and linker, and when you have a linker, source files are assembled/compiled individually, and then linked together to make the built program. An "XDEF" marks a symbol as visible to other modules when linking, and an "XREF" tells the assembler that the symbol being referenced comes from another module. In the case of this set of sprite data, what I am thinking is that there is a proper XDEF of the signpost version of "golepat" that can be XREF'd as desired, but here, I believe that the source file that holds the special stage sprite data and tables has its own contained "golepat" symbol specifically to be assigned with the rest of those other labels, and doesn't use an XREF to use the one from the signpost module. There are other examples of this sort of thing. For example, the ring object's initialization routine is called "ringinit", but so is the function that initializes the HUD's ring counter graphics. The leftover Chopper badnik's animation data is called "fishchg", but so is "bfish"'s. The stegosaurus badnik has a function called "checksonic", but so does the alligator badnik. The Emerald Hill boss has a function called "checkshoot", but so does the Buzzer badnik. Hell, in Sonic CD, Amy has her own version of "speedset", which is normally a global function that updates an object's movement, and also applies gravity, but in Amy's case, her own personal version just calls 2 separate functions called "speedsetx" and "speedsety", which just updates her movement, but on separate axes, and are also only visible to her. Last thing I will mention is that one of the other labels for the same set of sprites is called "warppat"... one of the blocks that uses it is the "W" block. Make of this info how you will. Also, here's what I think each label is supposed to represent: zonepat = unused ZONE blocks warppat = unused W block sprevpat = R (reverse) block golepat = GOAL block derupat = red/white ghost/gate block sp1uppat = unused 1-UP block sphashpat = red/white solid block koukapat = emerald sparkle breakpat = diamond block spuppat = UP block spdownpat = DOWN block metpat = ????????? (prototype leftover maybe?)
Bump, because I got this to share, from the Sonic 2 Nick Arcade ROM: Code: -------------------------------------------------------------------------- Related assembler work data located around the assembled code (before?) -------------------------------------------------------------------------- 5410C - sisoo (assembler work) 546F8 - wasp (assembler work) 557B8 - seahorse, skyhorse (assembler work) 56424 - redz (assembler work) 5669C - wfish2 (assembler work) 56CCC - gator (assembler work) 57644 - bbat (assembler work) 57FF8 - oct (assembler work) 59304 - bossdriller, driller, drillerguy (assembler work) 5A12C - snail (assembler work) 5A718 - boss1, btama (assembler work) 5B1FC - staff (assembler work) 5C0B0 - bossba, billbomb (assembler work) -------------------------------------------------------------------------- 5C570 - staff (tail end of assembler work) 5D000 - bossba, billbomb (assembler work) -------------------------------------------------------------------------- 5D781 - edit (source code) -------------------------------------------------------------------------- 60BE0 - Title screen logo mappings (tail end of data) 60C20 - Title screen background mappings 1 (old version?) 60EF8 - I have NO clue -------------------------------------------------------------------------- 62230 - pcol (assembler work) 62C48 - masin (assembler work) 65260 - sprscr, sprscractcnt, scrwkchk, scrcnt, sprmapset (assembler work) 66548 - efectwrt, efectmove, efectblockset (assembler work) 67894 - play01 (assembler work) 68464 - edit (assembler work) 69464 - score, scoreup, scoreset (assembler work) 6B5C4 - mapinittbl, divdevtbl (assembler work) -------------------------------------------------------------------------- Basically, a good chunk of the second "symbol table" is actually just scrap assembler work data for various source files. Any pointers listed as "assembler work" will point to assembled 68000 code, with related assembler data nearby (I think it's right before the assembled code). I did also find a tilemap at 0x60C20 that is meant to go with the title screen that doesn't match any other data in the ROM, or even like Sonic 1. It's also larger than the data that did get used for the ROM. But yeah, with this, you can find even more symbols, and also even earlier code! I did previously go through this and restored the earlier Emerald Hill boss with the weird janky bobbing animation that's handled by a small table: I also noticed that the earlier version of "efectwrt" found in this ROM segment actually calls the unused function for shifting Chemical Plant's background (called efectmove). I'll probably comb through more later, but if anyone would like to, I absolutely encourage anyone to take a look for themselves. You will need to go through the assembler work data in order to apply patches to the assembled 68000 code, but it can be reconstructed, as I have shown above.
So, I went ahead and extracted the older version of assembled code and assembler/linker data scraps that can be found in the second symbol table of Sonic 2 Nick Arcade. The data provided seems to be late into the build process, seeing as the assembled code already have their addresses resolved. Code and scrap work data are split out, and I did attempt to organize the scrap work data go with the modules they are supposed to go to. The scrap work data is made up of the following in this order: Symbols located inside the module Symbol XDEFs (symbols marked as visible to other modules) Symbol XREFs (symbols referenced from other modules) The first one is simple, it's basically just a table of symbols and their offsets within the module. The last 2 are a bit more complex, but pretty easy to understand. You can differentiate them from the first one based on how much more info is packed with the symbol names. To find the XDEFs within the module, first go to the symbol name you wanna find, then scan back like 4 bytes, and then you'll find the offset. To find the XREFs within the module, first, go to the symbol name you wanna find. Then, you scan back past the list of longwords whose values are > 0x400000. From there, you will find the list of offsets, whose format is very simple: it starts with a count, and then it lists each offset in the module for that symbol. Symbol name lengths are stored in units of 4 bytes and are padded out accordingly (i.e. "sisoo", 5 characters, is padded to 8, with its length set to 8/4, or 2). I'm currently going through this myself and disassembling the code, while also figuring out the rest of the symbols that can be found here, and I do plan on posting my work on GitHub. But, if you wanna take a look for yourself, go crazy. I also made a couple of corrections to my address table for this ROM segment, as I accidentally left out the first 4 bytes in a couple of assembled code modules.
Presenting... an updated Sonic 2 Nick Arcade symbol dump! Turns out that the one that's easily accessible online, particularly on TCRF, is incomplete! I went ahead and went through the ROM myself and filled in the blanks the best I could. I also managed to figure out where certain parts of got cut-out, which allowed me to even correct an error or two. I did manage to find a couple more addresses at those cut-out spots, but they did not have names. However, through some pattern recognition, I was able to figure them out, except for one, which is 0x13606 (appears somewhere around (before?) kaiten). One interesting thing I found was that there's actually 2 versions of the "bossba" assembler/linker scrap work data hidden in the ROM. While the code is the same, the pointers are slightly different. As such, I've also updated their symbols as to document both versions. On top of that, I also found a section that contained several "JmpTo" instructions in groups at 0x4EA8C, which appears to have been created for yet another earlier build with slight address differences. Through further pattern recognition, I was able to find that one of them was for "actchkwk2", which is actually one of the symbols that was affected by the "bossba" thing, so it gets 3 unique values! Unfortunately, I could not figure out the names for 0x18A82 and 0x19A3C, as there's simply not enough context for them (both of them are in their own individual groups, all by themselves). Without further ado... enjoy! Code: bossvac 000000 (dummied out) vacumeguy 000000 (dummied out) explode 000000 (dummied out) ascii 0004E8 bgmset 0012F6 soundset 0012FC dmactrset 0013A0 mapdevr 00170E random 002AF0 sinset 002B16 atan 002DAE burankoposiset 007D6A burankoposiset2 007DAE burankopat 007EAE buranko0dpat 007EDA ballpat 007F4A shimapat2 0084AE dai00pat 008556 pltfrmpat 008C64 frntlitpat 008E04 kanipat 009C84 hachipat 009FC2 ringgetsub 00A236 ringpat 00A54A itempat 00ABF0 fishpat 00B11E togepat 00C17E jyamapat 00C202 speedset 00C706 speedset2 00C732 actionsub 00C758 frameoutchk 00C7AE frameoutchkd 00C81A frameout 00C88E patchg 00C89C spatsetsub 00CB26 dualmodesub 00CFC2 dualmodesub2 00CFDE ringcolchk 00D2F0 actwkchk 00DAA2 actwkchk2 00DAB8 | 00DAB0 | 00DAC8 sjumppat 00E0B4 banepat 00E12C kamerepat 00E4A8 kagebpat 00E640 goleset 00E80A musipat 00EA80 atariridesub 00EB1C ridechksub_t 00EEC0 jumpcolsub 00FDCC patchgmain 00FF82 playwrt 01029A emycol_d 0128C6 savepat 012D74 bobinpat 013002 colichg 01349C .jump$zdba 0134B6 .frameoutd2$zdba 0134BE .frameout$zdba 0134D4 .frameout2$zdba 0134E6 colichg_move_tbl 0134EA colichgmove 01352A .loop$ceba 013556 .jump2$ceba 013594 .jump3$ceba 0135A2 .jump4$ceba 0135C0 .end2$ceba 0135D0 .end1$ceba 0135D4 .end$ceba 0135E0 colichgtbl 0135E2 colichgpat 013602 kaiten 01364C kaiten_move_tbl 01365A kaiteninit 013660 kaiteninit2 0136B4 kaitenmove 0136C2 .jump1$rdba 0136DA .jump2$rdba 0136E0 kaitenmove2 0136EC .jump3$sdba 013706 .jump4$sdba 01371E kaitenchg 013722 kaitenchg0 013726 kaitenchg1 01372E kaitenpat 013736 kaitensp0 013740 kaitensp1 01374A kaitensp2 013754 kaitensp3 01375E kaitensp4 013768 prodai 013774 prodai_move_tbl 013782 prodaiinit 013786 prodaimove 0137E6 .jump0$vdba 013806 .jump$vdba 013824 .jump2$vdba 013834 .jump3$vdba 013838 .jump4$vdba 01384A prodaipat 01385E prodaisp0 013860 gem 013874 gem_move_tbl 013882 geminit 013886 gemmove 0138AE gemfoutchk 0138C2 gempat 0138DA gemsp00 0138DC wfall 0138F0 wfall_move_tbl 0138FE wfallinit 013904 .sub$rdba 01396C .worknai$rdba 0139AE .end$rdba 0139B0 wfallmove 0139CA .jump$sdba 0139E2 .jump2$sdba 0139FC .jump5$sdba 013A14 .jump4$sdba 013A1C .jump3$sdba 013A34 wfallmove2 013A54 wfallpat 013A6C wfallsp19 013AA4 wfallsp00 013AA6 wfallsp01 013AB0 wfallsp02 013AC2 wfallsp03 013AD4 wfallsp04 013AEE wfallsp05 013B08 wfallsp06 013B2A wfallsp07 013B4C wfallsp08 013B76 wfallsp09 013BA0 wfallsp10 013BD2 wfallsp11 013C04 wfallsp12 013C3E wfallsp13 013C78 wfallsp14 013CBA wfallsp15 013CFC wfallsp16 013D46 wfallsp17 013D46 wfallsp18 013D46 wfallsp20 013D58 wfallsp21 013D62 wfallsp22 013D6C wfallsp23 013D7E wfallsp24 013D90 wfallsp25 013DAA wfallsp26 013DC4 wfallsp27 013DE6 sloop 013E08 .frameoutd$wdba 013E1E .frameout$wdba 013E32 sloop_move_tbl 013E38 sloopinit 013E3C sloopmove 013E46 .sub$zdba 013E54 .left$zdba 013E7C .right$zdba 013E8A .jump$zdba 013E96 .plrideon$zdba 013EAE .left2$zdba 013EBC .right2$zdba 013ECA .jump0$zdba 013ED6 .end$zdba 013EEC .rideon$zdba 013EEE .jumps$zdba 013EF6 .jump1$zdba 013F18 .jump2$zdba 013F24 sloopdirtbl 013F56 slooptbl 013F8A sisoo 01412C sisoo_move_tbl 014152 sisooinit 01415E .worknai$feba 0141B8 .jump$feba 0141C6 sisoomove 0141CC .rideon$geba 0141D8 .jump$geba 0141EC .jump2$geba 0141F4 .jump3$geba 014210 .jump4$geba 014218 .jump44$geba 014222 .noride$geba 014226 .jump5$geba 014242 .jump6$geba 01424A .jump7$geba 01424A .jump8$geba 014262 sisooride 01427E sisoosub 014280 .jump$ieba 014294 sisoosub2 01429C .jump2$ieba 01429C .jump3$jeba 0142A8 .end$jeba 0142C6 sballinit 0142C8 .jump$keba 014328 sballwait 014328 .jump$leba 01433C .jump3$leba 014362 .jump2$leba 014378 .jump4$leba 01437E .jump0$leba 01439C sballmove 0143BC .up$meba 0143C2 .end$meba 0143D8 .down$meba 0143DA .jump0$meba 0143FA .jump$meba 014418 .jump1$meba 014434 .jump2$meba 014442 .jump3$meba 01444E .sub$meba 014450 sballtbl 014480 sisootbl 01448A sisootbl2 0144BB sisoopat 0144EC sisoosp0 0144F4 sisoosp1 014536 sballpat 014578 sballsp0 01457C sballsp1 01457C water 014588 water_move_tbl 014596 waterinit 01459A watermove 0145C2 .jump0$ceba 0145E4 .jump1$ceba 0145F4 .jump2$ceba 0145F4 waterpattbl 014614 waterpat 014654 watersp0 014660 watersp1 01467A watersp2 014694 watersp3 0146AE watersp4 0146E0 watersp5 014712 taki 014744 taki_move_tbl 014752 takiinit 014756 takimove 014790 .frameoutd$oeba 0147AA .jump$oeba 0147DC .end$oeba 0147EE takipat 0147F6 takisp00 0147FE takisp01 014810 takisp02 014882 takisp03 014884 stego 0148D0 stego_move_tbl 0148DE stegoinit 0148E2 .end$pdba 014930 stegomove 014932 stegomove_tbl 01494E stego_0 014952 .jump$sdba 014974 stego_1 014976 .end$tdba 01499A .jump2$tdba 01499C checksonic 0149C0 .lft$udba 0149CA .out$udba 0149E4 .out0$udba 0149E6 .rt$udba 0149F4 .out1$udba 014A10 stegochg 014A1E stegochg00 014A24 stegochg01 014A32 stegochg02 014A35 stegopat 014A3A stegosp00 014A4A stegosp01 014A74 stegosp02 014A9E stegosp03 014AC8 stegosp04 014AF2 stegosp05 014B1C stegosp06 014B46 stegosp07 014B68 bfish2 014BA0 bfish 014BA0 fish2_move_tbl 014BAE fish2init 014BB4 fish2move 014C2C .jump$ydba 014C2C .skip$zdba 014C38 .jump$zdba 014C5A fish2jump 014C9C .level$aeba 014CF4 .below$aeba 014D08 .join$aeba 014D22 waterspeedset 014D4C .sub$beba 014D80 .cnt$beba 014D88 fishchg 014D9A fishchg0 014DA2 fishchg1 014DA6 fishchg2 014DAA fishchg3 014DAE bfish2pat 014DB2 bfishpat 014DB2 fish1sp0 014DBA fish1sp1 014DC4 fish1sp2 014DCE fish1sp3 014DD8 redz 014DF8 redz_move_tbl 014E06 redzinit 014E0C .end$pdba 014E60 redzmove 014E62 .frameout$qdba 014E92 .frameout2$qdba 014EA4 redzmove_tbl 014EA8 redz_0 014EAC .jump$sdba 014ECE redz_1 014ED0 .end$tdba 014EEA .jump2$tdba 014EEC redzdie 014F04 redzchg 014F08 redzchg0 014F0C redzchg1 014F0F redzpat 014F16 redzsp0 014F1C redzsp1 014F26 redzsp2 014F30 seahorse 014F5C seahorse_move_tbl 014F6A seahorseinit 014F76 .worknai$vdba 01502E seahorsemove 01502E seahorsemove_tbl 015054 seahorsewings 01505A seahorseshot 015084 seahorseswim 01509A seahorsefloat 0150AC seahorseattack 0150BA chkshot 0150CC .end$deba 0150D8 .makeshot$deba 0150DA .ok$deba 01513A .worknai$deba 015146 chkatkdone 015148 .end$eeba 01516E chkatack 015170 .toleft$feba 01519E .toright$feba 0151AE .edge$feba 0151BC .end$feba 0151D6 chkfloat 0151D8 .vel$geba 0151F4 .end$geba 0151F8 chkfltdone 0151FA .end$heba 015216 .down$heba 015218 fixwings 01522C .normal$ieba 01525C shotdrops 015266 hitground 01527C .end$keba 015296 oilslip 0152A2 updatoil 0152A6 .end$oeba 0152E2 .done$oeba 0152E4 landedyet 0152F2 .end$peba 015330 chkflip 015332 .jump$qeba 01534E chkhit 015350 .loop$reba 01535A .left$reba 0153B8 .r1$reba 0153C6 .worknai$reba 0153CC .out$reba 0153EE .end$reba 0153F2 horsechg 0153F4 seahorsechg0 015404 seahorsechg1 015407 horsechg2 01540F seahorsechg3 015415 seahorsechg4 015419 seahorsechg5 01541C skyhorsechg0 01541F skyhorsechg1 015423 horsepat 01542C seahorsesp00 015446 seahorsesp01 015460 seahorsesp02 01546A seahorsesp03 015474 seahorsesp04 015496 horsesp05 0154B8 horsesp06 0154C2 horsesp07 0154CC horsesp08 0154D6 skyhorsesp00 0154E0 skyhorsesp01 015502 skyhorsesp02 015524 skyhorsesp03 01554E skyhorse 015578 skyhorse_move_tbl 015586 skyhorseinit 015592 skyhorsemove 0155F0 skyhorsemove_tbl 015610 skyhorseshot 015614 skyhorsefly 015628 skyhorseattack 01563E shotstatus 015654 .done$bgba 015668 getposition 01567A .toleft$cgba 01569A .setbehind$cgba 0156A2 .next$cgba 0156A6 .above$cgba 0156C6 .out$cgba 0156CA chkshoot 0156CC .end$dgba 0156F0 makeshot 0156F2 .ok$egba 01574E .worknai$egba 01575A seeksonic 01575C .above$fgba 015768 .speed$fgba 015784 .below$fgba 01578C .negspeed$fgba 0157A8 .end$fgba 0157B0 .out$fgba 0157BA wasp 0157E0 wasp_move_tbl 0157F2 waspshot 0157FA waspafterb 01580C .cnt$feba 01581E waspinit 015844 .done$geba 0158E6 waspmove 0158E8 waspmove_tbl 015904 waspfly 015908 .here$jeba 015926 .end$jeba 01592C .here2$jeba 01592E checkshoot 01594A .cnt$keba 015960 .toleft$keba 01597A .sht$keba 015982 .out$keba 015996 waspshoot 015998 .done$leba 0159AC .here$leba 0159B2 .out$leba 015A16 waspchg 015A18 waspchg00 015A20 waspchg01 015A23 waspchg02 015A27 waspchg03 015A2B wasppat 015A34 waspsp00 015A42 waspsp01 015A54 waspsp02 015A6E waspsp03 015A88 waspsp04 015A92 waspsp05 015A9C waspsp06 015AA6 oct 015AC8 oct_move_tbl 015AD6 octshot 015ADE .cnt$pdba 015AE8 octeye 015AFA octinit 015B06 .end$rdba 015B64 octmove 015B6C octmove_tbl 015B88 octstand 015B90 .done$udba 015BAE octfly 015BB0 .end$vdba 015BD0 octshoot 015BD2 .end0$wdba 015C38 .end$wdba 015C9C .out$wdba 015C9E octleave 015CA4 .cnt$xdba 015CB2 octchg 015CBA octchg00 015CC0 octchg01 015CC3 octchg02 015CC8 octpat 015CCC octsp00 015CDA octsp01 015CEC octsp02 015D06 octsp03 015D20 octsp04 015D3A octsp05 015D44 octsp06 015D4E bbat 015D78 bat_move_tbl 015D86 batinit 015D8C batmove 015DCA batmove_tbl 015DEA setposi 015DF0 seekchk 015E0A .end$xdba 015E36 batattack 015E38 fixme 015E58 .end$zdba 015E6A attackchk 015E6C .cnt$aeba 015E90 .end$aeba 015EB6 .gone$aeba 015EB8 .norm$aeba 015EC4 direcchg 015ED8 .end$beba 015EF0 .rt$beba 015EF2 .done$beba 015F06 moveset 015F36 bathover 015F56 .end$deba 015F8C batflap 015F8E .end$eeba 015F98 batseek 015F9A .here$feba 015FC8 .cnt$feba 015FE0 batchg 015FE2 batchg00 015FEA batchg01 015FEE batchg02 015FFD batchg03 01600E bbatpat 016016 batsp00 016034 batsp01 016056 batsp02 016078 batsp03 01609A batsp04 0160BC batsp05 0160D6 batsp06 0160F8 batsp07 01611A batsp08 01613C batsp09 01615E batsp10 016178 batsp11 016192 batsp12 0161AC batsp13 0161BE batsp14 0161D0 gator 016200 gator_move_tbl 01620E gatorinit 016212 .end$pdba 016260 gatormove 016262 gatormove_tbl 01627E gator_0 016282 .jump$sdba 0162A4 gator_1 0162A6 .end$tdba 0162C4 .jump2$tdba 0162C6 checksonic 0162DE .lft$udba 0162E8 .rt$udba 0162F8 .set$udba 016306 .out$udba 01630E gatorchg 016316 gatorchg00 01631C gatorchg01 016324 gatorchg02 016327 gatorpat 016330 gatorsp00 016348 gatorsp01 01636A gatorsp02 01638C gatorsp03 0163AE gatorsp04 0163D0 gatorsp05 0163F2 gatorsp06 016414 gatorsp07 016436 gatorsp08 016458 gatorsp09 01647A gatorsp10 01649C gatorsp11 0164BE wfish2 0164F8 wfish_move_tbl 01650A wfishinit 01650E wfishmove 016548 .jump$beba 016570 .jump2$beba 016592 wfishchg 016594 wfishchg0 01659A wfishchg1 01659E wfishchg2 0165A2 wfish2pat 0165A6 fishsp0 0165AA fishsp1 0165C4 snail 0165F8 snail_move_tbl 01660A snailinit 016614 .out1$deba 016694 .cnt$deba 0166A6 snailmove 0166AC .jump$eeba 0166D8 chkcharge 0166F4 .toleft$feba 016712 .toright$feba 01671C .doit$feba 016724 .done$feba 016736 makeafb 016738 .out$geba 016790 afbupdate 016792 .cnt$heba 0167BA snailturn 0167CC updateparts 016804 snailchg 01682C snailchg0 016830 snailchg1 016834 snailpat 016838 snailsp0 01683E snailsp1 016850 snailsp2 016862 bossdriller 016890 | 016888 bossdrillmove_tbl 01689E moveonscreen 0168AA .done$oeba 0168C2 joincar 0168D0 join_tbl 0168DE joinland 0168E2 .joined$reba 0168F4 joinadjust 016908 movecar 01692C tbl 01696C deathstart 016970 .jump$veba 016978 .end$veba 0169A4 deathdrop 0169A6 flyaway 0169C0 flyaway_tbl 0169D2 initrotors 0169D8 takeoff 016A4C .end$afba 016A64 runaway 016A66 .out$bfba 016A7A checkflip 016A7C .off$cfba 016A8C .done$cfba 016A9C checkhit 016A9E .jump$dfba 016AC8 .jump1$dfba 016AD6 .jump2$dfba 016AE4 .die$dfba 016AE6 driller 016B00 driller_tbl 016B0E growrotors 016B18 sticktoboss 016B3C stick_tbl 016B4A normal 016B4E .cnt$ofba 016B72 retract 016B98 .done$pfba 016BB4 carbody 016BC2 tiremove 016C04 tiremove_tbl 016C12 tiresit 016C1A tireroll 016C38 .cnt$ufba 016C5A tireexplode 016C70 tirebounce 016CA0 .end$wfba 016CBE drill 016CC2 .cnt$xfba 016D10 .movedrill$xfba 016D22 .cnt3$xfba 016D30 checkshoot 016D42 .chkset$yfba 016D4C .right$yfba 016D56 .left$yfba 016D60 .set$yfba 016D6A makewheels 016D72 .worknai1$zfba 016DE6 .worknai2$zfba 016E5A .worknai3$zfba 016ECE .worknai4$zfba 016F2A drillerguy 016F2C | 016F24 .worknai$cgba 016F70 .worknai2$cgba 016FD0 bosshelichg 016FD2 bosshelichg0 016FD8 bosshelichg1 016FDC bosshelichg2 016FF2 bosshelipat 01700C bosshelisp00 01701A bosshelisp01 017024 bosshelisp02 01704E bosshelisp03 017078 bosshelisp04 017092 bosshelisp05 0170AC bosshelisp06 0170C6 bossdrillchg 0170E0 bossdrillchg0 0170E6 bossdrillchg1 0170EB bossdrillchg2 0170EF bossdrillpat 0170F4 bossdrillsp0 017104 bossdrillsp1 01711E bossdrillsp2 017128 bossdrillsp3 017132 bossdrillsp4 01713C bossdrillsp5 017146 bossdrillsp6 017150 bossdrillsp7 01715A bossba 017194 | 01718C bossba_move_tbl 0171A2 | 01719A bossbainit 0171AC | 0171A4 .cnt$geba 0171F8 | 0171F0 .cnt2$geba 01725C | 017254 .worknai$geba 0172B0 | 0172A8 bossbaappendage 0172C2 | 0172BA bossbamove 0172CA | 0172C2 bossbamove_tbl 017300 | 0172F8 bossbatop 017308 | 017300 afbtbl 017336 | 01732E bossafb 01733A | 017332 .cnt$neba 017378 | 017370 .jump$neba 017382 .hurt$neba 01738E | 017386 .here$neba 01739C | 017394 bosssm 0173D8 | 0173D0 .jump$oeba 01741A billbomb 01741E | 017416 billbomb_tbl 01742C | 017424 billbombinit 017430 | 017428 billbombmove 017468 | 017460 .jump$seba 017482 | 01747A bossafbpat 017486 | 01747E afbsp00 01748A | 017482 afbsp01 017494 | 01748C bosssmpat 01749E | 017496 smbsp00 0174A6 | 01749E smbsp01 0174B0 | 0174A8 smbsp02 0174BA | 0174B2 smbsp03 0174C4 | 0174BC billbombpat 0174CE | 0174C6 bossbmsp00 0174DC | 0174D4 bossbmsp01 0174E6 | 0174DE bossbmsp02 0174F0 | 0174E8 bossbmsp03 0174FA | 0174F2 bossbmsp04 017504 | 0174FC bossbmsp05 01750E | 017506 bossbmsp06 017518 | 017510 bossbachg 017522 | 01751A bossbachg1 017526 | 01751E bossbachg2 017529 | 017521 bossbapat 01752E | 017526 bossbasp00 017534 | 01752C bossbasp01 017556 | 01754E bossbasp02 017578 | 017570 staff 0175A8 staff_move_tbl 0175B6 staff_init 0175BA staff_move 017628 .jump$ndba 017628 staffpat 01762E staffsp00 017644 staffsp01 0176B6 staffsp02 017738 staffsp03 01778A staffsp04 01784C staffsp05 0178EE staffsp06 0179C0 staffsp07 017A7A staffsp08 017B74 staffsp09 017BEE staffsp10 017C30 boss1 017CC4 boss1_move_tbl 017CD2 boss1tbl 017CDA boss1init 017CE0 .loop$kdba 017CEA .jump$kdba 017CF2 .worknai$kdba 017D38 boss1move 017D50 boss1move_tbl 017D82 boss1_0 017D90 boss_ysub 017DAC .end$ndba 017DAC .jump$odba 017DF4 .jump1$odba 017E02 .jump2$odba 017E10 .die$odba 017E12 bossbomb 017E26 .worknai$pdba 017E68 .jump$pdba 017E68 speedset_m 017E6A boss1_1 017E90 .worknai$rdba 017ED6 .end$rdba 017EDC boss1_2 017EE0 .jump$sdba 017F0A .jump2$sdba 017F16 boss1_3 017F1A .jump2$tdba 017F26 .end$tdba 017F3C boss1_4 017F40 .jump$udba 017F4A .end$udba 017F70 boss1_5 017F72 .falling$vdba 017F7A .turn$vdba 017F82 .rise_up$vdba 017F88 .go_up$vdba 017FA0 .fire$vdba 017FA8 .exit$vdba 017FB6 boss1_6 017FBE .jump$wdba 017FD8 .jump2$wdba 017FDE .frameout$wdba 017FE6 boss1oyaji 017FEE .pass0$xdba 018008 .pass1$xdba 018010 .pass2$xdba 01801A .jump$xdba 018024 .jump0$xdba 018038 .frameout$xdba 01803A boss1fire 018040 .jump0$ydba 018060 .jump$ydba 01806C .frameout$ydba 01806E boss1sub 018074 btama 0180AE btama_move_tbl 0180BC btamainit 0180C6 .loop$jeba 0180F6 .jump$jeba 018132 .worknai$jeba 01815C btamalentbl 018188 btamamove 01818E .loop$leba 01819A .jump$leba 0181B4 .jump2$leba 0181CE .jump3$leba 0181DA btamamove2 0181EE btamasub 0181FE .pass$neba 018210 .jump$neba 01823A btamakusari 01823C .jump$oeba 018252 | 017412 btamatama 018258 .jump0$peba 018262 .jump$peba 01828A boss1chg 018290 boss1chg0 0182A8 boss1chg1 0182AB boss1chg2 0182AF boss1chg3 0182B3 boss1chg4 0182B7 boss1chg5 0182BB boss1chg6 0182BF boss1chg7 0182C3 boss1chg8 0182C6 boss1chg9 0182CA boss1chg10 0182CE boss1chg11 0182D1 boss1pat 0182DC boss1sp0 0182F6 boss1sp1 018328 boss1sp2 01833A boss1sp3 01834C boss1sp4 018366 boss1sp5 018380 boss1sp6 01839A boss1sp7 0183B4 boss1sp8 0183D6 boss1sp9 0183E0 boss1sp10 0183EA boss1sp11 0183EC boss1sp12 0183FE boss2pat 018410 boss2sp0 018420 boss2sp1 01842A boss2sp2 01843C boss2sp3 018446 boss2sp4 018450 boss2sp5 01845A boss2sp6 01847C boss2sp7 01848E masin 0184AC .frameout$edba 0184D2 masin_move_tbl 0184D8 masintbl 0184E8 masininit 0184F8 .end$hdba 018544 masinmove 018546 .jump$idba 018564 .jump2$idba 01857A masinswitch 018582 .jump$jdba 0185E8 masinbomb 0185EA masincenter 0185EA masincenter2 0185EA .worknai$mdba 018628 .jump$mdba 018628 .end$mdba 01862E .bombend$mdba 018630 .lp$mdba 018656 .no_work_left$mdba 018680 masinusagi 018682 .pass$ndba 0186B6 .worknai$ndba 0186C0 .jump$ndba 0186C0 .end$ndba 0186D0 masinclear 0186D2 .lp$odba 0186DC .end$odba 0186F2 masinchg 0186F4 masinchg0 0186F8 masinchg1 0186F8 masinpat 0186FC masinsp0 01870A masinsp1 018744 masinsp2 01874E masinsp3 018780 masinsp4 01878A masinsp5 01879C masinsp6 0187A6 pcol 0187B0 .jump0$ldba 0187DA .loop$ldba 0187E8 .jump$ldba 0187EE .colitbl$ldba 0187FA .jump2$ldba 018842 .jump3$ldba 018864 .jump4$ldba 01886A .jump5$ldba 018882 .atari$ldba 018888 pcolitem 0188A2 .ring$mdba 0188B0 .ringe$mdba 0188C0 .item$mdba 0188C2 .item2$mdba 0188EE .iteme$mdba 018900 pcolnomal 018902 .jump$ndba 01891A .jump4$ndba 018942 .jump0$ndba 018944 .jump5$ndba 01895C .jump6$ndba 018976 .jump3$ndba 018986 .jump1$ndba 01899C .jump2$ndba 0189A4 escoretbl 0189AC pcolplay2 0189B4 pcolplay 0189BA pcolend 0189C0 pcole 0189C4 playdamageset 0189CE .worknai$tdba 0189F6 .damage$tdba 0189F6 .jump0$tdba 018A2C .jump$tdba 018A3A .jump2$tdba 018A60 .end$tdba 018A66 .die$tdba 018A6A playdieset 018A72 .jump2$udba 018AC0 .end$udba 018AC6 pcolspecial 018ACA .imo$vdba 018AEC .yado$vdba 018AF0 .yado1$vdba 018B0A .yado2$vdba 018B16 .yado3$vdba 018B1A .yado4$vdba 018B1E .bobin$vdba 018B22 .bobin2$vdba 018B2E .bou$vdba 018B34 sprscr 018B48 .loop$ndba 018B98 .loop2$ndba 018BBA sprscre 018BDC sprscrset 018BDC .loop$pdba 018C06 .loop2$pdba 018C0A .jump$pdba 018C62 .end$pdba 018C82 sprscractcnt 018C8A .loop$qdba 018C9E .jump2$qdba 018CC2 .jump4$qdba 018CDE .jump5$qdba 018D20 .jump3$qdba 018D4A scractofftbl 018E34 scrwkchk 018EB4 .loop$sdba 018EBE .jump$sdba 018EC8 scrcnt 018ECA .loop$tdba 018ED4 .jump$tdba 018EE2 scracttbl 018EEA scr_ring 018F02 .end$vdba 018F2A .jump$vdba 018F2A scr_ringtbl 018F2C scr_bobin 018F32 .jump$xdba 018F5E .end$xdba 018F60 scr_bobintbl 018F62 scr_1up 018F68 .end$zdba 018F90 .jump$zdba 018F90 scr_1uptbl 018F92 scr_revers 018F98 .jump$beba 018FC4 .end$beba 018FC6 scr_reverstbl 018FC8 scr_houseki 018FCE .jump$deba 019006 .end$deba 019006 scr_housekitbl 019008 scr_break 01900E .jump$feba 01903A .end$feba 01903A scr_breaktbl 01903C sprmapsettbl 019046 sprplaypositbl 01905E sprmapset 019076 .jump$jeba 01908E .loop0$jeba 0190A4 .jump0$jeba 0190AC .jump2$jeba 0190B0 .loop$jeba 0190DC .loop1$jeba 0190F0 .loop2$jeba 0190F2 scrpatset 019100 .loop$keba 01910E scrcntclr 019120 .loop$leba 01912A scrpattbl 019132 metpat 019306 sprevpat 019306 zonepat 019306 derupat 019306 sp1uppat 019306 golepat 019306 warppat 019306 golesp0 01930C golesp1 019312 derusp2 019318 sphashpat 01931A koukapat 01931A breakpat 01931A koukasp0 019322 sphashsp0 019322 koukasp1 019328 sphashsp1 019328 koukasp2 01932E koukasp3 019334 spuppat 01933A spupsp0 01933E spupsp1 019344 spdownpat 01934A spdownsp0 01934E spdownsp1 019354 hous0pat 01935A hous1pat 01935E hous2pat 019362 sphoussp0 019366 sphoussp1 01936C sphoussp2 019372 sphoussp3 019378 play01 019380 .jump$neba 01938E play01_move_tbl 01939C play01init 0193A4 play01move 0193E4 .jump5$qeba 0193F8 play01move_tbl 01941C play01walk 019420 play01jump 01942E play01sub 01943A splevermove 019460 .jump5$veba 01946C .jump6$veba 019478 .right$veba 01948A .right2$veba 019494 .left$veba 01949A .left2$veba 0194A4 .jump7$veba 0194A8 .jump$veba 0194F2 spplwalk_l 0194F8 .left$weba 019506 .left2$weba 019514 .right$weba 01951A .right2$weba 019522 spplwalk_r 019528 .right$xeba 019534 .right2$xeba 019542 .left$xeba 019548 .left2$xeba 019550 .rightcol$xeba 019554 spjumpchk 019556 .end$yeba 019598 spjumpchk2 01959A .end$zeba 0195B4 playscr 0195B6 .jump$afba 0195CE .jump2$afba 0195DE play01gole 0195E0 .jump0$bfba 0195F4 .jump$bfba 019612 play01gole2 019634 .end$cfba 019640 rotspdset 019656 .jump2$dfba 0196B0 .jump3$dfba 0196C6 .jump4$dfba 0196D4 spcol 0196E8 spcol2 0196E8 spcolsub 019730 .end$gfba 019744 .jump2$gfba 019746 spcol_ev 019752 spcolsub_ev 01978C .worknai$ifba 0197A0 .jump$ifba 0197C4 .jump2$ifba 0197C8 .worknai2$ifba 0197DC .jump3$ifba 0197F2 .worknai3$ifba 01980C .jump33$ifba 01982A .jump4$ifba 019838 .jump5$ifba 019844 .jump6$ifba 019858 derusub 01985C .loop1$jfba 01986C .loop2$jfba 01986E .jump$jfba 019878 .end$jfba 019886 bobinchk 01988E .jmp$kfba 0198A0 .jmp2$kfba 0198AC .jump$kfba 0198AE .worknai$kfba 01991C .jump2$kfba 019926 .jump3$kfba 01993C .jump33$kfba 019966 .jump4$kfba 019970 .jump44$kfba 01999A .jump5$kfba 0199A4 .worknai2$kfba 0199CC .jump6$kfba 0199DA .jump66$kfba 0199F2 .jump666$kfba 019A12 .worknai3$kfba 019A16 .end$kfba 019A20 .jump7$kfba 019A20 play02 019A22 efectwrt 019A2C .end$wdba 019A4A efecttbl 019A4C efstagea 019A8C efstageb 019A8C efstagec 019A8C efstagee 019A8C efstagef 019A8C efstage1 019A8C efstage5 019A8C efstage6 019A8C efstage7 019A8C efstage9 019A8C efstage0 019A8E efstaged 019A90 efstage2 019A90 efstage3 019A90 efstage4 019A90 efstage8 019A90 .loop$neba 019A96 .jump$neba 019AAC | 01737A .jump1$neba 019ABA .jump2$neba 019ADC .jump3$neba 019AE6 efecttbl0 019AF8 efecttbl3 019AF8 efecttbl4 019B56 efecttbl8 019B56 efecttbl1 019B82 efecttbl2 019B82 efecttbl5 019B82 efecttbl6 019B82 efecttbl7 019B82 efecttbl9 019B82 efecttbla 019B82 efecttblb 019B82 efecttblc 019B82 efecttbld 019B82 efecttble 019B82 efecttblf 019B82 efectmove 019BEA .end$efba 019BF2 .jump$efba 019BF4 .sub$efba 019C24 .loop$efba 019C28 efectblockset 019CBE .loop$ffba 019CE0 .end$ffba 019CE6 .loop2$ffba 019CE8 efectblocktbl 019D00 zone00pcblk 019D20 zone03pcblk 019D20 zone0apcblk 019D5C zone0bpcblk 019D5C zone0cpcblk 019D5C zone0epcblk 019D5C zone0fpcblk 019D5C zone09pcblk 019D5C zone07pcblk 019D5C zone01pcblk 019D5C zone05pcblk 019D5C zone06pcblk 019D5C zone0dpcblk 019E9A zone02pcblk 019E9A zone08pcblk 019F7E zone04pcblk 019F7E score 01A074 score_move_tbl 01A082 score_init 01A086 score_move 01A0B4 .jump0$udba 01A0CE .jump$udba 01A0D8 .jump2$udba 01A0EE scorepat 01A0F8 scoresp0 01A100 scoresp1 01A152 scoresp2 01A1A4 scoresp3 01A1F6 scoreup 01A248 .jump$aeba 01A260 .jumpus$aeba 01A288 .jump0$aeba 01A288 scoreset 01A28A .jump$beba 01A2B2 .jump1$beba 01A2BE .jump2$beba 01A2D2 .jump3$beba 01A30E .jump4$beba 01A32E .jump5$beba 01A33C .jump6$beba 01A364 .timeover$beba 01A366 scoreset2 01A37C .jump1$ceba 01A38C .jump2$ceba 01A3A0 .jump3$ceba 01A3B0 .jump4$ceba 01A3BE .jump5$ceba 01A3E6 ringinit 01A3E8 scoreinit 01A3FC scoreinitsub 01A418 .loop$feba 01A41C .loop1$feba 01A42C .jump$feba 01A432 .loop2$feba 01A438 .spaceset$feba 01A438 scoreinittbl 01A444 ringinittbl 01A450 posiwrt 01A454 hexwrtw 01A47C .loop$jeba 01A484 .jump$jeba 01A496 .jump5$jeba 01A4AC ringwrt 01A4B4 scorewrt 01A4BE scorewrt2 01A4C6 .loop$meba 01A4CC .jump2$meba 01A4D0 .jump3$meba 01A4D8 .jump4$meba 01A4E2 .jump5$meba 01A510 contwrt 01A51C .loop$neba 01A53A .jump2$neba 01A53E .jump3$neba 01A546 subtbl 01A574 subtbl4 01A57C subtbl3 01A580 subtbl2 01A584 subtbl1 01A588 timewrt1 01A58C timewrt 01A594 timewrt0 01A59A .loop$veba 01A5A0 .jump2$veba 01A5A4 .jump3$veba 01A5AC .jump4$veba 01A5B6 bonuswrt 01A5EC .loop$weba 01A5F8 .jump2$weba 01A5FC .jump3$weba 01A604 .jump4$weba 01A60E .jump5$weba 01A638 .jump7$weba 01A63E .loop2$weba 01A640 playsuuwrt 01A64C .loop$xeba 01A664 .jump2$xeba 01A66C .jump3$xeba 01A674 .jump4$xeba 01A67E .jump5$xeba 01A682 .jump6$xeba 01A698 .jump7$xeba 01A6A4 .loop2$xeba 01A6AA scorewrtcg 01A6B6 playsuucg 01A9B6 edit 01AB00 edit_move_tbl 01AB0E editinit 01AB12 .jump0$ydba 01AB58 .jump1$ydba 01AB5E .jump$ydba 01AB78 editmove 01AB88 .jump$zdba 01AB98 editwalk 01ABB0 .jump$aeba 01ABDA .jump0$aeba 01ABF2 .jump1$aeba 01ABF6 .jump2$aeba 01AC16 .jump3$aeba 01AC2C .jump4$aeba 01AC38 .jump5$aeba 01AC40 .lend$aeba 01AC48 .jump77$aeba 01AC64 .jump6$aeba 01AC7C .jump7$aeba 01AC80 .worknai$aeba 01ACC4 .jump8$aeba 01ACC4 .end$aeba 01ACEC .jump9$aeba 01AD1E editpatchg 01AD20 edittbl 01AD40 edit1tbl 01AD4E edit2tbl 01ADC0 edit3tbl 01ADC0 edit4tbl 01ADFA edit5tbl 01AED4 edit6tbl 01AED4 edit7tbl 01AED4 mapinittbl 01AF58 divdevtbl 01AFC8 ddev00 01B008 ddev01 01B028 ddev02 01B03C ddev03 01B044 ddev04 01B04C ddev05 01B084 ddev06 01B08C ddev08 01B08C ddev14 01B08C ddev10 01B0AC ddev11 01B0E4 ddev12 01B0F8 ddev13 01B12A ddev07 01B15C ddev09 01B15C ddev15 01B15C ddev16 01B170 ddev17 01B178 ddev18 01B1B0 ddev19 01B1C4 ddev20 01B1C4 ddev21 01B1C6 ddev22 01B1D4 ddev23 01B1E2 ddev24 01B1F0 ddev25 01B1FE ddev26 01B20C ddev27 01B21A ddev28 01B21C ddev29 01B21E ddev30 01B220 ddev31 01B222 scddirtbl1 020000 scddirtbl2 020100 scdtbl 020200 scdtbl1 020200 scdtbl2 021200 scdtbl3 022200 scdtbl4 023200 zone1scd 024200 zone1scdb 02439A zone4scd 024534 zone4scdb 024834 zone6scd 024B34 zone3scd 024B34 zone2scd 024B34 zone6scdb 024E34 zone3scdb 024E34 zone2scdb 024E34 zone5scd 025134 zone5scdb 025434 rotmaptbl0 025734 rotmaptbl1 0259AE rotmaptbl2 025DC0 rotmaptbl3 02611C rotmaptbl4 0265F6 rotmaptbl5 026AA6 efect00acg 026D98 efect00bcg 026E18 efect00ccg 026E98 efect00dcg 026F18 efect00ecg 026F98 efect08acg 027098 efect08bcg 027498 efect0dacg 027798 efect0dbcg 027898 efect0dccg 027B98 efect0ddcg 027C58 efect0decg 027D18 efect0dfcg 027DD8 efect0dgcg 027F58 efect0dhcg 028198 zonemaptbl 028218 zone1_1a 0282C0 zone1_2a 0283B2 zone1_3a 02847A zone1_3b 02859C zone1_2b 02859C zone1_1b 02859C zone4_1a 0285BE zone4_2a 028DC0 zone4_3a 0295C2 zone4_4a 029DC4 zone4_4b 02A5C6 zone4_3b 02A5C6 zone4_2b 02A5C6 zone4_1b 02A5C6 zone7_4a 02A5D0 zone6_4a 02A5D0 zone3_4a 02A5D0 zone2_4a 02A5D0 zone1_4a 02A5D0 zone7_3a 02A5D0 zone6_3a 02A5D0 zone3_3a 02A5D0 zone2_3a 02A5D0 zone7_2a 02A5D0 zone6_2a 02A5D0 zone3_2a 02A5D0 zone2_2a 02A5D0 zone7_1a 02A5D0 zone6_1a 02A5D0 zone3_1a 02A5D0 zone2_1a 02A5D0 zone5_4a 02ADD2 zone5_3a 02ADD2 zone5_2a 02ADD2 zone5_1a 02ADD2 zone7_4b 02B5D4 zone6_4b 02B5D4 zone3_4b 02B5D4 zone2_4b 02B5D4 zone1_4b 02B5D4 zone7_3b 02B5D4 zone6_3b 02B5D4 zone3_3b 02B5D4 zone2_3b 02B5D4 zone7_2b 02B5D4 zone6_2b 02B5D4 zone3_2b 02B5D4 zone2_2b 02B5D4 zone7_1b 02B5D4 zone6_1b 02B5D4 zone3_1b 02B5D4 zone2_1b 02B5D4 zone5_4b 02B666 zone5_3b 02B666 zone5_2b 02B666 zone5_1b 02B666 zone7_4z 02B6B0 zone6_4z 02B6B0 zone5_4z 02B6B0 zone4_4z 02B6B0 zone3_4z 02B6B0 zone2_4z 02B6B0 zone1_4z 02B6B0 zone7_3z 02B6B0 zone6_3z 02B6B0 zone5_3z 02B6B0 zone4_3z 02B6B0 zone3_3z 02B6B0 zone2_3z 02B6B0 zone1_3z 02B6B0 zone7_2z 02B6B0 zone6_2z 02B6B0 zone5_2z 02B6B0 zone4_2z 02B6B0 zone3_2z 02B6B0 zone2_2z 02B6B0 zone1_2z 02B6B0 zone7_1z 02B6B0 zone6_1z 02B6B0 zone5_1z 02B6B0 zone4_1z 02B6B0 zone3_1z 02B6B0 zone2_1z 02B6B0 zone1_1z 02B6B0 bigringcg 02B6B4 asettbl 040000 asettbl10 040096 asettbl11 0403A8 asettbl12 040798 asettbl20 040C8A asettbl21 040C90 asettbl23 040C96 asettbl22 040C96 kassya10 040C9C kassya11 040CCE kassya20 040D00 kassya21 040D32 kassya30 040D64 kassya31 040DAE asettbl30 040DEC asettbl31 040E5E asettbl32 040E64 asettbl40 040E6A asettbl41 041080 asettbl42 0412AE asettbl50 0412B4 asettbl51 0413BC asettbl52 0413C2 asettbl60 0413C8 asettbl61 0413CE asettbl62 0413D4 beltc10 0413E6 beltc11 041418 beltc12 04144A beltc13 04147C beltc14 0414AE beltc15 0414E0 asettbl70 041518 asettbl70z 041674 asettbl60z 041674 asettbl10z 041674 asettbl50z 041674 asettbl40z 041674 asettbl30z 041674 asettbl20z 041674 ringacttbl 050000 ringact11 050030 ringact12 05017A ringact13 0502A4 ringact21 0503CE ringact22 05045C ringact23 0504BA ringact80 050538 ringact00 0506AA ringact01 05080C ringact02 05099A ringact03 05099C sound 071B4C pcm_top 072E7C pcm_end 0745DC playcg 080000 playpat 0914C0 ply000 09160E ply001 091610 ply002 091632 ply003 091644 ply004 09166E ply005 091698 ply006 0916C2 ply007 0916E4 ply008 091706 ply009 091718 ply010 09172A ply011 09173C ply012 09175E ply013 091780 ply014 091792 ply015 0917A4 ply016 0917BE ply017 0917D8 ply018 0917F2 ply019 091814 ply020 091836 ply021 091850 ply022 09186A ply023 091884 ply024 09189E ply025 0918C0 ply026 0918EA ply027 091914 ply028 091936 ply029 091958 ply030 09197A ply031 09199C ply032 0919BE ply033 0919E8 ply034 091A0A ply035 091A2C ply036 091A4E ply037 091A68 ply038 091A7A ply039 091A8C ply040 091A9E ply041 091AB8 ply042 091AD2 ply043 091AEC ply044 091AFE ply045 091B10 ply046 091B22 ply047 091B34 ply048 091B4E ply049 091B70 ply050 091B92 ply051 091BBC ply052 091BDE ply053 091C00 ply054 091C22 ply055 091C44 ply056 091C66 ply057 091C88 ply058 091CAA ply059 091CCC ply060 091CEE ply061 091D00 ply062 091D12 ply063 091D24 ply064 091D36 ply065 091D48 ply066 091D5A ply067 091D6C ply068 091D7E ply069 091D90 ply070 091DA2 ply071 091DB4 ply072 091DC6 ply073 091DD8 ply074 091DEA ply075 091DFC ply076 091E0E ply077 091E20 ply078 091E32 ply079 091E44 ply080 091E56 ply081 091E68 ply082 091E7A ply083 091E8C ply084 091E9E ply085 091EB0 ply086 091EC2 ply087 091ED4 ply088 091EE6 ply089 091EF8 ply090 091F0A ply091 091F1C ply092 091F2E ply093 091F40 ply094 091F52 ply095 091F64 ply096 091F76 ply097 091F88 ply098 091F9A ply099 091FAC ply100 091FBE ply101 091FD0 ply102 091FE2 ply103 091FF4 ply104 092006 ply105 092018 ply106 09202A ply107 09203C ply108 09204E ply109 092058 ply110 092062 ply111 09206C ply112 092076 ply113 092080 ply114 09208A ply115 092094 ply116 09209E ply117 0920A8 ply118 0920B2 ply119 0920BC ply120 0920D6 ply121 0920F0 ply122 09210A ply123 092124 ply124 092146 ply125 092168 ply126 09218A ply127 0921A4 ply128 0921AE ply129 0921B8 ply130 0921D2 ply131 0921EC ply132 092206 ply133 092220 ply134 092232 ply135 092244 ply136 092256 ply137 092268 ply138 09228A ply139 09229C ply140 0922B6 ply141 0922D0 ply142 0922E2 ply143 0922F4 ply144 092306 ply145 092318 ply146 09233A ply147 09235C ply148 09237E ply149 092398 ply150 0923B2 ply151 0923D4 ply152 0923EE ply153 092410 ply154 092432 ply155 09244C ply156 092466 ply157 092480 ply158 092492 ply159 09249C ply160 0924AE ply161 0924C8 ply162 0924E2 ply163 0924FC ply164 09250E ply165 092520 ply166 09253A foxcg 09254C playwrtpat 09DA4C plwpat 09DA4C plw000 09DB9A plw001 09DB9C plw002 09DBA6 plw003 09DBAC plw004 09DBB8 plw005 09DBC4 plw006 09DBD0 plw007 09DBDA plw008 09DBE4 plw009 09DBEA plw010 09DBF0 plw011 09DBF6 plw012 09DC00 plw013 09DC0A plw014 09DC10 plw015 09DC16 plw016 09DC1E plw017 09DC26 plw018 09DC2E plw019 09DC38 plw020 09DC42 plw021 09DC4A plw022 09DC52 plw023 09DC5A plw024 09DC62 plw025 09DC6C plw026 09DC78 plw027 09DC84 plw028 09DC8E plw029 09DC98 plw030 09DCA2 plw031 09DCAC plw032 09DCB6 plw033 09DCC2 plw034 09DCCC plw035 09DCD6 plw036 09DCE0 plw037 09DCE8 plw038 09DCEE plw039 09DCF4 plw040 09DCFA plw041 09DD02 plw042 09DD0A plw043 09DD12 plw044 09DD18 plw045 09DD1E plw046 09DD24 plw047 09DD2A plw048 09DD32 plw049 09DD3C plw050 09DD46 plw051 09DD52 plw052 09DD5C plw053 09DD66 plw054 09DD70 plw055 09DD7A plw056 09DD84 plw057 09DD8E plw058 09DD98 plw059 09DDA2 plw068 09DDAC plw064 09DDAC plw060 09DDAC plw069 09DDB2 plw065 09DDB2 plw061 09DDB2 plw070 09DDB8 plw066 09DDB8 plw062 09DDB8 plw071 09DDBE plw067 09DDBE plw063 09DDBE plw080 09DDC4 plw076 09DDC4 plw072 09DDC4 plw081 09DDCA plw077 09DDCA plw073 09DDCA plw082 09DDD0 plw078 09DDD0 plw074 09DDD0 plw083 09DDD6 plw079 09DDD6 plw075 09DDD6 plw092 09DDDC plw088 09DDDC plw084 09DDDC plw093 09DDE2 plw089 09DDE2 plw085 09DDE2 plw094 09DDE8 plw090 09DDE8 plw086 09DDE8 plw095 09DDEE plw091 09DDEE plw087 09DDEE plw104 09DDF4 plw100 09DDF4 plw096 09DDF4 plw105 09DDFA plw101 09DDFA plw097 09DDFA plw106 09DE00 plw102 09DE00 plw098 09DE00 plw107 09DE06 plw103 09DE06 plw099 09DE06 plw108 09DE0C plw109 09DE10 plw110 09DE14 plw111 09DE18 plw112 09DE1C plw113 09DE20 plw114 09DE24 plw115 09DE28 plw116 09DE2C plw117 09DE30 plw118 09DE34 plw119 09DE38 plw120 09DE40 plw121 09DE48 plw122 09DE50 plw123 09DE58 plw124 09DE62 plw125 09DE6C plw126 09DE76 plw127 09DE7E plw128 09DE82 plw129 09DE86 plw130 09DE8E plw131 09DE96 plw132 09DE9E plw133 09DEA6 plw134 09DEAC plw135 09DEB2 plw136 09DEB8 plw137 09DEBE plw138 09DEC8 plw139 09DECE plw140 09DED6 plw141 09DEDE plw142 09DEE4 plw143 09DEEA plw144 09DEF0 plw147 09DEF6 plw145 09DEF6 plw146 09DF00 plw149 09DF06 plw148 09DF06 plw150 09DF0E plw151 09DF18 plw152 09DF20 plw153 09DF2A plw154 09DF34 plw155 09DF3C plw156 09DF44 plw157 09DF4C plw158 09DF52 plw159 09DF56 plw160 09DF5C plw161 09DF64 plw162 09DF6C plw163 09DF74 plw164 09DF7A plw165 09DF80 plw166 09DF88 bariacg 09DF8E mutekicg 09E114 stopfxcg 09E1FC spinsfxcg 09E3FC exit2cg 09ED3C foxpat 09FB3C foxsp000 09FC46 foxsp001 09FC48 foxsp002 09FC5A foxsp003 09FC6C foxsp004 09FC7E foxsp005 09FC90 foxsp006 09FC9A foxsp007 09FCA4 foxsp008 09FCB6 foxsp009 09FCC8 foxsp010 09FCD2 foxsp011 09FCDC foxsp012 09FCE6 foxsp013 09FCF0 foxsp014 09FCFA foxsp015 09FD14 foxsp016 09FD2E foxsp017 09FD48 foxsp018 09FD62 foxsp019 09FD7C foxsp020 09FD96 foxsp021 09FDB0 foxsp022 09FDCA foxsp023 09FDE4 foxsp024 09FDFE foxsp025 09FE18 foxsp026 09FE32 foxsp027 09FE4C foxsp028 09FE66 foxsp029 09FE80 foxsp030 09FE9A foxsp031 09FEB4 foxsp032 09FECE foxsp033 09FEE8 foxsp034 09FF02 foxsp035 09FF1C foxsp036 09FF36 foxsp037 09FF50 foxsp038 09FF6A foxsp039 09FF7C foxsp040 09FF96 foxsp041 09FFA8 foxsp042 09FFC2 foxsp043 09FFD4 foxsp044 09FFEE foxsp045 0A0000 foxsp046 0A001A foxsp047 0A002C foxsp048 0A003E foxsp049 0A0050 foxsp050 0A0062 foxsp051 0A0074 foxsp052 0A0086 foxsp053 0A00A0 foxsp054 0A00BA foxsp055 0A00D4 foxsp056 0A00EE foxsp057 0A0108 foxsp058 0A0122 foxsp061 0A013C foxsp059 0A013C foxsp060 0A0156 foxsp062 0A0170 foxsp063 0A018A foxsp064 0A01A4 foxsp065 0A01BE foxsp066 0A01D8 foxsp067 0A01F2 foxsp068 0A020C foxsp069 0A0226 foxsp070 0A0240 foxsp071 0A024A foxsp072 0A0254 foxsp073 0A025E foxsp074 0A0268 foxsp075 0A0272 foxsp076 0A027C foxsp077 0A0286 foxsp078 0A0290 foxsp079 0A029A foxsp080 0A02A4 foxsp081 0A02AE foxsp082 0A02B8 foxsp083 0A02C2 foxsp084 0A02CC foxsp085 0A02D6 foxsp086 0A02E0 foxsp087 0A02EA foxsp088 0A02F4 foxsp089 0A02FE foxsp090 0A0310 foxsp091 0A0322 foxsp092 0A032C foxsp093 0A0336 foxsp094 0A0340 foxsp095 0A0352 foxsp096 0A0364 foxsp097 0A036E foxsp098 0A0378 foxsp099 0A0382 foxsp100 0A0394 foxsp101 0A03A6 foxsp102 0A03B8 foxsp103 0A03CA foxsp104 0A03DC foxsp105 0A03EE foxsp106 0A0400 foxsp107 0A0412 foxsp108 0A041C foxsp109 0A042E foxsp110 0A0440 foxsp111 0A0452 foxsp112 0A0464 foxsp113 0A0476 foxsp114 0A0488 foxsp115 0A049A foxsp116 0A04AC foxsp117 0A04B6 foxsp118 0A04C0 foxsp119 0A04D2 foxsp120 0A04DC foxsp121 0A04E6 foxsp122 0A04F0 foxsp123 0A04FA foxsp124 0A0504 foxsp125 0A050E foxsp126 0A0518 foxsp127 0A0522 foxsp128 0A0534 foxsp129 0A0546 foxsp130 0A0550 foxsp131 0A055A foxsp132 0A0564 foxwrtpat 0A056E foxw000 0A0678 foxw001 0A067A foxw002 0A0680 foxw003 0A0686 foxw004 0A068C foxw005 0A0692 foxw006 0A0696 foxw007 0A069A foxw008 0A06A0 foxw009 0A06A6 foxw010 0A06AA foxw011 0A06AE foxw012 0A06B2 foxw013 0A06B6 foxw014 0A06BA foxw015 0A06C2 foxw016 0A06CA foxw017 0A06D2 foxw018 0A06DA foxw019 0A06E2 foxw020 0A06EA foxw021 0A06F2 foxw022 0A06FA foxw023 0A0702 foxw024 0A070A foxw025 0A0712 foxw026 0A071A foxw027 0A0722 foxw028 0A072A foxw029 0A0732 foxw030 0A073A foxw031 0A0742 foxw032 0A074A foxw033 0A0752 foxw034 0A075A foxw035 0A0762 foxw036 0A076A foxw037 0A0772 foxw038 0A077A foxw039 0A0780 foxw040 0A0788 foxw041 0A078E foxw042 0A0796 foxw043 0A079C foxw044 0A07A4 foxw045 0A07AA foxw046 0A07B2 foxw047 0A07B8 foxw048 0A07BE foxw050 0A07C4 foxw051 0A07CA foxw052 0A07D0 foxw053 0A07D8 foxw054 0A07E0 foxw055 0A07E8 foxw056 0A07F0 foxw057 0A07F8 foxw058 0A0800 foxw061 0A0808 foxw059 0A0808 foxw060 0A0810 foxw062 0A0818 foxw063 0A0820 foxw064 0A0828 foxw065 0A0830 foxw066 0A0838 foxw067 0A0840 foxw068 0A0848 foxw069 0A0850 foxw070 0A0858 foxw071 0A085C foxw072 0A0860 foxw129 0A0864 foxw073 0A0864 foxw130 0A0868 foxw074 0A0868 foxw131 0A086C foxw075 0A086C foxw132 0A0870 foxw076 0A0870 foxw077 0A0874 foxw078 0A0878 foxw079 0A087C foxw080 0A0880 foxw081 0A0884 foxw082 0A0888 foxw083 0A088C foxw084 0A0890 foxw085 0A0894 foxw086 0A0898 foxw087 0A089C foxw088 0A08A0 foxw089 0A08A4 foxw090 0A08AA foxw091 0A08B0 foxw092 0A08B4 foxw093 0A08B8 foxw095 0A08BC foxw094 0A08BC foxw096 0A08C2 foxw097 0A08C6 foxw098 0A08CA foxw099 0A08CE foxw100 0A08D4 foxw101 0A08DA foxw102 0A08E0 foxw103 0A08E6 foxw104 0A08EC foxw105 0A08F2 foxw106 0A08F8 foxw107 0A08FE foxw108 0A0902 foxw109 0A0908 foxw112 0A090E foxw110 0A090E foxw111 0A0914 foxw114 0A091A foxw113 0A091A foxw115 0A0920 foxw116 0A0926 foxw117 0A092A foxw118 0A092E foxw119 0A0934 foxw120 0A0938 foxw121 0A093C foxw122 0A0940 foxw123 0A0944 foxw124 0A0948 foxw125 0A094C foxw126 0A0950 foxw127 0A0954 foxw128 0A095A logocg 0A0960 logomap 0A0DD0 titleamap 0A0ECC titlebmap 0A1024 titlecg 0A12FC titlespcg 0A2CA6 greencg 0A37EA burankocg 0A3834 hashicg 0A394E movecg 0A3A3A tamacg 0A3A82 togehcg 0A3C20 togehcg2 0A3E34 jyamacg 0A3F60 brkabecg 0A408E kagebcg 0A412C fire00cg 0A418C moekasucg 0A42C4 taki00cg 0A43D2 fball00cg 0A44D8 hashi00cg 0A4626 cablecarcg 0A46FE door00cg 0A49F2 cso00cg 0A4A6A brig08cg 0A4C02 falls08cg 0A4D7A gem08cg 0A50DC pltfrm08cg 0A534E frntlite08cg 0A540E cork08cg 0A564A kemuri0dcg 0A57E4 dai0dcg 0A5904 nami0dcg 0A5BF0 swichcg 0A5D60 banevcg 0A5E38 banehcg 0A5F54 bane45cg 0A601E scorecg 0A61F2 playnocg 0A62FA ringcg 0A6410 itemcg 0A6504 togecg 0A692E tencg 0A697E savecg 0A6A58 gatorcg 0A6AFE waspcg 0A6EA0 bbatcg 0A7086 octcg 0A73DC stegocg 0A76FC redzcg 0A7AF8 billfishcg 0A7ECE seahorsecg 0A83C6 bballcg 0A8814 mamabubcg 0A8AAA bubblercg 0A8CD6 snailcg 0A8EF8 sandcrabcg 0A90F4 bfishcg 0A9476 bossbacg 0A9682 zdbcg 0A9DBE bossbmcg 0AA31C bossafbcg 0AA9A4 bosssmcg 0AAA22 boss00cg 0AAB08 bosshcg 0AB2F4 butacg 0AB3E8 kanicg 0AB7A8 hachicg 0ABC96 bakuhacg 0AC03C moguracg 0AC224 fishcg 0AC90E fish2cg 0ACB76 arumacg 0ACE00 musicg 0AD324 kamerecg 0AD5AE yadocg 0ADBCC batcg 0ADFB4 usacg 0AE2B0 brobocg 0AE4F8 unicg 0AE790 imocg 0AE96E zonecg 0AEAFC yararecg 0AF10A overcg 0AF770 jumpcg 0AF902 jump2cg 0AFA04 golecg 0AFAE0 ebigringcg 0AFF5C btencg 0B00D0 contcg 0B03D2 sdsoniccg 0B0682 usagicg 0B08BC niwacg 0B0A14 pengcg 0B0B70 azarcg 0B0CEC fbutacg 0B0E08 fliccg 0B0F3E risucg 0B1078 zone00blk 0B11D4 zone00cg 0B2174 zone00map 0B4FAC zone08blk 0BCFAC zone08cg 0BE58C zone08pccg 0C129A zone08map 0C140E zone0dblk 0C940E zone0dcg 0CA3AE zone0dpccg 0CCD56 zone0dmap 0CCFB2 zone1blk 0D4FB2 zone1cg 0D5DB2 enkeicg 0D936E zone1map 0DA9CE scdtblwk FE0000 scdtblwk2 FE2000 scddirtbl FE4000 For those curious, these are the new symbols that I extracted. I do recall seeing a few of these being discussed on various pages, but I don't think I've seen it properly documented, so here you go: Spoiler Code: bossvac 000000 (dummied out) vacumeguy 000000 (dummied out) explode 000000 (dummied out) burankoposiset 007D6A burankoposiset2 007DAE burankopat 007EAE buranko0dpat 007EDA ballpat 007F4A shimapat2 0084AE fishpat 00B11E speedset 00C706 frameoutchk 00C7AE frameoutchkd 00C81A dualmodesub 00CFC2 dualmodesub2 00CFDE ringcolchk 00D2F0 kamerepat 00E4A8 musipat 00EA80 ridechksub_t 00EEC0 jumpcolsub 00FDCC emycol_d 0128C6 zone1scd 024200 zone1scdb 02439A zone4scd 024534 zone4scdb 024834 zone6scd 024B34 zone3scd 024B34 zone2scd 024B34 zone6scdb 024E34 zone3scdb 024E34 zone2scdb 024E34 zone5scd 025134 zone5scdb 025434 efect08acg 027098 zone1_1a 0282C0 zone1_2a 0283B2 zone1_3a 02847A zone1_3b 02859C zone1_2b 02859C zone1_1b 02859C zone4_1a 0285BE zone4_2a 028DC0 zone4_3a 0295C2 zone4_3b 02A5C6 zone4_2b 02A5C6 zone4_1b 02A5C6 zone7_3a 02A5D0 zone6_3a 02A5D0 zone3_3a 02A5D0 zone2_3a 02A5D0 zone7_2a 02A5D0 zone6_2a 02A5D0 zone3_2a 02A5D0 zone2_2a 02A5D0 zone7_1a 02A5D0 zone6_1a 02A5D0 zone3_1a 02A5D0 zone2_1a 02A5D0 zone5_3a 02ADD2 zone5_2a 02ADD2 zone5_1a 02ADD2 zone7_3b 02B5D4 zone6_3b 02B5D4 zone3_3b 02B5D4 zone2_3b 02B5D4 zone7_2b 02B5D4 zone6_2b 02B5D4 zone3_2b 02B5D4 zone2_2b 02B5D4 zone7_1b 02B5D4 zone6_1b 02B5D4 zone3_1b 02B5D4 zone2_1b 02B5D4 zone5_3b 02B666 zone5_2b 02B666 zone5_1b 02B666 zone7_2z 02B6B0 zone6_2z 02B6B0 zone5_2z 02B6B0 zone4_2z 02B6B0 zone3_2z 02B6B0 zone2_2z 02B6B0 zone1_2z 02B6B0 zone7_1z 02B6B0 zone6_1z 02B6B0 zone5_1z 02B6B0 zone4_1z 02B6B0 zone3_1z 02B6B0 zone2_1z 02B6B0 zone1_1z 02B6B0 kassya10 040C9C kassya11 040CCE kassya20 040D00 kassya21 040D32 kassya30 040D64 kassya31 040DAE beltc10 0413E6 beltc11 041418 beltc12 04144A beltc13 04147C beltc14 0414AE beltc15 0414E0 asettbl50z 041674 asettbl40z 041674 asettbl30z 041674 sound 071B4C playcg 080000 plwpat 09DA4C spinsfxcg 09E3FC foxsp127 0A0522 foxwrtpat 0A056E foxw000 0A0678 foxw001 0A067A foxw002 0A0680 foxw003 0A0686 foxw004 0A068C foxw005 0A0692 foxw006 0A0696 foxw007 0A069A foxw008 0A06A0 foxw009 0A06A6 foxw010 0A06AA foxw011 0A06AE foxw012 0A06B2 foxw013 0A06B6 foxw014 0A06BA foxw015 0A06C2 foxw016 0A06CA foxw017 0A06D2 foxw018 0A06DA foxw019 0A06E2 foxw020 0A06EA foxw021 0A06F2 foxw022 0A06FA foxw023 0A0702 foxw024 0A070A foxw025 0A0712 foxw026 0A071A foxw027 0A0722 foxw028 0A072A foxw029 0A0732 foxw030 0A073A foxw031 0A0742 foxw032 0A074A foxw033 0A0752 foxw034 0A075A foxw035 0A0762 foxw036 0A076A foxw037 0A0772 foxw038 0A077A foxw039 0A0780 foxw040 0A0788 foxw041 0A078E foxw042 0A0796 foxw043 0A079C foxw044 0A07A4 foxw045 0A07AA foxw046 0A07B2 foxw047 0A07B8 foxw048 0A07BE logomap 0A0DD0 titleamap 0A0ECC titlebmap 0A1024 titlecg 0A12FC tamacg 0A3A82 togehcg2 0A3E34 moekasucg 0A42C4 fball00cg 0A44D8 cablecarcg 0A46FE octcg 0A73DC seahorsecg 0A83C6 butacg 0AB3E8 kanicg 0AB7A8 hachicg 0ABC96 bakuhacg 0AC03C fish2cg 0ACB76 yadocg 0ADBCC batcg 0ADFB4 brobocg 0AE4F8 zone00blk 0B11D4 zone08blk 0BCFAC zone08pccg 0C129A zone0dblk 0C940E zone0dcg 0CA3AE zone1blk 0D4FB2 scdtblwk FE0000 scddirtbl FE4000
So, I managed to track a couple more labels from the Sonic CD Gems Collection decompilation, related to stage data. Sonic CD calls the pointer to chunk data "pmapwk", and calls the buffer for block data "blockwk". This actually checks out with the Sonic 2 labels. For example, Emerald Hill's blocks are called "zone00blk" and its chunks are called "zone00map". I do think it's possible that the "p" in "pmapwk" stands for "pointer" in Sonic CD, since the palette buffer is called "lpcolorwk", and the horizontal scroll buffer is called "lphscrollbuff", and they all point to memory located outside of the core game code: Code: pmapwk = (unsigned short*)**pBufTbl++; lpcolorwk = (PALETTEENTRY*)**pBufTbl++; lpcolorwk2 = (PALETTEENTRY*)**pBufTbl++; lpcolorwk3 = (PALETTEENTRY*)**pBufTbl++; lpcolorwk4 = (PALETTEENTRY*)**pBufTbl++; lphscrollbuff = (int_union*)**pBufTbl++; Confusingly, Sonic CD also refers to the foreground layout buffer as "mapwka", and the background layout buffer as "mapwkb". In Sonic 2, the labels for the actual data in ROM are just "zoneZ_AL", with "Z" being the zone number (GHZ = "1"), "A" being the act number (act 1 = "1"), and "L" being the layer type ("a" = foreground, "b" = background). GHZ1's foreground data is called "zone1_1a", for example. The index table for these layouts is called "zonemaptbl". Personally, I think the chunk buffer is called "mapwk", with "mapwka" and "mapwkb" referring to the layouts, considering they are arrays of chunk IDs. I don't think it's unheard of, honestly, because there's "waterflag", the flag for when the water palette takes up the entire screen, and then "water_flag", the water events routine ID.
I have a hunch on what this could be. In Sonic 2 Nick Arcade, a good chunk of the special stage graphics were removed, including the sprite data for the walls, because they were grouped with the graphics data in Sonic 1. However, the sprite table for the special stage still includes the entries for the walls, except they all point to where "goalpat" and co. are instead. So, I think "metpat" refers to the walls, with the data removed, and its label moved in with the rest of the block sprites. Also... I present, an extraction of scraps of earlier code from the Sonic 2 Nick Arcade prototype ROM, including linker work data, with disassemblies, using official symbol names where possible.