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