Elite on the BBC Micro

# Drawing lines: LOIN (Part 7 of 7) [Elite-A, Encyclopedia]

```       Name: LOIN (Part 7 of 7)                                      [Show more]
Type: Subroutine
Category: Drawing lines
Summary: Draw a steep line going up and right or down and left
Deep dive: Bresenham's line algorithm
Context: See this subroutine in context in the source code
References: This subroutine is called as follows:
* HLOIN calls entry point HL6

This routine draws a line from (X1, Y1) to (X2, Y2). It has multiple stages.
If we get here, then:

* The line is going up and right (no swap) or down and left (swap)

* X1 >= X2 and Y1 >= Y2

* Draw from (X1, Y1) at bottom left to (X2, Y2) at top right

Other entry points:

HL6                  Contains an RTS

.LFT

LDA SWAP               \ If SWAP = 0 then we didn't swap the coordinates above,
BEQ LI18               \ jump down to LI18 to skip plotting the first pixel

DEX                    \ Decrement the counter in X because we're about to plot
\ the first pixel

.LIL6

LDA R                  \ Fetch the pixel byte from R

EOR (SC),Y             \ Store R into screen memory at SC(1 0), using EOR
STA (SC),Y             \ logic so it merges with whatever is already on-screen

.LI18

DEY                    \ Decrement Y to step up along the y-axis

BPL LI19               \ If Y is positive we are still within the same

DEC SCH                \ Otherwise we need to move up into the character block
LDY #7                 \ above, so decrement the high byte of the screen
\ address and set the pixel line to the last line in
\ that character block

.LI19

LDA S                  \ Set S = S + P to update the slope error
STA S

ASL R                  \ Otherwise we just overflowed, so shift the single
\ pixel in R to the left, so the next pixel we plot
\ will be at the previous x-coordinate

BCC LIC6               \ If the pixel didn't fall out of the left end of R

ROL R                  \ Otherwise we need to move over to the next character
\ block, so first rotate R left so the set C flag goes
\ back into the right end, giving %0000001

LDA SC                 \ Subtract 7 from SC, so SC(1 0) now points to the
SBC #7                 \ previous character along to the left
STA SC

CLC                    \ Clear the C flag so it doesn't affect the additions
\ below

.LIC6

DEX                    \ Decrement the counter in X

BNE LIL6               \ If we haven't yet reached the left end of the line,
\ loop back to LIL6 to plot the next pixel along

LDY YSAV               \ Restore Y from YSAV, so that it's preserved

.HL6

RTS                    \ Return from the subroutine
```