Elite on the BBC Micro and NES

# Maths (Arithmetic): TIS3

## [Acorn Electron version]

```       Name: TIS3                                                    [Show more]
Type: Subroutine
Category: Maths (Arithmetic)
Summary: Calculate -(nosev_1 * roofv_1 + nosev_2 * roofv_2) / nosev_3
Context: See this subroutine in context in the source code
References: This subroutine is called as follows:
* TIDY calls TIS3

Calculate the following expression:

A = -(nosev_1 * roofv_1 + nosev_2 * roofv_2) / nosev_3

where 1, 2 and 3 are x, y, or z, depending on the values of X, Y and A. This
routine is called with the following values:

X = 0, Y = 2, A = 4 ->
A = -(nosev_x * roofv_x + nosev_y * roofv_y) / nosev_z

X = 0, Y = 4, A = 2 ->
A = -(nosev_x * roofv_x + nosev_z * roofv_z) / nosev_y

X = 2, Y = 4, A = 0 ->
A = -(nosev_y * roofv_y + nosev_z * roofv_z) / nosev_x

Arguments:

X                    Index 1 (0 = x, 2 = y, 4 = z)

Y                    Index 2 (0 = x, 2 = y, 4 = z)

A                    Index 3 (0 = x, 2 = y, 4 = z)

.TIS3

STA P+2                \ Store P+2 in A for later

LDA INWK+10,X          \ Set Q = nosev_x_hi (plus X)
STA Q

LDA INWK+16,X          \ Set A = roofv_x_hi (plus X)

JSR MULT12             \ Set (S R) = Q * A
\           = nosev_x_hi * roofv_x_hi

LDX INWK+10,Y          \ Set Q = nosev_x_hi (plus Y)
STX Q

LDA INWK+16,Y          \ Set A = roofv_x_hi (plus Y)

JSR MAD                \ Set (A X) = Q * A + (S R)
\           = (nosev_x,X * roofv_x,X) +
\             (nosev_x,Y * roofv_x,Y)

STX P                  \ Store low byte of result in P, so result is now in
\ (A P)

LDY P+2                \ Set Q = roofv_x_hi (plus argument A)
LDX INWK+10,Y
STX Q

EOR #%10000000         \ Flip the sign of A

\ Fall through into DIVDT to do:
\
\   (P+1 A) = (A P) / Q
\
\     = -((nosev_x,X * roofv_x,X) +
\         (nosev_x,Y * roofv_x,Y))
\       / nosev_x,A
```