Elite on the BBC Micro and NES

Flight: PLUT

[Acorn Electron version]

```       Name: PLUT                                                    [Show more]
Type: Subroutine
Category: Flight
Summary: Flip the coordinate axes for the four different views
Deep dive: Flipping axes between space views
Context: See this subroutine in context in the source code
Variations: See code variations for this subroutine in the different versions
References: This subroutine is called as follows:
* Main flight loop (Part 11 of 16) calls PLUT
* LASLI calls via PU1-1

This routine flips the relevant geometric axes in INWK depending on which
view we are looking through (front, rear, left, right).

Other entry points:

PU1-1                Contains an RTS

.PLUT

LDX VIEW               \ Load the current view into X:
\
\   0 = front
\   1 = rear
\   2 = left
\   3 = right

BNE PU1                \ If the current view is the front view, return from the
RTS                    \ subroutine, as the geometry in INWK is already correct

.PU1

DEX                    \ Decrement the view, so now:
\
\   0 = rear
\   1 = left
\   2 = right

BNE PU2                \ If the current view is left or right, jump to PU2,
\ otherwise this is the rear view, so continue on

LDA INWK+2             \ Flip the sign of x_sign
EOR #%10000000
STA INWK+2

LDA INWK+8             \ Flip the sign of z_sign
EOR #%10000000
STA INWK+8

LDA INWK+10            \ Flip the sign of nosev_x_hi
EOR #%10000000
STA INWK+10

LDA INWK+14            \ Flip the sign of nosev_z_hi
EOR #%10000000
STA INWK+14

LDA INWK+16            \ Flip the sign of roofv_x_hi
EOR #%10000000
STA INWK+16

LDA INWK+20            \ Flip the sign of roofv_z_hi
EOR #%10000000
STA INWK+20

LDA INWK+22            \ Flip the sign of sidev_x_hi
EOR #%10000000
STA INWK+22

LDA INWK+26            \ Flip the sign of roofv_z_hi
EOR #%10000000
STA INWK+26

RTS                    \ Return from the subroutine

.PU2

\ We enter this with X set to the view, as follows:
\
\   1 = left
\   2 = right

LDA #0                 \ Set RAT2 = 0 (left view) or -1 (right view)
CPX #2
ROR A
STA RAT2

EOR #%10000000         \ Set RAT = -1 (left view) or 0 (right view)
STA RAT

LDA INWK               \ Swap x_lo and z_lo
LDX INWK+6
STA INWK+6
STX INWK

LDA INWK+1             \ Swap x_hi and z_hi
LDX INWK+7
STA INWK+7
STX INWK+1

LDA INWK+2             \ Swap x_sign and z_sign
EOR RAT                \ If left view, flip sign of new z_sign
TAX                    \ If right view, flip sign of new x_sign
LDA INWK+8
EOR RAT2
STA INWK+2
STX INWK+8

LDY #9                 \ Swap nosev_x_lo and nosev_z_lo
JSR PUS1               \ Swap nosev_x_hi and nosev_z_hi
\ If left view, flip sign of new nosev_z_hi
\ If right view, flip sign of new nosev_x_hi

LDY #15                \ Swap roofv_x_lo and roofv_z_lo
JSR PUS1               \ Swap roofv_x_hi and roofv_z_hi
\ If left view, flip sign of new roofv_z_hi
\ If right view, flip sign of new roofv_x_hi

LDY #21                \ Swap sidev_x_lo and sidev_z_lo
\ Swap sidev_x_hi and sidev_z_hi
\ If left view, flip sign of new sidev_z_hi
\ If right view, flip sign of new sidev_x_hi

.PUS1

LDA INWK,Y             \ Swap the low x and z bytes for the vector in Y:
LDX INWK+4,Y           \
STA INWK+4,Y           \   * For Y =  9 swap nosev_x_lo and nosev_z_lo
STX INWK,Y             \   * For Y = 15 swap roofv_x_lo and roofv_z_lo
\   * For Y = 21 swap sidev_x_lo and sidev_z_lo

LDA INWK+1,Y           \ Swap the high x and z bytes for the offset in Y:
EOR RAT                \
TAX                    \   * If left view, flip sign of new z-coordinate
LDA INWK+5,Y           \   * If right view, flip sign of new x-coordinate
EOR RAT2
STA INWK+1,Y
STX INWK+5,Y

\ Fall through into LOOK1 to return from the subroutine
```