Elite on the BBC Micro

# Moving: MVEIT (Part 8 of 9) (6502SP version)

```       Name: MVEIT (Part 8 of 9)                               [View in context]
Type: Subroutine
Category: Moving
Summary: Move current ship: Rotate ship about itself by its own pitch/roll
Deep dive: Orientation vectors
Pitching and rolling by a fixed angle

This routine has multiple stages. This stage does the following:

* If the ship we are processing is rolling or pitching itself, rotate it and
apply damping if required

LDA INWK+30            \ Fetch the ship's pitch counter and extract the sign
AND #%10000000         \ into RAT2
STA RAT2

LDA INWK+30            \ Fetch the ship's pitch counter and extract the value
AND #%01111111         \ without the sign bit into A

BEQ MV8                \ If the pitch counter is 0, then jump to MV8 to skip
\ the following, as the ship is not pitching

CMP #%01111111         \ If bits 0-6 are set in the pitch counter (i.e. the
\ ship's pitch is not damping down), then the C flag
\ will be set by this instruction

SBC #0                 \ Set A = A - 0 - (1 - C), so if we are damping then we
\ reduce A by 1, otherwise it is unchanged

ORA RAT2               \ Change bit 7 of A to the sign we saved in RAT2, so
\ the updated pitch counter in A retains its sign

STA INWK+30            \ Store the updated pitch counter in byte #30

LDX #15                \ Rotate (roofv_x, nosev_x) by a small angle (pitch)
LDY #9
JSR MVS5

LDX #17                \ Rotate (roofv_y, nosev_y) by a small angle (pitch)
LDY #11
JSR MVS5

LDX #19                \ Rotate (roofv_z, nosev_z) by a small angle (pitch)
LDY #13
JSR MVS5

.MV8

LDA INWK+29            \ Fetch the ship's roll counter and extract the sign
AND #%10000000         \ into RAT2
STA RAT2

LDA INWK+29            \ Fetch the ship's roll counter and extract the value
AND #%01111111         \ without the sign bit into A

BEQ MV5                \ If the roll counter is 0, then jump to MV5 to skip the
\ following, as the ship is not rolling

CMP #%01111111         \ If bits 0-6 are set in the roll counter (i.e. the
\ ship's roll is not damping down), then the C flag
\ will be set by this instruction

SBC #0                 \ Set A = A - 0 - (1 - C), so if we are damping then we
\ reduce A by 1, otherwise it is unchanged

ORA RAT2               \ Change bit 7 of A to the sign we saved in RAT2, so
\ the updated roll counter in A retains its sign

STA INWK+29            \ Store the updated pitch counter in byte #29

LDX #15                \ Rotate (roofv_x, sidev_x) by a small angle (roll)
LDY #21
JSR MVS5

LDX #17                \ Rotate (roofv_y, sidev_y) by a small angle (roll)
LDY #23
JSR MVS5

LDX #19                \ Rotate (roofv_z, sidev_z) by a small angle (roll)
LDY #25
JSR MVS5
```