BBC Micro Elite

# Drawing circles: BLINE (6502SP version)

```       Name: BLINE                                             [View in context]
Type: Subroutine
Category: Drawing circles
Summary: Draw a circle segment and add it to the ball line heap
Deep dive: The ball line heap

Draw a single segment of a circle by adding the point to the ball line heap,
so it can be sent to the I/O processor for drawing once the whole circle has

Arguments:

CNT                  The number of this segment

STP                  The step size for the circle

K6(1 0)              The x-coordinate of the new point on the circle, as
a screen coordinate

(T X)                The y-coordinate of the new point on the circle, as
an offset from the centre of the circle

FLAG                 Set to &FF for the first call, so it sets up the first
point in the heap but waits until the second call before
drawing anything (as we need two points, i.e. two calls,
before we can draw a line)

K3(1 0)              Pixel x-coordinate of the centre of the circle

K4(1 0)              Pixel y-coordinate of the centre of the circle

SWAP                 If non-zero, we swap (X1, Y1) and (X2, Y2)

Returns:

CNT                  CNT is updated to CNT + STP

A                    The new value of CNT

FLAG                 Set to 0

.BLINE

TXA                    \ Set K6(3 2) = (T X) + K4(1 0)
ADC K4                 \             = y-coord of centre + y-coord of new point
STA K6+2               \
LDA K4+1               \ so K6(3 2) now contains the y-coordinate of the new
ADC T                  \ point on the circle but as a screen coordinate, to go
STA K6+3               \ along with the screen y-coordinate in K6(1 0)

LDA FLAG               \ If FLAG = 0, jump down to BL1
BEQ BL1

INC FLAG               \ Flag is &FF so this is the first call to BLINE, so
\ increment FLAG to set it to 0, as then the next time
\ we call BLINE it can draw the first line, from this
\ point to the next

BEQ BL5                \ This is the first call to BLINE, so we don't need to
\ to copy the previous point to XX15 as there isn't one,
\ so we jump to BL5 to tidy up and return from the
\ subroutine (this BEQ is effectively a JMP, as we just
\ incremented FLAG to 0)

.BL1

LDA K5                 \ Set XX15 = K5 = x_lo of previous point
STA XX15

LDA K5+1               \ Set XX15+1 = K5+1 = x_hi of previous point
STA XX15+1

LDA K5+2               \ Set XX15+2 = K5+2 = y_lo of previous point
STA XX15+2

LDA K5+3               \ Set XX15+3 = K5+3 = y_hi of previous point
STA XX15+3

LDA K6                 \ Set XX15+4 = x_lo of new point
STA XX15+4

LDA K6+1               \ Set XX15+5 = x_hi of new point
STA XX15+5

LDA K6+2               \ Set XX12 = y_lo of new point
STA XX12

LDA K6+3               \ Set XX12+1 = y_hi of new point
STA XX12+1

JSR LL145              \ Call LL145 to see if the new line segment needs to be
\ clipped to fit on-screen, returning the clipped line's
\ end-points in (X1, Y1) and (X2, Y2)

BCS BL5                \ If the C flag is set then the line is not visible on
\ storing this line

LDY LSP                \ Set Y = LSP

LDA X1                 \ Store X1 in the LSP-th byte of LSX2
STA LSX2,Y

LDA Y1                 \ Store Y1 in the LSP-th byte of LSY2
STA LSY2,Y

INY                    \ Increment Y to point to the next byte in LSX2/LSY2

LDA X2                 \ Store X2 in the LSP-th byte of LSX2
STA LSX2,Y

LDA Y2                 \ Store Y2 in the LSP-th byte of LSX2
STA LSY2,Y

INY                    \ Increment Y to point to the next byte in LSX2/LSY2

STY LSP                \ Update LSP to point to the same as Y

.BL5

LDA K6                 \ Copy the data for this step point from K6(3 2 1 0)
STA K5                 \ into K5(3 2 1 0), for use in the next call to BLINE:
LDA K6+1               \
STA K5+1               \   * K5(1 0) = screen x-coordinate of this point
LDA K6+2               \
STA K5+2               \   * K5(3 2) = screen y-coordinate of this point
LDA K6+3               \
STA K5+3               \ They now become the "previous point" in the next call

LDA CNT                \ Set CNT = CNT + STP
CLC