*** empty log message ***
[h316.git] / lib / hachti / src / matrix.asm
CommitLineData
13f9c770 1* MATRIX - AFFINE TRANSFORM SUPPORT PACKAGE
2*
3*
4* AUTHOR:
5*
6* PHILIPP HACHTMANN
7*
8* VERSIONS:
9* 0.1 - INITIAL REVISION (22.12.2007
10*
11*
12* PURPOSE:
13*
14* THIS LIBRARY PROVIDES AFFINE TRANSFORMATION ROUTINES TO
15* PLOTTING ROUTINES AND OTHER SOFTWARE.
16*
17*
18* DATA REPRESENTATION:
19*
20*
21* MATRIX FORMAT: | A11 A12 |
22* M= | |
23* | A21 A22 |
24*
25* A11-A22 ARE SINGLE PRECISION FLOAT VALUES COMPLIANT TO THE
26* HONEYWELL MATHEMATICAL LIBARAY. EVERY VALUE USES TWO
27* 16 BIT MACHINE WORDS.
28* IF A MATRIX IS USED AS A DAC ARGUMENT, A POINTER TO THE FIRST
29* ELEMENT, A11, HAS TO BE USED.
30*
31*
32* VECTOR FORMAT: | A1 |
33* V= | |
34* | A2 |
35*
36* A1 AND A2 ARE SIGNED INTEGER VALUES. EVERY VALUE USES ONE
37* 16 BIT MACHINE WORD.
38* IF A VECTOR IS USED AS A DAC ARGUMENT, A POINTER TO THE FIRST
39* ELEMENT, A1, HAS TO BE USED.
40*
41*
42* AFFINE TRANSFORM FORMAT:
43*
44* AN AFFINE TRANSFORM CONSISTS OF A MATRIX FOR ROTATING AND SCALING
45* AND A VECTOR VOR RELOCATION OF THE RESULT.
46* A VECTOR IS TRANSFORMED BY FIRST MULTIPLYING THE MATRIX WITH IT
47* AND THEN ADDING THE RELOCATION VECTOR:
48*
49* | A11 A12 | | VI1 | | VT1 |
50* VO = MT * VI + VT = | | * | | + | |
51* | A21 A22 | | VI2 | | VT2 |
52*
53* | VI1*A11 + VI2*A12 + VT1 |
54* = | |
55* | VI1*A21 + VI2*A22 + VT2 |
56*
57* MT AND VT ARE THE TRANSFORMATION MATRIX AND VECTOR, VI THE INPUT
58* VECTOR, VO THE RESULT VECTOR.
59*
60* AN AFFINE TRANSFORM IS STORED AS A CONCATENATION OF A MATRIX AND
61* A VECTOR. HERE IS THE MEMORY LAYOUT:
62*
63* '000 : MT11 UPPER
64* '001 : MT11 LOWER
65* '002 : MT12 UPPER
66* '003 : MT12 LOWER
67* '004 : MT21 UPPER
68* '005 : MT21 LOWER
69* '006 : MT22 UPPER
70* '007 : MT22 LOWER
71* '010 : VT1
72* '011 : VT2
73*
74* FOR EVERY TRANSFORMATION, '12 WORDS HAVE TO BE RESERVED.
75* IN AN APPLICATION, A TRANFORMATION VARIABLE COULD BE
76* DECLARED WITH:
77*
78* TRANS BSS '12
79*
80*
81*
82*********************************************************************************
83*
84*
85*
86* M$INIT: INITIALISE MATRIX TO IDENTITY
87*
88* THE MATRIX ARGUMENT IS SET TO
89*
90* | 1.0 0.0 |
91* M= | |
92* | 0.0 1.0 |
93*
eabafcca 94* WHICH RESULTS TO THE IDENTITY TRANSFORMATION.
13f9c770 95*
96* JST M$INIT
97* DAC MATRIX POINTER TO A MATRIX
98*
99*
100*
101* M$MUL: MATRIX MULTIPLICATION
102*
103* JST M$MUL
104* DAC TARGET POINTER TO TARGET MATRIX
105* DAC MATRIX1 POINTER TO LEFT MATRIX
106* DAC MATRIX2 POINTER TO RIGHT MATRIX
107* DAC 0 FOR FORTRAN IV COMPATIBILITY
108*
109*
110*
111* M$APLI: APPLY MATRIX TO VECTOR
112*
113* THIS ROUTINE CONVERTS THE VECTOR ELEMENTS TO FLOATING POINT VALUES,
114* APPLIES THE TRANSFORMATION TO THEM AND ROUNDS THE RESULTS BACK TO
eabafcca 115* INTEGER VALUES. THEN IT SAVES THE NEW VECTOR TO THE LOCATION
116* DESIGNATED BY THE TARGET ADDRESS. SOURCE AND TARGET MAY BE THE SAME,
117* THE SOURCE'S CONTENTS ARE NOT ALTERED.
13f9c770 118*
119* JST M$APLI
120* DAC MATRIX MATRIX TO APPLY
eabafcca 121* DAC TARGET POINTER TO TARGET VECTOR
122* DAC SOURCE VECTOR TO TRANSFORM
13f9c770 123* DAC 0 FOR FORTRAN IV COMPATIBILITY
124*
125*
126* M$APII: APPLY MATRIX TO PAIR OF INTEGERS AS VECTOR
127*
eabafcca 128* THIS ROUTINE USES TWO DISTINCT INTEGER POINTERS TO DESCRIBE A POINT.
129* THE REST OF THE BEHAVIOR IS EXACTLY LIKE M$APL.
13f9c770 130*
eabafcca 131* JST M$APII
13f9c770 132* DAC MATRIX MATRIX TO APPLY
eabafcca 133* DAC XO X COORDINATE OF RESULT VECTOR
134* DAC XO Y COORDINATE OF RESULT VECTOR
135* DAC XI X COORDINATE OF ARGUMENT VECTOR
136* DAC YI Y COORDINATE OF ARGUMENT VECTOR
137* DAC 0 FOR FORTRAN IV COMPATIBILITY
13f9c770 138*
139*
140* M$ROT: ROTATE MATRIX
141*
142* THIS ROUTINE TAKES A MATRIX AND ADDS A ROTATION TO IT.
143* INTERNALLY, THE ROUTINE CREATES A ROTATION MATRIX AND THEN
144* MULTIPLIES IT WITH THE ARGUMENT MATRIX. THE ROTATION IS SPECIFIED
145* COUNTERCLOCKWISE FORWARD, ANGLE IN RADIANT.
146* THE ANGLE ARGUMENT IS A SINGLE PRECISION FLOATING POINT NUMER
147* TAKING TWO WORDS TO STORE.
148*
149* JST M$ROT
150* DAC MATRIX MATRIX TO MODIFY
151* DAC ANGLE RADIANT ANGLE
8eb88117 152* DAC 0 FOR FORTRAN IV COMPATIBILITY
13f9c770 153*
eabafcca 154*
155* M$ROTI: ROTATE MATRIX
156*
157* WORKS LIKE M$ROT, BUT TAKES AN INTEGER DEGREE VALUE AS ARGUMENT.
158*
159* JST M$ROTI
160* DAC MATRIX MATRIX TO MODIFY
161* DAC ANGLE DEGREE ANGLE
162* DAC 0 FOR FORTRAN IV COMPATIBILITY
163*
164*
13f9c770 165* M$SCLE: SCALE MATRIX
166*
167* THIS ROUTINE WORKS SIMILAR TO M$ROT BUT SCALES THE ARGUMENT MATRIX.
168* THE SCALE FACTOR IS A FLOATING POINT NUMBER. LIKE THE ROTATION ANGLE.
169*
170* JST M$SCLE
171* DAC MATRIX MATRIX TO MODIFY
172* DAC SCALE SCALE FACTOR
8eb88117 173* DAC 0 FOR FORTRAN IV COMPATIBILITY
13f9c770 174*
eabafcca 175*
176*********************************************************************************
177*
178*
179* T$INIT: INITIALISE AFFINE TRANSFORM
180*
181* JST T$INIT
182* DAC TRANS POINTER TO AFFINE TRANSFORMATION (SEE ABOVE)
183*
184*
185* T$SCLE: SCALE AFFINE TRANSFORMATION
186*
187* THIS SCALES THE MATRIX OF THE AFFINE TRANSFORMATION BY FACTOR SCALE.
188* CALLS M$SCLE INTERNALLY.
189*
190* JST T$SCLE
191* DAC TRANS TRANSFORMATION TO MODIFY
192* DAC SCALE SCALE FACTOR
193* DAC 0 FOR FORTRAN IV COMPATIBILITY
194*
195*
196* T$TRAN: ADD RELOCATION TO AFFINE TRANSFORMATION
197*
198* THE OFFSET VECTOR IS FIRST PROCESSED BY THE TRANSFORMATION.
199* THEN IT IS ADDED TO THE TRANSFORMATION'S TRANSLATION VECTOR.
200*
201* JST T$TRAN
202* DAC TRANS TRANSFORMATION TO MODIFY
203* DAC XOFF X OFFSET
204* DAC YOFF Y OFFSET
205* DAC 0 FOR FORTRAN IV COMPATIBILITY
206*
207*
208* T$ROT: ADD ROTATION TO AFFINE TRANSFORMATION
209*
210* ADDS ROTATION TO THE MATRIX OF THE AFFINE TRANSFORMATION.
211* CALLS M$$ROT INTERNALLY.
212*
213* JST T$ROT
214* DAC TRANS TRANSFORMATION TO MODIFY
215* DAC ANGLE ANGLE LIKE FOR M$ROT
216* DAC 0 FOR FORTRAN IV COMPATIBILITY
217*
218*
219* T$ROTI: ADD ROTATION TO AFFINE TRANSFORMATION
220* USES AN INTEGER ARGUMENT INSTEAD OF FLOATING POINT RADIANT.
221*
222* ADDS ROTATION TO THE MATRIX OF THE AFFINE TRANSFORMATION.
223* CALLS M$$ROTI INTERNALLY.
224*
225* JST T$ROTI
226* DAC TRANS TRANSFORMATION TO MODIFY
227* DAC ANGLE ANGLE LIKE FOR M$ROTI
228* DAC 0 FOR FORTRAN IV COMPATIBILITY
229*
230*
231* T$APII: APPLY AFFINE TRANSFORM TO PAIR OF INTEGERS AS VECTOR
232*
233* WORKS LIKE M$APII WHICH IS USED INTERNALLY.
234*
235* JST T$APII
236* DAC TRANS TRANSFORMATION TO USE
237* DAC XO X COORDINATE OF RESULT VECTOR
238* DAC XO Y COORDINATE OF RESULT VECTOR
239* DAC XI X COORDINATE OF ARGUMENT VECTOR
240* DAC YI Y COORDINATE OF ARGUMENT VECTOR
241* DAC 0 FOR FORTRAN IV COMPATIBILITY
242*
243*
244* T$APLI: APPLY AFFINE TRANSFORM TO VECTOR
245*
246* WORKS LIKE M$APL WHICH IS USED INTERNALLY.
247*
248* JST T$APLI
249* DAC TRANS
250* DAC TARGET POINTER TO TARGET VECTOR
251* DAC SOURCE POINTER TO INPUT VECTOR
252* DAC 0 FOR FORTRAN IV COMPATIBILITY
253*
254*
255*
8fac3a64 256********************************************************************************
257*
13f9c770 258**** EXPORTED SYMBOLS
259*
260 SUBR MATRIX,INIT JUST A FANCY LABEL
261 SUBR M$INIT,INIT INITIALISE MATRIX
8fac3a64 262 SUBR M$MUL,MUL MATRIX MULTIPLICATION
263 SUBR M$APLI,APLI APPLY MATRIX TO INTEGER VECTOR
264 SUBR M$APII,APII APPLY MATRIX TO PAIR OF INTEGERS
13f9c770 265 SUBR M$ROT,ROT ADD ROTATION TO MATRIX
eabafcca 266 SUBR M$ROTI,ROTI ADD ROTATION TO MATRIX
8fac3a64 267 SUBR M$SCLE,SCLE SCALE MATRIX
eabafcca 268 SUBR M$SCLI,SCLI SCALE MATRIX (INTEGER PERCENT)
8fac3a64 269*
eabafcca 270 SUBR T$INIT,AFIN INITIALISE AFFINE TRANSFORMATION
271 SUBR T$APLI,TPLI APPLY AFFINE TRANSFORM TO INTEGER VECTOR
272 SUBR T$APII,TPII APPLY AFFINE TRANSFORM TO PAIR OF INTEGERS
273 SUBR T$ROT,ROT ADD ROTATION TO AFFINE TRANSFORMATION
274 SUBR T$ROTI,ROTI ADD ROTATION TO AFFINE TRANSFORMATION
275 SUBR T$SCLE,SCLE SCALE AFFINE TRANSFORMATION
276 SUBR T$SCLI,SCLI SCALE AFFINE TRANSFORMATION (INTEGER PERCENT)
277 SUBR T$TRAN,TRAN ADD TRANSLATION TO AFFINE TRANSFORMATION
278*
13f9c770 279*
280********************************************************************************
281*
282*
283 REL RELOCATEABLE MODE
284*
285*
8fac3a64 286********************************************************************************
eabafcca 287*
288*
289*** T$TRAN - TRANSLATE
290*
291*
292* ABS
293* ORG '4000
294TRAN DAC ** ENTRY.
295 LDA* TRAN TRANSFORMATION POINTER
296 STA TPT
297 ADD =8
298 STA VECP
299 IRS TRAN
300*
301 LDA* TRAN X OFFSET
302 STA XOFP
303 IRS TRAN
304*
305 LDA* TRAN Y OFFSET
306 STA YOFP
307 IRS TRAN
308*
309 IRS TRAN FOR FORTRAN IV
310*
311 JST APII FIXME!
312TPT DAC **
313 DAC TMP3 STORE NEW X VALUE IN TMP3
314 DAC TMP4 STORE NEW Y VALUE IN TMP4
315XOFP DAC **
316YOFP DAC **
317 DAC 0 FOR FORTRAN IV COMPATIBILITY
318*
319 LDA* VECP
320 ADD TMP3
321 STA* VECP
322 IRS VECP
323 LDA* VECP
324 ADD TMP4
325 STA* VECP
326*
327 JMP* TRAN RETURN.
328*
329*
330********************************************************************************
331*
332*
333**** T$APLI - APPLY AFFINE TRANSFORMATION TO INTEGER VECTOR
334*
335* USED VARIABLES: ((TMP1) XOP,YOP,XP1,YP1,XP2,YP2),VECP
336*
337TPLI DAC ** ENTRY.
338*
339 LDA* TPLI LOAD POINTER TO TRANSFORMATION
340 STA MPT STORE TO MATRIX POINTER
341 ADD =8 FORWARD TO VECTOR ADDRESS IN TRANSFORMATION
342 STA VECP VECTOR ADDRESS
343 IRS TPLI
344*
345 LDA* TPLI POINTER TO RESULT VECTOR
346 STA IOV
347 IRS TPLI
348*
349 LDA* TPLI POINTER TO INPUT VECTOR
350 STA IIV
351 IRS TPLI
352*
353 IRS TPLI
354*
355 JST APLI APPLY MATRIX
356MPT DAC **
357IOV DAC **
358IIV DAC **
359*
360 LDA* IOV PERFORM VECTOR ADDITION
361 ADD* VECP
362 STA* IOV
363 IRS VECP
364 IRS IOV
365 LDA* IOV
366 ADD* VECP
367 STA* IOV
368*
369 JMP* TPLI
370*
371*
372********************************************************************************
373*
374*
375**** T$APII - APPLY AFFINE TRANSFORMATION TO PAIR OF INTEGERS
376*
377* USED VARIABLES: ((TMP1) XOP,YOP,XP1,YP1,XP2,YP2),VECP
378*
379*
380****************************************
381*
382TPII DAC ** ENTRY.
383*
384 LDA* TPII LOAD POINTER TO TRANSFORMATION
385 STA IMPT STORE TO MATRIX POINTER
386 ADD =8 FORWARD TO VECTOR ADDRESS IN TRANSFORMATION
387 STA VECP VECTOR ADDRESS
388 IRS TPII
389*
390 LDA* TPII POINTER TO RESULT X
391 STA RXP
392 IRS TPII
393*
394 LDA* TPII POINTER TO RESULT Y
395 STA RYP
396 IRS TPII
397*
398 LDA* TPII POINTER TO INPUT X
399 STA IXP
400 IRS TPII
401*
402 LDA* TPII POINTER TO INPUT Y
403 STA IYP
404 IRS TPII
405*
406 IRS TPII
407*
408 JST APII APPLY MATRIX
409IMPT DAC **
410RXP DAC **
411RYP DAC **
412IXP DAC **
413IYP DAC **
414 DAC 0
415*
416 LDA* VECP PERFORM THE ADDITION
417 ADD* RXP
418 STA* RXP
419 IRS VECP
420 LDA* VECP
421 ADD* RYP
422 STA* RYP
423*
424 JMP* TPII RETURN
425*
426*
427********************************************************************************
428*
13f9c770 429*
430**** INITIALIZE AFFINE TRANSFORMATION
431*
432AFIN DAC **
433 LDA* AFIN
434 STA AFI1 STORE ARGUMENT POINTER
435 LDX AFIN LOAD INTO INDEX REGISTER, TOO
436 IRS AFIN TALLY RETURN ADDRESS
437*
438 JST INIT MATRIX INIT
439AFI1 DAC **
440*
441 CRA
442 STA 8,1 CLEAR FIRST VECTOR ELEMENT
443 STA 9,1 CLEAR SECOND VECTOR ELEMENT
444*
445 JMP* AFIN RETURN TO CALLER
446*
447*
448********************************************************************************
449*
8fac3a64 450*
13f9c770 451**** INITIALIZE MATRIX
452*
453* THIS ROUTINE SHOULD BE IMPROVED BY SUPPLYING
454* A FLOATING POINT 1.0 CONSTANT!
455*
456****************************************
457*
8fac3a64 458INIT DAC **
13f9c770 459 LDX* INIT LOAD INDEX REGISTER WITH ADDRESS OF MATRIX
13f9c770 460 IRS INIT CORRECT RETURN ADDRESS
461*
462 CRA INITIALISE
eabafcca 463 STA 1,1 A11, LOWER BITS
13f9c770 464 STA 2,1 A12
465 STA 3,1
466 STA 4,1 A21
eabafcca 467 STA 5,1
468 STA 7,1 A22, LOWER BITS
469*
470 LDA ONEF FLOATING POINT 1.0 CONSTANT
471 STA 0,1 A11, UPPER BITS
472 STA 6,1 A22, UPPER BITS
473*
13f9c770 474 JMP* INIT RETURN.
475*
476*
8fac3a64 477********************************************************************************
13f9c770 478*
479*
480**** MATRIX MULTIPLICATION
481*
482* C = A * B
483*
484* | a11 a12 | | b11 b12 |
485* = | | * | |
486* | a21 a22 | | b21 b22 |
487*
488* | (a11*b11) (a21*b12) |
489* = | |
490* | (a12*b21) (a22*b22) |
491*
492* CALL:
493* JST MUL
494* DAC MC
495* DAC MA
496* DAC MB
8fac3a64 497*
13f9c770 498****************************************
499*
8fac3a64 500MUL DAC **
501 LDX* MUL
502*
503 LDA* MUL
504 STA PC11
505 ADD =2
506 STA PC12
507 ADD =2
508 STA PC21
509 ADD =2
510 STA PC22
511 IRS MUL
512*
513 LDA* MUL
514 STA PA11
515 ADD =2
516 STA PA12
517 ADD =2
518 STA PA21
519 ADD =2
520 STA PA22
521 ADD =2
522*
523 IRS MUL
524*
525 LDA* MUL
526 STA PB11
527 ADD =2
528 STA PB12
529 ADD =2
530 STA PB21
531 ADD =2
532 STA PB22
533 ADD =2
534*
535 IRS MUL
536 IRS MUL
537*
8fac3a64 538* a11 a12 b11 b12 a11*b11 a21*b12
539* a21 a22 b21 b22 a12*b21 a22*b22
540*
541 CALL L$22 LOAD REAL
542PA11 DAC 0
543 CALL M$22 MULTIPLY
544PB11 DAC 0
545 CALL H$22 STORE
546PC11 DEC 0
547*
548 CALL L$22
549PA21 DEC 0
550 CALL M$22
551PB12 DEC 0
552 CALL H$22
553PC12 DEC 0
554*
555 CALL L$22
556PA12 DEC 0
557 CALL M$22
558PB21 DEC 0
559 CALL H$22
560PC21 DEC 0
561*
562 CALL L$22
563PA22 DEC 0
564 CALL M$22
565PB22 DEC 0
566 CALL H$22
567PC22 DEC 0
568*
569*
13f9c770 570 JMP* MUL RETURN.
8fac3a64 571*
13f9c770 572*
8fac3a64 573********************************************************************************
574*
575*
13f9c770 576**** SCALE MATRIX
577*
8fac3a64 578SCLE DAC ** SCALE MATRIX
8fac3a64 579*
580 LDA* SCLE GET MATRIX BASE ADDRESS
581 STA SM11
582 STA TM11
eabafcca 583 ADD =2
584 STA SM12
585 STA TM12
586 ADD =2
587 STA SM21
588 STA TM21
589 ADD =2
8fac3a64 590 STA SM22
591 STA TM22
592 IRS SCLE
593 LDA* SCLE
eabafcca 594 STA S1
595 STA S2
596 STA S3
597 STA S4
8fac3a64 598 IRS SCLE TALLY RETURN ADDRESS
8eb88117 599 IRS SCLE AGAIN
8fac3a64 600*
601 CALL L$22
eabafcca 602SM11 DAC **
8fac3a64 603 CALL M$22
eabafcca 604S1 DAC **
8fac3a64 605 CALL H$22
eabafcca 606TM11 DAC **
8fac3a64 607*
608 CALL L$22
eabafcca 609SM12 DAC **
8fac3a64 610 CALL M$22
eabafcca 611S2 DAC **
8fac3a64 612 CALL H$22
eabafcca 613TM12 DAC **
614*
615 CALL L$22
616SM21 DAC **
617 CALL M$22
618S3 DAC **
619 CALL H$22
620TM21 DAC **
621*
622 CALL L$22
623SM22 DAC **
624 CALL M$22
625S4 DAC **
626 CALL H$22
627TM22 DAC **
8fac3a64 628*
629 JMP* SCLE
630*
631*
13f9c770 632********************************************************************************
633*
634*
990b21a1 635**** ADD ROTATION TO MATRIX
636*
637*
638* M = M * MROT
639*
640* | M11 M12 | | COS(X) -SIN(X)|
641* = | | * | |
642* | M21 M22 | | SIN( X) COS(X)|
13f9c770 643*
990b21a1 644* | M11*COS(X)+M12*SIN(X) M12*COS(X)-M11*SIN(X) |
645* = | |
646* | M21*COS(X)+M22*SIN(X) M22*COS(X)-M21*SIN(X) |
647*
648* CALL:
649* JST ROT
650* DAC MATRIX
651* DAC ANGLE
652* DAC 0 DON'T FORGET!
13f9c770 653*
654****************************************
655*
656ROT DAC ** ENTRY
990b21a1 657*
658 LDA* ROT GET MATRIX POINTER
659 STA R111 M11, FIRST COPY
660 STA R211 M11, SECOND COPY
8eb88117 661 STA R311 M11, THIRD COPY
990b21a1 662 ADD =2
663 STA R112
664 STA R212
8eb88117 665 STA R312
666 STA R412
990b21a1 667 ADD =2
668 STA R121
669 STA R221
8eb88117 670 STA R321
990b21a1 671 ADD =2
672 STA R122
673 STA R222
8eb88117 674 STA R322
990b21a1 675 IRS ROT
8eb88117 676 LDA* ROT
990b21a1 677 STA RA1
678 STA RA2
679 IRS ROT
680 IRS ROT
681*
682*
8eb88117 683**** M11 CALCULATION
684*
685 CALL SIN FLOATING POINT SINE
990b21a1 686RA1 DAC ** POINTER TO ANGLE
990b21a1 687 CALL H$22 SAVE TO TMP1
688 DAC TMP1
8eb88117 689* CALL L$22
690* DAC TMP1
990b21a1 691 CALL M$22 MULTIPLY
692R112 DAC ** M12
693 CALL H$22 STORE TO TMP3
694 DAC TMP3
8eb88117 695*
696*************************************
697*
698 CALL COS FLOATING POINT COSINE
699RA2 DAC ** POINTER TO ANGLE
990b21a1 700 CALL H$22 SAVE TO TMP2
701 DAC TMP2
702 CALL M$22 MULTIPLY
703R111 DAC ** M11
704 CALL A$22 ADD TMP3
705 DAC TMP3
706 CALL H$22 SAVE NEW M11 TO TMP3
707 DAC TMP3
708*
8eb88117 709*
710* M12 CALCULATION
711*
712* M12 = M12*COS(X)-M11*SIN(X)
713*
714*
990b21a1 715 CALL L$22 LOAD SINE
716 DAC TMP1
717 CALL M$22 MULTIPLY
8eb88117 718R211 DAC ** M11
990b21a1 719 CALL H$22 STORE TO TMP4
720 DAC TMP4
721 CALL L$22 LOAD COSINE
8eb88117 722 DAC TMP2
990b21a1 723 CALL M$22 MULTIPLY
8eb88117 724R212 DAC **
725*
726 CALL S$22 SUBSTRACT !!
990b21a1 727 DAC TMP4
8eb88117 728*
990b21a1 729 CALL H$22 SAVE TO NEW M12
730R312 DAC **
8eb88117 731*
732 CALL L$22 LOAD NEW M11 FROM TMP3
733 DAC TMP3
990b21a1 734 CALL H$22 AND SAVE TO NEW M11
735R311 DAC **
13f9c770 736*
737*
8eb88117 738* ******************************************
739*
740* M21 CALCULATION
741*
742* M21*COS(X)+M22*SIN(X)
743*
744* M22*SIN(X) -> TMP3
745* M21*COS(X) - TMP3
746*
747*
748*
990b21a1 749 CALL L$22 LOAD SINE
8eb88117 750 DAC TMP1
990b21a1 751 CALL M$22 MULTIPLY
8eb88117 752R122 DAC ** M22
990b21a1 753 CALL H$22 STORE TO TMP3
754 DAC TMP3
8eb88117 755 CALL L$22 LOAD COSINE
990b21a1 756 DAC TMP2
757 CALL M$22 MULTIPLY
758R121 DAC ** M11
759 CALL A$22 ADD TMP3
760 DAC TMP3
8eb88117 761 CALL H$22 SAVE NEW M21 TO TMP3
990b21a1 762 DAC TMP3
8eb88117 763*
764* M22 CALCULATION
765*
766* M22*COS(X)-M21*SIN(X)
767*
990b21a1 768*
8eb88117 769* JMP NN
990b21a1 770 CALL L$22 LOAD SINE
771 DAC TMP1
772 CALL M$22 MULTIPLY
8eb88117 773R221 DAC ** M21
990b21a1 774 CALL H$22 STORE TO TMP4
775 DAC TMP4
776 CALL L$22 LOAD COSINE
8eb88117 777 DAC TMP2
990b21a1 778 CALL M$22 MULTIPLY
8eb88117 779R222 DAC **
990b21a1 780 CALL S$22 SUBSTRACT
781 DAC TMP4
8eb88117 782 CALL H$22 SAVE TO NEW M22
990b21a1 783R322 DAC **
8eb88117 784 CALL L$22 LOAD NEW M21 FROM TMP3
785 DAC TMP3
786 CALL H$22 AND SAVE TO NEW M21
990b21a1 787R321 DAC **
788*
8eb88117 789*
990b21a1 790 JMP* ROT RETURN.
8eb88117 791*
792R412 DAC **
990b21a1 793*
8fac3a64 794********************************************************************************
795*
796*
13f9c770 797**** APPLY MATRIX TO PAIR OF INTEGERS
8fac3a64 798*
13f9c770 799* SETS UP MATRIX POINTERS AND VECTOR POINTERS.
800* THEN IT CALLS APL, THE REAL WORKING ROUTINE.
801*
802* CALL:
803* JST M$APII
804* DAC MATRIX
eabafcca 805* DAC XO
806* DAC YO
807* DAC XI
808* DAC YI
13f9c770 809* DAC 0 DON'T FORGET!
810*
eabafcca 811* USED VARIABLES: (TMP1) XOP,YOP,XP1,YP1,XP2,YP2
812*
13f9c770 813****************************************
8fac3a64 814*
815APII DAC **
816*
8eb88117 817 LDA* APII POINTER TO MATRIX
818 STA MP11 STORE M11
819 ADD =2 ADD 2
820 STA MP12 STORE M12
821 ADD =2 ADD 2
822 STA MP21 STORE M21
823 ADD =2 ADD 2
824 STA MP22 STORE M22
825 IRS APII JUMP TO NEXT ARGUMENT (X)
826*
827 LDA* APII LOAD X VALUE
eabafcca 828 STA XOP STORE TO X-POINTER
829 IRS APII JUMP TO NEXT ARGUMENT (Y)
830 LDA* APII LOAD Y VALUE
831 STA YOP STORE TO Y-POINTER
832 IRS APII CORRECT RETURN ADDRESS
833*
834 LDA* APII LOAD X VALUE
835 STA XIP1 STORE TO X-POINTER
836 STA XIP2 STORE TO X-POINTER
8eb88117 837 IRS APII JUMP TO NEXT ARGUMENT (Y)
838 LDA* APII LOAD Y VALUE
eabafcca 839 STA YIP1 STORE TO Y-POINTER
840 STA YIP2 STORE TO Y-POINTER
8eb88117 841 IRS APII CORRECT RETURN ADDRESS
eabafcca 842*
8eb88117 843 IRS APII FOR FORTRANIV COMPATIBILITY
8fac3a64 844 JST APL CALL REAL ROUTINE
845 JMP* APII
846*
847********************************************************************************
848*
849*
13f9c770 850**** APPLY MATRIX TO VECTOR
851*
852* SETS UP MATRIX POINTERS AND VECTOR POINTERS. THEN IT CALLS APL,
853* THE REAL WORKING ROUTINE.
8fac3a64 854*
13f9c770 855* CALL:
856* JST M$APLI
857* DAC MATRIX
eabafcca 858* DAC TARGET
859* DAC SOURCE
13f9c770 860* DAC 0 DON'T FORGET!
861*
eabafcca 862* USED VARIABLES: (TMP1) XOP,YOP,XP1,YP1,XP2,YP2
863*
13f9c770 864****************************************
8fac3a64 865*
866APLI DAC **
13f9c770 867*
8fac3a64 868 LDA* APLI
869 STA MP11
870 ADD =2
871 STA MP12
872 ADD =2
873 STA MP21
874 ADD =2
875 STA MP22
876 IRS APLI
877*
878 LDA* APLI
eabafcca 879 STA XOP
8fac3a64 880 AOA
eabafcca 881 STA YOP
8fac3a64 882 IRS APLI
eabafcca 883*
884 LDA* APLI
885 STA XIP1
886 STA XIP2
887 AOA
888 STA YIP1
889 STA YIP2
890 IRS APLI
891*
8fac3a64 892 IRS APLI
13f9c770 893 JST APL CALL INTERNAL ROUTINE
894 JMP* APLI RETURN.
8fac3a64 895*
896*
13f9c770 897********************************************************************************
8fac3a64 898*
899*
13f9c770 900**** INTERNAL ROUTINE OF M$APL AND M$APII.
901*
902* ALL DATA IS SET UP BY THE BOTH USER ROUTINES ABOVE.
903*
eabafcca 904* USED VARIABLES: TMP1
905*
13f9c770 906****************************************
907*
908APL DAC **
8fac3a64 909*
910 CALL FLOAT LOAD SINGLE PRECISION FLOAT FROM 1-WORD INTEGER
eabafcca 911XIP1 DAC 0
8fac3a64 912 CALL M$22 MULTIPLY FLOAT*FLOAT
913MP11 DAC 0
914 CALL H$22 STORE FLOAT
990b21a1 915 DAC TMP1
8fac3a64 916 CALL FLOAT
eabafcca 917YIP1 DAC 0
8fac3a64 918 CALL M$22
919MP12 DAC 0
920 CALL A$22
990b21a1 921 DAC TMP1
8fac3a64 922 JST RND ROUND AND CONVERT TO INTEGER
923 STA PA21 STORE NEW X VALUE INTO TEMPORARY LOCATION
924****
925 CALL FLOAT
eabafcca 926XIP2 DAC 0
8fac3a64 927 CALL M$22
928MP21 DAC 0
929 CALL H$22
990b21a1 930 DAC TMP1
8fac3a64 931*
932 CALL FLOAT
eabafcca 933YIP2 DAC 0
8fac3a64 934 CALL M$22
935MP22 DAC 0
936 CALL A$22
990b21a1 937 DAC TMP1
8fac3a64 938 JST RND NOW INTEGER IN AC
eabafcca 939 STA* YOP STORE NEW Y VALUE
8fac3a64 940*
941 LDA PA21
eabafcca 942 STA* XOP
943*
8fac3a64 944 JMP* APL RETURN TO CALLER.
945*
13f9c770 946*
947********************************************************************************
eabafcca 948*
949*
950**** M$ROTI ROTATE MATRIX, USE INTEGER DEGREE ANGLE
951*
952ROTI DAC **
953 LDA* ROTI GET MATRIX POINTER
954 STA MTA STORE TO ARGUMENT TO FINAL ROT
955 IRS ROTI NEXT ARGUMENT: ANGLE
956 LDA* ROTI LOAD ANGLE
957 IRS ROTI
958 IRS ROTI
959 JST RAD CONVERT INTEGER TO RADIANT
960 CALL H$22
961 DAC RTMP
962 JST ROT
963MTA DAC **
964 DAC RTMP
965 DAC 0
966 JMP* ROTI
967*
968RTMP BSS 2 TEMPORARY VARIABLE
969*
970*
971********************************************************************************
972*
973*
974**** M$SCLI - SCALE MATRIX, USE INTEGER PERCENT VALUE
975*
976SCLI DAC **
977 LDA* SCLI GET MATRIX POINTER
978 STA MTSS STORE TO ARGUMENT TO FINAL ROT
979 IRS SCLI NEXT ARGUMENT: PERCENTS
980*
981 LDA* SCLI LOAD PERCENTS
982 STA SA1 STORE
983 CALL FLOAT CONVERT TO FLOAT
984SA1 DAC **
985 CALL M$22 MULTIPLY WITH
986 DAC PERC FACTOR 0.01
987 IRS SCLI
988 IRS SCLI
989 CALL H$22
990 DAC RTMP
991*
992 JST SCLE
993MTSS DAC **
994 DAC RTMP
995 DAC 0
996*
997 JMP* SCLI RETURN
998*
999*
1000********************************************************************************
8fac3a64 1001*
13f9c770 1002*
1003**** ROUND FLOAT TO INTEGER ROUTINE
1004*
1005* THERE IS NO CORRECTLY WORKING ROUNDING ROUTINE IN THE LIBRARY.
1006* SO THIS IS A WORKAROUND. ADDS 0.5 TO THE VALUE AND USES ONE
1007* ONE OF THE TRUNCATE AND CONVERT ROUTINES.
1008* THE ARGUMENT IS IN REGISTERS A/B, THE RESULT IS PUT INTO A.
1009*
1010****************************************
1011*
1012RND DAC **
1013 CALL A$22 ADD
1014 DAC HLF 0.5
1015 CALL C$21 TRUNCATE TO INTEGER
8fac3a64 1016 NOP
1017 JMP* RND
13f9c770 1018*
1019*
1020********************************************************************************
1021*
1022*
eabafcca 1023**** RAD - CONVERT ANGLE IN DEGREE TO RADIANT.
1024*
1025* ENTER WITH INTEGER ANGLE IN A
1026*
1027* CALL:
1028*
1029* JST RAD
1030* DAC ANGLE POINTER TO ANGLE
1031*
1032****************************************
1033*
1034RAD DAC **
1035 STA AN1
1036 CALL FLOAT
1037AN1 DAC **
1038 CALL M$22
1039 DAC DEG
1040 JMP* RAD
1041*
1042*
1043********************************************************************************
1044*
1045*
13f9c770 1046**** CONSTANTS
1047*
1048ONE DEC 1
8fac3a64 1049HLF OCT '040100 CONSTANT 0.5
1050 OCT '000000
eabafcca 1051ONEF OCT '040300 CONSTANT 1.0
1052 OCT '000000
1053DEG OCT '036707 CONSTANT PI/180
1054 OCT '076432
1055PERC OCT '036521 CONTANT 0.01
1056 OCT '165605
13f9c770 1057*
1058*
8fac3a64 1059********************************************************************************
13f9c770 1060*
eabafcca 1061*
13f9c770 1062**** VARIABLES
1063*
990b21a1 1064TMP1 BSS '2 TEMPORARY 2-WORD VARIABLE
1065TMP2 BSS '2 " " "
1066TMP3 BSS '2 " " "
eabafcca 1067TMP4 BSS '2 " " "
1068VAP DAC ** TEMPORARY POINTER TO VECTOR
1069XOP DAC ** OUTPUT VECTOR X POINTER
1070YOP DAC ** OUTPUT VECTOR Y POINTER
1071*VECP DAC ** VECTOR POINTER USED BY T$PII,T$PLI
1072VECP EQU TMP2 VECTOR POINTER USED BY T$PII,T$PLI
1073*
8fac3a64 1074*
1075********************************************************************************
1076*
13f9c770 1077*
1078**** END OF THE LINE
1079*
8fac3a64 1080 END
1081*
13f9c770 1082*
8fac3a64 1083********************************************************************************