Elite on the BBC Micro and NES

# Drawing lines: LL145 (Part 2 of 4)

## [BBC Micro disc version, Flight]

```       Name: LL145 (Part 2 of 4)                                     [Show more]
Type: Subroutine
Category: Drawing lines
Summary: Clip line: Work out if any part of the line is on-screen
Deep dive: Line-clipping
Extended screen coordinates
Context: See this subroutine in context in the source code
References: No direct references to this subroutine in this source file

This part does a number of tests to see if the line is on or off the screen.

If we get here then at least one of (x1, y1) and (x2, y2) is off-screen, with
XX13 set as follows:

* 0   = (x1, y1) off-screen, (x2, y2) on-screen

* 95  = (x1, y1) on-screen,  (x2, y2) off-screen

* 191 = (x1, y1) off-screen, (x2, y2) off-screen

where "off-screen" is defined as having a non-zero high byte in one of the
coordinates, or in the case of y-coordinates, having a low byte > 191, the
y-coordinate of the bottom of the space view.

.LL83

LDA XX13               \ If XX13 < 128 then only one of the points is on-screen
BPL LL115              \ so jump down to LL115 to skip the checks of whether
\ both points are in the strips to the right or bottom
\ of the screen

\ If we get here, both points are off-screen

LDA XX15+1             \ If both x1_hi and x2_hi have bit 7 set, jump to LL109
AND XX15+5             \ to return from the subroutine with the C flag set, as
BMI LL109              \ the entire line is above the top of the screen

LDA XX15+3             \ If both y1_hi and y2_hi have bit 7 set, jump to LL109
AND XX12+1             \ to return from the subroutine with the C flag set, as
BMI LL109              \ the entire line is to the left of the screen

LDX XX15+1             \ Set A = X = x1_hi - 1
DEX
TXA

LDX XX15+5             \ Set XX12+2 = x2_hi - 1
DEX
STX XX12+2

ORA XX12+2             \ If neither (x1_hi - 1) or (x2_hi - 1) have bit 7 set,
BPL LL109              \ jump to LL109 to return from the subroutine with the C
\ flag set, as the line doesn't fit on-screen

LDA XX15+2             \ If y1_lo < y-coordinate of screen bottom, clear the C
CMP #Y*2               \ flag, otherwise set it

LDA XX15+3             \ Set XX12+2 = y1_hi - (1 - C), so:
SBC #0                 \
STA XX12+2             \  * Set XX12+2 = y1_hi - 1 if y1_lo is on-screen
\  * Set XX12+2 = y1_hi     otherwise
\
\ We do this subtraction because we are only interested
\ in trying to move the points up by a screen if that
\ might move the point into the space view portion of
\ the screen, i.e. if y1_lo is on-screen

LDA XX12               \ If y2_lo < y-coordinate of screen bottom, clear the C
CMP #Y*2               \ flag, otherwise set it

LDA XX12+1             \ Set XX12+2 = y2_hi - (1 - C), so:
SBC #0                 \
\  * Set XX12+1 = y2_hi - 1 if y2_lo is on-screen
\  * Set XX12+1 = y2_hi     otherwise
\
\ We do this subtraction because we are only interested
\ in trying to move the points up by a screen if that
\ might move the point into the space view portion of
\ the screen, i.e. if y1_lo is on-screen

ORA XX12+2             \ If neither XX12+1 or XX12+2 have bit 7 set, jump to
BPL LL109              \ LL109 to return from the subroutine with the C flag
\ set, as the line doesn't fit on-screen
```