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