Actions

SCHG How-to

Port the REV01 Background Effects

From Sonic Retro

Revision as of 19:47, 12 January 2008 by Tweaker (talk | contribs) (Credits: wikilinks)

(Guide originally written by jman2050)

Introduction

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

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: <asm>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</asm>

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: <asm>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 </asm>

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: <asm>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 ($FFFFF756).w clr.b ($FFFFF75A).w lea ($FFFFA800).w,a1 move.w ($FFFFF700).w,d2 neg.w d2 asr.w #2,d2 move.w d2,d0 asr.w #1,d0 sub.w d2,d0 ext.l d0 asl.l #3,d0 divs.w #4,d0 ext.l d0 asl.l #4,d0 asl.l #8,d0 moveq #0,d3 move.w d2,d3 move.w #3,d1

Deform_SBZ_1: ; CODE XREF: Deform_SBZ+9A�j move.w d3,(a1)+ swap d3 add.l d0,d3 swap d3 dbf d1,Deform_SBZ_1 move.w ($FFFFF718).w,d0 neg.w d0 move.w #9,d1

Deform_SBZ_2: ; CODE XREF: Deform_SBZ+AA�j move.w d0,(a1)+ dbf d1,Deform_SBZ_2 move.w ($FFFFF710).w,d0 neg.w d0 move.w #6,d1

Deform_SBZ_3: ; CODE XREF: Deform_SBZ+BA�j move.w d0,(a1)+ dbf d1,Deform_SBZ_3 move.w ($FFFFF708).w,d0 neg.w d0 move.w #$A,d1

Deform_SBZ_4: ; CODE XREF: Deform_SBZ+CA�j move.w d0,(a1)+ dbf d1,Deform_SBZ_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

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Deform_SBZ_Act2: ; CODE XREF: Deform_SBZ+4�j move.w ($FFFFF73A).w,d4 ext.l d4 asl.l #6,d4 move.w ($FFFFF73C).w,d5 ext.l d5 asl.l #5,d5 bsr.w ScrollBlock1 move.w ($FFFFF70C).w,($FFFFF618).w lea ($FFFFCC00).w,a1 move.w #$DF,d1 ; 'ß' move.w ($FFFFF700).w,d0 neg.w d0 swap d0 move.w ($FFFFF708).w,d0 neg.w d0

Deform_SBZ_Act2_1: ; CODE XREF: Deform_SBZ+118�j move.l d0,(a1)+ dbf d1,Deform_SBZ_Act2_1 rts

End of function Deform_SBZ</asm>

Step 4

The new Bg drawing system required a different method of scrolling the BGs themselves. Go to ScrollBlock1 and replace everything from there until the end of ScrollBlock4 with the following: <asm>ScrollBlock1: ; CODE XREF: Deform_LZ+10�p ; Deform_SBZ+F6�p move.l ($FFFFF708).w,d2 move.l d2,d0 add.l d4,d0 move.l d0,($FFFFF708).w move.l d0,d1 swap d1 andi.w #$10,d1 move.b ($FFFFF74C).w,d3 eor.b d3,d1 bne.s ScrollBlock1_2 eori.b #$10,($FFFFF74C).w sub.l d2,d0 bpl.s ScrollBlock1_1 bset #2,($FFFFF756).w bra.s ScrollBlock1_2

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ScrollBlock1_1: ; CODE XREF: ScrollBlock1+24�j bset #3,($FFFFF756).w

ScrollBlock1_2: ; CODE XREF: Deform_SBZ+42�p ; ScrollBlock1+1A�j ... move.l ($FFFFF70C).w,d3 move.l d3,d0 add.l d5,d0 move.l d0,($FFFFF70C).w move.l d0,d1 swap d1 andi.w #$10,d1 move.b ($FFFFF74D).w,d2 eor.b d2,d1 bne.s ScrollBlock1_End eori.b #$10,($FFFFF74D).w sub.l d3,d0 bpl.s ScrollBlock1_3 bset #0,($FFFFF756).w rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ScrollBlock1_3: ; CODE XREF: ScrollBlock1+58�j bset #1,($FFFFF756).w

