Difference between revisions of "Improve ObjectMove subroutines"
From Sonic Retro
Luigi Hero (talk | contribs) m (Fixed my name link) |
Scarred Sun (talk | contribs) m (Text replacement - "</asm>" to "</syntaxhighlight>") |
||
Line 31: | Line 31: | ||
; End of function ObjectFall | ; End of function ObjectFall | ||
− | </ | + | </syntaxhighlight> |
To this: | To this: | ||
Line 48: | Line 48: | ||
; End of function ObjectFall | ; End of function ObjectFall | ||
− | </ | + | </syntaxhighlight> |
Next, find SpeedToPos and change this: | Next, find SpeedToPos and change this: | ||
Line 68: | Line 68: | ||
; End of function SpeedToPos | ; End of function SpeedToPos | ||
− | </ | + | </syntaxhighlight> |
to this: | to this: | ||
Line 84: | Line 84: | ||
; End of function SpeedToPos | ; End of function SpeedToPos | ||
− | </ | + | </syntaxhighlight> |
==Sonic 1 Git/SVN== | ==Sonic 1 Git/SVN== | ||
Line 106: | Line 106: | ||
; End of function ObjectFall | ; End of function ObjectFall | ||
− | </ | + | </syntaxhighlight> |
To this: | To this: | ||
Line 123: | Line 123: | ||
; End of function ObjectFall | ; End of function ObjectFall | ||
− | </ | + | </syntaxhighlight> |
Next, open "_incObj/sub SpeedToPos.asm" and change this: | Next, open "_incObj/sub SpeedToPos.asm" and change this: | ||
Line 143: | Line 143: | ||
; End of function SpeedToPos | ; End of function SpeedToPos | ||
− | </ | + | </syntaxhighlight> |
to this: | to this: | ||
Line 159: | Line 159: | ||
; End of function SpeedToPos | ; End of function SpeedToPos | ||
− | </ | + | </syntaxhighlight> |
==Sonic 2== | ==Sonic 2== | ||
Line 180: | Line 180: | ||
rts | rts | ||
; End of function ObjectMoveAndFall | ; End of function ObjectMoveAndFall | ||
− | </ | + | </syntaxhighlight> |
To this: | To this: | ||
Line 196: | Line 196: | ||
rts | rts | ||
; End of function ObjectMoveAndFall | ; End of function ObjectMoveAndFall | ||
− | </ | + | </syntaxhighlight> |
Next, go to "ObjectMove:" and change this: | Next, go to "ObjectMove:" and change this: | ||
Line 215: | Line 215: | ||
rts | rts | ||
; End of function ObjectMove | ; End of function ObjectMove | ||
− | </ | + | </syntaxhighlight> |
to this: | to this: | ||
Line 230: | Line 230: | ||
rts | rts | ||
; End of function ObjectMove | ; End of function ObjectMove | ||
− | </ | + | </syntaxhighlight> |
==Conclusion== | ==Conclusion== |
Revision as of 21:29, 20 December 2015
(Original guide by redhotsonic)
(Hivebrain Addition by Luigi Hero)
Want to speed up your hack?
In S1, S2 and S3K, there are two subroutines: one allows an object to move about, and the other does the same, except it applies gravity to it. In S1, these subroutines are SpeedToPos, and ObjectFall, respectively. In S2, these are ObjectMove and ObjectMoveAndFall. Finally, in S3K, these are MoveSprite2 and MoveSprite.
S3K has the same subroutines except the code is a bit shorter and therefore, it's faster. It may not look much faster, but again, with all the objects on screen, it has to apply it for every frame.
So, let's change our subroutines to work more like S3K's. To do this, it's really simple.
Sonic 1 Hivebrain
First find ObjectFall and change this: <asm> ObjectFall: move.l 8(a0),d2 move.l $C(a0),d3 move.w $10(a0),d0 ext.l d0 asl.l #8,d0 add.l d0,d2 move.w $12(a0),d0 addi.w #$38,$12(a0) ; increase vertical speed ext.l d0 asl.l #8,d0 add.l d0,d3 move.l d2,8(a0) move.l d3,$C(a0) rts
- End of function ObjectFall
</syntaxhighlight>
To this: <asm> ObjectFall: move.w $10(a0),d0 ext.l d0 lsl.l #8,d0 add.l d0,8(a0) move.w $12(a0),d0 addi.w #$38,$12(a0) ; increase vertical speed ext.l d0 lsl.l #8,d0 add.l d0,$C(a0) rts
- End of function ObjectFall
</syntaxhighlight>
Next, find SpeedToPos and change this: <asm> SpeedToPos: move.l 8(a0),d2 move.l $C(a0),d3 move.w $10(a0),d0 ; load horizontal speed ext.l d0 asl.l #8,d0 ; multiply speed by $100 add.l d0,d2 ; add to x-axis position move.w $12(a0),d0 ; load vertical speed ext.l d0 asl.l #8,d0 ; multiply by $100 add.l d0,d3 ; add to y-axis position move.l d2,8(a0) ; update x-axis position move.l d3,$C(a0) ; update y-axis position rts
- End of function SpeedToPos
</syntaxhighlight>
to this: <asm> SpeedToPos: move.w $10(a0),d0 ; load horizontal speed ext.l d0 lsl.l #8,d0 ; multiply speed by $100 add.l d0,8(a0) ; add to x-axis position move.w $12(a0),d0 ; load vertical speed ext.l d0 lsl.l #8,d0 ; multiply by $100 add.l d0,$C(a0) ; add to y-axis position rts
- End of function SpeedToPos
</syntaxhighlight>
Sonic 1 Git/SVN
Open "_incObj/sub ObjectFall.asm" and change this: <asm> ObjectFall: move.l obX(a0),d2 move.l obY(a0),d3 move.w obVelX(a0),d0 ext.l d0 asl.l #8,d0 add.l d0,d2 move.w obVelY(a0),d0 addi.w #$38,obVelY(a0) ; increase vertical speed ext.l d0 asl.l #8,d0 add.l d0,d3 move.l d2,obX(a0) move.l d3,obY(a0) rts
- End of function ObjectFall
</syntaxhighlight>
To this: <asm> ObjectFall: move.w obVelX(a0),d0 ext.l d0 lsl.l #8,d0 add.l d0,obX(a0) move.w obVelY(a0),d0 addi.w #$38,obVelY(a0) ; increase vertical speed ext.l d0 lsl.l #8,d0 add.l d0,obY(a0) rts
- End of function ObjectFall
</syntaxhighlight>
Next, open "_incObj/sub SpeedToPos.asm" and change this: <asm> SpeedToPos: move.l obX(a0),d2 move.l obY(a0),d3 move.w obVelX(a0),d0 ; load horizontal speed ext.l d0 asl.l #8,d0 ; multiply speed by $100 add.l d0,d2 ; add to x-axis position move.w obVelY(a0),d0 ; load vertical speed ext.l d0 asl.l #8,d0 ; multiply by $100 add.l d0,d3 ; add to y-axis position move.l d2,obX(a0) ; update x-axis position move.l d3,obY(a0) ; update y-axis position rts
- End of function SpeedToPos
</syntaxhighlight>
to this: <asm> SpeedToPos: move.w obVelX(a0),d0 ; load horizontal speed ext.l d0 lsl.l #8,d0 ; multiply speed by $100 add.l d0,obX(a0) ; add to x-axis position move.w obVelY(a0),d0 ; load vertical speed ext.l d0 lsl.l #8,d0 ; multiply by $100 add.l d0,obY(a0) ; add to y-axis position rts
- End of function SpeedToPos
</syntaxhighlight>
Sonic 2
Go to "ObjectMoveAndFall:" and change this: <asm> ObjectMoveAndFall: move.l x_pos(a0),d2 ; load x position move.l y_pos(a0),d3 ; load y position move.w x_vel(a0),d0 ; load x speed ext.l d0 asl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,d2 ; add x speed to x position ; note this affects the subpixel position x_sub(a0) = 2+x_pos(a0) move.w y_vel(a0),d0 ; load y speed addi.w #$38,y_vel(a0) ; increase vertical speed (apply gravity) ext.l d0 asl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,d3 ; add old y speed to y position ; note this affects the subpixel position y_sub(a0) = 2+y_pos(a0) move.l d2,x_pos(a0) ; store new x position move.l d3,y_pos(a0) ; store new y position rts
- End of function ObjectMoveAndFall
</syntaxhighlight>
To this: <asm> ObjectMoveAndFall: move.w x_vel(a0),d0 ; load x speed ext.l d0 lsl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,x_pos(a0) ; add x speed to x position ; note this affects the subpixel position x_sub(a0) = 2+x_pos(a0) move.w y_vel(a0),d0 ; load y speed addi.w #$38,y_vel(a0) ; increase vertical speed (apply gravity) ext.l d0 lsl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,y_pos(a0) ; add old y speed to y position ; note this affects the subpixel position y_sub(a0) = 2+y_pos(a0) rts
- End of function ObjectMoveAndFall
</syntaxhighlight>
Next, go to "ObjectMove:" and change this: <asm> ObjectMove: move.l x_pos(a0),d2 ; load x position move.l y_pos(a0),d3 ; load y position move.w x_vel(a0),d0 ; load horizontal speed ext.l d0 asl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,d2 ; add to x-axis position ; note this affects the subpixel position x_sub(a0) = 2+x_pos(a0) move.w y_vel(a0),d0 ; load vertical speed ext.l d0 asl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,d3 ; add to y-axis position ; note this affects the subpixel position y_sub(a0) = 2+y_pos(a0) move.l d2,x_pos(a0) ; update x-axis position move.l d3,y_pos(a0) ; update y-axis position rts
- End of function ObjectMove
</syntaxhighlight>
to this: <asm> ObjectMove: move.w x_vel(a0),d0 ; load horizontal speed ext.l d0 lsl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,x_pos(a0) ; add to x-axis position ; note this affects the subpixel position x_sub(a0) = 2+x_pos(a0) move.w y_vel(a0),d0 ; load vertical speed ext.l d0 lsl.l #8,d0 ; shift velocity to line up with the middle 16 bits of the 32-bit position add.l d0,y_pos(a0) ; add to y-axis position ; note this affects the subpixel position y_sub(a0) = 2+y_pos(a0) rts
- End of function ObjectMove
</syntaxhighlight>
Conclusion
That's that. For any object that has to move, it will now do this coding a lot quicker each frame.