perm filename EULER.PAL[2,VDS] blob
sn#158464 filedate 1975-05-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 EULER - PROGRAMS FOR CONVERTING TRANSFORMS ↔ EULER ANGLES
C00003 00003 "EULER" COMPUTES THE EULER ANGLES DESCRIBING AN ARM POSITION GIVEN
C00006 00004 "UNEUL" COMPUTES A TRANSFORM MATRIX REPRESENTING HAND POSITION AND
C00010 ENDMK
C⊗;
;EULER - PROGRAMS FOR CONVERTING TRANSFORMS ↔ EULER ANGLES
.TITLE EULER
;DEFINITIONS
T21==4
T31==10
T12==20
T22==24
T32==30
T13==40
T23==44
T33==50
T14==60
T24==64
T34==70
T44==74
;CONSTANTS
C01: .WORD 36443,153412 ; .100@-1
TODEG: .WORD 41545, 27341 ; 57.2958
;"EULER" COMPUTES THE EULER ANGLES DESCRIBING AN ARM POSITION GIVEN
;A TRANSFORM IN TABLE COORDINATES. A SAMPLE CALLING SEQUENCE FOLLOWS:
;
; MOV #T,R0 ;LOAD ADDR. OF TRANSFORM "T"
; MOV #E,R1 ;LOAD ADDR. OF ARRAY TO
; ; RETURN THE EULER ANGLES
; JSR PC,EULER ;CALLED USING THE PC
;
;THE TRANSFORM "T" MUST BE STORED BY COLUMNS AND THE ARRAY "E" MUST
;BE AT LEAST 6 ELEMENTS LONG. ALL NUMBERS SHOULD BE IN SINGLE
;PRECISION FLOATING POINT.
;EXECUTION TIME:
;REGISTERS USED:
;
; R0, R1 PASS ARGUMENTS AND R1 IS ALTERED BY "EULER"
; AC0,AC1,AC2,AC3,AC4 ARE GARBAGED
;START OF "EULER"
EULER: MOV T14(R0),(R1)+ ;COPY X LOCATION INTO E(1)
MOV T14+2(R0),(R1)+
MOV T24(R0),(R1)+ ;COPY Y LOCATION INTO E(2)
MOV T24+2(R0),(R1)+
MOV T34(R0),(R1)+ ;COPY Z LOCATION INTO E(3)
MOV T34+2(R0),(R1)+
LDF T13(R0),AC0 ;COMPUTE CO2←SQRT(T[1,3]↑2+T[2,3]↑2)
MULF AC0,AC0
LDF T23(R0),AC1
MULF AC1,AC1
ADDF AC1,AC0
JSR PC,SQRTF
STF AC0,AC4 ;SAVE CO2 FOR LATER
STF AC0,AC1 ;COMPUTE ATAN(-T[3,3]/CO2)
LDF T33(R0),AC0
NEGF AC0
JSR PC,ATAN2
MULF TODEG,AC0 ;CONVERT TO DEGREES
STF AC0,4(R1) ;THIS IS E(5)
LDF AC4,AC0 ;CHECK IF CO2 ALMOST ZERO
CMPF C01,AC0
CFCC
BLE CO2BIG ;IF CO2<0.01
LDF T22(R0),AC0 ;THEN E(4)←ATAN(T[2,2]/T[1,2])
LDF T12(R0),AC1
JSR PC,ATAN2
MULF TODEG,AC0 ;CONVERT TO DEGREES AND STORE
STF AC0,(R1)
CLR 10(R1) ;AND E(6)←0
CLR 12(R1)
RTS PC ;RETURN
CO2BIG: LDF T13(R0),AC0 ;ELSE E[4]←ATAN(T[1,3]/-T[2,3])
LDF T23(R0),AC1
NEGF AC1
JSR PC,ATAN2
MULF TODEG,AC0 ;CONVERT TO DEGREES AND STORE
STF AC0,(R1)
LDF T32(R0),AC0 ;AND E[6]←ATAN(T[3,2]/-[3,1])
LDF T31(R0),AC1
NEGF AC1
JSR PC,ATAN2
MULF TODEG,AC0 ;CONVERT TO DEGREES AND STORE
STF AC0,10(R1)
RTS PC
;END OF "EULER"
;"UNEUL" COMPUTES A TRANSFORM MATRIX REPRESENTING HAND POSITION AND
;ORIENTATION IN TABLE COORDINATES GIVEN THE EULER ANGLES OF THE
;LOCATION. A SAMPLE CALLING SEQUENCE FOLLOWS:
;
; MOV #T,R0 ;LOAD ADDR. OF TRANSFORM "T"
; MOV #E,R1 ;LOAD ADDR. OF EULER ANGLE ARRAY
; JSR PC,UNEUL ;CALLED USING THE PC
;
;THE TRANSFORM "T" WILL BE STORED BY COLUMNS AND THE ARRAY "E" MUST
;CONTAIN THE 6 EULER ANGLES. ALL NUMBERS SHOULD BE IN SINGLE
;PRECISION FLOATING POINT.
;EXECUTION TIME:
;REGISTERS USED:
;
; R0, R1 PASS ARGUMENTS AND R1 IS ALTERED BY "UNEUL"
; AC0,AC1,AC2,AC3,AC4 ARE GARBAGED
;START OF "UNEUL"
UNEUL: MOV (R1)+,T14(R0) ;COPY X LOCATION INTO T[1,4]
MOV (R1)+,T14+2(R0)
MOV (R1)+,T24(R0) ;COPY Y LOCATION INTO T[2,4]
MOV (R1)+,T24+2(R0)
MOV (R1)+,T34(R0) ;COPY Z LOCATION INTO T[3,4]
MOV (R1)+,T34+2(R0)
LDF (R1)+,AC0 ;COMPUTE THE SINE/COSINE OF E[4]
JSR PC,SNCOSD
STF AC0,SI1
STF AC1,CO1
LDF (R1)+,AC0 ;COMPUTE THE SINE/COSINE OF E[5]
JSR PC,SNCOSD
STF AC0,SI2
STF AC1,CO2
LDF (R1),AC0 ;COMPUTE THE SINE/COSINE OF E[6]
JSR PC,SNCOSD
LDF SI1,AC2 ;T[1,1]←-SI1*SI2*CO3+CO1*SI3
MULF SI2,AC2
STF AC2,AC4 ;SAVE SI1*SI2
MULF AC1,AC2
LDF CO1,AC3
MULF AC0,AC3
SUBF AC2,AC3
STF AC3,(R0)
LDF AC4,AC2 ;T[1,2]←SI1*SI2*SI3+CO1*CO3
MULF AC0,AC2
LDF CO1,AC3
MULF AC1,AC3
ADDF AC3,AC2
STF AC2,T12(R0)
MULF SI2,AC3 ;T[2,1]←CO1*CO3*SI2+SI1*SI3
LDF SI1,AC2
MULF AC0,AC2
ADDF AC3,AC2
STF AC2,T21(R0)
LDF CO1,AC2 ;T[2,2]←-CO1*SI2*SI3+SI1*CO3
MULF SI2,AC2
MULF AC0,AC2
LDF SI1,AC3
MULF AC1,AC3
SUBF AC2,AC3
STF AC3,T22(R0)
LDF CO2,AC2 ;T[1,3]←SI1*CO2
LDF SI1,AC3
MULF AC2,AC3
STF AC3,T13(R0)
MULF AC2,AC0 ;T[3,2]←CO2*SI3
STF AC0,T32(R0)
NEGF AC2
LDF CO1,AC3 ;T[2,3]←-CO1*CO2
MULF AC2,AC3
STF AC3,T23(R0)
MULF AC2,AC1 ;T[3,1]←-CO2*CO3
STF AC1,T31(R0)
LDF SI2,AC0 ;T[3,3]←-SI2
NEGF AC0
STF AC0,T33(R0)
LDF #40200,AC0 ;T[4,4]←1.0
STF AC0,T44(R0)
RTS PC ;RETURN
SI1: .WORD 0,0
CO1: .WORD 0,0
SI2: .WORD 0,0
CO2: .WORD 0,0
;END OF "UNEUL"