3 / PART ONE OF DEC'S XYPLOT DEC-S8-LPLTA-A-LA JULY 1973 M. HURLEY
4 / INCLUDED IS THE LATEST UPDATE F4 4.AAAA FROM LIBRARY FORLIB.RL NOV. 77
5 / COPIED: J.J. ANDRES 1.NOV. 1980
7 / PLOTTER ROUTINES FOR OS8 FORTRAN 4 FOR LAB 8/E ONLY!
8 / VER 1.0 1. NOV. 1980 H.A.
9 / VER 2.0 12. NOV. 1980 H.A.
10 / VER 2.1 18. NOV. 1981 H.A.
13 / 1. PLEXIT DISABLED THE PLOTTER INTERRUPTS AT ALL AND PLOTS DID
14 / NOT SWITCH THEM ON A SECOND TIME.
15 / 2. X-Y PLOTTER CANNOT BE DRIVEN TO THE ORIGIN (0,0) BY PLOTS.
16 / * #XNTST IS CALLED FROM PLOTS EACH TIME PLOTS ITSELF IS CALLED.
17 / * NOW #XNTST TEST AND SETS THE ONCE FLAG.
18 / * #XNTST PUSHES THE PLOTTER 4095 TIMES INTO THE LOWER LEFT CORNER.
20 / 3. #XMSMBP = ADDR SYMBTB
21 / #XSMBP = ADDR SYMCNT
22 / THESE TWO VALUES ARE NOW INSERTED VIA A CALL TO SYMBOL.
23 / SYMBOL CALLS #XMBTB TO SWAP IN THE SYMBOL TABLE OVERLAY.
27 / THE PDP8 CODE LOCATED IN FIELD 1
30 / INTO THESE WORDS SYMBOL INSERTS THE ADR. OF THE SYMBOL TABLE AND LENGTH
31 / THIS MUST BE DONE SINCE THE SYMBOL TABLE #XMBTB MAY BE LOCATED INTO
32 / AN OVERLAY AND THEREFORE THE ADDR DIRECTIVE WILL PRODUCE WRONG CODE.
33 / THE LOADER INSERTS THE ADR. OF THE OVERLAY LOADER BUT NOT THE DESIRED
39 / EXTERNAL REFERENCED FROM XYPLOT ONLY
41 / ENTRIES USED BY XYPLOT:
59 / ENTRIES USED BY SYMBOL
71 PLCE= 06500 / CLEAR INTERRUPT ENABLE
72 PLSF= 06501 / SKIP ON PLOTTER FLAG SET
73 PLCF= 06502 / CLEAR PLOTTER FLAG
74 PLLR= 06504 / LOAD PLOTTER DIRECTION REGISTER
75 PLSE= 06507 / SET INTERRUPT ENABLE
79 / ALL THESE ROUTINES USES XRS TO GET ARGS FROM FPP CODE
82 /ASSUMES USER ADDED 6502(CLEAR FLAG) TO FRTS CLEAR QUEUE
83 #XNTST, ORG .+1 / INIT PTRS + ADD JOB TO INTERRUPT QUEUE
84 CLA CMA / SET UP POINTERS
85 DCA% PBFCNT+1 / COUNTER FOR LOCN OF NEXT CHARACTER TO PLOT
86 TAD UBUFL / COMPL. LENGTH OF BUFFER --> AC
87 DCA% PMBFLG+1 / RESET BUFFER POINTERS
93 DCA% PDISMS+1 / FOR HANG
94 ISZ ONCE / TEST THE ONCE ONLY FLAG
96 JMS% VONQI+1 / ADD PLOTTER INTO THE INTERRUPT QUEUE ONLY ONCE
97 PLSF / CODE TO DETECT IF PLOTTER INTERRUPTED
98 ADDR INTPLT / ADR. OF INTERRUPT SERVICE ROUTINE
100 DCA ONCE / CLEAR THE ONCE ONLY FLAG TO ZERO
101 / THIS IS FOR GUYES PLOTTING MORE THAN 4095 DRAWINGS WITH ONE PROGRAM.
102 / SOME PEOPLE ARE CRAZY, AREN'T THEY?
103 DCA PREP / SET UP COUNTER TO RESET PEN TO ORIGIN 0,0
104 TAD PENUP / LIFT PEN AND THEN
107 TAD DECRXY / GO 4096 STEPS TO THE LEFT CORNER DOWN
109 PLCF / CLEAR FLAG FROM THE LAST STEP
110 ION PLSE / ENABLE PLOTTER INTERRUPTS
114 / THIS ROUTINE RESETS X-Y PLOTTER TO 0,0
120 ISZ PREP / REPEAT 4096 TIMES
131 ONCE, 7777 / TO ADD PLSF INTO INTERRUPT QUEUE ONLY ONCE
134 /THIS ROUTINE CALLED ONCE FOR EACH CALL TO XYPLOT
135 /AND DOES INITAL PEN UP OR DOWN
137 TAD #XETXR / GET PEN STATE
139 CLL RAR / LOOK AT 3 BITS
159 / FPP 12 VARIABLES SET BY XYPLOT WICH MAY NOT BE LOADED INTO AN OVERLAY
161 #XOLDP, ORG .+3 / VALUE OF PEN AT LAST XYPLOT
162 #XXOLD, ORG .+3 / OLD X PT WITH EFFECT OF FACTOR
163 #XYOLD, ORG .+3 / OLD Y PT WITH EFFECT OF FACTOR
164 #XPENC, ORG .+3 / OLD PEN STATUS (SYMBOL & NUMBER)
165 #XINCR, ORG .+3 / INCREMENT SIZE DEPENDENT OF EACH PLOTTER
166 #XFCTX, ORG .+3 / X - FACTOR
167 #XFCTY, ORG .+3 / Y - FACTOR
169 UBUFL, -BUFFL / LENGTH OF BUFFER
170 USBFMN, ZBLOCK BUFFL / PLOTTING BUFFER
173 / THESE ROUTINES GET THE PLOTTING CODES WITHIN A LETTER
174 / PASS THEM AS X,Y PAIRS FOR PLOT ROUTINE
176 JMS GETXYS / GET A #XLEFT HAND X,Y PAIR
185 DCA LETCD2 / SAVE X,Y PAIR
188 RAR / GET IN LO THREE BITS
190 DCA LETCD1 / PASS X VALUE
191 TAD LETCD2 / NOW FOR THE Y PART
193 DCA LETCD2 / PASS THE Y VALUE
195 #XRGHT, 0 / GET A #XRGHT HAND X,Y PAIR
203 \f/ THIS ROUTINE GETS X,Y PAIRS FROM THE PACKED SEQ FOR EACH LETTER
207 TAD LOCNPT / START OF LETTER CODE
208 DCA LETCD2 / UPDATE PTR TO LETTER
209 RAL / IF LINK SET, CROSSED FIELDS, SO UPDATE FIELD
211 TAD LOCNFL / FIELD PASSED FROM FINDIT ROUTINE
217 TAD% LETCD2 / GET PLOTTING CODES
223 \f/ HERES START OF THE TABLE FOR PDP-8 ES
224 OCT8BL, 6503 / PEN UP
226 / GEOM. OCTANT 1=CODED OCTANT 8, 2=7, 3=3, 4=4, 5=2, 6=1, 8=6
243 / THIS IS THE START OF THE PLOT VECTOR TABLE FOR PDP-12S
262 \f/ FIGURE OUT IF A MAJOR MOVE OR MAJ+MINOR
267 DCA HOLD2 / ADD LO WORDS
270 TAD HOLD1 / ADD HIGH WORDS
276 JMP MAJONL / NO-MAJOR MOVE ONLY
277 CLL RAR / PUT IT BACK-1
280 JMP% FIGURE / RETURN WITH AC=1
282 JMP% FIGURE / RETURN WITH ZERO AC
283 #XATIO, 0 / #XATIO CALCULATED IN REALPT
288 / INITIALIZE HOLD1+2 TO A ROUNDING FUDGE
294 RFUDGE, 1000 / TAKES CARE OF TRUNCATION ERRORS
297 PLETPS, ADDR LOCNPT / POINTS TO START OF CODE FOR PASSED LETTER
298 COUNT, / COUNT OF STEPS INTO CHAR PLOTTING CODE TABLE
299 PLCNM1, ADDR LOCNFL / USED TO PASS FIELD
302 0 / ADDRESS OF PACKED 6 BIT LETTERS TO PRINT
304 #XSMBP, / HERE WE INSERT THE ADR. OF THE SYMBOL TABLE
307 / THESE ROUTINES DETERMINE THE START OF PLOTTING CODES FOR A CHARACTER
308 / PASSED AS A HOLERITH (6 BIT) FROM SYMBOL ROUTINE.
309 / FIND LOCATION OF START OF PLOT VECTORS
310 / FOR THE #XLEFT HALF OF 2 6 BIT CHARACTERS
312 TAD #XTXAD+1 / DO FIELD STUFF
319 TAD% #XTXAD+2 / GET TWO 6 BIT VALUES
323 TAD LETTER / MOVE #XLEFT CHARACTER
327 AND P77 / INTO THE #XRGHTMOST 6 BITS
329 ISZ #XTXAD+2 / PREPARE FOR NEXT CHARACTER TO #XLEFT
330 JMP FLDOK / IF SKIPS, THEN AT FIELD BOUNDARY
331 ISZ #XTXAD+1 / SO UPDATE FIELD ALSO
334 \fFINDIT, 0 / GET LOC OF LETTER IN SYMBOL TABLE
335 SPA SNA / CHECK FOR ZERO
336 TAD P40 / WHICH DEFAULTS TO SPACE
337 CIA CLL / MAKE A COUNTER
339 DCA COUNT / ZERO TOTAL STEP COUNTER
341 DCA NXTLCN / POINTS TO LOCN IN POINTER TABLE
342 / THIS TABLE HAS STEPS FOR EACH LETTER, SO
343 / COUNT TOTAL STEPS TO DESIRED LETTER
350 TAD% NXTLCN / GET NEXT STEP COUNT
352 TAD COUNT / AND ADD IT TO TOTAL STEP COUNT
354 ISZ NXTLCN / BUMP POINTER
355 SKP / SKIP IF DIDN'T CROSS BOUNDARIES
356 TAD P10 / IT DID, UPDATE FIELD WORD
360 JMP SCANTB / NOT THERE YET
362 TAD COUNT / ADD COUNT TO
363 TAD PSYMB+1 / START OF CODE TABLE
364 DCA% PLETPS+1 / NOW IT'S CORRECT POINTER
365 RAL / IF LINK SET, WE CROSSED FIELD BOUNDARIES
366 TAD PSYMB / GET FIELD OF TABLE
367 DCA% PLCNM1+1 / PASS IT
368 JMP% FINDIT / GOT THE LETTER
371 #XMCNT, / HERE WE INSERT THE POINTER INTO THE SYMBOL TABLE
376 TAD LETTER / #XLEFT FROM LAST #XLEFT LETTER
381 / ROUTINE TO HANDLE NUMBERS FROM FORTRAN SUBR. NUMBER
382 / NOT CALLED BY USER DIRECTLY
387 JMP USZRO / IF EQ -1, USE 0
390 JMP USZRO / SO USE ZERO
392 SPA CLA / G.T. 9 BAD TOO
393 JMP USEIT / IT'S -3,-2,0-9
395 INDEX, TAD P60 / INDEX INTO TABLE
401 / PLOT AN INTEGER EQUIV OR CENTERED (100-117 DEC =144-165 OCT)
404 SPA SNA / .L.T. ZERO NO GOOD
406 TAD M166 / G.T. 117 DEC. BAD
411 JMP OKVAL / ITS A CENTERED 100-121 (0144-0165)
414 JMP USSPAC / 0100-0143 ILLEGAL
420 TAD P40 / DEFAULT TO SPACE
422 OKVAL, TAD P100 / PASS CENTERED AS 100-121
433 #XNPLT, 0 / NON INTERRUPT TIME PLOT ROUTINE
437 JMS% PSPCAS+1 / PREP FOR OCTANT CHECK
439 JMP ANOTHR / DO ANOTHER STEP
440 DONE, CDF CIF / ALL DONE WITH THIS VECTOR
442 ANOTHR, JMS% PFIGUR+1 / TO FIGURE OUT IF MAJ OR DIAG
443 / RETURNS ZERO IF MAJOR ONLY, 1 IF MAJ + MINOR
448 TAD POCTBL+1 / START OF VECTOR TABLE
449 TAD #XCHTP / ADD 22 IF A PDP-12 OR NON 8-E
450 DCA PLTVCT / SAVE POINTER TO PROPER PLOT VECTOR
452 TAD BUFCNT / GET NUM. CHARACTERS IN BUF -1
453 TAD MBUFLG / AND MINUS LENGTH
456 JMP ISROOM / STILL ROOM IN BUFFER
457 IOF / NO ROOM YET, GO TO HANG
461 ION / HANG LEAVES INTERRUPT OFF
462 ISROOM, TAD% PLTVCT / NOW GET THE VECTOR
463 DCA% PICHAR+1 / INTO BUFFER
464 ISZ PICHAR+1 / UPDATE LOCN
467 TAD PBMX+1 / ARE WE OVERFLOWING MAX LOCN OF BUFFER
471 TAD PBMN+1 / YES, RESET TO BOTTOM
473 LIMOK, ISZ BUFCNT / UPDATE CHAR COUNT
474 / IF EMPTY WAS -1, SO NOW 0
475 JMP% PLDBL / WASNT EMPTY-CANT START TO PLOT
478 TAD #XDPXR / USE AS INDEX INTO OPCODE TABLE
486 INTFLG, / HANG ALWAYS FIELD 0
498 TAD% POCHAR+1 / GET NEXT LINE TO PLOT
499 DCA QTEMP5 / SAVE ACTUAL VECTOR FOR A SECOND
503 TAD PBMX+1 / CHECK THAT OUTPUT DOESNT OVERFLOW THE BUFFER
508 DCA POCHAR+1 / RESET IT
510 TAD QTEMP5 / GET VARIABLE
511 AND A7000 / DETERMINE TYPE OF PLOTTER
513 JMP PENUD / A PEN OP (PDP-12 OR 8/E)
514 TAD QTEMP5 / ITS AN 8E
518 PENUD, TAD QTEMP5 / ITS A 12 OR NON-8/E PEN UP OR DOWN
520 JMP TWOWD / IT'S A TWO WORD IOT
521 QTEMP5, NOP / 1-WORDER SO DO IT NOW
524 JMP% PLDBL / DONE FOR NON-INTERRUPT
525 DCA INTFLG / INT MODE, CLEAR FLAG
530 TWOWD, 6514 / DRUM DOWN
531 6521 / SECOND PART PEN #XLEFT
533 \fINTPLT, 0 / HERE ONLY IF FLAG SET
535 TAD BUFCNT / DECREMENT BUFFER COUNTER
539 ISZ INTFLG / SHOULD NEVER SKIP
543 DCA BUFCNT / INITIALIZE BUFFER CNT-1
545 JMP% INTPLT / EXIT IN FIELD 1
546 / BE SHURE BUFFER EMPTY BEFORE EXITING
549 JMS PLDBL / DO A FINAL PEN UP
552 JMP WAIT / STILL MORE TO DO
555 6500 / CLEAR INTERRUPT ENABLE FOR 8-ES