TITLE COMPIL 22G(605) CCL CONTROL CUSP SUBTTL OWNER HISTORY ; WEIHER/CLEMENTS/RCC/PMH/NGP/DMN/HPW/JNG ; /SMM/JMT/WCL/BCM/GAT/RCB/MEM 9-SEP-87 SUBTTL PROGRAM TO COMPILE LOAD EXECUTE AND DEBUG USER PROGRAMS ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1968,1978,1983,1984,1985,1986,1987. ;ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. SEARCH UUOSYM VCOMPIL==22 VUPDATE==7 ;DEC UPDATE LEVEL VEDIT==605 ;EDIT LEVEL VCUSTOM==0 ;NON-DEC UPDATE LEVEL ;THE ORIGINAL VERSION OF ;THIS PROGRAM WAS WRITTEN AT THE STANFORD UNIVERSITY ;ARTIFICIAL INTELLIGENCE LABORATORY BY WILLIAM F. WEIHER. ;MR. WEIHER'S COOPERATION, AND THAT OF THE A-I LABORATORY, ;ARE GRATEFULLY ACKNOWLEDGED. ; ;CONVERTED TO MACRO SOURCE LANGUAGE FROM FAIL ON ;1 NOVEMBER 68 BY R CLEMENTS INTERN VCOMPILE,.JBVER ;FOR LOADER MAP AND LIBRARY LOC <.JBVER==137> B2+B11+B17+VEDIT RELOC 0 IFNDEF RUNSW, ;NON-ZERO TO USE THE RUN UUO IFNDEF PURESW, ;NON-ZERO FOR A SHARED VERSION OF COMPIL IFNDEF STANSW, ;NON-ZERO TO INCLUDE STANFORD FEATURES IFN STANSW, IFNDEF LSTRSW, ;NON-ZERO TO USE "LISTER" INSTEAD OF PIP ;FOR TYPE AND LIST COMMANDS IFNDEF FASTFS, ;FASTEST FILE STRUCTURE ;IF ZERO COMPIL WILL FIND IT AT RUN TIME IFNDEF SIMULA, ;[452] ACCEPT SIMULA AS A COMPILER IFNDEF PASCAL, ;[463] ACCEPT PASCAL AS A COMPILER IFNDEF SNOBOL, ;ACCEPT SNOBOL AS A COMPILER IFNDEF MACY11, ;[203] ACCEPT MACY11 (PDP-11) ASSEMBLER IFNDEF BLISS, ;ACCEPT BLISS COMPILER IFNDEF FAIL, ;[202] FAIL ASSEMBLER IFNDEF SAIL, ;SAIL COMPILER IFNDEF PAL10, ;PAL10 ASSEMBLER (NO CCL INTERFACE YET) IFNDEF DEBSW, ;DEBUGGING AIDS IF NON-ZERO IFNDEF SFDSW, ;ENABLED FOR SUB-FILE DIRECTORY IFN SFDSW,> ;LENGTH ALLOWED IFDEF SFDLEN,> ;NO SFD'S IF LENGTH.LE.0 IFNDEF SFDLEN, ;[601] MAKE SURE SYMBOL ALWAYS DEFINED IFNDEF FORTRAN, ;NON-ZERO IF BOTH F40 AND FORTRAN-10 ALLOWED IFNDEF DFORTRAN, ;DEFAULT VALUE 0=F40, 1=FORTRAN-10 IFNDEF DCOBOL, ;[324] DEFAULT VALUE 0=COBOL-68, 1=COBOL-74 ;[451] MAKE COBOL-74 DEFAULT COBOL COMPILER IFNDEF EDITOR,;EITHER LINED OR EDITS [442] DEF IS DTECO SUBTTL REVISION HISTORY ;START OF VERSION 22A ;144 PASS FORTRAN-10 SWITCHES IN () CORRECTLY ;145 (10405) CLEAR .JBSA & JOB NAME SO START, RUN, GET FAIL ;146 MAKE ERROR MESSAGES CONFORM TO STANDARD CMLxxx ;147 (9096) MAKE TECO COMMAND ACCEPT SWITCHES IN () ;150 TEST FOR LINK/LOADER CONFLICT AND WARN USER ;151 (9949) FIX TO RECOMPILE LIBRARY FILE WITH NULL EXT ;152 FIX TO RECOMPILE FILE IF TEMP /COM BUT PERMANENT /REL ;153 MAKE LINK-10 & FORTRAN-10 THE DEFAULT ;154 (11535) FIX COPY WITH TAPEID AND SWITCH BEFORE = ;155 (10817) FIX TYPO IN SFDPPN ROUTINE ;156 ADD DATE75 HACK ;157 READ SVC FILE IF ONLY SWITCHES HAVE BEEN SEEN (NO FILE NAME) ;160 FIX ILL MEM REF FROM ZERO COMMAND WITH NO ARGS ;161 (11209) ?COMMAND ERROR: .Y WITH DEL X.,*.Y; DON'T SCAN OFF COMMA AT GETN1+5 ;162 FIX PC OUT OF BOUNDS ;163 REVERSE ORDER OF LOOKUPS SO FORTRAN IS FIRST ;164 LOAD CORRECT REL FILE IN LOAD FOO.BIN=FOO[PPN] WHERE BOTH FILES ON [PPN] ;165 GET STACK CORRECT ON DEBUG /LINK A+ ;166 (11466) CORRECT TECO COMMAND STRING IF [PPN] PRESENT ;167 (11643) ACCEPT "_" FOR "=" IN RENAME AND COPY ;170 TYPE RUN UUO ERROR CODES IN OCTAL ;171 MAKE CODE MORE READABLE ;172 FIX TYPO AT NOCOM3 + 3 ;173 (11377) PASS ()'D SWITCHES TO COMPILERS IN ()'S (EXCEPT F10) ;174 (10945) LOADER NEEDS /N OR /L ON EACH FILE ;175 (11831) DO NOT TEST FOR .REL ON /COMP ;176 (11620) FIX ADDRESS CHECK ON EX DSKC:A,B (A.F4) ;177 FIX EDIT 173 ;200 EXTEND EDIT 153 ;201 EDIT 161 KILLED . / ; REDO EDIT 161 AND ALLOW [P,PN] IN .[P,PN] ; AS A SIDE EFFECT ;202 TURN FAIL ON ;203 CHANGE MACX11 TO MACY11 AND TURN MACY11 ON ;START OF VERSION 22B ;204 (12705) IMPLEMENT NEW ERROR MESSAGE IF NO PREVIOUS COMMAND ;205 (12994) GIVE ERROR MESSAGE IF NO COMMAND TO RESCAN ;206 (12705) EXTEND EDIT #145 TO ALL POSSIBLE "EXIT"S ;207 (13072) ALLOW COMPILATION OF FILE WITH NULL EXTENSION ;210 (12259) FIX SO THAT TECO COMMAND CAN BE TERMINATED WITH ALTMODE ;211 (13801) FIX BUG IN #205 WHICH MAKES DEBUGGING HARD ;212 (13036) PUT OUTPUT EXTENSION IN A TABLE ;213 GIVE EDR ERROR ON MTA OPERATION WITH NO DEVICE SPECIFIED ;214 (12998) OUTPUT /C RATHER THAN /T ON TYPE COMMAND ;215 (12993) DELETE CODE TO RUN RANDOM CUSPS, ITS NEVER USED ;216 (13000) ALLOW MAKE AND TECO WITH NO PREVIOUS COMMAND RUN TECO ;217 TURN SAIL ON AND ADD SDDT FOR FAIL AND SAIL ;220 fix /debug switch for link-10 to contain the process name ;221 ADD SUPPORT FOR FORDDT, /DEBUG, /FORDDT ;222 (11911) ADD ERROR MESSAGE IF USER TRIES TO USE F40 AND F10 IN SAME COMMAND ;223 (12374) REMOVE UNNECESSARY CORE UUO ;224 (12162) FIX BUG IN MAKE [1,3] WHICH CAUSES COMPIL TO GROW WITHOUT LIMIT ;225 (12992) TRY NULL EXTENSION AFTER CMD EXTENSION ;226 (11977) GIVE BETTER MESSAGE IF @DEV DOES NOT EXIST ;227 (12051) FIX VARIOUS COPY BUGS ;230 (13351) FIX ILL MEM REF IF /MAP SPECIFIED AND NOT LOADING ;231 (13881) GIVE ERROR IF PROTECTION CODE GREATER THAN 3 CHARACTERS ;232 (12269) BACKUP CHAR COUNT AS WELL AS BYTE PTR IN SCANS ;233 (12273) USE "=" RATHER THAN "-" WHERE EVER POSSIBLE FOR .TMP FILES ;234 (11937) IMPLEMENT /SAVE SWITCH TO PASS COMMAND TO LINK-10 ;235 MAKE /FOR AND /MAC UNIQUE ;236 (13963) FIX EDIT #174 TO PUT OUT /L OR /N ONLY IF NEEDED ;START OF VERSION 22C ;237 (14041) THE COMMAND "PROT DSKA:UFD[,]<765>" WORKED DUE ; TO A PIP BUG. IMPLEMENT UFD'S CORRECTLY. (JNG) ;240 (14125) ON A TECO, COMPILE, LOAD SEQUENCE, COMPIL OFTEN ; RECOMPILES AT THE LOAD. DIAGNOSIS: CREATION DATE IS ACCURATE ; ONLY TO THE NEAREST MINUTE. FIX: DO EXTENDED LOOKUPS FOR ; .RBTIM (1/3 SEC.) IF DEVICE IS A DISK. (JNG) ;241 (14082) FIX MEMORY MANAGEMENT PROBLEM WITH REL FILE I/O BUFFERS ; OVERWRITING TMPCOR BUFFERS. (JNG) ;242 (14087) DELAY DECIDING FORMAT OF FOROTS/FORSE SWITCH TO ALLOW ; "COMP/FOROTS/LINK" TO WORK. (JNG) ;243 (14732) ALLOW A DEVICE TO BE SPECIFIED FOR TMP FILES. THIS ; WAS BROKEN BY EDIT 226. (JNG) ;244 (14663) USE USER'S DEVICE FOR REL FILE IF HE GAVE ONE. ;245 (14409) ADD SOME SYNTAX CHECKING TO THE PROTECT COMMAND. ;246 (14678) IGNORE FILES IN USER'S LIBRARY IN PREFERENCE TO ; THOSE IN HIS DEFAULT PATH. ;247 DON'T TRY TO COMPILE REL FILES WITH NO ACCOMPANYING SOURCES. ; THIS WAS BROKEN BY EDIT 240. ;250 TRY LIBRARY IF USER GAVE AN EXTENSION AND FILE IS NOT IN THE ; DEFAULT PATH. THIS WENT DOWN WITH EDIT 246. ;251 IMPLEMENT DLIST SWITCH TO SPECIFY LIST FILE SPECIFICALLY ; ON DISK, LIST WILL NOW SPECIFY TO INIT DEVICE LPT: WHETHER ; SPOOLED OR UNSPOOLED ; AREAS AFFECTED: STABLE MACRO DEFINITION, ATABLE MACRO DEFINITION ; DOCOM2 ; LABELS ADDED: SETDSK,SETLPT ;252 (14995) ALLOW SLASH FOR MULTIPLE CHARACTER SWITCHES TO ALGOL ; AREAS AFFECTED: PROCS1 ;253 COMPLETE EDIT 243 ; AREAS AFFECTED: NEST ;254 MAKE DEVICE SPECIFICATIONS "STICKY" ; AREAS AFFECTED: GETDEV,NODEV ; LABELS ADDED: SVDEVV ;255 (15503) FIX MANTIS FEATURE SO THAT WHEN MORE THAN ONE ; PROGRAM IS COMPILED, ALL PROGRAMS GET THE /D SWITCH SET. ; NOTE THAT MANTIS IS UNSUPPORTED. AREA AFFECTED - ONSET ;256 (15575) MAKE /SAVE AND /SSAVE PRODUCE THE CORRECT ; COMMAND FILE TO LINK. ; AREAS AFFECTED - SSAVE & NOCOMP & LODR1 ;257 (15711) MAKE LINK LOAD LOCAL SYMBOLS FOR /LMAP SWITCH ; AREAS AFFECTED: SETMPL ;260 (16101,16201) BANDAGE COMPIL AFTER MAULING BY EDIT 254 ; AREAS AFFECTED: GETDEV, NOTCPY ;261 (16120)MAKE COMPIL RESPECT ALL DOCUMENTED BREAK CHARACTERS ; AREAS AFFECTED: CTBL ;262 (16412)EDIT 241 CAN CAUSE COMPIL TO GROW BY 1K NEEDLESSLY ; AREAS AFFECTED: RPGRET ;263 (16558)INVALID LOGIC IS USED FOR CONVERTING UFD PROTECTION. ; IT CAN STOP TOO EARLY. ; AREAS AFFECTED: UFDSET ;264 (16648)COPY A.=A1,A2 DOESN'T WORK LIKE COPY A=A1,A2 ; AREAS AFFECTED: NXTNM2,NOTCPY ; LABELS ADDED: NXTNOX ;265 (16774)EDIT 212 HAD ERROR - JFFO WON'T WORK PROPERLY ; IF AN UNRECOGNIZED PROCESSOR IS SPECIFIED BY EXTENSION ; AREAS AFFECTED: REREL0 ;266 (16808) COMPIL LOSES ACTUAL REASON FOR LOOKUP ERROR ; AREAS AFFECTED: NOFIL, NOTYT2, LOSE1 ;267 (16937)"STICKY" DEVICE NAMES ARE STILL TOO STICKY WITH EDIT 244 ; AREAS AFFECTED: SETONM ;270 (17022) MAKE ".PROT <777>[,].UFD" WORK, & CLEAN UP DEFAULTING. ; AREAS: DOPROT ;271 (17329) ALLOW TRAILING ASTERISK WILDCARDS IN PIP COMMANDS. ; AREAS: SCAN ;272 (18957) ALLOW THREE AND ONLY THREE #'S IN RENAMES ; PROTECTION SPECIFICATION. ; AREAS: NXTNM0 ;273 (18542) REMOVE EDIT #216, TECO,MAKE, ETC. SHOULD ; GIVE "NO PREVIOUS COMMAND" ERROR AS DOES LOAD , ETC. ; AREAS: NOFIL ;274 (18807) A PPN OF LEFT SIDE OF AN "=" IN A COMPILE-CLASS ; COMMAND CAN BE IGNORED ! ; AREAS: DOCOMP, DOCOM3, ELOD3, ENTC2 ;275 (17540) PPN NOT PASSED TO LINK TMP FILE CORRECTLY ON ; "+" CONSTRUCTIONS. ; AREAS AFFECTED: LODR2 ;276 IF ENTER ON TMP FILE FAILS, TRY GENERIC DEVICE DSK ; AREAS AFFECTED: NOFIT, TMPDS0 ;277 SETZ SHOULD BE A SETZM WHICH CAN CAUSE A RUN ; UUO FAILURE BECAUSE PPN WORD IS -1. COULD CAUSE ; OTHER UNPREDICTABLE RESULTS SINCE AC 0 IS CLEARED. ? ; AREA AFFECTED: RUNIT ;300 (19716) BLANK LINES AT THE BEGGINING OF A COMMAND FILE ; CAN CAUSE UNWARRANTED COMMAND ERRORS. ; AREAS AFFECTED: SYNERP, SCNAGN ;301 EDIT #300 FIXED AN AGE OLD BUG WHICH WAS PARTIALLY ; FIXED BY A TEMPORAY PATCH AT LOCATION POPFIL. ; WITH EDIT #300 AND THIS PATCH IN, AN ILL MEM REF ; WILL OCCUR WHEN ANY PIP COMMAND IS TYPED WITH NO ; ARGUMENT, THEREFORE REMOVE THIS PATCH ! ; AREA AFFECTED: POPFIL ;302 IN ANSWER TO SPR# 17024, AN EDIT #272 WAS MADE ; AND UNFORTUNATLY WAS LOST. THIS EDIT REPLACES ; THAT EDIT AND ONCE AGAIN FIXES A STICKY DEVICE/PPN ; PROBLEM. DEVICES AND PPN'S AS SWITCH ARGUMENTS ; SHOULD NOT STICK. ;303 IN ANSWER TO SPR# 17989, ANOTHER EDIT #272 WAS ; GENERATED AND ALSO UNFORTUNATELY LOST. THIS ; EDIT REPLACES THAT ONE AND MAKES THE DEFAULT ; DEBUGGING AIDE FOR FORTRAN TO BE FORDDT WITH ; REGULAR DDT ALSO LOADED. ;304 AS A SIDE AFFECT OF EDIT #301, LABEL DEV:/ABC/ ; WAS BROKEN. REMOVE EXTRA CALL TO SCAN GENERATED ; BY EDIT #154. ; AREA AFFECTED: IDENT3 ;305 EDIT #300 IS INCOMPLETE AND CAUSED MANY SIDE AFFECTS. ; EDIT #301 ATTEMPTED TO FIX ONLY ONE OF THESE EFFECTS ; AND DID NOT FIX THE FULL SCOPE OF RELATED PROBLEMS. ; THIS EDIT COMPLETES THE FIX EDIT #300 ATTEMPTED, ; SUPERCEDES EDIT #301 (PUT TEMP. PATCH BACK), ; AND ELIMINATES THE SUBTLE SIDE AFFECTS ;306 IF NO DEVICE IS SPECIFIED FOR A REWIND OR UNLOAD ; COMMAND, THE ERROR MESSAGE SHOULD INDICATE ; "? EXPLICITE DEVICE REQUIRED" RATHER THAN ; "? COMMAND ERROR" ; AREA AFFECTED: NOMTPD ;307 (QAR#484)SPACES AFTER A DEVICE SPECIFICATION ARE ; IGNORED AND DO NOT TERMINATE THE FILE SPECIFICATION. ; THEY SHOULD ! ; AREA AFFECTED:GETDEV ;START OF VERSION 22D ;310 (SPR 10-21464)PASSES INVALID TMP FILE TO LINK IF ; A PREVIOUS COMMAND ALSO CONTAINED A MAP OR LMAP ; SWITCH AREAS AFFECTED: SETMAP,SETMPL ;311 (SPR 10-21882) SKIP MTA: NUM FILES DOESN'T WORK ; AREA AFFECTED: TAPESP ;312 (SPR 10-22043) WRONG AND INVALID DEBUG AID SWITCH BEING ; PASSED TO LINK FOR FORTRAN. IF F40 USE DDT AND IF ; FORTRAN-10 USE FORDDT. AREAS AFFECTED: PROCESS MACRO, ; GETDD1, FOR ;313 (SPR 10-21981) IF SFDSW=0 THEN GOTSTK UNDEFINED. ; MOVED LABEL OUTSIDE OF CONDITIONAL. AREA AFFECTED:GOTSTK ;314 (SPR 10-22084) COBOL PROGRAMS CANNOT BE LISTED TO LPT: ; WITH /LIST. BUG INTRODUCED WITH EDIT 251. AREA ; AFFECTED: DOCOM2+5 ;315 (SPR 10-22658) STOP TRYING TO FIND FILES IN USER'S AREA ; IF EXPLICIT DEVICE OR PPN IS GIVEN. ONLY LOOK ON USER'S ; AREA FOR .REL FILES IF SOURCE FILE IS FOUND ON THE SPECIFIED ; AREA. AREA AFFECTED: OKREL ;316 (SPR 10-22369) CORRECT RECOMPILATION LOGIC WHERE ; STRUCTURE NAME IS SPECIFIED. CORRECTS EDIT 240. ; AREAS AFFECTED: OKLOOK, ELOOK, ALTDAT ;317 (SPR 10-22181) PREVENT UNNECESSARY RECOMPILE WHICH OCCURS ; IF A SOURCE FILE IS MOVED. ; AREAS AFFECTED: ONSET,REREL2,EREL,DNLOK1,SETDT ;320 CLEAN UP CODE AND COMMENTS ;321 PROVIDE PROPER OUTPUT IF LISTING SWITCHES FOR A PROCESSOR ; ARE SPECIFIED WITHOUT A COMPIL LISTING SWITCH. ; AREAS AFFECTED: DOCOM2 ;322 (SPR 10-24292) DON'T PASS PPN OF SOURCE TO LINK IF ; RECOMPILE IS NECESSARY AND /SEARCH OR /LIBRARY IS GIVEN ; AREA AFFECTED: LODR2 ;323 (SPR 10-24597) WHEN SCANNING TAPE OPTIONS (...), CHECK ; FOR VALID BREAK CHARACTER. IF FOUND BEFORE ")" THEN ERROR. ; AREAS AFFECTED: COPYSW ;324 REMOVE MANTIS CODE (NEED TO REUSE THE FLAG BITS) ; ADD SUPPORT FOR COBOL-74 ; MAKE /OPT PASS /O TO COBOL ;START OF VERSION 22(E) ;424 SAVE 100 EDITS FOR DEVELOPMENT ;425 SPR # 10-26362 WCL 10-0CT-78 ; FIX CHARACTER COUNTING WHEN FILLING BLOCK; HAS BEEN PUTTING NULL ; AS FINAL CHARACTER ; AREAS AFFECTED: TMPOUT ;426 (SPR 10-25452) COMPIL HANGS ON COMMAND SPECIFYING ; A DEVICE WHEN ASSEMBLED WITH SFDLEN=1 ; AREA AFFECT: NODEV ;427 SPR # 10-26000 WKV 11-JAN-79 ; KEEP COMPIL FROM LEAVING CREF TEMP FILE ON DSK AFTER TMPCOR ; OPENS UP. AREA AFFECTED: POPFIL ;430 NO SPR # WCL 05-MAR-79 ; REMOVE CORE REQUIREMENT IN RUN UUO FOR COPY/RENAME TO ALLOW ; DEBUGGING ; AREA AFFECTED: DOCOPY ;431 SPR # 27558 WCL 05-MAR-79 ; IGNORE EXTRA VERBIAGE IN COPY SWITCHES; STOP SCAN AFTER ONE CHARACTER ; (WAS INTERPRETING FOLLOWING CHARACTERS AS FILE NAME) ; AREA AFFECTED: NXTNM0 ;432 SPR # 26360 + 27526 ; SETNAM UUO CAUSES CLEARING OF JB.LSY; BATCON CHECKS THIS TO ; SEE IF IT SHOULD SEARCH FOR %ERR OR %CERR; SINCE IT'S CLEAR, ; BATCON INCORRECTLY SEARCHES FOR %ERR; FIX: REMOVE SETNAM ; AREA AFFECTED: DOEND ;433 SPR #29039 TARL 22-MAR-80 ; FIX EDIT 322 - REMEMBER WHEN WE HAVE DECIDED THAT THIS IS A REL FILE ; AREA AFFECTED : LBCOMP+13.4 ;434 SPR #29593 RKB 23-MAY-80 ; FIX COMMAND SCANNER SO IT WILL ACCEPT EXTRANEOUS SPACES ; AREA AFFECTED : SCNS2+2 ;435 SPR #29887 RKB 5-AUG-80 ; GET RID OF BIZARRE EXTRA CHARACTER SEEN AFTER SOME ERROR MESSAGES ; AREA AFFECTED : ERRCOM ;436 NO SPR RKB 5-AUG-80 ; CLEAN UP SOME ERROR MESSAGES AT ERRCOM ;437 SPR #29807 BCM 22-JUL-80 ; FIX PROTECT COMMAND LINE PARSER FOR DOUBLE EXTENSION ; AREA AFFECTED: PROT1+16 ;440 SPR #29975 BCM 16-SEP-80 ; PASS LINK "COBOL" AS THE COBOL-74 DEBUGGING AID ;441 NO SPR BCM 19-SEP-80 ; EXTENSIVE EDITS TO FEATURE TEST MOST OF OLD CODE ; ALSO MAKE USEFUL MODS ;442 NO SPR TARL 11-DEC-80 ; MAKE THE EDIT COMMAND RETAIN THE DEVICE NAME - THIS WAY IT CAN ; RUN DTECO INSTEAD OF LINED. ;443 NO SPR BCM 19-FEB-81 ; FIX PROCESSOR vs. SWITCH PROBLEM INTRODUCED BY EDIT 441 ;444 10-30513 BCM 24-Mar-81 ; MAKE /SAVE AND /SSAVE WORK RIGHT ;445 10-05955 BCM 28-Apr-81 ; FIX /NOCOMP SWITCH FOR "DEBUG A.MAC/NOCOMP" ;446 10-30567 BCM 16-Jun-81 ; INCREASE BUFFER SIZE FOR NUMBER OF LINK SWITCHES ;447 QAR 10-05958 BCM 8-Aug-81 ; implement global processor switches ;450 NO SPR BCM 11-Aug-81 ; Fix an assumption that processors can still parse parenthesis. ;451 QAR 10-05959 BCM 12-Aug-81 ; make COBOL-74 the default COBOL compiler ;452 QAR 10-05957 BCM 25-Aug-81 ; add code to support SIMULA compiler ;453 SPR 10-31944 BCM 5-Jan-82 ; Fix edit 444 to not overlay the extension as the output extension. ; ;454 SPR #32066 BCM 2-JAN-82 ; Reinsert the code at IDENT which was removed incorrectly ; by a zealous edit 441. ;455 SPR #30256 BCM 15-Mar-82 ; We output an "S" as the first chacracter in the TMPCOR file ; that is passed to LINED or TECO. Since we removed the LINED ; support we will gradually remove this from crock from COMPIL. ; Change the "S" to "" since TECO skips it anyway. ;456 SPR #31279 BCM 15-Mar-82 ; Replace code removed by edit 430. Makes PIP run faster ; on copies. ;457 SPR #31693 BCM 16-Mar-82 ; Allow compiler selection switches (/C74,/C68,/F10,/F40) to ; imply compiler type. A long overdue correction. ;460 SPR #32659 BCM 28-Sep-82 ; Edit 454 incomplete. Add LABEL to command table. ;461 SPR #32416 BCM 22-Apr-82 ; Increase the core argument to optimal size. ;462 SPR #31449 BCM 29-Sep-82 ; Always LOOKUP the REL file if the processor is unknown. This ; avoids debugging with DDT, when the link block type is Fortran. ; Made new routine SETPTH which should always be called to set ; up path for DOLOOK. Changed all LOOKUP's to call DOLOOK. ;463 NO SPR BCM 19-Apr-83 ; Add the PASCAL compiler to compiler list and add new compiler ; attribute flag word. ; ;START OF VERSION 22(F) ; ;564 SPR 10-32178/32177 GAT 4-JAN-84 ; Fix ADDRESS CHECKS/ILL MEM REFS which were not thoroughly ; eliminated by edits 176/241. ; ;565 10-32625 GAT 19-JAN-84 ; GIVE APPROPRIATE ERROR MESSAGE IF SOURCE FILES ARE NOT FOUND OR ; .REL FILES ARE SPECIFIED IN THE "+" CONSTRUCTION. ;566 10-31613 GAT 14-FEB-84 ; DELETE TMPCOR FILE IF WRITING .TMP FILE ONTO DISK. ;567 SPR 10-32007 GAT 10-FEB-84 ; CORRECT PARSING OF COMMAND FILES THAT START WITH A COMMENT LINE(S). ;570 10-34129 GAT 22-MAR-84 ; ALLOW "MINUS SIGN" IN PROCESSOR SWITCHES NEEDED FOR COBOL-74. ;571 33631 GAT 21-MAR-84 ; USE ALGDDT AS DEFAULT DEBUGGER INSTEAD OF DDT FOR ALGOL ;572 10-32034 GAT 8-MAY-84 ; GIVE ERROR IF TRYING TO DEFAULT SFD(S). ;573 SPR 10-31549 GAT 14-MAY-84 ; DON'T PASS EXPLICIT SOURCE DEVICE TO LINK IF A /LIB FILE NEEDS ; TO BE RECOMPILED (INTO OUR DIRECTORY). ;574 10-34735 GAT 9-AUG-84 ; MAKE GFLOAT AND F66 SWITCHES KNOWN TO COMPIL. ;575 10-34994 GAT 10-DEC-84 ; INCREASE SIZE OF SWITCH BLOCK (SWBK) TO ALLOW LONGER ; PROCESSOR SWITCH STRINGS. THIS NOW ALLOWS UP TO 150 ; CHARS TO BE PASSED INSTEAD OF JUST 25 CHARS. ;576 None LEO 9-AUG-85 ; CHANGE COPYRIGHT STATEMENTS ;577 QAR 868774 DRB 3-FEB-86 ; NEST IS DESTROYING T1 WHEN IT SHOULDN'T. PUSH IT SOONER AND POP IT ; LATER. ; ;START OF VERSION 22(G) ; ;600 NO SPR RCB 6-FEB-86 ; EXTEND 442 TO ALLOW THE PATHOLOGICAL DEVICE EDITOR: TO BE WHAT ; THE CREATE AND EDIT COMMANDS WILL RUN. IF EDITOR: IS NOT DEFINED, ; THEN DEFAULT TO THE EDITOR SYMBOL OF 442 (RUN FROM SYS:). ; ;601 10-35493 RCB 22-JUL-86 ; ALLOW [-] AS A PATH SPEC. ; ;602 10-35500 MEM 16-JAN-87 ; ONLY PUT OUT EXT AND PPN IF /REL WAS SPECIFIED ; ;603 10-35688 9-SEP-87 ; EXPLICIT "DSK" ON A FILESPEC DOESN'T OVERRIDE STICKY DEVICE NAME ; FROM A PREVIOUS FILESPEC. ; ;604 10-35708 9-SEP-87 ; EDIT 567 WENT TOO FAR. DON'T SPECIAL CASE COMMA SEPARATORS WHEN ; TERMINATING INDIRECT COMMAND FILESPECS UNLESS THEY IMMEDIATELY ; FOLLOW A TERMINATOR. ; ;605 10-35989 9-SEP-87 ; EDIT 602 WAS TOO RESTRICTIVE. TRIED TO SUPPRESS THE OUTPUT OF ; EXTENSIONS, BUT OMITTED THE PPN AS WELL. ; ;;;END OF REVISION HISTORY SUBTTL ASSIGNMENTS ;ACS P=17 ;PUSHDOWN POINTER C=16 ;CHARACTERS RETURNED HERE CS=15 ;CHARACTER STATUS BITS HERE SVPT=14 ;POINTER TO CURRENT FILE IN LIST OF FILES (AOBJN) SWPT=13 ;BYTE POINTER INTO SWITCH STORAGE AREA SWCNT=12 ;NUMBER OF BYTES LEFT FOR SWITCH STORAGE FL3=11 ;FLAG REGISTER (LEFT HALF IS GLOBAL SWITCHES) FL2=10 ;FLAG REGISTER (LEFT HALF INDICATES PROCESSOR) ;RIGHT HALF IS DEFAULT LOCAL PROCESSOR (SET BY /F ETC) IOP=7 ;PDL FOR INPUT NESTING IOPNT=6 ;POINTER TO CURRENT INPUT FILE T5=5 ;USED IN OUTPUT ROUTINES ONLY (DMN) T4=4 ;TEMPORARY ACCUMS T3=3 T2=2 T1=1 FL=0 ;FLAG REGISTER (LEFT HALF LOCAL SWITCHES) ;(RIGHT HALF MISC BITS) IFN PURESW,> SALL ;SUPPRESS ALL MACROS AND REPEATS MLON IFE DEBSW, IFN DEBSW, IFE SFDSW, IFN SFDSW, SWBK==30 ;[575] NUMBER OF WORDS FOR SWITCHES TO PROCESSOR LODSCT==^D200 ;[446] # OF CHRS IN LINK SWITCHES PER FILE ALLOWED DEBSIZ==5 ;[221] NO. OF WORDS OF FORDDT SWITCHES .TYSPL==(1B13) ;DEVTYP BIT FOR SPOOLING .RBSIZ==5 ;[240] LAST WORD USED IN 4-WORD LOOKUP .RBTIM==35 ;[240] INTERNAL CREATION DATE OF DSK FILE DV.DSK==(1B1) ;[240] DEVICE IS A DSK FRSCOD==1 ;[242] MEANS USE FORSE FRTCOD==2 ;[242] MEANS USE FOROTS ;[463] FLAG WORD SCANCH==000001 ;[463] USE SCAN CHAINING ARG CONVENTIONS ;FLAGS (RH OF FL) PROCS==1 ;PROCESSOR SWITCHES SEEN DOLOD==2 ;WE WANT TO DO LOADING PCM1==4 ;FIRST COMMA SEEN IN PROCESSOR SWITCHES PCM2==10 ;SECOND COMMA SEEN IDF==20 ;SCAN SAW AN IDENTIFIER LODOUT==40 ;SOME OUTPUT HAS BEEN DONE TO LINK [441] PERF==200 ;PERMANENT TYPE FLAGS CMDSN==1000 ;THE COMMAND SHOULD BE WRITTEN AS SVC OR EDS INCRF==2000 ;WE ARE FINISHING CREF OUTPUT INPRNT==4000 ;WE ARE PRINTING A CHARACTER STRING IN ERROR MSG PIPF==10000 ;DOING SOMETHING FOR PIP EDITF==20000 ;IN EDIT OR CREATE CREATF==40000 ;CREATE NODAT==PCM1 ;FILE FROM OTHER THAN DSK NOLOOK==PCM2 ;LOOKUP FAILED TECOF==100000 ;WE WANT TECO RECALF==200000 ;WE ARE READING A COMMAND SAVE FILE F.STKY==400000 ;[302] DEVICE'S AND PPN'S SHOULD NOT STICK ;TABLE OF NEW DEVICES DEFINE DEVICE< X NEW,NEW X OLD,OLD X SYS,SYS X SELF,DSK > ;FLAGS (SWITCH TYPE) LISTSW==1 ;DO LISTING CRSW==2 ;DO A CREF LIBSW==4 ;DO A LIBRARY SEARCH OF THIS FILE DEBUGSW==10 ;[221] COMPIL SPECIAL CODE FOR FORDDT COMPLS==20 ;COMPILE REGARDLESS OF DATES NOCMPL==2000 ;[445] NOCOMPLE REGARDLESS OF DATES NOBINSW==40 ;DON'T DO A REL FILE C68SW==100 ;[324] COMPIL COBOL WITH COBOL-68 C74SW==200 ;[324] COMPIL COBOL WITH COBOL-74 F40SW==400 ;COMPILE FORTRAN WITH F40 F10SW==1000 ;COMPILE FORTRAN WITH FORTRAN-10 F66SW==2000 ;[574] F66 CODE GFLSW==4000 ;[574] GFLOATING CODE OPTSW==10000 ;OPTIMIZED CODE NOPTSW==20000 ;NON-OPTIMIZED CODE DEVSW==(1B0) ;INITIAL VALUE DEVSWS==0 ;SUM OF DEVSW DEFINE X(A,B)< A'SW==DEVSW DEVSWS==DEVSWS!DEVSW DEVSW==DEVSW_-1> DEVICE REPEAT 0,< THE MACRO PROCESS DEFINES DETAILS ABOUT THE VARIOUS PROCESSORS WHICH COMPILE IS EXPECTED TO HANDLE BY CALLING THE MACRO X WHICH IS REDEFINED TO PRODUCE THE INFORMATION REQUIRED. THE ARGUMENTS ARE :- A SWITCH NAME B EXTENSION C PROCESSOR NAME D EXTENSION OF NEXT PROCESSOR IF MUST BE PROCESSED MORE THAN ONCE E EXTENSION PRODUCED F DEBUGGING AID USED ON DEBUG COMMAND (DDT IF NULL) G SEPARATOR, EITHER "=" OR "_" H COMPILER ATTRIBUTE FLAGS, USED FOR SCAN VS. BANG CHAINING > DEFINE PROCESS< IFN DFORTRAN, IFE DFORTRAN, IFN PASCAL,;[462] PASCAL USES SCAN ARGS X MACRO,MAC,MACRO,,,,= IFN SIMULA, ;[452] SW,EXT,PROC,,,DEBUG IFE DCOBOL, IFN DCOBOL, X ALGOL,ALG,ALGOL,,,ALGDDT,= IFN SNOBOL, IFN MACY11, IFN BLISS, IFN FAIL, IFN SAIL, IFN PAL10, > DEFINE XPROCESS< X LINK,LNK,LINK ;[441] FT LINK X CREF,CRF,CREF X PIP,PIP,PIP X EDT,EDT IFN LSTRSW, > ;PROCESSOR FLAGS IN FL2 RELSW==1 ;DO A LOAD ONLY ON THIS FILE (PROCESSOR IS LOADER) ALPROC==RELSW ;OR OF BITS FOR ALL THE PROCESSORS NPROCS==0 ;NUMBER OF PROCESSORS PROCBIT==400000 ;USE TO ASSIGN PROCESSOR FLAGS MXPROC==^D17 ;MAXIMUM PROCESSORS ALLOWED (REAL COMPILERS) XTPROC==0 ;EXTRA "PROCESSORS (PIP,LOADER, ETC) SPRC==0 ;BITS FOR THOSE PROCESSORS WHICH OUTPUT TO ANOTHER DEFINE X (A,B,C,D,E,F,G,H)< CHN'B==NPROCS ;INDEX TO OUTPUT ROUTINE B'SW==PROCBIT ;PROCESSOR BIT IFDIF <>, ALPROC==ALPROC!PROCBIT NPROCS==NPROCS+1 PROCBIT==PROCBIT_-1> PROCESS IFG NPROCS-MXPROC, DEFINE X (A,B,C,D,E,F,G,H)< CHN'B==MXPROC+XTPROC XTPROC==XTPROC+1> XPROCESS IFE SIMULA, ;[452] FOR LATER TESTS IFE BLISS, ;MAKES TESTS EASIER AND NEATER UNKSW==0 ;[462] AN UNKNOWN PROC TYPE LOOK==0 ;CHANNEL FOR DOING LOOKUPS FOR INFORMATION NFILE==^D40 ;NUMBER OF FILES PERMITTED IN A + CONSTRUCTION IFNDEF NESTDP, ;MAXIMUM NESTING DEPTH TO PERMIT IFLE NESTDP, IFG NESTDP-17, ;[324] LINK BLOCK TYPE 6 COMPILER CODES L%F40==1 ;F40 L%C68==2 ;COBOL-68 L%F10==10 ;FORTRAN L%C74==16 ;COBOL-74 SUBTTL MACROS EXTERN .JBFF,.JBREL,.JBERR,.JBSA %LOREL:! ;RELOCATABLE BEGINNING OF LOW SEGMENT IFN PURESW,< TWOSEGMENTS .ZZ: RELOC 400000> COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1968,1986. ALL RIGHTS RESERVED. \;END COPYRIGHT MACRO OPDEF STRING [TTCALL 3,] OPDEF PJRST [JRST] ;POPJ RETURN DEFINE SKIP (J) ;MACROS FOR THE DATA STORAGE IN PURE AND IMPURE VERSIONS DEFINE WORDS(A)< IRP A,< U(A,1)>> IFE PURESW,< DEFINE U(A,B)< A: BLOCK B>> IFN PURESW,< DEFINE U(A,B)< RELOC A: BLOCK B RELOC>> SUBTTL COMMAND AND SWITCH TABLES DEFINE CTABLE< COMAND COMPILE, COMAND LOAD,JFCL COMAND DEBUG, COMAND EXECUTE, COMAND EDIT, COMAND CREATE, COMAND LIST, COMAND CREF, COMAND DELETE, COMAND TECO, COMAND MAKE, COMAND RENAME, COMAND TYPE, COMAND COPY, COMAND PRESERVE, COMAND PROTECT, COMAND REWIND, COMAND UNLOAD, COMAND ZERO, COMAND ZER, COMAND SKIP, COMAND BACKSPACE, COMAND EOF, COMAND FUDGE, COMAND CTEST, COMAND LABEL, ;[460] REINSERT COMMAND > DEFINE STABLE< SWITCH CREF, SWITCH C, SWITCH SEARCH, SWITCH LIBRARY, SWITCH NOLIST,LISTSW SWITCH NOSEARCH,LIBSW SWITCH N,LISTSW SWITCH COMPILE, SWITCH NOCOMPILE, ;;[445] MAKE A SEPERATE BIT FOR NOCOMP SWITCH NOBINARY, SWITCH BINARY,NOBINSW SWITCH NODEBUG,DEBUGSW SWITCH C68, SWITCH C74, SWITCH F40, SWITCH F10, SWITCH F66, ;[574] SWITCH GFLOATING, ;[574] SWITCH OPTIMIZE, SWITCH NOPTIMIZE, SWITCH NEW, SWITCH OLD, SWITCH SYS, SWITCH SELF, > DEFINE PTABLE< SWITCH REL, SWITCH M, SWITCH F, SWITCH MA, SWITCH FO, SWITCH MAC, SWITCH FOR, PROCESS > DEFINE ATABLE< SWITCH MAP,<0,,SETMAP> SWITCH LMAP,<0,,SETMPL> SWITCH FUDGE,<0,,SETFUD> SWITCH DDT,<0,,SETDDT> SWITCH FOROTS,<0,,FOROTS> SWITCH FORSE,<0,,FORSE> SWITCH LINK,<0,,LINKIT> SWITCH DEBUG,<0,,SETDEB> SWITCH FORDDT,<0,,FORDDT> SWITCH SAVE,<0,,SAVE> SWITCH SSAVE,<0,,SSAVE> SWITCH LIST,<0,,SETLPT> ;[251] SWITCH L,<0,,SETLPT> ;[251] SWITCH DLIST,<0,,SETDSK> ;[251] SWITCH DL,<0,,SETDSK> ;[251] > SUBTTL RUN UUO IFE RUNSW,< NUNPNT==6 NUNTOP==7 EXTERN .JBDDT,.JBSA,.JBS41,.JBCOR OFFSET==INHERE-74 NUNCOM: IOWD 0,INHERE 0 NUNGO2: CALLI 15,11 ;GET PROPER CORE SIZE JRST NOCOR ;LOSE IN 1,NUNCOM ;GET IT JRST NUNGO3 ;OK NUNERR: CALLI NUNPNT,3 ;WE LOSE, PRINT ERROR CALLI 12 NUNERM: ASCIZ #?LINKAGE ERROR - I/O# NUNGO3: SKIPE 12,OFFSET+.JBCOR ;GET JOBCOR CAMG 12,.JBREL ;AND SEE IF WE SHOULD EXPAND JRST NUNGO4 ;NO, START THE BLT MOVEI NUNPNT,NUNCER CALLI 12,11 ;YES, DO IT JRST NUNERR ;LOSE MOVE 12,OFFSET+.JBS41 ;RESET 41 MOVEM 12,41 JRST NUNGO4 ;WIN NUNCER: ASCIZ /?CORE NEEDED/ INHERE: NUNAC: PHASE 0 ;THE CODE TO GO IN THE ACS NUNGO4: MOVE 12,OFFSET+.JBDDT;SET JOBDDT CALLI 12,2 ;SET JOBDDT NUNBLT: BLT NUNTOP,0 CALLI ;RESET THE WORLD AOS 1,.JBSA ;GET STARTING ADDRESS JRST (1) NUNERM XWD INHERE+1,75 ;THE BLT WORD DEPHASE %RNBLK==NAME-1 > CREFIT: SKIPA T1,[SIXBIT /CREF/] FUDGIT: MOVSI T1,'PIP' NUNDO: MOVSI T2,1 ;START ADDR PLUS ONE RUNIT: MOVEM T1,%RNBLK+1 ;[216] SET FILE NAME SINCE WE HAVE IT IN T1 RESET ;RESET THINGS SETZM %RNBLK+4 ;[277] USE DEFAULT PPN MOVE T1,RUNCOR ;GET CORE ARG (USUALLY 0) MOVEM T1,%RNBLK+5 ;BUT NOT FOR COPY (^D10) IFN RUNSW,< SKIPN T1,PCDEV ;USE SPECIAL DEVICE IF SET MOVSI T1,'SYS' ;GET SYS DEVICE MOVEM T1,%RNBLK ;SET IT IN LOW SEG RUN BLOCK SETZM %RNBLK+2 ;CLEAR EXTENSION - LET MONITOR CHOOSE SETZM %RNBLK+3 ;THIS ALSO (DATE, TIME, ETC) HRRI T2,%RNBLK ;GET LOWSEG ADDRESS OF RUN BLOCK MOVSI T1,1 ;SET TO REMOVE HIGH SEGMENT HRRI T1,%LENTH-1 ;REDUCE LOWSEG FOR SIMILAR REASON MOVE T3,[%RUN1,,%LOREL] ;GET READY TO PHASE CODE INTO LOWSEG BLT T3,%RNBLK-1 ;PERFORM THE TRANSFER MOVEM T2,%RUNT2 ;INCASE OF FAILURE JRST %LOREL ;DO UUO'S IN LOWSEG SINCE HIGH SEG GONE %RUN1: PHASE %LOREL CORE T1, ;ALREADY SET UP IN HIGH SEG JFCL ;DON'T CARE IF IT FAILS %RUN: RUN T2, ;T2 ALREADY SET UP ABOVE HRRZ T1,T2 ;GET ERROR CODE CAIN T1,10 ;NOT ENOUGH CORE ERROR? SKIPN %RNBLK+5 ;ONLY IF TOO MUCH ASKED FOR JRST %RUN2 ;NO, U LOSE SETZM %RNBLK+5 ;USE WHAT WE GET SKIPA T2,%RUNT2 ;RESET T2 %RUNT2: Z ;SET FROM HIGH SEG JRST %RUN ;TRY AGAIN %RUN2: OUTSTR RUNER1 ;WARN USER OF FAILURE IDIVI T1,10 ;[170] MAY BE 2 DIGITS JUMPE T1,LRUN3 ;NO, ONLY ONE [441] use LRUN3 ADDI T1,"0" ;MAKE ASCII OUTCHR T1 ;OUTPUT IT LRUN3: ADDI T2,"0" ;[441] loop out OUTCHR T2 OUTSTR RUNER2 ;REST OF MESSAGE MOVE T2,%RNBLK ;PICK UP DEVICE LRUN4: SETZ T1, ;CLEAR OUT JUNK [441] label LRUN4 LSHC T1,6 ;MOVE LEADING CHARACTER INTO T1 MOVEI T1,40(T1) ;FORM ASCII OUTCHR T1 ;PRINT IT JUMPN T2,LRUN4 ;MORE TO GO [441] use LRUN4 MOVEI T1,":" ;USUAL SEPARATOR OUTCHR T1 MOVE T2,%RNBLK+1 ;FILE NAME LRUN5: SETZ T1, ;[441] label LRUN5 LSHC T1,6 MOVEI T1,40(T1) OUTCHR T1 JUMPN T2,LRUN5 ;[441] use LRUN5 EXIT ;AND GIVE UP RUNER1:! ASCIZ /?CMLRUF RUN UUO failure (/ RUNER2:! ASCIZ /) for / %RNBLK:! ;SIZE OF PHASED CODE FOR BLT %LENTH==%RNBLK+6 ;FOR CORE UUO WHICH INCLUDES RUN BLOCK DEPHASE> IFE RUNSW,< NORUN: INIT 1,16 ;GET A DSK IN DUMP MODE EXP SYSDEV ;SIXBIT SYS OR DSK 0 JRST DSKNA MOVSI T1,SAVEXT ;SIXBIT FOR SAVE OR DMP. MOVEM T1,NAME+1 LOOKUP 1,NAME JRST NOFIL MOVE T1,NAME ;SET NAME OF NEW PROCESSOR CALL T1,[SIXBIT /SETNAM/] HLRO 15,NAME+3 ;GET COUNT HRLM 15,NUNCOM MOVNS 15 ;MAKE POSITIVE MOVEI 16,73(15) ;GET END ADDI 15,INHERE ;CHECK CORE SIZE IORI 15,1777 MOVSI NUNTOP,NUNAC BLT NUNTOP,NUNTOP ;GET ACS LOADER HRR NUNBLT,16 ;AND SET END OF BLT JRST NUNGO2 > SUBTTL SCANNER TERMF==200000 NUMF==100000 SPCF==400000 SPACT==40000 ;SPECIAL ACTION TO BE TAKEN ON CHAR SCANAM: PUSHJ P,SCAN ;GET NEXT CHAR. FIRST GETNAM: SETZM SVNAM(SVPT) ;ZERO OUT CELLS IN CASE NOTHING SETZM SVEXT(SVPT) ;GETS PUT THERE SETZM SVPPN(SVPT) SETZM SWBKS(SVPT) SETZM SVDEV(SVPT) IFN SFDSW, > ;END OF IFN SFDSW GETNM0: TRNE FL,IDF ;[154] WAS THE THING SCANNED AN IDENT JRST GETDEV ;YES, SEE WHAT WE'VE GOT CAIE C,"[" ;MIGHT BE A PPN JRST SYNERP ;NO, LOSE UNLESS A PIP COMMAND PUSHJ P,GETPP1 ;READ THE PPN PUSHJ P,SCAN ;AND GET RID OF "]" SETOM INLFLG ;[305] SET IN-LINE FLAG TRNE FL,PIPF ;[227] IS THIS PIP? TRNE FL,IDF ;[227] YES, IDENTIFIER ALREADY SEEN? JRST GETDEV ;[227] NO POPJ P, ;IT IS, SO RETURN GETDEV: SETOM INLFLG ;[305] SET IN-LINE FLAG PUSH P,ACCUM PUSHJ P,SCANS ;CHECK FOR EXT OR PPN CAIE C,":" ;IS IT A DEVICE NAME JRST NODEV ;NO POP P,T1 ;[260]WE WERE HIDING IT IN THE STACK TRNN FL,F.STKY ;[302] DON'T MAKE STICKY IF FROM SWITCH MOVEM T1,SVDEVV ;[260]REMEMBER FOR 'STICKINESS' MOVEM T1,SVDEV(SVPT) ;[260]SAVE IT AS DEVICE NOW PUSHJ P,SCAN ;BYPASS PUSHJ P,SCANS ;[307] DO LOOK AHEAD SKIPN SAVCHR ;[307] NEXT CHARACTER A BLANK ? POPJ P, ;[307] YES--THAT'S IT, RETURN PUSHJ P,SCAN ;AND GET NEXT CAIN C,"[" ;CHECK FOR PROJ-PROG PUSHJ P,[PUSHJ P,GETPP1 JRST SCAN] ;POPJ RETURN TRNN FL,IDF ;MUST BE AN IDENT POPJ P, ;RETURN, ONLY DEVICE SEEN PUSH P,ACCUM PUSHJ P,SCANS SETZM SVPPP ;CLEAR STICKY PPN ON NEW DEVICE IFN SFDSW,< SETZM SVSFP ;AND STICKY SFD IFG SFDLEN-1,< ;[426] MOVE T1,[SVSFP,,SVSFP+1] BLT T1,SVSFP+SFDLEN-1>> ;[425] NODEV: POP P,SVNAM(SVPT) SKIPN T1,SVDEVV ;[302] IF DEVICE, SKIP JRST NODEV1 ;[302] OTHERWISE, PROCEED TRNN FL,F.STKY ;[302] IF FROM SWITCH, DON'T SAVE MOVEM T1,SVDEV(SVPT) ;[254]ELSE, MAKE DEVICE HAPPEN NODEV1: TRNE FL,F.STKY ;[302] SHOULD PPN STICK ? JRST GOTSTK ;[302] NO--PROCEED IFE SFDSW,< SKIPE T1,SVPPN(SVPT) ;FOUND A NEW STICKY PPN? MOVEM T1,SVPPP ;YES > IFN SFDSW,< SKIPN T1,SVPPN(SVPT) ;STICKY PPN? JRST NOTSTK ;NO MOVEM T1,SVPPP ;YES X== ;INITIAL CONDITION REPEAT SFDLEN,< MOVE T1,SVSFD+X(SVPT) MOVEM T1,SVSFP+Y X==X+NFILE Y==Y+1 > JRST GOTSTK ;DON'T MOVE IT BACK AGAIN NOTSTK: > MOVE T1,SVPPP ;GET STICKY PPN MOVEM T1,SVPPN(SVPT) ;SET PPN INCASE ONE NOT FOLLOWING IFN SFDSW, ;INITIAL CONDITION REPEAT SFDLEN,< MOVE T1,SVSFP+Y MOVEM T1,SVSFD+X(SVPT) X==X+NFILE Y==Y+1> > GOTSTK: ;[313] CAIN C,"[" ;IS IT PPN JRST GETPP CAIE C,"." ;NO, EXT? POPJ P, ;NEITHER, RETURN PUSHJ P,SCAN ;NO. GO OVER DOT PUSHJ P,SCANS ;PEEK AT NEXT CHAR SKIPG SAVCHR ;ALPHANUMERIC? JRST GETN1 ;NO. IT MAY BE A STAR IN PIP MODE GETN2: PUSHJ P,SCAN ;GET EXT TRNN FL,IDF GOTO SYNERR MOVE T1,ACCUM HLLZM T1,SVEXT(SVPT) GETN3: PUSHJ P,SCANS ;[201] FIND DELIMITER CAIE C,"[" ;CHECK FOR PPN AGAIN POPJ P, JRST GETPP ;READ PROG-PROG PAIR GETN1: TRNE FL,PIPF ;PIP MODE? CAIE C,52 ;YES. ASTERISK? TROA FL,IDF ;[201] SIMULATE IDENTIFIER SEEN JRST GETN2 ;WILD EXTENSION. GO GET IT. HLLOS SVEXT(SVPT) ;MARK NULL EXT WITH -1 PJRST GETN3 ;[201] ALLOW PPN AFTER . GETPP: PUSHJ P,SCAN GETPP1: PUSHJ P,SCAN SETZM SVPPN(SVPT) ;INCASE NOT FIRST TIME IN IFN SFDSW,< X==0 ;INITIAL CONDITION REPEAT SFDLEN,< SETZM SVSFD+X(SVPT) X==X+NFILE >> TRNN FL,IDF JRST [SKIPN T1,MYPPN ;ALLOW [,,] PUSHJ P,USRPPN ;NOT GOT IT YET HLLZM T1,SVPPN(SVPT) CAIE C,"-" ;[601] MIGHT IT BE [-]? JRST GETPP2 ;[601] NO, CONTINUE WITH [,,] CASE PUSHJ P,SCAN ;[601] YES, SKIP PAST THE "-" SETOM PTHBLK ;[601] SETUP TO READ DEFAULT PATH MOVE T1,[.PTPPN+SFDLEN,,PTHBLK] PATH. T1, ;[601] FETCH IT JRST GETPP3 ;[601] NON-SFD MONITOR? TRY FOR END. MOVE T1,PTHBLK+.PTPPN ;[601] GET PTHPPN MOVEM T1,SVPPN(SVPT) ;[601] SAVE IFN SFDSW,< X==0 ;[601] FIRST SFD .X==0 ;[601] MONITOR'S FIRST SFD REPEAT SFDLEN,< MOVE T1,PTHBLK+.PTSFD+.X ;[601] GET NEXT SFD TO STORE MOVEM T1,SVSFD+X(SVPT) ;[601] SAVE AWAY X==X+NFILE .X==.X+1 ;[601] ADVANCE POINTERS > ;[601] END REPEAT SFDLEN > ;[601] END IFN SFDSW JRST GETPP3] ;[601] LOOK FOR END OF PATH MOVE T1,ACCUM PUSHJ P,RJUST ;THIS NEED TO BE RIGHT JUSTIFIED HRLM T1,SVPPN(SVPT) ;STORE LEFT HALF PUSHJ P,SCAN GETPP2: CAIE C,"," GOTO SYNERR PUSHJ P,SCAN TRNN FL,IDF JRST [SKIPN T1,MYPPN PUSHJ P,USRPPN ;GET USERS PPN VIA UUO HRRM T1,SVPPN(SVPT) JRST GETPP3] MOVE T1,ACCUM PUSHJ P,RJUST HRRM T1,SVPPN(SVPT) PUSHJ P,SCAN GETPP3: SETZM ACCUM ;[227] CLEAR JUNK CAIN C,"]" POPJ P, ;ALL DONE IFN SFDSW,< CAIE C,"," ;COMMA MEANS SFD COMING JRST ENDSFD ;NO, ALL OVER HRRZ T2,SVPT ;STORAGE POINTER IN RIGHT HRLI T2,-SFDLEN ;AOBJN WORD FOR ALL SFD'S GETSFD: PUSHJ P,SCAN ;GET SOMETHING TRNN FL,IDF ;[572] MUST SEE IDENTIFIER HERE JRST SFDER2 ;[572] NO, GIVE SFD ERROR AND ABORT MOVE T1,ACCUM ;GET WHAT WAS SEEN MOVEM T1,SVSFD(T2) ;STORE IT PUSHJ P,SCAN ;GET NEXT CHAR CAIN C,"]" ;END OF PPN JRST GETPP3 ;[227] YES, BUT CLEAR ACCUM CAIE C,"," ;MORE TO COME JRST ENDSFD ;NO ADDI T2,NFILE-1 ;ADD DIFFERENCE OVER FILE AOBJN T2,GETSFD ;MORE TO COME GOTO SFDERR ;YES, BUT YOU LOSE ENDSFD: ;END OF IFN SFDSW > TLNN CS,TERMF ;END OF LINE? GOTO SYNERR ;NO MOVEI C,"]" ;FAKE CLOSING BRACKET MOVEM CS,SAVCHR ;SEE TRMF NEXT TIME POPJ P, ;RETURN USRPPN: GETPPN T1, ;GET USER'S LOGGED IN PPN JFCL ;INCASE JACCT ON MOVEM T1,MYPPN ;SAVE IT POPJ P, IFN STANSW,< RJUST: TRNE T1,77 POPJ P, ;GET IT OVER THERE LSH T1,-6 JRST RJUST > IFE STANSW,< RJUST: PUSH P,T3 MOVE T3,T1 ;CONVERT SIXBIT TO OCTAL MOVEI T1,0 CONVOC: MOVEI T2,0 LSHC T2,6 CAIL T2,20 CAILE T2,27 GOTO SYNERR LSH T1,3 IORI T1,-20(T2) JUMPN T3,CONVOC POP P,T3 POPJ P,0 > SCANS: MOVNI T1,1 ;FLAG AS NOTHING SEEN YET SKIPN CS,SAVCHR ;CHARACTER WAITING? SCNS2: PUSHJ P,GETCH JUMPN CS,SCNS1 ;FOUND SOMETHING CAMN T1,[-1] ;[434] FOUND A SPECIAL CHARACTER? JRST SCNS2 ;NO, LOOP BACK SCNS1: JUMPL CS,SCNS4 ;SPECIAL CHARACTER MOVEM CS,SAVCHR ;SAVE THAT CHARACTER JUMPL T1,SCNS3 ;DO NOTHING ELSE IF NO BLANKS SEEN MOVEM T1,SAVCHR ;IF BLANKS SEEN, SAVE ONE MOVSI T1,70000 ADDM T1,@GETB3(IOPNT) ;AND BACK UP POINTER AOS @GETB1(IOPNT) ;[232] ALSO BACKUP COUNT SCNS3: TDZA CS,CS ;IN EITHER CASE, RETURN 0 SCNS4: MOVEM CS,SAVCHR ;SAVE SPECIAL CHARACTER HRRZ C,CS ;GET A CHARACTER TO RETURN POPJ P, SCAN: TRZ FL,IDF ;RESET IN CASE NOT SKIPN CS,SAVCHR ;WAS THERE SOMETHING LEFT OVER CONSN: PUSHJ P,GETCH ;NO, GET ANOTHER JUMPE CS,CONSN ;IGNORE BLANKS [441] and loop JUMPL CS,SPCHR ;IS IT A SPECIAL CHARACTER SETZM ACCUM ;PREPARE TO STORE IT MOVE T1,[POINT 6,ACCUM] SCAN1: TLNE T1,770000 ;ALL SIX STORED? IDPB CS,T1 ;NO, STORE ANOTHER PUSHJ P,GETCH ;GET NEXT JUMPG CS,SCAN1 ;ANOTHER ALPHA CAIN C,"*" ;[271] DID WE STOP ON A "*"? TRNN FL,PIPF ;[271] YES, IS THIS PIP MODE? JRST SCAN2 ;[271] NO, STOP THE SCAN MOVEI CS,'*' ;[271] YES, "*" IS JUST ANOTHER CHAR JRST SCAN1 ;[271] SO GO STORE IT AWAY SCAN2: TRO FL,IDF ;[271] IT SURE IS MOVEM CS,SAVCHR SETZB C,CS ;TO AVOID CONFUSION POPJ P, SPCHR: HRRZ C,CS ;RETURN HIM THE HALF OF IT SETZM SAVCHR ;NOTHING SAVED BY NOW CAIN C,"*" TRNN FL,PIPF JRST SPCHR1 PUSH P,[SIXBIT /*/] ;IN PIP MODE * IS AN IDENT POP P,ACCUM TROA FL,IDF SPCHR1: TLNN CS,SPACT ;DO WE WANT SPECIAL ACTION? POPJ P, ;NO JRST (CS) ;YES, RH IS DISPATCH ;GETCH RETURNS 7-BIT ASCII CHAR IN C, TABLE ENTRY IN CS GETCH: SOSLE @GETB1(IOPNT) ;USE CORRECT BUFFER HEADER JRST OKPICK SKIPGE C,TMPFLG(IOPNT) ;IS TMPCOR BEING USED ;SET TO -1 IF YES AOJE C,POPFL1 ;YES FINISHED WITH THIS READ XCT GETB2(IOPNT) ;AN IN UUO JRST OKPICK XCT GETB4(IOPNT) ;TO A STATZ JRST READER ;AN INPUT ERROR JRST POPFIL ;GO GET PREVIOUS FILE OKPICK: IBP @GETB3(IOPNT) MOVE C,@GETB3(IOPNT) ;PICK UP THE NEW BYTE POINTER MOVE CS,(C) ;GET THE WORD IT CAME FROM TRNE CS,1 ;AND CHECK FOR SEQ NUM JRST [AOS @GETB3(IOPNT) ;ADVANCE POINTER MOVNI CS,5 ;AND ADJUST COUNT ADDB CS,@GETB1(IOPNT) SKIPG CS ;CHECK FOR BUFFER OVERRUN PUSHJ P,GETCH ;GET RID OF TAB JRST GETCH] LDB C,@GETB3(IOPNT) JUMPE C,GETCH ;IGNORE NULLS CAIN C,";" ;IS IT A COMMENT? TRNE FL,INPRNT ;IN PRINTING ERROR JRST EOFRT ;YES, DONT PROCESS ";" SEMIC: TRO FL,INPRNT ;HACK SO THAT "@" COME HERE PUSHJ P,GETCH ;READ CHRS MOVE CS,CTBL(C) ;GET STATUS TLNN CS,TERMF ;END OF LINE? JRST SEMIC ;NO, KEEP GOING TRZ FL,INPRNT ;CLEAR FLAG AGAIN EOFRT: MOVE CS,CTBL(C) ;GET STATUS BITS EOFRT1: TRNN FL,INPRNT ;IF PRINTING ERROR, DO NOT NEST CAIE C,100 ;IS IT @ POPJ P, JRST NEST ;SPECIAL XALL ;BACK TO NORMAL LISTING CTBL: 0 REPEAT 6,< XWD SPCF,.-CTBL> ;[261] XWD SPCF!SPACT!TERMF+7,CHKTRM ;[261]BELL XWD SPCF,.-CTBL ;[261] 0 ;TAB XWD SPCF!SPACT!TERMF+12,CHKTRM ;LF XWD SPCF!SPACT!TERMF+13,CHKTRM ;VTAB XWD SPCF!SPACT!TERMF+14,CHKTRM ;FORM 0 ;CARRET REPEAT 14,< XWD SPCF,.-CTBL> ;[261] XWD SPCF!TERMF!SPACT+32,CHKTRM ;[261]SUB XWD SPCF!TERMF!SPACT+44,CHKTRM REPEAT 4,< XWD SPCF,.-CTBL> 0 ;SPACE REPEAT 17,< XWD SPCF,.-CTBL> REPEAT 12,< XWD NUMF,.-CTBL-40 ;DIGIT> REPEAT 5,< XWD SPCF,.-CTBL> EXP .-CTBL-40 ;? XWD SPCF,100 REPEAT 32,< EXP .-CTBL-40 ;UPPER CASE LETTERS> REPEAT 6,< XWD SPCF,.-CTBL> REPEAT 32,< EXP .-CTBL-100 ;LOWER CASE LETTERS> XWD SPCF,.-CTBL XWD SPCF,.-CTBL XWD SPCF!TERMF!SPACT+44,CHKTRM XWD SPCF!TERMF!SPACT+44,CHKTRM XWD SPCF!SPACT,POPFIL COMMA==CTBL+"," CHKTRM: PUSH P,CS ;SAVE MAGIC BITS TERMC1: PUSHJ P,GETCH JUMPE CS,TERMC1 ;ALSO IGNORE TABS AND SPACES TLNE CS,TERMF JRST TERMC1 ;BYPASS TERMINATORS CAMN CS,COMMA ;CHECK FOR , AFTER CRET JRST [POP P,(P) ;GET STACK IN SYNC POPJ P,] ;RETURN THE COMMA MOVEM CS,SAVCHR ;SAVE FOR LATER POP P,CS MOVEI C,0 ;AS GOOD AS ANYTHING ELSE POPJ P, DEFINE QQ< N==1 REPEAT NESTDP,> GETB1: DINCT DEFINE MAC(X) QQ GETB2: HALT DEFINE MAC(X) QQ GETB3: DINPT DEFINE MAC(X) QQ GETB4: HALT DEFINE MAC(X) QQ SUBTTL COMMAND NESTING NEST: PUSH P,T1 ;[577] SAVE TEMP AC PUSH P,ACCUM ;SAVE STATE OF SCANNER PUSH P,FL ;SAVE THE FLAGS (AS IDF?) SETZM FAKEOL ;[305] CLEAR FAKE EOL FLAG SETOM INLFLG ;[305] SET IN-LINE FLAG SETZM SAVCHR PUSH P,NAME ;AND THIS OTHER STUFF PUSH P,NAME+1 PUSH P,NAME+2 PUSH P,NAME+3 AOBJP SVPT,TMNER ;GET A CLEAR SPACE FOR NAME TRO FL,F.STKY ;[302] SET FLAG FOR NO STICKINESS PUSHJ P,SCANAM ;GET ONE TO USE TRZ FL,F.STKY ;[302] CLEAR FLAG PUSH IOP,SAVCHR PUSHJ P,CHKRM ;GET BUFFER SPACE AOBJP IOPNT,NESTTD ;TOO DEEP? MOVS C,SVDEV(SVPT) ;[226] GET DEVICE MOVSM C,OPENB+1 ;[226] STORE DEV OR 0 CAIN C,'TMP' ;[226] TEST FOR TMPCOR JRST [MOVSS C ;[253] GET IN PLACE FOR DEVCHR DEVCHR C, ;[226] BUT NOT IF A REAL DEVICE JUMPN C,NSTDV1 ;[226] IT REALLY EXISTS JRST LNST1] ;[226] TRY TMPCOR ONLY [441] use LNST1 JUMPN C,NSTDV1 ;[243] DEVICE SPECIFIED LNST1: MOVE C,.JBFF ;GET START OF BUFFER [441] label LNST1 MOVEM C,BUFTAB(IOPNT) ;SAVE IT FOR RELEASING INFO MOVEM C,TMPFIL+1 ;SAVE IOWD FOR TMPCOR UUO MOVEM C,@GETB3(IOPNT) ;DUMMY UP BYTE POINTER SOS TMPFIL+1 ;MAKE TMPFIL INTO CORRECT IOWD FORMAT MOVNI C,200 ;GET BUFFER LENGTH HRLM C,TMPFIL+1 ;STORE NEGATIVE WORD COUNT MOVE C,SVNAM(SVPT) ;PICK UP FILNAM SKIPE OPENB+1 ;[226] SPECIAL IF TMP: JRST [HLLZM C,TMPFIL ;[226] 3 CHARS ONLY JRST ISTMP1] ;[226] TRY TMPUUO XOR C,JOBNAM ;ONLY ALLOW TMPCOR IF CURRENT JOB NUMBER TLNE C,-1 ;OTHERWISE WE MIGHT READ XXXPIP ETC JRST NOTMP ;NOT A VALID TMPCOR FILE NAME HRLZM C,TMPFIL ;STORE RIGHT THREE LETTERS ISTMP1: MOVE C,[XWD 1,TMPFIL] ;SET UP FOR TMPCOR READ TMPCOR C, ;READ FILE AND DON'T DELETE JRST [SKIPN OPENB+1 ;[226] FAILED, TMP: ONLY? JRST NOTMP ;[226] NO SUCH FILE, TRY THE DISK MOVE C,SVNAM(SVPT) ;[226] GET FILE NAME HLLZM C,LNAM ;[226] FOR ERROR MESSAGE SETZM LEXT ;[226] JRST NOFIL] ;[226] FILE NOT THERE SETOM TMPFLG(IOPNT) ;FLAG THAT TMPCOR READ WAS DONE IMULI C,5 ;CALCULATE CHARACTER COUNT MOVEM C,@GETB1(IOPNT) ;STORE IN BUFFER HEADER MOVEI C,440700 ;SET UP BYTE POINTER HRLM C,@GETB3(IOPNT) ;BUFFER HEADER FINALLY SET UP JRST NEXT2 ;CONTINUE INTO MAIN STREAM NOTMP: MOVSI C,'DSK' NSTDEV: MOVEM C,OPENB+1 ;[226] NSTDV1: SETZM OPENB ;[226] MOVE C,NESTB(IOPNT) ;GET BUFFER POINTER MOVEM C,OPENB+2 MOVE C,[OPEN .-.,OPENB] DPB IOPNT,[POINT 4,C,12] XCT C JRST [MOVE C,OPENB+1 ;[226] GET DEVICE MOVEM C,LOKNAM ;[226] INCASE IT DOESN'T EXIST DEVCHR C, ;[226] SEE IF IT DOES JUMPE C,DEVNA ;[226] NO JRST DSKNA] ;[226] MUST BE SOMETHING ELSE MOVE C,.JBFF MOVEM C,BUFTAB(IOPNT) ;SAVE THE PLACE PUT XCT INTAB(IOPNT) ;DO AN INBUFF MOVE C,SVNAM(SVPT) MOVEM C,LNAM ;SET UP FOR LOOKUP SKIPN C,SVEXT(SVPT) JUMPE C,NEST1 ;NOT EXT SUPPLIED TRZA C,-1 ;INCASE NULL SUPPLIED NEST1: MOVSI C,'CMD' ;TRY .CMD MOVEM C,LEXT NEST1A: MOVE C,SVPPN(SVPT) IFN SFDSW,< SKIPE SVSFD(SVPT) ;ANY SFD'S SEEN? PUSHJ P,SETSFD ;YES, SET PATH > MOVEM C,LPPN XCT LKTAB(IOPNT) JRST [TRNE FL,INCRF ;SPECIAL IF TRYING TO READ QQCREF JRST DNCRF HLLZ C,LEXT ;SEE IF BLANK USED JUMPE C,NOFIL ;[225] NO, NOT THERE SETZM LEXT ;[225] TRY NULL EXT JRST NEST1A] ;[225] NEXT2: SUB SVPT,[XWD 1,1] ;GET HIM POINTED BACK RIGHT POP P,NAME+3 ;RESTORE THINGS POP P,NAME+2 POP P,NAME+1 POP P,NAME POP P,FL POP P,ACCUM TRZ FL,RECALF ;WE HAVE DONE THE FIND SETZM INLFLG ;[305] CLEAR IN-LINE FLAG PUSHJ P,CHKTRM ;[567] EAT ANY TERMINATORS MOVE T1,SAVCHR ;[604] GET PREVIOUS CHARACTER AND BITS TLNE T1,TERMF ;[604] LAST CHARACTER A LINE TERMINATOR? CAME CS,COMMA ;[604] AND COMMA AT START OF NEW LINE? SKIPA T1,[70000,,] ;[604] RE-EAT CHARACTER JRST NEXT2A ;[604] ELSE IGNORE LEADING COMMA ADDM T1,@GETB3(IOPNT);[567] AND BACK UP BYTE POINTER AOS @GETB1(IOPNT) ;[567] ALSO BACKUP COUNT NEXT2A: SETZB CS,SAVCHR ;[567] DON'T SAVE ANY CHARS MOVEI C," " ;[567] SUPPLY A FREE BLANK SO COM@FOO WORKS POP P,T1 ;[577] RESTORE TEMP AC POPJ P, ;BYPASS GETCH AND RETURN BLANK TO CALLER IFN SFDSW,< SETSFD: MOVEM C,LSFDPP ;STORE PPN X== REPEAT SFDLEN,< MOVE C,SVSFD+X(SVPT) MOVEM C,LSFD+Y X==X+NFILE Y==Y+1 > MOVEI C,LSFDAD ;TO STORE SFD BLOCK IN LPPN POPJ P, ;RETURN > POPFIL: ;TEMP FIX FOR PIP FUNCTION PROBLEM WITH SCANNER ;SCANNING TO FAR AND ENDING UP AT POPFIL ;THIS CURES SYMPTOMS NOT THE DESEASE TRNN IOPNT,-1 ;ALREADY AT TOP LEVEL? TRNN FL,PIPF ;YES, BUT IS IT PIP? CAIA ;NO JRST [MOVEI C,12 ;YES, FAKE A LF MOVE CS,CTBL(C) SETOM FAKEOL ;[305] SET FAKE EOL FLAG POPJ P,] ;AND RETURN IT ;END OF "FIX" TRNN FL,INCRF ;[427] DOING CREF? JRST POPFL0 ;[427] NO, SKIP THIS MOVE T2,[RENAME 0,0] ;[427] GET RENAME INSTRUCTION LDB T1,[POINT 4,RELTAB(IOPNT),12] ;[427] GET CHANNEL NUMBER JUMPE T1,POPFL0 ;[427] CAREFUL OF CHANNEL ZERO DPB T1,[POINT 4,T2,12] ;[427] PUT CHANNEL IN SETZM LNAM ;[427] CLEAR NAME SETZM LEXT ;[427] '' EXT SETZM LDAT ;[427] '' DATE SETZM LPPN ;[427] '' PPN HRRI T2,NAME ;[427] FINISH SET UP XCT T2 ;[427] DO THE RENAME(DELETE) OUTSTR [ASCIZ/%CMLNDC -- Could not Delete CREF temp file /] POPFL0: XCT RELTAB(IOPNT) ;RELEASE HIM POPFL1: SETZM TMPFLG(IOPNT) ;CLEAR TMPCOR FLAG MOVE C,BUFTAB(IOPNT) MOVEM C,FREBUF(IOPNT) ;MARK BUFFER FREE POP IOP,CS HRRZ C,CS SUB IOPNT,[XWD 1,1] ;POINT IT BACK JRST EOFRT1 ;AND GIVE BACK THE CHARACTER SALL NESTB: 0 DEFINE MAC(X) QQ DEFINE MAC(X) QQ U(TMPFLG,NESTDP+2) INTAB: HALT ;INBUFS DEFINE MAC(X) QQ LKTAB: HALT DEFINE MAC(X) QQ RELTAB: JRST ALLDON DEFINE MAC(X) QQ SUBTTL ERROR ROUTINES IFDEF SALL, ;MAKE LISTING NEATER ETMS: STRING [ASCIZ /?CMLTMS Too many switches/] ERRCOM: OUTSTR [ASCIZ / detected before: /] ;[435] TELL USER WHAT THE STORY IS MOVEI T1,20 ;SET TO TYPE SOME CHRS TO TELL WHERE ERROR MOVE T2,[POINT 7,ERRBUF] ;IS FROM TRO FL,INPRNT ;IN CASE EOF WHILE READING CHRS TO TYPE TRZ FL,PIPF ;[305] CLEAR PIP FLAG SKIPN C,SAVCHR ;FIND THE ONE LEFT JRST PUTER TLNE C,SPACT ;IS IT SPECIAL JRST NOFIL0 ;YES, GIVE UP AT END OF LINE SKIP 1 PUTER: PUSHJ P,GETCH CAIN C,177 ;THIS IS EOF JRST NOFIL0 TRNE C,400000 ;[435] IS THIS A BREAK CHARACTER? JRST NOFIL0 ;[435] STOP TYPING CHARACTERS IDPB C,T2 SOJGE T1,PUTER NOFIL0: MOVE T1,T2 JRST NOFIL1 ;PRINT WITH CR/LF TMNER: STRING [ASCIZ .?CMLTMN Too many names.] JRST ERRCOM DSKNA: STRING [ASCIZ .?CMLDNA Disk not available.] JRST ERRCOM OUTER: STRING [ASCIZ .?CMLOPE Output error.] JRST ERRCOM PROCON: STRING [ASCIZ .?CMLLPC Language processor conflict.] JRST ERRCOM NOCOR: STRING [ASCIZ .?CMLNEC Not enough core.] JRST ERRCOM READER: STRING [ASCIZ .?CMLIPE Input error.] JRST ERRCOM SYNRR1: SUB IOPNT,[XWD 1,1] ;GET HIM BACK TO RIGHT PLACE SYNRR2: STRING [ASCIZ .?CMLNPC No previous command.] ;[204] JRST ABORT ;[204] EXIT SYNERR: STRING [ASCIZ .?CMLCME Command error.] JRST ERRCOM NESTTD: STRING [ASCIZ .?CMLNTD Nesting too deep.] JRST ERRCOM AMBIGU: STRING [ASCIZ .?CMLAMB Ambiguous abbreviation: .] SKIP 1 UNRECS: STRING [ASCIZ .?CMLURS Unrecognizable switch: .] MOVE T3,ACCUM ;BAD SWITCH IN HERE JRST ERRBF1 XPDERR: STRING [ASCIZ .?CMLEDR Explicit device required .] JRST ABORT ;"22A-160" LLCERR: STRING [ASCIZ .?CMLLLC LINK-10/LOADER conflict.] JRST ERRCOM IPCERR: STRING [ASCIZ .?CMLIPC Illegal protection code: .] ;[231] MOVE T3,ACCUM ;[231] BAD CODE JRST ERRBF1 ;[231] LIST IT RLFERR: STRING [ASCIZ .?CMLRLF Problem with REL file and /REL was specified.] JRST ABORT ;[462] DIE GRACEFULLY RLFER1: STRING [ASCIZ .?CMLRLS Problem with REL file and no source specified.] JRST ABORT ;[462] DIE GRACEFULLY SAVERR: STRING [ASCIZ .?CMLNFS No file on SAVE or SSAVE.] ;[256] JRST ABORT ;[256] SAVER2: STRING [ASCIZ .?CMLASF Ambiguous /SAVE or /SSAVE usage on files.] JRST ABORT ;[444] THIS IS ON USING THE SWITCH TWICE NOSRCS: STRING [ASCIZ .?CMLMSF Must have source files for "+" contruction.] JRST ABORT ;[565] NOFIL: TRNN FL,RECALF ;WE WERE LOOKING UP A SVC FILE JRST FIU ;[266]YES, TELL OF ERROR JRST SYNRR1 ;NO, SO GIVE SPECIAL MESSAGE NAMCOM: MOVE 1,[POINT 7,ERRBUF] MOVE T3,NAME PUSHJ P,SIXOUT HLLZ T3,NAME+1 JUMPE T3,NOFIL1 MOVEI T2,"." IDPB T2,T1 NOFIL2: PUSHJ P,SIXOUT NOFIL1: MOVEI T2,0 IDPB T2,T1 STRING ERRBUF ABORT: CLRBFI ;CLEAR INPUT BUFFER SO GARBAGE IS NOT READ RESET DOEND: SETZB 0,.JBSA ;SO START FAILS EXIT 1, JRST .-1 ;IN CASE SOME IDIOT TYPES CONTINUE SIXOUT: MOVEI T2,0 LSHC T2,6 ADDI T2,40 IDPB T2,T1 JUMPN T3,SIXOUT POPJ P, DEVNA: STRING [ASCIZ .?CMLDVA Device not available - .] MOVE T3,LOKNAM ERRBF1: MOVE T1,[POINT 7,ERRBUF] JRST NOFIL2 SYNERP: SKIPN INLFLG ;[305] ARE WE AT BEGINNING OF LINE ? SKIPE FAKEOL ;[305] AND IS THIS A REAL TERMINATOR ? JRST ERP1 ;[305] NO--PROCEED TLNE CS,TERMF ;[305] YES--IS THIS A LINE TERMINATOR ? JRST SCNAGN ;[300] YES--TRY FOR IDENTIFIER AGAIN ERP1: TRNN FL,PIPF ;A PIP COMMAND? GOTO SYNERR ;NO, YOU LOSE CAIN C,"[" ;START OF PPN? JRST GETPP1 ;YES, AND PROBABLY NO DEVICE SETZM FAKEOL ;[305] CLEAR FAKE EOL FLAG POPJ P, ;RETURN AND HOPE IT MAKES SENSE SCNAGN: PUSHJ P,SCAN ;[300] LOOK FOR AN IDENTIFIER JRST GETNM0 ;[300] AND TRY AGAIN UNKERR: STRING [ASCIZ /?CMLUNC Unknown command: /] MOVE T3,ACCUM ;GET IT JRST ERRBF1 ;OUTPUT IT IFN SFDSW,< SFDERR: STRING [ASCIZ /?CMLLRE /] STRING @ERRTAB+25 ;SFD PATH TOO LONG JRST ERRCOM SFDER2: STRING [ASCIZ .?CMLISS Illegal SFD specification.] ;[572] CAIE C,"," CAIN C,"]" MOVEM CS,SAVCHR JRST ERRCOM > FIU: STRING [ASCIZ /?CMLLRE /] HRRZ T1,LEXT ;GET ERROR CODE CAIL T1,TABLND-ERRTAB ;SEE IF LEGAL SKIPA T1,TABLND ;NO USE CATCHALL MESSAGE MOVE T1,ERRTAB(T1) ;GET ADDRESS OF MESSAGE STRING (T1) ;OUTPUT IT JRST NAMCOM ERRTAB: [ASCIZ /(0) file was not found - /] [ASCIZ /(1) no directory for project-programmer number - /] [ASCIZ /(2) protection failure - /] [ASCIZ /(3) file was being modified - /] [ASCIZ /(4) rename file name already exists - /] [ASCIZ /(5) illegal sequence of UUOs - /] [ASCIZ /(6) bad UFD or bad RIB - /] [ASCIZ /(7) not a SAV file - /] [ASCIZ /(10) not enough core - /] [ASCIZ /(11) device not available - /] [ASCIZ /(12) no such device - /] [ASCIZ /(13) not two reloc reg. capability - /] [ASCIZ /(14) no room or quota exceeded - /] [ASCIZ /(15) write lock error - /] [ASCIZ /(16) not enough monitor table space - /] [ASCIZ /(17) partial allocation only - /] [ASCIZ /(20) block not free on allocation - /] [ASCIZ /(21) can't supersede (enter) an existing directory - /] [ASCIZ /(22) can't delete (rename) a non-empty directory - /] [ASCIZ /(23) SFD not found - /] [ASCIZ /(24) search list empty - /] [ASCIZ /(25) SFD nested too deeply - /] [ASCIZ /(26) no-create on for specified SFD path - /] TABLND: [ASCIZ /(?) lookup,enter,or rename error - /] SUBTTL ALL DONE ALLDON: TRNE FL,INCRF ;JUST FOUND END OF QQCREF FILE JRST DNCRF SKIPE FDGFLG ;WRITING A FUDGE FILE? PUSHJ P,DNFUDG ;YES, CLOSE IT TRNE FL,INPRNT JRST NOFIL0 ;IF PRINTENG AND EOF THEN FIINSH UP HRRZ T1,(P) ;GET THE ADDRESS WE WANT TO RETURN TO CAIE T1,NXFIL1 ;THIS SHOULD BE HERE GOTO SYNERR ;ELSE ERROR SETZM PCNAM ;NO LINK NAME TO START WITH SETZM PCDEV ;AND DEVICE MOVEI T3,CHNLNK ;START WITH LINK TRNN FL,DOLOD ;ARE WE LOADING? JRST ALDN1 ;NO SKIPN T2,EXECFL ;WANT EXECUTION? JRST ALDN0 ;NO [441] use ALDN0 PUSHJ P,OUTSIX ;YES, /E PUSHJ P,OUTSPC ;NEEDS SEPARATOR ALDN0: SKIPN T2,MAPSW ;SKIP IF MAP REQUIRED [441] label ALDN0 MOVSI T2,'/G ' ;SET UP FOR TERMINATE LOADING PUSHJ P,OUTSIX ;YES, PUT IT OUT PUSHJ P,OUCRLF ;YES, BUG IN SCAN REQUIRES EOL MARKER HLLZ T1,LODDEV ;LOADER RUN DEV: IN SPECIAL PLACE HLLM T1,TMPCHN(T3) ;WHERE IT AUGHT TO BE ALDN1: SKIPN TMPCHN(T3) ;HAS THAT PROCESSOR BEEN SET UP FOR OUTPUT? SOJGE T3,ALDN1 ;NO, TRY NEXT (BUT NOT TOO MANY) JUMPL T3,DONE ;IF OUT OF PROCESSORS THEN DONE SKIPN PCNAM ;IS THERE A PROCESSOR FOR IT TO CALL? JRST NONAM ;NO SKIPN T1,PRCFLG(T3) ;[463] ARE THERE ANY FLAGS FOR THIS PROC JRST NOTSCN ;[463] NONE, DO THE BANG PROCESSING BY DEFAULT TLNN T1,SCANCH ;[463] DOES THIS PROCESS USE SCAN CHAINING? JRST NOTSCN ;[463] NOPE, USE OLD STYLE BANG STUFF MOVE T2,['/RUN: '] ;AS IT USES SCAN PUSHJ P,OUTSIX SKIPE T2,PCDEV ;USE DEVICE IF GIVEN PUSHJ P,OUTDEV MOVE T2,PCNAM ;NAME WE WANT TO RUN PUSHJ P,OUTSIX PUSHJ P,OUCRLF JRST NONAM NOTSCN: SKIPE T2,PCDEV ;GET DEVICE IF GIVEN PUSHJ P,OUTDEV MOVE T2,PCNAM ;RECOVER NAME OF PROCESSOR PUSHJ P,OUTSIX ;YES, PUT OUT ITS NAME MOVEI T1,"!" ;AND THE LOAD SYMBOL PUSHJ P,TMPOUT PUSHJ P,OUCRLF NONAM: PUSHJ P,TMPCHK ;CLOSE IT CAIN T3,CHNLNK ;[443] IS THIS LINK-10? SKIPA T1,PROCTB(T3) ;[443] YES, ITS SPECIAL MOVE T1,PRCNAM(T3) ;[443] NO, SO GET THE PROCESSOR NAME IFN FORTRAN,< ;WE HAVE A CHOICE OF FORTRAN COMPILERS CAIE T3,CHNFOR ;BUT ONLY IF THIS IS FORTRAN JRST LNFTN ;[441] NOT SKIPE FORPRC ;USE DEFAULT MOVE T1,FORPRC ;USE WHATEVER IS SET LNFTN: > ;[324] WE HAVE A CHOICE OF COBOL COMPILERS CAIE T3,CHNCBL ;[324] BUT ONLY IF THIS IS COBOL JRST LNTCB ;[441] NOT SKIPE COBPRC ;[324] USE DEFAULT MOVE T1,COBPRC ;[324] USE WHATEVER IS SET LNTCB: ;[441] not cobol MOVEM T1,PCNAM ;AND SET AS THE ONE TO LINK TO NOPDEV: SOJGE T3,ALDN1 ;GO BACK IF MORE TO LOOK AT DONE: TRNE FL,CMDSN ;DID WE SEE COMMAND FROM TTY? JRST DONE1 ;NO, DO NOT WRITE FILE MOVE T1,JOBNAM HRRI T1,'SVC' TRNE FL,EDITF HRRI T1,'EDS' MOVEM T1,LNAM ;SET UP OUTPUT FILE HRLZM T1,TMPFIL ;SAVE NAME IN TMPFIL MOVE T1,TTYPT ;GET BYTE POINTER MOVNI T2,4 ;SET UP FOR CHARACTER COUNT LDN1: ILDB T3,T1 ;GET NEXT CHARACTER CAIE T3,177 ;IS IT A EOF CHARACTER SOJA T2,LDN1 ;[441] NO, JUMP BACK TO TRY AGAIN IDIVI T2,5 ;CALCULATE CHARACTER COUNT HRLM T2,TMPFIL+1 ;STORE IN TMPCOR OUTPUT BLOCK LDB T3,[POINT 6,T1,5] ;PICK UP BIT POS OF LAST CHAR SETO T2, ;PREPARE TO BUILD MASK LSH T2,7(T3) ;MASK OFF REST OF LAST WORD ANDM T2,(T1) ;IN TTY BUFFER HRRZ T2,TTYPT ;GET START OF BUFFER SUBI T2,1 ;FOR IOWD HRRM T2,TMPFIL+1 ;STORE IN WRITE BLOCK FOR TMPCOR UUO MOVE T2,[XWD 3,TMPFIL] ;SET UP FOR WRITE TMPCOR T2, ;WRITE OUT FILE INTO CORE JRST NOFIT ;IT DID NOT FIT, TRY DISK JRST DONE1 ;GO CLEAN UP AND LEAVE NOFIT: MOVE T1,TMPFIL+1 ;GET IOWD MOVEM T1,TMPFIL ;TO FIRST WORD OF PAIR SETZM TMPFIL+1 ;ZERO SECOND WORD MOVSI T1,'TMP' MOVEM T1,LEXT SETZM LDAT SETZM LPPN CLOSE LOOK,20 ;MAKE SURE NOTHING USING THIS CHANEL IFE FASTFS,< SKIPN FSNAME ;IS F/S FOUND PUSHJ P,FNDFST ;NO FIND IT> RELEAS LOOK,0 ;GIVE UP THE CHANNEL MOVEI T1,16 ;DUMP MODE MOVEM T1,FSINIT ;INCASE NOT YET SETUP TRYAG1: OPEN LOOK,FSINIT ;INIT THE CHAN. JRST DSKNA ;SHOULDN'T HAPPEN ENTER LOOK,LNAM ;GET SET TO WRITE JRST [PUSHJ P,TRYDSK;[276] TRY GENERIC DSK(ONLY RETURN IF YES)? JRST TRYAG1] ;[276] YES--TRY AGAIN OUTPUT LOOK,TMPFIL ;OUTPUT THE DMP IOWD LIST CLOSE LOOK,20 ;SAVE THE NAME BLOCKS (LEVEL D) RELEASE LOOK,0 ;LET IT GO DONE1: SKIPE TMPCHN+CHNCRF ;DID WE DO ANY CREF? PUSHJ P,FINCRF ;YES, FINISH OFF CREF SKIPN T1,PCNAM ;IS THERE ONE TO LOAD? JRST [TRNE FL,EDITF ;WAS THIS FOR EDIT? TRNE FL,TECOF ;AND NOT TECO? JRST DOEND ;[206] NO, EXIT SKIPN PCDEV ;IS THERE ANOTHER TO RUN? JRST DOEND ;NOPE JRST NUNDO] ;YES, DO IT JRST NUNDO ;GO LOAD IT CHKRM: PUSH P,T1 ;SAVE THE REGISTERS WE ARE USING PUSH P,T2 MOVSI T1,- ;LOOK TO SEE IF ANY FREED BUFFERS CKRM1: SKIPN T2,FREBUF(T1) AOBJN T1,CKRM1 ;[441] JUMP BACK AND TRY AGAIN JUMPGE T1,USTOP ;NO, GET IT FROMTOP OF STORAGE MOVEM T2,.JBFF ;YES, SET JOBFF THERE SETZM FREBUF(T1) ;AND MARK IT USED JRST TPOPJ2 ;THATS ALL FOR NOW USTOP: MOVE T1,SVJFF ;GET THE CURRENT TOP OF BUFFER AREA MOVEM T1,.JBFF ADDI T1,<203*2>+1 ;LEAVE THIS MUCH ROOM MOVEM T1,SVJFF ;THATS THE NEW TOP CAMGE T1,CORTOP ;WILL THAT RUN US OUT OF CORE? JRST TPOPJ2 ;NO, LEAVE PUSH P,CTPOPJ XPAND: MOVEI T1,2000 ;GET SET TO EXPAND ADDM T1,CORTOP ADDM T1,CORT1 ADD T1,.JBREL ;NEW TOP DESIRED CALLI T1,11 ;ASK FOR IT JRST NOCOR ;LOSE BIG MOVE T1,.JBREL MVCR: MOVE T2,-2000(T1) ;MOVE CORE UP MOVEM T2,(T1) CAMLE T1,CORTOP ;ARE WE DONE? SOJA T1,MVCR CTPOPJ: POPJ P,TPOPJ2 IFE FASTFS,< ;USE FIRST F/S IF SEARCH LIST IS OF FORM ;DSKA/N,DSKB,...FENCE FNDFST: PUSH P,T1 ;SAVE SOME ACS PUSH P,T2 PUSH P,T3 PUSH P,T4 ;THIS TEST INCASE USE HAS ASSIGNED XXX AS DSK MOVEI T1,T2 ;ADDRESS OF DATA BLOCK MOVSI T2,'DSK' ;AND DATA IN IT DSKCHR T1, ;GET FIRST ARG JRST USEDSK ;LOSE SOON TLNE T1,(7B17) ;TESR FOR GENERIC DSK JRST USEDSK ;IT WAS N'T SO USE WHAT USER REQUESTED MOVE T1,[3,,T2] ;SET UP BLOCK SETOB T2,T4 ;REQUEST FIRST F/S JOBSTR T1, ;GET FIRST F/S IN SEARCH LIST JRST USEDSK ;LEVEL C JUMPL T4,USEDSK ;SWP BIT SET TLNN T4,200000 ;IS NO CREATE SET? JRST USEDSK ;NO, GENERIC DSK WILL USE THIS F/S DSKCHR T1, ;GET FIRST 3 ARGS JRST USEDSK ;SHOULD NEVER HAPPEN BUT ... TLNN T1,740200 ;RHB!OFL!HWP!SWP!NNA! SET? CAIGE T3,10 ;ANY ROOM? ,TEN SHOULD BE ENOUGH USEDSK: MOVSI T2,'DSK' ;JUST USE DSK MOVEM T2,FSNAME ;STORE FASTEST F/S NAME ; JRST TPOPJ4 ;RESTORE ACS > TPOPJ4: POP P,T4 TPOPJ3: POP P,T3 TPOPJ2: POP P,T2 TPOPJ1: POP P,T1 POPJ P,0 RPGSET: MOVE T1,[POINT 7,FCOMD] MOVEM T1,DINPT MOVEI FL,RECALF!CMDSN JRST RPGRET SUBTTL INITIALIZATION STPT: TDZA T4,T4 ;NORMAL ENTRY MOVNI T4,1 ;REENTRY FROM AN EDITOR IFN PURESW,< SETZM .ZZ ;MUST CLEAR LOW CORE MOVE T1,[XWD .ZZ,.ZZ+1] BLT T1,LOWTOP MOVE T1,[XWD INIDAT,INILOW] BLT T1,INILOW+INILEN > RESET ;[241]STOP THE WORLD JUMPL T4,RPGSET RESCAN 1 ;[205] RESET POINTER TO START OF COMMAND JRST LINBF ;[441] something in input buffer SKIPN .JBDDT## ;[211] WAIT FOR USER IF DEBUGGING GOTO SYNRR2 ;[205] INPUT BUFFER EMPTY LINBF: ;[441] come here when something in buffer MOVEI FL,0 HLRZ T1,.JBSA ;GET .JBFF (AFTER RESET) HRLI T1,(POINT 7) ;FORM BYTE POINTER MOVEM T1,TTYPT ;SAVE INITIAL TTY POINTER MOVEM T1,DINPT SETZM (T1) ;CLEAR WORD INCASE BIT 35 ON START1: INCHWL T2 ;READ A COMMAND CHAR INTO T2 MOVEI T4,2(T1) ;[223] GET NEXT ADDRESS PLUS SPARE CAMG T4,.JBREL ;[223] WILL IT FIT JRST LFITY ;YES [441] jrst to LFITY CORE T4, ;NO, GET MORE JRST NOCOR ;YOU LOSE LFITY: ;[441] when it will fit IDPB T2,T1 ;STORE IN DDTINBUF TLNN T1,760000 ;THIS WORD FULL? SETZM 1(T1) ;YES, CLEAR NEXT INCASE BIT 35 ON MOVE T3,CTBL(T2) ;GET CHARACTER DESCRIPTOR TLNN T3,TERMF ;IS IT A BREAK CHAR? JRST START1 ;NO. GO GET MORE. MOVEI T2,177 ;MARK END WITH AN EOF FLAG SETZM 1(T1) ;MAKE SURE BIT 35 IS OFF IDPB T2,T1 IDPB T2,T1 ;MAKE SURE ADDI T1,1 ;SAVE THE LAST WORD HRRZM T1,.JBFF ;[262]UPDATE .JBFF RPGRET: SKIPA P,RP1 ;[441] SET UP PDL RP1: IOWD PDL,PDLB ;[441] label as RP1 MOVNI T1,1 ;STANDARD KA/KI TEST AOBJN T1,.+1 SKIPN T1 AOS CPU ;KA=0, KI=1 MOVEI T1,3 PJOB T2, LSOJ1: IDIVI T2,12 ;[441] label is LSOJ1 ADDI T3,20 ;TO SIXBIT LSHC T3,-6 SOJG T1,LSOJ1 ;[441] THREE DIGITS HLLZM T4,JOBNAM ;SAVE TO MAKE UNIQUE NAMES TLO T4,404040 ;NOW TO ASCII FOR ASCIZ'S MOVEI T1,3 ;THREE CHARS LSOJ2: LSH T3,1 ;[441] label is LSOJ2 LSHC T3,6 ;BRING IN A CHAR SOJG T1,LSOJ2 ;[441] use LSOJ2 DPB T3,[POINT 21,CRFRDR,27] ;SAVE IN ASCIZ DPB T3,[POINT 21,FCOMD,27] DPB T3,[POINT 21,FCOMD2,27] MOVSI T1,377777 ;SET COUNT TO A LARGE NUMBER MOVEM T1,DINCT MOVE IOP,[IOWD *3,IOPD] ;AND IO PDL MOVSI IOPNT,- ;SET NEXT LIMIT TRO FL,DOLOD ;LOAD USING LINK-10 SETZM DEFPRO ;[303] CLEAR DEFAULT PROCESSOR FLAG MOVEI T1,FORSW ;ASSUME FORTRAN MOVEM T1,DFPROC ;AS DEFAULT PROCESSOR SETZM LOKNAM ;NO ALTERNATE DEVICE YET SETZB FL2,FL3 ;AND NO FLAGS EITHER OPEN LOOK,DSKLK ;GET THE DSK JRST DSKNA HRRZ T1,.JBFF ;[564] DISK BUFFERS WILL GET PUT HERE MOVEM T1,DSKBUF ;[564] SAVE BUFFER ADDRESS INBUF LOOK,2 IFE PURESW,< SETZM FREBUF ;MARK NO FREED BUFFERS MOVE T1,[XWD FREBUF,FREBUF+1] BLT T1,FREBUF+NESTDP> MOVE T1,.JBFF MOVEM T1,SVJFF MOVE T1,.JBREL MOVEM T1,CORTOP MOVEM T1,CORT1 IFE PURESW,< SETZM SAVCHR ;TO START THINGS > HLLZS .JBERR ;RESET ERROR COUNT MOVSI SVPT,-NFILE SETZM SWGKB ;[447] SETZM SWGKL ;[447] SETZM SWGKS ;[447] TESTIT: PUSHJ P,SCAN ;SCAN PAST THE COMPILE ETC MOVE T1,ACCUM ;FIND OUT WHICH COMMAND MOVNI T2,1 STPT1: LSH T1,6 LSH T2,-6 JUMPN T1,STPT1 MOVSI T1,-COMTLG SETOM NUMAT ;-1 TO NUMBER FOUND STPT2: MOVE T3,COMTAB(T1) CAMN T3,ACCUM ;EXACT MATCH? JRST COMATC ;YES, ALL DONE ANDCM T3,T2 CAME T3,ACCUM JRST STPT3 ;NO MATCH AOS NUMAT ;POSSIBLE MATCH MOVEM T1,SVIND ;SAVE POINTER STPT3: AOBJN T1,STPT2 SKIPGE NUMAT ;WAS THERE AT LEAST ONE JRST UNKERR ;NO SKIPE NUMAT ;BUT NO MORE THAN ONE JRST AMBIGU ;NO, SO COMMAND IS AMBIGUOUS MOVE T1,SVIND ;RESTORE THE POINTER COMATC: XCT COMT2(T1) ;DO THE APPROPRIATE THING PUSHJ P,SCAN ;GET NEXT THING TRNN IOPNT,-1 ;IF DOWN A LEVEL ITS OK TLNN CS,TERMF ;OR IF NOTHING SEEN TRNA ;[441] a much faster single skip JRST COMAT1 TRNE FL,EDITF JRST DOEDT1 JRST NXFIL1 COMAT1: MOVE T1,[POINT 7,FCOMD] ;GENERATE FAKE COMMAND TO READ TRNE FL,EDITF MOVE T1,[POINT 7,FCOMD2] MOVEM T1,DINPT ;SAVE FILE TRO FL,RECALF+CMDSN ;MARK RECALLING FILE, DONT WRITE SETZM SAVCHR ;CLEAR OUT SCANNER MOVSI IOPNT,- ;ALLOW EXTRA NESTING PUSHJ P,SCAN TRNE FL,EDITF JRST DOEDIT NXFIL: PUSHJ P,SCAN NXFIL1: MOVSI SVPT,-NFILE ;SET UP FOR NUMBER OF FILES MOVEI SWCNT,SWBK*5 ;SET UP FOR SWITCHES MOVE SWPT,[POINT 7,SWBLK] ;AND POINTER SETZM SWBKL SETZM SWBKB SETZM ONAM SETZM OEXT SETZM OPPN SETZB FL2,LOKNAM ;CLEAR LAST PROCESSOR FLAGS AND SOURCE DEV IFN SFDSW,< X==0 REPEAT SFDLEN,< SETZM OSFD+X X==X+1 >> HLL FL3,FL ;SET TEMP FLAGS FROM PERM FLAGS MOVE T1,[POINT 7,LODSBK] ;SET POINTER TO LOADER MOVEM T1,LODSP ;SWITCH BLOCK MOVEI T1,LODSCT MOVEM T1,LODCTR MOVEM T1,LODCT2 ;AND SET COUNT FOR AFTER FILE NAME SWITCHES MOVE T1,[POINT 7,LODSB2] MOVEM T1,LODSP2 SETZM BROCNT ;CLEAR OUT THE <> COUNT SETZM SAVSW ;[234] INCASE LAST WAS SAVE FILE JRST ILP0A XALL SUBTTL COMMAND DISPATCH DEFINE COMAND (A,B)< > COMTAB: CTABLE COMTLG==.-COMTAB DEFINE COMAND (A,B)< B> COMT2: CTABLE SALL DEBUG: SETOM DEBFL ;DEFER UNTIL WE SEE FIRST FILE POPJ P, XCTR: MOVSI T2,'/E ' MOVEM T2,EXECFL ;DEFER UNTIL WE GET CHANCE TO SEE /LINK POPJ P, SUBTTL MAIN LOOP FOR READING INPUT ILP0: PUSHJ P,SCAN ;GET FIRST "THING" ILP0A: CAIN C,"/" ;CHECK FOR PERM COMPILE SWITCHES JRST COMPS1 CAIN C,"%" ;CHECK FOR PERM LOADER FLAGS JRST LOADS1 CAIN C,"(" ;[447] JRST PROCSX ;[447] ILP1A: TRZ FL,PROCS ;NO PROCESSOR SWITCHES SEEN YET SETOM GOTPST ;GOT PAST SWITCH SCANNER ILP1: PUSHJ P,GETNAM ;GO GET A FILE NAME PUSH P,C ;INCASE WE NEED TO RESTORE IT MOVE C,LODSP ;EXCHANGE POINTERS EXCH C,LODSP2 MOVEM C,LODSP MOVE C,LODCTR EXCH C,LODCT2 MOVEM C,LODCTR POP P,C ;RESTORE C CAIE C,"]" ;GET RID OF CLOSING PPN IF LAST WAS ONE TRNE FL,IDF ;ALREADY SCANNED FAR ENOUGH IF NO FILE NAME ILP2A: PUSHJ P,SCAN ;GET THE SPECIAL CHR OR WHATEVER ILP2: CAIE C,"," ;DONE WITH THIS SET OF NAMES? TLNE CS,TERMF ;WILL ACCEPT A TERMINATOR JRST SETUP ;GO SET UP THE FILES FOR PROCESSORS CAIN C,"(" ;MAYBE SWITCHES TO BE PASSED TO PROCESSORS JRST PROCSW CAIN C,"/" ;OR FOR US JRST COMPSW CAIN C,"%" JRST LOADS2 CAIN C,">" JRST ENDBRO ;THIS IS THE END OF A BROKET STRING CAIN C,"=" ;MAYBE HE IS SETTING THE OUTPUT NAME JRST SETONM CAIN C,"[" ;IS IT PROJECT-PROGRAMMER NUMBER? JRST GETDIR ;YES CAIE C,"+" ;IS THIS A SECOND FILE GOTO SYNERR ;IT SHOULD HAVE BEEN ONE OF THOSE AOBJP SVPT,TMNER ;MAYBE TOO MANY FILES MOVE C,LODSP ;EXCHANGE POINTERS AGAIN EXCH C,LODSP2 MOVEM C,LODSP MOVE C,LODCTR EXCH C,LODCT2 MOVEM C,LODCTR PUSHJ P,SCAN ;GET NEXT CAIE C,"<" ;IS THIS THE <> CONSTRUCTION JRST ILP0A ;NO AOS BROCNT ;WE ARE ONE DEEPER IN BROKETS PUSHSZ==. IFN SFDSW,< X==SFDLEN-1 REPEAT SFDLEN,< PUSH P,OSFD+X X==X-1 >> PUSH P,OPPN PUSH P,OEXT PUSH P,SVPT ;SAVE AWAY ALL THE IMPORTANT INFORMATION PUSH P,SWPT PUSH P,SWCNT PUSH P,LODSP PUSH P,LODSP2 PUSH P,LODCTR PUSH P,LODCT2 PUSH P,SWBKL PUSH P,SWBKB PUSH P,ONAM PUSHSZ==.-PUSHSZ JRST ILP0 ;GO FINISH THINGS UP GETDIR: PUSHJ P,GETPP1 ;GO GET [PPN] JRST ILP2A ;AND SEE WHAT ELSE WE HAVE ENDBRO: PUSHJ P,SCAN ;GO GET NEST THING (SHOULD BE A ",") TLNN CS,TERMF CAIN C,"," TRNA ;[441] "," AND TERMF ARE OK SO SKIP CAIN C,">" ;SO IS ANOTHER END-BRACKET SOSGE BROCNT ;ALSO ERROR IF NO < WAS SEEN GOTO SYNERR SUB P,[PUSHSZ,,PUSHSZ] ;RESET PDL CAIN C,">" ;END-BRACKET GETS DIFFERENT TREATMENT JRST ENDBRO ;TO COMMA JRST SETUP ;GO TAKE CARE OF THINGS NXFILP: SKIPG BROCNT ;ARE WE DONING BROKETS? JRST NXFIL ;NO, JUST CONTINUE MOVE T1,(P) MOVEM T1,ONAM MOVE T1,-1(P) MOVEM T1,SWBKB MOVE T1,-2(P) MOVEM T1,SWBKL MOVE T1,-3(P) MOVEM T1,LODCT2 MOVE T1,-4(P) MOVEM T1,LODCTR MOVE T1,-5(P) MOVEM T1,LODSP2 MOVE T1,-6(P) MOVEM T1,LODSP MOVE SWCNT,-7(P) MOVE SWPT,-10(P) MOVE SVPT,-11(P) MOVE T1,-12(P) MOVEM T1,OEXT MOVE T1,-13(P) MOVEM T1,OPPN IFN SFDSW,< X==0 REPEAT SFDLEN,< MOVE T1,SFDLEN-PUSHSZ-X(P) MOVEM T1,OSFD+X X==X+1 >> JRST ILP0 COMPS: PUSHJ P,SCAN ;GET THE NAME OF THE SWITCH TRNN FL,IDF ;WAS THERE REALLY AN IDENTIFIER THERE? GOTO SYNERR ;LOSE MOVE T1,ACCUM ;GET ITS SIXBIT MOVNI T2,1 ;SET UP MASK CMP1: LSH T1,6 LSH T2,-6 JUMPN T1,CMP1 ;WHEN DONE T2 HAS 0'S FOR ALL CHRS IN T1 MOVSI T1,-TBLG ;GET SET TO SCAN FOR NAME SETOM NUMAT ;-1 TO NUMBER FOUND CMP3: MOVE T3,SWTAB(T1) ;GET A SWITCH CAMN T3,ACCUM ;EXACT MATCH? JRST MATCH ;YES, ALL DONE ANDCM T3,T2 ;0 OUT UNNECESSARY CHRS CAME T3,ACCUM JRST CMP2 ;NO MATCH AOS NUMAT ;POSSIBLE MATCH MOVEM T1,SVIND ;SAVE POINTER CMP2: AOBJN T1,CMP3 SKIPGE NUMAT ;WAS THERE AT LEAST ONE MATCH JRST UNRECS SKIPE NUMAT ;BUT NO MORE THAN ONE? JRST AMBIGU ;NO, SO COMMAND IS AMBIGUOUS MOVE T1,SVIND ;RESTORE THE POINTER MATCH: HRRZ T1,T1 ;INDEX ONLY CAIL T1,ASWTAB-SWTAB ;IN ADDRESS TABLE? JRST [MOVE T1,SWTAB2(T1) ;YES, LOAD UP JUMP ADDRESS JRST (T1)] ;GO TO ROUTINE (LEFT HALF MAY BE SET) CAIL T1,PSWTAB-SWTAB ;IN PROCESSOR TABLE? JRST PMATCH ;YES, USE OTHER FLAGS MOVE T1,SWTAB2(T1) ;NO, GET ACTION SMATCH: TLZ FL3,(T1) ;[221] TURN OFF SWITCHES AS NEEDED TRNE FL,PERF ;PERMANENT? TLZ FL,(T1) ;SET THAT TOO MOVSS T1 TLO FL3,(T1) ;AND TURN ON OTHERS TRNE FL,PERF TLO FL,(T1) ;**;[457] after SMATCH + 6L, insert TLNN FL3,C74SW!C68SW!F10SW!F40SW ;[457] IMPLY COMPILER? JRST SMATC1 ;[457] NO, CONTINUE NORMALLY TLNE FL3,C74SW!C68SW ;[457] IMPLY COBOL? TRZA FL2,ALPROC-CBLSW ;[457] YES, TURN OFF ALL BUT COBOL TRZA FL2,ALPROC-FORSW ;[457] NO, TURN OFF ALL BUT FORTRA TROA FL2,CBLSW ;[457] YES, SET PROC TYPE TRO FL2,FORSW ;[457] NO, MUST FOR FORTRA TRNE FL,PERF ;[457] WAS IT PERMANENT? HRRZM FL2,DFPROC ;[457] YES, STORE DEF PROC SMATC1: ANDI T1,DEVSWS ;SEE IF FIRST DEVICE SWITCH SKIPN LODDEV ;AND IF SO HRLOM T1,LODDEV ;SAVE AS LOADER DEVICE (RH SET TO -1) JRST SCAN ;GET SOMETHING ELSE PMATCH: MOVE T1,SWTAB2(T1) ;GET SWITCHES TRZ FL2,(T1) ;TURN OFF LOCAL PROCESSOR MOVSS T1 TRO FL2,(T1) ;TURN IT ON TRNE FL,PERF HRRZM T1,DFPROC ;CHANGE DEFAULT PROCESSOR TO JRST SCAN XALL DEFINE X (A,B,C,D,E,F,G,H)< SWITCH A,> DEFINE SWITCH (A,B)< < SIXBIT /A/>> SWTAB: STABLE PSWTAB: PTABLE ASWTAB: ATABLE TBLG==.-SWTAB DEFINE SWITCH (A,B)< B> SWTAB2: STABLE PTABLE ATABLE ;HERE ON "/" AFTER A FILE NAME COMPSW: TRZ FL,PERF ;DOING TEMP PUSHJ P,COMPS JRST ILP2 ;HERE ON "/" AS FIRST CHAR OF IDENT, I.E. PERM SW COMPS1: TRO FL,PERF PUSHJ P,COMPS TLNE CS,TERMF ;CHECK FOR TERMINATOR JRST SWTERM ;YES, EITHER ERROR OR READ SVC FILE CAIE C,"," ;IS NEXT CHAR. A COMMA JRST ILP0A JRST ILP0 ;YES,SO SCAN FOR CHAR. AFTER IT SWTERM: SKIPN GOTPST ;IF WE GOT PAST SWITCH SCANNER TRNE FL,RECALF!CMDSN ;OR ALREADY READING SVC FILE JRST ILP0A ;THEN ITS AN ERROR JRST COMAT1 ;NO, SO READ SVC FILE SETLPT: SKIPA T1,[SIXBIT /LPT/] ;[251] SET TO USE LPT: SETDSK: MOVEI T1,. ;[251] SET AS DSK: MOVEM T1,SPDLPT ;[251] SAVE IN SWITCH WORD MOVE T1,[LISTSW,,CRSW] ;[251] SET UP T1 AS A SWITCH JRST SMATCH ;[251] TABLE MATCH AND DO THAT PROCESS SETMPL: SKIPE MAPSW ;[310] ALREADY SEEN ONE MAP JRST MPTWIC ;[310] YES DON'T PROCESS THIS ONE TRNN FL,DOLOD ;[441] are we loading? SKIPA T3,[-1] ;[441] NO, DON'T STORE ANYTHING SKIPA T3,[CHNLNK] ;[441] yes, load link chan. no. JRST SETMP ;[441] not loading so jump MOVEI T1,"," ;MIGHT NEED A SEPARATOR SKIPE TMPCHN(T3) ;UNLESS NOTHING OUTPUT YET PUSHJ P,TMPOUT ;SEP FROM PREV FILE SPEC MOVE T2,['/CONTE'] ;USE NEW SWITCHES PUSHJ P,OUTSIX MOVE T2,[':LOCAL'] PUSHJ P,OUTSIX PUSHJ P,OUTSPC ;AND PUT /GO IN MAPSW MOVE T2,['/LOCAL'] ;[257]LOCAL MAP NEEDS LOCAL SYMBOLS PUSHJ P,OUTSIX ;[257]PUT SPEC INTO TMPCOR PUSHJ P,OUTSPC ;[257]PLUS A SPACE JRST LNKMAP ;NOW FOR /MAP SETMAP: SKIPE MAPSW ;[310] ALREADY SEEN ONE MAP JRST MPTWIC ;[310] YES DON'T PROCESS THIS ONE TRNN FL,DOLOD ;[441] are we loading? SKIPA T3,[-1] ;[441] NO, DON'T STORE ANYTHING SKIPA T3,[CHNLNK] ;[441] yes, load link chan. no. JRST SETMP ;[441] not loading so jump MOVEI T1,"," ;MIGHT NEED A SEPARATOR SKIPE TMPCHN(T3) ;UNLESS NOTHING OUTPUT YET PUSHJ P,TMPOUT ;SEP FROM PREV FILE SPEC LNKMAP: MOVSI T2,'/G ' ;JUST TO TERMINATE SETMP: SKIPN MAPSW ;ALREADY SET? MOVEM T2,MAPSW ;STORE AND USE AS FLAG PUSHJ P,SCAN ;LOOK AT NEXT CHAR. CAIE C,":" ;IS THIS A KEY WORD SPECIFICATION JRST SETMP1 ;NO AOBJP SVPT,NESTTD ;MAKE SPACE FOR FIELDS TRO FL,F.STKY ;[302] SET FLAG FOR NO STICKINESS PUSHJ P,SCANAM ;YES, SO GO GET SPECIFICATIONS TRZ FL,F.STKY ;[302] CLEAR FLAG SKIPE T2,SVDEV(SVPT) ;A DEVICE SPECIFIED? PUSHJ P,OUTDEV ;YES SKIPE T2,SVNAM(SVPT) ;NAME SPECIFIED? PUSHJ P,OUTSIX ;OUTPUT IT SKIPE T2,SVEXT(SVPT) ;AN EXTENSION ALSO? PUSHJ P,OUTEXT ;YES SUB SVPT,[1,,1] ;BACK TO WHERE IT WAS CAIN C,"/" ;IF WE ENDED WITH A SWITCH TRNE FL,IDF ;AND HAVE N'T YET SEEN IT PUSHJ P,SCAN SETMP1: MOVSI T2,'/M ' ;YES PUSHJ P,OUTSIX SETMP2: MOVEI T1,"=" ;NEW STANDARD PUSHJ P,TMPOUT TRZ FL,LODOUT ;DO NOT NEED A COMMA FOR NEXT FILE POPJ P, MPTWIC: PUSHJ P,SCAN ;[310] GET NEXT CHARACTER CAIE C,":" ;[310] OUTPUT FIL SPEC GIVEN POPJ P, ;[310] NO CONTINUE AOBJP SVPT,NESTTD ;[310] MAKE SPACE FOR FIELDS TRO FL,F.STKY ;[310] NO STICKINESS PUSHJ P,SCANAM ;[310] GOBBLE FIL SPEC TRZ FL,F.STKY ;[310] CLEAR FLAG SUB SVPT,[1,,1] ;[310] BACK TO WHERE IT WAS PUSHJ P,SCAN ;[310] POPJ P, ;[310] CONTIUE SETDDT: SETOM DDTFL PJRST SCAN ;RETURN VIA SCAN FORSE: MOVEI T1,FRSCOD ;[242] FLAG USE OF FORSE JRST SETOTS ;STORE RESULT FOROTS: MOVEI T1,FRTCOD ;[242] FLAG USE OF FOROTS SETOTS: MOVEM T1,FORLIB PJRST SCAN LINKIT: SKIPN TMPCHN+CHNLNK ;MAKE SURE NO LINK-10 OUTPUT SKIPE MAPSW JRST LLCERR MOVEI T1,LODSCT ;OR LOAD SWITCHES STORED CAMG T1,LODCTR ;FOR FUTURE CAMLE T1,LODCT2 ;BUT NOT YET OUTPUT JRST LLCERR ;YES, BOMB USER PJRST SCAN SETDEB: PUSH P,SWPT ;[221] SAVE ACCS INCASE USED PUSH P,SWCNT ;[221] ... MOVEI SWCNT,DEBSIZ*7-1 ;[221] NO. OF CHARS ALLOWED TO STOR MOVE SWPT,[POINT 7,DEBPRM] ;[221] WHERE IF PERM? TRNN FL,PERF ;[221] WAS IT? HRRI SWPT,DEBTMP ;[221] NO, BAD GUESS SETZM (SWPT) ;[221] INCASE NO SWITCHES AOS (SWPT) ;[221] BUT MARK IT SEEN PUSHJ P,SCANS ;[221] LOOK AT NEXT CHAR CAIE C,":" ;[221] VALUE SPECIFED JRST RETDB1 ;[221] NO SETZM SAVCHR ;[221] GET RID OF ":" SETZM PARLVL ;[221] INCASE WE SEE ENCLOSED LIST DEBLUP: PUSHJ P,GETCH ;[221] GET NEXT CHAR TLNE CS,TERMF ;[221] TERMINATOR? JRST RETDEB ;[221] YES, END CAIN C,"(" ;[221] SWITCH LIST? AOS CS,PARLVL ;[221] COUNT UP, AND FAKE OUT CS CAIN C,")" ;[221] END OF SWITCH LIST? JRST [SOSLE CS,PARLVL ;[221] BACK TO 0 LEVEL JRST OUTDEB ;[221] NOT YET, JUST OUTPUT IT PUSHJ P,STRDEB ;[221] OUTPUT IT JRST RETDEB] ;[221] AND GIVE UP SKIPN PARLVL ;[221] IF NESTED PASS ANYTHING JUMPLE CS,RETDEB ;[221] OTHERWISE GIVE UP ON DELIMITER OUTDEB: PUSHJ P,STRDEB ;[221] OUTPUT THIS CHAR JRST DEBLUP ;[221] LOOP RETDEB: MOVEM CS,SAVCHR ;[221] REPEAT DELIMITER SETZ C, ;[221] MAKE SURE TERMINATED IDPB C,SWPT ;[221] ALWAYS ENOUGH SPACE RETDB1: MOVSI T1,DEBUGSW ;[221] SET SWITCH POP P,SWCNT ;[221] RESTORE POP P,SWPT ;[221] ... JRST SMATCH ;[221] BY NORMAL CODE STRDEB: SOJLE SWCNT,ETMS ;[221] NOT ENOUGH ROOM IDPB C,SWPT ;[221] STORE CHAR POPJ P, ;[221] RETURN FORDDT: TLO FL,DEBUGSW ;[221] SET PERM FLAG TLO FL3,DEBUGSW ;[221] AND TEMP SETZM DEBPRM ;[221] USE DEFAULT SETZM DEBTMP ;[221] ... MOVE T1,['FORDDT'] ;[221] NAME OF DEBUGGER MOVEM T1,DDTFL ;[221] PRE-EMPT NORMAL TESTS PJRST SCAN ;[221] RETURN SAVE: SKIPA T2,['/SAVE '] ;[234] SSAVE: MOVE T2,['/SSAVE'] ;[234] SKIPN SVNAM(SVPT) ;[256] IS THERE A SAVE NAME? JRST SAVERR ;[256] NO, THAT IS AN ERROR ;**; [444] at SSAVE plus 3 SKIPE SAVSW ;[444] IS THIS THING ALREADY SET? JRST SAVER2 ;[444] YES, YOU CAN'T SAVE TWO DIF FILES MOVEM T2,SAVSW ;[234] SAVE WHICH SWITCH TRNN FL,DOLOD ;[234] ARE WE LOADING? SKIPA T3,[-1] ;[234] NO, DON'T CREATE TMP FILE MOVEI T3,CHNLNK ;[441] load chan no. for link PJRST SCAN ;[234] ;here on "(" as first char of ident, i.e. perm proc sw PROCSX: PUSH P,SWPT ;[447] save switch pointer MOVE SWPT,[POINT 7,SWGLK] PUSHJ P,PROCS0 ;[447] get switches POP P,SWPT ;[447] restore switch pointer MOVE T1,SWBKB ;[447] transfer binary switch ptr. MOVEM T1,SWGKB ;[447] SETZM SWBKB ;[447] MOVE T1,SWBKL ;[447] listing switch ptr. MOVEM T1,SWGKL ;[447] SETZM SWBKL ;[447] MOVE T1,SWBKS(SVPT) ;[447] source switches MOVEM T1,SWGKS ;[447] SETZM SWBKS(SVPT) ;[447] JRST ILP0 ;here on "(" after a file name PROCSW: TROE FL,PROCS ;HAVE WE ALREADY SEEN SOME? GOTO SYNERR ;YES, I DEFINE THIS AS ILLEGAL PUSHJ P,PROCS0 ;[447] get switches JRST ILP2A PROCS0: MOVEM SWPT,SWBKS(SVPT) ;SAVE BYTE POINTER TO NEW ONES TRZ FL,PCM1!PCM2 ;NO COMMAS YET SETZM PARLVL ;[221] START AT LEVEL 0 (SEEN 1) PROCS1: PUSHJ P,GETCH ;GIVE ME A CHARACTER CAIN C,")" ;DONE? JRST [SOSGE PARLVL ;[221] BACK TO LEVEL -1 YET? JRST ESTR ;[221] YES JRST PROCS2] ;[221] NO, STORE ")" CAIN C,"," ;POSSIBLY COMMA JRST [SKIPG PARLVL ;[221] SEE IF NESTED JRST PCCOM ;[221] AT TOP LEVEL, GO TAKE GOOD CARE OF IT JRST PROCS2] ;[221] YES, STORE IT CAIE C,":" ;[221] ALLOW ":" FOR SWITCH VALUES CAIN C," " ;ALLOW SPACE FOR MULTIPLE SWITCHES JRST PROCS2 ;TO FORTRAN-10 CAIN C,"/" ;[252] ALLOW "/" FOR SWITCH VALUE JRST PROCS2 ;[252] FOR ALGOL CAIN C,"(" ;[221] ALLOW "(" TO ENCLOSE SWITCH VALUES AOS CS,PARLVL ;[221] COUNT LEVEL UP AND FAKE CS CAIN C,"-" ;[570] ALLOW "-" JRST PROCS2 ;[570] FOR COBOL-74 IFE DEBSW,< JUMPLE CS,SYNERR ;NOT ANUMBER OR LETTER, HE LOSES > IFN DEBSW,< SKIPG CS ;SAME CODE BUT LONGER GOTO SYNERR > PROCS2: IDPB C,SWPT ;SAVE IT AWAY SOJG SWCNT,PROCS1 ;NEXT PLEASE JRST ETMS ;TOO MANY SWITCHES FOR SPACE RESERVED PCCOM: TROE FL,PCM1 ;IS THIS THE FIRST OR SECOND COMMA JRST NOTBIN ;NOT FIRST, TRY FOR SECOND CAMN SWPT,SWBKS(SVPT) ;WAS ANYTHING STORED? JRST PROCS1 ;NO, JUST IGNORE SKIPE SWBKB ;ARE THERE ALREADY BINARY SWITCHES GOTO SYNERR ;YES, MORE NOT ALLOWED MOVE T1,SWBKS(SVPT) ;GIVE THIS TO BINARY MOVEM T1,SWBKB COMCOM: MOVEI C,0 ;MARK END OF STRING IDPB C,SWPT SOJLE SWCNT,ETMS ;HAVE WE RUN OUT? MOVEM SWPT,SWBKS(SVPT) ;AND A NEW ONE FOR SRC JRST PROCS1 NOTBIN: TROE FL,PCM2 ;SECOND ALREADY SEEN? GOTO SYNERR ;YES, THREE NOT PERMITTED CAMN SWPT,SWBKS(SVPT) ;ANYTHING THERE? JRST PROCS1 ;HE WOULD HAVE BEEN JUST AS WELL WITHOUT IT SKIPE SWBKL ;ALREADY LIST SWITCHES? GOTO SYNERR ;YES, HE LOSES MOVE T1,SWBKS(SVPT) ;AND GIVE TO CORRECT PERSON MOVEM T1,SWBKL JRST COMCOM ESTR: CAMN SWPT,SWBKS(SVPT) ;WAS ANYTHING STORED? JRST [SETZM SWBKS(SVPT) ;NO, ZERO IT POPJ P,] ;[447] MOVEI C,0 IDPB C,SWPT ;MARK SOJLE SWCNT,ETMS POPJ P, ;[447] next SETONM: SKIPE ONAM ;OUTPUT NAME GIVEN BEFORE? SKIPLE BROCNT ;BUT OK IN BROKETS TRNE FL,PROCS ;PROCESSOR SWITCHES NOT PERMITTED HERE GOTO SYNERR MOVE T1,SVNAM(SVPT) ;GET THE NAME MOVEM T1,ONAM ;AND SAVE IT AWAY MOVE T1,SVEXT(SVPT) MOVEM T1,OEXT MOVE T1,SVPPN(SVPT) MOVEM T1,OPPN MOVE T1,SVDEV(SVPT) MOVEM T1,ODEV ;SAVE OUTPUT DEVICE SETZM SVDEVV ;[267]OKAY, DONE WITH STICKY-NESS IFN SFDSW,< X== REPEAT SFDLEN,< MOVE T1,SVSFD+X(SVPT) MOVEM T1,OSFD+Y X==X+NFILE Y==Y+1 >> PUSHJ P,SCAN JRST ILP1 LOADS1: PUSHJ P,LODS1 JRST ILP0 LOADS2: PUSH P,[ILP2A] ;SET RETURN POINT LODS1: PUSHJ P,GETCH ;NEXT CHR CAIG C," " ;NON-PRINTING CHARS. NOT ALLOWED GOTO SYNERR ;THIS REALLY IS A BUG ;HERE FOR LINK-10 SWITCHES ;THEY ARE IN FORM %'SWITCH:ARG' ; PUSH P,C ;SAVE TERMINATOR CAIL C,"0" ;LOOK FOR POTENTIALLY DANGEROUS CAILE C,"9" ;SWITCH DELIMITERS CAIA ;I.E. THOSE THAT COULD BE JRST LODS4 ;LOADER SINGLE CHAR SWITCHES CAIL C,"A" ;WARN USER CAILE C,"Z" ;BUT CONTINUE CAIA ;REMOVE AT SOME FUTURE DATA JRST LODS4 ;WHEN LINK-10 HAS REPLACED LOADER CAIL C,"a" CAILE C,"z" CAIA CAIE C,"-" ;DONT FORGET MINUS CAIN C,"&" ;OR SYMBOLIC SWITCH JRST LODS4 LODS3: PUSHJ P,GETCH ;NEXT CHR CAIG C," " ;NON-PRINTING CHARS. NOT ALLOWED GOTO SYNERR ;THIS REALLY IS A BUG CAMN C,0(P) ;TERMINATOR? JRST LODS5 ;YES, STORE BLANK AND ZERO IDPB C,LODSP ;SAVE IT SOSG LODCTR ;CHECK SIZE JRST ETMS JRST LODS3 ;LOOP FOR MORE ;HERE TO WARN USER INCASE CTL FILE CONTAINS LOADER SWITCHES LODS4: STRING [ASCIZ /%CMLILS Illegal LINK-10 switch delimiter: /] OUTCHR C STRING [ASCIZ \ \] JRST LODS3 ;HERE TO TERMINATE THIS SWITCH ;MARK END WITH BLANK ;STORE ZERO IN CASE END (BUT DON'T INCREMENT BYTE POINTER OR COUNT) LODS5: MOVEI C," " ;NEED TO OUTPUT A SPACE IDPB C,LODSP ;SO STORE IT SOSG LODCTR ;MAKE SURE IT FITS JRST ETMS ;NO SETZ C, ;NULL TERMINATOR MOVEM T2,0(P) ;JUST INCASE MOVE T2,LODSP ;GET BYTE POINTER IDPB C,T2 ;WILL GET OVERWRITTEN IF MORE SWITCHES MOVE T2,LODCTR ;MAKE SURE NULL FITTED SOJLE T2,ETMS ;INCASE NO MORE SWITCHES POP P,T2 ;RESTORE T2, GET STACK BACK IN SHAPE POPJ P, ;FINISHED SETUP: MOVE T1,SVNAM(SVPT) ;LAST FILE NAME SKIPN ONAM ;SET ONAM IF NOT ALREADY MOVEM T1,ONAM SETOM EXTEND ;[240] HERE TO CHECK IF ALL DEVICES ;[240] ARE DISKS SO CAN USE EXTENDED ;[240] LOOKUPS FOR MORE ACCURATE ;[240] CREATION TIME CHECKS. SKIPN T1,ODEV ;[240] OUTPUT DEVICE SPECIFIED? JRST LSET1 ;[240] NO, ASSUME DISK DEVCHR T1, ;[240] FIND OUT WHAT IT IS TLNN T1,DV.DSK ;[240] A DISK? JRST ONSET1 ;[240] NO. LSET1: MOVSI T1,-NFILE ;[240] SETUP TO CHECK ALL INPUTS DSKLUP: SKIPN T2,SVDEV(T1) ;[240] DEVICE GIVEN? JRST LDSK1 ;[240] NO, ASSUME A DISK DEVCHR T2, ;[240] WHAT IS IT? TLNN T2,DV.DSK ;[240] A DISK? JRST ONSET1 ;[240] NOPE. LDSK1: AOBJN T1,DSKLUP ;[240] LOOP FOR ALL DEVICES JRST ONSET ;[240] THEY'RE ALL DISKS! ONSET1: SETZM EXTEND ;[240] THEY'RE NOT ALL DISKS ONSET: TRZ FL,NODAT ;WE HAVE NOT SEEN A DIFFERENT DEVICE SETZM SDAT ;LATEST DATE SETZM STIM ;AND LATEST TIME SETZM ETIM ;[317] INTERNAL CREATION DATE AND TIME TLZ FL2,-1 ;NO PROCESSOR YET PUSHJ P,GETPRO ;GO FIND DATE AND PROCESSOR SKIPE SAVSW ;[444] IS THIS A SAVE FILE REQUEST PUSHJ P,OUTSAV ;[444] YES, PUT OUT OUTPUT FILENAME NOW TLNE FL2,RELSW ;IF A REL FILE JRST LKREL ;[462] SETUP THE PROCESSOR TYPE FROM REL FILE TRNE FL,NODAT ;NO DATES ON OTHER DEVICES JRST LBCOMP ;BUT CHECK FOR /LIB FIRST TLC FL3,NOBINSW!LISTSW ;INVERT /NOBIN/LIST SWITCHES TLCE FL3,NOBINSW!LISTSW ;TEST FOR BOTH ON TLNE FL3,COMPLS ;DO WE ALWAYS WANT TO COMPILE? JRST DOCOMP ;YES, COMBINATION FORCES COMPILE MOVE T1,SVPT ;[462] USE THE CURRENT FILE POINTER PUSHJ P,SETPTH ;[462] SETUP THE LOOKUP PATH TRNA ;[462] SKIP THE FIRST TIME REREL: SETZ T2, ;[462] CLEAR THE FLAG MOVEM T2,LPPN ;[462] SAVE THE PATH POINTER OR 0 MOVEM T2,SVRPP ;[462] STORE RESULT SO WE KNOW IF SECOND TIME MOVE T1,ONAM ;SEE IF REL IS THERE MOVEM T1,LNAM HLLZ T1,FL2 ;[265]GET ONLY LH SO DEFUALT TO 'REL' JFFO T1,.+1 ;[212] GET PROCESSOR INDEX INTO T2 SKIPN T1,OEXT ;[212] OUTPUT EXTENSION ALREADY SPECIFIED? SKIPE T1,INTEXT(T2) ;[212] NO, GET FROM TABLE SKIPN T1 ;[212] HAVE WE GOT SOMETHING YET? MOVSI T1,'REL' ;[212] NO USE REL MOVEM T1,LEXT PUSHJ P,DOLOOK ;[462] LOOKUP THE REL FILE JRST LBCOMP ;[462] COULD NOT FIND IT, RECOMP REREL2: PUSHJ P,CHKAGE ;[317] COMPARE THE AGE OF THE FILE JRST DOCOMP ;[317] OLDER - RECOMPILE NOCOM1: TLNN FL2,FORSW!CBLSW ;[324] FORTRAN OR COBOL PROG JRST NOCOM3 ;NO, SKIP CHECKING REL FILE PUSHJ P,CHKREL ;SEE WHAT TYPE OF REL FILE WE HAVE JRST DOCOMP ;ERROR, SO RECOMPILE NOCOM3: SKIPN SVRPP ;DID WE FIND THE REL FILE SOMEWHERE ELSE? JRST NOCOMP ;NO MOVE T1,OEXT ;MAKE SOURCE EXT = OUTPUT EXT MOVEM T1,SVEXT ;[172] TLO FL2,RELSW ;AND PRETEND HE SAID .REL JRST NOCOMP ;GENERAL ROUTINE TO SEE IF CURRENT FILE IS NEWER OR OLDER THAN THAT ;SPECIFIED BY SDAT, STIM, ETIM. EXTENDED LOOKKUP INFO IS USED IF AVAILABLE CHKAGE: PUSH P,T1 ;[317] SAVE A COUPLE OF AC'S PUSH P,T2 ;[317] LDB T2,[POINT 12,LDAT,35] ;[317] GET LOW 12 BITS OF DATE LDB T1,[POINT 3,LEXT,20] ;[317] GET HIGH 3 BITS OF DATE DPB T1,[POINT 3,T2,23] ;[317] MERGE THE TWO PARTS CAMGE T2,SDAT ;[317] CURRENT FILE EARLIER? JRST CHKAG2 ;[317] YES, NO NEED TO CHECK FURTHER CAME T2,SDAT ;[317] SAME DAY? JRST CHKAG1 ;[317] NO, MUST BE NEWER LDB T2,[POINT 11,LDAT,23] ;[317] GET TIME CAMGE T2,STIM ;[317] CURRENT FILE EARLIER? JRST CHKAG2 ;[317] YES CAME T2,STIM ;[317] SAME MINUTE? JRST CHKAG1 ;[317] NO, MUST BE NEWER SKIPN EXTEND ;[317] EXTENDED INFO AVIALABLE? JRST CHKAG2 ;[317] NO, TREAT AS OLDER TO BE SAFE MOVE T2,EBLK+.RBTIM ;[317] GET INTERNAL DATE/TIME CAMLE T2,ETIM ;[317] NEWER FILE? CHKAG1: AOS -2(P) ;[317] YES, SET FOR SKIP RETURN CHKAG2: POP P,T2 ;[317] NO, SET FOR NON-SKIP RETURN POP P,T1 ;[317] RESTORE AC'S POPJ P, ;[317] RETURN ; ; This routine does not decide wether to COMPILE or not but ; simply sets the processor type from the REL file if it is ; as yet, unknown. ; LKREL: SKIPGE DEBFL ;[462] IF NOT DEBUG, DON'T WASTE TIME ON REL TLNE FL2,ALPROC-RELSW ;[462] SEE IF ANY PROCESSORS ALREADY SET JRST LDREL ;[462] YES, GO LOAD REL FILE NOW! SKIPN T1,LOKNAM ;[462] PICK UP A DEVICE IF THERE SKIPA T1,['DSK '] ;[462] ELSE USE DSK: TRNA ;[462] SKIP STORAGE IF ALREADY THERE MOVEM T1,LOKNAM ;[462] STORE IT AWAY OPEN LOOK,LOKINT ;[462] OPEN FOR INPUT JRST DEVNA ;[462] NOT THERE MOVE T1,SVPT ;[462] USE CURRENT FILE POINTER PUSHJ P,SETPTH ;[462] SET UP THE LOOKUP BLOCK MOVE T1,ONAM ;[462] SEE IF REL IS THERE MOVEM T1,LNAM ;[462] SKIPN T1,OEXT ;[462] OUTPUT EXTENSION ALREADY SPECIFIED? SKIPE T1,SVEXT(SVPT) ;[462] NO, GET INPUT SPECIFIED SKIPN T1 ;[462] DO WE HAVE SOMETHING? MOVSI T1,'REL' ;[462] NO USE REL MOVEM T1,LEXT ;[462] STORE LOOKUP EXTENSION PUSHJ P,DOLOOK ;[462] IS IT THERE? JRST FIU ;[462] NO, GIVE ERROR SINCE /REL IS SET PUSHJ P,INSREL ;[462] GET THE LINK BLOCK TYPE FROM REL FILE JRST LKRER ;[462] PROBLEM, TRY TO ISOLATE THE ERROR PUSHJ P,SETPRC ;[462] SET THE PROC TYPE FROM TABLE JRST LDREL ;[462] CONTINUE LOADING ; ; There are two cases for falling through here: ; 1) user type /REL ; 2) we only found a .REL file ; LKRER: HLRZ T1,SVEXT(SVPT) ;[462] GET THE USERS SPECIFIED EXTENSION JUMPN T1,RLFER1 ;[462] PROB WITH REL FILE SPECIFIED JRST RLFERR ;[462] ASSUME /REL WAS SPECIFIED DOCOMP: SKIPE SVRPP ;DID WE LOOK ON THIS AREA? JRST REREL ;NO, TRY IT MOVE T1,FL2 ;GET PROCESSOR FLAGS JFFO T1,.+1 ;GET COUNT IN T2 MOVEM T2,PCNUM ;SAVE IT FOR LATER MOVE T3,T2 ;GET THE # OF THE OUTPUT ROUTINE TLNE FL3,NOBINSW ;REL FILE NOT WANTED? JRST [MOVEI T1,"-" ;NO, LOAD T1 CAIN T3,CHNCBL ;IN CASE THIS IS COBOL PUSHJ P,TMPOUT ;WHAT A LOSER COBOL IS JRST DOCOM1] ;BUT LIST ANY RELEVANT SWITCHES SKIPE T2,ODEV ;[244] DID HE SPECIFY A DEVICE? PUSHJ P,OUTDEV ;[244] YES, USE IT. MOVE T2,ONAM ;START PUTTING OUT PUSHJ P,OUTSIX SKIPN T2,OEXT ;[212] EXTENSION EXPLICITLY GIVEN? SKIPE T2,INTEXT(T3) ;[212] NO, SEE IF DEFAULT IS NOT REL PUSHJ P,OUTEXT ;YES IFN SFDSW,< SKIPN T2,OPPN ;[274] OUTPUT PPN GIVEN? SKIPE OSFD ;OR SFD? > IFE SFDSW,< SKIPE T2,OPPN ;[274] OUTPUT PPN GIVEN? > PUSHJ P,SFDPPN ;YES DOCOM1: TRNE FL,PROCS ;[447] local switches ? SKIPA T2,SWBKB ;[447] yes, get them MOVE T2,SWGKB ;[447] get global switches SKIPE T2 ;[447] anything ? PUSHJ P,OUTSW ;YES, OUTPUT THEM TLNE FL2,FORSW ;FORTRAN? IFE DFORTRAN,< ;YES, BUT IS IT F-10 TLNN FL3,F10SW ;DEFINITELY?> IFN DFORTRAN,< TLNE FL3,F40SW ;DEFINITELY NOT> JRST DOCOM2 ;WE DONT WANT FORTRAN-10 DOCOMA: TLNN FL3,OPTSW!NOPTSW ;OPTIMIZER INFO? JRST DOCOMB ;[574] NO, TAKE DEFAULT MOVE T2,['/OPT '] TLNN FL3,OPTSW ;OPTIMIZE? MOVE T2,['/NOPT '] ;NO PUSHJ P,OUTSIX DOCOMB: TLNN FL3,F66SW ;[574] /F66 SEEN? JRST DOCOMC ;[574] NO, TAKE DEFAULT MOVE T2,['/F66 '] ;[574] OUTPUT SWITCH PUSHJ P,OUTSIX ;[574] DOCOMC: TLNN FL3,GFLSW ;[574] /GFLOAT SEEN? JRST DOCOMD ;[574] NO, TAKE DEFAULT MOVE T2,['/GFLO '] ;[574] OUTPUT SWITCH PUSHJ P,OUTSIX ;[574] DOCOMD: TLNN FL3,DEBUGSW ;[221] /DEBUG SEEN? JRST DOCOM2 ;[221] NO MOVE T2,['/DEBUG'] ;[221] OUTPUT SWITCH PUSHJ P,OUTSIX ;[221] SKIPE T2,DEBPRM ;[221] IF ANY PERM SWITCHES MOVE T2,[POINT 7,DEBPRM] ;[221] LOAD POINTER TO THEM SKIPE DEBTMP ;[221] BUT IF TEMP ONES MOVE T2,[POINT 7,DEBTMP] ;[221] USE THEM JUMPE T2,DOCOM2 ;[221] DONE IF NO ARGS MOVE T1,(T2) ;[221] BUT MIGHT JUST BE MARKER SOJE T1,DOCOM2 ;[221] IT WAS MOVEI T1,":" ;[221] DELIMITER PUSHJ P,TMPOUT ;[221] BETWEEN SWITCH AND ARGS ILDB T1,T2 ;[221] GET NEXT CHAR JUMPN T1,.-2 ;[221] END ON NULL DOCOM2: MOVSI T2,'/O' ;[324] GET READY FOR /OPT CAIN T3,CHNCBL ;[324] IS IT COBOL? TLNN FL3,OPTSW ;[324] AND /OPT? CAIA ;[324] NO PUSHJ P,OUTSIX ;[324] YES IFN PASCAL,< CAIE T3,CHNPAS ;[463] IS IT PASCAL? JRST DOCM2B ;[463] NO, SKIP THIS JUNK MOVE T2,['/DEBUG'] ;[463] GET READY FOR /DEBUG TLNN FL3,DEBUGSW ;[463] AND /DEBUG? SKIPGE DEBFL ;[463] OR DEBUG COMMAND? PUSHJ P,OUTSIX ;[463] YES, SO TELL THE COMPILER DOCM2B: > TRNE FL,PROCS ;[447] local switches ? SKIPA T2,SWBKL ;[447] yes, get them MOVE T2,SWGKL ;[447] get global switches SKIPN T2 ;[447] any switches ? TLNE FL3,LISTSW ;[321] OR LISTING REQUESTED? JRST DOCM2A ;[321] YES, OUTPUT THE NAME AND SWITCHES MOVSI T2,',- ' ;NO CAIN T3,CHNCBL ;TEST FOR COBOL PUSHJ P,OUTSIX ;YES JRST NOLST DOCM2A: MOVEI T1,"," ;[321] YES, NEED A COMMA PUSHJ P,TMPOUT TLNN FL2,CBLSW!BLISW ;SKIP /CREF IF COBOL OR BLISS (SPECIAL) TLNN FL3,CRSW ;[314]USE DSK: IF /CREF TRNA ;[314] CHECK FOR /LIST SWITCH IF COBOL JRST DOCOM3 ;[251] SKIPGE T2,SPDLPT ;[321] ELSE, IS THIS /DLIST OR /LIST? PUSHJ P,OUTDEV ;SET LIST DEVICE DOCOM3: MOVE T2,ONAM ;SET IT UP PUSHJ P,OUTSIX IFN SFDSW,< SKIPN T2,OPPN ;[274] OUTPUT PPN GIVEN? SKIPE OSFD ;OR SFD? > IFE SFDSW,< SKIPE T2,OPPN ;[274] OUTPUT PPN GIVEN? > PUSHJ P,SFDPPN ;YES TLNN FL3,CRSW ;CREF MAYBE JRST NOLST1 MOVSI T2,'/C ' PUSHJ P,OUTSIX PUSH P,T3 ;**; at DOCOM3 plus 16 lines change 1 line TLNN FL2,CBLSW!BLISW!SIMSW ;[452] DON'T WRITE /CREF IF ;[452] COBOL, BLISS OR SIMULA PUSHJ P,ENTCRF ;PUT IT IN THE ###CREF FILE POP P,T3 NOLST1: TRNE FL,PROCS ;[447] local switches ? SKIPA T2,SWBKL ;[447] yes, get them MOVE T2,SWGKL ;[447] get global switches SKIPE T2 ;[447] anything ? PUSHJ P,OUTSW NOLST: MOVE T1,SEPTAB(T3) ;[233] GET SEPARATOR PUSHJ P,TMPOUT MOVE T4,SVPT ;SAVE CURRENT POINTER MOVSI SVPT,-NFILE ;RESET TO START PRCLP: SKIPE T2,SVDEV(SVPT) ;IS THERE A DEVICE THERE PUSHJ P,OUTDEV ;YES, PRINT IT MOVE T2,SVNAM(SVPT) ;PUT OUT NAME PUSHJ P,OUTSIX SKIPE T2,SVEXT(SVPT) ;AND EXT IF NECESSARY PUSHJ P,OUTEXT SKIPE T2,SVPPN(SVPT) ;NEED PPN? PUSHJ P,OUTPPN ;PUT THEM OUT TRNE FL,PROCS ;[447] local switches ? SKIPA T2,SWBKS(SVPT) ;[447] yes, get them MOVE T2,SWGKS ;[447] get global switches SKIPE T2 ;[447] anything ? PUSHJ P,OUTSW CAMN T4,SVPT ;ALL DONE? JRST ENDPRC ;YES, GO FINISH UP AND CONSIDER LOADING MOVEI T1,"," PUSHJ P,TMPOUT ;NEXT FILE AOBJN SVPT,PRCLP MOVE SVPT,T4 ;SHOULD NEVER GET HERE ENDPRC: PUSHJ P,OUCRLF IFN FORTRAN,< ;CHOICE OF FORTRAN COMPILERS TLNE FL2,FORSW ;IGNORE IF NOT FORTRAN TLNN FL3,F40SW!F10SW ;AND IF NOTHING OF INTEREST JRST ENDFOR ;SKIP REST OF TESTS TLNN FL3,F40SW ;WHICH ONE? SKIPA T1,['FORTRA'] ;FORTRAN-10 WANTED MOVSI T1,'F40' ;F40 WANTED SKIPN FORPRC ;SETUP ALREADY? MOVEM T1,FORPRC ;NO, DO SO NOW CAMN T1,FORPRC ;[222] SAME VALUE, OR FIRST TIME? JRST ENDFOR ;[222] YES STRING [ASCIZ /%CMLOFC Only one FORTRAN compiler allowed, /] MOVEI T1,[ASCIZ /FORTRAN-10/] ;[222] TLNN FL3,F40SW ;[222] SEE WHICH WE WANTED, USE OTHER MOVEI T1,[ASCIZ /F40/] ;[222] STRING (T1) ;[222] TYPE ONE WE WILL USE STRING [ASCIZ / used /] ENDFOR: > ;[324] CHOICE OF COBOL COMPILERS TLNE FL2,CBLSW ;[324] IGNORE IF NOT COBOL TLNN FL3,C68SW!C74SW ;[324] AND IF NOTHING OF INTEREST JRST ENDCOB ;[324] IGNORE IF NOT COBOL TLNN FL3,C74SW ;[324] WHICH ONE? SKIPA T1,['COBOL '] ;[324] COBOL-68 WANTED MOVE T1,['CBL74 '] ;[324] COBOL-74 WANTED SKIPN COBPRC ;[324] SETUP ALREADY? MOVEM T1,COBPRC ;[324] NO, DO SO NOW CAMN T1,COBPRC ;[324] SAME VALUE, OR FIRST TIME? JRST ENDCOB ;[324] YES STRING [ASCIZ /%CMLOCC Only one COBOL compiler allowed, /] MOVEI T1,[ASCIZ /COBOL-68/] ;[324] TLNN FL3,C68SW ;[324] SEE WHICH WE WANTED, USE OTHER MOVEI T1,[ASCIZ /COBOL-74/] ;[324] STRING (T1) ;[324] TYPE ONE WE WILL USE STRING [ASCIZ / used /] ENDCOB: IFN SPRC,< TLNN FL2,SPRC > JRST NOCOMP ;GO LOAD IFN SPRC,< MOVSI SVPT,-NFILE ;RESET POINTER MOVE T1,ONAM ;AND FAKE WORLD ;**; [444] at ENDCOB plus 9 lines MOVEM T1,SVNAM(SVPT) ;PUT IT AS CURRENT FILENAME MOVE T3,PCNUM ;GET BACK PROCESSOR NUMBER MOVE T1,INTEXT(T3) ;GET EXTENSION MOVEM T1,SVEXT(SVPT) ;AND PUT IT AS CURRENT EXTENSION SETZM SVPPN(SVPT) SETZM SWBKS(SVPT) SETZM SWBKB(SVPT) SETZM SWBKL(SVPT) HRL FL2,NXPC(T3) ;SET FOR NEXT PROCESSOR JRST DOCOMP ;AND GO EMIT CALLS > ;HERE TO TEST FOR /LIB ;COMPLICATED BY FACT THAT FOO.LIB IS PROBABLY BINARY ;THEREFORE ONLY COMPIL IF EXT IS A KNOWN ONE ; I.E. FOR, F40, MAC, ALG, CBL, BLI, FAI ETC ;OR NULL LBCOMP: TLNN FL3,LIBSW ;/LIB? JRST DOCOMP ;NO, RECOMPILE MOVE T1,FL2 ;GET PROCESSOR FLAGS JFFO T1,.+1 ;COUNT THE EASY WAY HLLZ T1,SVEXT(SVPT) ;GET EXT OF INPUT JUMPE T1,DOCOMP ;RECOMPILE IF NULL EXT CAME T1,F4 ;ALTERNATIVE FORTRAN EXT CAMN T1,PXTAB+1(T1+1);TEST AGAINST EXPECTED EXT JRST DOCOMP ;IT IS SO RECOMPILE IFN BLISS,< CAMN T1,B10 ;TEST AGAINST ALTERNATIVE EXT JRST DOCOMP ;YES, SO RECOMPILE > MOVEM T1,OEXT ;FAKE OUTPUT EXT SO LOADER SEES IT TLO FL2,RELSW ;[433] REMEMBER THIS IS A REL FILE JRST LDREL ;NOT, SO ASSUME BINARY SFDPPN: MOVEI T1,"[" ;START OUT RIGHT HRRZM T2,SAVPPN ;SAME CODE AS OUTPPN (ALMOST) PUSHJ P,TMPOUT HLRZ T1,T2 ;GET NUMBER (LH) JUMPE T1,LSFP1 ;ZERO IS JUST PUSHJ P,OUTOCT LSFP1: MOVEI T1,"," ;[441] output a comma PUSHJ P,TMPOUT SKIPE T1,SAVPPN ;[155] PPN SPECIFIED? PUSHJ P,OUTOCT IFN SFDSW, SFDPP1: > ;END OF IFN SFDSW MOVEI T1,"]" PJRST TMPOUT LDREL: TRNE SVPT,-1 ;CHECK FOR ONLY ONE FILE JRST NOSRCS ;[565] IF MORE THAN ONE, THERE IS AN ERROR NOCOMP: SKIPE FDGFLG ;NEED TO MAKE FUDGED LIBRARY? PUSHJ P,ENTFUD ;YES TRNN FL,DOLOD ;DO WE WANT TO LOAD? JRST NXFILP ;NO, GO TO NEXT MOVEI C,0 IDPB C,LODSP ;END SECOND SET OF SWITCHES IDPB C,LODSP2 MOVEI T3,CHNLNK ;[441] SET FOR LINK ;**; [444] at NOCOMP plus 7 TRZE FL,LODOUT ;IS THERE ALREADY OUTPUT THERE? PUSHJ P,[ MOVEI T1,"," ;YES PJRST TMPOUT] ;YES, ALL ON SAME LINE SAVES TIME ;**; [444] at NOCOMP plus 9 SKIPL DEBFL ;DEBUG SEEN AND NOT YET SET? JRST NODDT ;NO SKIPE T1,DDTFL ;[221] PRE-EMPTED AOJA T1,[JUMPN T1,[PUSH P,DDTFL ;[221] STORE DEBUG AID JRST GETDD1] ;[221] BYPASS TEST FOR COMP TYPE MOVSI T2,'/D ' ;DDT BY DEFAULT JRST ND2] ;[441] go out everything HLLZ T1,FL2 ;GET PROCESSOR MOVEI T2,^L-22 ;PRESET INCASE REL ONLY TLNE T1,ALPROC-RELSW ;SEE IF ANY SET JRST GETDDT ;YES, FIND OUT WHICH SKIPGE DEFPRO ;[303] DID WE USE DEFAULT PROCESSOR ? JRST USEDEF ;[303] THEN SKIP LOCAL PROCESSOR TEST HRLZ T1,FL2 ;TRY LOCAL PROCESSOR SWITCHES TLNE T1,ALPROC-RELSW GETDDT: JFFO T1,.+1 ;YES, SO SEE WHICH USEDEF: PUSH P,DEBAID(T2) ;STORE NAME skipn (p) ;[220] if no debug aid jrst NDBA ;[220] then return move t1,prcnam(t2) ;[220] else get process name movem t1,0(p) ;[220] to replace debug aid NDBA: ;[441] no debug aid CAIN T2,^L-22 ;COBOL IS A LOSER JRST [SOS DEBFL ;AS IT MUST LOAD COBDDT JRST NODDT1] ;AFTER MAIN PROG GETDD1: MOVSI T2,'/D ' SKIPE (P) ;BUG IN SCAN (LINK-10) TLO T2,' :' ;OBJECTS TO /D: FOR DDT PUSHJ P,OUTSIX POP P,T2 ;[165] GET NAME OF DEBUGGING AID CAMN T2,[SIXBIT/FORTRA/] ;[303] FORDDT ? JRST FOR ;[303] YES--PROCESS DIFFERENTLY TLNE FL3,F10SW ;[312] F10 SWITCH SEEN JRST [MOVE T2,[SIXBIT/:/] ;YES INCLUDE FORDDT PUSHJ P,OUTSIX ;[312] MOVE T2,[SIXBIT/FORTRA/] ;[312] JRST ND2] ;[441] go output everything JUMPE T2,ND2P1 ;[165] IGNORE IF 0 JRST ND2 ;[441] output everything MOVSI T2,'/T ' ;USE DDT SKIPN (P) ;IF NULL PUSHJ P,OUTSIX MOVE T2,['SYS: '] ;GET IT FROM SYS SKIPE (P) ;IF NEEDED PUSHJ P,OUTSIX POP P,T2 ;RECOVER FILE JUMPE T2,NODDT ;DONE PUSHJ P,OUTSIX MOVE T2,[',/E/L '] ;[441] LINK-10 switches & separators JRST ND2 ;[441] output everything NODDT1: MOVE T2,[SIXBIT/COBOL/] ;[440] COBDDT IS DEBUGGING AID MOVEM T2,0(P) ;[440] USE INSTEAD OF PROCESS MOVE T2,['/E/L '] ;[441] LINK-10 switches for COBOL JRST ND2 ;[441] output it all FOR: TLNE FL3,F40SW ;[312] F40 SWITCH SEEN JRST [MOVE T2,[SIXBIT/DDT/] ;[312] USE DDT ONLY JRST ND2] ;[441] output everything PUSH P,T2 ;[312] SAVE NAME ON STACK MOVE T2,[SIXBIT/(DDT,/] ;[303] LOAD REGULAR PUSHJ P,OUTSIX ;[303] DDT AS WELL AS POP P,T2 ;[303] FORDDT. PUSHJ P,OUTSIX ;[303] . . MOVSI T2,') ' ;[303] . . ND2: PUSHJ P,OUTSIX ;[441] common code for most of the above ND2P1: PUSHJ P,OUTSPC ;[441] NODDT: MOVE T2,[POINT 7,LODSBK] ;OUTPUT FIRST SWITCHES PUSHJ P,OUTSW MOVSI T2,'DSK' TLNE FL2,RELSW ;[573] DO WE HAVE A REL FILE? LODR0: SKIPE T2,LOKNAM ;ON NON-DISK DEVICE? LODR3: PUSHJ P,OUTDEV ;YES. OUTPUT DEVICE LODR1: MOVE T2,ONAM ;[444] IN WHICH CASE USE ONAM PUSHJ P,OUTSIX TLNN FL2,RELSW ;REL JRST [SKIPE T2,OEXT ;[444] OUTPUT EXTENSION GIVEN? PUSHJ P,OUTEXT ;YES TLNN FL3,LIBSW ;IF LIBRARY JRST ELOD3 ;NO, CONTINUE JRST LODR2] ;YES TRNN FL2,RELSW ;[602] ONLY PUT OUT EXT IS /REL GIVEN JRST LODR4 ;[605] ON TO THE PPN SKIPE T2,SVEXT(SVPT) ;ALSO USE EXT IF GIVEN PUSHJ P,OUTEXT LODR4: SKIPE T2,SVPPN(SVPT) ;[605] OUTPUT PPN IF SPECIFIED PUSHJ P,OUTPPN LODR2: MOVSI T2,'/S ' ;[602]USES SEARCH TLNN FL3,LIBSW ;LIBRARY? JRST ELOD ;NO PUSHJ P,OUTSIX PUSHJ P,OUTSPC ;NEEDS SPAC SETOM NSWTCH ;[236] SIGNAL /L LAST ELOD: MOVE T2,[POINT 7,LODSB2] ;[174] OUTPUT SECOND SET OF SWITCHES PUSHJ P,OUTSW SKIPN T2,FORLIB ;FORSE/FOROTS SWITCH SET? JRST ELOD2 ;NO MOVE T2,[ '/FORSE' '/FOROT']-1(T2) ;[242] YES, GET RIGHT NEW SWITCH PUSHJ P,OUTSIX ;[242] AND TYPE THE SWITCH SETZM FORLIB ;ONLY DO IT ONCE PUSHJ P,OUTSPC ELOD2: TRO FL,LODOUT ;MARK AS HAVING OUTPUT THERE AOSL DEBFL ;ARE WE FINISHED WITH DDT? JRST NXFILP TRNN FL,DOLOD ;[441] are we loading? JRST ELCBL ;[441] no, must be COBOL MOVSI T2,'/D:' ;YES, PUT AFTER FILE NAME PUSHJ P,OUTSIX POP P,T2 ;[220] fixed to be correct PUSHJ P,OUTSIX PUSHJ P,OUTSPC JRST ELOD4 ;OUTPUT /DEBUG:COBOL ELCBL: MOVE T2,[',SYS: '] ;NO, MUST BE COBOL PUSHJ P,OUTSIX POP P,T2 ;GET FILE PUSHJ P,OUTSIX ELOD4: AOS DEBFL ;AT LAST JRST NXFILP ELOD3: IFN SFDSW,< SKIPN T2,OPPN ;[274] OUTPUT PPN GIVEN? SKIPE OSFD ;OR SFD? > IFE SFDSW,< SKIPE T2,OPPN ;[274] OUTPUT PPN GIVEN? > PUSHJ P,SFDPPN ;YES JRST ELOD ;AND CONTINUE ;HERE TO CHECK REL FILE TO SEE IF IT IS WHAT WE EXPECT ;MAINLY FOR F40 VS FORTRAN-10 ;RETURN ;+1 FILE NOT OK, SHOULD RECOMPILE ;+2 FILE OK CHKREL: PUSHJ P,INSREL ;INSPECT REL FILE, T2 POINTS TO WORD IN FILE POPJ P, ;ERROR, SO RECOMPILE ;T3 CONTAINS TYPE ;T2 CONTAINS CPU INFO SOJE T3,CHKF40 ;1=F40 CAIE T3,L%F10-1 ;[324] MAKE SURE ITS FORTRAN-10 JRST CHKCBL ;[324] NO, TRY COBOL CHKFOR: ;10 IS FORTRAN-10 IFE DFORTRAN,< ;IF DEFAULT IS F40 TLNN FL3,F10SW ;RECOMPILE UNLESS DEFINITELY WANTS F-10 > IFN DFORTRAN,< ;BUT IF DEFAULT IS F-10 TLNE FL3,F40SW ;RECOMPILE ONLY IF DEFINITELY WANTS F40 > POPJ P, CPOPJ1: AOS (P) ;[176] SKIP RET, THIS REL WILL DO POPJ P, CHKF40: ;HERE IF FOUND REL WAS F40 STYLE IFE DFORTRAN,< ;IF DEFAULT IS F40 TLNN FL3,F10SW ;RECOMPILE ONLY IF DEFINITELY WANTS F10 > IFN DFORTRAN,< ;BUT IF DEFAULT IS F10 TLNE FL3,F40SW ;RECOMPILE UNLESS DEFINITELY WANTS F40 > AOS (P) ;SKIP RET, THIS FILE WILL DO POPJ P, ;[324] HERE FOR COBOL REL FIL CHKCBL: SOJE T3,CHKC68 ;[324] 2=COBOL-68 CAIE T3,L%C74-2 ;[324] MAKE SURE ITS COBOL-74 JRST CPOPJ1 ;[324] NO, SO LEAVE ALONE ;[324] HERE IF REL FILE WAS COBOL-74 IFE DCOBOL,< ;[324] IF DEFAULT IS COBOL-68 TLNE FL3,C74SW;[324] RECOMPILE UNLESS DEFINITELY WANTS COBOL-74 > IFN DCOBOL,< ;[324] BUT IF DEFAULT IS COBOL-74 TLNN FL3,C68SW;[324] RECOMPILE ONLY IF DEFINITELY WANTS COBOL-68 > AOS (P) ;[324] SKIP RET, THIS FILE WILL DO POPJ P, ;[324] RECOMPILE ;HERE IF REL FILE WAS COBOL-68 CHKC68: IFE DCOBOL,< ;[324] IF DEFAULT IS COBOL-68 TLNN FL3,C74SW;[324] RECOMPILE ONLY IF DEFINITELY WANTS COBOL-74 > IFN DCOBOL,< ;[324] BUT IF DEFAULT IS COBOL-68 TLNE FL3,C68SW;[324] RECOMPILE UNLESS DEFINITELY WANTS COBOL-68 > AOS (P) ;[324] SKIP RET, THIS FILE WILL DO POPJ P, ;[324] RECOMPILE ;HERE TO READ REL FILE IN USERS [DIRECTORY] ON DSK ;RETURNS ;+1 FILE ERROR, FORCE RECOMPILATION ;+2 FILE READ, T3 = PROCESSOR CODE ; T2 = CPU TYPE INSREL: INSRL1: SKIPGE LOOKBF ;[564] DO WE HAVE BUFFERS? JRST INSRIN ;[564] YES, CONTINUE MOVE T1,DSKBUF ;[564] GET DISK BUFFER ADDRESS EXCH T1,.JBFF ;[564] SET .JBFF TO DSKBUF ADDRESS INBUF LOOK,2 ;[241]SETUP THE BUFFERS EXCH T1,.JBFF ;[564] RESTORE .JBFF TO ORIGINAL VALUE INSRIN: IN LOOK, ;YES, MUST CHECK FOR DEBUGGER DATA JRST INSRL3 ;IN OK, PICKUP BUFFER ADDRESS POPJ P, ;[564] ERROR - FORCE RECOMPILE INSRL3: MOVE T2,LOOKBF ;GET BUFFER POINTER ADDI T2,2 ;POINT TO FIRST DATA WORD INSNXT: HLRZ T3,(T2) ;GET LOADER BLOCK TYPE CAIN T3,6 ;LOOK FOR NAME BLOCK JRST FNDTY6 ;FOUND IT CAIE T3,4 ;MUST BE EITHER ENTRY OR NAME JRST INSERR ;[462] IF NOT A REL FILE, THEN DON'T REASSEMBLE HRRZ T3,(T2) ;GET WORD COUNT CAIG T3,^D18 ;MORE THAN 1 SUB BLOCK? AOJA T3,INSNXB ;NO IDIVI T3,^D18 ;YES, ACCOUNT FOR 1 BYTE WORD IMULI T3,^D19 ;PER 18 WORD SUB BLOCK JUMPE T4,INSNXB ;ANY REMAINDER? ADDI T3,1(T4) ;YES, DON'T FORGET BYTE WORD INSNXB: ADDI T2,1(T3) JRST INSNXT ;TRY AGAIN FNDTY6: HRRZ T3,0(T2) ;GET WORD COUNT SOSLE T3 ;USE ZERO IF NO 2ND WORD HLRZ T3,3(T2) ;GET PROCESSOR TYPE FROM 2ND DATA WORD HRRZ T2,T3 ;AND COPY FOR CPU INFO ANDI T3,7777 ;BITS 6-17 LSH T2,-^D12 ;BITS 0-5 TRNA ;[462] SKIP THE ERROR JUMP ENTRY INSERR: SETZ T3, ;[462] CLEAR TYPE IF NOT REL FILE CLOSE LOOK, ;[564] CLOSE FILE OPEN LOOK,DSKLK ;[603] SET LOOK BACK TO DSK SKIPA ;[603] SHOULD NEVER HAPPEN AOS 0(P) ;[176] SET SKIP RETURN POPJ P, ;[462] ; This routine sets up for a DOLOOK call by setting up ; LPPN and associated locations for lookups. ; T1/ contains file pointer ; Returns: ; T2/ pointer to LSFDAD or SVPPN if SFDSW is 0 ; Always returns with POPJ, no skip return. ; SETPTH: MOVE T2,SVPPN(T1) ;[462] GET USER SPECIFIED PPN IFN SFDSW,< SKIPN SVSFD(T1) ;[462] ANY SFD'S? JRST NXSFD ;[462] NO MOVEM T2,LSFDPP ;[462] SAVE PPN X== ;[462] INITIAL CONDITION REPEAT SFDLEN,< MOVE T2,SVSFD+X(T1) MOVEM T2,LSFD+Y X==X+NFILE Y==Y+1 > MOVEI T2,LSFDAD ;[462] POINTER TO PATH NXSFD: > ;[462] END OF IFN SFDSW MOVEM T2,LPPN ;[462] STORE THE POINTER OR PPN POPJ P, ;[462] RETURN ; ;[462] This routine will set the processor type from the REL file. ; It will also recognize processor conflicts and take an error ; path if necessary. The compiler codes in table CMPCOD are ; expanded from the macro CMPTBL. These codes are taken from the ; LINK version 5 manual, page A-13. Those compiler types that ; COMPIL does not know, have zero entries which cause no action. ; ; Assumes: ; T3/ contains compiler type, usually set by INSREL ; Returns: +1 ; T3/ contains processor flags ; SETPRC: SKIPLE T3 ;[462] CHECK LOW RANGE CAMLE T3,CMPLEN ;[462] CHECK HIGH RANGE POPJ P, ;[462] DO NOTHING IF BAD SKIPN T3,CMPCOD(T3) ;[462] GET THE PROC CODE POPJ P, ;[462] IF ZERO, DO NOTHING TLO FL2,(T3) ;[462] SET THE FLAG FOR THIS PROC POPJ P, ;[462] AND RETURN ; ; The X macro takes two arguments: ; A = compiler type code ; B = processor flags to set in FL2 ; DEFINE CMPTBL,< X 0,UNKSW ;;Code 0, unknown X 1,FORSW ;;Code 1, F40 X 2,CBLSW ;;Code 2, COBOL-68 X 3,ALGSW ;;Code 3, ALGOL X 6,BLISW ;;Code 6, BLISS X 7,SAISW ;;Code 7, SAIL X 10,FORSW ;;Code 10, FORTRAN-10 X 11,MACSW ;;Code 11, MACRO X 12,FAISW ;;Code 12, FAIL X 15,SIMSW ;;Code 15, SIMULA X 16,CBLSW ;;Code 16, COBOL-74 X 24,PASSW ;;Code 24, PASCAL-36 > SALL GETPRO: MOVSI T1,-NFILE ;NUMBER OF FILES TRNN FL2,-1 ;[303] LOCAL PROCEESOR SET ? SETOM DEFPRO ;[303] SET FLAG SAYING DEFAULT PROC USED TRNN FL2,-1 ;LOCAL PROCESSOR SET? HRR FL2,DFPROC ;NO, SET FROM GLOBAL TRNE FL2,RELSW ;IF USER SAID /REL TRNE FL3,COMPLS ;AND NOT /COMP JRST GETPR1 ;NOT TRUE TLO FL2,RELSW ;DON'T WASTE TIME ON LOOKUPS PUSH P,SVDEV(T1) ;AND COPY "SOURCE" DEVICE POP P,LOKNAM ;TO OUTPUT DEVICE POPJ P, ;JUST SET PROCESSOR=LOADER GETPR1: SETOM PTHBLK ;[246] SETUP TO FIND THIS JOB'S PATH MOVE T3,[3,,PTHBLK] ;[246] POINT TO 3 WORD PATH BLOCK PATH. T3, ;[246] FIND USER'S DEFAULT PATH SETZM PTHBLK+1 ;[246] NO LIB: IF NO PATH MOVE T3,PTHBLK+1 ;[246] GET PATH FLAGS TRNN T3,20 ;[246] DOES USER HAVE A LIBRARY? SETZM PTHBLK+2 ;[246] NO, ONLY 1 PASS NEEDED. SKIPE T3,SVPPN(T1) ;[246] DID USER TYPE A PPN? SKIPN PTHBLK+2 ;[246] AND HAS HE A LIBRARY? SKIPA ;[246] NO, FORGE AHEAD MOVEM T3,PTHBLK+2 ;[246] YES, PUT "MUST MATCH" PPN IN GETPR2: MOVEI T3,1 ;[246] SET UP LOOK OF EXTENSION POINTER NFIL: MOVE T2,SVNAM(T1) ;SET UP NAME AND PPN MOVEM T2,LNAM HLLZ T2,SVEXT(T1) NXEXT: MOVEM T2,LEXT ;START WITH ORIGINAL EXT MOVEM T2,OLDEXT ;SAVE FOR RAS SYSTEM PUSHJ P,SETPTH ;[462] SET UP LOOKUP BLOCK SKIPN T2,SVDEV(T1) ;A DEVICE? SKIPE T2,LOKNAM ;OR SAVING ONE UP JRST ALTDEV OKLOOK: PUSHJ P,DOLOOK ;[316] DO THE LOOKUP JRST NOTYET ;HAVE NOT FOUND IT YET DNLOK: HLLZ T2,LEXT ;GET THE EXTENSION CAME T2,OLDEXT ;WAS IT WHAT WE ASKED FOR JRST NOTYET ;TREAT AS IF LOOKUP FAILED HLLM T2,SVEXT(T1) ;[207] SAVE EXT (WILL HELP <> CODE) DNLOK1: PUSHJ P,CHKAGE ;[317] CHECK AGE OF CURRENT FILE JRST OLDAT ;[317] OLDER FILE LDB T2,[POINT 12,LDAT,35] ;GET LOW 12 BITS OF DATE LDB T3,[POINT 3,LEXT,20] ;GET HIGH 3 BITS OF DATE DPB T3,[POINT 3,T2,23] ;MERGE THE TWO PARTS MOVEM T2,SDAT ;[317] STORE THE DATE LDB T2,[POINT 11,LDAT,23] SETTM: MOVEM T2,STIM ;MARK WITH LATER ONE MOVE T2,EBLK+.RBTIM ;[317] GET THE INTERNAL CREATION DATE/TIME MOVEM T2,ETIM ;[317] STORE IT OLDAT: HLLZ T2,LEXT ;GET THE EXTENSION WE FOUND JUMPE T2,SETCP ;SET TO CURRENT PROCESSOR MOVSI T3,- ;LOOK AT EXTENSION TO FIND PROCESSOR CAMN T2,F4 ;TEST FOR ALT FORTRAN EXT JRST [HRROI T3,^L-21 ;FAKE FORTRAN SEEN JRST LOLD1] ;AND PROCCESS IT [441] use LOLD1 CAME T2,PXTAB(T3) AOBJN T3,.-1 LOLD1: IFE BLISS,< JUMPGE T3,SETCP ;NOT THERE > IFN BLISS,< JUMPL T3,LBLS1 ;JUMP IF FOUND SOMETHING CAME T2,B10 ;IS IT ALTERNATIVE BLISS EXT JRST SETCP ;NO HRROI T3,CHNBLI+1 ;YES, SET FOR BLISS LBLS1: > TLNE FL2,@ISPTAB(T3) ;IS THAT ONE ALREADY SET? JRST NFIL2 TLNE FL2,ALPROC ;IS ANY SET? JRST FIXCON ;YES, WE MAY HAVE A CONFLICT TLO FL2,@ISPTAB(T3) ;SET UP FOR THIS ONE NFIL2: CAME T1,SVPT ;ARE WE DONE? NFIL1: AOBJN T1,GETPR1 ;NO, GO ON POPJ P, ;THERE IS NO CONFLICT IF THIS IS A REL FILE FIXCON: MOVE T2,ONAM CAMN T2,LNAM TRNE T3,-1 ;IF NOT OUTPUT REL FILE JRST PROCON ;THEN WE HAVE A CONFLICT FIX1: SETOM STIM ;[247] FORCE REL FILE USEAGE SETOM SDAT ;[247] BY MAKING SOURCE OLD POPJ P, ;AND RETURN TO SETUP SETCP: CAME T1,SVPT ;AT END? JRST NFIL1 ;NO, DO NOT SET TLNN FL2,ALPROC ;SOMETHING ALREADY SET? HRL FL2,FL2 ;NO, SET TO CURRENT PROCESSOR POPJ P, ;AND DONE NOTYET: MOVE T2,SVEXT(T1) ;GET THE CURRENT EXT JUMPN T2,OKREL ;IF HE SPECIFIED AN EXT WE LOSE TLZE T3,-1 ;WAS THIS A RETRY WITH ALT EXT? JRST NOTYT1 ;YES, ONLY DO IT ONCE CAIN T3,CHNFOR+2 ;FORTRAN USES EITHER .FOR OR .F4 MOVE T2,F4 ;SO TRY OTHER IFN BLISS,< CAIN T3,CHNBLI+2 ;BLISS USES .BLI OR .B10 MOVE T2,B10 ;TRY OTHER > JUMPE T2,NOTYT1 ;NO SUCH LUCK TLO T3,-1 ;MARK IT SO WE DONT LOOP JRST NXEXT ;AND TRY AGAIN NOTYT1: JUMPE T3,NOTYT2 ;TRIED ALL IF ZERO MOVE T2,PXTAB(T3) ;ELSE PICK UP ONE CAIG T3,NPROCS ;SEE IF LIST EXHAUSTED AOJA T3,NXEXT ;NO, TRY THIS ONE SKIPN PTHBLK+2 ;[246] WAS THIS ONLY PASS 1? JRST LNTY1 ;[246] NO, FORGET IT SETZM PTHBLK+2 ;[246] YES, RETRY WITH LIBRARY JRST GETPR2 ;[246] AND TRY AGAIN LNTY1: TLNE FL3,COMPLS ;[175] /COMP SEEN? JRST NOTYT2 ;[175] YES - DON'T TRY /REL SETZ T3, ;YES, TRY REL AS LAST RESORT MOVE T2,PXTAB JRST NXEXT NOTYT2: HLLZ T2,SVEXT(T1) ;GET THE ORIGINAL EXT HLLM T2,LEXT ;[266] JRST NOFIL ;ARE OUT OF THINGS TO TRY ;MAKE IT OKAY IF THE OUTPUT REL FILE IS THERE OKREL: SKIPN PTHBLK+2 ;[250] WAS LIB: SEARCHED? JRST NOFIL ;[441] OUT OF THINGS TO TRY SETZM PTHBLK+2 ;[250] NO, SEARCH IT NOW JRST GETPR2 ;[250] ... ;ROUTINE TO DO LOOKUPS EITHER NORMAL OR EXTENDED DOLOOK: SKIPE EXTEND ;[316] IS FILE ON DISK? JRST ELOOK ;[316] YES, DO EXTENDED LOOKUP LOOKUP LOOK,LNAM ;[316] NO, USE SHORT FORM POPJ P, ;[316] NOT FOUND - NON SKIP RETURN JRST ELOOK1 ;[316] FOUND - SKIP RETURN ELOOK: MOVEI T2,.RBTIM ;[240] DO EXTENDED LOOKUP MOVEM T2,EBLK ;[240] SETUP LOOKUP BLOCK.. MOVE T2,LPPN ;[240] MOVEM T2,EPPN ;[240] LOOKUP LOOK,EBLK ;[240] DO THE LOOKUP POPJ P, ;[316] NOT FOUND - NON SKIP RETURN SKIPE T2,PTHBLK+2 ;[246] FORCING PPNS TO MATCH? CAMN T2,EPPN ;[246] AND DO THEY? ELOOK1: AOS (P) ;[316] GOOD LOOKUP, SET UP TO SKIP POPJ P, ;[316] RETURN ALTDEV: MOVEM T2,LOKNAM ;SAVE FOR LATER MOVEM T2,SVDEV(T1) ;AND IN DEVICE FOR OUTPUT DEVCHR T2, ;GET CHARACTERISTICS TLNE T2,200000 ;A DSK? JRST ALTDSK ;YES TLNE T2,4 ;A DECTAPE? JRST ALTDAT ;YES, TRO FL,NODAT ;NO DATES ON OTHER DEVICES JRST OLDAT ;DON'T BOTHER WITH LOOKUP ALTDSK: MOVSI T2,'DSK' CAMN T2,LOKNAM ;LOGICAL NAME? JRST OKLOOK ;NO, STILL DSK ALTDAT: TRZ FL,NOLOOK ;NOT FAILED YET OPEN LOOK,LOKINT ;OPEN FOR INPUT JRST DEVNA ;NOT THERE PUSHJ P,DOLOOK ;[316] DO THE LOOKUP TRO FL,NOLOOK ;NO OPEN LOOK,DSKLK ;GET THE DSK BACK JRST DSKNA ;I HOPE THIS NEVER HAPPENES TRZE FL,NOLOOK ;SEE IF FAILED JRST NOTYET ;IT DID MOVE T2,LOKNAM ;[316] GET DEVICE NAME DEVCHR T2, ;[316] GET CHARACTERISTICS TLNN T2,100 ;[316] DECTAPE? JRST DNLOK ;NO, BUT LOOKUP HAPPENED HLRZ T2,LEXT ;GET EXTENSION LOOKED UP CAIE T2,'REL' AOS LDAT ;IF SOURCE FILE MAKE IT MIDNIGHT TONIGHT JRST DNLOK ;AND CONTINUE IFE STANSW,< OUTPPN: HRRZM T2,SAVPPN ;CONVERT TO SIXBIT FOR OUTPUT MOVEI T1,"[" ;START OUT PUSHJ P,TMPOUT HLRZ T1,T2 ;GET NUMBER JUMPE T1,.+2 ;JUST COMMA IF ZERO PUSHJ P,OUTOCT MOVEI T1,"," PUSHJ P,TMPOUT SKIPE T1,SAVPPN PUSHJ P,OUTOCT IFN SFDSW,< SKIPE SVSFD(SVPT) ;AN SFD SEEN? PUSHJ P,OUTSFD ;YES > MOVEI T1,"]" JRST TMPOUT OUTOCT: IDIVI T1,10 ;OCTAL OUTPUT HRLM T2,(P) SKIPE T1 PUSHJ P,OUTOCT HLRZ T1,(P) ADDI T1,"0" PJRST TMPOUT > SUBTTL OUTPUT ROUTINES OUTSIX: MOVEI T1,0 LSHC T1,6 ADDI T1,40 PUSHJ P,TMPOUT JUMPN T2,OUTSIX CPOPJ: POPJ P, OUTSPC: MOVEI T1," " PJRST TMPOUT IFN STANSW,< OUTPPN: MOVEM T1,SAVPPN ;SAVE IT AWAY ANDCMI T2,-1 MOVEI T1,"[" PUSHJ P,TMPOUT PUSHJ P,OUTSIX ;PRINT IT MOVEI T1,"," ;AND A COMMA PUSHJ P,TMPOUT HRLZ T2,SVPPN PUSHJ P,OUTSIX MOVEI T1,"]" JRST TMPOUT > ; ;[450] Routine to output a set of switches. This routine defines a ; switch as a string of non-blank characters delimited by a ; blank. A set of switches is a series of multiple switches ; delimited by a null. ; OUTSW: MOVEM T2,SVSWP ;SAVE THE POINTER OUTSW2: ILDB T1,SVSWP ;GET 1ST CHAR JUMPE T1,OUTSW5 ;ALL DONE IF NULL CAIN T1," " ;IGNORE LEADING BLANKS JRST OUTSW2 ;AND MULTIPLE BLANKS MOVEI T1,"/" ;A SLASH SAYS THIS IS A SWITCH PUSHJ P,TMPOUT ;SO TELL WHOMEVER LDB T1,SVSWP ;GET FIRST NON-BLANK CHAR AGAIN CAIA ;AND PROCESS IT OUTSW3: ILDB T1,SVSWP ;GET NEXT CHAR JUMPE T1,OUTSW5 ;IS THIS NULL? (IF YES, DONE) PUSHJ P,TMPOUT ;NON-NULL SO OUTPUT THIS CHAR CAIN T1," " ;WAS THAT A BLANK? JRST OUTSW2 ;YES, END OF SWITCH SO GET A NEW ONE JRST OUTSW3 ;NO, LOOP UNTIL DONE OUTSW5: MOVEI T1," " ;OUTPUT BLANK PJRST TMPOUT ;AND RETURN SUBTTL CREF ENTCRF: MOVE T1,CORTOP ;CHECK TO SEE IF NAME ALREADY THERE MOVE T2,ONAM ENTC1: CAMN T1,CORT1 JRST ENTC2 CAMN T2,1(T1) POPJ P, ;NAME THERE, EXIT AOJA T1,ENTC1 ;CHECK ANOTHER ENTC2: MOVEM T2,@CORTOP ;SAVE IT SOS T1,CORTOP CAMG T1,SVJFF ;CHECK TO SEE IF CORE EXCEEDED PUSHJ P,XPAND MOVEI T3,CHNCRF MOVEI T1,"=" ;[233] PUSHJ P,TMPOUT MOVE T2,ONAM PUSHJ P,OUTSIX IFN SFDSW,< SKIPN T2,OPPN ;OUTPUT PPN GIVEN? SKIPE OSFD ;OR SFD? > IFE SFDSW,< SKIPE T2,OPPN ;OUTPUT PPN GIVEN? > PUSHJ P,SFDPPN ;YES PJRST OUCRLF FINCRF: MOVSI IOPNT,-2 ;PERMIT ONLY THIS ONE LEVEL TRO FL,INCRF ;SAY WE ARE FINISHING MOVEM P,SVPDL ;SAVE THE PDL FOR LATER MOVE T1,[POINT 7,CRFRDR] MOVEM T1,DINPT FINC1: PUSHJ P,SCAN ;GET SOMETHING TRNN FL,IDF ;IGNORE ALL BUT IDENTIFIERS JRST FINC1 MOVE T1,ACCUM MOVEM T1,ONAM ;SET AS NAME PUSHJ P,ENTCRF ;ENTER IT JRST FINC1 DNCRF: MOVEI T3,CHNCRF PUSHJ P,TMPCHK ;CLOSE OUTPUT MOVE P,SVPDL ;GET THE ENTERING PDL BACK TRZ FL,INCRF ;NO LONGER THERE POPJ P, SUBTTL FUDGE CHNFUD==CHNPIP SETFUD: SKIPE FDGFLG ;ENTER DONE ALREADY? POPJ P, ;YES , RETURN MOVEI T3,CHNFUD ;USE PIP FOR NOW PUSHJ P,SCAN ;LOOK AT NEXT CHAR CAIE C,":" ;THERE BETTER BE A NAME GOTO SYNERR ;YOU LOSE AOBJP SVPT,NESTTD ;MAKE SPACE FOR FIELDS TRO FL,F.STKY ;[302] SET FLAG FOR NO STICKINESS PUSHJ P,SCANAM ;GO GET THEM TRZ FL,F.STKY ;[302] CLEAR FALG SKIPE T2,SVDEV(SVPT) ;A DEVICE? PUSHJ P,OUTDEV ;YES SKIPN T2,SVNAM(SVPT) ;THERE HAS TO BE A NAME GOTO SYNERR ;NOT FOUND PUSHJ P,OUTSIX ;OUTPUT IT SKIPN T2,SVEXT(SVPT) ;EXTENSION? MOVSI T2,'REL' ;USE REL IF MISSING PUSHJ P,OUTEXT SKIPE T2,SVPPN(SVPT) ;PPN PUSHJ P,OUTPPN ;YES SUB SVPT,[1,,1] ;BACK AS IT WAS MOVSI T2,'/B=' ;[233] FORSE BINARY PUSHJ P,OUTSIX SETOM FDGFLG ;ONLY DO IT ONCE PJRST SCAN ;RETURN VIA SCAN ENTFUD: PUSH P,T3 ;SAVE T3 MOVEI T3,CHNFUD ;USE PIP TIL FUDGE2 FIXED FOR CCL MOVEI T1,"," ;SETUP COMMA SKIPL FDGFLG ;BUT NOT FIRST TIME THROUGH PUSHJ P,TMPOUT ;OUTPUT SEPARATING COMMA MOVE T2,ONAM ;GET NAME PUSHJ P,OUTSIX ;OUTPUT IT SKIPN T2,OEXT ;SPECIFIED EXT? MOVSI T2,'REL' ;NO USE DEFAULT PUSHJ P,OUTEXT HRRZS FDGFLG ;COMMA NEXT TIME POP P,T3 ;RESTORE T3 POPJ P, ;RETURN DNFUDG: MOVEI T3,CHNFUD ;MAKE SURE USING PIP PUSHJ P,OUCRLF ;TERMINATE LINE PUSHJ P,TMPCHK SETZM FDGFLG ;CLEAR FLAG POPJ P, ;RETURN SUBTTL TABLES XALL DEFINE X (A,B,C,D,E,F,G,H)< > PRCNAM: PROCESS DEFINE X (A,B,C,D,E,F,G,H)< SIXBIT /B/> PXTAB: SIXBIT /REL/ PROCESS IFN BLISS,< B10: SIXBIT /B10/ ;ALTERNATIVE BLISS EXT> F4: SIXBIT /F4/ DEFINE X (A,B,C,D,E,F,G,H)< B'SW> ISPTAB: RELSW PROCESS DEFINE X (A,B,C,D,E,F,G,H)< SIXBIT /E/> INTEXT: PROCESS IFN SPRC,< DEFINE X (A,B,C,D,E,F,G,H) NXPC: PROCESS SW==0> DEFINE X (A,B,C,D,E,F,G,H)< SIXBIT /F/> DEBAID: PROCESS DEFINE X (A,B,C,D,E,F,G,H)< "G"> SEPTAB: PROCESS ;[463] SETUP PROCESS FLAGS IF ANY DEFINE X (A,B,C,D,E,F,G,H)< IFNB "H",< XWD H,0> ;;put flags in left half(arbitrary) IFB "H",< EXP 0 > ;;no process flags > PRCFLG: PROCESS DEFINE X (A,B)< < SIXBIT /B/>> PRCDEV: DEVICE SALL SUBTTL DELETE DODEL: TRO FL,PIPF ;SET TO ALLOW * AS AN IDENT PUSHJ P,SCANAM MOVSI T1,'DSK' SKIPN SVDEV ;FORCE TO DSK IF NONE MOVEM T1,SVDEV JRST DEL2 DEL3: PUSHJ P,SCANAM DEL2: MOVEI T3,CHNPIP SKIPN T2,SVDEV ;DEVICE? JRST NODVC PUSHJ P,OUCRLF PUSHJ P,OUTSIX ;DUMP NAME MOVE T2,[':/D= '] ;[233] PUSHJ P,OUTSIX JRST DIDDEV NODVC: MOVEI T1,"," ;IF NO DEV, JUST A , PUSHJ P,TMPOUT DIDDEV: PUSHJ P,OUTNAM ;WRITE THE NAME PUSHJ P,SCAN ;SEE IF MORE THERE CAIN C,"," JRST DEL3 ;GO ON TLNN CS,TERMF ;MAKE SURE THAT LINE ENDS PROPERLY GOTO SYNERR OPIP1: PUSHJ P,OUCRLF OPIP2: PUSHJ P,TMPCHK ;OUTPUT TMP FILE NOW MOVSI T1,'PIP' MOVEM T1,PCNAM ;LOAD THIS ONE JRST DONE1 SUBTTL RENAME/COPY DOCOPY: MOVEI T2,<<^D29+^D11>*1000>-1 ;[461] USE 29P LOW WITH 11P HIGH MOVEM T2,RUNCOR ;[461] STORE CORE ARGUMENT SKIPA T2,['/X=',,0] ;[233] FOR COPY DOREN: MOVSI T2,'/R=' ;[233] SET FOR RENAME PUSH P,T2 ;SAVE IT TRO FL,PIPF ;PERMIT * IN FILES NXTNAM: PUSHJ P,SCAN ;GET A FILE NAME PUSHJ P,GETNAM ;[154] MOVEI T3,CHNPIP ;[154] NXTNM0: CAIE C,"/" ;[227] CHECK FOR SINGLE SWITCH CAIN C,"(" ;CHECK FOR SWITCHES JRST [JFCL ;RETURNS HERE FROM COPYSW CAIA PUSHJ P,COPYSW ;OUTPUT THEM SKIPN SVNAM(SVPT) ;[431] CHECK IF FILE NAME ALREADY SCANNED PUSHJ P,GETNM0 ;[154] TRY AGAIN FOR NAME JRST NXTNM0]+2 ;TRY AGAIN FOR NAME CAIN C,"^" ;TAPE ID? JRST [PUSHJ P,TAPEID ;[154] GET TAPE ID PUSHJ P,GETNM0 ;[154] TRY AGAIN FOR JRST NXTNM0] ;[154] NAME SKIPN T2,SVDEV ;SEE IF DEVICE SPECIFIED MOVE T2,LOKNAM ;OR SAVED MOVEM T2,LOKNAM JUMPE T2,.+2 ;IF NO NAME SPECIFIED PUSHJ P,OUTDEV ;PUT IT OUT PUSHJ P,OUTNAM CAIE C,"]" ;ALWAYS GET RID OF SPARE "]" TRNE FL,IDF ;DON'T SCAN IF WE ALREADY HAVE IT PUSHJ P,SCAN CAIN C,"^" ;TAPE ID? PUSHJ P,TAPEID ;YES CAIE C,"<" ;IS IT PROTECTION? JRST NXTNM1 ;NO PUSHJ P,GTPROT ;[272] GET PROTECTION CODE PUSHJ P,OUTSIX PUSHJ P,SCAN NXTNM1: CAIE C,"[" ;[227] CHECK FOR PROJ-PROG JRST NXTNM2 ;[227] NO PUSHJ P,GETPP1 ;YES, GET IT SKIPE T2,SVPPN ;IF NON-ZERO PUSHJ P,OUTPPN ;PUT IT OUT PUSHJ P,SCAN ;GO BEYOND "]" NXTNM2: CAIE C,"/" ;[227] CHECK FOR SINGLE SWITCH CAIN C,"(" ;CHECK FOR SWITCHES PUSHJ P,COPYSW ;AND OUTPUT THEM CAIN C,"^" ;TAPE ID? PUSHJ P,TAPEID ;YES MOVE T2,(P) CAME T2,['/X=',,0] ;[233] IS IT COPY? JRST NOTCPY ;NO, MUST BE RENAME MOVS T1,SVNAM ;GET NAME JUMPE T1,NOTCPY ;ZERO FILE NAME NEEDS /X CAIN T1,'* ' ;WILD CARD? JRST NOTCPY ;YES, USE /X TLC T1,'? ' ;STUPID TEST FOR ? IN FILE NAME TLCN T1,'? ' JRST NOTCPY ;WELL WE FOUND ONE, USE /X LSH T1,6 ;SHIFT LEFT JUMPN T1,.-4 ;TRY NEXT CHAR MOVS T1,SVEXT ;NO, TRY EXT CAMN T1,[XWD -1,0] ;[264]WAS IT FNAME. ? JRST NXTNOX ;[264]YES, DO COPY CAIN T1,'* ' ;IS THIS WILD CARD? JRST NOTCPY ;YES, /X NEEDED TLC T1,'? ' ;SAME TEST FOR EXT TLCN T1,'? ' JRST NOTCPY ;WELL WE FOUND ONE, USE /X LSH T1,6 ;SHIFT LEFT JUMPN T1,.-4 ;TRY NEXT CHAR NXTNOX: MOVSI T2,'= ' ;[233] NO, SO JUST COPY NOTCPY: PUSHJ P,OUTSIX CAIE C,"_" ;[167] "_" SEEN CAIN C,"=" ;[167] "=" SEEN CAIA ;[167] "_" OR "=" MUST BE THERE GOTO SYNERR SETZM SVPPP ;CLEAR STICKY PPN ON OUTPUT SIDE SETZM SVDEVV ;[260]CLEAR STICKY DEVICE ON = COPY1: PUSHJ P,SCANAM MOVEI T3,CHNPIP ;RESET CAIN C,"[" ;MIGHT BE *.[PPN] PUSHJ P,GETPP ;SO GET IT CAIN C,"^" ;TAPE ID? PUSHJ P,TAPEID ;YES SKIPE T2,SVDEV ;DEVICE SEEN? PUSHJ P,OUTDEV PUSHJ P,OUTNAM SETZM SVPPP ;CLEAR STICK PPN NOW PIP HAS SEEN IT MOVE T1,(P) ;GET EITHER /X OR /R CAMN T1,['/X=',,0] ;[233] WHICH IS IT? JRST COPY2 ;IT WAS COPY PUSHJ P,SCAN ;CHECK FOR MORE FINCPY: PUSHJ P,OUCRLF CAIN C,"," JRST NXTNAM ;YES TLNN CS,TERMF ;NO MORE, SEE IF END GOTO SYNERR POP P,T2 ;CLEAR STACK JRST OPIP2 COPY2: CAIE C,"]" ;IF WE FINISHED ON PPN GET RID OF CHAR TRNE FL,IDF ;SKIP IF WE ALREADY HAVE NEXT CHAR PUSHJ P,SCAN ;GET NEXT CHAR CAIE C,"/" CAIN C,"(" ;FIRST SEE IF ANY SWITCHES PUSHJ P,COPYSW ;YES CAIE C,"," ;MORE COMMAND? JRST FINCPY ;NO, GIVE UP MOVEI T1,"," ;OUTPUT THE COMMA PUSHJ P,TMPOUT JRST COPY1 ;GET NEXT NAME SUBTTL LABEL/TAPE ID IDENT: TRO FL,PIPF ;WHY NOT, IT IS PIP PUSHJ P,SCANAM ;GET DEVICE MOVEI T3,CHNPIP ;PIP TMP FILE SKIPN T2,SVDEV ;DEVICE SPECIFIED? GOTO XPDERR ;NO, ERROR PUSHJ P,OUTDEV ;YES, USE IT SKIPN T2,SVNAM ;FILENAME = TAPE ID JRST [PUSHJ P,TAPEID ;NO, USING DELIMITERS JRST IDENT1] ;FINISH OFF ID WITH UP ARROW MOVEI T1,"^" ;PIP EXPECTS ^ AS DELIMITER PUSHJ P,TMPOUT PUSHJ P,OUTSIX ;OUTPUT SIXBIT LABEL MOVEI T1,"^" ;AND DELIMITER PUSHJ P,TMPOUT IDENT1: MOVEI T1,"=" PUSHJ P,TMPOUT PUSHJ P,OUCRLF ;FINISH LINE PUSHJ P,SCAN ;SEE WHATS NEXT CAIN C,"," ;MORE JRST IDENT ;YES JRST OPIP2 ;NO GIVE UP TAPEID: TRO FL,INPRNT ;TREAT @ AND ; AS NORMAL CHARS PUSH P,C ;SAVE DELIMITER MOVEI T1,"^" PUSHJ P,TMPOUT IDENT2: PUSHJ P,GETCH HRRZ T1,C CAMN T1,(P) ;SAME DELIMITER? JRST IDENT3 ;YES CAIN C,177 ;EOF ? GOTO SYNERR ;YES, GET OUT OF LOOP PUSHJ P,TMPOUT ;NO JRST IDENT2 ;READ MORE IDENT3: TRZ FL,INPRNT ;@ AND ; ARE SPECIAL AGAIN SETZM SAVCHR ;CLEAR "^" POP P,T1 ;CLEAR STACK MOVEI T1,"^" ;AND DELIMITER PJRST TMPOUT ;UP ARROW AND RETURN SUBTTL PRESERVE/PROTECT DOPROT: DOPRES: PUSH P,[0] ;[270] RESERVE SPACE FOR PROTECTION SETZM LOKNAM ;[237] NO DEVICE YET MOVEI T3,CHNPIP ;USE PIP TRO FL,PIPF ;SO *.* WILL WORK PROT1: PUSHJ P,SCANAM ;GO GET FILE NAME ETC CAIN C,"]" ;DID WE HAVE A PPN? PUSHJ P,SCAN ;YES, GET RID OF "]" SKIPN T2,SVDEV ;A NEW DEVICE? SKIPA T2,LOKNAM ;WELL AN OLD ONE THEN? MOVEM T2,LOKNAM ;STORE NEW ONE AS OLD ONE CAIE C,"<" ;PROTECTION FIELD? JRST .+3 ;NO SKIPN SVNAM ;NAME SEEN YET? JRST PROT3 ;NO, GET DEFAULT PROTECTION SKIPE T2,LOKNAM ;DID WE FIND A DEVICE? PUSHJ P,OUTDEV ;YES, OUTPUT IT TRNE FL,IDF ;DON'T IF WE ALREADY HAVE IT PUSHJ P,SCAN CAIE C,"." ;[237] EXTENSION WITHOUT FILENAME? JRST PROT5 ;[237] NO. SKIPE SVEXT ;[437] IS EXT ALREADY SEEN? JRST SYNERR ;[437] OOPS! 2 "."'S SEEN IN FILE SPEC PUSHJ P,SCAN ;[237] GET EXTENSION. TLNE CS,TERMF ;[245] IS THIS EOL? SETZM ACCUM ;[245] YES, WE DIDN'T READ ANYTHING MOVE T2,ACCUM ;[237] INTO AN AC... MOVEM T2,SVEXT ;[237] SAVE IT. PUSHJ P,SCAN ;[237] SETUP FOR PROT5 CAME T2,[SIXBIT/UFD/] ;[237] A UFD? JRST PROT6 ;[237] NO. SKIPN T1,SVPPN ;[237] WAS PPN TYPED? PUSHJ P,USRPPN ;[237] NO, GET IT. MOVEM T1,SVPPP ;[237] AND PUT BACK. JRST PROT5 ;[237] CONTINUE... PROT6: MOVSI T2,(SIXBIT/*/) ;[237] NO FILENAME MEANS ALL MOVEM T2,SVNAM ;[237] .. PROT5: CAIE C,"<" ;[237] PROTECTION CODE JRST PROT2 ;NO PUSHJ P,GTPROT ;GET PROTECTION IN T2 PUSHJ P,OUTSIX PUSHJ P,SCAN CAIE C,"[" ;CHECK AGAIN FOR PPN JRST PROT4 ;NO PUSHJ P,GETPP1 ;YES, GET IT PUSHJ P,SCAN ;PASS OVER "]" JRST PROT4 ;ALREADY PUT OUT PROTECTION PROT2: SKIPN T2,(P) ;[270] GET PROTECTION IF GIVEN PUSHJ P,DFPROT ;[270] DO SOME DEFAULTING IF NOT PUSHJ P,OUTSIX ;USE IT EVEN IF ZERO PROT4: MOVSI T2,'/R=' ;[233] RENAME FOR PIP PUSHJ P,OUTSIX PUSHJ P,OUTNAM ;NAME.EXT [PPN] PUSHJ P,OUCRLF ;END WITH CR-LF CAIN C,"," ;MORE TO COME JRST PROT1 ;YES TLNN CS,TERMF ;[245] IS THIS EOL? GOTO SYNERR ;[245] NOT EOL AND NOT COMMA IS VERY BAD SUB P,[1,,1] ;PUT STACK BACK JRST OPIP2 ;AND EXIT PROT3: PUSHJ P,GTPROT ;GET PROTECTION MOVEM T2,(P) ;SAVE AS NEW DEFAULT JRST PROT1 ;SCAN AGAIN FOR FILE NAME GTPROT: PUSHJ P,SCAN ;GET NUMBER PUSHJ P,SCAN ;AND DELIMITER CAIE C,">" ;IT BETTER BE RIGHT ONE GOTO SYNERR ;IT WASN'T MOVS T2,ACCUM ;[231] GET 3 NUMBERS TRC T2,'000' ;[231] BUT WE NEED ALL 3 TRCN T2,'000' ;[231] OR ITS AN ERROR TDNE T2,[-1,,505050] ;[231] MORE THAN 3 OR NOT ALL OCTAL? GOTO IPCERR ;[231] ERROR TLO T2,'<' LSH T2,^D12 ;SHIFT TO LEFT TRO T2,'> ' POPJ P, ;RETURN WITH PROTECTION IN T2 IN SIXBIT ;[270] HERE TO DEFAULT THE PROTECTION DFPROT: HLRZ T3,SVEXT ;[270] GET EXTENSION READ CAIE T3,'UFD' ;[270] IF A DIRECTORY... CAIN T3,'SFD' ;[270] THEN READ THE CORRECT DEFAULT SKIPA T3,[13,,16] ;[270] STANDARD UFD PROTECTION MOVE T3,[12,,16] ;[270] TABLE FOR STANDARD PROTECTION GETTAB T3, ;[270] GET IT MOVSI T3,057000 ;[270] BETTER THAN NOTHING TLNN T3,(7B2) ;[270] TEST FOR ALREADY PRESERVED TLO T3,(1B2) ;[270] PRESERVE BIT MOVEI T2,'<' ;[270] START WITH OPEN ANGLE MOVEI T4,3 ;[270] SET UP LOOP COUNTER LSH T2,3 ;[270] GET FIRST DIGIT LSHC T2,3 ;[270] IN AS SIXBIT ADDI T2,20 ;[270] SOJG T4,.-3 ;[270] LOOP FOR ALL THREE DIGITS LSH T2,^D12 ;[270] LEFT JUSTIFY TRO T2,'> ' ;[270] CLOSE PROTECTION MOVEI T3,CHNPIP ;[270] RESTORE TMPFILE CHANNEL POPJ P, ;[270] AND RETURN SUBTTL EDIT DOEDIT: PUSHJ P,SCAN ;START ON THE FILE NAME DOEDT1: PUSHJ P,GETNAM MOVEI T3,CHNEDT MOVEI T1,"S" ;COMMAND FOR LINED TRNE FL,TECOF ;[455] DO WE WANT TECO? MOVEI T1," " ;[455] YES, PASS A SPACE PUSHJ P,TMPOUT ;OUTPUT THE S SKIPE T2,SVDEV ;[441] AND A DEVICE SEEN ELSE SKIP PUSHJ P,OUTDEV ;OUTPUT THE DEVICE LDE2: PUSHJ P,OUTNAM ;OUTPUT THE NAME & EXT ;THIS CODE PASSES REST OF LINE TO THE EDITOR SO SWITCHES CAN BE USED ;BUT CHANGES (SWITCH) TO /SWITCH CAIE C,POPFIL ;[224] TERMINATOR? TLNE CS,TERMF ;ALREADY TERMINATED? JRST %NOSLS ;YES - HANDLE NORMALLY CAIN C,"(" ;IF FIRST CHAR IS OPEN PAREN MOVEI C,"/" ;CHANGE TO SLASH CAIE C,"]" ;GET RID OF "]" IF JUST SEEN PPN JRST %GIVE ;PASS REMAINDER OF STRING TO NEXT CUSP %MORE: PUSHJ P,GETCH ;MORE CHARS COMING (MAYBE SWITCHES) CAIN C,"(" ;OPEN PAREN MOVEI C,"/" ;BECOMES SLASH CAIN C,")" ;CLOSE PAREN JRST %MORE ;IS IGNORED TLNE CS,TERMF ;SOME OTHER KIND OF TERMINATOR? JRST %NOSLS ;YES - FINISH UP NORMALLY %GIVE: MOVE T1,C ;PASS THE CHARACTER TO THE EDITOR CAIE C,15 ;[166] DON'T PASS CR TO EDITOR PUSHJ P,TMPOUT ;LEAVE ERROR DETECTION TO THE EDITOR JRST %MORE ;GO BACK FOR ANOTHER CHAR %NOSLS: TRNE FL,CREATF ;EDIT OR CREATE? JRST DOEDT3 ;CREATE (OR MAKE) PUSHJ P,OUCRLF ;EDIT (OR TECO) - OUTPUT CRLF DOEDT2: PUSHJ P,TMPCHK MOVE T1,['EDITOR'] TRNE FL,TECOF JRST ISTECO ;TECO OR MAKE COMMAND MOVEM T1,PNMBLK+2 ;SAVE AS NAME FOR INFO MOVSI T2,(PT.RCN) ;RETURN CURRENT NAME MOVEM T2,PNMBLK+1 ;SET FLAG FOR UUO MOVEI T2,.PTFRN ;READ NAME MOVEM T2,PNMBLK+0 ;SET FUNCTION CODE MOVE T2,[5,,PNMBLK];UUO ARG POINTER PATH. T2, ;SEE IF EDITOR: IS DEFINED JRST [MOVE T1,[EDITOR] ;NO, GET DEFAULT VALUE JRST ENDED] ;AND DO IT THE OLD WAY MOVEM T1,PCDEV ;YES, USE AS DEVICE SETZ T1, ;AND NOT NAME ENDED: MOVEM T1,PCNAM JRST DONE ;GO GET IT LOADED DOEDT3: MOVEI T1,175 ;OLD ALTMODE PUSHJ P,TMPOUT ;ENDS CREATE OR MAKE COMMAND JRST DOEDT2 ISTECO: MOVE 14,SVNAM ;EDITING THIS PROGRAM TRNE FL,CREATF ;CHECK FOR MAKE COMMAND CAME 14,[SIXBIT /LOVE/] ;WITH ARGUMENT OF LOVE JRST ISTEC1 ;NO SUCH HACK SKIPE SVEXT ;BUT ONLY IF EXT IS BLANK JRST ISTEC1 ;NO SUCH LUCK MOVEI T2,2 ;YES. PAUSE THOUGHTFULLY CALLI T2,31 ;BY SLEEPING STRING [ASCIZ /not WAR? /] ISTEC1: MOVE T1,[SIXBIT /TECO/] ;NAME OF CUSP JRST ENDED ;NOTE: LEAVE THE ABOVE HACK IN FOR SALES DEMOS SUBTTL TYPE/LIST IFE LSTRSW,< CHNLST==CHNPIP ;USE PIP FOR A LISTER > TYPR: SKIPA T2,['TTY:/C'] ;[214] LISTR: MOVE T2,['LPT:/X'] MOVEI T3,CHNLST PUSHJ P,OUTSIX MOVEI T1,"=" ;[233] PUSHJ P,TMPOUT ;DON'T FORGET "_" IFE LSTRSW,< TRO FL,PIPF ;IF IT'S PIP, ALLOW *.MAC, ETC. > LSTLP: PUSHJ P,SCANAM ;GET NAME SKIPN T2,SVDEV JRST LSTLP1 ;USE PREV NAME IF NO NEW NAME PUSHJ P,OUTDEV ;OUTPUT IT LSTLP1: PUSHJ P,OUTNAM ;FILE NAME PUSHJ P,SCAN IFE LSTRSW,< CAIE C,"/" CAIN C,"(" ;SWITCHES? PUSHJ P,COPYSW ;YES, OUTPUT THEM > IFN LSTRSW,< CAIE C,"(" ;PAGE SPEC? JRST ENDLST ;NO MOVEI T1,"(" ;OUTPUT THE ( TO FILE PUSHJ P,TMPOUT LST1: PUSHJ P,GETCH ;COPY PAGE SPEC MOVE T1,C ;TO OUTPUT AC PUSHJ P,TMPOUT ;THENCE TO FILE CAIE C,")" ;THROUGH END OF ARG JRST LST1 ;MORE PUSHJ P,SCAN ;NOW WHAT? > ENDLST: CAIN C,"," ;SHOULD BE COMMA OR CR JRST [MOVEI T1,"," PUSHJ P,TMPOUT JRST LSTLP] TLNN CS,TERMF ;SHOULD BE TERMINATOR GOTO SYNERR ;WASNT IFE LSTRSW,< JRST OPIP1 > IFN LSTRSW,< PUSHJ P,OUCRLF ;ADD CRLF TO COMMAND PUSHJ P,TMPCHK ;OUTPUT THE FILE MOVE T1,[SIXBIT /LISTER/] MOVEM T1,PCNAM JRST DONE1 > SUBTTL TAPE FUNCTIONS DOEOF: SKIPA T2,['(MF)= '] ;[233] DOZERO: MOVSI T2,'/Z=' ;[233] TRO FL,PIPF ;INCASE *.* PUSH P,T2 ;SAVE COMMAND MOVEI T3,CHNPIP ;OUTPUT CHANNEL TAPEF: PUSHJ P,SCANAM ;GO GET DEVICE ETC SKIPN T2,SVDEV ;[213] WAS DEVICE SPECIFIED? GOTO XPDERR ;[213] NO, GIVE ERROR MESSAGE PUSHJ P,OUTDEV ;YES, OUTPUT IT PUSHJ P,OUTNAM ;FILENAME AND PPN MOVE T2,(P) ;GET TAPE FUNCTION PUSHJ P,OUTSIX PUSHJ P,OUCRLF ;FINISH LINE CAIE C,"," ;MORE COMMAND? JRST OPIP2 ;NO, EXIT TRNE FL,IDF ;MORE THAN JUST DEVICE? PUSHJ P,SCAN ;YES, PASS OVER COMMA JRST TAPEF ;YES DOSKIP: TDZA T2,T2 ;SIGNAL FORWARDS BY 0 DOBKSP: SETO T2, ;BACKWARDS BY -1 PUSH P,T2 ;STORE IT PUSH P,[0] ;AND COUNT TRO FL,PIPF ;JUST INCASE MOVEI T3,CHNPIP ;USE PIP PUSHJ P,SCANAM ;GO GET SOMETHING SKIPN T2,SVDEV ;[213] FIND A DEVICE? GOTO XPDERR ;[213] NO, GIVE ERROR MESSAGE PUSHJ P,OUTDEV ;YES TAPESP: SKIPE T2,SVNAM ;[311] ANY ARGUMENTS JRST TAPSP1 ;[311] YES PROCESS SKIPE SAVCHR ;[311] TAB OR BLANK GOTO SYNERR ;[311] NO ERROR PUSHJ P,SCAN ;[311] GET ARGUMENT MOVE T2,ACCUM ;[311] PUT IN AC TAPSP1: SETO T1, ;FIND THE MASK LTPS1: LSH T1,-6 ;MUST BE AT LEAST ONE CHAR. ANYWAY TDNE T2,T1 ;DON'T MASK REAL CHAR. JRST LTPS1 ;SHIFT AND TRY AGAIN SETZ T4, ;START AT FRONT OF TABLE TPSRCH: MOVE T3,TPTBL(T4) ;GET FUNCTION ANDCM T3,T1 ;MASK IT CAMN T2,T3 ;FOUND IT? JRST TPFND ;YES CAIGE T4,TPLEN ;STILL IN TABLE AOJA T4,TPSRCH ;YES, TRY NEXT TLNE T2,(1B0) ;IS IT A NUMBER? GOTO SYNERR ;NO MOVEM T2,(P) ;REPLACE DUMMY COUNT PUSHJ P,SCANAM ;[213] FIND SOMETHING JRST TAPESP TPFND: MOVEI T3,CHNPIP ;RESTORE PIP MOVSI T2,'(M ' ;START OF SWITCH SKIPE (P) ;NUMBER SPECIFIED TLO T2,' #' ;YES PUSHJ P,OUTSIX ;OUTPUT IT POP P,T2 ;GET NUMBER SKIPE T2 ;DON'T BOTHER IF ZERO PUSHJ P,OUTSIX MOVE T2,TPFN(T4) ;PICK UP PIP CHAR SKIPE (P) ;IF FORWARDS MOVSS T2 ;NO, BACKSPACE HLLZS T2 ;CLEAR RIGHT PUSHJ P,OUTSIX PUSHJ P,OUCRLF ;FINISH WITH CRLF CAIE C,"," ;MORE TO COME JRST OPIP2 ;NO, EXIT PUSHJ P,SCAN ;PASS OVER COMMA JRST DOBKSP+2 ;YES, START AGAIN TPTBL: SIXBIT /FILES/ SIXBIT /RECORD/ SIXBIT /EOT/ TPLEN==.-TPTBL TPFN: 'A)=',,'B)=' ;[233] 'D)=',,'P)=' ;[233] 'T)=',,'T)=' ;[233] DOREW: SKIPA T2,[1] DOUNLD: MOVEI T2,11 TRO FL,PIPF PUSH P,T2 ;SAVE FUNCTION DOMTP: PUSHJ P,SCANAM ;GET A DEVICE ETC DOMTP0: SKIPN T1,SVDEV ;GET THE DEVICE JRST NOMTPD ;NO DEV: SEEN DOMTP1: MOVEM T1,LOKNAM ;STORE IN LOOKUP BLOCK OPEN LOOK,LOKINT ;INIT JRST DODVNA ;NO SUCH DEVICE MTAPE LOOK,0 ;WAIT ON FREE DEVICE MTAPE LOOK,@(P) ;DO FUNCTION RELEASE LOOK, ; AND FREE UP THE DRIVE DOMTPC: CAIE C,"," ;MORE TO DO? JRST DOEND ;NO TRNE FL,IDF ;UNLESS DONE ALREADY PUSHJ P,SCAN ;PASS OVER THE COMMA JRST DOMTP ;GET NEXT NOMTPD: SKIPN T1,SVNAM ;DID WE SEE A FILE NAME? GOTO XPDERR ;[306] NO, U LOSE CAIN C,"," ;IF A COMMA WE'RE AT END OF THIS SPEC JRST DOMTP1 ;SO USE "FILE NAME" AS DEVICE PUSH P,T1 ;SAVE IT SETZM SVNAM ;CLEAR NAME PUSHJ P,SCANAM ;SEE IF MORE SPECIFIED POP P,T1 ;RECOVE PREV NAME SKIPE SVDEV ;FOUND A DEV AT LAST? JRST DOMTP0 ;YES, USE IT SKIPE SVNAM ;BUT NOT 2 NAMES GOTO SYNERR JRST DOMTP1 ;USE SINGLE "FILE NAME" DODVNA: STRING [ASCIZ /?CMLDVA Device not available - /] MOVE T3,LOKNAM MOVE T1,[POINT 7,ERRBUF] PUSHJ P,SIXOUT MOVEI T2,":" IDPB T2,T1 MOVEI T2,15 IDPB T2,T1 MOVEI T2,12 IDPB T2,T1 MOVEI T2,0 IDPB T2,T1 STRING ERRBUF JRST DOMTPC ;SEE IF MORE TO DO SUBTTL OUTPUT ROUTINES OUTDEV: PUSHJ P,OUTSIX ;OUTPUT DEVICE MOVEI T1,":" ;AND A COLON PJRST TMPOUT ;RETURN TO USER OUTNAM: SKIPN T2,SVPPP ;STICKY PPN? JRST OUTNM1 ;NO IFN SFDSW,< PUSH P,SVPPN ;SAVE SETZM SVPPN ;MARKER FOR OUTSFD/OUTSFP > PUSHJ P,OUTPPN ;OUTPUT [DIRECTORY] IFE SFDSW,< MOVE T2,SVPPP CAMN T2,SVPPN ;SAME AS NON-STICKY? > IFN SFDSW,< POP P,SVPPN ;RESTORE PUSHJ P,CHKSFD ;SEE IF WHOLE SFD SAME > SETZM SVPPN ;YES, PIP CAN HANDLE IT OK OUTNM1: SKIPE T2,SVNAM ;[237] PUSHJ P,OUTSIX SKIPE T2,SVEXT PUSHJ P,OUTEXT OUTPP: SKIPE T2,SVPPN ;GET PPN PJRST OUTPPN ;OUTPUT IF NON-ZERO POPJ P, OUTEXT: MOVEI T1,"." PUSHJ P,TMPOUT HLLZ T2,T2 ;3 CHAR ONLY JRST OUTSIX OUCRLF: MOVEI T1,15 ;CARRIAGE RETURN PUSHJ P,TMPOUT ;TO CURRENT OUTPUT FILE MOVEI T1,12 ;LINE FEED JRST TMPOUT ;TO OUTPUT FILE PUSHJ P,GETCH ;COPY THE SWITCH COPYSW: CAIN C,"/" ;SINGLE SWITCH JRST COPYS1 ;YES MOVE T1,C ;TO OUTPUT AC ;**;[323] @COPYSW+2 1/2, KPY, 3-JAN-78 TLNE CS,TERMF ;[323] SEE IF END GOTO SYNERR ;[323] YES--ERROR PUSHJ P,TMPOUT ;THENCE TO FILE CAIE C,")" ;UNTIL END OF SWITCH JRST COPYSW-1 ;BUT NOT YET COPYSR: ;BACKUP 3 LOCS INCASE MORE SWITCHES REPEAT 3,< SOS (P) > SETZM SAVCHR ;[154] GET RID OF "/" OR ")" JRST SCAN ;GET NEXT AND RETURN COPYS1: MOVE T1,C ;GET "/" PUSHJ P,TMPOUT ;OUTPUT IT PUSHJ P,GETCH ;GET NEXT CHAR MOVE T1,C PUSHJ P,TMPOUT ;OUTPUT SWITCH JRST COPYSR ;RETURN IFN SFDSW,< OUTSFD: SKIPN SVPPN(SVPT) ;STICKY SFD MARKER? JRST OUTSFP ;YES X==0 ;INITIAL CONDITION REPEAT SFDLEN,< SKIPE T2,SVSFD+X(SVPT) PUSHJ P,SFDOUT X==X+NFILE > POPJ P, ;RETURN TO PRINT "]" OUTSFP: X==0 ;INITIAL CONDITION REPEAT SFDLEN,< SKIPE T2,SVSFP+X PUSHJ P,SFDOUT X==X+1 > POPJ P, ;RETURN TO PRINT "]" SFDOUT: MOVEI T1,"," ;SEPARATOR PUSHJ P,TMPOUT ;OUTPUT IT PJRST OUTSIX ;FOLLOWED BY SFD CHKSFD: MOVSI T1,-SFDLEN ;AOBJN POINTER MOVE T2,SVPPN CAME T2,SVPPP ;CHECK PPN FIRST JRST CPOPJ1 ;SKIP IF DIF MOVE T2,SVSFD(T1) ;GET SFD CAME T2,SVSFP(T1) JRST CPOPJ1 ADDI T1,NFILE-1 ;LENGTH APPART AOBJN T1,.-4 ;LOOP FOR ALL SFD'S POPJ P, ;NON-SKIP IF IDENTICAL > ; ; This routine will output ONAM with a /SAVE (/SSAVE) ; and check to see where in the flow it is. If it is the ; first output out to the LNK tmpcor file, then it puts a ; comma after. If there is already output there, it prefixes ; a comma. ; OUTSAV: PUSH P,T3 ;[444] PUSH THE CURRENT CHAN NO. DOWN MOVEI T3,CHNLNK ;[444] SET CHAN NO. FOR LINK TRNE FL,LODOUT ;[444] IS OUTPUT THERE? SKIPA T1,[","] ;[444] YES, SO PREFIX WITH A COMMA TRNA ;[444] A PSUEDO SKIP TO KEEP FLOW PUSHJ P,TMPOUT ;[444] OUTPUT THE COMMA AND CONTINUE SKIPE T2,ODEV ;[444] OUTPUT DEVICE THERE? PUSHJ P,OUTDEV ;[444] YES, OUTPUT IT MOVE T2,SVDEV(SVPT) ;[444] GET THE CURRENT DEV NAME MOVEM T2,ODEV ;[444] AND MAKE IT THE OUTPUT DEV MOVE T2,ONAM ;[444] GET OUTPUT FILENAME PUSHJ P,OUTSIX ;[444] PUT IT OUT THERE MOVE T2,SVNAM(SVPT) ;[444] GET CURRENT FILENAME MOVEM T2,ONAM ;[444] STORE IT AS OUTPUT NAME SKIPE T2,OEXT ;[444] GET OUTPUT EXTENSION PUSHJ P,OUTEXT ;[444] PUT IT OUT IF THERE SETZM OEXT ;[453] CLEAR OUTPUT FILE EXTENSION MOVE T2,SAVSW ;[444] GET THE SWITCH AGAIN PUSHJ P,OUTSIX ;[444] OUTPUT IT MOVEI T1,"," ;[444] THIS IS THE OUTPUT FILE TRNN FL,LODOUT ;[444] IS THERE ALREADY OUTPUT THERE? PUSHJ P,TMPOUT ;[444] NO, SO OUTPUT A COMMA, ELSE DON'T POP P,T3 ;[444] PUT THE ORIGINAL CHAN NO. BACK POPJ P, ;[444] AND RETURN SUBTTL TMP FILE ROUTINES ;USEFUL SYMBOLS TMPFST==0 ;POINTER TO FIRST BUFFER TMPCUR==1 ;POINTER TO CURRENT BUFFER TMPPTR==2 ;BYTE POINTER TMPCNT==3 ;BYTE COUNT (LEFT TO FILL) TMPHDR==4 ;SIZE OF BUFFER "HEADER" TMPBUF==^D128+2 ;SIZE OF DATA BUFFER TMPIOW==0 ;IOWD FOR DUMP MODE TMPLNK==1 ;LINK TO NEXT BLOCK (GOTO WORD) TMPDAT==2 ;FIRST DATA WORD ;ENTER WITH OUTPUT BYTE IN T1 ;INDEX TO TABLE IN T3 ;USES T5 AS ADDRESS OF "BUFFER HEADER" TMPOUT: JUMPL T3,CPOPJ ;[230] DO NOT DEPOSIT IF -1 SKIPN T5,TMPCHN(T3) ;ALREADY SET UP "HEADER AND BLOCK"? PUSHJ P,TMPINI ;NO, DO SO SOSGE TMPCNT(T5) ;[425] ANY ROOM PUSHJ P,TMPOU1 ;NONE LEFT IDPB T1,TMPPTR(T5) ;YES, DUMP BYTE POPJ P, ;AND RETURN TMPINI: PUSH P,[EXP TMPRET] ;WHERE TO RETURN TO ON POPJ PUSH P,T1 ;SAVE T1 PUSH P,T2 ;AND T2 MOVEI T1,TMPHDR ;LENGTH WE NEED PUSHJ P,GETSPC ;GET IT, OR ABORT HLL T1,FL3 ;GET NEW!OLD!SYS!SELF TLZ T1,-1-DEVSWS ;BUT ONLY THOSE MOVEM T1,TMPCHN(T3) ;STORE INFO HRRZ T5,T1 ;AND INTO T5 MOVEI T1,TMPBUF ;LENGTH OF DATA BLOCK PUSHJ P,GETSPC ;GET 1 BLOCK TO START WITH MOVEM T1,TMPFST(T5) ;STORE IN HEADER BLOCK PJRST TMPOU2 ;AND CLEAR BUFFER TMPRET: AOS TMPCNT(T5) ;SET COUNT TO ^D<5*128> POPJ P, TMPOU1: PUSH P,T1 ;SAVE T1 PUSH P,T2 ;AND T2 MOVEI T1,TMPBUF ;LENGTH OF DATA BLOCK PUSHJ P,GETSPC ;GET 1 BLOCK MOVE T2,TMPCUR(T5) ;LINK THIS TO CURRENT HRRZM T1,TMPLNK(T2) TMPOU2: MOVEM T1,TMPCUR(T5) ;STORE IN HEADER BLOCK HRRZ T2,T1 ;GET ANOTHER COPY ADDI T1,TMPDAT ;POINT TO DATA AREA HRLI T1,(POINT 7,) ;FORM BYTE POINTER MOVEM T1,TMPPTR(T5) ;STORE BYTE POINTER MOVEI T1,^D<5*128>-1 ;BYTE COUNT MOVEM T1,TMPCNT(T5) ;PER BUFFER HRRZ T1,T2 ;START OF DATA HRL T1,T1 ;FORM XWD SETZM (T1) ;ZERO FIRST WORD ADDI T1,1 ;FORM BLT WORD BLT T1,TMPBUF-1(T2) ;CLEAR ALL BUFFER POP P,T2 POP P,T1 POPJ P, ;NOW DO STORE BYTE ;HERE TO CLOSE THE TMP AREA AND WRITE OUT FILES TMPCHK: SKIPN T5,TMPCHN(T3) ;THERE BETTER BE ONE POPJ P, ;NO, SO GIVE UP PUSH P,T1 ;SAVE T1 JUST INCASE PUSH P,T2 ;T2 ALSO HLLZ T1,T5 ;GET RUN DEV: BITS JUMPE T1,.+3 ;NO JFFO T1,.+1 ;GET INDEX MOVE T1,PRCDEV(T2) ;GET DEVICE MOVEM T1,PCDEV ;SET TO LINK TO IT MOVE T1,TMPCUR(T5) ;POINT TO LINK IN LAST BLOCK ADDI T1,TMPDAT-1 ;POINT TO DATA-1 HRRZM T1,@TMPCUR(T5) ;STORE START ADDRESS MOVEI T1,^D<5*128>+4 ;BYTE COUNT INITIALLY (PLUS REMAINDER) SUB T1,TMPCNT(T5) ;MINUS WHAT'S LEFT IS WHAT'S USED IDIVI T1,5 ;GET WORD COUNT POP P,T2 MOVN T1,T1 ;NEGATE HRLM T1,@TMPCUR(T5) ;IOWD IS SET UP MOVE T5,TMPCHN(T3) ;GET POINTER TO HEADER AGAIN MOVE T1,TMPFST(T5) ;POINT TO LINK IN FIRST BLOCK SKIPE TMPLNK(T1) ;ONLY ONE BLOCK JRST TMPDSK ;NO SUCH LUCK, USE DSK HLLZ T1,PROCTB(T3) ;GET NAME CAMN T1,['LIN '] ;IS THIS LINK-10 MOVSI T1,'LNK' ;BETTER 3 LETTER NAME MOVEM T1,TMPFIL ;INTO TMPCOR BLOCK MOVE T1,@(T5) ;PICK UP SINGLE IOWD MOVEM T1,TMPFIL+1 ;STORE IT MOVE T1,[3,,TMPFIL] ;SET UP FOR WRITE IFN SNOBOL,< CAIE T3,CHNSNO ;SNOBOL CAN'T READ TMP: > TMPCOR T1, ;TRY IT JRST TMPDS2 ;YOU LOSE, TRY DSK TMPXIT: SETZM TMPCHN(T3) ;ONLY DO IT ONCE POP P,T1 POPJ P, TMPDSK: MOVE T5,(T5) ;POINT TO FIRST DATA BLOCK TMPDS1: SKIPGE (T5) ;IOWD SET UP YET? JRST TMPDS2 ;YES, REACHED END MOVSI T1,-^D128 ;NO, USE 128 WORD BLOCKS HRRI T1,1(T5) ;POINT TO DATA MOVEM T1,(T5) ;STORE IOWD SKIPE T5,1(T5) ;GET NEXT POINTER JRST TMPDS1 ;NOT DONE YET TMPDS2: HLLZ T1,PROCTB(T3) ;[566] GET TMPCOR FILE MOVEM T1,TMPFIL ;[566] TO DELETE SETZM TMPFIL+1 ;[566] ZERO I/O WORD MOVE T1,[2,,TMPFIL] ;[566] DELETE TMPCOR FILE TMPCOR T1, ;[566] JFCL ;[566] MUST NOT BE ONE HLRZ T1,PROCTB(T3) ;GET PROCESSOR CAIN T1,'LIN' ;CHANGE LINK-10 MOVEI T1,'LNK' ;AS THIS IS BETTER HLL T1,JOBNAM ;GET JOB NUMBER IN SIXBIT MOVEM T1,NAME MOVE T1,@TMPCHN(T3) ;MOVE IO LIST POINTER TO MOVEM T1,TMPFIL ;A COMMON TEMP CELL PUSHJ P,TMPDS0 ;USE COMMON ROUTINE, FROM "DONE" TOO JRST TMPXIT ;WRAP UP USE OF THIS CHANNEL TMPDS0: MOVSI T1,'TMP' MOVEM T1,NAME+1 SETZM NAME+2 SETZM NAME+3 IFE FASTFS,< SKIPN FSNAME ;DO WE HAVE FASTEST F/S PUSHJ P,FNDFST ;NO, GET IT> MOVEI T1,16 ;DUMP RECORD MOVEM T1,FSINIT SETZM FSBHD ;CLEAR BUFFER HEADER TRYAGN: OPEN LOOK,FSINIT ;INIT THE F/S JRST DOEND ;[206] ERROR ENTER LOOK,NAME JRST [PUSHJ P,TRYDSK ;[276] TRY GENERIC DSK (ONLY RETURN IS YES) ? JRST TRYAGN] ;[276] YES--TRY AGAIN MOVE T1,@TMPCHN(T3) ;GET ADDRESS OF IOWD LIST OUTPUT LOOK,(T1) ;OUTPUT THE DATA CLOSE LOOK,20 ;SAVE THE NAME BLOCKS POPJ P, ;[441] faster than JRSTing to it TRYDSK: HRRZ T1,LEXT ;[276] GET ERROR CODE CAIE T1,0 ;[276] NON-EXISTANT FILE CAIN T1,1 ;[276] OR UFD ? JRST DODSK ;[276] YES--GO TRY GENERIC DSK CAIE T1,23 ;[276] NON-EXISTANT SFD ? JRST FIU ;[276] NO--GIVE ERROR DODSK: MOVSI T1,'DSK' ;[276] CAMN T1,FSNAME ;[276] LAST DEVICE GENERIC DSK ? JRST FIU ;[276] YES--OH WELL WE TRIED MOVEM T1,FSNAME ;[276] NO SETZM LPPN ;[276] RESET PPN SETZM LDAT ;[276] AND OTHER GOOD HLRM T1,LEXT ;[276] STUFF POPJ P, ;[276] SO TRY IT ;HERE TO GET SPACE FROM FREE CORE, ENTER WITH T1 CONTAINING ; SPACE REQUIRED, EXIT WITH ADDRESS IN T1 GETSPC: ADD T1,SVJFF ;GET ADDRESS OF NEXT FREE WORD CAMGE T1,CORTOP ;ENOUGH SPACE? JRST GOTSPC ;YES PUSH P,T1 ;SAVE ACCS PUSH P,T2 MOVEI T1,2000 ;INCREMENT BY 1K ADDM T1,CORTOP ADDM T1,CORT1 ADD T1,.JBREL ;NEW TOP CORE T1, JRST NOCOR ;LOSE MOVE T1,.JBREL MOVE T2,-2000(T1) ;MOVE CORE UP MOVEM T2,(T1) CAMLE T1,CORTOP ;DONE? SOJA T1,.-3 ;NO POP P,T2 POP P,T1 GOTSPC: MOVEM T1,.JBFF ;STORE HIGHEST LOC IN USE EXCH T1,SVJFF ;AND HERE ALSO POPJ P, SUBTTL TABLE OF PROCESSOR NAMES DEFINE X (A,B,C,D,E,F,G,H)< IFDIF ,< > IFIDN ,< > > PROCTB: PROCESS REPEAT MXPROC-NPROCS,<0> ;FILL IN MISSING ONES XPROCESS ;AND THESE SUBTTL COMPILER TYPE TABLE ;[462] EXPAND CMPTBL MACRO INTO COMPILER TYPES AND PROCESSOR FLAGS ; A = compiler type code ; B = processor flags to set in FL2 ; DEFINE X(A,B),< IFLE A,< .CMPTD==1 ;;crock it once > ;;ENDIFE IFG A,< .CMPTD==A-.CMPTC ;;calc dif in entries > ;;ENDIFG IFLE .CMPTD,< PRINTX ?CMPTBL IS OUT OF ORDER .CMPTD==1 >;;ENDIFLE ;;make a best guess at this point REPEAT .CMPTD-1,< XWD 0,UNKSW ;;not used >;;END REPEAT IFDEF B,< XWD 0,B ;;Code A > ;;ENDIFDEF IFNDEF B,< XWD 0,UNKSW ;;Zero entry, not defined here > ;;ENDIFNDEF .CMPTC==A ;;set our counter >;;ENDDEF X CMPCOD: CMPTBL CMPLEN: .-CMPCOD-1 ;[462] length of table SUBTTL DATA STORAGE ASSIGNMENTS WORDS WORDS WORDS U (LODSBK,) U (LODSB2,) WORDS ;[447] U (SWGLK,SWBK+1) ;[447] WORDS U (SWBKS,NFILE) U (ODEV,1) U (ONAM,1) U (OEXT,1) U (OPPN,1) IFN SFDSW, U (SVDEVV,1) ;[254] SAVE AREA FOR DEVICE U (SVDEV,NFILE) U (SVNAM,NFILE) U (SVEXT,NFILE) U (SVPPN,NFILE) U (SVPPP,1) IFN SFDSW,) U (SVSFP,SFDLEN)> U (TTYPT,1) U (DSKBUF,1) ;[564] DISK BUFFER ADDRESS U (LOOKBF,3) U (PDLB,PDL+1) U (SWBLK,SWBK+1) U (OPENB,3) U (IOPD,<*3+1>) U ERRBUF,22 ;FOR TYPEOUTS U BUFTAB, ;WHERE THE BUFFERS ARE FOR FILES U FREBUF, ;FREED BUFFERS U (TMPFIL,2) U (TMPCHN,) ;NUMBER OF "CHANNELS" REQUIRED WORDS WORDS IFN FORTRAN,< U (FORPRC,1) > ;NAME OF FORTRAN COMPILER U (COBPRC,1) ;[324] NAME OF COBOL COMPILER U (GOTPST,1) ;-1 WHEN PAST SWITCH SCANNER U (PARLVL,1) ;[221] LEVEL OF PAREN NESTING IN COMPILER SWITCHES U (DEBPRM,DEBSIZ) ;[221] AREA TO HOLD PERM SWITCHES U (DEBTMP,DEBSIZ) ;[221] DITTO FOR TEMP U (SAVSW,1) ;[234] EITHER /SAVE OR /SSAVE FOR THIS FILE U (NSWTCH,1) ;[236] -1 IF /L SEEN LAST ;THIS IS THE PART THAT MUST BE INITIALIZED IF PURE. ;JUST USED AS IS IF IMPURE WORDS() ;[240] U(EVER,<.RBTIM-.RBSIZ>) ;[240] EXTENSION TO LOOKUP BLOCK LNAM=NAME U(PTHBLK,3+SFDLEN) ;[601] ARG,FLAGS,PPN,SFDS U(PNMBLK,5) ;PATHOLOGICAL NAME BLOCK IFN SFDSW,< WORDS U (LSFD,SFDLEN) > IFN PURESW,< INIDAT: U (INILOW,0) ;WHERE IT GOES IN THE LOW SEGMENT PHASE INILOW > LOKINT: 1 LOKNAM: 0 XWD 0,LOOKBF ;[462] NO NEED FOR OUTPUT BUFFER DSKLK: 1 SIXBIT /DSK/ XWD 0,LOOKBF ;[462] DON'T USE UNNECESSARY OUTPUT BUFFER FCOMD: ASCII /@***SVC.TMP / BYTE (7) 177,177 ;MARK EOF FCOMD2: ASCII /@***EDS.TMP / BYTE (7) 177,177 CRFRDR: ASCII /@***CRE.TMP/ BYTE (7) 177,177 INLFLG: BLOCK 1 ;[305] -1 = CURRENTLY NOT AT BEGINNING OF LINE FAKEOL: BLOCK 1 ;[305] -1 = ROUTINE POPFIL FAKED A LF FOR PIP IFN PURESW,< DEPHASE INITOP==. ;END OF INITIALIZED DATA INILEN==INITOP-INIDAT ;LENGTH OF DATA U (INILOW,INILEN) ;BLOCK OF STORAGE FOR DATA > U (LOWTOP,0) IFN DEBSW,< PATCH: PAT: BLOCK 40 ;PATCH AREA FOR DEBUGGING> END STPT