Actions

SCHG How-to Talk

Add Spin Dash to Sonic 1/Part 1

From Sonic Retro

HELP!!!!!

I can't get S1Built.bin. Here's my Errors.txt:

SN 68k version 2.53

F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(9) : Error : Symbol 'spindash_flag' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(11) : Error : Symbol 'aniidsonani_duck' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(13) : Error : Symbol 'ctrl_1_press_logical' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(14) : Error : Symbol 'button_a_mask' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(14) : Error : Symbol 'button_c_mask' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(14) : Error : Symbol 'button_b_mask' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(16) : Error : Symbol 'aniidsonani_spindash' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(17) : Error : Symbol 'sndid_spindashrev' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(20) : Error : Symbol 'spindash_flag' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(21) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(22) : Error : Symbol 'air_left' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(23) : Error : Symbol 'sonic_dust' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(25) : Error : Symbol 'anglepos' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(40) : Error : Symbol 'ctrl_1_held_logical' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(41) : Error : Symbol 'button_down' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(47) : Error : Symbol 'aniidsonani_roll' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(49) : Error : Symbol 'spindash_flag' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(51) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(53) : Error : Symbol 'inertia' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(54) : Error : Symbol 'super_sonic_flag' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(56) : Error : Symbol 'inertia' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(58) : Error : Symbol 'inertia' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(64) : Error : Symbol 'horiz_scroll_delay_val' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(67) : Error : Symbol 'inertia' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(70) : Error : Symbol 'sonic_dust' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(71) : Error : Symbol 'sndid_spindashrelease' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(100) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(102) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(104) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(106) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(108) : Error : Symbol 'ctrl_1_press_logical' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(109) : Error : Symbol 'button_a_mask' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(109) : Error : Symbol 'button_c_mask' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(109) : Error : Symbol 'button_b_mask' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(111) : Error : Symbol 'aniidsonani_spindash' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(112) : Error : Symbol 'sndid_spindashrev' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(114) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(115) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(117) : Error : Symbol 'spindash_counter' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(122) : Error : Symbol 'camera_y_pos_bias' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(125) : Error : Symbol 'camera_y_pos_bias' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(126) : Error : Symbol 'camera_y_pos_bias' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SONIC SPINDASH.ASM(130) : Error : Symbol 'anglepos' not defined
F:\SRC\SONIC4\SONED2\S1S\_INCOBJ\SUB REACTTOITEM.ASM(170) : Error : Symbol 'id_spindash' not defined

Assembly completed.
44 error(s) from 53468 lines in 0.75 seconds
--MarioMario456 (talk) 14:47, 13 October 2017 (CDT)


You could try defining the undefined symbols

Lilggamegenuis (talk) 16:24, 20 October 2017 (CDT)

Fixed,I was using the Sonic 2 GitHub disassembly and Sonic 1 GitHub disassembly. I'm now using the Sonic 2 Aurochs disassembly and Sonic 1 GitHub disassembly. Homewer, I have these problems and bugs:
  • Tile Molester uses the default palette, making imposibble to add the Spindashing sprites.
  • If I do a Spindash to the left, I'll go to the right instead.

Animated GIF of the problem:

S1SDB.GIF

My code:

; Start of subroutine Sonic_SpinDash

Sonic_SpinDash:
		tst.b	$39(a0)
		bne.s	loc_1AC8E
		cmpi.b	#id_Duck,obAnim(a0)
		bne.s	locret_1AC8C
		move.b	($FFFFF603).w,d0
		andi.b	#$70,d0
		beq.w	locret_1AC8C
		move.b	#id_Roll,obAnim(a0)
		move.w	#$BE,d0
		jsr	(PlaySound_Special).l
		addq.l	#4,sp
		move.b	#1,$39(a0)
		move.w	#0,$3A(a0)
		cmpi.b	#$C,$28(a0)
		bcs.s	loc_1AC84
		move.b	#2,($FFFFD11C).w

loc_1AC84:
		bsr.w	Sonic_LevelBound
		bsr.w	Sonic_AnglePos

locret_1AC8C:
		rts	

; ---------------------------------------------------------------------------

loc_1AC8E:
		move.b	($FFFFF602).w,d0
		btst	#1,d0
		bne.w	loc_1AD30
		move.b	#$E,$16(a0)
		move.b	#7,$17(a0)
		move.b	#id_Roll,obAnim(a0)
		addq.w	#5,$C(a0)
		move.b	#0,$39(a0)
		moveq	#0,d0
		move.b	$3A(a0),d0
		add.w	d0,d0
		move.w	Dash_Speeds(pc,d0.w),obInertia(a0)

loc_1ACF4:
		bset	#2,$22(a0)
		move.b	#0,($FFFFD11C).w
		move.w	#$BC,d0
		jsr	(PlaySound_Special).l
		bra.s	loc_1AD78

; ---------------------------------------------------------------------------

Dash_Speeds:	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
		
; ---------------------------------------------------------------------------

