Aviator on the BBC Micro

# Drawing lines: DrawOrthoLine

```       Name: DrawOrthoLine                                           [Show more]
Type: Subroutine
Category: Drawing lines
Summary: Draw an orthogonal line (i.e. vertical or horizontal)
Context: See this subroutine in context in the source code
References: This subroutine is called as follows:
* DrawIndicatorBar calls DrawOrthoLine
* DrawJoystickCross calls DrawOrthoLine
* DrawIndicatorBar calls entry point EraseOrthoLine

Arguments:

S                    Defines the starting coordinate for the line:

* 0 = (joyCoord, H + W)

* 128 = (H + W, joyCoord)

H + W                Coordinate of the start of the line (it doesn't matter
how this value is split between H and W as only the sum
is used)

joyCoord             Coordinate of the start of the line

T                    Horizontal width/length of line

U                    Vertical width/length of line

N                    Drawing mode:

* 0 = Draw (using OR logic)

* 128 = Erase (using EOR logic)

Other entry points:

EraseOrthoLine       Use the value of G instead of H (so the coordinate is
G + W) and always use EOR Logic to draw the line (which
will erase it if it is already on-screen)

.DrawOrthoLine

LDA H                  \ Set A = H

JMP dort1              \ Jump to dort1 to draw the orthogonal line and skip the
\ code for the EraseOrthoLine entry point

.EraseOrthoLine

LDA #128               \ Set N = 128 so the line is drawn with EOR logic, which
STA N                  \ erases the line if it is already on-screen

LDA G                  \ Set A = G

.dort1

CLC                    \ Set A = A + W

BIT S                  \ If bit 7 of S is set, jump down to dort2
BMI dort2

STA J                  \ Set J = A

LDA joyCoord           \ Set I = joyCoord
STA I

\ We now have (I, J) = (joyCoord, A + W)

JMP dort3              \ Jump down to dort3

.dort2

STA I                  \ Set I = A

LDA joyCoord           \ Set J = joyCoord
STA J

\ We now have (I, J) = (A + W, joyCoord)

.dort3

LDA #0                 \ Set V = 0 so the line is drawn in a positive direction
STA V                  \ for both axes

JSR DrawVectorLine     \ Draw/erase a line from (I, J) as a vector (T, U) with
\ direction V

RTS                    \ Return from the subroutine
```