*** empty log message ***
[h316.git] / lib / hachti / src / pl$mv.asm
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 *
30 * PROVIDE DRAWING AND COORDINATE TRANSFORMATION
31 * ROUTINES FOR INCREMENTAL PLOTTERS
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
71 SUBR PL$MVR,MVR
72 SUBR PL$RST,RST
73 SUBR PL$LN,LINE
74 SUBR PL$RMR,RMR
75 SUBR PL$X,UX
76 SUBR PL$Y,UY
77 SUBR PL$MAT,ATRA
78 SUBR PL$SCL,SCLE
79 SUBR PL$SCI,SCLI
80 SUBR PL$ROT,ROT
81 SUBR PL$ROI,ROTI
82 SUBR PL$PUS,PUSH
83 SUBR PL$POP,POP
84 SUBR PL$INI,INIT
85 *
86 *
87 *
88 REL THIS IS A RELOCATABLE OBJECT
89 ORG '0
90 *
91 *
92 ********************************************************************************
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 * *******************************************************************************
171 *
172 *
173 **** PL$LN - DRAW A LINE
174 *
175 LINE DAC 0 DRAW A LINE FROM NEAREST STARTING POINT
176 LDA* LINE X1
177 STA X1P
178 IRS LINE
179 LDA* LINE Y1
180 STA Y1P
181 IRS LINE
182 LDA* LINE X2
183 STA X2P
184 IRS LINE
185 LDA* LINE Y2
186 STA Y2P
187 IRS LINE TALLY RETURN ADDRESS
188 IRS LINE AGAIN FOR FORTRAN IV COMPATIBILITY
189 *
190 CALL T$APII APPLY MATRIX
191 DAC ATRA
192 DAC X1
193 DAC Y1
194 X1P DAC **
195 Y1P DAC **
196 DAC 0
197 *
198 CALL T$APII APPLY MATRIX
199 DAC ATRA
200 DAC X2
201 DAC Y2
202 X2P DAC **
203 Y2P DAC **
204 DAC 0
205 *
206 *
207 LDA X
208 SUB X1
209 SPL SKIP IF SIGN PLUS
210 TCA TWO'S COMPLEMENT IF NEEDED
211 STA D1
212 LDA Y
213 SUB Y1
214 SPL
215 TCA
216 ADD D1
217 STA D1
218 *
219 LDA X
220 SUB X2
221 SPL SKIP IF SIGN PLUS
222 TCA TWO'S COMPLEMENT IF NEEDED
223 STA D2
224 LDA Y
225 SUB Y2
226 SPL
227 TCA
228 ADD D2
229 CAS D1
230 JMP D2BG D2 IS BIGGER!
231 NOP
232 *
233 D1BG LDA X2 DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2
234 STA XA
235 LDA Y2
236 STA YA
237 LDA X1
238 STA XB
239 LDA Y1
240 STA YB
241 JMP WOKI WORK!
242 *
243 D2BG LDA X1 DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1
244 STA XA
245 LDA Y1
246 STA YA
247 LDA X2
248 STA XB
249 LDA Y2
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 *
279 *
280 ********************************************************************************
281 *
282 **** MAKE CURRENT X AND Y THE ORIGIN
283 *
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
292 CRA
293 STA XU
294 STA YU
295 *
296 JMP* RST
297 *
298 *
299 ********************************************************************************
300 *
301 *
302 **** PL$MV - BASIC MOVE ROUTINE
303 *
304 MOVE DAC ** MOVE YA!
305 *
306 LDX MOVE GET PARAMETERS
307 LDA* 0,1 X VALUE
308 STA XU
309 STA XN
310 LDA* 1,1 Y VALUE
311 STA YU
312 STA YN
313 LDA MOVE
314 ADD =3
315 STA MOVE CORRECT RETURN ADDRESS
316 *
317 CALL T$APII APPLY TRANSFORMATION MATRIX TO POSITION
318 DAC ATRA
319 DAC XN
320 DAC YN
321 DAC XN
322 DAC YN
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
385 STA DS0
386 LDA DY
387 STA DL
388 STA DL0
389 JMP GTE
390 *
391 XGTY LDA STPY
392 STA STPS
393 LDA STPX
394 STA STPL
395 LDA DX
396 STA DL
397 STA DL0
398 LDA DY
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
408 LGR 1 DIVIDE BY TWO
409 STA ERR INITIALIZE ERROR COUNTER
410 *
411 *
412 *** MOVE LOOP
413 *
414 LOOP LDA DL LONG DISTANCE
415 SNZ
416 JMP FNSH END OF WORK - HOPE SO....
417 *
418 SUB =1 DECREMENT LONG DISTANCE
419 STA DL
420 *
421 LDA ERR ERROR COUNTER
422 SUB DS0
423 STA ERR
424 SMI SKIP IF NOT OVERFLOWN (MINUS)
425 JMP NDIA NO DIAG STEP
426 *
427 *** DIAG STEP TO DO
428 *
429 ADD DL0
430 STA ERR
431 LDA DS
432 SUB =1
433 STA DS
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
440 STEN JMP LOOP RELOOP
441 *
442 *
443 *** END OF LOOP
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 *
454 **** SCALE OUTPUT
455 *
456 SCLE DAC **
457 LDA* SCLE
458 STA FCTR
459 IRS SCLE
460 CALL T$SCLE
461 DAC ATRA
462 FCTR DAC 0
463 DAC 0
464 JMP* SCLE
465 *
466 *
467 ********************************************************************************
468 *
469 *
470 **** ROTATE - RADIANT
471 *
472 ROT DAC **
473 LDA* ROT
474 STA FCR2
475 IRS ROT
476 CALL T$ROT
477 DAC ATRA
478 FCR2 DAC 0
479 DAC 0
480 JMP* ROT
481 *
482 *
483 ********************************************************************************
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 ********************************************************************************
534 *
535 *** MOVE COORDINATE SYSTEM RELATIVELY
536 *
537 RMR DAC **
538 LDA* RMR
539 STA XTR
540 IRS RMR
541 LDA* RMR
542 STA YTR
543 IRS RMR
544 IRS RMR
545 *
546 CALL T$TRAN
547 DAC ATRA
548 XTR DAC **
549 YTR DAC **
550 DAC 0
551 *
552 JMP* RMR
553 *
554 *
555 **********************
556 *
557 * VARIABLES
558 *
559 X DEC 0 HARDWARE VIEW PEN POSITION, X VALUE
560 Y DEC 0 HARDWARE VIEW PEN POSITION, Y VALUE
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
565 TMPX DEC 0 TEMPORARY X VALUE
566 TMPY DEC 0 TEMPORARY Y VALUE
567 *
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
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
581 *
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
593 RELA DEC 0 FLAG INDICATING THAT RELATIVE POSITIONING HAS OCCURED
594 *
595 **** GLUE IN THE MOVEMENT ROUTINES
596 *
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 ********************************************************************************
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 *
613 *** HERE THE TRANSFORMATION MATRIX, INITIALLY NO TRANSFORMATION, OLD PROGRAMS
614 *** DON'T HAVE TO CARE ABOUT THAT (HOPE SO)
615 ATRA OCT '040300 A11 (CONSTANT 1.0)
616 OCT '000000
617 OCT '000000 A12
618 OCT '000000
619 OCT '000000 A21
620 OCT '000000
621 OCT '040300 A22 (CONSTANT 1.0)
622 OCT '000000
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
631 *
632 ********************************************************************************
633 *
634 *
635 END