loc_1AD30:				; If still charging the dash...
		tst.w	$3A(a0)
		beq.s	loc_1AD48
		move.w	$3A(a0),d0
		lsr.w	#5,d0
		sub.w	d0,$3A(a0)
		bcc.s	loc_1AD48
		move.w	#0,$3A(a0)

loc_1AD48:
		move.b	($FFFFF603).w,d0
		andi.b	#$70,d0	; 'p'
		beq.w	loc_1AD78
;		move.w	#$900,obAnim(a0)
		move.w	#$BE,d0	; 'à'
		jsr	(PlaySound_Special).l
		addi.w	#$200,$3A(a0)
		cmpi.w	#$800,$3A(a0)
		bcs.s	loc_1AD78
		move.w	#$800,$3A(a0)

loc_1AD78:
		addq.l	#4,sp
		cmpi.w	#$60,($FFFFEED8).w
		beq.s	loc_1AD8C
		bcc.s	loc_1AD88
		addq.w	#4,($FFFFEED8).w

loc_1AD88:
		subq.w	#2,($FFFFEED8).w

loc_1AD8C:
		bsr.w	Sonic_LevelBound
		bsr.w	Sonic_AnglePos
		move.w #$60,(v_lookshift).w
		rts
; End of subroutine Sonic_SpinDash

If you have a fix, give it to me. --MarioMario456 (talk) 16:03, 4 November 2017 (CDT)

The fix

Try this:

; Start of subroutine Sonic_SpinDash

Sonic_SpinDash:
		tst.b	$39(a0)
		bne.s	loc_1AC8E
		cmpi.b	#id_Duck,obAnim(a0)
		bne.s	locret_1AC8C
		move.b	($FFFFF603).w,d0
		andi.b	#$70,d0
		beq.w	locret_1AC8C
		move.b	#id_Roll,obAnim(a0)
		move.w	#$BE,d0
		jsr	(PlaySound_Special).l
		addq.l	#4,sp
		move.b	#1,$39(a0)
		move.w	#0,$3A(a0)
		cmpi.b	#$C,$28(a0)
		bcs.s	loc_1AC84
		move.b	#2,($FFFFD11C).w

loc_1AC84:
		bsr.w	Sonic_LevelBound
		bsr.w	Sonic_AnglePos

locret_1AC8C:
		rts	

; ---------------------------------------------------------------------------

loc_1AC8E:
		move.b	($FFFFF602).w,d0
		btst	#1,d0
		bne.w	loc_1AD30
		move.b	#$E,$16(a0)
		move.b	#7,$17(a0)
		move.b	#id_Roll,obAnim(a0)
		addq.w	#5,$C(a0)
		move.b	#0,$39(a0)
		moveq	#0,d0
		move.b	$3A(a0),d0
		add.w	d0,d0
		move.w	Dash_Speeds(pc,d0.w),obInertia(a0)
		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,($FFFFC904).w	; move to $C904
		btst	#0,$22(a0)		; is sonic facing right?
		beq.s	loc_1ACF4		; if not, branch
		neg.w	$14(a0)			; negate inertia
loc_1ACF4:
		bset	#2,$22(a0)
		move.b	#0,($FFFFD11C).w
		move.w	#$BC,d0
		jsr	(PlaySound_Special).l
		bra.s	loc_1AD78

; ---------------------------------------------------------------------------

Dash_Speeds:	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
		
; ---------------------------------------------------------------------------

loc_1AD30:				; If still charging the dash...
		tst.w	$3A(a0)
		beq.s	loc_1AD48
		move.w	$3A(a0),d0
		lsr.w	#5,d0
		sub.w	d0,$3A(a0)
		bcc.s	loc_1AD48
		move.w	#0,$3A(a0)

loc_1AD48:
		move.b	($FFFFF603).w,d0
		andi.b	#$70,d0	; 'p'
		beq.w	loc_1AD78
;		move.w	#$900,obAnim(a0)
		move.w	#$BE,d0	; 'à'
		jsr	(PlaySound_Special).l
		addi.w	#$200,$3A(a0)
		cmpi.w	#$800,$3A(a0)
		bcs.s	loc_1AD78
		move.w	#$800,$3A(a0)

loc_1AD78:
		addq.l	#4,sp
		cmpi.w	#$60,($FFFFEED8).w
		beq.s	loc_1AD8C
		bcc.s	loc_1AD88
		addq.w	#4,($FFFFEED8).w

loc_1AD88:
		subq.w	#2,($FFFFEED8).w

loc_1AD8C:
		bsr.w	Sonic_LevelBound
		bsr.w	Sonic_AnglePos
		move.w #$60,(v_lookshift).w
		rts
; End of subroutine Sonic_SpinDash

The bug explained

The problem here is that there's some missing code after:

		move.w	Dash_Speeds(pc,d0.w),obInertia(a0)

When the code is not there, that's what makes Sonic go right when he's supposed to be going left, but when the code is there, then boom! the code is fixed!

There you have it, the fix to the "Sonic spindashing right when he's supposed to be going left" bug! --pmowery (talk) 16:56, 6 August 2020 (EDT)