BBC Micro Elite

# Maths (Arithmetic): LL5 (6502SP version)

```       Name: LL5                                               [View in context]
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

CPX Q                  \ If X < Q, jump to LL7
BCC LL7

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

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
```