INS 4/1 CSM01$==^D400 ;Plotter has 3 pens, ON-LINE indicator, 400 SPI CSM02$==-1 ;Compressed plot files CSM03$==-1 ;Red and Black in banner CSM04$==-1 ;Do CSM accounting (minutes and inches used) CSM05$==-1 ;Add SLEEP time to $DSCHD macro for TTY response wait CSM06$==^D1200 ;Support the TAB Products Card Terminal at 1200 baud CSM07$==-1 ;Change some QUEUE defaults CSM08$==^D2400 ;PTC-6 Plotter Terminal Controller at 2400 baud IF2,> IF2,> IF2,> REPEAT 0,< ;To completely remove the CSM changes, make this a REPEAT 1 CSM01$==0 ;Normal XY-10 plotter CSM02$==0 ;Plot files are 1 byte per increment (very big) CSM03$==0 ;Do not exercise the black and red pens CSM04$==0 ;Account disk reads instead of forms type CSM05$==0 ;No TTY I/O, therefore no sleep requests CSM06$==0 ;Card punch is on I/O bus or front-end 11 CSM07$==0 ;Use whatever QUEUE says CSM08$==0 ;Plotter is not connected to a TTY line DEFINE CSMEDT($EDIT,$PART),<> ;Dummy macro CSMED$==0 ;No additional edits > ;End of REPEAT 0 INS 26/1 PAGE SALL ;Also searches UUOSYM and ACTSYM.UNV INS 30/1 IFNDEF CSMEDT,< SEARCH CSMEDT > ;CSM edit macro .XCREF S1,S2,T1,T2,T3,T4,C,J,P ;[CSM] Save some trees REP 35/1 SPOWHO==0 ;WHO LAST PATCHED %SPO== WIT SPOWHO==2 ;Who last patched (JMS @ CSM) %SPO==+CSMED$ REP 1/2 SUBTTL Table of contents ; TABLE OF CONTENTS FOR SPROUT ; ; ; SECTION PAGE ; 1. Table of contents......................................... 2 ; 2. Revision History.......................................... 3 ; 3. Constants (Conditional and Unconditional)................ 4 ; 4. MACROS.................................................... 5 ; 5. Special Forms Handling Parameters......................... 6 ; 6. Flag Definitions.......................................... 8 ; 7. Job Parameter Area........................................ 9 ; 8. Random Impure Storage..................................... 12 ; 9. Resident JOB DaTABase..................................... 13 ; 10. Non-zero daTABase......................................... 14 ; 11. $TEXT Utilities and common Messages....................... 15 ; 12. Program Initialization.................................... 16 ; 13. Idle Loop................................................. 17 ; 14. Deschedule Process........................................ 18 ; 15. Do the Job................................................ 19 ; 16. Process a File............................................ 20 ; 17. End of Job................................................ 21 ; 18. FILDIS Routine to KEEP/DELETE requested files............ 21 ; 19. CHKQUE Routine to process IPCF messages.................. 22 ; 20. CHKOBJ Routine to validate QUASAR/ORION/OPR MSG Object block 23 ; 21. FNDOBJ Routine to establish STREAM context............... 24 ; 22. GETBLK Routine to return next argument from an OPR/ORION message 25 ; 23. NEXTJOB Message from QUASAR............................... 26 ; 24. User CANCEL Request....................................... 27 ; 25. UPDATE Routine to send status update...................... 28 ; 26. CHKPNT Routine to send checkpoint message................. 29 ; 27. SETUP/SHUTDOWN Message.................................... 30 ; 28. Response to setup message................................. 31 ; 29. Operator CANCEL command................................... 32 ; 30. Operator STOP command..................................... 33 ; 31. Operator CONTINUE command................................. 33 ; 32. Operator RESPONSE command................................. 33 ; 33. Operator REQUEUE command.................................. 34 ; 34. CLRMSG and SNDQSR routines................................ 35 ; 35. Accounting routines....................................... 37 ; 36. FORMS - Setup Forms for a job............................. 40 ; 37. Forms switch Subroutines.................................. 44 ; 38. Plotter only switches..................................... 45 ; 39. I/O Subroutines for SPFORM.INI............................ 46 ; 40. INPOPN - Routine to open the input file................... 48 ; 41. INPBUF - Read a buffer from the input file................ 49 ; 42. INPBYT - Read a byte from the input file.................. 49 ; 43. INPERR - Handle an input failure.......................... 49 ; 44. INPFEF - Force end-of-file on next input.................. 49 ; 45. INPREW - Rewind the input file............................ 49 ; 46. OUTGET - OPEN the output device........................... 50 ; 47. OUTBYT - Deposit a byte in the output buffer.............. 53 ; 48. OUTOUT - Routine to output a buffer....................... 54 ; 49. DEVERR - Handle Output Device Errors...................... 55 ; 50. OUTREL - Release output device............................ 56 ; 51. OUTWON - Wait for on-line................................. 57 ; 52. OUTFLS Routine to flush output buffers.................... 58 ; 53. Card punch service ; 53.1 Dispatch table.................................... 59 ; 53.2 Checkpoint text generation........................ 60 ; 53.3 File processing................................... 61 ; 53.4 File headers...................................... 67 ; 53.5 File trailers..................................... 68 ; 53.6 Banners........................................... 69 ; 53.7 Word punching..................................... 70 ; 53.8 Letters........................................... 71 ; 53.9 Byte output....................................... 72 ; 54. Plotter service ; 54.1 Dispatch table.................................... 73 ; 54.2 Checkpoint text generation........................ 74 ; 54.3 File processing................................... 75 ; 54.4 Devout output errors.............................. 77 ; 54.5 Banners........................................... 78 ; 54.6 File headers...................................... 79 ; 54.7 File trailers..................................... 80 ; 54.8 Job trailers...................................... 81 ; 54.9 Solid lines....................................... 82 ; 54.10 Dashed lines...................................... 83 ; 54.11 Job information plotting.......................... 84 ; 54.12 Alignment and testing............................. 85 ; 54.13 Pen calibration................................... 86 ; 54.14 Compute chracter size............................. 87 ; 54.15 Letters........................................... 88 ; 54.16 Line segments..................................... 89 ; 54.17 Rotation and XY20 translation..................... 91 ; 54.18 Pen movement generation........................... 92 ; 54.19 Character set..................................... 94 ; 55. Paper tape punch service ; 55.1 Dispatch table.................................... 99 ; 55.2 Checkpoint text generation........................ 100 ; 55.3 File processing................................... 101 ; 55.4 Banners........................................... 106 ; 55.5 File headers...................................... 107 ; 55.6 File trailers..................................... 108 ; 55.7 Trailers.......................................... 109 ; 55.8 Blank folds....................................... 110 ; 55.9 Letters........................................... 111 ; 55.10 Byte output....................................... 112 ; 56. Character Bit Array for 5 X 7 Character Matrix............ 113 ; 57. Common Utilities.......................................... 115 ; 58. Interrupt Module.......................................... 118 ; 59. IPCF and DEVICE Interrupt service for TOPS10.............. 122 ; 60. IPCF and DEVICE interrupt service for TOPS20.............. 123 WIT SUBTTL Table of Contents ; Table of Contents for SPROUT ; ; ; Section Page ; ; 1. Table of Contents . . . . . . . . . . . . . . . . . . 1 ; 2. Revision History . . . . . . . . . . . . . . . . . . . 2 ; 3. CSM Revision History . . . . . . . . . . . . . . . . . 2 ; 4. Constants (Conditional and Unconditional) . . . . . . 4 ; 5. MACROS . . . . . . . . . . . . . . . . . . . . . . . . 5 ; 6. Special Forms Handling Parameters . . . . . . . . . . 6 ; 7. Flag Definitions . . . . . . . . . . . . . . . . . . . 7 ; 8. Job Parameter Area . . . . . . . . . . . . . . . . . . 8 ; 9. Random Impure Storage . . . . . . . . . . . . . . . . 11 ; 10. Resident JOB DaTABase . . . . . . . . . . . . . . . . 12 ; 11. Non-zero daTABase . . . . . . . . . . . . . . . . . . 13 ; 12. $TEXT Utilities . . . . . . . . . . . . . . . . . . . 14 ; 13. Program Initialization . . . . . . . . . . . . . . . . 15 ; 14. Idle Loop . . . . . . . . . . . . . . . . . . . . . . 16 ; 15. Deschedule Process . . . . . . . . . . . . . . . . . . 17 ; 16. CHKTIM - Routine to see if it's time to schedule a s . 17 ; 17. Do the Job . . . . . . . . . . . . . . . . . . . . . . 18 ; 18. Process a File . . . . . . . . . . . . . . . . . . . . 19 ; 19. End of Job . . . . . . . . . . . . . . . . . . . . . . 20 ; 20. FILDIS . . . . . . . . . . . . . . . . . . . . . . . . 21 ; 21. CHKQUE . . . . . . . . . . . . . . . . . . . . . . . . 22 ; 22. CHKOBJ . . . . . . . . . . . . . . . . . . . . . . . . 23 ; 23. FNDOBJ . . . . . . . . . . . . . . . . . . . . . . . . 24 ; 24. GETBLK . . . . . . . . . . . . . . . . . . . . . . . . 25 ; 25. NEXTJOB Message from QUASAR . . . . . . . . . . . . . 26 ; 26. User CANCEL Request . . . . . . . . . . . . . . . . . 27 ; 27. UPDATE Routine to send status update . . . . . . . . . 28 ; 28. CHKPNT Routine to send checkpoint message . . . . . . 29 ; 29. SETUP/SHUTDOWN Message . . . . . . . . . . . . . . . . 30 ; 30. Response to setup message . . . . . . . . . . . . . . 31 ; 31. Operator CANCEL command . . . . . . . . . . . . . . . 32 ; 32. Operator STOP command . . . . . . . . . . . . . . . . 33 ; 33. Operator CONTINUE command . . . . . . . . . . . . . . 33 ; 34. Operator RESPONSE command . . . . . . . . . . . . . . 33 ; 35. Operator REQUEUE command . . . . . . . . . . . . . . . 34 ; 36. CLRMSG and SNDQSR routines . . . . . . . . . . . . . . 35 ; 37. FRMLEX - Forms limit exceeded routine . . . . . . . . 36 ; 38. Accounting routines . . . . . . . . . . . . . . . . . 37 ; 39. FORMS - Setup Forms for a job . . . . . . . . . . . . 40 ; 40. Forms switch Subroutines . . . . . . . . . . . . . . . 44 ; 41. Plotter only switches . . . . . . . . . . . . . . . . 45 ; 42. I/O Subroutines for SPFORM.INI . . . . . . . . . . . . 46 ; 43. INPOPN - Routine to open the input file . . . . . . . 48 ; 44. INPBUF - Read a buffer from the input file . . . . . . 49 ; 45. INPBYT - Read a byte from the input file . . . . . . . 49 ; 46. INPERR - Handle an input failure . . . . . . . . . . . 49 ; 47. INPFEF - Force end-of-file on next input . . . . . . . 49 ; 48. INPREW - Rewind the input file . . . . . . . . . . . . 49 ; 49. OUTGET - OPEN the output device . . . . . . . . . . . 49 ; 50. OUTBYT - Deposit a byte in the output buffer . . . . . 53 ; 51. OUTOUT - Routine to output a buffer . . . . . . . . . 53 ; 52. DEVERR - Handle Output Device Errors . . . . . . . . . 55 ; 53. OUTREL - Release output device . . . . . . . . . . . . 56 ; 54. OUTWON - Wait for on-line . . . . . . . . . . . . . . 57 ; 55. OUTFLS Routine to flush output buffers . . . . . . . . 58 ; 56. TTY I/O ; 56.1 Input character from TTY, no wait . . . . . . 59 ; 56.2 Input character, wait up to 30 seconds . . . . 60 ; 57. Card punch service ; 57.1 Dispatch table . . . . . . . . . . . . . . . . 61 ; 57.2 Checkpoint text generation . . . . . . . . . . 62 ; 57.3 File processing . . . . . . . . . . . . . . . 63 ; 57.4 File headers . . . . . . . . . . . . . . . . . 69 ; 57.5 File trailers . . . . . . . . . . . . . . . . 70 ; 57.6 Banners . . . . . . . . . . . . . . . . . . . 71 ; 57.7 Word punching . . . . . . . . . . . . . . . . 72 ; 57.8 Letters . . . . . . . . . . . . . . . . . . . 73 ; 57.9 Byte output . . . . . . . . . . . . . . . . . 74 ; 58. Plotter service ; 58.1 Dispatch table . . . . . . . . . . . . . . . . 75 ; 58.2 Checkpoint text generation . . . . . . . . . . 76 ; 58.3 File processing . . . . . . . . . . . . . . . 77 ; 58.4 Expand CSM's compressed plot format . . . . . 79 ; 58.5 READ36, OPRTXT, PAUSEP, TITLE for TOLP . . . . 81 ; 58.6 NEWPEN for 3-pen plotter . . . . . . . . . . . 82 ; 58.7 DEVOUT output errors . . . . . . . . . . . . . 83 ; 58.8 Banners . . . . . . . . . . . . . . . . . . . 84 ; 58.9 File headers . . . . . . . . . . . . . . . . . 85 ; 58.10 File trailers . . . . . . . . . . . . . . . . 86 ; 58.11 Job trailers . . . . . . . . . . . . . . . . . 87 ; 58.12 Solid lines . . . . . . . . . . . . . . . . . 88 ; 58.13 Dashed lines . . . . . . . . . . . . . . . . . 89 ; 58.14 Job information plotting . . . . . . . . . . . 90 ; 58.15 Alignment and testing . . . . . . . . . . . . 91 ; 58.16 Pen calibration . . . . . . . . . . . . . . . 92 ; 58.17 Compute character size . . . . . . . . . . . . 93 ; 58.18 Letters . . . . . . . . . . . . . . . . . . . 94 ; 58.19 Line segments . . . . . . . . . . . . . . . . 95 ; 58.20 PTC-6 interface . . . . . . . . . . . . . . . 97 ; 58.21 Rotation and XY20 translation . . . . . . . . 98 ; 58.22 Pen movement generation . . . . . . . . . . . 99 ; 58.23 Character set . . . . . . . . . . . . . . . . 101 ; 59. Paper tape punch service ; 59.1 Dispatch table . . . . . . . . . . . . . . . . 106 ; 59.2 Checkpoint text generation . . . . . . . . . . 107 ; 59.3 File processing . . . . . . . . . . . . . . . 108 ; 59.4 Banners . . . . . . . . . . . . . . . . . . . 113 ; 59.5 File headers . . . . . . . . . . . . . . . . . 114 ; 59.6 File trailers . . . . . . . . . . . . . . . . 115 ; 59.7 Trailers . . . . . . . . . . . . . . . . . . . 116 ; 59.8 Blank folds . . . . . . . . . . . . . . . . . 117 ; 59.9 Letters . . . . . . . . . . . . . . . . . . . 118 ; 59.10 Byte output . . . . . . . . . . . . . . . . . 119 ; 60. Character Bit Array for 5 X 7 Character Matrix . . . . 120 ; 61. Common Utilities . . . . . . . . . . . . . . . . . . . 122 ; 62. Interrupt Module . . . . . . . . . . . . . . . . . . . 124 ; 63. IPCF and DEVICE Interrupt service for TOPS10 . . . . . 128 ; 64. IPCF and DEVICE interrupt service for TOPS20 . . . . . 129 REP 205/3 ;BEGIN CODE MAINTENANCE WIT ;BEGIN CODE MEINTENANCE REP 209/3 End of revision history \ WIT End of revision history \ PAGE SUBTTL CSM Revision History ; ; Edit Date Who Description ;====== ========= === =========== ; ;CSM01$ 14-Nov-80 JMS Plotter has 3 pens and an ON-LINE indicator. Add ; routines to change pens and proper positioning after ; the plot. Make sure the plotter is on-line at OUTOUT. CSMEDT 01 ;Show value of CSM01$ INCS= ;400 increments per inch = 620 octal IFN CSM01$, ;Checkpoint every minute. ; ;CSM02$ 14-Nov-80 JMS Use the compressed plot file format as defined ; in PLOT.REL (from CSM's FORLIB). Instead of one ; byte per increment, most halfwords in the file ; contains 9-bits of delta-X and 9 of delta-Y. ; Use TOLP.REL to translate the disk file back ; into calls to subroutine PLOT. CSMEDT 02 ;Show value of CSM02$ IFN CSM02$,> ; ;CSM03$ 14-Nov-80 JMS Change the plot banner to exercise the red and ; black pens. Plot error message even if no ; /TRAILER and set blue pen at P$EOF. CSMEDT 03 ;Show value of CSM03$ ; ;CSM04$ 25-Mar-81 JMS Put the forms name in place of DISK-WRITES, ; amount of paper in PAGES-PRINTED, cards, feet, ; or plot time in DISK-READS. CSMEDT 04 ;Show value of CSM04$ ; ;CSM05$ 8-Jan-81 JMS Add a sleep request to $DSCHD. RH of flags is ; number of seconds to wait. This is needed for ; non-blocking TTY I/O routines. CSMEDT 05 ;Show value of CSM05$ ; ;CSM06$ 8-Jan-81 JMS Add support for the TAB Products Card Terminal. ; It is a Reader/Punch that acts like a TTY. CSMEDT 06 ;Show baud rate (^D1200=^O2260) IFN CSM06$,> ; ;CSM07$ 8-Mar-83 JMS Remove DSPMOD so that cards are punched in ASCII, ; paper tape is punched in ASCII, and plots are ; done in 18-bit BINARY mode unless explicitly ; requested otherwise. This is so that output ; from SOS or SED is not punched in image-binary. ; Remove "BEGIN:", "JOB", "jobnam", "USER:" from ; card punch banner, ignore QUEUE's default of ; /NOHEADER and always punch file header on cards. CSMEDT 07 ;Show value of CSM07$ ; ;CSM08$ 28-Jun-83 JMS Add support for the Houston Instruments PTC-6 ; Plotter Terminal Controller on a TTY line. CSMEDT 08 ;Show value of CSM08$ IFN CSM08$,< EXTERN PTCINI,PTCMOV,PTCOUT,PTCFIN IFE CSM05$,> ; CSMED$==10 ;Increment this to change .JBVER ;End of CSM Revision History INS 60/4 COMMENT ~ From the OPERATOR's point of view, the supply spool on the plotter is above the pen holder, and the takeup spool is below the pen holder. Therefore, to move the pen in the +Y direction, the pen holder moves to the left. To move the pen in the +X direction, the pen stays still and the paper is moved down (towards the takeup spool). The following definitions are based on this point of view. ;End of COMMENT ~ REP 65/4 XP XYU,10 ;-X MOVE UP XP XYD,4 ;+X MOVE DOWN XP XYL,2 ;+Y MOVE LEFT XP XYR,1 ;-Y MOVE RIGHT WIT XP XYU,10 ;-X move the paper up XP XYD,4 ;+X move the paper down XP XYL,2 ;+Y move pen holder left XP XYR,1 ;-Y move pen holder right PLUSX== XYD ;[CSM] ;Move in positive X direction 0 PLUSY== XYL ;[CSM] ;Move in positive Y direction 90 MINUSX==XYU ;[CSM] ;Move in negative X direction 180 MINUSY==XYR ;[CSM] ;Move in negative Y direction 270 REP 73/4 XP PLTPEN,^D9 ;# TICS FOR PLOT PEN UP/DOWN WIT CSMEDT 01,0 ;3-pen plotter, definitions IFE CSM01$, ;# TICS FOR PLOT PEN UP/DOWN IFN CSM01$, ;30 millisec compared to 1800 per second REP 3/5 DEFINE LP(SYM,VAL,FLAG),< WIT DEFINE LP(SYM,VAL,FLAG),<;;Flag="Z" marks a variable to be zeroed per job REP 29/5 SYM==J...X > ;END IF2 > ;END DEFINE LP WIT SYM==J...X>;;END IF2>;;END DEFINE LP ;[CSM] Removed 2 CRLFs so that MACRO will show value in listing REP 3/6 ;FORMS SWITCHES: ;FOR ALL DEVICES ; BANNER:NN NUMBER OF JOB HEADERS ; TRAILER:NN NUMBER OF JOB TRAILERS ; HEADER:NN NUMBER OF FILE HEADERS (PICTURE PAGES) ; NOTE:AA TYPE NOTE TO THE OPERATOR ;FOR PLOTTER ONLY ; SPU:NN STEPS PER UNIT (FACTOR OF ALL XX AND YY) ; SIZE:XX:YY NUMBER OF STEPS IN X AND Y AXIS ; MAXIMUM:XX:YY STEP FOR FORMS LIMIT IN X AND Y AXIS ; MINIMUM:XX:YY STEP FOR FROMS LIMIT IN X AND Y AXIS ;IN THE ABOVE AND BELOW EXPLANATIONS: ; NN IS A DECIMAL NUMBER ; SS IS A 1-6 CHARACTER STRING ; AA IS A STRING OF 1 TO 50 CHARACTERS ; OO IS AN OCTAL NUMBER ; XX INTEGER STEP NUMBER IN X AXIS ; YY INTEGER STEP NUMBER IN Y AXIS ;LOCATION SPECIFIERS ; ALL ALL DEVICES ; CENTRAL ALL DEVICES AT THE CENTRAL SITE ; REMOTE ALL REMOTE DEVICES ;NOTE: SPROUT WILL USE THE FIRST ENTRY WHICH MEETS THE LOCATION ; SPECIFICATION FOR ITS DEVICE. ; SPROUT ACCEPTS FORMS SPECIFICATIONS FOR ALL THREE DEVICES ; ALTHOUGH SOME SWITCHES ARE LEGAL ONLY FOR PLOTTERS ;TYPICAL SPFORM.INI FORMS SPECIFICATION ; CDP NORMAL/BANNER:6/HEADER:1/TRAILER:6- ; /NOTE:Load NORMAL Cards in Card Punch ; ; PLT NORMAL/BANNER:200/HEADER:200/TRAILER:200- ; /MINIMUM:0:0/MAXIMUM:0:5900- ; /NOTE:Set Plotter Controls to 200 Steps per inch WIT ;Format of SYS:SPFORM.INI ; DEV FORM/SWITCH This line applies to all devices of this type ; DEV FORM:ALL/SWITCH This line applies to all devices of this type ; DEV FORM:LOC/SWITCH This line applies to devices at the central site ; DEV FORM:REM/SWITCH This line applies to devices on remote nodes ; "DEV" can be one of PLT, CDP, or PTP ; "FORM" is the name of the forms type, 6 characters or less ;Note: SPROUT will use the first entry which meets the location ; specification for its device. Therefore, if ALL is used with ; LOC or REM, ALL should be after the LOC or the REM. ;Switches legal for all devices ; /BANNER Output the job header ; /HEADER Output file headers ; /TRAILER Output the job trailer ; /NOTE:AA Type NOTE to the OPR when forms are mounted ;Switches legal for plotters only ; /SPU:NN Steps per unit (a factor of all XX and YY) ; /SPS:NN Steps per second (for calculating run time) ; /MAXIMUM:XX:YY Maximum pen position ; /MINIMUM:XX:YY Minimum pen position after file header ;In the above and below explanations: ; NN is a decimal number ; AA is a string of 1 to 50 characters, terminated by next "/" ; XX is a limit for the X axis ; YY is a limit for the Y axis ;Typical SPFORM.INI forms specification ; CDP NORMAL/BANNER/HEADER - ; /NOTE:Load NORMAL Cards in Card Punch ; ; PLT NORMAL/BANNER/HEADER/TRAILER/SPS:900 ; /SPU:1/MINIMUM:0:0/MAXIMUM:0:5900- ; /NOTE:Set Plotter Controls to 200 Steps per inch ; ; PTP NORMAL/BANNER/HEADER/TRAILER ; PTP BLACK /BANNER/HEADER/TRAILER/NOTE:Black oiled paper tape PAGE COMMENT | CSM interpretation of plotter parameters ; Example for a drum plotter: ; PLT NORMAL /SPS:1800/SPU:4/MINIMUM:0:0/MAXIMUM:0:1100 - /BANNER/HEADER/TRAILER ; PLT = This line applies to the plotter (not CDP or PTP). NORMAL = The forms name. /SPS:1800 = Do accounting based on speed of 1800 steps per second. /SPU:4 = This plotter uses 400 steps per inch, the following numbers are in 1/100ths of an inch. /MINIMUM:0:0 = Pen cannot go to left or below the starting point. /MAXIMUM::1100 = There is no maximum limit in the +X direction, +Y movement is limited to 11.00 inches. The height of characters used in the /BANNER/HEADER/TRAILER is 11.00/90 = 0.12 inches. - = Hypen indicates a continued line. /BANNER = Plot "* Start job XXX" 0.12 inches high, plot user's name and PPN 0.36 inches high, and a line across the paper. /HEADER = Plot file name 0.12 inches high and a dashed line. /TRAILER = Plot a dashed line and the summary 0.12 inches high. /NOTE = No note is specified, so that "OPR>START PLOT 0" will not require a "RESPOND 'PROCEED' WHEN READY". ; End of COMMENT | REP 14/7 DEFINE FF(A),< XLIST <&777777B17>+S$'A LIST SALL > FFNAMS: SWITCHES F$NSW==.-FFNAMS ;NUMBER OF SWITCHES WIT DEFINE FF(A),< <&777777B17>+S$'A >;;All on 1 line to look nice XALL ;[CSM] Show definition in the listing FFNAMS: SWITCHES F$NSW==.-FFNAMS ;NUMBER OF SWITCHES SALL ;[CSM] Normal macro expansions REP 46/9 LP J$FPLT,1 ;FORMS TYPE FOR PLOTTER WIT LP J$FPLT,1 ;-1 = Plotter-only switches are legal INS 65/9 CSMEDT 05,1 ;TTY I/O and SLEEP, part 1 just before PLOTTER VARIABLES IFN CSM05$,< ;Flags and variables LP J$TTY,1 ;'CDP' in LH, UDX in RH LP J$WUDT,1 ;UDT when to wakeup LP J$NACK,1 ;Count of Negative ACKs > ;End of IFN CSM05$ REP 3/10 LP J$PAUS,1 ;PAUSE FOR EVERY FORM WIT ;[CSM] LP J$PAUS,1 ;PAUSE FOR EVERY FORM INS 22/10 CSMEDT 01,1 ;3-Pen plotter, part 1 in "PLOTTER VARIABLES" IFN CSM01$,< ;Flags and variables for plotter LP J$PENN,1 ;Pen number, from 1 to 3 LP J$XLOW,1 ;Lowest XSTEP seen while pen was down > ;End of IFN CSM01$ REP 10/11 LP J$DSPX,1 ;SPOOLED FILE EXTENTION WIT LP J$DSPX,1 ;SPOOLED FILE EXTENSION REP 15/11 WIT INTERN J$$END ;[CSM] ;For .ASSIGNing data areas REP 9/12 L.CON: BLOCK 1 ;SPROUT conntect time in seconds WIT L.CON: BLOCK 1 ;SPROUT connect time in seconds INS 24/13 CSMEDT 05,2 ;TTY I/O and SLEEP, part 2 before "LOWEND==" IFN CSM05$,< SLEEPT: BLOCK 1 ;Time to sleep > ;End of IFN CSM05$ INS 5/16 IFN CSM02$,< ;Check to see where LINK .ASSIGNed the buffers SKIPLE [TOLP..##-1777] ;Make sure data area is only one page OUTSTR [ASCIZ /?Data area for TOLP extends past 1777/] > ;End of IFN CSM02$ IFN CSM06$,< SKIPLE [TABC..##-1777] ;Make sure data area is only one page OUTSTR [ASCIZ /?Data area for TABCDP extends past 1777/] > ;End of IFN CSM06$ IFN CSM08$,< SKIPLE [PTC6..##-1777] ;Make sure data area is only one page OUTSTR [ASCIZ /?Data area for PTC6 extends past 1777/] > ;End of IFN CSM08$ REP 36/16 JRST MAIN ;AND GO!!!! WIT JRST MAIN ;AND GO! REP 11/17 MAIN.2: SKIPN JOBACT(P1) ;IS THIS STREAM ACTIVE ??? WIT MAIN.2: SKIPN JOBACT(P1) ;IS THIS STREAM ACTIVE? REP 16/17 SKIPN JOBSTW(P1) ;IS THE STREAM BLOCKED ??? WIT CSMEDT 05,2 ;TTY I/O and SLEEP, part 2 at MAIN.2:+5 IFN CSM05$,< ;Watch for sleep time PUSHJ P,CHKTIM ;Time to run this stream? JUMPF MAIN.3 ;Not yet > ;End of IFN CSM05$ SKIPN JOBSTW(P1) ;IS THE STREAM BLOCKED? REP 25/17 MOVEI S1,0 ;SNOOZE FOR INTERRUPT $CALL I%SLP ;GO WAIT $CALL CHKQUE ;PROCESS MESSAGES WIT IFE CSM05$,< MOVEI S1,0 > ;SNOOZE FOR INTERRUPT IFN CSM05$,< MOVE S1,SLEEPT > ;Get sleep time in seconds $CALL I%SLP ;GO WAIT $CALL CHKQUE ;PROCESS MESSAGES IFN CSM05$,< SETZM SLEEPT > ;Clear timer request REP 19/18 MOVE S1,@0(S1) ;GET THE FLAGS HRRZ S2,STREAM ;GET STREAM NUMBER IORM S1,JOBSTW(S2) ;SET THE FLAGS JRST MAIN ;AND GO LOOP WIT CSMEDT 05,2 ;TTY I/O and SLEEP, part 2 at DSCHD:+6 IFE CSM05$,< MOVE S1,@0(S1) > ;GET THE FLAGS IFN CSM05$,< HRRZ T1,@0(S1) ;Get the seconds to sleep HLLZ S1,@0(S1) ;Get the flags > ;End of IFN CSM05$ HRRZ S2,STREAM ;GET STREAM NUMBER IORM S1,JOBSTW(S2) ;SET THE FLAGS IFE CSM05$,< JRST MAIN > ;AND GO LOOP IFN CSM05$,< ;This code taken from LPTSPL JUMPE T1,MAIN ;Loop if no sleep time CONT. (SCHEDULER) SKIPE SLEEPT ;Is a sleep time set? CAMG T1,SLEEPT ;And current amount smaller? MOVEM T1,SLEEPT ;Yes, save shorter interval $CALL I%NOW ;Get the current time IMULI T1,3 ;Seconds to UDT ticks ADD T1,S1 ;Build wake-up time MOVEM T1,J$WUDT(J) ;Save for CHKTIM JRST MAIN ;Loop SUBTTL CHKTIM - Routine to see if it's time to schedule a stream ;CALL: J/ Pointer to job page ; ;REG: TRUE if stream can be scheduled now (timewise) ; FALSE if stream needs to wait CHKTIM: $CALL I%NOW ;Get the current time MOVE S2,S1 ;Get the UDT in S2 MOVE S1,J$WUDT(J) ;Get the stream wakeup time SUB S1,S2 ;Get time left in UDT ticks IDIVI S1,3 ;Convert to seconds SKIPG S1 ;Any seconds left? JRST [SETZM SLEEPT ;No, clear old sleep time $RETT ] ;Return TRUE SKIPE SLEEPT ;Is a sleep time set? CAMG S1,SLEEPT ;And current amount smaller? MOVEM S1,SLEEPT ;Yes, save the shorter interval $RETF ;Return FALSE ;End of code taken from LPTSPL> ;End of IFN CSM05$ REP 23/19 $CALL FILE ;NO, Process THE FILE TXNE S,RQB+ABORT ;HAVE WE BEEN REQUEUED OR WORSE? JRST ENDJOB ;YES, END NOW!! WIT $CALL FILE ;Process the file TXNE S,RQB+ABORT ;HAVE WE BEEN REQUEUED OR WORSE? JRST ENDJOB ;YES, END NOW! REP 7/21 TOPS10 < $CALL OUTWAT ;OUTPUT AND WAIT UNTIL DONE > ;;END TOPS10 TOPS20 < $CALL OUTOUT ;FORCE EVERYTHING OUT > ;;END TOPS20 WIT TOPS10< $CALL OUTWAT > ;OUTPUT AND WAIT UNTIL DONE TOPS20< $CALL OUTOUT > ;FORCE EVERYTHING OUT REP 21/21 TOPS20 < PUSHJ P,OUTOUT ;FORCE OUTPUT > ;;END TOPS20 WIT TOPS20< $CALL OUTOUT > ;FORCE OUTPUT REP 48/21 WIT REP 61/21 ;**;[2533]REVAMP CODE AT FILD.1:+7L CTK/16-DEC-82 TXNE T2,FP.DEL ;[2533]/DELETE SPECIFIED ??? TXNE S,ABORT ;[2533]IS ABORT SET ??? TXNE T2,FP.SPL ;[2533]SPOOL FILE ??? PUSHJ P,F%DEL ;[2533]YES,,DELETE THE FILE. WIT ;**;[2533] Revamp code at FILD.1:+7L CTK/16-DEC-82 TXNE T2,FP.DEL ;[2533] /DELETE specified? TXNE S,ABORT ;[2533] Is ABORT set? TXNE T2,FP.SPL ;[2533] Spool file? PUSHJ P,F%DEL ;[2533] YES,,DELETE THE FILE. REP 22/23 CAIE T1,.OROBJ ;IS THIS THE OBJECT BLOCK ??? WIT CAIE T1,.OROBJ ;IS THIS THE OBJECT BLOCK? REP 7/27 TDNE S2,JOBSTW(S1) ;ARE WE WAITING FOR OPR RESPONSE ??? $KWTOR (JOBWAC(S1)) ;YES,,KILL IT !!! WIT TDNE S2,JOBSTW(S1) ;ARE WE WAITING FOR OPR RESPONSE? $KWTOR (JOBWAC(S1)) ;YES,,KILL IT ! REP 15/28 TXNE S2,RQB ;REQUEUING JOB ? MOVX T2,%REQUE ;YES TXNE S2,ABORT ;ABORTING JOB ? WIT TXNE S2,RQB ;REQUEUING JOB? MOVX T2,%REQUE ;YES TXNE S2,ABORT ;ABORTING JOB? REP 22/28 TXNE S2,PSF%OR ;ARE WE WAITING FOR OPR RESPONSE ??? MOVX T2,%OREWT ;YES,,SAY SO TXNE S2,PSF%ST ;ARE WE STOPPED ??? MOVX T2,%STOPD ;YES,,SAY SO TXNE S2,PSF%DO ;ARE WE OFFLINE ??? WIT TXNE S2,PSF%OR ;ARE WE WAITING FOR OPR RESPONSE? MOVX T2,%OREWT ;YES,,SAY SO TXNE S2,PSF%ST ;ARE WE STOPPED? MOVX T2,%STOPD ;YES,,SAY SO TXNE S2,PSF%DO ;ARE WE OFFLINE? REP 5/29 ; dependant service routines to generate half of the ASCIZ text that gets WIT ; dependent service routines to generate half of the ASCIZ text that gets REP 9/29 SKIPN JOBACT(S1) ;NEED TO CHECKPOINT ? WIT SKIPN JOBACT(S1) ;NEED TO CHECKPOINT? REP 15/29 SKIPGE S1 ;TIME TO CHECKPOINT YET ? WIT SKIPGE S1 ;TIME TO CHECKPOINT YET? REP 41/29 PUSHJ P,DCHKP(S1) ;GENERATE DEVICE DEPENDANT TEXT WIT PUSHJ P,DCHKP(S1) ;GENERATE DEVICE dependent TEXT REP 12/30 JRST SETU.2 ;YES!! WIT JRST SETU.2 ;YES! REP 17/30 SETU.2: HRRZM T2,STREAM ;SAVE THE STREAM NUMBER $CALL I%NOW ;USE SETUP TIME AS ACK STAMP WIT ;[CSM] There is a problem if two streams start with 1/3 of a second SETU.2: HRRZM T2,STREAM ;SAVE THE STREAM NUMBER $CALL I%NOW ;USE SETUP TIME AS ACK STAMP LSH S1,3 ;[CSM] ;Free up 3 bits IOR S1,T2 ;[CSM] ;Make it be unique REP 9/32 TDNE S2,JOBSTW(S1) ;ARE WE WAITING FOR OPR RESPONSE ??? $KWTOR (JOBWAC(S1)) ;YES,,KILL IT !!! WIT TDNE S2,JOBSTW(S1) ;ARE WE WAITING FOR OPR RESPONSE? $KWTOR (JOBWAC(S1)) ;YES,,KILL IT ! REP 19/32 CAIN T1,.ORREA ;IS THIS THE REASON BLOCK ??? MOVEI P1,0(T3) ;YES..SAVE ADDRESS OF REASON CAIE T1,.CANTY ;IS THIS THE CANCEL TYPE BLOCK ??? JRST OACC.1 ;NO,,SKIP IT AND GET NEXT BLOCK MOVE S1,0(T3) ;YES - LOAD THE CANCEL TYPE CAIE S1,.CNPRG ;IS IT /PURGE ??? WIT CAIN T1,.ORREA ;IS THIS THE REASON BLOCK? MOVEI P1,0(T3) ;YES..SAVE ADDRESS OF REASON CAIE T1,.CANTY ;IS THIS THE CANCEL TYPE BLOCK? JRST OACC.1 ;NO,,SKIP IT AND GET NEXT BLOCK MOVE S1,0(T3) ;YES - LOAD THE CANCEL TYPE CAIE S1,.CNPRG ;IS IT /PURGE? REP 3/34 OACREQ: TXNE S,GOODBY ;IS IT TOO LATE FOR THIS ??? WIT OACREQ: TXNE S,GOODBY ;IS IT TOO LATE FOR THIS? REP 14/34 TDNE S2,JOBSTW(S1) ;ARE WE WAITING FOR OPR RESPONSE ??? $KWTOR (JOBWAC(S1)) ;YES,,KILL IT !!! WIT TDNE S2,JOBSTW(S1) ;ARE WE WAITING FOR OPR RESPONSE? $KWTOR (JOBWAC(S1)) ;YES,,KILL IT ! REP 22/34 CAIN T1,.REQTY ;IS THIS THE REQUEST TYPE BLOCK ??? JRST OACR.2 ;YES,,GO PROGESS IT CAIN T1,.ORREA ;IS THIS THE REASON BLOCK ??? WIT CAIN T1,.REQTY ;IS THIS THE REQUEST TYPE BLOCK? JRST OACR.2 ;YES,,GO PROGESS IT CAIN T1,.ORREA ;IS THIS THE REASON BLOCK? INS 1/36 SUBTTL FRMLEX - Forms limit exceeded routine REP 5/36 JRST OUTIGN ;YES, DOUBLE THE LIMIT WIT JRST OUTIGN ;YES, set to +infinity REP 18/36 TXNE S,ABORT ;WERE WE CANCELLED ??? WIT TXNE S,ABORT ;WERE WE CANCELLED? REP 15/37 TLNN S1,-1 ;ARE WE DEATCHED ??? WIT TLNN S1,-1 ;ARE WE DEATCHED? REP 24/37 TXNE S2,GL.ITY ;ARE WE A PTY ??? MOVE TF,[ASCII/P/] ;YES,,MAKE US 'PTY' TXNE S2,GL.CTY ;ARE WE THE CTY ??? WIT TXNE S2,GL.ITY ;ARE WE A PTY? MOVE TF,[ASCII/P/] ;YES,,MAKE US 'PTY' TXNE S2,GL.CTY ;ARE WE THE CTY? INS 32/38 CONT. (ACTEND) REP 66/38 SETZM FACTBL+7 ;NO DISK WRITES WIT CSMEDT 04,1 ;CSM accounting, part 1 after QUEUE. uuo IFE CSM04$,< SETZM FACTBL+7 > ;No disk writes IFN CSM04$,< MOVE S1,J$FORM(J) ;Get the forms type MOVEM S1,FACTBL+7 ;Instead of disk writes > ;End of CSM04$ CONT. (ACTEND) REP 71/38 MOVE S1,J$APRT(J) ;NUMBER OF PAGES PRINTED MOVEM S1,FACTBL+12 ;STORE WIT MOVE S1,J$APRT(J) ;Number of cards, feet, minutes MOVEM S1,FACTBL+12 ;Store as pages printed REP 91/38 ACTRNT: SKIPN ACTFLG ;Accounting turned on ? WIT ACTRNT: SKIPN ACTFLG ;Accounting turned on? REP 33/39 USNM3. (.EQOWN+1(J)) ;USER NAME 1 (TOPS10) WIT USNM3. (.EQOWN+1(J)) ;USER NAME 2 (TOPS10) REP 27/40 CAMN S1,[POINT 7,J$XTBF(J)] ;IS THERE A MESSAGE FOR THE OPERATOR ?? $RETT ;NO,,RETURN. WIT CAMN S1,[POINT 7,J$XTBF(J)] ;IS THERE A MESSAGE FOR THE OPERATOR? $RETT ;NO,,RETURN. IFN CSM02$,< FORM.3: > ;PUSHJ to here to wait for 'PROCEED' in OPRTXT REP 21/41 JUMPF FRMIEX ;EOF!! GETLIM T2,.EQLIM(J),FORM ;GET FORMS CAMN T1,T2 ;MATCH?? JRST FRMI.4 ;YES!! WIT JUMPF FRMIEX ;EOF! GETLIM T2,.EQLIM(J),FORM ;GET FORMS CAMN T1,T2 ;MATCH? JRST FRMI.4 ;YES! REP 38/41 JUMPF FRMIEX ;EOF!! JUMPE T1,FRMI.6 ;MAYBE PAREN?? WIT JUMPF FRMIEX ;EOF! JUMPE T1,FRMI.6 ;MAYBE PAREN? REP 10/42 SKIPA ;NO!!! JRST FRMSWI ;YES!! CAMN T1,J$LDEV(J) ;COMPARE TO OUR DEVNAM JRST FRMSWI ;MATCH!! WIT SKIPA ;NO! JRST FRMSWI ;YES! CAMN T1,J$LDEV(J) ;COMPARE TO OUR DEVNAM JRST FRMSWI ;MATCH! REP 9/43 JUMPF FRMIEX ;EOF!! JRST FRMSWI ;AND LOOP AROUND FRMS.1: $CALL FH$SIX ;GET THE SWITCH JUMPF FRMIEX ;EOF!! WIT JUMPF FRMIEX ;EOF! JRST FRMSWI ;AND LOOP AROUND FRMS.1: $CALL FH$SIX ;GET THE SWITCH JUMPF FRMIEX ;EOF! REP 23/43 CAMN T3,T1 ;MATCH?? WIT CAMN T3,T1 ;MATCH? REP 32/43 PUSHJ P,0(T3) ;GO!! WIT PUSHJ P,0(T3) ;GO! REP 15/44 JUMPF S$NOT2 ;EOF, FINISH UP!! WIT JUMPF S$NOT2 ;EOF, FINISH UP! INS 33/45 SKIPE T1 ;[CSM] ;If not zero, INS 37/45 SKIPE T1 ;[CSM] ;If not zero, REP 14/46 SKIPA ;ITS NOT!! WIT SKIPA ;ITS NOT! REP 19/47 IMULI T1,12 ;SHIFT A PLACE WIT IMULI T1,^D10 ;[CSM] ;Shift one decimal place REP 41/49 TXNE S,DSKOPN ;IS THE SPOOL FILE OPEN ??? WIT TXNE S,DSKOPN ;IS THE SPOOL FILE OPEN? REP 48/49 TXNE S,DSKOPN ;IS THE SPOOL FILE OPEN ??? WIT TXNE S,DSKOPN ;IS THE SPOOL FILE OPEN? REP 11/50 MOVEI S2,T$DISP ;YES!! CAXN S1,.OTCDP ;NO, HOW ABOUT A CARD PUNCH? MOVEI S2,C$DISP ;WIN!! WIT MOVEI S2,T$DISP ;YES! CAXN S1,.OTCDP ;NO, HOW ABOUT A CARD PUNCH? MOVEI S2,C$DISP ;WIN! REP 30/50 MOVX T1,.IOIMG+UU.PHS+UU.AIO ;IMAGE+PHONLY+NBIO WIT MOVX T1,.IOIMG+UU.PHS+UU.AIO ;IMAGE+PHONLY+NBIO CSMEDT 05,3 ;TTY I/O and SLEEP, part 3 after DEVNAM in OUTGET IFN CSM05$,< ;Check for devices connected to TTY lines HLRZ T2,J$LDEV(J) ;Get first part of physical name CAIE T2,'TTY' ;Is it a terminal? JRST CSM05Z ;No MOVE S2,J$LSER(J) ;Get service routine MOVE S1,DNAME(S2) ;Get 'PLT' or 'CDP' MOVEM S1,J$TTY(J) ;Put in LH MOVE T2,J$LDEV(J) ;Get device again IONDX. T2, ;Get UDX SETZB T2,J$TTY(J) ;Should never happen HRRM T2,J$TTY(J) ;Store TTY UDX in RH CONT. (OUTGET) ;FORCE NEW LISTING PAGE ;Disable free CRLFs every 80 characters and SET TTY NO GAG MOVX T1,.TONFC+.TOSET ;Change setting to MOVEI T3,1 ; no free CRLFs MOVE S1,[3,,T1] TRMOP. S1, ;SET TTY NO CRLF JFCL ;*BUG*; MOVX T1,.IOPIM+UU.PHS ;Packed image mode (no echo) MOVX T1,.IOIMG+UU.PHS+IO.SUP ;Image mode, no echo HLRZ S1,J$TTY(J) ;Get device type CAIN S1,'PLT' ;Output to plotter? MOVX T1,.IOASC+UU.PHS+IO.SUP ;ASCII mode, no echo CSM05Z: > ;End of IFN CSM05$ REP 40/50 CONT. (OUTGET) ;FORCE NEW LISTING PAGE MOVE S1,J$LSER(J) ;GET DEVICE DISPATCH ADDRESS MOVE S1,DBYTE(S1) ;GET OUTPUT BYTE SIZE WIT MOVE S1,J$LSER(J) ;GET DEVICE DISPATCH ADDRESS MOVE S1,DBYTE(S1) ;GET OUTPUT BYTE SIZE IFN CSM05$,< ;Cannot use 6 bits to PTC-6 HLRZ S2,J$TTY(J) ;Nonzero if TTY as output device CAIN S2,'PLT' ;Going to the plotter? MOVEI S1,7 ;Yes, use normal ASCII mode ;SET TTY NO GAG after it has been inited MOVX T1,.TOSND+.TOSET ;Change setting to HRRZ T2,J$TTY(J) MOVEI T3,0 ; no SENDs allowed MOVE S2,[3,,T1] SKIPE T2 ;Don't TRMOP. if not a TTY TRMOP. S2, ;SET TTY GAG JFCL > ;End of IFN CSM05$ REP 10/51 CAXN S1,.OTPLT ;PLOTTER ? WIT CAXN S1,.OTPLT ;PLOTTER? REP 24/51 ERJMP OUTDDE ;DEVICE DOESNT EXIST!! WIT ERJMP OUTDDE ;DEVICE DOESNT EXIST! INS 6/54 CSMEDT 01,2 ;3-Pen plotter, part 2 at OUTOUT:+1 IFN CSM01$,< ;The plotter does not interrupt for off-line or on-line SKIPE J$FPLT(J) ;Is this going to the plotter? PUSHJ P,PLTCHK ;Yes, check if it is on-line > ;End of CSM01$ REP 30/54 > ;END TOPS10 CONDITIONAL WIT CONT. (OUTOUT) IFN CSM01$,< ;After OUTWAT: inside TOPS10<> ;Ask the monitor to do a CONI to check if PLT is on-line OPDEF STSPL. [CALLI -4] ;CSM UUO to do PLT.ON==1B30 ;The plotter power is on PLTCHK: CSMEDT 08,1 ;PTC-6 Plotter Controller, part 1 inside CSM01$ IFN CSM08$,< SKIPE J$TTY(J) ;Output going to a TTY? POPJ P, ;Yes, cannot determine on-line status > ;End of IFN CSM08$ STSPL. S1, ;Get current status of plotter TXNE S1,PLT.ON ;Is the POWER-ON bit set? JRST PLTONL ;Yes, plotter is on-line now AOS S1,J$NACK(J) ;Increment NACK count IDIVI S1,^D30 ;Set S2 modulo 30 JUMPN S2,PLTCH1 ;Complain every 30 seconds HRRZ S1,STREAM ;Get stream number SETOM JOBCHK(S1) ;Request checkpoint $WTO (Off-line,,@JOBOBA(S1)) PLTCH1: CSMEDT 05,4 ;TTY I/O and SLEEP, part 4 after PLTCHK: IFN CSM05$,< $DSCHD (1) > ;De-schedule for 1 second IFE CSM05$,< MOVEI S1,1 ;Wait 1 second SLEEP S1, > ; before continuing JRST PLTCHK ;Check if it is on-line now PLTONL: SETOM J$NACK(J) ;Plotter is on-line now $RETT ;OK to do the OUT UUO > ;End of IFN CSM01$ > ;END TOPS10 CONDITIONAL CONT. (OUTOUT) INS 1/59 SUBTTL TTY I/O -- Input character from TTY, no wait CSMEDT 05,5 ;TTY I/O and SLEEP, part 5 between OUTFLS and C$DISP IFN CSM05$,< INTERN TIWAIT,TTYIN,TRMERR ;Entry points for TABCDP.MAC ;Routine to input a single character from terminal into S1. ;Uses T1 and T2. TTYIN:: MOVX T1,.TOSIP ;Skip if input in progress HRRZ T2,J$TTY(J) ;Get UDX MOVE S1,[2,,T1] ;Point to args TRMOP. S1, ;Check if input JRST TTYIN1 ;Nothing there MOVX T1,.TOISC ;Input single character MOVE S1,[2,,T1] ;Point to args TRMOP. S1, ;Get the char PUSHJ P,TRMERR ;Should never happen $RETT ;Got char in S1 TTYIN1: MOVEI S1,0 ;Signify failure $RETF TRMERR::$STOP (TUF,TRMOP. UUO Failure) SUBTTL TTY I/O -- Input character, wait up to 30 seconds ;Routine to wait up to 30 seconds for a character to come in. ;Returns TRUE if char in S1, FALSE and zero in S1 if timed out TIWAIT::PUSHJ P,TTYIN ;Check for input JUMPT TIWAI2 ;Clear NACK counter if got input ;There is a good possibility that the response will come in within 1 second MOVX S1,HB.RTC+^D1000 ;Wait 1 second, wake on char ready HIBER S1, JFCL PUSHJ P,TTYIN ;Anything now? JUMPT TIWAI2 ;Return if so AOS J$NACK(J) ;No, waited 1 second already TIWAT1: $DSCHD (1) ;De-schedule this stream for 1 second PUSHJ P,TTYIN ;Input now? JUMPT TIWAI2 ;Yes, continue AOSG S1,J$NACK(J) ;No, count failure JRST TIWAT1 ;Keep waiting if negative or zero IDIVI S1,^D30 ;Set S2 modulo 30 JUMPN S2,TIWAT1 ;If less than 30 seconds, wait again HRRZ S1,STREAM ;Get stream number $WTO (,,@JOBOBA(S1)) MOVEI S1,0 ;Signify no response $RETF TIWAI2: SETZM J$NACK(J) ;Terminal is responding POPJ P, ;TF has been set to TRUE already > ;End of IFN CSM05$ REP 13/59 JRST .RETT ;(11) ACCOUNTING JRST C$CHKP ;(12) CHECKPOINT TEXT GENERATION WIT CSMEDT 04,2 ;CSM accounting, part 2 at C$DISP:+11 IFE CSM04$,< JRST .RETT > ;(11) ACCOUNTING IFN CSM04$,< JRST CSMACT > ;(11) Accounting JRST C$CHKP ;(12) CHECKPOINT TEXT GENERATION IFN CSM04$,< CSMACT: MOVE S1,J$APRT(J) ;Get cards punched or feet punched MOVEM S1,J$ADRD(J) ;Save instead of disk reads $RETT > ;End of IFN CSM04$ REP 7/60 CAMN P2,[.INFIN] ;+INFINITY ? JRST C$CHK1 ;YES CAMG P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED ? $TEXT (DEPBP,) CAMLE P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED ? WIT CAMN P2,[.INFIN] ;+INFINITY? JRST C$CHK1 ;YES CAMG P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED? $TEXT (DEPBP,) CAMLE P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED? INS 8/61 CSMEDT 07,1 ;QUEUE defaults, part 1 at C$PROC:+4 IFE CSM07$,< REP 11/61 WIT > ;End of CSM07$ IFN CSM07$, ;Default to ASCII mode REP 34/62 JUMPF .RETT ;THIS SHOULD NEVER REALLY HAPPEN!! WIT JUMPF .RETT ;THIS SHOULD NEVER REALLY HAPPEN! REP 27/64 CAIN C,.CHTAB ;IS IT A VERTICAL TAB? WIT CAIN C,.CHTAB ;IS IT A HORIZONTAL TAB? REP 35/65 ;FOLLOWING ALPHABETICS ARE SMALL LETTERS BYTE (12) 0402,5400,5200 ;' A B BYTE (12) 5100,5040,5020 ;C D E BYTE (12) 5010,5004,5002 ;F G H BYTE (12) 5001,6400,6200 ;I J K BYTE (12) 6100,6040,6020 ;L M N BYTE (12) 6010,6004,6002 ;O P Q BYTE (12) 6001,3200,3100 ;R S T BYTE (12) 3040,3020,3010 ;U V W BYTE (12) 3004,3002,3001 ;X Y Z BYTE (12) 5000,6000,3000 ; BYTE (12) 3400,0000,0000 ; WIT ;The following alphabetics are lowercase BYTE (12) 0402,5400,5200 ;` a b BYTE (12) 5100,5040,5020 ;c d e BYTE (12) 5010,5004,5002 ;f g h BYTE (12) 5001,6400,6200 ;i j k BYTE (12) 6100,6040,6020 ;l m n BYTE (12) 6010,6004,6002 ;o p q BYTE (12) 6001,3200,3100 ;r s t BYTE (12) 3040,3020,3010 ;u v w BYTE (12) 3004,3002,3001 ;x y z BYTE (12) 5000,6000,3000 ;{ | } BYTE (12) 3400,0000,0000 ;~ DEL REP 36/66 ;FOLLOWING ALPHABETICS ARE SMALL LETTERS BYTE (12) 0402,5400,5200 ;' A B BYTE (12) 5100,5040,5020 ;C D E BYTE (12) 5010,5004,5002 ;F G H BYTE (12) 5001,6400,6200 ;I J K BYTE (12) 6100,6040,6020 ;L M N BYTE (12) 6010,6004,6002 ;O P Q BYTE (12) 6001,3200,3100 ;R S T BYTE (12) 3040,3020,3010 ;U V W BYTE (12) 3004,3002,3001 ;X Y Z BYTE (12) 5000,6000,3000 ; BYTE (12) 3400,0000,0000 ; WIT ;The following alphabetics are lowercase BYTE (12) 0402,5400,5200 ;` a b BYTE (12) 5100,5040,5020 ;c d e BYTE (12) 5010,5004,5002 ;f g h BYTE (12) 5001,6400,6200 ;i j k BYTE (12) 6100,6040,6020 ;l m n BYTE (12) 6010,6004,6002 ;o p q BYTE (12) 6001,3200,3100 ;r s t BYTE (12) 3040,3020,3010 ;u v w BYTE (12) 3004,3002,3001 ;x y z BYTE (12) 5000,6000,3000 ;{ | } BYTE (12) 3400,0000,0000 ;~ DEL REP 6/67 LOAD S1,.FPINF(E),FP.NFH ;GET NO FILE HEADER BIT JUMPN S1,.RETT ;RETURN IF NOT WANTED WIT CSMEDT 07,2 ;QUEUE defaults, part 2 at C$HEAD:+2 IFE CSM07$,< ;Ignore QUEUE's default of /NOHEADER, always punch it LOAD S1,.FPINF(E),FP.NFH ;GET NO FILE HEADER BIT JUMPN S1,.RETT ;RETURN IF NOT WANTED > ;End of IFN CSM07$ REP 7/68 PJRST OUTOUT ;FORCE OUTPUT WIT ;[CSM] PJRST OUTOUT ;FORCE OUTPUT PJRST OUTCD1 ;[CSM] ;FORCE OUTPUT REP 4/69 C$BANN: SKIPN J$FBAN(J) ;GET COUNT OF BANNER CARDS WIT C$BANN: CSMEDT 06,1 ;TTY CDP, part 1 at C$BANN: IFN CSM06$,< ;Set terminal to PUNCH+PRINT mode if /FORMS:NORMAL MOVEI S1,J$FORM(J) ;Get forms name CAMN S1,['NORMAL'] ;Normal forms? MOVEI S1,0 ;Yes, turn on print mode SKIPE S2,J$TTY(J) ;Punch really a terminal? PUSHJ P,TABINI## ;Yes, set it up > ;End of IFN CSM06$ SKIPN J$FBAN(J) ;BANNER cards wanted? REP 8/69 MOVEI S1,[ITEXT] PJRST CTRA.1 ;FALL INTO COMMON CODE C$TRAI: SKIPN J$FTRA(J) ;GET TRAILER COUNT $RETT ;RETURN IF ZERO WIT CSMEDT 07,3 ;QUEUE defaults, part 3 at C$BANN:+4 IFE CSM07$,< ;"BEGIN: JOB jobnam USER:" wastes 4 cards. MOVEI S1,[ITEXT] PJRST CTRA.1 ;FALL INTO COMMON CODE > ;End of IFE CSM07$ IFN CSM07$,< ;Punch just NAME, PPN, and NOTE (if any) PJRST CTRA.2 ;Punch user name > ;End of IFN CSM07$ IFE CSM06$,< C$TRAI: SKIPN J$FTRA(J) ;Check TRAILER wanted flag $RETT ;RETURN IF ZERO > ;End of IFE CSM06$ IFN CSM06$,< ;Call TABFIN after all is done C$TRAI: SKIPE J$FTRA(J) ;Trailer cards wanted? $CALL CTRA.0 ;Yes SKIPE J$TTY(J) ;Output to a TTY? PUSHJ P,TABFIN## ;Yes, finish up $RETT CTRA.0: > ;End of IFN CSM06$ INS 27/69 CONT. (C$BANN) IFN CSM07$,< CTRA.2: > ;Here to skip over garbage REP 27/70 PJRST OUTOUT ;PUNCH CARD AND RETURN WIT ;[CSM] PJRST OUTOUT ;PUNCH CARD AND RETURN PJRST OUTCD1 ;[CSM] ;PUNCH CARD AND RETURN REP 5/71 ;Call with Ascii character to Punch in S1 ;Punches Characters as 10 12 bit Frames followed by 2 blank frames ;Character is Punched in Rows 0 thru 6. The Contents of J$CMSK is ;ORED with the Column Punch to identify the Card as a Job or File card. WIT ;Call with ASCII character to punch in S1. ;Punches 6 characters as 10 frames each followed by 2 blank frames. ;Character is punched in Rows 0 thru 6. The contents of J$CMSK is ;OR'ed with the column punch to identify the card as a Job or File card. REP 13/71 CAILE S1,"_" ;UPPER CASE ? WIT CAILE S1,"_" ;UPPER CASE? REP 6/72 CDPBYT: PJRST OUTBYT ;OUTPUT THE BYTE WIT CDPBYT: CSMEDT 06,2 ;TTY CDP, part 2 at CDPBYT IFE CSM06$,< PJRST OUTBYT > IFN CSM06$,< ;Special output for TAB Products Cardpunch Terminal SKIPN J$TTY(J) ;Output to a TTY? PJRST OUTBYT ;No $SAVE ;Yes, preserve ACs used MOVE S1,C ;Copy to expected AC PJRST TABBYT## ;Store byte in other buffer > ;End of IFN CSM06$ REP 11/72 OUTCDP: PUSHJ P,OUTOUT ;FORCE CARD OUT AOS S1,J$APRT(J) ;COUNT ANOTHER ONE CAMLE S1,J$RLIM(J) ;OVER LIMIT? PUSHJ P,FRMLEX ;HANDLE LIMIT EXCEEDED POPJ P, ;RETURN WIT OUTCDP: AOS S1,J$APRT(J) ;COUNT ANOTHER ONE CAMLE S1,J$RLIM(J) ;OVER LIMIT? PUSHJ P,FRMLEX ;HANDLE LIMIT EXCEEDED OUTCD1: ;Output without counting IFN CSM06$,< ;Special output for TAB Products Cardpunch Terminal SKIPE J$TTY(J) ;Output to a TTY? PJRST TABPUN## ;Yes, output the card > ;End of IFN CSM06$ PJRST OUTOUT ;FORCE CARD OUT REP 25/72 PUSHJ P,PTPBYT ;OUTPUT A BYTE WIT ;[CSM] PUSHJ P,PTPBYT ;OUTPUT A BYTE PUSHJ P,CDPBYT ;[CSM] ;Use the right output routine DEL 3/73 REP 13/73 JRST .RETT ;(11) ACCOUNTING JRST P$CHKP ;(12) CHECKPOINT TEXT GENERATION WIT CSMEDT 04,3 ;CSM accounting, part 3 at P$DISP:+11 IFE CSM04$, ;(11) ACCOUNTING IFN CSM04$, ;(11) Plotter accounting JRST P$CHKP ;(12) CHECKPOINT TEXT GENERATION IFN CSM04$,< ;Account for both elapsed time and paper used PLTACT: MOVE S1,J$XLIM(J) ;Get total X increments ADDI S1,INCS/2 ;Round up IDIVI S1,INCS ;Convert to inches EXCH S1,J$APRT(J) ;Store amount of paper used MOVEM S1,J$ADRD(J) ;Store minutes in place of disk reads $RETT > ;End of IFN CSM04$ REP 6/74 IDIV P1,J$PTPM(J) ;T1:= MINUTES, T2:= FRACTION IMULI P2,^D1000 ;MAKE IT DECIMAL IDIV P2,J$PTPM(J) ;T2:= DECIMAL FRACTION OF A MINUTE MOVE P3,J$RLIM(J) ;GET LIMIT CAMN P3,[.INFIN] ;+INFINITY ? JRST P$CHK1 ;YES CAMG P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED ? $TEXT (DEPBP,) CAMLE P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED ? P$CHK1: $TEXT (DEPBP,) WIT IDIV P1,J$PTPM(J) ;P1:= MINUTES, P2:= FRACTION IMULI P2,^D10 ;[CSM] One decimal place IDIV P2,J$PTPM(J) ;P2:= DECIMAL FRACTION OF A MINUTE MOVE P3,J$RLIM(J) ;GET LIMIT CAMN P3,[.INFIN] ;+INFINITY? JRST P$CHK1 ;YES CAMG P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED? $TEXT (DEPBP,) CAMLE P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED? P$CHK1: $TEXT (DEPBP,) INS 8/75 CSMEDT 07,4 ;QUEUE defaults, part 4 at P$PROC:+4 IFE CSM07$,< ;This code removed because all plots must be BINARY halfwords INS 11/75 > ;End of IFE CSM07$ IFN CSM07$,< JRST PLTHLF > ;Default always to halfword format REP 15/75 EXP PLTSIX ;/PLOT:BINARY (6 BIT) WIT CSMEDT 02,1 ;Halfword format, part 1 at P$ROUT:+3 IFE CSM02$, ;/PLOT:BINARY (6 BIT) IFN CSM02$, ;/PLOT:BINARY (18 bit) INS 40/76 ;Here at end of plot file REP 1/77 SUBTTL Plotter service -- Devout output errors WIT SUBTTL Plotter service -- Expand CSM's compressed plot format CSMEDT 02,2 ;Halfword format, part 2 after PLTLP0: IFN CSM02$,< ;Read halfwords from disk COMMENT ~ Do not use many semicolons, it confuses FILCOM's /C switch !=======================================================! ! ! ! PLOTTER MODE -- 18 BIT ! ! ! ! In 18 bit mode, each word read from disk is divided ! ! into halfwords, which are interpreted by subroutine ! ! TOLP. Most halfwords have 9 bits of delta-X and ! ! 9 bits of delta-Y, special opcodes raise and lower ! ! the pen. See TOLP.MAC for a full description. ! ! ! !=======================================================! ! Delta Y ! Delta X ! Delta Y ! Delta X ! !=======================================================! Call TOLP. with S1/ Addr of input routine, which returns data in S1, -1 on EOF S2/ 0 to suppress header/trailer, 1 for header, 2 for trailer, 3 for both T1/ Current X position (should be same as J$XMIN) T2/ Current Y position (should be same as J$YMIN) On return, ACs 7-16 have been preserved TF/ Garbage S1/ Garbage S2/ Addr of error message, or 0 if no error T1-T4/ Garbage ~ ;End of COMMENT EXTERN TOLP. ;Routine to reverse PLOT INTERN PLOT ;Routine to move the pen INTERN NEWPEN,OPRTXT,PAUSEP,TITLE ;Other routines called by TOLP ND INCS,^D400 ;Steps per inch (620 octal) ;Process 18-bit format PLTHLF: MOVEI T1,^D36 ;Read full words from disk MOVEM T1,J$DBSZ(J) ;(let TOLP split them into halfwords) MOVE T1,J$XPOS(J) ;Raise the pen, but MOVE T2,J$YPOS(J) ; stay at current position MOVE T3,PN.UP PUSHJ P,PLOT MOVEI S2,3 ;Assume both header and trailer LOAD S1,.FPINF(E),FP.NFH ;Get No File Header bit SKIPE S1 ;Bit set? MOVEI S2,0 ;Yes, suppress internal header and trailer MOVEI S1,READ36 ;Input routine (S2 has flags) MOVE T1,J$XPOS(J) ;TOLP needs to know current position MOVE T2,J$YPOS(J) PUSHJ P,TOLP.## ;TOLP is PLOT spelled backwards MOVEI S1,[ITEXT (<^T/0(S2)/ ^F/@J$DFDA(J)/>)] ;S2 points to ASCIZ SKIPE S2 ;If errors were detected, copy string PUSHJ P,PUTERR ; and file name to error buffer JRST PLTLP0 ;File is at EOF, finish up SUBTTL Plotter service -- READ36, OPRTXT, PAUSEP, TITLE for TOLP ;Routine to read a word from the input file, returns -1 for EOF, -2 if ABORT READ36: MOVE S1,J$PTIC(J) ;Get tics plotted IDIV S1,J$PTPM(J) ;Convert to minutes CAMLE S1,J$RLIM(J) ;Still in range? PUSHJ P,FRMLEX ;No, complain PUSHJ P,INPBYT ;Get a word MOVE T1,C ;Copy to expected AC JUMPT .POPJ ;Use it if OK MOVNI T1,1 ;-1 for EOF TXNE S,RQB+ABORT ;Unless OPR caused EOF MOVNI T1,2 ;-2 for ABORT POPJ P, ;Continue back in TOLP ;Routine to send a message to the OPR. ;Called with byte count in S1, addr of ASCIZ message in S2. OPRTXT: PUSHJ P,PLTOUT ;Dump buffers HRRZ S1,STREAM ;Get the stream number $WTO (OPRTXT message,<^T/0(S2)/>,@JOBOBA(S1)) ;Tell OPR POPJ P, ;Routine to pause the plotter. ;Zero in S1 means to wait for human intervention, nonzero causes graphic ;terminals to pause that many seconds before automatically resuming. PAUSEP: PUSHJ P,PLTOUT ;Dump the buffers JUMPN S1,.POPJ ;Nonzero valid for graphics terminals PUSHJ P,SETTBF ;Set up WTO buffer PJRST FORM.3 ;Wait for a "PROCEED" response ;Routine to plot text. ; T1/ Height in increments ; T2/ Addr of text ; T3/ Angle in degrees, 0 to 359 ; T4/ Byte count for text TITLE: POPJ P, ;Not implemented PLTOUT: IFE CSM08$,< PJRST OUTOUT > IFN CSM08$,< SKIPE J$TTY(J) ;Output to a TTY? PJRST OUTOUT ;No PUSHJ P,PTCOUT## ;Yes, get ready to output last buffer SETZM J$PPOS(J) ;PTCOUT always raises the pen PJRST OUTRSP ;Output string and wait for response > ;End of IFN CSM08$ > ;End of IFN CSM02$ SUBTTL Plotter service -- NEWPEN for 3-pen plotter CSMEDT 01,3 ;3-Pen plotter, part 3 before P$DERR IFN CSM01$,< PEN.1: MOVEI S1,1 ;Set to blue pen JRST NEWPEN PEN.2: MOVEI S1,2 ;Set to black pen JRST NEWPEN PEN.3: MOVEI S1,3 ;Set to red pen and fall into NEWPEN JRST NEWPEN ND PENSEP,INCS*4/4 ;Pen separation is 1 inch or 3/4 inch CHGPEN: BYTE (6) CNGP,PNDN,0 ;Codes to change to pen #1 BYTE (6) CNGP,PEN2,PNDN,0 ; #2 BYTE (6) CNGP,PEN3,PNDN,0 ; #3 ;Routine to change pens. Called with pen number in S1, trashes it and S2. NEWPEN: $SAVE ;Save preserved ACs ;Make sure pen number in S1 is between 1 and 3 inclusive SUBI S1,1 ;Change to number from 0 to 2 IDIVI S1,3 ;Set S2 modulo 3 AOS P2,S2 ;Copy new pen number (from 1 to 3) CSMEDT 08,2 ;PTC-6 Plotter Controller, part 2 in NEWPEN IFN CSM08$,< ;Special codes for PTC-6 SKIPE J$TTY(J) ;Using a terminal line? JRST [PUSHJ P,PTCPEN## ;Yes, tell it (pen number in S2) JRST NEWPN2 ] ;Then move the pen holder > ;End of IFN CSM08$ MOVEI P1,CHGPEN-1(S2) ;Get addr of data HRLI P1,(POINT 6,) ;Make into byte pointer PUSHJ P,PENUP ;Raise any and all pens ;Output the codes to select new pen (even if it was previously selected) NEWPN1: ILDB C,P1 ;Get a byte PUSHJ P,PLTBTX ;Send to plotter (even if no-op) JUMPN C,NEWPN1 ;Loop till no-op is sent ;When pen #1 is positioned at Y=5.0, then pen #2 is at Y=4.0 and pen #3 ;is at Y=3.0. Therefore, when changing from pen #1 to pen #2 (or 2 to 3), ;the pen holder must be moved 1.0 inches in the +Y direction, without ;affecting J$YPOS and in spite of J$YMAX and J$YMIN. NEWPN2: MOVE P1,P2 ;Copy new pen number SUB P1,J$PENN(J) ;Find change (+1 if from pen 1 to pen 2) JUMPE P1,.POPJ ;All done if same as previous pen EXCH P2,J$PENN(J) ;Set new, get old JUMPE P2,.POPJ ;All done if called from P$CPEN IMULI P1,PENSEP ;Distance between pens SKIPL P1 ;If going plus, ADDM P1,J$YMAX(J) ; allow blue pen to move off the paper SKIPG P1 ;If going minus, ADDM P1,J$YMIN(J) ; allow red pen to move off the paper MOVE T1,J$XPOS(J) ;No change in X MOVE T2,P1 ;Delta Y ADD T2,J$YPOS(J) ;New Y position MOVEI T3,PN.UP ;Raise the pen PUSHJ P,PLOT ;Move the pen holder into position MOVNS P1 ;Cancel the offset SKIPG P1 ;If used to be positive, ADDM P1,J$YMAX(J) ; reset max limit SKIPL P1 ;If used to be negative, ADDM P1,J$YMIN(J) ; reset min limit ADDM P1,J$YPOS(J) ;New pen is where previous one was POPJ P, ;Routine to output bytes to plotter, passing nulls and CNGP codes correctly. ;Note: When changing pens, the first PNDN code does NOT lower the pen. PLTBTX: MOVEI S1,PLTMOV ;Load # tics for movement CAIN C,PNDN ;Pen down code? MOVEI S1,PLTPEN ;Load # tics for pen up/down ADDM S1,J$PTIC(J) ;Add in for accounting PJRST OUTBYT ;Bypass J$ROTA check > ;End of IFN CSM01$ SUBTTL Plotter service -- DEVOUT output errors REP 7/77 ; error return. Just siz we're nice guys, we'll bitch at the operator WIT ; error return. Just cuz we're nice guys, we'll bitch at the operator REP 3/78 P$BANN: PUSHJ P,P$CPEN ;RE-CALIBRATE THE PEN WIT CSMEDT 03,1 ;Banner changes, part 1 at P$BANN: ;*; IFN CSM03$, ND NAMSIZ,3 ;User's name will be 3 times larger than other text P$BANN: CSMEDT 08,3 ;PTC-6 Plotter Controller, part 3 at P$BANN IFN CSM08$,< SKIPE J$TTY(J) ;PTC-6 controller? PUSHJ P,[MOVEI T1,PLTPEN ;Yes, positive to use CR handshake PUSHJ P,PTCINI## ;Initialize terminal PJRST OUTRSP ] ;Output string to TTY > ;End of IFN CSM08$ PUSHJ P,P$CPEN ;RE-CALIBRATE THE PEN REP 12/78 ADD T1,J$XPOS(J) ;POINT TO NEXT LINE MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,3 ;PEN UP WIT IFN NAMSIZ-1,< ;Start a separate line ADD T1,J$XPOS(J) ;POINT TO NEXT LINE MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION > ;End of IFN NAMSIZ-1 IFE NAMSIZ-1,< ;Put LIMIT on same line as user name MOVE T2,T1 ;Copy character size ADD T2,J$YPOS(J) ;Space over a bit in plus-Y direction MOVE T1,J$XPOS(J) ;Current X position > ;End of IFN NAMSIZ-1 MOVEI T3,PN.UP ;Pen up REP 16/79 SKIPE J$DSPN(J) ;WAS IT /DISPOSE:RENAME ? MOVEI S2,[ITEXT (< (^W/J$DSPN(J)/.^W/J$DSPX(J)/)>)] ;YES $TEXT (DEPBP,<* File: ^F/@J$DFDA(J)/^I/(S2)/ created:^H/S1/ *^0>) WIT SKIPE J$DSPN(J) ;WAS IT /DISPOSE:RENAME? MOVEI S2,[ITEXT (< (^W/J$DSPN(J)/.^W/J$DSPX(J)/)>)] ;YES CSMEDT 02,3 ;Halfword format, part 3 at P$HEA1:-2 IFE CSM02$,< $TEXT (DEPBP,<* File: ^F/@J$DFDA(J)/^I/(S2)/ created:^H/S1/ *^0>) > IFN CSM02$,< $TEXT (DEPBP,<* File: ^F/@J$DFDA(J)/^I/(S2)/ *^0>) > ;CSM internal headers have creation date/time REP 22/79 IMULI T1,4 ;LEAVE THIS MUCH SPACE ADD T1,J$XPOS(J) ;OFFSET BY CURRENT POSITION MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,3 ;PEN GOES UP WIT ADD T1,J$XPOS(J) ;OFFSET BY CURRENT POSITION MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,PN.UP ;Pen up INS 29/79 IFN CSM01$,< ;Allow plots to butt up against each other ADDI T1,INCS/2 ;Set lowest seen to 1/2 inch margins MOVEM T1,J$XLOW(J) ;(not fully implemented yet) > ;End of IFN CSM01$ REP 7/80 MOVEI T3,3 ;WITH PEN UP PUSHJ P,PLOT ;POSITION PEN WIT MOVEI T3,PN.UP ;Pen up PUSHJ P,PLOT ;POSITION PEN CSMEDT 08,4 ;PTC-6 Plotter Controller, part 4 at end of P$EOF IFN CSM08$,< ;Call PTCOUT instead of OUTOUT SKIPE J$TTY(J) ;PTC-6 controller? JRST [PUSHJ P,PTCOUT## ;Yes, raise pen PJRST OUTRSP ] ;Wait for response > ;End of IFN CSM08$ REP 4/81 P$TRAI: PUSHJ P,P$DASH ;SEPARATE FROM LAST FILE WIT P$TRAI: CSMEDT 03,3 ;Banner changes, part 3 at P$TRAI: IFE CSM03$,< ;This test prevents error messages from coming out PUSHJ P,P$DASH ;SEPARATE FROM LAST FILE REP 8/81 SKIPN J$XERR(J) ;ANY ERROR TEXT ? JRST P$TRA0 ;NO - ONWARD PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE ADD T1,J$XPOS(J) ;POINT TO NEXT LINE MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,3 ;PEN UP WIT > ;End of IFE CSM03$ IFN CSM03$,< ;Output dashed line only if text will be plotted PUSH P,J$PTIC(J) ;Don't charge for plotter overhead SKIPN J$FTRA(J) ;Plot the trailer? SKIPE J$XERR(J) ; or an error message? PUSHJ P,P$DASH ;Yes, separate text from plot > ;End of IFN CSM03$ SKIPN J$XERR(J) ;ANY ERROR TEXT? JRST P$TRA0 ;NO - ONWARD PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE IMULI T1,2 ;[CSM] ;Make room for characters ADD T1,J$XPOS(J) ;POINT TO NEXT LINE MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,PN.UP ;Pen up REP 19/81 P$TRA0: MOVEI S1,[ASCIZ |End|] ;GET LINE IDENTIFIER PUSHJ P,PLTJOB ;PLOT JOB LINE P$TRA1: PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE ADD T1,J$XPOS(J) ;POINT TO NEXT LINE MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,3 ;PEN UP WIT P$TRA0: IFN CSM03$,< ;Check for /TRAILER after plotting error message SKIPN J$FTRA(J) ;Trailer wanted? JRST P$TRA3 ;No, skip job line and summary > ;End of IFN CSM03$ MOVEI S1,[ASCIZ |End|] ;GET LINE IDENTIFIER PUSHJ P,PLTJOB ;PLOT JOB LINE CONT. (P$TRAI) P$TRA1: PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE IFN NAMSIZ-1,< ;Start a separate line ADD T1,J$XPOS(J) ;POINT TO NEXT LINE MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION > ;End of IFN NAMSIZ-1 IFE NAMSIZ-1,< ;Put SUMMARY on same line as user name MOVE T2,T1 ;Copy character size ADD T2,J$YPOS(J) ;Space over a bit in plus-Y direction MOVE T1,J$XPOS(J) ;Current X position > ;End of IFN NAMSIZ-1 MOVEI T3,PN.UP ;Pen up REP 33/81 P$TRA2: MOVE T1,(P) ;GET # TICS FOR JOB IDIV T1,J$PTPM(J) ;T1:= MINUTES, T2:= FRACTION IMULI T2,^D1000 ;MAKE IT DECIMAL IDIV T2,J$PTPM(J) ;T2:= DECIMAL FRACTION OF A MINUTE $TEXT (DEPBP,< plotted in ^D/T1/.^D3L0/T2/ minutes^0>) WIT P$TRA2: MOVE T1,(P) ;GET # TICS FOR JOB IDIV T1,J$PTPM(J) ;T1:= MINUTES, T2:= FRACTION IMULI T2,^D10 ;[CSM] 1 decimal place (=6 seconds) IDIV T2,J$PTPM(J) ;T2:= DECIMAL FRACTION OF A MINUTE $TEXT (DEPBP,< plotted in ^D/T1/.^D/T2/ minutes^0>) REP 49/81 MOVEI T3,3 ;PEN UP WIT MOVEI T3,PN.UP ;Pen up INS 55/81 CSMEDT 08,5 ;PTC-6 Plotter Controller, part 5 at end of P$TRAI IFN CSM08$,< SKIPE J$TTY(J) ;PTC-6 controller? PUSHJ P,[PUSHJ P,PTCOUT## ;Yes, raise pen PUSHJ P,OUTRSP ;Wait for response PUSHJ P,PTCFIN## ;Finish up and deselect PJRST OUTSTG ] ;Output string to TTY > ;End of IFN CSM08$ REP 11/82 MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,3 ;PEN UP PUSHJ P,PLOT ;POSITION PEN MOVE T1,J$XPOS(J) ;DON'T TOUCH X POSITION MOVE T2,J$YMAX(J) ;GET MAXIMUM Y VALUE MOVEI T3,2 ;PEN DOWN WIT CSMEDT 03,4 ;Banner changes, part 4 at P$LINE:+2 IFE CSM03$,< ;Going from MIN to MAX when pen is near MAX wastes time MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,PN.UP ;Pen up PUSHJ P,PLOT ;POSITION PEN MOVE T1,J$XPOS(J) ;Use current X position MOVE T2,J$YMAX(J) ;GET MAXIMUM Y VALUE > ;End of IFE CSM03$ IFN CSM03$,< ;Go to MAX, then to MIN and end there MOVE T2,J$YMAX(J) ;Go to closer end point CAIL T2,INCS*6 ;More than 6 inches? MOVEI T2,INCS*6 ;Yes, don't waste inc MOVEI T3,PN.UP ;Pen up PUSHJ P,PLOT ;Position pen MOVE T1,J$XPOS(J) ;Use current X position MOVE T2,J$YMIN(J) ;Go to "HOME" position > ;End of IFE CSM03$ MOVEI T3,PN.DWN ;Pen down REP 23/82 MOVEI T3,3 ;PEN UP WIT MOVEI T3,PN.UP ;Pen up REP 4/83 ; This routine works like P$LINE ; P$DASH: PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE ADD T1,J$XPOS(J) ;POINT TO NEXT LINE MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,3 ;PEN UP WIT ; This routine works like P$LINE, but line is drawn with dashes. ; The length of each dash is the same as the height of the characters P$DASH: PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE ADD T1,J$XPOS(J) ;POINT TO NEXT LINE CSMEDT 03,5 ;Banner changes, part 5 at P$DASH:+3 IFE CSM03$,< MOVE T2,J$YMIN(J) > ;GET MINIMUM Y POSITION IFN CSM03$,< MOVE T2,J$YMAX(J) ;Get maximum Y position CAIL T2,INCS*6 ;More than 6 inches? MOVEI T2,INCS*6 ;Yes, don't waste time and ink > ;End of IFN CSM03$ MOVEI T3,PN.UP ;Pen up REP 13/83 ADD T1,J$YPOS(J) ;ADD TO Y POSITION CAML T1,J$YMAX(J) ;GONE TOO FAR ? WIT IFE CSM03$,< ADD T1,J$YPOS(J) ;ADD TO Y POSITION CAML T1,J$YMAX(J) ;GONE TOO FAR? > ;End of IFE CSM03$ IFN CSM03$,< MOVNS T1 ;Make negative ADD T1,J$YPOS(J) ;Decrement Y position CAMG T1,J$YMIN(J) ;Gone too far? > ;End of IFN CSM03$ REP 18/83 MOVEI T3,2 ;PEN DOWN WIT MOVEI T3,PN.DWN ;Pen down REP 22/83 ADD T1,J$YPOS(J) ;ADD TO Y POSITION CAML T1,J$YMAX(J) ;GONE TOO FAR ? WIT IFE CSM03$,< ADD T1,J$YPOS(J) ;ADD TO Y POSITION CAML T1,J$YMAX(J) ;GONE TOO FAR? > ;End of IFE CSM03$ IFN CSM03$,< MOVNS T1 ;Make negative ADD T1,J$YPOS(J) ;Decrement Y position CAMG T1,J$YMIN(J) ;Gone too far? > ;End of IFN CSM03$ REP 27/83 MOVEI T3,3 ;PEN UP WIT MOVEI T3,PN.UP ;Pen up REP 5/84 ; Call: MOVEI S1,[ASCIZ |Start|] ;OR [ASCIZ |Stop|] WIT ; Call: MOVEI S1,[ASCIZ |Start|] ;OR [ASCIZ |End|] REP 13/84 MOVEI T3,3 ;PEN UP PUSHJ P,PLOT ;POSITION PEN PUSHJ P,SETTBF ;SET UP TEXT BUFFER WIT MOVEI T3,PN.UP ;Pen up PUSHJ P,PLOT ;POSITION PEN PUSHJ P,SETTBF ;SET UP TEXT BUFFER CSMEDT 03,6 ;Banner changes, part 6 at PLTJOB:+8 IFN CSM03$,< PUSHJ P,PEN.3 > ;Do "*START*" in red REP 21/84 PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE IMULI T1,^D4 ;GET STARTING POSITION ADD T1,J$XPOS(J) ;OFFSET BY CURRENT POSITION MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,3 ;PEN UP WIT PUSHJ P,P$CHKS ;COMPUTE CHARACTER SIZE IMULI T1,NAMSIZ+1 ;[CSM] ;Size of name plus blank space ADD T1,J$XPOS(J) ;OFFSET BY CURRENT POSITION MOVE T2,J$YMIN(J) ;GET MINIMUM Y POSITION MOVEI T3,PN.UP ;Pen up REP 29/84 IMULI T1,3 ;COMPUTE NEW CHARACTER SIZE MOVEM T1,J$CSIZ(J) ;STORE IT ;PLOT THE USERS NAME TOPS10< DMOVE T3,.EQOWN(J) WIT IMULI T1,NAMSIZ ;[CSM] ;The name is bigger than other text MOVEM T1,J$CSIZ(J) ;STORE IT IFN CSM03$,< PUSHJ P,PEN.2 > ;Do user's name in black CONT. (PLTJOB) ;PLOT THE USERS NAME TOPS10< DMOVE T3,.EQOWN(J) ;Name and PPN, 28 chars max REP 43/84 MOVEI T3,3 ;PEN UP PUSHJ P,PLOT ;POSITION PEN WIT MOVEI T3,PN.UP ;Pen up PUSHJ P,PLOT ;POSITION PEN IFN CSM03$,< PUSHJ P,PEN.1 > ;Next dividing line will be blue INS 13/85 MOVEI S1,.CHNUL ;[CSM] ;Terminate previous string PUSHJ P,DEPBP ;[CSM] ; (in case of /NOTE: in SPFORM.INI) REP 19/85 MOVEI T3,3 ;PEN UP WIT MOVEI T3,PN.UP ;Pen up REP 23/85 CAIN C,200 ;DONE ALL CHARACTERS ? WIT CAIN C,200 ;DONE ALL CHARACTERS? REP 31/85 SOJLE P1,TEST.1 ;DONE WITH THIS LINE ? WIT SOJLE P1,TEST.1 ;DONE WITH THIS LINE? REP 3/86 P$CPEN: MOVE T1,J$YMAX(J) ;GET THE MAXIMUM Y VALUE WE KNOW ABOUT WIT ;This is the only place that J$XPOS is reset. It is called from P$BANN. P$CPEN: MOVE T1,J$YMAX(J) ;GET THE MAXIMUM Y VALUE WE KNOW ABOUT CSMEDT 01,4 ;3-pen plotter, part 4 at end of P$CPEN IFN CSM01$,< ;Assume pen is positioned close to the origin CAIL T1,INCS*4 ;More than 4 inches? MOVEI T1,INCS*4 ;Yes, don't waste time ramming the pen > ;End of IFN CSM01$ REP 8/86 MOVE T1,J$XPOS(J) ;DON'T TOUCH THE X POSITION MOVEI T2,0 ;RAM THE PEN INTO THE AXIS MOVEI T3,3 ;PEN UP WIT MOVE T1,J$XPOS(J) ;Use current X position MOVEI T2,0 ;RAM THE PEN INTO THE AXIS MOVEI T3,PN.UP ;Pen up REP 18/86 MOVEI T3,3 ;PEN UP WIT MOVEI T3,PN.UP ;Pen up REP 23/86 POPJ P, ;RETURN SUBTTL Plotter service -- Compute chracter size WIT IFN CSM01$,< ;RECAL has positioned pen #1 at YMIN SETZM J$PENN(J) ;Flag that pen holder was reset MOVEI S1,1 ;Select pen number 1 PUSHJ P,NEWPEN ;Tell the plotter which pen to use > ;End of IFN CSM01$ POPJ P, ;RETURN SUBTTL Plotter service -- Compute character size INS 7/87 CSMEDT 01,5 ;3-Pen plotter, part 5 at P$CHKS:+3 IFN CSM01$,< ;Don't plot giant letters on 36 inch wide paper CAIL T1,INCS/6 ;Bigger than 1/6 inch? MOVEI T1,INCS/6 ;Yes, reduce size > ;End of IFN CSM01$ REP 43/88 MOVEI T3,3 ;PEN UP BEFOR PLOTTING WIT MOVEI T3,PN.UP ;Pen up REP 7/89 ; 1 No Change in Pen ; 2 Pen Down before Plotting ; 3 Pen Up before moving ; PLOT: $SAVE ;PRESERVE TEMPORARIES CAIG T3,1 ;CHANGE REQUESTED? JRST PLT.1 ;NO..PROCEED SUBI T3,3 ;YES..GET -1 OR 0 WIT PN.SAM==1 ;No Change in Pen PN.DWN==2 ;Pen Down before Plotting PN.UP== 3 ;Pen Up before moving ; PLOT: $SAVE ;PRESERVE TEMPORARIES CSMEDT 08,6 ;PTC-6 Plotter Controller, part 6 at PLOT:+1 IFN CSM08$,< ;Delay testing of T3 if output to a terminal SKIPN J$TTY(J) ;Is the plotter really a TTY? > ;End of IFN CSM08$ CAIG T3,PN.SAM ;CHANGE REQUESTED? JRST PLT.1 ;NO..PROCEED SUBI T3,PN.UP ;Yes, get -1 or 0 INS 22/89 SUB T2,J$YPOS(J) ;COMPUTE DELTA Y IFN CSM08$,< ;Call external routine if PTC-6 SKIPE J$TTY(J) ;TTY? (T1, T2, and T3 set up) JRST PTCMV ;Yes, calculate character string > ;End of IFN CSM08$ DEL 25/89 SUB T2,J$YPOS(J) ;COMPUTE DELTA Y INS 1/91 SUBTTL Plotter service -- PTC-6 interface IFN CSM08$,< ;T1 & T2 have delta movement, T3 has 2 or 3 PTCMV: ADDM T1,J$XPOS(J) ;Update position ADDM T2,J$YPOS(J) MOVE S1,J$XPOS(J) ;Get new X position CAIL T3,3 ;Pen up? JRST PTCMV1 ;No, skip next tests CAMLE S1,J$XLIM(J) ;Highest seen so far? MOVEM S1,J$XLIM(J) ;Yes CAMGE S1,J$XLOW(J) ;Closest to the origin? MOVEM S1,J$XLOW(J) ;Yes ;T1, T2, and T3 are set up with delta-X, delta-Y, and pen up/down code PTCMV1: PUSHJ P,PTCMOV## ;Translate move, fall into OUTRSP PAGE ;Routine to output the string pointed to by T1 and wait for response. ;S1 has accumulated increments for the last 4 buffers, to be used to ;predict how long it will take for the PTC-6 to respond. OUTRSP: JUMPE T1,.POPJ ;Don't wait if no string IMULI S1,PLTMOV ;Number of ticks to move LSH S1,-2 ;S1 has count for 4 buffers ADDM S1,J$PTIC(J) ;Predict elapsed time IMULI S1,^D60*4 ;Cancel LSH, use seconds not minutes IDIV S1,J$PTPM(J) ;Number of seconds required ADDI S1,^D<512*10/CSM08$> ;512 chars take 2 seconds at 2400 baud MOVNM S1,J$NACK(J) ;Negative to delay the complaints OUTRS1: PUSHJ P,OUTSTG ;Send the string OUTRS2: PUSHJ P,TIWAIT ;Get response, waiting up to 30 seconds JUMPT OUTRS3 ;Got it TXNE S,RQB+ABORT ;REQUEUE or ABORT? $RETF ;Yes, give up PUSHJ P,PTCOUT## ;Send string to raise pen SETZM J$PPOS(J) ;(just to get controller to respond) JRST OUTRS1 ;Loop until response or REQUEUE OUTRS3: CAIE S1,.CHCRT ;CR at end? JRST OUTRS2 ;No, skip over "0", "C" PJRST TTYIN ;Yes, snarf up the LF (if it's there) ;Routine to output the string pointed to by T1. ;The Monitor will put the job in "TO" Terminal Output wait if there are more ;than 400 characters in the TTY chunks. TOMAX=^D248 ;Avoid output wait for TTY OUTSTG: JUMPE T1,.POPJ ;Return if nothing to do HRLI T1,(POINT 7,) ;Make into ASCII byte pointer OUTST1: MOVEI S1,0 ;Clear byte count OUTST2: ILDB C,T1 ;Get a character JUMPE C,OUTOUT ;Stop on null, output buffer, return PUSHJ P,OUTBYT ;Send it CAIG S1,TOMAX ;Almost enough to cause 'TO' wait? AOJA S1,OUTST2 ;Loop till end of ASCIZ PUSHJ P,OUTOUT ;Dump partial buffer $DSCHD (TOMAX*^D10/CSM08$) ;Wait 1 second at 2400 baud JRST OUTST1 ;(gives checkpoint routine a chance) > ;End of IFN CSM08$ REP 11/91 ROTAB: EXP 0 ;NO MOVEMENT BYTE (18) 106 (2) 0 (4) XYU ,XYL ,XYD ,XYR ;MOVE DOWN BYTE (18) 102 (2) 0 (4) XYD ,XYR ,XYU ,XYL ;MOVE UP BYTE (18) 114 (2) 0 (4) PEN3,PEN3,PEN3,PEN3 ;SELECT PEN3 BYTE (18) 104 (2) 0 (4) XYR ,XYU ,XYL ,XYD ;MOVE RIGHT BYTE (18) 105 (2) 0 (4) XYDL,XYUL,XYUR,XYDR ;MOVE DOWN+RIGHT BYTE (18) 103 (2) 0 (4) XYDR,XYDL,XYUL,XYUR ;MOVE UP+RIGHT EXP -1 ;ILLEGAL BYTE (18) 100 (2) 0 (4) XYL ,XYD ,XYR ,XYU ;MOVE LEFT BYTE (18) 107 (2) 0 (4) XYUL,XYUR,XYDR,XYDL ;MOVE DOWN+LEFT BYTE (18) 101 (2) 0 (4) XYUR,XYDR,XYDL,XYUL ;MOVE UP+LEFT EXP -1 ;ILLEGAL BYTE (18) 113 (2) 0 (4) PEN2,PEN2,PEN2,PEN2 ;SELECT PEN 2 EXP -1 ;ILLEGAL EXP -1 ;ILLEGAL BYTE (18) 112 (2) 0 (4) CNGP,CNGP,CNGP,CNGP ;CHANGE PENS WIT ROTAB: EXP 0 ; 0 NO MOVEMENT BYTE (18) 106 (2) 0 (4) XYU ,XYL ,XYD ,XYR ; 1 Minus X BYTE (18) 102 (2) 0 (4) XYD ,XYR ,XYU ,XYL ; 2 Plus X BYTE (18) 114 (2) 0 (4) PEN3,PEN3,PEN3,PEN3 ; 3 SELECT PEN3 BYTE (18) 104 (2) 0 (4) XYR ,XYU ,XYL ,XYD ; 4 Plus Y BYTE (18) 105 (2) 0 (4) XYDL,XYUL,XYUR,XYDR ; 5 Plus Y & Minus X ;[CSM] BYTE (18) 103 (2) 0 (4) XYDR,XYDL,XYUL,XYUR ;MOVE UP+RIGHT BYTE (18) 103 (2) 0 (4) XYDR,XYUR,XYUL,XYDL;[CSM] 6 Plus Y & Plus X EXP -1 ; 7 ILLEGAL BYTE (18) 100 (2) 0 (4) XYL ,XYD ,XYR ,XYU ;10 Minus Y ;[CSM] BYTE (18) 107 (2) 0 (4) XYUL,XYUR,XYDR,XYDL ;MOVE DOWN+LEFT BYTE (18) 107 (2) 0 (4) XYUL,XYDL,XYDR,XYUR;[CSM]11 Minus Y & Minus X BYTE (18) 101 (2) 0 (4) XYUR,XYDR,XYDL,XYUL ;12 Minus Y & Plus X EXP -1 ;13 ILLEGAL BYTE (18) 113 (2) 0 (4) PEN2,PEN2,PEN2,PEN2 ;14 SELECT PEN 2 EXP -1 ;15 ILLEGAL EXP -1 ;16 ILLEGAL BYTE (18) 112 (2) 0 (4) CNGP,CNGP,CNGP,CNGP ;17 CHANGE PENS REP 10/92 PLTBYT: TRZE C,PNUP ;TEST AND CLEAR PEN UP CODE WIT PLTBYT: $SAVE ;[CSM] ;Preserve ACs TRZE C,PNUP ;TEST AND CLEAR PEN UP CODE REP 15/92 PLTXYD: TRNN C,XYD ;GOING DOWN ? JRST PLTXYU ;NO AOS S1,J$XPOS(J) ;+1 CAMG S1,J$XMAX(J) ;BEYOND X MAXIMUM ? CAMG S1,J$XMIN(J) ;WITHIN X BOUNDS ? TRZ C,XYD!XYU ;STOP MOVING PLTXYU: TRNN C,XYU ;GOING UP ? JRST PLTXYL ;NO SOS S1,J$XPOS(J) ;-1 CAMGE S1,J$XMAX(J) ;BEYOND X MAXIMUM ? CAMGE S1,J$XMIN(J) ;WITHIN X BOUNDS ? TRZ C,XYD!XYU ;STOP MOVING PLTXYL: TRNN C,XYL ;GOING LEFT ? JRST PLTXYR ;NO AOS S2,J$YPOS(J) ;+1 CAMG S2,J$YMAX(J) ;BEYOND Y MAXIMUM ? CAMG S2,J$YMIN(J) ;WITHIN Y BOUNDS ? TRZ C,XYR!XYL ;STOP MOVING PLTXYR: TRNN C,XYR ;GOING RIGHT ? JRST PLTB.6 ;NO SOS S2,J$YPOS(J) ;-1 CAMGE S2,J$YMAX(J) ;BEYOND Y MAXIMUM ? CAMGE S2,J$YMIN(J) ;WITHIN Y BOUNDS ? TRZ C,XYR!XYL ;STOP MOVING PLTB.6: SKIPN J$PPOS(J) ;IS PEN DOWN? PJRST PLTB.8 ;NO..DON'T RECORD MAX POSITIONS WIT PLTXYD: TRNN C,XYD ;GOING DOWN? JRST PLTXYU ;NO TRNE C,XYU ;[CSM] ;Going +X and -X at the same time? JRST PLTB.8 ;[CSM] ;Yes, this is a change-pen code AOS S1,J$XPOS(J) ;+1 CAMG S1,J$XMAX(J) ;BEYOND X MAXIMUM? CAMG S1,J$XMIN(J) ;WITHIN X BOUNDS? TRZ C,XYD!XYU ;STOP MOVING PLTXYU: TRNN C,XYU ;GOING UP? JRST PLTXYL ;NO SOS S1,J$XPOS(J) ;-1 CAMGE S1,J$XMAX(J) ;BEYOND X MAXIMUM? CAMGE S1,J$XMIN(J) ;WITHIN X BOUNDS? TRZ C,XYD!XYU ;STOP MOVING PLTXYL: TRNN C,XYL ;GOING LEFT? JRST PLTXYR ;NO TRNE C,XYR ;[CSM] ;Going +Y and -Y at the same time? JRST PLTB.8 ;[CSM] ;Yes, this is a change-pen code AOS S2,J$YPOS(J) ;+1 CAMG S2,J$YMAX(J) ;BEYOND Y MAXIMUM? CAMG S2,J$YMIN(J) ;WITHIN Y BOUNDS? TRZ C,XYR!XYL ;STOP MOVING PLTXYR: TRNN C,XYR ;GOING RIGHT? JRST PLTB.6 ;NO SOS S2,J$YPOS(J) ;-1 CAMGE S2,J$YMAX(J) ;BEYOND Y MAXIMUM? CAMGE S2,J$YMIN(J) ;WITHIN Y BOUNDS? TRZ C,XYR!XYL ;STOP MOVING CONT. (PLTBYT) PLTB.6: SKIPN J$PPOS(J) ;IS PEN DOWN? PJRST PLTB.8 ;NO..DON'T RECORD MAX POSITIONS MOVE S1,J$XPOS(J) ;[CSM] ;In case of no AOS or SOS was done INS 50/92 CSMEDT 01,6 ;3-pen plotter, part 6 at PLTB.6:+5 IFN CSM01$,< ;Remember X minimum for positioning trailer after X maximum CAMGE S1,J$XLOW(J) ;Smaller than the previous XLOW? MOVEM S1,J$XLOW(J) ;Yes, user went near -X boundry ;therefore put dashed line close to plot > ;End of IFN CSM01$ REP 5/95 PLTTAB: C%000: Z ;NULL IS ILLEGAL C%001: XX <200,542,702,142,604,FIN> C%002: XX <144,563,603,622,621,600,560,541,542,563,603,624,FIN> C%003: XX <561,701,702,663,642,241,643,624,603,601,FIN> C%004: XX <602,544,FIN> C%005: XX <220,624,564,FIN> C%006: XX <243,641,620,560,541,543,200,602,FIN> C%007: XX <141,641,240,644,243,543,FIN> C%010: XX <602,240,544,FIN> C%011: XX <240,661,604,564,543,562,602,644,FIN> C%012: XX <242,641,620,560,541,543,564,624,643,642,702,704,FIN> C%013: XX <160,541,562,662,703,664,FIN> C%014: XX <240,644,302,562,160,564,FIN> C%015: XX <200,560,541,543,564,624,643,641,620,600,604,242,542,FIN> C%016: XX <202,561,600,620,641,622,602,563,604,624,643,622,FIN> C%017: XX <204,623,621,600,560,541,543,564,644,702,701,FIN> C%020: XX <244,641,620,560,541,544,FIN> C%021: XX <240,643,624,564,543,540,FIN> C%022: XX <160,640,661,663,644,564,FIN> C%023: XX <260,600,561,563,604,664,FIN> C%024: XX <300,600,542,604,704,240,644,FIN> C%025: XX <544,704,700,221,624,206> C%026: XX <100,640,600,561,562,603,643,603,564,FIN> C%027: XX <143,564,603,164,560,221,640,661,240,644,FIN> C%030: XX <541,561,600,620,641,643,624,604,563,543,544,FIN> C%031: XX <220,624,262,624,562,FIN> C%032: XX <160,601,543,564,FIN> C%033: XX <602,642,704,244,640,200,604,FIN> C%034: XX <160,563,303,620,623,FIN> C%035: XX <300,623,620,160,563,FIN> C%036: XX <160,564,224,620,260,664,FIN> C%037: XX <200,542,604,FIN> WIT PLTTAB: ;Characters used at Stanford (SUAI) C%000: Z ;NULL IS ILLEGAL C%001: XX <200,542,702,142,604,FIN> ;Down arrow .XCREF ;[CSM] Don't CREF the rest C%002: XX <144,563,603,622,621,600,560,541,542,563,603,624,FIN> ;Alpha C%003: XX <561,701,702,663,642,241,643,624,603,601,FIN>;Beta C%004: XX <602,544,FIN> ;Up angle bracket C%005: XX <220,624,564,FIN> ;Negation C%006: XX <243,641,620,560,541,543,200,602,FIN> ;Epsilon C%007: XX <141,641,240,644,243,543,FIN> ;Pi C%010: XX <602,240,544,FIN> ;Lambda C%011: XX <240,661,604,564,543,562,602,644,FIN> ;Gamma C%012: XX <242,641,620,560,541,543,564,624,643,642,702,704,FIN> ;Linefeed C%013: XX <160,541,562,662,703,664,FIN> ;Integral C%014: XX <240,644,302,562,160,564,FIN> ;Plus or Minus C%015: XX <200,560,541,543,564,624,643,641,620,600,604,242,542,FIN> ;CR C%016: XX <202,561,600,620,641,622,602,563,604,624,643,622,FIN> ;Infinity C%017: XX <204,623,621,600,560,541,543,564,644,702,701,FIN> ;Delta C%020: XX <244,641,620,560,541,544,FIN> ;Subset C%021: XX <240,643,624,564,543,540,FIN> ;Element of C%022: XX <160,640,661,663,644,564,FIN> ;Intersection C%023: XX <260,600,561,563,604,664,FIN> ;Union C%024: XX <300,600,542,604,704,240,644,FIN> ;All elements C%025: XX <544,704,700,221,624,206> ;There exists C%026: XX <100,640,600,561,562,603,643,603,564,FIN> ;Mu (micro) C%027: XX <143,564,603,164,560,221,640,661,240,644,FIN>;Double arrow C%030: XX <541,561,600,620,641,643,624,604,563,543,544,FIN> ;Omega C%031: XX <220,624,262,624,562,FIN> ;Left arrow C%032: XX <142,600,642,604,542,FIN> ;Formerly C%175 ;Diamond box [CSM] C%033: XX <602,642,704,244,640,200,604,FIN> ;Not equal C%034: XX <160,563,303,620,623,FIN> ;Less or equal C%035: XX <300,623,620,160,563,FIN> ;Greater or equal C%036: XX <160,564,224,620,260,664,FIN> ;Identically C%037: XX <200,542,604,FIN> ;Down angle bracket REP 27/98 C%172: XX <240,644,540,544,201,603,FIN> C%173: XX <144,543,562,602,621,620,621,642,662,703,704,FIN> C%174: XX <102,702,FIN> C%175: XX <142,600,642,604,542,FIN> C%176: XX <541,562,602,623,624,623,642,662,701,700,FIN> C%177: XX <260,564,FIN> WIT C%172: XX <240,644,540,544,201,603,FIN> ;z Lowercase Z C%173: XX <144,543,562,602,621,620,621,642,662,703,704,FIN> ;{ C%174: XX <102,702,FIN> ;| Vertical bar ;[CSM] Put close brace and tilde where they belong in the ASCII code C%175: XX <541,562,602,623,624,623,642,662,701,700,FIN> ;} 175, not C%176 C%176: XX <160,601,543,564,FIN> ;~ Tilde, formerly C%032 .CREF ;[CSM] ;OK to CREF now C%177: XX <260,564,FIN> ;\ Backslash, duplicate of C%134 REP 13/99 JRST .RETT ;(11) ACCOUNTING WIT CSMEDT 04,4 ;CSM accounting, part 4 at T$DISP:+11 IFE CSM04$,< JRST .RETT > ;(11) ACCOUNTING IFN CSM04$,< JRST CSMACT > ;(11) ACCOUNTING REP 8/100 CAMN P2,[.INFIN] ;+INFINITY ? JRST T$CHK1 ;YES CAMG P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED ? $TEXT (DEPBP,) CAMLE P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED ? WIT CAMN P2,[.INFIN] ;+INFINITY? JRST T$CHK1 ;YES CAMG P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED? $TEXT (DEPBP,) CAMLE P1,J$RLIM(J) ;OPERATOR ALLOW LIMIT TO EXCEED? INS 11/101 CSMEDT 07,5 ;QUEUE defaults, part 5 at T$PROC:+6 IFE CSM07$,< ;This code will punch SOS files in BINARY mode INS 14/101 > ;End of IFE CSM07$ IFN CSM07$,< JRST PTASC > ;Default always to ASCII REP 24/104 JUMPF .RETT ;DONE!! WIT JUMPF .RETT ;DONE! REP 14/110 CAIG S1,^D10 ;PUNCH AT LEASE 10 FRAMES WIT CAIG S1,^D10 ;PUNCH AT least 10 FRAMES REP 17/111 TLET.1: ILDB C,S1 ;GT SEGMENT BITS WIT TLET.1: ILDB C,S1 ;Get SEGMENT BITS REP 6/112 PTPBYT: PUSH P,S1 ;SAVE FROM PUSH P,S2 ; DESTRUCTION WIT PTPBYT: $SAVE ;[CSM] ;Preserve ACs REP 12/112 CAMLE S1,J$RLIM(J) ;EXCEEDED LIMIT ? PUSHJ P,FRMLEX ;YES - ASK THE OPERATOR'S ADVICE POP P,S2 ;RESTORE POP P,S1 ; S1 & S2 POPJ P, ;RETURN WIT CAMLE S1,J$RLIM(J) ;EXCEEDED LIMIT? PUSHJ P,FRMLEX ;YES - ASK THE OPERATOR'S ADVICE POPJ P, ;[CSM] ;ACs automatically retored on return REP 24/112 PTPREP: PUSH P,P1 ;SAVE P1 WIT PTPREP: $SAVE ;[CSM] ;Save P1 DEL 28/112 POP P,P1 ;RESTORE P1 REP 32/114 BYTE (7) 010,034,052,010,010 ; WIT BYTE (7) 010,034,052,010,010 ;_ INS 41/115 PAGE CSMEDT 07,6 ;QUEUE defaults, part 6 before DSPMOD: IFE CSM07$,< INS 53/115 > ;End of IFE CSM07$ REP 25/116 JRST CHKS.3 ;GET A COMPLETE BLOCK!! WIT JRST CHKS.3 ;GET A COMPLETE BLOCK! INS 1/123 LITS: XLIST ;[CSM] Literals LIT ;[CSM] LIST ;[CSM] SUM 114036