SCHG How-to:Port the REV01 Background Effects
From Sonic Retro
(Original guide by jman2050)
Looking at the REV01 version of Sonic 1, I can see why it's Rev01. They pretty much completely overhauled the entire BG deformation part of the engine. The drawing system has been changed (and from what I've seen, more similar to the way Sonic 2 does things) and the deformation data for every level has been changed to fit this new code. Also, in every level besides SBZ2, it was used to enhance the deformation effects. To see the difference in your own Sonic 1 rom, you'll have to do the following...
Contents |
Steps
Step 1
First, we'll do the easiest change. Go to label Obj0A_WobbleData in Hivebrain's 2005 disassembly and replace the entire block with this:
Obj0A_WobbleData: dc.b 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2 dc.b 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3 dc.b 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2 dc.b 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, -1 dc.b -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3 dc.b -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 dc.b -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 dc.b -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2 dc.b -2, -2, -2, -2, -1, -1, -1, -1, -1 dc.b 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2 dc.b 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3 dc.b 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2 dc.b 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, -1 dc.b -1, -1, -1, -2, -2, -2, -2, -2, -3, -3, -3, -3, -3 dc.b -3, -3, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 dc.b -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 dc.b -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -2 dc.b -2, -2, -2, -2, -1, -1, -1, -1, -1
The programmers extended this array so it would also be usable by the deformation data even though it was designed to be used by the water bubbles.
Step 2
Next, we'll do the BGScroll data. Go to BGScroll_GHZ in the disassembly. Replace everything from there until the end of BGScroll_End with the following:
BgScroll_GHZ: ; XREF: BgScroll_Index clr.l ($FFFFF708).w clr.l ($FFFFF70C).w clr.l ($FFFFF714).w clr.l ($FFFFF71C).w lea ($FFFFA800).w,a2 clr.l (a2)+ clr.l (a2)+ clr.l (a2)+ rts ; =========================================================================== BgScroll_LZ: ; XREF: BgScroll_Index asr.l #1,d0 move.w d0,($FFFFF70C).w rts ; =========================================================================== BgScroll_MZ: ; XREF: BgScroll_Index rts ; =========================================================================== BgScroll_SLZ: ; XREF: BgScroll_Index asr.l #1,d0 addi.w #$C0,d0 move.w d0,($FFFFF70C).w clr.l ($FFFFF708).w rts ; =========================================================================== BgScroll_SYZ: ; XREF: BgScroll_Index asl.l #4,d0 move.l d0,d2 asl.l #1,d0 add.l d2,d0 asr.l #8,d0 addq.w #1,d0 move.w d0,($FFFFF70C).w clr.l ($FFFFF708).w rts ; =========================================================================== BgScroll_SBZ: ; XREF: BgScroll_Index andi.w #$7F8,d0 asr.w #3,d0 addq.w #1,d0 move.w d0,($FFFFF70C).w rts ; =========================================================================== BgScroll_End: ; XREF: BgScroll_Index move.w ($FFFFF700).w,d0 asr.w #1,d0 move.w d0,($FFFFF708).w move.w d0,($FFFFF710).w asr.w #2,d0 move.w d0,d1 add.w d0,d0 add.w d1,d0 move.w d0,($FFFFF718).w clr.l ($FFFFF70C).w clr.l ($FFFFF714).w clr.l ($FFFFF71C).w lea ($FFFFA800).w,a2 clr.l (a2)+ clr.l (a2)+ clr.l (a2)+ rts
The starting deformation data for every stage needed to be changed. To be precise, it prevents bugs that occur in the scrolling in SBZ and SYZ, and prevents a bug that causes GHZ's bg not to appear at all.
Step 3
Next, we'll do the deformation data itself. Go to Deform_GHZ, and replace everything from there until the end of Deform_SBZ, straight down (right before ScrollHoriz) with the following:
Deform_GHZ: move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #5,d4 move.l d4,d1 asl.l #1,d4 add.l d1,d4 moveq #0,d6 bsr.w ScrollBlock6 move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #7,d4 moveq #0,d6 bsr.w ScrollBlock5 lea ($FFFFCC00).w,a1 move.w ($FFFFF704).w,d0 andi.w #$7FF,d0 lsr.w #5,d0 neg.w d0 addi.w #$20,d0 ; ' ' bpl.s Deform_GHZ_1 moveq #0,d0 Deform_GHZ_1: ; CODE XREF: Deform_GHZ+36�j move.w d0,d4 move.w d0,($FFFFF618).w move.w ($FFFFF700).w,d0 cmpi.b #4,($FFFFF600).w bne.s Deform_GHZ_2 moveq #0,d0 Deform_GHZ_2: ; CODE XREF: Deform_GHZ+4A�j neg.w d0 swap d0 lea ($FFFFA800).w,a2 addi.l #$10000,(a2)+ addi.l #$C000,(a2)+ addi.l #$8000,(a2)+ move.w ($FFFFA800).w,d0 add.w ($FFFFF718).w,d0 neg.w d0 move.w #$1F,d1 sub.w d4,d1 bcs.s Deform_GHZ_4 Deform_GHZ_3: ; CODE XREF: Deform_GHZ+7C�j move.l d0,(a1)+ dbf d1,Deform_GHZ_3 Deform_GHZ_4: ; CODE XREF: Deform_GHZ+78�j move.w ($FFFFA804).w,d0 add.w ($FFFFF718).w,d0 neg.w d0 move.w #$F,d1 Deform_GHZ_5: ; CODE XREF: Deform_GHZ+90�j move.l d0,(a1)+ dbf d1,Deform_GHZ_5 move.w ($FFFFA808).w,d0 add.w ($FFFFF718).w,d0 neg.w d0 move.w #$F,d1 Deform_GHZ_6: ; CODE XREF: Deform_GHZ+A4�j move.l d0,(a1)+ dbf d1,Deform_GHZ_6 move.w #$2F,d1 ; '/' move.w ($FFFFF718).w,d0 neg.w d0 Deform_GHZ_7: ; CODE XREF: Deform_GHZ+B4�j move.l d0,(a1)+ dbf d1,Deform_GHZ_7 move.w #$27,d1 ; ''' move.w ($FFFFF710).w,d0 neg.w d0 Deform_GHZ_8: ; CODE XREF: Deform_GHZ+C4�j move.l d0,(a1)+ dbf d1,Deform_GHZ_8 move.w ($FFFFF710).w,d0 move.w ($FFFFF700).w,d2 sub.w d0,d2 ext.l d2 asl.l #8,d2 divs.w #$68,d2 ; 'h' ext.l d2 asl.l #8,d2 moveq #0,d3 move.w d0,d3 move.w #$47,d1 ; 'G' add.w d4,d1 Deform_GHZ_9: ; CODE XREF: Deform_GHZ+F4�j move.w d3,d0 neg.w d0 move.l d0,(a1)+ swap d3 add.l d2,d3 swap d3 dbf d1,Deform_GHZ_9 rts ; End of function Deform_GHZ ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Deform_LZ: move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #7,d4 move.w ($FFFFF73C).w,d5 ext.l d5 asl.l #7,d5 bsr.w ScrollBlock1 move.w ($FFFFF70C).w,($FFFFF618).w lea (LZ_Wave_Data).l,a3 lea (Obj0A_WobbleData).l,a2 move.b ($FFFFF7D8).w,d2 move.b d2,d3 addi.w #$80,($FFFFF7D8).w ; '€' add.w ($FFFFF70C).w,d2 andi.w #$FF,d2 add.w ($FFFFF704).w,d3 andi.w #$FF,d3 lea ($FFFFCC00).w,a1 move.w #$DF,d1 ; 'ß' move.w ($FFFFF700).w,d0 neg.w d0 move.w d0,d6 swap d0 move.w ($FFFFF708).w,d0 neg.w d0 move.w ($FFFFF646).w,d4 move.w ($FFFFF704).w,d5 Deform_LZ_1: ; CODE XREF: Deform_LZ+6E�j cmp.w d4,d5 bge.s Deform_LZ_2 move.l d0,(a1)+ addq.w #1,d5 addq.b #1,d2 addq.b #1,d3 dbf d1,Deform_LZ_1 rts ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Deform_LZ_2: ; CODE XREF: Deform_LZ+64�j ; Deform_LZ+8C�j move.b (a3,d3.w),d4 ext.w d4 add.w d6,d4 move.w d4,(a1)+ move.b (a2,d2.w),d4 ext.w d4 add.w d0,d4 move.w d4,(a1)+ addq.b #1,d2 addq.b #1,d3 dbf d1,Deform_LZ_2 rts ; End of function Deform_LZ ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ LZ_Wave_Data: dc.b 1, 1, 2, 2, 3, 3, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0 ; DATA XREF: Deform_LZ+1A�o dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b $FF,$FF,$FE,$FE,$FD,$FD,$FD,$FD,$FE,$FE,$FF,$FF, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 1, 1, 2, 2, 3, 3, 3, 3, 2, 2, 1, 1, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dc.b 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Deform_MZ: move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #6,d4 move.l d4,d1 asl.l #1,d4 add.l d1,d4 moveq #2,d6 bsr.w ScrollBlock4 move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #6,d4 moveq #6,d6 bsr.w ScrollBlock6 move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #7,d4 moveq #4,d6 bsr.w ScrollBlock5 move.w #$200,d0 move.w ($FFFFF704).w,d1 subi.w #$1C8,d1 bcs.s Deform_MZ_1 move.w d1,d2 add.w d1,d1 add.w d2,d1 asr.w #2,d1 add.w d1,d0 Deform_MZ_1: ; CODE XREF: Deform_MZ+3C�j move.w d0,($FFFFF714).w move.w d0,($FFFFF71C).w bsr.w ScrollBlock3 move.w ($FFFFF70C).w,($FFFFF618).w move.b ($FFFFF756).w,d0 or.b ($FFFFF758).w,d0 or.b d0,($FFFFF75A).w clr.b ($FFFFF756).w clr.b ($FFFFF758).w lea ($FFFFA800).w,a1 move.w ($FFFFF700).w,d2 neg.w d2 move.w d2,d0 asr.w #2,d0 sub.w d2,d0 ext.l d0 asl.l #3,d0 divs.w #5,d0 ext.l d0 asl.l #4,d0 asl.l #8,d0 moveq #0,d3 move.w d2,d3 asr.w #1,d3 move.w #4,d1 Deform_MZ_2: ; CODE XREF: Deform_MZ+9E�j move.w d3,(a1)+ swap d3 add.l d0,d3 swap d3 dbf d1,Deform_MZ_2 move.w ($FFFFF718).w,d0 neg.w d0 move.w #1,d1 Deform_MZ_3: ; CODE XREF: Deform_MZ+AE�j move.w d0,(a1)+ dbf d1,Deform_MZ_3 move.w ($FFFFF710).w,d0 neg.w d0 move.w #8,d1 Deform_MZ_4: ; CODE XREF: Deform_MZ+BE�j move.w d0,(a1)+ dbf d1,Deform_MZ_4 move.w ($FFFFF708).w,d0 neg.w d0 move.w #$F,d1 Deform_MZ_5: ; CODE XREF: Deform_MZ+CE�j move.w d0,(a1)+ dbf d1,Deform_MZ_5 lea ($FFFFA800).w,a2 move.w ($FFFFF70C).w,d0 subi.w #$200,d0 move.w d0,d2 cmpi.w #$100,d0 bcs.s Deform_MZ_6 move.w #$100,d0 Deform_MZ_6: ; CODE XREF: Deform_MZ+E4�j andi.w #$1F0,d0 lsr.w #3,d0 lea (a2,d0.w),a2 bra.w Deform_All ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Deform_SLZ: move.w ($FFFFF73C).w,d5 ext.l d5 asl.l #7,d5 bsr.w ScrollBlock2 move.w ($FFFFF70C).w,($FFFFF618).w lea ($FFFFA800).w,a1 move.w ($FFFFF700).w,d2 neg.w d2 move.w d2,d0 asr.w #3,d0 sub.w d2,d0 ext.l d0 asl.l #4,d0 divs.w #$1C,d0 ext.l d0 asl.l #4,d0 asl.l #8,d0 moveq #0,d3 move.w d2,d3 move.w #$1B,d1 Deform_SLZ_1: ; CODE XREF: Deform_MZ+138�j move.w d3,(a1)+ swap d3 add.l d0,d3 swap d3 dbf d1,Deform_SLZ_1 move.w d2,d0 asr.w #3,d0 move.w d0,d1 asr.w #1,d1 add.w d1,d0 move.w #4,d1 Deform_SLZ_2: ; CODE XREF: Deform_MZ+14C�j move.w d0,(a1)+ dbf d1,Deform_SLZ_2 move.w d2,d0 asr.w #2,d0 move.w #4,d1 Deform_SLZ_3: ; CODE XREF: Deform_MZ+15A�j move.w d0,(a1)+ dbf d1,Deform_SLZ_3 move.w d2,d0 asr.w #1,d0 move.w #$1D,d1 Deform_SLZ_4: ; CODE XREF: Deform_MZ+168�j move.w d0,(a1)+ dbf d1,Deform_SLZ_4 lea ($FFFFA800).w,a2 move.w ($FFFFF70C).w,d0 move.w d0,d2 subi.w #$C0,d0 ; 'À' andi.w #$3F0,d0 lsr.w #3,d0 lea (a2,d0.w),a2 Deform_All: ; CODE XREF: Deform_MZ+F4�j ; Deform_SYZ+A8�j ... lea ($FFFFCC00).w,a1 move.w #$E,d1 move.w ($FFFFF700).w,d0 neg.w d0 swap d0 andi.w #$F,d2 add.w d2,d2 move.w (a2)+,d0 jmp Deform_All_2(pc,d2.w) ; End of function Deform_MZ ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Deform_All_1: ; CODE XREF: ROM:0000670A�j move.w (a2)+,d0 Deform_All_2: move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ move.l d0,(a1)+ dbf d1,Deform_All_1 rts ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Deform_SYZ: move.w ($FFFFF73C).w,d5 ext.l d5 asl.l #4,d5 move.l d5,d1 asl.l #1,d5 add.l d1,d5 bsr.w ScrollBlock2 move.w ($FFFFF70C).w,($FFFFF618).w lea ($FFFFA800).w,a1 move.w ($FFFFF700).w,d2 neg.w d2 move.w d2,d0 asr.w #3,d0 sub.w d2,d0 ext.l d0 asl.l #3,d0 divs.w #8,d0 ext.l d0 asl.l #4,d0 asl.l #8,d0 moveq #0,d3 move.w d2,d3 asr.w #1,d3 move.w #7,d1 Deform_SYZ_1: ; CODE XREF: Deform_SYZ+48�j move.w d3,(a1)+ swap d3 add.l d0,d3 swap d3 dbf d1,Deform_SYZ_1 move.w d2,d0 asr.w #3,d0 move.w #4,d1 Deform_SYZ_2: ; CODE XREF: Deform_SYZ+56�j move.w d0,(a1)+ dbf d1,Deform_SYZ_2 move.w d2,d0 asr.w #2,d0 move.w #5,d1 Deform_SYZ_3: ; CODE XREF: Deform_SYZ+64�j move.w d0,(a1)+ dbf d1,Deform_SYZ_3 move.w d2,d0 move.w d2,d1 asr.w #1,d1 sub.w d1,d0 ext.l d0 asl.l #4,d0 divs.w #$E,d0 ext.l d0 asl.l #4,d0 asl.l #8,d0 moveq #0,d3 move.w d2,d3 asr.w #1,d3 move.w #$D,d1 Deform_SYZ_4: ; CODE XREF: Deform_SYZ+90�j move.w d3,(a1)+ swap d3 add.l d0,d3 swap d3 dbf d1,Deform_SYZ_4 lea ($FFFFA800).w,a2 move.w ($FFFFF70C).w,d0 move.w d0,d2 andi.w #$1F0,d0 lsr.w #3,d0 lea (a2,d0.w),a2 bra.w Deform_All ; End of function Deform_SYZ ; ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Deform_SBZ: tst.b ($FFFFFE11).w bne.w Deform_SBZ_Act2 move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #7,d4 moveq #2,d6 bsr.w ScrollBlock4 move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #6,d4 moveq #6,d6 bsr.w ScrollBlock6 move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #5,d4 move.l d4,d1 asl.l #1,d4 add.l d1,d4 moveq #4,d6 bsr.w ScrollBlock5 moveq #0,d4 move.w ($FFFFF73C).w,d5 ext.l d5 asl.l #5,d5 bsr.w ScrollBlock1_2 move.w ($FFFFF70C).w,d0 move.w d0,($FFFFF714).w move.w d0,($FFFFF71C).w move.w d0,($FFFFF618).w move.b ($FFFFF756).w,d0 or.b ($FFFFF75A).w,d0 or.b d0,($FFFFF758).w clr.b ($
