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.
11 / VER 2.2 4. AUG. 1982 H.A.
14 / 1. PLEXIT DISABLED THE PLOTTER INTERRUPTS AT ALL AND PLOTS DID
15 / NOT SWITCH THEM ON A SECOND TIME.
16 / 2. X-Y PLOTTER CANNOT BE DRIVEN TO THE ORIGIN (0,0) BY PLOTS.
17 / * #XNTST IS CALLED FROM PLOTS EACH TIME PLOTS ITSELF IS CALLED.
18 / * NOW #XNTST TEST AND SETS THE ONCE FLAG.
19 / * #XNTST PUSHES THE PLOTTER 4095 TIMES INTO THE LOWER LEFT CORNER.
21 / 3. #XMSMBP = ADDR SYMBTB
22 / #XSMBP = ADDR SYMCNT
23 / THESE TWO VALUES ARE NOW INSERTED VIA A CALL TO SYMBOL.
24 / SYMBOL CALLS #XMBTB TO SWAP IN THE SYMBOL TABLE OVERLAY.
26 / 4. THE AMOUNT OF EXTERNAL REF TO XYPLOT IS REDUCED
29 / THE PDP8 CODE LOCATED IN FIELD 1
32 / INTO THESE WORDS SYMBOL INSERTS THE ADR. OF THE SYMBOL TABLE AND LENGTH
33 / THIS MUST BE DONE SINCE THE SYMBOL TABLE #XMBTB MAY BE LOCATED INTO
34 / AN OVERLAY AND THEREFORE THE ADDR DIRECTIVE WILL PRODUCE WRONG CODE.
35 / THE LOADER INSERTS THE ADR. OF THE OVERLAY LOADER BUT NOT THE DESIRED
41 / EXTERNAL REFERENCED FROM XYPLOT ONLY
43 / ENTRIES USED BY XYPLOT:
55 / ENTRIES USED BY SYMBOL
67 PLCE= 06500 / CLEAR INTERRUPT ENABLE
68 PLSF= 06501 / SKIP ON PLOTTER FLAG SET
69 PLCF= 06502 / CLEAR PLOTTER FLAG
70 PLLR= 06504 / LOAD PLOTTER DIRECTION REGISTER
71 PLSE= 06507 / SET INTERRUPT ENABLE
75 / ALL THESE ROUTINES USES XRS TO GET ARGS FROM FPP CODE
78 /ASSUMES USER ADDED 6502(CLEAR FLAG) TO FRTS CLEAR QUEUE
79 #XNTST, ORG .+1 / INIT PTRS + ADD JOB TO INTERRUPT QUEUE
80 CLA CMA / SET UP POINTERS
81 DCA% PBFCNT+1 / COUNTER FOR LOCN OF NEXT CHARACTER TO PLOT
82 TAD UBUFL / COMPL. LENGTH OF BUFFER --> AC
83 DCA% PMBFLG+1 / RESET BUFFER POINTERS
89 DCA% PDISMS+1 / FOR HANG
90 ISZ ONCE / DO NOT CALL PLOTS MORE THAN 4095 TIMES!
92 JMS% VONQI+1 / ADD PLOTTER INTO THE INTERRUPT QUEUE ONLY ONCE
93 PLSF / CODE TO DETECT IF PLOTTER INTERRUPTED
94 ADDR INTPLT / ADR. OF INTERRUPT SERVICE ROUTINE
96 DCA PREP / SET UP COUNTER TO RESET PEN TO ORIGIN 0,0
97 TAD PENUP / LIFT PEN AND THEN
100 TAD DECRXY / GO 4096 STEPS TO THE LEFT CORNER DOWN
102 PLCF / CLEAR FLAG FROM THE LAST STEP
103 ION PLSE / ENABLE PLOTTER INTERRUPTS
107 / THIS ROUTINE RESETS X-Y PLOTTER TO 0,0
113 ISZ PREP / REPEAT 4096 TIMES
124 ONCE, 7777 / TO ADD PLSF INTO INTERRUPT QUEUE ONLY ONCE
127 /THIS ROUTINE CALLED ONCE FOR EACH CALL TO XYPLOT
128 /AND DOES INITAL PEN UP OR DOWN
130 TAD #XETXR / GET PEN STATE
132 CLL RAR / LOOK AT 3 BITS
152 / FPP 12 VARIABLES SET BY XYPLOT WICH MAY NOT BE LOADED INTO AN OVERLAY
154 #XORGX, ORG .+3 / LAST ABSOLUTE ORIGIN LOCATION OF PEN IN MOTOR STEPS
155 #XORGY, ORG .+3 / LAST ABSOLUTE ORIGIN LOCATION OF PEN IN MOTOR STEPS Y DIRECTION
156 #XABSX, ORG .+3 / ABSOLUTE LOCATION OF PEN IN MOTOR STEPS X DIRECTION (REAL)
157 #XABSY, ORG .+3 / ABSOLUTE LOCATION OF PEN IN MOTOR STEPS Y DIRECTION
158 #XOLDP, ORG .+3 / VALUE OF PEN AT LAST XYPLOT
159 #XXOLD, ORG .+3 / OLD X PT WITH EFFECT OF FACTOR
160 #XYOLD, ORG .+3 / OLD Y PT WITH EFFECT OF FACTOR
161 #XPENC, ORG .+3 / OLD PEN STATUS (SYMBOL & NUMBER)
162 #XINCX, ORG .+3 / INCREMENT SIZE DEPENDENT OF EACH PLOTTER X DIRECTION
163 #XINCY, ORG .+3 / INCREMENT SIZE DEPENDENT OF EACH PLOTTER Y DIRECTION
164 #XFCTX, ORG .+3 / X - FACTOR
165 #XFCTY, ORG .+3 / Y - FACTOR
167 UBUFL, -BUFFL / LENGTH OF BUFFER
168 USBFMN, ZBLOCK BUFFL / PLOTTING BUFFER
171 / THESE ROUTINES GET THE PLOTTING CODES WITHIN A LETTER
172 / PASS THEM AS X,Y PAIRS FOR PLOT ROUTINE
174 JMS GETXYS / GET A #XLEFT HAND X,Y PAIR
183 DCA LETCD2 / SAVE X,Y PAIR
186 RAR / GET IN LO THREE BITS
188 DCA LETCD1 / PASS X VALUE
189 TAD LETCD2 / NOW FOR THE Y PART
191 DCA LETCD2 / PASS THE Y VALUE
193 #XRGHT, 0 / GET A #XRGHT HAND X,Y PAIR
201 \f/ THIS ROUTINE GETS X,Y PAIRS FROM THE PACKED SEQ FOR EACH LETTER
205 TAD LOCNPT / START OF LETTER CODE
206 DCA LETCD2 / UPDATE PTR TO LETTER
207 RAL / IF LINK SET, CROSSED FIELDS, SO UPDATE FIELD
209 TAD LOCNFL / FIELD PASSED FROM FINDIT ROUTINE
215 TAD% LETCD2 / GET PLOTTING CODES
221 \f/ HERES START OF THE TABLE FOR PDP-8 ES
222 OCT8BL, 6503 / PEN UP
224 / GEOM. OCTANT 1=CODED OCTANT 8, 2=7, 3=3, 4=4, 5=2, 6=1, 8=6
241 / THIS IS THE START OF THE PLOT VECTOR TABLE FOR PDP-12S
260 \f/ FIGURE OUT IF A MAJOR MOVE OR MAJ+MINOR
265 DCA HOLD2 / ADD LO WORDS
268 TAD HOLD1 / ADD HIGH WORDS
274 JMP MAJONL / NO-MAJOR MOVE ONLY
275 CLL RAR / PUT IT BACK-1
278 JMP% FIGURE / RETURN WITH AC=1
280 JMP% FIGURE / RETURN WITH ZERO AC
281 #XATIO, 0 / #XATIO CALCULATED IN REALPT
286 / INITIALIZE HOLD1+2 TO A ROUNDING FUDGE
292 RFUDGE, 1000 / TAKES CARE OF TRUNCATION ERRORS
295 PLETPS, ADDR LOCNPT / POINTS TO START OF CODE FOR PASSED LETTER
296 COUNT, / COUNT OF STEPS INTO CHAR PLOTTING CODE TABLE
297 PLCNM1, ADDR LOCNFL / USED TO PASS FIELD
300 0 / ADDRESS OF PACKED 6 BIT LETTERS TO PRINT
302 #XSMBP, / HERE WE INSERT THE ADR. OF THE SYMBOL TABLE
305 / THESE ROUTINES DETERMINE THE START OF PLOTTING CODES FOR A CHARACTER
306 / PASSED AS A HOLERITH (6 BIT) FROM SYMBOL ROUTINE.
307 / FIND LOCATION OF START OF PLOT VECTORS
308 / FOR THE #XLEFT HALF OF 2 6 BIT CHARACTERS
310 TAD #XTXAD+1 / DO FIELD STUFF
317 TAD% #XTXAD+2 / GET TWO 6 BIT VALUES
321 TAD LETTER / MOVE #XLEFT CHARACTER
325 AND P77 / INTO THE #XRGHTMOST 6 BITS
327 ISZ #XTXAD+2 / PREPARE FOR NEXT CHARACTER TO #XLEFT
328 JMP FLDOK / IF SKIPS, THEN AT FIELD BOUNDARY
329 ISZ #XTXAD+1 / SO UPDATE FIELD ALSO
332 \fFINDIT, 0 / GET LOC OF LETTER IN SYMBOL TABLE
333 SPA SNA / CHECK FOR ZERO
334 TAD P40 / WHICH DEFAULTS TO SPACE
335 CIA CLL / MAKE A COUNTER
337 DCA COUNT / ZERO TOTAL STEP COUNTER
339 DCA NXTLCN / POINTS TO LOCN IN POINTER TABLE
340 / THIS TABLE HAS STEPS FOR EACH LETTER, SO
341 / COUNT TOTAL STEPS TO DESIRED LETTER
348 TAD% NXTLCN / GET NEXT STEP COUNT
350 TAD COUNT / AND ADD IT TO TOTAL STEP COUNT
352 ISZ NXTLCN / BUMP POINTER
353 SKP / SKIP IF DIDN'T CROSS BOUNDARIES
354 TAD P10 / IT DID, UPDATE FIELD WORD
358 JMP SCANTB / NOT THERE YET
360 TAD COUNT / ADD COUNT TO
361 TAD PSYMB+1 / START OF CODE TABLE
362 DCA% PLETPS+1 / NOW IT'S CORRECT POINTER
363 RAL / IF LINK SET, WE CROSSED FIELD BOUNDARIES
364 TAD PSYMB / GET FIELD OF TABLE
365 DCA% PLCNM1+1 / PASS IT
366 JMP% FINDIT / GOT THE LETTER
369 #XMCNT, / HERE WE INSERT THE POINTER INTO THE SYMBOL TABLE
374 TAD LETTER / #XLEFT FROM LAST #XLEFT LETTER
379 / ROUTINE TO HANDLE NUMBERS FROM FORTRAN SUBR. NUMBER
380 / NOT CALLED BY USER DIRECTLY
385 JMP USZRO / IF EQ -1, USE 0
388 JMP USZRO / SO USE ZERO
390 SPA CLA / G.T. 9 BAD TOO
391 JMP USEIT / IT'S -3,-2,0-9
393 INDEX, TAD P60 / INDEX INTO TABLE
399 / PLOT AN INTEGER EQUIV OR CENTERED (100-117 DEC =144-165 OCT)
402 SPA SNA / .L.T. ZERO NO GOOD
404 TAD M166 / G.T. 117 DEC. BAD
409 JMP OKVAL / ITS A CENTERED 100-121 (0144-0165)
412 JMP USSPAC / 0100-0143 ILLEGAL
418 TAD P40 / DEFAULT TO SPACE
420 OKVAL, TAD P100 / PASS CENTERED AS 100-121
431 #XNPLT, 0 / NON INTERRUPT TIME PLOT ROUTINE
435 JMS% PSPCAS+1 / PREP FOR OCTANT CHECK
437 JMP ANOTHR / DO ANOTHER STEP
438 DONE, CDF CIF / ALL DONE WITH THIS VECTOR
440 ANOTHR, JMS% PFIGUR+1 / TO FIGURE OUT IF MAJ OR DIAG
441 / RETURNS ZERO IF MAJOR ONLY, 1 IF MAJ + MINOR
446 TAD POCTBL+1 / START OF VECTOR TABLE
447 TAD #XCHTP / ADD 22 IF A PDP-12 OR NON 8-E
448 DCA PLTVCT / SAVE POINTER TO PROPER PLOT VECTOR
450 TAD BUFCNT / GET NUM. CHARACTERS IN BUF -1
451 TAD MBUFLG / AND MINUS LENGTH
454 JMP ISROOM / STILL ROOM IN BUFFER
455 IOF / NO ROOM YET, GO TO HANG
459 ION / HANG LEAVES INTERRUPT OFF
460 ISROOM, TAD% PLTVCT / NOW GET THE VECTOR
461 DCA% PICHAR+1 / INTO BUFFER
462 ISZ PICHAR+1 / UPDATE LOCN
465 TAD PBMX+1 / ARE WE OVERFLOWING MAX LOCN OF BUFFER
469 TAD PBMN+1 / YES, RESET TO BOTTOM
471 LIMOK, ISZ BUFCNT / UPDATE CHAR COUNT
472 / IF EMPTY WAS -1, SO NOW 0
473 JMP% PLDBL / WASNT EMPTY-CANT START TO PLOT
476 TAD #XDPXR / USE AS INDEX INTO OPCODE TABLE
484 INTFLG, / HANG ALWAYS FIELD 0
496 TAD% POCHAR+1 / GET NEXT LINE TO PLOT
497 DCA QTEMP5 / SAVE ACTUAL VECTOR FOR A SECOND
501 TAD PBMX+1 / CHECK THAT OUTPUT DOESNT OVERFLOW THE BUFFER
506 DCA POCHAR+1 / RESET IT
508 TAD QTEMP5 / GET VARIABLE
509 AND A7000 / DETERMINE TYPE OF PLOTTER
511 JMP PENUD / A PEN OP (PDP-12 OR 8/E)
512 TAD QTEMP5 / ITS AN 8E
516 PENUD, TAD QTEMP5 / ITS A 12 OR NON-8/E PEN UP OR DOWN
518 JMP TWOWD / IT'S A TWO WORD IOT
519 QTEMP5, NOP / 1-WORDER SO DO IT NOW
522 JMP% PLDBL / DONE FOR NON-INTERRUPT
523 DCA INTFLG / INT MODE, CLEAR FLAG
528 TWOWD, 6514 / DRUM DOWN
529 6521 / SECOND PART PEN #XLEFT
531 \fINTPLT, 0 / HERE ONLY IF FLAG SET
533 TAD BUFCNT / DECREMENT BUFFER COUNTER
537 ISZ INTFLG / SHOULD NEVER SKIP
541 DCA BUFCNT / INITIALIZE BUFFER CNT-1
543 JMP% INTPLT / EXIT IN FIELD 1
544 / BE SHURE BUFFER EMPTY BEFORE EXITING
547 JMS PLDBL / DO A FINAL PEN UP
550 JMP WAIT / STILL MORE TO DO
553 6500 / CLEAR INTERRUPT ENABLE FOR 8-ES