Elite on the BBC Micro and NES

# Maths (Arithmetic): SQUA2

## [6502 Second Processor version, Loader 1]

```       Name: SQUA2                                                   [Show more]
Type: Subroutine
Category: Maths (Arithmetic)
Summary: Calculate (A P) = A * A
Context: See this subroutine in context in the source code
References: This subroutine is called as follows:
* PLL1 (Part 1 of 3) calls SQUA2
* PLL1 (Part 2 of 3) calls SQUA2
* PLL1 (Part 3 of 3) calls SQUA2

Do the following multiplication of signed 8-bit numbers:

(A P) = A * A

This uses a similar approach to routine SQUA2 in the main game code, which
itself uses the MU11 routine to do the multiplication. However, this version
first ensures that A is positive, so it can support signed numbers.

.SQUA2

EOR #&FF               \ Otherwise we need to negate A for the SQUA algorithm
CLC                    \ to work, so we do this using two's complement, by
ADC #1                 \ setting A = ~A + 1

.SQUA

STA Q                  \ Set Q = A and P = A

STA P                  \ Set P = A

LDA #0                 \ Set A = 0 so we can start building the answer in A

LDY #8                 \ Set up a counter in Y to count the 8 bits in P

LSR P                  \ Set P = P >> 1
\ and C flag = bit 0 of P

.SQL1

BCC SQ1                \ If C (i.e. the next bit from P) is set, do the
CLC                    \ addition for this bit of P:
\   A = A + Q

.SQ1

ROR A                  \ Shift A right to catch the next digit of our result,
\ which the next ROR sticks into the left end of P while
\ also extracting the next bit of P

ROR P                  \ Add the overspill from shifting A to the right onto
\ the start of P, and shift P right to fetch the next
\ bit for the calculation into the C flag

DEY                    \ Decrement the loop counter

BNE SQL1               \ Loop back for the next bit until P has been rotated
\ all the way

RTS                    \ Return from the subroutine
```