
;Determinate Calculation in Assembly for AMIGA

;(C) Peter Schulz 1987

;This program can not be run by itself!!!!!!!!!!!!!
;This program must(!!!) be assembled PC-relative,
; and can then be used for example in a BASIC program..
; See also DET_TEST.ASM

_LVOOpenLibrary   = -552
_LVOCloseLibrary  = -414

_LVOSPAdd     = -66
_LVOSPSub     = -72
_LVOSPMul     = -78

Erg = 11*4+4
a11 = Erg+4
a21 = a11+4
a31 = a21+4
a12 = a31+4
a22 = a12+4
a32 = a22+4
a13 = a32+4
a23 = a13+4
a33 = a23+4

CALLSYS:MACRO $\1
 JSR _LVO\1(A6)
 ENDM

GetArg:MACRO %\1,$\2
 MOVE.L \1(SP),A0
 MOVE.L (A0),\2
 ENDM

SPAdd:MACRO
 JSR _LVOSPAdd(A6)
 ENDM

SPSub:MACRO
 JSR _LVOSPSub(A6)
 ENDM

SPMul:MACRO
 JSR _LVOSPMul(A6)
 ENDM

PutArg:MACRO $\1,%\2
 MOVE.L \2(SP),A0
 MOVE.L \1,(A0)
 ENDM

OpenMath:

;Open library

 MOVEM.L D0/D1/A0/A1/A6,-(SP)

 MOVEQ #0,D0
 LEA MathName,A1
 MOVE.L 4,A6
 CALLSYS OpenLibrary
 LEA MathBase,A0
 MOVE.L D0,(A0)

 MOVEM.L (SP)+,D0/D1/A0/A1/A6
 RTS

MathName:DC.B 'mathffp.library',0
 ALIGN
MathBase:DC.L 0

CloseMath:

;Close library

 MOVEM.L D0/D1/A0/A1/A6,-(SP)

 MOVE.L MathBase,D0
 BEQ.S \R
 MOVE.L D0,A1
 MOVE.L 4,A6
 CALLSYS CloseLibrary
\R:
 MOVEM.L (SP)+,D0/D1/A0/A1/A6
 RTS

Determinante:

;Calculation of the Determinate.  Parameters on the Stack

 MOVEM.L D0-A1/A6,-(SP)

 MOVE.L MathBase,D0
 BEQ \R
 MOVE.L D0,A6

 GetArg a32,D0
 GetArg a23,D1
 SPMul             ;a32 * a23
 MOVE.L D0,D5

 GetArg a22,D0
 GetArg a33,D1
 SPMul             ;a22 * a33

 MOVE.L D5,D1
 SPSub             ;a22 * a33 - a32 * a23

 GetArg a11,D1
 SPMul             ;a11 * (a22 * a33 - a32 * a23)
 MOVE.L D0,D7


 GetArg a32,D0
 GetArg a13,D1
 SPMul             ;a32 * a13
 MOVE.L D0,D5

 GetArg a12,D0
 GetArg a33,D1
 SPMul             ;a12 * a33

 MOVE.L D5,D1
 SPSub             ;a12 * a33 - a32 * a13

 GetArg a21,D1
 SPMul             ;a21 * (a12 * a33 - a32 * a13)
 MOVE.L D0,D6


 GetArg a22,D0
 GetArg a13,D1
 SPMul             ;a22 * a13
 MOVE.L D0,D5

 GetArg a12,D0
 GetArg a23,D1
 SPMul             ;a12 * a23

 MOVE.L D5,D1
 SPSub             ;a12 * a23 - a22 * a13

 GetArg a31,D1
 SPMul             ;a31 * (a12 * a23 - a22 * a13)


 MOVE.L D7,D1
 SPAdd
 MOVE.L D6,D1
 SPSub
 PutArg D0,Erg

\R:
 MOVEM.L (SP)+,D0-A1/A6
 RTS

 SLABEL Determinante.L
 OpenMath
 CloseMath
 Determinante
 ENDS

 END
