Aviator on the BBC Micro

# Visibility: CheckLineDistance

```       Name: CheckLineDistance                                       [Show more]
Type: Subroutine
Category: Visibility
Summary: Check whether a point on a line is within the visible distance for
the line
Context: See this subroutine in context in the source code
References: This subroutine is called as follows:
* ProcessLine (Part 7 of 7) calls CheckLineDistance
* ProcessRunwayLine (Part 3 of 5) calls CheckLineDistance
* UpdateBullets calls CheckLineDistance

Arguments:

X                    The line ID of the line to check

Y                    The point ID of the point to check

Returns:

A                    Contains the result as follows:

* The current value of showLine if the point is close
enough to be visible

* 1 if the point is too far away to be visible

.CheckLineDistance

LDA xPointHi,Y         \ Set A to the high byte of the point's x-coordinate

BPL dist1              \ If the x-coordinate is positive, skip the following
\ instruction

EOR #&FF               \ Otherwise flip the x-coordinate so it's positive, so:
\
\   A = |xPointHi|

.dist1

CMP maxLineDistance,X  \ If A >= this line's visible distance, then the point
BCS dist4              \ is too far away to be seen in the x-axis, so jump to
\ dist4 to return a "not visible" result

LDA yPointHi,Y         \ Set A to the high byte of the point's y-coordinate

BPL dist2              \ If the y-coordinate is positive, skip the following
\ instruction

EOR #&FF               \ Otherwise flip the y-coordinate so it's positive, so:
\
\   A = |yPointHi|

.dist2

CMP maxLineDistance,X  \ If A >= this line's visible distance, then the point
BCS dist4              \ is too far away to be seen in the y-axis, so jump to
\ dist4 to return a "not visible" result

LDA zPointHi,Y         \ Set A to the high byte of the point's z-coordinate

BPL dist3              \ If the z-coordinate is positive, skip the following
\ instruction

EOR #&FF               \ Otherwise flip the z-coordinate so it's positive, so:
\
\   A = |zPointHi|

.dist3

CMP maxLineDistance,X  \ If A < this line's visible distance, then the point
BCC dist5              \ is close enough to be visible in the z-axis, so jump
\ to dist5 to return an "is visible" result

.dist4

\ If we get here then the point is too far away to be
\ visible in at least one axis

LDA #1                 \ Set A = 1 as the return value for a "not visible"
\ result

RTS                    \ Return from the subroutine

.dist5

LDA #0                 \ The point is close enough to be visible, so return the
ORA showLine           \ current value of showLine (this could be achieved by a
\ simple LDA showLine instruction, so perhaps this more
\ convoluted approach is left over from a different
\ version of the routine)

RTS                    \ Return from the subroutine
```