SCHG How-to:Add Spindash to Sonic 1/Part 2
From Sonic Retro
(Original guide written by Puto)
Here's a Sonic 1 + Spindash ROM built by following Lightning's guide.
If you try it, you will be able to easily see that there are several things that keep it from being a perfect port.
For example, if you spindash next to a monitor, you won't break it.
Also, the sound effect, while fitting, isn't ideal, there's no dust, and if you spindash while on a seesaw (SLZ), Strange Things(TM)
will happen. So let's fix this.
Contents |
Problem 1: The Monitor Bug
loc_A1EC: ; XREF: Obj26_Solid move.w #$1A,d1 move.w #$F,d2 bsr.w Obj26_SolidSides beq.w loc_A25C tst.w $12(a1) bmi.s loc_A20A cmpi.b #2,$1C(a1) ; is Sonic rolling? beq.s loc_A25C ; if yes, branch
Obj26 is the monitor object. By reading this code, you can see that there is a check for the rolling animation there. This is what causes the monitor bug. To fix it, simply add a second check for the spindash animation after this one:
loc_A1EC: ; XREF: Obj26_Solid move.w #$1A,d1 move.w #$F,d2 bsr.w Obj26_SolidSides beq.w loc_A25C tst.w $12(a1) bmi.s loc_A20A cmpi.b #2,$1C(a1) ; is Sonic rolling? beq.s loc_A25C ; if yes, branch cmp.b #$1F,$1C(a1) ; is Sonic spin-dashing? beq loc_A25C ; if yes, branch
Here's a ROM after this step was carried out. Great, let's try it. It should be working and... oh dear.
This isn't right.
We're spindashing, we're not supposed to use the pushing animation. To fix that, go to Sonic_Spindash, and look at what it does.
These are the first lines:
Sonic_Spindash: tst.b $39(a0) ; already spindashing? bne.s loc2_1AC8E ; if set, branch
Since we know we're spindashing when $39(a0) is set, let's make sure that the spindash animation is used when that happens.
Therefore, go to loc2_1AC8E, and right after the label, add the following line:
move.b #$1F,$1C(a0)
Build the ROM again, and the monitor bug should be permanently taken care of. Here's a ROM after this step was carried out.
Problem 2: Spindash Sound Effect
Adding a sound effect to Sonic 1 isn't the most trivial of things to do. So be sure to follow these steps exactly.
First, we need a free slot. Since all the slots reserved for sound effects in Sonic 1 are taken, we therefore need to reserve extra slots for sound effects. The $D1-$DF area is free, so let's use that. Go to Sound_ChkValue, and you should be able to see this line there:
cmpi.b #$E0,d7 bcs.w Sound_D0toDF ; sound $D0-$DF
Since only $D0 is actually used here, it's a rather large waste to keep the rest of the slots unused, so change that $E0 to $D1:
cmpi.b #$D1,d7 bcs.w Sound_D0toDF ; sound $D0
And after that line, let's add our own comparison:
cmp.b #$DF,d7 ble Sound_D1toDF
Now, we have to actually create this routine. So go to Sound_A0toCF, and see what it does:
Sound_A0toCF: ; XREF: Sound_ChkValue tst.b $27(a6) bne.w loc_722C6 tst.b 4(a6) bne.w loc_722C6 tst.b $24(a6) bne.w loc_722C6 cmpi.b #$B5,d7 ; is ring sound effect played? bne.s Sound_notB5 ; if not, branch tst.b $2B(a6) bne.s loc_721EE move.b #$CE,d7 ; play ring sound in left speaker loc_721EE: bchg #0,$2B(a6) ; change speaker Sound_notB5: cmpi.b #$A7,d7 ; is "pushing" sound played? bne.s Sound_notA7 ; if not, branch tst.b $2C(a6) bne.w locret_722C4 move.b #$80,$2C(a6) Sound_notA7: movea.l (Go_SoundIndex).l,a0 subi.b #$A0,d7 lsl.w #2,d7 movea.l (a0,d7.w),a3 movea.l a3,a1 moveq #0,d1 move.w (a1)+,d1 add.l a3,d1 move.b (a1)+,d5 move.b (a1)+,d7 subq.b #1,d7 moveq #$30,d6 (...)
As you can see, this routine has a lot of checks for special sound effects, like the ring effect and the pushing effect.
We don't need that for our new routine, so trash all of that, and you end up with:
Sound_D1toDF: tst.b $27(a6) bne.w loc_722C6 tst.b 4(a6) bne.w loc_722C6 tst.b $24(a6) bne.w loc_722C6 movea.l (Go_SoundIndex).l,a0 subi.b #$A0,d7 lsl.w #2,d7 movea.l (a0,d7.w),a3 movea.l a3,a1 moveq #0,d1 move.w (a1)+,d1 add.l a3,d1 move.b (a1)+,d5 move.b (a1)+,d7 subq.b #1,d7 moveq #$30,d6 (...)
There's a problem here: If we subtract $A0 to get the current index, then the next entry in this index will be sound $D0, which is handled by a different routine, forcing us to have an unused entry in an index. So, change that line to subtract $A1 instead:
Sound_D1toDF: tst.b $27(a6) bne.w loc_722C6 tst.b 4(a6) bne.w loc_722C6 tst.b $24(a6) bne.w loc_722C6 movea.l (Go_SoundIndex).l,a0 subi.b #$A1,d7 lsl.w #2,d7 movea.l (a0,d7.w),a3 movea.l a3,a1 moveq #0,d1 move.w (a1)+,d1 add.l a3,d1 move.b (a1)+,d5 move.b (a1)+,d7 subq.b #1,d7 moveq #$30,d6 (...)
Also, it can be noted that any code after the $A1 line is common to the two routines.
So in the original routine, add a label right before "lsl.w #2,d7":
Sound_notA7: movea.l (Go_SoundIndex).l,a0 subi.b #$A0,d7 SoundEffects_Common: lsl.w #2,d7 movea.l (a0,d7.w),a3 movea.l a3,a1 moveq #0,d1 move.w (a1)+,d1 add.l a3,d1 move.b (a1)+,d5 move.b (a1)+,d7 subq.b #1,d7 moveq #$30,d6 (...)
And we can now greatly reduce the size of our new routine:
Sound_D1toDF: tst.b $27(a6) bne.w loc_722C6 tst.b 4(a6) bne.w loc_722C6 tst.b $24(a6) bne.w loc_722C6 movea.l (Go_SoundIndex).l,a0 sub.b #$A1,d7 bra SoundEffects_Common
So, after this is done, put the routine right above Sound_A0toCF.
Now, all we need is the actual ported spin-dash sound effect, which I provide here.
Put this file in the sound\ directory of your source code, and go to the SoundD0 label. After the even, add the following lines:
SoundD1: incbin sound\soundD1.bin even
So the surrounding code should look like this:
SoundCF: incbin sound\soundCF.bin even SoundD0: incbin sound\soundD0.bin even SoundD1: incbin sound\soundD1.bin even SegaPCM: incbin sound\segapcm.bin even
And finally, add SoundD1 to the index:
SoundIndex: dc.l SoundA0, SoundA1, SoundA2 dc.l SoundA3, SoundA4, SoundA5 dc.l SoundA6, SoundA7, SoundA8 dc.l SoundA9, SoundAA, SoundAB dc.l SoundAC, SoundAD, SoundAE dc.l SoundAF, SoundB0, SoundB1 dc.l SoundB2, SoundB3, SoundB4 dc.l SoundB5, SoundB6, SoundB7 dc.l SoundB8, SoundB9, SoundBA dc.l SoundBB, SoundBC, SoundBD dc.l SoundBE, SoundBF, SoundC0 dc.l SoundC1, SoundC2, SoundC3 dc.l SoundC4, SoundC5, SoundC6 dc.l SoundC7, SoundC8, SoundC9 dc.l SoundCA, SoundCB, SoundCC dc.l SoundCD, SoundCE, SoundCF dc.l SoundD1
Now, go to Sound_Spindash, and change all references to sound $BE to reference sound $D1 instead. For reference, here's the complete routine:
Sonic_Spindash: tst.b $39(a0) ; already spindashing? bne.s loc2_1AC8E ; if set, branch cmpi.b #8,$1C(a0) ; is anim duck bne.s locret2_1AC8C ; if not, return move.b ($FFFFF603).w,d0 ; read controller andi.b #$70,d0 ; pressing A/B/C ? beq.w locret2_1AC8C ; if not, return move.b #$1F,$1C(a0) ; set spindash anim (9 in s2) move.w #$D1,d0 ; spin sound ($E0 in s2) jsr (PlaySound_Special).l ; play spin sound addq.l #4,sp ; increment stack ptr move.b #1,$39(a0) ; set spindash flag move.w #0,$3A(a0) ; set charge count to 0 cmpi.b #$C,$28(a0) ; ??? oxygen remaining? bcs.s loc2_1AC84 ; ??? branch if carry move.b #2,($FFFFD11C).w ; ??? $D11C only seems ; to be used in spindash loc2_1AC84: bsr.w Sonic_LevelBound bsr.w Sonic_AnglePos locret2_1AC8C: rts ; --------------------------------------------------------------------------- loc2_1AC8E: move.b #$1F,$1C(a0) move.b ($FFFFF602).w,d0 ; read controller btst #1,d0 ; check down button bne.w loc2_1AD30 ; if set, branch move.b #$E,$16(a0) ; $16(a0) is height/2 move.b #7,$17(a0) ; $17(a0) is width/2 move.b #2,$1C(a0) ; set animation to roll addq.w #5,$C(a0) ; $C(a0) is Y coordinate move.b #0,$39(a0) ; clear spindash flag moveq #0,d0 move.b $3A(a0),d0 ; copy charge count add.w d0,d0 ; double it move.w spdsh_norm(pc,d0.w),$14(a0) ; get normal speed tst.b ($FFFFFE19).w ; is sonic super? beq.s loc2_1ACD0 ; if no, branch move.w spdsh_super(pc,d0.w),$14(a0) ; get super speed loc2_1ACD0: ; TODO: figure this out move.w $14(a0),d0 ; get inertia subi.w #$800,d0 ; subtract $800 add.w d0,d0 ; double it andi.w #$1F00,d0 ; mask it against $1F00 neg.w d0 ; negate it addi.w #$2000,d0 ; add $2000 move.w d0,($FFFFEED0).w ; move to $EED0 btst #0,$22(a0) ; is sonic facing right? beq.s loc2_1ACF4 ; if not, branch neg.w $14(a0) ; negate inertia loc2_1ACF4: bset #2,$22(a0) ; set unused (in s1) flag move.b #0,($FFFFD11C).w ; clear $D11C (unused?) move.w #$BC,d0 ; spin release sound jsr (PlaySound_Special).l ; play it! bra.s loc2_1AD78 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ spdsh_norm: dc.w $800 ; 0 dc.w $880 ; 1 dc.w $900 ; 2 dc.w $980 ; 3 dc.w $A00 ; 4 dc.w $A80 ; 5 dc.w $B00 ; 6 dc.w $B80 ; 7 dc.w $C00 ; 8 spdsh_super: dc.w $B00 ; 0 dc.w $B80 ; 1 dc.w $C00 ; 2 dc.w $C80 ; 3 dc.w $D00 ; 4 dc.w $D80 ; 5 dc.w $E00 ; 6 dc.w $E80 ; 7 dc.w $F00 ; 8 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc2_1AD30: ; If still charging the dash... tst.w $3A(a0) ; check charge count beq.s loc2_1AD48 ; if zero, branch move.w $3A(a0),d0 ; otherwise put it in d0 lsr.w #5,d0 ; shift right 5 (divide it by 32) sub.w d0,$3A(a0) ; subtract from charge count bcc.s loc2_1AD48 ; ??? branch if carry clear move.w #0,$3A(a0) ; set charge count to 0 loc2_1AD48: move.b ($FFFFF603).w,d0 ; read controller andi.b #$70,d0 ; pressing A/B/C? beq.w loc2_1AD78 ; if not, branch move.w #$1F00,$1C(a0) ; reset spdsh animation move.w #$D1,d0 ; was $E0 in sonic 2 jsr (PlaySound_Special).l ; play charge sound addi.w #$200,$3A(a0) ; increase charge count cmpi.w #$800,$3A(a0) ; check if it's maxed bcs.s loc2_1AD78 ; if not, then branch move.w #$800,$3A(a0) ; reset it to max loc2_1AD78: addq.l #4,sp ; increase stack ptr cmpi.w #$60,($FFFFEED8).w ; $EED8 only ever seems beq.s loc2_1AD8C ; to be used in spindash bcc.s loc2_1AD88 addq.w #4,($FFFFEED8).w loc2_1AD88: subq.w #2,($FFFFEED8).w loc2_1AD8C: bsr.w Sonic_LevelBound bsr.w Sonic_AnglePos move.w #$60,($FFFFF73E).w ; reset looking up/down rts
So, problem solved. Here's a rom of the output after fixing this problem.
Problem 3: See-Saw Bug (AKA Sonic 2 Spindash Bug)
This problem occurs when you're spindashing on a seesaw, and then you get thrown up by the seesaw.
You keep your spindash state, and dash off immediately once you land. This is clearly not the wanted behaviour.
To fix this, go to Obj01_MdJump and Obj01_MdJump2, and add the following line at the beginning of each of the two routines:
clr.b $39(a0)
This should fix the see-saw bug. Here's the rom.
Problem 4: Spindash Dust
This is a big one. For starters, you need to port the spindash dust object from Sonic 2.
For your convenience, here is the code to the ported object, paste it right before Obj01 (the sonic object):
Spindash_dust: Sprite_1DD20: ; DATA XREF: ROM:0001600C�o moveq #0,d0 move.b $24(a0),d0 move off_1DD2E(pc,d0.w),d1 jmp off_1DD2E(pc,d1.w) ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ off_1DD2E: dc loc_1DD36-off_1DD2E; 0 ; DATA XREF: h+6DBA�o h+6DBC�o ... dc loc_1DD90-off_1DD2E; 1 dc loc_1DE46-off_1DD2E; 2 dc loc_1DE4A-off_1DD2E; 3 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DD36: ; DATA XREF: h+6DBA�o addq.b #2,$24(a0) move.l #MapUnc_1DF5E,4(a0) or.b #4,1(a0) move.b #1,$18(a0) move.b #$10,$19(a0) move #$7A0,2(a0) move #-$3000,$3E(a0) move #$F400,$3C(a0) cmp #-$2E40,a0 beq.s loc_1DD8C move.b #1,$34(a0) ; cmp #2,($FFFFFF70).w ; beq.s loc_1DD8C ; move #$48C,2(a0) ; move #-$4FC0,$3E(a0) ; move #-$6E80,$3C(a0) loc_1DD8C: ; CODE XREF: h+6DF6�j h+6E04�j ; bsr.w sub_16D6E loc_1DD90: ; DATA XREF: h+6DBA�o movea.w $3E(a0),a2 moveq #0,d0 move.b $1C(a0),d0 add d0,d0 move off_1DDA4(pc,d0.w),d1 jmp off_1DDA4(pc,d1.w) ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ off_1DDA4: dc loc_1DE28-off_1DDA4; 0 ; DATA XREF: h+6E30�o h+6E32�o ... dc loc_1DDAC-off_1DDA4; 1 dc loc_1DDCC-off_1DDA4; 2 dc loc_1DE20-off_1DDA4; 3 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DDAC: ; DATA XREF: h+6E30�o move ($FFFFF646).w,$C(a0) tst.b $1D(a0) bne.s loc_1DE28 move 8(a2),8(a0) move.b #0,$22(a0) and #$7FFF,2(a0) bra.s loc_1DE28 ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DDCC: ; DATA XREF: h+6E30�o ; cmp.b #$C,$28(a2) ; bcs.s loc_1DE3E cmp.b #4,$24(a2) bcc.s loc_1DE3E tst.b $39(a2) beq.s loc_1DE3E move 8(a2),8(a0) move $C(a2),$C(a0) move.b $22(a2),$22(a0) and.b #1,$22(a0) tst.b $34(a0) beq.s loc_1DE06 sub #4,$C(a0) loc_1DE06: ; CODE XREF: h+6E8A�j tst.b $1D(a0) bne.s loc_1DE28 and #$7FFF,2(a0) tst 2(a2) bpl.s loc_1DE28 or #-$8000,2(a0) ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DE20: ; DATA XREF: h+6E30�o loc_1DE28: ; CODE XREF: h+6E42�j h+6E56�j ... lea (off_1DF38).l,a1 jsr AnimateSprite bsr.w loc_1DEE4 jmp DisplaySprite ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DE3E: ; CODE XREF: h+6E5E�j h+6E66�j ... move.b #0,$1C(a0) rts ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DE46: ; DATA XREF: h+6DBA�o bra.w DeleteObject ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DE4A: movea.w $3E(a0),a2 moveq #$10,d1 cmp.b #$D,$1C(a2) beq.s loc_1DE64 moveq #$6,d1 cmp.b #$3,$21(a2) beq.s loc_1DE64 move.b #2,$24(a0) move.b #0,$32(a0) rts ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DE64: ; CODE XREF: h+6EE0�j subq.b #1,$32(a0) bpl.s loc_1DEE0 move.b #3,$32(a0) jsr SingleObjLoad bne.s loc_1DEE0 move.b 0(a0),0(a1) move 8(a2),8(a1) move $C(a2),$C(a1) tst.b $34(a0) beq.s loc_1DE9A sub #4,d1 loc_1DE9A: ; CODE XREF: h+6F1E�j add d1,$C(a1) move.b #0,$22(a1) move.b #3,$1C(a1) addq.b #2,$24(a1) move.l 4(a0),4(a1) move.b 1(a0),1(a1) move.b #1,$18(a1) move.b #4,$19(a1) move 2(a0),2(a1) move $3E(a0),$3E(a1) and #$7FFF,2(a1) tst 2(a2) bpl.s loc_1DEE0 or #-$8000,2(a1) loc_1DEE0: ; CODE XREF: h+6EF4�j h+6F00�j ... bsr.s loc_1DEE4 rts ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ loc_1DEE4: ; CODE XREF: h+6EC0�p h+6F6C�p moveq #0,d0 move.b $1A(a0),d0 cmp.b $30(a0),d0 beq.w locret_1DF36 move.b d0,$30(a0) lea (off_1E074).l,a2 add d0,d0 add (a2,d0.w),a2 move (a2)+,d5 subq #1,d5 bmi.w locret_1DF36 move $3C(a0),d4 loc_1DF0A: ; CODE XREF: h+6FBE�j moveq #0,d1 move (a2)+,d1 move d1,d3 lsr.w #8,d3 and #$F0,d3 ; 'ð' add #$10,d3 and #$FFF,d1 lsl.l #5,d1 add.l #Art_Dust,d1 move d4,d2 add d3,d4 add d3,d4 jsr (DMA_68KtoVRAM).l dbf d5,loc_1DF0A rts locret_1DF36: ; CODE XREF: h+6F7A�j h+6F90�j rts ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ off_1DF38: dc byte_1DF40-off_1DF38; 0 ; DATA XREF: h+6EB4�o h+6FC4�o ... dc byte_1DF43-off_1DF38; 1 dc byte_1DF4F-off_1DF38; 2 dc byte_1DF58-off_1DF38; 3 byte_1DF40: dc.b $1F, 0,$FF ; 0 ; DATA XREF: h+6FC4�o byte_1DF43: dc.b 3, 1, 2, 3, 4, 5, 6, 7, 8, 9,$FD, 0; 0 ; DATA XREF: h+6FC4�o byte_1DF4F: dc.b 1, $A, $B, $C, $D, $E, $F,$10,$FF; 0 ; DATA XREF: h+6FC4�o byte_1DF58: dc.b 3,$11,$12,$13,$14,$FC; 0 ; DATA XREF: h+6FC4�o ; ------------------------------------------------------------------------------- ; Unknown Sprite Mappings ; ------------------------------------------------------------------------------- MapUnc_1DF5E: dc word_1DF8A-MapUnc_1DF5E; 0 dc word_1DF8C-MapUnc_1DF5E; 1 dc word_1DF96-MapUnc_1DF5E; 2 dc word_1DFA0-MapUnc_1DF5E; 3 dc word_1DFAA-MapUnc_1DF5E; 4 dc word_1DFB4-MapUnc_1DF5E; 5 dc word_1DFBE-MapUnc_1DF5E; 6 dc word_1DFC8-MapUnc_1DF5E; 7 dc word_1DFD2-MapUnc_1DF5E; 8 dc word_1DFDC-MapUnc_1DF5E; 9 dc word_1DFE6-MapUnc_1DF5E; 10 dc word_1DFF0-MapUnc_1DF5E; 11 dc word_1DFFA-MapUnc_1DF5E; 12 dc word_1E004-MapUnc_1DF5E; 13 dc word_1E016-MapUnc_1DF5E; 14 dc word_1E028-MapUnc_1DF5E; 15 dc word_1E03A-MapUnc_1DF5E; 16 dc word_1E04C-MapUnc_1DF5E; 17 dc word_1E056-MapUnc_1DF5E; 18 dc word_1E060-MapUnc_1DF5E; 19 dc word_1E06A-MapUnc_1DF5E; 20 dc word_1DF8A-MapUnc_1DF5E; 21 word_1DF8A: dc.b 0 word_1DF8C: dc.b 1 dc.b $F2, $0D, $0, 0,$F0; 0 word_1DF96: dc.b 1 dc.b $E2, $0F, $0, 0,$F0; 0 word_1DFA0: dc.b 1 dc.b $E2, $0F, $0, 0,$F0; 0 word_1DFAA: dc.b 1 dc.b $E2, $0F, $0, 0,$F0; 0 word_1DFB4: dc.b 1 dc.b $E2, $0F, $0, 0,$F0; 0 word_1DFBE: dc.b 1 dc.b $E2, $0F, $0, 0,$F0; 0 word_1DFC8: dc.b 1 dc.b $F2, $0D, $0, 0,$F0; 0 word_1DFD2: dc.b 1 dc.b $F2, $0D, $0, 0,$F0; 0 word_1DFDC: dc.b 1 dc.b $F2, $0D, $0, 0,$F0; 0 word_1DFE6: dc.b 1 dc.b $4, $0D, $0, 0,$E0; 0 word_1DFF0: dc.b 1 dc.b $4, $0D, $0, 0,$E0; 0 word_1DFFA: dc.b 1 dc.b $4, $0D, $0, 0,$E0; 0 word_1E004: dc.b 2 dc.b $F4, $01, $0, 0,$E8; 0 dc.b $4, $0D, $0, 2,$E0; 4 word_1E016: dc.b 2 dc.b $F4, $05, $0, 0,$E8; 0 dc.b $4, $0D, $0, 4,$E0; 4 word_1E028: dc.b 2 dc.b $F4, $09, $0, 0,$E0; 0 dc.b $4, $0D, $0, 6,$E0; 4 word_1E03A: dc.b 2 dc.b $F4, $09, $0, 0,$E0; 0 dc.b $4, $0D, $0, 6,$E0; 4 word_1E04C: dc.b 1 dc.b $F8, $05, $0, 0,$F8; 0 word_1E056: dc.b 1 dc.b $F8, $05, $0, 4,$F8; 0 word_1E060: dc.b 1 dc.b $F8, $05, $0, 8,$F8; 0 word_1E06A: dc.b 1 dc.b $F8, $05, $0, $C,$F8; 0 dc.b 0 off_1E074: dc word_1E0A0-off_1E074; 0 dc word_1E0A2-off_1E074; 1 dc word_1E0A6-off_1E074; 2 dc word_1E0AA-off_1E074; 3 dc word_1E0AE-off_1E074; 4 dc word_1E0B2-off_1E074; 5 dc word_1E0B6-off_1E074; 6 dc word_1E0BA-off_1E074; 7 dc word_1E0BE-off_1E074; 8 dc word_1E0C2-off_1E074; 9 dc word_1E0C6-off_1E074; 10 dc word_1E0CA-off_1E074; 11 dc word_1E0CE-off_1E074; 12 dc word_1E0D2-off_1E074; 13 dc

