Improve ObjectMove subroutines
From Sonic Retro
(Original guide by redhotsonic)
Template:Sonic 1 Hivebrain GuideBy
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
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
</asm>
Conclusion
That's that. For any object that has to move, it will now do this coding a lot quicker each frame.