File SNOBOL.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

puFsNtPq=nHNty=~H@NtR5vL_NtBL3B*NtMM1URy	sCBYt	0gE:NtLT4NvLzCtNNvLkOu@NvLkNtR5gE}p/SNOBOL-8.2 RUN TIME SYSTEM.   AUGUST 29, 1976




/   THIS IS THE BACKBONE OF THE SNOBOL-8.2 LANGUAGE. ALL USER
/COMMANDS ARE TURNED INTO CALLS TO THIS PROGRAM USING SUB-
/SEQUENT WORDS TO PASS ARGUMENTS.
/
/
/   THIS LANGUAGE IS DESIGNED TO RUN UNDER AN 8K OS/8 SYSTEM.
/IT UTILIZES THE FILE STRUCTURE FOR DATA FILES (EDITOR FORMAT
/AND COMPATABLE).  SNOBOL-8.2 IS DESIGNED TO BE AS CLOSE TO
/SNOBOL-3 (BELL TELL) AS POSSIBLE.  THE MAJOR DIFFERENCES
/OCCUR WITH THE I/O COMMANDS.  FOR EXAMPLE:   THE COMMAND
/SEQUENCE:  ".LOOKUP FILENAME";  WHERE 'FILENAME' IS THE NAME
/OF A FILE ON DEVICE 'DSK'; WILL PEPARE THAT FILE FOR 'READ'
/OPERATIONS.
/
/    THE SECOND MAJOR DIFFERENCE IS THE ABSENCE OF COMPLEX ARITH-
/METIC STATEMENTS FROM THE LANGUAGE.  THIS IS PARTIALLY OFFSET BY
/THE ABILITY TO USE STANDARD PAL-8 CODE ANYWHERE IN THE SNOBOL
/PROGRAM.  BECAUSE STRINGS CAN CONTAIN NUMERALS, THS PROGRAM
/SUPPLIES ROUTINES TO CONVERT VARIABLES TO BINARY NUMBERS AND
/VICE-VERSA (IN BASE 'BASE').
/
/     FOR A FULL DESCRIPTION, PLEASE SEE THE SNOBOL-8.2 USER'S
/MANUAL, CONTAINED IN THE NETWORK PROGRAM SNOUSER.DC.



*0
	DECIMAL
	51		/VERSION NUMBER
	OCTAL

/ PAGE LAYOUT - FIELD 0 /PAGE NAME AND COMMENTS TOTAL SIZE /==== ==== === ======== ===== ==== /2600 INIT (3) 60 / PAT-PATDT (2) 113 (0) /3000 PAT10-PAT28 (7) 171 (0) /3200 PAT30 - PAT44 (10) 166 (2) /3400 PAT46 - PAT66, PATSER (12) 161 (5) /3600 PATSR - UPDBAS 63 / XL1: INDRCT (2) 111 (2) /4000 OPIN, OPOUT (15) 160 (3) /4200 PUSH(J), POP(J), CLOUT (6) 126 / XL2: FNDSP 43 (1) /4400 CLIN, ACCEPT (13) 162 (3) /4600 READH, WRITH (4) 172 (2) /5000 WRCHR & GTCHR (1) 173 (4) /5200 PUTVR - PUT12 (4) 174 (0) /5400 PUT10, LNKVAR, CLVAR, CLRVAR (1) 161 (16) /5600 UPDPTR, FILEDC (5) 152 / XL3: RETLFX, GPTRX (1) 14 (4) /6000 ASC, INT (3) 173 (2) /6200 UPDFUN, PRN, INTTST, CLPRN, RJST / LJST, USRLOK, USRDIS, RTSER (6) 167 (3) /6400 PUTSPF, UPDIFN, STORAGE 173 (5) IDVHAN=6600 /INPUT HANDLER ODVHAN=7200 /OUTPUT HANDLER BUFLEN=400 /FIELD 1 BUFFERS IBUF=200 OBUF=IBUF+BUFLEN
*10 INDEX0, 0 INDEX1, 0 INDEX2, 0 INDEX3, 0 INDEX4, 0 INDEX5, 0 INDEX6, 0 INDEX7, 0 *30 ARGCNT, 0 OCNT, 0 PATBAS, 0 PATSTS, 0 PDL, 0 TOPP, 0 TOPX, 0 INDR, 0 /ADDRESS OF INDIRECT TABLE IN FIELD 1 P1, 0 /PATTBL POINTER FOR PAT H1, 0 /HOLD VALUE THROUGH SPFUN CALLS T2, 0;0 /TEMPORARY STORAGE T3, 0 T4, 0;0 TX, 0 /EXTREMELY TEMPORARY STORAGE TXX, 0 SERX3, 0 /FOR PATSER SERX4, 0 PXT1, 0 /FOR pUTVAR PXT4, 0 XPTR, 0;0 IPTR, 0;0 OPTR, 0;0 INBLK, 0 INLEN, 0 IOFLG, 0 IHAN, 0 OHAN, 0 OUTBLK, 0 OUTLEN, 0 OUTLN, 0 ODEVNM, 0 RDFLG, 0 /READING FROM FILE FLAG (READH)
/ NEGATIVE CONSTANTS NONE= CLA CLL CMA NTWO= CLA CLL CMA RAL NTHREE= CLA CLL CMA RTL NC1, -1 NC3, -3 NC4, -4 NC5, -5 NC7, -7 NC10, -10 NC20, -20 NC215, -215 / POSITIVE CONSTANTS NOP= 7000 ZERO= CLA CLL ONE= CLA CLL IAC TWO= CLA CLL IAC RAL THREE= CLA CLL IAC CML RAL FOUR= CLA CLL IAC RTL SIX= CLA CLL CML IAC RTL C1, 1 C3, 3 C4, 4 C5, 5 C7, 7 C77, 77 C212, CLF, 212 C215, 215 C240, 240 C377, 377 C3777, 3777 C4000, ANCH, 4000 C5777, 5777 C7400, 7400
/ ROUTINE CALLING LINKS GPTR, GPTRX INTST, INTTST /TEST FOR <CTRL>C INTFIN, INTFN /ADDRESS TO RETURN FROM INTST LJUST, LJST /LEFT JUSTIFY ROUTINE LNKVAR, LNKVR /CREATE A LINK FOR VARIABLE STORAGE LUSR, 200 /USR ADDRESS WHEN LOCKED OUTBUF, OBUF /ADDRESS OF OUTPUT BUFFER PATSER, PATSR /SEARCH ROUTINE FOR PAT PATTBL, PATBL /PATTERN MATCHING TABLE PDLIST, PDLST /PUSHDOWN LIST RETLF, RETLFX RJUST, RJST UPDSPF, UPDFUN /UPDATE THE SPECIFIED INPUT FUNCTION USR, 7700 /NORMAL ADDRESS OF THE USR VARTBL, VARTB /PATTERN MATCHING TABLE / INTERNAL CALLING TABLE (ACCESSIBLE TO USER PROGRAMS) ICLTAB, CLRVAR, CLRVR /CLEAR VARIABLE ROUTINE CLVAR, CLVR /CLOSE VARIABLE ROUTINE FNDSPC, FNDSP /FIND SPACE IN VAR AREA ROUTINE GETCHR, GETCH /GET A CHAR ROUTINE PUTLST, PLST /ARGUMENT LIST FOR PUTVAR PUTVAR, PUTVR /HANDLE STRING ASSIGNMENT TO VARIABLES T1, 0 /(XXPVR) TEMP AND PUTVAR NAME PARAM SVSPCH, 0 /SAVE SPECIAL CHARACTERS ON INPUT IF -1 TOP, 0 WRCHAR, WRCHR /WRITE A CHARACTER TO OUTPUT
*154 /LOCATION TO CONTINUE PROGRAM AFTER A CONTROL C TLS /SET PRINTER FLAG JMP I INTFIN /RETURN FROM INTST *156 /CALLING TABLE INIT PUSHJ POPJ PUSH POP OPIN OPOUT CLIN CLOUT PAT ASC INT BASE, 12 /IS 10 (10) INDRCT ICLTAB DEVI FILSIZ, 0 / SPECIAL FUNCTION DEFINITIONS INPUT= 20 READ= 21 OUTPUT= 22 OUTHOL= 23 WRITE= 24 WRITEH= 25 POSR= 26 *177 / SUCCESS-FAIL FLAG SUCCES, 0
*2600 INIT, 0 ZERO TAD I INIT /GET LOC OF INDIRECT TABLE DCA INDR ISZ INIT TAD I INIT /GET FIRST VARIABLE PTR LOC DCA T1 ISZ INIT TAD I INIT /GET LENGTH OF PTR TABLE DCA T2 ISZ INIT TAD I INIT /GET TOP IN FIELD 1. DCA TOP TAD TOP DCA TOPP DCA SUCCES DCA RTSERR DCA SVSPCH /CLEAR SAVE SPECIAL CHARACTER FLAG DCA RDFLG /CLEAR READING FROM FILE FLAG DCA IOFLG /CLEAR FILES FLAG DCA PDL /CLEAR PDP TAD (17 DCA INDEX1 TAD NC10 DCA TX DCA I INDEX1 /CLEAR FUNCTION VARIABLES ISZ TX JMP .-2 NONE DCA POSR /SET POSR TAD T2 SNA /ANY VARIABLES? JMP INIT1 CMA IAC DCA T3 NONE TAD T1 DCA INDEX1 INITL1, DCA I INDEX1 /CLEAR VARIABLE POINTERS ISZ T3 /ARE WE DONE? JMP INITL1 /NO, GO AGAIN INIT1, DCA OCNT TLS /SET PRINTER FLAG. CIF 10 JMS I USR 13 /RESET ISZ INIT /SKIP RETURN JMP I INIT /AND DONE
/ THIS IS THE PATTERN MATCHING ROUTINE. PAT, 0 ZERO JMS I INTST /TEST FOR INTERRUPT TAD I PAT AND ANCH DCA PATSTS /SAVE STATUS BIT TAD I PAT AND C3777 CMA IAC DCA ARGCNT /NEG NUMBER OF WDS TAD ARGCNT DCA P1 ISZ PAT TAD I PAT /GET BASE STRING DCA H1 TAD H1 JMS I UPDSPF /UPDATE POSSIBLE SPECIAL FUNCTION JMP PATFL /FUNCTION FAILED TAD I H1 /GET THE VARIABLE POINTER DCA PATBAS DCA TOPX /USED WITH DEL NTWO TAD PATTBL DCA INDEX0 DCA I INDEX0 /CLEAR PATTBL-1 DCA I PATTBL /CLEAR FIRST LOC OF PATTBL TAD PATTBL /PTR TO MAIN TABLE DCA INDEX0 TAD PAT DCA INDEX5 /PTR TO ARG LIST
PAT0, TAD I INDEX5 /LOOP TO SETUP PATTBL - GET ARG DCA TX TAD TX AND NC10 SZA CLA /VARIABLE? JMP PAT4 /YES PAT2, TAD TX /GET BACK ARG DCA I INDEX0 /AND SAVE IN TABLE TAD TX /GET WHAT WE JUST COPIED TAD NC4 SNA CLA /NEWVAR? JMP PAT6 /YES, THEN IGNORE LENGTH WD ISZ P1 /DONE? JMP PAT0 /NO JMP PAT8 PAT4, TAD TX JMS I UPDSPF /POSSIBLY UPDATE INPUT FUNCTION JMP PATFL /FUNCTION FAILED TAD C5 /CODE FOR VAR DCA TX JMP PAT2 PAT6, TAD I INDEX5 /GET THE LENGTH WORD DCA TX /SAVE IT ISZ P1 /FOR NEWVAR WD JMP PAT2 PAT8, DCA I INDEX0 /LAST LOC IN PATTBL MUST BE ZERO
/ ENTER WITH PATSTS, PATTBL, AND ARGCNT SET. NONE TAD VARTBL /PTR FOR BACKUP TABLE DCA INDEX3 ISZ P1 /DISP FOR PATTBL (T1 WAS ZERO) TAD PATBAS DCA T2 /BASPTR ONE DCA T2+1 /CHAR 1 TAD PATDT /FOR DISP IN DISPATCH TABLE JMP PAT14 / DISPATCH TABLE PATDT, .+1 PAT44 /(1) DELETE CODE ("=") RTSER3 /(2) OR CODE ("!") PAT12 /(3) NO BACKSPACE ("<") PAT12+1 /(4) NEW VAR ("*---*") PAT16 /(5) VARIABLE RTSER3 /(6) UNASSIGNED RTSER3 /(7) UNASSIGNED RTSER3 /(0) UNASSIGNED (ALWAYS SHOULD BE) PAGE
/ HERE FOR "NO BACKSPACE" - JUST RESET THE VARTBL PTR BACK / TO THE BEGINNING. PAT10, NONE TAD VARTBL DCA INDEX3 /POINT TO THE START. / HERE FOR THE REGULAR MATCHING LOOP. PAT12, ISZ P1 /INC DISP FOR PATTBL /*** THIS SHOULD BE KEPT FIRST ZERO TAD PATDT2 PAT14, DCA TXX TAD P1 TAD PATTBL DCA TX NONE TAD I TX AND C7 /GET CODE (MINUS 1 WITH WRAPAROUND) TAD TXX /DISPATCH TABLE DCA TX TAD I TX DCA TX /GET ADDRESS OF HANDLER JMP I TX PATDT2, .+1 PAT20 /(1) DELETE PAT28 /(2) OR PAT10 /(3) NO BACKUP PAT34 /(4) NEW VAR PAT18 /(5) VAR RTSER4 /(6) UNASSIGNED RTSER4 /(7) UNASSIGNED PATSCS /(0) SPECIAL - END OF ARG LIST PAT16, TAD PATSTS SNA CLA /ANCHOR MODE? JMP PAT32 /NO - MUST FAKE "**" AT BEGINNING
/ HERE FOR THE VARIABLE SEARCH. PAT18, TAD T2 DCA T4 TAD T2+1 DCA T4+1 TAD P1 /GET PATTBL DISP TAD PAT /FIND REAL LIST JMS I GPTR /GET PTR TO DATA SNA JMP PAT12 DCA T3 JMS I PATSER /CALL SEARCH ROUTINE T2 /BASE STRING T3 /STRING TO CHECK FOR JMP PAT46 /ERROR RETURN - BACKUP OR CHECK OR JMS I LJUST /LEFT JUSTIFY # OF CHARS TAD C5 /CODE FOR VAR DCA T3 TAD P1 /GET DISP TAD PATTBL DCA TX TAD T3 DCA I TX JMP PAT12 /MATCHED - ALL'S WELL / HERE FOR DEL - DELETE MATCHING AREA FROM STRING AND /DO REPLACEMENT. PAT20, TAD T2 DCA PAT20X /SAVE BASPTR TAD T2+1 DCA PAT20X+1 TAD P1 DCA PAT20Y /SAVE DISP ISZ TOPX /FLAG JMP PATSCS /OTHERWISE, SUCCESS
/RETURN HERE ON SUCCESS TO HANDLE DELETE PAT22, TAD PAT20X DCA T2 /REPLACE BASPTR TAD PAT20X+1 DCA T2+1 TAD PAT20Y DCA P1 /AND DISP NONE TAD PUTLST DCA INDEX1 NONE TAD PATTBL /PTR TO OUR TABLE DCA T3 TAD I T3 /GET FIRST ELEMENT / (NEWVAR FROM NON-ANCH) SNA /ANYTHING THERE? JMP PAT24 /NO - DELETE FROM BEGINNING JMS I RJUST /RIGHT JUSTIFY CMA IAC /TWO'S COMPLEMENT THE # OF CHARS CLL RTL /B0 WILL BE 0, B1 WILL BE 1 / ROTATED: -LEN; CHAR 1 ISZ INDEX1 DCA I INDEX1 /AND -LENGTH (CHAR 1) TAD PATBAS /AND GET BASPTR TOO DCA I PUTLST PAT24, ISZ P1 /TO LOOK AT THE NEXT ARG TAD PATTBL TAD P1 DCA TXX TAD I TXX SNA CLA JMP PAT26 /ALMOST ALL DONE TAD PAT /GET REAL ARG LIST TAD P1 /GET DISP JMS I GPTR /GET REAL PTR DCA I INDEX1 ONE DCA I INDEX1 /ALL OF IT JMP PAT24
PAT26, TAD T2 DCA I INDEX1 /REST OF BASSTR TAD T2+1 DCA I INDEX1 /REST. NONE DCA I INDEX1 /END OF LIST TAD PAT DCA TXX TAD I TXX DCA T1 /VARPTR JMS I PUTVAR JMP PATFL /ERROR WRITiNG VARIABLE - FAIL JMP PAT60 /DONE - SUCCESS PAT20X, 0;0 /FOR BASPTR PAT20Y, 0 /FOR DISP / HERE ON "!" (OR). SET VARTBL AND SET T1 TO AFTER OR'S PAT28, ONE TAD P1 /DISP + 1 FOR VARTBL (VAR) DCA I INDEX3 TAD T2 DCA I INDEX3 /SAVE BASPTR TOO TAD T2+1 DCA I INDEX3 /CHAR CNT TOO JMP I (.&7600+200 /***PAGE BOUNDS PAGE
PAT30, ISZ P1 /UPDATE TAD P1 TAD PATTBL DCA INDEX1 NTWO TAD I INDEX1 /GET THIS WD SZA CLA /OR? JMP PAT12 /NO, CONTINUE ISZ P1 /REALLY UPDATE /(PAT5 INC'S T1) JMP PAT30 /YES, TRY NEXT /HERE IF NON-ANCH MODE AND VAR STARTS (FAKE ** AT BEGINNING) PAT32, NONE DCA P1 /POINT TO PATTBL-1 / HERE FOR *---*. MUST BE FOLLOWED BY VAR OR POSR UNLESS AT END. PAT34, ISZ P1 /POINT TO LENGTH WD SKP JMP PAT36 /P1:=0 I.E. FAKING ** TAD P1 TAD I (PAT DCA TXX TAD I TXX /GET LENGTH FROM ARG LIST SZA /TEST FOR */##* JMP PAT64 /YES ISZ P1 /POINT TO NEWVAR NAME PAT36, TAD P1 DCA INDEX4 /SAVE PTR TO NEWVAR DCA INDEX7 /CNT PAT37, ONE TAD INDEX4 TAD PATTBL DCA TXX TAD I TXX /GET NEWVAR CODE + 3 AND C7 /GET CODE TAD NC5 SZA /VAR CODE? JMP PAT40
/LOOP TO FIND A MATCH IN THE BASE STRING fOR THE VARIABLE FOLLoWING THE /NEWVAR IN THE PAtTERN (I.E. THE LIMIT OF THE FILLER). PAT38, ONE TAD INDEX4 TAD PAT /GET REAL VARPTR JMS I GPTR DCA T3 /PTR FOR SEARCH TAD T2 DCA T4 /SAVE BASPTR TAD T2+1 DCA T4+1 JMS I PATSER /MATCH? T4 T3 SKP /NO MATCH JMP PAT42 /MATCH - DONE TWO TAD INDEX4 TAD PATTBL DCA TXX NTWO TAD I TXX /GET VAR+1 SZA CLA /OR? JMP PAT62 /NO ISZ INDEX4 ISZ INDEX4 /UPDATE LIST PTR JMP PAT38 /TRY AGAIN
/ HERE TO BACKTRACK / /THE TABLE IS MADE UP OF THREE WORD BLOCKS: / 1. THE FIRST IS THE DISPLACEMENT AT WHICH THE OR OCCURRED (+1) / I.E. IT POINTS TO THE VAR AFTER THE OR. / 2. THE SECOND IS BASPTR (AS IT WAS THEN). / 3. THE THIRD IS THE CHAR COUNT OF BASPTR PATBAK, ZERO TAD INDEX3 CMA TAD VARTBL SNA CLA /TBL EMPTY? JMP PATFL /YES - FAIL UTTERLY NTHREE TAD INDEX3 DCA INDEX3 /DECREMENT PTR TAD INDEX3 DCA INDEX1 TAD I INDEX1 /GET OLD DISP DCA P1 TAD I INDEX1 /AND BASPTR DCA T2 TAD I INDEX1 DCA T2+1 NTHREE TAD P1 TAD PATTBL DCA INDEX1 TAD I INDEX1 /LOOK AT (PTR)-2 TAD NC4 SNA CLA /NEWVAR? JMP PATB1 /YES NTWO TAD P1 DCA TXX TAD I TXX /GET VAR BEFORE THE OR AND C7 /MASK OFF LENGTH DCA I TXX /AND REPLACE JMP PAT18 /AND GO PATB1, TAD I INDEX1 /GET LENGTH WD JMS I RJUST DCA INDEX7 /SAVE JMP PAT62 /AND GO
PAT40, TAD C3 /HERE WHEN FILLER NOT TERmINATED BY A VAR SPA CLA /EQUAL CODE OR END Of LIST? JMP PAT66 /YES - MATcH ALL THEN, eLSE MATCH NONE PAT42, ZERO /HERE ON ALMOST DONE WITH NEWVAR TAD P1 /GET DISP DCA I INDEX3 /FOR BACKUP TAD T2 /AND BASPTR DCA I INDEX3 / TAD T2+1 DCA I INDEX3 NONE /POINT TO LENGTH WD TAD P1 TAD PATTBL DCA TX TAD INDEX7 /GET CNT JMS I LJUST /LEFT JUSTIFY DCA I TX JMP PAT12 PAT44, NONE / HERE FOR DEL FIRST TAD PUTLST DCA INDEX1 DCA T2 /DON'T COPY BASPTR JMP PAT24 /GO PAGE PAT46, ONE / HERE IF VAR MATCH OR POSR MISSED TAD P1 TAD PATTBL DCA TX NTWO TAD I TX /GET (VAR)+1 SZA /TEST OR JMP PATBAK /NO GOOD - DO BACKUP ISZ P1 ISZ P1 /OR IS NEXT, POINT PAST IT TAD T4 DCA T2 /REPLACE BASPTR TAD T4+1 DCA T2+1 JMP PAT12+1 /GO
/ SUCCESS!! SET FLAG, SET RETURN LOC, SET NEWVARS, / AND DO REPLACEMENT. PATSCS, TAD PATBAS DCA T2 /RESET BASPTR ONE DCA T2+1 NONE TAD PATTBL DCA TX TAD I TX /GET NON-ANCH VAR NEWVAR WD SNA JMP PAT48 JMS I RJUST /RIGHT JUSTIFY JMS UPDBAS /UPDATE BASPTR JMP RTSER5 /SHOULDN'T FAIL PAT48, DCA P1 /POINT TO FIRST REAL ENTRY (-1) PAT50, ISZ P1 TAD P1 TAD PATTBL DCA TX TAD I TX AND C7 /GET CODE SNA /DONE? JMP PAT58 TAD NC4 /TEST NEWVAR SNA /? JMP PAT54 /YES TAD NC1 /TEST VAR (CODE 5) SZA CLA /? JMP PAT50 /NO, GO AGAIN PAT52, TAD I TX /GET WD AGAIN JMS I RJUST /RIGHT JUSTIFY SNA /ANY UPD? JMP PAT50 /NO JMS UPDBAS /YES, UPDATE BASPTR JMP RTSER6 /MUST JMP PAT50
PAT54, ISZ P1 /POINT TO LENGTH WD ISZ P1 /POINT TO NEWVAR NAME ISZ TX TAD PAT TAD P1 DCA TXX TAD I TXX /GET PTR SNA CLA /NULL? JMP PAT52 TAD PUTLST DCA INDEX1 TAD I TX /GET BACK WD JMS I RJUST /RIGHT JUSTIFY # OF CHARS DCA T3 /SAVE FOR UPD LATER TAD T3 SNA /ANY LENGTH? JMP PAT56 CMA IAC CLL RAL CLL RAL TAD T2+1 DCA I INDEX1 /SAVE -LENGTH TAD T2 /BUFADR JMP .+2 PAT56, DCA I INDEX1 DCA I PUTLST NONE DCA I INDEX1 /END. TAD I TXX /GET VARPTR DCA T1 JMS I PUTVAR JMP PATFL /ERROR REtURN FOR WRITE TAD T3 /GET LENGTH JMP PAT52+2 /UPD BASPTR
PAT58, TAD TOPX SZA CLA /DELETE SEEN? JMP PAT22 /YES - DO IT PAT60, SKP CLA /SET FOR SUCCESS PATFL, NONE /SET FOR FAIL DCA SUCCES TAD ARGCNT CMA IAC /COMPUTE DISP FOR RETURN TAD PAT DCA INDEX1 JMP I INDEX1 /DONE. PAT62, JMS I GETCHR /UPD BASPTR T2 JMP PATBAK /CAN'T - BACKUP ISZ INDEX7 /INC CNT ZERO TAD P1 DCA INDEX4 /RESET PTR JMP PAT37 /TRY AGAIN PAT64, JMS I RJUST /HERE ON *---/##* JMS UPDBAS /UPDATE BASPTR JMP PATBAK /NO GOOD ISZ P1 JMP PAT12 /DONE (PATTBL SHOULD BE SET) PAT66, JMS I GETCHR /hERE FOR FILLeR TO MATCH ALL T2 JMP PAT42 ISZ INDEX7 /INC COUNT JMP PAT66 PAGE
/ SEARCH ROUTINE. SEARCH (CALL)+1 FOR (CALL)+2 BEGINNING / IMMEADIATLY. THE PTR REFERRED TO BY (CALL)+1 IS UPDATED, / AND THE LENGTH OF (CALL)+2 IS RETURNED IN AC ON SUCCESS. PATSR, 0 TAD I PATSR /GET LOC OF BASPTR DCA SERX1 ISZ PATSR TAD PATSR /GET LOC OF MATCH PTR JMS I GPTR /GET MATCH PTR IAC SNA /POSR? (HAS POINTER OF NEGATIVE ONE) JMP SER4 TAD NC1 /NO - RESTORE DCA SERX2 ONE DCA SERX2+1 DCA SERX3 /CHAR CNT SER1, JMS I GETCHR /GET NEXT MATCH CHAR SERX2 JMP SER2 /ERROR RETURN - SUCCESS CMA IAC DCA SERX4 /SAVE (NEG) CHAR JMS I GETCHR /GET NEXT BASE CHAR SERX1, 0 JMP SER3 /ERROR RETURN - FAIL TAD SERX4 SZA CLA /MATCH? JMP SER3 /NO - FAIL ISZ SERX3 /YES - INC CNT JMP SER1 /TRY NEXT SER2, TAD SERX3 /GET CHAR CNT ISZ PATSR /TO SKIP SER3, ISZ PATSR /HERE TO FAIL JMP I PATSR SER4, TAD SERX1 /HERE ON POSR DCA SERX5 JMS I GETCHR /TRY TO GET BASE CHAR SERX5, 0 JMP SER2+1 /SUCCEED IF CANNOT ZERO JMP SER3 /OTHERWISE FAIL SERX2, 0;0
/ ROUTINE TO INCREMENT BASPTR BY C(AC). UPDBAS, 0 CMA IAC DCA UPDX /NEG CNT UPDB1, JMS I GETCHR T2 /BASPTR JMP I UPDBAS /FAIL - NON-SKIP RETURN ISZ UPDX /DONE? JMP UPDB1 /NO - GO AGAIN ISZ UPDBAS /YES - SET TO SKIP ZERO JMP I UPDBAS /AND RETURN UPDX, 0 XL1=. /PAGE ADDRESS LINK FOR INDRCT PAGE
/THIS ROUTINE OPENS THE SPECIFIED FILE ON DEVICE IDEV FOR INPUT. / CALL: JMS OPIN; VAR OPIN, 0 ZERO TAD (IFILNM-1 DCA INDEX0 TAD I OPIN /PTR TO VAR JMS FILEDC /DECODE NAME JMP OPINFL+1 /BAD NAME TAD DEVI DCA OPIH1 TAD DEVI+1 /GET 2ND WORD OF DEVICE NAME DCA OPIH1+1 /SAVE IT TAD (IDVHAN IAC /ALLOW TWO PAGE HANDLERS DCA OPIH2 JMS USRLOK /LOCK THE USR IN CORE CIF 10 JMS I LUSR 1 /FETCH THE HANDLER OPIH1, DEVICE XXXX OPIH2, 0 /HANDLER ADDRESS JMP OPINFL /FAIL TAD OPIH2 /GET ST ADR OF HANDLER DCA IHAN TAD (IFILNM DCA OPIL1 TAD OPIH1+1 /GET DEVICE NUMBER CIF 10 JMS I LUSR 2 /LOOKUP THE FILE OPIL1, 0 /FILENAME OPIL2, 0 /LENGTH GOES HERE JMP OPINFL /FAIL - FILE NOT FOUND
JMS USRDIS /DISMISS THE USR TAD OPIL1 /GET STARTING BLK NUMBER DCA INBLK TAD OPIL2 /GET LENGTH SNA /ANY LENGTH? ONE /NO - ASSUME NON-DIR DEVICE TAD NC1 DCA INLEN /CONTAINS -LEN - 1 TAD . />1200 - CAUSES READ TO GET A BUFFER DCA IPTR /PTR TO INPUT BUFFER TAD IOFLG AND C1 TAD C4000 /INPUT FILE FLAG DCA IOFLG /INPUT FILE READY OPIN1, DCA SUCCES /SET SUCCESS FLAG ISZ OPIN /SKIP JMP I OPIN /AND DONE OPINFL, JMS USRDIS NONE /HERE ON LOOKUP ERROR JMP OPIN1 /FAIL AND BACK
/THIS ROUTINE OPENS THE SPECIFIED FILE FOR OUTPUT ON DEVICE ODEV. / CALL: JMS OPOUT; VAR OPOUT, 0 ZERO TAD (OFILNM-1 DCA INDEX0 TAD I OPOUT JMS FILEDC /DECODE NAME JMP OUTFL+1 /BAD NAME TAD DEVO DCA OPOH1 TAD DEVO+1 DCA OPOH1+1 /SAVE WD TAD (ODVHAN IAC /ALLOW TWO PAGE HANDLERS DCA OPOH2 JMS USRLOK /GET THE USR CIF 10 JMS I LUSR 1 /GET THE HANDLER OPOH1, DEVICE XXXX OPOH2, 0 /HANDLER ADDRESS JMP OUTFL TAD OPOH1+1 /GET DEVICE NUMBER DCA ODEVNM TAD OPOH2 DCA OHAN /ST ADR OF HANDLER TAD (OFILNM DCA OPOO1 TAD FILSIZ /GET SIZE (0 IF UNDEF) JMS I LJUST TAD ODEVNM CIF 10 JMS I LUSR 3 /OPEN AN OUTPUT FILE OPOO1, 0 /FILENAME OPOO2, 0 /AVAILABLE LENGTH JMP OUTFL
JMS USRDIS /DISMISS USR TAD OPOO1 DCA OUTBLK /STARTING BLOCK NUMBER TAD OPOO2 SNA /ANY AVAIL? ONE /NO - ASSUME NON-DIR DEVICE DCA OUTLEN DCA OUTLN /CNT OF HOW MANY BLKS ARE USED TAD OUTBUF DCA OPTR /FOR PTR ONE DCA OPTR+1 TAD IOFLG AND C4000 TAD C1 /OUTPUT FILE FLAG DCA IOFLG OUT1, DCA SUCCES /SET SUCCES FLAG ISZ OPOUT JMP I OPOUT OUTFL, JMS USRDIS NONE /FAIL JMP OUT1 PAGE
/ PUSHDOWN LIST ROUTINES. THESE ROUTINES PERFORM MANIPULATION OF AN INTERNAL /STACK VIA THE LANGUAGE CONSTRUCTS PUSH, PUSHJ, POP AND POPJ. PUSHJ AND POPJ /ARE CONTROL CONSTRUCTS, AND PUSH AND POP ARE CONSTRUCTS THAT MAY BE USED TO /PRESERVE VARIABLES ON THE STACK. PUSH, 0 CLA CLL CML /MARK VARIABLE STORE ENTRY JMP .+3 PUSHJ, 0 CLA CLL TAD PDL TAD (-41 SMA CLA /SPACE LEFT? JMP RTSER0 /NO - OVERFLOW TAD PDLIST TAD PDL DCA TX ISZ PDL /UPDATE PDP SZL /PUSH? JMP PUSH1 /YES ONE TAD PUSHJ /GET WHERE TO RETURN TO DCA I TX /SAVE IN PDLIST TAD I PUSHJ /GET WHERE WE'RE GOING DCA TX JMP I TX /AND GO. PUSH1, TAD PUSH JMS I GPTR /GET THE VARIABLE POINTER DCA I TX /SAVE IT DCA I TXX /CLEAR THE VARIABLE (GPTR SETS TXX) ISZ PUSH JMP I PUSH /DONE
/ POPJ RETURNS CONTROL TO THE POINT IMMEDIATELY FOLLOWING THE PREVIOUS /PUSHJ. POP NAME GIVES NAME THE VALUE CONTAINED BY THE TOP ELEMENT OF THE /STACK. NOTE THAT NO TESTS ARE MADE - IF THE TOP ELEMENT IS NOT A VARIABLE /POINTER, UNDETERMINED RESULTS WILL OCCUR. POP, 0 CLA CMA CLL CML JMP .+3 POPJ, 0 CLA CMA CLL TAD PDL /(LINK NOW COMPLEMENT) SPA /ANYTHING IN LIST? JMP RTSER1 /NO DCA PDL /YES, DECREMENT PDP TAD PDL TAD PDLIST JMS I GPTR /SAVE WHERE TO GO IN TXX SZL CLA /POP OR POPJ? JMP I TXX /POPJ - JUMP TO THE ADDRESS TAD I POP /GET THE VARIABLE DCA TX TAD TXX /GET THE POINTER DCA I TX /PUT IN THE VARIABLE ISZ POP JMP I POP /GO BACK
/ ROUTINE TO CLOSE THE OUTPUT FILE. THIS CONSISTS OF /CLEARING THE FLAG, WRITING THE (PARTIAL) OUTPUT BUFFER /AS THE LAST BLOCK, AND THEN CALLING THE USR TO DO FINAL /DIRECTORY CLEANUP. CLOUT, 0 ZERO TAD IOFLG RAR SNL CLA /OUTPUT FILE OPEN? JMP CLOUTFL /NO - FAIL TAD (232 /CONTROL Z - END OF FILE JMS WRITH /WRITE IT JMP CLOUTFL TAD IOFLG AND C4000 /SAVE INPUT FILE FLAG DCA IOFLG /UPDATE TAD OPTR TAD (-OBUF SNA CLA /ANYTHING IN BUFFER? JMP CLOUT1 TAD OUTLN TAD OUTLEN SNA CLA /ROOM? JMP CLOUTFL /NO TAD OUTBLK DCA CLOUTX JMS I OHAN /WRITE OUT THE PARTIAL BUFFER 4210 /2 PAGES FROM FIELD 1 OBUF CLOUTX, 0 JMP CLOUTFL /FAIL ISZ OUTLN CLOUT1, TAD OUTLN /GET LENGTH DCA CLOC1 TAD ODEVNM /GET DEV NUMBER FOR CLOSE CIF 10 JMS I USR 4 /CLOSE OUTPUT FILE OFILNM CLOC1, 0 /LENGTH CLOUTFL, NONE /ERROR RETURN DCA SUCCES JMP I CLOUT /AND BACK XL2=. /PAGE ADDRESS LINK FOR FNDSP PAGE
/ ROUTINE TO CLOSE INPUT FILE. THIS CONSISTS ONLY / OF CLEARING THE FLAG FOR THE AVAILABILITY OF THE / INPUT FILE. CLIN, 0 ZERO TAD IOFLG AND C1 /CLOSE IT DCA IOFLG /UPDATE DCA SUCCES /SUCCESS JMP I CLIN
/THIS ROUTINE ACCEPTS A LINE FROM THE TELETYPE AND SETS THE VALUE OF /THE FUNCTION IDENTIFIER 'INPUT' TO ITS VALUE. ACCEPT, 0 TWO TAD TOP DCA XPTR ONE DCA XPTR+1 TAD PUTLST DCA INDEX6 TAD XPTR DCA I PUTLST /FOR PUTVAR ONE DCA I INDEX6 /ANY LENGTH - CHAR 1. NONE DCA I INDEX6 /ONLY ARG ACC0, KSF /GET CHAR FROM TELETYPE JMP .-1 KRB DCA T2 TAD T2 TAD (-203 /CODE FOR ^C SNA JMP ACC8 /TYPE ^C AND GO TO MONITOR TAD NC7 /(-212) SPA /AT OR ABOVE LINEFEED? JMP ACC1 /NO TAD NC3 /(-215) SPA /LINE MOVEMENT CHARACTER? JMP ACC11 SNA /NO - RETURN? JMP ACC3 /YES TAD NC10 SNA /^U (225) ? JMP ACC9 TAD (-152 SNA CLA /RUBOUT (377) ? JMP ACC6 ACC1, ZERO TAD T2 /GET BACK THE CHARACTER JMS CLPRN /TYPE IT JMP ACC5 /
ACC5, TAD T2 /GET BACK CHAR JMS I WRCHAR XPTR JMP ACC0 /Go AGAIN ACC3, TAD C215 JMS CLPRN / TAD C212 JMS CLPRN /PRINT LINEFEED FOR RETURN JMS I CLVAR /HERE TO FINISH VARIABLE STORAGE XPTR TAD (INPUT /GET INPUT VARIABLE HEADER DCA T1 JMS I PUTVAR /DO IT HLT /NO FAIL ISZ ACCEPT JMP I ACCEPT /AND BACK ACC6, TAD XPTR /HERE FOR RUBOUT CMA IAC TAD I PUTLST SZA CLA /CHARS IN? JMP ACC7 /YES NONE TAD XPTR+1 SZA CLA JMP ACC7 JMS I RETLF /NO - MUST TYPE RET-LF JMP ACC0 /AND BACK ACC7, TAD (334 /TYPE BACKSLASH JMS CLPRN NONE TAD XPTR+1 /DEC CHAR CNT DCA XPTR+1 TAD XPTR+1 SZA /PAST ONE? TAD (-2 SZA CLA /OR 3? JMP ACC0 /NO - OK NONE TAD XPTR DCA XPTR /YES - DEC WD PTR TAD XPTR+1 SZA CLA JMP ACC0 THREE DCA XPTR+1 JMP ACC0
ACC8, TAD (303 /"C" JMS ACC10 TAD (ACC0 DCA I INTST /SAVE THE CONTINUATION ADDRESS JMP I (7600 /GO TO OS/8 ACC9, TAD (325 /"U" JMS ACC10 JMP ACCEPT+1 ACC10, 0 DCA T3 TAD (336 JMS CLPRN TAD T3 JMS CLPRN JMS I RETLF JMP I ACC10 ACC11, ZERO TAD SVSPCH SNA CLA /SAVE SPECIAL CHARACTERS? JMP ACC0 /NO - IGNORE JMP ACC5 /YES - USE IT PAGE
/ ROUTINE TO READ A LINE FROM THE INPUT FILE. READH, 0 TAD IOFLG RAL SNL CLA /INPUT FILE AVAILABLE? JMP I READH /NO TWO TAD TOP DCA XPTR TAD XPTR DCA I PUTLST /FOR PUTVAR ONE DCA XPTR+1 READ1, TAD IPTR /GET PTR WD TAD (-IBUF-BUFLEN SPA CLA /OVER TOP? JMP READ2 /NO ISZ INLEN /ANY MORE IN FILE? SKP JMP I READH /NO - FAIL TAD INBLK /WHICH BLK TO READ DCA STBLK JMS I IHAN /CALL THE HANDLER 0210 /READ 2 PAGES TO FIELD 1 IBUF STBLK, 0 /BLOCK TO READ SMA CLA /ERROR RETURN - HARD OR SOFT? SKP JMP I READH /HARd ERROR - FAIL ISZ INBLK /GET NEXT ONE NEXT TIME TAD (IBUF DCA IPTR ONE DCA IPTR+1 READ2, ISZ RDFLG /SET READ FLAG JMS I GETCHR IPTR /GET NEXT CHAR JMP READ1 /NULL - TRY AGAIN TAD NC215 /RETURN? SNA JMP READ6 SMA /BELOW RETURN? JMP READ3 /NO - USE THE CHARACTER TAD C3 /YES - RESTORE IT
SMA /LINE MOVEMENT CHARACTER? JMP READ8 /YES TAD NC3 /NO - USE IT READ3, TAD C215 /RESTORE CHARACTER JMS I WRCHAR /AND WRITE IT XPTR JMP READ1 READ8, ISZ SVSPCH /SAVE THIS CHARACTER? JMP READ4 /NO TAD C212 /YES - RESTORE JMS I WRCHAR /WRITE IT XPTR NONE JMP .+2 READ4, ZERO DCA SVSPCH /FIX FLAG JMP READ1 /AND GO AGAIN READ6, JMS I CLVAR /RETURN - CLOSE VARIABLE XPTR TAD PUTLST DCA INDEX1 ONE DCA I INDEX1 /ALL NONE DCA I INDEX1 /AND THAT'S ALL TAD (READ DCA T1 JMS I PUTVAR HLT /NO FAIL ISZ READH JMP I READH
/THIS ROUTINE WRITES A SINGLE CHARACTER TO THE OUTPUT FILE. IT IS CALLED /(VIA FUNCTIONS 'WRITE' OR 'WRITEH') BY PUTVAR. WRITH, 0 DCA T4 /SAVE THE CHARACTER TAD IOFLG RAR SNL CLA /IS THE OUTPUT FILE AVAILABLE? JMP I WRITH /NO - FAIL TAD OPTR /GET THE OUTPUT POINTER TAD (-OBUF-BUFLEN SZA CLA /OVER THE TOP? JMP WR1 /NO TAD OUTLN TAD OUTLEN SNA CLA /ROOM LEFT IN THE FILE? JMP WRFL /NO - FAIL TAD OUTBLK /WHERE THE FULL BLOCK GOES DCA WRXX1
JMS I OHAN 4210 /WRITE TWO PAGES FROM FIELD 1 OBUF WRXX1, 0 JMP WRFL /OUTPUT ERROR ISZ OUTBLK ISZ OUTLN /UPDATE TAD OUTBUF DCA OPTR /NEW POINTER VALUE ONE DCA OPTR+1 NONE TAD OUTBUF DCA INDEX5 TAD C7400 /(-BUFLEN) DCA TX CDF 10 DCA I INDEX5 /CLEAR THE OUTPUT BUFFER ISZ TX JMP .-2 CDF 0 WR1, TAD T4 /GET THE CHARACTER JMS I WRCHAR /WRITE IT OPTR ISZ WRITH /SKIP ON SUCCESS JMP WR2 WRFL, TAD IOFLG /HERE ON FILE ERROR AND C4000 DCA IOFLG /CLEAR OUTPUT FILE BIT NONE WR2, DCA SUCCES JMP I WRITH /AND DONE PAGE
/ GET (OR WRITE) CHARACTER ACCORDING TO THE PTR IN (CALL+1). WRCHR, 0 DCA WRCX /SAVE CHAR DCA GWFLG /FLAG WRCHR TAD I WRCHR /GET POINTER JMP GET0 GETCH, 0 NONE DCA GWFLG TAD I GETCH /GET POINTER GET0, DCA GWPTR DCA GETX /BECAUSE GETCH MIGHT FAIL TAD I GWPTR /GET PTR SNA CLA /NULL? JMP GETRET /YES - RETURN TAD GWPTR DCA INDEX2 /TO CHAR # NONE TAD I INDEX2 SNA /1ST? JMP GET1 /YES TAD NC1 /NO, 2ND? SZA CLA JMP GET2 /NO - 3RD ONE /YES - 2ND GET1, TAD I GWPTR /GET PTR DCA TX CDF 10 ISZ GWFLG JMP WRC1 TAD I TX /GET CHAR AND C377 JMP GET3 GET2, NONE TAD I GWPTR DCA TX CDF 10 ISZ GWFLG JMP WRC2 TAD I TX AND C7400 /SAVE TOP BITS CLL RTR RTR DCA TXX ISZ TX TAD I TX AND C7400 CLL RTL RTL RAL TAD TXX
GET3, CDF 0 SNA /NULL CHAR? JMP GET4 /YES DCA GETX TAD GWPTR JMS UPDPTR /UPDATE PTR ISZ GETCH /SKIP FOR GETCH (SUCCESS) GETRET, CDF 0 ISZ GETCH ISZ WRCHR TAD GWFLG SMA SZA CLA /WRITE OR GET? JMP I WRCHR TAD GETX /CHAR JMP I GETCH /AND GO GET4, TAD RDFLG SZA CLA /READING FROM A FILE? JMP GET5 TAD GWFLG SZA CLA /GET OR WRITE? JMP GET3+4 /WRITE ONE TAD GWPTR DCA TX NTHREE TAD I TX SZA CLA /3RD? ONE /NO TAD I GWPTR /GET ADR OF SPECIAL CODE DCA INDEX2 CDF 10 TAD I INDEX2 /GET IT SNA /ZERO? JMP GETRET /YES - END OF STR (READ) IAC SNA CLA /END CODE? JMP GETRET TAD I INDEX2 /NO (ASSUME LINK) - GET CONT ADR CDF 0 DCA I GWPTR /UPD PTR ISZ GWPTR ONE DCA I GWPTR /CHAR 1 JMP GETCH+1 /GO AGAIN GET5, TAD GWPTR /NULL ON FILE READ JMS UPDPTR /UPDATE INPUT POINTER JMP GETRET /FAIL AND LET READH TRY AGAIN
WRC1, TAD WRCX /GET CHAR DCA I TX /SAVE JMP GET3 /FINISH WRC2, TAD WRCX /GET CHAR RTL RTL JMS WRC3 TAD WRCX RTR RTR RAR ISZ TX JMS WRC3 JMP GET3 /DONE WRC3, 0 AND C7400 /SAVE TOP DCA TXX TAD I TX /GET PRESENT WD AND C377 /SAVE THE LOW ORDER CHAR TAD TXX /ADD IN THE TOP ORDER 3RD CHAR DCA I TX /SAVE WHOLE WD JMP I WRC3 / GWFLG, 0 GWPTR, 0 WRCX, 0 GETX, 0 PAGE
/ ENTER WITH VARPTR IN T1. THE SHOULD BE A LIST IN / 'PLST' CONTAINING INFORMATION FOR PUTVAR IN THE / FOLLOWING FORMAT: / / WD 1/ LOCATION WHERE DATA STARTS. / WD 2/ -LENGTH OF STRING (B0-9); CHAR # (B10-11) / / THE LENGTH SPEC HAS PRECEDENCE ONLY IF THE STRING IS / AT LEAST THAT LENGTH. THE TABLE IS ENDED BY AN / ENTRY OF NEGATIVE ONE. PUTVR, 0 TAD T1 /GET VARPTR TAD NC20 SPA /IS IT A SPECIAL FUNCTION? JMP PUT0 TAD NC10 SMA JMP PUT0 /NO TAD (PUTSPF+10 DCA TX TAD I TX /GET THE HANDLING ROUTINE SNA /OUTPUT FUNCTION? JMP PUT0 /NO - IT'S A VARIABLE DCA PXT6 /SET THE FUNCTION FLAG JMP PUT1 PUT0, ZERO DCA PXT6 /CLEAR SPECIAL FUNCTION FLAG JMS I FNDSPC /GET SPACE FOR NON-VAR DCA PXT1 /AND PUT THERE TAD PXT1 DCA PXT2 ONE DCA PXT2+1 PUT1, DCA INDEX7 /CHAR CNT NONE TAD PUTLST DCA INDEX1
PUT2, ONE TAD I INDEX1 /GET NEXT VARPTR SNA JMP PUT7 /DONE TAD NC1 DCA PXT5 TAD I INDEX1 DCA TX TAD TX AND C3 DCA PXT5+1 TAD TX CLL RAR CLL RAR /V41 SZA /IF ZERO - LEAVE AS IS TAD C5777 /TO GIVE -LEN - 1 DCA PXT4 PUT3, TAD PXT6 SZA CLA /SPECIAL FUNCTION? JMP PUT4 /YES - DON'T WRITE INTO MEMORY THREE JMS PUT10 /<AT OR ABOVE> THE TOP SKP /NO JMP PUT4 /YES THREE /NO TAD PXT2 DCA TX CDF 10 TAD I TX CDF 0 TAD C7 SZA CLA /ROOM LEFT? JMP PUT6 /NO - LINK PUT4, ISZ PXT4 /GET NEXT CHAR - STR DONE? SKP JMP PUT2 /YES - TRY NEXT STR JMS I GETCHR /NO - GET CHAR PXT5 JMP PUT2 /GUESS IT'S DONE DCA TX TAD PXT6 SNA CLA /SPECIAL FUNCTION? JMP PUT5 TAD TX /YES - GET THE CHARACTER JMS I PXT6 /HANDLE IT JMP I PUTVR /fAIL JMP PUT4
PUT5, TAD TX JMS I WRCHAR PXT2 ISZ INDEX7 /INC CHAR CNT NTHREE TAD PXT2+1 SZA CLA /3RD? JMP PUT4 /NO - DON'T CHECK SIZE JMP PUT3 PUT6, JMS I LNKVAR PXT2 DCA PXT2 ONE DCA PXT2+1 JMP PUT3 PUT7, TAD PXT6 /GET THE SPECIAL FUNCTION CODE SZA CLA JMP PUT12 /IF SET - FINISH FUNCTION TAD INDEX7 SNA CLA /ANYTHING? JMP PUT9 /NO JMS I CLVAR PXT2 JMS PUT10 /OVER THE TOP? JMP PUT8 /NO TWO TAD PXT2 DCA TOP /YES - UPDATE TOP PUT8, TAD I T1 /GET VARPTR SZA / JMS I CLRVAR /CLEAR WHAT IT WAS TAD PXT1 DCA I T1 /UPD VARPTR JMP PUTS /AND DONE PUT9, DCA PXT1 /HERE ON NOTHING JMP PUT8 /JUST NO NEW PTR
PUT12, TAD T1 /GET THE SPECIAL FUNCTION CODE RAR SZL CLA /LOW ORDER BIT SET? JMP PUTS TAD C215 JMS I PXT6 /NO - PUT A RETURN OUT JMP I PUTVR /FAIL RETURN TAD C212 JMS I PXT6 JMP I PUTVR PUTS, ISZ PUTVR JMP I PUTVR /AND DONE PXT5, 0; 1 PXT6, 0 /SPECIAL FUNCTION FLAG AND POINTER PAGE
PUT10, 0 TAD PXT2 CMA IAC TAD TOP SMA SZA CLA /OVER THE TOP? JMP I PUT10 /NO TAD TOP /NO - POSSIBLE WRAPAROUND? SMA CLA JMP PUT11 /NO THREE /IN CASE WE'RE AT THE TOP TAD PXT2 SPA CLA /YES - IF POS. PUT11, ISZ PUT10 JMP I PUT10 PXT2, 0;1
/ THESE ARE THE ROUTINES TO EITHER CLOSE A VARIABLE /OR TO LINK IT. IN EITHER CASE, ZERO CHARS ARE WRITTEN /UP THROUGH THE NEXT 3RD CHAR, AND THEN THE NEXT WD IS /EITHER -1 OR -10 (END OR LINK, RESPECTIVELY). FOR END, /THE NEXT IS -1; AND FOR LINK, THE NEXT IS THE CONT ADR /(WHICH IS ALSO RETURNED IN THE AC). FOR CLOSE, THE AC /IS RETURNED AS ZERO. LNKVR, 0 NONE JMP .+3 CLVR, 0 ZERO DCA CLX1 TAD CLX1 SNA CLA /HOW CALLED? JMP .+3 TAD I LNKVR /LINK - GET ARG SKP TAD I CLVR /CLOSE - GET THAT ONE DCA CLX2 TAD CLX2 DCA CL1+1
CL1, JMS I WRCHAR /WRITE A ZERO 0 TAD .-1 /GET LOC OF PTR DCA INDEX2 TAD I INDEX2 TAD NC1 SZA CLA /BACK TO CHAR 1? JMP CL1 /NO - GO AGAIN NONE TAD I CLX2 DCA INDEX2 CDF 10 ISZ CLX1 /LINK OR CL? JMP CL2 /CLOSE - GO TAD NC10 /LINK - PUT -10 DCA I INDEX2 CDF 0 JMS I FNDSPC /FIND SPACE FOR CONT DCA CLX2 TAD CLX2 CDF 10 DCA I INDEX2 /SAVE LINK ADR CLRET, CDF 0 TAD CLX1 ISZ CLVR SZA CLA /CL OR LNK? JMP I CLVR /CLOSE - DONE ISZ LNKVR /SKIP OVER ARG TAD CLX2 /GET CONT JMP I LNKVR /DONE CL2, NONE DCA I INDEX2 NONE /2 END CODES DCA I INDEX2 JMP CLRET /AND DONE CLX1, 0 CLX2, 0
/ THIS ROUTINE LOADS -7'S OVER ALL THE SPACE USED BY / THE VARIABLE POINTED TO BY THE AC. CLRVR, 0 DCA TXX CDF 10 CLR0, TAD TXX DCA TX TAD I TX /GET TOP 4 BITS AND C7400 SZA CLA /ZERO THERE? JMP CLR2 ISZ TX TAD I TX /GET BOTTOM AND C7400 SZA CLA /TOTAL ZERO? JMP CLR2 /NO JMS CLRZ /YES - ZERO 1ST AND 2ND WD ONE TAD I TXX /GET SPECIAL CODE SZA /END? JMP CLR1 /NO JMS CLRZ CDF 0 JMP I CLRVR /DONE CLR1, TAD C7 SZA /LINK? JMP RTSER7 /NO - FATAL TAD NC7 /UNUSED DCA I TXX ISZ TXX TAD TXX DCA TX TAD I TXX /YES - GET CONT LOC DCA TXX TAD NC7 DCA I TX /ZERO LAST OF BLOCK JMP CLR0 /AND GO AGAIN CLR2, JMS CLRZ /HERE ON THIRD AND NOT ZERO JMP CLR0 CLRZ, 0 TAD NC7 DCA I TXX ISZ TXX TAD NC7 DCA I TXX ISZ TXX JMP I CLRZ /DONE XT2=.&7600+200 *XL2 /PAGE ADDRESS LINK FROM POPJ
/ ROUTINE TO FIND SPACE IN VAR STORAGE AREA FNDSP, 0 ZERO TAD TOPP DCA TX /TX IS WHERE WE LOOK FND0, TAD FNDSPS /# OF LOCS NEEDED CMA IAC /-# DCA TXX /TXX IS THE FREE LOC CNT CDF 10 SKP /DON'T INC LOC THE FIRST TIME /LOOP TO FIND (FNDSPS) FREE LOCS IN A ROW. FND1, ISZ TX TAD TX CMA IAC TAD TOP SNA CLA /ARE WE UP TO THE TOP? JMP FND4 /YES TAD I TX /NO - GET THE NEXT LOC TAD C7 SZA CLA /LOCATION USED? JMP FND5 /YES ISZ TXX /NO, INC CNT - DONE? JMP FND1 /NO TAD FNDSPS CMA IAC IAC /-# + 1 TAD TX /YES, GET PTR TO FREE SPACE FND2, CDF 0 JMP I FNDSP /DONE FND4, TAD FNDSPS /# NEEDED TAD TXX /AT THE TOP CMA IAC /TWO'S COMPLEMENT TAD TOP /CALCULATE FIRST FREE LOC JMP FND2 /AND DONE FND5, ISZ TX /LOCATION USED - CHECK NEXT JMP FND0 /TRY AGAIN FNDSPS, 16 /THIS VALUE IS ADJUSTABLE. *XT2
/ THE AC CONTAINS THE LOCATION OF THE PTR. UPDPTR, 0 DCA TX ONE TAD TX DCA TXX ISZ I TXX /ISZ CHAR NUM NTHREE TAD I TXX SPA /3RD OR 4TH? JMP UPD1 /NO - DONE ISZ I TX /YES - UPD WD PTR SZA /4TH? DCA I TXX /YES - ACTUALLY 1ST UPD1, ZERO JMP I UPDPTR /DONE.
/ THIS ROUTINE DECODES THE FILENAME POINTED TO (TO SOME /EXTENT) BY THE AC. INDEX0 SHOULD BE POINTING TO THE /FILENAME BLOCK. FILEDC, 0 DCA H1 TAD H1 /GET THE VARPTR JMS I UPDSPF /UPDATE IF SPECIAL FUNCTION JMP I FILEDC /FAIL TAD I H1 DCA XPTR ONE DCA XPTR+1 NTHREE /# OF WDS FOR NAME DCA T3 FILL1, JMS FILCH /GET AND FIX CHAR JMP FIL3 /PERIOD OR NOT THERE JMS I LJUST JMS I LJUST /LEFT JUSTIFY DCA T2 JMS FILCH /NEXT JMP FIL5 TAD T2 /GET REST OF WD DCA I INDEX0 /SAVE ISZ T3 /DONE WITH NAME? JMP FILL1 /NO - CONTINUE FILL2, JMS FILCH /YES - LOOK FOR END OR PERIOD SKP JMP FILL2 /GOT CHAR - TRY NEXT SNA /PERIOD? JMP FIL2-1 /NO - DONE FIL1, JMS FILCH /GET 1ST CHAR OF EXT JMP FIL6 /HERE ON DOT OR END JMS I LJUST JMS I LJUST DCA T2 JMS FILCH /GET 2ND CHAR JMP FIL7 FIL1A, TAD T2 /GET FULL EXT DCA I INDEX0 /SAVE FIL2, ISZ FILEDC /SKIP RETURN JMP I FILEDC /AND DONE
FIL3, SZA CLA /ODD CHAR DOT OR END? JMP FIL8 /DOT DCA I INDEX0 /ZERO REST OF BLK FIL4, ISZ T3 JMP .-2 JMP FIL2-1 /AND DONE FIL5, DCA TX /SAVE FLG TAD T2 /GET ODD CHAR DCA I INDEX0 ISZ TX /DOT OR END? JMP FIL4 /END SKP /DOT DCA I INDEX0 /ZER REST OF FILENAME BLK ISZ T3 /DONE? JMP .-2 /NO JMP FIL1 /AND DO NEXT FIL6, SZA /DOT OR END? JMP I FILEDC /DOT - ERROR JMP FIL2-1 /END - ZERO LAST AND DONE FIL7, SZA /DOT OR END? JMP I FILEDC /DOT - ERROR JMP FIL1A /END - SAVE ODD CHAR AND DONE FIL8, DCA I INDEX0 /HERE ON (1ST CHAR) DOT ISZ T3 /DONE? JMP .-2 /NO JMP FIL1 /YES
/ ROUTINE TO GET, CHECK AND CLEAN CHARACTER. FILCH, 0 JMS I GETCHR /GET CHARACTER XPTR JMP I FILCH /FAIL - CAN'T GET IT DCA TX TAD TX TAD (-256 SZA /TEST PERIOD JMP FILC1 /NO NONE /YES - AC TO -1 JMP I FILCH /AND DONE FILC1, TAD (-54 /ADD -Z SMA SZA /MUST BE <=0 JMP I FILEDC /IT ISN'T - FAIL COMPLETELY TAD (32 SPA SNA /NOW MUST BE >0 JMP FILC2 /NO - TEST NUMBER FILCOK, ISZ FILCH /YES - SKIP JMP I FILCH /AND DONE FILC2, TAD C7 SMA SZA /MUST BE <=0 JMP I FILEDC /NO - FAIL TAD (11 SPA /NOW MUST BE >=0 JMP I FILEDC /FAIL TAD (60 JMP FILCOK XL3=. /PAGE LINK ADDRESS FOR RETLFX, GPTRX PAGE
/ THESE ARE THE ROUTINES TO HANDLE ALL OF SNOBOL'S NUMBER /FACILITIES (AT THIS TIME). ONLY INTEGERS UP TO + OR -2048 /ARE ALLOWED. THE USER MUST DO ALL OPERATIONS. ASC, 0 ZERO /STRING TO NUMBER TAD I ASC DCA H1 TAD H1 JMS I UPDSPF /UPDATE IF FUNCTION JMP ASCFL TAD I H1 /GET VARPTR DCA T2 /SAVE IT ONE DCA T2+1 DCA T3 /TOTALS NONE DCA T4 /SIGN FLAG ASC1, JMS I GETCHR /GET THE NEXT CHAR T2 JMP ASC4 /ERROR RETURN -- DONE DCA TX /SAVE IT TAD BASE CMA IAC /-BASE TAD (-260 /-260 TAD TX /+NUM (260 AND UP) SMA /ONLY NEG HERE LEGAL JMP ASCFL TAD BASE /NOW POS WILL BE LEGAL NUM SMA /IS IT POS OR ZERO? JMP ASC2 /YES TAD C3 SZA /TEST MINUS SIGN JMP ASCFL /NO DCA T4 JMP ASC1 ASC2, DCA TX /SAVE DIGIT TAD BASE CMA IAC DCA TXX
ASC3, TAD T3 /MULT (BASE) * (TOTAL) ISZ TXX JMP ASC3 TAD TX /ADD NET DIGIT DCA T3 /SAVE NEW TOTAL JMP ASC1 /GO AGAIN ASC4, DCA SUCCES TAD T3 ISZ T4 /GET SIGN FLAG CMA IAC /GET NEG TOTAL JMP ASC6 /AND GO ASCFL, NONE DCA SUCCES /SET FOR FAIL ASC6, ISZ ASC JMP I ASC /AND DONE
INT, 0 DCA T1 /SAVE AC TAD TOP CDF 10 DCA T4 DCA I T4 TAD T4 DCA INDEX1 /JUNK STORAGE DCA I INDEX1 /NULL AT BEGINNING TAD T1 SMA CLA /NEGATIVE? JMP INT1 ISZ I T4 /SET SIGN FLAG TAD T1 CMA IAC /AND PRETEND IT'S POSITIVE DCA T1 INT1, DCA T2 /COUNT INT2, TAD BASE CMA IAC TAD T1 /TEST SIZE OF REMAINDER SPA /SMALL ENOUGH? JMP INT3 /YES DCA T1 /SUBTRACT BASE FROM ATOM ISZ T2 /INC CNT JMP INT2 /AND AGAIN INT3, TAD BASE /GET ATOM TAD (260 /MAKE ASCII DCA I INDEX1 /SAVE TAD T2 /GET CNT SZA /DONE? JMP INT1-1 /NO - CNT IS NEW #
TAD I T4 /SIGN SNA CLA JMP .+3 TAD (255 /MINUS SIGN DCA I INDEX1 /SAVE ONE TAD INDEX1 /PTR TO END OF # DCA XPTR ONE DCA XPTR+1 TAD INDEX1 DCA T1 INT5, TAD I T1 SNA JMP INT7 CDF 0 JMS I WRCHAR XPTR CDF 10 NONE TAD T1 DCA T1 JMP INT5 INT7, CDF 0 JMS I CLVAR /CLOSE VARIABLE XPTR ONE TAD INDEX1 DCA I PUTLST TAD PUTLST DCA INDEX1 ONE DCA I INDEX1 /ALL NONE DCA I INDEX1 TAD I INT /GET VARPTR DCA T1 JMS I PUTVAR HLT /NO FAIL ISZ INT JMP I INT /GO BACK XT1=.&7600+200 *XL1 /PAGE ADDRESS LINK FROM UPDBAS
/ THIS ROUTINE HANDLES ALL INDIRECT VARIABLES AND LABELS. IT /RETURNS WITH THE SUCCESS FLAG SET AND THE AC CONTAINING /THE VALUE FOR THE NAME. INDRCT, 0 ZERO TAD I INDRCT DCA TXX TAD TXX JMS I UPDSPF /UPDATE IF SPECIAL FUNCTION JMP RTSER2 TAD I TXX /GE THE VALUE SNA /NULL? JMP RTSER2 /YES - FAIL DCA T2 ONE DCA T2+1 TAD TOP /USE TOP FOR JUNK STORAGE DCA INDEX1 THREE /-# OF WDS DCA T1 IND0, JMS I GETCHR /GET THE NEXT CHAR T2 JMP IND1 /FAIL AND C77 /MAKE INTO SIXBIT JMS I LJUST JMS I LJUST /LEFT JUSTIFY DCA T3 JMS I GETCHR /GET THE NEXT CHAR T2 JMP INDA AND C77 INDA, TAD T3 /GET THE FULL WD CDF 10 DCA I INDEX1 /SAVE CDF 0 ISZ T1 /DONE? JMP IND0 /NO IND1, CDF 10 DCA I INDEX1 /ZERO AT THE END NONE TAD INDR /PTR TO TABLE DCA INDEX1
IND2, TAD TOP DCA T4 /PTR TO OUR NAME IND3, TAD I INDEX1 /GET NET WD FROM TABLE CMA IAC ISZ T4 TAD I T4 /AND WHAT WE'RE SEARCHING FOR SNA CLA /MATCH? JMP IND6 /YES TAD INDEX1 DCA TX IND4, TAD I TX /GET BACK WD FROM TABLE AND C77 ISZ TX SZA CLA /END OF ARG? JMP IND4 /NO TAD TX DCA INDEX1 /UPD PTR ISZ TX TAD I TX /GET 1ST WD OF NEXT ENTRY SZA CLA /EXIST? JMP IND2 /YES - TRY AGAIN JMP RTSER2 /ERROR IND6, TAD INDEX1 /HERE ON MATCH DCA TX TAD I TX AND C77 SZA CLA /DONE WITH TEST? JMP IND3 /NO - TRY NET WD TAD I T4 AND C77 SZA CLA JMP IND3 TAD I INDEX1 /GET VALUE CDF 0 ISZ INDRCT JMP I INDRCT /RETURN *XT1
/UPDFUN DETERMINES WHETHER THE AC CONTAINS A SPECIAL FUNCTION /IDENTIFIER. IF SO, IT UPDATES THE VALUE OF THAT FUNCTION. I.E. /IT CALLS EITHER ACCEPT OR READ FOR NEW INPUT. UPDFUN, 0 DCA TX TAD TX TAD NC20 SPA /IS THIS A SPECIAL FUNCTION? JMP UPDRET TAD NC10 SMA JMP UPDRET TAD (UPDIFN+10 /YES - GET THE ADDRESS OF THE FUNCTION DCA TX TAD I TX SNA /AN INPUT ROUTINE? JMP UPDRET DCA TX JMS I TX /YES - CALL IT SKP UPDRET, ISZ UPDFUN /SKIP ON SUCCESS ZERO DCA RDFLG /CLEAR READING FLAG JMP I UPDFUN
PRN, 0 DCA TX ISZ PRN /ALWAYS SUCCeEDs JMS I INTST /<CTRL>C TYPED? TAD TX TAD NC215 /RETURN? SNA DCA OCNT /YES - CNT BACK TO BEG TAD C4 /TAB? SNA CLA JMP PRN1 TAD TX JMS PRX JMP I PRN PRN1, TAD C240 /SPACE UNTIL RIGHT JMS PRX TAD OCNT AND C7 SZA CLA /POSITIONED RIGHT? JMP PRN1 JMP I PRN /YES - DONE PRX, 0 DCA TXX TAD TOP /KEEP TOP IN THE LIGHTS TSF JMP .-1 ZERO TAD TXX TLS TAD (-232 SMA SZA CLA /IS THIS A PRINTING CHARACTER? ISZ OCNT /YES - INC POS CNT JMP I PRX INTTST, 0 KSF /ANYTHING TYPED? INTFN, JMP I INTTST KRS /YES - GET IT TAD (-203 SZA CLA /CONTROL C? JMP I INTTST KCC /YES - ZERO FLAG JMP ACC8 /AND RETURN TO MONITOR XT3=. *XL3 /PAGE LINK ADDRESS FROM FILEDC
RETLFX, 0 TAD C215 JMS CLPRN TAD CLF JMS CLPRN JMP I RETLFX GPTRX, 0 DCA TXX TAD I TXX DCA TXX TAD I TXX JMP I GPTRX *XT3 CLPRN, 0 /CALL PRN WITHOuT a SKIP RETURN JMS PRN HLT JMP I CLPRN RJST, 0 CLL RAR CLL RAR CLL RAR JMP I RJST LJST, 0 CLL RAL CLL RAL CLL RAL JMP I LJST USRLOK, 0 CIF 10 JMS I USR 10 /LOCK THE USR IN CORE JMP I USRLOK USRDIS, 0 CIF 10 JMS I LUSR 11 /DISMISS THE USR FROM CORE JMP I USRDIS
/THIS ROUTINE HANDLES FATAL RUNTIME SYSTEM ERRORS. SOME ARE PROGRAMMER /INDUCED, SOME INDICATE FLAWS IN THE RUN TIME SYSTEM. RTSER7, ISZ RTSERR RTSER6, ISZ RTSERR RTSER5, ISZ RTSERR RTSER4, ISZ RTSERR RTSER3, ISZ RTSERR RTSER2, ISZ RTSERR RTSER1, ISZ RTSERR RTSER0, CDF 0 /PROTECT ZERO TAD ERRMSG DCA INDEX0 /POINTER TO FAILURE MESSGE RTSER, TAD I INDEX0 /GET THE NEXT CHAR FROM THE MESSAGE SNA JMP .+3 JMS CLPRN /TYPE IT JMP RTSER TAD RTSERR /GET THE ERROR CODE TAD (260 JMS CLPRN /GIVE IT JMP I (7600 /AND GO TO OS/8 RTSERR, 0 ERRMSG, .;215;212;"?;"S;"N;"O;"R;"T;"S;240;0 PAGE
/THIS PAGE CONTAINS TABLES USED FOR HANDLING THE SPECIAL FUNCTIONS /INPUT, OUTPUT, READ, WRITE, OUTHOLD, AND WRITEH / THIS TABLE IS FOR PUTVAR PUTSPF, 0 0 PRN /OUTPUT PRN /OUTHOLD WRITH /WRITE WRITH /WRITEH 0;0 / THIS TABLE IS FOR UPDFUN UPDIFN, ACCEPT /INPUT READH /READ 0;0;0;0;0;0
/ BLOCK DATA STORAGE. DEVI, DEVICE DSK DEVO, DEVICE DSK 4;0 / PATTBL-1, 2 -- FOR NON-ANCH VAR PATBL, ZBLOCK 30 IFILNM, ZBLOCK 4 OFILNM, ZBLOCK 4 VARTB, ZBLOCK 14 PLST, ZBLOCK 30 PDLST, ZBLOCK 40 / PUSHDOWN LIST. $$$$$$$$$$$$$$$$$$$
/SNOBOL 8.2 COMPILER. 31 AUGUST 76 PAL SOURCE / / / / THIS IS THE SOURCE FILE FOR THE SNOBOL-8.2 LANGUAGE COMPILER. THIS /PROGRAM IS DESIGNED TO RUN ON ANY STANDARD PDP-8 OS/8 SYSTEM WITH AT LEAST /8K. THE MACHINE READABLE USER DOCUMENTATION IS CONTAINED IN THE FILE /SNOUSER.DC ON THE NETWORK. ANY BUGS DISCOVERED SHOULD BE REFERRED TO THE /APPROPRIATE PERSON(S), WHO IS CURRENTLY FRED DALRYMPLE. / /FRED DALRYMPLE *0 DECIMAL 94 /VERSION NUMBER OCTAL
/ PAGE USAGE (FIELD 0) ***OUT OF DATE / /200 SNOBOL-FRONT2 (26) 146 (4) * /400 FRONT4-MAIN0A (22) 145 (11) /600 MAIN01-MAIN18 (27) 150 (1) /1000 MAIN19-MAIN55 (24) 135 (17) /1200 MAIN56-MAIN63 (17) 150 (11) /1400 MAIN70-MAIN78 (16) 147 (13) /1600 MAIN79-END4 (27) 150 (1) /2000 END7-PUTOUT (23) 152 (3) /2200 SCANNR-SCAN08 (10) 160 (10) /2400 SCAN09-SCAN16 (7) 133 (36) /2600 SCAN20-SCAN2S (21) 135 (20) /3000 SCAN24-SCAN2C (12) 162 (4) /3200 SCAN2M-SCAN30 (25) 125 (26) /3400 CLOSE-CLOS10 (22) 125 (31) * /3600 CLOS11-CLOS23 (15) 135 (26) /4000 CLOS24-ERR17 (35) 121 (22) /4200 ERR18-ENDRD (17) 146 (13) /4400 RETRN-WRSPO (3) 174 (1) /4600 WROCTO-SERCH (5) 155 (16) /5000 MACH-RDPOL (4) 104 (70) /5200 WRPOL-WPSTR (3) 170 (5) /5400 RDCHR (12) 165 (1) /5600 WRCHR-PRN (13) 150 (15) INHAN=6000 /INPUT HANDLER /6200 OUTHAN=6400 /OUTPUT HANDLER /6600 /7000 LITERALS AND STORAGE
/ PAGE USAGE (FIELD 1) / / /200 INPUT BUFFER /400 / /600 OUTPUT BUFFER /1000 /1200 /1400 / /1600 TEXT IBUF=200 /ADDRESS OF THE INPUT BUFFER NTOPIB=-600 /NEGATIVE TOP OF THE INPUT BUFFER OBUF=600 / OUTPUT BUFFER NTOPOB=-1600 /NEG. TOP OF OUTPUT BUFFER
/ DEFINITIONS /STORAGE DELIMITERS STRDEL=0000 /BEGINNING OR END OF STRING FREE= 7777 /FREE WORD IN STORAGE LINK= 7776 /LINK CODE POLEND=7775 /END OF POOL /USR LOCATIONS OFLTAB=7600 /CD OUTPUT FILE TABLE (FIELD 1) IFLTAB=7617 /CD INPT FILE TABLE (FIELD 1) /PARSING DELIMITERS UPARR= 23 COMMA= 22 COLON= 21 SPACE= 20 SEMI= 17 OR= 16 EQUAL= 15 LESS= 14 BACK= 12 END= 11 EOL= 10 LPAREN= 6 RPAREN= 4 STAR= 3 SLASH= 2 ADD= 1 SUB= 0 /POINT COMMAND ARGUMENT DESCRIPTORS VARORLIT= 1 NOARG= 2 LABEL= 4 JMPTR= 10 VAR= 20 ANY= 37-LABEL-JMPTR CPAL= 100 CSNO= 200 CEXIT= 400 CEND= 1000 CCONTR=1700 /ALL COMPILER CONTROL TYPES
/ PAGE ZERO STORAGE *10 INDEX0, 0 /AUTO-INDEX REGISTERS INDEX1, 0 INDEX2, 0 INDEX3, 0 LINEP, 0 /LINE IMAGE PTR AGVPTR, 0 /ARITH GEN VAR POOL PTR INDEX6, 0 INDEX7, 0 ACCNUM, 0 /NUMBER ACCUMULATION (SCAN) LPOOL, 0 /WHICH LITERAL POOL TO REFERENCE DEL, 0 /ATOM DELIMITER (SCAN) LAST, 0 /LAST DELIMITER IN ARITHMETIC STATEMENT T1, 0 /TEMPORARIES T2, 0 / T3, 0 / T4, 0 TX, 0 /VERY TEMPORARIES TXX, 0 TOP, 0 /LAST USED ADDRESS IN STORAGE PLUS 1 ARGCNT, 0 /ARGUMENT COUNT FOR POINT COMMAND CLEN, 0 /LENGTH OF THIS SNOBOL INST IN PAL CODE PAGLEN, 0 /CURRENT LENGTH OF OBJECT PAGE TMODE, 0 /MODE FOR THIS INSTRUCTION NXTSTR, 0 /BEGINNING OF NEW LITERAL T1MAT, 0 /WRITE CURSOR FOR WRPOOL SCURS, 0; 0 /HOLD CURSOR THROUGH EXTCUR-EXFCUR OCURSR, 0; 0 /OUTPUT STREAM CURSOR IMCNT, 0 /COUNT FOR LINE IMAGE VALID, 0 /VALID TYPE TO BE FOUND BY SCAN HPOOL, 0 /POOL HEAD (FOR WRPOOL) AGVCNT, 0 /COUNT FOR ARITH GEN VAR POOL PTR INFLPT, 0; 0 /PTR TO INPUT FILE LIST AND COUNT IHAN, 0 /LOCATION OF INPUT HANDLER OHAN, 0 /LOCATION OF OUTPUT HANDLER FOUTBK, 0 /FIRST BLOCK NUMBER IN OUTPUT FILE
OFLAG, 0 /FLAG OUTPUT FILE BEING USED LITFND, 0 /FLAG LITERAL FOUND (SCAN) EQLSEN, 0 /FLAG EQUAL SIGN SEEN LABELF, 0 /FLAG LABEL BEING PARSED (SCAN) TRASEN, 0 /FLAG TRANSFER SEEN OUTF, 0 /FLAG OLINE PUT (PUTOUT) ACMIND, 0 /FLAG ACCUM IS INDIRECT (SCAN) PTATOM, 0 /FLAG .A ATOM SEEN (SCAN) MODECH, 0 /FLAG MODE CHANGED STRF, 0 /FLAG NOT INPUT FILE (FOR GETCHR) F0CLR=. /IMPURE AREA - VARIABLES BETWEEN HERE AND F0CLRL /ARE CLEARED AUTOMATICALLY AT INITIALIZATION CHOLD, 0 /HOLD CHARACTER FOR GETCHR LOOK AHEAD CURSOR, 0; 0 /POINTER TO INPUT STREAM OCNT, 0 /TELETYPE COLUMN POSITION TOCNT, 0 /HIGHEST OCNT VALUE GENLIT, 0 /GENERATED LITERALS COUNT PAGLIT, 0 /GEN LITS FOR PAGING PAL FILE OVERF, 0 /FLAG OVERWRITING POOL (DELETE SUBSTRING) LINDF, 0 /FLAG INDIRECT LABEL USAGE VINDF, 0 /FLAG INDIRECT VARIABLE USAGE COLINE, 0 /CURRENT POSITION POINTER FOR OLINE CPOLIN, 0 /CURRENT POSITION POINTER FOR POLINE F0CLRL=.-F0CLR /THIS IS THE END OF THE AUTOMATIC CLEAR AREA ONAME, ZBLOCK 4 /OUTPUT FILE NAME
/ CONSTANTS ZERO= CLA CLL ONE= CLA CLL IAC TWO= CLA CLL IAC RAL THREE= CLA CLL CML IAC RAL FOUR= CLA CLL IAC RTL SIX= CLA CLL CML IAC RTL C5, 5 C7, 7 C10, 10 C12, 12 C240, 240 C260, 260 C377, 377 C7400, 7400 SARG, 4000 /SUBSTITUTE ARG BIT NONE= CLA CLL CMA NTWO= CLA CLL CMA RAL NTHREE= CLA CLL CMA RTL NC1, -1 NC2, -2 NC3, -3 NC4, -4 NC5, -5 NC6, -6 NC7, -7 NC10, -10 NC12, -12 NC212, -212 NC260, -260
/ ROUTINES AND COMMON POINTERS ACUM, ACCUM /POINT TO FIRST WORD OF ACCUM ACUMM, ACCUM-1 / CONVD, CVD /CONVERT THE AC TO DECIMAL CTYPE, CTTYPE /TYPE CHARACTERS (CHAR/WORD); PTR IN AC DELPOL, DPOOL /DELETE A POOL'S STORAGE (PTR IN AC) ENDRD, ENDRED /READ FROM INPUT UNTIL EOL GETCHR, RDCHR /RETURN NEXT CHAR FROM INPUT IN AC GETCHS, RDCHRS /READ CHARACTER AND DON'T MODIFY INTST, INTRPT /TEST FOR INTERRUPT LUSR, 200 /ADDRESS OF USR (FIELD 1) WHEN LOCKED MAKASC, CALASC /GENERATE CALL TO ASC WITH GEN'ED LIT PRINT, PRN /TYPE A CHARACTER PUTACR, PACCUR /PUT ACCUM ONTO OLINE WITH RETURN PUTCHR, WRCHR /WRITE CHAR TO OUTPUT (CHAR IN AC) PUTNAM, PTNAME /PUT NAME TO OUTPUT FROM POOL (PTR IN T1) PUTOC, PUTOCT /PUT OCTAL NUMBER IN AC TO OUTPUT PUTOUT, PTOUT /WRITE LINE AND GENERATED CODE TO OUTPUT RDPOOL, RDPOL /READ CHAR FROM A POOL (PTR IN T1) RETORN, RETRN /PUT CARRAIGE RETURN ON OLINE RETTRN, TYRET /TYPE A CARRAIGE RETURN SCAN, SCANNR /PARSE NEXT ATOM (ACCUM, DEL) SEARCH, SERCH /SEARCH POOL (PTR IN T1) FOR (ACCUM) SAVACM, SVACUM /STORE ACCUM IN SACCUM SHACUM, SHFTAC /SHIFT ACCUM ONE CHAR LEFT TYPE, TTYPE /TYPE PACKED STRING USR, 7700 /USR LOCATION WHEN NOT LOCKED WROCO, WROCTO /WRITE OCTAL NUMBER IN AC TO OLINE WROLIN, WRITO /WRITE CHAR TO OLINE WRPOLN, WRITPO /WRITE CHAR ON POLINE WRPOOL, WRPOL /WRITE CHAR TO A POOL (PTR IN T1MAT) WRPPSO, WRPPO /WRITE PACKED STRING TO POLINE WRPSO, WRIPO /WRITE PACKED STRING TO OLINE WRPS, WPSTR /WRITE PACKED STRING TO OUTPUT WRSTPO, WRSPO /WRITE STRING TO POLINE (PTR IN AC) WRSTR, WRSTRG /WRITE STRING (PTR IN AC) TO OUTPUT WRSTRO, WRSTO /WRITE STRING (PTR IN AC) TO OLINE
/ THIS IS THE FRONT END OF THE COMPILER. INPUT AND OUTPUT FILES /ARE SETUP VIA THE COMMAND DECODER. *200 SNOBOL, ZERO CDF 0 CIF 10 JMS I USR /CALL THE USR 10 /LOCK IT IN CORE CIF 10 JMS I LUSR /CALL AGAIN 5 /FOR THE CD 2316 /"SN" - DEFAULT EXTENSION 0 /PRESERVE TENTATIVE FILES TAD (IFLTAB DCA INFLPT /POINTER TO INPUT FILE LIST TAD NC10 DCA INFLPT+1 /AND COUNT TAD (OUTHAN /WHERE TO PUT HANDLER IAC /2 PAGE HANDLER IS OK DCA OFHANL CDF 10 TAD I (OFLTAB+1 /TRANSFER OUTPUT FILENAME TO PAGE ZERO DCA ONAME TAD I (OFLTAB+2 DCA ONAME+1 TAD I (OFLTAB+3 DCA ONAME+2 TAD I (OFLTAB+4 DCA ONAME+3 TAD (ONAME DCA OFLNM /SAVE ADDRESS OF FILE NAME TAD I (OFLTAB /GET OUTPUT FILE DEVICE # DCA OFLAG TAD OFLAG /FLAG WHETHER ITS SPECIFIED OR NOT SNA /SPECIFIED? JMP FRONT1 /NO
/ GET THE OUTPUT HANDLER CDF 0 /SET THE BASE FIELD CIF 10 JMS I LUSR /CALL 1 /TO FETCH THE HANDLER OFHANL, 0 /LOCATION OF HANDLER HLT /NO TAD OFLAG /GET DEVICE NUMBER CIF 10 JMS I LUSR /CALL 3 /TO ENTER OFLNM, ONAME /FILENAME OFLEN, 0 JMP ERR24 /CANT ENTER CDF 10 TAD OFHANL /GET LOCATION OF HANDLER DCA OHAN /SAVE TAD OFLNM /GET STARTING BLOCK DCA FOUTBK TAD FOUTBK DCA I (OUTBLK TAD OFLEN / CLL CML RAR /CoNVERT TO TWO BLOCK SIZE DCA I (OBCNT /SAVE NEGATIVE LENGTH TAD (OBUF DCA OCURSR /SETUP THE OUTPUT CURSOR ONE DCA OCURSR+1 TAD (TOPF1 DCA I (BASE /SETUP POINTERS TO THE BOTTOM OF FREE SPACE TAD (TOPF1 DCA TOP FRONT1, CDF 0 CIF 10 JMS I LUSR /CALL ONCE MORE 11 /TO BE DISMISSED TAD OFLAG SNA CLA /DOING OUTPUT? JMP FRONT4
CDF 10 TAD (INITAL /INITIALIZATION MESSAGES JMS I WRPS /WRITE IT TAD I (7666 /GET SYSTEM DATE WORD SNA /SPECIFIED? JMP FRONT2 /NO DCA TX TAD TX AND C7 /SAVE YEAR TAD C260 DCA I (YEAR TAD TX RTR; RAR /SHIFT FOR DAY DCA TX TAD (DAY-1 DCA INDEX1 /WHERE TO PUT DAY TAD TX AND (37 /SAVE DAYS JMS I CONVD /CONVERT TO DECIMAL TAD (MONTH-1 DCA INDEX1 TAD TX RTR; RTR; RAR AND (17 /SAVE MONTH JMS I CONVD /PUT IT TAD (MONTH-1 /MESSAGE JMS I WRSTR /PUT IT FRONT2, TAD (INITA2 /INITIAL CODE JMS I WRPS / JMP I (.&7600+200 /*** PAGE BOUND PAGE
/ INITIALIZE COUNTERS, POOLS, ETC. FRONT4, CDF 0 TAD (F0CLR-1 /CLEAR FIELD 0 IMPURE AREA DCA INDEX1 TAD (-F0CLRL DCA TX DCA I INDEX1 ISZ TX JMP .-2 CDF 10 TAD (F1CLR-1 /CLEAR FIELD 1 IMPURE AREA DCA INDEX1 TAD (-F1CLRL DCA TX DCA I INDEX1 ISZ TX JMP .-2 TAD (1-LINEL DCA IMCNT /MAX LINE LENGTH TAD (LINEIM-1 DCA LINEP /PTR TO LINE BUFFER TAD (-NTOPIB DCA CURSOR ONE /INITIALIZE THE INPUT CURSOR DCA CURSOR+1 TAD C5 DCA PAGLEN /LENGTH OF OBJECT PAGE
/ THIS IS THE MAIN LOOP FOR ASSIGNING ANOTHER INPUT FILE FOR /COMPILATION. IF THERE ARE NO MORE, CLOSE IS CALLED. NEXTIN, ISZ INFLPT+1 /ANY MORE? SKP /YES JMP CLOSE /NO - DONE TAD I INFLPT /GET NEXT DEVICE NUMBER SNA /ANY? JMP CLOSE /NO - DONE RTR; RTR /GET MINUS LENGTH AND C377 TAD (7400-1 /EXTEND SIGN DCA I (IBCNT /AND SAVE TAD (INHAN /AREA FOR INPUT HANDLER IAC /2-PAGER IS OK DCA IFHANL TAD I INFLPT /GET DEVICE # AGAIN CDF 0 CIF 10 JMS I USR /CALL THE USR 1 /TO GET THE HANDLER IFHANL, 0 HLT /SHOULDN'T TAD IFHANL /LOCATION OF HANDLER DCA IHAN /SAVE IT /FROM HERE ON, THE DATA FIELD IS ONE EXCEPT FOR USR AND HANDLER CALLS CDF 10 ISZ INFLPT /POINT TO NEXT WD TAD I INFLPT /GET STARTING BLOCK # DCA I (INBLK /SAVE IT ISZ INFLPT /AND BUMP
/ THIS IS THE MAIN COMPILER LOOP. PARSING EACH NEW INPUT LINE /IS BEGUN HERE. MAIN, NONE DCA TRASEN /TRANSFER NOT SEEN YET DCA MODECH /MODE NOT CHANGED DCA CLEN /ZERO LENGTH DCA ARGCNT /ZERO ARGUMENT LIST TAD I (MODE DCA TMODE /SETUP CURRENT MODE JMS I INTST /TEST FOR INTERRUPT
/SCAN FOR A LABEL OR STATEMENT MAIN00, TAD (ANY DCA VALID /VALID TYPE TO BE FOUND BY SCAN JMS I SCAN /GET THE FIRST ATOM TAD ACCNUM SZA CLA /A NUMBER? JMP ERR5 /YES TAD I ACUM SZA CLA /NO - A WORD? JMP MAIN01 /YES NTWO /(-SLASH) TAD DEL /NO - GET THE DELIMITER SNA /COMMENT? JMP END6 /YES TAD NC6 /(-EOL) SNA /END OF LINE? JMP MAIN /YES - GO AGAIN TAD NC1 SNA /END OF FILE? JMP NEXTIN /YES - GET ANOTHER FILE TAD NC10 /(END-COLON) SNA /COLON? JMP END2 /YES TAD NC2 /(COLON-UPARR) SZA CLA /UPARROW? JMP ERR10 /NO - SOURCE ERROR TAD MODECH /GET THE MODE CHANGED FLAG SZA CLA /HAS IT? JMP MAIN0A /YES ISZ MODECH /NO - SO NOW IT DOES TAD TMODE CMA /AND COMPLEMENT THE MODE FLAG DCA TMODE MAIN0A, TAD TMODE / SNA CLA /SNOBOL MODE NOW? JMP MAIN00 /YES - GO AGAIN ISZ CLEN /NO - BUMP THE INST LENGTH TAD LINEP DCA TX /GET POINTER TO UPARROW IN SOURCE TAD C240 DCA I TX /REPLACE BY A SPACE JMP MAIN00 /GO AGAIN PAGE
/HERE IF A NAME WAS FOUND FIRST ON THE LINE MAIN01, TAD DEL /GET THE DELIMITER TAD (-COMMA /WAS IT A COMMA? SZA CLA JMP MAIN02 /NO TAD LITFND SNA CLA /WAS IT A LITERAL? JMP ERR5 /YES - ERROR DCA I (ACCUM+6 /STRDEL TAD ACUMM JMS I WRSTPO /WRITE ON PRE-OLINE TAD (254 / JMS I WRPOLN /AND A COMMA JMP MAIN00 /AND GET ANOTHER ATOM MAIN02, TAD TMODE SZA CLA /PAL MODE? JMP PALEND /YES - HANDLE PAL END OF LINE / HERE WHEN WE HAVE A NAME NOT DELIMITED BY A COMMA IN SNOBOL MODE. /PRESUMABLY, IF IT BEGINS WITH A PERIOD, IT IS A STANDARD SNOBOL COMMAND /LINE, OTHERWISE IT IS PATTERN MATCHING OR ASSIGNMENT. MAIN05, TAD I ACUM /GET FIRST CHAR OF NAME TAD (-256 SZA CLA /PERIOD? JMP MAIN50 /NO MUST BE ASSIGNMENT OR PATTERN MATCHING JMS I SHACUM /SHIFT ACCUM ONE LEFT TAD (CMDTAB /PTR TO COMMANDS TABLE DCA T1 / NONE /ONE INFORMATION WORD AFTER STRDEL DCA T2 /IN THE COMMAND POOL TAD ACUMM /POSITION OF ARGUMENT JMS I SEARCH /MATCH FOUND? JMP ERR15 /NO JMS I RDPOOL /YES - GET VALID ARG TYPES HLT DCA VALID /SAVE TAD VALID AND (CCONTR /TEST FOR COMPILER CONTROL STA SZA CLA /IS IT? JMP MAIN15 /YES ISZ CLEN /NO - BUMP OBJ LENGTH TAD (LITJMS /"JMS I X" JMS I WRPSO JMS I PUTACR /PUT ACCUM TO OLINE
/ THIS CODE HANDLES ARGUMENTS TO THE POINT COMMANDS, THIS IS DIRECTED /BY THE 'VALID' CODES FOR EACH COMMAND. TAD VALID RTR /(NOARG=2) SZL CLA /NO ARGUMENT FOR THIS COMMAND? JMP END1 /NO - DO END OF LINE PARSE TAD DEL /GET THE DELIMITER TAD (-SPACE SZA CLA /MUST BE SPACE JMP ERR20 JMS I SCAN /GET NEXT ATOM TAD ACCNUM SZA CLA /NUMBER GIVEN? JMP ERR5 /YES - BAD ARGUMENT TYPE TAD I ACUM SNA CLA /ANY WORD? JMP ERR20 /NO - TOO FEW ARGUMENTS JMS I PUTACR /YES - WRITE ACCUM AND RETURN MAIN14, ISZ CLEN /ANOTHER WORD JMP END1 /FINISH THE END OF LINE /HANDLE COMPILER CONTROL STATEMENTS MAIN15, TAD VALID /GET WHICH INST AND (CPAL SZA CLA /.PAL STATEMENT? JMP MAIN16 /YES TAD VALID AND (CSNO /NO CHECK .SNOBOL COMMAND SZA CLA JMP MAIN20 /YES TAD (EXITCL /EXIT CALL JMS I WRPSO /WRITE IT ISZ CLEN JMP MAIN14 /FINISH PARSE
/.PAL COMMAND MAIN16, DCA ACCNUM /ARG TAD DEL SNA /DELIMITER A MINUS? JMP MAIN17 /NO TAD (-SPACE SZA CLA /DELIMITER A SPACE? JMP ERR14 /NO - BAD ARGUMENT NONE MAIN17, DCA T4 /MINUS SEEN FLAG MAIN18, JMS I GETCHR /GET NEXT CHAR JMP ERR6 / TAD NC260 SPA /OCTAL '0' OR ABOVE? JMP MAI19A /NO TAD NC10 SMA /RANGE 0 - 7? JMP MAIN19 /NO TAD C10 DCA TX TAD ACCNUM /GET SUM CLL RAL CLL RAL CLL RAL /SHIFT OVER TAD TX /ADD IN CHAR DCA ACCNUM /UPDATE JMP MAIN18 /AND AGAIN PAGE
/HERE WHEN LENGTH OF PAL CODE HAS BEEN ACCUMULATED MAIN19, TAD C10 MAI19A, TAD C260 /RECONSTITUTE THE CHARACTER DCA CHOLD /AND SAVE FOR EOL PARSE TAD ACCNUM /GET VALUE TAD (-200 SMA CLA /TOO BIG? JMP ERR16 /YES TAD ACCNUM /NO, GET IT AGAIN ISZ T4 /MINUS? CMA IAC /YES, DO IT DCA CLEN /LENGTH OF THIS BLOCK NONE DCA I (MODE /CHANGE MODE JMP ENDLIN /DO END OF LINE PARSE /.SNOBOL COMMAND MAIN20, DCA I (MODE /SNOBOL MODE JMP END1 /PARSE EOL
/ASSIGNMENT OR PATTERN MATCHING MAIN50, ONE /(VARORLIT) ARGUMENT TYPES ALLOWED DCA VALID DCA EQLSEN /EQUAL NOT SEEN YET TAD DEL /GET DELIMITER TAD (-EQUAL SNA CLA /ASSIGNMENT? JMP MAIN70 /YES DCA ARGCNT /CLEAR ARGUMENT COUNT TAD (PATCAL /PATTERN MATCH INITIALIZATION JMS I WRPSO /WRITE IT TAD SARG JMS I WROLIN /PUT ARGCNT SUBSTITUTE TAD DEL TAD NC12 /(-BACK) SZA CLA /BACKARROW? (ANCHOR MODE) JMP MAIN51 /NO TAD (NCMDF /FLAG ANCHOR MODE JMS I WRPSO / JMP MAIN52 MAIN51, JMS I RETORN /PUT CARRAIGE RETURN MAIN52, JMS I PUTACR /PUT ACCUM (BASE VARIABLE) THREE TAD CLEN DCA CLEN /UPDATE LENGTH NTHREE /(-STAR) TAD DEL /TEST LEGAL DELIMITERS SNA JMP MAIN59 /DO FILLER TAD NC7 /(STAR-BACK) SNA /BACKARROW? JMP MAIN53 /YES TAD (BACK-EQUAL SNA /AN EQUAL SIGN? JMP MAIN5A /YES TAD (EQUAL-SPACE SZA CLA /SPACE? JMP ERR14 /NO - SYNTAX ERROR
/MAIN PATTERN MATCHING PARSING LOOP MAIN53, ONE /(VAROLIT) DCA VALID JMS I SCAN /GET NEXT ATOM TAD ACCNUM SZA CLA /ACCUMULATED NUMBER? JMP ERR5 /YES - ERROR MAIN5B, TAD I ACUM / SZA CLA /ACCUMULATED ATOM? JMP MAIN56 /YES JMP MAIN55 /NO TEST DELIMITERS MAIN54, TAD DEL TAD (-OR /"!" SNA CLA /? JMP MAIN57 /YES MAIN55, NTWO /(-SLASH) TAD DEL SNA /COMMENT? JMP END6 TAD NC1 /(SLASH-STAR) SNA /IS IT A FILLER? JMP MAIN59 /YES TAD NC5 /(-STAR-EOL) SNA /END OF LINE? JMP I PUTOUT /YES - FINISH UP TAD NC1 /(EOL-END) SNA /END OF FILE? JMP I PUTOUT TAD (END-LESS SNA /FENCE (<) ? JMP MAIN58 /YES TAD NC1 /(LESS-EQUAL) SNA /EQUAL SIGN? JMP MAIN5A /YES TAD (-3 /(EQUAL-SPACE) SNA /SPACE? JMP MAIN53 /YES, GO AGAIN TAD NC1 /(SPACE-COLON) SNA CLA /COLON? JMP END2 /YES JMP ERR14 /NO - BAD DELIMITER PAGE
/HANDLE ACCUMULATED NAME MAIN56, ISZ CLEN /INST LENGTH ISZ ARGCNT /ARGUMENT COUNT JMS I PUTACR /PUT ACCUM JMP MAIN54 /AND CONTINUE /HANDLE OR MAIN57, ISZ EQLSEN /EQUAL SIGN SEEN? SKP /NO JMP ERR17 /YES - ERROR TAD I ACUM SNA CLA /WAS THIS PRECEDED BY AN ARG? JMP ERR18 /NO ISZ CLEN ISZ ARGCNT TAD (ORCODE JMS I WRPSO /WRITE AN OR CODE JMS I SCAN /GET NEXT TAD I ACUM SNA CLA /AN ARG HERE TOO? JMP ERR18 /NO - ERROR JMP MAIN56 /YES DO IT /HANDLE THE FENCE MAIN58, ISZ EQLSEN /EQUAL SIGN SEEN? SKP JMP ERR17 /YES TAD (FCODE /FENCE CODE JMS I WRPSO /PUT IT JMP MAIN5R /DONE /HANDLE AN EQUAL SIGN MAIN5A, ISZ EQLSEN /EQUAL ALREADY SEEN? SKP JMP ERR17 /YES TAD (EQUALC /EQUAL CODE JMS I WRPSO /PUT NONE DCA EQLSEN /SET FLAG MAIN5R, ISZ ARGCNT ISZ CLEN JMP MAIN53 /GO
/HANDLE A FILLER MAIN59, ISZ EQLSEN /EQUAL SEEN? SKP JMP ERR17 ISZ ARGCNT ISZ ARGCNT /UPDATE THE ARGUMENT COUNT ISZ CLEN ISZ CLEN /AND THE INST LENGTH TAD (VAR DCA VALID /VALID TYPE TO BE FOUND BY SCAN JMS I SCAN /GET THE FILLER VAR NAME TAD (FILLER JMS I WRPSO /GET THE BEGINNING FILLER CODE JMS I SAVACM /SAVE ACCUM TAD DEL TAD (-STAR SNA /ARBITRARY LENGTH FILLER? JMP MAIN62 /YES IAC SZA CLA /SLASH? JMP ERR14 /NO - ERROR ONE /(VARORLIT) DCA VALID /ARG TYPE JMS I SCAN /GET LENGTH TAD DEL TAD (-STAR SZA CLA /MUST BE MATCHING STAR JMP ERR14 /NO TAD ACCNUM SNA /SPECIFIC NUMBER? JMP MAIN63 /NO CLL RTL; RAL /SHIFT ONE OCTAL DIGIT UP DCA T1 NTHREE /COUNT DCA T2
/DECODE FILLER LENGTH MAIN61, TAD T1 RTL; RAL /SHIFT LEFT ONE DIGIT DCA T1 /UPDATE T1 TAD T1 RAL /SHIFT LEFTMOST DIGIT AROUND AND C7 TAD C260 /TURN DIGIT INTO CHAR JMS I WROLIN /WRITE IT ISZ T2 JMP MAIN61 /NOT YET MAIN62, TAD (FILEND JMS I WRPSO /WRITE FILLER END MAIN64, TAD ACMIND SZA CLA /INDIRECT? JMS I RETORN /YES - PUT RETURN FIRST TAD I (SACCUM /TEST FOR NULL NAME SNA CLA JMP MAIN65 TAD (SACCUM-1 /PUT THE VARAIBLE NAME JMS I WRSTRO MAIN66, JMS I RETORN /PUT A RETURN JMP MAIN5R /UPDATE ARGCNT, CLEN AND GO AGAIN
/MAKE XASC CALL FOR VARIABLE FILLER LENGTH MAIN63, JMS I MAKASC /MAKE ASC CALL TAD (SHFT3 JMS I WRPPSO /WRITE A SHIFT TAD (DCAGVC-1 JMS I WRSTPO /WRITE THE STORE JMS I RETORN /PUT RETURN TAD I (DCAGV /GET FINISHING LITERAL JMS I WROLIN /PUT IT TAD (STOR JMS I WRPSO /PUT STORAGE FOR IT FOUR TAD CLEN DCA CLEN /UPDATE THE LENGTH OF THE INST JMP MAIN64 /GO PAGE MAIN65, TAD C260 /NULL NAME - PUT A ZERO JMS I WROLIN JMP MAIN66
/HANDLE SIMPLE ASSIGNMENT STATEMENTS - EITHER PATTERN MATCHING /OR ARITHMETIC MAIN70, JMS I SAVACM /SAVE ACCUM ONE DCA LAST /LAST DELIMITER SEEN (1 = ADD) JMS I SCAN /GET NEXT ATOM TAD (ARGENV-1 /ARITH GEN VAR TABLE DCA AGVPTR /PTR TAD NC10 DCA AGVCNT /COUNT TAD DEL /GET THE DELIMITER SNA /SUBTRACTION? JMP MAIN74 /YES TAD NC1 SNA CLA /ADDITION? JMP MAIN74 /YES TAD ACCNUM SZA CLA /NO, ANY ACCUMULATED NUMBER? JMP ERR5 /YES - ERROR TAD (PATCAL JMS I WRPSO /WRITE PATTERN HEADER TAD SARG JMS I WROLIN /ARGCNT SUBSTITUTE JMS I RETORN /RETURN TAD (SACCUM-1 JMS I WRSTRO /PUT BASE VARIABLE JMS I RETORN TAD (EQUALC JMS I WRPSO /WRITE EQUAL CODE ONE DCA ARGCNT /SET THE ARG LENGTH COUNT FOUR TAD CLEN DCA CLEN JMP MAIN5B /HANDLE NAME
/HANDLE ARITHMETIC ASSIGNMENT STATEMENTS MAIN73, JMS I SCAN /GET NEXT ATOM MAIN74, TAD ACCNUM SZA CLA /CONSTANT? JMP MAIN77 /YES TAD I ACUM SNA CLA /VAR GIVEN? JMP MAIN75 /NO JMS I MAKASC /WRITE A CALL TO ASC TAD LAST SZA CLA /NEGATIVE OF THIS NAME? JMP MAIN7A TAD (COMPC JMS I WRPPSO /YES - WRITE COMPLEMENT ISZ CLEN MAIN7A, TAD (DCAGVC-1 JMS I WRSTPO /WRITE A STORE ISZ CLEN TAD I (DCAGV /GET LIT ISZ AGVCNT /LIT OVERFLOW? SKP JMP ERR25 /YES DCA I AGVPTR /NO - PUT INTO LIST TAD I (DCAGV /GET GEN'ED LIT DCA I (TADGV TAD (TADCON-1 /DO A TAD OF IT JMS I WRSTRO / ISZ CLEN
/HANDLE NEXT DELIMITER MAIN75, TAD DEL SNA /MINUS? JMP MAIN76 /YES TAD NC1 SZA CLA /NO, ADDITION? JMP MAIN79 /NO, FINISH UP ONE /YES MAIN76, DCA LAST /UPDATE LAST DELIMITER JMP MAIN73 /AND GO AGAIN /HANDLE CONSTANT MAIN77, DCA I (TADGV /NO GENERATED LITERAL TAD (TADCON-1 / JMS I WRSTRO /WRITE TAD TAD ("( JMS I WROLIN /PUT CONSTANT ISZ CLEN ISZ CLEN /INST LENGTH TAD LAST /GET LAST DELIM SZA CLA /SUBTRACTION? JMP MAIN78 /NO TAD ("- /YES JMS I WROLIN /PUT A MINUS MAIN78, TAD ACCNUM /GET THE CONST JMS I WROCO /WRITE IT JMS I RETORN JMP MAIN75 /GO
/FINISH UP AFTER ARITHMETIC ASSIGNMENT MAIN79, TAD (LITJMS /INT CALL JMS I WRPSO /WRITE IT TAD (XINT JMS I WRPSO TAD (SACCUM-1 JMS I WRSTRO /WRITE THE BASE VAR JMS I RETORN ISZ CLEN ISZ CLEN TAD C10 TAD AGVCNT /ANY GENED LITS FOR THIS STA? SNA JMP END1 /NO - PROCEED CMA IAC /YES DCA AGVCNT /SAVE NEG COUNT TAD (ARGENV-1 /PTR TO TABLE DCA AGVPTR / TAD (JMPCAL JMS I WRPSO /JUMP AROUND LITS JMP I (.&7600+200 /***PAGE BOUNDS PAGE TAD AGVCNT CMA IAC; IAC / JMS I WROCO /DISTANCE JMS I RETORN ISZ CLEN MAIN80, TAD I AGVPTR /GET NEXT JMS I WROLIN /WRITE VAR TAD (STOR JMS I WRPSO /WRITE STORAGE ISZ CLEN ISZ AGVCNT /DONE? JMP MAIN80 /NO JMP END1 /YES
/THIS ROUTINE HANDLES THE END OF LINE PARSING. FROM THE INPUT /CURSOR ON TO THE END OF THE LINE SHOULD BE ONLY (AT THE /MOST) A TRANSFER SPECIFICATION, OR A COMMENT FIELD. ENDLIN, TWO /(NOARG) DCA VALID /AN ARGUMENT IS ILLEGAL JMS I SCAN /GET THE NEXT ATOM END1, NTWO /(-SLASH) TAD DEL /GET THE DELIMITER SNA /COMMENT? JMP END6 /YES TAD NC6 /(SLASH-EOL) SNA /END OF LINE? JMP I PUTOUT /YES - PUT OUTPUT LINE TAD NC1 SNA /END OF FILE? JMP I PUTOUT /YES TAD NC7 /(END-SPACE) SNA /SPACE? JMP ENDLIN /YES - TRY AGAIN TAD NC1 /(-COLON) SZA CLA /COLON (TRANSFER)? JMP ERR14 /NO END2, ISZ TRASEN /TRANSFER ALREADY SEEN? JMP ERR19 /YES - ERROR JMS I GETCHR /GET THE NEXT CHAR JMP ERR6 DCA LAST /SAVE IT TAD LAST TAD (-"( /OPEN PARENTHESIS? SNA /I.E. UNCONDITIONAL TRANSFER? JMP END4 /YES TAD (-36 /(-"F) SNA /FAIL CONDITION? JMP END3 TAD (-15 /NO - -"S SZA CLA /MUST BE SUCCESS CONDITION JMP ERR10 TAD ("N-"Z
END3, TAD ("Z DCA I (TESTQ /PUT CONDITION IN TEST TWO /(NOARG) DCA VALID /VALID TYPE JMS I SCAN /GET THE NEXT TAD DEL TAD NC6 /(-LPAREN) SZA CLA /NOW MUST BE OPEN PAREN JMP ERR14 TAD (TESTSF-1 JMS I WRSTRO /WRITE TEST ISZ CLEN ISZ CLEN JMP END4+1 /PARSE LABEL PART OF TRANSFER FIELD END4, DCA LAST /UNCONDITIONAL TAD (JMPTR+LABEL / DCA VALID /FIND LABEL JMS I SCAN /GET NAME TAD I ACUM SNA CLA /ANY? JMP ERR20 /NO TAD DEL TAD NC4 /(-RPAREN) SZA CLA /MUST BE CLOSE JMP ERR14 TAD (JMPLAB JMS I WRPSO /WRITE JMP JMS I PUTACR /PUT ACCUM TAD ACMIND SNA CLA /IS ACCUM INDIRECT? JMP END7 /NO TAD LAST /GET TRANSFER CONDITION SZA CLA /MUST BE UNCONDITIONAL JMP ERR11 TAD (STOR /STORAGE DEFINITION JMS I WRPSO /WRITE IT JMP END7
END7, ISZ CLEN ISZ CLEN /BUMP INST LENGTH CNT JMS I GETCHR /GET NEXT JMP I PUTOUT DCA T1 TAD T1 TAD (-"F /FAIL NOW? SNA JMP END5 /YES TAD (-15 SNA CLA /SUCCESS? JMP END5 TAD T1 /NO - DCA CHOLD /SAVE THE CHARACTER JMP ENDLIN /AND PROCESS IT PAGE END5, TAD LAST SNA /UNCONDITIONAL BEFORE? JMP ERR19 /YES CMA IAC TAD T1 /SAME CONDITION? SNA CLA JMP ERR22 /YES JMS I GETCHR /GET THE PAREN JMP ERR6 /NO TAD (-"( SZA CLA /MUST BE JMP ERR14 /NOT JMP END4 /DO THAT LABEL /COMMENT - SCAN UNTIL THE END OF THE LINE IS READ END6, JMS I ENDRD /READ THROUGH END OF LINE JMP I PUTOUT
/tHIS ROUTINE HANDLES THE END OF LINE ACTION FOR PAL MODE STATEMENTS PALEND, TAD MODECH SNA CLA /DID THE MODE CHANGE? JMP PALEN2 /NO TAD ("/ JMS I WRPOLN /YES - NOTE A COMMENT TAD CLEN CMA IAC DCA T1 /SAVE THE CoUNT OF WORDS PALEN1, TAD ("^ /WRITE ENOUGH UPARROWS JMS I WRPOLN ISZ T1 JMP PALEN1 TAD (RETURN-1 JMS I WRSTPO /PUT A RETURN AFTER THEM /NOW wRITE THE PAL LINE PALEN2, TAD ACUMM JMS I WRSTRO /PUT ACCUM TO OLINE TAD (1-LINEIM TAD LINEP SNA CLA /IS THE LINE ALREADY FINISHED? JMP PALEN4 /YES TAD C240 /PUT AN EXTRA SPACE JMS I WROLIN TAD I (CDEL /GET DELIMITER JMS I WROLIN /PUT IT AFTER ACCUM PALEN3, JMS I GETCHR /GeT tHE NEXT CHARACTER JMP I PUTOUT TAD NC212 SNA /END OF LINE? JMP PALEN4 TAD (212 /NO - RESTORE THE CHARACTER JMS I WROLIN /AND WRITE IT JMP PALEN3 PALEN4, TAD (RETURN-1 JMS I WRSTRO /PUT FINAL RETURN JMP I PUTOUT PAGE
/HERE TO WRITE OUT POLINE AND OLINE AND SETUP FOR THE NEXT STATEMENT. PTOUT, ZERO TAD (-176 TAD PAGLEN /WILL THIS INST FIT ON THIS PAGE? TAD CLEN /GET SUM OF SIZES SPA CLA /? JMP PUT0 /YES - GO AHEAD TAD (PAGJMP /JMP CODE JMS I WRPS /WRITE DIRECTLY ONTO OUTPUT ISZ PAGLIT TAD PAGLIT /GET A NEW PAGE LITERAL JMS I PUTOC /PUT THE NUMBER TAD (PAGFIN /FINISH INFO JMS I WRPS /PUT IT DCA PAGLEN /ZERO NEW PAGE LENGTH PUT0, TAD CLEN TAD PAGLEN /GET NEW PAGE SIZE DCA PAGLEN /AND SAVE TAD TMODE SZA CLA /PAL MODE? JMP PUT7 /YES - DON'T PUT SOURCE TAD ("/ JMS I PUTCHR /COMMENT OUT THE LINE JMS I (PLINE /PUT SOURCE LINE ONTO OUTPUT TAD (RETURN-1 JMS I WRSTR /PUT EOL PUT7, NONE DCA OUTF /OLINE NOT PUT YET NTHREE DCA I COLINE /CLOSE OLINE NTHREE DCA I CPOLINE /AND POLINE TAD I (POLINE /PRE-OUT FIRST SNA JMP PUT4 /EMPTY - SKIP IT
/DO TRANSFER FROM THE OUTPUT POOLS TO OUTPUT PUT1, DCA T1 PUT2, JMS I RDPOOL /READ FROM POOL JMP PUT4 /DONE DCA T2 TAD T2 AND SARG /SUBSTITUTE? SZA CLA JMP PUT3 /YES TAD T2 JMS I PUTCHR /NO - WRITE IT JMP PUT2 /AND AGAIN PUT3, TAD T2 /GET ARG TAD SARG / SNA CLA /ARGCNT SUBSTITUTE? JMP PUT6 /YES TAD ("X /NO - SUBSTITUTE "XL<NUM>" JMS I PUTCHR TAD ("L JMS I PUTCHR /PUT THEM TAD T2 TAD SARG /SUBTRACT SARG JMS I PUTOC /PUT IT JMP PUT2 /AND AGAIN PUT4, ISZ OUTF /OLINE DONE YET? JMP PUT5 /YES TAD I (OLINE /NO - USE IT SZA JMP PUT1 /GO PUT5, TAD I (POLINE JMS I DELPOL /DELETE POLINE DCA I (POLINE /DELETE PTR DCA CPOLINE TAD I (OLINE JMS I DELPOL /AND OLINE DCA I (OLINE /AND THE PTR DCA COLINE JMP MAIN /AND NEXT LINE PUT6, TAD ARGCNT /SUBSTITUTE ARGCNT - GET IT JMS I PUTOC /WRITE IT JMP PUT2 /AND AGAIN PAGE
/ THIS ROUTINE HAS THE RESPONSIBILITY OF PERFORMING PRIMARY PARSING /OF THE INPUT FILE. ON A CALL TO SCAN, THE INPUT LINE IS READ UNTIL /A DELIMITER IS FOUND. ANY IDENTIFIER IS STORED IN ACCUM, ANY NUMBER /ACCUMULATION IS PERFORMED AND STORED INTO ACCNUM. IF THE DELIMITER /IS A SPACE, SCAN WILL SEARCH FOR THE NEXT DELIMITER AFTER THAT, IF /NONE, THEN SPACE IS RETURNED AS THE DELIMITER. ARGUMENT ACCUMULA- /TION IS GUIDED BY THE CODE CONTAINED IN LOCATION VALID. ZERO /CLEAR AC VIA SCANNR-2 JMP I SCANNR /RETURN VIA SCANNR-1 SCANNR, 0 DCA ACMIND /CLEAR ACCUM IS INDIRECT FLAG DCA LABELF /CLEAR LABEL FLAG DCA PTATOM /CLEAR "THIS IS" .A ATOM FLAG DCA ACCNUM /CLEAR ACCUMULATED NUMBER DCA DEL /CLEAR DEL DCA LITFND /LITERAL FOUND FLAG TAD NC10 DCA T3 /COUNT FOR ACCUM TAD ACUMM DCA INDEX1 /SETUP PTR TAD ACUMM DCA INDEX7 TAD NC10 DCA TX DCA I INDEX7 /CLEAR ACCUM ISZ TX JMP .-2 /ALL OF IT SCAN00, TAD (DELST-1 DCA INDEX6 /PTR TO DELIMITERS JMS I GETCHR /GET NEXT CHAR JMP SCAN08 DCA T4 TAD T4 TAD (-"" SNA /DOUBLE QUOTE? JMP SCAN09 /YES TAD NC5 /' SNA CLA /SINGLE? JMP SCAN09 /YES SCAN01, TAD T4 /GET CHAR AGAIN TAD I INDEX6 /GET NEGATIVE DELIMITER SNA CLA /MATCH? JMP SCAN06 /YES TAD I INDEX6 /GET THE DELIMETER CODE SZA CLA /NULL? JMP SCAN01 /NO - TRY NEXT
TAD DEL /GET DELIMITER SNA CLA /ALREADY FOUND? JMP SCAN02 /NO TAD T4 /YES, HOLD THIS CHARACTER DCA CHOLD JMP SCAN07 /AND DONE SCAN02, TAD LITFND /LITERAL FOUND ALREADY? SZA CLA JMP SCAN05 /YES TAD I ACUM SZA CLA /NAME ACCUMULATED? JMP SCAN04 /YES TAD T4 /NO, GET CHAR TAD NC260 SPA /BELOW "0"? JMP SCAN03 /YES, NOT NUMBER TAD NC12 / SMA /DIGIT? JMP SCAN03 /NO TAD C12 /YES - GET BACK NUMBER DCA TX /SAVE IT TAD TMODE SZA CLA /sNOBOL MODE? JMP SCAN04 /NO - DON'T CONVERT THE NUMBER TAD NC12 /DECIMAL -10 DCA T1 /COUNT TAD ACCNUM /GET SUM ISZ T1 /MULTIPLY BY 10 JMP .-2 TAD TX /AND ADD IN NEW DIGIT DCA ACCNUM /UPDATE SUM JMP SCAN00 /GO AGAIN SCAN03, ZERO TAD ACCNUM /CHAR IS NOT A NUMBER SZA CLA /ANY ACCUMULATED NUMBER? JMP ERR4 /YES - ERROR SCAN04, ISZ T3 /INC ACCUM CNT TAD T3 /GET THE CNT SMA CLA /ACCUM FULL? JMP SCAN00 /YES - THROW AWAY CHAR TAD T4 DCA I INDEX1 /NO, SAVE CHAR JMP SCAN00 /AND DO THE NEXT ONE
SCAN05, TAD (SPACE DCA DEL /FORCE SPACE TAD T4 DCA CHOLD /HOLD THIS CHARACTER JMP SCAN07 /AND ALMOST DONE SCAN06, TAD I INDEX6 /DELIMITER FOUND - GET CODE DCA DEL /SAVE TAD T4 DCA I (CDEL /SAVE THAT DELIMITER TAD ACCNUM TAD LITFND TAD I ACUM SZA CLA /ANY ARGUMENTS FOUND? JMP SCAN0A /YES TAD DEL TAD (-SPACE SZA CLA /SPACE AS A DELIMITER? JMP SCAN0A DCA DEL /YES - CLEAR DEL JMP SCAN00 /AND IGNORE THE SPACE SCAN0A, TAD DEL TAD (-SPACE /IS IT A SPACE? SNA CLA JMP SCAN00 /YES, TRY TO FIND A BETTER ONE SCAN07, TAD ACCNUM SZA CLA /ACCUMULATED NUMBER? JMP SCANNR-1 /YES TAD I ACUM ISZ LITFND /LITERAL FOUND? SNA CLA /OR NO ACCUMULATED NAME? JMP SCANNR-2 /YES - DONE JMP SCAN22 SCAN08, TAD (END /END OF FILE DCA DEL JMP SCANNR-1 /DONE PAGE
/HERE TO HANDLE A LITERAL. THE LITERAL WILL BE STORED JUST ABOVE /THE TOP OF USED STORAGE IN FIELD 1. IF IT IS ALREADY IN A POOL, /THEN THE NAME IS RETURNED, OTHERWISE, IT IS ADDED TO THE APPROP- /RIATE POOL AND THE NEW NAME IS RETURNED. SCAN09, TAD LITFND TAD I ACUM SZA CLA /ANY ATOM? JMP SCAN05 /YES - USE IT TAD VALID /NO, GET VALID ARG TYPES AND (VARORLIT SNA CLA /APPROPRIATE? JMP ERR5 /NO TAD T4 /GET TYPE OF QUOTE CMA IAC DCA T3 /SAVE NEGATIVE JMS I GETCHR /GET BUT DON'T MODIFY THE NEXT CHAR JMP ERR6 DCA T1 TAD T1 TAD T3 /GET THE INITIAL QUOTE CHARACTER SZA CLA /NULL STRING? SCAN10, TAD T1 /NO - USE THE CHARACTER AND C7 /HASH FOR LITERAL POOLS DCA LPOOL /SAVE IT NONE DCA LITFND /LITERAL FOUND FLAG THREE TAD TOP DCA NXTSTR /GET A FREE ADDRESS NONE DCA I TOP TAD TOP DCA INDEX2 NONE DCA I INDEX2 /FREE UP TWO LOCATIONS AT TOP DCA I INDEX2 /SAVE STRDEL TAD NXTSTR DCA INDEX6 /SAVE PUT PTR TAD T1 /GET CHARACTER AGAIN ISZ PTATOM /IS THIS A .A LITERAL? JMP SCAN12 /NO JMP SCAN13 /YES
SCAN11, JMS I GETCHR /GET AND DON'T MODIFY CHAR JMP ERR6 DCA T1 /SAVE IT TAD T1 SCAN12, TAD T3 /GET FINAL QUOTE CHAR SNA CLA /IS THIS IT? JMP SCAN14 /YES TAD T1 DCA I INDEX6 /NO, PUT CHAR JMP SCAN11 /AND ON SCAN13, DCA I INDEX6 /.A ATOM - PUT THE LITERAL SCAN14, DCA I INDEX6 /STRDEL TAD (LITS /LITERAL POINTERS TAD LPOOL /WHICH ONE DCA T4 TAD I T4 /GET THE PTR SNA /EMPTY? JMP SCAN15 /YES IAC /SKIP THE NAME WORD DCA T1 /SAVE POINTER FOR SEARCH NONE /ONE INFO WORD AFTER STRDEL IN LITERAL DCA T2 /POOLS (EXCEPT THE LAST STRING BECAUSE THE /WORD ACTUALLY PRECEEDS THE STRINGS) TAD NXTSTR /SEARCH LITERAL POOL FOR NEW LITERAL JMS I SEARCH /HAS THE STRING ALREADY BEEN ENTERED? JMP SCAN20 NONE TAD T1MAT /YES - POINT TO LITERAL NAME DCA T2 TAD I T2 /GET THE LITERAL NAME TAD SARG /FLAG SUBSTITUTE DCA I ACUM JMP SCAN21
/HERE TO ADD THE NEW STRING TO THE APPROPRIATE POOL SCAN15, NONE TAD NXTSTR DCA TX NONE DCA I TX /FREE UP EXTRA STRDEL ISZ NXTSTR /DON'T INCLUDE INITIAL STRDEL SCAN16, NONE TAD NXTSTR /POINT TO THE NEW STRING DCA I T4 /SAVE IN POOL ISZ GENLIT /GENERATE A NEW LITERAL TAD GENLIT /GET IT TAD SARG /ADD IN SUBSTITUTE BIT DCA I ACUM /SAVE LITERAL TAD GENLIT DCA I INDEX2 /PUT BEFORE STRING IN POOL NTHREE DCA I INDEX6 /PUT POLEND ONE TAD INDEX6 DCA TOP /UPDATE THE TOP POINTER JMP SCAN21 /DONE
SCAN20, NONE /LITERAL NOT IN POOL TAD T1 DCA T4 /POS OF LIT POOL STRDEL BEFORE POLEND NTWO /LINK CODE DCA I T4 /PUT IT ISZ T4 /POINT TO LINK ADDRESS JMP SCAN16 /ADD NEW STRING TO POOL /DONE STRING ACCUMULATION SCAN21, TAD PTATOM SNA CLA /WAS THIS A .ANNN LITERAL? JMP SCANNR-1 /YES - THEN DONE TAD (SPACE /NO - FORCE A SPACE DCA DEL /AS A DELIMITER JMP SCAN00 /BUT LOOK FOR A BETTER ONE /@ SEEN - HANDLE INDIRECT FOR ACCUM SCAN2G, ISZ ACMIND /SET FLAG FOR INDIRECT JMS I SHACUM /SHIFT ACCUM TAD I ACUM TAD (-330 JMP SCAN2I PAGE
/ADD ACCUMULATED NAME TO VARPOL OR LABPOL SCAN22, NTWO /(NOARG) TAD VALID /GET VALID TYPE SNA CLA /NO ARGUMENT ALLOWED? JMP ERR5 /YES - ERROR TAD I ACUM /NO - GET THE FIRST CHARACTER TAD (-256 SNA /PERIOD? JMP SCAN27 /YES DCA TX TAD TMODE /GET THE COMPILER MODE SZA CLA /SNOBOL MODE? JMP SCAN2S /NO - ONLY LOOK AT LABELS SCAN2T, TAD TX / TAD (-22 SNA /"@" INDIRECT? JMP SCAN2G /YES TAD (-30 SCAN2I, SNA /NO, "X"? JMP ERR7 /YES - RESTRICTED TAD (27 SPA /A LETTER? JMP ERR10 /NO TAD (-32 SMA CLA /? JMP ERR10 /NO DCA I (ACCUM+6 /TRUNCATE TO SIX CHARACTERS TAD (SPFNPL /SPECIAL FUNCTION POOL DCA T1 DCA T2 /NO INFO WORDS TAD ACUMM JMS I SEARCH /IS THIS IDENTIFIER A FUNCTION? JMP .+2 JMP SCAN2P /YES - JUST RETURN IT ONE TAD TOP DCA INDEX3 /PTR TO FREE SPACE TAD INDEX3 DCA NXTSTR /SAVE IT NONE DCA I TOP NONE DCA I NXTSTR /FREE UP SPACES AT TOP DCA I INDEX3 /STRDEL TO COVER ANY PREVIOUS NAME TAD ACUMM DCA INDEX1 /SETUP READ PTR
SCAN23, TAD I INDEX1 /GET NEXT SNA /DONE? JMP SCAN24 /YES DCA TX TAD TX TAD NC260 /CHECK FOR ALPHA OR NUMERIC SPA / JMP ERR10 TAD NC12 SPA /NUMBER? JMP SCAN2H /YES TAD NC7 SPA /ALPHABETIC? JMP ERR10 /NO TAD (-32 SMA CLA /? JMP ERR10 SCAN2H, ZERO TAD TX /CHAR IS OK, GET IT BACK DCA I INDEX3 /PUT IT JMP SCAN23 /CONTINUE SCAN2P, TAD DEL TAD (-COMMA SZA CLA /IS THIS A LABEL? JMP SCANNR-1 /NO - DONE TAD VALID TAD (-ANY SZA CLA /IS IT REALLY A LABEL? JMP SCANNR-1 JMP ERR7 /YES - CANNOT BE A SPECIAL FUNCTION NAME SCAN2S, TAD DEL TAD (-COMMA /IS THIS A LABEL? SZA CLA JMP SCANNR-1 /NO - DONE JMP SCAN2T /YES - PROCESS IT
/HERE WHEN ACCUM IS CHECKED AND STORED - PUT POOL DELIMITERS /AND TEST IF THIS NAME IS ALREADY IN A POOL. SCAN24, DCA I INDEX3 /STRDEL TAD DEL /GET THE DELIMITER TAD (-COMMA /LABEL? SNA CLA /? JMP SCAN2D /YES TAD ACMIND SZA CLA /INDIRECT? JMP SCAN2J /YES - VAR TAD VALID AND (LABEL /IS THIS A LABEL REF? SZA CLA JMP SCAN2N /YES SCAN2J, TAD (VARPOL /USE VARIABLE POOL JMP SCAN2K SCAN2D, TAD VALID TAD (-ANY SZA CLA /IS THIS REALLY A LABEL? JMP ERR14 /NO - BAD DELIMETER ISZ LABELF /FLAG LABEL BEING pROCESSED TAD ACMIND /INDIRECT? SZA CLA /MUST NOT BE JMP ERR11 SCAN2N, TAD ACMIND SZA CLA JMP SCAN2J /INDIRECT LABEL REF THROUGH A VARIABLE TAD (LABPOL /USE THE LABEL POOL JMP I (.&7600+200 /***PAGE BOUNDS PAGE SCAN2K, DCA T4 /SAVE POOL HEADER ADDRESS TAD I T4 /GET THE POOL LOCATION SNA /POOL EMPTY? JMP SCAN2Q DCA T1 /NO - SAVE PTR DCA T2 /NO INFO WORDS TAD ACUMM JMS I SEARCH /SEARCH FOR OCCURANCE JMP SCAN2A /NOT FOUND TAD LABELF SZA CLA /LABEL BEING PROCESSED? JMP ERR12 /YES - MULT. DEF. LABEL JMP SCAN2M /OTHERWISE TEST FOR INDIRECT
/HERE IF THE NAME IS NOT FOUND IN THE POOL SCAN2A, TAD VALID AND (LABEL /LOOKING FOR A LABEL REF? SZA CLA / JMP SCAN2C /YES /HERE IF APPENDING TO POOL SCAN2F, NONE TAD T1 DCA T4 /BACKUP T1 TO POINT TO OLD STRDEL NTWO DCA I T4 /MAKE IT A LINK ISZ T4 /POINT TO ADDRESS WD ONE JMP SCAN2E SCAN2Q, TAD VALID /HERE ON EMPTY MAIN POOL AND (LABEL SZA CLA /LOOKING FOR A LABEL REF? JMP SCAN2C /YES - TEST UNDEFINED LABELS POOL SCAN2B, ONE TAD NXTSTR DCA TX NONE DCA I TX /FREE UP STRDEL BEFORE NAME TWO SCAN2E, TAD NXTSTR /POS OF NEW NAME DCA I T4 /UPDATE PTR NTHREE DCA I INDEX3 /PUT POLEND ONE TAD INDEX3 /GET NEW TOP DCA TOP TAD VALID AND (LABEL SZA CLA /LABEL REF? JMP SCAN2M /YES - CHECK INDIRECT TAD LABELF SNA CLA /LABEL DEFINITION? JMP SCAN2M /LABEL DEFINED - CHECK UNDEFINED LABEL POOL TO SOLVE ANY UNDEFINED /REFERENCES TAD I (ULBPOL /GET POOL PTR SNA /EMPTY? JMP SCAN2M /YES - CHECK INDIRECT DCA T1 DCA T2 /NO INFO WORDS TAD ACUMM JMS I SEARCH /LOOK FOR ATOM JMP SCAN2M /NOT FOUND - DO INDIRECT
/HERE TO DELETE THE ENTRY IN A POOL POINTED TO BY T1 AND T1MAT JMS I RDPOOL /TRY TO GET THE NEXT CHARACTER JMP .+2 JMP SCAN25 /GOT IT TAD I (ULBPOL /NO CHARACTER - ARE WE DELETING THE ONLY ENTRY? CMA IAC TAD T1MAT SZA CLA JMP SCAN2R /NO - WRITE THE END CODE TAD I (ULBPOL JMS I DELPOL /YES - DELETE IT DCA I (ULBPOL /ZERO THE POINTER JMP SCAN2M /DONE SCAN25, ISZ OVERF /OVERWRITING POOL JMS I WRPOOL /WRITE THE CHARACTER JMS I RDPOOL /READ NEXT FROM POOL JMP .+2 /END OF POOL JMP SCAN25+1 /AND AGAIN SCAN2R, ISZ OVERF NONE JMS I WRPOOL /WRITE END CODE DCA OVERF /DONE OVERWRITING JMP SCAN2M /CHECK FOR INDIRECT /HERE TO SEARCH THE UNDEFINED LABELS POOL (WITH LABEL REF) SCAN2C, TAD (ULBPOL DCA T4 /PTR TO HEAD OF POOL TAD I (ULBPOL /GET PTR SNA /EMPTY? JMP SCAN2B /YES - APPEND DCA T1 DCA T2 /NO INFO WORDS TAD ACUMM JMS I SEARCH /SEARCH POOL JMP SCAN2F /FAIL - APPEND TO POOL JMP SCAN2M /CHECK FOR INDIRECT
/CHECK FOR ACCUM BEING INDIRECT, HANDLE AND RETURN SCAN2M, TAD ACMIND SNA CLA /INDIRECT? JMP SCANNR-1 /NO - DONE TAD (INDCAL /XIND CALL JMS I WRPPSO /WRITE IT ON PRE-OUT TAD ACUMM JMS I WRSTPO /WRITE ACCUM ISZ GENLIT TAD GENLIT /GENERATE A NEW LITERAL TAD SARG /SUBSTITUTE ARG DCA I (DCAGV TAD (DCAGVC-1 /DCA SAVE OF NAME JMS I WRSTPO THREE TAD CLEN DCA CLEN /UPDATE INST LENGTH TAD VALID AND (LABEL /LABEL REF? SNA CLA /? JMP .+3 /NO ISZ LINDF /YES - INDICATE USAGE JMP .+2 ISZ VINDF /NO - SET VAR IND FLAG JMP I (.&7600+200 /***PAGE BOUNDS PAGE TAD VALID AND (JMPTR SZA CLA /TO BE USED AS A JUMP ADDRESS? JMP SCAN2L /YES TAD I (DCAGV /GET LIT # DCA I ACUM /SUBSTITUTE ARG TAD (", DCA I (ACCUM+1 TAD C260 DCA I (ACCUM+2 /PUT 'NAME,0' DCA I (ACCUM+3 /NULL JMP SCANNR-1 /DONE
SCAN2L, TAD ("I DCA I ACUM /INDIRECT JUMP TAD C240 DCA I (ACCUM+1 TAD I (DCAGV DCA I (ACCUM+2 /TO INDIRECT NAME TAD (215 DCA I (ACCUM+3 TAD (212 DCA I (ACCUM+4 TAD I (DCAGV /GENERATED NAME AGAIN DCA I (ACCUM+5 /PUT IT DCA I (ACCUM+6 /NULL JMP SCANNR-1 /DONE /DOT SEEN AS FIRST CHARACTER, CHECK FOR .ANNN SCAN27, TAD I (ACCUM+1 TAD (-301 /"A"? SZA CLA JMP SCAN30 /NO TAD TMODE /GET COMPILER MODE SZA CLA /SNOBOL MODE? JMP SCANNR-1 /NO - DONE TAD (ACCUM+1 /PTR TO REST OF ATOM DCA INDEX1 DCA T1 /NUMBER ACCUMULATION SCAN28, TAD I INDEX1 /GET NEXT CHARACTER SNA /MORE? JMP SCAN29 /NO - DONE TAD NC260 SPA /BELOW A NUMBER? JMP SCAN30 /YES - PASS IT BY TAD NC10 SMA JMP SCAN30 /NOT A NUMBER TAD C10 /CONVERT TO OCTAL DCA TX TAD T1 CLL RTL; RAL /SHIFT TOTAL TAD TX /ADD IN NEXT DIGIT TO TOTAL DCA T1 JMP SCAN28 /AND DO NEXT
SCAN29, TAD T1 /GET ACCUMULATED CHAR SNA CLA /OK IF NOT .EQ. 0 JMP ERR9 NONE DCA PTATOM /SET .A LITERAL FLAG DCA I (ACCUM+1 /CLEAR ACCUM JMP SCAN10 /AND GO /PERIOD NAME FOUND - CHECK VALID TYPES SCAN30, ZERO TAD VALID /GET VALID CODES TAD (-ANY /LOOKING FOR A COMMAND? SZA CLA JMP ERR7 /NO - ILLEGAL NAME JMP SCANNR-1 /YES - DONE
/WRITE END CODE AND CLOSE OUTPUT FILE CLOSE, TAD OFLAG /DOING OUTPUT? SNA CLA JMP CLOS20 /NO SKIP TAD (ENDC1 /FIRST END CODE JMS I WRPS /WRITE IT TAD I (VARPOL SNA /ANY VARIABLES? JMP CLOS2 DCA T1 /POINTER CLOS1, JMS I PUTNAM /PUT NEXT JMP CLOS2 /END OF POOL TAD (STOR JMS I WRPS /WRITE A WD OF STORAGE JMP CLOS1 /AND NEXT CLOS2, TAD (ENDC2 /) JMS I WRPS /WRITE MORE CODE TAD (LITS-1 DCA INDEX1 TAD NC10 /NUMBER OF LITERALS DCA T3 CLOS3, TAD I INDEX1 /GET NEXT PTR SNA /EMPTY? JMP CLOS6 /YES DCA T1 JMP I (.&7600+200 /***PAGE BOUNDS PAGE CLOS4, JMS I RDPOOL /GET THE NEXT LITERAL NAME JMP CLOS6 DCA T2 TAD ("X JMS I PUTCHR /PUT AN "X" TAD ("L JMS I PUTCHR TAD T2 /GET THE NAME JMS I PUTOC /PUT NAME TAD (ENDC3 JMS I WRPS /POINTER FOR LIT TAD T2 JMS I PUTOC /NAME AGAIN TAD (RETURN-1 JMS I WRSTR /AND RETURN
CLOS5, JMS I RDPOOL /GET NEXT (OF STR) JMP CLOS6 /DONE SNA CLA /STRDEL? JMP CLOS4 /YES - DO NEXT JMP CLOS5 /NO, KEEP LOOKING CLOS6, ISZ T3 /MORE? JMP CLOS3 /YES - GO TAD (ENDC6 /MORE INFO JMS I WRPS TAD LINDF /LABEL INDIRECT SEEN FLAG TAD VINDF /VAR " " " SNA CLA /ANY SEEN? JMP CLOS8 /NO TAD (ENDC5 JMS I WRPS /DEFINE XIND TAD LINDF /LABEL USAGE? SNA CLA JMP CLOS7 /NO TAD I (LABPOL /GET POOL HEADER SNA /EMPTY? JMP ERR23 JMS CLOS30 /NO - PUT IT CLOS7, TAD VINDF /VARIABLE USAGE? SNA CLA JMP CLOS8 /NO - DONE INDIRECTS TAD I (VARPOL JMS CLOS30 /PUT VARS
CLOS8, TAD C260 /END OF TABLE JMS I PUTCHR TAD (LITS-1 DCA INDEX1 TAD NC10 DCA T3 /COUNT CLOS9, TAD I INDEX1 /NEXT LIT PTR SNA /EMPTY? JMP CLOS16 /YES DCA T1 /SAVE PTR CLOS10, JMS I RDPOOL JMP CLOS16 /POOL DONE DCA T2 TAD (ENDC7 JMS I WRPS /WRITE BEG TAD T2 JMS I PUTOC TAD (", JMS I PUTCHR /PUT COMMA
/DECODE LITERALS INTO 3 CHAR/2 WORD FORMAT CLOS11, DCA I ACUM DCA I (ACCUM+1 TAD ACUMM DCA INDEX2 /PTR TO PUT CODES NTHREE DCA T2 /COUNT CLOS12, JMS I RDPOOL /GET THE NEXT CHAR HLT SNA /STRDEL? JMP CLOS14 /YES ISZ T2 /3RD CHAR? JMP CLOS13 /NO DCA T4 TAD T4 RTL; RTL /SHIFT FOR TOP CHAR AND C7400 /SAVE TOP BITS TAD I ACUM /ADD IN BOTTOM JMS I PUTOC /PUT IT TAD (RETURN-1 JMS I WRSTR /PUT RETURN TAD T4 RTR; RTR; RAR /SHIFT FOR BOTTOM AND C7400 TAD I (ACCUM+1 /BOTTOM WD JMS I PUTOC /PUT IT TAD (RETURN-1 JMS I WRSTR /AND RETURN JMP CLOS11 /AGAIN CLOS13, DCA I INDEX2 /SAVE 1ST OR 2ND CHAR JMP CLOS12 CLOS14, TAD I ACUM JMS I PUTOC /PUT PARTAIL WORDS OF LITERAL OUT TAD (RETURN-1 JMS I WRSTR TAD I (ACCUM+1 JMS I PUTOC TAD (RETURN-1 JMS I WRSTR NONE JMS I PUTOC /PUT END OF STRING TAD (RETURN-1 JMS I WRSTR JMP CLOS10 /DO THE NEXT STRING PAGE
/HERE WHEN LITERAL POOL DONE CLOS16, ISZ T3 /MORE? JMP CLOS9 /YES - GO TAD (ENDC10 /LAST BIT JMS I WRPS TAD I (OUTBLK /GET CURRECT BLOCK NUMBER CMA IAC DCA T1 /SAVE NEG CLOS17, JMS I PUTCHR /PUT ZEROS TAD I (OUTBLK TAD T1 SNA CLA /UNTIL A BLOCK IS WRITTEN JMP CLOS17 /AGAIN TAD FOUTBK /GET THE FIRST OUTPUT BLOCK NUMBER CMA IAC TAD I (OUTBLK DCA CLOS19 /# OF BLOCKS WRITTEN TAD I (OFLTAB /GET OUTPUT DEVICE # AGAIN CDF 0 CIF 10 JMS I USR /CALL USR 4 /TO CLOSE OUTPUT ONAME /OUTPUT FILE NAME CLOS19, 0 /# OF BLOCKS JMP ERR3 /ERROR CDF 10
CLOS20, JMS I RETTRN /TYPE A RETURN TAD I (ULBPOL /UNDEFINDED LABEL POOL SNA /EMPTY? JMP CLOS24+1 /YES - DONE HERE DCA T1 /SAVE PTR TO LABELS TAD (ENDC20 /UNDEFINED LABELS MESSAGE JMS I TYPE CLOS21, JMS I RDPOOL /NEXT JMP CLOS24 SNA /STRDEL? JMP CLOS23 /YES CLOS22, JMS I PRINT /NO - PRINT IT JMP CLOS21 /AND GO AGAIN CLOS23, JMS I RDPOOL /GET NEXT JMP CLOS24 /DONE DCA T2 TAD (", JMS I PRINT TAD C240 JMS I PRINT TAD T2 /GET BACK CHAR JMP CLOS22 /CONTINUE
/HERE TO DO TOTAL ERRORS MESSAGE CLOS24, JMS I RETTRN JMS I RETTRN TAD I (ERRC SNA /ERRORS? JMP CLOS29 /NO TAD (-144 SMA CLA /OVER 100 ERRORS? JMP CLOS28 /YES TAD (SACCUM-1 DCA INDEX1 /WHERE TO PUT NUMBER DCA I (SACCUM+2 TAD I (ERRC / JMS I CONVD /CONVERT IT TO DECIMAL TAD (SACCUM-1 JMS I CTYPE /TYPE THE NUMBER JMP CLOS32 CLOS28, TAD (ENDC21 /OVER 100 ERRORS, GIVE 'MANY' JMS I TYPE JMP CLOS32 CLOS29, TAD (ENDC22 /'NO' JMS I TYPE CLOS32, TAD (ENDC23 /'ERRORS DETECTED' JMS I TYPE JMP GOMON /GO TO OS/8 /PUT INDIRECT INFO FOR CLOSE CLOS30, 0 CLOS31, DCA T1 /PTR TO POOL TAD T1 DCA T2 /SAVE PTR TAD (ENDC24 JMS I WRPS /WRITE JMS I PUTNAM /PUT NAME JMP I CLOS30 TAD T2 DCA T1 /BACKUP TAD (ENDC5 JMS I WRPS JMS I PUTNAM /PUT NAME AGAIN JMP I CLOS30 TAD (RETURN-1 JMS I WRSTR JMS I RDPOOL /ANOTHER? JMP I CLOS30 /NO - DONE NONE TAD T1 JMP CLOS31 /AGAIN
/ THIS PAGE CONTAINS ERROR MESSAGES FOR COMPILER AND SOURCE ERRORS. ERR1, ZERO TAD (1-LINEL DCA IMCNT /BUFFER COUNT TAD (LINEIM-1 DCA LINEP /PTR TO BUFFER TAD (ERLTL /LINE TOO LONG JMP ERRH ERR2, TAD (EROFF /OUTPUT FILE IS FULL JMS I TYPE GOMON, CDF 0 JMP I (7600 /GO TO OS/8 PAGE
ERR3, CDF 10 TAD (EROER /OUTPUT ERROR JMP ERRH ERR4, TAD (ERIVN /INVALID NUMBER JMP ERRH ERR5, TAD (ERIARG /ILLEGAL ARGUMENT TYPE JMP ERRH ERR6, TAD (ERPEOF /PREMATURE EOF JMP ERRH ERR7, TAD (ERNIR /RESTRICTED NAME JMP ERRH ERR9, TAD (ERLIV /LITERAL HAS ILLEGAL VALUE JMP ERRH ERR10, ZERO TAD (ERIC /ILLEGAL CHARACTER JMP ERRH ERR11, TAD (ERLNI /LABEL MAY NOT BE INDIRECT JMP ERRH ERR12, TAD (ERMDL /MULT. DEF. LABEL JMP ERRH ERR14, TAD (ERID /ILLEGAL DELIMITER JMP ERRH ERR15, TAD (ERUC /UNRECOGNIZED COMMAND JMP ERRH ERR16, TAD (ERARTB /ARG IS TOO LARGE (OR SMALL) JMP ERRH ERR17, TAD (ERNAE /ARG MAY NOT APPEAR AFTER EQUAL JMP ERRH ERR18, TAD (ERMHA /OR MUST BE PRECEDED AND FOLLOWED JMP ERRH / BY AN ARGUMENT ERR19, TAD (EROOT /ONLY ONE TRANSFER IS LEGAL JMP ERRH ERR20, TAD (ERTFA /TOO FEW ARGS JMP ERRH ERR22, TAD (ERSTC /SAME TRANSFER CONDITION JMP ERRH ERR23, TAD (ERNLD /NO LABELS DEFINED FOR TRANSFER TABLE JMS I TYPE JMP MAIN ERR24, CDF 10 TAD (ERCNT /CANT ENTER OUTPUT FILE JMS I TYPE JMP SNOBOL /GO AGAIN ERR25, ZERO TAD (ERAGVO /ARITH GEN VAR OVERFLOW
/ THIS ROUTINE HANDLES TYPING THE SOURCE LINE IN ERROR AND THEN THE /ERROR MESSAGE. WHEN DONE, CONTROL IS RETURNED TO THE MAIN PARSING /LOOP. ERRH, ISZ I (ERRC DCA T2 /SAVE PTR TO MESSAGE JMS I RETTRN /TYPE A RETURN TAD LINEP DCA INDEX7 TAD LINEP TAD (1-LINEIM SZA CLA /LINE FULL? DCA I INDEX7 /NULL FOR LINE IMAGE TAD (LINEIM-1 JMS I CTYPE /FIRST PART OF THE LINE TAD TOCNT /CURRENT CHAR POS TAD NC1 /MARK THE PREVIOUS CMA IAC DCA T1 /SAVE NEG COUNT TAD LINEP /GET LINE BUFFER PTR DCA T3 TAD T3 TAD (1-LINEIM SNA CLA /FULL LINE ALREADY? JMP ERRH1-1 JMS I ENDRD /FINISH READING THE LINE TAD T3 JMS I CTYPE /AND TYPE IT JMS I RETTRN /TERMINATE LINE ERRH1, TAD OCNT TAD T1 SNA CLA /RIGHT POSITION YET? JMP ERRH2 /YES TAD C240 JMS I PRINT /NO - TYPE A SPACE JMP ERRH1 /AGAIN ERRH2, TAD (ERPONT JMS I TYPE /POINT AT THE ERROR TAD T2 /ERROR MESSAGE PTR JMS I TYPE /GIVE IT JMS I RETTRN JMP I PUTOUT /DO NEXT LINE
/TYPE THE FIXED POOL STARTING AT C(AC)+1 CTTYPE, 0 DCA INDEX7 /PTR TO STRING CTTYP1, TAD I INDEX7 /GET NEXT SNA /ANY? JMP I CTTYPE /NO, DONE JMS I PRINT /YES - TYPE IT JMP CTTYP1 /AGAIN / PUT NAME IN POOL POINTED TO BY T1 TO OUTPUT PTNAME, 0 PTNAM1, JMS I RDPOOL /READ A CHAR JMP I PTNAME /NONE - DONE SNA /STRDEL? JMP PTNAM2 JMS I PUTCHR /NO - PUT IT JMP PTNAM1 /AGAIN PTNAM2, ISZ PTNAME JMP I PTNAME /DONE PAGE /SAVE ACCUM IN SACCUM SVACUM, 0 TAD ACUMM DCA INDEX6 TAD (SACCUM-1 DCA INDEX7 TAD NC10 /COUNT DCA TX SVAC1, TAD I INDEX6 DCA I INDEX7 /MOVE IT ISZ TX JMP SVAC1 JMP I SVACUM /DONE
/ PUT ACCUM ONTO OLINE WITH RETURN PACCUR, 0 TAD ACUMM JMS I WRSTRO /PUT ACCUM TO OLINE JMS I RETORN /AND RETURN JMP I PACCUR /AND DONE / PUT SOURCE LINE ONTO OUTPUT PLINE, 0 TAD (LINEIM-1 /PTR TO LINE JMS I WRSTR /WRITE IT TAD (LINEIM-1 DCA LINEP TAD (1-LINEL DCA IMCNT JMP I PLINE /DONE /READ UNTIL END OF LINE OR END OF FILE ENDRED, 0 TAD (1-LINEIM TAD LINEP SNA CLA /ALREADY END OF LINE? JMP I ENDRED ENDRD1, JMS I GETCHR /GET NEXT JMP I ENDRED /DONE - EOF TAD NC212 SZA CLA /EOL? JMP ENDRD1 /NO DCA CHOLD JMP I ENDRED /YES - DONE
/WRITE CARRAIGE RETURN ON OLINE RETRN, 0 TAD (RETURN-1 JMS I WRSTRO /WRITE JMP I RETRN /DONE /CONVERT THE NUMBER IN THE AC TO A TWO DIGIT DECIMAL NUMBER (OUTPUT /PTR IN INDEX1) CVD, 0 DCA INDEX7 /SAVE NUM DCA INDEX6 /COUNT TAD INDEX7 /GET IT CVD1, TAD NC12 /SUBTRACT DEC 10 SPA /DONE? JMP CVD2 /YES ISZ INDEX6 /NO - BUMP COUNT JMP CVD1 / CVD2, TAD C12 /DIGIT BACK TO NORMAL DCA INDEX7 TAD INDEX6 SNA /ANY TENS? JMP CVD4 /NO TAD C260 /YES - CAUSE ASCII CVD3, DCA I INDEX1 /PUT TAD INDEX7 /GET SINGLES PLACE TAD C260 /ASCIIIZE DCA I INDEX1 /PUT THAT JMP I CVD /DONE CVD4, TAD C240 /TENS A ZERO - USE A SPACE JMP CVD3
/TYPE A PACKED STRING - PTR IN AC TTYPE, 0 JMS EXTCUR /SETUP CURSOR FROM THE AC TTYP1, JMS I GETCHS /GET NEXT JMP TTYP2 / JMS I PRINT /TYPE IT JMP TTYP1 /AGAIN TTYP2, JMS EXFCUR /RESTORE CURSOR JMP I TTYPE /DONE /WRITE PACKED STRING TO OLINE, PTR IN (AC) WRIPO, 0 JMS EXTCUR /SETUP CURSOR WRIP1, JMS I GETCHS / JMP WRIP2 JMS I WROLIN /PUT IT JMP WRIP1 WRIP2, JMS EXFCUR /RESTORE CURSOR JMP I WRIPO /DONE /SETUP AND EXCHANGE CURSOR FROM THE LOCATION CONTAINED IN THE AC EXTCUR, 0 DCA TX /SAVE LOC TAD CURSOR DCA SCURS /SAVE CURSOR TAD CURSOR+1 DCA SCURS+1 TAD TX /GET BACK ADDR DCA CURSOR ONE DCA CURSOR+1 /CHAR POS JMP I EXTCUR /DONE EXFCUR, 0 TAD SCURS DCA CURSOR /RESTORE CURSOR FROM STORAGE TAD SCURS+1 DCA CURSOR+1 / JMP I EXFCUR /AND DONE
/WRITE LINEAR STRING ONTO OUTPUT FROM C(AC)+1 WRSTRG, 0 DCA INDEX7 /PTR TO STRING WRSTR1, TAD I INDEX7 /GET NEXT SNA /STRDEL? JMP I WRSTRG /YES - DONE JMS I PUTCHR /NO - PUT IT JMP WRSTR1 /NEXT / WRITE CHAR TO OLINE FROM AC WRITO, 0 DCA TX /SAVE CHAR TAD (OLINE DCA HPOOL /HEAD OF POOL TAD COLINE /PTR TO END OF OLINE DCA T1MAT TAD TX /GET CHAR JMS I WRPOOL /WRITE IT TAD T1MAT DCA COLINE /UPDATE OLINE JMP I WRITO /DONE PAGE /WRITE A PACKED STRING TO POLINE. PTR IN (AC) WRPPO, 0 JMS EXTCUR WRPP1, JMS I GETCHS /GET THE NEXT CHARACTER JMP WRPP2 JMS I WRPOLN /PUT ON POLINE JMP WRPP1 WRPP2, JMS EXFCUR JMP I WRPPO /DONE
/WRITE LINEAR STRING TO OLINE POOL FROM C(AC)+1 WRSTO, 0 DCA INDEX7 /SAVE PTR TAD (OLINE DCA HPOOL /HEAD OF POOL TAD COLINE DCA T1MAT /SAVE PTR TO OLINE WRSTO1, TAD I INDEX7 /GET NEXT SNA /DONE? JMP WRSTO2 /YES JMS I WRPOOL /NO - WRITE THE CHAR JMP WRSTO1 WRSTO2, TAD T1MAT /GET UPDATED PTR DCA COLINE / JMP I WRSTO /DONE / WRITE CHAR ON POLINE POOL FROM AC WRITPO, 0 DCA TX /SAVE CHAR TAD (POLINE DCA HPOOL /HEAD OF POOL TAD CPOLIN /PTR TO END OF POLINE DCA T1MAT TAD TX /GET THE CHARACTER JMS I WRPOOL TAD T1MAT DCA CPOLIN /UPDATE PTR JMP I WRITPO /DONE
/WRITE LINEAR STRING ONTO POLINE POOL FROM C(AC)+1 WRSPO, 0 DCA INDEX7 /PTR TAD (POLINE DCA HPOOL /HEAD OF POOL TAD CPOLIN DCA T1MAT /PTR TO POLINE POOL WRSPO1, TAD I INDEX7 /GET NEXT CHAR SNA /DONE? JMP WRSPO2 /YES JMS I WRPOOL /NO, WRITE CHAR JMP WRSPO1 /AND NEXT WRSPO2, TAD T1MAT DCA CPOLIN /UPDATE PTR JMP I WRSPO /DONE / WRITE OCTAL NUMBER IN AC ONTO OLINE WROCTO, 0 DCA T2 /SAVE NUMBER TAD NC4 /COUNT DCA T1 TAD (OLINE DCA HPOOL /HEAD OF POOL TAD COLINE /PTR TO OLINE DCA T1MAT WROC1, TAD T2 /GET NUM RTL; RAL /SHIFT DCA T2 TAD T2 RAL /GET NEXT DIGIT AND C7 TAD C260 /FORM DIGIT JMS I WRPOOL /WRITE IT ISZ T1 /MORE? JMP WROC1 /YES TAD T1MAT DCA COLINE /NO, UPDATE PTR JMP I WROCTO /DONE
/ DELETE THE POOL POINTED TO BY (AC) DPOOL, 0 SNA /ANYTHING TO DELETE? JMP I DPOOL /NO - RETURN DPOOL0, DCA TX /SAVE PTR DPOOL1, TWO TAD I TX SNA /IS THIS A LINK WORD? JMP DPOOL3 IAC SNA CLA /NO - A POLEND? JMP DPOOL4 /YES NONE DCA I TX /NO - FREE UP WORD ISZ TX /POINT TO NEXT JMP DPOOL1 /GO AGAIN DPOOL3, NONE DCA I TX /FREE LINK WD ISZ TX TAD I TX /GET LINK ADDR DCA TXX NONE DCA I TX /FREE LINK ADDR WD TAD TXX /GET NEXT ADDR JMP DPOOL0 /AND GO DPOOL4, NONE DCA I TX /CLEAR POLEND JMP I DPOOL
/ CHECK FROM INTERRUPT FROM KEYBOARD INTRPT, 0 KSF /ANYTHING TYPED? JMP I INTRPT /NO KRS /YES - GET IT TAD (-203 SZA CLA /CONTROL C? JMP I INTRPT /NO - IGNORE IT KCC /REMOVE THE CHARACTER TAD (CNTLC JMS I TYPE /TYPE "^C" CDF 0 JMP I (7600 /AND GO TO MONITOR / SHIFT ACCUM ONE CHARACTER LEFT SHFTAC, 0 TAD ACUM DCA INDEX6 /READ ACCUM PTR TAD ACUMM DCA INDEX7 /PUT PTR TAD NC10 DCA TX /COUNT SHFT1, TAD I INDEX6 /GET THE NEXT DCA I INDEX7 ISZ TX /MORE? JMP SHFT1 /YES JMP I SHFTAC /NO - DONE PAGE / TYPE A RETURN ON THE TELETYPE TYRET, 0 TAD (RETURN-1 JMS I CTYPE /TYPE A RETURN JMP I TYRET
/ ROUTINE TO SEARCH THE POOL POINTED TO BY T1 FOR THE STRING POINTED /TO BY (AC)+1. ASSUME (T2) WORDS TO BE IGNORED AFTER EACH STRDEL. SKIP /ON SUCCESS. SERCH, 0 DCA SERCHA /SAVE POSITION OF ATOM TO SEARCH FOR SERCH1, TAD SERCHA /POS OF ATOM DCA INDEX1 /PTR FOR MATCH TAD T1 DCA T1MAT /POS OF T1 WHEN MATCH SUCCEEDS JMS MATCH /IS THIS A MATCH? JMP SERCH2 /NO ISZ SERCH /YES - SET FOR SKIP JMP I SERCH /AND DO IT SERCH2, THREE TAD I T1 SNA CLA /POLEND? JMP I SERCH /YES - FAIL NONE TAD T1 /GET CHAR POS DCA T1 /BACKUP SERCH3, JMS I RDPOOL /GET THE NEXT CHARACTER JMP I SERCH /FAIL - END OF POOL SZA CLA /STRDEL? JMP SERCH3 NONE TAD T2 DCA TX /NEG COUNT OF INFO WORDS SERCH4, ISZ TX JMP .+2 JMP SERCH1 /DONE SKIPPING THEM JMS I RDPOOL JMP I SERCH /FAIL ON POLEND ZERO JMP SERCH4 /GO FOR MORE SERCHA, 0 /ARGUMENT ADDRESS
/ THIS ROUTINE DETERMINES WHETHER THE STRING (PTR IN INDEX1) /MATCHES A SUBSTRING IN THE POOL POINTED TO BY T1. SKIP ON /SUCCESS. MATCH, 0 JMS I RDPOOL /GET NEXT CHAR FROM THE POOL JMP I MATCH /END OF POOL SNA /STRDEL? JMP MAT1 /YES DCA TX /NO, SAVE CHAR TAD I INDEX1 /GET MATCH CHAR SNA /STRDEL? JMP I MATCH /YES - FAIL CMA IAC TAD TX / SZA CLA /MATCH? JMP I MATCH /NO JMP MATCH+1 /YES, SO FAR MAT1, TAD I INDEX1 /GET CHAR SNA CLA /STRDEL? ISZ MATCH /YES - SKIP JMP I MATCH /NO - FAIL
/ WRITE AN XASC CALL ON PRE-OLINE CALASC, 0 ISZ GENLIT /BUMP GEN LIT COUNT TAD GENLIT TAD SARG /FORM SUBSTITUTE CODE DCA I (DCAGV /SAVE IT TAD (LITJMS /ASC CALL JMS I WRPPSO /PUT IT TAD (XASC JMS I WRPPSO TAD ACUMM JMS I WRSTPO /AND ACCUM TAD (RETURN JMS I WRPPSO ISZ CLEN ISZ CLEN /BUMP INST LENGTH COUNT JMP I CALASC /DONE / WRITE OCTAL NUMBER IN AC ONTO OUTPUT PUTOCT, 0 DCA P2 TAD NC4 DCA P1 /COUNT PUTO1, TAD P2 /GET NUMBER CLL RTL; RAL /SHIFT DCA P2 TAD P2 /SAVE RAL AND C7 TAD C260 /FORM A DIGIT JMS I PUTCHR /WRITE IT ISZ P1 / JMP PUTO1 /MORE JMP I PUTOCT /DONE P1, 0 /LOCALS FOR PUTOCT P2, 0
/ READ A CHARACTER FROM THE POOL POINTED TO BY T1, SKIP ON /SUCCESS. RDPOL, 0 RDP0, THREE TAD I T1 /GET CHAR SNA /POLEND? JMP I RDPOL /YES - FAIL ISZ T1 /UPDATE THE POINTER TAD NC1 SNA /LINK (-2) ? JMP RDP1 /YES TAD NC2 /NORMALIZE ISZ RDPOL /NO - SKIP RETURN JMP I RDPOL /DONE RDP1, TAD I T1 /GET THE ADDR DCA T1 /UPDATE PTR JMP RDP0 /GO AGAIN
/ WRITE A CHARACTER INTO THE POOL POINTED TO BY T1MAT. THE CHAR IS /SUPPLIED IN THE AC. REQUIRES WT1. WRPOL, 0 DCA WT1 /SAVE THE CHARACTER TAD T1MAT /GET THE POOL POINTER SNA /ASSIGNED AN ADDRESS? JMS WRPAA /NO - GET ONE JMS WRPCA /AND CHECK IT DCA T1MAT ONE TAD WT1 /GET THE CHAR SNA JMP WRP1 /WRITE END CODE IF NULL TAD NC1 WRP0, DCA I T1MAT /WRITE THE CHARACTER ISZ T1MAT JMP I WRPOL /AND DONE WT1, 0 /TEMPORARY FOR WRPOL PAGE WRP1, TAD OVERF SNA CLA /OVERWRITING POOL? JMP WRP2 TAD T1MAT JMS I DELPOL /YES - DELETE THE OLD END OF THE POOL WRP2, NTHREE JMP WRP0 /PUT POLEND AND DONE
/FIND A VALID ADDRESS FOR A POOL EXTENSION. USES WT2, WT3 AND WT5. WRPAA, 0 TAD I (BASE /BASE OF DYNAMIC STORAGE DCA WT2 WRPA0, TAD NC5 DCA WT5 /NUMBER OF FREE SPACES NECESSARY WRPA1, ONE DCA WT3 /SAVE MATCH WORD (FREE) WRPA2, TAD WT2 /SEARCH FOR A FREE AREA CMA IAC TAD TOP SNA CLA /HAVE WE EXHAUSTED USED SPACE? JMP WRPA6 TAD WT3 /NO - GET THE SEARCH WORD TAD I WT2 /GET THE WORD FROM STORAGE ISZ WT2 /POINT TO NEXT WORD SNA /MATCH? JMP WRPA3 IAC /NO - CHECK FOR POLEND (CANNOT BE SNA CLA / LINK IF WT2 IS FREE) JMP WRPA0 TWO /NO - SET THE MATCH TO LINK (MATCHES POLEND TOO) JMP WRPA1+1 /AND GO AGAIN /FOUND THE MATCHED WORD - IF POLEND, THEN SET TO FREE AND LOOK FOR ENOUGH /FREE WORDS; IF FREE, INCREMENT WT5 AND CHECK THE NEXT WORD UNLESS WT5 /HAS GONE TO ZERO IN WHICH CASE, WE FOUND A FREE ADDRESS. WRPA3, NTWO TAD WT3 /GET THE MATCH WORD SNA CLA /LINK? JMP WRPA7 /YES - SKIP POINTER WORD ISZ WT5 /NO - BUMP FREE COUNT JMP WRPA2 /AND TRY FOR MORE JMP WRPA4 WRPA7, ISZ WT2 /POINT PAST THE LINK ADDRESS WORD JMP WRPA0 /AND LOOK FOR FREE SPACE
WRPA6, JMS WRPA10 /CLEAR AREA AT TOP WRPA4, TAD WT5 /POINT TO THE FIRST FREE WORD TAD C5 CMA IAC TAD WT2 /CURRENT POINTER DCA TX TAD T1MAT /GET POINTER TO PREVIOUS WORD SZA CLA JMP WRPA5 TAD TX DCA I HPOOL /UNSPECIFIED - UPDATE POOL HEADER WRPA5, TAD TX /GET BACK ADDRESS JMP I WRPAA /DONE WRPA10, 0 /THIS CODE FREES NEW AREA AT THE TOP OF STORAGE NONE TAD TOP DCA INDEX0 TAD NC10 DCA TX NONE DCA I INDEX0 /CLEAR THE NEW FREE SPACE ISZ TX JMP .-3 TAD TOP TAD C10 DCA TOP /AND UPDATE TOP JMP I WRPA10
/ CHECK THIS ADDRESS (IN AC) FOR WRITING A CHARACTER HERE (THERE MUST /BE AT LEAST TWO FREE WORDS FOLLOWING IT). IF THERE IS NO ROOM, WRITE /A LINK CODE AND FIND A GOOD ADDRESS. REQUIRES WT4. WRPCA, 0 DCA WT4 /SAVE TWO TAD WT4 CMA IAC TAD TOP /OVER THE TOP? SPA SNA CLA JMP WRPCA3 /YES TAD OVERF SZA CLA /OVERWRITING POOL? JMP WRPCA2 /YES TWO TAD WT4 /GET IT AGAIN DCA TX ONE TAD I TX SNA CLA /USED? JMP WRPCA3+1 /NO NTWO /LINK CODE DCA I WT4 ISZ WT4 JMS WRPAA /GET ANOTHER ADDR DCA I WT4 /PUT IT TAD I WT4 /GET IT BACK JMP I WRPCA /AND DONE WRPCA2, TWO TAD I WT4 /GET CURRENT LOCATION SZA CLA /LINK CODE? JMP WRPCA3+1 /NO, USE ADDRESS ISZ WT4 /YES - POINT TO LINK ADDR TAD I WT4 /GET THE LINK ADDRESS JMP WRPCA+1 /AND CHECK IT WRPCA3, JMS WRPA10 /GET FREE SPACE AT THE TOP OF STORAGE TAD WT4 /GET BACK THE ORIGINAL JMP I WRPCA /AND DONE WT2, 0 /TEMPORARIES FOR WRPAA AND WRPCA WT3, 0 WT4, 0 WT5, 0
/WRITE PACKED STRING TO OUTPUT WPSTR, 0 JMS EXTCUR /EXCHANGE CURSOR WPSTR1, JMS I GETCHS /GET NEXT JMP WPSTR2 JMS I PUTCHR /PUT IT JMP WPSTR1 WPSTR2, JMS EXFCUR /RESTORE CURSOR JMP I WPSTR PAGE
/READ THE NEXT CHARACTER FROM THE INPUT BUFFER. SKIP ON SUCCESS. /THE POINTER TO THE INPUT BUFFER IS IN CURSOR AND CURSOR + 1. THE /NEXT CHARACTER'S LOCATION IS IN CURSOR AND THE CHARACTER NUMBER (1, /2 OR 3) IS IN CURSOR+1. RDCHR, 0 TAD CHOLD /GET THE TEMPORARY CHARACTER HOLD SNA JMP RDCH DCA TX /SAVE IT ISZ RDCHR /IF SPECIFIED, SKIP DCA CHOLD /DELETE IT TAD TX /BUT USE IT JMP I RDCHR RDCH, NONE JMP RDCHR0 /SKIP RDCHRS ENTRY RDCHRS, 0 /ENTER HERE TO NOT MODIFY CHARACTER TAD RDCHRS / DCA RDCHR /SETUP EXIT ROUTE RDCHR0, DCA STRF /SET FLAG TAD CURSOR TAD (NTOPIB /NEG TOP OF INPUT BUFFER SNA CLA /BUFFER EXHAUSTED? JMP RDCH5 NTHREE TAD CURSOR+1 /GET CHAR POS SZA CLA /THIRD? JMP RDCH4 /NO NTWO TAD CURSOR /YES - POINT AT FIRST WD DCA INDEX7 TAD I INDEX7 / AND C7400 /SAVE TOP 4 BITS CLL RTR; RTR /SHIFT DCA TX TAD I INDEX7 AND C7400 /BOTTOM 4 BITS CLL RTL; RTL; RAL /SHIFT THOSE INTO POSITION TAD TX DCA TX /SAVE CHAR ISZ CURSOR /BUMP POS PTR ONE DCA CURSOR+1 /FIRST CHAR AGAIN
RDCH1, ISZ STRF /DON'T MODIFY FLAG? JMP RDCH3 /YES - DON'T MODIFY CHAR TAD TX /GET THE CHAR SNA /NULL? JMP RDCH /YES - TRY FOR NEXT CHARACTER TAD NC212 /CHECK FOR EOL SPA / JMP RDCH2 /NO TAD NC3 SPA /LF, VT, FF? JMP RDCH /YES - IGNORE THEM SNA /RETURN? JMP RDCH7 /YES - EOL TAD (-13 SNA /CONTROL X? JMP RDCH9 /YES TAD NC2 SNA /CONTROL Z? JMP RDCH9 /YES TAD (-145 SNA CLA /RUBOUT? JMP RDCH /YES - IGNORE IT RDCH2, ZERO TAD TX /GET CHARACTER ISZ IMCNT /LINE IMAGE COUNT SKP JMP ERR1 /OVERFLOW DCA I LINEP /PUT CHAR RDCH3, TAD TX /AND GET IT BACK SZA /NO SKIP IF NULL ISZ RDCHR /SKIP RETURN JMP I RDCHR /AND DONE RDCH4, TAD I CURSOR /GET 1ST OR 2ND CHAR AND C377 DCA TX /SAVE IT ISZ CURSOR+1 /UPDATE PTR NTWO TAD CURSOR+1 /GET CHAR POS SNA CLA /NOW SECOND? ISZ CURSOR /YES - BUMP WD PTR JMP RDCH1 /AND FINISH
RDCH5, TAD I (IBCNT ISZ I (IBCNT /TEST IF ANY MORE PAGES LEFT IN THE FILE SMA SZA CLA JMP RDCH9 /NO - FAIL TAD LUSR /(IBUF) PTR TO BUFFER DCA CURSOR /UPDATE PTR TAD I (INBLK / DCA IBLK /SETUP WHICH BLOCK ISZ I (INBLK /UPD PTR CDF 0 JMS I IHAN /CALL THE HANDLER 0210 /READ 1 BLOCK TO FIELD 1 IBUF /LOCATION OF BUFFER IBLK, 0 /WHICH BLOCK TO READ JMP RDCH8 /DONE - EOF CDF 10 RDCH6, TAD STRF SZA CLA /WHICH ENTRY POINT? JMP RDCH /RDCHR JMP RDCHR0 /RDCHRS RDCH7, ZERO TAD (212 /EOL - FORCE LF DCA TX DCA I LINEP /NULL THE END OF THE LINE TAD (1-LINEL DCA IMCNT /FINISH LINE IMAGE TAD (LINEIM-1 DCA LINEP /UPD PTR JMP RDCH3 /AND DONE RDCH8, CDF 10 SMA CLA /FATAL ERROR RETURN? JMP RDCH6 /NO - ASSUME WE GOT A PARTIAL BLOCK RDCH9, TAD (-NTOPIB DCA CURSOR /CLEAR THE BUFFER POINTER JMP I RDCHR /DONE PAGE
/ WRITE THE CHARACTER IN THE AC TO THE OUTPUT BUFFER. WRCHR, 0 DCA TX /SAVE CHAR TAD OFLAG /DOING OUTPUT? SNA CLA JMP I WRCHR /NO - FLUSH TAD (NTOPOB TAD OCURSR / SZA CLA /BUFFER FULL? JMP WRCH1 /NO TAD (OBUF DCA OCURSR /YES - FIX PTR ONE DCA OCURSR+1 TAD I (OUTBLK /WHICH OUTPUT BLOCK TO WRITE DCA OBLK ISZ I (OUTBLK /UPDATE ISZ I (OUTBLK CDF 0 JMS I OHAN /CALL THE HANDLER 4410 /WRITE 4 PAGES FROM FIELD 1 OBUF /OUTPUT BUFFER OBLK, 0 /WHICH BLOCK JMP ERR3 /OUTPUT ERROR CDF 10 ISZ I (OBCNT /OUTPUT FILE FULL? JMP .+2 JMP ERR2 /YES - ERROR
WRCH1, NTHREE TAD OCURSR+1 SZA CLA /THIRD CHARACTER? JMP WRCH3 /NO NONE TAD OCURSR / DCA TXX /TOP BITS GO INTO THE PREV WD TAD TX /GET THE CHAR RTL; RTL /SHIFT INTO PLACE AND C7400 /TOP 4 BITS TAD I TXX /ADD IN OTHER CHAR DCA I TXX /SAVE TAD TX /GET THE CHAR AGAIN RTR; RTR; RAR /SHIFT AGAIN AND C7400 /SAVE BOTTOM 4 BITS TAD I OCURSR /ADD IN CHAR DCA I OCURSR /AND SAVE ONE /1ST CHAR AGAIN DCA OCURSR+1 / ISZ OCURSR /UPD PTR JMP I WRCHR /DONE WRCH3, TAD TX /GET CHAR AND C377 /TRUNCATE DCA I OCURSR /SAVE IT ISZ OCURSR+1 /UPD CHAR CNT NTWO TAD OCURSR+1 /GET WHICH CHAR SNA CLA /FIRST? ISZ OCURSR /YES - UPD PTR JMP I WRCHR /NO - DONE
/TELETYPE OUTPUT ROUTINE PRN, 0 DCA TPRN /SAVE CHAR JMS I INTST /CHECK FOR INTERRUPT TAD OCNT SNA CLA /ANY CHARACTERS ON LINE YET? JMP PRN2 PRN0, TAD TPRN TAD (-215 / SNA /RETURN? DCA OCNT /YES - ZERO COUNT TAD (4 SNA CLA /TAB? JMP PRN1 /YES TAD TPRN JMS PRX /NO - TYPE THE CHAR JMP I PRN /DONE PRN1, TAD C240 /TYPE A SPACE JMS PRX TAD OCNT /UNTIL OCNT AND C7 SZA CLA /GOES TO MOD 8 JMP PRN1 /NO JMP I PRN /YES - THEN DONE PRN2, TAD TPRN TAD NC212 SNA CLA /ONLY A LINE FEED? JMP PRN0 /YES TAD ("/ JMS I PUTCHR /COMMENT OUT LINE IN OUTPUT JMP PRN0 PRX, 0 TLS /TYPE THE CHARACTER TAD (-232 /-^Z SMA SZA /PRINTING CHAR? ISZ OCNT /YES - BUMP POS TAD (232 JMS I PUTCHR /WRITE IT IN THE OUTPUT FILE TAD OCNT SZA DCA TOCNT /SAVE TOCNT AS TOP OCNT TSF JMP .-1 JMP I PRX /AND DONE TPRN, 0 /TEMPORARY CHARACTER HOLD FIELD 1 *1600
/ COMMAND POOL CMDTAB, "P;"A;"L; STRDEL; CPAL "S;"N;"O;"B;"O;"L; STRDEL; CSNO "L;"O;"O;"K;"U;"P; STRDEL; VARORLIT "E;"N;"T;"E;"R; STRDEL; VARORLIT "I;"C;"L;"O;"S;"E; STRDEL; NOARG "O;"C;"L;"O;"S;"E; STRDEL; NOARG "P;"U;"S;"H;"J; STRDEL; LABEL "P;"O;"P;"J; STRDEL; NOARG "E;"X;"I;"T; STRDEL; CEXIT "E;"N;"D; STRDEL; CEND "P;"U;"S;"H; STRDEL; VAR "P;"O;"P; STRDEL; VAR POLEND /END OF COMMAND POOL
/ SPECIAL FUNCTION NAMES POOL SPFNPL, "O;"U;"T;"P;"U;"T;STRDEL "I;"N;"P;"U;"T;STRDEL "O;"U;"T;"H;"O;"L;STRDEL "R;"E;"A;"D;STRDEL "W;"R;"I;"T;"E;STRDEL "W;"R;"I;"T;"E;"H;STRDEL "P;"O;"S;"R;STRDEL POLEND
/ DELIMITER TABLE DELST, -211; SPACE -212; EOL -215; SPACE -240; SPACE -241; OR -250; LPAREN -251; RPAREN -252; STAR -253; ADD -254; COMMA -257; SLASH -272; COLON -273; SEMI -275; EQUAL -274; LESS -336; UPARR -337; BACK -255; SUB /END OF TABLE (NOTE SUB = 0)
/ VARIOUS BULK STORAGE LINEL=120 /LENGTH OF LINE INPUT BUFFER (80 CHARACTERS) LINEIM, ZBLOCK 116 /LINE INPUT IMAGE 215;212;0 /FOR OVERFLOW CONDITIONS ACCUM, ZBLOCK 10 /7 CHARACTER IDENTIFIER ACCUMULATION (SCAN) BASE, 0 /BASE OF POOL STORAGE INBLK, 0 /WHICH INPUT BLOCK IBCNT, 0 /NEG LENGTH OF INPUT FILE (BLOCKS) OUTBLK, 0 /WHICH OUTPUT BLOCK OBCNT, 0 /NEG LENGTH OF OUTPUT FILE CDEL, 0 /HOLD DELIMITER CHARACTER F1CLR=. /IMPURE AREA - ANY LOCATIONS BETWEEN HERE /AND F1CLRL ARE AUTOMATICALLY CLEARED AT /INITIALIZATION LITS, ZBLOCK 10 /LITERAL POOL HEADERS ARGENV, ZBLOCK 10 /ARITHMETIC GENERATED VARIABLES STORAGE SACCUM, ZBLOCK 10 /SAVE ACCUM BLOCK OLINE, 0 /HEADER FOR OLINE POOL POLINE, 0 /HEADER FOR POLINE POOL LABPOL, 0 /HEADER FOR LABEL POOL VARPOL, 0 /HEADER FOR VARIABLE POOL ULBPOL, 0 /HEADER FOR UNDEFINED LABELS POOL ERRC, 0 /COMPILATION ERROR COUNT MODE, 0 /COMPILER MODE (0: SNOBOL, 1: PAL) F1CLRL=.-F1CLR /HERE ENDS THE AUTOMATIC CLEAR AREA FOR FIELD 1
/ MODIFIABLE LITERALS MONTH, 0;0;"/ DAY, 0;0;"/;"7 YEAR, 0;0 RETURN, 215;212;0 DCAGVC, 215;212;"D;"C;"A;" DCAGV, 0;215;212;0 TADCON, "T;"A;"D;" TADGV, 0;215;212;0 TESTSF, "T;"A;"D;" ;"X;"S;"U;"C;"C;"E;"S;215;212;"S TESTQ, 0;"A;" ;"C;"L;"A;215;212;0
/ TEXT FOR WRITE PACKED STRING ROUTINES INITAL, /SNOBOL 8.2> 6257;7323;6317;7702;5714;4240;4256;4662;0;0 INITA2, /;;JMS I XINIT;XIND;X0;XVLEN;XTOP; 4215;5212;6712;1715;5240;0311;6330;7311;4311;6724;6212;4730;4316;6704 5612;330;6615;4212;6326;2714;4316;5215;6330;7724;4320;5215;212;0 LITJMS, /JMS I X 6712;1715;5240;311;330;0 XASC, /ASC; 6301;1723;215;212 XINT, /INT; 6711;2316;215;212 NCMDF, /-4000; 5655;264;4260;6660;212;0 FILEND, /0; 260;273 EXITCL, /JMP I (7600; 6712;315;5240;311;5650;3267;4260;6660;212;0 ORCODE, /XORC; 6730;1317;4303;5215;0;0 EQUALC, /XEQC; 6730;705;4303;5215;0;0 COMPC, /CMA IAC; 6303;0715;6240;0711;4303;5215;0;0 SHFT3, /CLL RAL; CLL RAL; CLL RAL; 6303;6314;6240;722;4314;5215;6303;6314;6240;0722;4314;5215 6303;6314;6240;722;4314;5215;0;0 FCODE, /XFENC; 6330;2706;4316;6703;212;0 JMPCAL, /JMP .+ 6712;315;5240;5656;0;0 STOR, /, 0; 5654;211;215;212 CNTLC, /^C; 4336;6703;212;0 JMPLAB, /JMP_ 6712;315;240;0 PAGJMP, /JMP I (.&7600+200;PAGE;XP 6712;315;5240;311;5250;3256;5667;266;5660;1253;4260;6660;6212 720;4307;6705;6612;330;0;0 PAGFIN, /=.; 4275;6656;212;0 FILLER, /XFLC; 6330;6306;303;273 PATCAL, /JMS I XPAT 6712;1715;5240;311;6330;720;4324;5215;0;0 INDCAL, /JMS I XINDRC; 6712;1715;5240;311;6330;7311;6304;1722;215;212 ENDC1, /;PAGE;X0,; 6615;212;6301;2707;4215;5212;5330;6260;215;212 ENDC2, /;XVLEN=.-X0 6612;3330;6314;7305;5275;6656;4330;6660;212;212 ENDC3, /, XX 6654;4211;330;0 ENDC5, /.; 4256;5215;0;0 ENDC6, /;FIELD 1;*XFIELD1;XIND= 4215;5212;6306;2711;5314;0304;4261;5215;6252;3330;6311;6305;4304 6661;6612;4212;6311;2316;275;0 ENDC7, /;XX 6615;4212;330;0 ENDC10, /;XTOP=.;$$$; 4215;5212;6330;7724;5320;7275;4215;5212;5244;2244;4615;5212;0;0 ENDC20, /UNDEFINED ADDRESSES:_ 6325;2316;6305;4706;6316;2305;6240;2301;6304;2722;6323;2723 5323;272;240;240 ENDC21, /MANY 6315;7301;331;0 ENDC22, /NO 316;317 ENDC23, / ERRORS DETECTED; 6640;1305;6722;1317;6323;2240;6305;2724;6303;2724;4304;5215;212;0 ENDC24, /TEXT . 6724;4305;5324;7211;0;0
/ ERROR MESSAGES ERPONT, /^; 336;240 ERLTL, /LINE TOO LONG 6314;7311;6705;2240;5317;317;6314;7317;307;0 EROFF, /OUTPUT FILE FULL 6717;2325;6720;2325;6240;4706;5314;305;6306;6325;314;0 EROER, /OUTPUT ERROR 6717;2325;6720;2325;6640;1305;6722;1317;0;0 ERIVN, /INVALID NUMBER 6711;3316;6301;4714;6304;7240;6325;1315;305;322 ERIARG, /ILLEGAL ARGUMENT TYPE 6311;6314;6305;707;6314;640;6722;2707;6315;7305;6724;2240;6331;2720;0;0 ERPEOF, /PRE-MATURE EOF 6320;2722;6255;715;6724;1325;6305;2640;317;306 ERNIR, /NAMES MAY NOT BEGIN WITH X OR . 6316;6701;5305;0323;6715;4701;6240;7716;6324;1240;6305;4707;6716;3640 6311;4324;5240;330;5317;322;256;0 ERLIV, /ILLEGAL LITERAL VALUE 6311;6314;6305;707;6314;6240;6311;2724;6322;6301;6240;726 6314;2725;0;0 ERIC, /ILLEGAL CHARACTER 6311;6314;6305;707;6314;1640;6710;1301;6701;2303;305;322 ERLNI, /LABEL MAY NOT BE INDIRECT 6314;1301;5305;0314;6715;4701;6240;7716;6324;1240;6305;4640;6316 4704;6322;1705;324;0 ERMDL, /MULTIPLY DEFINED LABEL 6315;6325;6724;311;5314;331;6304;3305;6311;2716;6304;6240 6301;2702;314;0 ERID, /ILLEGAL DELIMITER 6311;6314;6305;707;6314;2240;6305;4714;6715;2311;305;322 ERUC, /UNRECOGNIZED COMMAND 6725;1316;6305;7703;6307;4716;6332;2305;6240;7703;6315;715;316;304 ERARTB, /MAGNITUDE OF ARGUMENT IS TOO LARGE 6315;3701;6716;2311;6325;2704;6240;3317;6640;1301;6307;6725;6705 2316;6640;1711;6240;7724;6317;6240;6301;3722;305;0 ERNAE, /ARGUMENT MAY NOT FOLLOW AN EQUAL 6301;3722;6325;2715;5316;324;6715;4701;6240;7716;6324;3240;6317 6314;5317;327;5301;316;6705;2721;301;314 ERMHA, /OR MUST BE PRECEDED AND FOLLOWED BY A NAME 5317;322;6715;1725;6324;1240;6705;240;6322;1705;6305;2305;5305;304;6301 2316;6240;7706;6314;7714;6327;2305;6640;4702;5240;301;6316;6701;305;0 EROOT, /ONLY ONE TRANSFER IS LEGAL 6317;6316;6331;7640;5316;305;6324;722;6316;3323;5305;322;5311;323 6314;3705;301;314 ERTFA, /TOO FEW ARGUMENTS 6324;7717;6240;2706;6327;640;6722;2707;6315;7305;324;323 ERSTC, /SAME TRANSFER CONDITION 6323;6701;6705;2240;6322;7301;6323;2706;6322;1640;6317;2316;6311;4724 317;316 ERNLD, /NO LABELS DEFINED FOR INDIRECT TABLE 5316;317;6314;1301;6705;1714;6240;2704;6306;7311;5305;304;6706;1317 6240;7311;6705;2303;6240;724;6302;2714;0;0 ERCNT, /CANT ENTER OUTPUT FILE 6303;7301;6324;2640;6316;2724;6322;7640;6725;324;5325;324;6306;6311 305;0 ERAGVO, /GEN VAR OVERFLOW 6307;7305;6240;726;6322;7640;6726;1305;6306;7714;327;0 TOPF1=. /TOP OF FIELD 1 STORAGE $$$$$$$$$$$$$$$$$$$
.UPPER CASE;.NOFILL;.AC;.AP SNOBOL-8.2 INTERNAL ROUTINE SUPPORT DESCRIPTION =============================================== \\ .title ^^SNOBOL 8.2 Support routines\\ .fill;. THE ^^SNOBOL-8.2\\ RUNTIME SYSTEM (^^SNORTS\\) PROVIDES LOW-LEVEL ROUTINES THAT THE INTERESTED PROGRAMMER MAY WANT TO TAKE ADVANTAGE OF. ACCESS TO SINGLE CHARACTERS FROM A STRING IN ^^PAL\\ MODE, AND MANIPULATION OF INPUT-OUTPUT paramETERS ARE APPLICATIONS THAT CALL FOR ACCESS TO SOME INTERNALS OF THE RUN-time SYSTEM. . THE INTERFACE BETWEEN THE RUN-TIME SYSTEM AND THE USER'S PROGRAM IS THROUGH THE PARAMETER FILE ^^SNORTS.PR\\, WHICH DEFINES CALLING TABLES AND OPERATOR DEFINITIONS. WHILE THIS FILE MAINLY PROVIDES DEFINITION OF COMMON ROUTINES WHOSE REFERENCES ARE AUTOMATICALLY GENERATED BY THE COMPILER, ALSO DEFINED ARE SYMBOLS WHICH MAY BE USED TO ACCESS SUPPORT ROUTINES WITHIN THE RUN-TIME SYSTEM. THE REST OF THIS DOCUMENT EXPLAINS THE FUNCTION AND USE OF THOSE ROUTINES CURRENTLY SPECIFIED IN ^^SNORTS.PR\\. ^IT SHOULD BE NOTED THAT ^^SNORTS.PR\\ MAY CHANGE AS OFTEN AS VERSIONS OF THE RUN-TIME SYSTEM, AND ALTHOUGH ROUTINES AND NAMES WILL (PROBABLY) NOT BE REMOVED, SOME MAY BE ADDED, AND SOME MODIFIED IN FUNCTION. IT IS IMPORTANT TO USE THE CORRECT VERSION OF THE RUN-TIME SYSTEM WITH THE PROPER VERSION OF ^^SNORTS.PR\\, OTHERWISE UNDEFINED RESULTS WILL OCCUR. .TP 8;.nf ^^ THE CALLING TABLES ================== .f;. \\ THERE ARE TWO CALLING TABLES MAINTAINED IN ^^SNORTS\\ TO DISPATCH REFERENCES TO THE RUN-TIME SYSTEM. THE FIRST BEGINS WITH THE SYMBOL ^^XINIT\\. THIS TABLE DEFINES THE MAIN SUPPORT ROUTINES - THOSE THAT ARE TYPICALLY INVOKED TO HANDLE USER STATEMENTS. THE SYMBOLS DEFINED IN THIS GROUP (ALL START WITH A SINGLE "^X") ARE ESSENTIALLY LABELS THAT MARK LOCATIONS THAT HOLD THE STARTING ADDRESS FOR THE ROUTINES THEY NAME; E.G. ^^XINIT\\ - INITIALIZATION ROUTINE,^^ PUSHJ\\ - ^^PUSHJ\\ COMMAND, ^^XPAT\\ - PATTERN MATCHING STATEMENTS, ETC. THERE ARE ALSO A FEW PARAMETER LOCATIONS: .lm 9 .b;.I -8;^^XBASE\\ ^HOLDS THE BASE THAT THE NUMBER CONVERSION ROUTINES USE AS A REFERENCE (INITIALLY SET TO 12(OCTAL) FOR BASE TEN) .b;.I -8;^^XDEVS\\ ^HOLDS THE ADDRESS OF TWO, TWO-WORD DEVICE NAME BLOCKS (IN STANDARD SIXBIT '^^TEXT'\\ FORM) IN FIELD ZERO. THE FIRST BLOCK IS THE INPUT DEVICE (FOR ^^READ'\\S), AND THE SECOND IS THE OUTPUT DEVICE (FOR ^^WRITE'\\s AND ^^WRITEH'\\S). THESE ARE THE LOCATIONS to modify if a device other than ^D^S^k is used. .b;.tp 3;.I -8;^^XFILSI\\ ^NORMALLY ZERO; WHEN SET, IT PROVIDES THE MINIMUM OUTPUT FILE LENGTH SPECIFICATION FOR ^^ENTER'\\S.
.fill;.LM 1;.p THE SECOND TABLE IS LOCATED AT THE ADDRESS SPECIFIED BY ^^XICLTB \\(INTERNAL CALLING TABLE), WHICH IS PART OF THE MAIN TABLE. THE OFFSETS TO THIS TABLE ARE DEFINED IN OFFSET FORM, STARTING WITH ^^XXCLRV\\ (=0; ALL OF THESE SYMBOLS BEGIN WITH TWO ^X'S). THE ABSOLUTE VALUE OF THE ^X^X SYMBOLS MUST BE ADDED TO THE VALUE HELD IN ^^XICLTB\\ TO GIVE THE CORRECT ADDRESS. .TP 8;FOR EXAMPLE, TO REFERence THE '^^XXTOP\\' ENTRY IN THE INTERNAL CALLING TABLE: .UC;.TP 8;.nf .PAL 6 TAD XICLTB /GET THE ADDRESS OF THE INTERNAL TABLE TAD (XXTOP /ADD IN OFFSET DCA TX TAD I TX /GET THE DESIRED VALUE _^_.SNOBOL \\ .fill;.p THIS TABLE ALSO DEFINES BOTH ROUTINES AND PARAMETERS. THE PARAMETERS ARE DOCUMENTED BELOW: .LM 9 .I -8;^^XXPUTL\\ ^HOLDS THE ^^PUTVAR\\ TABLE ADDRESS; DISCUSSED BELOW UNDER CONCATENATION .I -8;^^XXPVR\\ ^HOLDS THE ^^PUTVAR\\ VARIABLE SPECIFICATION, SEE ABOVE .I -8;^^XXSVCHH\\ ^NORMALLY ZERO WHICH MEANS IGNORE ^^ASCII\\ CODES 212-214 (PAPER MOTION CHARACTERS). WHEN SET TO -1, ALL CHARACTERS WITH CODES 212-214 (^^LF, VT, FF)\\ WILL BE PASSED TO INPUT STRINGS ON INPUT, AS THEY APPEAR. CARRiaGE RETURNS ALWAYS DELIMIT LINES. .I -8;^^XXTOP\\ ^HOLDS THE ADDRESS OF THE FIRST UNUSED LOCATION IN FIELD ONE. .LM 1
.TP 8 .nofill;^^ VARIABLE STORAGE ================ .f;.p;\\ WHEN A ^^SNOBOL\\-8.2 PROGRAM IS COMPILED, POINTERS FOR ALL VARAIBLES USED ARE GENERATED IN FIELD ZERO. EACH POINTER CONSISTS OF THE ADDRESS OF THE FIRST CHARACTER WITHIN THE STORAGE AREA IN FIELD ONE. THE STORAGE IS IN A LINKED LIST, WITH STRINGS STORED THREE CHARACTERS FOR TWO WORDS, EDITOR STYLE. THE RUN-TIME SYSTEM GENERATES ITS OWN POINTERS DURING PROCESSING OF USER COMMANDS. THE RUN-TIME SYSTEM'S POINTERS CONSIST OF THE ADDRESS WORD ALONG WITH A charactER POSITION DESIGNATION (ONE, TWO OR THREE - CORRESPONDING TO THE ALIGNMENT OF THE NEXT CHARACTER AT THE SPECIFIED ADDRESS. THEREFORE, OFTEN POINTERS MUST BE SPECIALLY GENERATED WHEN THE USER WISHES TO DEAL DIRECTLY WITH THE SUPPORT ROUTINES.
.nf;.tp 6 .^^PAL 10 TAD NAME /GET THE STRING ADDRESS DCA PNAME CLA IAC /FIRST CHARACTER DCA PNAME+1 JMP .+3 PNAME, 0;0 /NEW VARIABLE POINTER _^.SNOBOL\\ .f;.p THE POINTER '^^PNAME'\\ IS NOW READY FOR USE IN CALLING, FOR EXAMPLE, THE GET CHARACTER ROUTINE, AS DESCRIBED BELOW. IT MUST BE REMEMBERED THAT AFTER SETTING UP A POINTER THIS WAY, BOTH '^^NAME'\\ AND '^^PNAME'\\ REFER TO THE SAME STORAGE AREA, AND IF NAME IS DELETED OR MODIFIED, THEN ^^PNAME\\ MUST BE MODIFIED ACCORDingly, AS THE ADDRESS SPECIFIED BY ^^PNAME\\ HAS BECOME OBSOLETE. .nf;.TP 8;^^ READING VARIABLES\\ ================= .f;. READING A VARIABLE CHARACTER BY CHARACTER IS A SIMPLE TASK VIA ^^PAL\\ CODE. CHARACTERS ARE RETURNED IN EIGHT BIT BYTES, RIGHT JUSTIFIED IN THE ACCUMULATOR. NOTE THAT THE '^^GET CHARACTER'\\ ROUTINE IS DEFINED IN THE INTERNAL CALLING TABLE, SO A CALLING ADDRESS MAY BE SET UP TO FACILITATE SIMPLE CODING, AS: .nf;.tp 7; .^^PAL 4 TAD XICLTB /THIS IS THE SAME EXAMPLE AS ABOVE TAD (XXGETC DCA GETC /WHERE GETC IS ON PAGE ZERO _^.SNOBOL\\ .fill;.p THE NEXT STEP IS TO SET UP A POINTER THAT THE GET CHARACTER ROUTINE WILL USE TO ACCESS THE VARIABLE. IT IS A TWO WORD BLOCK, WHERE THE FIRST WORD CONtains THE ADDRESS OF THE DATA (IN FIELD ONE), AND THE SECOND CONTAINS THE CHARacter POSITION (1, 2 OR 3 - BUT IT IS NOT MODULO THREE - IT CORRESPONDS TO THE STORAGE POSITION, AS CHARACTERS ARE PACKED IN THE EDITOR THREE CHARACTERS FOR TWO WORDS FORMAT). ONE SHOULD NOT ATTEMPT TO COMPUTE THE CHARACTER POSITION FOR A CHARACTER IMBEDDED IN A STRING, AS LINKED LISTS MAKE THE PROGRESSION NON-linear.
.TP 8 THE FOLLOWING SETS UP A POINTER TO THE FIRST CHARACTER OF THE STRING '^^NAME'\\: .nf .^^PAL 7 TAD NAME /GET THE STRING STORAGE ADDRESS DCA PNAME CLA IAC /FIRST CHARACTER DCA PNAME+1 JMP .+3 PNAME, 0;0 _^.SNOBOL\\ .p;.TP 9; FINALLY, TO READ THE NEXT CHARACTER FROM THE STRING: .^^PAL 3 JMS I GETC /AS DEFINED ABOVE PNAME /ARG 1: POINTER ADDRESS JMP DONE /END OF STRING RETURN /OTHERWISE CHARACTER RETURNED IN ACCUMULATOR _^.SNOBOL .TP 6; CLEARING VARIABLES ================== .f;.p;\\ A VARIABLE MAY BE CLEARED SIMPLY BY ZEROING ITS POINTER, HOWEVER, THE SPACE USED BY THE VARIABLE IS NOT RECLAIMED, AND WOULD REMAIN UNCHANGED AND UNACCESSable UNLESS THE ADDRESS WAS SAVED EXPLICITLY. TO RECLAIM THIS AREA, ONE SHOULD CALL THE ^^XXCLRV\\ SUPPORT ROUTINE. THE FOLLOWING CODE WILL DELETE A VARIABLE'S STORAGE AND ITS POINTER: .nf; .^^PAL 11 TAD XICLTB TAD (XXCLRV /OFFSET TO CLEAR VARIABLE ROUTINE /JUMP ADDRESS DCA TX TAD NAME /GET ADDRESS OF STORAGE JMS I TX /RECLAIM THAT STORAGE DCA NAME /AND DELETE THE POINTER JMP .+2 TX, 0 _^.SNOBOL\\
.uc;.tp 8; WRITING VARIABLES ================= .f;.p;\\ WRITING A NEW VARIABLE REQUIRES THREE DISTINCT STEPS: (1) FIND SPACE IN FIELD ONE FOR THE VARIABLE STRING STORAGE, (2) WRITING THE STRING, CHARACTER BY CHARACTER, AND (3) CLOSING THE VARIABLE WHEN DONE. THERE ARE THREE SUPPORT ROUTINES TO HANDLE THESE FUNCTIONS. FIRST, A VARIABLE POINTER FOR THE NEW STRING MUST BE GENERATED. IF THE VARIABLE IS EVER REFERENCED VIA ^^SNOBOL\\ CODE, THEN THAT NAME WILL APPEAR AS A VARIABLE POINTER AUTOMATICALLY. THIS POINTER MUST BE MANIPULATED ONLY VIA ^^SNOBOL\\ CODE, EXCEPT WHEN IT IS INITIALIZED DURING THIS FIRST STAGE. FROM THE POINT AT WHICH THE POINTER IS INITIALIZED TO THE POINT AT WHICH IT IS CLOSED (STAGE 3), THE VARIABLE SHOULD NOT BE REFERENCED BY ^^SNOBOL\\ CODE, ELSE THE END OF THE STRING WILL RUN ON INTO THE NEXT STRING IN VARIABLE STORAGE. A SEPARATE POINTER MUST BE SET UP FOR USE BY THE SUPPORT ROUTINES. THIS POINTER WILL BE UPDATED AS REquired BY THE SUPPORT ROUTINES, AND BECOMES OBSOLETE WHEN THE VARIABLE IS CLOSED. ASSUMING THE VARIABLE (IN THIS EXAMPLE, THE VARIABLE NAME IS '^^NAME'\\ AND IS REFERenced WITHIN ^^SNOBOL\\ CODE) TO BE WRITTEN IS EMPTY AT THIS POINT, THE FOLLowing CODE WILL FIND SPACE FOR THE STRING AND SET UP BOTH POINTERS: .NF; .^^PAL 15 TAD XICLTB TAD (XXFNDS /OFFSET TO FIND SPACE ROUTINE DCA TX JMS I TX /FIND SPACE DCA NAME /SETUP SNOBOL POINTER TAD NAME DCA PNAME /SETUP SUPPORT WRITE POINTER CLA IAC /(FIRST CHARACTER) DCA PNAME+1 JMP .+3 PNAME, 0;0 _^.SNOBOL\\ .f;.; SECOND, ANY NUMBER (UP TO 256) OF CHARACTERS MAY BE WRITTEN TO THIS STRING SEQUENTIALLY BY LOADING THE CHARACTER INTO THE ACCUMULATOR AND CALLING THE WRITE CHARACTER ROUTINE. THIS ROUTINE HAS A FAIL RETURN THAT IS NOT USED (I.E. ANY INSTRUCTION MAY BE PLACED IN THIS POSITION FOLLOWING THE CALL, AND IT WILL NOT BE EXECUTED): .NF; .^^PAL 11 TAD XICLTB TAD (XXWRCH /OFFSET TO WRITE CHARACTER ROUTINE DCA TX TAD ("X /GET AN 'X' TO WRITE TO THE STRING JMS I TX /WRITE IT PNAME /SUPPORT POINTER HLT /FAIL RETURN _^.SNOBOL\\ .f;.; FINALLY, TO CLOSE THE STRING, A CALL TO THE '^^CLOSE VARIABLE'\\ ROUTINE MUST BE MADE WITH THE ADDRESS OF THE POINTER FOLLOWING THE CALL. THERE IS NO FAIL RETURN: .nf;.tp 7; .^^PAL 6 TAD XICLTB TAD (XXCLV /OFFSET TO CLOSE VARIABLE ROUTINE DCA TX JMS I TX PNAME /SUPPORT POINTER _^.SNOBOL\\ .f;.; NOW '^^NAME\\' MAY BE REFERENCED VIA ^^SNOBOL\\ CODE AND WILL CONTAIN THOSE CHARACTERS WRITTEN DURING THE SECOND STAGE.
.nf;.UC;.TP 6 CONCATENATING STRINGS ===================== .f;.p;.LC STRINGS AND PARTS OF STRINGS RESIDING IN FIELD ONE VARIABLE STORAGE MAY BE SIMPLY CONCATENATED INTO A NEW STRING BY USING THE 'PUT VARIABLE' ROUTINE. A TABLE IS SET UP BY THE USER WHICH DESCRIBES THE ADDRESS, CHARACTER POSITION, AND LENGTH OF STRINGS. THEN THE ADDRESS OF A ^^SNOBOL\\ POINTER IS STORED IN THE LOCATION (^^XICLTB)+XXPVR\\. WHEN THE PUT VARIABLE ROUTINE IS INVOKED, THE STRINGS ARE COPIED INTO THE NEW VARIABLE IS THE SPECIFIED ORDER. NOTE THAT THE POINTER SUPPLIED IN LOCATION ^^XXPVR \\IS THE ^^SNOBOL\\ POINTER, AND NOT A SUPPORT POINTER. THIS VARIABLE NEED NOT BE EMPTY - ITS PREVIOUS CONTENTS, IF ANY, ARE DELETED BEFORE THE NEW STRING IS ASSIGNED. ^THE CHARACTER POSITION SPECIFIED FOR EACH SUB-STRING AGAIN CORRESPONDS TO THE STORAGE ALIGNMENT, AND CANNOT BE DEDUCED FROM THE CHARACTER POSITION WITHIN THE STRING. TO FIND THE CORRECT POSITION VALUE FOR AN ARBITRARY CHARACTER WITHIN THE STRING (WHEN A SUB-STRING BEGINNING AT THAT POSITION IS DESIRED), THE '^^GET CHARACTER'\\ ROUTINE SHOULD BE USED TO SPACE TO THE CORRECT POSITION, AND THEN THE SECOND WORD OF THE SUPPORT POINTER CAN BE USED TO SUPPLY THE DESIRED POSITION VALUE. ALSO, THE SUPPORT POINTER SHOULD BE ACCESSED TO GIVE THE CORRECT STRING ADDRESS. THE FORMAT OF THE TABLE IS TWO WORD ENTRIES, TERMINATED BY AN ENTRY WITH WORD ONE BEING NEGATIVE ONE. THE TWO WORD ENTRIES HAVE THE FORM: .nf; WORD 1/ ADDRESS OF STRING WORD 2/ (0-9) -CHARACTER LENGTH, (10-11) CHARACTER POSITION .f;. THE CHARACTER LENGTH MAY BE ZERO TO SPECIFY NO LENGTH LIMITATION, AND THE LENGTH IS ONLY MEANINGFUL IF THERE ARE AT LEAST THAT MANY CHARACTERS BEFORE THE END OF THE STRING. ASSUMING THE TABLE HAS BEEN SET UP (IT BEGINS AT THE LOCATION SPECIFIED BY THE ^^XXPUTL\\ ENTRY IN THE INTERNAL CALLING TABLE), AND THE ^^SNOBOL\\ VARIABLE '^^NAME'\\ IS THE DESIRED TARGET VARIABLE, THE FOLLOWING SEQUENCE WILL ACCOMPLISH THE CONCATENATION FUNCTION: .nf; .^^PAL 14 TAD XICLTB TAD (XXPVR /OFFSET TO TARGET VARIABLE ADDRESS DCA TX TAD (NAME /GET THE ADDRESS OF THE SNOBOL POINTER DCA I TX /SAVE IT FOR PUTVAR TAD XICLTB TAD (XXPUTV /OFFSET FOR PUT VARIABLE ROUTINE DCA TX JMS I TX _^.SNOBOL\\ ^THERE IS NO FAIL RETURN.
.nf;.PS 66,80;.uc;.nonumber SSS N N OOOOO BBBB OOOOO L 888 222 S S NN N O O B B O O L 8 8 2 2 S N N N O O B B O O L 8 8 2 SSS N NN O O BBBB O O L 888 222 S N N O O B B O O L 8 8 2 S S N N O O B B O O L 8 8 .. 2 SSS N N OOOOO BBBB OOOOO LLLLL 888 .. 22222 UU UU SSSSSS EEEEEEEEEE RRRRRRRR ''' SSSSSS UU UU SS SS EE RR RR ''' SS SS UU UU SS EE RR RR ''' SS UU UU SSSSSS EEEEEE RRRRRRRR SSSSSS UU UU SS EE RR RR SS UU UU SS SS EE RR RR SS SS UUUUUU SSSSSS EEEEEEEEEE RR RR SSSSSS MM MM AAAAAA NN NN UU UU AAAAAA LL MMMM MMMM AA AA NNNN NN UU UU AA AA LL MM MM MM AA AA NN NN NN UU UU AA AA LL MM MM MM AAAAAAAAAA NN NNNN UU UU AAAAAAAAAA LL MM MM AA AA NN NN UU UU AA AA LL MM MM AA AA NN NN UU UU AA AA LL MM MM AA AA NN NN UUUUUU AA AA LLLLLLLLLL
.page SSS N N OOOOO BBBB OOOOO L 888 222 S S NN N O O B B O O L 8 8 2 2 S N N N O O B B O O L 8 8 2 SSS N NN O O BBBB O O L 888 222 S N N O O B B O O L 8 8 2 S S N N O O B B O O L 8 8 .. 2 SSS N N OOOOO BBBB OOOOO LLLLL 888 .. 22222 UU UU SSSSSS EEEEEEEEEE RRRRRRRR ''' SSSSSS UU UU SS SS EE RR RR ''' SS SS UU UU SS EE RR RR ''' SS UU UU SSSSSS EEEEEE RRRRRRRR SSSSSS UU UU SS EE RR RR SS UU UU SS SS EE RR RR SS SS UUUUUU SSSSSS EEEEEEEEEE RR RR SSSSSS MM MM AAAAAA NN NN UU UU AAAAAA LL MMMM MMMM AA AA NNNN NN UU UU AA AA LL MM MM MM AA AA NN NN NN UU UU AA AA LL MM MM MM AAAAAAAAAA NN NNNN UU UU AAAAAAAAAA LL MM MM AA AA NN NN UU UU AA AA LL MM MM AA AA NN NN UU UU AA AA LL MM MM AA AA NN NN UUUUUU AA AA LLLLLLLLLL
.page .title SNOBOL-8.2 User's Manual .MARGINS 1,72 .SKIP 5 .cw;INTRODUCTION .SKIP 3;.f ^^SNOBOL\\-8.2 IS AN IMPROPER SUBSET OF ^^SNOBOL-3 [F\\ORTE 67] IMPLEMENTED FOR ANY ^P^D^P-8 COMPUTER OPERATING UNDER THE ^O^S/8 OPERATING SYSTEM. ^THE RESTRICTIONS TO ^^SNOBOL\\-3 CONSIST OF AN ABSENSE OF FUNCTIONS AND EXTENDED ARITHMETIC STATEMENTS. ^^SNOBOL\\-8.2 IS IN TURN EXTENDED BY ALLOWING THE PROGRAMMER ACCESS TO ^P^D^P-8 assembly language CODE WITHIN HIS/HER PROGRAM AND ALSO ACCESS TO ^O^S/8 FOR OPENING, CLOSING AND MANIPULATING ^O^S/8 FILES. ^THE INEXPERIENCED USER IS REFERRED TO ^ALLEN ^FORTE'S ^^SNOBOL-3 P\\RIMER WHICH GIVES A GOOD, SIMPLE INTRODUCTION TO THE LANGUAGE. ^THIS DOCUMENT IS DESIGNED TO UNDERLINE THE HIGHLIGHTS OF ^^SNOBOL\\-3 AS REFLECTED IN ^^SNOBOL\\-8.2 AS WELL AS TO DETAIL THE SPECIFIC IMPLEMENTATION OF ^^SNOBOL\\-8.2. .skip -10 .nf;.UC Author: Fred Dalrymple Northwestern University Computer Science Research Laboratory Technological Institute Room B626 Evanston, Illinois 60201 Updated: William Nowicki December 4, 1976
.PAGE .INDENT 17 ^TABLE ^OF ^CONTENTS .SKIP 2;.nf;^^ ^I. ^Data .LM 9 1. Literals 1 2. Variables 1 3. Special Variables 1 4. Special Codes 2 5. Variable Contents 3 6. Indirect Variables 3 7. Labels 3 8. Transfers 4 9. Comments 4 .i -3;II. "Period Compiler Commands 1. .PUSHJ, .PUSH, .POPJ, .POP 5 2. .PAL and .SNOBOL 5 3. .EXIT 6 4. .END 7 5. .LOOKUP 7 6. .ENTER 7 7. .ICLOSE 7 8. .OCLOSE 7 9. More on Files 7 .i -3;III. Arithmetic Operations 1. Arithmetic Capabilities 9 2. Bases 10 .i -3;IV. Pattern Matching 1. Simple Replacement 11 2. Simple Search a. non-anchor mode 11 b. anchor mode 12 3. Fillers a. Free Length Fillers 12 b. Fixed Length Fillers 13 4. Or 13 5. Delete a. Without Replacement 14 b. With Replacement 14 6. No Backup 14 7. POSR 15 .TP 7;.i -3;V. The Compiler 1. The Command String 16 2. Error Messages 16 3. Assembling the PAL file 16 4. Loading the Binary File 16 .i -3;VI. The Run Time System 1. Fatal Errors 17 2. Continuing After a Control C 17 .lc;.f
.lc;.PAGE;.NUMBER 1 .LM 1 ^I. ^DATA .LM 4 .SKIP 1 ^THERE ARE TWO METHODS BY WHICH TO SPECIFY DATA IN THE FORM OF A CHARACTER STRING. THE FIRST IS TO ENTER THE STRING IN QUOTES (A LITERAL), THE SECOND IS BY STORING THE STRING IN A VARIABLE. ^VARIABLES MAY BE ASSUMED TO BE EMPTY (NULL) AT THE BEGINNING OF THE PROGRAM. .SKIP 1 ^LITERALS AND VARIABLES MAY BE USED INTER-CHANGEABLY ANYWHERE A REFERENCE TO A STRING IS ALLOWED. ^FOR EXAMPLE: .SKIP 1 .INDENT 8 ^^VARIABLE = 'STRING'\\ IS VALID .BREAK .INDENT 8 ^^'STRING' = 'NEW VALUE'\\ IS NOT .SKIP 3 .LM 1 ^I.1 ^LITERALS .LM 4 .SKIP 1 ^A LITERAL IS ANY STRING OF CHARACTERS DELIMITED AT BOTH ENDS BY EITHER A SINGLE OR DOUBLE QUOTE. ^THE STRING CANNOT CONTAIN THE DELIMITER, BUT MAY CONTAIN ANY OTHER CHARACTER. ^FOR EXAMPLE: .SKIP 1 .NF ^^'THIS IS A LITERAL' "AND THIS" "THIS 'IS' TOO" ^D\\OUBLE QUOTES CAPTURE the SINGLES ^^'BUT THIS IS NOT" D\\IFFERENT TYPES OF QUOTES ^^'THIS ISN'T EITHER' S\\TRING CONTAINS THE DELIMITER .SKIP 3;.f
.LM 1 ^I.2 ^VARIABLES .LM 4 .SKIP 1 ^A VARIABLE NAME IS ANY SEQUENCE OF ALPHANUMERICS AND NUMERICS THAT BEGINS WITH AT LEAST ONE ALPHANUMERIC (EXCEPT "^X", WHICH IS RESERVED). ^ONLY THE FIRST SIX CHARACTERS ARE SIGNIFICANT, SO THAT '^^ABCDEFG'\\ AND '^^ABCDEFZ'\\ ARE EQUIVILENT. ^^No PAL8 reserved symbol or pseudo-op can be used as a variable name since the output of the SNOBOL compiler is passed through PAL8.\\ .SKIP 3 .LM 1 ^I.3 ^SPECIAL ^VARIABLES .LM 4 .SKIP 1 ^CERTAIN NAMES ARE RESTRICTED TO SPECIAL MEANINGS HAVING TO DO WITH INPUT/OUTPUT FUNCTIONS. ^A REFERENCE TO ONE OF THESE NAMES WILL HAVE THE EFFECT AS DESCRIBED BELOW: .SKIP 2;.NF ^^INPUT\\ VALUE IS A NEW LINE OF TEXT FROM THE CONSOLE ^^OUTPUT\\ *VALUE IS TYPED ON THE CONSOLE, FOLLOWED BY A RETURN-LINE FEED ^^OUTHOLD\\ *VALUE IS TYPED ON THE CONSOLE WITHOUT A RETURN-LINE FEED ^^READ\\ VALUE IS THE NEXT LINE FROM THE CURRENTLY OPEN INPUT FILE ^^WRITE\\ *VALUE IS WRITTEN ON THE CURRENTLY OPEN OUTPUT FILE, FOLLOWED BY A RETURN-LINE FEED ^^WRITEH\\ *VALUE IS WRITTEN WITHOUT THE RETURN-LINE FEED .F;.SKIP 1 ^INPUT VARIABLES (NON *) MAY BE USED WHEREVER A VARIABLE REFERENCE IS ALLOWED. ^OUTPUT VARIABLES (*) MAY ONLY BE ASSIGNED VALUES, WHICH ARE PROCESSES WHEN VARIABLE ASSIGNMENT TAKES PLACE. ^REFERENCE TO AN OUTPUT VARIABLE IN AN INPUT CONTEXT, for example: .SKIP 1 .INDENT 8 ^^NAME = OUTPUT\\ .SKIP 1 ^WILL RESULT IN A VALUE OF THE NULL STRING ASSIGNED TO ^^NAME.\\ ^REFERENCE TO AN INPUT VARIABLE IN AN OUTPUT CONTEXT WILL BE IGNORED AT RUN TIME (NO ASSIGNMENT TAKES PLACE). ^THE ^^READ\\ FUNCTION WILL FAIL IF EITHER THE INPUT FILE HAS BEEN EXHAUSTED OR NONE IS CURRENTLY OPEN. ^A ^^WRITE or WRITEH\\ FUNCTION WILL FAIL IF EITHER THERE IS NO OPEN OUTPUT FILE, OR IT IS FULL. ^A FUNCTION FAILURE CAUSES THE ENTIRE STATEMENT IN WHICH IT OCCURS TO FAIL. .SKIP 1 ^THE FOLLOWING SAMPLE PROGRAM CAUSES THE FILE '^^IFILE.TX'\\ ON THE ^O^S/8 ^D^S^K DEVICE TO BE TYPED IN ITS ENTIRETY: .SKIP 1 ########^^.LOOKUP#'IFILE.TX'###:F(END)###/\\OPEN THE INPUT FILE .BREAK ^^LOOP,###OUTPUT = READ#####:S(LOOP)#####/\\TYPE ALL THE INPUT LINES .BREAK ^^END,####.END\\ .skip 1 ^^A line of input is always terminated by the RETURN character (ASCII octal 215). Line feeds, form feeds, etc. (212-214) are ignored on input in normal mode. See the support routine description for more information.\\ .SKIP 3 .LM 1 ^I.3 ^SPECIAL ^CODES .LM 4 .SKIP 1 ^ANY SINGLE CHARACTER THAT THE USER IS RETICENT TO ENCLOSE IS QUOTES MAY BE EQUALLY WELL REPESENTED IN THE FORM: .SKIP 1 .^ANNN .SKIP 1 WHERE NNN IS THE octal ^^ASCII\\ CODE OF THE CHARACTER TO BE REPRESENTED. ^ANY CODE 1 THROUGH 377 IS VALID. ^For example, .^A214 can be used to generate a form feed character. .SKIP 3 .LM 1;.TP 5 ^I.5 ^VARIABLE ^CONTENTS .LM 4 .SKIP 1 ^THE VALUE OF A VARIABLE MAY BE ASSIGNED BY THE ^^SNOBOL-8.2\\ STATEMENT: .SKIP 1 .INDENT 8 ^^NAME = '\\STRING' .SKIP 1 ^AFTER THE EXECUTION OF THIS STATEMENT, EXAMINATION OF THE VARIABLE '^^NAME\\' WILL SHOW ITS CONTENTS TO BE THE LITERAL 'STRING' (NOT INCLUDING THE QUOTES). ^FURTHER CHARACTERS MAY BE CONCATENATED TO THE END OF THE CHARACTERS IN ^^NAME\\ BY THE STATEMENT: .SKIP 1 .INDENT 8 ^^NAME = NAME ", AND MORE"\\ .SKIP 1 ^^NAME\\ NOW HAS THE VALUE '^^STRING, AND MORE'\\. ^WE MAY DELETE THE VALUE OF ^^NAME\\ BY EITHER OF THE STATEMENTS: .SKIP 1 ^^NAME = '' .BREAK \\OR^^ NAME =\\ .SKIP 3 .LM 1
^I.6 ^INDIRECT ^VARIABLES .LM 4 .SKIP 1 ^THE PREFIX "@" TO A NAME OR LITERAL HAS THE EFFECT OF REFERENCING NOT THAT NAME OR LITERAL, BUT THE VARIABLE NAMED BY THE ORIGINAL STRING. ^FOR EXAMPLE, .SKIP 1 .INDENT 8 ^^STR = 'NAME' .BREAK .INDENT 8 NAME = 'THIS IS A STRING'\\ .SKIP 1 @^S^T^R HAS THE VALUE '^^THIS IS A STRING\\'. .SKIP 1 ^ALSO, TRANSFERS MAY BE MADE TO @^^NAME\\ IF ^^NAME\\ CONTAINS THE NAME OF A LABEL WITHIN THIS PROGRAM. .SKIP 1 ^ONE NOTE OF CAUTION WHEN USING THIS FEATURE: THE COMPILER PRODUCES A POSSIBLY LENGTHY TABLE TO ALLOW THIS FUNCTION TO WORK. ^IF SPACE IS LIMITED, IT WOULD BE WORTHWHILE TO NOT USE THIS FEATURE. .SKIP 3 .LM 1 ^I.7 ^LABELS .LM 4 .S 1 ^LABELS ARE USED TO IDENTIFY LINES OF THE ^^SNOBOL-8.2\\ PROGRAM. ^THE NAME USED AS A LABEL MUST CONFORM TO THE SAME CONVENTIONS AS FOR VARIABLE NAMES, E.G. NO MORE THAN SIX SIGNIFICANT CHARACTERS MAKE UP A NAME. ^NO LABEL MAY HAVE THE SAME NAME AS A VARIABLE OR OTHER LABEL. ^THE LABEL MUST BE THE FIRST ELEMENT OF A LINE AND MUST BE TERMINATED BY A COMMA. ^FOR EXAMPLE: .S 1 .I 8 ^^LABEL,###STR = "\\STRING" .S 3 .LM 1 ^I.8 ^TRANSFERS .LM 4 .SKIP 1 ^THE FLOW OF A PROGRAM MAY BE ALTERED BY A TRANSFER COMMAND. ^THE TRANSFER MAY BE MADE EITHER UNCONDITIONALLY OR UNDER A CERTAIN CONDITION OF THE SUCCESS-FAIL INDICATOR, THE SETTING OF WHICH IS DISCUSSED BELOW. ^THE FORMAT OF THE UNCONDITIONAL TRANSFER IS AS FOLLOWS: .S 1 .I 16 :(^^LABEL\\) .S 1 ^THE FORMAT OF THE SUCCESS AND FAIL, RESPECTIVELY, TRANSFERS IS AS FOLLOWS: .S 1 .I 16 :^^S(LABEL\\)###/TRANSFERS TO ^^LABEL\\ ON SUCCESS .BR .I 16 :^^F(LABEL)\\###/TRANSFERS TO ^^LABEL\\ ON FAILURE .S 1 ^TRANSFERS FOR SUCCESS AND FAILURE MAY BE GROUPED TOGETHER: .S 1 .I 16 :^^S(LABEL1)F(LABEL2) .BR .I 16 :F(LABEL2)S(LABEL1)\\ .S 1 ^BOTH OF THESE FORMS TRANSFER TO ^^LABEL1\\ ON SUCCESS AND ^^LABEL2\\ ON FAILURE. .S 1 ^TRANSFERS SHOULD BE THE LAST EXECUTABLE ELEMENT OF THE SOURCE LINE (THEY MAY BE ALONE ON A LINE) AND SHOULD FOLLOW ANY COMMAND (EXCEPT .^P^A^L OR ANY SECTION OF ^P^A^L CODE). ^THE TRANSFER SHOULD IMMEDIATELY PRECEED ANY COMMENT. .S 3 .LM 1 ^I.9 ^COMMENTS .LM 4 .S 1 ^ANY SLASH NOT CAPTURED WITHIN QUOTES (I.E. WITHIN A LITERAL) AND ALL characters TO THE RIGHT OF THE SLASH are TREATED AS A COMMENT AND IS IGNORED BY THE COMPILER: .S 1 ^^LABEL,###STR = /purge STR\\ (THIS IS A COMMENT) .PAGE .LM 1 ^I^I. ^PERIOD ^COMPILER ^COMMANDS .LM 4 .SKIP 2 ^ALL COMMANDS PRECEEDED BY A PERIOD SHOULD IMMEDIATELY FOLLOW ANY LABEL (IF SPECIFIED) AND IMMEDIATELY PRECEED ANY TRANSFER (IF SPECIFIED). .SKIP 3 .LM 1 ^I^I.1 ^^.PUSHJ, .PUSH, .POPJ \\AND .^P^O^P .LM 4 .SKIP 1 ^^_.PUSHJ\\ IS A STACK OPERATOR WHICH ALLOWS TRANSFER OF CONTROL TO ANY LABEL IN THE PROGRAM. ^^.POPJ\\ TRANSFERS CONTROL TO THE POINT IMMEDIATELY FOLLOWING THE MOST RECENT ^^.PUSHJ\\ THAT WAS EXECUTED. (^I.^E. ANY TRANSFER ON THE SAME LINE, OTHERWISE THE NEXT EXECUTABLE STATEMENT. ^^_.PUSH and .POP can be used as general stack operators. Much care should be taken to be sure that every .PUSH(J) has a corresponding .POP(J), since the same stack is used for both variables and lables. \\ .BREAK ^An example of the use of these commands follows: .NF;^^ _.PUSH VAR Push the argument on the stack _.PUSHJ LABEL This is equivalent to a subroutine call LABEL, _.POP ARG Pop the argument off the stack _... _.POPJ This statement returns from the subroutine .SKIP 1;.fill;.lc ^UP TO 32. ^^.PUSHJ\\'S MAY BE MADE AT ONE TIME. ^IF 32. .^^PUSHJ\\'S HAVE BEEN MADE, AND ANOTHER .^^PUSHJ\\ IS EXECUTED BEFORE A .^^POPJ\\, THEN THE RUN TIME SYSTEM WILL SIGNAL THIS CONDITION AND THE PROGRAM WILL STOP. .SKIP 3 .LM 1
^I^I.2 ^^.PAL\\ AND ^^.SNOBOL\\ .LM 4 .SKIP 1 ^THERE ARE TWO METHODS BY WHICH TO ENTER THE MODE WHERE THE COMPILER EXPECTS ^^PAL-8\\ CODE AS INPUT. ^THE FIRST IS THE .^^PAL\\ COMMAND. ^FOR EXAMPLE: .SKIP 1 .INDENT 8 ^^_.PAL \\NN .SKIP 1 .INDENT 20 ^P^A^L CODE GOES HERE .SKIP 1 .INDENT 8 _^^^_.SNOBOL\\ .SKIP 1 WHERE NN IS THE NUMBER OF LOCATIONS (IN OCTAL) THAT THE ^P^A^L CODE WILL REQUIRE. ^THE COMPILER ASSUMES A '.^^SNOBOL\\' AT THE BEGINNING OF EVERY PROGRAM. ^THE ^P^A^L-8 CODE BETWEEN THE .^P^A^L STATEMENT AND THE ^^.SNOBOL\\ STATEMENT WILL NOT BE BROKEN UP BY A PAGE BOUNDARY. .SKIP 1 ^THE SECOND METHOD OF ENTERING ^P^A^L CODE IS BY PREFIXING AN UPARROW TO THE BEGINNING OF EACH ^P^A^L LINE. ^THE UPARROW HAS THE EFFECT OF CHANGING THE COMPILER MODE FOR THAT LINE; I.E. IS IN ^^SNOBOL\\ MODE, THE UPARROW SIGNALS A LINE OF ^P^A^L CODE, IF IN ^P^A^L MODE, THE UPARROW SIGNALS A LINE OF ^^SNOBOL\\ CODE. ^A DOUBLE UPARROW RESERVES TWO WORDS FOR THE LINE OF ^P^A^L CODE. ^^ Note that an uparrow is needed in ^PAL mode for the .SNOBOL statement.\\ ^EXAMPLES: .SKIP 1 .NF;^^ .SNOBOL /Implicit _^_^ TAD (255 /Save two words - one for TAD and / one for the literal _^ DCA 50 /Save one location _.PAL 4 /Four words: TAD (562 /Two CMA IAC /One DCA 62 /One _^ OUTPUT = NAME /One line of SNOBOL _^ _.SNOBOL /change back (note uparrow) .f;.lc .SKIP 1 ^A NOTE OF CAUTION: THE COMPILER WILL DETERMINE IF FOUR MORE WORDS (".^P^A^L 4") WILL FIT ON THE PRESENT MEMORY PAGE. ^IF NOT, THEN IT STARTS A NEW PAGE. ^IF THE LINE OF ^^SNOBOL\\ CODE WE INSERTED (^^OUTPUT = NAME\\) WILL NOT FIT ON THE PAGE WITH THE FOUR FROM THE ^P^A^L COMMAND, THE COMPILER WILL PUT THE CODE FOR THE ^^SNOBOL\\ COMMAND ON A NEW PAGE. .SKIP 1 ^IT IS THEREFORE DESIREABLE TO BREAK UP LARGE SECTIONS OF ^P^A^L CODE TO SMALLER SECTIONS SO AS NOT TO WASTE SPACE IF ALL DOES NOT FIT ONTO ONE PAGE, WHEREAS PART MAY. .S 1 ^^SNOBOL-8.2\\ INSERTS A PAGE BOUNDS WHERE-EVER NEEDED AND HANDLES THE JUMP OVER THE BOUNDS. ^IT IS POSSIBLE THAT A BREAK MAY OCCUR BETWEEN THE FOLLOWING TWO LINES: .S 1 _^#######^T^A^D 30 .BREAK _^#######^D^C^A 40 .S 1 ^WHILE THE ^A^C^C IS PRESERVED AS WELL AS THE PROGRAM FLOW, IF THE FOLLOWING TWO LINES WERE BROKEN UP, THE RESULTS WOULD BE UNEXPECTED: .S 1 _^#######^S^M^A .BREAK _^#######^^JMP LABEL\\ .S 3 .LM 1 ^^II.3 .EXIT\\ .LM 4 .S 1 ^THIS COMMAND CAUSES A JUMP TO LOCATION 7600 (THE STARTING ADDRESS OF ^O^S/8). ^TO RESTART THE ^^SNOBOL-8.2\\ PROGRAM: .S 1 .INDENT 8 _^^C .I 8 _.^^START\\ 200 .S 3 .LM 1;.tp 5 ^^II.4 .END\\ .LM 4 .S 1 ^THIS COMMAND MARKS THE END OF THE PROGRAM AND GENERATES A ^^.EXIT\\. ^THIS STATEMENT IS LARGELY AESTHETIC, AS THE COMPILER WILL COMPILE FURTHER STATEMENTS. .S 3 .LM 1 ^^II.5 .LOOKUP VAR \\OR^^ 'NAME.EX'\\ .LM 4 .S 1 ^THIS COMMAND LOOKS UP THE SPECIFIED FILE ON DEVICE ^D^S^K AND READIES IT FOR INPUT. ^THE SUCCESS-FAIL INDICATOR IS SET TO SUCCESS IF THE FILE IS FOUND; IF NOT, TO FAILURE. .S 3 .LM 1 ^^II.6 .ENTER VAR \\OR^^ 'NAME.EX'\\ .LM 4 .S 1 ^THIS COMMAND READIES A FILE FOR OUTPUT ON DEVICE ^D^S^K. ^IF THERE IS ROOM AND NOT A FILE ALREADY OPEN, THE SUCCESS-FAIL INDICATOR IS SET TO SUCCESS, OTHERWISE FAILURE. .S 3 .LM 1 ^^II.7 .ICLOSE\\ .LM 4 .S 1 ^THIS COMMAND CLOSES THE INPUT FILE (IF ONE WAS OPEN). ^IT ALWAYS SUCCEEDS. .S 3 .LM 1 ^^II.8 .OCLOSE\\ .LM 4 .S 1 ^THIS COMMAND CLOSES THE OUTPUT FILE (IF ONE WAS OPEN), AND ENTERS IT INTO THE DIRECTORY FOR THE DEVICE ^D^S^K OF THE ^O^S/8 SYSTEM. ^IF THE FILE WAS OPEN AND WAS ABLE TO BE CLOSED, THE SUCCESS-FAIL INDICATOR IS SET TO SUCCESS, OTHERWISE FAILURE.
.S 3 .LM 1 ^I^I.9 ^MORE ^ON ^FILES .LM 4 .S 1 ^^SNOBOL-8.2\\ FILES ARE ^^EDIT\\OR COMPATIBLE, SO THAT ANY FILE THAT CAN BE ^^EDIT\\ED OR LISTED BY ^P^I^P IS AVAILABLE FOR READING BY ^^SNOBOL-8.2\\. ^In normal mode any page format is lost since all form feeds are ignored. ^SIMILARLY, ANY FILE WRITTEN BY ^^SNOBOL-8.2\\ in normal mode IS AVAILABLE TO ANY STANDARD ^O^S/8 FILES PROGRAM. ^No control ^Z (THE ^O^S/8 end of file mark) is output unless explicitly done by the user; thus, on reading the file into the ^^EDITOR\\ the user may obtain a "?". .S 1 ^THE USER IS ABLE TO SPECIFY ANY DEVICE FOR HIS FILE ^I/^O BY MODIFYING CERTAIN LOCATIONS IN THE RUN-TIME SYSTEM. ^BY USING ^^XDEVS\\ AS AN INDIRECT POINTER TO TWO, STANDARD, TWO-WORD DEVICE NAME BLOCKS IN FIELD ZERO (THE FIRST IS THE INPUT DEVICE, THE SECOND, THE OUTPUT DEVICE), ONE CAN CHANGE THE DEFAULT INPUT AND OUTPUT DEVICES REFERENCED BY THE FILE ^I/^O. ^THEY ARE INITIALLY SET TO ^D^S^K AND MUST BE CHANGED BEFORE THE CORRESPONDENT ^^.LOOKUP OR ^^.ENTER.\\ .S 1 ^THE USER CAN ALSO SET THE MAXIMUM SIZE OF THE OUTPUT FILE BY PUTTING THE SIZE IN LOCATION ^^XFILSIZ\\. ^THE SYMBOLS ^^XDEVS\\ AND ^^ZFILSIZ\\ ARE DEFINED IN ^^SNORTS.PR\\ AND MAY BE REFERENCED BY ^P^A^L CODE. ^See the support routine writeup for more information. .PAGE .LM 1 ^^III. A\\RITHMETIC ^OPERATIONS .S 2 ^^III.1 A\\RITHMETIC ^CAPABILITIES .LM 4 .S 1 ^NUMBER HAVE TWO REPRESENTATIONS. ^FIRST, AND MOST OBVIOUS, IS REPRESENTED BY THE FOLLOWING STATEMENT: .S 1 .INDENT 8 ^^NUM1 = '52'\\ .S 1 ^^NUM1\\ NOW CONTAINS THE LITERAL STRING "52". ^IN THIS FORM, THERE IS NO WAY TO ADD ANOTHER NUMBER TO THIS STRING AND GET THE SUM AS A STRING (WITHOUT EXTENSIVE PATTERN MATCHING). ^WHAT IS NEEDED IS A ROUTINE TO TRANSFORM THE STRING "52" INTO, THE OTHER REPRESENTATION, AN OCTAL NUMBER. ^THIS FORM MAY HAVE ARITHMETIC OPERATIONS PERFORMED ON IT (VIA ^P^A^L MACHINE CODE). .S 1 ^^SNOBOL-8.2\\ ALLOWS THE OPERATIONS + AND - BETWEEN STRINGS (THAT ARE CONVERTED INTO OCTAL FIRST AND THEN TRANSLATED BACK INTO STRINGS AFTER THE OPERATIONS). ^THE FORM IS: .S 1 .I 8 ^^NAME = A\\ OP ^B OP ^C . . . .S 1 WHERE OP IS EITHER + OR -, WHICH CAUSE THE EXPECTED OPERATIONS TO TAKE PLACE ON ^A, ^B, ETC. .S 1 ^FOR MORE EXOTIC OPERATIONS, ^P^A^L CODE SEQUENCES MAY CALL THE RUN TIME SYSTEM ROUTINES ^^XASC\\ AND ^^XINT\\ TO CONVERT THE STRING TO OCTAL, AND THE OTHER DIRECTION. ^NOTE THAT ^^SNOBOL-8.2\\ OPERATES ON STRINGS ONLY AND CANNOT HANDLE OCTAL REPRESENTATIONS OF NUMBERS. .S 1 ^THE CALLING SEQUENCE FOR ^^XASC\\ IS: .S 1 .I 8 ^^_.PAL 2 .BREAK .I 8 JMS I###XASC /XASC\\ IS DEFINED IN ^^SNORTS.PR .BREAK .I 8 NAME /\\WHERE ^^NAME\\ IS A ^^SNOBOL\\ VARAIBLE .BREAK .I 8 ^^ _^_.SNOBOL /\\THE VALUE OF ^^NAME\\ IS .BR .I 29 /RETURNED IN THE ^A^C^C .S 2 ^THE CALLING SEQUENCE FOR ^^XINT\\ IS: .S 1 .I 8 ^^_.PAL 2 /\\THE OCTAL NUMBER TO BE CONVERTED .BREAK .I 8 ^^ JMS I###XINT /\\SHOULD BE IN THE ^A^C^C .BREAK .I 8 ^^NAME /NAME\\ WILL HOLD THE STRING .BREAK .I 8 _^^^_.SNOBOL\\ .S 3;.tp 9 .LM 1
.tp 9 ^^III.2 B\\ASES .LM 4 .S 1 ^BOTH ^^XASC\\ AND ^^XINT\\ WILL OPERATE IN ANY BASE (GREATER THAN ONE). ^THE BASE IS INITIALLY SET TO 10. ^NO AESTHETICS ARE APPLIED (E.G. 10, BASE 11 = ":";####11, BASE 12 = ";"). .S 1 ^THE BASE IS STORED AS A BINARY NUMBER IN LOCATION ^^XBASE\\ (DEFINED IN ^^SNORTS.PR\\). ^Note that since a twelve bit binary number is used, any numeric value must be between 2047 decimal and -2048. .PAGE .LM 1 ^^IV. P\\ATTERN ^MATCHING .S 2 ^^IV.1 S\\IMPLE ^REPLACEMENT .LM 4 .S 1 ^THIS HAS ALREADY BEEN EXPLAINED BY ^I.4, BUT IT WILL BE BRIEFLY RE-STATED HERE. ^THE BASIC FORM OF THIS COMMAND IS: .S 1 .I 8 _<VARIABLE NAME> = <LIST> .S 1 WHERE <LIST> IS MADE UP OF VARIABLES AND LITERALS ONLY. ^IF <LIST> IS MISSING, THEN <VARIABLE NAME> WILL BE THE NULL STRING. ^THE EFFECT OF THIS STATEMENT IS TO CONCATENATE ALL THE STRINGS IN <LIST>, WHICH BECOMES THE NEW VALUE OF <VARIABLE NAME>. .S 3 .LM 1 ^I^V.2 ^SIMPLE ^SEARCH .LM 4 .S 1 2.A ^NON-ANCHOR ^MODE .S 1 ^TO SEARCH A STRING FOR THE SEQUENCE AS CHARACTERS IN ANOTHER STRING, ONE USES A SEARCH: .S 1 .I 8 ^^BASE = 'THIS IS THE BASE STRING' .BREAK .I 8 MATCH = 'BASE' .BREAK .I 8 BASE##MATCH\\ .S 1 ^THE LAST STATEMENT WILL SEARCH THE STRING CONTAINED IN ^^BASE\\ FOR THE STRING CONTAINED IN ^^MATCH\\. ^THIS COMMAND WILL SUCCEED (SET THE SUCCESS INDICATOR) BECAUSE THE CHARACTERS '^^BASE' (\\IN THE VARIABLE ^^MATCH\\) DO MATCH THOSE SAME CHARACTERS WITHIN THE BASE STRING '^^THIS IS THE BASE STRING'\\. ^HOWEVER, .S 1 .I 8 ^^MATCH##BASE\\ .S 1 W\\ILL FAIL, BECAUSE ^^MATCH\\ DOES NOT CONTAIN ALL THE CHARACTERS IN ^^BASE\\. .S 1 ^IF WE SEARCH FOR A LIST OF ITEMS, THE ITEMS ARE CONCATENATED, AND THE RESULTING STRING IS SEARCHED FOR: .S 1 .I 8 ^^MATCH2 = 'STRING' .BREAK .I 8 BASE###MATCH#MATCH2 .S 1 W\\ILL FAIL BECAUSE WHEN ^^MATCH \\AND ^^MATCH2\\ ARE CONCATENATED, THE RESULTING STRING IS '^^BASESTRING\\'. ^The following will succesfully match: .S 1 .I 8 ^^BASE##MATCH#'#'#MATCH2\\ .s 3;.tp 5; 2.B ^ANCHOR ^MODE .S 1 ^THIS PATTERN MATCHING MODE, INVOKED BY A underscore IMMEDIATELY FOLLOWING THE BASE STRING (THE STRING BEING SEARCHED THROUGH), CAUSES THE PATTERN MATCHER TO FAIL UNLESS THE STRING BEING SEARCHED FOR BEGINS AT EXACTLY THE BEGINNING OF THE BASE STRING. ^Sometimes the underscore is printed as a backarrow. ^FOR EXAMPLE: .S 1 .I 8 ^^BASE = 'THIS IS THE BASE STRING' .BR .I 8 BASE__##'THIS IS' \\WILL SUCCEED, WHILE: .BR .I 8 ^^BASE__##'BASE' \\WILL NOT. .S 3 .LM 1 ^I^V.3 ^FILLERS .LM 4 .S 2 3.A ^FREE ^LENGTH ^FILLERS .S 1 ^IT IS POSSIBLE TO MATCH AN ARBITRARY NUMBER (UP TO 511) OF CHARACTERS OF THE BASE STRING BY THE USE OF FILLERS. ^THE STRING TO BE MATCHED BY A FILLER MUST BE DELIMITED BY EITHER THE END OF THE BASE STRING OR A VARIABLE THAT MATCHES PART OF THE BASE STRING. ^A FILLER MATCHES THE LEAST NUMBER OF CHARACTERS POSSIBLE TO ALLOW THE PATTERN MATCH TO SUCCEED. ^FOR EXAMPLE: .S 1 .I 8 ^^BASE = ',AND,TAD,ISZ,' .S 1 \\^SUPPOSE THAT WE WANT TO MATCH AND SUBSEQUENTLY ACCESS THE STRING DELIMITED BY THE FIRST TWO COMMAS IN ^^BASE\\. ^WE COULD SPECIFY: .S 1 .I 8 ^^BASE##','#*BETWN*#',' .S 1 ^T\\HE ACTION OF THE RUN TIME SYSTEM IS TO FIRST MATCH THE COMMA, WHICH IS FOUND IN ^^BASE\\ IMMEDIATELY. ^THEN, THE FILLER IS NOTED AND THE MATCH CONTINUES FOR THE SECOND COMMA. ^WHEN THE SECOND COMMA IS FOUND, THE PATTERN MATCH IS DETERMINED TO HAVE SUCCEEDED, AND THE CHARACTERS PASSED OVER WHILE SEARCHING FOR THE SECOND COMMA ARE ASSIGNED TO THE VARIABLE ^^BETWN\\. ^NO VARIABLE ASSIGNMENT OCCURS UNLESS THE ENTIRE PATTERN MATCHING STATEMENT SUCCEEDS (SEE ^I^V.8). .S 1 ^SUPPOSE THAT WE WISH TO SIMILARLY ACCESS THE SECOND STRING DELIMITED BY COMMAS IN ^^BASE\\. ^WE COULD SPECIFY: .S 1 .I 8 ^^BASE##','#**#','#*BETWN*#','\\ .S 1 ^THE RUN TIME SYSTEM WILL FOLLOW ESSENTIALLY THE SAME PROCEDURE, EXCEPT THAT THE VARIABLE NAMED WITHIN '**' IS A WRITE-ONLY VARIABLE, its value will be thrown away. .S 1 ^NOTE THAT BY THE USE OF FILLERS, THE BASE STRING IS NOT MODIFIED (SEE ^I^V.5). .S 3;.tp 5 3.B ^FIXED ^LENGTH ^FILLERS .S 1 ^IT IS POSSIBLE TO SPECIFY THE LENGTH OF A FILLER. ^IN THIS CASE, THE FILLER MUST MATCH EXACTLY THE SPECIFIED NUMBER OF CHARACTERS IN THE BASE STRING, ELSE THE ENTIRE STATEMENT WILL FAIL. ^THE FORM IS: .S 1 .I 8 ^^BASE = 'ABCDEFGHIJK' .BR .I 8 BASE##*LETRS\\/6*
.S 1 ^THIS STATEMENT SPECIFIES THE ASSIGNMENT OF THE FIRST SIX CHRARACTERS IN ^^BASE\\ TO THE VARIABLE ^^LETRS\\, SO ^^LETRS\\ WILL CONTAIN '^^ABCDEF'\\. .S 1 .I 8 ^^LEN = '3' .BR .I 8 BASE##*LETRS/LEN*\\ .S 1 ^THIS LATTER STATEMENT WILL ASSIGN '^A^B^C' TO ^^LETRS\\. ^SIMILARLY, IF WE WISH TO SKIP THREE CHARACTERS AND THEN GET THE NEXT THREE: .S 1 .I 8 ^^BASE */3* *INSIDE/3*\\ .S 1 ^^INSIDE\\ WILL BE '^D^E^F'. .S 3 .LM 1 ^I^V.4 ^OR .LM 4 .S 1 ^IT IS FURTHER POSSIBLE TO MATCH EITHER ONE SEQUENCE OF CHARACTERS OR ANOTHER, UP TO AN ARBITRARY NUMBER OF CHOICES. ^THE CHOICES ARE SEPERATED BY EXCLAIMATION POINTS, READ 'OR'. ^FOR EXAMPLE: .S 1 .I 8 ^^BASE = 'FIRST, THIS. AND;THEN' .BR .I 8 OTHER = ';' .BR .I 8 BASE *SEG* ' '!'.'!','!OTHER\\ .S 1 ^S^E^G WILL CONTAIN ALL OF THE CHARACTERS UP TO, BUT NOT INCLUDING THE FIRST OF THE OPTIONS TO MATCH. ^SO, IN THIS CASE, ^S^E^G WILL MATCH '^^FIRST'\\ AND THE COMMA WILL BE MATCHED. .S 1 ^CONSIDER: .S 1 .I 8 ^^BASE *SEG\\/4* ' '!','!';' .S 1 ^S^E^G WILL MATCH THE FIRST FOUR CHARACTERS OF ^B^A^S^E, but since ONE OF THE CHOICES MUST MATCH THE NEXT CHARACTER IN THE BASE STRING, THE THE PATTERN MATCH WILL FAIL. ^S^E^G will not be assigned a value. .S 3 .LM 1;.tp 9 ^I^V.5 ^DELETE .LM 4 .S 2 5a. ^WITHOUT ^REPLACEMENT .S 1 ^SUPPOSE THAT WE WISH TO DELETE THE PORTION WE HAVE MATCHED IN THE BASE STRING FROM THE BASE STRING TO LEAVE US ONLY THE UNMATCHED PORTION OF THE BASE STRING. ^THIS MAY BE PERFORMED BY USE OF THE EQUAL SIGN: .S 1 .I 8 ^^BASE = 'ABCDEFG' .BR .I 8 BASE *CHAR/1* =\\ .S 1 ^THE EQUAL SIGN FOLLOWS THE SEARCH LIST AND ALL FILLERS. ^IN THIS CASE, ^^CHAR\\ WILL CONTAIN '^A' AND ^^BASE\\ WILL CONTAIN '^^BCDEFG'\\. ^ANOTHER EXAMPLE: .S 1 .I 8 ^^BASE = 'TAD.,AND.,' .BR .I 8 BASE ',' *SEG* ','!'.' =\\ .S 1 ^IN THIS EXAMPLE, ^^BASE\\ WILL CONTAIN '^T^A^D.,' AND ^S^E^G WILL CONTAIN '^A^N^D'. ^THE WRITE ONLY FILLER IS USEFUL FOR SELECTIVE DELETION, FOR EXAMPLE, TO DELETE EVERYTHING BETWEEN two periods use: .skip 1 .i 8;^^BASE "." ** "." = .S 3;.lc 5b. ^WITH ^REPLACEMENT .S 1 ^IF A LIST OF VARIABLES AND LITERALS APPREAR TO THE RIGHT OF THE EQUAL SIGN, THEN NOT ONLY IS THE MATCHED PORTION OF THE BASE STRING DELETED, BUT ALSO IT IS REPLACED BY THE CONCATENATION OF THE STRINGS FROM THE LIST. ^FOR EXAMPLE: .S 1 .I 8 ^^BASE = 'TAD,AND' .BR .I 8 ELEMNT = 'ISZ' .BR .I 8 BASE ',' = ';' ELEMNT ';'\\ .S 1 ^^BASE\\ IS SEARCHED FOR A COMMA, WHICH IS FOUND AND DELETED AND THEN REPLACED BY THE LIST. ^^BASE\\ WILL HAVE THE CONTENTS '^^TAD;ISZ;AND\\'. .S 3 .LM 1 ^I^V.6 ^NO ^BACKUP .LM 4 .S 1 ^THIS NON-STANDARD FEATURE IS BEST ILLUSTRATED BY AN EXAMPLE: .S 1 .I 8 ^^BASE = 'ABCDEFG' .BR .I 8 BASE 'A'!'B' 'C'\\ .S 1
^WHAT IS THE OPERATION OF THE RUN-TIME SYSTEM IN EVALUATING THIS LATTER STATEMENT? ^FIRST, IT MATCHES THE '^A' AGAINST THE FIRST '^A' IN ^^BASE\\. ^NEXT, IT MUST ATTEMPT TO MATCH '^C' AGAINST THE NEXT CHARACTER IN ^^BASE\\. ^HOWEVER, CLEARLY THIS WILL FAIL, BECAUSE THE NEXT CHARACTER IN ^^BASE\\ IS A '^B' AND NOT A '^C'. ^SO, THE RUN-TIME SYSTEM 'BACKS UP' TO THE '^A' OR '^B' OPTION STAGE BECAUSE IF IT MAKES ANOTHER CHOICE (IN THIS CASE '^B') THEN IT IS POSSIBLE THAT THE '^C' WILL MATCH WHEN IT COMES TIME. ^THIS TIME THE RUN-TIME SYSTEM CHOOSES THE '^B', AND THEN FINDS THAT THE '^C' DOES MATCH, SO THE STATEMENT WILL SUCCEED. .S 1 ^HOWEVER, THE CHARACTER '<' WHEN USED IN A PATTERN MATCH (BEFORE ANY DELETE, IF IT IS USED) CAUSES THE RUN-TIME SYSTEM TO NOT BE ABLE TO BACK UP BEYOND THAT POINT; THEREFORE THE FOLLOWING EXAMPLE WOULD FAIL: .S 1 .I 8 ^^BASE 'A'!'B' < 'C'\\ .S 3 .LM 1 ^I^V.7 ^^POSR\\ .LM 4 .S 1 ^THIS SPECIAL VARIABLE (AVAILABLE ONLY WITHIN THE PATTERN MATCHING STATEMENT) MATCHES ONLY THE END OF THE BASE STRING. ^IT THERFORE CAN BE THOUGHT OF AS THE INVERSE OF THE UNDERSCORE (ANCHOR MODE). ^IF THE BASE STRING HAS NOT BEEN MATCHED FULLY TO ITS END WHEN ^^POSR\\ IS ENCOUNTERED, THEN THIS FUNCTION WILL FAIL. ^FOR EXAMPLE: .skip;^^ .I 8;BASE = "ABCDEFG" .I 8;BASE "G" POSR .I 8;BASE "A" "C"!POSR .skip 1;\\ ^THE FIRST PATTERN MATCH ABOVE WILL FAIL, THE SECOND WILL SUCCEED. .S 3 .LM 1 ^I^V.8 ^FILLER AND ^BASE ^STRING ^ASSIGNMENT .LM 4 .S 1 ^ALL VARIABLE ASSIGNMENTS (FILLERS AND DELETION/REPLACEMENT OF THE BASE STRING) ARE PERFORMED AT THE END OF THE PATTERN MATCHING STATEMENT, AND ONLY IF THE STATEMENT WAS SUCCESSFUL. ^THIS IS IN PARTAIL DIFFERENCE WITH OTHER ^^SNOBOL-3\\ IMPLEMENTATIONS, FOR EXAMPLE: .S 1 .I 8 .I 8 ^^BASE = '"THIS IS A LITERAL"' .I 8 BASE *QUOTE/1* *LITRL* QUOTE\\ .S 1 ^OTHER IMPLEMENTATIONS HAVE ALLOWED THE ASSIGNMENT OF ^^QUOTE\\ BEFORE THE END OF THE PATTERN MATCHING, AND HENCE THE SECOND INSTANCE OF ^^QUOTE\\ WILL MATCH THE CHARACTER IN ^^BASE\\ THAT IS THE SAME AS THE FIRST CHARACTER THAT WAS MATCHED BY ^^*QUOTE/1*\\. ^THIS IS NOT THE ACTION OF ^^SNOBOL-8.2\\, THIS STATEMENT WOULD HAVE TO BE BROKEN UP INTO THE TWO PATTERN MATCHING STATEMENTS: .S 1 .I 8 ^^BASE *QUOTE/1* .BR .I 8 BASE QUOTE *LITRL* QUOTE .PAGE .LM 1;\\ ^V. ^THE ^COMPILER .S 2 ^V.1 ^THE ^COMMAND ^STRING .LM 4 .S 1 ^THE ^^SNOBOL-8.2\\ COMPILER USES THE ^C^D FUNCTION OF ^O^S/8 AND IS THEREFORE COMPATIBLE WITH THE COMMAND STRINGS OF OTHER ^O^S/8 SYSTEMS PROGRAMS. ^THE COMPILER PRODUCES ONE OUTPUT FILE - A ^P^A^L FILE TO IMPLEMENT THE ^^SNOBOL-8.2\\ CODE. ^UP TO NINE INPUT FILES MAY BE SPECIFIED TO BE CONCATENATED INTO ONE LARGE SOURCE PROGRAM. ^THE ".^S^N" EXTENSION IS ASSUMED FOR INPUT FILES TO THE COMPILER. .S 3 .LM 1 ^V.2 ^ERROR ^MESSAGES .LM 4 .S 1 ^IF AND WHEN THE COMPILER DETECTS AN ERROR IN THE INPUT SOURCE FILE, THE ERRONEOUS LINE IS TYPED, AN UPARROW IS TYPED DIRECTLY UNDER THE POINT AT WHICH THE ERROR WAS DETECTED, AND A DESCRIPTIVE MESSAGE IS GIVEN EXPLAINING THE ERROR. .S 3 .LM 1 ^V.3 ^ASSEMBLING THE ^P^A^L FILE .LM 4 .S 1 ^THE ^P^A^L FILE MUST BE ASSEMBLED WITH THE PARAMETER FILE ^^SNORTS.PR\\: .S 1 .LM 8 _.^^R SNOBOL .BR *FILE.PA<FILE.SN .S 1 _.R PAL8 .BR *FILE.BN,<SYS:SNORTS.PR,FILE.PA\\ .SKIP 1 .LM 1 ^ERROR MESSAGES WILL BE PRINTED IF THE PROGRAM IS TOO LONG. .S 3 ^V.4 ^LOADING THE ^BINARY ^FILE .S 1 .LM 4 ^THE BINARY FILE MUST BE LOADED WITH THE RUN TIME SYSTEM ^^SNORTS.BN\\. .S 1 .lm +8;.nf _.^^R ABSLDR *SNORTS.BN,FILE.BN *_^C _. .skip 1 .i -8;If CCL is available, the following commands can be used: .skip 1 _.R SNOBOL *FILE<FILE _.PAL SNORTS.PR-NB,FILE _.LOAD SNORTS,FILE/G .lc;.f .PAGE .LM 1 ^V^I. ^THE ^RUN ^TIME ^SYSTEM .S 2 ^V^I.1 ^FATAL ^ERRORS .LM 4 .S 1 ^CERTAIN FATAL ERRORS OF THE RUN TIME SYSTEM WILL RESULT IN THE OUTPUT OF A MESSAGE OF THE FORM: .S 1 .I 8 _?^^SNORTS\\#N .S 1 WHERE N SPECIFIES WHICH ERROR OCCURRED: .S 1 .I 8 0 - PUSHDOWN LIST OVERFLOW .BR .I 8 1 - PUSHDOWN LIST UNDERFLOW .BR .I 8 2 - INDIRECT NAME NOT FOUND .S 1 ^OTHER N SPECIFY INTERNAL ERRORS OF THE RUN TIME SYSTEM AND INDICATE BUGS IN SAME. ^THESE SHOULD BE REFERRED TO THE APPROPRIATE PERSON(S). .S 1 .I 8 3, 4 - PATTERN MATCHING CALLING LIST ERROR .BR .I 8 5, 6 - PATTERN MATCHING BASE STRING SIZE ERROR .BR .I 8 7 - ERROR DELETING STRING - BAD FORMAT OF VARIABLE .S 3 .LM 1
^V^I.2 ^CONTINUING ^AFTER A ^CONTROL ^C .LM 4 .S 1 ^IT IS POSSIBLE TO CONTINUE A ^^SNOBOL-8.2\\ PROGRAM IF A CONTROL ^C WAS TYPED DURING ITS EXECUTION BY TYPING: .S 1 .I 8 _^^C .S 1 .I 8 _.^^START\\ 154 .S 1 ^ALSO, ^^SNOBOL-8.2\\ PROGRAMS ARE NOT SELF-MODIFYING (UNLESS ^P^A^L CODE INSERTED BY THE USER INVALIDATES THIS) AND THEREFORE MAY BE RE-STARTED ANY NUMBER OF TIMES AT LOCATION 200.
SNOBOL-8.2 USER'S MANUAL ADDENDUM ================================= DATE: AUGUST 29, 1976 SNOBOL VERSION 93 SNORTS VERSION 51 SNOBOL-8.2 is currently available as described by the SNOBOL-8.2 user's manual. This file will outline revisions, restrictions, and bugs that are applicable to SNOBOL-8.2. If any other bugs are discovered, they should be reported to the appropriate person(s), who is currently Fred Dalrymple. KNOWN BUGS ========== 1. If variables exceed the capacity of field one, unpredicted results will occur. SNORTS performs no checking for this condition. 2. A construction similar to: BASE *BASE* = will cause unpredictable results. 3. BASE *STR/N* POSR will not give the desired result that: BASE ** *STR/N* POSR will. (Get the last N characters of BASE into STR)
SNOBOL EDITS ============ (93) fix output file length count, generate error on compile size too large, go to OS/8 when done. (92) Finish fixing PAL mode statements (91) Line termination standard, compiler version number at location zero. (90) Start to fix PAL mode statements (89) Fix internal page organization (88) Fix page size computation, indirect name usage, assignment statement (87) Finish standardizing '/', get paper tape input working (86) Standardize '/' as comment delimiter. Add .PUSH and .POP. arithetic operations. attempt to get papertape input working. SNORTS EDITS ============ (51) Fix indirect name calls (50) Fix pattern matching backup with fixed length fillers, add RESET USR call to INIT. (48,49) Fix internal labeling, POSR bug (47) Fix POSR, XXPVR access - SNORTS.PR modification (46) Fix ASC and INT (45) Fix anchor mode with or at start, version number at location zero. (44) Line termination standard (43) Fix two page writes, pattern matching filler size with write (41,42) Fix WRITE and .OCLOSE problems. (40) Fix PUSH(J), POP(J) operation. (39) Standardize internal calling table. MAke room for and add new .PUSH and .POP constructs. Extend the size of the pushdown table to 32 entries.
.margins 6,65;.uc;.subtitle INTRODUCTION .Title PAL8 SUBROUTINE LIBRARY .bl 3 .c;^&Version 2.2, December 1976\& .bl 5 .p There has been an attempt to produce a library of commonly used PAL8 subroutine sources. The library was not designed to replace the library maintenance facilities of relocatable assembler/loader systems, but rather to be a quick solution to the present common problems facing the PDP-8 programmer. .p The purpose of this document is to briefly describe each routine, including the related programs needed to access the library. Also included is a short description of the working documentation concept which is Closely associated with the library idea. In the first section the SNOBOL program which does the source extraction is described. In the next section each of the subroutines is described with documentation that is taken directly from the source. See the description of the "WORKING DOCUMENTATION GENERATOR" for more information on this process. .p This document is in a "WORKING" form in the sense that it is constantly being updated and improved. For example, in some earlier versions the characters ">" and "<" were used as flag characters; they are unacceptable because they are the characters used for conditional assembly in PAL8. Any constructive comments or suggestions would be appreciated at this time. Also needed are subroutines which you feel should be included, or similar routines in different forms. Please direct any comments or questions to: .b;.nf The Computer Science Research Laboratory Northwestern University Technological Institute Room B626, 2145 Sheridan Road Evanston, Illinois 60201 .f .page
.subtitle The Library Scan Program .p The Library Scan Program is a SNOBOL program to scan the subroutine library for desired modules and write these modules to a file. The program will also generate page zero links to the modules, if desired. .p There are two ways to link the library modules with your own main program. One way is to have the program generate page zero links of the form: .nf;.b 2 TYPE=JMS I .;XTYPE CRLF=JMS I .;XCRLF . . . .f;.j .p;This will allow the programmer to use a pseudo high level language. For example, instead of using the statement JMS XTYPE, he may now use the statement TYPE. Page zero links begin at location 20, and extend to the end of page zero. Following the page zero pointers, space is allocated for any global variables. .p If page zero links are not desired, the programmer must either generate his own links or allow PAL8 to generate the links for him, by calling the modules directly with the "JMS". Both forms of the call are used interchangably in the descriptions of calling sequences. .p To create a file of modules: .b;1. SCAN must run in OS/8, so the fist step is to copy SCAN.SV, the library scanning program, to your OS/8 device. .b 2. Copy the most recent version of the library to your OS/8 device. For SNOBOL 8.2 all files must be on the DSK: device. .tp 10;.b;3. Run the program as follows: .NF;.b 1;.m 9,72 _.R SCAN SUBROUTINE LIBRARY PROCESSING PROGRAM INPUT: [Enter the OS/8 name of the library] OUTPUT: [Enter the filename to contain the modules] ENTER NAMES OF DESIRED ROUTINES, TERMINATE WITH "END" ?TEST ?MSGC ?TYPE ?END [To end] PAGE ZERO LINKS (Y OR N)? Y [Answer appropriately] PASS ONE MODULES: TYPE CRLF MSGC MSG END OF PASS ONE MISSING MODULES ** TEST ** [Not found in pass one] SECONDARY MODULES: MSG CRACK CRLF [Modules not requested, but included because they were needed by other included modules] PASS TWO MODULES: [Modules loaded during second scan of library] TYPE CRLF CRACK _etc. _.
.m 1,65 .b 2 4. Now include your main program in the file you specified as the output file, and assemble and run your program as usual. .b 3 .p While running the program, the following errors can occur: .NF;.b 3 OUTPUT ERROR! .P The program could not output a line to the output file. This could be caused by a disk error or, more likely, a full disk. .B 2 INPUT ERROR! .P An error occured while attempting to read a line from the input file. This is caused by a hardware error. .f;.j .MARGINS 1,72;.NO NUMBER
.page .SUBTITLe Creating and Updating a Library file .p The library file can be created and updated using almost any standard editor. The form of the file was designed so that most routines could be extracted directly from already written programs with only a few modifications. The minumum needed for operation of the SCAN program is a "/+module name" before the module and a "/-module name" after it. If the working documentation generator is to be used, a "/:" must be inserted before the code. If the automatic capialization feature is used, care must be taken in the formatting of the text description between the "/+" and the "/:". Another approach is to edit the RUNOFF input file after it is extracted from the program. .p The subroutine library processor does not handle multiple entry points at this time; it is assumed that the entry point of any subroutine is given by it's name followed by a comma. This means that even if page zero links are going to be used, the subroutine should be written as though it did ^&not\& use them. For example, the subroutine to print return line feed is coded as: .nf THIS: NOT THIS: CRLF, 0 XCRLF, 0 TAD (215 TAD (215 JMS TYPE TYPE TAD (212 TAD (212 JMS TYPE TYPE JMP I CRLF JMP I XCRLF .F;.P The SCAN program will convert the first form into the second if page zero links are indicated. The user should reference other modules by "JMS (tab) module name", and all references to the entry point should be of the form "(space or tab) modulename (space or tab)". .p The key character in the "/$LOCATIONS:n" "/_#ROUTINES#USED:##a,b,c" and "/*GLOBAL#VARIABLES:##x,y,z" is the colon. Everything between the flag character and the colon is ignored. Separators may be spaces, tabs or commas. The number of locations is a decimal number including any possible off page links or current page literals. If the number of locations is not specified in a module, it is assumed that it must be placed on it's own page. Very little error checking is done on these items, so it is important to follow the form correctly.
.NOTITLE;.PAGE .NF;.UC .CW; ^&WORKING DOCUMENTATION GENERATOR\& .TITLE WORKING DOCUMENTATION .SUBTITLE DOCUMENTATION GENERATION PROGRAM \\.AP;.AC;.FLAG CAPITAlIZE ";.NUMBER 1 .TP 8;.B 2;.CW; ^&^^GENERAL INFORMATION\&\\ .FILL;.P THIS PROGRAM CAN BE USED TO GENERATE A WORKING DOCUMENT FROM A SOURCE PROGRAM WHICH FOLLOWS THE RULES FOR COMMENTING OUTLINED BELOW. USUALLY THIS WILL BE A "PAL" SOURCE, ALTHOUGH OTHER LANGUAGES MAY BE ADDED IN THE FUTURE. THIS IS A PROGRAM WRITTEN FOR THE "SNOBOL 8.2" COMPILER TO RUN UNDER "OS/8". THE PROGRAM GENERATES COMMANDS FOR THE PROGRAM "RUNOFF" (FORMERLY CALLED "PRINTR") WHICH ASSUMES ALL INPUT IS IN UPPER CASE. HOWEVER, ANY LOWER CASE COMMENTS WILL BE TRANSMITTED IN LOWER CASE. THE ONLY MAJOR DRAWBACK IS THAT THE PARAGRAPH DESCRIPTIONS FOLLOWING THE /+ FLAG CHARACTER ARE MAPPED INTO UPPER/LOWER CASE IN A NON-INTELLIGENT FASHION. TO SEE EXACTLY HOW THIS IS DONE, CONSULT THE "RUNOFF" MANUAL, KEEPING IN MIND THAT THE MODE USED IS: "FILL", "JUSTIFY", "AUTOPARAGRAPH", "AUTOCAPITALIZE", AND "FLAGCAPITALIZE#_"". THIS ESSENTIALLY MEANS THAT ALL SENTANCES MUST END WITH A PERIOD, PARAGRAPHS MUST BE SEPARATED BY A BLANK "COMMENT" LINE FOLLOWED BY A LINE STARTING WITH TWO SPACES, AND NAMES WHICH SHOULD REMAIN IN CAPS SHOULD BE ENCLOSED IN QUOTES. IF THIS AUTOMATIC CAPITALIZTION FEATURE IS NOT DESIRED, ANSWER THE RUN-TIME QUESTION: ^^AUTO CAPS (Y OR N) ?\\ WITH AN "N". ALL FLAG CHARACTERS MUST BE PRECEEDED BY A slash as the first non-blank character in the line. THE FOLOWING IS A TABLE OF THE PRESENT FLAG CHARACTERS AND A SHORT DESCRIPTION OF THE EFFECT OF EACH: .B 2;.NF;^^^&FLAG NAME EFFECT\& + "PLUS" \\^PARAGRAPH DESCRIPTION - "MINUS" ^SEARCHES FOR NEXT "PLUS" _& "CALLING" "SEQUENCE" ^OUTPUTS COMMENTS AS THEY ARE, WITH NO FILLING, CASE MAPPING, ETC. _# "ROUTINES" "USED" ^DITTO ; "LOGIC" ^DITTO * "GLOBAL" "VARIABLES" ^DITTO = "TABLE" ^DITTO $ "LOCATIONS" ^DITTO @ "VARIABLES" ^PRINTS OUT EVERYTHING UNTIL THE NEXT FLAG CHARACTER. ! "ENTRY" "POINTS" ^TREATS FOLLOWING LINES STARTING WITH "PLUS" AS NAMES OF ENTRY POINTS. _" "TIMING" ^SEPARATE PARAGRAPH IF IN "PLUS" MODE : "CODE" ^MUST BE ONE OF THESE OR ANOTHER FLAG CHARACTER AFTER EVERY "PLUS". IGNORES EVERYTHING UNTIL NEXT "PLUS"
.TP 8;.CW; ^&^^USER INPUT\&\\ .FILL;.P THE PROGRAM FIRST ASKS FOR THE INPUT AND OUTPUT FILES. AFTER GETTING TWO GOOD RESPOSES, THE PROGRAM WILL PRINT: ^^AUTO#CAPS#(Y#OR#N)#?\\ ANSWER THIS QUESTION DEPENDING ON IF IT IS DESIRED FOR "RUNOFF" TO DO THE UPPER/LOWER CASE CONVERSIONS. THE PROGRAM WILL THEN PRINT: "MODULES" "DOCUMENTED:" IT WILL OUTPUT SOME "RUNOFF" COMMANDS TO THE FILE AND USE THE FIRST LINE OF INPUT (IF IT IS A COMMENT) AS THE TITLE OF THE DOCUMENT. THE PROGRAM PASSES DOCUMENTATION THROUGH IN FIVE MAJOR MODES WHICH ARE DESCRIBED BELOW. .TP 8;.B 2;.CW; ^&^^CODE, MINUS, LOOP MODES\&\\ .FILL;.P "CODE" MODE IS OBTAINED AT THE BEGINING OF THE FILE, AND AFTER ANY /- OR /:. IN THIS MODE, NOTHING IS OUTPUT ALTHOUGH EACH LINE IS SCANNED FOR A /+ IN THE FIRST COLUMN. .TP 8;.B 2;.CW; ^&^^PLUS \&\\ .FILL;.P "PLUS" MODE IS ENTERED AFTER SEEING A SLASH PLUS IN COLUMN 1. THE COMMENTS AFTER A SLASH PLUS ARE FIRST SCANNED FOR OTHER FLAG CHARACTERS, AND THEN ARE SIMPLY TRANSMITTED TO THE OUTPUT FILE. HOWEVER, THE "RUNOFF" COMMANDS PLACED BEFORE THE LINES IMPLY THAT ANYTHING ON THE COMMENT LINE IS PART OF A TEXT PARAGRAPH, AND WILL THEREFORE BE FILLED AND JUSTIFIED. .TP 8;.B 2;.CW; ^&^^CALSEQ, ROUTINES, LOGIC, GLOBAL, TABLE, LOCS\&\\ .FILL;.P "TABLE" MODE IS OBTAINED BY ANY OF THE FOLLOWING FLAG CHARACTERS: _" _& _# * = ; $. IN THIS MODE EVERYTHING IS PUT IN UPPER CASE THROUGH "RUNOFF" WITH NO FILLING SO THAT SPACING IS NOT AFFECTED. .TP 8;.B 2;.CW; ^&^^VARIABLES\&\\ .FILL;.P "VARIABLE" MODE IS OBTAINED BY THE /@ FLAG. IN THIS MODE "EVERY" LINE OF INPUT IS SENT TO THE OUTPUT FILE, ALTHOUGH SLASHES ARE REMOVED FROM COMMENTS. IT IS VERY IMPORTANT THAT ANOTHER FLAG CHARACTER IS USED TO GET OUT OF THIS MODE OR THE ENTIRE PROGRAM WILL BE SENT TO THE OUTPUT FILE. .b 1;.tp 5;.CW; ^&^^ENTRYS\&\\ .FILL;.P "ENTRY" MODE IS USED TO PROCESS THE "/!ENTRY" "POINT" FLAG. FOLLOWING LINES STARTING WITH "/+" WILL BE PUT IN CAPS ON THE SAME LINE. THE FIRST LINE NOT STARTING WITH "/+" GOES BACK INTO "PLUS" MODE.
.PAGE .upper case;.nf .subtitle Preliminary Specifications .c; ^&Working Documentation \& .c; ^&Preliminary Specifications\& .b 4;.fill The following is a sample module documented with flag characters. The documentation extraction program assumes that the first line of the "PROGRAM" (not each module), if it is a comment, can be used as a title like the one used for PAL8 listings. At present these specifications apply only for PAL-8 programs, although a subset of the specifications could be used for other possibly higher-level languages. .b 3;.nf /+NAME (Full Name goes here) / / Following the flag that starts the module, / it is assumed that there will be a general / explanitory section of text in paragraph / form here. In fact, in some trivial modules, / this will be all the documentation that will / be included. For the sake of saving extra work / the best practice is to include only those sections / that apply to this module. / / /;LOGIC / This section usually includes a "PASCAL" or ALGOL- / like description of the logic of the module. / /!ENTRY POINTS: (only if multiple entry points) /+ENTRY1 /+ENTRY2 / / /_"TIMING: Optional if timing is not critical / /=TABLE: Used to preceed tables which will / be included in the documentation. / /_#ROUTINES CALLED: NAME1,NAME2 NAME3 NAME4 / use one space or a comma to separate items. / /_&CALLING SEQUENCE: Description of transmission / of prameters, multiple returns, etc. / /*GLOBAL VARIABLES: VAR1,VAR2 VAR3,VAR4 VAR5 / .TP 4 /@LOCAL VARIABLES: LOCAL1, VALUE1 LOCAL2, VALUE2 LOCAL3, VALUE3 / .tp 3 /$LOCATIONS USED: Decimal number / /:CODE: last flag before code - there must be one / of these or a "/-" in each module / at the end of the working documentation. / NAME, ENTRY /Entry point should have same name /Comments in the body of the module /are not extracted. OPCODE OPERAND /Usually separate symbols /with "TABS" for readability. JMS NAME1 /calls to other modules, /if not using page zero links. NAME2 /Calls to other modules if page /zero links are being used. /and NAME2= JMS I [XNAME2 ISZ NAME /References to the entry point /should follow the same pattern. JMP I NAME /Usual method of returning. /-NAME / /The "/-" denotes the end of the module; /anything between the "/-" and the next "/+" is /ignored by the documentation generator. /
.SUBTITLE EXAMPLE OF DOCUMENTATION PRODUCED .PAGE .B 1;.fill;.m 5,65 Below is the documentation produced by the documentation generator program when run on the example module given on the previous page. .b 2 .NF;.UC;.m 1,72 .AP;.AC;.FLAG CAPITAlIZE " .TP 8;.B 2;.CW; ^&^^NAME (Full Name goes here)\& .FILL;.P Following the flag that starts the module, it is assumed that there will be a general explanitory section of text in paragraph form here. In fact, in some trivial modules, this will be all the documentation that will be included. For the sake of saving extra work the best practice is to include only those sections that apply to this module. .B 2;.NF;^^LOGIC This section usually includes a "PASCAL" or ALGOL- like description of the logic of the module. .b;^ENTRY POINTS: (only if multiple entry points) "ENTRY1 "ENTRY2 "TIMING: Optional if timing is not critical TABLE: Used to preceed tables which will be included in the documentation. ROUTINES CALLED: NAME1,NAME2 NAME3 NAME4 use one space or a comma to separate items. CALLING SEQUENCE: Description of transmission of prameters, multiple returns, etc. GLOBAL VARIABLES: VAR1,VAR2 VAR3,VAR4 VAR5 LOCAL VARIABLES: LOCAL1, VALUE1 LOCAL2, VALUE2 LOCAL3, VALUE3 LOCATIONS USED: Decimal number
/NETWORK SUBROUTINE LIBRARY /VERSION 3.1 / / / N N EEEEE TTTTT W W OOOOO RRRR K K / NN N E T W W O O R R K K / N N N E T W W O O R R K K / N NN EEE T W W O O RRRR KK / N N E T W W W O O R R K K / N N E T WW WW O O R R K K / N N EEEEE T W W OOOOO R R K K / / / L III BBBB RRRR AAA RRRR Y Y / L I B B R R A A R R Y Y / L I B B R R A A R R Y Y / L I BBBB RRRR AAAAA RRRR Y / L I B B R R A A R R Y / L I B B R R A A R R Y / LLLLL III BBBB R R A A R R Y / /THE COMPUTER SCIENCE RESEARCH LAB /NORTHWESTERN UNIVERSITY / /AUTHORS AND CONTRIBUTORS: / MIKE KELLY (NUCSRL) / RICHARD BARTLEIN (UWM) / MARVIN SHUGERMAN (NUCSRL) / RICHARD KARHUSE (NUCSRL) / ROGER POLSLEY (NUCSRL) / RONALD SHOULTS (NUCSRL) / WILLIAM NOWCKI (NUCSRL) / /LAST UPDATE: MAY 20, 1977 / /NOTE: SEVERAL ROUTINES ARE STILL NOT WORKING !!! / /USE AT YOUR OWN RISK - REPORT ANY BUGS TO THE N.U.C.S.R.L.
/ /+RDBUF (READ A BUFFER) / /SUBROUTINE TO READ A LINE FROM THE TERMINAL AND BUFFER IT. /RESPONDS TO "CTRL/U" AND RUBOUT. /THE DELETED CHARACTERS ARE ECHOED, FOR CONVENIENCE OF USER. /TYPING A CARRIAGE RETURN ENDS ROUTINE AND SENDS CONTROL BACK /TO THE CALLING MODULE (SEE CALLING SEQUENCE BELOW). /THERE ARE TWO SUPPLEMENTARY ROUTINES WHICH CAN BE USED IN /PROCESSING YOUR BUFFER: FNDNB (FIND THE NEXT NON-BLANK CHAR) /AND KNUM (CREATE OCTAL EQUIVALENT OF DECIMAL NUMBER). / /THE USER NEEDS TO INITIALIZE TWO VARIABLES: / / "IKBUF"---ADDRESS TO START OF BUFFER AREA /FAILURE TO INITIALIZE THIS VARIABLE WILL WIPE OUT PAGE ZERO. / / "KBUFL"---BUFFER LENGTH, A POSITIVE OCTAL VALUE /FAILURE TO INITIALIZE WILL DEFAULT BUFFER LENGTH TO 10000 (OCTAL). /THIS, TOO, WOULD PROBABLY BE CATASTROPHIC FOR THE USER. / /&CALLING SEQUENCE: / RDBUF /RDBUF= JMS I XRDBUF / JMP AGN /LINE DELETE "OR" BUFFER OVERFLOW - RETYPE INTRO / JMP NUL /ONLY <CR> TYPED / ... /NORMAL EXIT, XR1 POINTS TO BEGINNING OF BUFFER, / /i.e. XR1 POINTS TO FIRST NON-BLANK CHAR IN BUFFER. / /COUNT= # OF CHARACTERS READ. / /EXAMPLE: READ, RDBUF /READ STRING FROM TTY / JMP READ /USER KILLED LINE, OR HAS OVERFLOWN / /BUFFER, ALLOW RE-ENTRY / JMP READ /USER ENTERED ONLY <CR>, ALLOW / /ENTRY OF ANOTHER LINE. / ... /PROCESS THE ENTERED LINE / /NORMALLY, BEFORE RETURNING TO ALLOW THE USER TO /ENTER ANOTHER LINE, YOU MIGHT WANT TO DEFAULT SOME MESSAGES /TO LET USER KNOW WHAT HAS HAPPENED, SO THAT MAYBE IT WILL /NOT BE REPEATED. / /*GLOBAL VARIABLES: CHAR COUNT IKBUF KBUFL XPONT /$LOCATIONS USED: 90 / /#ROUTINES USED: MSG CRLF TYPE FNDNB / /:CODE: RDBUF, 0 TAD IKBUF /SET POINTER DCA XPONT /STORE POINTER TAD KBUFL /GET BUFFER LENGTH CIA /MAKE NEGATIVE DCA COUNT /STORE AS COUNTER RDLP, CLA CLL KSF JMP .-1 KRB AND (177 /A DEC STANDARD: FORCE TAD (200 /PARITY BIT ON. DCA CHAR TAD CHAR JMS TYPE /ECHO THE CHARACTER TAD CHAR TAD (-215 SNA /CARRIAGE RETURN? JMP RDEND /YES TAD (-10 SNA /NO:CTRL/U? JMP RDAGN /YES TAD (-152 SNA CLA /NO:RUBOUT? JMP RDRUB /YES TAD CHAR /LOOKS LIKE ORDINARY CHAR TO ME.. DCA I XPONT /STORE IN BUFFER, ISZ XPONT ISZ COUNT /BUMP BUFFER COUNTER, JMP RDLP /AND GET NEXT CHAR /THIS GUY IS TALKATIVE...HE'S OVERFLOWN THE BUFFER. /LET HIM KNOW AND RESTART / CLA JMS CRLF JMS MSG /TYPE COMPLAINT XRDMSG JMS CRLF /AND A CRLF JMP I RDBUF / & ASK AGAIN / /GOT A RUBOUT - BACK UP THE POINTER. RDRUB, TAD COUNT /BACK UP THE COUNTER TAD KBUFL SNA CLA JMP I RDBUF /NOTHING TO RUB OUT CLA CMA TAD COUNT DCA COUNT CLA CMA /BACK UP XR1 NEXT TAD XPONT DCA XPONT TAD I XPONT /ECHO THE RUBBED OUT CHAR TLS JMP RDLP /THEN CONTINUE / /FOUND A CARRIAGE RETURN - SET UP FOR SCAN RDEND, CLA CLL TAD COUNT /TEST FOR ONLY <CR> TYPED SNA JMP RDNUL /TAKE APPROPRIATE RETURN CLA CLL DCA I XPONT /SET END OF BUFFER POINT ISZ COUNT /REGISTER THIS LAST ENTRY JMS CRLF TAD COUNT /GET # OF CHARS ENTERED TAD KBUFL DCA COUNT CLA CLL CMA TAD IKBUF /INIT. BUF POINTER DCA XPONT JMS FNDNB /GET FIRST NON-BLANK JMP RDNUL /ALL SPACES - RETURN ISZ RDBUF /NOW ADJUST THE RETURN RDNUL, ISZ RDBUF / ADDRESS JMP I RDBUF RDAGN, JMS MSG /TYPE "^U" XCTLU JMP I RDBUF /THEN RETURN / /LET'S DEFAULT SOME BUFFERS. / XCTLU, TEXT /^U/ XRDMSG, TEXT /BUFFER OVERFLOWN/ / /THUS, IF USER IS TO TAKE AN ERROR RETURN, SOME "LIKENESS" OF /ERROR MESSAGES WILL BE DEFAULTED FOR THE PROGRAMMER. /THIS WILL ALLOW PROGRAMMING SUCH AS THE ABOVE EXAMPLE, /WHERE THE PROGRAMMER DOES NOT PRINT ANY ERROR MESSAGES, /BUT SIMPLY LOOPS TO READ IN NEXT BUFFER. / / /-RDBUF /
/ /+CONMSG (PRINT A CONDITIONAL MESSAGE) / /THIS ROUTINE WILL MATCH A VALUE IN THE "AC" /AGAINST A TABLE GIVING POSSIBLE VALUES AND /THEIR CORRESPONDING MESSAGE POINTERS. /IF THE VALUE IS NOT FOUND IN THE LIST, /THE MESSAGE POINTED TO BY "WHAT" IS PRINTED. /IT IS UP TO THE USER TO SUPPLY THIS MESSAGE. /IF NOT SUPPLIED, IT IS DEFAULTED TO BE "ERROR". /THIS ROUTINE IS VERY USEFUL FOR ERROR MESSAGE /PRINTOUT, OR OTHER HELPFUL MESSAGES. / /NOTE: NO CARRIAGE RETURN - LINE FEED IS PRINTED. / / /&CALLING SEQUENCE: TAD VALUE TO BE SEARCHED / JMS TEST / TABLE /ADDRESS OF TABLE / ... /RETURNS HERE / /=TABLE, -V1; MSG1 /IF AC=V1, PRINT MSG1 / -V2; MSG2 /IF AC=V2, PRINT MSG2 / ... / ETC. / 0; MSGN /END OF LIST / /USE ".-1" FOR MSGN FOR NO ZERO MESSAGE / /$LOCATIONS USED: 50 /#ROUTINES USED: MSG /:CODE: CONMSG, 0 DCA XCON /STORE VALUE TAD I CONMSG /GET THE LIST ADDRESS DCA PNT /RESET POINTER ISZ CONMSG /FIX RETURN ADDRES TLP, TAD I PNT /LOOP ISZ PNT /FIX POINTER SNA /ZERO MEANS END JMP TWHA /END OF LIST TAD XCON /DOES IT MATCH ? SNA CLA JMP TDONE /YES - GREAT ! ISZ PNT JMP TLP /NO - TRY NEXT ONE / TWHA, CLA TAD XCON /IS IT ZERO ? SNA CLA JMP TDONE /YES-PRINT MESSAGE FOR ZERO / /THE CODE WAS NOT FOUND IN THE TABLE JMS MSG WHAT /PRINT NASTY MESSAGE JMP I CONMSG /RETURN ANYWAY / TDONE, CLA TAD I PNT /DONE - USE AS POINTER DCA TMSG /FOR MESSAGE JMS MSG /PRINT IT ! TMSG, HLT JMP I CONMSG /RETURN ! / /@LOCAL VARIABLES: XCON, 0 PNT, 0 / /THESE STRANGE CONDITIONAL ASEMBLIES ARE NEEDED TO /INSURE THAT THE SYMBOL "WHAT" IS DEFAULTED CORRECTLY. / IFDEF WHAT < IFZERO WHAT-. <WHAT, TEXT "ERROR">> IFNDEF WHAT <WHAT, TEXT "ERROR"> /-CONMSG /
/ /+KNUM (GET A NUMBER) /GETS A DECIMAL NUMBER FROM THE INPUT BUFFER. /ASSUMES THAT "RDBUF" OR SOME SIMILAR ROUTINE /WAS CALLED BEFORE COMING HERE. ALL BUFFER /POINTERS AND COUNTERS MUST BE SETUP IN "RDBUF" FASHION. "XR1" /SHOULD BE A PAGE ZERO POINTER TO THE BEGINNING OF THE /BUFFER, I.E. IT SHOULD POINT TO THE FIRST NUMBER IN THE SEQUENCE. /THE VARIABLE "NUM" IS SET TO THE NUMBER, /AND "CHAR" IS SET TO THE FINAL CHARACTER CHECKED. /IF "CHAR=0" THEN THERE WERE NO ILLEGAL CHARACTERS, I.E. THE /END OF THE BUFFER WAS FOUND FOLLOWING THE NUMBER. / /&CALLING SEQUENCE: JMS KNUM /KNUM CALLED / ... /NUMBER IN AC / /NO ERROR RETURN / /STOPS ON FIRST NON-NUMERIC CHAR / /*GLOBAL VARIABLES: NUM CHAR XPONT /$LOCATIONS USED: 32 /:CODE: KNUM, 0 CLA KN2, DCA NUM /STORE SUM SO FAR TAD I XPONT /GET NEXT DIGIT DCA CHAR TAD CHAR SNA /ZERO? (SIGNALS END OF BUFFER) JMP KRET /YES: THAT'S ALL, FOLKS. TAD (-272 /TEST VALIDITY SMA CLA JMP KRET TAD CHAR TAD (-260 SPA CLA JMP KRET /BAD CHAR ISZ XPONT /IT WAS A NUMBER "REMOVE" IT FROM BUFFER TAD NUM CLL RTL /MPY BY 4 TAD NUM /MAKE IT *5 CLL RAL /DOUBLE TO GET * 10 TAD CHAR /ADD THIS DIGIT TAD (-260 JMP KN2 / KRET, CLA TAD NUM /GET NUMBER IN AC JMP I KNUM /RETURN / / /-KNUM
/ /+KTST (TEST THE KEYBOARD) / /THIS ROUTINE WILL CHECK FOR A POSSIBLE /RESPONSE FROM KEYBOARD. /THE COMMON APPLICATION OF THIS ROUTINE IS /TO PERIODICALLY CHECK FOR INTERRUPT CHARACTERS, /LIKE CONTROL "C". /IF NO CHARACTER HAS BEEN TYPED, THE ROUTINE /EXITS NORMALLY. /IF ANYTHING HAS BEEN TYPED, HOWEVER, THE CHARACTER IS /READ, WHICH CLEARS THE FLAG, AND CHECKED AGAINST THE TABLE. /TABLE FORMAT IS OUTLINED IN DOCUMENTATION OF "TEST" / /&CALLING SEQUENCE: KTST / TABLE /POINTER TO TABLE / ... /RETURNS HERE ON NO RESPONSE / /#ROUTINES USED: TEST /$LOCATIONS USED: 10 /:CODE: KTST, 0 KSF /ANYTHING TYPED ? JMP KTST2 TAD I KTST /GET THE ARG DCA KTSAD KRB /YES - SKIP IT JMS TEST KTSAD, HLT /PLUGGED KTST2, ISZ KTST /FIX RETURN JMP I KTST /FORGET IT ! /-KTST /
/ /+MSGC (PRINT A MESSAGE FOLLOWED BY CR-LF) / /TYPE THE STRING OF SIX BIT /PACKED CHARACTERS POINTED TO BY THE PARAMETER /AND FOLLOW IT WITH A CARRIAGE RETURN/LINE FEED. /USES THE SAME FORMAT FOR MESSAGES AS "MSG" /(THE "PAL8" "TEXT" PSEUDO-OP). / /&CALLING SEQUENCE: MSGC / POINTER TO STRING / RETURNS HERE WITH THE AC CLEARED / /#ROUTINES USED: MSG CRLF /$LOCATIONS USED: 9 /:CODE: MSGC, 0 CLA TAD I MSGC /GET THE FWA OF THE STRING DCA MSGCA /PUT IT WHERE "MSG" CAN GET AT IT JMS MSG /PRINT THE STRING WITHOUT ANY CR/LF MSGCA, HLT JMS CRLF /NOW PRINT THE CRLF ISZ MSGC /BUMP TO GET AROUND THE ARG. JMP I MSGC /-MSGC /
/ /+MSG (PRINT A STRING) / /PRINT A PACKED "ASCII" STRING. /MESSAGES CAN BE PRODUCED USING THE /TEXT PSEUDO-OP OF "PAL8". /MESSAGES CAN BE ANYWHERE IN THE SAME FIELD, /AND MAY EVEN CROSS PAGE BOUNDRIES. /SEE THE DOCUMENTATION OF "CRACK" FOR MORE INFORMATION /ON THE CODING METHOD. / /&CALLING SEQUENCE: MSG / POINTER TO STRING / ... /Return here with AC cleared / / /POINTER, SIX BIT PACKED ASCII CHARACTERS / . . . / 0000 OR XX00 AS END OF LIST / / (Usually produced by doing the following:) /POINTER, TEXT "'THIS IS PRINTED'" / /#ROUTINES USED: CRACK TYPE /$LOCATIONS USED: 11 /:CODE: MSG, 0 CLA CLL TAD I MSG /POINTER DCA MSG3 ISZ MSG /BUMP TO RETURN MSG2, TAD I MSG3 /GET TWO CHARACTERS JMS CRACK /CRACK AND PRINT THE SIX BITS JMP I MSG /RETURN IF END OF MESSAGE ISZ MSG3 /OTHERWISE MOVE TO NEXT PAIR OF CHAR. JMP MSG2 /GO BACK UP AND PRINT THEM /@LOCAL VARIABLES: MSG3, 0 /STRING POINTER /-MSG /
/ /+CLEAR (CLEAR THE SCREEN OF A CRT) / /THIS SUBROUTINE OUTPUTS THE COMMON CHARACTERS /NEEDED TO CLEAR THE SCREENS OF MOST CRT TERMINALS. /CONTROL "L" AND CONTROL "Z" ARE TYPED /WITH A DELAY AFTER THEM TO ALLOW THE SCREEN TO CLEAR /ON SOME TERMINALS. / /&CALLING SEQUENCE: CLEAR /=JMS CLEAR / ... /RETURN HERE,AC CLEARED / /AFTER CLEARING SCREEN. / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 20 /:CODE: CLEAR, 0 CLA TAD ("L-100 /CLEAR THE SCREEN JMS TYPE JMS TYPE /SEND A NULL FOR GOOD MEASURE TAD ("Z-100 /TRY AGAIN JMS TYPE /FOR THE LSI TERMINAL ISZ CLRC JMP .-1 /WASTE SOME TIME TAD ("L-100 /AND AGAIN (FOR THE ANN ARBOR) JMS TYPE JMP I CLEAR /RETURN CLRC, 0 /-CLEAR /
/ /+CRACK (PRINT TWO CHARS) / /CRACK AND PRINT THE TWO SIX BIT CHARACTERS IN THE "AC". /THIS ROUTINE IS USEFUL TO PRINT /PACKED SIX-BIT "ASCII", AS WELL AS PRINTING /SOME TYPES OF FILE NAMES. / /THE METHOD OF CONVERSION IS: /= 0 = DONE (I.E. 0000 OR XX00) / 1 - 37 = ADD 300 / 40 - 77 = ADD 200 / /&CALLING SEQUENCE: / TAD WORD TO CRACK / CRACK / ... /RETURN HERE IF A ZERO WAS FOUND (XX00 OR 0000) / ... /NORMAL RETURN, TWO CHARACTERS PRINTED. / / /IF USER DOES NOT WANT TO DISCRIMINATE BETWEEN FINDING A ZERO /(IE END OF STRING TO BE PRINTED) THE CALL COULD BE SET UP AS /THE FOLLOWING: / TAD WORD TO CRACK / CRACK / NOP /DO NOTHING IF A ZERO IS FOUND / ... /CONTINUE ON YOUR WAY /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 31 /:CODE: CRACK, 0 DCA CRACK4 /TEMP. STORE WORD TO BE CRACKED CLA CMA DCA CRACK5 /SWITCH TAD CRACK4 /GET THE WORD BACK AND (7700 /LEFT CHAR SNA JMP I CRACK /RETURN IF WORD IS 00XX CLL RTR RTR /(COULD BE "BSW" ON A "PDP-8/E" RTR CRACK2, TAD (-40 /FIND BREAKPOINT FOR RESTORATION SPA TAD (100 CRACK3, TAD (240 JMS TYPE /ACUTUALLY PRINT IT OUT ISZ CRACK5 /SKIP IF HAVE RIGHT CHAR TO DO JMP I CRACK /OTHERWISE RETURN TAD CRACK4 /GET BACK WORD AND (77 /GET RIGHT CHAR SNA JMP I CRACK /RETURN IF WORD XX00 ISZ CRACK /INCREMENT POINTER FOR RETURN JMP CRACK2 /GO BACK AND PRINT IT OUT / /@LOCAL VARIABLES: CRACK4, 0 /TEMP STORAGE FOR WORD CRACK5, 0 /SWITCH /-CRACK /
/ /+CRLF (TYPE CARRIGE RETURN/LINE FEED AT TERMINAL) / /ROUTINE TO TYPE /A CARRIAGE RETURN CHARACTER (OCTAL 215), /AND A LINE-FEED CHARACTER (OCTAL 212). / /&CALLING SEQUENCE: CRLF /=JMS CRLF / ... /RETURN HERE, AC CLEARED / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 9 /:CODE: CRLF, 0 CLA CLL TAD (215 JMS TYPE TAD (212 JMS TYPE JMP I CRLF /THEN RETURN /-CRLF /
/ /+O2D (OCTAL TO DECIMAL CONVERSION) / /THIS ROUTINE WILL PRINT THE DECIMAL EQUIVALENT OF /THE "AC". THE ROUTINE ALLOWS THE USER TO PASS A FLAG /INDICATING IF HE WANTS THE CONTENTS OF THE "AC" PRINTED /AS A SIGNED OR UNSIGNED NUMBER. /IF THE FLAG IS GREATER THAN OR EQUAL TO ZERO (CONVENTIONALLY ZERO) /THEN THE VALUE IS PRINTED AS A 12 BIT POSITIVE NUMBER. /IF THE FLAG IS LESS THAN ZERO (CONVENTIONALLY -1) THEN THE VALUE /IS PRINTED AS A 12 BIT SIGNED NUMBER. / /&"EXAMPLE": TAD NUM / O2D / 0 /FLAG FOR UNSIGNED NUM / /IF NUM FOR EXAMPLE =7777 THEN 4095 / /WOULD BE PRINTED. / / "EXAMPLE": TAD NUM / O2D / -1 /FLAG FOR SIGNED NUM / /IF NUM FOR EXAMPLE =7777 THEN -0001 / /WOULD BE PRINTED. / /&CALLING SEQUENCE: / TAD NUM /WHERE NUM IS VALUE TO BE CONVERTED / O2D /CONVERT OCTAL TO DECIMAL. / SIGNNUM /THIS IS A FLAG TO TELL IF YOU / /WANT THE NUMBER TO BE PRINTED / /AS A SIGNED OR UNSIGNED NUMBER. / . . . /RETURNS HERE WITH "AC" CLEARED. / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 50 /:CODE: O2D, 0 DCA OCVAL /STORE VALUE TO BE CONVERTED TAD I O2D /GET CONVERSION "FLAG" ISZ O2D /POINT TO RETURN SMA CLA JMP O2DST /PRINT NUMBER AS IS TAD OCVAL /PRINT NUMBER AS SIGN VALUE SMA JMP O2DST /NUMBER > 0 DO NOTHING CIA DCA OCVAL /CREATE A "POSITIVE VALUE" TAD (255 /PRINT A MINUS SIGN JMS TYPE O2DST, TAD (-4 /SET UP DIGIT COUNTER DCA O2DIG /FOR 4 DIGITS TAD O2DPT /INITIALIZE DIVISOR TO DCA O2DIV /TABLE OF DECIMAL DIVISORS. O2D1, DCA O2DCNT /CLEAR COUNTER O2D1A, CLL TAD I O2DIV /GET COMPLEMENTED DIVISOR TAD OCVAL /ADD IN OCTAL VALUE TO CONVERT SNL /LINK=0 WHEN DIVISION DONE. JMP O2D2 /DONE WITH THIS DIGIT. PRINT IT. DCA OCVAL /LOAD NEW DIVIDEND ISZ O2DCNT /BUMP UP COUNTER JMP O2D1A /AND GO AGAIN. O2D2, CLA CLL TAD O2DCNT /GET QUOTIENT TAD (260 /CONVERT TO ASCII JMS TYPE /TYPE IT ISZ O2DIV /BUMP POINTER TO NEXT DIVISOR ISZ O2DIG /FOUR DIGITS TYPED YET? JMP O2D1 /NO: PROCESS NEXT DIGIT. CLA CLL /YES: CLEAR OUT AC JMP I O2D /AND RETURN /@LOCAL VARIABLES O2DIG, 0 /COUNTER OF DIGITS TYPED. O2DPT, O2DTAB /POINTER INTO DIVISOR TABLE O2DACC, 0 /ACCUMULATOR OF QUOTIENT OCVAL, 0 /OCTAL VALUE TO CONVERT GOES HERE O2DIV, 0 /CURRENT DIVISOR GOES HERE O2DCNT, 0 /TABLE: THE FOLLOWING TABLE CONTAINS THE DIVISORS. DECIMAL O2DTAB, -1000 -100 -10 -1 OCTAL /-O2D /
/ /+QOP (QUICK OCTAL PRINT) / /SUBROUTINE TO TYPE A 4-DIGIT OCTAL NUMBER. /PRINTS THE 4 OCTAL DIGITS HELD IN THE "AC" AT TIME OF CALL /RETURNS WITH CLEARED "AC". / /&CALLING SEQUENCE: / TAD WORD TO PRINT / QOP / ... /RETURN AC = 0 / /#ROUTINES USED: TYPE /$LOCATIONS USED: 25 /:CODE: QOP, 0 CLL RAL DCA QOP1 /SAVE THE NUMBER TAD (-4 /NUMBER OF DIGITS TO TYPE DCA CINDX /SET THE CHAR COUNT QOPLP, TAD QOP1 RTL; RAL /GET THE HIGH 3 BITS DCA QOP1 TAD QOP1 AND (7 TAD (260 /CONVERT IT TO ASCII JMS TYPE / & TYPE IT ISZ CINDX JMP QOPLP /CONTINUE JMP I QOP /ALL DONE - RETURN / /@LOCAL VARIABLES: QOP1, 0 CINDX, 0 /TEMPORARIES / /-QOP / /
/ /+SPACE (PRINT THE NUMBER OF SPACES CARRIED IN THE AC) / /THIS IS A SIMPLE SUBROUTINE TO /PRINT THE NUMBER OF SPACES CARRIED IN THE "AC". /USED FOR FORMATTING OUTPUT, PUTTING TEXT /IN COLUMNS, ETC. / /&CALLING SEQUENCE: / TAD NUMBER SPACES / SPACE / ... /RETURNS WITH AC=0 / /#ROUTINES CALLED: TYPE /$LOCATIONS USED: 10 /:CODE: SPACE, 0 CIA DCA SPACE1 SPATY, TAD (240 JMS TYPE /TYPE THE SPACE ISZ SPACE1 JMP SPATY /SIMPLE LOOP JMP I SPACE / /@LOCAL VARIABLES: SPACE1, 0 /-SPACE /
/ /+TREAD (READ A NON-LEADER/TRAILER CHARACTER FROM THE TELETYPE) / /READ A NONZERO, NONLEADER/TRAILER CHARACTER FROM THE TELETYPE /CALLED BY "JMS TREAD". /UPON RETURN, THE "AC" CONTAINS THE CHARACTER READ. /LOWER CASE IS CONVERTED TO UPPER CASE. / /&CALLING SEQUENCE: TREAD / ... /RETURN HERE AC=CHAR / /#ROUTINES CALLED: TYPE /*GLOBAL VARIABLES: CHAR /$LOCATIONS USED: 48 /:CODE: TREAD, 0 TREAD2, CLA KSF /WAIT FOR CHAR JMP .-1 KRB /CHAR INTO AC AND (177 /DON'T WORRY ABOUT PARITY BIT SNA JMP TREAD2 /IGNORE THE NOTHINGS TAD (-141 SPA /SKIP IF COULD BE A SMALL LETTER JMP TREAD3 TAD (141-173 SPA /SKIP IF NOT A SMALL LETTER TAD (-40 TAD (173-141 TREAD3, TAD (341 /CONVERT TO DEC CAPTIAL LETTER DCA CHAR /STORE IT TAD CHAR TAD (-240 SMA CLA JMP ECHO2 TAD CHAR TAD (-216 /IS CHAR CONTROL N THRU Z? SMA CLA JMP ECHO1 /YES IT IS GO TYPE IT OUT. TAD CHAR TAD (-210 /IS IT CONTROL J THRU M? SMA CLA JMP ECHO2 /YES IT IS ECHO THE PAPER CONTROL. ECHO1, TAD (336 JMS TYPE /TYPE IT TAD (100 ECHO2, TAD CHAR JMS TYPE /TYPE IT TAD CHAR /GET CHARACTER BACK JMP I TREAD /-TREAD /
/ /+FIND (13 BIT COMPARISON OF TEST VALUE AND CONTENTS OF AC) / / /A ROUTINE TO COMPARE TWO 12 BIT NUMBERS, AND TO BRANCH ON SUCCESS. /THERE ARE FOUR POSSIBLE COMPARISONS, "EQ", "LE", "NE" ,AND "GT". / /&CALLING SEQUENCE: TAD VALUE TO COMPARE / FIND / TEST INSTRUCTION (I.E. GT...);TEST NUMBER;SUCCESS ADDRESS; / 0 (A ZERO DENOTES END OF TEST "TABLE") / /THIS CALL PERFORMS: / IF VALUE TO COMPARE MEETS REQUIREMENTS OF TEST INSTRUCTION / WHEN MATCHED AGAINST THE TEST NUMBER THEN BRANCH TO / THE SUCCESS ADDRESS, ELSE MOVE TO NEXT COMPARISON. / / /ANY NUMBER OF SUCH ENTRIES IN THE TABLE MAY FOLLOW CALL. /IF VALUE FAILS ALL COMPARISONS, RETURN TO LOCATION FOLLOWING TEST /TABLE. UPON EXIT, CONTENTS OF AC=0 / /AN EXAMPLE TABLE AND USE OF THIS ROUTINE: / / FIND / EQ;"A;FOUNDA / EQ;203;7600 /FOUND "^C", RETURN TO MONITOR / 0 /END OF TABLE / /$LOCATIONS USED: 19 /:CODE: /TEST DEFINITIONS IFNDEF EQ <EQ=SZA> IFNDEF LE <LE=SNL CLA> IFNDEF GT <GT=SZL CLA> IFNDEF NE <NE=SNA CLA> / FIND, 0 /ENTRY DCA FNDTMP /STORE (TEST VALUE) SKP FNDLOP, ISZ FIND /POINT TO NEXT TEST INSTRUCTION TAD I FIND /GET NEXT INSTRUCTION (GE...) ISZ FIND /POINT TO TEST # SNA /IS THIS END OF TABLE? JMP I FIND /YES, RETURN TO MAIN DCA FNDSKP /NO, STORE TEST INSTRUCTION TAD FNDTMP CLL CMA IAC TAD I FIND /ADD TO AC TEST # ISZ FIND /POINT TO ADDRESS OF DESTINATION FNDSKP, HLT /SKIP IF VALUE OF LINK & AC IS RIGHT JMP FNDLOP /GET NEXT TEST TABLE ENTRY AND CONTINUE TAD I FIND /GET DESTINATION DCA FIND /SET POINTER TO DESTINATION JMP I FIND /RETURN /@LOCAL VARIABLES: FNDTMP, 0 /-FIND /
/ /+FNDNB (NEXT NON-BLANK CHARACTER) / /ROUTINE TO SEARCH A BUFFER POINTED TO BY "XR1" FOR THE NEXT NON-BLANK /CHARACTER. "XR1" IS SET UP AS A PAGE ZERO POINTER AND MUST /BE ASSIGNED A VALUE. /THIS IS CALLED ONLY AFTER THE BUFFER IS FILLED UP, /USUALLY BY "RDBUF". / /&CALLING SEQUENCE: / FNDNB / JMP EOI /END-OF-IMAGE RETURN, AC IS CLEARED / ... /NORMAL - AC = CHAR / /*GLOBAL VARIABLES: CHAR COUNT XPONT /$LOCATIONS USED: 17 /:CODE: FNDNB, 0 FNDNB1, ISZ XPONT /REMOVE BLANK FROM BUFFER FNDNB2, CLA CLL TAD I XPONT /GET NEXT CHAR DCA CHAR TAD CHAR SNA /IS IT END OF BUFFER JMP I FNDNB /YES RETURN TAD (-240 SNA CLA /SPACE? JMP FNDNB1 /YES - CONTINUE SEARCH ISZ FNDNB /FIX RETURN ADDRESS TAD CHAR /GET BACK CHAR JMP I FNDNB / & RETURN W/AC = CHAR / /// /-FNDNB /
/ /+OCTP (GENERAL OCTAL PRINT) / /THIS ROUTINE IS VERY "FORMAT" ORIENTED, AND IF USER /JUST WANTS TO TYPE OUT AN OCTAL VALUE, USER MIGHT WANT /TO CHECK OUT THE QUICK OCTAL ROUTINE. / /&CALLING SEQUENCE: / TAD VALUE /GET THE NUMBER USER WISHES TO OUTPUT / OCTP /=JMS OCTP / N /N=NUMBER OF SPACES TO BE OUTPUT BY ROUTINE / ... /RETURN HERE AFTER PERFORMING REQUESTED FORMAT. / /IF N>0 THEN ROUTINE PRINTS NUMBER AS IS / /IF N<0 THEN ROUTINE PRINTS NUMBER AS A SIGNED / /VALUE / / / "EXAMPLE": IF N<0 THEN 7777 IS PRINTED AS -1 / IF N>4 THEN 7777 IS PRINTED AS 7777 / / /NOTE: IF USER SPECIFIES THAT ONLY ONE SPACE IS TO BE USED /AND ALSO SPECIFIES THAT THE MINUS SIGN MODE IS ON /(REMEMBER, THIS IS DONE BY N<0 ), THEN IF THE NUMBER TO /PRINTED IS LESS THAN ZERO, WE HAVE AN INDEFINITE FORM /(IE SHOULD THE MINUS SIGN BE PRINTED, OR JUST ONE DIGIT). /THE SITUATION IS RECTIFIED BY PRINTING AN I FOR INDEFINITE. / /NOTE: IF ABS(N) IS GREATER THAN 4, THEN ABS(N)-4 BLANKS / ARE PRINTED BEFORE THE NUMBER ITSELF IS PRINTED. / ALSO, ALL LEADING ZEROS ARE CHANGED TO BLANKS. / /$LOCATIONS USED: 95 /#ROUTINES CALLED: TYPE /:CODE: OCTP, 0 DCA OCTP4 DCA OCTP7 /LET'S CLEAR THE MINUS FLAG TAD I OCTP /GO PICK UP THE VALUE OF "N" ISZ OCTP /POINT TO "ERROR" RETURN SNA /DOES USER WANT ANYTHING PRINTED? JMP I OCTP /NO, WHO CALLED LIKE THIS ANYWAY SPA /PRINT VALUE WITH A SIGN, OR ABSOLUTE? JMP .+4 /N<0, SO PRINT IT SIGNED CIA /N>0, SO NEGATE IT FOR COUNTER DCA OCTP5 /STORE COUNTER, AND CONTINUE JMP OCTP1A DCA OCTP5 /STORE COUNTER "N" TAD OCTP4 SMA /IS NUMBER <0 JMP OCTP1A /NO, SO CONTINUE CIA /YES, SO NEGATE IT DCA OCTP4 /STORE ABS(NUMBER) CLA CMA /SEND -1 TO MINUS FLAG DCA OCTP7 ISZ OCTP5 /SAVE A SPACE FOR THE MINUS SIGN JMP OCTP1A /IF ONLY 1 SPACE WAS GIVEN, IT IS GONE TAD (311 /GET VALUE OF AN "I" JMS TYPE /PRINT AN "I" FOR INDEFINITE OPERATION JMP I OCTP /SO RETURN (WHO MADE THAT FORMAT) OCTP1A, CLA /LETS MAKE SURE ALL IS OKAY TAD OCTP5 /GET THE COUNT "N" TAD (4 SNA /IS N=4 JMP OCTP2 /YES, GO PRINT THE NUMBER OUT SPA /IS N<4 JMP OCTPB /NO, GO PRINT SOME BLANKS CIA /ROTATE LOW "N" DIGITS TO HIGH "N" DCA OCTP6 /SET UP COUNTER TO DO THIS TAD OCTP4 /GET THE VALUE TO BE PRINTED OCTP1, RAL; RTL ISZ OCTP6 /ARE WE DONE JMP OCTP1 /NO, CONTINUE DCA OCTP4 /YES STORE THE NEW "VALUE" OCTP2, TAD OCTP4 /SET UP FOR PRINTING RAL /GET FIRST BIT TO LINK DCA OCTP4 DCA OCTP6 /CLEAR ZERO TO BLANK FLAG ISZ OCTP7 /HAS MINUS FLAG BEEN SET JMP OCTP3 /NO, START PRINTING NUMBER TAD (255 /YES, PRINT MINUS SIGN JMS TYPE OCTP3, TAD OCTP4 /ROTATE NEXT DIGIT TO LOW END RAL; RTL DCA OCTP4 /STORE THIS ROTATED VALUE TAD OCTP4 AND (7 /PEEL OFF DIGIT TO BE PRINTED SZA /IS IT A ZERO JMP OCTP3A /NO GO PRINT IT OUT TAD OCTP5 /GET NUMBER SPACES LEFT TO TYPE IAC SNA CLA /IS THERE JUST ONE SPACE LEFT JMP OCTP3A /YES, PRINT OUT A ZERO TAD OCTP6 /ARE WE STILL IN LEADING ZEROS SZA CLA /IF AC = 0 THEN YES TAD (20 /NO TYPE OUT A ZERO TAD (240 /TYPE A BLANK JMS TYPE ISZ OCTP5 /INCREMENT NO. OF SPACES TYPED JMP OCTP3 /LOOP BACK TO GET NEXT DIGIT OCTP3A, TAD (260 /CONVERT DIGIT TO ASCII JMS TYPE /PRINT IT OUT ISZ OCTP6 /SET LEADING ZERO FILL FLAG ISZ OCTP5 /ARE WE DONE? JMP OCTP3 /NOPE! LOOP BACK AGAIN JMP I OCTP /RETURN OCTPB, DCA OCTP6 /STORE NO. OF BLANKS TO BE PRINTED TAD (240 /PRINT OUT A BLANK JMS TYPE ISZ OCTP6 /ARE WE DONE? JMP .-3 /NO GO PRINT ANOTHER BLANK TAD (-4 /SET UP COUNTER FOR NO. OF DIGITS DCA OCTP5 /STORE IT JMP OCTP2 /GO PRINT OUT DIGITS /@LOCAL VARIABLES: OCTP4, 0 /VAL TO BE PRINTED OUT OCTP5, 0 /PARAMETER "N" OCTP6, 0 /ASSORTED LOOP COUNTERS OCTP7, 0 /MINUS SIGN FLAG /-OCTP /
/ /+RCHAR (READ A CHAR FROM THE KEYBOARD) / /WAITS FOR USER TO STRIKE A KEY ON THE KEYBOARD, /THEN RETURNS THE "ASCII" CODE IN THE ACCUMULATOR. / /&CALLING SEQUENCE: JMS RCHAR / ... /RETURN HERE, AC=CHAR READ / /$LOCATIONS USED: 6 /:CODE: RCHAR, 0 CLA / IGNORE GARBAGE KSF JMP .-1 KRB JMP I RCHAR /-RCHAR /
/ /+TEST (TRANSFER TO ADDRESS BY CHARACTER) / /GIVEN AN ADDRESS OF A TABLE, /CHECKS IF THE CONTENTS OF "AC" IS /IN THE TABLE, AND IF SO, TRANSFERS /TO THE CORRECT ADDRESS. /THIS ROUTINE IS MOST USEFUL TO SIMULATE /A TYPE OF THE "CASE" STATEMENT. / /&CALLING SEQUENCE: / TAD CHAR /GET TEST CHARACTER IN AC / TEST /TEST IT ! / TBLAD /ADDRESS OF TABLE / ... /CHARACTER NOT IN TABLE / /AC CLEARED UPON ANY RETURN / /=TBLAD, -CHAR1; ADDR1 / -CHAR2; ADDR2 / ...; ... / 0 /END OF LIST (ZERO) / /$LOCATIONS USED: 19 /:CODE: TEST, 0 DCA OPCHR /SAVE THE CHARACTER TAD I TEST /GET THE TABLE ADDRESS DCA XROP4 /STORE TABLE ADDRESS ISZ TEST /FIX RETURN ADDRESS SKP OPLP, ISZ XROP4 /TEST FAILED POINT TO NEXT CHAR TAD I XROP4 ISZ XROP4 SNA /END OF LIST ? JMP I TEST /END OF LIST-BAD TAD OPCHR SZA CLA JMP OPLP /GO GET NEXT TEST CHAR TAD I XROP4 /GET RETURN ADDRESS DCA TEST /STORE IT JMP I TEST /RETURN / /@LOCAL VARIABLES: XROP4, 0 OPCHR, 0 /SEARCH CHARACTER /-TEST / / /
/ /+TYPE (TYPE ONE CHARACTER ON THE TTY) / /PRINT THE CONTENTS OF "AC" ON THE TELETYPE. /CLEAR THE ACCUMULATOR BUT LEAVE THE LINK ALONE. /THE LINK MAY BE USED BY PROGRAMS LIKE THE SIMPLE /OCTAL PRINTING ROUTINE. /THIS ROUTINE DOES THE "TLS" FIRST, AND WAITS ON /THE FLAG, WHICH MAY BE SLIGHTLY SLOWER THAN THE METHOD /OF USING ONE "TLS" AT THE BEGINING OF THE PROGRAM, /AND THEN WAITING FOR THE PREVIOUS CHARACTER TO PRINT. /TO BE SURE THAT THE FIRST CHARACTER IS NOT LOST, /THE SEQUENCE "CMA;TYPE" COULD BE INSERTED AT THE BEGINING /OF A PROGRAM TO INITIALIZE THINGS. / /&CALLING SEQUENCE: TAD CHAR /LOAD AC WITH CHAR TO PRINT / JMS TYPE /PRINT IT. / . . . . /RETURN HERE WITH AC CLEAR / /$LOCATIONS USED: 6 /:CODE: TYPE, 0 TLS /PUNCH IT TYLP, TSF /WAIT FOR IT TO PUNCH JMP TYLP /WE'RE IN NO HURRY CLA JMP I TYPE /-TYPE /
/SNOBOL LISTING PROGRAM / / WRITTEN BY WILLIAM NOWICKI / NORTHWESTERN UNIVERSITY / COMPUTER SCIENCE RESEARCH LABORATORY / / DECEMBER, 1976 / / /+ASK /THE USER IS FIRST ASKED FOR AN INPUT FILE /(ASSUMED TO BE ON "DSK:"). /THIS SOULD BE A "PAL8" LISTING FILE. /IF THE "SNOBOL 8.2" HEADING PUT OUT BY THE COMPILER /IS FOUND, THE TITLE WHICH WILL BE PUT ON THE LISTING /IS PRINTED. THE OUTPUT FILENAME IS THEN REQUESTED. /IT MAY TAKE A LONG TIME TO PROCESS A LARGE "SNOBOL" /PROGRAM - PLEASE BE PATIENT. / / /:CODE: PG = "1" LN = "0" TP = "0" /TOTAL PAGES FLD = "0" LP = "54" T = .A211 CRLF = .A215 .A212 PN = "0" ASK, OUTHOLD = "INPUT (PAL8 LISTING):" .LOOKUP INPUT :F(ASK) LP1, LINE = READ :F(EOF) LINE "/SNOBOL" :F(LP1) LINE "/" *TITLE/50* OUTPUT = "" OUTPUT = "TITLE: " TITLE OUTPUT = "" LINE = READ READ TITLE = .A214 CRLF T T TITLE T "PAGE " / ASKO, OUTHOLD = "OUTPUT (SNOBOL LISTING):" .ENTER INPUT :F(ASKO) / / /-ASK LAST = "00177" / / LOOP, LINE = READ :F(EOF) /READ INPUT LINE LINE_ "/SNOBOL" :F(NOPG) LINE = READ :F(EOF) /SKIP A LINE TP = TP +1 /INCREMENT TOTAL NUMBER OF PAGES / NOPG, /IT ISN'T A PAGE HEADING LINE *LOC/5* :F(NOLOC) LINE LOC = /DELETE THE LOCATION LOC " "!.A211 :S(NOLOC) LAST = LOC /SAVE LOCATION COUNTER NOLOC, /WE HAVE LOC. OF PREVIOUS LINE LINE_ ** "/" = :F(LOOP) /GET A SNOBOL SOURCE LINE LN = LN + 1 LP = LP + 1 LP "55" = :F(JUSTP) /CHECK FOR PAGINATION TIME PN = PN + 1 OUTPUT = "PAGE " PN WRITE = TITLE PN /PUT OUT THE TITLE WRITE = "" JUSTP, LOC = LAST LINE_ "/" :F(ULOC) /CHECK FOR COMMENTS LOC = " " ULOC, WRITE = LN T " " LOC " " LINE :(LOOP) / /+EOF / THIS MODULE CLOSES THE INPUT AND OUTPUT FILES /AND TELLS THE USER THE BAD NEWS IF ANY ERROR OCCURED. /:CODE: EOF, OUTPUT = CRLF OUTPUT = "TOTAL PAGES IN THE PAL8 LISTING: " TP .OCLOSE :F(CERROR) .ICLOSE .EXIT CERROR, OUTPUT = "CLOSING ERROR !" .EXIT IOBAD, OUTPUT = "OUTPUT ERROR !" .END /-EOF
/LIBRARY SCAN PROGRAM / /WRITTEN BY WILLIAM I. NOWICKI /NORTHWESTERN UNIVERSITY COMPUTER SCIENCE / RESEARCH LABORATORY / /JUNE, 1976 / /UPDATED: DECMEBER 2, 1976 / /+SCAN / THIS PROGRAM WILL PROCESS A SUBROUTINE /LIBRARY FILE AND SELECT THE DESIRED ROUTINES. /ANOTHER OPTION IS TO GENERATE PAGE ZERO LINKS /AND GLOBAL VARIABLE LISTS SUITABLE FOR INPUT /DIRECTLY INTO THE "PAL8" ASSEMBLER. /THE SUBROUTINE LIBRARY FILES WILL USUALLY COMMON /FILES SUPPLIED WITH THE PROGRAM. /HOWEVER, IF THE USER WISHES, A LIBRARY FILE /CAN BE CREATED BY FOLLOWING THE SPECIFICATIONS /FOR WORKING DOCUMENTATION. / /;LOGIC: / SETUP FILES / GET OPTIONS / PASS1 (OUTPUT PAGE ZERO) / PASS2 (OUTPUT THE ROUTINES) / END THE FILE / /: OUTPUT = "SUBROUTINE LIBRARY PROCESSING PROGRAM" ASK, OUTHOLD = "INPUT:" INFIL = INPUT :F(ASK) .LOOKUP INFIL :F(ASK) ASKO, OUTHOLD = "OUTPUT:" .ENTER INPUT :F(ASKO) /SET SOME CONSTANTS: CRLF = .A215 .A212 SP = " " /SPACE C = "," /COMMA S = "/" /COMMENT CHARACTER / /"EDIT" PUTS A RUBOUT AFTER EVERY TAB FOR SOME /OBSCURE REASON, SO THE DEFINITION /MAY HAVE TO CHANGE IF YOU ARE USING AN OlD /EDITER. / T = .A211 AT = "@" / "AT" SIGN FF = .A214 /FORM FEED FP = "+" /START MODULE FM = "-" /END MODULE FU = "$" /LOCATIONS USED FR = "#" /ROUTINES CALLED FG = "*" /GLOBAL VARIABLES FC = ":" /COODE
/ASK WHAT THE USER REALY WANTS / ASKM, DESIRE = SP /INITIALIZE OUTPUT = "ENTER NAMES OF DESIRED ROUTINES," OUTPUT = 'TERMINATE WITH "END"' AMLP, /LOOP UNTIL END IS REACHED OUTHOLD = "?" /PROMPT DESIRE = DESIRE INPUT SP :F(ASKM) DESIRE SP "END" = :S(AMDON) /END YET ? :(AMLP) AMDON, /DONE WITH LOOP / / / THE USER IS ASKED IF HE WANTS PAGE ZERO LINKS /TO EVERYTHING. ASKPZ, OUTHOLD = "PAGE ZERO LINKS (Y OR N) ?" PZFLG = INPUT :F(ASKPZ) PZFLG_ "Y"!"N" :F(ASKPZ) / /+PASS1 / /;LOGIC: / / / WHILE NO EOF(INPUT) DO / BEGIN / READ A LINE / IF BEGINING OF MODULE THEN / BEGIN / GET MODULE NAME / IF DESIRED THEN / BEGIN / IF PAGE ZERO LINKS THEN MAKE ONE / WHILE NO "/-" OR "/:" DO / READ LINE; CASE OF / GLOBAL:ADD TO LIST / LOCATIONS:ADD AFTER MODULE NAME / ROUTINES:ADD TO LIST / ENTRY POINT:GENERATE PAGE ZERO LINK / END / END / END /
/:CODE: PASS1, GLOBE = SP /RESET SOME LISTS HAVE = SP OTHER = SP NEED = DESIRE OUTPUT = "PASS ONE MODULES:" PZFLG_ "Y" :F(NOPZ1) /DO WE WANT PAGE ZERO STUFF ? WRITE = "/ PAGE ZERO POINTERS" CRLF "/" WRITE = T "*20" CRLF "/" NOPZ1, /END OF INITIALIZATION / /READ EACH LINE, LOOKING FOR THE START OF A MODULE / PAS1RD, LINE = READ :F(EOF1) LINE_ S FP = :F(PAS1RD) /MODULE ? SPZAPL, LINE_ SP!T = :S(SPZAPL) /ZAP SPACES,FFS, & TABS LINE_ *MOD* SP!T = :S(GOOD1M) /GET MODULE NAME MOD = LINE /IF NO DESCRIPTION GOOD1M, NEED SP MOD SP = SP :F(PAS1RD) /NEED IT ? HAVE = HAVE MOD SP /YES - ADD TO LIST OUTPUT = MOD /PRINT MODULE NAME PZFLG_ "Y" :F(NOPZ1A) /PAGE ZERO LINK ? WRITEH = MOD "=" T "JMS I .;X" ROT = MOD ROT *ROT/5* /TRIM TO 5 CHARS WRITE = ROT T "/ " LINE NOPZ1A, / P1MOD, LINE = READ :F(EOF1) /READ THE MODULE LINE_ S = :F(P1MOD) /WE ONLY WANT COMMENTS LINE_ FC :S(PAS1RD) /CODE ? LINE_ FU :S(LOC1) /LOCATION FLAG ? LINE = LINE SP /PUT A DELIMITER AT THE END OF THE LINE LINE_ FR :S(ROT1) /ROUTINES USED ? LINE_ FG :S(GLOB1) /GLOBAL VARIABLES ? LINE_ FM :S(PAS1RD) /END OF MODULE ? :(P1MOD) /KEEP READING / /LOCATIONS USED FLAG WAS DETECTED LOC1, LINE ":" *LOC* :F(P1MOD) /STRIP OFF NUMBER SPZAPC, LOC SP!T = :S(SPZAPC) /ZAP ALL SPACES HAVE SP MOD SP = SP MOD AT LOC SP /ADD TO LIST :(P1MOD) /CONTINUE / /ROUTINES USED FLAG WAS FOUND ROT1, LINE ":" *LINE* :F(P1MOD) /NAMES ARE AFTER THE COLON SPZAPR, LINE C!T!" " = SP :S(SPZAPR) /ZAP ALL DELIMITERS INTO SPACES LINE_ SP = ROT1G, LINE_ *ROT* SP = :F(P1MOD) /GET ONE OF THEM NEED SP ROT SP :S(ROT1G) /HAVE IT ALREADY ? HAVE SP ROT SP!AT :S(ROT1G) /PASSED IT UP ? NEED = NEED ROT SP /NO - ADD TO LIST OTHER SP ROT SP :S(ROT1G) /DON'T DUPLICATE OTHER = OTHER ROT SP :(ROT1G) /TRY AGAIN
/ /GLOBAL VRIABLES FLAG HERE GLOB1, LINE ":" *LINE* :F(P1MOD) SPZAPG, LINE T!C!" " = SP :S(SPZAPG) /ZAP SPACES AGAIN LINE_ SP = /ZAP LEADING SPACES GLO1G, LINE_ *VAR* SP = :F(P1MOD) GLOBE SP VAR SP :S(GLO1G) /HAVE IT ALREADY ? GLOBE = GLOBE VAR SP /NO - ADD TO THE LIST :(GLO1G) /CONTINUE / / /END OF PASS ONE EOF1, OUTPUT = "END OF PASS ONE" SP NEED :S(P1BAD) /ANY LEFT OVER ? OUTPUT = "MISSING MODULES:" OUTPUT = "**" NEED "**" P1BAD, OUTPUT = "SECONDARY MODULES:" OTHER WRITE = "/END OF POINTERS" CRLF S CRLF S SP GLOBE :S(EOGLP) /ANY GLOBALS ? OUTPUT = "GLOBAL VARIABLES:" GLOBE WRITE = S CRLF "/GLOBAL VARIABLES" CRLF T "ZERO=0" GLBLP, GLOBE_ SP *VAR* SP = SP :F(EOGLP) WRITE = VAR C T "ZERO" :(GLBLP) /CONTINUE EOGLP, WRITE = S CRLF "/END OF PAGE ZERO" CRLF / /-PASS1
/+PASS2 / HERE THE MODULES ARE ACTUALLY PUT OUT TO THE FILE / /;LOGIC: / WHILE NO EOF DO / BEGIN READ A LINE / IF BEGINING OF DESIRED MODULE THEN / BEGIN / PAGINATE IF NEEDED / WHILE NO "/-MODULE" DO / BEGIN / READ A LINE / CASE OF / ENTRY POINT ADD "X" FOR PAGE ZERO / REFERENCE TO ENTRY POINT: CHANGE AS ABOVE / WRITE LINE / END / WRITE THE LAST LINE / END / / END / /:CODE: .ICLOSE :F(CERROR) /CLOSE FOR PASS 2 .LOOKUP INFIL :F(IOBAD) NOW = "128" /INITIALIZE FOR PASS TWO NEED SP = HAVE OUTPUT = "PASS TWO MODULES:" PAS2RD, LINE = READ :F(EOF) LINE_ S FP = :F(PAS2RD) /MODULE YET ? LINE_ *MOD* SP!T :S(GOOD2M) /GET MODULE NAME MOD = LINE /IF NO DESCRIPTION GOOD2M, NEED SP MOD AT *LOC* SP /WANT IT ? :F(PZNOL) NOW = NOW + LOC :F(NEWPAG) / / THERE ARE REALLY MORE THAN 4 PAL LOCATIONS, / BUT SINCE PAGES ARE NEVER TIGHT, THIS GIVES US / SOME FREE LOCATIONS ON THIS PAGE. / .PAL 4 /***** PAL CODE ******* JMS I XASC /CONVERT TO NUMBER NOW TAD (-200 /PAGE CONSTANT SMA CLA JMP NEWPAG JMP PAGOK /GREAT- KEEP ON PRESENT PAGE ^.SNOBOL /****** BACK TO SNOBOL ******* /
PZNOL, NEED SP MOD SP :F(PAS2RD) /CHECK WITHOUT LOCS LOC = "128" /TO ALWAYS PAGINATE NEWPAG, WRITE = T "PAGE" CRLF FF /PAGINATE NOW = LOC /RESET LOCATIONS PAGOK, OUTPUT = MOD /PRINT THE MODULE NAME ROT = MOD /IN CASE WE NEVER SEE THE ENTRY POINT LINE = S CRLF S FP LINE /RESTORE LINE / P2WRT, WRITE = LINE :F(IOBAD) /OUTPUT THE LINE P2MOD, LINE = READ :F(EOF) /READ THE NEXT ONE LINE_ S :S(COM) /PASS ALL COMMENTS LINE_ MOD C :S(ENTZ) /ENTRY POINT FOUND LINE T MOD T!POSR = T ROT T /CHANGE ENTRY POINT REFERENCES LINE SP MOD T!POSR = SP ROT T LINE "JMS" T!SP *VAR* T!SP!POSR :S(P2CVT) /CHECK JMS'ES :(P2WRT) / COM, LINE_ S FM :S(EOMOD) /END OF MODULE ! :(P2WRT) / /HERE, IF GENERATING PAGE ZERO POINTERS, /WE CHANGE THE NAME OF A SUBROUTINE /CALLED BY A "JMS" IN THE PRESENT MODULE. / P2CVT, PZFLG_ "Y" :F(P2WRT) /MUST WE CHECK FOR OTHER MODULES ? HAVE SP VAR SP!AT :F(P2WRT) /CHECK FOR THE MOD NAME LINE "JMS" T!SP VAR = VAR T /CHANGE REFERENCES TO OTHER MODS :(P2WRT) / / ENTZ, PZFLG_ "Y" :F(P2WRT) /NEED WE CHANGE ENTRY POINT ? ROT = "X" MOD / YES - ADD X TO NAME ROT *ROT/6* /TRIM IF NEEDED LINE MOD = ROT :(P2WRT) / /END OF MODULE FOUND / EOMOD, WRITE = LINE :(PAS2RD) /CONTINUE SEARCH / / EOF, WRITE = "$" CRLF FF /WRITE THE ENDING JUNK .OCLOSE :F(CERROR) .ICLOSE .EXIT CERROR, OUTPUT = "CLOSING ERROR !" .EXIT IOBAD, OUTPUT = "OUTPUT ERROR !" .END /-SCAN
/WORKING DOCUMENTATION GENERATOR / / WRITTEN BY BILL NOWICKI / NORTHWESTERN UNIVERSITY / COMPUTER SCIENCE RESEARCH LABORATORY / MAY, 1976 / UPDATED: DECMEBER 1, 1976 / /+GENERAL INFORMATION / / THIS PROGRAM CAN BE USED TO GENERATE A WORKING DOCUMENT /FROM A SOURCE PROGRAM WHICH FOLLOWS THE RULES FOR COMMENTING /OUTLINED BELOW. USUALLY THIS WILL BE A "PAL" SOURCE, ALTHOUGH /OTHER LANGUAGES MAY BE ADDED IN THE FUTURE. /THIS IS A "SNOBOL" PROGRAM WRITTEN FOR THE "SNOBOL 8.2" COMPILER /TO RUN UNDER "OS/8". / / THE PROGRAM GENERATES COMMANDS FOR THE PROGRAM "RUNOFF" /(FORMERLY CALLED "PRINTR") /WHICH ASSUMES ALL INPUT IS IN UPPER CASE. HOWEVER, ANY LOWER CASE /COMMENTS WILL BE TRANSMITTED IN LOWER CASE. /THE ONLY MAJOR DRAWBACK IS THAT THE PARAGRAPH DESCRIPTIONS /FOLLOWING THE /+ FLAG CHARACTER ARE MAPPED INTO /UPPER/LOWER CASE IN A NON-INTELLIGENT FASHION. /TO SEE EXACTLY HOW THIS IS DONE, CONSULT THE "RUNOFF" MANUAL, /KEEPING IN MIND THAT THE MODE USED IS: "FILL", "JUSTIFY", /"AUTOPARAGRAPH", "AUTOCAPITALIZE", AND "FLAGCAPITALIZE#_"". /THIS ESSENTIALLY MEANS THAT ALL SENTANCES MUST END WITH A PERIOD, /PARAGRAPHS MUST BE SEPARATED BY A BLANK "COMMENT" LINE /FOLLOWED BY A LINE STARTING WITH TWO SPACES, AND NAMES /WHICH SHOULD REMAIN IN CAPS SHOULD BE ENCLOSED IN QUOTES. /IF THIS AUTOMATIC CAPITALIZTION FEATURE IS NOT DESIRED, /ANSWER THE RUN-TIME QUESTION: ^^AUTO CAPS (Y OR N) ?\\ /WITH AN "N". / / ALL FLAG CHARACTERS MUST BE PRECEEDED BY A /SLASH AS THE FIRST NON-BLANK CHARACTER IN THE LINE. /THE FOLOWING IS A TABLE OF THE PRESENT FLAG CHARACTERS /AND A SHORT DESCRIPTION OF THE EFFECT OF EACH: / /=FLAG NAME EFFECT / + "PLUS" ^PARAGRAPH DESCRIPTION / - "MINUS" ^SEARCHES FOR NEXT "PLUS" / & "CALLING" "SEQUENCE" ^OUTPUTS COMMENTS AS THEY ARE, / WITH NO FILLING, CASE MAPPING, ETC. / # "ROUTINES" "USED" ^DITTO / ; "LOGIC" ^DITTO / * "GLOBAL" "VARIABLES" ^DITTO / = "TABLE" ^DITTO / $ "LOCATIONS" ^DITTO / @ "VARIABLES" ^PRINTS OUT EVERYTHING UNTIL THE NEXT / FLAG CHARACTER. / ! "ENTRY" "POINTS" ^TREATS FOLLOWING LINES STARTING WITH / "PLUS" AS NAMES OF ENTRY POINTS. / " "TIMING" ^SEPARATE PARAGRAPH IF IN "PLUS" MODE / : "CODE" ^MUST BE ONE OF THESE OR ANOTHER FLAG / CHARACTER AFTER EVERY "PLUS". / /-GENERAL INFORMATION
/+STRING CONSTANTS / / THE USER CAN CHANGE THE FLAG CHARACTERS FOR USE WITH /SOME OTHER LANGUAGE IF DESIRED. /THE FOLLOWING ARE THE PRESENT SETTINGS: /@ T = .A211 /TAB (ASCII 211) MAY WANT TO DEFINE AS /THE SEQUENCE .A377 .A211 SP = " " /SPACE S = "/" /COMMENT CHARACTER FP = "+" /START OF MODULE FS = "&" /CALLING SEQUENCE FS2 = "<" /OLD FORM FOR CALLING SEQUENCE FR = "#" /ROUTINES CALLED FR2 = ">" /OLD FORM FOR ROUTINES USED FL = ";" /LOGIC FC = ":" /CODE FM = "-" /MINUS (END OF MODULE) FG = "*" /GLOBAL VARIABLES FV = "@" /LOCAL VARIABLES FE = "!" /ENTRY POINTS FT = "=" /TABULAR DATA FD = "$" /LOCATIONS USED /-STRING CONSTANTS / / /+USER INPUT / THE PROGRAM FIRST ASKS FOR THE INPUT AND /OUTPUT FILES. AFTER GETTING /TWO GOOD RESPOSES, THE PROGRAM WILL PRINT: / ^^AUTO CAPS (Y OR N) ?\\ / ANSWER THIS QUESTION DEPENDING ON IF IT IS DESIRED /FOR "RUNOFF" TO DO THE UPPER/LOWER CASE CONVERSIONS. /THE PROGRAM WILL THEN PRINT: / "MODULES" "DOCUMENTED:" / / IT WILL OUTPUT SOME "RUNOFF" COMMANDS TO THE FILE /AND USE THE FIRST LINE OF INPUT (IF IT IS A COMMENT) AS /THE TITLE OF THE DOCUMENT. /THE PROGRAM PASSES DOCUMENTATION THROUGH IN FIVE MAJOR /MODES WHICH ARE DESCRIBED BELOW. / /:CODE: ASK, OUTHOLD = "INPUT:" .LOOKUP INPUT :F(ASK) ASKO, OUTHOLD = "OUTPUT:" .ENTER INPUT :F(ASKO) ASKOP, OUTHOLD = "AUTO CAPS (Y OR N) ?"
/ AUTO = INPUT AUTO_ "Y"!"N" :F(ASKOP) /CHECK FOR VALID RESPONSE AUTO_ "Y" ** = "\\" /SETUP FOR FLAG AUTO_ "N" **= /FORGET ABOUT OTHER GARBAGE / / WE HAVE GOOD FILES, SET UP SOME STUFF / OUTPUT = "MODULES DOCUMENTED:" WRITE = ".NF;.UC" LINE = READ /READ THE TITLE LINE LINE ** "/" = :F(SETUP) /IGNORE IF NON-COMMENT WRITE = ".CW; ^&" LINE "\&" /OUTPUT THE UNDERLINED TITLE WRITE = ".TITLE " LINE SETUP, WRITE = AUTO '.AP;.AC;.FLAG CAPITAlIZE ";.NUMBER 1' / /-USER INPUT / / /+CODE, MINUS, LOOP MODES / / "CODE" MODE IS OBTAINED AT THE BEGINING OF THE FILE, /AND AFTER ANY /- OR /:. IN THIS MODE, NOTHING IS OUTPUT /ALTHOUGH EACH LINE IS SCANNED FOR A /+ IN THE FIRST COLUMN. / /:CODE: CODE, MINUS, LOOP, LINE = READ :F(EOF) LINE_ S FP = :F(LOOP) /IGNORE EVERYTHING TILL /+ /-CODE, MINUS, LOOP /
/+PLUS / "PLUS" MODE IS ENTERED AFTER SEEING A SLASH PLUS /IN COLUMN 1. THE COMMENTS AFTER A SLASH PLUS /ARE FIRST SCANNED FOR OTHER FLAG CHARACTERS, /AND THEN ARE SIMPLY TRANSMITTED TO THE OUTPUT /FILE. HOWEVER, THE "RUNOFF" COMMANDS PLACED BEFORE /THE LINES IMPLY THAT ANYTHING ON THE COMMENT LINE IS /PART OF A TEXT PARAGRAPH, AND WILL THEREFORE BE /FILLED AND JUSTIFIED. /:CODE PLUS, OUTPUT = LINE /THE FOLOWING MESS OUTPUTS /SOME NEEDED RUNOFF COMMANDS WRITE = ".TP 8;.B 2;.CW; ^&^^" LINE "\&" AUTO WRITE = ".FILL;.P" /START THE PARAGRAPH CAPSYM = ".B 2;.NF;^^" /RESET THE CAPITALIZE SYMBOL COMSYM = S /RESET THE COMMENT SYMBOL TABSYM = T /TAB CHARACTER SPSYM = " " /SET THE SPACE CHARACTER PLOOP, LINE = READ :F(EOF) SEARCH, LINE_ T COMSYM = COMSYM T /ZAP LEADING TABS LINE_ S = :F(PASTST) /IS IT A GOOD COMMENT ? LINE_ FS = :S(CALSEQ) /& MEANS CALLING SEQUENCE LINE_ FS2= :S(CALSEQ) /OLD FORM OF CALLING SEQUENCE LINE_ FR = :S(ROUTIN) /# ROUTINES CALLED LINE_ FR2= :S(ROUTIN) /OLD FORM FOR ROUTINES USED LINE_ FL = :S(LOGIC) /; LOGIC LINE_ FC = :S(CODE) /: CODE LINE_ FM = :S(MINUS) /- END OF MODULE LINE_ FG = :S(GLOBAL) /* GLOBAL VARIABLES LINE_ FV = :S(VARIABL) /@ VARIABLES LINE_ FE = :S(ENTRYS) /! ENTRY POINTS LINE_ FT = :S(TABLE) /= TABLE LINE_ FD = :S(LOCS) /$ LOCATIONS LINE_ FP = :S(PLUS) /COULD HAVE NESTED /+'S :(TABZAP) PASTST, LINE "/" = :S(TABZAP) /WE WANT ALL COMMENTS ""_ COMSYM :F(PLOOP) /SHOULD WE PASS NON-COMMENTS ? TABZAP, LINE TABSYM = :S(TABZAP) /GET RID OF TABS LINE_ SPSYM = /GET RID OF SINGLE SPACES WRITE = LINE :(PLOOP) /OUTPUT AND CONTINUE /-PLUS /
/+CALSEQ, ROUTINES, LOGIC, GLOBAL, TABLE, LOCS / "TABLE" MODE IS OBTAINED BY ANY OF THE /FOLLOWING FLAG CHARACTERS: < _# * = ; $. /IN THIS MODE EVERYTHING IS PUT IN UPPER CASE THROUGH /"RUNOFF" WITH NO FILLING SO THAT SPACING IS NOT AFFECTED. /:CODE: LOCS, CALSEQ, ROUTINES, LOGIC, GLOBAL, TABLE, COMSYM = S /WE ONLY WANT COMMENTS OUTCAP, WRITE = CAPSYM LINE TABSYM = .A232 .A232 /CONTROL Z'S SHOULD NEVER EXIST SPSYM = TABSYM /SAME FOR HERE CAPSYM = "" :(PLOOP) /CONTINUE /-CALSEQ, ROUTINES, LOGIC, GLOBAL, TABLE / /+VARIABLES / "VARIABLE" MODE IS OBTAINED BY THE /@ FLAG. /IN THIS MODE "EVERY" LINE OF INPUT IS SENT TO THE /OUTPUT FILE, ALTHOUGH SLASHES ARE REMOVED FROM COMMENTS. /IT IS VERY IMPORTANT THAT ANOTHER FLAG CHARACTER /IS USED TO GET OUT OF THIS MODE OR THE ENTIRE /PROGRAM WILL BE SENT TO THE OUTPUT FILE. / /:CODE: VARIABLES, COMSYM = "" /SET TO PRINT OUT EVERYTHING :S(OUTCAP) / /-VARIABLES / /+ENTRYS / "ENTRY" MODE IS THE MODE USED TO PROCESS THE /"/!ENTRY" "POINT" FLAG. IN THIS MODE FOLLOWING LINES /STARTING WITH "/+" WILL BE PUT IN CAPS ON THE SAME LINE. /THE FIRST LINE NOT STARTING WITH "/+" GOES BACK INTO "PLUS" /MODE. /:CODE: ENTRYS, WRITEH = ".P;^" LINE ENLOOP, LINE = READ :F(EOF) LINE_ S FP = :F(ENEND) WRITE = '"' LINE :(ENLOOP) /OUTPUT AN ENTRY POINT / ENEND, WRITEH = ".P;" :(SEARCH) /END OF ENTRY POINTS / /-ENTRYS / EOF, .OCLOSE :F(CERROR) .ICLOSE .EXIT CERROR, OUTPUT = "CLOSING ERROR !" .EXIT IOBAD, OUTPUT = "OUTPUT ERROR !" .END /-EOF
/SNORTS PARAMETER FILE. / ROUTINE AND PARAMETER DEFINITIONS XINIT= 156 XPUSHJ= XINIT+1 XPOPJ= XPUSHJ+1 XPUSH= XPOPJ+1 XPOP= XPUSH+1 XLOOKU= XPOP+1 XENTER= XLOOKU+1 XICLOS= XENTER+1 XOCLOS= XICLOS+1 XPAT= XOCLOS+1 XASC= XPAT+1 XINT= XASC+1 XBASE= XINT+1 XINDRC= XBASE+1 XICLTB= XINDRC+1 XDEVS= XICLTB+1 XFILSI= XDEVS+1 / RELATIVE INTERNAL CALLING TABLE XXCLRV= 0 XXCLV= 1 XXFNDS= 2 XXGETC= 3 XXPUTL= 4 XXPUTV= 5 XXPVR= 6 XXSVCH= 7 XXTOP= 10 XXWRCH= 11 / VARIABLE FUNCTION DEFINITIONS INPUT= 20 READ= 21 OUTPUT= 22 OUTHOL= 23 WRITE= 24 WRITEH= 25 POSR= 26 / PATTERN MATCHING CODE DEFINITIONS XEQC= 1 XORC= 2 XFENC= 3 XFLC= 4 XSUCCES=177 IFDEF XP0011 <ERROR: SOURCE FILE COMPILES TOO LARGE> XFIELD1=1200 *200



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search