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 | * |
30 | * PROVIDE SIMPLE LIBRARY FUNCTIONS FOR INCREMENTAL PLOTTERS |
31 | * |
32 | * |
33 | * STORAGE: |
34 | * |
35 | * ??? (OCTAL) |
36 | * ??? (DECIMAL) |
37 | * |
38 | * |
39 | * USAGE |
40 | * |
41 | * CALL PL$RST - SET VIRTUAL PLOT POSITION TO ZERO |
42 | * |
43 | * CALL PL$MV - MOVE TO POINT SPECIFIED |
44 | * DAC XN BY XN |
45 | * DAC YN AND YN VALUE |
46 | * DAC 0 |
47 | * |
48 | * CALL PL$LN - DRAW LINE AND LEAVE PEN DOWN |
49 | * DAC X1 |
50 | * DAC Y1 |
51 | * DAC X2 |
52 | * DAC Y2 |
53 | * DAC 0 |
54 | * |
55 | * CALL PL$RMR - MOVE ORIGIN RELATIVELY |
56 | * DAC DX |
57 | * DAC DY |
58 | * DAC 0 |
59 | * |
60 | * CALL PL$SCL - SCALE TRANSFORMATION |
61 | * DAC SCALE SCALE FACTOR, FLOAT |
62 | * DAC 0 |
63 | * |
64 | * CALL PL$IDN - RESET TRANSFORMATION MATRIX |
65 | * |
66 | ******************************************************************************** |
67 | * |
68 | * |
69 | SUBR PL$MV,MOVE |
70 | SUBR PL$RST,RST |
71 | SUBR PL$LN,LINE |
72 | SUBR PL$RMR,RMR |
73 | SUBR PL$X,X |
74 | SUBR PL$Y,Y |
75 | SUBR PL$MAT,MTRX |
76 | SUBR PL$SCL,SCLE |
77 | SUBR PL$IDN,IDEN |
78 | * |
79 | * |
80 | * |
81 | REL THIS IS A RELOCATABLE OBJECT |
82 | ORG '0 |
83 | * |
84 | ******************************************************************************** |
85 | * |
86 | LINE DAC 0 DRAW A LINE FROM NEAR STARTING POINT |
87 | LDA* LINE X1 |
88 | STA X1P |
89 | IRS LINE |
90 | LDA* LINE Y1 |
91 | STA Y1P |
92 | IRS LINE |
93 | LDA* LINE X2 |
94 | STA X2P |
95 | IRS LINE |
96 | LDA* LINE Y2 |
97 | STA Y2P |
98 | IRS LINE TALLY RETURN ADDRESS |
99 | NOP |
100 | IRS LINE AGAIN FOR FORTRAN IV COMPATIBILITY |
101 | NOP |
102 | * |
103 | NOP |
104 | NOP |
105 | NOP |
106 | * |
107 | CALL M$APII |
108 | DAC MTRX |
109 | * JMP Y2P+2 |
110 | X2P DAC 0 |
111 | Y2P DAC 0 |
112 | DAC 0 |
113 | * |
114 | NOP |
115 | NOP |
116 | NOP |
117 | * |
118 | CALL M$APII |
119 | DAC MTRX |
120 | X1P DAC 0 |
121 | Y1P DAC 0 |
122 | DAC 0 |
123 | NOP |
124 | NOP |
125 | NOP |
126 | * |
127 | LDA X |
128 | SUB* X1P |
129 | SPL SKIP IF SIGN PLUS |
130 | TCA TWO'S COMPLEMENT IF NEEDED |
131 | STA D1 |
132 | LDA Y |
133 | SUB* Y1P |
134 | SPL |
135 | TCA |
136 | ADD D1 |
137 | STA D1 |
138 | * |
139 | LDA X |
140 | SUB* X2P |
141 | SPL SKIP IF SIGN PLUS |
142 | TCA TWO'S COMPLEMENT IF NEEDED |
143 | STA D2 |
144 | LDA Y |
145 | SUB* Y2P |
146 | SPL |
147 | TCA |
148 | ADD D2 |
149 | CAS D1 |
150 | JMP D2BG D2 IS BIGGER! |
151 | NOP |
152 | * |
153 | D1BG LDA* X2P DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2 |
154 | STA XA |
155 | LDA* Y2P |
156 | STA YA |
157 | LDA* X1P |
158 | STA XB |
159 | LDA* Y1P |
160 | STA YB |
161 | JMP WOKI WORK! |
162 | * |
163 | D2BG LDA* X1P DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1 |
164 | STA XA |
165 | LDA* Y1P |
166 | STA YA |
167 | LDA* X2P |
168 | STA XB |
169 | LDA* Y2P |
170 | STA YB |
171 | * |
172 | WOKI LDA X TEST IF STARTING POINT IST CURRENT POSITION |
173 | CAS XA |
174 | JMP MV1 |
175 | JMP *+2 |
176 | JMP MV1 |
177 | LDA Y |
178 | CAS YA |
179 | JMP MV1 |
180 | JMP *+2 |
181 | JMP MV1 |
182 | JMP NM1 |
183 | * |
184 | MV1 CALL PL$PU MOVE TO THE STARTING POSITION |
185 | LDA XA |
186 | STA XN |
187 | LDA YA |
188 | STA YN |
189 | JST RMOV REAL MOVE |
190 | * |
191 | NM1 CALL PL$PD WE ARE AT BEGINNING OF LINE |
192 | LDA XB |
193 | STA XN |
194 | LDA YB |
195 | STA YN |
196 | JST RMOV REAL MOVE |
197 | JMP* LINE END OF THE LINE :-) |
198 | * |
199 | * |
200 | *X1P DAC 0 ARGUMENT POINER TO X1 |
201 | *Y1P DAC 0 ARGUMENT POINER TO Y1 |
202 | *X2P DAC 0 ARGUMENT POINER TO X2 |
203 | *Y2P DAC 0 ARGUMENT POINER TO Y2 |
204 | XA DEC 0 REAL FIRST POINT X COORDINATE |
205 | YA DEC 0 REAL FIRST POINT Y COORDINATE |
206 | XB DEC 0 REAL SECOND POINT X COORDINATE |
207 | YB DEC 0 REAL SECOND POINT Y COORDINATE |
208 | D1 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P1 |
209 | D2 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P2 |
210 | * |
211 | * |
212 | ******************************************************************************** |
213 | * |
214 | RST DAC ** SET POINT ZERO |
215 | CRA |
216 | STA Y |
217 | IMA X |
218 | JMP* RST |
219 | * |
220 | ABS |
221 | ORG '3000 |
222 | * |
223 | MOVE DAC ** MOVE YA! |
224 | * |
225 | * JMP* MOVE |
226 | * |
227 | LDX MOVE GET PARAMETERS |
228 | LDA* 0,1 X VALUE |
229 | STA XN |
230 | LDA* 1,1 Y VALUE |
231 | STA YN |
232 | LDA MOVE |
233 | ADD =3 |
234 | STA MOVE CORRECT RETURN ADDRESS |
235 | * |
236 | CALL M$APLI APPLY TRANSFORMATION MATRIX TO POSITION |
237 | DAC MTRX |
238 | DAC XN |
239 | DAC 0 |
240 | * |
241 | JST RMOV CALL INTO REAL MOVE SUBROUTINE |
242 | JMP* MOVE RETURN |
243 | * |
244 | **************************************** |
245 | * |
246 | RMOV DAC ** REAL MOVE SUBROUTINE |
247 | LDA XN |
248 | SUB X |
249 | STA DX |
250 | LDA YN |
251 | SUB Y |
252 | STA DY |
253 | * |
254 | LDA DX |
255 | SMI |
256 | JMP DXP DX POSITIVE |
257 | * DX NEGATIVE |
258 | TCA |
259 | STA DX NOW, DX IS POSITIVE! |
260 | LDA ML |
261 | STA STPX |
262 | LDA MUL |
263 | STA DIYP |
264 | LDA MDL |
265 | STA DIYN |
266 | JMP DXNP |
267 | DXP LDA MR |
268 | STA STPX |
269 | LDA MUR |
270 | STA DIYP |
271 | LDA MDR |
272 | STA DIYN |
273 | JMP DXNP |
274 | * |
275 | DXNP LDA DY |
276 | SMI |
277 | JMP DYP DY POSITIVE |
278 | * DY NEGATIVE |
279 | TCA |
280 | STA DY NOW, DY IS POSITIVE! |
281 | LDA MD |
282 | STA STPY |
283 | LDA DIYN |
284 | STA STPD |
285 | JMP DYNP |
286 | DYP LDA MU |
287 | STA STPY |
288 | LDA DIYP |
289 | STA STPD |
290 | * |
291 | DYNP LDA DX |
292 | CAS DY |
293 | JMP XGTY DX GREATER DY |
294 | YGTX NOP DY GREATER OR EQUAL DX |
295 | LDA STPY |
296 | STA STPL |
297 | LDA STPX |
298 | STA STPS |
299 | LDA DX |
300 | STA DS |
301 | LDA DY |
302 | STA DL |
303 | JMP GTE |
304 | * |
305 | XGTY LDA STPY |
306 | STA STPS |
307 | LDA STPX |
308 | STA STPL |
309 | LDA DX |
310 | STA DL |
311 | LDA DY |
312 | STA DS |
313 | * |
314 | GTE LDA DL LONG DISTANCE |
315 | LGR 1 DIVIDE BY TWO |
316 | STA ERR INITIALIZE ERROR COUNTER |
317 | * |
318 | * |
319 | * |
320 | LOOP LDA DL |
321 | SNZ |
322 | JMP FNSH END OF WORK - HOPE SO.... |
323 | SUB =1 DECREMENT DL |
324 | STA DL |
325 | LDA ERR |
326 | SUB DS |
327 | STA ERR |
328 | SMI SKIP IF NOT OVERFLOWN (MINUS) |
329 | JMP NDIA NO DIAG STEP |
330 | ADD DL RELOAD |
331 | STA ERR |
332 | LDA DS |
333 | SUB =1 |
334 | STA DS |
335 | JST* STPD |
336 | JMP STEN END OF STEP |
337 | NDIA JST* STPL LONG DIR STEP ONLY |
338 | STEN JMP LOOP RELOOP |
339 | * |
340 | FNSH LDA XN |
341 | STA X |
342 | LDA YN |
343 | STA Y |
344 | JMP* RMOV END OF THE ROUTINE |
345 | * |
346 | * |
347 | ******************************************************************************** |
348 | * |
349 | * |
350 | IDEN DAC ** RESET TRANSFORMATION MATRIX |
351 | CALL M$INIT |
352 | DAC MTRX |
353 | JMP* IDEN |
354 | * |
355 | * |
356 | ******************************************************************************** |
357 | * |
358 | SCLE DAC ** |
359 | LDA* SCLE |
360 | STA FCTR |
361 | IRS SCLE |
362 | CALL M$SCLE |
363 | DAC MTRX |
364 | FCTR DAC 0 |
365 | NOP |
366 | NOP |
367 | JMP* SCLE |
368 | * |
369 | * |
370 | ******************************************************************************** |
371 | * |
372 | *** MOVE COORDINATE SYSTEM RELATIVELY |
373 | * |
374 | RMR DAC ** |
375 | LDA* RMR |
376 | STA PTR |
377 | LDA X |
378 | SUB* PTR |
379 | STA X |
380 | IRS RMR |
381 | LDA* RMR |
382 | STA PTR |
383 | LDA Y |
384 | SUB* PTR |
385 | STA Y |
386 | IRS RMR |
387 | IRS RMR |
388 | JMP* RMR |
389 | PTR DAC ** |
390 | * |
391 | * |
392 | ********************** |
393 | * |
394 | * VARIABLES |
395 | * |
396 | X DEC 0 PEN POSITION, X VALUE |
397 | Y DEC 0 PEN POSITION, Y VALUE |
398 | XN DEC 0 NEW PEN POSITION, X VALUE |
399 | YN DEC 0 NEW PEN POSITION, Y VALUE |
400 | DX DEC 0 X DIFFERENCE TO GO |
401 | DY DEC 0 Y DIFFERENCE TO GO |
402 | * |
403 | DL DEC 0 LONG DISTANCE NEGATIVE |
404 | DS DEC 0 SHORT DISTANCE NEGATIVE |
405 | STPL DAC ** ROUTINE TO LONG DISTANCE STEP |
406 | STPS DAC ** ROUTINE TO SHORT DISTANCE STEP |
407 | STPD DAC ** ROUTINE TO DIAGONAL STEP |
408 | ERR DEC 0 ERROR COUNTER |
409 | * |
410 | STPX DAC ** X STEP ROUTINE |
411 | STPY DAC ** Y STEP ROUTINE |
412 | DIYP DAC ** DIAGONAL X-DIR+UP STEP ROUTINE |
413 | DIYN DAC ** DIAGONAL X-DIR+DOWN STEP ROUTINE |
414 | TMP DAC ** UNIVERSAL POINTER |
415 | * |
416 | * GLUE IN THE MOVEMENT |
417 | MU XAC PL$U |
418 | MD XAC PL$D |
419 | ML XAC PL$L |
420 | MR XAC PL$R |
421 | MUL XAC PL$UL |
422 | MUR XAC PL$UR |
423 | MDL XAC PL$DL |
424 | MDR XAC PL$DR |
425 | * |
426 | ******************************************************************************** |
427 | * |
428 | *** HERE THE TRANSFORMATION MATRIX, INITIALLY NO TRANSFORMATION, OLD PROGRAMS |
429 | *** DON'T HAVE TO CARE ABOUT THAT (HOPE SO) |
430 | MTRX OCT '040300 A11 |
431 | OCT '000000 |
432 | OCT '000000 A12 |
433 | OCT '000000 |
434 | OCT '000000 A21 |
435 | OCT '000000 |
436 | OCT '040300 A22 |
437 | OCT '000000 |
438 | * |
439 | * |
440 | ******************************************************************************** |
441 | * |
442 | * |
443 | END |