*** empty log message ***
[h316.git] / lib / hachti / src / pl$mv.asm
... / ...
CommitLineData
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*
96MVR 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*
129INIT 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*
143PUSH DAC ** ENTRY
144 LDA* PUSH
145 STA SD1
146 IRS PUSH
147 CALL S$PUSM PUSH MEMORY ROUTINE
148SD1 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*
159POP DAC ** ENTRY
160 LDA* POP
161 STA SD2
162 IRS POP
163 CALL S$POPM POP MEMORY ROUTINE
164SD2 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*
175LINE 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
194X1P DAC **
195Y1P DAC **
196 DAC 0
197*
198 CALL T$APII APPLY MATRIX
199 DAC ATRA
200 DAC X2
201 DAC Y2
202X2P DAC **
203Y2P 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*
233D1BG 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*
243D2BG 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*
252WOKI 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*
264MV1 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*
271NM1 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*
284RST 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*
304MOVE 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*
330RMOV 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
351DXP LDA MR
352 STA STPX
353 LDA MUR
354 STA DIYP
355 LDA MDR
356 STA DIYN
357 JMP DXNP
358*
359DXNP 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
370DYP LDA MU
371 STA STPY
372 LDA DIYP
373 STA STPD
374*
375DYNP LDA DX
376 CAS DY
377 JMP XGTY DX GREATER DY
378YGTX 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*
391XGTY 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*
407GTE LDA DL0 LONG DISTANCE
408 LGR 1 DIVIDE BY TWO
409 STA ERR INITIALIZE ERROR COUNTER
410*
411*
412*** MOVE LOOP
413*
414LOOP 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*
439NDIA JST* STPL DO LONG DIRECTION STEP
440STEN JMP LOOP RELOOP
441*
442*
443*** END OF LOOP
444FNSH 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*
456SCLE DAC **
457 LDA* SCLE
458 STA FCTR
459 IRS SCLE
460 CALL T$SCLE
461 DAC ATRA
462FCTR DAC 0
463 DAC 0
464 JMP* SCLE
465*
466*
467********************************************************************************
468*
469*
470**** ROTATE - RADIANT
471*
472ROT DAC **
473 LDA* ROT
474 STA FCR2
475 IRS ROT
476 CALL T$ROT
477 DAC ATRA
478FCR2 DAC 0
479 DAC 0
480 JMP* ROT
481*
482*
483********************************************************************************
484*
485*
486**** RLUP - UPDATE LATENT POSITION TO REAL POSITION
487*
488RLUP 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*
506ROTI DAC **
507 LDA* ROTI
508 STA FCR3
509 IRS ROTI
510 CALL T$ROTI
511 DAC ATRA
512FCR3 DAC 0
513 DAC 0
514 JMP* ROTI
515*
516*
517********************************************************************************
518*
519*
520**** SCALE - INTEGER PERCENTS
521*
522SCLI DAC **
523 LDA* SCLI
524 STA FCR4
525 IRS SCLI
526*
527 CALL T$SCLI
528 DAC ATRA
529FCR4 DAC 0
530 DAC 0
531 JMP* SCLI
532*
533********************************************************************************
534*
535*** MOVE COORDINATE SYSTEM RELATIVELY
536*
537RMR 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
548XTR DAC **
549YTR DAC **
550 DAC 0
551*
552 JMP* RMR
553*
554*
555**********************
556*
557* VARIABLES
558*
559X DEC 0 HARDWARE VIEW PEN POSITION, X VALUE
560Y DEC 0 HARDWARE VIEW PEN POSITION, Y VALUE
561XN DEC 0 NEW PEN POSITION, X VALUE
562YN DEC 0 NEW PEN POSITION, Y VALUE
563DX DEC 0 X DIFFERENCE TO GO
564DY DEC 0 Y DIFFERENCE TO GO
565TMPX DEC 0 TEMPORARY X VALUE
566TMPY DEC 0 TEMPORARY Y VALUE
567*
568DL0 DEC 0 INITIAL LONG DISTANCE
569DS0 DEC 0 INITIAL SHORT DISTANCE
570DL DEC 0 LONG DISTANCE
571DS DEC 0 SHORT DISTANCE
572STPL DAC ** ROUTINE TO LONG DISTANCE STEP
573STPS DAC ** ROUTINE TO SHORT DISTANCE STEP
574STPD DAC ** ROUTINE TO DIAGONAL STEP
575ERR DEC 0 ERROR COUNTER
576*
577STPX DAC ** X STEP ROUTINE
578STPY DAC ** Y STEP ROUTINE
579DIYP DAC ** DIAGONAL X-DIR+UP STEP ROUTINE
580DIYN DAC ** DIAGONAL X-DIR+DOWN STEP ROUTINE
581*
582X1 DEC 0 LINE START POINT, X
583Y1 DEC 0 LINE START POINT, Y
584X2 DEC 0 LINE END POINT, X
585Y2 DEC 0 LINE END POINT, Y
586*
587XA DEC 0 REAL FIRST POINT X COORDINATE
588YA DEC 0 REAL FIRST POINT Y COORDINATE
589XB DEC 0 REAL SECOND POINT X COORDINATE
590YB DEC 0 REAL SECOND POINT Y COORDINATE
591D1 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P1
592D2 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P2
593RELA DEC 0 FLAG INDICATING THAT RELATIVE POSITIONING HAS OCCURED
594*
595**** GLUE IN THE MOVEMENT ROUTINES
596*
597MU XAC PL$U
598MD XAC PL$D
599ML XAC PL$L
600MR XAC PL$R
601MUL XAC PL$UL
602MUR XAC PL$UR
603MDL XAC PL$DL
604MDR 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)
615ATRA 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*
624VECT DEC 0 X TRANSLATION
625 DEC 0 Y TRANSLATION
626XU DEC 0 USER VIEW PEN POSITION, X VALUE
627YU DEC 0 USER VIEW PEN POSITION, Y VALUE
628*
629VECX EQU VECT
630VECY EQU VECT+1
631*
632********************************************************************************
633*
634*
635 END