Elite on the BBC Micro and NES

# Version analysis of LL5

This code appears in the following versions (click to see it in the source code):

Code variations between these versions are shown below.

```       Name: LL5
Type: Subroutine
Category: Maths (Arithmetic)
Summary: Calculate Q = SQRT(R Q)
Deep dive: Calculating square roots

Calculate the following square root:

Q = SQRT(R Q)

.LL5

LDY R                  \ Set (Y S) = (R Q)
LDA Q
STA S

\ So now to calculate Q = SQRT(Y S)

LDX #0                 \ Set X = 0, to hold the remainder

STX Q                  \ Set Q = 0, to hold the result

LDA #8                 \ Set T = 8, to use as a loop counter
STA T

.LL6

BCC LL7

```

Code variation 1 of 1A variation in the labels only

Tap on a block to expand it, and tap it again to revert.

```Cassette, Flight, Docked, 6502SP, ElectronMaster BNE LL8                \ If X > Q, jump to LL8

CPY #64                \ If Y < 64, jump to LL7 with the C flag clear,
BCC LL7                \ otherwise fall through into LL8 with the C flag set

.LL8
BNE P%+6               \ If X > Q, skip the next two instructions

CPY #64                \ If Y < 64, jump to LL7 with the C flag clear,
BCC LL7                \ otherwise fall through into LL8 with the C flag set
```
``` TYA                    \ Set Y = Y - 64
SBC #64                \
TAY                    \ This subtraction will work as we know C is set from
\ the BCC above, and the result will not underflow as we
\ already checked that Y >= 64, so the C flag is also
\ set for the next subtraction

TXA                    \ Set X = X - Q
SBC Q
TAX

.LL7

ROL Q                  \ Shift the result in Q to the left, shifting the C flag
\ into bit 0 and bit 7 into the C flag

ASL S                  \ Shift the dividend in (Y S) to the left, inserting
TYA                    \ bit 7 from above into bit 0
ROL A
TAY

TXA                    \ Shift the remainder in X to the left
ROL A
TAX

ASL S                  \ Shift the dividend in (Y S) to the left
TYA
ROL A
TAY

TXA                    \ Shift the remainder in X to the left
ROL A
TAX

DEC T                  \ Decrement the loop counter

BNE LL6                \ Loop back to LL6 until we have done 8 loops

RTS                    \ Return from the subroutine

```