Revs on the BBC Micro

# Extra tracks: HookJoystick

```       Name: HookJoystick                                            [Show more]
Type: Subroutine
Category: Extra tracks
Summary: Apply enhanced joystick steering to specific track sections
Deep dive: Secrets of the extra tracks
Code hooks in the extra tracks
Context: See this subroutine in context in the source code
References: This subroutine is called as follows:
* newContentHi calls HookJoystick
* newContentLo calls HookJoystick

This routine is called from ProcessDrivingKeys to make it easier to steer
round the Druids hairpin bend when using a joystick.

If this is track section 4, set:

(A T) = 1.76 * x-axis ^ 2

otherwise set:

(A T) = x-axis ^ 2

The latter is the same as the existing game code, so this hook only affects
track section 4.

Arguments:

U                    The joystick x-axis high byte

.HookJoystick

LDY currentPlayer      \ Set A to the track section number * 8 for the current
LDA objTrackSection,Y  \ player

LDY #181               \ Set Y = 181 so we scale the steering by 1.00

CMP #32                \ If the track section <> 32 (i.e. section 4), jump to
BNE joys1              \ joys1 to skip the following instruction

LDY #240               \ The player is in track section 4, so set Y = 240 to
\ scale the steering by 1.76

.joys1

TYA                    \ Set A = Y
\
\ So A is 240 if this is track section 4, or 181 for all
\ other sections

JSR Multiply8x8        \ Set (A T) = A * U
\           = A * x-axis

STA U                  \ Set U = A
\       = high byte of A * x-axis

JSR Multiply8x8        \ Set (A T) = A * U
\           = A * A
\           = (A * x-axis) ^ 2

ASL T                  \ Set (A T) = (A T) * 2
ROL A                  \           = 2 * (A * x-axis) ^ 2

\ So for A = 240 (track section 4) we have:
\
\   (A T) = 2 * (240/256 * x-axis) ^ 2
\         = 2 * (0.938 * x-axis) ^ 2
\         = 1.76 * x-axis ^ 2
\
\ and for A = 181 (all other sections) we have:
\
\   (A T) = 2 * (181/256 * x-axis) ^ 2
\         = 2 * (0.707 * x-axis) ^ 2
\         = 1.00 * x-axis ^ 2

RTS                    \ Return from the subroutine
```