*** empty log message ***
[h316.git] / lib / iolib / 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)
6 *
7 * PLOTTER MOVEMENT ROUTINES
8 *
9 *
10 * REVISIONS:
11 * 1.0 (2007-05-28)
12 * 1.1 (2007-11-08) - ADDED INTELLIGENT LINE DRAWING ROUTINE
13 *
14 *
15 *
16 * AUTHOR:
17 *
18 * PHILIPP HACHTMANN
19 *
20 *
21 * PURPOSE:
22 *
23 * PROVIDE SIMPLE LIBRARY FUNCTIONS FOR INCREMENTAL PLOTTERS
24 *
25 *
26 * STORAGE:
27 *
28 * ??? (OCTAL)
29 * ??? (DECIMAL)
30 *
31 *
32 * USAGE
33 *
34 * CALL PL$RST - SET VIRTUAL PLOT POSITION TO ZERO
35 *
36 * CALL PL$MV - MOVE TO POINT SPECIFIED
37 * DAC XN BY XN
38 * DAC YN AND YN VALUE
39 *
40 * CALL PL$LN - DRAW LINE AND LEAVE PEN DOWN
41 * DAC X1
42 * DAC Y1
43 * DAC X2
44 * DAC Y2
45 * DAC 0
46 *
47 *
48 ********************************************************************************
49 *
50 *
51 SUBR PL$MV,MOVE
52 SUBR PL$RST,RST
53 SUBR PL$LN,LINE
54 *
55 *
56 *
57 REL THIS IS A RELOCATABLE OBJECT
58 ORG '0
59 *
60 ********************************************************************************
61 *
62 LINE DAC 0 DRAW A LINE FROM NEAR STARTING POINT
63 LDA* LINE X1
64 STA X1P
65 IRS LINE
66 LDA* LINE Y1
67 STA Y1P
68 IRS LINE
69 LDA* LINE X2
70 STA X2P
71 IRS LINE
72 LDA* LINE Y2
73 STA Y2P
74 IRS LINE TALLY RETURN ADDRESS
75 IRS LINE AGAIN FOR FORTRAN IV COMPATIBILITY
76 *
77 LDA X
78 SUB* X1P
79 SPL SKIP IF SIGN PLUS
80 TCA TWO'S COMPLEMENT IF NEEDED
81 STA D1
82 LDA Y
83 SUB* Y1P
84 SPL
85 TCA
86 ADD D1
87 STA D1
88 *
89 LDA X
90 SUB* X2P
91 SPL SKIP IF SIGN PLUS
92 TCA TWO'S COMPLEMENT IF NEEDED
93 STA D2
94 LDA Y
95 SUB* Y2P
96 SPL
97 TCA
98 ADD D2
99 CAS D1
100 JMP D2BG D2 IS BIGGER!
101 NOP
102 *
103 D1BG LDA* X2P DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2
104 STA XA
105 LDA* Y2P
106 STA YA
107 LDA* X1P
108 STA XB
109 LDA* Y1P
110 STA YB
111 JMP WOKI WORK!
112 *
113 D2BG LDA* X1P DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1
114 STA XA
115 LDA* Y1P
116 STA YA
117 LDA* X2P
118 STA XB
119 LDA* Y2P
120 STA YB
121 *
122 WOKI LDA X TEST IF STARTING POINT IST CURRENT POSITION
123 CAS XA
124 JMP MV1
125 JMP *+2
126 JMP MV1
127 LDA Y
128 CAS YA
129 JMP MV1
130 JMP *+2
131 JMP MV1
132 JMP NM1
133 *
134 MV1 CALL PL$PU MOVE TO THE STARTING POSITION
135 CALL PL$MV
136 DAC XA
137 DAC YA
138 DAC 0
139 NM1 CALL PL$PD WE ARE AT BEGINNING OF LINE
140 CALL PL$MV
141 DAC XB
142 DAC YB
143 DAC 0
144 JMP* LINE END OF THE LINE :-)
145 *
146 *
147 X1P DAC 0 ARGUMENT POINER TO X1
148 Y1P DAC 0 ARGUMENT POINER TO Y1
149 X2P DAC 0 ARGUMENT POINER TO X2
150 Y2P DAC 0 ARGUMENT POINER TO Y2
151 XA DEC 0 REAL FIRST POINT X COORDINATE
152 YA DEC 0 REAL FIRST POINT Y COORDINATE
153 XB DEC 0 REAL SECOND POINT X COORDINATE
154 YB DEC 0 REAL SECOND POINT Y COORDINATE
155 D1 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P1
156 D2 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P2
157 *
158 *
159 ********************************************************************************
160 *
161 RST DAC ** SET POINT ZERO
162 STA X
163 CRA
164 STA Y
165 IMA X
166 JMP* RST
167 *
168 *
169 MOVE DAC ** MOVE YA!
170 *
171 LDA* MOVE GET PARAMETERS
172 STA TMP
173 LDA* TMP
174 STA XN
175 SUB X
176 STA DX
177 IRS MOVE
178 LDA* MOVE
179 STA TMP
180 LDA* TMP
181 STA YN
182 SUB Y
183 STA DY
184 IRS MOVE
185 IRS MOVE CORRECT RETURN ADDRESS
186 *
187 * HLT
188 * LDA YN
189 * IAB
190 * LDA XN
191 * HLT
192 * JMP 1
193 *
194 LDA DX
195 SMI
196 JMP DXP DX POSITIVE
197 * DX NEGATIVE
198 TCA
199 STA DX NOW, DX IS POSITIVE!
200 LDA ML
201 STA STPX
202 LDA MUL
203 STA DIYP
204 LDA MDL
205 STA DIYN
206 JMP DXNP
207 DXP LDA MR
208 STA STPX
209 LDA MUR
210 STA DIYP
211 LDA MDR
212 STA DIYN
213 JMP DXNP
214 *
215 DXNP LDA DY
216 SMI
217 JMP DYP DY POSITIVE
218 * DY NEGATIVE
219 TCA
220 STA DY NOW, DY IS POSITIVE!
221 LDA MD
222 STA STPY
223 LDA DIYN
224 STA STPD
225 JMP DYNP
226 DYP LDA MU
227 STA STPY
228 LDA DIYP
229 STA STPD
230 *
231 DYNP LDA DX
232 CAS DY
233 JMP XGTY DX GREATER DY
234 YGTX NOP DY GREATER OR EQUAL DX
235 LDA STPY
236 STA STPL
237 LDA STPX
238 STA STPS
239 LDA DX
240 STA DS
241 LDA DY
242 STA DL
243 JMP GTE
244 *
245 XGTY LDA STPY
246 STA STPS
247 LDA STPX
248 STA STPL
249 LDA DX
250 STA DL
251 LDA DY
252 STA DS
253 *
254 GTE LDA DL LONG DISTANCE
255 LGR 1 DIVIDE BY TWO
256 STA ERR INITIALIZE ERROR COUNTER
257 *
258 *
259 *
260 LOOP LDA DL
261 SNZ
262 JMP FNSH END OF WORK - HOPE SO....
263 SUB =1 DECREMENT DL
264 STA DL
265 LDA ERR
266 SUB DS
267 STA ERR
268 SMI SKIP IF NOT OVERFLOWN (MINUS)
269 JMP NDIA NO DIAG STEP
270 ADD DL RELOAD
271 STA ERR
272 LDA DS
273 SUB =1
274 STA DS
275 JST* STPD
276 JMP STEN END OF STEP
277 NDIA JST* STPL LONG DIR STEP ONLY
278 STEN JMP LOOP RELOOP
279 *
280 FNSH LDA XN
281 STA X
282 LDA YN
283 STA Y
284 JMP* MOVE END OF THE ROUTINE
285 **********************
286 *
287 * VARIABLES
288 *
289 X DEC 0 PEN POSITION, X VALUE
290 Y DEC 0 PEN POSITION, Y VALUE
291 XN DEC 0 NEW PEN POSITION, X VALUE
292 YN DEC 0 NEW PEN POSITION, Y VALUE
293 DX DEC 0 X DIFFERENCE TO GO
294 DY DEC 0 Y DIFFERENCE TO GO
295 *
296 DL DEC 0 LONG DISTANCE NEGATIVE
297 DS DEC 0 SHORT DISTANCE NEGATIVE
298 STPL DAC ** ROUTINE TO LONG DISTANCE STEP
299 STPS DAC ** ROUTINE TO SHORT DISTANCE STEP
300 STPD DAC ** ROUTINE TO DIAGONAL STEP
301 ERR DEC 0 ERROR COUNTER
302 *
303 STPX DAC ** X STEP ROUTINE
304 STPY DAC ** Y STEP ROUTINE
305 DIYP DAC ** DIAGONAL X-DIR+UP STEP ROUTINE
306 DIYN DAC ** DIAGONAL X-DIR+DOWN STEP ROUTINE
307 TMP DAC ** UNIVERSAL POINTER
308 *
309 * GLUE IN THE MOVEMENT
310 MU XAC PL$U
311 MD XAC PL$D
312 ML XAC PL$L
313 MR XAC PL$R
314 MUL XAC PL$UL
315 MUR XAC PL$UR
316 MDL XAC PL$DL
317 MDR XAC PL$DR
318 *
319 *
320 END