.TITLE .INTRP / / 7 MAY 76 (026: PDH) INHIBIT LINE PRINTER FORM FEEDS IN DOS / 20 FEB 76 (PDH) '.ARG' NOW TAKES SPECIAL ACTION ON DATA MODES 4 & 5; / CHANGE 'ISZ' TO 'IDX' OR 'SET' WHERE APPROPRIATE / 14 MAR 75 (MKH) FIX IMPLIED DECIMAL IN 'F' FORMAT / 25 NOV 74 (PDH) REMOVE RESIDUAL REPEAT COUNT IN FREE-FORMAT I/O; / CHANGE ERROR TAGS TO NUMERIC / 13 SEP 74 (PDH) DETECT ZERO & TOO-NARROW FIELD WIDTH FORMATS / 12 SEP 74 (PDH) ^P NOW GIVES ERROR 30 / 4 AUG 74 (JAS) CORRECT VARIABLE RETURN AND ERROR TRACEBACK / 1 AUG 74 (PDH) REMOVE '.IODEV' STATEMENT FOR DOS COMPATIBILITY / 25 JUL 74 (PDH) ATTEMPT TO IMPROVE INTERACTION BETWEEN .DAT'S -12 & +6 / 3 APR 74 (JAF) FIX UP FREE-FORMAT OUTPUT / 27 MAR 74 (JAF,JAS) CHARACTER SUBSCRIPTS FIXED UP / 9 MAR 74 (JAF,JAS) CORRECT CARRIAGE CONTROL FOR FREE FORMAT / 2 MAR 74 (PDH) SMALL FIX TO CHARACTER CORE-TO-CORE I/O / 27 FEB 74 (JAF) MAKE CORE-TO-CORE I/O COMPATIBLE WITH WATFIV / 21 NOV 73 (JAF) TRANSFER SMALLER DIMENSION IN '.PULL.' / 20 SEP 73 (PDH) CORRECTLY CLOSE DEVICES ON '^P' / 19 SEP 73 (JAF) REMOVE PDP-15 MODE BITS IN 'MODERC' / 14 SEP 73 (JAF,PDH) MAKE SUBSCRIPTING PDP-15 COMPATIBLE / 12 SEP 73 (PDH) REMOVE .SNAFU / 4 JUL 73 (PDH) MOVE '.WAIT' IN TRACE / 29 JUN 73 (PDH) INSERT MANY '.TITLE' & STATEMENT NUMBER TRACE FEATURE / 23 MAY 73 (PDH) MAKE FORMAT STATEMENT PICK UP CORRECT DIMENSION / 25 APR 73 (PDH) FIX UP FREE FORMAT CHARACTER INPUT / 23 APR 73 (PDH) INSERT ' .GLOBL AAAAA.' / 13 APR 73 (PDH) CHANGE ERROR HANDLING ROUTINE / / MACROS FOR CONDITIONAL PDP-15 ASSEMBLY / .DEFIN .LACI,A .IFDEF PDP15 LAC* A .ENDC .ENDM / / .DEFIN .AND,A .IFDEF PDP15 AND A .ENDC .ENDM / ERDV=-12 / ERROR MESSAGE DEVICE TRDV=ERDV / $TRACEON DEVICE TTO=-3 TTI=-2 IDX=ISZ / INCREMENT POINTER. SKIP NEVER EXPECTED SET=ISZ / SET A FLAG TO NON-ZERO VALUE / / .IODEV TRDV,ERDV,TTO,TTI / .TITLE GLOBAL DEFINITIONS / / EXTERNAL GLOBALS / THE ARITHMETIC ACCUMULATORS .GLOBL .MODEA,.SIGNA,.EXPA,.MOSTA,.LESTA,.A3,.A4 .GLOBL .SIGNB,.EXPB,.MOSTB,.LESTB,.B3,.B4 .GLOBL .INT1,.INT2,.LOGAC / SUBROUTINES .GLOBL .SPADD,.SPRLD,.DPADD,.DPRML,.DPRDV,.DBNRM .GLOBL .LDPT5,.ZRVAL,.CHRGT,.PSHBA,.CMPIT .GLOBL .STORE,.SWPIT,.SWPUS,.FIX .GLOBL .IABS,.IFIX,.FLOAT,.ALG10 / REFERENCED LOCATIONS .GLOBL L.BOX,.BOX,.LOADS,.TABLE / ENTRY POINTS .GLOBL .NEXT,.NEXT1,.NEXT2,.NEXT3,.STORP,.STORN / / / INTERNAL GLOBALS / SUBROUTINES .GLOBL AAAAA. /FUDGE FOR LOADER .GLOBL .INTRP,.ARG,.PULL.,.FETCH,.GRAB,.ERROR,OPEN,CLOSE .GLOBL ERRORP,.NERR,FET.X,.RTRN2,.RTRN4 / REFERENCED LOCATIONS .GLOBL .CS1,.CS13,.POINT,.OPST .GLOBL .ELIST,.NLIST / / EQUIVALENCES FOR ARITHMETIC ACCUMULATORS MODEA=.MODEA;SIGNA=.SIGNA;EXPA=.EXPA;MOSTA=.MOSTA;LEASTA=.LESTA A3=.A3;A4=.A4 SIGNB=.SIGNB;EXPB=.EXPB;MOSTB=.MOSTB;LEASTB=.LESTB;B3=.B3;B4=.B4 INT1=.INT1;INT2=.INT2;LOGACC=.LOGAC / .TITLE .PULL. / / / THIS SUBROUTINE TRANSFERS OTABLE DATA DESCRIPTORS FROM CALLING / TO CALLED SUBPROGRAMS. IT TRANSFERS THE SHORTER OF THE TWO / ARGUMENT LIST AND FORMAL PARAMETER LIST AND IGNORES EXTRA / ENTRIES. IT CHECKS THAT ARGUMENT TYPE AND FORMAL PARAMETER TYPE / ARE A VALID COMBINATION. / .PULL. XX DAC* (AUTO3 / POINTER TO ARGUMENT LIST LAC MODEA / INITIALIZE STORAGE FOR VARIABLE DIMENSION DATA DAC* (AUTO4 DAC* (AUTO5 LOOPS LAC* .PULL. / GET FORMAL PARAMETER POINTER IDX .PULL. / STEP TO NEXT ONE DAC BIN SPA!CMA JMP WHAT / NOT A SIMPLE ARGUMENT LAC* AUTO3 / GET ARGUMENT POINTER DAC BIN2 SPA JMP ENDQ / NOT SIMPLE VARIABLE OR CONSTANT TIES LAC* BIN2 / TRANSFER OTABLE DESCRIPTOR TIES1 DAC* BIN / TO CALLED PROGRAM JMP LOOPS / WHAT SNA!CMA!CLL / CHECK FOR END-OF-LIST JMP FINIT / ALL FORMAL PARAMETERS DONE AND (700000 / KEEP ONLY TYPE BITS TAD* AUTO3 / GET ARGUMENT POINTER DAC BIN2 SMA!RTL / TYPE BITS HAVE VALID SUMS 1 & 6 JMP MAYBE1 / IT IS NOT 6. CML SZA!SPA!RTR JMP ENDQ / MAY BE END-OF-ARGUMENT SNL / WAS IT 06 OR 16 JMP ERR26 / ERROR. CONSTANT ARGUMENT-RETURNED VARIABLE / / PROCESS DIMENSIONED VARIABLE (IT WAS 16) / LAC* BIN2 / TRANSFER BASE ADDRESS DAC* BIN / IDX BIN2 / GET POINTER TO DIMENSION LAC* BIN2 / TABLE IN CALLING PROGRAM TAD (2 / STEP TO TOTAL SIZE ENTRY DAC BIN2 / IDX BIN / GET POINTER TO DIMENSION TABLE IN CALLED PROGRAM LAC* BIN SPA DAC* AUTO4 / SAVE FOR LATER IF VARIABLE DIMENSION DAC BOXX / ALSO SAVE IF ISN'T TAD (2 / STEP TO TOTAL SIZE ENTITY DAC BIN / SPA / SKIP IF FIXED DIMENSION JMP TIES / GO TRANSFER SIZE LAC* BOXX / TRANSFER SMALLER OF DIMENSION SIZE CMA / AND CALLING SIZE ADD* BIN2 SPA JMP TIES LAC* BOXX JMP TIES1 / / MAYBE1 CMA / VALID L, AC0 =01 BEFORE CMA SNL!SMA JMP TIES / / CHECK FOR END OF ARGUMENT LIST MARKER / ENDQ LAC (77777 AND BIN2 SZA!CLA!CMA / 777777 TO AC JMP ERR27 / INVALID TYPE COMBINATION / / MUST SKIP OVER UNUSED FORMAL PARAMETERS / SKIPS SAD* .PULL. / WHEN FIND 777777 MARKING JMP FINIT / END OF LIST, IT CAN IDX .PULL. / BE EXECUTED (LAW), THUS JMP SKIPS / AVOIDING A JMP AND ISZ. / / PROCESS ANY VARIABLE DIMENSIONS / FINIT DZM* AUTO4 / MARK END OF LIST FINIT2 LAC* AUTO5 / GET ITEM FROM LIST SNA JMP* .PULL. / ALL DONE DAC BIN / POINT TO (# OF SUBSCRIPTS + 1) TAD* BIN DAC BIN2 / POINTER TO BOTTOM OF FIXED DIM. TABLE DAC* (AUTO3 / POINTER TO VARIABLE LIMITS LAW -2 TAD* BIN CMA DAC BOX / -# OF SUBSCRIPTS LAC (1 DAC SIZER IDX BIN DZM* BIN / ZERO THE OFFSET JMP SLOP / SLOP2 DAC SIZER DAC* BIN2 / ENTER IN DIM. TABLE LAW -1 TAD BIN2 / ADJUST DIMENSION DAC BIN2 / TABLE POINTER / SLOP JMS GETLK / GET LOWER LIMIT CMA!CLL DAC APOINT JMS SIZMUL / MULTIPLY BY SIZE TO DATE ADD* BIN DAC* BIN / ADJUST OFFSET / JMS GETLK / GET UPPER LIMIT. 1'S COMP. ADD APOINT / SUBSTRACT LOWER LIMIT ADD (1 / AND GET ROW LENGTH SPA!SNA!CLL JMP ERR61 / ERROR. NEG. OR ZERO ROW LENGTH JMS SIZMUL / CALC. NEW SIZE TO DATE ISZ BOX / CHECK NUMBER OF SUBSCRIPTS DONE JMP SLOP2 / / CHECK THAT SPECIFIED SIZE NOT LARGER THAN CALLING / PROGRAM ARRAY & USE SMALLER OF TWO CMA TAD* BIN2 SPA JMP FINIT3 / USE CALLING PROGRAM SIZE LACQ DAC* BIN2 / USE CALCULATED ARRAY SIZE FINIT3 LAC* BIN / CONVERT TO 2'S COMPLIMENT SPA TAD (1 DAC* BIN JMP FINIT2 / / THIS SUBROUTINE PICKS UP AN ENTRY FROM THE VARIABLE / DIMENSION TABLE, AND OBTAINS THE CURRENT INTEGER VALUE IN 1'S COMP. / GETLK XX LAC* AUTO3 / GET ENTRY FROM TABLE SMA / IS IT VARIABLE OR CONSTANT JMP GETLK3 / ITS CONSTANT / DAC BOXX / CHASE DOWN ADDRESS OF VARIABLE LAC* BOXX .AND (077777 / FOR PDP-15 ONLY DAC* (AUTO2 .LACI BOXX / AGAIN FOR PDP-15 ONLY RTL SPA LAC* AUTO2 / IGNORE 1ST WOTD OF I*4 LAC* AUTO2 GETLK2 SPA / CONVERT FROM 2'S COMP TO 1'S COMP TAD (1 JMP* GETLK GETLK3 RAL / DELETE LEADING ZERO LRSS 1 JMP GETLK2 / SIZMUL XX MULS SIZER XX LACQ JMP* SIZMUL / / ERR26 LAW 26 / CONSTANT ARGUMENT; RETURNED VARIABLE JMP .NERR ERR27 LAW 27 / INVALID ARGUMENT MATCH JMP .NERR ERR61 LAW 61 / ERROR IN VARIABLE DIMENSIONING JMP .NERR / .TITLE .ARG / / SUBROUTINE TO PROVIDE FORTRAN TO MACRO-9 SUBPROGRAM LINKAGE / WHEN THERE ARE ARGUMENTS. DATA MODES CHECKED ARE 0: CONSTANT; / 3: SINGLE VARIABLE; 4: STATEMENT NUMBER; 5: SUBPROGRAM NAME; / 6: END OF ARGUMENT LIST; 7: DIMENSIONED VARIABLE. / .ARG XX LAC .ARG DAC BIN2 / STORE MACRO LIST ADDRESS CMA TAD* .ARG / # OF ARGUMENTS (12 BITS) AND (07777 CMA TAD (1 DAC MOVCNT / LOOPIT IDX APOINT IDX BIN2 LAC* APOINT DAC BOX / MODE IS IN AC 0-2 AND ADDRESS IN 3-17 SPA!RCL / CHECK FOR MODES 0 - 3 JMP .ARG3 / MODE IS 4,5,6, OR 7 .ARG1 LAC* BOX / GET OTABLE WORD TAD (1 / ADDRESS WAS ONE LOW .ARG2 DAC* BIN2 ISZ MOVCNT / IS IT END OF MACRO LIST JMP LOOPIT JMP* .ARG / YES, EXIT / / AT THIS POINT, THE MODE HAS BEEN SHIFTED SO THAT THE MSB (1) IS / LOST AND THE LSB IS IN AC 0. IF THE END-OF-LIST INDICATOR IS / FOUND, THE LINK WILL BE SET AND THE AC CLEAR. FOR MODES 4 & 5 / THE LINK WILL BE CLEAR. FOR MODE 7 (DIMENSIONED VARIABLE), / THE LINK WILL BE SET AND THE AC NON-ZERO. / .ARG3 RCL / FINISH REQUIRED SHIFT SNL JMP .ARG4 / MODE 4 OR 5 SZA JMP .ARG1 / DIMENSIONED VARIABLE JMP* .ARG / END OF ARGUMENT LIST / .ARG4 LAC* BOX / STATEMENT NUMBER OR SUBPROGRAM NAME. JMP .ARG2 / ADDRESS ADJUSTMENT NOT NEEDED. / .TITLE .GRAB, .FETCH / / THIS SUBROUTINE DOES A FETCH OF ONE ARGUMENT INTO ACCUMULATOR A / AND MAKES SURE THERE IS ONLY ONE ARGUMENT .GRAB XX JMS .FETCH JMS* .PSHBA IDX APOINT LAC* APOINT SAD (600000 JMP JSTONE ERR27B LAW 27 / ERROR - MORE THAN ONE ARGUMENT JMS .ERROR JSTONE LAC* MODEA JMP* .GRAB / / / THIS SUBROUTINE LOADS A SUBPROGRAM ARGUMENT INTO ACCUMULATOR B / IF THE END OF THE ARGUMENT STRING IS REACHED, IT SETS THE LINK. / .FETCH XX LAC (QLOAD*10000 / (270000 LMQ IDX APOINT LAC* APOINT / GET ADDRESS OF OTABLE ENTRY SAD (600000 JMP ENDLST SMA!CLL JMP* .NEXT1 / RETURNS TO FET.X WITH ACC B LOADED AND MODE / BITS RIGHT JUSTIFIED IN AC ERR30 LAW 30 / ARGUMENT MUST BE CONSTANT, SIMPLE VARIABLE, / OR ARRAY ELEMENT JMS .ERROR / ENDLST STL FET.X JMP* .FETCH / / .TITLE .INTRP / / / ENTER HERE TO ENTER INTERPRETER MODE / .INTRP XX AAAAA.=.INTRP LAC TABLE / GET ADDRESS OF OLD OTABLE LMQ LAC* .INTRP DAC TABLE / NEW TABLE ADDRESS DAC* .TABLE / STORE IN .ARITH SECTION DAC* (AUTO2 TAD (2 DAC TABLE3 / POINTS AT 3RD ENTRY FOR STATEMENT NUMBER CODES LACQ DAC* TABLE / SAVE OLD TABLE ADDRESS IN NEW TABLE+0 LAC* (AUTO1 DAC* AUTO2 / SAVE OLD INSTRUCTION ADDRESS IN TABLE+1 IDX .INTRP LAC* .INTRP DAC* (AUTO1 / NEW INSTRUCTION ADDRESS / / THE FOLLOWING SETUP IS DONE ONLY ONCE. ITS ENTRANCE IS DESTROYED / LAC PA3 DAC .-1 .INIT ERDV,1,ERR36 / INITIALIZE FOR ERRORS AND TRACEON LAC X65 CMA DAC X65 / NEGATIVE RELATIVE ADDRESS FOR 'ERRORP' PAUSES .INIT TTO,1,ERR36 / 'STOPX' IS BRANCHED TO ON AN ERROR PA3 JMP* .NEXT / START CRUNCHING / / TABLE ADDRESS - MUST BE INSERTED AT EXECUTION TIME TABLE 0 TABLE3 0 / .EJECT / / STORAGE LOCATIONS / INTMA;INTMB;INTM3;INTM4 BIN;BIN2;BOX;CNTRL;MOVCNT SIZE;APOINT .POINT=APOINT / / .TITLE NON ARITHMETIC OPERATION TABLE / .OPST=.-40 JMP* .STORP / STORE OPCODE 40 JMP* .STORN / STORE NEGATIVE OPCODE 41 JMP MOVE1 / MOVE OUT OPCODE 42 JMP CALL / CALL OPCODE 43 JMP ERR25 / (UNUSED) OPCODE 44 JMP SUBSRP / SUBSCRIPT OPCODE 45 JMP DO / DO OPCODE 46 JMP UNDO / END OF DO OPCODE 47 JMP GOTO / GO TO OPCODE 50 JMP GOTOB / GO TO ( ),I OPCODE 51 JMP IFA / ARITHMETIC 'IF' OPCODE 52 JMP IFL / LOGICAL 'IF' OPCODE 53 JMP IFLN / NEGATIVE LOGICAL 'IF' OPCODE 54 JMP .READ. / READ ENTRY OPCODE 55 JMP .WRIT. / WRITE ENTRY OPCODE 56 JMP .GROUP / READ,WRITE AN ARRAY OPCODE 57 JMP .SINGL / SINGLE VARIABLE OPCODE 60 JMP .FINIS / END OF LIST OPCODE 61 JMP STCODE / STATEMENT NUMBER CODE OPCODE 62 JMP TRACON / $TRACEON OPCODE 63 JMP TRACOFF / $TRACEOFF OPCODE 64 JMP ERR25 / OPCODE 65 JMP ERR25 / OPCODE 66 JMP ERR25 / OPCODE 67 JMP ERR25 / OPCODE 70 JMP ERR25 / OPCODE 71 JMP ERR25 / OPCODE 72 JMP ERR25 / OPCODE 73 JMP* AUTO1 / ENTER MACHINE CODE OPCODE 74 JMP PAUSE / PAUSE OPCODE 75 JMP RTRN0 / RETURN OPCODE 76 JMP STOP / STOP (LEAVE) OPCODE 77 / ERR25 LAW 25 / ILLEGAL OP CODE JMP .NERR / .TITLE MOVE / / THE FOLLOWING IS THE "MOVE1" OPCODE. IT IS USED / IN THE CASE OF SIMPLE ASSIGNMENTS WHERE BOTH SIDES / OF THE EQUAL SIGN ARE OF THE SAME MODE. / CHARACTER VARIABLES ARE ALWAYS LOAD,STORE; NEVER MOVE / / MOVE1 LAC* AUTO1 /GET DESTINATION CODE TAD TABLE DAC BOX /OTABLE ENTRY ADDRESS RAL /MOVE=00 CLA!RAL /MOVEN=40 DAC BOXX /=1 FOR MOVEN LAC* BOX .AND (077777 / CLEAR OFF BITS FOR PDP-15 DAC* (AUTO3 /DESTINATION ADDRESS .LACI BOX / REGAIN FULL WORD / / DO MODE SPLIT UP / SMA!RAL JMP MOVE4 /REAL,INTEGER SPA!RTL JMP MOVE8 /LOGICAL SNL JMP MOVE2 /C*8 / / ENTER HERE FOR C*16 (L=1) / LAC* AUTO2 XOR BOXX /CHANGE SIGN IF MOVEN DAC* AUTO3 LAC* AUTO2 DAC* AUTO3 LAC* AUTO2 DAC* AUTO3 LAC* AUTO2 DAC* AUTO3 / MOVE2A SNL /SKIP IF C*16 OR R*8 JMP MOVE3 /MUST BE R*4 / / ENTER HERE FOR C*8,(L=0),R*8(L=1) / MOVE2 LAC* AUTO2 XOR BOXX /CHANGE SIGN IF MOVEN DAC* AUTO3 LAC* AUTO2 DAC* AUTO3 / / ENTER HERE FOR R*4 (L=0) / MOVE3 LAC* AUTO2 SNL XOR BOXX /CHANGE SIGN IF MOVEN AND R*4 OR C*8 DAC* AUTO3 MOVE7 LAC* AUTO2 DAC* AUTO3 JMP* .NEXT / / ENTER HERE TO SPLIT INTEGER FROM REAL / MOVE4 SPA!RTL JMP MOVE2A /R*8(L=1) OR R*4(L=0) / / LAC BOXX SNL JMP MOVE6 /SINGLE INTEGER SNA JMP MOVE3 /I*4 AND MOVE / / HAVE MOVEN OF I*4 - MESSY,ISN'T IT / LAC* AUTO2 CMA DAC BOX /COMPLEMENT OF FIRST WORD CLL!CLA!CMA /SET L=0,AC=-1 TAD* AUTO2 LMQ!CMQ /COMPLEMENT OF SECOND WORD CLA!RAL /AC=1 IF CARRY TAD BOX DAC* AUTO3 LACQ DAC* AUTO3 JMP* .NEXT / MOVE6 SNA!CLA!CMA /-1 TO AC JMP MOVE7 /I*2 AND MOVE MOVE10 TAD* AUTO2 CMA /FORM COMPLEMENT DAC* AUTO3 JMP* .NEXT / / MOVE AND MOVEN LOGICAL / MOVE8 LAC BOXX SZA!CLA JMP MOVE10 /LOGICAL AND MOVEN JMP MOVE7 / .TITLE CALL SUBROUTINE OR FUNCTION / / THE ROUTINES TO HANDLE SUBROUTINE AND FUNCTION CALLS / / / / / NORMAL CALL TO FUNCTION OR SUBROUTINE CALL XCT* L.BOX DAC BOX / SUBROUTINE ADDRESS LAC* AUTO1 / ARGUMENT STRING ADDRESS TAD TABLE DAC BIN LAC* BIN / ABSOLUTE ADDRESS OF ARG. STRING DAC APOINT /ARGUMENT STRING POINTER FOR .ARG AND .FETCH JMS* BOX / EXIT TO SUBROUTINE VIA 'BOX' JMP* .NEXT / MACRO SUBROUTINES RETURN HERE. / FORTRAN SUBROUTINES RETURN VIA / '.RTRN4', '.RTRN2', 'RTRN0' / .TITLE SUBSCRIPT EVALUATION ROUTINE / SUBSRP=. .IFDEF PDP15 XCT* L.BOX /MODE BITS MUST BE OBTAINED AT THIS DAC WRITES /POINT FOR PDP-15, & SAVED TEMPORARILY .ENDC IDX* .BOX / STEP TO DIMENSION XCT* L.BOX .AND (077777 DAC* (AUTO3 / POINT TO DIMENSION TABLE LAC* AUTO3 DAC BOXX / BASE ADDRESS OFFSET / LAC* AUTO3 DAC SIZE / ARRAY SIZE / LOOP LAC* AUTO1 / SUBSCRIPT POINTER SPA JMP NOTROW / SUBSCRIPT ACC. OR MISSING SUBSCRIPT TAD TABLE DAC BIN / POINTER TO SUBSCRIPT ADDRESS RTL / SET L=1 FOR ROW INDEX / LAC* BIN .AND (077777 DAC* (AUTO4 / ADDRESS OF SUBSCRIPT .LACI BIN SPA!RTL JMP TEMPIS / COMPLEX,D. COMPLEX,LOGIC,CHAR TEMP. ACC SZL!SPA!RTR JMP DOUBIS / 2 WORD INTEGER,(REAL, DOUBLE) / / SINGLE INTEGER SUBSCRIPT / TIE4 LAC* AUTO4 / SUBSCRIPT SZL JMP ROWDEX / IT WAS THE ROW INDEX GSM / 1'S COMP IF NEG SZL TAD (1 / FORM 2'S COMPLEMENT DAC MULTPY / LAC* AUTO3 / ROW MULIPLIER MULS MULTPY XX GS!LACQ SZL!CLL / TEST IF NEGATIVE TAD (1 / MAKE INTO 2'S COMP TAD BOXX DAC BOXX JMP LOOP / NOTROW RAL / TEST IF SUB. ACC OR SPA!CLL!RAR / MISSING SUBSCRIPT JMP SUBACR / ITS SUBSCRIPT ACC. .AND (077777 / TO KEEP PDP-15 HAPPY TAD* (AUTO3 / ADJUST POINTER FOR MISSING SUBSCRIPT DAC* (AUTO3 JMP LOOP / ROWDEX TAD BOXX DAC BOXX LAC* AUTO1 SUBACR TAD TABLE DAC BIN / GIVES POINTER TO SUBSCRIPT ADDRESS / RTL / TEST IF CONSTANT SUBSCRIPT ADJUSTMENT FOLLOWS SPA!CLA / (IE. WAS FORM '70 SUB.ACC.' ) TAD* AUTO1 / ADD CONSTANT SUBSCRIPT ADJUSTMENT TAD BOXX DAC BOXX / JOINS SPA!CMA!CLL JMP ERR13 / NEG. SUBSCRIPT ILLEGAL(IE. REL. ARRAY ADDRESS) TAD SIZE SPA!CLA JMP ERR13 / SUBSCRIPT > ARRAY SIZE, ERROR. / .IFDEF PDP15 LAC WRITES AND (700000 /RECOVER MODE BITS FOR PDP-15 .ENDC /TOTAL OF 10 USEC PENALTY FOR PDP-15 OVER PDP-9 TAD* (AUTO2 / BASE ADDRESS SPA!RTL JMP A1 / COMPLEX,LOGICAL,CHARACTER SPA!RAR JMP A33 / I*4,R*8 SMA!RTR JMP A2 / I*2 A0 TAD BOXX A7 RAL A6 DAC* BIN JMP* .NEXT / A1 SPA!RAR JMP A5 /C*16, CHARACTER SMA!RTR JMP A44 / C*8 / A2 RAL TAD BOXX JMP A6 / A33 SPA!RTR / SKIP IF I*4 A44 TAD BOXX / R*8,C*8 JMP A0 / A5 SPA!RTR JMP CHKCHR / CHARACTER RTR TAD BOXX RTL JMP A7 / / POSSIBLE DOUBLE INTEGER SUBSCRIPT. IGNORE MOST SIG WORD DOUBIS RTL SNL!RTR JMP TIE2 / DOUBLE INTEGER ERR12 LAW 12 / ILLEGAL SUBSCRIPT MODE JMP .NERR / / COMPLEX, DOUBLE COMPLEX, LOGICAL, CHARACTER OR TEMPORARY ACC. / ONLY DOUBLE INTEGER TEMPORARY ACCUMULATOR IS LEGAL / TEMPIS CMA!CLL SZL!SPA!RTL JMP ERR12 / LOGICAL, COMPLEX LAC* AUTO4 / IT IS TEMP. ACC, GET CONTROL BITS SZA!CML / RECOVER ROW INDEX CONTROL BIT JMP ERR12 / REAL, COMPLEX, CHAR TIE2 LAC* AUTO4 / BY-PASS FIRST WORD OF 2 WORD INTEGER JMP TIE4 / DOUBLE INTEGER / ERR13 LAW 13 /SUBSCRIPT OUT OF RANGE JMP .NERR / / CHKCHR LAC* BIN /GET ADDRESS OF 2 WORD SUBSCRIPTING DOPE VECTOR .AND (077777 / MORE FOR THE PDP-15 DAC* (AUTO3 LAC* AUTO2 /GET CHAR SIZE FROM ARRAY DOPE VECTOR DAC* AUTO3 /INSERT IN NEW DOPE VECTOR AND (077777 / GET CHARACTER/ELEMENT DAC* SIGNA JMS ELMLGH / GET WORDS/ELEMENT MUL / CACULATE TOTAL DISPLACEMENT IN WORDS BOXX XX LACQ TAD* AUTO2 / ADD BASE ADDRESS OF ARRAY AND (077777 /REMOVE CHARACTER ARRAY MARKER (4) DAC* AUTO3 /STORE IN SUBSCRIPTING DOPE VECTOR JMP* .NEXT / .TITLE 'DO' / INITIATE DO LOOP COUNTER OPCODE / DO LAC* AUTO1 / SET UP POINTER TAD TABLE / TO DO CONTROL FIELD DAC BIN SPA / CHECK WHETHER REVERSE SIGN IS REQUIRED JMS* .CMPIT / COMPLIMENT THE NUMBER JMS* .STORE /STORE INITIAL VALUE LAC* MODEA SZA JMP ERR14 /NON-INTEGER INDEX LAC* BIN .AND (077777 DAC* (AUTO3 XCT* L.BOX / MAKE MODE BITS 0 OR 7 TAD (700001 /AND POINT AT ACTUAL LOCATION OF I DAC APOINT DAC* AUTO3 JMS YANKIT /PUT L IN CONTROL FIELD SAD* INT2 SZA SKP JMP ERR15 / INCREMENT IS L=0, ILLEGAL JMS YANKIT /PUT K IN CONTROL FIELD LAC* (AUTO1 /SET UP RETURN ADDRESS DAC* AUTO3 JMP* .NEXT / YANKIT XX LAC (YANKED /SET RETURN ADDRESS DAC .FETCH LAC (QLOAD*10000 LMQ LAC (10 / OFFSET TO LOAD NEGATIVE FROM LOAD DAC BIN LAC* AUTO1 SMA!CLL DZM BIN JMP* .NEXT3 YANKED TAD BIN JMS* .PSHBA JMS* .IFIX LAC APOINT /GET MODE OF INDEX OF DO SMA JMP YANKTO /DOUBLE INTEGER LAC* INT2 / SINGLE INTEGER DAC* AUTO3 SPA!CLA CMA SAD* INT1 JMP* YANKIT / ERR14 LAW 14 / NON-INTEGER INDEX IN 'DO' JMP .NERR ERR15 LAW 15 /ZERO INCREMENT JMP .NERR / YANKTO LAC* INT2 /STORE TWO WORD QUANTITY BACKWARDS DAC* AUTO3 LAC* INT1 DAC* AUTO3 JMP* YANKIT / / / END OF DO LOOP OPCODE / FOR SIMPLE INTEGER I THE TERMINATION OF DO 1 I=J,K,L COMPILES AS / UNDO @1 / WHERE @1 CONTAINS THE FOLLOWING 4 WORDS / 1) ADDRESS OF I / 2) VALUE OF L / 3) VALUE OF -K / 4) RETURN ADDRESS / THIS INFORMATION IS SET UP BY THE DO OPCODE / UNDO LAC* AUTO2 DAC BOX /INDEX ADDRESS SMA!CLL JMP UNDO2 /DOUBLE INTEGER LAC* AUTO2 /GET INCREMENT DAC BIN TAD* BOX /UPDATE INDEX DAC* BOX TAD* AUTO2 /ADD -LIMIT SNA JMP UNDO4 UNDO3 XOR BIN SMA JMP* .NEXT /DO FINISHED UNDO4 LAC* AUTO2 CONT1 DAC* (AUTO1 JMP* .NEXT /REPEAT LOOP / UNDO2 DAC BOXX /ADDRESS OF SECOND WORD IDX BOXX /OF DOUBLE INTEGER LAC* AUTO2 /INCREMENT SECOND WORD TAD* BOXX DAC* BOXX LAC* AUTO2 DAC BIN SZL TAD (1 TAD* BOX DAC* BOX CLL LAC* BOXX TAD* AUTO2 DAC BOXX CLA!RAL TAD* BOX TAD* AUTO2 SZA JMP UNDO3 LAC BOXX SZA!CLL!RAR / MAKE SURE 1ST BIT NOT MISTAKEN FOR MINUS SIGN JMP UNDO3 JMP UNDO4 / .TITLE COMPUTED GOTO / / / COMPUTED GO TO ROUTINE / GOTOB LAC* MODEA SZA JMS* .FIX LAC* AUTO2 /GET NUMBER OF ADDRESSES DAC BIN LAC* INT1 SZA!CMA!CLL JMP GFALL /NEGATIVE OR >2**18-1 XOR BIN /-M+1 TAD* INT2 SZL!SNA JMP GFALL LAC* INT2 SNA JMP GFALL /ZERO ARGUMENT TAD* (AUTO1 DAC BIN LAC* BIN JMP GOTIE / / THE COMPUTED GO TO INDEX IS NOT VALID, FALL THROUGH / GFALL LAC BIN TAD* (AUTO1 JMP CONT1 / .TITLE 'IF' STATEMENT ROUTINES / / / / ARITHMETIC 'IF' IFA LAC* MODEA / GET MODE SNA JMP IF2 / INTEGER, SINGLE OR DOUBLE / / ITS REAL LAC* MOSTA / MOSTA= 000000 FOR ZERO SNA JMP GOTO LAC* SIGNA / SIGNA= 1 FOR NEGATIVE, = 0 FOR POSITIVE SZA / IFNEG LAC* AUTO1 / NEGATIVE IFPOS LAC* AUTO1 / POSITIVE GOTIE TAD TABLE DAC BOX LAC* BOX JMP CONT1 / / ITS INTEGER IF2 LAC* INT1 / GET MOST SIG. WORD SPA JMP IFNEG / ITS NEGATIVE SZA JMP IFPOS / NUMBER IS POSITIVE LAC* INT2 / GET LEAST SIG. WORD (MOST SIG. WORD=0) SZA JMP IFPOS / ENTRY POINT FOR 'GOTO' OPERATION GOTO XCT* L.BOX JMP CONT1 / / LOGICAL 'IF' IFL ISZ* LOGACC JMP GOTO / FALSE JMP* .NEXT / TRUE / IFLN ISZ* LOGACC JMP* .NEXT JMP GOTO / .TITLE STATEMENT NUMBERS & TRACE FEATURE / / THIS SECTION PROCESSES THE STATEMENT NUMBER CODES WHEN THEY ARE / GENERATED STCODE LACQ / GET ADDRESS FROM THIS INSTRUCTION DAC* TABLE3 / STORE IN 3RD ENTRY OF TABLE ENABLE JMP* .NEXT /CHANGED TO 'NOP' TO ENABLE TRACE LAC TABLE TAD (2 /PREPARE TO GET PROGRAM NAME DAC* (AUTO4 .WAIT TRDV /WAIT FOR POSSIBLE PREVIOUS I/O LAC* AUTO4 DAC TNAME /GET NAME LAC* AUTO4 DAC TNAME+1 LAC* AUTO4 DAC TNAME+2 LAC (TNUM JMS SETPUT /POINT 'PUT' AT TRACE NUMBER BUFFER CLLS 14 /GET STATEMENT NUMBER FROM MQ JMS G.CVRT /CONVERT TO DECIMAL & PACK AS ASCII LAC (CARAGE JMS PUT /APPEND CARRIAGE RETURN .WRITE TRDV,2,TRNUMB,0 /WRITE OUT LINE NUMBER STCEND JMP* .NEXT / RETURN / TRNUMB 4002; 0 TNAME 0; 0 .ASCII <0><0><0>' ' TNUM 0; 0 / TRACON LAC (NOP /ENABLE TRACE SKP TRACOFF LAC STCEND /DISABLE TRACE DAC ENABLE JMP* .NEXT / .TITLE 'RETURN' / / RETURN CODES / 'RETURN N' (VARIABLE) ENTRIES / .RTRN4 LAC* AUTO2 / FIRST WORD MUST BE ZERO SZA JMP ERR16 .RTRN2 LAC* AUTO2 SPA!SNA JMP ERR16 / MUST BE GREATER THAN ZERO TAD TABLE / CALCULATE ADDRESS OF TAD (5 DAC* .BOX / OTABLE ENTRY FOR RETURN / / CHECKS THAT N NOT TOO BIG CMA TAD TABLE / AC_ -N-6 TAD* AUTO1 / -N-6+(MAX N+6) SPA JMP ERR16 / / 'RETURN I' (CONSTANT) ENTRIES HERE RTRN0 LAC* TABLE / GET PREVIOUS OTABLE ADDRESS DAC* .TABLE / RESET OTABLE ADDRESS IN .ARITH DAC TABLE / RESET OTABLE ADDRESS TAD (2 DAC TABLE3 / POINT TO STATEMENT COUNT XCT* L.BOX DAC* (AUTO1 SZA / IF ADDRESS NOT SET UP ITS ZERO JMP* .NEXT ERR64 LAW 64 / VARIABLE RETURN ADDRESS NOT SET UP JMP .NERR / ERR16 LAW 16 /'N' OUT OF RANGE JMP .NERR / .TITLE PAUSE, STOP / / THE FOLLOWING CODE HANDLES THE PAUSE AND STOP STATEMENTS OF / FORTRAN WHICH ARE THE 'PAUSE' AND 'LEAVE' OPCODES PAUS .ASCII ' PAUSE '<175> .LOC .-1 STP .ASCII ' STOP '<175> .LOC .-1 DEAD .ASCII '*****' / / BUFFER FOR STOP AND PAUSE MESSAGE BUFFS .ASCII ' ' BUFFS1 BUFFS2 .ASCII <215> / / PAUSE PAUSE LAC (PAUS JMS WRITES JMP . / / CHECK FOR ANY DAT SLOTS OPEN FOR OUTPUT AND CLOSE THEM / ERR36 LAW 36 / CONTROL COMES HERE ON '^P' .NERR JMS .ERROR /ENTRY FOR FATAL ERRORS STOPX LAC (DEAD-1 DAC* (AUTO2 STOP DZM DEVICE NEXTD IDX DEVICE / STEP TO NEXT DEVICE CLL JMS PTSLOT / SET POINTERS TO DAT SLOT ENTRY LAC* SPOINT / GET STATUS INDICATOR SAD (1 JMS CLOSER / ITS OPEN FOR OUTPUT, CLOSE IT. SAD ENSLOT / ARE WE DONE TABLE JMP DNCLOS JMP NEXTD / DNCLOS LAC (STP JMS WRITES LAW -1 DAC IODONE /IN CASE I/O WAS UNDERWAY LAC (JMP CLSM12 /CLOBBER RETURN TO DAC RTRN0 /TRAP EXIT FROM 'ERRORP' JMS ERRORP /GO PRINT ERROR LOG CLSM12 .CLOSE ERDV /CLOSE .DAT -12 EXIT .EXIT / WRITES XX DAC WRIT+2 .WAIT TTO .INIT TTO,1,PAUSES WRIT .WRITE TTO,2,WRIT,34 LAC* AUTO2 DAC BUFFS1 LAC* AUTO2 DAC BUFFS2 .WRITE TTO,2,BUFFS,34 .WAIT TTO JMP* WRITES .TITLE WATRAN INTERPRETER I/O PACKAGE / / THIS SUBROUTINE SETS UP THE INTERNAL DAT. SLOT TABLE WITH / THE FILE NAME FOR LATER USE / CALLING SEQUENCE CALL OPEN(N,'FILNAMSRC') OPEN XX JMS CLOSE / CLOSE IF IT WAS OPEN IDX APOINT / STEP TO NEXT ARGUMENT LAC* APOINT / PICK POINTER UP FROM APOINT SAD (600000 JMP ERR34 / ERROR, END OF LIST DAC* .BOX / SET UP FOR GETSIZ ALSO XCT* L.BOX JMS SETFOR / SET UP SORTER JMS GETNAM / GET AND STORE FILE NAME IN TABLE JMP* OPEN / ERR34 LAW 34 / MISSING ARGUMENT IN 'CALL OPEN' JMP .NERR / / THIS SUBROUTINE CAUSES THE FILE TO BE CLOSED AND CLEARS THE INTERNAL / DAT SLOT TABLE CLOSE XX JMS .FETCH / GET DEVICE NUMBER XCT* L.BOX / GET MODE BITS JMS CHECKN / CHECK UNIT NUMBER,SETS UP 'DEVICE' & 'SPOINT' JMS CLOSER / CLOSE THE FILE LAW -1 DAC* FLPT1 / INITIALIZE THE FILE NAME TO AN IMPROBABLE NAME DAC* FLPT2 DAC* FLPT3 LAC (777 DAC* SPOINT / INDICATE DEVICE NOT IN USE JMP* CLOSE / / THIS SUBROUTINE CLOSES THE FILE CLOSER XX LAC* SPOINT SAD (777 JMP* CLOSER / DAT SLOT NOT IN USE. LAC DEVICE SAD (11 JMP* CLOSER / CLOSE NOT NEEDED FOR CHAR UNIT SAD WAITR+1 / IF DEVICE WAS LAST ONE IN USE, REMOVE WAIT DZM WAITR+1 / SINCE A .WAIT ON A CLOSED .DAT SLOT RESERVES IT. DAC CLOSES CLOSES 0 .DSA 6 JMP* CLOSER / ERR35 LAW 35 / ERROR - ATTEMPT TO PERFORM I/O IN A FUNCTION JMP .NERR / WHICH IS CALLED IN AN OUTPUT STATEMENT / / / / ENTER HERE FOR READ AND WRITE STATEMENTS / .WRIT. STL SKP!CLA!RAL / AC_1 .READ. CLA / AC_0 DAC IO /SET DIRECTION OF I/O SWITCH ISZ IODONE /CHECK THAT I/O IS NOT UNDERWAY - ERROR IF IT IS JMP ERR35 XCT* L.BOX JMS CHECKN / CHECK THE UNIT NUMBER AND SET THE DEVICE NUMBER / L.SPOI LAC* SPOINT SAD IO JMP RW5 /SLOT SET FOR CURRENT DIRECTION / /DATA SLOT NOT SET UP. MAY HAVE TO CLOSE OLD USE. MUST OPEN /FOR NEW USE. / JMS CLOSER / CHECK THE FILE / / CONSTRUCT .INIT AND .FSTAT / RW4 LAC IO / UNDER DOS, WE DO NOT WANT THE SZA / LINE PRINTER HANDLER TO INSERT LAC (5000 / ITS OWN FORM FEEDS. THIS ACTION XOR DEVICE / SHOULD NOT AFFECT OTHER DEVICES. DAC INIT /.INIT IS SET UP / LAC DEVICE /BUILD .FSTAT XOR (3000 DAC FSTAT REDO LAC FLPT1 /CLEAR FILE ORIENTATION BIT DAC FSTAT+2 / INIT .INIT 0,0,ERR36 /EXPANDS TO 4 WORDS / / GET THE SIZE OF THE LINE BUFFER / MAX=134(10) , INCLUDES CARRIAGE CONTROL, 132 CHARACTERS, CARRIAGE RETURN LAW -2 /ACCOUNT FOR HEADERS TAD INIT+3 / SET BUFFER TO MIN(133,HANDLER LIMIT) RCR GS!MUL 5 LACQ TAD (-205 SMA CLA TAD (BUFFER+204 CMA DAC* SZPTR /GIVES 2'S COMPLEMENT / FSTAT .FSTAT 0,FSTAT / / CHECK IF DEVICE IS FILE ORIENTED, IF NOT CONTINUE / CHECK IF WE HAVE A FILE NAME / SZA /IS DEVICE FILE ORIENTED JMP BLDSEN /YES,FILE FOUND LAC FSTAT+2 /MAYBE, MAYBE NOT AND (700000 SNA JMP RW10 /NON-FILE ORIENTED / / FILE ORIENTED, FILE NOT FOUND / LAC* FLPT1 SAD (777777 / IS IT STILL INITIALIZED VALUE JMP REQNAM /NO FILE NAME, REQUEST ONE / / HAVE FILE NAME, FILE NOT FOUND / LAC IO SZA JMP BLDSEN /OKAY, ITS A WRITE! / ERR33 LAW 33 /ERROR, ATTEMPT TO READ A NON-EXISTANT FILE JMS .ERROR / / ISSUE ERROR AND RETURN TO FALL THROUGH / ALLOW USER TO RESPECIFY NAME / / REQNAM LAC DEVICE TAD (60 / CONVERT TO ASCII RAL LMQ LAC MESAGE+13 AND (777400 / CLEAR OFF OLD BITS OMQ DAC MESAGE+13 / PRINT OUT THE MESSAGE PRTMES .WAIT TTO .WRITE TTO,2,MESAGE,10 .READ TTI,2,BUFFER,9 .WAIT TTI LAC BUFFER+5 AND (377 / LOOK AT LAST CHAR SAD (32 JMP NMGOOD / OKAY, CARRIAGE RETURN MEANS 9 CHARS SAD (372 JMP NMGOOD / OKAY, ALTMODE JMP PRTMES / TYPED IN NAME CONTAINS 9 CHARACTERS NMGOOD LAC (600011 / MARK AS CHARACTER VARIABLE DAC BUFFER+1 LAC (700000!BUFFER / FUDGE UP AS A FORMAT JMS SETFOR / SET UP SORTER JMS GETNAM / GET AND STORE FILE NAME JMP REDO / GO PROCESS THIS NAME / MESAGE .ASCII ' ENTER FILE NAME, DEVICE '<215> / / WE HAVE A FILE NAME NOW, INITIATE I/O / BLDSEN LAC DEVICE /BUILD SEEK OR ENTER DAC SEKENT LAC IO TAD (3 DAC SEKENT+1 LAC FLPT1 / POINTS TO FILE NAME DAC SEKENT+2 SEKENT 0 / SEEK OR ENTER 0 0 / / NOW READY TO READ OR WRITE RW10 LAC IO DAC* SPOINT /RECORD DIRECTION OF DATA FLOW / / DECIPHER WORDS AFTER WRITE OR READ TO SET UP BINARY, FREE FORMAT, / 'END=', AND REGULAR FORMAT. IF BINARY I/O WAS UNDERWAY WAIT FOR IT. RW5 LAC BINSW SZA JMS OWAITR / DO THE WAIT DZM BUNCH / MARK AS NO ARRAY DZM DATEND / CLEAR END= ADDRESS DZM FREESW / CLEAR FREE FORMAT SWITCH DZM BINSW / CLEAR BINARY SWITCH RW6.1 LAC* AUTO1 / GET 1ST WORD AFTER OPCODE SPA / IS IT BINARY, OR END= JMP MAYBIN / YES. SNA / IS IT FREE FORMAT JMP FFREE / YES. TAD TABLE / ITS REGULAR FORMAT. SET UP TO OTABLE DAC BOX DAC* .BOX /UPDATE POINTER IN .ARITH LAC* BOX / GET OTABLE ENTRY JMS SETFOR / SET UP TO FORMAT,SET CHARCT, WORDCT / / BUILD UP .READ OR .WRITE RW6.2 LAW -70 DAC DOIO.3 / SET UP FOR ASCII LINE SIZE (MAX 134 CHARS) LAC (2000 RW7 XOR DEVICE / INSERT DEVICE NUMBER DAC DOIO. LAC IO TAD (10 DAC DOIO.1 /EITHER READ=10, OR WRITE=11 LAC BINSW SZA!CLL STL LAC (BINBUF SNL LAC (ABUFFR DAC DOIO.2 / LAC IO SZA / IS I/O READ OR WRITE JMP RW9 / ITS WRITE / /PERFORM INITIAL INPUT OPERATION FOR THIS READ OPERATION JMS OWAITR / WAIT FOR LAST WRITE OPERATION JMS INOUT / DO FIRST READ AND WAIT UNTIL COMPLETE LAC BINSW / CHECK IF A BINARY READ SZA JMS GETIT / YES IT IS. DO A SPECIAL SETUP RW7.1 LAC FREESW TAD BINSW SZA JMP* .NEXT / EXIT IF BINARY OR FREE FORMAT / / FPOINT,CHARCT, AND WORDCT ARE NOW ALL SET DZM XNUM /NO DATA AVAILABLE DZM NSAVE /SET UP ROUTINE FOR LAW -1 /HANDLING OPENING DAC LEVCNT /PARENTHESIS LAC (RTABLE-1 DAC BRKLIT / JMS GLETR DZM NCONT2 /MULTI-REPEATS ON FIRST( JMP FSTART / / HAVE EITHER BINARY OR END= MAYBIN SAD (400000 / IS IT BINARY JMP ITSBIN / YES DAC DATEND / NO. ITS 'END='. STORE THE OTABLE ADDRESS JMP RW6.1 / GO PROCESS THE NEXT WORD / HAVE FOUND BINARY ITSBIN SET BINSW DZM PHYCNT / SET RECORD COUNT LAW -377 DAC DOIO.3 / MAX SIZE FOR BINARY RECORD CLA JMP RW7 / GO BUILD UP READ OR WRITE / / FREE FORMAT COMES HERE FFREE DZM LEVCNT / FOOL SUBROUTINE 'CLOSIT' SET FREESW / MARK AS FREE FORMAT JMP RW6.2 / GO BUILD ASCII READ OR WRITE / / WE HAVE A WRITE OPERATION RW9 LAC BINSW SZA JMP BWRIT / ITS A BINARY WRITE LAC (BLANKR JMS BUFSET JMS WONDER /WHAT SORT OF CARRIAGE CONTROL IS WANTED? JMP RW7.1 / WONDER XX LAC FREESW /FREE FORMAT I/O? SNA JMP* WONDER /NO. FOLLOW NORMAL PROCEDURE. LAC DEVICE SAD (11 /CORE-TO-CORE? JMP* WONDER /YES. NO PROCESS IDX LOCATN /INSERT CARRIAGE CONTROL CHARACTER FOR JMP* WONDER /FREE FORMAT / / HAVE A BINARY WRITE. NOW MUST WAIT FOR I/O WHICH WAS NON-BINARY / SINCE BINARY I/O USES THE WHOLE BUFFER BWRIT JMS OWAITR LAC INIT+3 AND (777776 / MAKE EVEN DAC INIT+3 / SAVE IT TAD (-3 / ACCOUNT FOR THE 3 HEADER WORDS CMA / 1'S COMP OF # OF WORDS TO BE FILLED IN BUFFER DAC* SZPTR DAC BCOUNT LAC (BINBUF+3 DAC BPOINT JMP* .NEXT / / / THIS SUBROUTINE GETS THE FILE NAME AND STORES IT IN THE TABLE GETNAM XX JMS SNATCH DAC* FLPT1 JMS SNATCH DAC* FLPT2 JMS SNATCH DAC* FLPT3 JMP* GETNAM / / THIS SUBROUTINE PICKS UP 3 CHARACTERS AT A TIME FROM ANY / CHARACTER CONSTANT OR ARRAY USING GLETR AND RETURNS THEM AS / PACKED 6 BIT NUMBERS SNATCH XX JMS SNAP LLS!10000 14 / CLEAR CLQ ALSO DAC SPOT JMS SNAP LLS!10000 6 / CLEAR MQ ALSO TAD SPOT DAC SPOT JMS SNAP TAD SPOT JMP* SNATCH / / THIS SUBROUTINE REPLACES SPACES WITH NULLS IN THE FILE NAME SNAP XX JMS GLETR AND (000077 SAD (40 CLA JMP* SNAP / / THIS SUBROUTINE CHECKS THE UNIT NUMBER TO SEE IF ITS VALID, / AND SETS UP THE POINTERS TO THE PROPER DAT SLOT PLACE. CHECKN XX AND (700000 / GET MODE BITS SNA!CLL / CLEAR LINK FOR PTSLOT VIA CHUNIT JMP RW2 / SINGLE INTEGER SAD (100000 JMP RW1 / DOUBLE INTEGER SAD (700000 JMP CHUNIT / CHAR VARIABLE UNIT ERR37 LAW 37 / NON-INTEGER UNIT NUMBER JMP .NERR / / IF I/O DEVICE IS DOUBLE INTEGER IS DOUBLE INTEGER, FIRST WORD MUST BE 0 / RW1 LAC* AUTO2 SNA!CMA / AC -1 JMP RW3 ERR40 LAW 40 / UNIT NUMBER OUT OF RANGE JMP .NERR / RW2 LAW -1 RW3 TAD* AUTO2 / GET I/O DEVICE -1 DAC DEVICE AND (777770 / VALID NUMBERS 0 TO 7 SZA!CLL JMP ERR40 IDX DEVICE / NUMBER VALID, PUT BACK IN RANGE OF 1 TO 8 JMS PTSLOT / SET POINTERS TO DAT SLOT TABLE ENTRY JMP* CHECKN / THE UNIT # IS A CHARACTER VARIABLE. SET UP FOR I/O. THE FORM IS: / WORD1: ELEMENT LENGTH IN WORDS / WORD2: BASE ADDRESS OF ARRAY-1 OR ADDRESS OF VARIABLE-1 / WORD4: -(NUMBER OF ELEMENTS IN ARRAY) - 1 / (NOTE: WORD3 NO LONGER EXISTS SINCE CORE-TO-CORE I/O RE-WORKED / CHUNIT LAC (11 DAC DEVICE JMS PTSLOT / ANY CHARACTER UNIT IS DEVICE 11 LAC IO DAC* SPOINT / CHAR UNITS ARE ALWAYS READY TO GO LAW -2 DAC WORD4 /ASSUME 1 ELEMENT LAC* AUTO2 DAC WORD2 AND (077777 /GET RID OF MODE BITS! DAC* SIGNA /NUMBER OF CHARACTERS TAD (BUFFER-1 CMA DAC* SZPTR / 2'S COMP JMS ELMLGH DAC WORD1 LAC WORD2 AND (700000 SAD (600000 JMP NODOPV / VARIABLE HAS A DOPE VECTOR LAC* AUTO2 / GET 2ND WORD OF DOPE VECTOR SMA JMP NOTARY / DOPE VECTOR IS NOT FOR ARRAY / CHAR VARIABLE IS AN ARRAY. AND (077777 DAC WORD2 JMS GETSIZ CMA DAC WORD4 JMP* CHECKN / / CHARACTER VARIABLE IS SINGLE / NODOPV LAC* (AUTO2 / ADDRESS OF VARIABLE DAC WORD2 JMP* CHECKN / / DOPE VECTOR FOR SINGLE VARIABLE / NOTARY DAC WORD2 LAC* (AUTO2 SAD* (AUTO3 /CHECK IF SUBSCRIPT DOPE VECTOR SKP!CLC JMP* CHECKN /NO. SINGLE VARIABLE TAD SIZE CMA TAD BOX DAC WORD4 JMP* CHECKN / / THIS SUBROUTINE SETS UP THE POINTERS TO THE INTERNAL DAT SLOT / TABLE DEPENDING UPON THE DEVICE NUMBER PTSLOT XX LAC DEVICE MUL 5 LACQ TAD (SLOTS-5 DAC SPOINT TAD (1 DAC SZPTR TAD (1 DAC FLPT1 TAD (1 DAC FLPT2 TAD (1 DAC FLPT3 JMP* PTSLOT / / THIS SUBROUTINE SETS UP THE EXTRACTION ROUTINE 'GLETR' TO PICK / UP CHARACTERS FROM ANY VARIABLE OR ARRAY. /FIGURE OUT TYPE OF VARIABLE THAT FORMAT CODE IS STORED IN. /FORMAT STATEMENTS ARE CHARACTER CONSTANTS. / NOTE: WATRAN COMPILER RESTRICTS FORMAT TO BE ORDINARY / FORMAT (CHARACTER CONSTANT), OR AN ARRAY. / SETFOR XX DAC FPOINT / SET FORMAT POINTER AND (700000 SAD (700000 JMP CHRFMT / CHARACTER JMS* .CHRGT /NON-CHARACTER; THUS IS ARRAY CMA TAD (1 / 2'S COMP OF CHARACTERS PER ELEMENT DAC CHARCT JMP FJOIN5 /GO TO GET # OF ELEMENTS / /FORMAT IS CHARACTER CONSTANT OR CHARACTER ARRAY CHRFMT IDX FPOINT / INCREMENT TO CHARACTER COUNT LAC* FPOINT /PICK UP CHARACTER COUNT AND (77777 /CLEAR TOP BITS OFF (6 OR 7) CMA TAD (1 /GET 2'S COMPLEMENT OF COUNT DAC CHARCT LAC* FPOINT /FPOINT=SINGL VAR-600000, ARRAY-700000 RTL /LEAVES L=1 SMA!CLA!RAL /AC_1 JMP FJOIN2 /CHARACTER CONSTANT (FORMAT STATEMENT) / IDX FPOINT / CHARACTER ARRAY, 2ND WORD IS POINTER LAC* FPOINT /GET ACTUAL ADDRESS AND DAC FPOINT /RESET POINTER / FJOIN5 JMS GETSIZ /GET NUMBER (N) OF ELEMENTS IN ARRAY FJOIN2 CMA /-N-1 IN 2'S COMP. DAC WORDCT LAC (G4 DAC GET2 / INITIALIZE GLETR JMP* SETFOR / /THIS SUBROUTINE GETS THE TOTAL # OF ELEMENTS IN AN ARRAY / CAVE CANIS: MUST NOT CHANGE THE LINK / GETSIZ XX IDX* .BOX /STEP TO OTABLE ADDRESS XCT* L.BOX /OF DIMENSION TABLE DAC* (AUTO3 LAC* AUTO3 /STEP PAST OFF-SET LAC* AUTO3 /GET TOTAL ARRAY SIZE JMP* GETSIZ / / THIS SUBROUTINE CALCULATES THE NUMBER OF WORDS/ELEMENT / BASED ON THE NUMBER OF CHARACTERS/ELEMENT ELMLGH XX LAC* SIGNA / NUMBER OF CHARACTERS/ELEMENT TAD (2 CLL!RAL IDIV 5 / # OF WORDS = # OF CHARS *2/5 LACQ DAC ELMSIZ JMP* ELMLGH / / MACRO FOR INTERNAL DAT SLOT ENTRIES .DEFIN DSLOT .DSA 777 0 / CONTAINS BUFFER SIZE, & FILE NAME + EXTENSION 777777 777777 777777 .ENDM / / INTERNAL DAT SLOT TABLE SLOTS DSLOT DSLOT DSLOT DSLOT DSLOT DSLOT DSLOT DSLOT DSLOT / CHARACTER VARIABLE SLOT (INTERNAL ONLY) ENSLOT .DSA 111111 /END OF TABLE INDICATOR / /ENTER AT THIS POINT TO PICK UP A NEW NUMERIC FORMAT CODE. (MAY /NOT GET ONE). / LOOK ISZ NCONT2 /CHECK IF NUMERIC FORMAT IS JMP F6A /BEING REPEATED. EXIT IF YES DZM RNUM JMP NEXTC2 / WE STILL HAVE A CHARACTER IN LETTER TO PROCESS / / SLASHES FORCE I/O AND RE-INITIALIZATION OF INPUT-OUTPUT BUFFER, / THEN SEARCH FOR NEXT SPECIFICATION. / SLA JMS INOUT /DO I/O TAND INITIALIZATION / /SEARCH FORMAT FOR NUMERIC SPECIFICATION, PERFORMING ALL OTHERS /FOUND IN COURSE OF SEARCH. / NEXTC JMS GLETR /ADVANCE TO NEXT LETTER NEXTC2 LAC LETTER SAD (SPACE /MUST WATCH OUT FOR SPACES!! JMP NEXTC SAD (COMA JMP COM /SLUFF OFF COMMA SAD (CLOSPR JMP CLOSIT / FOUND CLOSING PARENTHESIS F3A SAD (SLASH JMP SLA /PROCESS SLASH / / SAD (TEE JMP TTYPE /T-FORMAT SAD (APOSTE JMP LITRAL /'LITERAL' SAD (MINUS JMP NEGP /MUST BE - NNP / /HAVE HANDLED ALL SPECIAL CASES. CAN LOOK FOR REPEAT COUNT. / JMS PIKNUM /GET COUNT IF PRESENT. IF NOT AC_1,L_1 DAC NCOUNT SNA!CMA JMP ZEROP /MUST BY 0P TAD (1 DAC NCONT2 /2'S COMPLEMENT OF COUNT SZL JMP F1 /REPEAT COUNT OF 1 ASSUMED / /START SEARCH OF POSSIBLE CODE TYPES. FIRST THOSE THAT MUST /HAVE A REPEAT COUNT. / LAC LETTER SAD (AITCH JMP HTYPE /H-FORMAT SAD (EX JMP XTYPE /X-FORMAT SAD (PEE JMP OKP /P-FORMAT / /THE FOLLOWING TYPES CAN HAVE IMPLIED REPEAT OF 1 / F1 LAC LETTER SAD (EFF JMP DEF /F-FORMAT SAD (EEE JMP DEF /E-FORMAT SAD (EYE JMP AIGL /I-FORMAT SAD (DEE JMP DEF /D-FORMAT SAD (GEE JMP AIGL /G-FORMAT SAD (AYE JMP AIGL /A-FORMAT SAD (ELL JMP AIGL /L-FORMAT FSTART SAD (OPENPR JMP OPENER /OPENING PARENTHESIS ERR41 LAW 41 /ERROR- INVALID CODE JMP .NERR / /WHEN COMMA IS FOUND TOSS IT AWAY AND TRY FOR USEFUL SPECIFICATION / COM JMS GLETR /ADVANCE TO NEXT LETTER JMP F3A / /PROCESS SCALING FACTOR (P-FORMAT) / NEGP JMS GLETR JMS PIKNUM SZL!CMA /COMPLEMENT COUNT (1'S) JMP ERR42 /STRAY-SIGN, NO NUMBER DAC NCOUNT ZEROP LAC LETTER SAD (PEE JMP OKP JMP ERR41 /NEGATIVE OR ZERO NUMBER,NOT P / INSERT CODE / OKP LAC NCOUNT /SET SCALE FACTOR DAC PSCALE /GO GET NEXT SPECIFICATION JMP NEXTC / /PROCESS X-FORMAT SPECIFICATION / XTYPE LAC NCOUNT /STEP ACROSS JMS BCHECK /CHECK FOR BUFFER OVERFLOW JMP NEXTC / /PROCESS T-FORMAT SPECIFICATION / TTYPE JMS GLETR JMS PIKNUM SZL JMP ERR42 /MISSING NUMBER SNA JMP ERR42 /ZERO NUMBER TAD (BUFFER-1 / ADD START ADDRESS OF BUFFER DAC LOCATN /RESET LOCATION POINTER CLA JMS BCHECK JMP NEXTC2 / ERR42 LAW 42 / MISSING OR ZERO TAB SPECIFICATION JMP .NERR / / WE HAVE FOUND '-----------------' / LITRAL LAC IO SNA XX /INPUT NEXTLR JMS GLETR SAD (APOSTE JMP .+3 JMS PUSHIT JMP NEXTLR JMS GLETR SAD (APOSTE JMP .-4 /OUTPUT SINGLE ' JMP NEXTC2 / / HAVE FOUND XXH----------- HTYPE LAC IO SNA XX / INPUT NXTLTR JMS GLETR JMS PUSHIT ISZ NCONT2 JMP NXTLTR JMP NEXTC / / PROCESS NUMERIC SPECIFICATION BY RECORDING TYPE AND PICKING /UP FOLLOWING NUMERIC FIELDS. / DEF DAC NDEC /ENTRY POINT FOR D, E, F SKP AIGL DZM NDEC /ENTRY POINT FOR A, I, L, G DAC NTYPE /RECORD TYPE / JMS GLETR JMS PIKNUM SZL!SNA / SZL&SNA - COMPLAIN ON ZERO FIELD WIDTH JMP ERR44 / AS WELL AS NO NUMERIC FIELD DAC NWIDTH /FIELD WIDTH LAC LETTER SAD (DECIML JMP F4 /MUST BE DEFG LAC NDEC /CHECK IF AILG SNA JMP F6 /HAVE FULL SPECIFICATION ERR44 LAW 44 /DECIMAL POINT MISSING JMP .NERR F4 LAC (GEE /CHECK IF G-TYPE SAD NTYPE JMP .+4 /EXIT HERE IF G LAC NDEC SNA /SKIP IF D,E,F JMP ERR44 /ERROR- DECIMAL FOUND, FORMAT IS A,I,L JMS GLETR /SLUFF OFF DECIMAL POINT JMS PIKNUM /GET NUMERIC FIELD DAC NDEC /# OF DECIMAL DIGITS TO BE READ OR PRINTED SZL JMP ERR44 /NO NUMERIC FIELD AFTER DECIMAL / /HAVE FOUND (OR STILL HAVE) A NUMERIC FORMAT / F6 DZM XR /INDICATE FORMAT HAS /AT LEAST 1 NUMERIC TYPE F6A SET RNUM /INDICATE NUMERIC SPEC. LAC XNUM /CHECK IF NUMERIC ADDRESS EXISTS SNA JMP GETNUM /NO. GO GET ONE DONUM DZM XNUM /INDICATE AS USED / /CHECK NUMERIC FORMAT TYPE AND VARIABLE MODE AND ENTER /APPROPRIATE I/O CONVERSION / LAC NTYPE DAC NTYPE2 SAD (AYE JMP AINOUT /A-FORMAT / SAD (ELL JMP LFORM /L-FORMAT / SAD (GEE JMP GFORM / / NONE OF ABOVE MUST BE F,D,I,E / LAC* MODEA SMA JMP CONVRT /REAL,INTEGER ERR45 LAW 45 /LOGICAL OR CHARACTER-FORMAT F,D,I,E JMP .NERR GFORM LAC* MODEA SPA!RTL JMP LORC /LOGICAL OR CHARACTER / SZL JMP CONVRT /REAL OR DOUBLE LAC (EYE DAC NTYPE2 /CONVERT G TO I IF INTEGER / /REAL OR INTEGER VARIABLE, I,D,E,F OR G (REAL ONLY) FORMAT / CONVERT A NUMBER THE WIDTH OF NWIDTH INTO BINARY / AND THEN LOOK AT WHAT WE HAVE / CONVRT LAC IO SZA JMP CONOUT / / ITS INPUT / CONIN DZM DIGCNT DZM DIGITS DZM DEXFSH /SCALING FACTOR DZM* MOSTA DZM* LEASTA DZM* A3 DZM* A4 DZM EXPSW /NO EXPONENT YET DZM SIGNFG /SIGN OF NUMBER WE ARE GOING TO CONVERT SET SIGNFG / ASSUME NUMBER IS NEGATIVE SET DIGMAK / MARK THAT NO DIGITS HAVE OCCURRED YET LAW -1 TAD NWIDTH CMA DAC NWIDE /2'S COMP JMP ENTER / / PROCESS THE 1ST CHARACTER IN THE FIELD, SLOUFFING OFF BLANKS / ALL SPACES ENCOUNTERED BEFORE A STARTING CHARACTER ARE ASSUMED / TO BE ZEROS IN CASE THE FIELD IS ALL BLANKS. THE STARTING CHARACTERS / ARE PLUS,MINUS,DECIMAL, A DIGIT OR 'E', 'D'. / THE ILLEGAL COMBINATIONS ARE: E00 ( NOT PRECEDED BY A SPACE), +E00, / -E00, .E00 (NOT PRECEDED BY A BLANK), +.E00, -.E00. GETAGN DZM DIGMAK / A SPACE IS CONSIDERED A DIGIT ISZ NWIDE / COUNT THE LAST CHARACTER SKP JMP ENFELD / END OF FIELD / ENTER JMS PICKIT / GET NEXT CHARACTER SAD (SPACE JMP GETAGN / IT IS ' ' SAD (MINUS / IS IT '-' JMP ITSPM /YES. DZM SIGNFG / WASN'T MINUS SIGN, THUS NUMBER IS POSITIVE SAD (PLUS / IS IT '+' SKP JMP NOTSIN / THE CHARACTER IS NOT A SPACE OR SIGN ITSPM SET DIGMAK / SIGN ENCOUNTERED, THUS NO DIGITS YET / / WE NOW HAVE ENCOUNTERED A CHARACTER OTHER THAN +, -, SPACE. GETNXT ISZ NWIDE / COUNT LAST CHARACTER SKP JMP ENFELD / END OF FIELD JMS PICKIT / GET NEXT CHARACTER NOTSIN LMQ / STORE CHARACTER IN MQ SNL JMP NUMERC / ITS NUMERIC SAD (SPACE JMP ASZERO / SPACES ARE NOW ASSUMED TO BE ZEROS SAD (DECIML JMP CPOINT / ITS DECIMAL POINT SAD (COMA JMP COMMAS / ITS A COMMA / / CHARACTER MUST BE EITHER E, D OR AN EXPONENT OF THE FORM +N LAC DIGMAK / ARE THERE ANY DIGITS? SNA JMP .+3 ERR46 LAW 46 / NO DIGITS IN INPUT FIELD JMP .NERR / / A LEGAL FRACTION HAS BEEN PROCESSED, NOW LOOK FOR AN EXPONENT LAW -1 DAC EXPSW / MARK EXPONENT PRESENT DZM SPOT DZM FLAG LAW -3 DAC QQ / ALLOW ONLY TWO EXPONENT DIGITS LACQ / REGAIN CHARACTER SAD (EEE JMP EXPGET / ITS 'E' SAD (DEE JMP EXPGET / ITS 'D' JMP EXSIGN / NEITHER OF ABOVE MIGHT BE SIGN, GO TEST / / PROCESS EXPONENT EXPGET ISZ NWIDE / COUNT THE LETTER JMP EXP1 ERR47 LAW 47 / END OF FIELD ENCOUNTERED JMP .NERR EXP1 JMS PICKIT SNL JMP ITSNUM / FORM 'E'N SAD (SPACE / FORM 'E' N, 'E' JMP CHKS EXSIGN SAD (PLUS JMP GOAHD1 / ITS '+' SET FLAG / ASSUME ITS MINUS SAD (MINUS JMP GOAHD1 / ITS MINUS SAD (COMA JMP ERR47 ERR50 LAW 50 / ILLEGAL CHARACTER IN INPUT FIELD JMP .NERR / / PROCESS THE NUMBER ASZERO LAC FREESW SZA / ARE WE IN FREE FORMAT JMP ENFELD / YES, A SPACE THEN TERMINATES THE FIELD / CLQ / NOT FREE FORMAT, SPACES ARE AS ZEROS. / WE HAD A DIGIT NUMERC DZM DIGMAK / MARK THAT A DIGIT OCCURRED LAC DIGITS SZA / HAVE WE ANY SIGNIFICANT DIGITS YET JMP SIGDIG / YES LACQ / NO. SNA!CLC / IS NUMBER ZERO, SET AC .NE. 24 JMP CHKDOT / YES, IF WE HAD . , MUST COUNT IT / SIGDIG SAD (24 / HAVE WE 20 DIGITS JMP HAVE20 / YES LACQ JMS DBCVTR / CONVERT TO BINARY IDX DIGITS / COUNT THE SIGNIFICANT DIGIT / CHKDOT LAC DIGCNT SMA / HAVE WE HAD A '.' JMP GETNXT / NO TAD DEXFSH / YES. COUNT DIGIT AFTER DECIMAL DAC DEXFSH JMP GETNXT / HAVE20 LAC DIGCNT SZA / HAVE WE HAD A '.' JMP GETNXT / YES, THROW DIGIT AWAY ISZ DEXFSH / NO, DIGITS TO LEFT OF DECIMAL MUST BE COUNTED JMP GETNXT / / / / A DECIMAL POINT WAS FOUND, THUS NUMBER IS REAL. CHECK IF / WE ALREADY HAD A DECIMAL POINT CPOINT LAC DIGCNT SZA!CLC JMP ERR47 / ERROR - TWO DECIMAL POINTS DAC DIGCNT / INDICATE DECIMAL OCCURRED JMP GETNXT / / A COMMA WAS ENCOUNTERED, THEY ARE LEGAL ONLY IN FREE FORMAT COMMAS LAC FREESW SNA / IS IT FREE FORMAT JMP ERR50 /NO. COMMA ILLEGAL JMP ENFELD / FREE FORMAT. COMMA TERMINATES FIELD / / / COUNT THE SIGN GOAHD1 ISZ NWIDE SKP JMP ERR47 / / PROCESS NUMBER ARND JMS PICKIT SNL JMP ITSNUM SAD (SPACE JMP CHKIT / CHECK IF FREE FORMAT SAD (COMA SKP JMP ERR50 / ILLEGAL CHARACTER IN EXPONENT / ITS COMMA, CHECK IF FREE FORMAT LAC FREESW SZA JMP ENDFLD /OKAY. FREE FORMAT. COMMA TERMINATES FIELD JMP ERR50 / NOT FREE FORMAT. COMMA ILLEGAL / ITS SPACE CHECK IF FREE FORMAT CHKIT LAC FREESW SZA JMP ENDFLD / ITS FREE FORMAT. SPACE TERMINATES FIELD / CONVERT TO BINARY. IF CHARACTER WAS SPACE AC=0. ITSNUM DAC SPOT2 LAC SPOT MUL 12 LACQ TAD SPOT2 DAC SPOT ISZ QQ / CHECK IF MORE THAN 2 DIGITS JMP GOAHD / NO ERR51 LAW 51 / YES, MORE THAN TWO DIGITS JMP .NERR / / CHECK IF FREE FORMAT / CHKS LAC FREESW SZA JMP ERR51 /ERROR-SPACE TERMINATES FIELD,NO EXPONENT / / CHECK IF FIELD FINISHED / GOAHD ISZ NWIDE JMP ARND /NO /FIELD IS FINISHED, CHECK IF WE HAVE ANY DIGITS ENDFLD LAC FLAG SNA!CLC / IS EXPONENT POS OR NEG JMP POSIT / ITS POSITIVE TAD SPOT / ITS NEGATIVE SKP!CMA POSIT LAC SPOT TAD DEXFSH / ADD EXPONENT TO DECIMAL OFFSET DAC DEXFSH / / / THE NUMBER IS FINISHED BEING PROCESSED, FIND OUT WHAT WE HAVE. ENFELD LAC DIGCNT SZA / DID NUMBER HAVE A DECIMAL POINT JMP ITREAL / ITS REAL / / LOOKS LIKE AN INTEGER, MIGHT BE REAL WITHOUT DECIMAL POINT / LAC NTYPE2 XOR EXPSW SAD (EYE JMP INTOK LAW -1 /INSERT DEFAULT DECIMAL POINT TAD NDEC CMA TAD DEXFSH DAC DEXFSH JMP ITREAL / / IT WAS AN INTEGER NUMBER / INTOK LAC SIGNFG RAR / SIGN INTO LINK LAC* MOSTA SAD* LEASTA / FIRST 2 WORDS MUST BE ZERO, OR NUMBER TOO LARGE SZA JMP ERR52 LAC* A3 SMA / ALSO IF AC0 =1, THEN NUMBER STILL TOO LARGE JMP GOODSZ ERR52 LAW 52 / NUMBER TOO LARGE AN INTEGER TO STORE JMP .NERR / THE NUMBER IS SINGLE OR DOUBLE INTEGER, NEGATE IF NECESSARY AND / STOR IN INT1 AND INT2 GOODSZ LAC* A3 SNL / IS IT NEGATIVE JMP .+2 / NO CMA DAC* INT1 LAC* A4 SNL!CLL JMP .+5 CMA TAD (1 SZL IDX* INT1 / THERE IS A CARRY INTO INT1 NOP / SKIPS ON A BLANK INPUT FIELD DAC* INT2 / STORE LEAST SIG BITS CLA / MARK ACC AS INTEGER JMP PLACIT / GO TO STORE IT / / / / / / THE NUMBER WAS REAL, IT MUST BE NORMALIZED AND MULTIPLIED / BY THE SCALE FACTOR ITREAL LAC DIGITS SNA JMP ZRNUM / THE NUMBER IS ZERO LAC (110 / ACCOUNT FOR 4 WORD SHIFT DAC* EXPA JMS* .DBNRM / DO NORMALIZE LAC DEXFSH / GET SCALE FACTOR JMS TENTOX LAC SIGNFG CLL RTR DAC* SIGNA / / WE NOW HAVE THE CORRECT FLOATING POINT NUMBER / CHECK FORMAT TYPE REQUIRED, IF I ISSUE ERROR. SKP ZRNUM JMS* .ZRVAL / PUT THE NUMBER ZERO IN THE ACC. A LAC NTYPE SAD (EYE JMP ERR53 LAC (300000 / MARK ACC AS DOUBLE REAL / / STORE THE NUMBER. PLACIT DAC* MODEA LAC (AMODE / POINT BOX AT CORRECT MODE,MAINLY FOR COMPLEX DAC* .BOX JMS* .STORE JMP LOOK / ERR53 LAW 53 / WANTED INTEGER, FOUND FLOATING JMP .NERR / XSPLIT XX GSM SZL TAD (1 DAC DEXFSH CLA!RAL DAC FLAG /STORE THE SIGN OF EXPONENT LAC DEXFSH IDIV 12 DAC SPOT2 /UNITS PART LACQ DAC SPOT /TENS PART JMP* XSPLIT / / TENTOX XX JMS XSPLIT TAD (-12 SPA JMP .+3 ERR54 LAW 54 /EXPONENT OUT OF RANGE JMP .NERR LAC SPOT SNA!CLL /IF TENS PART IS ZERO,BYPASS JMP DBCV6 /FIRST MULTIPLY,OTHERWISE MUL 5 /COMPUTE ADDRESS OF EQUIVALENT, LACQ /PLACE IT IN ACC B AND PERFORM MULTIPLY TAD (FPVALU+47 JMS COPY /COPY NUMBER INTO ACC B AND /EITHER MULTIPLY OR DIVIDE. DBCV6 LAC SPOT2 /DO SAME WITH UNITS. SNA!CLL JMP* TENTOX MUL 5 LACQ TAD (FPVALU-6 JMS COPY JMP* TENTOX / / / / SUBROUTINE TO COPY NUMBER INTO ACC B AND DO THE ARITHMETIC COPY XX DAC* (AUTO3 DZM* SIGNB LAC* AUTO3 DAC* EXPB LAC* AUTO3 DAC* MOSTB LAC* AUTO3 DAC* LEASTB LAC* AUTO3 DAC* B3 LAC* AUTO3 DAC* B4 LAC FLAG / IF FLAG IS SET NUMBER IS NEGATIVE SZA JMP .+3 JMS* .DPRML / DO DOUBLE PRECISION MULTILPY JMP* COPY JMS* .DPRDV / DO DOUBLE PRECISION DIVIDE JMP* COPY DIGMAK FLAG SPOT SPOT2 DEXFSH /DECIMAL SCALE FACTOR DIGCNT / COUNT FOR DIGITS AFTER DECIMAL POINT DIGITS / /TABLE OF FLOAT POINT VALUES OF POWERS OF 10, IE. 12 OCTAL. ALL NUMBERS / ARE NORMALIZED FRACTIONS. THE 1ST COLUMN CONTAINS THE EXPONENT FPVALU 000004; 500000; 000000; 000000; 000000 / 12 TO EXPONENT 1 000007; 620000; 000000; 000000; 000000 / 12 TO EXPONENT 2 000012; 764000; 000000; 000000; 000000 000016; 470400; 000000; 000000; 000000 000021; 606500; 000000; 000000; 000000 000024; 750220; 000000; 000000; 000000 000030; 461132; 000000; 000000; 000000 000033; 575360; 400000; 000000; 000000 000036; 734654; 500000; 000000; 000000 000042; 452013; 710000; 000000; 000000 / 12 TO THE 10TH 000103; 532743; 536132; 614200; 000000 / 12 TO THE 20TH 000144; 623713; 116320; 214723; 557244 / 12 TO THE 30TH 000205; 726145; 174341; 534511; 376532 / 12 TO THE 40TH 000247; 421541; 661277; 144463; 207642 000310; 476474; 471141; 363210; 442374 000351; 562727; 265556; 707171; 033252 000412; 657635; 724370; 373275; 775716 000453; 766541; 702224; 531616; 457360 / / / / / THIS SUBROUTINE PICKS UP A CHARACTER ONE AT A TIME FROM / THE BUFFER. CHARACTER IS LEFT IN THE AC AND IF NUMERIC, LINK=0 / ELSE LINK=1. / IF LOCATN=END OF BUFFER AND NOT FREE FORMAT, ERROR! / IF LOCATN=END OF BUFFER AND FREE FORMAT, RETURN A SPACE TO END FIELD / IF IT RETURNS TO PICKIT AGAIN ON FREE FORMAT, LOCATN=END OF BUFFER+1 / IE. LOCATN-END OF BUFFER=1, THEN A NEW LINE IS READ / PICKIT XX LAC LOCATN TAD* SZPTR SPA JMP NOEND /NOT END OF BUFFER SZA /LOCATN=>END OF BUFFER JMS INOUT /LOCATN> BUFFER GET NEW LINE, FREE FORMAT ONLY LAC FREESW SNA / SKIP IF FREE FORMAT, ALWAYS A SPACE LEFT IN BUFFER JMP ERR60 /NOT FREE FORMAT. ERROR / NOEND LAC* LOCATN /GET NEXT CHARACTER IDX LOCATN LMQ TAD (-72 SMA / FOR NUMERIC AC<0 JMP NONNUM TAD (72-60 SMA!CLL / FOR NUMERIC AC=>0 JMP* PICKIT NONNUM LACQ STL JMP* PICKIT / / / THE DECIMAL TO BINARY SUBROUTINE FOLLOWS, ENTER WITH NUMBER IN AC DBCVTR XX DAC CCNT LAC* MOSTA /MULTIPLY FRACTION BY 10 FOR ALL SNA!CLL /DIGITS AFTER THE FIRST JMP DBCV10 MUL 12 LACQ DAC* MOSTA DBCV10 LAC* LEASTA SNA!CLL JMP DBCV11 MUL 12 TAD* MOSTA DAC* MOSTA LACQ DAC* LEASTA DBCV11 LAC* A3 SNA!CLL JMP DBCV12 MUL 12 TAD* LEASTA DAC* LEASTA SZL!CLL ISZ* MOSTA LACQ DAC* A3 DBCV12 LAC* A4 SNA!CLL JMP DBCV1 MUL 12 TAD* A3 DAC* A3 SNL!CLL JMP DBCV13 ISZ* LEASTA SKP ISZ* MOSTA DBCV13 LACQ DAC* A4 DBCV1 CLL LAC CCNT TAD* A4 DAC* A4 SNL!CLL JMP* DBCVTR ISZ* A3 JMP* DBCVTR ISZ* LEASTA JMP* DBCVTR ISZ* MOSTA JMP* DBCVTR / / / / THIS SECTION CONVERTS THE NUMBER INTO ASCII AND OUTPUTS / THE BUFFER / / / / FIRST THE NUMBER MUST BE LOADED INTO ACC A. THIS / REQUIRES US TO CRAWL BACK INTO THE INTERPRETER / TO GET THE CORRECT LOADING ROUTINE. / CONOUT LAC (BLOADD DAC .FETCH LAC (QLOAD*10000 LMQ /OP CODE IN MQ LAC* MODEA /GET MODE BITS JMP* .NEXT2 /ENTER LOAD ROUTINE BLOADD JMS* .PSHBA /DO APPROPRIATE LOAD / / SET UP ADDRESS FOR NUMBER INSERTING ROUTINES / LAC NWIDTH JMS BCHECK LAW -1 TAD LOCATN DAC BACKLC / / RECORD SIGN OF NUMBER, TAKE ABSOLUTE VALUE, / AND ADJUST FIELD WIDTH COUNT IF NEGATIVE. / LAC* MODEA SNA JMP OUT3 /INTEGER LAC* SIGNA DZM* SIGNA /TAKE ABSOLUTE VALUE SZA OUT2 LAC (MINUS /ASCII - SIGN OUT1 DAC SS /STORE FINAL SIGN SZA LAW -1 TAD NWIDTH /NWIDE IS FIELD WIDTH AFTER DAC NWIDE /ALLOWING FOR SIGN. / / ADJUST FIELD WIDTH FOR DECIMAL POINT (D,E,F, AND G) / AND EXPONENT FIELD (D,E, AND G). / LAC NDEC CMA DAC QQ /- NUMBER OF DIGITS AFTER DECIMAL -1. / LAC NTYPE2 SAD (EYE JMP OUT4 /INTEGER FORMAT SAD (EFF JMP OUT4A LAW -6 /-5 FOR .E+XX (E,D,G) OUT5 TAD NWIDE /MAX. DECIMAL DIGITS -1. SPA!CMA JMP STARS1 /NO SPACE FOR DIGITS DAC NWIDE /-(MAX. DECIMAL DIGITS) / / FOR E,D, AND G FORMATS WE MUST NOW FIND THE POWER / OF THE EXPONENT. / LAC NTYPE2 SAD (EYE JMP I1 /I FORMAT DZM G /ASSUME F FORMAT LAC* MODEA JMS* .FLOAT /MAKE SURE ARGUMENT IS REAL LAC NTYPE2 SAD (EFF JMP F1F / F FORMAT JMS* .SWPUS /SAVE CONTENTS OF ACC A / / THE REQUIRED EXPONENT IS FLOOR(LOG10(A)+1). / LAC* MOSTA /CHECK FOR ZERO VALUE SNA!CLA /IF SO SET G TO 0 JMP OUT7 LAC* MODEA JMS* .ALG10 /TAKE LOG / / SHOULD NOW ADD 1.0. HOWEVER WILL JUST ADD 0.777777 (OCTAL) / SO ROUNDING ERRORS NEVER CAUSE EXPONENT TO BE HIGH. WILL / CHECK FOR IT BEING ONE LOW LATER. / LAC (D7777 JMS* .SPRLD JMS* .SPADD /ADD 0.777777 (OCTAL) / / TAKE FLOOR FUNCTION. FOR POSITIVE ARGUMENT SAME AS IFIX. / FOR NEGATIVE ARGUMENT TAKE IFIX(A+X)-X WHERE X IS ANY / INTEGER GREATER THAN ABSOLUTE VALUE OF A. / LAC* SIGNA SMA JMP OUT6 /POSITIVE RESULT LAC (EIGHTY JMS* .SPRLD /ADD 80.0 SINCE JMS* .SPADD /-78 SIZE N, USE N RIGHT CHARS / ELSE N > W, THEN LEFT JUSTIFY W CHARACTERS IN VARIABLE / ON OUTPUT: IF FIELD WIDTH W > SIZE N, PRINT N CHARS RIGHT JUSTIFIED / ELSE N > W, PRINT ONLY FIRST W CHARACTERS / / SUBROUTINE TO CALCULATE NUMBER OR WORDS IN ITEM LENWRD XX LAC* MODEA SAD (700000 / IS VARIABLE CHARACTER JMP ATIE / YES. JMS* .CHRGT / NO. GET # OF CHARACTERS DAC* SIGNA ATIE JMS ELMLGH / GET WORDS/ELEMENT JMP* LENWRD / AINOUT JMS LENWRD LAC FREESW SNA / ARE WE IN FREE FORMAT JMP NOTFREE LAC IO /INPUT OR OUTPUT? SNA JMP FREEIN LAC (BUFFER+1 /INSERT SPACE IF FREE FORMAT & SAD LOCATN /LINE NOT EMPTY SKP IDX LOCATN FREEIN LAC* SIGNA /PICK UP CHARACTER COUNT DAC NWIDTH / USE AS FIELD WIDTH / NOTFREE LAC NWIDTH / W , WIDTH OF I/O FIELD CMA / -W-1 TAD* SIGNA / -W+N-1 DAC QQ SMA!CMA / W-N CLA DAC SS / MAX(0,W-N), # OF CHARS TO BE IGNORED IN FIELD / / CHECK IF END OF FIELD OVERFLOWS THE BUFFER & RESET 'LOCATN' LAC NWIDTH / SET TO LOCATION JMS BCHECK / IF OVERFLOW ON FREE FORMAT, BUFFER PRINTED & RESET / / CALCULATE THE MAXIMUM NUMBER OF CHARACTERS TO BE MOVED / IE MIN(W,N) LAW -1 TAD NWIDTH CMA TAD SS DAC CCNT / GIVES NUMBER OF CHARS FOR MOVE / / SET UP POINTER TO GET MAX(N,W) RIGHT JUSTIFIED CHARACTERS / TAD LOCATN TAD (-1 /SET UP POINTER TO CORRECT POSITION IN DAC* (AUTO3 /FIELD OF IMAGE BUFFER FOR OUTPUT / / SET UP POINTERS FOR INPUT AND OUTPUT TO SOURCE & DESTINATION LAC* (AUTO2 DAC* (AUTO4 / FOR OUTPUT TAD (1 DAC POINTS / FOR INPUT TAD (-1 TAD ELMSIZ DAC* (AUTO2 / IN CASE ITS AN ARRAY LAC IO SNA JMP AINPUT / ITS INPUT / / IT IS HOLLERITH OUTPUT, USE BUSTER TO BREAK CONSTANT UP AND / PLACE IN IMAGE BUFFER. LAC (LOOK / ADDRESS TO CONTINUE FORMAT INSPECTION DAC BUFSET JMP UNFRT / / IT IS HOLLERITH INPUT, CONSTANT IS TAKEN FROM IMAGE BUFFER / AND PACKED INTO THE VARIABLES STORAGE AINPUT LAC POINTS JMS SETPUT GTNEXT LAC* AUTO3 / GET NEXT CHARACTER PAD JMS PUT / GO TO PACKING ROUTINE ISZ CCNT JMP GTNEXT / NOT FINISHED, GO GET NEXT CHARACTER LAC QQ / CHECK IF MUST PAD SPA!CLA!CMA / WITH SPACES JMP LOOK DAC CCNT TAD QQ DAC QQ LAC (SPACE JMP PAD / .EJECT / /RETURN TO INTERPRETER TO GET ANOTHER DATA ADDRESS. FIRST CHECK /IF HAVE BALANCE OF AN ARRAY (OR IMAGINARY PART OF COMPLEX) TO DO / GETNUM LAW -1 TAD BUNCH SPA!SNA JMP* .NEXT /NO ARRAY - GET NEW OPERATION JMP GRP5 /CONTINUE WITH ARRAY / /ENTER HERE WHEN ARRAY I/O OP-CODE IS FOUND BY INTERPRETER / .GROUP JMS MODER JMS GETSIZ JMP GRP4 / /ENTER HERE TO INPUT/OUTPUT SINGLE ITEM / .SINGL JMS MODER LAC (1 GRP4 SZL RCL / MULT BY 2 FOR COMPLEX GRP5 DAC BUNCH LAC AMODE / RETRIEVE MODE NOW DAC* MODEA /RECORD MODE LAC FREESW SZA JMP FREEF / ITS FREE FORMAT LAC BINSW SZA JMP BINARY / ITS NO FORMAT (BINARY) / / ITS REGULAR FORMAT. CHECK IF WE HAVE A NUMERIC FORMAT / SPECIFICATION AND IF SO GO USE IT. SET XNUM /INDICATE DATA ADDRESS AVAILABLE LAC RNUM /IS FORMAT AVAILABLE SZA JMP DONUM /YES. GO CONVERT NUMBER / /HAVE HIT END OF FORMAT. GO BACK TO LAST ( PROVIDED THAT /NUMERIC FORMATS WERE ENCOUNTERED IN FIRST SCAN. LAC XR SNA JMP .+3 / EVERYTHING OKAY ERR55 LAW 55 / LIST NOT EXHAUSTED- NO NUMERIC FORMATS JMP .NERR / JMS INOUT /PERFORM I/O EXPECTED / /NOW CHECK TO SEE IF THIS IS START OF THE FORMAT OR OF A NN(...) /GROUP. LAC NSAVE DAC RTABLE+4 /REPEAT COUNT SNA JMP F9 /ZERO - START OF FORMAT / /THIS IS A NN(...) GROUP. FIX UP LEVCNT, ETC. IDX LEVCNT LAC (RTABLE+4 DAC BRKLIT /POINT TO REPEAT COUNT / F9 LAC (RTABLE-1 /MUST REPEAT SECTION AGAIN. RESET SWITCHS IN THE GLETR ROUTINE /TO CORRECT REPEAT POINT BACKUP DAC* (AUTO3 LAC* AUTO3 DAC FPOINT LAC* AUTO3 DAC WORDCT LAC* AUTO3 DAC CHARST LAC* AUTO3 DAC GET2 JMP NEXTC .EJECT / / ITS FREE FORMAT. HASH UP A FORMAT CODE FREEF DZM NWIDTH / INFINITE FIELD WIDTH FOR INPUT DZM NDEC / NO DEFAULT DECIMAL POSITION DZM NCONT2 / ENSURE THAT FREE-FORMAT IS NOT 'DONE IN' BY / A RESIDUAL COUNT LEFT BY A PREVIOUSLY / UNEXPIRED REPEAT COUNT. LAC (GEE DAC NTYPE / SET GO G FORMAT DAC NTYPE2 LAC IO SNA!CLL JMP GFORM / ITS FREE FORMAT INPUT. GO GET MODE SORTED OUT LAC* MODEA SZA SAD (100000 LAC (FINTGR-1 / USE INTEGER FORMAT SAD (200000 LAC (FREAL-1 / USE SINGLE REAL FORMAT SAD (300000 LAC (FDREAL-1 / USE DOUBLE REAL FORMAT SAD (600000 LAC (FLOGIC-1 / USE LOGICAL FORMAT SPA / IF NOT CHARACTER, AC HAS AN ADDRESS, AC0 = 0 LAC (FCHAR-1 / USE CHARACTER FORMAT DAC FPOINT SET XNUM / INDICATE DATA ADDRESS AVAILABLE LAC (G4 DAC GET2 / SET UP CHARACTER EXTRACTION ROUTINE DZM WORDCT DZM CHARCT JMP NEXTC / GO PROCESS FORMAT .EJECT / ITS BINARY I/O. GET THE NUMBER OF WORDS PER ITEM AND / WRITE THEM OUT. BINARY JMS LENWRD GS!MUL BUNCH XX LACQ CMA TAD (1 DAC ITEMNM / NUMBER OF WORDS IN ITEM LAC IO SNA JMP BR1 / BINARY READ JMP BW1 / BINARY WRITE / / THE PHYSICAL RECORD IS FULL, WRITE IT OUT DOWRIT JMS SETBIN JMS OWAITR LAC* SZPTR / RESET TO 1'S COMP DAC BCOUNT LAC (BINBUF+3 DAC BPOINT / ADDRESS OF 1ST WORD / / TRANSFER THE ITEM TO THE BUFFER BW1 ISZ BCOUNT / IS BUFFER FULL SKP!CLA JMP DOWRIT / YES. WRITE IT OUT LAC* AUTO2 / GET WORD OF ITEM DAC* BPOINT / STORE IN BUFFER IDX BPOINT ISZ ITEMNM / IS ITEM EMPTY JMP BW1 / NO. JMP* .NEXT / YES. / / READ A NEW RECORD GETNEW JMS INOUT / READ A RECORD JMS GETIT / SET UP POINTER TO IT / / TRANSFER TO ITEM BR1 ISZ BCOUNT / IS BUFFER EMPTY SKP JMP GETNEW LAC* BPOINT / GET WORD FROM BUFFER DAC* AUTO2 / STORE IN ITEM IDX BPOINT ISZ ITEMNM / IS ITEM FULL JMP BR1 / NO. JMP* .NEXT / YES. / / THIS SUBROUTINE SETS UP THE HEADER WORDS OF A RECORD AND / WRITES IT OUT SETBIN XX XOR PHYCNT IDX PHYCNT DAC BINBUF+2 / SET UP RECORD COUNT LAC BCOUNT SNA / IF BCOUNT IS ZERO SET TO -1 LAW -1 / BECAUSE OF 1'S COMP COUNTING TAD INIT+3 TAD (2 AND (777776 / MAKE EVEN LLS!CLQ 10 / SHIFT LEFT 11 & DIVIDE BY TWO DAC BINBUF / SET UP WORD PAIR COUNT DZM BINBUF+1 / CLEAR CHECK SUM JMS DOIO JMP* SETBIN / / THIS SUBROUTINE GETS THE NUMBER OF WORDS IN THE BUFFER GETIT XX LAC BINBUF CLL LRS 10 / # OF WORDS TAD (-3 CMA / 1'S COMP DAC BCOUNT LAC (BINBUF+3 DAC BPOINT JMP* GETIT / ITEMNM BCOUNT BPOINT PHYCNT .EJECT / /ENTER HERE WHEN CLOSING PARENTHESIS FOUND. IT IS EITHER END /OF NN(...) OR END OF FORMAT. IF END OF FORMAT GO SEE IF I/O /LIST EXHAUSTED. IF REPEATING SECTION CHECK REPEAT COUNT AND /EITHER REPEAT IT OR CONTINUE SCAN. / CLOSIT DZM RNUM /INDICATE NO NUMERIC FORMAT IN /CASE THIS IS END OF FORMAT LAC LEVCNT /ARE ANY NN(...) LEVELS ACTIVE SNA JMP GETNUM /NO. END OF FORMAT / LAW -5 /CALC. ADDRESS OF PREVIOUS TAD BRKLIT /REPEAT GROUP DATA ISZ* BRKLIT /IF COUNT NOT EXHAUSTED JMP BACKUP /REPEAT SECTION / /THIS SECTION HAS BEEN REPEATED SPECIFIED NUMBER OF TIMES. /RESET BRKLIT AND LEVCNT TO PREVIOUS LEVEL. / DAC BRKLIT LAW -1 TAD LEVCNT DAC LEVCNT JMP NEXTC / /ENTER HERE WHEN ( FOUND. RECORD REPEAT INFORMATION IN TABLE /RTABLE. IN INITIALIZATION BRKLIT_(RTABLE-1). LEVCNT HAS /THE FOLLOWING VALUES: / -1 INITIALIZATION / O NO NN(...) GROUPS OUTSTANDING / M M LEVELS OF NN(...) OUTSTANDING /WHEN FINAL ) IN FORMAT IS REACHED RTABLE WILL CONTAIN DATA ON /EITHER FIRST ( LOCATION, OR LOCATION OF MOST RECENT OUTERMOST /NN(...) GROUP. / OPENER LAC BRKLIT /POINT TO START OF NEXT DAC* (AUTO3 /ENTRY IN TABLE / LAC LEVCNT SAD (LEVELS-1 JMP ERR62 /TOO MANY NN(...) LEVELS / SPA!SNA!CLL /SET LINK IF THIS STL /OUTERMOST NN(...) SNL SET XR /REFLECTION PREVENTER IF /NO NUMERIC FORMAT LAC FPOINT DAC* AUTO3 LAC WORDCT /SAVE THE 4 ITEMS DAC* AUTO3 /REQUIRED TO RESTART LAC CHARST /FROM THIS POINT WHEN DAC* AUTO3 /MATCHING ) FOUND LAC GET2 DAC* AUTO3 LAC NCONT2 DAC* AUTO3 / SZL /IF OUTERMOST NN(...) DAC NSAVE /SAVE NN FOR POSSIBLE REFLECTION / LAC* (AUTO3 /RESET BRKLIT TO LAST IDX LEVCNT /ENTRY IN NEW GROUP DAC BRKLIT /UNLESS THIS IS INITIAL ( JMP NEXTC / /ENTER HERE WHEN END OF LIST OP-CODE FOUND / .FINIS LAW -1 /MARK I/O AS FINISHED DAC IODONE LAC BINSW SZA JMP BINRY LAC IO SNA JMP* .NEXT /WAS A READ OPERATION JMS OWAITR / WAIT TIL ASCII BUFFER IS FREE JMS GLUER / CONVERT IMAGE TO 5/7 ASCII JMS DOIO JMP* .NEXT / / HAVE REACHED THE FINISH OPCODE ON BINARY I/O. IF READ MAKE SURE / THAT WE ADVANCE TO END OF LOGICAL RECORD. IF WRITE MARK AS LAST / RECORD AND WRITE RECORD OUT. BINRY LAC IO SNA JMP BINRD / BINARY READ LAC (400000 / INDICATE LAST RECORD JMS SETBIN JMP* .NEXT / CHAIN TO LAST RECORD BINRD LAC BINBUF+2 SPA JMP* .NEXT / ARE THERE ALREADY JMS DOIO JMS OWAITR JMP BINRD / GO TEST THIS RECORD / / IODONE .DSA -1 /NO I/O UNDERWAY .EJECT / / THIS ROUTINE DISTINGUISHES BETWEEN A CHARACTER AND A / NUMBER / IF A NUMBER IS FOUND, IT COMPILES THE COMPLETE OCTAL / REPRESENTATION OF IT AND LEAVES IT IN THE AC UPON EXIT, L_0 / IF A CHARACTER, AC_1, L_1 / PIKNUM XX DZM NUMB LAW -2 DAC CCNT /TEST FOR A DIGIT HAVING OCCURRED LAC LETTER SKP LOOPY JMS GLETR SAD (SPACE JMP LOOPY /CHECK FOR SPACES TAD (-72 SMA!CLL /IF NUMERIC AC< OR = 0 JMP NOTNUM TAD (72-60 /MAYBE NUMERIC SPA!CLL /IF NUMERIC AC> OR = 0 JMP NOTNUM /NOT NUMERIC DAC CCNT /STORE OCTAL DIGIT LAC NUMB MUL 12 LACQ TAD CCNT DAC NUMB JMP LOOPY / NOTNUM CLL LAC CCNT SAD (-2 CMA!STL!SKP /L_1, AC_1 LAC NUMB JMP* PIKNUM / / /THIS ROUTINE PICKS UP 2.5 CHARACTERS PER WORD FROM N WORDS /(EXTRA 0.5 IGNORED IF N ODD) /REQUIRES - (NUMBER OF CHARACTERS PER STRING) IN CHARCT AND - /(NUMBER OF STRINGS)-1 IN WORDCT / GLETR XX LAC* FPOINT /PICK UP WORD OF TEXT JMP* GET2 GET2 XX /INITIALLY .DSA G4 AND (177 DAC LETTER ISZ CHARST /CHECK CHARACTER COUNT JMP* GLETR /NOT END OF STRING LAC (G4 /SET UP FOR NEXT DAC GET2 /STRING LAC LETTER JMP* GLETR / G4 ISZ WORDCT / IS TEXT EXHAUSTED JMP G4A / NO ERR56 LAW 56 / END OF ARRAY CONTAINING FORMAT ENCOUNTERED JMP .NERR / BEFORE END OF FORMAT STATEMENT G4A LAC CHARCT DAC CHARST G0 IDX FPOINT LAC* FPOINT LMQ!LLS 7 /GET FIRST CHARACTER JMS GET2 / LRS 4 /GET 2ND CHARACTER JMS GET2 / DAC GET2 IDX FPOINT LAC* FPOINT LMQ LAC GET2 LLS 3 /GET 3RD CHARACTER JMS GET2 / LRS 10 /GET 4TH CHARACTER JMS GET2 / RAR /GET 5TH CHARACTER JMS GET2 JMP G0 .EJECT / /PERFORM REQUIRED INPUT/OUTPUT OPERATION INOUT XX LAC IO /WHAT DIRECTION SZA JMP OUT /PERFORM OUTPUT / / READ IN A RECORD. IF THIS IS THE FIRST READ OPERATION A WAIT / HAS ALREADY BEEN DONE. / JMS DOIO /DO READ LAC DEVICE SAD (11 /CHARACTER DEVICE? JMP* INOUT / RETURN FOR CHAR VARIABLE UNITS JMS WAITR / WAIT UNTIL RECORD IS IN BUFFER / / CHECK IF END OF FILE / LAC* DOIO.2 AND (000017 SAD (000005 JMP EOMF SAD (000006 JMP EOMF LAC* DOIO.2 AND (000060 SAD (000060 JMP ERR63 / ERROR - LINE TOO LONG FOR INPUT LAC BINSW SZA JMP* INOUT / YES. EXIT TO AVOID OVERWRITING BUFFER LAC (BUSTER JMS BUFSET JMP* INOUT / THE 'EOM' OR 'EOMF' BITS ARE SET EOMF LAW -1 DAC IODONE / RESET I/O UNDERWAY SWITCH LAC DATEND / GET 'END=' ADDRESS SZA JMP GOTIE / JUMP TO END= STATEMENT ERR57 LAW 57 / END OF FILE ON INPUT DEVICE JMP .NERR ERR63 LAW 63 / INPUT LINE TOO LONG (>133 CHAR) JMP .NERR / /WRITE OUT A RECORD AND RE-SET AREA TO BLANK / OUT JMS OWAITR /WAIT FOR LAST WRITE JMS GLUER /BUILD ASCII BUFFER JMS DOIO /DO WRITE OPERATION LAC (BLANKR JMS BUFSET JMS WONDER /SPECIAL CARE MAY BE NEEDED JMP* INOUT .EJECT / / READ OR WRITE THE ACTUAL LINE / DOIO XX LAC DEVICE SAD (11 JMP CHDEV / CHARACTER DEVICE DOIO. 0 / THIS SECTION IS BUILT UP TO A READ OR WRITE DOIO.1 0 / READ=10, OR WRITE=11 DOIO.2 0 / ADDRESS OF BUFFER DOIO.3 0 / BUFFER SIZE JMP* DOIO / WRITE WITH DEVICE AND SIZE SET UP / DO I/O FOR CHARACTER UNIT CHDEV ISZ WORD4 /CHECK IF ALL ELEMENTS USED SKP JMP EOMF / NO MORE ELEMENTS, CHECK FOR END= LAC WORD2 / START ADDRESS OF VARIABLE DAC CHRADR / ADDRESS OF ELEMENT TAD WORD1 /ELEMENT LENGTH DAC WORD2 /NEXT ELEMENT / SEPARATE INPUT AND OUTPUT NOW LAC IO SNA JMP READC / DO WRITE OPERATION WRITEC LAC CHRADR / ADDRESS OF CHAR VARIABLE -1 TAD (1 JMS SETPUT / SET UP POINTERS FOR 'PUT' LAC* SZPTR TAD (BUFFER / RECOVER -# OF CHARS DAC CCNT LAC (BUFFER-1 DAC* (AUTO3 LOOPW LAC* AUTO3 JMS PUT ISZ CCNT JMP LOOPW JMP* DOIO / DO READ OPERATION READC JMS BUFCHR JMP* DOIO / / THIS SUBROUTINE WAITS ON OUTPUT FOR THE 5/7 ASCII BUFFER TO BE CLEAR / IT MUST CHECK THE LAST DEVICE THAT WAS WRITING OWAITR XX LAC WAITR+1 SZA JMS WAITR / THERE WAS I/O ALREADY, CHECK ON BUFFER LAC DEVICE / RESET .WAITR FOR THIS DEVICE SAD (11 / IS DEVICE A CHARACTER UNIT CLA / MARK AS NO I/O DAC WAITR+1 JMP* OWAITR / / I/O WAIT ROUTINE / WAITR XX .WAIT 0 / BUILT UP DURING EXECTUION JMP* WAITR .EJECT / ON ENTRY WITH AC SET TO BUSTER, THIS ROUTINE CONVERTS CHARACTERS / FROM 5/7 ASCII TO IMAGE ASCII. IF AC IS SET TO BLANKR, THE / BUFFER IS INITIALIZED TO BLANK CHARACTERS. BUFCHR XX LAC BUFCHR DAC BUFSET LAC (BUSTER DAC HINGE LAC CHRADR DAC SOURCE LAC* SZPTR TAD (BUFFER / RECOVER -# OF CHARS JMP BUFF1 / BUFSET XX DAC HINGE /SET CONTROL SWITCH LAC (ABUFFR+1 DAC SOURCE LAW -206 /LENGTH OF IMAGE BUFFER BUFF1 DAC CCNT LAC (BUFFER-1 DAC* (AUTO3 /ADDRESS OF IMAGE BUFFER TAD (1 DAC LOCATN JMP* HINGE /SEE WHAT TO DO / HINGE XX AND (177 /IF ASCII CHARACTER IS SAD (CARAGE /CARRIAGE RETURN OR ALT MODE, JMP BLANKR /IT IS THE END OF A PHYSICAL LINE. SAD (ALTMOD /FILL BALANCE OF BUFFER WITH BLANKS. JMP BLANKR / HING2 DAC* AUTO3 /STORE IMAGE CHARACTER AND ISZ CCNT /REPEAT UNTIL BUFFER FULL. JMP* HINGE JMP* BUFSET / BLANKR LAC (HING2 /SET SWITCH FOR BLANK INSERTIONS DAC HINGE LAC (SPACE JMP HING2 / / THIS ROUTINE CONVERTS THE CHARACTERS FROM 5/7 ASCII TO / IMAGE ASCII. IF 1ST CHARACTER ON INPUT IS A CARRIAGE / CONTROL CHARACTER, IGNORE IT. BUSTER LAC SOURCE DAC* (AUTO4 / ADDRESS OF 5/7 ACSII LAC* AUTO4 DAC SPOT LMQ!LLS 7 AND (177 SAD (CARAGE JMP UJOIN1 / DON'T IGNORE A CARRIAGE RETURN TAD (-40 / ALL CHARS < 40 ARE CARRIAGE CONTROL SPA JMP UJOIN2 / CHAR IS < 40 THROW IT AWAY AND GET NEXT TAD (40 / CHAR IS NOT CARRIAGE CONTROL, REGAIN IT / UJOIN1 JMS HINGE / UJOIN2 LLS 7 JMS HINGE / LAC* AUTO4 LMQ LAC SPOT LLS 3 JMS HINGE / LLS 7 JMS HINGE / LLS 7 JMS HINGE / UNFRT LAC* AUTO4 DAC SPOT LMQ!LLS 7 JMP UJOIN1 / / / THIS SUBROUTINE INSERTS CHARACTERS INTO THE IMAGE OUTPUT BUFFER / IN THE FORWARD DIRECTION PUSHIT XX DAC* LOCATN LAC LOCATN TAD* SZPTR SMA!SZA JMP ERR60 /ERROR END OF BUFFER EXCEEDED IDX LOCATN JMP* PUSHIT / / / THIS SUBROUTINE INSERTS CHARACTERS INTO THE IMAGE OUTPUT BUFFER / IN THE REVERSE DIRECTION TO FILL A FIELD. INSERT XX DAC* BACKLC LAW -1 TAD BACKLC DAC BACKLC JMP* INSERT / / THIS SUBROUTINE CHECKS FOR BUFFER OVERFLOW BCHECK XX DAC BOXX TAD LOCATN DAC LOCATN TAD* SZPTR SPA!SNA JMP* BCHECK / NO OVERFLOW LAC FREESW /CHECK FOR FREE FORMAT SNA JMP ERR60 JMS INOUT /DO I/O LAC BOXX / GET FIELD INCREMENT TAD LOCATN DAC LOCATN TAD* SZPTR SPA!SNA / WATCH OUT FOR LONG CHARACTER VARIABLES JMP* BCHECK ERR60 LAW 60 /ERROR-FORMAT STATEMENT TOO LONG JMP .NERR / / THIS ROUTINE GETS MODE AND LEAVES IT IN AC AND AMODE. IF MODE IS / COMPLEX IT SETS UP AS A REAL ARRAY. IF MODE IS CHARACTER IT STORES / LENGTH IN SIGNA AND SETS AUTO2 TO POINT TO ACTUAL DATA. / NOTE: LINK SHOULD BE CLEARED ON EXIT UNLESS ORIGINAL MODE WAS COMPLEX. MODER XX XCT* L.BOX AND (700000 / GET MODE BITS SPA!CLL SAD (600000 JMP MODERX / LOGICAL, REAL, INTEGER SAD (700000 JMP MODERC / CHARACTER TAD (600000 / CONVERT COMPLEX TO REAL AND SET LINK MODERX DAC AMODE / STORE FOR SAFETY'S SAKE JMP* MODER / MODERC LAC* AUTO2 / GET INFO WORD TAD (100000 / SET LINK IF POINTER AND (77777 DAC* SIGNA / CHARACTER COUNT SNL!CLL JMP NOPOINT LAC* AUTO2 / GET BASE ADDRESS .AND (077777 DAC* (AUTO2 / OF CHARACTER VARIABLE OR ARRAY NOPOINT LAC (700000 JMP MODERX / / / BUFFERS FOR I/O BUFFER .BLOCK 206 / 134 SPACES / ABUFFR .BLOCK 70 / ALLOW 134 CHARACTERS IN 5/7 ASCII / .LOC BUFFER BINBUF .BLOCK 400 / ROOM FOR BINARY I/O AND CORE-TO-CORE / READ/WRITE OF 256 CHARACTERS / / THIS SUBROUTINE SCANS THE IMAGE BUFFER BACKWARDS AND INSERTS A / CARRIAGE RETURN AFTER THE LAST CHARACTER. IT THEN WILL CONVERT / THE IMAGE BUFFER INTO 5/7 ASCII. GLUDEC LAW -1 TAD CCNT JMP CRLOOP / GLUER XX LAC DEVICE SAD (11 /IF THIS IS A CHARACTER DEVICE, WE JMP* GLUER /DON'T DO ANY GLUEING LAC (BUFFER+206-1 / END OF IMAGE BUFFER CRLOOP DAC CCNT LAC* CCNT SAD (SPACE /CHECK FOR NON SPACE JMP GLUDEC IDX CCNT / STEP TO NEXT EMPTY WORD LAC CCNT SAD (BUFFER JMP NLINE / LINE IS EMPTY GJOYN LAC (015 /INSERT CARRIAGE RETURN DAC* CCNT / CHECK THE 1ST CHARACTER FOR CARRIAGE CONTROL LAC BUFFER / GET CARRIAGE CONTROL SAD (ZERO LAC (21 /DOUBLE SPACE SAD (ONE LAC (14 /FORM FEED SAD (PLUS LAC (20 /OVERPRINT SAD (MINUS LAC (22 /TRIPLE SPACE TAD (-40 /ALL CARRIAGE CONTROL CHARACTERS ARE < 40 SMA / SKIP IF CARRIAGE CONTROL LAC (-40+12 /ELSE INSERT LINE FEED TO BE GENERATED TAD (40 /GET CHARACTER OR LINE FEED BACK DAC BUFFER /INSERT IN BUFFER LAC (BUFFER-1 / START AT 1ST CHARACTER DAC* (AUTO3 LAC (ABUFFR+2 JMS SETPUT / SET UP POINTER TO CORRECT ADDRESS NXTCHR LAC* AUTO3 / GET CHARACTER FROM IMAGE BUFFER JMS PUT /INSERT FIRST CHARACTER LAC CHAR /CHECK FOR CARRIAGE RETURN SAD (015 SKP JMP NXTCHR IDX DIGITS /ACCOUNT FOR HEADER WORD PAIR LAC DIGITS /GET WORD PAIR COUNT CLQ!LLS 11 DAC ABUFFR JMP* GLUER / / BUFFER IS EMPTY WANT LINE FEED, SPACE AND CARRIAGE RETURN NLINE IDX CCNT IDX CCNT JMP GJOYN / / THIS SUBROUTINE DOES A SETUP FOR THE PUT SUBROUTINE SETPUT XX DAC POINTS / POINTS TO THE DESTINATION BUFFER DZM DIGITS LAC (LEFT DAC SWING JMP* SETPUT / / THIS SUBROUTINE PACKS CHARACTER FROM THE AC INTO A 5/7 ASCII BUFFER PUT XX DAC CHAR JMP* SWING SWING .DSA LEFT DAC* POINTS JMP* PUT LEFT IDX DIGITS CLQ!LLS 13 JMS SWING CLQ!LLS 4 TAD* POINTS JMS SWING CLQ!LRSS 3 TAD* POINTS DAC* POINTS IDX POINTS LACQ JMS SWING CLQ!LLS 10 TAD* POINTS JMS SWING RCL TAD* POINTS JMS SWING IDX POINTS JMP LEFT / ERR62 LAW 62 / TOO MANY 'NN( . .)' LEVELS IN FORMAT JMP .NERR / / STORAGE OF DEFAULT FORMATS FOR FREE FORMAT OUTPUT FINTGR .ASCII 'I13)' FREAL .ASCII 'E16.7)' FDREAL .ASCII 'D28.16)' FLOGIC .ASCII 'L8)' FCHAR .ASCII 'A256)' / / /STORAGE AREA FOR NUMERIC (A,D,E,F,G,L,I) /SPECIFICATION NCOUNT /REPEAT COUNT NTYPE /SPECIFICATION TYPE NWIDTH /FIELD WIDTH NWIDE / COUNTER FOR FIELD WIDTH NDEC /DIGITS IN D OR S PART NSAVE NCONT2 /2'S COMPLEMENT OF REPEAT COUNT NTYPE2 / / DATA STORAGE TABLE FOR NN(...) TERMS / LEVCNT / NUMBER OF NESTED NN(...) TERMS BRKLIT / CURRENT LOCATION IN TABLE RTABLE .BLOCK 5*LEVELS / / / THE FOLLOWING CONSTANTS ARE USED BY THE SIN, COS AND ATAN / ROUTINES .CS13 2; 647550; 666504 4; 705047; 140010 6; 240732; 326767 7; 145513; 440040 7; 214656; 431467 6; 225357; 471421 .CS1 3; 444176; 325042 / / / MISCELLANEOUS STORAGE / AMODE / SAVE MODE FOR ARRAYS SINCE MODEA GETS BOMBED XR XNUM RNUM BINSW CCNT CHARCT CHARST CHRADR / ADDRESS STORAGE FOR CHARACTER VARIABLE UNIT NUMBER DATEND DEVICE 0 /DEVICE NUMBER FPOINT 0 /POINTER TO FORMAT STRING FREESW IO 0 /DIRECTION OF I/O LETTER LOCATN 0 /COLUMN POINTER TO IMAGE ASCII FILE NUMB PSCALE 0 /P FORMAT SCALING FACTOR SIGNFG 0 /SIGN OF CONSTANT WORDCT BACKLC G M N QQ R SS WI WX CHAR POINTS FLPT1 FLPT2 FLPT3 SZPTR SPOINT SOURCE WORD1 WORD2 WORD4 DWORD3 ELMSIZ .TITLE INTERPRETER ERROR ROUTINE / / / ERROR ROUTINE FOR INTERPRETER OBJECT TIME / / CALLED BY; / LAW N / JMS* .ERROR / / THE NUMBER 'N' DETERMINES THE ERROR CONDITION / / TABLE OF ERROR CODES; / / 0 ARITHMETIC EXPONENT OVERFLOW / 1 ARITHMETIC EXPONENT UNDERFLOW / 2 INTEGER OVERFLOW / 3 STORAGE EXPONENT OVERFLOW / 4 STORAGE EXPONENT UNDERFLOW / 5 DIVISION BY ZERO / 6 NEGATIVE SQUARE ROOT ARGUMENT / 7 ZERO OR NEGATIVE LOGARITHMIC ARGUMENT / 8 COMPLEX VARIABLE STORED IN REAL OR INTEGER VARIABLE / 9 ILLEGAL MODE MIXING IN STORE / 10 ILLEGAL SUBSCRIPT MODE / 11 SUBSCRIPT OUT OF RANGE / 12 NON-INTEGER INDEX IN DO / 13 INCREMENT OF DO EQUALS ZERO / 14 VARIABLE 'N' IN 'RETURN N' OUT OF RANGE / 15 COMPLEX VARIABLES USED WITH RELATIONAL OPERATOR / 16 ILLEGAL MODE IN '**' OPERATION / 17 0**A WHERE A=0 / 18 0**A WHERE A<0 / 19 ONLY ONE ARGUMENT IN MAX OR MIN FUNCTION / 20 INVALID ARGUMENT TYPE IN LIBRARY FUNCTION / 21 ILLEGAL OPERATION COMPILED / 22 CONSTANT ARGUMENT, RETURNED VARIABLE FROM FORTRAN / SUBPROGRAM / 23 INVALID ARGUMENT MATCH BETWEEN CALLER AND CALLED / FORTRAN PROGRAMS / 24 ARGUMENT OF SUBPROGRAM CALL MUST BE CONSTANT, / SIMPLE VARIABLE, OR ARRAY ELEMENT / 25 ATAN2(0.0,0.0), ANSWER SET TO 0.0 / 26 ZERO ARGUMENT,COMPLEX LOG. ZERO RETURNED. / 27 ATTEMPT TO READ A NON-EXISTANT FILE / / THE REST SHOULD BE ADDED AS THEY ARE NEEDED / / FOR EACH ERROR TYPE THERE IS A MICRO-CODED WORD / WHICH TELLS THE ERROR ROUTINE WHAT TO DO ABOUT THE ERROR / / THE FIRST 4 BITS ARE CODED THUS; / / BIT 0 - IGNORE THE ERROR / BIT 1 - LOG THE ERROR AND RETURN / BIT 2 - TYPE ERROR BOMB / BIT 3 - TYPE ERROR NUMBER AND RETURN / BITS 4-17 ARE A LOG FOR CODE BIT 1 / / .ERROR XX AND (007777 / REMOVE THE LAW BITS DAC WHICH /STORE TAD .NLIST /CALCULATE ADDRESS IN ERROR LOG TABLE SMA /IF ERROR NUMBER LARGER THAN TABLE, CLA /POINT AT LAST ENTRY (FATAL ERROR) TAD (.ELIST DAC WHERE /KEEP IT LAC* WHERE SPA!RAL /CHECK FIRST 4 BITS JMP* .ERROR /IGNORE SMA!RAL JMP PERROR / / LOG ERROR AND RETURN / IDX* WHERE JMP* .ERROR / / THE ERROR PRINTING ROUTINES FOLLOW. / ERROR MESSAGE EMESAG 004000 / ROOM FOR HEADERS 000000 .ASCII '**ERROR** ' ENUMB .BLOCK 2 / ROOM FOR NUMBER TO BE INSERTED / / ERROR TRACEBACK MESSAGE TMESAG 015000 / ROOM FOR HEADERS 000000 .ASCII ' PROGRAM WAS EXECUTING LINE ' LINECT .BLOCK 2 / ROOM FOR LINE COUNT TO BE INSERTED .ASCII ' IN ROUTINE '<0><0> PNAME .BLOCK 3 / ROOM FOR PROGRAM NAMES TO BE INSERTED / / / CONVERT ERROR NUMBER / PERROR LAC (ENUMB / ADDRESS OF DESTINATION JMS SETPUT .WAIT ERDV / WAIT IN CASE OF MULTIPLE NON-TRACEBACK ERRORS LAC WHICH / GET ERROR CODE JMS G.CVRT / CONVERT AND PACK LAC (CARAGE JMS PUT .WRITE ERDV,2,EMESAG,4 / / TRACEBACK REQUIRED. CONVERT LINE COUNT AND INSERT PROGRAM NAME LAC TABLE NEWPRG DAC WHICH / ADDRESS OF 1ST WORD OF TABLE TAD (2 DAC CNTADR LAC (LINECT / ADDRESS OF DESTINATION JMS SETPUT / CONVERT AND PACK .WAIT ERDV / WAIT UNTIL BUFFER IS FREE LAC* CNTADR CLL LRS 6 / GET STATEMENT LINE COUNT JMS G.CVRT / CONVERT AND PACK STATEMENT COUNT / NOW GET PROGRAM NAME LAC CNTADR DAC* (AUTO4 LAC* AUTO4 DAC PNAME / INSERT PROGRAM NAME LAC* AUTO4 DAC PNAME+1 LAC* AUTO4 XOR (000320 / INSERT CARRIAGE RETURN DAC PNAME+2 .WRITE ERDV,2,TMESAG,15 LAC* WHICH SZA JMP NEWPRG / / CHECK WHICH EXIT TO TAKE CHKRET LAC* WHERE AND (TYPE SZA JMP* .ERROR JMP STOPX / GO TO STOP PROGRAM IN AN ORDERLY WAY / / / ERROR LOG DUMP/RESET SUBPROGRAM. CALLED VIA / / CALL ERRORP / / TO PRINT ERROR LOG, AND RESET IT TO ALL ZEROS. / ALSO CALLED AT STOP & ERROR EXITS. / MM=100000 NN=10000 / ERRORP XX LAC (1 /PERFORM EQUIVALENT OF INITIAL PART DAC IO /OF .WRITE FOR ISZ IODONE /OUTPUT IF DEVICE -12 JMP ERR35 LAC (ERDV&777 DAC DEVICE LAC (X65 DAC SZPTR /POINTER TO LINE LENGTH / JMS .INTRP /CALL INTERPRETER T S-1 / T 0 / OTABLE 0 COUNT. 0*MM+REMAIN-1 INDEX. 0*MM+WHICH-1 FORM. 7*MM+.FORM-1 CH1. 7*MM+.CH1-1 CH2. 7*MM+.CH2-1 / .FORM 600036; .ASCII "(' ERROR'(T7,6(G4,'('G5,')')))" .CH1 600004; .ASCII 'LOG ' .CH2 600004; .ASCII 'NONE' X65 BUFFER+101-1 /BUFFER SIZE (65 CHARACTERS) / S 74*NN 0 /RETURN TO MACHINE CODE JMP RW5 /AND CONTINUE .WRIT FROM RW5 FORM.-T /FORMAT 74*NN 0 /ENTER MACHINE CODE TO JMP FUDGE /SET UP ERROR LOG SCAN 60*NN CH1.-T / .SINGL /PATH IF NO 60*NN CH2.-T / .SINGL /ERRORS HAVE 61*NN 0 / .FINIS /BEEN LOGGED 76*NN 1 / RETURN / LS 60*NN INDEX.-T / .SINGL /PATH IF 60*NN COUNT.-T / .SINGL /LOGGED 74*NN 0 /RETURN TO M/C /ERRORS JMP CONTN /AT CONTN /EXIST 61*NN 0 / .FINIS 76*NN 1 / RETURN / FUDGE LAC (LIST /POINT AT ERROR LIST DAC WHERE DZM WHICH /SET ERROR # TO 0 AGAIN LAC* WHERE SNA JMP* .NEXT /END-OF-LIST. RETURN TO INTERP. AND (37777 SZA /CHECK FOR ERROR COUNT JMP FOND /FOUND ONE CONTN IDX WHERE /INCREMENT TABLE POINTER IDX WHICH /INCREMENT ERROR NUMBER JMP AGAIN / FOND DAC REMAIN /ERROR COUNT XOR* WHERE DAC* WHERE /RESET COUNT TO ZERO LAC (LS-1 DAC* (AUTO1 /SIMULATE A 'GOTO' JMP* .NEXT /TO LOCATION 'LS' / .EJECT / / THIS SUBROUTINE CONVERTS A 4 DIGIT OCTAL NUMBER FROM THE AC, INTO / A DECIMAL 5/7 ASCII AND STORES THE RESULT IN THE BUFFER SET UP / FOR THE PUT SUBROUTINE. / G.CVRT XX DAC REMAIN / STORE NUMBER LAC DIVEND DAC* (AUTO4 NXTDIV LAC* AUTO4 SAD DIVEND JMP* G.CVRT / DAC DIVIDE LAC REMAIN GS!IDIV DIVIDE XX DAC REMAIN LACQ TAD (60 JMS PUT JMP NXTDIV / DIVISR 1750 / DECIMAL 1000 144 / DECIMAL 100 12 / DECIMAL 10 1 / DECIMAL 1 DIVEND DIVISR-1 / IGNORE=400000 LOG=200000 BOMBIT=100000 TYPE=040000 / / REMAIN WHERE WHICH CNTADR EXPSW / .EJECT / THE FOLLOWING LIST DESCRIBES THE ACTION TO BE TAKEN FOR EACH ERROR. .NLIST LIST-.ELIST LIST TYPE / ERROR 0 LOG / 1 TYPE / 2 TYPE / 3 LOG / 4 TYPE / 5 TYPE / 6 TYPE / 7 TYPE / 8 BOMBIT / 9 BOMBIT /10 BOMBIT /11 BOMBIT /12 BOMBIT /13 BOMBIT /14 BOMBIT /15 BOMBIT /16 BOMBIT /17 TYPE /18 TYPE /19 BOMBIT /20 BOMBIT /21 BOMBIT /22 BOMBIT /23 BOMBIT /24 TYPE /25 TYPE /26 TYPE /27 .ELIST 0 /END OF LIST MARKER - ALL FATAL ERRORS POINTED HERE .END