***************************************
*    Ray-Tracing Theories Part 1      *
* The most important Vector functions * 
* Compiled by  CELEBRANDIL   19/01/89  *
*                                     *
* Do you have questions or own ideas? *
* Write to:   Celebrandil             *
*             Hogviltsgrand 13        *
*             S-22252 Lund            *
*             SWEDEN                  *
***************************************

ExecBase=4
OpenLibrary=-552
CloseLibrary=-414
SpAdd=-66
SpSub=-72
SpMul=-78
SpDiv=-84
SpFix=-30
SpFlt=-36
SpCmp=-42
SpTst=-48
SpAbs=-54
SpNeg=-60

Start:	move.l ExecBase,a6
	lea MathLibName,a1
	clr.l d0
	jsr OpenLibrary(a6)
	move.l d0,MathLibBase

	lea Vector1,a0 ; A Very Bad Example
	lea Vector2,a1
	lea Vector3,a2
	bsr Vectorial_Vector_Multiplication

	move.l ExecBase,a6
	move.l MathLibBase,a1
	jsr CloseLibrary(a6)
	rts

************** Add (a0) and (a1) ***************
************* (a2) = (a0) + (a1) ***************
Vector_Addition:
	movem.l d0-d1/a3,-(a7)
	move.l MathLibBase,a3
	move.l (a0),d0
	move.l (a1),d1
	jsr SpAdd(a3)
	move.l d0,(a2)
	move.l 4(a0),d0
	move.l 4(a1),d1
	jsr SpAdd(a3)
	move.l d0,4(a2)
	move.l 8(a0),d0
	move.l 8(a1),d1
	jsr SpAdd(a3)
	move.l d0,8(a2)
	movem.l (a7)+,d0-d1/a3
	rts

*********** Subtract (a0) and (a1) *************
************* (a2) = (a0) - (a1) ***************
Vector_Subtraction:
	movem.l d0-d1/a3,-(a7)
	move.l MathLibBase,a3
	move.l (a0),d0
	move.l (a1),d1
	jsr SpSub(a3)
	move.l d0,(a2)
	move.l 4(a0),d0
	move.l 4(a1),d1
	jsr SpSub(a3)
	move.l d0,4(a2)
	move.l 8(a0),d0
	move.l 8(a1),d1
	jsr SpSub(a3)
	move.l d0,8(a2)
	movem.l (a7)+,d0-d1/a3
	rts

*********** Multiply (a0) and d0 *************
************* (a1) = (a0) * d0 ***************
Scalar_Multiplication:
	movem.l d0-d2/a3,-(a7)
	move.l MathLibBase,a3
	move.l d0,d2
	move.l (a0),d0
	move.l d2,d1
	jsr SpMul(a3)
	move.l d0,(a1)
	move.l 4(a0),d0
	move.l d2,d1
	jsr SpMul(a3)
	move.l d0,4(a1)
	move.l 8(a0),d0
	move.l d2,d1
	jsr SpMul(a3)
	move.l d0,8(a1)
	movem.l (a7)+,d0-d2/a3
	rts

********** Multiply (a0) And (a1) ************
************* d0 = (a0) * (a1) ***************
Scalar_Vector_Multiplication: 
	movem.l d1-d2/a3,-(a7)
	move.l MathLibBase,a3
	move.l (a0),d0
	move.l (a1),d1
	jsr SpMul(a3)
	move.l d0,d2
	move.l 4(a0),d0
	move.l 4(a1),d1
	jsr SpMul(a3)
	move.l d2,d1
	jsr SpAdd(a3)
	move.l d0,d2
	move.l 8(a0),d0
	move.l 8(a1),d1
	jsr SpMul(a3)
	move.l d2,d1
	jsr SpAdd(a3)
	movem.l (a7)+,d1-d2/a3
	rts

*********** Multiply (a0) and (a1) *************
************* (a2) = (a0) * (a1) ***************
Vectorial_Vector_Multiplication:
	movem.l d0-d2/a3,-(a7)
	move.l MathLibBase,a3
	move.l 8(a0),d0
	move.l 4(a1),d1
	jsr SpMul(a3)
	move.l d0,d2
	move.l 4(a0),d0
	move.l 8(a1),d1
	jsr SpMul(a3)
	move.l d2,d1
	jsr SpSub(a3)
	move.l d0,(a2)
	move.l 0(a0),d0
	move.l 8(a1),d1
	jsr SpMul(a3)
	move.l d0,d2
	move.l 8(a0),d0
	move.l 0(a1),d1
	jsr SpMul(a3)
	move.l d2,d1
	jsr SpSub(a3)
	move.l d0,4(a2)
	move.l 4(a0),d0
	move.l 0(a1),d1
	jsr SpMul(a3)
	move.l d0,d2
	move.l 0(a0),d0
	move.l 4(a1),d1
	jsr SpMul(a3)
	move.l d2,d1
	jsr SpSub(a3)
	move.l d0,8(a2)
	movem.l (a7)+,d0-d2/a3
	rts

MathLibName: dc.b "mathffp.library",0
MathLibBase: dc.l 0
Vector1: dc.l $80000041,$80000041,$80000041 ;  1, 1, 1
Vector2: dc.l $800000c1,$80000042,$800000c2 ; -1, 2,-2
Vector3: dc.l 0,0,0 
