Elite on the BBC Micro and NES

# Maths (Arithmetic): DVIDT

## [BBC Micro cassette version]

```       Name: DVIDT                                                   [Show more]
Type: Subroutine
Category: Maths (Arithmetic)
Summary: Calculate (P+1 A) = (A P) / Q
Context: See this subroutine in context in the source code
Variations: See code variations for this subroutine in the different versions
References: No direct references to this subroutine in this source file

Calculate the following integer division between sign-magnitude numbers:

(P+1 A) = (A P) / Q

This uses the same shift-and-subtract algorithm as TIS2.

.DVIDT

STA P+1                \ Set P+1 = A, so P(1 0) = (A P)

EOR Q                  \ Set T = the sign bit of A EOR Q, so it's 1 if A and Q
AND #%10000000         \ have different signs, i.e. it's the sign of the result
STA T                  \ of A / Q

LDA #0                 \ Set A = 0 for us to build a result

LDX #16                \ Set a counter in X to count the 16 bits in P(1 0)

ASL P                  \ Shift P(1 0) left
ROL P+1

ASL Q                  \ Clear the sign bit of Q the C flag at the same time
LSR Q

.DVL2

ROL A                  \ Shift A to the left

CMP Q                  \ If A < Q skip the following subtraction
BCC P%+4

SBC Q                  \ Set A = A - Q
\
\ Going into this subtraction we know the C flag is
\ set as we passed through the BCC above, and we also
\ know that A >= Q, so the C flag will still be set once
\ we are done

ROL P                  \ Rotate P(1 0) to the left, and catch the result bit
ROL P+1                \ into the C flag (which will be a 0 if we didn't
\ do the subtraction, or 1 if we did)

DEX                    \ Decrement the loop counter

BNE DVL2               \ Loop back for the next bit until we have done all 16
\ bits of P(1 0)

LDA P                  \ Set A = P so the low byte is in the result in A

ORA T                  \ Set A to the correct sign bit that we set in T above

RTS                    \ Return from the subroutine
```