(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.