ScrollBlock1_End: ; CODE XREF: ScrollBlock1+4E�j rts

End of function ScrollBlock1


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


ScrollBlock2: ; CODE XREF: Deform_MZ+100�p ; Deform_SYZ+E�p move.l ($FFFFF70C).w,d3 move.l d3,d0 add.l d5,d0 move.l d0,($FFFFF70C).w move.l d0,d1 swap d1 andi.w #$10,d1 move.b ($FFFFF74D).w,d2 eor.b d2,d1 bne.s ScrollBlock2_End eori.b #$10,($FFFFF74D).w sub.l d3,d0 bpl.s ScrollBlock2_1 bset #4,($FFFFF756).w rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ScrollBlock2_1: ; CODE XREF: ScrollBlock2+24�j bset #5,($FFFFF756).w

ScrollBlock2_End: ; CODE XREF: ScrollBlock2+1A�j rts

End of function ScrollBlock2


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


ScrollBlock3: ; CODE XREF: Deform_MZ+50�p move.w ($FFFFF70C).w,d3 move.w d0,($FFFFF70C).w move.w d0,d1 andi.w #$10,d1 move.b ($FFFFF74D).w,d2 eor.b d2,d1 bne.s ScrollBlock3_End eori.b #$10,($FFFFF74D).w sub.w d3,d0 bpl.s ScrollBlock3_1 bset #0,($FFFFF756).w rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ScrollBlock3_1: ; CODE XREF: ScrollBlock3+1E�j bset #1,($FFFFF756).w

ScrollBlock3_End: ; CODE XREF: ScrollBlock3+14�j rts

End of function ScrollBlock3


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


ScrollBlock4: ; CODE XREF: Deform_MZ+10�p ; Deform_SBZ+12�p move.l ($FFFFF708).w,d2 move.l d2,d0 add.l d4,d0 move.l d0,($FFFFF708).w move.l d0,d1 swap d1 andi.w #$10,d1 move.b ($FFFFF74C).w,d3 eor.b d3,d1 bne.s ScrollBlock4_End eori.b #$10,($FFFFF74C).w sub.l d2,d0 bpl.s ScrollBlock4_1 bset d6,($FFFFF756).w bra.s ScrollBlock4_End

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ScrollBlock4_1: ; CODE XREF: ScrollBlock4+24�j addq.b #1,d6 bset d6,($FFFFF756).w

ScrollBlock4_End: ; CODE XREF: ScrollBlock4+1A�j ; ScrollBlock4+2A�j rts

End of function ScrollBlock4


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


ScrollBlock5: ; CODE XREF: Deform_GHZ+1E�p ; Deform_MZ+2C�p ... move.l ($FFFFF710).w,d2 move.l d2,d0 add.l d4,d0 move.l d0,($FFFFF710).w move.l d0,d1 swap d1 andi.w #$10,d1 move.b ($FFFFF74E).w,d3 eor.b d3,d1 bne.s ScrollBlock5_End eori.b #$10,($FFFFF74E).w sub.l d2,d0 bpl.s ScrollBlock5_1 bset d6,($FFFFF758).w bra.s ScrollBlock5_End

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ScrollBlock5_1: ; CODE XREF: ScrollBlock5+24�j addq.b #1,d6 bset d6,($FFFFF758).w

ScrollBlock5_End: ; CODE XREF: ScrollBlock5+1A�j ; ScrollBlock5+2A�j rts

End of function ScrollBlock5


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


ScrollBlock6: ; CODE XREF: Deform_GHZ+10�p ; Deform_MZ+1E�p ... move.l ($FFFFF718).w,d2 move.l d2,d0 add.l d4,d0 move.l d0,($FFFFF718).w move.l d0,d1 swap d1 andi.w #$10,d1 move.b ($FFFFF750).w,d3 eor.b d3,d1 bne.s ScrollBlock6_End eori.b #$10,($FFFFF750).w sub.l d2,d0 bpl.s ScrollBlock6_1 bset d6,($FFFFF75A).w bra.s ScrollBlock6_End

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

