Add README.md
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rkb / paroff / x.ra
CommitLineData
81e70d48
PH
1/ \ eXYPLOT.RA\r
2/\r
3/ PART TWO OF DEC'S XYPLOT DEC-S8-LPLTA-A-LA JULY 1973 M.HURLEY\r
4/ INCLUDED IS THE LATEST UPDATE F4 4.AAAA FROM LIBRARY FORLIB.RL NOV 77\r
5/ COPIED J.J. ANDRES 1.NOV. 1980\r
6/ PLOTS,XYPLOT,FACTOR,WHERE,SYMBOL,SYMB(FOR NUMBER ONLY)\r
7/\r
8/\r
9/ PLOTTER ROUTINES FOR PDP 8\r
10/\r
11/ VER 1.0 1.NOV. 1980 H.A.\r
12/ VER 2.0 12.NOV 1980 H.A.\r
13/ VER 2.1 20.NOV 1980 H.A. CORRECTS BUG IN SYMBOL CONCERNING #XFCTX,#XFCTY\r
14/ VER 3.0 27.NOV 1980 H.A. INSERTS SYMBOL (999.,999.,....)\r
15/ VER 3.1 27.NOV.1980 H.A. CORRECTS PEN UP/DOWN TIMING ERROR\r
16/ VER 3.2 18.JAN.1981 H.A. CORRECTS WHERE AND OVERLAY PROBLEMS\r
17/ VER 3.3 4.AUG.1982 H.A. REDUCES NUMBER OF EXTERNAL REFERENCES\r
18/\r
19/ UPDATES:\r
20/ 1. PLEXIT LOCKED OUT THE PLOTTER.\r
21/ 2. PLOTS DIDN'T DROVE PLOTTER TO THE ORIGIN\r
22/ * #XONCE IS REMOVED, SO #XNTST IS CALLED FROM PLOTS ALL TIMES\r
23/ 1-NOV-80 H.A.\r
24/ 3. FACTOR DID NOT WORK CORRECT ALL THE TIMES.\r
25/ FACTOR(1),XYPLOT(1,1),FACTOR(2),XYPLOT(1,1) DID NOT WORK\r
26/ 4. TRUNCATION ERROR IN XYPLOT CAUSED ROUNDING PROBLEMS:\r
27/ XSTEPS=INT(INT(X/#XINCR)*FACTOR)\r
28/ * FACTOR NOW WORKS CORRECT IN ANY CASE\r
29/ * FACTOR NOW HAS AN OPTIONAL SECOND PARAMETER. IF BOTH PRESENT\r
30/ * THEY SPECIFY THE X-FACTOR AND THE Y-FACTOR.\r
31/ * A NEGATIVE FACTOR IS NO MORE VALID YET. (ERROR WALKBACK)\r
32/ * ZERO FACTOR DISABLES PLOTTING.\r
33/ * XYPLOT NOW COMPUTES XSTEPS=INT(X/#XINCR*FACTOR)\r
34/ * WHERE HAS GOT AN OPTIONAL FOURTH PARAMETER FOR THE Y-FACTOR.\r
35/ * IF X AND Y FACTOR DO NOT MATCH AND THERE ARE ONLY THREE PARAMETERS\r
36/ * AN ERROR WALKBACK IS TAKEN.\r
37/ 7-NOV-80 H.A.\r
38/ 5. SYMBOL CALLS #XMBTB TO LOAD THE SYMBOL TABLE\r
39/ 12-NOV-80 H.A.\r
40/ 6. CALLING SYMBOL/NUMBER WITH X/Y EQUAL TO 999. WILL REPLACE THE\r
41/ 999. WITH THE ACTUAL POSITION OF THE PEN. VERY USEFULL IF YOU\r
42/ ARE EDITING AN OUTPUT LINE USEING SOME CALLS TO SYMBOL & NUMBER.\r
43/ IF YOU CALL FACTOR PRIOR TO SYMBOL(999.,....) THEN THE POSITION\r
44/ OF THE PEN IS NEVER CHANGED PRIOR PLOTTING THE SYMBOL. BUT THE\r
45/ FACTOR IS USED WHEN PLOTTING THE SYMBOL.\r
46/ 27-NOV-80 H.A.\r
47/ 7. EACH TIME XYPLOT WAS CALLED IT ISSUED A PEN UP/DOWN COMMAND.\r
48/ THIS CAUSED A STEP BY STEP MOVING OF THE PEN ALTHOUGH THE\r
49/ DIRECTION WAS NOT CHANGED. INTERFACE PROBLEM.\r
50/ NOW WE ISSUE THE PEN MOVE COMMAND ONLY WHEN WE WANT TO CHANGE\r
51/ THE DIRECTION OF THE PEN. THIS SPEEDS UP THE PLOTTER!\r
52/ * NOT VALID PEN VALUES (NOT -3 TO 3) CAUSE #ARGERR WITH X0 =1\r
53/ 27-NOV-80 H.A. A HARD DAY'S NIGHT.... AND MIDNIGHT TOO!\r
54/ 8. REMOVES BUG IN WHERE ROUTINE\r
55/ 9. TOO LARGE DELTA X (DELETA Y) CAUSE #ARGER WITH X0=2 (3)\r
56/ 18-JAN-81 H.A.\r
57/\r
58\f/\r
59/ FPP CODE PART CONTAINING PLOTS,PLOT,PLEXIT,WHERE,FACTOR\r
60/ THIS PROGRAM MAY BE PLACED INTO AN OVERLAY.\r
61/ IT REFERENCES THE PROGRAM PDPPLT LOCATED IN FIELD 1.\r
62/\r
63 SECT #XYPLT\r
64/\r
65/ REFERENCES INTO FRTS (FIELD 0)\r
66/\r
67 EXTERN #ARGER / WRONG NUMBER OF PARAMETERS\r
68 EXTERN #REW\r
69 EXTERN #WRITO\r
70 EXTERN #RSVO\r
71 EXTERN #RENDO\r
72/\r
73/ REFERENCES INTO FIELD 1 (PDPPLT)\r
74/\r
75 EXTERN #XETXR\r
76 EXTERN #XETUP\r
77 EXTERN #XDPXR\r
78 EXTERN #XATIO\r
79 EXTERN #XNPLT\r
80 EXTERN #XCHTP\r
81 EXTERN #XCHCK\r
82 EXTERN #XNTST\r
83 EXTERN #XDNCK\r
84 EXTERN #XORGX / LAST ABSOLUTE ORIGIN IN PLOTTER STEPS X (REAL)\r
85#XORGY= #XORGX+3\r
86#XABSX= #XORGY+3 / ACTUAL ABSOLUTE X POSITION IN STEPS (REAL)\r
87#XABSY= #XABSX+3\r
88#XOLDP= #XABSY+3 / OLD PEN STATUS\r
89#XXOLD= #XOLDP+3 / OLD XPT WITH EFFECT OF FACTOR\r
90#XYOLD= #XXOLD+3 / OLD YPT WITH EFFECT OF FACTOR\r
91#XPENC= #XYOLD+3 / OLD PEN STATUS ( USED BY SYMBOL, NUMBER)\r
92#XINCX= #XPENC+3 / INCREMENT SIZE FOR X STEP MOTOR OF PLOTTER\r
93#XINCY= #XINCX+3 / INCREMENT SIZE FOR Y STEP MOTOR OF PLOTTER\r
94#XFCTX= #XINCY+3 / X - FACTOR\r
95#XFCTY= #XFCTX+3 / Y - FACTOR\r
96/\r
97/ HERES THE INITIALIZATION ROUTINE \r
98/ STANDARD CALLING SEQUENCE, SHARED BY ALL SUBROUTINES\r
99/\r
100XRPLOT, 0 / MULTI PURPOSE XRS\r
101X0= 0 / AT #ARGER X0 HOLDS THE XYPLOT ERROR NUMBER\r
102X1= 1\r
103XR1, 0\r
104XR2, 0\r
105XR3, 0\r
106XR4, 0\r
107XR5, 0\r
108XR6, 0 / NOT USED\r
109X7= 7\r
110XR7, 0 / NUMBER OF PARAMETERS AT SUBROUTINE CALL\r
111WBW, TEXT #XYPLOT# / WALK BACK WORD\r
112PLOTXR, SETX XRPLOT\r
113 SETB BPPLOT\r
114BPPLOT, FNOP\r
115 0\r
116 0\r
117TERM2, F 0.\r
118YPT, F 0. / VALUE ACTUALLY PLOTTED WITH EFFECT OF FACTOR\r
119XPT, F 0. / X VALUE ACTUALLY PLOTTED WITH EFFECT OF FACTOR\r
120TERM1, F 0.\r
121ARG1, F 0.\r
122ARG2,\r
123YDIFF, F 0. / PEN VALUE\r
124 ORG 10*3+BPPLOT\r
125 FNOP\r
126 JA PLOTXR\r
127 ORG .+1 / TO MAKE A 3 WORD BASE ENTRY FOR PLTRTN\r
128PLTRTN, JA .\r
129MAJOR, F 0. / HORIZONTAL AXIS MOVE\r
130MINOR, F 0. / DIAGONAL AXIS MOVE\r
131XACT, F 0.\r
132YACT, F 0. / HOLDS X,Y VALUES TYPED IN\r
133XDIFF, F 0 / DELTA X\r
134P1, F 1.\r
135PF2, F 2.\r
136P3, F 3.\r
137P4, F 4.\r
138PF7, F 7.\r
139PT5, F .5\r
140PORS, F 0. / =1 IF ENTERED FROM SYMBOL ROUTINE\r
141XCHRPT, F 0. / X,Y VALUES FROM PDP TABLES\r
142YCHRPT, F 0.\r
143NUMENT, F 0. / INDICATES ENTRY FROM NUMBER SUBROUTINE\r
144COSANG, F 0.\r
145SINANG, F 0.\r
146DEGRAD, F 0.017453293 / RADIANS TO DEGREES\r
147F999, F 999.\r
148F100, F 100.\r
149XREAL, F 0. / FOR ORIGIN AND WHERE RTN\r
150YREAL, F 0.\r
151CENTSY, F 0. / CENTERED SYMBOL INDICATOR\r
152NUMSYM, F 0. / NO. OF CHARACTERS TO PLOT\r
153ANGADJ, F 0.\r
154P22, F 18. / 22 OCTAL=18 DECIMAL\r
155TWO, 0;2;0 / CONSTANT\r
156F4095, F 4095. / LARGEST NUMBER FITTING INTO 12 BITS PDP 8 WORD\r
157/\r
158/ - - - - - - - - - - - - -\r
159\f 0\r
160SYMSTR, JA . / SYMBOL ENTRY\r
161 JA SYMST / NEEDED TO PICK UP 2 WORD ADDRESSES\r
162 0\r
163 BASE 0\r
164/\r
165/ SET UP THE BASE PAGE AND INDEX REGISTERS FOR THE PLOT ROUTINES\r
166/ PLOTS,XYPLOT,WHERE,FACTOR AND SYMBOL\r
167/\r
168/\r
169PLTSTR, JA . / SAVE TWO WORDS FOR RETURN\r
170 STARTD\r
171 FLDA 3*10 / SAVE CALLERS RETURN ARGUMENT LIST\r
172 FSTA PLTRTN\r
173 FLDA% 0 / COMPUTE THE NUMBER OF PARAMETERS\r
174 FSUB 0\r
175 FSUB# TWO\r
176 SETX XRPLOT\r
177 LDX 1,1 / DIVIDE BY TWO\r
178 ALN 1\r
179 FNEG / MAKE COUNTER \r
180 ATX X7 / AND BUMP INTO X7 \r
181 FLDA 0 / POINTER TO THE PARAMETER LIST --> FAC\r
182 SETB BPPLOT\r
183 BASE BPPLOT\r
184 FSTA ARG1 / POINTER TO PARAMETER LIST --> ARG1\r
185 JA PLTSTR / 1 --> X1, INDEX TO PARAMETER LIST\r
186\f/\r
187/ XYPLOT SUBROUTINE\r
188/ CALL XYPLOT (XPT,YPT,PENCMD)\r
189/\r
190/ REAL XPT,YPT AND MUST BE POSSIBLE TO FIX INTO 24 BIT NUMBER\r
191/ INTEGER PENCMD (-3,-2,2,3 AND NOTHING ELSE)\r
192/\r
193/ ARGERR ERRORS:\r
194/ 1 BAD PENCMD\r
195/ 2 DELTA X EXCEEDS 4095\r
196/ 3 DELTA Y EXCEEDS 4095\r
197/ 4 XPT UNNORMALIZED OR TO LARGE ( FOR 24 BIT FRACTIONAL)\r
198/ 5 YPT "" "" "\r
199/\r
200/\r
201 ENTRY XYPLOT\r
202WB0, TEXT 'XYPLOT' / INSERT THE CORRECT WALK BACK WORD\r
203XYPLOT,\r
204 FLDA# WB0 / INSERT THE CORRECT WALK BACK WORD\r
205 FSTA WBW / IN FRONT OF THE BASE PAGE\r
206 JSA PLTSTR / SET UP THE BASE PAGE AND X REGISTERS\r
207SYMENT, FLDA% ARG1,1\r
208 FSTA XPT\r
209 FLDA% ARG1,1+\r
210 FSTA YPT\r
211 FLDA% ARG1,1+\r
212 FSTA YDIFF / VALUE OF PEN\r
213 STARTF\r
214 FLDA% XPT / X POINT\r
215 FDIV #XINCX / ALL INTERNAL CALCULATIONS DONE IN TERMS OF\r
216 / PLOTTING INTERVALS, HENCE INTEGERS SO\r
217 FMUL #XFCTX\r
218/ SAVE STEPS DONE\r
219 FSTA XACT / TEMP SAVE OF FAC\r
220 FADD #XORGX / REMEMBER THE X OFFSET\r
221 FSTA #XABSX / ABSOLUTE NUMBER OF STEPS IN REAL\r
222 FLDA XACT / RESTORE FAC\r
223/\r
224 JAL XPTERR / IF IT IS IMPOSSIBLE TO FIX XPT THEN ERROR OFF\r
225 JA XPTOK\r
226XPTERR, LDX 4,X0 / WITH #ARGER 4\r
227 TRAP4 #ARGER\r
228XPTOK,\r
229 JSA MAKINT / INTERGERIZE IT\r
230 FSTA XACT / WITH FACTOR\r
231 FSTA XPT / WITH EFFECT OF FACTOR\r
232 FLDA% YPT\r
233 FDIV #XINCY\r
234 FMUL #XFCTY\r
235 FSTA YACT\r
236 FADD #XORGY / ADD THE ORIGIN Y\r
237 FSTA #XABSY / HERE WE STORE THE ABSOLUTE NUMBER OF STEPS DONE\r
238 FLDA YACT / RESTORE FAC\r
239/\r
240 JAL YPTERR / IF IT IS IMPOSSIBLE TO FIX YPT THEN WE ERROR OFF\r
241 JA YPTOK\r
242YPTERR, LDX 5,X0 / WITH #ARGERR 5\r
243 TRAP4 #ARGER\r
244YPTOK,\r
245 JSA MAKINT / INTERGERIZE IT\r
246 FSTA YACT\r
247 FSTA YPT / WITH EFFECT OF FACTOR\r
248 FLDA% YDIFF / 2=DOWN, 3=UP, NEG=NEW ORG\r
249 FSTA #XPENC\r
250 JGE MORPEN\r
251 FNEG\r
252MORPEN, JSA MAKINT\r
253 SETX #XETXR\r
254 ATX 0 / ABS VALUE PEN\r
255 XTA 0 / FOR THE FPP SIMULATOR\r
256 SETX XRPLOT\r
257 FSTA YDIFF / SAVE NEW STATUS OF PEN \r
258 FSUB P3 / PASS ONLY 0-3\r
259 JLE ALEGAL / GOOD BOY\r
260 LDX 1,0 / BAD PEN CMD CAUSES XYPLOT ERROR 1\r
261 TRAP4 #ARGERR / FUCK OFF\r
262ALEGAL,\r
263 FLDA YDIFF / RESTORE THE NEW VALUE OF PEN\r
264 FSUB #XOLDP / COMPARE WITH THE OLD VALUE\r
265 JEQ NOCHNG / IF THEY MATCH THEN GOTO NOCHANGE\r
266 TRAP4 #XETUP / ELSE SET UP THE NEW PEN\r
267NOCHNG,\r
268 FLDA YDIFF / SAVE THE NEW PEN STATUS FOR THE NEXT CALL\r
269 FSTA #XOLDP\r
270 JA REALPT\r
271/\r
272/\r
273MAKINT, JA . / FOR ALL THOSE INTEGERIZATIONS REQUIRED\r
274 FADD PT5 / ROUND THE VALUE\r
275 ALN 0 / GET RID OF FRACTIONAL PART\r
276 FNORM / NORMALIZE IT FOR OTHER FPP OPE#XATIONS\r
277 JA MAKINT\r
278\f/ HERES THE CALCULATING PART OF THE PLOT ROUTINES\r
279PRERL1, FCLA\r
280PREREL, JA . / RTN USED AS SUBROUTINE\r
281REALPT, FLDA XPT / AND JA'D TO\r
282 FSUB #XXOLD / COMPARE NEW X AND OLD\r
283 FSTA XDIFF\r
284 JGE ABSDX\r
285 FNEG\r
286ABSDX, FSTA TERM1 / ABS DELTA X\r
287/\r
288 FSUB F4095 / IF THE DELTA X DOESN NOT FIT INTO\r
289 JLE DXOK / A 12 BIT PDP 8 WORD THEN TAKE ERROR 2 \r
290 LDX 2,0 / ELSE CONTINUE FI\r
291 TRAP4 #ARGER / HOME TO CCL\r
292DXOK, /\r
293/\r
294 FLDA YPT\r
295 FSUB #XYOLD / SAME FOR Y PNTS\r
296 FSTA YDIFF\r
297 JLE DELXY\r
298 FNEG\r
299DELXY, FADDM TERM1 / DX-DY\r
300/\r
301 FNEG / ABS DELTA Y --> FAC\r
302 FSUB F4095 / IF DELTA Y DOESN'T FIT INTO 12 BITS THEN \r
303 JLE DYOK / WE ERROR OFF ELSE CONTINUE FI\r
304 LDX 3,0 / THIS IS ERROR 3\r
305 TRAP4 #ARGER\r
306DYOK,/\r
307 TRAP3 #WRITO\r
308 JA UNIX80\r
309 JA FORM1\r
310 FLDA #XOLDP / GET ACTUAL PEN STATUS\r
311 FSUB P3\r
312 JLT DP0\r
313 FLDA# SDP / PEN 2 ( PEN UP)\r
314 JA DP1\r
315SDP, TEXT 'P'\r
316SDK, TEXT 'K'\r
317DP0, \r
318 FLDA# SDK\r
319DP1, TRAP3 #RSVO\r
320 JA DP4711\r
321 FLDA #XPENC\r
322 TRAP3 #RSVO\r
323 FLDA #XORGX\r
324 TRAP3 #RSVO\r
325 FLDA #XFCTX\r
326 TRAP3 #RSVO\r
327 FLDA #XINCX\r
328 TRAP3 #RSVO\r
329 FLDA XACT\r
330 TRAP3 #RSVO\r
331 FLDA #XORGY\r
332 TRAP3 #RSVO\r
333 FLDA #XFCTY\r
334 TRAP3 #RSVO\r
335 FLDA #XINCY\r
336 TRAP3 #RSVO\r
337 FLDA YACT\r
338 TRAP3 #RSVO\r
339DP4711,/\r
340 FLDA #XABSY / ABSOLUTE NUMBER OF STEPS\r
341 TRAP3 #RSVO\r
342 FLDA #XABSX\r
343 FNEG\r
344 TRAP3 #RSVO\r
345 TRAP3 #RENDO\r
346 JA NX1\r
347/FORM1, TEXT #(1X,A1,A6,2(I7,2F9.3,I8),2I6)#\r
348FORM1, TEXT #(1X,A1,2I6)#\r
349NX1,\r
350/\r
351 FLDA TERM1 / DETERMINE OCTANT + MAJOR AXIS\r
352 JGT XMAJ\r
353 FLDA YDIFF / Y AXIS IS MAJOR\r
354 FSTA MAJOR\r
355 FLDA XDIFF\r
356 FSTA MINOR\r
357 JA KNOWOC\r
358XMAJ, FLDA XDIFF / X AXIS MAJOR\r
359 FSTA MAJOR\r
360 FLDA YDIFF\r
361 FSTA MINOR\r
362KNOWOC, LDX 2,1 / 2*OCTANT VALUE COLLECTED IN XR1\r
363/ USES A SPECIAL (NON SEQUENTIAL) ORDERING\r
364 FLDA XDIFF\r
365 JLE .+4\r
366 ADDX 10,1\r
367 FLDA YDIFF\r
368 JLE .+4\r
369 ADDX 4,1\r
370 FLDA TERM1\r
371 JLE .+4\r
372 ADDX 2,1 / KEEP IT IN XR1\r
373 LDX 0,2\r
374 FLDA MAJOR / GET MAJOR MOVE\r
375 JGT POSMAJ / NEED AS ABS. VALUE\r
376 JEQ NOTHIN / IF NO MAJOR MOVES, THEN NO MOVES\r
377 FNEG\r
378 FSTA MAJOR / NO ABS. VALUE\r
379POSMAJ, JSA MAKINT\r
380 SETX #XDPXR\r
381 ATX 1 / PASS THIS TO PDP CODE\r
382 SETX XRPLOT\r
383/ USE 2 WORD #XATIO IN PDP CODE TO DET SEQ OF MOVES\r
384 FLDA MINOR\r
385 JGT POSMIN / ABS VALUE\r
386 JEQ ZROCAS\r
387 FNEG\r
388POSMIN, FDIV MAJOR / FORM #XATIO OF MINOR TO MAJOR MOVES\r
389 ALN 2\r
390ZROCAS, FSTA #XATIO / DOWN TO PDP CODE\r
391 XTA 1\r
392 SETX #XDPXR / GET 2*OCTATNT\r
393 ATX 0\r
394 SETX XRPLOT\r
395/ TRAP4 #XNPLT/ CXCX\r
396\fNOTHIN, FLDA PORS\r
397 JEQ REGPLT / 0 MEANS WAS FROM XYPLOT\r
398 JLT SYMSET / WAS A MOVE IN SYMBOL\r
399 FCLA / IS FIRST MOVE IN SYMBOL (0 ORG)\r
400 FSTA #XXOLD\r
401 FSTA #XYOLD\r
402 FSTA PORS\r
403 JA SYMSTR\r
404REGPLT, FLDA #XPENC\r
405 JLT ZEROLD / NEQ MEANS ZERO THE ORG\r
406/ SET X AND Y FOR NEXT MOVE TO START AT END OF THIS MOVE\r
407 FLDA XACT\r
408 FSTA #XXOLD\r
409 FLDA YACT\r
410 FSTA #XYOLD\r
411 JA PLTRTN\r
412SYMSET, FLDA XPT / CONT FROM CURRENT POINT\r
413 FSTA #XXOLD\r
414 FLDA YPT\r
415 FSTA #XYOLD\r
416 JA PRERL1\r
417/\r
418/ NEGATIVE PEN STATUS, SO WE ZERO THE ORIGIN\r
419/\r
420ZEROLD,\r
421 FLDA #XABSX / SAVE THE ACTUAL PEN POSITION (MOTOR STEPS)\r
422 FSTA #XORGX \r
423 FLDA #XABSY\r
424 FSTA #XORGY\r
425 FCLA\r
426 FSTA #XXOLD\r
427 FSTA #XYOLD\r
428 JA PLTRTN\r
429 ENTRY SYMSTR\r
430SYMST,\r
431 FLDA P1 / ENTERED WITH 36 BIT MODE TURNED ON\r
432 FSTA PORS / SET THE FROM SYMBOL FLAG\r
433 STARTD / USED BY SYMBOL FOR ORIGIN PLOT\r
434 FLDA SYMSTR / GET START OF ARG CHAIN\r
435 FSTA ARG1\r
436 LDX 1,1\r
437 JA SYMENT\r
438\f ENTRY WHERE / WITHOUT EFFECT OF FACTOR\r
439WB1, TEXT 'WHERE ' / THE WALK BACK WORD\r
440WHERE,\r
441 FLDA# WB1\r
442 FSTA WBW\r
443 JSA PLTSTR\r
444 JXN WH0,7 / NO PARAMETERS AT ALL THEN \r
445 TRAP4 #ARGER / ABORT THE USER PROGRAM\r
446/ WARNING: WHERE RETURNS A WRONG RESULT IF YOU CALL FACTOR PRIOR \r
447/ TO THE WHERE ROUTINE WITHOUT PLOTTING WITH XYPLOT.\r
448WH0,\r
449 FLDA% ARG1,1\r
450 FSTA TERM1 / ADDRESS OF X (FIRST PARAMETER)\r
451 FLDA% ARG1,1+\r
452 FSTA YDIFF / SAVE ADDRESS OF Y (SECOND PARAMETER)\r
453 STARTF\r
454 FLDA #XXOLD\r
455 FMUL #XINCX\r
456 FDIV #XFCTX / WHERE RETURNS X WITHOUT EFFECT OF FACTOR\r
457 FSTA% TERM1\r
458 JXN WH1,7+ / IF ONLY ONE PARAMETER, THEN ABORT USER\r
459 TRAP4 #ARGER\r
460WH1,\r
461 FLDA #XYOLD\r
462 FMUL #XINCY\r
463 FDIV #XFCTY / RETURNED WITHOUT EFFECT OF FACTOR\r
464 FSTA% YDIFF / SEND BACK THE VALUES\r
465 JXN WH2,7+ / IF ONLY TWO PARAMETERS, THEN ABORT USER\r
466 TRAP4 #ARGER\r
467WH2,\r
468 STARTD\r
469 FLDA% ARG1,1+\r
470 FSTA ARG2 / ADR. OF X -FACTOR (THIRD PARAMETER)\r
471 FLDA% ARG1,1+\r
472 FSTA ARG1 / ADR. OF Y -FACTOR (FOURTH PARAMETER) --> ARG1\r
473 STARTF\r
474 FLDA #XFCTX / IF THE X AND Y FACTOR MATCH THEN\r
475 FSUB #XFCTY\r
476 JNE WHXYF / WE NEED THREE PARAMETERS ONLY, ELSE WE GO WHXYF\r
477 FLDA #XFCTX\r
478 FSTA% ARG2\r
479 JXN PLTRTN,X7+ / IF THERE ARE ONLY THREE PARAMETERS THEN RETURN\r
480 FSTA% ARG1 / ELSE INSERT FACTOR INTO FOURTH PARAMETER AND\r
481 JA PLTRTN / RETURN\r
482WHXYF, / WE REQUIRE X AND Y FACTOR PARAMETERS\r
483 FLDA #XFCTX\r
484 FSTA% ARG2 / INSERT THE X FACTOR INTO THE OUTPUT\r
485 JXN WH3,X7+\r
486 TRAP4 #ARGER / SORRY, BUT THERE ARE NOT ENOUGH ARGUMENTS\r
487WH3,\r
488 FLDA #XFCTY\r
489 FSTA% ARG1\r
490 JA PLTRTN\r
491 ENTRY FACTOR / RESET FACTOR VALUE\r
492WB2, TEXT 'FACTOR'\r
493FACTOR,\r
494 FLDA# WB2\r
495 FSTA WBW\r
496 JSA PLTSTR\r
497 JXN FA0,7 / IF THERE ARE NO PARAMETERS AT ALL THEN\r
498 TRAP4 #ARGER / ABORT USER PROGRAM\r
499FA0,\r
500 FLDA% ARG1,1\r
501 FSTA ARG2\r
502 STARTF\r
503 FLDA% ARG2\r
504 JGE FA1 / IF NEGATIVE FACTOR THEN \r
505 TRAP4 #ARGER / ABORT USER PROGRAM ELSE\r
506FA1,\r
507 FSTA #XFCTX / STORE X AND Y FACTOR\r
508 FSTA #XFCTY / ONE PARAMETER MEANS X&Y GET THE SAME FACTOR\r
509 JXN FA3,7+\r
510 JA FACRTN\r
511FA3,\r
512 STARTD / TWO PARAMETERS, GET THE Y FACTOR\r
513 FLDA% ARG1,1+\r
514 FSTA ARG2\r
515 STARTF\r
516 FLDA% ARG2\r
517 JGE FA2 / IF NEGATIVE FACTOR THEN \r
518 TRAP4 #ARGER / ABORT USER PROGRAM\r
519FA2,\r
520 FSTA #XFCTY\r
521FACRTN,\r
522 STARTF\r
523 JA PLTRTN\r
524\f/ MUST DO A PLOTS AS FIRST ROUTINE IN ANY PLOTTING SEQUENCE\r
525/ USER SPECIFIES INCREMENT AND MACHINE TYPE (0=8/E, 1=12,8/I,8/L)\r
526 ENTRY PLOTS\r
527WB3, TEXT 'PLOTS '\r
528/\r
529/ CONSTANTS USED IN PLOTS\r
530/\r
531INXYPL, F 0.0095 / INCREMENT SIZE XY PLOTTER\r
532INX80Y, F 0.02648 / INCREMENT SIZE X80-SP X DIRECTION (96 CHAR. LINE)\r
533INX80X, F 0.03968 / INCREMENT SIZE X80-SP Y DIRECTION (6 STEPS PER LINE)\r
534FORM2, TEXT "(' [STP 6'/' MC1'/' P 0 0')"\r
535FORM3, TEXT "(' STP 8]')"\r
536UNIX80, F 2.\r
537/\r
538/\r
539PLOTS, / CALL PLOTS (PLOTTER TYPE, MACHINE TYPE)\r
540/\r
541/ INTEGER PLOTTER TYPE: 1 XY PLOTTER\r
542/ 2 X80-SP PRINTER PLOTTER\r
543/ 3 BOTH (DOESN'T WORK TODAY)\r
544/ INTEGER MACHINE TYPE: 0 PDP 8/E\r
545/ 1 OTHER PDP 8 OR 12\r
546/\r
547\r
548 FLDA# WB3\r
549 FSTA WBW\r
550 JSA PLTSTR\r
551 FLDA% ARG1,1\r
552 FSTA XPT\r
553 FLDA% ARG1,1+\r
554 FSTA ARG1\r
555 STARTF / THIS ROUTINE SETS UP A LOT OF CONSTANTS\r
556 FLDA% XPT / LOAD FIRST ARGUMENT (PLOTTER TYPE ) --> FAC\r
557/ JLE PLTSER / WRONG INPUT PARAMETER, ERROR OFF\r
558 FSUB P1\r
559 JGT PLS1\r
560 FLDA INXYPL / XY PLOTTER INCREMENT\r
561 FSTA #XINCX\r
562 FSTA #XINCY\r
563 JA MACHIN\r
564PLS1, FSUB P1\r
565/ JGT PLS2 / BOTH PLOTTER TYPES\r
566 FLDA INX80X\r
567 FSTA #XINCX / X80 SP PRINTER PLOTTER\r
568 FLDA INX80Y\r
569 FSTA #XINCY\r
570 TRAP3 #WRITO\r
571 JA UNIX80\r
572 JA FORM2 / ' [STP6'/' MC1'/' P 0 0'\r
573 TRAP3 #RENDO\r
574MACHIN,\r
575 FLDA% ARG1\r
576 JEQ EIGHTE\r
577 FLDA P22 / SET MATCHTP TO 22 IF NON-8/E\r
578EIGHTE, SETX #XCHTP\r
579 ATX 0 / 0=8/E, 022=12,8/I,8/L\r
580 XTA 0\r
581 SETX #XCHCK / FOR INITIALISATION CHECK\r
582 ATX 0\r
583 SETX XRPLOT\r
584 TRAP4 #XNTST\r
585 FLDA P1\r
586 FSTA #XFCTX / FACTOR=1 INITIALLY\r
587 FSTA #XFCTY\r
588 FCLA\r
589 FSTA #XOLDP / AND REALLY MOVE IT!\r
590 FSTA #XPENC / SO WILL DO FIRST PEN MOVEMENT\r
591 FSTA #XXOLD\r
592 FSTA #XYOLD\r
593 FSTA #XORGX\r
594 FSTA #XORGY\r
595 FSTA PORS\r
596 JA PLTRTN\r
597 ENTRY PLEXIT / BE SHURE ALL DONE\r
598WB4, TEXT 'PLEXIT'\r
599PLEXIT,\r
600 FLDA# WB4\r
601 FSTA WBW\r
602 JSA PLTSTR\r
603 STARTF\r
604 TRAP3 #WRITO\r
605 JA UNIX80\r
606 JA FORM3\r
607 TRAP3 #RENDO\r
608 TRAP3 #REW / OUTPUT REMAINDER OF BUFFER AND RESET OUTPUT (NOT GOOD FOR FILE STRUCTURED DEVICES!!!!!)\r
609/ TRAP4 #XDNCK\r
610 JA PLTRTN\r
611\f SECT #SYMBL\r
612 EXTERN SIN\r
613 EXTERN COS\r
614 EXTERN #XMBTB / HERE STARTS THE SYMBOL TABLE\r
615/\r
616/ EXTERNAL REFERENCES INTO FIELD 1 (PDPPLT)\r
617/\r
618 EXTERN #XTXAD\r
619 EXTERN #XLTCD\r
620 EXTERN #XPNOP\r
621 EXTERN #XLEFT\r
622 EXTERN #XRGHT\r
623 EXTERN #XNDLF\r
624 EXTERN #XNDRT\r
625 EXTERN #XPSNM\r
626 EXTERN #XPSIN\r
627/\r
628/\r
629 ENTRY SYMBOL\r
630WB5, TEXT 'SYMBOL'\r
631SYMBOL,\r
632 FLDA# WB5\r
633 FSTA WBW\r
634 JSA PLTSTR\r
635 JSR #XMBTB / LOAD THE SYMBOL TABLE ( SYMBTB )\r
636SYM1, FLDA% ARG1,1\r
637 FSTA XPT / X POINT\r
638 FLDA% ARG1,1+\r
639 FSTA YPT / Y VALUE\r
640 FLDA% ARG1,1+\r
641 FSTA YDIFF / HEIGHT\r
642 FLDA% ARG1,1+\r
643 FSTA TERM1 / TEXT\r
644 FLDA% ARG1,1+\r
645 FSTA TERM2 / ANGLE\r
646 FLDA% ARG1,1+\r
647 FSTA ARG1 / NUMBER CHARS.\r
648 STARTF\r
649 FLDA% TERM2\r
650 FMUL DEGRAD / CONVERT TO RADIANS\r
651 FSTA XCHRPT / THEN DONT NEED SIND\r
652 FLDA% XPT\r
653 FSTA COSANG / VALUE OF X\r
654 FSUB F999 / IF X NEQ 999 THEN \r
655 JNE SY0 / WE USE THE X VALUE SPECIFIED ELSE\r
656 FLDA #XXOLD / WE START WITH THE OLD VALUE\r
657 FMUL #XINCX / THIS WILL CAUSE SOME TRUNCATION ERROR\r
658 FDIV #XFCTX / IN XYPLOT ROUTINE BUT THE ERROR IS SMALL\r
659 FSTA COSANG / AND WE HOPE FAC > 0 BUT THIS MUST NOT BE SO!\r
660SY0,\r
661 FLDA% YPT\r
662 FSTA SINANG\r
663 FSUB F999 / IF Y NEQ 999 THEN\r
664 JNE SY1 / WE USE THE Y VALUE SPECIFIED ELSE\r
665 FLDA #XYOLD / WE START WITH THE OLD Y VALUE\r
666 FMUL #XINCY / THIS CAUSES SOME TRUNCATION ERRORS\r
667 FDIV #XFCTY\r
668 FSTA SINANG\r
669SY1,\r
670 FCLA\r
671 FSTA #XTXAD\r
672 FSTA #XPENC / SO ALWAYS DOES INITIAL PEN U/D\r
673 FSTA CENTSY\r
674 FLDA TERM1 / GET TEXT ADDRESS\r
675 FSTA #XTXAD / PUT IT DOWN IN PDP PART\r
676\f FLDA% YDIFF / ASSUME ITS A REGULAR\r
677 JGE NOTNEG / NEGATIVE SIZE IS NOT NICE\r
678 FNEG\r
679NOTNEG, FDIV PF7 / ADJUST LATER IF A CENT\r
680 FSTA ANGADJ\r
681 FLDA% ARG1 / SHOWNS NUM. CHARS + PEN STATUS\r
682 FSTA NUMSYM\r
683 JGE REGSYM / GT OR =0 IS REG SYM\r
684 FLDA% TERM1 / CHECK FOR REG CHAR PASSED\r
685 FSUB F100 / AS AN INTEGER EQUIV.\r
686 JLT INTEQ / ITS A INTEGER EQUIV\r
687 FLDA% YDIFF / CENTERED SYMBOL\r
688 JGE NOTNG1\r
689 FNEG\r
690NOTNG1, FDIV P4\r
691 FSTA ANGADJ\r
692 FLDA NUMSYM / -1=PEN UP, -2=PEN DOWN (CNTRD ONLY)\r
693 FADD P1\r
694 JGE UPPEN / MOVE WITH PEN UP\r
695 FSTA CENTSY / NEG MEANS DOWN FROM THE START\r
696PTITON, FLDA PF2\r
697CPEN, FSTA YCHRPT / =-2 FOR DOWN (CENT. + INTEQ ONLY)\r
698 / -3 FOR UP FOR ALL SYMBOLS + INTEQ\r
699 JSA SYMSTR / PLOT ORIGIN\r
700 JA .+10\r
701 JA COSANG\r
702 JA SINANG\r
703 JA YCHRPT\r
704 FLDA XPT\r
705 FMUL #XFCTX\r
706 FSTA XREAL / KEEP TRACK OF PASSED VALUES\r
707 FLDA YPT\r
708 FMUL #XFCTY\r
709 FSTA YREAL\r
710 JSA PENUP\r
711 FLDA CENTSY\r
712 JLE PENOK\r
713 JSA PNDOWN / PUT PEN DOWN NOW (CENT ONLY)\r
714PENOK, JSR SIN\r
715 JA .+4\r
716 JA XCHRPT\r
717 FMUL ANGADJ\r
718 FSTA SINANG / SAVE SIN+HGT, USE FOR ALL VALUES\r
719 JSR COS\r
720 JA .+4\r
721 JA XCHRPT\r
722 FMUL ANGADJ\r
723 FSTA COSANG / COS(ANGLE)+HGT (IN INCREMENTS NOW)\r
724 LDX 0,4 / ZERO STEP COUNT\r
725 FLDA NUMENT\r
726 JGT NUM2 / JUMP IF FROM NUMBER\r
727 JA FSTLFT\r
728UPPEN, FLDA P3 / \r
729 FSTA CENTSY / PUT PEN DOWN AFTER INITIAL MOVE\r
730 JA CPEN / MOVE WITH PEN UP\r
731\fPENSET, JSA PNDOWN\r
732ONEXY, JA .\r
733 SETX #XLTCD\r
734 XTA 2 / SET Y\r
735 FSTA YCHRPT\r
736 XTA 1 / GET X\r
737 FSTA XCHRPT / GET FIRST MOVE\r
738 SETX XRPLOT\r
739 FSUB PF7 / 7,0=PEN UP, 7,7=END\r
740 JEQ PENUPM\r
741 FLDA CENTSY\r
742 JEQ CALALL / CENTEREDS REQUIRE MODIFIED ORIGIN\r
743 FLDA PF2\r
744 FNEG\r
745 FADDM XCHRPT\r
746 FADDM YCHRPT\r
747CALALL, JSA CALANG\r
748 JXN PENSET,5 / PUT PEN BACK DOWN IF NEG\r
749 JA ONEXY\r
750INTEQ, FLDA NUMSYM / CHECK ON PEN\r
751 FADD P1\r
752 JLT PTITON\r
753REGSYM, FLDA P3\r
754 JA CPEN\r
755PENUPM, JSA PENUP\r
756 FLDA YCHRPT / CHECK FOR 7,7 END\r
757 FSUB PF7\r
758 JEQ NXTCHR / JUMP IF END OF CHARACTER\r
759 JA ONEXY / ON TO NEXT PAIR\r
760PENUP, JA .\r
761 LDX 1,5 / SET FOR PEN UP\r
762 SETX #XDPXR\r
763 LDX 0,0 / PASS A ZERO FOR UP\r
764 SETX XRPLOT\r
765/ TRAP4 #XPNOP\r
766 FLDA# SDP / 'P' PEN UP\r
767 FSTA SYMPEN\r
768 JA PENUP\r
769PNDOWN, JA .\r
770 SETX #XDPXR\r
771 LDX 1,0 / PASS A ONE FOR DOWN\r
772 SETX XRPLOT\r
773/ TRAP4 #XPNOP\r
774 FLDA# SDK / 'K' PEN DOWN\r
775 FSTA SYMPEN\r
776 LDX 0,5\r
777 JA PNDOWN\r
778\fSYMPEN, F 0.0\r
779CALANG, JA .\r
780 FLDA YCHRPT\r
781 FDIV #XINCY\r
782 FSTA YCHRPT / Y MOVE AS STEPS (UNITERGERIZED)\r
783 FMUL SINANG\r
784 FNEG\r
785 FSTA TERM1 / =-SINA*Y\r
786 FLDA XCHRPT\r
787 FDIV #XINCX\r
788 FSTA XCHRPT\r
789 FMUL COSANG\r
790 FADD TERM1\r
791 FMUL #XFCTX\r
792 JSA MAKINT\r
793 FSTA XACT / FOR AT END OF TEXT\r
794 FSTA XPT / X*COSA+OLDX-SINA*Y\r
795/ REQUIRES AN OLDX+OLDY TERM, BUT I DO THIS ALL REL TO A\r
796/ LOGICAL 0,0 FOR EACH CHAR, SO I #XLEFT THEM OUT.\r
797 FLDA YCHRPT\r
798 FMUL COSANG\r
799 FSTA TERM1 / COSA*Y\r
800 FLDA XCHRPT\r
801 FMUL SINANG\r
802 FADD TERM1\r
803 FMUL #XFCTY\r
804 JSA MAKINT\r
805 FSTA YACT\r
806 FSTA YPT / NEWX*SINA*OLDY*COSA*Y\r
807 FLDA P1\r
808 FSTA #XPENC / USE SAME ORIGIN THROUOUT THE LETTER\r
809 FNEG\r
810 FSTA PORS\r
811/ JSA PREREL / PEN MUST BE IN NEC POS BY NOW\r
812 TRAP3 #WRITO\r
813 JA UNIX80\r
814 JA FORM1\r
815 FLDA SYMPEN\r
816 TRAP3 #RSVO\r
817 FLDA YREAL\r
818 FDIV #XFCTY\r
819 FADD YPT\r
820 FADD #XORGY\r
821 TRAP3 #RSVO\r
822 FLDA XREAL\r
823 FDIV #XFCTX\r
824 FADD XPT\r
825 FADD #XORGX\r
826 FNEG\r
827 TRAP3 #RSVO\r
828 TRAP3 #RENDO\r
829 JA CALANG\r
830\fLEFTJS, XTA 4 / NUM OF MOVES\r
831 SETX #XLTCD\r
832 ATX 0 / PASS NUMBER OF STEPS INTO LETTER\r
833 SETX XRPLOT\r
834 TRAP4 #XLEFT / RETURN WITH A X,Y PAIR\r
835 JSA ONEXY\r
836 XTA 4\r
837 SETX #XLTCD\r
838 ATX 0 / STEP COUNT\r
839 SETX XRPLOT\r
840 JNE NOTFST / CHANGE IF BEFORE FIRST MOVE OF CHARACTER\r
841 JSA PNDOWN / PUT PEN DOWN NOW\r
842NOTFST, TRAP4 #XRGHT / SET NEXT XY PAIR\r
843 JSA ONEXY\r
844 ADDX 1,4 / UPDATE COUNT\r
845 JA LEFTJS / 77 AT END OF CHAR USED TO DET END\r
846\fCENTEX, JSA PENUP\r
847 JA CENTOO\r
848NXTCHR, FLDA CENTSY\r
849 JNE CENTEX / LEAVE PEN AT CENTER FOR CENTS ONLY\r
850 FSTA YCHRPT\r
851 FLDA PF7\r
852 FSTA XCHRPT / MOVE PEN TO 7,0 FOR REG CHARS\r
853 JSA CALANG / PLOT IT\r
854 FLDA XACT / UPDATE COLLECTIVE ENDING X VALUE\r
855 FMUL #XFCTX / WITH EFFECT OF FACTOR\r
856 FADDM XREAL / ALSO WITH EFFECT OF FACTOR\r
857 FLDA YACT / UPDATE COLLECTIVE ENDING Y VALUE\r
858 FMUL #XFCTY / WITH EFFECT OF FACTOR\r
859 FADDM YREAL\r
860CENTOO, LDX 0,4 / ZERO STEP NUM WITHIN CHAR\r
861 FCLA\r
862 FSTA #XXOLD\r
863 FSTA #XYOLD\r
864 FLDA P1\r
865 FNEG\r
866 FADD NUMSYM / UPDATE COUNTER\r
867 JLE SYMDON / NO MORE\r
868 FSTA NUMSYM / MORE, SAVE COUNT\r
869 FLDA NUMENT\r
870 JGT NUM3 / EXIT FOR NUM SUBR\r
871 FCLA\r
872 JXN RTCHAR,3 / 1=CHAR IS #XRGHT SIX BITS\r
873FSTLFT, LDX 1,3 / POINT TO #XRGHT 6 WHEN TIME FOR NEXT CHAR\r
874 FLDA NUMSYM\r
875 JLT NUM5 / JUMP IF CENTERED SYM OR INTEQ\r
876/ CENTEREDS + INTEQ EQUIV PASSING 3 WORD VALUE IN NUM5\r
877/ REG SYM USES PDP ROUTINE TO GET ONE WORD OF LIST\r
878 FCLA\r
879 TRAP4 #XNDLF\r
880 JA LEFTJS / GO PLOT THE ACTUAL CHAR\r
881RTCHAR, LDX 0,3 / POINT TO #XLEFT 6 BITS FOR NEXT TIME\r
882 TRAP4 #XNDRT\r
883 JA LEFTJS\r
884SYMDON, FCLA\r
885 FSTA PORS\r
886 FSTA NUMENT\r
887 FLDA XREAL / UPDATES ORG X VALUE\r
888 FDIV #XFCTX\r
889 JSA MAKINT\r
890 FSTA #XXOLD\r
891 FLDA YREAL / UPDATES ORG Y VALUE\r
892 FDIV #XFCTY\r
893 JSA MAKINT\r
894 FSTA #XYOLD\r
895 JA PLTRTN / NOW CAN CONTINUE PLOT FROM HERE\r
896\f/ SPECIAL ENTRY FOR NUMBER SUBROUTINE\r
897 ENTRY SYMB\r
898WB6, TEXT 'SYMB '\r
899SYMB,\r
900 FLDA# WB6\r
901 FSTA WBW\r
902 JSA PLTSTR / SPECIAL ENTRY FOR NUMBER SUBROUTINE\r
903 JSR #XMBTB / LOAD THE SYMBOL TABLE (SYMBTB)\r
904 STARTF\r
905 FLDA P1\r
906 FSTA NUMENT\r
907 STARTD\r
908 JA SYM1\r
909NUM2, SETX NUMENT / FOR NUMBER SUBROUTINE ONLY\r
910 / HERE ONLY FOR FIRST NUMBER OF STRING\r
911 LDX -1,2\r
912NUM3, JSA GETARG / FOR SECOND AND LATER NUMBERS\r
913 TRAP4 #XPSNM\r
914 JA LEFTJS\r
915NUM5, SETX NUMENT / FOR INTEQ + CENETEREDS\r
916 LDX -1,2\r
917 JSA GETARG\r
918 TRAP4 #XPSIN\r
919 JA LEFTJS\r
920GETARG, JA .\r
921 SETX NUMENT / USED FOR MORE THAN ONE CHARACTER\r
922 STARTD\r
923 FLDA #XTXAD+1 / CENTEREDS SYMBOLS AND NUM SUBROUTINE\r
924/ PASS VALUES AS THREE WORDS\r
925 FSTA ARG1\r
926 STARTF\r
927 FLDA% ARG1,2+ / PASS A NUMBER\r
928 SETX #XTXAD\r
929 JSA MAKINT\r
930 ATX 0\r
931 SETX XRPLOT\r
932 JA GETARG\r
933 END\r
934
935\1a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0