Yes and no... I would like to create a hack that basically tells the story of the time between Sonic 1 and 2, but I don't know that I'm happy enough with BTS to want to port it. Plus, I'd like more creative freedom. So if this is something you're actually interested in doing, please message me! I'd love to contribute my spare time to a project like this. (Since I have indeed had a similar thought, I'm curious... have you ever thought of making a Sonic 1 hack with 2 acts per zone, or a Sonic 2 hack with three per zone?) ...And, to completely change the subject, where exactly is the code for the title card lettering in the Sonic 1 Github disassembly? For some reason I can't find it anywhere, and I didn't find it even by searching.
Currently, I'm having an issue in regards to porting Sonic 1 bosses to Sonic 2. While I'm having no difficultly porting Sonic 3 bosses as of recent, there's an error with the Sonic 1 bosses that I can't find my way around. Spoiler > > >Sonic 1 boss general parts/Boss - Main.bin(1): error: invalid symbol name > > > <0x80>l<0x80><0x03> > > > €l€ > > >Sonic 1 boss general parts/Eggman Animations.asm(4): error: invalid symbol name > > > @ship > > > Ani_Eggman: dc.w @ship-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(5): error: invalid symbol name > > > @facenormal1 > > > dc.w @facenormal1-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(6): error: invalid symbol name > > > @facenormal2 > > > dc.w @facenormal2-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(7): error: invalid symbol name > > > @facenormal3 > > > dc.w @facenormal3-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(8): error: invalid symbol name > > > @facelaugh > > > dc.w @facelaugh-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(9): error: invalid symbol name > > > @facehit > > > dc.w @facehit-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(10): error: invalid symbol name > > > @facepanic > > > dc.w @facepanic-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(11): error: invalid symbol name > > > @blank > > > dc.w @blank-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(12): error: invalid symbol name > > > @flame1 > > > dc.w @flame1-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(13): error: invalid symbol name > > > @flame2 > > > dc.w @flame2-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(14): error: invalid symbol name > > > @facedefeat > > > dc.w @facedefeat-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(15): error: invalid symbol name > > > @escapeflame > > > dc.w @escapeflame-Ani_Eggman > > >Sonic 1 boss general parts/Eggman Animations.asm(16): error: invalid symbol name > > > @ship > > > @ship: dc.b $F, 0, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(18): error: invalid symbol name > > > @facenormal1 > > > @facenormal1: dc.b 5, 1, 2, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(20): error: invalid symbol name > > > @facenormal2 > > > @facenormal2: dc.b 3, 1, 2, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(22): error: invalid symbol name > > > @facenormal3 > > > @facenormal3: dc.b 1, 1, 2, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(24): error: invalid symbol name > > > @facelaugh > > > @facelaugh: dc.b 4, 3, 4, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(26): error: invalid symbol name > > > @facehit > > > @facehit: dc.b $1F, 5, 1, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(28): error: invalid symbol name > > > @facepanic > > > @facepanic: dc.b 3, 6, 1, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(30): error: invalid symbol name > > > @blank > > > @blank: dc.b $F, $A, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(32): error: invalid symbol name > > > @flame1 > > > @flame1: dc.b 3, 8, 9, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(34): error: invalid symbol name > > > @flame2 > > > @flame2: dc.b 1, 8, 9, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(36): error: invalid symbol name > > > @facedefeat > > > @facedefeat: dc.b $F, 7, afEnd > > >Sonic 1 boss general parts/Eggman Animations.asm(38): error: invalid symbol name > > > @escapeflame > > > @escapeflame: dc.b 2, 9, 8, $B, $C, $B, $C, 9, 8, afBack, 2 > > >Sonic 1 boss general parts/Eggman Maps.asm(4): error: invalid symbol name > > > @ship > > > Map_Eggman: dc.w @ship-Map_Eggman, @facenormal1-Map_Eggman > > >Sonic 1 boss general parts/Eggman Maps.asm(5): error: invalid symbol name > > > @facenormal2 > > > dc.w @facenormal2-Map_Eggman, @facelaugh1-Map_Eggman > > >Sonic 1 boss general parts/Eggman Maps.asm(6): error: invalid symbol name > > > @facelaugh2 > > > dc.w @facelaugh2-Map_Eggman, @facehit-Map_Eggman > > >Sonic 1 boss general parts/Eggman Maps.asm(7): error: invalid symbol name > > > @facepanic > > > dc.w @facepanic-Map_Eggman, @facedefeat-Map_Eggman > > >Sonic 1 boss general parts/Eggman Maps.asm(8): error: invalid symbol name > > > @flame1 > > > dc.w @flame1-Map_Eggman, @flame2-Map_Eggman > > >Sonic 1 boss general parts/Eggman Maps.asm(9): error: invalid symbol name > > > @blank > > > dc.w @blank-Map_Eggman, @escapeflame1-Map_Eggman > > >Sonic 1 boss general parts/Eggman Maps.asm(10): error: invalid symbol name > > > @escapeflame2 > > > dc.w @escapeflame2-Map_Eggman > > >Sonic 1 boss general parts/Eggman Maps.asm(11): error: invalid symbol name > > > @ship > > > @ship: dc.b 6 > > >Sonic 1 boss general parts/Eggman Maps.asm(18): error: invalid symbol name > > > @facenormal1 > > > @facenormal1: dc.b 2 > > >Sonic 1 boss general parts/Eggman Maps.asm(21): error: invalid symbol name > > > @facenormal2 > > > @facenormal2: dc.b 2 > > >Sonic 1 boss general parts/Eggman Maps.asm(24): error: invalid symbol name > > > @facelaugh1 > > > @facelaugh1: dc.b 3 > > >Sonic 1 boss general parts/Eggman Maps.asm(28): error: invalid symbol name > > > @facelaugh2 > > > @facelaugh2: dc.b 3 > > >Sonic 1 boss general parts/Eggman Maps.asm(32): error: invalid symbol name > > > @facehit > > > @facehit: dc.b 3 > > >Sonic 1 boss general parts/Eggman Maps.asm(36): error: invalid symbol name > > > @facepanic > > > @facepanic: dc.b 3 > > >Sonic 1 boss general parts/Eggman Maps.asm(40): error: invalid symbol name > > > @facedefeat > > > @facedefeat: dc.b 4 > > >Sonic 1 boss general parts/Eggman Maps.asm(45): error: invalid symbol name > > > @flame1 > > > @flame1: dc.b 1 > > >Sonic 1 boss general parts/Eggman Maps.asm(47): error: invalid symbol name > > > @flame2 > > > @flame2: dc.b 1 > > >Sonic 1 boss general parts/Eggman Maps.asm(49): error: invalid symbol name > > > @blank > > > @blank: dc.b 0 > > >Sonic 1 boss general parts/Eggman Maps.asm(50): error: invalid symbol name > > > @escapeflame1 > > > @escapeflame1: dc.b 2 > > >Sonic 1 boss general parts/Eggman Maps.asm(53): error: invalid symbol name > > > @escapeflame2 > > > @escapeflame2: dc.b 2 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(7): error: addressing mode not allowed on 68000 > > > move.b obRoutine(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(7): error: addressing mode not allowed here > > > move.b obRoutine(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(22): error: addressing mode not allowed on 68000 > > > move.w #$1E10,obX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(22): error: addressing mode not allowed here > > > move.w #$1E10,obX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(23): error: addressing mode not allowed on 68000 > > > move.w #$5C0,obY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(23): error: addressing mode not allowed here > > > move.w #$5C0,obY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(24): error: addressing mode not allowed on 68000 > > > move.w obX(a0),$30(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(24): error: addressing mode not allowed here > > > move.w obX(a0),$30(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(25): error: addressing mode not allowed on 68000 > > > move.w obY(a0),$38(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(25): error: addressing mode not allowed here > > > move.w obY(a0),$38(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(26): error: addressing mode not allowed on 68000 > > > move.b #$F,obColType(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(26): error: addressing mode not allowed here > > > move.b #$F,obColType(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(27): error: addressing mode not allowed on 68000 > > > move.b #8,obColProp(a0) ; set number of hits to 8 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(27): error: addressing mode not allowed here > > > move.b #8,obColProp(a0) ; set number of hits to 8 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(28): error: addressing mode not allowed on 68000 > > > move.b #4,obPriority(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(28): error: addressing mode not allowed here > > > move.b #4,obPriority(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(39): error: addressing mode not allowed on 68000 > > > move.w obX(a0),obX(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(39): error: addressing mode not allowed here > > > move.w obX(a0),obX(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(40): error: addressing mode not allowed on 68000 > > > move.w obY(a0),obY(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(40): error: addressing mode not allowed here > > > move.w obY(a0),obY(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(43): error: addressing mode not allowed on 68000 > > > bclr #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(43): error: addressing mode not allowed here > > > bclr #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(44): error: addressing mode not allowed on 68000 > > > clr.b ob2ndRout(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(44): error: addressing mode not allowed here > > > clr.b ob2ndRout(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(45): error: addressing mode not allowed on 68000 > > > move.b (a2)+,obRoutine(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(45): error: addressing mode not allowed here > > > move.b (a2)+,obRoutine(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(46): error: addressing mode not allowed on 68000 > > > move.b (a2)+,obAnim(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(46): error: addressing mode not allowed here > > > move.b (a2)+,obAnim(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(47): error: addressing mode not allowed on 68000 > > > move.b obPriority(a0),obPriority(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(47): error: addressing mode not allowed here > > > move.b obPriority(a0),obPriority(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(48): error: addressing mode not allowed on 68000 > > > move.l #Map_Eggman,obMap(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(48): error: addressing mode not allowed here > > > move.l #Map_Eggman,obMap(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(49): error: addressing mode not allowed on 68000 > > > move.w #$400,obGfx(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(49): error: addressing mode not allowed here > > > move.w #$400,obGfx(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(50): error: addressing mode not allowed on 68000 > > > move.b #4,obRender(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(50): error: addressing mode not allowed here > > > move.b #4,obRender(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(51): error: addressing mode not allowed on 68000 > > > move.b #$20,obActWid(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(51): error: addressing mode not allowed here > > > move.b #$20,obActWid(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(56): error: short addressing not allowed > > > lea (v_player).w,a1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(56): error: addressing mode not allowed here > > > lea (v_player).w,a1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(58): error: addressing mode not allowed on 68000 > > > move.b ob2ndRout(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(58): error: addressing mode not allowed here > > > move.b ob2ndRout(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(64): error: addressing mode not allowed on 68000 > > > and.b obStatus(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(64): error: addressing mode not allowed here > > > and.b obStatus(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(65): error: addressing mode not allowed on 68000 > > > andi.b #$FC,obRender(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(65): error: addressing mode not allowed here > > > andi.b #$FC,obRender(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(66): error: addressing mode not allowed on 68000 > > > or.b d0,obRender(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(66): error: addressing mode not allowed here > > > or.b d0,obRender(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(76): error: addressing mode not allowed on 68000 > > > move.w obX(a1),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(76): error: addressing mode not allowed here > > > move.w obX(a1),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(79): error: addressing mode not allowed on 68000 > > > move.w #-$180,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(79): error: addressing mode not allowed here > > > move.w #-$180,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(80): error: addressing mode not allowed on 68000 > > > move.w #$60,obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(80): error: addressing mode not allowed here > > > move.w #$60,obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(81): error: addressing mode not allowed on 68000 > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(81): error: addressing mode not allowed here > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(85): error: addressing mode not allowed on 68000 > > > move.w $38(a0),obY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(85): error: addressing mode not allowed here > > > move.w $38(a0),obY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(86): error: addressing mode not allowed on 68000 > > > move.w $30(a0),obX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(86): error: addressing mode not allowed here > > > move.w $30(a0),obX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(91): error: addressing mode not allowed on 68000 > > > tst.b obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(91): error: addressing mode not allowed here > > > tst.b obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(93): error: addressing mode not allowed on 68000 > > > tst.b obColType(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(93): error: addressing mode not allowed here > > > tst.b obColType(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(98): error: invalid operand size > > > sfx sfx_HitBoss,0,0,0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(101): error: short addressing not allowed > > > lea (v_pal_dry+$22).w,a1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(101): error: addressing mode not allowed here > > > lea (v_pal_dry+$22).w,a1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(111): error: addressing mode not allowed on 68000 > > > move.b #$F,obColType(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(111): error: addressing mode not allowed here > > > move.b #$F,obColType(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(133): error: addressing mode not allowed on 68000 > > > clr.w obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(133): error: addressing mode not allowed here > > > clr.w obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(140): error: addressing mode not allowed on 68000 > > > clr.w obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(140): error: addressing mode not allowed here > > > clr.w obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(145): error: addressing mode not allowed on 68000 > > > move.w #$140,obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(145): error: addressing mode not allowed here > > > move.w #$140,obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(146): error: addressing mode not allowed on 68000 > > > move.w #-$200,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(146): error: addressing mode not allowed here > > > move.w #-$200,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(147): error: addressing mode not allowed on 68000 > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(147): error: addressing mode not allowed here > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(158): error: addressing mode not allowed on 68000 > > > clr.w obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(158): error: addressing mode not allowed here > > > clr.w obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(165): error: addressing mode not allowed on 68000 > > > clr.w obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(165): error: addressing mode not allowed here > > > clr.w obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(170): error: addressing mode not allowed on 68000 > > > move.w #-$180,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(170): error: addressing mode not allowed here > > > move.w #-$180,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(171): error: addressing mode not allowed on 68000 > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(171): error: addressing mode not allowed here > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(182): error: addressing mode not allowed on 68000 > > > move.w #$140,obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(182): error: addressing mode not allowed here > > > move.w #$140,obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(183): error: addressing mode not allowed on 68000 > > > move.w #-$80,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(183): error: addressing mode not allowed here > > > move.w #-$80,obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(186): error: addressing mode not allowed on 68000 > > > asl obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(186): error: addressing mode not allowed here > > > asl obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(187): error: addressing mode not allowed on 68000 > > > asl obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(187): error: addressing mode not allowed here > > > asl obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(190): error: addressing mode not allowed on 68000 > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(190): error: addressing mode not allowed here > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(195): error: addressing mode not allowed on 68000 > > > bset #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(195): error: addressing mode not allowed here > > > bset #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(201): error: addressing mode not allowed on 68000 > > > bclr #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(201): error: addressing mode not allowed here > > > bclr #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(209): error: addressing mode not allowed on 68000 > > > move.w d0,obX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(209): error: addressing mode not allowed here > > > move.w d0,obX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(210): error: addressing mode not allowed on 68000 > > > move.w obVelY(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(210): error: addressing mode not allowed here > > > move.w obVelY(a0),d0 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(211): error: short addressing not allowed > > > move.w (v_player+obY).w,d1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(211): error: addressing mode not allowed here > > > move.w (v_player+obY).w,d1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(212): error: addressing mode not allowed on 68000 > > > sub.w obY(a0),d1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(212): error: addressing mode not allowed here > > > sub.w obY(a0),d1 > > >Labyrinth Boss/77 Boss - Labyrinth.asm(233): error: addressing mode not allowed on 68000 > > > move.w $38(a0),obY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(233): error: addressing mode not allowed here > > > move.w $38(a0),obY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(242): error: addressing mode not allowed on 68000 > > > clr.w obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(242): error: addressing mode not allowed here > > > clr.w obVelX(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(249): error: addressing mode not allowed on 68000 > > > clr.w obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(249): error: addressing mode not allowed here > > > clr.w obVelY(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(254): error: addressing mode not allowed on 68000 > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(254): error: addressing mode not allowed here > > > addq.b #2,ob2ndRout(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(255): error: addressing mode not allowed on 68000 > > > bclr #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(255): error: addressing mode not allowed here > > > bclr #0,obStatus(a0) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(264): error: addressing mode not allowed on 68000 > > > cmpi.w #$1EC8,obX(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(264): error: addressing mode not allowed here > > > cmpi.w #$1EC8,obX(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(266): error: addressing mode not allowed on 68000 > > > cmpi.w #$F0,obY(a1) > > >Labyrinth Boss/77 Boss - Labyrinth.asm(266): error: addressing mode not allowed here > > > cmpi.w #$F0,obY(a1) I can solve the addressing errors by myself, but I don't know what to do about the bin file. :\
Sounds like you used include for the bin file instead of incbin or whatever sonic 2 uses instead. It would help if you posted the code.
Here's a good question, this one's been really throwing me off in trying to write a dynamic water routine. What are the RAM equates "Water_Level_1", 2, and 3, and how are the distinguished in the ASM? Could there perhaps be labeled a little more clearly? From my understanding, which isn't very clear since I can't seem to find any consistency: Water_Level_1 = The current visible height of the water, relative to the top of the level. Water_Level_2 = I have no idea... Something to do with the oscillating motion of the height? Water_Level_3 = The water's target height...?
Code (Text): R_WaterActual = $FFFFF646 ; word Actual water position (including tide's sinewave position) R_WaterMain = $FFFFF648 ; word Main water position R_WaterDest = $FFFFF64A ; word Water "destination" position R_WaterSpeed = $FFFFF64C ; byte Pixel speed to move to "destination" R_WaterRoutine = $FFFFF64D ; byte Routine index/flag R_UnderWater = $FFFFF64E ; byte I'd say that; Water_Level_1 = R_WaterActual, Water_Level_2 = R_WaterMain, Water_Level_3 = R_WaterDest, judging by your description (I don't have the RAM addresses to be sure). For consistency: Code (Text): ; =========================================================================== ; --------------------------------------------------------------------------- ; Subroutine to control everything water related (Labyrinth Zone only in Sonic 1) ; --------------------------------------------------------------------------- WaterEffects: cmpi.b #$01,(R_ZoneNumber).w ; is the level Labyrinth Zone? bne.s WE_NotWaterLevel ; if not, branch and return (no water effects) cmpi.b #$06,($FFFFD000+$24).w ; is Sonic dying (06 or higher)? bcc.s WE_SetWaterLine ; if so, branch bsr.w WaterTunnels ; run water tunnels (fast flowing "wind" tunnels) bsr.w WaterSlides ; run water slides bsr.w WaterEvents ; run water events ; --------------------------------------------------------------------------- ; routine to control the water's sinewave movement, and setting H-blank's position ; --------------------------------------------------------------------------- WE_SetWaterLine: clr.b (R_UnderWater).w ; clear underwater flag moveq #$00,d0 ; clear d0 move.b (R_SyncPos00).w,d0 ; load sync position 00 lsr.w #$01,d0 ; divide by 2 (reduce distance) add.w (R_WaterMain).w,d0 ; add water's main position move.w d0,(R_WaterActual).w ; add to actual "current" position move.w (R_WaterActual).w,d0 ; reload actual position sub.w ($FFFFF704).w,d0 ; minus Screen's FG Y position bcc.s WE_CheckLimit ; if the water position is below the top of the screen, branch tst.w d0 ; was the water position already in negative before the subtraction? bpl.s WE_CheckLimit ; if not, branch move.b #$DF,(R_VDPReg8A+$01).w ; set scanline position to bottom (we don't need it, we're fully underwater) move.b #$01,(R_UnderWater).w ; set as fully underwater WE_CheckLimit: cmpi.w #$00DF,d0 ; is the water position below (or above) the screen? bcs.s WE_NoLimit ; if not, branch move.w #$00DF,d0 ; set scanline position to bottom (we don't need it, we're fully above/below water) WE_NoLimit: move.b d0,(R_VDPReg8A+$01).w ; set scanline interrupt position for H-blank WE_NotWaterLevel: rts ; return ; =========================================================================== And... Code (Text): ; =========================================================================== ; --------------------------------------------------------------------------- ; Subroutine to control the water depending on specific events ; --------------------------------------------------------------------------- WaterEvents: moveq #$00,d0 ; clear d0 move.b (R_ActNumber).w,d0 ; load Act number add.w d0,d0 ; multiply by word size (x2) move.w WE_Index(pc,d0.w),d0 ; load correct relative address jsr WE_Index(pc,d0.w) ; add and jump to relative address moveq #$00,d1 ; clear d1 move.b (R_WaterSpeed).w,d1 ; load the water's pixel movement speed move.w (R_WaterDest).w,d0 ; load the water destination sub.w (R_WaterMain).w,d0 ; subtract the main water position beq.s WE_NoMove ; if the water is at the destination already, branch to return bcc.s WE_MoveDown ; if it's above it's destination, branch to move it down neg.w d1 ; reverse direction to go upwards (adding negative will subtract) WE_MoveDown: add.w d1,(R_WaterMain).w ; move water up/down towards destination WE_NoMove: rts ; return ; ===========================================================================
Yes, the three I asked about do seem to match up. R_WaterSpeed, however, is called "Water_on" in Sonic two, which, going by this code: Code (ASM): DynamicWater: moveq #0,d0 move.w (Current_ZoneAndAct).w,d0 ror.b #1,d0 lsr.w #6,d0 andi.w #$FFFE,d0 move.w Dynamic_water_routine_table(pc,d0.w),d0 jsr Dynamic_water_routine_table(pc,d0.w) moveq #0,d1 move.b (Water_Speed).w,d1 move.w (Water_Level_Target).w,d0 sub.w (Water_Level_Main).w,d0 beq.s ++ ; rts bcc.s + neg.w d1 + add.w d1,(Water_Level_Main).w + rts is a slight misnomer, since it only disables water if the speed is 0. Besides that, it all matches.Thank you!
Hello! I'm looking to grab samples from the past stages of Sonic CD. I'm mainly looking to get the voice from Stardust Speedway Past, and I'd be fine with just having that. Problem is, I don't know how to do it. I've looked googled and searched around to see if anybody has extracted and uploaded samples from the past stages of Sonic CD, but all I'm finding is sound effects. I'd love it if somebody could tell me how to do it! Thanks so much
I wrote a small tool that extracts all sorts of stuff from SNCBNK*.BIN files in 2012, which I linked in this post. It seems hard to find via google, so I maybe should put it somewhere on the wiki.
Thank you so much!! This worked absolutely perfectly. Thanks for writing that sweet program, and letting me know about it
I need assistance with boss porting once more. >_> While I do have most of the issues figured out, I'm still wondering what code needs to be replaced in order to port the Labyrinth Zone boss to Sonic 2. Here is the code; Spoiler ; --------------------------------------------------------------------------- ; Object 77 - Eggman (LZ) ; --------------------------------------------------------------------------- BossLabyrinth: ; XREF: Obj_Index moveq #0,d0 move.b Vint_Routine(a0),d0 move.w Obj77_Index(pc,d0.w),d1 jmp Obj777_Index(pc,d1.w) ; =========================================================================== Obj777_Index: dc.w Obj777_Main-Obj77_Index dc.w Obj77_ShipMain-Obj77_Index dc.w Obj77_FaceMain-Obj77_Index dc.w Obj77_FlameMain-Obj77_Index Obj77_ObjData: dc.b 2, 0 ; routine number, animation dc.b 4, 1 dc.b 6, 7 ; =========================================================================== Obj777_Main: ; Vint_Routine 0 move.w #$1E10,obX(a0) move.w #$5C0,obY(a0) move.w obX(a0),$30(a0) move.w obY(a0),$38(a0) move.b #$F,ColType(a0) move.b #8,ColProp(a0) ; set number of hits to 8 move.b #4,Priority(a0) lea Obj77_ObjData(pc),a2 movea.l a0,a1 moveq #2,d1 bra.s Obj77_LoadBoss ; =========================================================================== Obj77_Loop: jsr FindNextFreeObj bne.s Obj77_ShipMain move.b #id_BossLabyrinth,0(a1) move.w obX(a0),obX(a1) move.w obY(a0),obY(a1) Obj77_LoadBoss: ; XREF: Obj77_Main bclr #0,obStatus(a0) clr.b ob2ndRout(a1) move.b (a2)+,Vint_Routine(a1) move.b (a2)+,Anim(a1) move.b Priority(a0),Priority(a1) move.l #Map_Eggman,obMap(a1) move.w #$400,obGfx(a1) move.b #4,obRender(a1) move.b #$20,obActWid(a1) move.l a0,$34(a1) dbf d1,Obj77_Loop Obj77_ShipMain: ; Routine 2 lea (v_player).w,a1 moveq #0,d0 move.b ob2ndRout(a0),d0 move.w Obj77_ShipIndex(pc,d0.w),d1 jsr Obj77_ShipIndex(pc,d1.w) lea (Ani_Eggman).l,a1 jsr AnimateSprite moveq #3,d0 and.b obStatus(a0),d0 andi.b #$FC,obRender(a0) or.b d0,obRender(a0) jmp DisplaySprite ; =========================================================================== Obj77_ShipIndex:dc.w loc_17F1E-Obj77_ShipIndex, loc_17FA0-Obj77_ShipIndex dc.w loc_17FE0-Obj77_ShipIndex, loc_1801E-Obj77_ShipIndex dc.w loc_180BC-Obj77_ShipIndex, loc_180F6-Obj77_ShipIndex dc.w loc_1812A-Obj77_ShipIndex, loc_18152-Obj77_ShipIndex ; =========================================================================== loc_17F1E: ; XREF: Obj77_ShipIndex move.w obX(a1),d0 cmpi.w #$1DA0,d0 bcs.s loc_17F38 move.w #-$180,obVelY(a0) move.w #$60,obVelX(a0) addq.b #2,ob2ndRout(a0) loc_17F38: bsr.w BossMove move.w $38(a0),obY(a0) move.w $30(a0),obX(a0) loc_17F48: tst.b $3D(a0) bne.s loc_17F8E tst.b obStatus(a0) bmi.s loc_17F92 tst.b obColType(a0) bne.s locret_17F8C tst.b $3E(a0) bne.s loc_17F70 move.b #$20,$3E(a0) sfx sfx_HitBoss,0,0,0 loc_17F70: lea (v_pal_dry+$22).w,a1 moveq #0,d0 tst.w (a1) bne.s loc_17F7E move.w #cWhite,d0 loc_17F7E: move.w d0,(a1) subq.b #1,$3E(a0) bne.s locret_17F8C move.b #$F,obColType(a0) locret_17F8C: rts ; =========================================================================== loc_17F8E: ; XREF: loc_17F48 bra.w BossDefeated ; =========================================================================== loc_17F92: ; XREF: loc_17F48 moveq #100,d0 bsr.w AddPoints move.b #-1,$3D(a0) rts ; =========================================================================== loc_17FA0: ; XREF: Obj77_ShipIndex moveq #-2,d0 cmpi.w #$1E48,$30(a0) bcs.s loc_17FB6 move.w #$1E48,$30(a0) clr.w obVelX(a0) addq.w #1,d0 loc_17FB6: cmpi.w #$500,$38(a0) bgt.s loc_17FCA move.w #$500,$38(a0) clr.w obVelY(a0) addq.w #1,d0 loc_17FCA: bne.s loc_17FDC move.w #$140,obVelX(a0) move.w #-$200,obVelY(a0) addq.b #2,ob2ndRout(a0) loc_17FDC: bra.w loc_17F38 ; =========================================================================== loc_17FE0: ; XREF: Obj77_ShipIndex moveq #-2,d0 cmpi.w #$1E70,$30(a0) bcs.s loc_17FF6 move.w #$1E70,$30(a0) clr.w obVelX(a0) addq.w #1,d0 loc_17FF6: cmpi.w #$4C0,$38(a0) bgt.s loc_1800A move.w #$4C0,$38(a0) clr.w obVelY(a0) addq.w #1,d0 loc_1800A: bne.s loc_1801A move.w #-$180,obVelY(a0) addq.b #2,ob2ndRout(a0) clr.b $3F(a0) loc_1801A: bra.w loc_17F38 ; =========================================================================== loc_1801E: ; XREF: Obj77_ShipIndex cmpi.w #$100,$38(a0) bgt.s loc_1804E move.w #$100,$38(a0) move.w #$140,obVelX(a0) move.w #-$80,obVelY(a0) tst.b $3D(a0) beq.s loc_18046 asl obVelX(a0) asl obVelY(a0) loc_18046: addq.b #2,ob2ndRout(a0) bra.w loc_17F38 ; =========================================================================== loc_1804E: bset #0,obStatus(a0) addq.b #2,$3F(a0) move.b $3F(a0),d0 jsr (CalcSine).l tst.w d1 bpl.s loc_1806C bclr #0,obStatus(a0) loc_1806C: asr.w #4,d0 swap d0 clr.w d0 add.l $30(a0),d0 swap d0 move.w d0,obX(a0) move.w obVelY(a0),d0 move.w (v_player+obY).w,d1 sub.w obY(a0),d1 bcs.s loc_180A2 subi.w #$48,d1 bcs.s loc_180A2 asr.w #1,d0 subi.w #$28,d1 bcs.s loc_180A2 asr.w #1,d0 subi.w #$28,d1 bcs.s loc_180A2 moveq #0,d0 loc_180A2: ext.l d0 asl.l #8,d0 tst.b $3D(a0) beq.s loc_180AE add.l d0,d0 loc_180AE: add.l d0,$38(a0) move.w $38(a0),obY(a0) bra.w loc_17F48 ; =========================================================================== loc_180BC: ; XREF: Obj77_ShipIndex moveq #-2,d0 cmpi.w #$1F4C,$30(a0) bcs.s loc_180D2 move.w #$1F4C,$30(a0) clr.w obVelX(a0) addq.w #1,d0 loc_180D2: cmpi.w #$C0,$38(a0) bgt.s loc_180E6 move.w #$C0,$38(a0) clr.w obVelY(a0) addq.w #1,d0 loc_180E6: bne.s loc_180F2 addq.b #2,ob2ndRout(a0) bclr #0,obStatus(a0) loc_180F2: bra.w loc_17F38 ; =========================================================================== loc_180F6: ; XREF: Obj77_ShipIndex tst.b $3D(a0) bne.s loc_18112 cmpi.w #$1EC8,obX(a1) blt.s loc_18126 cmpi.w #$F0,obY(a1) bgt.s loc_18126 move.b #$32,$3C(a0) loc_18112: move.w #MusID_Boss,d0 jsrto (PlayMusic).l, JmpTo3_PlayMusic if Revision=0 endif else clr.b (f_lockscreen).w endc bset #0,obStatus(a0) addq.b #2,ob2ndRout(a0) loc_18126: bra.w loc_17F38 ; =========================================================================== loc_1812A: ; XREF: Obj77_ShipIndex tst.b $3D(a0) bne.s loc_18136 subq.b #1,$3C(a0) bne.s loc_1814E loc_18136: clr.b $3C(a0) move.w #$400,obVelX(a0) move.w #-$40,obVelY(a0) clr.b $3D(a0) addq.b #2,ob2ndRout(a0) loc_1814E: bra.w loc_17F38 ; =========================================================================== loc_18152: ; XREF: Obj77_ShipIndex cmpi.w #$2030,(v_limitright2).w bcc.s loc_18160 addq.w #2,(v_limitright2).w bra.s loc_18166 ; =========================================================================== loc_18160: tst.b obRender(a0) bpl.s Obj77_ShipDel loc_18166: bra.w loc_17F38 ; =========================================================================== Obj77_ShipDel: jmp DeleteObject ; =========================================================================== Obj77_FaceMain: ; Routine 4 movea.l $34(a0),a1 move.b (a1),d0 cmp.b (a0),d0 bne.s Obj77_FaceDel moveq #0,d0 move.b ob2ndRout(a1),d0 moveq #1,d1 tst.b $3D(a0) beq.s loc_1818C moveq #$A,d1 bra.s loc_181A0 ; =========================================================================== loc_1818C: tst.b obColType(a1) bne.s loc_18196 moveq #5,d1 bra.s loc_181A0 ; =========================================================================== loc_18196: cmpi.b #4,(v_player+Vint_Routine).w bcs.s loc_181A0 moveq #4,d1 loc_181A0: move.b d1,obAnim(a0) cmpi.b #$E,d0 bne.s loc_181B6 move.b #6,obAnim(a0) tst.b obRender(a0) bpl.s Obj77_FaceDel loc_181B6: bra.s Obj77_Display ; =========================================================================== Obj77_FaceDel: jmp DeleteObject ; =========================================================================== Obj77_FlameMain:; Routine 6 move.b #7,obAnim(a0) movea.l $34(a0),a1 move.b (a1),d0 cmp.b (a0),d0 bne.s Obj77_FlameDel cmpi.b #$E,ob2ndRout(a1) bne.s loc_181F0 move.b #$B,obAnim(a0) tst.b 1(a0) bpl.s Obj77_FlameDel bra.s loc_181F0 ; =========================================================================== tst.w obVelX(a1) beq.s loc_181F0 move.b #8,obAnim(a0) loc_181F0: bra.s Obj77_Display ; =========================================================================== Obj77_FlameDel: ; XREF: Obj77_FlameMain jmp DeleteObject ; =========================================================================== Obj77_Display: lea (Ani_Eggman).l,a1 jsr AnimateSprite movea.l $34(a0),a1 move.w obX(a1),obX(a0) move.w obY(a1),obY(a0) move.b obStatus(a1),obStatus(a0) moveq #3,d0 and.b obStatus(a0),d0 andi.b #$FC,obRender(a0) or.b d0,obRender(a0) jmp DisplaySprite I already began to replace some of the entries, though I can't find a match for the others.
1) Vint_Routine? That variable is a RAM address used for the vertical interrupt to jump to a subroutine within itself. I think the proper definition you are looking for is "obRoutine", which is used by objects to jump to a routine within itself. 2) The current Sonic 2 uses different definitions than "obXXX". It uses things like x_pos, x_vel, routine, etc. Look them up in the S2 disassembly and your S1 disassembly to see which one is which. You could also copy the definitions with "obXXX" to S2. With the other object SST definitions without a name, just use objoff_XX 3) When loading the boss object in S2 (in RunDynamicLevelEvents), "Current_Boss_ID" is set. This is kind of like "f_lockscreen" (which doesn't really lock the screen by the way! It just prevents Sonic from going offscreen at the right). This acts as a boss flag, and prevents Sonic from going offscreen at the right, and is used as an index to handle Sonic's collision with the bosses (BossSpecificCollision). For this boss, I say you should just set it to 1. 4) Ensure that the mappings for the boss are in S2 format and not S1's. 5) Make sure that if you are loading the boss into a different position that where it originally was, you should change values involving its own position, the right camera boundary, etc. 6) The "Revision" check isn't needed. You can remove that. That was used to check if S1 is REV00 or REV01 7) v_limitright2 = Camera_Max_X_pos 8) id_BossLabyrinth should be defined. You can also just define it as whatever object ID you gave it in S2. 9) Make sure you also implement the correct PLCs for this boss and import the needed graphics and load them in RunDynamicLevelEvents so it displays correctly.
It's not often I come to ask questions, but I'm stuck. I've ported the S3K Collision manager into Sonic 2 Recreation, and it works perfectly fine, and frees a shit tone of RAM. Happy days. But, editors like SonED2 for example only likes the collision compressed in Kosinski format, and then the hack needs to have the collision in an uncompressed format for it to work properly. Basically, every time I make a collision edit in a level editor, I have to decompress it manually every time, for each small change. And it's getting tiring. Does anyone know a way to code the build.bat to decompress all the collision files automatically? Seeming as it's not my specialty, I'm a bit clueless.
You can use koscmp from here, and to have it decompress each file automatically, you can use: for /r %%F in (collision/*.ext) do koscmp -x %%~nxF %%~nxF_u (".ext" being the extension of the collision files. Though it will have the uncompressed extensions be "ext_u" instead of "ext"). However, for this method, I would either make the collision files use a unique extension, or put them in a separate folder, and change "collision/*.ext" to "[INSERT PATH HERE]/*ext", because it will also try to decompress the angle data and collision heights too, since they share the same extension as the collision data in the S2 disassembly.
Both SonED2 and SonLVL should be able to use uncompressed collision indexes. For SonED2, have the line "Collision Index Compression: 0" in the project file. For SonLVL, use colindcmp=Uncompressed near the top of the INI before the level definitions.
I'm not 100% on this, but I think older versions of SonED2's project format don't allow mix-and-match. I had a problem with switching to S3K's ring format in a Xenowhirl-based disasm, and wound up having to totally remake the SonED2 project files in the newer format.
Okay, all 3 solutions do not work. Ralakimus, your solution was the sort of thing I was looking for, but it doesn't seem to work. It just keeps saying, "Cannot find file /r" or something extremely similar. I tried with just one file (ARZ.bin) and using the commands (shame there's no proper readme), it cannot find the file, even if I give it a path or even try the .ext file format. MainMemory, the solution for SonED2 doesn't work either. When I insert that, SonED2 will either Treat that as a path and try to load a file from that path (no matter where I stick the command) SonED2 will just crash Mainmemory, how on earth do I even get SonLVL to work? Using this guide, it won't recognise any of my files (yes, build is there, asm is there, the right disassembly folder [2007] is being used). Even trying the SonED2 Proj converter (which seems to convert fine) doesn't even work when trying to load from them files. It gets as far as loading the ini file, but as soon as I pick a level, the files do not exist (apparently). StephenUK can't get it to work either.
Your SonED2 projects are probably in the old format, you'll need to rewrite them in the new format. As for SonLVL, are you sure you have the files in the right places? SonLVL's INI files should be in a subfolder of your disassembly, just like the SonED2 projects, and if you've changed any folder or file names, obviously it won't be able to load those files. You should be able to follow the path given for a file in the INI and get to the corresponding file in your disassembly: Tiles=../art/kosinski/EHZ_HTZ.bin, from the INI folder, go up a level (..), then to the art folder, then the kosinski folder, and you should find the file EHZ_HTZ.bin.
Guh, out of all the project files I tried to open, I picked the only one that had an error. The others load fine. got SonLVL working. And your code to let it load uncompressed collision also works, thanks. And thanks to Clownacy, I've got it working in SonED2. Thanks guys.
As I can't wait to play the updated S2 Recreation, I gotta thank you 3 guys for helping out RHS too. And RHS, your level layouts are always balanced in difficulty with creative design. As impatient as I am to play this, don't rush things and make more quality levels like you did. I'll be happy to play it when "it's out when it's out".
Is it possible to used the "MoveDemo_Record" routine in Sonic 2 in any meaningful way? I don't know where it outputs code to, or how, and it seems like kind of a waste to just trim the code out if I COULD use it to record demos without having to go get Gens Rerecording again.