1157 lines
23 KiB
NASM
Executable File
1157 lines
23 KiB
NASM
Executable File
.FILE "MATH.ASM"
|
|
*----------------------------------------------------------------------------
|
|
*MATH ROUTINES
|
|
*
|
|
*COPYRIGHT (C) 1994 BY TV GAMES,INC.
|
|
*ALL RIGHTS RESERVED
|
|
*
|
|
*See also: ROUTS.ASM Divide,Invert,Modulus
|
|
* HPMATH.C higher precision functions
|
|
*
|
|
|
|
.include C30.EQU
|
|
.include MACS.EQU
|
|
.include MPROC.EQU
|
|
.include VUNIT.EQU
|
|
.include CMOS.EQU
|
|
.include SYSID.EQU
|
|
.include SYS.EQU
|
|
.include GLOBALS.EQU
|
|
.include SNDTAB.EQU
|
|
.include PALL.EQU
|
|
.include OBJECTS.EQU
|
|
.include TEXT.EQU
|
|
.include DIRQ.EQU
|
|
|
|
.text
|
|
*----------------------------------------------------------------------------
|
|
* float COSI(float theta)
|
|
* float SINE(float theta)
|
|
*COSINE FUNCTION
|
|
*
|
|
*PARAMETERS
|
|
* R2 VALUE IN RADIANS 0-INFINITY
|
|
* R0 RETURN VALUE
|
|
*
|
|
_COSI:
|
|
LDF R2,R0
|
|
ADDF @HALFPII,R0 ;offset for COS
|
|
B SINE0
|
|
*
|
|
*SINE FUNCTION
|
|
*
|
|
*PARAMETERS
|
|
* R2 VALUE IN RADIANS 0-INFINITY
|
|
* R0 RETURN VALUE
|
|
*
|
|
_SINE:
|
|
LDF R2,R0
|
|
|
|
SINE0 PUSH AR0
|
|
BGE NOTNEG
|
|
|
|
NEGF R0 ;fix negative case
|
|
ADDF @PII,R0
|
|
|
|
NOTNEG MPYF @FORMULA,R0
|
|
ADDF 0.5,R0 ;ROUND THE SUCKER
|
|
FIX R0 ;get a raw index
|
|
AND 3FFh,R0
|
|
CMPI 512,R0
|
|
BLT ALLOK
|
|
|
|
SUBI 512,R0
|
|
CMPI 256,R0
|
|
BLT PERFECT2
|
|
|
|
SUBI 512,R0
|
|
NEGI R0,R0
|
|
|
|
PERFECT2
|
|
ADDI @SINTABLEI,R0
|
|
LDI R0,AR0
|
|
NEGF *AR0,R0
|
|
POP AR0
|
|
RETS
|
|
|
|
ALLOK
|
|
CMPI 256,R0
|
|
BLT PERFECT
|
|
|
|
SUBI 512,R0
|
|
NEGI R0,R0
|
|
|
|
PERFECT ADDI @SINTABLEI,R0
|
|
LDI R0,AR0
|
|
LDF *AR0,R0
|
|
POP AR0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
.sect "THEDATA"
|
|
SINTABLE ;257 entries
|
|
.float 0.000000,0.006136,0.012272,0.018407,0.024541,0.030675,0.036807,0.042938
|
|
.float 0.049068,0.055195,0.061321,0.067444,0.073565,0.079682,0.085797,0.091909
|
|
.float 0.098017,0.104122,0.110222,0.116319,0.122411,0.128498,0.134581,0.140658
|
|
.float 0.146730,0.152797,0.158858,0.164913,0.170962,0.177004,0.183040,0.189069
|
|
.float 0.195090,0.201105,0.207111,0.213110,0.219101,0.225084,0.231058,0.237024
|
|
.float 0.242980,0.248928,0.254866,0.260794,0.266713,0.272621,0.278520,0.284408
|
|
.float 0.290285,0.296151,0.302006,0.307850,0.313682,0.319502,0.325310,0.331106
|
|
.float 0.336890,0.342661,0.348419,0.354163,0.359895,0.365613,0.371317,0.377007
|
|
.float 0.382683,0.388345,0.393992,0.399624,0.405241,0.410843,0.416429,0.422000
|
|
.float 0.427555,0.433094,0.438616,0.444122,0.449611,0.455083,0.460538,0.465976
|
|
.float 0.471396,0.476799,0.482183,0.487550,0.492898,0.498227,0.503538,0.508830
|
|
.float 0.514102,0.519356,0.524589,0.529803,0.534997,0.540171,0.545325,0.550458
|
|
.float 0.555570,0.560661,0.565732,0.570781,0.575808,0.580814,0.585798,0.590760
|
|
.float 0.595699,0.600616,0.605511,0.610383,0.615232,0.620057,0.624860,0.629638
|
|
.float 0.634393,0.639125,0.643832,0.648515,0.653173,0.657807,0.662416,0.667000
|
|
.float 0.671559,0.676093,0.680601,0.685084,0.689541,0.693972,0.698376,0.702755
|
|
.float 0.707107,0.711432,0.715731,0.720003,0.724247,0.728465,0.732655,0.736817
|
|
.float 0.740951,0.745058,0.749137,0.753187,0.757209,0.761203,0.765168,0.769104
|
|
.float 0.773011,0.776889,0.780738,0.784557,0.788347,0.792107,0.795837,0.799538
|
|
.float 0.803208,0.806848,0.810458,0.814037,0.817585,0.821103,0.824590,0.828046
|
|
.float 0.831470,0.834863,0.838225,0.841555,0.844854,0.848121,0.851356,0.854559
|
|
.float 0.857729,0.860867,0.863973,0.867047,0.870088,0.873096,0.876071,0.879013
|
|
.float 0.881922,0.884798,0.887640,0.890449,0.893225,0.895967,0.898675,0.901349
|
|
.float 0.903990,0.906596,0.909169,0.911707,0.914210,0.916680,0.919114,0.921515
|
|
.float 0.923880,0.926211,0.928507,0.930767,0.932993,0.935184,0.937340,0.939460
|
|
.float 0.941545,0.943594,0.945608,0.947586,0.949529,0.951436,0.953307,0.955142
|
|
.float 0.956941,0.958704,0.960431,0.962122,0.963777,0.965395,0.966977,0.968523
|
|
.float 0.970032,0.971504,0.972940,0.974340,0.975703,0.977029,0.978318,0.979570
|
|
.float 0.980786,0.981964,0.983106,0.984210,0.985278,0.986308,0.987302,0.988258
|
|
.float 0.989177,0.990059,0.990903,0.991710,0.992480,0.993212,0.993907,0.994565
|
|
.float 0.995185,0.995768,0.996313,0.996821,0.997291,0.997723,0.998118,0.998476
|
|
.float 0.998796,0.999078,0.999322,0.999529,0.999699,0.999831,0.999925,0.999981
|
|
.float 1.0
|
|
.text
|
|
|
|
FORMULA .float 162.9746617 ;256/(PI/2)
|
|
|
|
SINTABLEI .word SINTABLE
|
|
HALFPII .float HALFPI
|
|
PII .float PI
|
|
TWOPII .float TWOPI
|
|
INVFORM .float 0.012265625 ;1/FORMULA
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
RADFORM .float 10430.37835 ;65535/(2PI)
|
|
RADFORMI .float 0.000095873 ;1/(65535/(2PI))
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*PARAMETERS
|
|
* R2 RADIANS
|
|
*OUTPUT
|
|
* R2 IN RANGE -PI TO +PI
|
|
* N,Z BITS SET FOR R2
|
|
*
|
|
NORMITS:
|
|
MPYF @RADFORM,R2
|
|
FIX R2
|
|
LS 16,R2
|
|
RS 16,R2
|
|
CMPI 7FFFH,R2
|
|
BLT NMS1
|
|
ADDI 8000H,R2
|
|
ADDI 8000H,R2
|
|
NMS1
|
|
FLOAT R2
|
|
MPYF @RADFORMI,R2
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*PARAMETERS
|
|
* R2 RADIANS
|
|
*OUTPUT
|
|
* R2 IN RANGE 0 TO 2PI
|
|
*
|
|
NORMIT:
|
|
MPYF @RADFORM,R2
|
|
FIX R2
|
|
LS 16,R2
|
|
RS 16,R2
|
|
FLOAT R2
|
|
MPYF @RADFORMI,R2
|
|
NORMCHKL
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*ARCTANF - GET ARCTAN ( R3/R2) IN RADIANS
|
|
*float arctanf(float x,float y) <- not true C style
|
|
*
|
|
*PARAMETERS
|
|
* R2 X (float)
|
|
* R3 Y (float)
|
|
*RETURNS
|
|
* R0 RADIANS (FLOAT)
|
|
*
|
|
ARCTANF:
|
|
_arctanf
|
|
PUSH R1
|
|
PUSHF R1
|
|
PUSH R4
|
|
PUSH AR0
|
|
|
|
;GET QUADRANT
|
|
LDI 0,R1
|
|
LDF R2,R2
|
|
LDIN 2,R1 ;GET SIGN BITS
|
|
LDI 0,R4
|
|
LDF R3,R3
|
|
LDIN 4,R4
|
|
ADDI R1,R4
|
|
|
|
;CHECK Y>X
|
|
ABSF R2,R0
|
|
ABSF R3,R1
|
|
CMPF R0,R1
|
|
BLT ATF0
|
|
|
|
BD AT1
|
|
LDF R2,R0
|
|
LDF R3,R1
|
|
ADDI 1,R4 ;R4 = OCTANT
|
|
;---->BD AT1
|
|
ATF0
|
|
LDF R2,R1
|
|
LDF R3,R0
|
|
|
|
AT1
|
|
CALL DIV_F
|
|
ABSF R0
|
|
LDF 128.0,R1
|
|
MPYF R1,R0
|
|
FIX R0,AR0
|
|
|
|
ADDI @ATTABV,AR0
|
|
LDF *AR0,R0
|
|
LSH 1,R4
|
|
|
|
LDI @OFFTABV,AR0
|
|
ADDI R4,AR0
|
|
MPYF *AR0++,R0
|
|
ADDF *AR0,R0
|
|
|
|
POP AR0
|
|
POP R4
|
|
POPF R1
|
|
POP R1
|
|
RETS
|
|
|
|
|
|
|
|
|
|
|
|
ATTABV .word ATTAB
|
|
OFFTABV .word ATOFFTAB
|
|
*
|
|
*OFFSET TABLE
|
|
*OFFSET, MULTIPLIER
|
|
*
|
|
.sect "THEDATA"
|
|
ATOFFTAB
|
|
.float 1 ;0-45
|
|
.float 0
|
|
.float -1 ;45-90
|
|
.float 1.5707
|
|
.float -1 ;135-180
|
|
.float 3.1416
|
|
.float 1 ;90-135
|
|
.float 1.5707
|
|
.float -1 ;315-360
|
|
.float 6.2831
|
|
.float 1 ;270-315
|
|
.float 4.7123
|
|
.float 1 ;180-225
|
|
.float 3.1416
|
|
.float -1 ;225-270
|
|
.float 4.7123
|
|
|
|
*
|
|
*ARCTAN TABLE 0-45
|
|
*
|
|
ATTAB
|
|
.float 0.000000,0.007812,0.015624,0.023433,0.031240,0.039043,0.046841
|
|
.float 0.054633,0.062419,0.070197,0.077967,0.085727,0.093477,0.101215
|
|
.float 0.108942,0.116655,0.124355,0.132040,0.139709,0.147361,0.154997
|
|
.float 0.162614,0.170212,0.177790,0.185348,0.192884,0.200399,0.207890
|
|
.float 0.215358,0.222801,0.230220,0.237612,0.244979,0.252318,0.259630
|
|
.float 0.266913,0.274167,0.281392,0.288587,0.295752,0.302885,0.309986
|
|
.float 0.317056,0.324092,0.331096,0.338066,0.345002,0.351904,0.358771
|
|
.float 0.365602,0.372398,0.379159,0.385883,0.392570,0.399221,0.405834
|
|
.float 0.412410,0.418949,0.425450,0.431912,0.438337,0.444722,0.451070
|
|
.float 0.457378,0.463648,0.469878,0.476069,0.482221,0.488334,0.494407
|
|
.float 0.500441,0.506435,0.512389,0.518304,0.524180,0.530015,0.535811
|
|
.float 0.541568,0.547284,0.552962,0.558599,0.564198,0.569756,0.575276
|
|
.float 0.580756,0.586198,0.591600,0.596963,0.602287,0.607573,0.612820
|
|
.float 0.618029,0.623199,0.628332,0.633426,0.638482,0.643501,0.648482
|
|
.float 0.653426,0.658333,0.663203,0.668036,0.672833,0.677593,0.682317
|
|
.float 0.687005,0.691657,0.696273,0.700854,0.705400,0.709912,0.714388
|
|
.float 0.718830,0.723238,0.727611,0.731951,0.736257,0.740530,0.744770
|
|
.float 0.748977,0.753151,0.757293,0.761403,0.765480,0.769526,0.773541
|
|
.float 0.777524,0.781477,0.785398
|
|
.text
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
fbss LOCTEMPER_MAT2,12
|
|
LOCTEMPER_MAT2I .word LOCTEMPER_MAT2
|
|
|
|
*----------------------------------------------------------------------------
|
|
*FIND MATRIX
|
|
*
|
|
*PARAMETERS
|
|
* AR2 DESTINATION 3X3
|
|
* R2 SOURCE RADIANS 1X3
|
|
*
|
|
FIND_MATRIX:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSHF R0
|
|
PUSHF R1
|
|
PUSHF R2
|
|
PUSH AR1
|
|
PUSH AR2
|
|
PUSH AR3
|
|
|
|
;GET SINES AND COSINES
|
|
LDI @LOCTEMPER_MAT2I,AR1
|
|
LDI R2,AR3
|
|
|
|
LDI 2,RC
|
|
RPTB FM1
|
|
|
|
LDF *AR3++,R2
|
|
CALL _SINE
|
|
STF R0,*+AR1(3)
|
|
CALL _COSI
|
|
FM1 STF R0,*AR1++
|
|
|
|
NOP *--AR1(2) ;CENTER COSINE INDEX
|
|
LDI AR1,AR3
|
|
ADDI 3,AR3 ;CENTER SINE INDEX
|
|
MPYF *+AR1(1),*+AR1(0),R0 ;CZ*CY
|
|
STF R0,*AR2++ ;A(0,0)=CZ*CY
|
|
MPYF *+AR3(1),*+AR1(0),R0 ;SZ*CY
|
|
NEGF *+AR3(0),R2 ;-SY
|
|
|| STF R0,*AR2++ ;A(0,1)=SZ*CY
|
|
MPYF *-AR3(1),*+AR3(0),R0 ;SX*SY
|
|
MPYF *+AR1(1),R0,R1 ;SX*SY*CZ
|
|
|| STF R2,*AR2++ ;A(0,2)=-SY
|
|
MPYF *-AR1(1),*+AR3(1),R2 ;CX*SZ
|
|
SUBF R2,R1
|
|
MPYF *+AR3(1),R0,R0 ;SZ*(SX*SY)
|
|
|| STF R1,*AR2++ ;A(1,0)=SX*SY*SZ-CX*SZ
|
|
MPYF *-AR1(1),*+AR1(1),R1 ;CX*CZ
|
|
ADDF R1,R0
|
|
STF R0,*AR2++ ;A(1,1)= SX*SY*SZ+CX*CZ
|
|
MPYF *-AR3(1),*+AR1(0),R0
|
|
MPYF *+AR3(0),R1,R1 ;SY*(CX*CZ)
|
|
|| STF R0,*AR2++ ;A(1,2)= SX*CY
|
|
MPYF *-AR3(1),*+AR3(1),R0 ;SX*SZ
|
|
ADDF R1,R0
|
|
MPYF *+AR3(0),R2,R2
|
|
|| STF R0,*AR2++ ;A(2,0)= CX*SY*CZ+SX*SZ
|
|
MPYF *-AR3(1),*+AR1(1),R0
|
|
MPYF *-AR1(1),*+AR1(0),R1 ;CX*CY
|
|
|| SUBF R0,R2
|
|
STF R2,*AR2++ ;A(2,1)= CX*SY*SZ-SX*CZ
|
|
STF R1,*AR2--(8) ;A(2,2)= CX*CY
|
|
POP AR3
|
|
POP AR2
|
|
POP AR1
|
|
POPF R3
|
|
POPF R2
|
|
POPF R1
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* 1 0 0
|
|
* Xrot = { 0 c s }
|
|
* 0 -s c
|
|
*
|
|
*PARAMETERS
|
|
* AR2 DESTINATION 3X3 MATRIX
|
|
* R2 SOURCE RADIANS
|
|
*
|
|
FIND_XMATRIX:
|
|
PUSH R0
|
|
PUSHF R0
|
|
CALL _COSI
|
|
STF R0,*+AR2(A11)
|
|
STF R0,*+AR2(A22)
|
|
CALL _SINE
|
|
STF R0,*+AR2(A12)
|
|
NEGF R0
|
|
STF R0,*+AR2(A21)
|
|
LDF 1,R0
|
|
STF R0,*+AR2(A00)
|
|
CLRF R0
|
|
STF R0,*+AR2(A01)
|
|
STF R0,*+AR2(A02)
|
|
STF R0,*+AR2(A10)
|
|
STF R0,*+AR2(A20)
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* c 0 -s
|
|
* Yrot = { 0 1 0 }
|
|
* s 0 c
|
|
*
|
|
*PARAMETERS
|
|
* AR2 DESTINATION 3X3 MATRIX
|
|
* R2 SOURCE RADIANS
|
|
*
|
|
FIND_YMATRIX:
|
|
_find_Ymatrix:
|
|
PUSH R0
|
|
PUSHF R0
|
|
CALL _COSI
|
|
STF R0,*+AR2(A00)
|
|
STF R0,*+AR2(A22)
|
|
CALL _SINE
|
|
STF R0,*+AR2(A20)
|
|
NEGF R0
|
|
STF R0,*+AR2(A02)
|
|
LDF 1,R0
|
|
STF R0,*+AR2(A11)
|
|
CLRF R0
|
|
STF R0,*+AR2(A01)
|
|
STF R0,*+AR2(A10)
|
|
STF R0,*+AR2(A12)
|
|
STF R0,*+AR2(A21)
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* c 0 -s
|
|
* Yrot = { 0 1 0 }
|
|
* s 0 c
|
|
*
|
|
*PARAMETERS
|
|
* AR2 DESTINATION 3X3 MATRIX
|
|
* R2 SOURCE RADIANS
|
|
*
|
|
HPFIND_YMATRIX:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH R1
|
|
PUSHF R1
|
|
PUSH R2
|
|
PUSHF R2
|
|
PUSH R3
|
|
PUSHF R3
|
|
PUSH R4
|
|
PUSHF R4
|
|
|
|
|
|
PUSH R2
|
|
PUSHF R2
|
|
|
|
CALL _HPcos
|
|
STF R0,*+AR2(A00)
|
|
STF R0,*+AR2(A22)
|
|
|
|
POPF R2
|
|
POP R2
|
|
CALL _HPsin
|
|
STF R0,*+AR2(A20)
|
|
NEGF R0
|
|
STF R0,*+AR2(A02)
|
|
LDF 1,R0
|
|
STF R0,*+AR2(A11)
|
|
CLRF R0
|
|
STF R0,*+AR2(A01)
|
|
STF R0,*+AR2(A10)
|
|
STF R0,*+AR2(A12)
|
|
STF R0,*+AR2(A21)
|
|
|
|
POPF R4
|
|
POP R4
|
|
POPF R3
|
|
POP R3
|
|
POPF R2
|
|
POP R2
|
|
POPF R1
|
|
POP R1
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* c s 0
|
|
* Zrot = { -s c 0 }
|
|
* 0 0 1
|
|
*
|
|
*PARAMETERS
|
|
* AR2 DESTINATION 3X3 MATRIX
|
|
* R2 SOURCE RADIANS
|
|
*
|
|
FIND_ZMATRIX:
|
|
PUSH R0
|
|
PUSHF R0
|
|
CALL _COSI
|
|
STF R0,*+AR2(A00)
|
|
STF R0,*+AR2(A11)
|
|
CALL _SINE
|
|
STF R0,*+AR2(A01)
|
|
NEGF R0
|
|
STF R0,*+AR2(A10)
|
|
LDF 1,R0
|
|
STF R0,*+AR2(A22)
|
|
CLRF R0
|
|
STF R0,*+AR2(A02)
|
|
STF R0,*+AR2(A12)
|
|
STF R0,*+AR2(A20)
|
|
STF R0,*+AR2(A21)
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*INITIALIZE MATRIX TO IDENTITY
|
|
*
|
|
*PARAMETERS
|
|
* AR0 POINTER TO MATRIX
|
|
*
|
|
INITMAT:
|
|
POP BK ;RETURN ADDRESS
|
|
PUSH R0
|
|
PUSHF R0
|
|
LDF 1.0,R0
|
|
STF R0,*AR0
|
|
STF R0,*+AR0(4)
|
|
STF R0,*+AR0(8)
|
|
LDF 0,R0
|
|
STF R0,*+AR0(1)
|
|
STF R0,*+AR0(2)
|
|
STF R0,*+AR0(3)
|
|
STF R0,*+AR0(5)
|
|
STF R0,*+AR0(6)
|
|
BUD BK
|
|
STF R0,*+AR0(7)
|
|
POPF R0
|
|
POP R0
|
|
;----> RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*float vectlen(VECTOR *);
|
|
*
|
|
*PARAMETERS
|
|
* AR2 PTS TO VECTOR
|
|
*RETURNS
|
|
* R0 LENGTH OF VECTOR
|
|
*CLOBBERS
|
|
* R1,R2
|
|
*
|
|
VECTLEN:
|
|
LDF *AR2++,R2
|
|
MPYF R2,R2
|
|
LDF *AR2++,R1
|
|
MPYF R1,R1
|
|
ADDF R1,R2
|
|
|
|
BUD SQRT ;fall into SQRT
|
|
LDF *AR2--(2),R1
|
|
MPYF R1,R1
|
|
ADDF R1,R2
|
|
;---->BU NOW INTO SQRT routine
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void cpymat(MATRIX *dst,MATRIX *src);
|
|
*
|
|
*PARAMETERS
|
|
* AR2 DEST MATRIX
|
|
* R2 SOURCE MATRIX
|
|
*
|
|
CPYMAT:
|
|
PUSH AR0
|
|
PUSH R0
|
|
PUSHF R0
|
|
LDI R2,AR0
|
|
LDF *AR0++,R0
|
|
RPTS 7
|
|
LDF *AR0++,R0
|
|
|| STF R0,*AR2++
|
|
STF R0,*AR2--(8)
|
|
POPF R0
|
|
POP R0
|
|
POP AR0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void cpyimat(MATRIX *d,MATRIX *s)
|
|
*
|
|
*
|
|
*PARAMETERS
|
|
* AR2 DEST
|
|
* R2 SOURCE
|
|
*RETURNS
|
|
* AR2 INVERSE MATRIX (ROWS & COLUMNS XCHNGED)
|
|
*
|
|
*WARNING SOURCE CANNOT BE SAME AS DEST
|
|
CPYIMAT:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH AR0
|
|
LDI R2,AR0
|
|
|
|
LDF *AR0++(2),R0 ;0->0
|
|
LDF *+AR0(1),R0 ;3->1
|
|
|| STF R0,*AR2++
|
|
STF R0,*AR2++
|
|
|
|
LDF *+AR0(4),R0 ;6->2
|
|
LDF *-AR0(1),R0 ;1->3
|
|
|| STF R0,*AR2++
|
|
STF R0,*AR2++
|
|
|
|
LDF *+AR0(2),R0 ;4->4
|
|
STF R0,*AR2++
|
|
|
|
LDF *+AR0(5),R0 ;7->5
|
|
LDF *+AR0(0),R0 ;2->6
|
|
|| STF R0,*AR2++
|
|
STF R0,*AR2++
|
|
|
|
LDF *+AR0(3),R0 ;5->7
|
|
STF R0,*AR2++
|
|
LDF *+AR0(6),R0 ;8->8
|
|
STF R0,*AR2--(8)
|
|
|
|
POP AR0
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CLEARS VECTOR A and RETURNS POINTER TO IT IN AR2
|
|
*
|
|
CLR_VECTORA:
|
|
PUSH R0
|
|
PUSHF R0
|
|
LDI @VECTORAI,AR2
|
|
CLRF R0
|
|
STF R0,*AR2
|
|
STF R0,*+AR2(1)
|
|
STF R0,*+AR2(2)
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void matrix_mul(VECTOR *src,MATRIX *m3x3,VECTOR *dst)
|
|
*
|
|
*PARAMETERS
|
|
* AR2 SRC 1x3
|
|
* R2 SRC 3x3
|
|
* R3 DST 1x3
|
|
*RETURNS
|
|
* *R3 modified, all regs saved
|
|
*
|
|
*NOTE SRC 1x3 and DST 1x3 may be equal
|
|
*
|
|
MATRIX_MUL:
|
|
PUSH R0
|
|
PUSHF R0
|
|
PUSH AR1
|
|
LDI R2,AR1 ;AR1 IS 3X3 MATRIX
|
|
PUSH R2
|
|
PUSHF R2
|
|
|
|
MPYF *AR2++,*AR1++,R0
|
|
MPYF *AR2,*AR1++,R2
|
|
MPYF *+AR2(1),*AR1++,R0
|
|
|| ADDF R0,R2
|
|
|
|
MPYF *-AR2(1),*AR1++,R0
|
|
|| ADDF R0,R2
|
|
PUSHF R2
|
|
MPYF *AR2,*AR1++,R2
|
|
MPYF *+AR2(1),*AR1++,R0
|
|
|| ADDF R0,R2
|
|
|
|
MPYF *-AR2(1),*AR1++,R0
|
|
|| ADDF R0,R2
|
|
PUSHF R2
|
|
MPYF *+AR2(1),*+AR1(1),R2
|
|
MPYF *AR2--(1),*AR1,R0
|
|
|| ADDF R0,R2
|
|
|
|
LDI R3,AR1
|
|
ADDF R2,R0
|
|
POPF R2
|
|
STF R0,*+AR1(2)
|
|
|
|
POPF R0
|
|
STF R0,*AR1
|
|
|| STF R2,*+AR1(1)
|
|
|
|
POPF R2
|
|
POP R2
|
|
POP AR1
|
|
POPF R0
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void normalize(VECTOR *V)
|
|
NORMALIZE:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSHF R0
|
|
PUSHF R1
|
|
|
|
CALL VECTLEN
|
|
CALL INV_F30
|
|
|
|
MPYF *AR2,R0,R1
|
|
STF R1,*AR2++
|
|
MPYF *AR2,R0,R1
|
|
STF R1,*AR2++
|
|
MPYF *AR2,R0,R1
|
|
STF R1,*AR2--(2)
|
|
|
|
POPF R1
|
|
POPF R0
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*NORMAT NORMALIZE MATRIX
|
|
*
|
|
*PARAMETERS
|
|
* AR2 POINTS TO MATRIX
|
|
*
|
|
*AR0,AR1,R0,R1,R2 TRASHED
|
|
*
|
|
NORMAT:
|
|
|
|
;NORMALIZE ROWS
|
|
LDI 2,RC
|
|
RPTB NORMROW
|
|
|
|
;GET LENGTH
|
|
LDF *AR2++(3),R2
|
|
MPYF R2,R2
|
|
LDF *AR2++(3),R1
|
|
MPYF R1,R1
|
|
ADDF R1,R2
|
|
|
|
LDF *AR2--(6),R1
|
|
MPYF R1,R1
|
|
ADDF R1,R2
|
|
CALL SQRT ;sqrt(R2)-->R0
|
|
CALL INV_F30 ;INV(R0)-->R0
|
|
|
|
MPYF *AR2,R0,R1
|
|
STF R1,*AR2++(3)
|
|
MPYF *AR2,R0,R1
|
|
STF R1,*AR2++(3)
|
|
MPYF *AR2,R0,R1
|
|
NORMROW STF R1,*AR2--(5)
|
|
|
|
NOP *AR2--(3) ;RESTORE AR2 MATRIX POINTER
|
|
|
|
;NORMALIZE COLUMNS
|
|
CALL NORMALIZE
|
|
NOP *AR2++(3)
|
|
CALL NORMALIZE
|
|
NOP *AR2++(3)
|
|
CALL NORMALIZE
|
|
NOP *AR2--(6) ;RESTORE AR2
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*void gen_normal(VECTOR *A,VECTOR *B,VECTOR *C,VECTOR *N)
|
|
*
|
|
*PARAMETERS
|
|
* AR2 PTS TO PTRA,PTRB,PTRC
|
|
* AR0 PTS TO NORMAL VECTOR TO RETURN
|
|
*
|
|
*CLOBBERS
|
|
* R0-R7,AR2
|
|
*
|
|
GEN_NORMAL:
|
|
PUSH AR0
|
|
LDI *+AR2(1),AR0 ;B
|
|
LDI *+AR2(2),R3 ;C
|
|
LDI *AR2,AR2 ;A
|
|
|
|
SUBF *AR0++,*AR2++,R0 ;D
|
|
SUBF *AR0,*AR2++,R1
|
|
SUBF *+AR0(1),*AR2++,R2
|
|
|
|
LDI R3,AR2 ;C
|
|
|
|
SUBF *-AR0(1),*AR2++,R3 ;E
|
|
SUBF *AR0,*AR2++,R4
|
|
SUBF *+AR0(1),*AR2++,R5
|
|
POP AR0
|
|
|
|
MPYF R1,R5,R6 ;dy*ez
|
|
MPYF R2,R4,R7 ;dz*ey
|
|
SUBF R7,R6
|
|
STF R6,*AR0
|
|
|
|
MPYF R2,R3,R6 ;dz*ex
|
|
MPYF R0,R5,R7 ;dx*ez
|
|
SUBF R7,R6
|
|
STF R6,*+AR0(1)
|
|
|
|
MPYF R0,R4,R6
|
|
MPYF R1,R3,R7
|
|
SUBF R7,R6
|
|
STF R6,*+AR0(2)
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CONCATENATE MATRICES, VOLATILE
|
|
*void concatmat(MATRIX *s1, MATRIX *s2, MATRIX *d);
|
|
*
|
|
*PARAMETERS
|
|
* AR2 s1 SOURCE_1 MATRIX
|
|
* R2 s2 SOURCE_2 MATRIX
|
|
* R3 d DEST MATRIX
|
|
*
|
|
*NOTE __d can NOT be equal to either __s1 or __s2.
|
|
*
|
|
*
|
|
*
|
|
*__s1 __s2 __d
|
|
*A B C J K L AJ+DK+GL BJ+EK+HL CJ+FK+IL
|
|
*D E F * M N O = AM+DN+GO BM+EN+HO CM+FN+IO
|
|
*G H I P Q R AP+DQ+GR BP+EQ+HR CP+FQ+IR
|
|
*
|
|
CONCATMATV:
|
|
LDI R2,AR0
|
|
LDI R3,AR1
|
|
|
|
CONCAT201:
|
|
LDI 5,IR1
|
|
LDI 3,IR0
|
|
|
|
LDI 2,RC
|
|
RPTB INLP2
|
|
|
|
*LOOP THREE TIMES
|
|
MPYF3 *AR0++,*AR2++(IR0),R0
|
|
MPYF3 *AR0,*AR2++(IR0),R1
|
|
MPYF3 *+AR0(1),*AR2--(IR1),R1
|
|
|| ADDF3 R0,R1,R2
|
|
|
|
|
|
MPYF3 *-AR0(1),*AR2++(IR0),R0
|
|
|| ADDF3 R1,R2,R2
|
|
MPYF3 *AR0,*AR2++(IR0),R1
|
|
STF R2,*AR1++(1) ;store MATij
|
|
MPYF3 *+AR0(1),*AR2--(IR1),R1
|
|
|| ADDF3 R0,R1,R2
|
|
|
|
|
|
MPYF3 *-AR0(1),*AR2++(IR0),R0
|
|
|| ADDF3 R1,R2,R2
|
|
MPYF3 *AR0++,*AR2++(IR0),R1
|
|
STF R2,*AR1++(1) ;store MATij
|
|
MPYF3 *AR0++,*AR2--(IR1),R1
|
|
|| ADDF3 R0,R1,R2
|
|
ADDF R1,R2
|
|
|
|
STF R2,*AR1++(1) ;store MATij
|
|
INLP2 SUBI 3,AR2
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*CONCATENATE MATRICES
|
|
*
|
|
*this is the non-volatile concatmat, if the destination is not the same as
|
|
*either source use concatmatv because it doesn't do the extra copy (for
|
|
*avoiding overwrites)
|
|
*
|
|
*void concatmat(MATRIX *s1,MATRIX *s2,MATRIX *d);
|
|
*
|
|
*PARAMETERS
|
|
* AR2 s1 SOURCE_1 MATRIX
|
|
* R2 s2 SOURCE_2 MATRIX
|
|
* R3 d DEST MATRIX
|
|
*
|
|
*
|
|
CONCATMAT:
|
|
PUSH AR0
|
|
PUSH AR1
|
|
PUSH AR0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
|
|
PUSH R3
|
|
LDI @LOCTEMPER_MATI,R3 ;from DIRQ
|
|
CALL CONCATMATV
|
|
POP AR2
|
|
LDI @LOCTEMPER_MATI,R2
|
|
CALL CPYMAT
|
|
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
POP R0
|
|
POP AR1
|
|
POP AR0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*GETTHETADIFF
|
|
*compute radY delta (as smallest possible turn)
|
|
*
|
|
*PARAMETERS
|
|
* R0 DESIRED THETA (float)
|
|
* R2 CURRENT THETA (float)
|
|
*RETURNS
|
|
* R0 THETA DELTA (float)
|
|
*
|
|
GETTHETADIFF:
|
|
PUSHF R1
|
|
SUBF R2,R0
|
|
ABSF R0,R1
|
|
|
|
CMPF @PII,R1
|
|
BLT NONEG
|
|
LDF R0,R0
|
|
BN ISNEG
|
|
|
|
SUBF @TWOPII,R0
|
|
POPF R1
|
|
RETS
|
|
|
|
ISNEG ADDF @TWOPII,R0
|
|
NONEG POPF R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
* LDI AR2,AR0
|
|
* LDP @VECTORBI
|
|
* LDI @VECTORBI,AR1
|
|
* LDF *+AR4(OPOSX),R0
|
|
* STF R0,*+AR1(X)
|
|
* CLRF R0
|
|
* STF R0,*+AR1(Y)
|
|
* LDF *+AR4(OPOSZ),R0
|
|
* STF R0,*+AR1(Z)
|
|
*
|
|
* CALL DIST_PT2LINE
|
|
*
|
|
*PARAMETERS
|
|
* AR0 LINE EQUATION (2D) A B C
|
|
* AR1 2D POINT [X Y]
|
|
*
|
|
*RETURNS
|
|
* R0 FL DISTANCE TO LINE (SIGNED)
|
|
*
|
|
*
|
|
DIST_PT2LINE:
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSHF R1
|
|
PUSHF R2
|
|
MPYF *+AR1(X),*+AR0(A),R0
|
|
MPYF *+AR1(Y),*+AR0(B),R1
|
|
ADDF R0,R1
|
|
ADDF *+AR0(C),R1
|
|
MPYF *+AR0(A),*+AR0(A),R0
|
|
MPYF *+AR0(B),*+AR0(B),R2
|
|
ADDF R0,R2
|
|
CALL SQRT
|
|
LDF R0,R2
|
|
LDF R1,R0
|
|
LDF R2,R1
|
|
CALL DIV_F
|
|
POPF R2
|
|
POPF R1
|
|
POP R2
|
|
POP R1
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
* LDI @VECTORAI,AR0
|
|
* LDI @VECTORBI,AR1
|
|
* CALL GETLINE_EQ
|
|
*
|
|
*PARAMETERS
|
|
* AR0 P1
|
|
* AR1 P2
|
|
* AR2 SPACE FOR LINE EQUATION
|
|
*
|
|
*RETURNS
|
|
* AR2 VECTOR AS A B C
|
|
*
|
|
GETLINE_EQ_2D:
|
|
PUSH R0
|
|
PUSH R1
|
|
PUSH R2
|
|
PUSH R3
|
|
PUSHF R0
|
|
PUSHF R1
|
|
PUSHF R2
|
|
PUSHF R3
|
|
|
|
SUBF *+AR1(X),*+AR0(X),R0
|
|
SUBF *+AR1(Y),*+AR0(Y),R1
|
|
MPYF R0,*+AR1(X),R2
|
|
MPYF R1,*+AR1(Y),R3
|
|
ADDF R3,R2
|
|
NEGF R2
|
|
STF R0,*+AR2(A)
|
|
STF R1,*+AR2(B)
|
|
STF R2,*+AR2(C)
|
|
|
|
POPF R3
|
|
POPF R2
|
|
POPF R1
|
|
POPF R0
|
|
POP R3
|
|
POP R2
|
|
POP R1
|
|
POP R0
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
*----------------------------------------------------------------------------
|
|
*see Foley & van Damn 2ed pg215
|
|
*
|
|
*scale matrix Sx 0 0
|
|
* 0 Sy 0
|
|
* 0 0 Sz
|
|
*
|
|
*Once a FIND_MATRIX is complete you can pump that matrix through this
|
|
*routine and the object will be scaled by R2. (Obviously each of the
|
|
*X Y and Z elements can be scaled independantly, but this might be
|
|
*cumbersome, and it would be better suited for a different routine.
|
|
*
|
|
*Note that a 3x3 x 3x3 -> 3x3 matrix by the scale would be:
|
|
*
|
|
* ASx BSy CSz
|
|
* DSx ESy FSz (by eliminating all the multiply by zeros)
|
|
* GSx HSy ISz
|
|
*
|
|
*PARAMETERS
|
|
* AR2 MATRIX to be scaled
|
|
* R2 SCALE FACTOR
|
|
*
|
|
*
|
|
*RETURNS
|
|
* AR2 MATRIX modified for scaling
|
|
*
|
|
*
|
|
SCALE_MATRIX:
|
|
PUSH R3
|
|
PUSHF R3
|
|
|
|
|
|
LDF *+AR2(A00),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A00)
|
|
LDF *+AR2(A01),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A01)
|
|
LDF *+AR2(A02),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A02)
|
|
|
|
LDF *+AR2(A10),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A10)
|
|
LDF *+AR2(A11),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A11)
|
|
LDF *+AR2(A12),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A12)
|
|
|
|
LDF *+AR2(A20),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A20)
|
|
LDF *+AR2(A21),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A21)
|
|
LDF *+AR2(A22),R3
|
|
MPYF R2,R3
|
|
STF R3,*+AR2(A22)
|
|
|
|
POPF R3
|
|
POP R3
|
|
RETS
|
|
*----------------------------------------------------------------------------
|
|
.END
|