8fac3a64 |
1 | * (PL$MV) REV 1.0 INCREMENTAL PLOTTER ROUTINES |
2 | * |
3 | * |
4 | * PROGRAM TITLE: |
5 | * PL$MV (PL$MV,PL$RST,PL$LN,PL$X,PL$Y,PL$RMR) |
6 | * |
7 | * PLOTTER MOVEMENT ROUTINES |
8 | * |
9 | * |
10 | * REVISIONS: |
11 | * 1.0 (2007-05-28) - INITIAL REVISION |
12 | * |
13 | * 1.1 (2007-11-08) - ADDED INTELLIGENT LINE DRAWING ROUTINE |
14 | * |
15 | * 1.2 (2007-12-15) - ADDED PL$X and PL$Y POSITION EXPORTS |
16 | * ADDED PL$RMR TRANSLATIION ROUTINE |
17 | * |
18 | * 1.3 (2007-12-19) - ADDED TRANSFORMATION MATRIX SUPPORT TO PL$MV. |
19 | * MATRIX PL$MAT IS NOW APPLIED BEFORE |
20 | * ANY MOVE INSTRUCTION. |
21 | * |
22 | * |
23 | * AUTHOR: |
24 | * |
25 | * PHILIPP HACHTMANN |
26 | * |
27 | * |
28 | * PURPOSE: |
29 | * |
eabafcca |
30 | * PROVIDE DRAWING AND COORDINATE TRANSFORMATION |
31 | * ROUTINES FOR INCREMENTAL PLOTTERS |
8fac3a64 |
32 | * |
33 | * |
34 | * STORAGE: |
35 | * |
36 | * ??? (OCTAL) |
37 | * ??? (DECIMAL) |
38 | * |
39 | * |
40 | * USAGE |
41 | * |
42 | * CALL PL$RST - SET VIRTUAL PLOT POSITION TO ZERO |
43 | * |
44 | * CALL PL$MV - MOVE TO POINT SPECIFIED |
45 | * DAC XN BY XN |
46 | * DAC YN AND YN VALUE |
47 | * DAC 0 |
48 | * |
49 | * CALL PL$LN - DRAW LINE AND LEAVE PEN DOWN |
50 | * DAC X1 |
51 | * DAC Y1 |
52 | * DAC X2 |
53 | * DAC Y2 |
54 | * DAC 0 |
55 | * |
56 | * CALL PL$RMR - MOVE ORIGIN RELATIVELY |
57 | * DAC DX |
58 | * DAC DY |
59 | * DAC 0 |
60 | * |
61 | * CALL PL$SCL - SCALE TRANSFORMATION |
62 | * DAC SCALE SCALE FACTOR, FLOAT |
63 | * DAC 0 |
64 | * |
65 | * CALL PL$IDN - RESET TRANSFORMATION MATRIX |
66 | * |
67 | ******************************************************************************** |
68 | * |
69 | * |
70 | SUBR PL$MV,MOVE |
eabafcca |
71 | SUBR PL$MVR,MVR |
8fac3a64 |
72 | SUBR PL$RST,RST |
73 | SUBR PL$LN,LINE |
74 | SUBR PL$RMR,RMR |
eabafcca |
75 | SUBR PL$X,UX |
76 | SUBR PL$Y,UY |
77 | SUBR PL$MAT,ATRA |
8fac3a64 |
78 | SUBR PL$SCL,SCLE |
eabafcca |
79 | SUBR PL$SCI,SCLI |
8eb88117 |
80 | SUBR PL$ROT,ROT |
eabafcca |
81 | SUBR PL$ROI,ROTI |
82 | SUBR PL$PUS,PUSH |
83 | SUBR PL$POP,POP |
84 | SUBR PL$INI,INIT |
8fac3a64 |
85 | * |
86 | * |
87 | * |
88 | REL THIS IS A RELOCATABLE OBJECT |
89 | ORG '0 |
90 | * |
eabafcca |
91 | * |
8fac3a64 |
92 | ******************************************************************************** |
eabafcca |
93 | * |
94 | **** PL$MVR - MOVE PEN RELATIVELY |
95 | * |
96 | MVR DAC ** |
97 | * |
98 | LDA* MVR |
99 | STA TMPX |
100 | IRS MVR |
101 | LDA* MVR |
102 | STA TMPY |
103 | IRS MVR |
104 | * |
105 | LDA* TMPX |
106 | * CALL OCT |
107 | ADD XU |
108 | STA XU |
109 | * |
110 | LDA* TMPY |
111 | * CALL OCT |
112 | ADD YU |
113 | STA YU |
114 | * |
115 | IRS RELA SET FLAG |
116 | NOP |
117 | IRS MVR |
118 | JMP* MVR RETURN |
119 | * |
120 | * |
121 | * |
122 | **** PL$INI - GRAPHICS INITIALISATION |
123 | * |
124 | * THIS ROUTINE SETS THE HARDWARE ORIGIN TO THE CURRENT PlOTTER POSITION. |
125 | * IT ALSO INITIALISES THE TRANSFORMATION. |
126 | * |
127 | **************************************** |
128 | * |
129 | INIT DAC ** |
130 | CRA |
131 | STA XU |
132 | STA YU |
133 | STA X |
134 | STA Y |
135 | STA RELA |
136 | CALL T$INIT |
137 | DAC ATRA |
138 | JMP* INIT |
139 | * |
140 | * |
141 | **** PL$PUS - PUSH GRAPHIC CONTEXT ONTO THE STACK |
142 | * |
143 | PUSH DAC ** ENTRY |
144 | LDA* PUSH |
145 | STA SD1 |
146 | IRS PUSH |
147 | CALL S$PUSM PUSH MEMORY ROUTINE |
148 | SD1 DAC ** |
149 | DAC ATRA |
150 | DEC 12 12 WORDS OF DATA. |
151 | JMP* PUSH |
152 | * |
153 | * |
154 | ******************************************************************************** |
155 | * |
156 | * |
157 | **** PL$POP - POP GRAPHIC CONTEXT FROM THE STACK |
158 | * |
159 | POP DAC ** ENTRY |
160 | LDA* POP |
161 | STA SD2 |
162 | IRS POP |
163 | CALL S$POPM POP MEMORY ROUTINE |
164 | SD2 DAC ** |
165 | DAC ATRA |
166 | DEC 12 12 WORDS OF DATA. |
167 | JMP* POP |
168 | * |
169 | * |
170 | * ******************************************************************************* |
8fac3a64 |
171 | * |
eabafcca |
172 | * |
173 | **** PL$LN - DRAW A LINE |
174 | * |
175 | LINE DAC 0 DRAW A LINE FROM NEAREST STARTING POINT |
8fac3a64 |
176 | LDA* LINE X1 |
eabafcca |
177 | STA X1P |
8eb88117 |
178 | IRS LINE |
eabafcca |
179 | LDA* LINE Y1 |
180 | STA Y1P |
8fac3a64 |
181 | IRS LINE |
182 | LDA* LINE X2 |
eabafcca |
183 | STA X2P |
8fac3a64 |
184 | IRS LINE |
185 | LDA* LINE Y2 |
eabafcca |
186 | STA Y2P |
8fac3a64 |
187 | IRS LINE TALLY RETURN ADDRESS |
8fac3a64 |
188 | IRS LINE AGAIN FOR FORTRAN IV COMPATIBILITY |
eabafcca |
189 | * |
190 | CALL T$APII APPLY MATRIX |
191 | DAC ATRA |
8eb88117 |
192 | DAC X1 |
eabafcca |
193 | DAC Y1 |
194 | X1P DAC ** |
195 | Y1P DAC ** |
8fac3a64 |
196 | DAC 0 |
eabafcca |
197 | * |
198 | CALL T$APII APPLY MATRIX |
199 | DAC ATRA |
8eb88117 |
200 | DAC X2 |
eabafcca |
201 | DAC Y2 |
202 | X2P DAC ** |
203 | Y2P DAC ** |
8fac3a64 |
204 | DAC 0 |
8eb88117 |
205 | * |
206 | * |
8fac3a64 |
207 | LDA X |
8eb88117 |
208 | SUB X1 |
8fac3a64 |
209 | SPL SKIP IF SIGN PLUS |
210 | TCA TWO'S COMPLEMENT IF NEEDED |
211 | STA D1 |
212 | LDA Y |
8eb88117 |
213 | SUB Y1 |
8fac3a64 |
214 | SPL |
215 | TCA |
216 | ADD D1 |
217 | STA D1 |
218 | * |
219 | LDA X |
8eb88117 |
220 | SUB X2 |
8fac3a64 |
221 | SPL SKIP IF SIGN PLUS |
222 | TCA TWO'S COMPLEMENT IF NEEDED |
223 | STA D2 |
224 | LDA Y |
8eb88117 |
225 | SUB Y2 |
8fac3a64 |
226 | SPL |
227 | TCA |
228 | ADD D2 |
229 | CAS D1 |
230 | JMP D2BG D2 IS BIGGER! |
231 | NOP |
232 | * |
8eb88117 |
233 | D1BG LDA X2 DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2 |
8fac3a64 |
234 | STA XA |
8eb88117 |
235 | LDA Y2 |
8fac3a64 |
236 | STA YA |
8eb88117 |
237 | LDA X1 |
8fac3a64 |
238 | STA XB |
8eb88117 |
239 | LDA Y1 |
8fac3a64 |
240 | STA YB |
241 | JMP WOKI WORK! |
242 | * |
8eb88117 |
243 | D2BG LDA X1 DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1 |
8fac3a64 |
244 | STA XA |
8eb88117 |
245 | LDA Y1 |
8fac3a64 |
246 | STA YA |
8eb88117 |
247 | LDA X2 |
8fac3a64 |
248 | STA XB |
8eb88117 |
249 | LDA Y2 |
8fac3a64 |
250 | STA YB |
251 | * |
252 | WOKI LDA X TEST IF STARTING POINT IST CURRENT POSITION |
253 | CAS XA |
254 | JMP MV1 |
255 | JMP *+2 |
256 | JMP MV1 |
257 | LDA Y |
258 | CAS YA |
259 | JMP MV1 |
260 | JMP *+2 |
261 | JMP MV1 |
262 | JMP NM1 |
263 | * |
264 | MV1 CALL PL$PU MOVE TO THE STARTING POSITION |
265 | LDA XA |
266 | STA XN |
267 | LDA YA |
268 | STA YN |
269 | JST RMOV REAL MOVE |
270 | * |
271 | NM1 CALL PL$PD WE ARE AT BEGINNING OF LINE |
272 | LDA XB |
273 | STA XN |
274 | LDA YB |
275 | STA YN |
276 | JST RMOV REAL MOVE |
277 | JMP* LINE END OF THE LINE :-) |
278 | * |
eabafcca |
279 | * |
8fac3a64 |
280 | ******************************************************************************** |
281 | * |
eabafcca |
282 | **** MAKE CURRENT X AND Y THE ORIGIN |
8eb88117 |
283 | * |
eabafcca |
284 | RST DAC ** |
285 | * |
286 | **** FIRST TRANSLATE THE CURRENT USER POSITION: |
287 | CALL T$TRAN |
288 | DAC ATRA |
289 | DAC XU |
290 | DAC YU |
291 | DAC 0 |
8fac3a64 |
292 | CRA |
eabafcca |
293 | STA XU |
294 | STA YU |
295 | * |
8fac3a64 |
296 | JMP* RST |
297 | * |
eabafcca |
298 | * |
299 | ******************************************************************************** |
300 | * |
301 | * |
302 | **** PL$MV - BASIC MOVE ROUTINE |
303 | * |
8fac3a64 |
304 | MOVE DAC ** MOVE YA! |
305 | * |
8fac3a64 |
306 | LDX MOVE GET PARAMETERS |
307 | LDA* 0,1 X VALUE |
eabafcca |
308 | STA XU |
8fac3a64 |
309 | STA XN |
310 | LDA* 1,1 Y VALUE |
eabafcca |
311 | STA YU |
8fac3a64 |
312 | STA YN |
313 | LDA MOVE |
314 | ADD =3 |
315 | STA MOVE CORRECT RETURN ADDRESS |
316 | * |
eabafcca |
317 | CALL T$APII APPLY TRANSFORMATION MATRIX TO POSITION |
318 | DAC ATRA |
8fac3a64 |
319 | DAC XN |
eabafcca |
320 | DAC YN |
321 | DAC XN |
322 | DAC YN |
8fac3a64 |
323 | DAC 0 |
324 | * |
325 | JST RMOV CALL INTO REAL MOVE SUBROUTINE |
326 | JMP* MOVE RETURN |
327 | * |
328 | **************************************** |
329 | * |
330 | RMOV DAC ** REAL MOVE SUBROUTINE |
331 | LDA XN |
332 | SUB X |
333 | STA DX |
334 | LDA YN |
335 | SUB Y |
336 | STA DY |
337 | * |
338 | LDA DX |
339 | SMI |
340 | JMP DXP DX POSITIVE |
341 | * DX NEGATIVE |
342 | TCA |
343 | STA DX NOW, DX IS POSITIVE! |
344 | LDA ML |
345 | STA STPX |
346 | LDA MUL |
347 | STA DIYP |
348 | LDA MDL |
349 | STA DIYN |
350 | JMP DXNP |
351 | DXP LDA MR |
352 | STA STPX |
353 | LDA MUR |
354 | STA DIYP |
355 | LDA MDR |
356 | STA DIYN |
357 | JMP DXNP |
358 | * |
359 | DXNP LDA DY |
360 | SMI |
361 | JMP DYP DY POSITIVE |
362 | * DY NEGATIVE |
363 | TCA |
364 | STA DY NOW, DY IS POSITIVE! |
365 | LDA MD |
366 | STA STPY |
367 | LDA DIYN |
368 | STA STPD |
369 | JMP DYNP |
370 | DYP LDA MU |
371 | STA STPY |
372 | LDA DIYP |
373 | STA STPD |
374 | * |
375 | DYNP LDA DX |
376 | CAS DY |
377 | JMP XGTY DX GREATER DY |
378 | YGTX NOP DY GREATER OR EQUAL DX |
379 | LDA STPY |
380 | STA STPL |
381 | LDA STPX |
382 | STA STPS |
383 | LDA DX |
384 | STA DS |
eabafcca |
385 | STA DS0 |
8fac3a64 |
386 | LDA DY |
387 | STA DL |
eabafcca |
388 | STA DL0 |
8fac3a64 |
389 | JMP GTE |
390 | * |
391 | XGTY LDA STPY |
392 | STA STPS |
393 | LDA STPX |
394 | STA STPL |
395 | LDA DX |
396 | STA DL |
eabafcca |
397 | STA DL0 |
8fac3a64 |
398 | LDA DY |
eabafcca |
399 | STA DS |
400 | STA DS0 |
401 | * |
402 | **************************************** |
403 | * |
404 | * NOW ALL STEP ROUTINES, DL0, DS0, DL0, DS0 ETC. |
405 | * ARE READY TO USE. |
406 | * |
407 | GTE LDA DL0 LONG DISTANCE |
8fac3a64 |
408 | LGR 1 DIVIDE BY TWO |
409 | STA ERR INITIALIZE ERROR COUNTER |
410 | * |
411 | * |
eabafcca |
412 | *** MOVE LOOP |
413 | * |
414 | LOOP LDA DL LONG DISTANCE |
8fac3a64 |
415 | SNZ |
416 | JMP FNSH END OF WORK - HOPE SO.... |
eabafcca |
417 | * |
418 | SUB =1 DECREMENT LONG DISTANCE |
8fac3a64 |
419 | STA DL |
eabafcca |
420 | * |
421 | LDA ERR ERROR COUNTER |
422 | SUB DS0 |
8fac3a64 |
423 | STA ERR |
424 | SMI SKIP IF NOT OVERFLOWN (MINUS) |
425 | JMP NDIA NO DIAG STEP |
eabafcca |
426 | * |
427 | *** DIAG STEP TO DO |
428 | * |
429 | ADD DL0 |
8fac3a64 |
430 | STA ERR |
431 | LDA DS |
432 | SUB =1 |
433 | STA DS |
eabafcca |
434 | JST* STPD DO DIAGONAL STEP |
435 | JMP LOOP RELOOP |
436 | * |
437 | *** NO DIAGONAL STEP TO DO |
438 | * |
439 | NDIA JST* STPL DO LONG DIRECTION STEP |
8fac3a64 |
440 | STEN JMP LOOP RELOOP |
441 | * |
eabafcca |
442 | * |
443 | *** END OF LOOP |
8fac3a64 |
444 | FNSH LDA XN |
445 | STA X |
446 | LDA YN |
447 | STA Y |
448 | JMP* RMOV END OF THE ROUTINE |
449 | * |
450 | * |
451 | ******************************************************************************** |
452 | * |
453 | * |
eabafcca |
454 | **** SCALE OUTPUT |
8fac3a64 |
455 | * |
456 | SCLE DAC ** |
457 | LDA* SCLE |
458 | STA FCTR |
459 | IRS SCLE |
eabafcca |
460 | CALL T$SCLE |
461 | DAC ATRA |
8fac3a64 |
462 | FCTR DAC 0 |
8eb88117 |
463 | DAC 0 |
464 | JMP* SCLE |
465 | * |
466 | * |
eabafcca |
467 | ******************************************************************************** |
8eb88117 |
468 | * |
469 | * |
eabafcca |
470 | **** ROTATE - RADIANT |
471 | * |
8eb88117 |
472 | ROT DAC ** |
473 | LDA* ROT |
474 | STA FCR2 |
475 | IRS ROT |
eabafcca |
476 | CALL T$ROT |
477 | DAC ATRA |
8eb88117 |
478 | FCR2 DAC 0 |
479 | DAC 0 |
480 | JMP* ROT |
8fac3a64 |
481 | * |
482 | * |
483 | ******************************************************************************** |
eabafcca |
484 | * |
485 | * |
486 | **** RLUP - UPDATE LATENT POSITION TO REAL POSITION |
487 | * |
488 | RLUP DAC ** |
489 | LDA RELA LOAD FLAG |
490 | SNZ |
491 | JMP* RLUP NOTHING TO DO |
492 | JST MOVE |
493 | DAC XU |
494 | DAC YU |
495 | DAC 0 |
496 | CRA |
497 | STA RELA CLEAR FLAG |
498 | JMP* RLUP |
499 | * |
500 | * |
501 | ******************************************************************************** |
502 | * |
503 | * |
504 | **** ROTATE - INTEGER DEGREES |
505 | * |
506 | ROTI DAC ** |
507 | LDA* ROTI |
508 | STA FCR3 |
509 | IRS ROTI |
510 | CALL T$ROTI |
511 | DAC ATRA |
512 | FCR3 DAC 0 |
513 | DAC 0 |
514 | JMP* ROTI |
515 | * |
516 | * |
517 | ******************************************************************************** |
518 | * |
519 | * |
520 | **** SCALE - INTEGER PERCENTS |
521 | * |
522 | SCLI DAC ** |
523 | LDA* SCLI |
524 | STA FCR4 |
525 | IRS SCLI |
526 | * |
527 | CALL T$SCLI |
528 | DAC ATRA |
529 | FCR4 DAC 0 |
530 | DAC 0 |
531 | JMP* SCLI |
532 | * |
533 | ******************************************************************************** |
8fac3a64 |
534 | * |
535 | *** MOVE COORDINATE SYSTEM RELATIVELY |
536 | * |
537 | RMR DAC ** |
538 | LDA* RMR |
eabafcca |
539 | STA XTR |
8fac3a64 |
540 | IRS RMR |
541 | LDA* RMR |
eabafcca |
542 | STA YTR |
8fac3a64 |
543 | IRS RMR |
544 | IRS RMR |
eabafcca |
545 | * |
546 | CALL T$TRAN |
547 | DAC ATRA |
548 | XTR DAC ** |
549 | YTR DAC ** |
550 | DAC 0 |
551 | * |
8fac3a64 |
552 | JMP* RMR |
8fac3a64 |
553 | * |
eabafcca |
554 | * |
8fac3a64 |
555 | ********************** |
556 | * |
557 | * VARIABLES |
558 | * |
eabafcca |
559 | X DEC 0 HARDWARE VIEW PEN POSITION, X VALUE |
560 | Y DEC 0 HARDWARE VIEW PEN POSITION, Y VALUE |
8fac3a64 |
561 | XN DEC 0 NEW PEN POSITION, X VALUE |
562 | YN DEC 0 NEW PEN POSITION, Y VALUE |
563 | DX DEC 0 X DIFFERENCE TO GO |
564 | DY DEC 0 Y DIFFERENCE TO GO |
eabafcca |
565 | TMPX DEC 0 TEMPORARY X VALUE |
566 | TMPY DEC 0 TEMPORARY Y VALUE |
8fac3a64 |
567 | * |
eabafcca |
568 | DL0 DEC 0 INITIAL LONG DISTANCE |
569 | DS0 DEC 0 INITIAL SHORT DISTANCE |
570 | DL DEC 0 LONG DISTANCE |
571 | DS DEC 0 SHORT DISTANCE |
8fac3a64 |
572 | STPL DAC ** ROUTINE TO LONG DISTANCE STEP |
573 | STPS DAC ** ROUTINE TO SHORT DISTANCE STEP |
574 | STPD DAC ** ROUTINE TO DIAGONAL STEP |
575 | ERR DEC 0 ERROR COUNTER |
576 | * |
577 | STPX DAC ** X STEP ROUTINE |
578 | STPY DAC ** Y STEP ROUTINE |
579 | DIYP DAC ** DIAGONAL X-DIR+UP STEP ROUTINE |
580 | DIYN DAC ** DIAGONAL X-DIR+DOWN STEP ROUTINE |
8fac3a64 |
581 | * |
8eb88117 |
582 | X1 DEC 0 LINE START POINT, X |
583 | Y1 DEC 0 LINE START POINT, Y |
584 | X2 DEC 0 LINE END POINT, X |
585 | Y2 DEC 0 LINE END POINT, Y |
586 | * |
587 | XA DEC 0 REAL FIRST POINT X COORDINATE |
588 | YA DEC 0 REAL FIRST POINT Y COORDINATE |
589 | XB DEC 0 REAL SECOND POINT X COORDINATE |
590 | YB DEC 0 REAL SECOND POINT Y COORDINATE |
591 | D1 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P1 |
592 | D2 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P2 |
eabafcca |
593 | RELA DEC 0 FLAG INDICATING THAT RELATIVE POSITIONING HAS OCCURED |
8eb88117 |
594 | * |
595 | **** GLUE IN THE MOVEMENT ROUTINES |
596 | * |
8fac3a64 |
597 | MU XAC PL$U |
598 | MD XAC PL$D |
599 | ML XAC PL$L |
600 | MR XAC PL$R |
601 | MUL XAC PL$UL |
602 | MUR XAC PL$UR |
603 | MDL XAC PL$DL |
604 | MDR XAC PL$DR |
605 | * |
606 | ******************************************************************************** |
eabafcca |
607 | * |
608 | * |
609 | **** AFFINE TRASFORMATION DATA AND REST OF GRAPHIC CONTEXT |
610 | * |
611 | * OLD PROGRAMS DON'T HAVE TO WORRY ABOUT THAT. NEWER PROGRAMS SHOULD. |
612 | * |
8fac3a64 |
613 | *** HERE THE TRANSFORMATION MATRIX, INITIALLY NO TRANSFORMATION, OLD PROGRAMS |
614 | *** DON'T HAVE TO CARE ABOUT THAT (HOPE SO) |
eabafcca |
615 | ATRA OCT '040300 A11 (CONSTANT 1.0) |
8fac3a64 |
616 | OCT '000000 |
617 | OCT '000000 A12 |
618 | OCT '000000 |
619 | OCT '000000 A21 |
620 | OCT '000000 |
eabafcca |
621 | OCT '040300 A22 (CONSTANT 1.0) |
8fac3a64 |
622 | OCT '000000 |
eabafcca |
623 | * |
624 | VECT DEC 0 X TRANSLATION |
625 | DEC 0 Y TRANSLATION |
626 | XU DEC 0 USER VIEW PEN POSITION, X VALUE |
627 | YU DEC 0 USER VIEW PEN POSITION, Y VALUE |
628 | * |
629 | VECX EQU VECT |
630 | VECY EQU VECT+1 |
8fac3a64 |
631 | * |
632 | ******************************************************************************** |
633 | * |
634 | * |
635 | END |