ScrollBlock6_1: ; CODE XREF: ScrollBlock6+24�j addq.b #1,d6 bset d6,($FFFFF75A).w

ScrollBlock6_End: ; CODE XREF: ScrollBlock6+1A�j ; ScrollBlock6+2A�j rts

End of function ScrollBlock6</asm>

Don't worry that there are six BGScroll functions now, that's taken cared of.

Step 5

Finally, the biggest part: the BG drawing code. Go to sub_6886 and replace everything from there until the end of LoadTilesFromStart2 (that's a VERY long way, up until MainLoadBlockLoad) with the following: <asm>sub_6886: lea ($C00004).l,a5 lea ($C00000).l,a6 lea ($FFFFF756).w,a2 lea ($FFFFF708).w,a3 lea ($FFFFA440).w,a4 move.w #$6000,d2 bsr.w sub_6D0A lea ($FFFFF758).w,a2 lea ($FFFFF710).w,a3 bra.w sub_6DA6

End of function sub_6886
---------------------------------------------------------------------------
Subroutine to display correct tiles as you move
---------------------------------------------------------------------------
||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||


LoadTilesAsYouMove: ; XREF: Demo_Time lea ($C00004).l,a5 lea ($C00000).l,a6 lea ($FFFFFF32).w,a2 lea ($FFFFFF18).w,a3 lea ($FFFFA440).w,a4 move.w #$6000,d2 bsr.w sub_6D0A lea ($FFFFFF34).w,a2 lea ($FFFFFF20).w,a3 bsr.w sub_6DA6 lea ($FFFFFF36).w,a2 lea ($FFFFFF28).w,a3 bsr.w sub_6EA4 lea ($FFFFFF30).w,a2 lea ($FFFFFF10).w,a3 lea ($FFFFA400).w,a4 move.w #$4000,d2 tst.b ($FFFFF745).w beq.s Draw_FG move.b #0,($FFFFF745).w ;Reset the redraw flag moveq #-$10,d4 ;Go to top line oflevel data relative camera position moveq #$F,d6 ;

Draw_All: ; CODE XREF: ROM:0000DAEA�j movem.l d4-d6,-(sp) ; This whole routine basically redraws the whole moveq #-$10,d5 ; area instead of merely a line of tiles move.w d4,d1 bsr.w Calc_VRAM_Pos move.w d1,d4 moveq #-$10,d5 bsr.w DrawTiles_LR movem.l (sp)+,d4-d6 addi.w #$10,d4 dbf d6,Draw_All rts

Draw_FG: tst.b (a2) beq.s locret_6D08 bclr #0,(a2) beq.s loc_6CBE moveq #-$10,d4 moveq #-$10,d5 bsr.w Calc_VRAM_Pos moveq #-$10,d4 moveq #-$10,d5 bsr.w DrawTiles_LR

loc_6CBE: ; CODE XREF: ROM:00006CAC�j bclr #1,(a2) beq.s loc_6CD8 move.w #$E0,d4 ; 'à' moveq #-$10,d5 bsr.w Calc_VRAM_Pos move.w #$E0,d4 ; 'à' moveq #-$10,d5 bsr.w DrawTiles_LR

loc_6CD8: ; CODE XREF: ROM:00006CC2�j bclr #2,(a2) beq.s loc_6CEE moveq #-$10,d4 moveq #-$10,d5 bsr.w Calc_VRAM_Pos moveq #-$10,d4 moveq #-$10,d5 bsr.w DrawTiles_TB

loc_6CEE: ; CODE XREF: ROM:00006CDC�j bclr #3,(a2) beq.s locret_6D08 moveq #-$10,d4 move.w #$140,d5 bsr.w Calc_VRAM_Pos moveq #-$10,d4 move.w #$140,d5 bsr.w DrawTiles_TB

locret_6D08: ; CODE XREF: ROM:00006CA6�j ; ROM:00006CF2�j rts

End of function LoadTilesAsYouMove


||||||||||||||| S U B R O U T I N E |||||||||||||||||||||||||||||||||||||||


sub_6D0A: ; CODE XREF: ROM:00006C4C�p ; ROM:00006C78�p tst.b (a2) beq.w locret_6DA4 bclr #0,(a2) beq.s loc_6D26 moveq #-$10,d4 moveq #-$10,d5 bsr.w Calc_VRAM_Pos moveq #-$10,d4 moveq #-$10,d5 bsr.w DrawTiles_LR

loc_6D26: ; CODE XREF: sub_6D0A+A�j bclr #1,(a2) beq.s loc_6D40 move.w #$E0,d4 ; 'à' moveq #-$10,d5 bsr.w Calc_VRAM_Pos move.w #$E0,d4 ; 'à' moveq #-$10,d5 bsr.w DrawTiles_LR

loc_6D40: ; CODE XREF: sub_6D0A+20�j bclr #2,(a2) beq.s loc_6D56 moveq #-$10,d4 moveq #-$10,d5 bsr.w Calc_VRAM_Pos moveq #-$10,d4 moveq #-$10,d5 bsr.w DrawTiles_TB

loc_6D56: ; CODE XREF: sub_6D0A+3A�j bclr #3,(a2) beq.s loc_6D70 moveq #-$10,d4 move.w #$140,d5 bsr.w Calc_VRAM_Pos moveq #-$10,d4 move.w #$140,d5 bsr.w DrawTiles_TB

loc_6D70: ; CODE XREF: sub_6D0A+50�j bclr #4,(a2) beq.s loc_6D88 moveq #-$10,d4 moveq #0,d5 bsr.w loc_7176 moveq #-$10,d4 moveq #0,d5 moveq #$1F,d6 bsr.w DrawTiles_LR3

loc_6D88: ; CODE XREF: sub_6D0A+6A�j bclr #5,(a2) beq.s locret_6DA4 move.w #$E0,d4 ; 'à' moveq #0,d5 bsr.w loc_7176 move.w #$E0,d4 ; 'à' moveq #0,d5 moveq #$1F,d6 bsr.w DrawTiles_LR3

locret_6DA4: ; CODE XREF: sub_6D0A+2�j sub_6D0A+82�j rts

End of function sub_6D0A


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_6DA6: ; CODE XREF: ROM:00006C58�j ; ROM:00006C84�p tst.b (a2) beq.w locret_6DF2 cmpi.b #5,($FFFFFE10).w beq.w loc_6E16 bclr #0,(a2) beq.s loc_6DD2 move.w #$70,d4 ; 'p' moveq #-$10,d5 bsr.w Calc_VRAM_Pos move.w #$70,d4 ; 'p' moveq #-$10,d5 moveq #2,d6 bsr.w DrawTiles_TB2

loc_6DD2: ; CODE XREF: sub_6DA6+14�j bclr #1,(a2) beq.s locret_6DF2 move.w #$70,d4 ; 'p' move.w #$140,d5 bsr.w Calc_VRAM_Pos move.w #$70,d4 ; 'p' move.w #$140,d5 moveq #2,d6 bsr.w DrawTiles_TB2

locret_6DF2: ; CODE XREF: sub_6DA6+2�j sub_6DA6+30�j rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

unk_6DF4: dc.b 0 ; ; DATA XREF: sub_6DA6+E6�o unk_6DF5: dc.b 0 ; ; DATA XREF: sub_6DA6+82�o ; ROM:00007290�o dc.b 0 ; dc.b 0 ; dc.b 0 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 0 ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_6E16: ; CODE XREF: sub_6DA6+C�j moveq #-$10,d4 bclr #0,(a2) bne.s loc_6E28 bclr #1,(a2) beq.s loc_6E72 move.w #$E0,d4 ; 'à'

loc_6E28: ; CODE XREF: sub_6DA6+76�j lea (unk_6DF5).l,a0 move.w ($FFFFF70C).w,d0 add.w d4,d0 andi.w #$1F0,d0 lsr.w #4,d0 move.b (a0,d0.w),d0 lea (unk_6FE4).l,a3 movea.w (a3,d0.w),a3 beq.s loc_6E5E moveq #-$10,d5 movem.l d4-d5,-(sp) bsr.w Calc_VRAM_Pos movem.l (sp)+,d4-d5 bsr.w DrawTiles_LR bra.s loc_6E72

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_6E5E: ; CODE XREF: sub_6DA6+A2�j moveq #0,d5 movem.l d4-d5,-(sp) bsr.w loc_7176 movem.l (sp)+,d4-d5 moveq #$1F,d6 bsr.w DrawTiles_LR3

loc_6E72: ; CODE XREF: sub_6DA6+7C�j sub_6DA6+B6�j tst.b (a2) bne.s loc_6E78 rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_6E78: ; CODE XREF: sub_6DA6+CE�j moveq #-$10,d4 moveq #-$10,d5 move.b (a2),d0 andi.b #-$58,d0 beq.s loc_6E8C lsr.b #1,d0 move.b d0,(a2) move.w #$140,d5

loc_6E8C: ; CODE XREF: sub_6DA6+DC�j lea (unk_6DF4).l,a0 move.w ($FFFFF70C).w,d0 andi.w #$1F0,d0 lsr.w #4,d0 lea (a0,d0.w),a0 bra.w loc_6FEC

End of function sub_6DA6


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_6EA4: ; CODE XREF: ROM:00006C90�p tst.b (a2) beq.w locret_6EF0 cmpi.b #2,($FFFFFE10).w beq.w loc_6F54 bclr #0,(a2) beq.s loc_6ED0_2 move.w #$40,d4 ; '@' moveq #-$10,d5 bsr.w Calc_VRAM_Pos move.w #$40,d4 ; '@' moveq #-$10,d5 moveq #2,d6 bsr.w DrawTiles_TB2

loc_6ED0_2: ; CODE XREF: sub_6EA4+14�j bclr #1,(a2) beq.s locret_6EF0 move.w #$40,d4 ; '@' move.w #$140,d5 bsr.w Calc_VRAM_Pos move.w #$40,d4 ; '@' move.w #$140,d5 moveq #2,d6 bsr.w DrawTiles_TB2

locret_6EF0: ; CODE XREF: sub_6EA4+2�j sub_6EA4+30�j rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

unk_6EF2: dc.b 0 ; ; DATA XREF: sub_6EA4+124�o unk_6EF3: dc.b 0 ; ; DATA XREF: sub_6EA4+C2�o ; ROM:00007262�o dc.b 0 ; dc.b 0 ; dc.b 0 ; dc.b 0 ; dc.b 6 ; dc.b 6 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 2 ; dc.b 0 ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_6F54: ; CODE XREF: sub_6EA4+C�j moveq #-$10,d4 bclr #0,(a2) bne.s loc_6F66 bclr #1,(a2) beq.s loc_6FAE move.w #$E0,d4 ; 'à'

loc_6F66: ; CODE XREF: sub_6EA4+B6�j lea (unk_6EF3).l,a0 move.w ($FFFFF70C).w,d0 subi.w #$200,d0 add.w d4,d0 andi.w #$7F0,d0 lsr.w #4,d0 move.b (a0,d0.w),d0 movea.w unk_6FE4(pc,d0.w),a3 beq.s loc_6F9A moveq #-$10,d5 movem.l d4-d5,-(sp) bsr.w Calc_VRAM_Pos movem.l (sp)+,d4-d5 bsr.w DrawTiles_LR bra.s loc_6FAE

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_6F9A: ; CODE XREF: sub_6EA4+E0�j moveq #0,d5 movem.l d4-d5,-(sp) bsr.w loc_7176 movem.l (sp)+,d4-d5 moveq #$1F,d6 bsr.w DrawTiles_LR3

loc_6FAE: ; CODE XREF: sub_6EA4+BC�j sub_6EA4+F4�j tst.b (a2) bne.s loc_6FB4 rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_6FB4: ; CODE XREF: sub_6EA4+10C�j moveq #-$10,d4 moveq #-$10,d5 move.b (a2),d0 andi.b #-$58,d0 beq.s loc_6FC8 lsr.b #1,d0 move.b d0,(a2) move.w #$140,d5

loc_6FC8: ; CODE XREF: sub_6EA4+11A�j lea (unk_6EF2).l,a0 move.w ($FFFFF70C).w,d0 subi.w #$200,d0 andi.w #$7F0,d0 lsr.w #4,d0 lea (a0,d0.w),a0 bra.w loc_6FEC

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

unk_6FE4: dc.b $FF ; ; DATA XREF: sub_6DA6+98�o dc.b $18 ; dc.b $FF ; dc.b $18 ; dc.b $FF ; dc.b $20 ; dc.b $FF ; dc.b $28 ; (

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_6FEC: ; CODE XREF: sub_6DA6+FA�j ; sub_6EA4+13C�j moveq #$F,d6 move.l #$800000,d7

loc_6FF4: ; CODE XREF: sub_6EA4+17C�j moveq #0,d0 move.b (a0)+,d0 btst d0,(a2) beq.s loc_701C movea.w unk_6FE4(pc,d0.w),a3 movem.l d4-d5/a0,-(sp) movem.l d4-d5,-(sp) bsr.w sub_712A movem.l (sp)+,d4-d5 bsr.w Calc_VRAM_Pos bsr.w sub_70AC movem.l (sp)+,d4-d5/a0

loc_701C: ; CODE XREF: sub_6EA4+156�j addi.w #$10,d4 dbf d6,loc_6FF4 clr.b (a2) rts

End of function sub_6EA4


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


DrawTiles_LR: ; CODE XREF: ROM:00006CBA�p ; ROM:00006CD4�p ... moveq #$15,d6

End of function DrawTiles_LR


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


DrawTiles_LR2: ; CODE XREF: LoadTilesFromStart2+16�p move.l #$800000,d7 move.l d0,d1

loc_7032: ; CODE XREF: DrawTiles_LR2+24�j movem.l d4-d5,-(sp) bsr.w sub_712A move.l d1,d0 bsr.w sub_70AC addq.b #4,d1 andi.b #$7F,d1 ; '?' movem.l (sp)+,d4-d5 addi.w #$10,d5 dbf d6,loc_7032 rts

End of function DrawTiles_LR2


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


DrawTiles_LR3: ; CODE XREF: sub_6D0A+7A�p sub_6D0A+96�p ... move.l #$800000,d7 move.l d0,d1

loc_705C: ; CODE XREF: DrawTiles_LR3+24�j movem.l d4-d5,-(sp) bsr.w loc_712C move.l d1,d0 bsr.w sub_70AC addq.b #4,d1 andi.b #$7F,d1 ; '?' movem.l (sp)+,d4-d5 addi.w #$10,d5 dbf d6,loc_705C rts

End of function DrawTiles_LR3


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


DrawTiles_TB: ; CODE XREF: ROM:00006CEA�p ; ROM:00006D04�p ... moveq #$F,d6

End of function DrawTiles_TB


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


DrawTiles_TB2: ; CODE XREF: sub_6DA6+28�p sub_6DA6+48�p ... move.l #$800000,d7 move.l d0,d1

loc_7088: ; CODE XREF: DrawTiles_TB2+26�j movem.l d4-d5,-(sp) bsr.w sub_712A move.l d1,d0 bsr.w sub_70AC addi.w #$100,d1 andi.w #$FFF,d1 movem.l (sp)+,d4-d5 addi.w #$10,d4 dbf d6,loc_7088 rts

End of function DrawTiles_TB2


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_70AC: ; CODE XREF: sub_6EA4+170�p ; DrawTiles_LR2+12�p ... or.w d2,d0 swap d0 btst #4,(a0) bne.s loc_70E8 btst #3,(a0) bne.s loc_70C8 move.l d0,(a5) move.l (a1)+,(a6) add.l d7,d0 move.l d0,(a5) move.l (a1)+,(a6) rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_70C8: ; CODE XREF: sub_70AC+E�j move.l d0,(a5) move.l (a1)+,d4 eori.l #$8000800,d4 swap d4 move.l d4,(a6) add.l d7,d0 move.l d0,(a5) move.l (a1)+,d4 eori.l #$8000800,d4 swap d4 move.l d4,(a6) rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_70E8: ; CODE XREF: sub_70AC+8�j btst #3,(a0) bne.s loc_710A move.l d0,(a5) move.l (a1)+,d5 move.l (a1)+,d4 eori.l #$10001000,d4 move.l d4,(a6) add.l d7,d0 move.l d0,(a5) eori.l #$10001000,d5 move.l d5,(a6) rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_710A: ; CODE XREF: sub_70AC+40�j move.l d0,(a5) move.l (a1)+,d5 move.l (a1)+,d4 eori.l #$18001800,d4 swap d4 move.l d4,(a6) add.l d7,d0 move.l d0,(a5) eori.l #$18001800,d5 swap d5 move.l d5,(a6) rts

End of function sub_70AC


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_712A: ; CODE XREF: sub_6EA4+164�p ; DrawTiles_LR2+C�p ... add.w (a3),d5

loc_712C: ; CODE XREF: DrawTiles_LR3+C�p add.w 4(a3),d4 lea ($FFFFB000).w,a1 move.w d4,d3 lsr.w #1,d3 andi.w #$380,d3 lsr.w #3,d5 move.w d5,d0 lsr.w #5,d0 andi.w #$7F,d0 ; '?' add.w d3,d0 moveq #-1,d3 move.b (a4,d0.w),d3 beq.s locret_7172 subq.b #1,d3 andi.w #$7F,d3 ; '?' ror.w #7,d3 add.w d4,d4 andi.w #$1E0,d4 andi.w #$1E,d5 add.w d4,d3 add.w d5,d3 movea.l d3,a0 move.w (a0),d3 andi.w #$3FF,d3 lsl.w #3,d3 adda.w d3,a1

locret_7172: ; CODE XREF: sub_712A+24�j rts

End of function sub_712A


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


Calc_VRAM_Pos: ; CODE XREF: ROM:00006CB2�p ; ROM:00006CCA�p ... add.w (a3),d5

loc_7176: ; CODE XREF: sub_6D0A+70�p sub_6D0A+8A�p ... add.w 4(a3),d4 andi.w #$F0,d4 ; 'ð' andi.w #$1F0,d5 lsl.w #4,d4 lsr.w #2,d5 add.w d5,d4 moveq #3,d0 swap d0 move.w d4,d0 rts

End of function Calc_VRAM_Pos
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

add.w 4(a3),d4 add.w (a3),d5 andi.w #$F0,d4 ; 'ð' andi.w #$1F0,d5 lsl.w #4,d4 lsr.w #2,d5 add.w d5,d4 moveq #2,d0 swap d0 move.w d4,d0 rts

ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


LoadTilesFromStart: ; CODE XREF: ROM:0000395A�p ; ROM:000051B8�p lea ($C00004).l,a5 lea ($C00000).l,a6 lea ($FFFFF700).w,a3 lea ($FFFFA400).w,a4 move.w #$4000,d2 bsr.s LoadTilesFromStart2 lea ($FFFFF708).w,a3 lea ($FFFFA440).w,a4 move.w #$6000,d2 tst.b ($FFFFFE10).w beq.w loc_7220 cmpi.b #2,($FFFFFE10).w beq.w loc_725A cmpi.w #$500,($FFFFFE10).w beq.w loc_7288 cmpi.b #6,($FFFFFE10).w beq.w loc_7220

End of function LoadTilesFromStart


ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


LoadTilesFromStart2: ; CODE XREF: ROM:00003096�p ; ROM:0000536A�p ... moveq #-$10,d4 moveq #$F,d6

loc_71FC: ; CODE XREF: LoadTilesFromStart2+22�j movem.l d4-d6,-(sp) moveq #0,d5 move.w d4,d1 bsr.w Calc_VRAM_Pos move.w d1,d4 moveq #0,d5 moveq #$1F,d6 bsr.w DrawTiles_LR2 movem.l (sp)+,d4-d6 addi.w #$10,d4 dbf d6,loc_71FC rts

End of function LoadTilesFromStart2
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_7220: ; CODE XREF: LoadTilesFromStart+2A�j ; LoadTilesFromStart+48�j moveq #0,d4 moveq #$F,d6

loc_7224: ; CODE XREF: ROM:00007244�j movem.l d4-d6,-(sp) lea (unk_724A).l,a0 move.w ($FFFFF70C).w,d0 add.w d4,d0 andi.w #$F0,d0 ; 'ð' bsr.w sub_72BA movem.l (sp)+,d4-d6 addi.w #$10,d4 dbf d6,loc_7224 rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

unk_724A: dc.b 0 ; ; DATA XREF: ROM:00007228�o dc.b 0 ; dc.b 0 ; dc.b 0 ; dc.b 6 ; dc.b 6 ; dc.b 6 ; dc.b 4 ; dc.b 4 ; dc.b 4 ; dc.b 0 ; dc.b 0 ; dc.b 0 ; dc.b 0 ; dc.b 0 ; dc.b 0 ;

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_725A: ; CODE XREF: LoadTilesFromStart+34�j moveq #-$10,d4 moveq #$F,d6

loc_725E: ; CODE XREF: ROM:00007282�j movem.l d4-d6,-(sp) lea (unk_6EF3).l,a0 move.w ($FFFFF70C).w,d0 subi.w #$200,d0 add.w d4,d0 andi.w #$7F0,d0 bsr.w sub_72BA movem.l (sp)+,d4-d6 addi.w #$10,d4 dbf d6,loc_725E rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_7288: ; CODE XREF: LoadTilesFromStart+3E�j moveq #-$10,d4 moveq #$F,d6

loc_728C: ; CODE XREF: ROM:000072AC�j movem.l d4-d6,-(sp) lea (unk_6DF5).l,a0 move.w ($FFFFF70C).w,d0 add.w d4,d0 andi.w #$1F0,d0 bsr.w sub_72BA movem.l (sp)+,d4-d6 addi.w #$10,d4 dbf d6,loc_728C rts

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

unk_72B2: dc.b $F7 ; ÷ dc.b 8 ; dc.b $F7 ; ÷ dc.b 8 ; dc.b $F7 ; ÷ dc.b $10 ; dc.b $F7 ; ÷ dc.b $18 ;

ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ S U B R O U T I N E ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ


sub_72BA: ; CODE XREF: ROM:00007238�p ; ROM:00007276�p ... lsr.w #4,d0 move.b (a0,d0.w),d0 movea.w unk_72B2(pc,d0.w),a3 beq.s loc_72DA moveq #-$10,d5 movem.l d4-d5,-(sp) bsr.w Calc_VRAM_Pos movem.l (sp)+,d4-d5 bsr.w DrawTiles_LR bra.s locret_72EE

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

loc_72DA: ; CODE XREF: sub_72BA+A�j moveq #0,d5 movem.l d4-d5,-(sp) bsr.w loc_7176 movem.l (sp)+,d4-d5 moveq #$1F,d6 bsr.w DrawTiles_LR3

locret_72EE: ; CODE XREF: sub_72BA+1E�j rts

End of function sub_72BA</asm>

Step 6

Assuming you haven't changed the backgrounds of your levels, compile it and give it a go!

Credits

  • Hivebrain - for attempting this first
  • Tweaker - for his assistance when I had some issues to resolve.