# Maths (Arithmetic): Scale16Bit

```       Name: Scale16Bit                                              [Show more]
Type: Subroutine
Category: Maths (Arithmetic)
Summary: Scale up a 16-bit value by 2^5
Context: See this subroutine in context in the source code
References: This subroutine is called as follows:
* ApplySkidForces calls Scale16Bit
* GetTyreForces calls Scale16Bit

Scale up a 16-bit value by 2^5, capping the result at the maximum possible
positive value of &7Fxx, and ensuring that the result is positive.

Arguments:

Y                    The offset of the variable to scale

* 8 = xVelocity

* 9 = zVelocity

Returns:

(NN MM)              The scaled value

.Scale16Bit

LDA xPlayerSpeedHi,Y   \ Set (A MM) to the variable pointed to by Y, which we
STA MM                 \ call variableY
LDA xPlayerSpeedTop,Y

BPL scal1              \ If the top byte in A is positive, jump to scal1 to
\ skip the following

LDA #0                 \ Negate (A MM), starting with the low bytes
SEC
SBC MM
STA MM

LDA #0                 \ And then the high bytes, so we now have:
SBC xPlayerSpeedTop,Y  \
\   (A MM) = |variableY|

.scal1

LDY #5                 \ Set Y = 5, to act as a shift counter in the following
\ loop

.scal2

ASL MM                 \ Set (A MM) = (A MM) << 1
ROL A

BMI scal4              \ If bit 7 of the top byte in A is set, jump to scal4
\ to stop shifting and set the top byte to the largest
\ possible positive top byte

DEY                    \ Decrement the shift counter

BNE scal2              \ Loop back until we have left-shifted five times

.scal3

STA NN                 \ Set (NN MM) = (A MM) to return as the result

RTS                    \ Return from the subroutine

.scal4

LDA #%01111111         \ Set A = %01111111 to act as the largest possible
\ positive top byte