%B 5 7 0 0 M C P M A R K XVI.0.178 05/09/77%179-00001000 % 00002000 COMMENT: * TITLE: B5500/B5700 MARK XVI SYSTEM RELEASE * 00002010 * FILE ID: SYMBOL/MCP TAPE ID: SYMBOL1/FILE000 * 00002011 * THIS MATERIAL IS PROPRIETARY TO BURROUGHS CORPORATION * 00002012 * AND IS NOT TO BE REPRODUCED, USED, OR DISCLOSED * 00002013 * EXCEPT IN ACCORDANCE WITH PROGRAM LICENSE OR UPON * 00002014 * WRITTEN AUTHORIZATION OF THE PATENT DIVISION OF * 00002015 * BURROUGHS CORPORATION, DETROIT, MICHIGAN 48232 * 00002016 * * 00002017 * COPYRIGHT (C) 1965, 1971, 1972, 1973, 1974 * 00002018 * BURROUGHS CORPORATION * 00002019 * AA759915 AA320206 AA393180 AA332366 AA465080 * 00002020 * AA495655 AA496565 *; 00002021 $ SET OMIT = NOT(DEBUGGING) 00002100 BEGIN 00003000 DEFINE MIXMAX= 9#; COMMENT: MIXMAX MAY NOT BE LARGER THAN 29;00004000 DEFINE JOBNUMAX=40#; COMMENT: JOBNUMAX SHOULD BE ABOUT 00005000 2|MIXMAX+30; 00005001 DEFINE MARKLEVEL= % MARK LEVEL IN ALPHA 00005010 "XVI.0" 00005020 #, PATCHLEVEL= % PATCH RELEASE LEVEL IN ALPHA 00005030 "178" %179-00005040 #, LOCALEVEL= % LOCAL LEVEL IN ALPHA 00005050 " " 00005060 #; 00005070 DEFINE MCPTYPE = 63 #, 00005100 DCINTYPE = 63 #, 00005120 TSSINTYPE = 61 #; 00005140 COMMENT THE ESPOL COMPILER APPROPRIATELY TYPES THE MCP & 00005160 INTRINSICS FILE HEADERS SO THAT A VALIDITY CHECK MAY BE MADE 00005180 DURING INITIALIZATION AND AT CI AND CM TIME. HEADER[4].[36:6] 00005185 IS THE FIELD USED TO CONTAIN THE TYPE; 00005190 DEFINE ESAD = [1:15]#, 00005200 UNUM = [16:5]#, 00005210 BYBY(BYBY1,BYBY2)= 00005220 BEGIN STREAM(A:=TYPEDSPACE(10,SPOUTMSGAREAV) : );% %167-00005230 BEGIN DI:= A; DS:=BYBY2 LIT BYBY1; END; 00005240 PUNT(0); 00005250 END#; 00005260 DEFINE RESERVEDISKSIZE=2000#; 00005300 COMMENT TRACESIZE IS THE SIZE OF THE CORE AREA USED TO STORE TRACE 00005500 INFORMATION BEFORE IT IS WRITTEN ON DISK. 00005600 TRACAREASTART IS THE ABSOLUTE DISK ADDRESS OF THE TRACE 00005700 AREA ON DISK. 00005800 TRACAREASIZE IS THE SIZE (IN DISK SEGMENTS) OF THE TRACE 00005900 AREA ON DISK; 00005950 DEFINE TRACESIZE=30#,TRACAREASTART=10000#,TRACAREASIZE=480#; 00006000 DEFINE HANG=DO UNTIL FALSE#; 00006100 DEFINE LEFTARROW = "~"#; 00006150 $ SET OMIT = NOT(SAVERESULTS) 00006200 REAL JUNK=5;% 00007000 DEFINE PSEUDOMAX = 31 #, % MAX NO OF PSEUD-RDRS 0-ORIGIN 00007050 PSEUDOMAX1 = 32 #, % MAX NO OF PSEUD-RDRS 1-ORIGIN 00007055 PSEUDOMAXT = 63 #; % # ENTRIES IN TINU TABLE -2 00007060 COMMENT TO REDEFINE MAX NO. OF PSEUDO RDRS,SIZE AND INITIALIZATION 00007061 OF TINU[*] AT 00241900 MUST ALSO BE MODIFIED ACCORDINGLY; 00007062 COMMENT : PSEUDOMAX MUST BE }0 AND { 31 00007065 PSEUDOMAX1 MUST BE } 0 AND { 32 00007070 PSEUDOMAXT MUST BE } 31 AND { 63;% 00007075 COMMENT TO ADJUST THE PRIORITY, CORE ESTIMATE, AND STACK SIZE 00007200 OF LIBMAIN/DISK, SEE SEQUENCE NUMBER 45075470; 00007210 LABEL GOGOGO,NORMALERROR,P2BUSY,TIMER,EXTERNAL,INQUEST, 00008000 PROCSWIT,P2FAKE,KEYBOARDREQUEST,RETURN,COMINIT,MEMORYPARITY %WE 00009000 ; 00010000 DEFINE GETUSERDISK(GETUSERDISK1)=PETUSERDISK(GETUSERDISK1,0)#;% 00012001 $ SET OMIT = NOT(DUMP OR DEBUGGING) 00012159 DEFINE DUMPNOW(DUMPNOW1) = 00012160 DUMPCORE(DUMPNOW1&(GETSPACE(22,0,0) + 3)[15:33:15])#;% 00012165 $ POP OMIT 00012166 INTEGER RRRMECH=@201;% 00013000 DEFINE SPACE(SPACE1) =(GETSPACE(SPACE1,0,0) + 2)#; 00013500 DEFINE MCP=M[1]#; %PRIVILEDGED USERCODE STORED IN M[1] 00013600 DEFINE % KEYIN TABLE DEFINE VALUES FOR "REPLY" 00013700 VAX = 01#, 00013710 VIL = 02#, 00013720 VUL = 03#, 00013730 VQT = 04#, 00013740 VOU = 05#, 00013750 VWY = 06#, 00013760 VRM = 12#, 00013770 VOK = 22#, 00013780 VFM = 23#, 00013790 VFR = 24#, 00013800 VOF = 25#, 00013810 VCC = 21#, 00013820 VIF = 32#; 00013830 DEFINE 00013850 $ SET OMIT = AUXMEM 00013860 SPACESTACKSIZE = 80#; 00013880 $ SET OMIT = NOT(AUXMEM) 00013900 SAVE INTEGER PROCEDURE GETSPACE(SIZE,TYPE,SAVEF);% 00014000 VALUE SIZE,TYPE,SAVEF;% 00015000 INTEGER SIZE,TYPE;% 00016000 BOOLEAN SAVEF; FORWARD;% 00017000 DEFINE %167-00017005 TYPEDSPACE(TYPEDSPACE1,TYPEDSPACE2) = 00017010 (GETSPACE(TYPEDSPACE1,TYPEDSPACE2,0)+2)# % 00017015 ,ARRAYDESC(ARRAYDESC1,ARRAYDESC2) = 00017020 ([M[GETSPACE(ARRAYDESC1,ARRAYDESC2,0)+2]] & ARRAYDESC1 [SIZE])# %00017025 ,SAVEARRAYDESC(SAVEARRAYDESC1,SAVEARRAYDESC2) = 00017030 ([M[GETSPACE(SAVEARRAYDESC1,SAVEARRAYDESC2,1)+2]] 00017035 & SAVEARRAYDESC1 [SIZE])# %00017040 ; 00017045 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00017100 %**********************************************************************%00017110 %* *%00017120 %* MEMORY AREA TYPES STORED IN 3:6 FIELD OF FIRST MEMORY *%00017130 %* LINK OF ALL MEMORY AREAS *%00017140 %* *%00017150 %**********************************************************************%00017160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00017170 DEFINE %167-00017180 UNKNOWNAREAV = 0# % %167-00017190 ,CODEAREAV = 1# % %167-00017200 ,DATAAREAV = 2# % %167-00017210 ,IOBUFFERAREAV = 3# % %167-00017220 ,ALGOLFIBAREAV = 4# % %167-00017230 ,INQUIRYBUFFAREAV = 5# % %167-00017240 ,COBOLFIBAREAV = 6# % %167-00017250 ,TYPE7INTAREAV = 7# % %167-00017260 ,DISKHEADERAREAV = 8# % %167-00017270 ,MAINTBUFFAREAV = 9# % %167-00017280 ,LBLEQNAREAV = 10# % %167-00017290 ,SEGZEROAREAV = 11# % %167-00017300 ,STACKAREAV = 12# % %167-00017310 ,TYPE13INTAREAV = 13# % %167-00017320 ,SCRATCHDIRAREAV = 14# % %167-00017330 ,OPSETAREAV = 15# % %167-00017340 ,DIRTOPAREAV = 16# % %167-00017350 ,SPOUTMSGAREAV = 17# % %167-00017360 ,UVROWAREAV = 18# % %167-00017370 ,JARROWAREAV = 19# % %167-00017380 ,CIDROWAREAV = 20# % %167-00017390 ,INQINPUTAREAV = 21# % %167-00017400 ,INTARRAYAREAV = 22# % %167-00017410 ,RJEINPUTAREAV = 23# % %167-00017420 ,DCQUEUEAREAV = 24# % %167-00017430 ,DALOCROWAREAV = 25# % %167-00017440 ,SHEETAREAV = 26# % %167-00017450 ,STAWORDAREAV = 27# % %167-00017460 ,KEYINBUFAREAV = 28# % %167-00017470 ,FSAREAV = 29# % %167-00017480 ,DC19QUEUEAREAV = 30# % %167-00017490 ,AVTABLEAREAV = 31# % %167-00017500 ,TRACETABLEAREAV = 32# % %167-00017510 ,SEGDICTAREAV = 33# % %167-00017520 ,STACKPRTAREAV = 34# % %167-00017530 ,MCPTABLEAREAV = 35# % %167-00017540 ,IRSTACKAREAV = 36# % %167-00017550 ,FPBAREAV = 37# % %167-00017560 ,CONTROLCARDAREAV = 38# % %167-00017562 ,LABELAREAV = 39# % %167-00017564 ,MDUMPAREAV = 40# % %167-00017566 ,ESPDISKAREAV = 41# % %167-00017568 ,LOGAREAV = 42# % %167-00017570 ,CANDEINPUTAREAV = 43# % TSS MCP ONLY %167-00017572 ,OBJOBINPUTAREAV = 44# % TSS MCP ONLY %167-00017574 ,TYPE45 = 45# % %167-00017576 ,TYPE46 = 46# % %167-00017578 ,TYPE47 = 47# % %167-00017580 ,TYPE48 = 48# % %167-00017582 ; %167-00017600 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00017700 %**********************************************************************%00017710 %* *%00017720 %* M E M O R Y L I N K S *%00017730 %* *%00017740 %**********************************************************************%00017750 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00017760 % %167-00017762 % FIELDS OF MEMORY LINK 0 OF ALL AREAS %167-00017764 % %167-00017766 FIELD %167-00017770 AREAAVAILF = 01:01 % = 0 FOR IN-USE AREA, = 1 FOR AVAIL. AREA 00017780 ,AREASAVEF = 02:01 % = 1 FOR IN-USE SAVE AREA, = 0 FOR OLAY AREA00017790 ,AREATYPEF = 03:06 % TYPE OF AREA (SEE ABOVE) %167-00017800 ,AREAMIXF = 09:06 % MIX INDEX OF OWNER OF AREA %167-00017810 ,AREABACKLINKF = 18:15 % ADDRESS OF PREVIOUS AREA %167-00017820 ,AREAFWDLINKF = 33:15 % ADDRESS OF NEXT AREA %167-00017830 ; %167-00017840 SAVE REAL PROCEDURE WAITIO(IOD,MASK,U);% 00018000 VALUE IOD,MASK,U; REAL IOD,MASK,U; FORWARD;% 00019000 SAVE PROCEDURE DISKWAIT(CORE,SIZE,DISK); 00019100 VALUE CORE,SIZE,DISK; 00019200 REAL CORE,SIZE,DISK; 00019300 FORWARD; 00019400 PROCEDURE ERRORFIXER(TYPE); VALUE TYPE; REAL TYPE; FORWARD; 00019500 SAVE PROCEDURE SNOOZE(PRYR,ADDRESS,MASK); VALUE PRYR,ADDRESS,MASK; 00020000 REAL PRYR; NAME ADDRESS; ARRAY MASK[*]; FORWARD; 00021000 DEFINE SLEEP(SLEEP1,SLEEP2)=SNOOZE(PRYOR[P1MIX],SLEEP1,SLEEP2)#; 00021500 ARRAY PRYOR[*]; 00021600 REAL P1MIX,P2MIX; % SEE 00105000 00021700 ARRAY SLATE[*];% 00022000 REAL NSLATE,LSLATE;% 00023000 DEFINE SLATESIZE=16#,SLATEND=SLATESIZE-1#;%SIZE MUST BE TWO POWER 00023100 REAL NT1=@160,NT2=@161,NT3=@162,NT4=@163,NT5=@164,NT6=@165,NT7=@166; 00024000 REAL CLOCK = @170; % CLOCK.[9:33] CONTAINS THE NUMBER OF TIME INTERVAL 00024005 % INTERRUPTS PROCESSED SINCE HALT LOAD. CLOCK.[42:6] 00024006 % ALWAYS EQUALS ZERO. %156-00024007 COMMENT NT1 THRU NT7 ARE USED BY THE MCP FOR TEMPORARY STORAGE. 00024010 ALL PROCESSES THAT USE THESE VARIABLES ASSUME THAT IF CONTROL 00024020 IS LOST. THERI CONTENT MAY HAVE BEEN CHANGED BY THE TIME 00024030 THAT CONTROL IS REGAINED. 00024040 END COMMENT; 00024050 ARRAY TSKA = NT3[*]; 00024060 REAL MCPBASE; 00024100 COMMENT MCPBASE CONTAINS THE DISK ADDRESS (OCTAL) OF THE BEGINNING 00024200 OF THE MCP THAT IS CURRENTLY IN USE. THIS ADDRESS IS PASSED TO 00024210 THE MCP BY THE LOADER ROUTINE AT EACH HALT/LOAD IN M[0].[18:30].00024220 WHEN THE ESPBIT ROUTINE IS CALCULATING THE DISK ADDRESS 00024230 OF AN MCP SEGMENT, IT ADDS MCPBASE TO THE ADDRESS THAT 00024240 IS CONTAINED IN THE PRT CELL FOR THAT SEGMENT. 00024250 END COMMENT; 00024260 LABEL NOTHINGTODO,INITIATE,START,STACKOVERFLOW,IOBUSY; 00024270 $ SET OMIT = NOT(AUXMEM OR MONITOR) 00024299 $ SET OMIT = NOT MONITOR 00024590 DEFINE MCPNAMESEG = (DIRECTORYTOP-7)#; 00024610 COMMENT MCPNAMESEG CURRENTLY CONTAINS THE FOLLOWING: 00024620 WORD[ 0]-WORD[15] - FILE IDS OF THE AUXDATA FILES FOR MCP & INTRINCS. 00024630 WORD[16]-WORD[19] - CONTAIN THE WORD "AUXMEM " AS A MARKER. 00024640 WORD[20]-WORD[27] - FILE IDS OF THE MCP"S AT HALT/LOAD. 00024650 WORD[28] - USED BY DISKSQUASH FOR COMM. BETWEEN SHAREDISK SYSTEMS. 00024660 ; 00024670 $ SET OMIT = NOT(NEWLOGGING) 00024999 $ SET OMIT = NEWLOGGING 00025299 DEFINE STARTLOG(STARTLOG1)= 00025300 PROCTIME[STARTLOG1]~(*P(DUP))-CLOCK-P(RTR)#, 00025400 STOPLOG(STOPLOG1,STOPLOG2)= 00025500 PROCTIME[STOPLOG1] !(*P(DUP))+CLOCK+P(RTR)#; 00025600 $ POP OMIT 00025601 SAVE PROCEDURE ESPBIT; COMMENT PRESENCE BIT ROUTNE FOR ESP SEGMENTS ;% 00025900 BEGIN INTEGER PRTLOC,SYLLABLE,LOC,SIZE;% 00026000 FIELD MAYBEWORKEDON = [7:1]; % %156-00027000 ARRAY MYSELF=ESPBIT[*];% 00028000 REAL RCW=+0,DISKREAD;% 00029000 LABEL MAKEPRESENT, TRYAGAIN; %156-00030000 $ SET OMIT = NOT(NEWLOGGING) 00030099 PRTLOC~(RCW INX 0)&RCW[30:10:2];% 00031000 STREAM(RLST~[SYLLABLE],CL~PRTLOC);% 00032000 BEGIN SI~CL; SI~SI-2; DI~RSLT; DI~DI+6; DS~2 CHR END;00033000 PRTLOC ~ IF SYLLABLE THEN NT4% 00034000 ELSE SYLLABLE.[36:10];% 00035000 SYLLABLE := @104; % THIS IS THE CODE WE WILL PASS TO 00035500 % GETSPACE THE FIRST TIME. IT REQUESTS00035510 % OVERLAY MEMORY FOR THE MCP AND THAT 00035520 % WE WANT TO BE RETURNED TO ON A NO 00035530 % MEM. %156-00035540 IF MEMORY[PRTLOC].MAYBEWORKEDON THEN% 00036000 MAKEPRESENT: BEGIN MEMORY[PRTLOC].MAYBEWORKEDON~FALSE;% 00037000 SIZE~MEMORY[PRTLOC].[8:10];% 00038000 % %156-00039000 % NOW WE WILL ATTEMPT TO GET SPACE FOR THIS MCP PROC. 00039005 % IF WE FAIL WE WILL WAIT FOR A SECOND AND THEN TRY 00039010 % AGAIN. THIS ENSURES THAT IF WE GET DS-ED WHILE %156-00039015 % SLEEPING WAITING FOR MEMORY WE WILL NOT LEAVE THE 00039020 % TOGGLE LOCKED UP FOR THIS PROCEDURE. %156-00039025 % %156-00039030 IF (LOC:=GETSPACE(SIZE,1,SYLLABLE))=0 THEN % NO MEM 00039035 BEGIN %156-00039040 MEMORY[PRTLOC].MAYBEWORKEDON := TRUE; % UNLOCK I00039045 SYLLABLE.[46:1] := TRUE; % DONT PRINT NO MEM 00039050 SLEEP([CLOCK],NOT CLOCK); % WAIT FOR ONE SECOND.00039055 GO TO TRYAGAIN; %156-00039060 END; %156-00039065 $ SET OMIT = NOT(AUXMEM) 00039099 DISKREAD~(LOC+1)&SIZE[8:38:10]&@14[21:42:6] %E00040000 &((SIZE+29) DIV 30)[27:42:6];% 00041000 STREAM(L:=LOC+1.N:=M[PRTLOC].[18:15]+MCPBASE,D:=0); 00042000 BEGIN SI~LOC N; DI~L; DS~8 DEC END;% 00043000 SYLLABLE~WAITIO(DISKREAD,0,18);% 00044000 $ SET OMIT = NOT(AUXMEM) 00044099 MEMORY[LOC]~MEMORY[LOC]&0[2:47:1]&0[9:42:6];% 00045000 MEMORY[LOC+1]~PRTLOC&SIZE[18:33:15];% 00046000 M[PRTLOC] := M[PRTLOC] & TRUE [MAYBEWORKEDON] %%156-00047000 &(LOC+2)[33:33:15];% 00048000 $ SET OMIT = NOT MONITOR 00048099 END ELSE% 00049000 TRYAGAIN: BEGIN SLEEP([M[PRTLOC]],0&TRUE [MAYBEWORKEDON]);% %156-00050000 IF (MEMORY[PRTLOC] INX 0)=(MYSELF INX 0) THEN% 00051000 GO TO MAKEPRESENT;% 00052000 END;% 00053000 $ SET OMIT = NOT(NEWLOGGING) 00053099 POLISH(0,RDF,0,XCH,FCX,STS);% 00054000 GO TO POLISH(MEMORY[PRTLOC]);% 00055000 GO TO START; % PLACE DESC.IN PRT FOR MCP TO AUXMEM TRANSFER 00055100 END ESPBIT;% 00056000 LABEL FINDIT; 00057100 REAL RESULT=12 ,RESULT2=13 ,RESULT3=14 ,RESULT4=15 ;% 00058000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00060000 %**********************************************************************%00060010 %* *%00060020 %* M I S C E L L A N E O U S F I E L D D E F I N I T I O N S *%00060030 %* *%00060040 %**********************************************************************%00060050 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%00060060 %167-00060070 FIELD %167-00060080 FF = 18:15 % %167-00060090 ,CF = 33:15 % %167-00060100 ,CTF = FF % %167-00060110 ,CTC = CF % %167-00060120 ,MSFF = 16:01 % %167-00060130 ; % %167-00060999 % % %167-00061000 % FIELDS OF AIT ENTRY %167-00061010 % %167-00061020 FIELD %167-00061030 FILEBIT = 01:01 % %167-00061040 ,OWNBIT = 02:01 % %167-00061045 ,DIMENSIONS = 03:05 % %167-00061050 ,BLKCNTR = 08:10 % %167-00061060 ,MOM = 18:15 % %167-00061070 ; %167-00061999 % %167-00062000 % FIELDS OF DATA DESCRIPTOR %167-00062010 % %167-00062020 FIELD %167-00062030 % FLAGBITF = 00:00 % %167-00062040 % DATABITF = 01:01 % ALWAYS OFF FOR A DATA DESCRIPTOR %167-00062050 PBITF = 02:01 % ON IF DESCRIPTOR POINTS TO AREA OF CORE %167-00062060 ,SIZE = 08:10 % SIZE OF ARRAY ROW IF ARRAY DESC. %167-00062070 % 0 FOR INDEXED DATA DESC, OR NAME DESC. %167-00062080 % ,MOMADDRESSF = 18:15 % ADDRESS OF MOTHER DESCRIPTOR. %167-00062090 % ,ADDRESSF =33:15 % IF PBIT IS ON THEN THIS FIELD CONTAINS AN%167-00062100 % ACTUAL CORE ADDRESS. IF THE PBIT IS OFF THEN 00062110 % IF THE VALUE OF THIS FIELD IS GREATER THAN 00062120 % OR EQUAL TO 512 THEN THE FIELD CONTAINS A%167-00062130 % DALOC ADDRESS WHICH CAN BE USED TO LOCATE THE 00062140 % DATA IN THE OVERLAY DISK AREA ASSIGNED TO THE 00062150 % THE PROGRAM. IF THE VALUE OF THE FIELD IS LESS00062160 % THAN 512 THEN THIS FIELD CONTAINS A CODE %167-00062170 % INDICATING THE STATUS OF THE AREA. %167-00062180 % 0 NEVER ACCESSED OVERLAY AREA. %167-00062190 % 1 NEVER ACCESSED SAVE AREA. %167-00062200 % 2 NEVER ACCESSED OVERALY AREA WHICH 00062210 % WHICH IS ASSIGNED TO AUXMEM. 00062220 % 5 INDICATES OVERLAY IS CURRENTLY IN 00062230 % PROCESS FOR THIS AREA. %167-00062240 % 6 INDICATES OLAY HAD IRRECOVERABLE 00062250 % ERROR WHEN OVERLAYING THIS AREA.00062260 % THE NEXT ACCESS TO THE AREA WILL00062270 % CAUSE THE PROGRAM TO BE TERMI- 00062280 % NATED. %167-00062290 ; %167-00062999 % %167-00067000 % MISCELLANEOUS DEFINES %167-00067010 % %167-00067020 DEFINE %167-00067030 CURBLKCNTR = 16 # % %167-00067040 ,AITINDEX = 6 # % %167-00067050 ,FTF = 18:18:15 # % %167-00067060 ,FTC = 33:18:15 # % %167-00067070 ,DELTA = 11 # % %167-00067080 ,TSX = 22 # % %167-00067090 ,SFINTX = 27 # % %167-00067100 ,INTRPTX = 28 # % %167-00067110 ; %167-00067999 INTEGER AVAIL;% 00069000 COMMENT AVAIL CONTAINS THE ADDRESS OF THE STOPPER% 00070000 FOR AVAILABLE STORAGE LINKS ITS VALUE IS% 00071000 THE HIGHEST AVAILABLE ADDRESS-1;% 00072000 DEFINE MSTART = M[0].[CF]#; 00073000 COMMENT MSTART CONTAINS THE ADDRESS OF THE% 00074000 FIRST AREA OF STORAGE AFTER END OF% 00075000 ESP PROGRAM;% 00076000 DEFINE MEND = M[0].[FF]#; 00077000 COMMENT THIS POINTS TO LAST STORAGE LINK IN% 00078000 MEMORY;% 00079000 ARRAY TAR[*]; %CONTAINS TOGLE BITS SET BY EACH JOB 00079100 DEFINE LOCKTOG(LOCKTOG1)= BEGIN TOGLE:=TOGLE AND NOT LOCKTOG1; 00079200 TAR[P1MIX]:=TAR[P1MIX] OR LOCKTOG1; END#; 00079300 DEFINE UNLOCKTOG(UNLOCKTOG1)= BEGIN TOGLE:=TOGLE OR UNLOCKTOG1; 00079400 TAR[P1MIX]:=TAR[P1MIX] AND NOT UNLOCKTOG1; END#; 00079500 REAL TOGLE; 00080000 DEFINE HP2TOG = TOGLE.[47:1]#, HP2MASK = @1# 00080100 ,STATUSBIT = TOGLE.[46:1]#, STATUSMASK = @2# 00080200 ,SHEETFREE = TOGLE.[45:1]#, SHEETMASK = @4# 00080300 ,STACKUSE = TOGLE.[44:1]#, STACKMASK = @10# 00080400 ,STOREDY = TOGLE.[43:1]#, STOREMASK = @20# 00080500 ,USERDISKREADY= TOGLE.[42:1]#, USERDISKMASK= @40# 00080600 ,HOLDFREE = TOGLE.[41:1]#, HOLDMASK = @100# 00080700 ,NSECONDREADY = TOGLE.[40:1]#, NSECONDMASK = @200# 00080800 ,ABORTABLE = TOGLE.[39;1]#, ABORTMASK = @400# 00080900 ,BUMPTUTIME = TOGLE.[38:1]#, BUMPTUMASK =@1000# 00080950 ,KEYBOARDREADY = TOGLE.[37:1]#, KEYBOARDMASK =@2000# 00081000 ,NOBACKTALK = TOGLE.[36:1]#, NOBACKTALKMASK=@4000# 00081100 ,QTRDY = TOGLE.[35:1]#, QTRDYMASK =@10000# 00081200 ,INTFREE = TOGLE.[34:1]#, FREEMASK =@20000# 00081300 ,SPOEDNULLOG = TOGLE.[33:1]# 00081400 ,REMOTELOGFREE = TOGLE.[32:1]#, REMOTELOGMASK = @100000# 00081500 ,EGGSELECTSTOPPED = TOGLE.[31:1]# 00081600 ,STARTOG = TOGLE.[30:1]# 00081610 ,NINETEENNOTREADING=TOGLE.[29:1]#, NINETEENMASK=@1000000# 00081620 ,SMWSTOPPED=TOGLE.[28:1]#, SMWSTOPPEDMASK=@2000000# 00081630 ,DCWAITING=TOGLE.[27:1]# 00081640 ,DCQPTSTOPPED=TOGLE.[26:1]# 00081650 ,INQUPTSTOPPED=TOGLE.[25:1]# 00081660 ,MCPFREE=TOGLE.[24:1]#, MCPMASK=@40000000# 00081670 % USED TO PROTECT DISK SEGMENT ZERO 00081675 ,SCRATCHDIRECTORYREADY = TOGLE.[23:1]#, 00081680 SCRATCHDIRECTORYMASK = @100000000 00081690 % USED TO PROTECT THE SCRATCHDIRECTORY 00081695 ,FINDINGADDRESS=TOGLE.[22:1]# 00081700 % SET TRUE WHENEVER THE INDEPENDENT RUNNING ROUTINE 00081705 % "FINDFREEADDRESS" IS STARTED SO THAT ONLY ONE COPY 00081706 % WILL BE RUN AT ONE TIME. 00081707 ,CDFREE=TOGLE.[21:1]#,CDMASK=@400000000# 00081710 % SET TRUE WHEN CONTROL DECK QUEUE IS FREE 00081711 ,NOMEM=TOGLE.[15:6]# %GETSPACES HANGING 00081950 ,BREAKTOG=TOGLE.[14:1]# %BREAKOUT TOG 00081960 ,BREAKMASK=@100000000000# 00081970 ,SEPTICTANKING = TOGLE.[13:1]# 00081972 ,DIRECTORYTOG = TOGLE.[12:1]# 00081974 ,DIRECTORYMASK = @400000000000# 00081976 ,NOMEMTOG = TOGLE.[11:1]# % ON IF NOMEM SINCE LAST NSECOND 00081980 ,MEMNO = [9:3]# % 9:2 = COUNTER FOR NSECOND 00081982 00081999 STREAM PROCEDURE MOVE(N)"WORDS FROM"(HERE)"TO"(THERE);% 00082000 VALUE N,HERE,THERE;% 00083000 COMMENT WILL MOVE 0 TO 4095 WORDS;% 00084000 BEGIN LOCAL NDIV64;% 00085000 SI~LOC N; DI~LOC NDIV64; SI~SI+6; DI~DI+7; DS~1 CHR;00086000 SI~HERE; DI~THERE;% 00087000 NDIV64(DS~32 WDS; DS~32 WDS); DS~N WDS;% 00088000 END MOVE;% 00089000 $ PAGE 00089050 PROCEDURE STOPM(B); VALUE B; BOOLEAN B; FORWARD; 00089100 LABEL DIFFCOM; 00089200 SAVE PROCEDURE FORGETSPACE(LOC);% 00090000 VALUE LOC;% 00091000 REAL LOC;% 00092000 FORWARD;% 00093000 ARRAY BED[*]; % 4MIXMAX+4 00094000 COMMENT ENTRIES IN THE BED HAVE TWO WORDS.% 00095000 THE FIRST WORD HAS THE FOLLOWING FORMAT;% 00096000 0- 2 = 5% 00097000 3- 7 = MIXINDEX% 00098000 8-17 = 0% 00099000 18-32 = F REGISTER SETTING% 00100000 33-47 = ADDRESS OF WORD TO BE TESTED.% 00101000 THE SECOND WORD IS A MASK IF BIT 0 IF OFF.% 00102000 THE SECOND WORD IS AN ACCIDENTAL ENTRY DESCRIPTOR IF BIT 000103000 IS ON;% 00104000 COMMENT P1MIX,P2MIX NOW DECLARED AT 00021700; 00105000 COMMENT P1MIX IS THE MIX INDEX FOR THE JOB BEING CURRENTLY% 00106000 PROCESSED. P1MIX = 0 MEANS NO JOB IS CURRENTLY BEING% 00107000 PROCESSED. P2MIX IS THE MIX INDEX FOR THE JOB BEING% 00108000 CURRENTLY PROCESSED ON PROCESSOR 2. IF PROCESSOR IS IDLE 00109000 THEN P2MIX = 0. IF THERE IS NO PROCESSOR 2 THEN P2MIX=-1;00110000 REAL DATE=@167; 00111000 COMMENT DATE CONTAINS TODAYS DATE;% 00112000 REAL XCLOCK=@171; 00114000 REAL READY=@172; 00121000 COMMENT READY CONTAINS THE CONTENTS OF THE READY REGISTER ON% 00122000 THE LAST READ;% 00123000 COMMENT STATUSBIT IS FALSE IF THE STATUS ROUTINE IS RUNNING AND00125000 TRUE OTHERWISE. THIS PREVENTS TWO COPIES OF STATUS FROM% 00126000 RUNNING TOGETHER;% 00127000 ARRAY PRT[*,*];% 00128000 COMMENT PRT[1,*] CONTAINS A DATA DESCRIPTOR WITH PROPER SIZE% 00129000 FIELD POINTING AT PRT FOR JOB WITH MIX INDEX = 1;% 00130000 ARRAY PRTROW=PRT[*]; % MIXMAX+1% 00131000 COMMENT PRTROW IS DOPE VECTORS FOR PRT;% 00132000 ARRAY JAR[*,*];% 00133000 % JAR HOLDS INFO OF JOBS IN PROCESS (SEE DEFINES AT 20544000) 00134000 DEFINE 00134010 LIBMAINCODE=1#, LDCNTRLCODE=3#, PRNPBTCODE=5#, 00134020 SYSJOBF=[6:3]#, SSYSJOBF=[5:3]#; 00134030 % SEE 20556700 RE SYSJOBF (SYSTEM JOB FIELD) 00134040 % SEE 20515000 RE SSYSJOBF (SHEET SYSTEM JOB FIELD) 00134050 $ SET OMIT = NOT(WORKSET) 00134100 ARRAY STQUE[*]; % QUEUE FOR "STOPPED" JOBS, 16 LONG 00134110 DEFINE STQUEUEMAX = 15#; 00134115 ARRAY OLAYTIME[*]; % USED FOR STORAGE OF OLAY OVERHEAD TIME 00134120 PROCEDURE WORKSET(N); VALUE N; RAEL N; FORWARD; 00134125 ARRAY WKSETDATA[*]; 00134130 % ARRAY USED FOR STORAGE OF WORKSET INFORMATON 00134140 DEFINE WKSETCLOCK = WKSETDATA[0]#, 00134150 % TIME AT WHICH WORKSET ROUTINE HAS STARTED 00134160 % TO RUN 00134170 WKSETRUNNING = WKSETDATA[1].[47:1]#, 00134180 % TOGGLE TO INDICATE THAT WORKSET IS RUNNING 00134190 WKSETNOSELECT = WKSETDATA[1].[46:1]#, 00134200 % TOGGLE TO PREVENT SELECTRUN FROM PLACING 00134210 % ADDITIONAL JOBS IN THE MIX 00134220 WKSETMONITOR = WKSETDATA[1].[45:1]#, 00134230 % TOGGLE USED TO "MONITOR" WORKSETDATA 00134240 WKSETMAXOLAY = WKSETDATA[2]#, 00134250 % MAX. FRACTION OF PROCESS TIME TO COMPUTE 00134260 % MAXIMUM ALLOWABLE OLAY TIME 00134270 WKSETOLERANCE = WKSETDATA[3]#, 00134280 % FRACTION USED TO CMOPARE JOB STATISTICS 00134290 % (ALLOWABLE VARIANCE TO COMPUTE MAX.VALUES) 00134300 WKSETINSTRUCT = WKSETDATA[4]#, 00134310 % INSTRUCTIONS FOR COMPARING JOB STATISTICS 00134320 % FRACTION OF TOTAL SYSTEM CORE WHICH MUST 00134330 % BE KEPT AVAILABLE 00134340 WKSETCYCLETIME = WKSETDATA[5]#, 00134350 % CYCLE TIME (64THS OF A SECOND) FOR WHICH 00134360 % THE WORKSET ROUTINE IS RUN, QUEUED AT 00134370 % "TIME" IN THE OUTER BLOCK 00134380 WKSETSTOPJOBS = WKSETDATA[6]#, 00134390 % BIT INDEX (TWO(MIX)) FOR JOBS WHICH HAVE 00134400 % BEEN "ST-ED" BY THE WORKSET ROUTINE 00134410 STFIRST = WKSETDATA[7].[CF]#, 00134420 % INDEX TO FIRST ENTRY IN THE "STQUE" 00134430 STNEXT = WKSETDATA[7].[FF]#, 00134440 % INDEX T NEXT AVAILABLE SLOT IN "STQUE" 00134450 WKSETSWITCHTIME= WKSETDATA[8]#, 00134460 % TIME OF LAST "JOB" OR "EOJ" EVENT 00134470 WKSETDATASIZE = 9#; % SIZE OF THE WKSETDATA ARRAY 00134480 $ POP OMIT % WORKSET 00134490 ARRAY INTRNSC[*]; REAL INTSIZE;% RE-ENTRANT INTRINSICS ON USER DISK 00135000 ARRAY INTABLE[*,*], INTABLEROW=INTABLE[*];% 00135100 $ SET OMIT = NOT(AUXMEM) 00135199 ARRAY SHEET[*]; % 5% 00136000 ARRAY JARROW=JAR[*]; % MIXMAX+1% 00138000 DEFINE TABCNT[TABCNT1] = JARROW[TABCNT1].[FF]#; 00138100 COMMENT TABCNT IS THE NUMBER OF PROCESSES WHICH HAVE CHECKED 00138110 JARROW AND ARE CURRENTLY ACCESSING MIX TABLES. IT ASSURES 00138120 THAT THE TABLES DONT VANISH BENEATH THOSE PROCESSES; 00138130 COMMENT ENTRIES IN THE SLATE HAVE TWO WORDS. EACH ENTRY% 00140000 DESCRIBES AN INDEPENDENT ROUTINE WHICH NEEDS TO BE STARTED00141000 RUNNING. NOTHING TO DO STARTS THESE ROUTINES.% 00142000 THE FIRST WORD OF AN ENTRY IS A PARAMETER TO THE ROUTINE. 00143000 THE SECOND WORD OF AN ENTRY IS THE PRT ADDRESS OF THE% 00144000 ROUTINE.% 00145000 NSLATE AND LSLATE ARE POINTERS T THE SLATE.% 00146000 NSLATE POINTS AT LAST ENTRY WHICH WAS STARTED.% 00147000 LSLATE POINTS AT LAST ENTRY PLACED IN THE SLATE;% 00148000 REAL JOBNUM;% 00149000 COMMENT JOBNUM POINTS AT LAST ENTRY IN BED;% 00150000 COMMENT STACKUSE IS TRUE IF THE INDEPEDENT STACK IS NOT IN USE.00152000 OTHERWISE FALSE;% 00153000 BOOLEAN NOPROCESSOTOG;% 00154000 COMMENT NOPROCESSTOG IS TRUE IF NORMAL STATE PROCESSING IS% 00155000 ALLOWED, OTHERWISE IT IS FALSE. IT IS USED BY OVERLAY AND00156000 OTHERS TO PREVENT CONFUSION;% 00157000 REAL SOFTI; % NUMBER OF JOBS IN MIX HAVING SOFTWARE INTERRUPTS DECLARED 00157100 REAL WITCHINGHOUR,WORDOFEASE; 00157500 COMMENT THESE USED TO BE CONSTANTS IN THE OUTER BLOCK BUT WERE 00157600 MOVED HERE SO EVERYONE COULD USE THEM. THEY CONTAIN: 00157700 WITCHINGHOUR 5184000 00157800 WORDOFEASE @2525252525252525 00157900 ; 00158000 DEFINE NDX=3#; % NUMBER OF ENTRIES PER JOB IN NFO ARRAY 00158100 ARRAY NFO[*]; %MIXMAX|NDX 00158200 COMMENT NFO CONTAINS THE FOLLOWING FOR EACH ACTIVE MIX INDEX; 00158300 % NFO[(MIX-1)|NDX] = FILE PARAMETER BLOCK DATA DESCRIPTOR 00158400 % NFO[(MIX-1)|NDX+1] = SEGMENT DICTIONARY NAME DESCRIPTOR 00158500 % NFO[(MIX-1)|NDX+2].[CF] = LOCATION OF BOTTOM OF STACK (B-WORD) 00158600 % NFO[(MIX-1)|NDX+2].[FF] = ESTIMATED CORE REQUIREMENTS 00158700 % NFO[(MIX-1)|NDX+2].[1:17] = CLOCK TIME AT BOJ 00158800 ARRAY ESTACK[*]; % 128% 00159000 ARRAY PROCTIME[*]; % MIXMAX+1% 00161000 COMMENT PROCTIME[I] CONTAINS PROCESSOR TIME FOR JOB WITH% 00162000 MIX INDEX = I;% 00163000 ARRAY IOTIME[*]; % MIXMAX+1% 00164000 COMMENT IOTIME[I] CONTAINS I-O TIME FOR JOB WITH MIX INDEX =1; 00165000 $ SET OMIT = NOT(NEWLOGGING) 00165009 DEFINE EUIOHOLDER=DIRECTORYTOP-5#, 00165800 EUTAPER=.98#, 00165810 DISKAVAILTABLEMAX=130#; 00165820 INTEGER NEUP; ARRAY EUIO[*]; ARRAY PEUIO[*]; 00166000 $ SET OMIT = NOT(SHAREDISK ) 00166002 $ SET OMIT = SHAREDISK 00166005 ARRAY AVTABLE[*] ; 00166006 $ POP OMIT 00166007 COMMENT NEUP.[CF] CONTAINS THE NUMBER OF EUS ON DKA. 00166010 NEUP.NEUF CONTAINS THE TOTAL NUMBER OF EUS ON THE SYSTEM. 00166025 EUIO AND PEUIO CONTAIN THE I-O TIME USED BY A GIVEN EU. 00166030 THIS INFORMATION IS USED BY GETUSERDISK IN AN ATTEMPT TO 00166040 MINIMIZE EU CONFLICT; 00166050 DEFINE MIXF = [3:5]#;% 00168000 ARRAY CHANIO[*]; 00169000 ARRAY CHANNEL[*]; % 5% 00170000 COMMENT CHANNEL[I] CONTAINS LOGICAL UNIT OF LAST DESCRIPTOR% 00171000 SENT OUT ON CHANNEL I;% 00172000 ARRAY FINALQUE[*]; % 32% 00173000 ARRAY LOCATQUE[*]; % 32% 00174000 COMMENT IOQUE,FINALQUE, AND LOCATQUE TOGETHER WITH UNIT FORM% 00175000 THE I-O QUEUE. AN I-O REQUEST FOR LOGICAL UNIT U REQUIRES00176000 THREE WORDS OF SPACE IN THE I-O QUEUE. IF THE REQUEST% 00177000 OCCUPIES POSITION S IN THE I-O QUEUE, THEN IOQUE[S] )% 00178000 I-O DESCRIPTOR FOR THIS REQUEST, FINAL[S] = I-O DESCRIPTOR00179000 SKELETON TO BE USED AT I-O COMPLETE TIME TO REBUILD% 00180000 I-O DESCRIPTOR, LOCATQUE[S] = LOCATION OF I-O DESCRIPTOR% 00181000 AT TIME OF REQUEST. LOCATQUE[S] CONTAINS SOME ADDITIONAL 00182000 INFORMATION. IN PARTICULAR:% 00183000 0- 2 = 5% 00184000 3- 7 = MIX INDEX OF REQUESTER% 00185000 8 = I/O IS READ LOCK WHICH HAD ERROR (SHAREDISK).00185100 9 = OLAY I/O (IOFINISH PLACES RESULT ON ERROR). 00185500 10 = NO MEM MESSAGE. 00186000 11 = ERROR RECOVERY IN PROCESS ON THIS I-O 00186100 12-17 = LOGICAL UNIT NUMBER% 00187000 18-32 = INDEX OF NEXT REQUEST TO BE DONE ON THIS UNIT00188000 OR @77777 IF NO NEXT REQUEST% 00189000 33-47 = ORIGINAL LOCATION OF I-O DESCRIPTOR.% 00190000 UNIT[U] CONTAINS INFORMATION ABOUT LOGICAL UNIT U.% 00191000 1- 4 = TYPE OF I/O DEVICE% 00192000 5-12 = ERROR FIELD OF LAST I/O DONE ON THIS UNIT% 00193000 13 = UNIT NOT READY BIT% 00194000 14 = ERROR BIT (ON IF ERROR)% 00195000 15 = WAIT BIT (ON IF UNIT IS WAITING FOR A CHANNEL00196000 16-17 = PROCESS BITS (USUALLY BOTH ON IF UNIT IS IN% 00197000 PROCESS OR BOTH OFF. WITH PRINTERS THE% 00198000 I-O FINISH SETS OFF 16 AND THE PRINTER% 00199000 FINISH SETS OFF 17)% 00200000 18-32 = INDEX OF FIRST I-O REQUEST FOR WHICH SERVICE 00201000 IS NOT COMPLETE% 00202000 33-47 = INDEX OF LAST UNSERVICED I-O REQUEST.% 00203000 THE SPACES NOT USED IN THE I-O QUEUE ARE LINKED TOGETHER% 00204000 THROUGH IOQUE. THE FIRST AVAILABLE IS IN IOQUEAVAIL;% 00205000 REAL IOQUESLOTS,IOQUEAVAIL; 00205500 ARRAY IOQUE[*]; 00206000 DEFINE RETURNIOSPACE(RETURNIOSPACE1) = 00206500 BEGIN IOQUESLOTS:=IOQUESLOTS+1; 00207000 IOQUE[RETURNIOSPACE1]:=IOQUEAVAIL; 00207500 IOQUEAVAIL:=RETURNIOSPACE1; 00208000 END#; 00208500 ARRAY UNIT[*]; 00209000 COMMENT UNIT NOW FILLED IN INITIALIZE; 00210000 ARRAY TINU[*]; 00241700 COMMENT TINU NOW FILLED IN INITIALIZE; 00241800 ARRAY WAITQUE[*]; % 8% 00278000 REAL NEXTWAIT,FIRSTWAIT;% 00279000 COMMENT WAITQUE IS A QUEUE OF UNITS FOR WHICH THERE ARE% 00280000 REQUESTS BUT NO CHANNEL IS AVAILABLE. NEXTWAIT AND% 00281000 FIRSTWAIT ARE POINTERS AT THE WAITQUE. NEXTWAIT IS THE% 00282000 NEXT AVAILABLE SLOT IN WAITQUE AND FIRSTWAIT POINTS AT% 00283000 NEXT UNIT TO BE USED WHEN A CHANNEL IS AVAILABLE;% 00284000 ARRAY LABELTABLE[*]; % 32% 00285000 ARRAY MULTITABLE[*]; % 32% 00286000 ARRAY RDCTABLE[*]; % 32% 00287000 ARRAY PRNTABLE[*];% 00288000 ARRAY REPLY[*];% 00289000 COMMENT LABELTABLE, MULTITABLE, AND RDCTABLE CONTAIN LABEL INFORMATION% 00290000 BY LOGICAL UNIT NUMBER AS FOLLOWS:% 00291000 LABELTABLE[I] CONTAINS THE FILE ID FOR LOGICAL UNIT I.% 00292000 MULTITABLE[I] CONTAINS THE CORRESPONDING MULTI-FILE ID.% 00293000 RDCTABLE[I] CONTAINS THE CORRESPONDING REEL NUMBER (IN [14:10]),00294000 CREATION DATE (IN [24:17]), AND CYCLE (IN [41:7]);% 00295000 $ SET OMIT = NOT(SHAREDISK) 00295999 REAL OPTION;% 00297000 REAL ILL,INQCT; 00299000 REAL PINGO; 00301000 REAL READQ,RRNCOUNT; DEFINE PUT=SET#; 00301100 $ SET OMIT = NOT(DATACOM ) 00301200 ARRAY TRANSACTION[*]; % 32% 00304000 DEFINE ETRLNG = 5#; % LENGTH OF ENTRY IN FILE BLOCK% 00305000 SAVE REAL PROCEDURE TWO(N); VALUE N; INTEGER N; 00306000 BEGIN REAL T=+1; 00307000 STREAM(N:=N:=47-N,T:=[T]); 00308000 BEGIN SKIP N DB; DS:=SET; END; 00308500 END TWO; 00309000 REAL SYLLABLE;% 00310000 $ SET OMIT = NOT(SHAREDISK) 00310099 $ SET OMIT = SHAREDISK 00310199 DEFINE SYSNO=0#, SYSMAX=1#; 00310200 $ POP OMIT 00310201 COMMENT ANALYSIS PLACES THE SYLLABLE THAT CAUSED THE INTERRUPT 00311000 IN SYLLABLE. THIS IS USED BY PRESENCE BIT, FLAG BIT, AND 00312000 VARIOIUS ERRORS;% 00313000 PROCEDURE FORGETUSERDISK(A,L);VALUE A,L;REAL A,L;FORWARD;% 00316000 REAL PROCEDURE PETUSERDISK(N,T);VALUE N,T;REAL N,T;FORWARD ; 00316100 $ SET OMIT = NOT DEBUGGING 00316999 $ SET OMIT = NOT DEBUGGING 00330999 ARRAY DALOC[*,*], DALOCROW[*]; 00333000 $ SET OMIT = NOT(BREAKOUT) 00333099 REAL OLAYMASK;% FOR LOCKING OUT GETMOREOLAYDISK BY MIX INDEX 00336000 PROCEDURE USERDISKSPECIALCASE(Q,R,U,J);VALUE Q,J;REAL Q,R,J; 00336100 ARRAY U[*]; FORWARD ; 00336110 DEFINE BASE=30268#,% 00338000 CHUNKSIZE=500#;% 00339000 REAL LEFTOFF; COMMENT POINTER TO CYCLE FOR OLAY;% 00341000 SAVE PROCEDURE DISKRTN(SEGNO, SIZE); 00363000 VALUE SEGNO, SIZE; 00363100 INTEGER SEGNO, SIZE; 00363200 FORWARD; 00363300 PROCEDURE FORGETSPDISK(SEG);VALUE SEG;REAL SEG;FORWARD; 00364000 SAVE INTEGER PROCEDURE DISKSPACE(NWORDS,P1MIX,AUX);% 00365000 VALUE NWORDS,P1MIX,AUX; 00366000 INTEGER NWORDS,P1MIX;REAL AUX; 00367000 FORWARD; 00368000 PROCEDURE STATUS;% 00369000 FORWARD;% 00370000 PROCEDURE INTERRUPT(TYPE);VALUE TYPE;REAL TYPE; FORWARD; 00370500 REAL PROCEDURE FINDOUTPUT(MID,FID,TYPE,FORMS,REEL,CDATE,CYCLE,KIND);% 00371000 VALUE MID,FID,TYPE,FORMS,REEL,CDATE,CYCLE,KIND;% 00372000 REAL MID,FID,TYPE,FORMS,REEL,CDATE,CYCLE,KIND; FORWARD;% 00373000 REAL PROCEDURE FINDINPUT(MID,FID,REEL,CDATE,CYCLE,COBOL,UL,OF,MODE,FN); 00374000 VALUE MID,FID,REEL,CDATE,CYCLE,COBOL,UL,OF,MODE,FN);% 00375000 REAL MID,FID,FEEL,CDATE,CYCLE,COBOL,UL,OF,MODE,FN; FORWARD;00376000 PROCEDURE STARTIMING(FN,U); VALUE FN,U; REAL FN,U; FORWARD;% 00377000 PROCEDURE FILEOPEN(X,A); VALUE X,A; INTEGER X,A; FORWARD; 00379000 SAVE PROCEDURE SAVEOPEN(A); VALUE A; REAL A; 00379100 BEGIN FILEOPEN(2,A) END; 00379200 PROCEDURE MIXPRINT(Q); VALUE Q REAL Q; FORWARD; 00379400 % TYPES FOR EACH ACTIVE MIX INDEX 00379500 PROCEDURE JOBMESS(MIX,Q,A,B,C,D); VALUE MIX,Q,A,B,C,D; 00379600 REAL MIX,Q,A,B,C,D; FORWARD; 00379700 PROCEDURE SETNOTINUSE(U,RWL); VALUE U,RWL; REAL U,RWL; FORWARD; 00380000 DEFINE STOPTIMING=STARTTIMING#; 00382000 PROCEDURE FILLBUFFERS(CURRENT,FINAL,COBOL,NR); 00385000 VALUE CURRENT,FINAL,COBOL,NR; REAL CURRENT,FINAL,COBOL,NR; 00385500 FORWARD; 00386000 DEFINE GETBUFFERS=FILLBUFFERS#; 00387000 PROCEDURE REALFILECLOSE(A); VALUE A; REAL A; FORWARD; 00389000 SAVE PROCEDURE FILECLOSE(A); VALUE A; REAL A; 00389100 BEGN REALFILECLOSE(A) END; 00389200 REAL PROCEDURE DISKADDRESS(MID,FID,FPB3,A,H,IO); % (SHM)00390000 VALUE MID,FID,FPB3,A,H,IO; % (SHM)00390100 REAL MID,FID,FPB3,A,IO; ARRAY H[*]; % (SHM)00390200 FORWARD;% 00391000 PROCEDURE BLASTQ(U); VALUE U; REAL U; FORWARD;% 00392000 REAL PROCEDURE FILEHEADER(MID,FID,NROWS,SIZE,BLEN,RLEN,S);% 00393000 VALUE MID,FID,NROWS,SIZE,BLEN,RLEN,S;% 00394000 REAL MID,FID;% 00395000 INTEGER NROWS,SIZE,BLEN,RLEN,S; FORWARD;% 00396000 PROCEDURE PURGEIT(U); VALUE U; INTEGER U; FORWARD;% 00397000 REAL ESPTAB,ESPCOUNT; 00399000 REAL DIRDSK=@177; 00400500 REAL ESPDISKBOTTOM; % LOWEST ADDRESS OF ESPDISK 00401000 REAL ESPDISKTOP; % HIGHEST ADDRESS OF ESPDISK 00401100 REAL MESSAGEHOLDER;% 00402000 DEFINE USEDRA = OPTION.[47:1]#,% 00403000 USEDRB = OPTION.[46:1]#,% 00404000 BOJMESS =OPTION.[45:1]#,% 00405000 EOJMESS =OPTION.[44:1]#,% 00406000 OPNMESS =OPTION.[43:1]#,% 00407000 TERMGO =OPTION.[42:1]#,% 00408000 GIVEDATE = OPTION.[41:1]#,% 00409000 GIVETIME = OPTION.[40:1]#,% 00410000 SAMEBREAKTAPE=OPTION.[39:1]#, % NOT CURRENTLY USED, 3/73 00411000 AUTOPRINT=OPTION.[38:1]#, 00412000 CLEARWRS=OPTION.[37:1]#, 00413000 NOTIFYOP=OPTION.[36:1]#,% 00414000 DISCONDC = OPTION.[36:1]#, 00414100 COPNMESS=OPTION.[35:1]#,% 00415000 CLOSEMESS=OPTION.[34:1]#,% 00416000 ERRORMSG=OPTION.[33:1]#, 00416050 RETMSG=OPTION.[32:1]#, 00416100 LIBMSG=OPTION.[31:1]#, 00416200 SCHEDMSG=OPTION.[30:1]#, 00416300 SECMSG=OPTION.[29:1]#, 00416400 DSKTOG=OPTION.[28:1]#, 00416500 RELTOG=OPTION.[27:1]#, 00416520 PBDREL=OPTION.[26:1]#, 00416550 CHECKLINK = OPTION.[25:1]#, 00416560 DISKMSG=OPTION.[24:1]#, 00416570 LIBERR =(OPTION.[22:1] OR (SPOUTUNIT.[CF]=0))#, % FROM SPO%589-00416590 USEPRD=OPTION.[21:1]#,% %DS00416600 SVPBT =OPTION.[20:1]#,% 00416610 RSTOG=OPTION.[19:1]#, 00416620 AUTOUNLD=OPTION.[18:1]#, 00416630 AUTORN = OPTION.[17:1]#, %902-00416710 CODEOLAY=OPTION.[16:1]#, 00416730 COREST=OPTION.[15:1]#, 00416740 DATAOLAY=OPTION.[14:1]#, 00416750 HALTSET=OPTION.[13:1]#, 00416751 STOPTEST= OPTION.[8:1]#, 00416760 PUNCHLCK=OPTION.[7:1]#, 00416770 CDONLY=OPTION.[6:1]#, 00416780 PRTONLY=OPTION.[5:1]#, 00416790 SEPARATE=OPTION.[4:1]#, 00416800 MOD3IOS=OPTION.[2:1]#, 00416990 AUTOMESS = OPTION.[1:1]#, 00416992 AUTODS = OPTION.[1:1]#, % ACTS FOR OPERATOR %747-00416995 XXXXXX= OPTION.[0:1]#;% 00417000 DEFINE BOJBIT = 45[18:42:6]#, 00417010 EOJBIT = 44[18:42:6]#, 00417020 OPNBIT = 43[18:42:6]#, 00417030 COPNBIT = 35[18:42:6]#, 00417040 CLOSEBIT=34[18:42:6]#, 00417050 ERRRBIT = 33[18:42:6]#, 00417052 LIBBIT = 31[18:42:6]#, 00417060 SCHEDBIT=30[18:42:6]#, 00417070 SECBIT = 29[18:42:6]#, 00417075 RSBIT = 19[18:42:6]#, 00417080 NEVERBIT=62[18:42:6]#, 00417090 ALWAYSBIT=63[18:42:6]#; 00417100 REAL USERDISKBOTTOM; 00418000 % DISK ADDRESS OF USER DISK AVAILABLE TABLE 00418010 REAL DIRECTORYTOP; 00418050 % DISK ADDRESS OF DIRECTORYTOP SEGMENT--STORED IN M[1] 00418060 %BY MCP LOADER AND STORED IN MCP PRT(DIRECTORYTOP) 00418070 REAL DISKBOTTOM; 00418100 % DISK ADDRESS OF TOP FO BYPASS DIRECTORY, USED IN SCRAMBLE. 00418200 $ SET OMIT = NOT(SHAREDISK) 00418799 $ SET OMIT = SHAREDISK 00418849 REAL HOLDER,NEXTSLOT,BYPASS; 00418850 $ SET OMIT = NOT STATISTICS OR OMIT 00418859 DEFINE HOLDMAX = 30#; % MAXIMUM NUMBER OF ENTRIES IN HOLDLIST 00418900 COMMENT THE HOLDLIST CONTAINS A ONE WORD ENTRY FOR EACH PROCESS 00418910 THAT IS WAITING TO USE A FILE THAT IS ALREADY IN USE. 00418915 HOLDLIST[I].[FF]=THE CORE ADDRESS OF THE WORD THAT THE 00418920 WAITING PROCESS IS SLEEPING ON. 00418925 HOLDLIST[I].[CF]=THE DISK ADDRESS OF THE FILE HEADER 00418930 THAT IS BEING WAITED FOR. 00418935 HOLDLIST[I].[10:8]=MIX INDEX OF THE PROCESS THAT MADE THE 00418937 ENTRY. (TSSMCP ONLY) 00418938 HOLDLIST[I].[2:2]=THE SYSTEM NUMBER (SYSNO) OF THE SYSTEM 00418940 THAT MADE THE ENTRY (SHAREDISK ONLY). 00418945 HOLDLIST[I].[1:1] IS SET BY A SYSTEM TO NOTIFY ANOTHER 00418950 SYSTEM TO AWAKEN THE PROCESS THAT MADE THE ENTRY. 00418955 THE NSECOND ROUTINE EXAMINES THE HOLDLIST IN 00418960 ORDER TO CHECK FOR THIS CONDITION (SHAREDISK ONLY). 00418965 DIRECTORYSEARCH, NSECOND, AND CLEANOUT ARE THE PROCEDURES 00418970 THAT MANIPULATE THE HOLDLIST. 00418975 00418980 THE WORDS ASSOCIATED WITH DIRECTORY HANDLING ARE: 00418985 HOLDER.[CF] = DISK ADDRESS OF HOLDLIST. 00418990 .[FF] = NUMBER OF ENTRIES IN HOLDLIST. 00418995 NEXTSLOT = DISK ADDRESS OF FIRST HEADER IN QUEUE OF 00419000 EMPTY SLOTS IN DIRECTORY (NEXTSLOT QUEUE). 00419005 BYPASS.[CF] = LOWEST ADDRESS OF THE BYPASS DIRECTORY. 00419010 .[FF] = HIGHEST ADDRESS OF THE MAIN DIRECTORY. 00419015 ON SHAREDISK, HOLDER, NEXTSLOT AND BYPASS ARE KEPT IN THE FIRST 00419020 THREE WORDS OF THE DISK SEGMENT LOCATED AT DIRECTORYTOP+2. A 00419025 READ LOCK MUST BE DONE BEFORE ACCESSING THE HOLDLIST OR NEXTSLOT00419030 QUEUE OR EXPANDING EITHER THE MAIN OR BYPASS DIRECTORIES. 00419035 END COMMENT; 00419040 INTEGER RESTARTING; %PASSLEVEL CONTROL (RS) 00419100 $ SET OMIT = NOT(BREAKOUT) 00419104 DEFINE SCRAMBLE(SCRAMBLE1,SCRAMBLE2)=(-2| 00419110 ((SCRAMBLE1.[6:18]+SCRAMBLE1.[24:24]) MOD MODULUS|MODULUS+ 00419120 (SCRAMBLE2.[6:18]+SCRAMBLE2.[24:24]) MOD MODULUS) + 00419130 DISKBOTTOM)#, 00419140 MODULUS=13#, DIRMOD=169#; 00419150 COMMENT 00419210 THE RELATIONSHIP BETWEEN MODULUS AND DIRMOD IS: 00419220 DIRMOD := MODULUS | MODULUS, WHERE MODULUS IS A LOW 00419230 ODD PRIME. (THE RECOMMENDED VALUE OF MODULUS IS 13). 00419240 FOR SYSTEMS WITH ONLY 4 MEMORY MODS, MODULUS MUST BE 00419250 SET TO A SMALLER VALUE SO THAT DIRECTORYBUILDER WILL 00419260 NOT GET A NO-MEM, MAKING IT IMPOSSIBLE TO HALT/LOAD. 00419270 IT IS SUGGESTED THAT MODULUS BE SET TO 11, DIRMOD TO 121 00419280 FOR A SYSTEM WITH 4 MODS. IT MAY BE NECESSARY TO SET IT 00419290 SMALLER, DEPENDING UPON DISK CONFIGURATION; 00419300 ARRAY FS[*,*]; ARRAY FSROW=FS[*]; 00419400 ARRAY USERDISK[*]; 00419900 $ SET OMIT = NOT DEBUGGING %763-00419999 $ SET OMIT = SHAREDISK 00421099 DEFINE LOCKDIRECTORY = 00421100 BEGIN IF NOT DIRECTORYTOG THEN SLEEP([TOGLE].DIRECTORYMASK);00421200 LOCKTOG(DIRECTORYMASK); 00421300 END#, 00421400 UNLOCKDIRECTORY = 00421500 BEGIN 00421600 UNLOCKTOG(DIRECTORYMASK); 00421700 END#; 00421800 $ POP OMIT 00421801 BOOLEAN OKSEGZEROWRITE; %20A-00422100 $ SET OMIT = NOT SHAREDISK 00422490 REAL LOGFREE,IOMASK,SAVEWORD; 00425000 REAL CORE; 00426000 COMMENT 00426100 CORE.[4:14] = MULTIPROCESSING FACTOR (|100) 00426200 CORE.[18:15] = SUM OF CORE ESTIMATES FOR ALL JOBS 00426300 NOW ACTIVE IN THE MIX (DIV 64) 00426400 CORE.[33:15] = ACMOUNT OF CORE MEMORY INITIALLY AVAILABLE FOR 00426500 PROCESSING NORMAL STATE JOBS (DIV 64) 00426600 PROCEDURE SELECTRUN(F); VALUE F; REAL F; FORWARD; 00426700 DEFINE SELECTION = INDEPENDENTRUNNER(P(.SELECTRUN),0,160)#; 00426800 PROCEDURE CONTROLCARD(A);VALUE A;REAL A; FORWARD;% 00427000 REAL PROCEDURE DIRECTORYSEARCH(A,B,C);VALUE A,B,C;% 00428000 REAL A,B,C; FORWARD;% 00429000 DEFINE HEADERUNLOCK=HU#, 00430000 HU(HU1,HU2,HU3)= 00430100 P(MKS,HU3,HU1,HU2,9,DIRECTORYSEARC,DEL)#; 00430200 REAL DIRECTORYSEARC=DIRECTORYSEARCH; 00430225 %%HEADERUNLOCK CAN BE USED TO WRITE IN THE DIRECTORY A CHANGED 00430250 %% HEADER, TURN OFF THE INTERLOCK BIT AND DO THE FORGETSPACE 00430275 %% IT MAY BE CALLED ONLY AFTER A DIRECTORYSEARCH(A,B,4) 00430300 %% THE PARAMETERS PASSED MUST BE (A,B,DS): 00430400 %% WHERE A,B ARE THE SAME AS PASSED TO THE DIRECTORYSEARCH 00430500 %% AND DS IS THE RESULT OF THAT DIRECTORYSEARCH 00430600 REAL OLDIDLETIME; 00430900 PROCEDURE ARTN(A,N); VALUE A,N; ARRAY A[*]; INTEGER N; FORWARD;% 00431000 SAVE PROCEDURE DISKIO(L,C,S,D); VALUE C,S,D; REAL L; INTEGER C,S,D;% 00432000 FORWARD;% 00433000 ARRAY MESSAGETABLE[*]; 00435000 DEFINE MESSAGETABLESIZE = 5#; % NUMBER OF MESSAGETABLE ENTRIES 00436000 DEFINE 00437000 OPTIONSZ = (MESSAGETABLE[0].[8:10])#, 00438000 TERMSGSZ = (MESSAGETABLE[1].[8:10])#, 00439000 KEYMSGSZ = (MESSAGETABLE[2].[8:10])#, 00440000 CCTABLSZ = (MESSAGETABLE[3].[8:10])#, 00441000 $ SET OMIT = PACKETS 00449999 $ SET OMIT = NOT(PACKETS) 00451499 DEFINE 00451500 SPOUT(SPOUT1)=SPOUTER(SPOUT1,0,1)#, 00451600 SPOUTIT(SPOUTIT1.SPOUTIT2)=SPOUTER(SPOUTIT1,0,SPOUTIT2)#; 00451700 PROCEDURE SPOUTER(MESSAGE,UNITNO,TYPE); 00451800 VALUE MESSAGE,UNITNO,TYPE; 00451900 REAL MESSAGE,UNITNO,TYP; 00452000 FORWARD; 00452100 DEFINE 00452200 FILEMESS=FMS#, 00452300 FMS(FMS1,FMS2,FMS3,FMS4,FMS5,FMS6,FMS7)= 00452400 FILEMESSAGE(FMS1,FMS2,FMS3,FMS4,FMS5,FMS6,FMS7,1)#; 00452500 PROCEDURE FILEMESSAGE(1,K,M,F,R,D,C,TYPE); 00452600 VALUE I,K,M,F,R,D,C,TYPE; 00452700 REAL I,K,M,F,R,D,C,TYPE; 00452800 FORWARD; 00452900 $ POP OMIT 00452901 PROCEDURE LBMESS(FN,SN,I1,I2,F,UNITNO,X); 00454000 VALUE FN,SN,I1,I2,F,UNITNO,X; 00454100 REAL FN,SN,I1,I2,E,UNITNO,X; 00454200 FORWARD; 00454300 PROCEDURE TERMINATE(MIX); VALUE MIX; REAL MIX; FORWARD; 00463100 SAVE PROCEDURE TERMNALMESSAGE(N); VALUE N; REAL N; FORWARD; 00463200 BOOLEAN PROCEDURE SYSTEMFILE(A,B);VALUE A,B; REAL A,B; FORWARD; 00463300 PROCEDURE ENTERSYSFILE(N); VALUE N; REAL N; FORWARD; 00464000 PROCEDURE COM5; FORWARD;% 00469000 $ SET OMIT = NOT(STATISTICS) 00469099 PROCEDURE ASR; FORWARD;% 00474000 PROCEDURE COM11; FORWARD;% 00475000 PROCEDURE COM13; FORWARD;% 00476000 PROCEDURE COMMUNICATE0; FORWARD; 00478000 PROCEDURE COMMUNICATE1; FORWARD; 00478500 PROCEDURE LIBRARYZERO; FORWARD; 00479500 PROCEDURE LIBRARYCOPY; FORWARD; 00480000 PROCEDURE FORMTIME(W,T); VALUE W,T; REAL W,T; FORWARD; 00480010 $ SET OMIT = NOT(DUMP OR DEBUGGING) 00480099 PROCEDURE DUMPCORE(B); VALUE B; REAL B; FORWARD; 00480199 $ POP OMIT 00480200 PROCEDURE COM19; FORWARD;% 00483000 PROCEDURE COM23; FORWARD;% 00487000 PROCEDURE INTRINSICTAABLEBUILDER(FH); 00489000 VALUE FH; REAL FH; FORWARD; 00490000 PROCEDURE MESSAGETABLEBUILDER; FORWARD; 00491000 $ SET OMIT = AUXMEM 00492000 DEFINE INVLDAUXIO = 11#, 00492100 LQOVFLOW = 13#, 00492200 $ SET OMIT = NOT (AUXMEM AND SHAREDISK) 00492300 ARRAY PUNTER[*]; 00493000 DEFINE PUNTSIZE = 11 00493100 $ SET OMIT = NOT SHAREDISK 00493200 + 2 % INVLD AUXMEM IO 00493320 $ SET OMIT = NOT AUTODUMP 00493400 + 19 % DUMP CARD 00493500 $ POP OMIT OMIT OMIT 00493600 #; 00493700 $ SET OMIT = NOT AUTODUMP 00644000 $ SET OMIT = NOT (SHAREDISK EQV AUXMEM) OR OMIT 00644100 DEFINE DUMPCRD = 13#, 00644200 DUMPADR = 26#; 00644300 $ POP OMIT 00644350 $ SET OMIT = (SHAREDISK OR NOT AUXMEM) OR OMIT 00644400 $ SET OMIT = NOT SHAREDISK OR AUXMEM OR OMIT 00644750 COMMENT THIS IS THE CODE ON THE DUMP CARD (ALL NUMBERS ARE OCTAL):00645000 :20: 20,20,NOP,NOP TELLS ANALYZER ALL I/O RES ARE OK00645010 :21: STD,5,BFW BRANCH TO 23 00645020 :22: INI,0,LFU TIMER - LOOP UNTIL INTERRUPTED 00645030 :23: 10,LOD,21,STD SAVE M[8], RESTORED BY 2ND CARD 00645040 :24: 25,IIO,2,LBU START I/O THEN WAIT AT TIMER 00645050 :25: 0140000007700035 I/O DESC FOR 77 SEG WRITE FROM 3500645060 :26: 0140000047400157 I/O DESC FOR 74 SEG READ OF CODE 00645070 :27: OPDC 14,DIA 26,10,BFW I/O 1 - PICK UP RES DESC. 00645080 :30: OPDC 15,DIA 26,6,BFW I/O 2 - DIAL TO ERR FIELD. 00645090 :31: OPDC 16,DIA 26,2,BFW I/O 3 - BRANCH INTO I/O 4 00645100 :32: OPDC 17,DIA 26, I/O 4 00645110 DESC 24,CBD 7 BRANCH TO 24 FOR RETRY IF ERRORS 00645120 :33: DESC 37,BFW GO TO 37 1ST TIME, SEE 41 FOR 2ND00645130 :34: INI,0,LFU DATACOM - LOOP UNTIL INTERRUPTED 00645140 :35: 0000000000000501 DISK ADDRESS FOR WRITE 00645150 :36: INI,0,LFU FREEADDRESS - LOOP ON INTERRUPT 00645160 :37: 200,157,SND,240 STORE DISK ADDR FOR READ. SET 24000645170 TO OPERAND FOR DESC AT 41 00645180 :40: STD,OPDC 26,25,STD PUT I/O DESC INTO 25 00645190 :41: DESC 240,37,STD,NOP SET 37 FOR BRANCH TO 240 FROM 33 00645200 :42: 16,LBU BRANCH TO 24 TO START THE READ; 00645210 $ POP OMIT 00645900 SAVE PROCEDURE RESULT; 00646900 BEGIN 00647000 GO TO P([18]); % TIMER IS A LOOP ON INTERRUPTS 00648000 END; 00649000 00649999 SAVE PROCEDURE PUNT(I); VALUE I; REAL I; 00650000 BEGIN REAL T=-3; 00650250 REAL TMB, RSLT=RESULT; 00650500 LABEL HA,HB; 00650750 I:=IF I=0 THEN T ELSE PUNTER INX I; 00651000 STREAM(Q:=P(0,RDF): I, 00651800 A:=18, D:=I:=PUNTER INX 0); 00652000 BEGIN DS:= 16 LIT"-SYSTEM HANG, F="); %104-00652400 SI:=LOC Q; SI:=SI+3; 00652600 5(DS:=3 RESET; 00652800 3(IF SB THEN DS:=SET ELSE DS:=RESET; SKIP SB)); 00653000 DSD:=2 LIT": "; SI:=1; 00653200 63(IF SC!"~" THEN DS:=CHR); DS:=LIT"~"; 00653400 DI:=A; DS:=8 LIT"29290+JI"; % INI,INI,4,BBW 00653600 SI:=A; DS:=44 WDS; 00653800 DI:=A; DI:=DI+8; % IOBUSY- 00654000 DS:=4 LIT"002("; % 0,RTN 00654200 DI:=DI+28; % IOCOMPLETE-LOD R,RTN 00654400 DS:=32 LIT"0 +A+:2(OU+A+:2(0Y+A+:2(0!+A+:2("; 00654600 END; 00654800 P(HP2); 00655000 HA: TMB:=I&60[3:42:6]; 00655200 P([TMB],IIO); 00655400 HB: DO IF (TMB:=P(MKS,RSLT)) = 0 THEN % IO BUSY 00655600 BEGIN P(MKS,RSLT,DEL); GO HA END 00655800 UNTIL TMB.[3:6]=60; 00656000 IF TMB.[CF]120)THEN GO TO EXIT ELSE GO TO TIP; 01260465 ERROR: P(WAITIO(@4200000000,@377,U),DEL); 01260500 STREAM(T:=TINU[U],ULAB); 01260600 BEGIN SI:=LOC T; SI:=SI+5; 01260700 DS:=LIT "#"; DS:=3 CHR; 01260800 DS:=22 LIT " INVALID USASI. RW/L~"; 01260900 END; 01261000 SPOUT(ULAB.[CF]); LABELTABLE[U]:=@314;; 01261100 TYPE~0; PTN~0; 01261150 ETIP: IF((TWO(U) AND P(RRR)) !0) THEN 01261160 GO TO BAD ELSE SLEEP([CLOCK], NOT CLOCK); 01261170 PTN:=PTN+1; 01261180 IF(PTN>120) THEN GO TO BAD ELSE GO TO ETIP; 01261200 EXIT: MOVE(10,ULAB.[CF],AREA.[CF]); 01261300 FORGETSPACE(ULAB.[CF]); 01261400 BAD: 01261450 END USASITAPE; %RHR 01261500 SAVE PROCEDURE SNOOZE(NEWPRI,ADDRESS,MASK); 02000000 VALUE NEWPRI, ADDRESS, MASK; 02001000 REAL NEWPRI; 02002000 NAME ADDRESS; 02002500 ARRAY MASK[*]; 02003000 BEGIN 02004000 REAL TRYHERE=NT1; 02004500 $ SET OMIT = NOT(NEWLOGGING) 02004599 LABEL BEDENTER; 02004900 IF (JOBNUM:=JOBNUM+2) GEQ JOBNUMAX THEN PUNT(9); 02005000 PRYOR[P1MIX].[FF]~ NEWPRI~ NEWPRI+1; 02006000 FOR TRYHERE~JOBNUM STEP -2 UNTIL 2 DO 02007100 BEGIN 02007200 IF PRYOR[(BED[TRYHERE]~BED[TRYHERE-2]).[3:5]].[FF] 02007300 < NEWPRI THEN GO TO BEDENTER; 02007400 BED[TRYHERE+1] ~ BED[TRYHERE-1]; 02007500 END; 02007600 BEDENTER: 02008000 BED[TRYHERE] ~ P(ADDRESS & P1MIX[3:43:5], RDF); 02008100 BED[TRYHERE+1] ~ MASK; 02008200 STOPLOG(P1MIX,1); 02008300 GO TO NOTHINGTODO; 02008400 END SLEEP; 02009000 SAVE PROCEDURE INDEPENDENTRUNNER(ROUTINE,PARAMETER,SSZ); 02012000 VALUE ROUTNE,PARAMETER,SSZ; 02013000 ARRAY PARAMETER[*]; 02014000 REAL ROUTINE,SSZ; 02015000 BEGIN LSLATE:= LSLATE+2 AND SLATEEND;% 02016000 IF NSLATE=LSLATE THEN PUNT(7); 02017000 SLATE[LSLATE] ~ PARAMETER;% 02018000 SLATE[LSLATE+1]:=ROUTINE&SSZ[CTF]; 02019000 END; 02020000 REAL KEYBOARDCOUNTER; 02020500 REAL PROCEDURE KEYIN(B); VALUE B; BOOLEAN B; FORWARD;% 02021000 $ SET OMIT = NOT(DCSPO AND DATACOM ) 02021099 BOOLEAN PROCEDURE WHYSLEEP(MASK); VALUE MASK; REAL MASK; FORWARD;% 02022000 LABEL P1PROCESS,P2PROCESS;% 02023000 REAL ONEOHONE = @101,ONEOHTWO = @102;% 02024000 SAVE PROCEDURE RUN(MIX); VALUE MIX; REAL MIX; 02025000 BEGIN P1MIX ~ MIX;% 02026000 $ SET OMIT = NEWLOGGING 02026999 STARTLOG(MIX); 02027000 $ POP OMIT 02027001 STACKUSE ~ TRUE;% 02028000 GO TO EXTERNAL;% 02029000 END;% 02030000 REAL NUMESS;% 02031000 SAVE PROCEDURE SAVEMIX(MIX); VALUE MIX; REAL MIX;% 02032000 BEGIN INDEPENDENTRUNNER(P(.RUN),MIX,0); 02033000 $ SET OMIT = NEWLOGGING 02033999 STOPLOG(MIX,0); 02034000 $ POP OMIT 02034001 END;% 02035000 SAVE PROCEDURE HALT;% 02036000 BEGIN NOPROCESSTOG ~ NOPROCESSTOG+1;% 02037000 IF P2MIX > 0 THEN% 02038000 BEGIN P(HP2);% 02039000 $ SET OMIT = NOT(NEWLOGGING) 02039099 SNOOZE(-1,1,1); 02040000 IF P2MIX > 0 THEN% 02041000 BEGIN SAVEMIX(P2MIX);% 02042000 P2MIX~0; TOGLE~TOGLE AND NOT HP2MASK; 02043000 END;% 02044000 END;% 02045000 END;% 02046000 SAVE PROCEDURE KILL(A); VALUE A; ARRAY A[*];% 02047000 BEGIN P(64,STS);% 02048000 FORGETSPACE(A);% 02049000 GO TO NOTHINGTODO;% 02050000 END;% 02051000 REAL PBCOUNT; 02052200 BOOLEAN PROCEDURE OLAY(LOC); VALUE LOC; REAL LOC; FORWARD; 02052500 PROCEDURE SEEKNAME(A,B,C,D,E,N,XLST); VALUE A,B; 02052700 REAL A,B,C,D,E,N; ARRAY XLST[*]; FORWARD; 02052800 PROCEDURE UNHOOQUE(MIX);% 02053000 VALUE MMIX;% 02054000 INTEGER MIX;% 02055000 BEGIN% 02056000 REAL U,S,SN,T,X,I,PROCE;% 02057000 NAME OLDQ=X; 02057500 LABEL DOLP,DELINKIT; 02058000 FOR U~0 STEP 1 UNTIL 31 DO% 02059000 BEGIN% 02060000 IF(S~UNIT[U].[FF])!@77777 THEN 02061000 BEGIN% 02062000 WHILE (SN~LOCATQUE[S].[FF])!@77777 DO% 02063000 BEGIN IF (T~NFLAG(LOCATQUE[SN])).[3:5] =% 02064000 MIX THEN% 02065000 IF LOCATQUE[SN].[11:1] THEN S~SN ELSE 02065100 BEGIN% 02066000 LOCATQUE[S]~LOCATQUE[S]&T[FTF];% 02067000 RETURNIOSPACE(SN); 02068000 END ELSE% 02070000 S~SN;% 02071000 END% 02072000 END 02072100 END; 02072200 $ SET OMIT = NOT DFX; 02072490 DOLP: FOR U~0 STEP 1 UNTIL 31 DO% 02075000 BEGIN% 02076000 IF (S~(T~UNIT[U]).[FF])!@77777 THEN 02077000 BEGIN% 02078000 IF LOCATQUE[S].[3:5]=MIX THEN% 02079000 BEGIN% 02080000 IF (X~T.[13:5])=0 OR X=16 THEN 02081000 GO DELINKIT; 02082000 IF X=4 THEN% 02087000 BEGIN% 02088000 IF LOCATQUE[S].[FF]=@77777 THEN% 02089000 BEGIN% 02090000 I~FIRSTWAIT;% 02091000 WHILE WAITQUE[I]!U% 02092000 DO I ~ I+1 AND 32;% 02093000 WAITQUE[I]~% 02094000 WAITQUE[NEXTWAIT~NEXTWAIT% 02095000 +31 AND 31];% 02096000 UNIT[U]~T&@77777[13:28:20]; 02097000 END ELSE 02097200 DELINKIT: UNIT[U]:=T&LOCATQUE[S][FTF]; 02097400 $ SET OMIT = NOT DFX 02097590 RETURNIOSPACE(S); 02100000 END ELSE 02100400 PROCE~((U!23 AND U!24) OR X=3) 02101000 AND X!25 OR PROCE; 02101100 END% 02102000 END$ 02103000 END ;% 02104000 IF PROCE THEN% 02105000 BEGIN% 02106000 SLEEP([CLOCK],NOT CLOCK); PROCE~0; GO TO DOLP; 02107000 END;% 02108000 END UNHOOQUE;% 02109000 DEFINE PSF-3:4#, 02110050 TERMSET(TERMSET1)=(PRTROW[TERMSET1].[6:1]=1)#, 02110100 NOTERMSET(NOTERMSET1)=(PRTROW[NOTERMSET1].[6:1] NEQ 1)#, 02110200 TERMGOING(TERMGOING1)=(PRTROW[TERMGOING1].[PSF]=3)#, 02110250 BREAKSET(BREAKSET1)=(PRTROW[BREAKSET1].[PSF]=4)#, %139-02110260 STOPSET(STOPSET1)=(PRTROW[STOPSET1].[PSF]=2)#; 02110300 REAL PROCEDURE GETESPDISK;FORWARD;% 02111000 PROCEDURE CHANGEMCP(KTR); VALUE KTR; REAL KTR; FORWARD; 02111100 PROCEDURE CHANGEINTRINSICFILE(KTR); VALUE KTR; REAL KTR; FORWARD; 02111200 $ SET OMIT = NOT(DEBUGGING) 02111299 REAL PROCEDURE ANALYSIS; FORWARD; 02111400 PROCEDURE SHORTCOMMUNICATE; FORWARD; 02111500 PROCEDURE CONTINUITYBIT; FORWARD; 02111600 REAL CCTBLWORD; 02112000 DEFINE CCCOUNT = CCTBLWORD.[FF]#, 02112100 CCTBLADDR = CCTBLWORD.[CF]#; 02112200 REAL READERA,READERB; 02112500 $ SET OMIT = NOT(PACKETS) 02113079 ARRAY PSEUDO[*]; %PSEUDOMAX; 02113080 ARRAY PSEUDOMIX[*], NYLONZIPPER[*]; %MIXMAX 02113085 DEFINE PACKETPAGE[PACKETPAGE1]=PSEUDO[PACKETPAGE1].[22:26]#; 02113086 DEFINE PACKETREC[PACKETREC1]=PSEUDO[PACKETREC1].[18:3]#; 02113087 DEFINE PACKETPBD[PACKETPBD1]=PSEUDO[PACKETPBD1].[8:10]#; 02113088 DEFINE PACKETACT[PACKETACT1]=PSEUDO[PACKETACT1].[2:6]#; 02113089 DEFINE PACKETERR[PACKETERR1]=PSEUDO[PACKETERR1].[1:1]#; 02113090 DEFINE PAGESIZE=300#; % SAME AS PBDROWSZ AT 08699100 %732-02113091 DEFINE PAGEFULL=(PAGESIZE DIV 3)|5-40#; % ALLOW FOR 8 INFO RECORDS 02113092 $ POP OMIT 02113099 PROCEDURE MESSAGEWRITER;% 02114000 BEGIN REAL RWC=+0, MSCW=-2; 02115000 REAL T=+1;% 02116000 LABEL L;% 02117000 P(0); 02118000 $ SET OMIT = NOT(DCSPO AND DATACOM ) 02119009 $ SET OMIT = DCSPO 02119019 L: 02119020 $ POP OMIT 02119021 P(WAITIO(MESSAGEHOLDER INX 1,0,0,25)); 02120000 P(DEL);% 02121000 NUMESS ~ NUMESS-1;% 02122000 T ~ M[MESSAGEHOLDER].[18:15]; 02123000 FORGETSPACE(MESSAGEHOLDER INX 1); 02124500 IF T ! 0 THEN% 02125000 BEGIN MESSAGEHOLDER.[33:15] ~ T;% 02126000 GO TO L% 02127000 END;% 02128000 MESSAGEHOLDER ~ 0;% 02129000 KILL([MSCW]); 02130000 END;% 02131000 $ SET OMIT = NOT(DCSPO AND DATACOM ) 02131005 $ SET OMIT = PACKETS 02131999 $ SET OMIT = NOT(PACKETS) 02132299 PROCEDURE SPOUTER(MESSAGE,UNITNO,TYPE); 02132300 VALUE MESSAGE,UNITNO,TYPE; 02132400 REAL MESSAGE,UNITNO,TYPE; 02132500 $ POP OMIT 02132501 BEGIN REAL MKSCW=MESSAGE-1; 02133000 INTEGER MIX; 02133010 $ SET OMIT = NOT(DATACOM AND DCSPO ) 02133011 $ SET OMIT = (DATACOM AND DCSPO) %950-02133122 INTEGER LFT; %950-02133123 $ POP OMIT %950-02133124 $ SET OMIT = NOT(PACKETS) 02133129 DEFINE PACKETFREE=PSEUDO[UNITNO].[21:1]#, 02133130 PACKETMASK=#400000000#; 02133140 REAL PSD,PWS,X,Z,BB; 02133150 INTEGER NT1,R,S,T; ARRAY BUF[*]; 02133200 $ SET OMIT = NOT(DATACOM AND DCSPO) OR OMIT %203-02133279 R:=UNITNO.[CF]; UNITNO:=0; 02133300 IF R=0 THEN IF P1MIX!0 THEN R:=PSEUDOMIX[P1MIX]; 02133350 IF R>31 AND R<64 THEN UNITNO:=R; 02133380 $ POP OMIT 02133381 $ SET OMIT = NOT(DATACOM AND DCSPO) 02133499 MESSAGE ~ P(.MESSAGE,LOD).[33:15]-1;% 02134000 MIX ~ M[MESSAGE-1].[9:6]; 02134005 $ SET OMIT = NOT(DATACOM AND DCSPO ) 02134008 $ SET OMIT = NOT(PACKETS) 02134889 IF TYPE THEN 02134890 $ POP OMIT 02134891 $ SET OMIT = NOT(DATACOM AND DCSPO ) 02134899 BEGIN 02134906 IF MESSGEHOLDER = 0 THEN% 02135000 BEGIN MESSAGEHOLDER ~ MESSAGE;% 02136000 INDEPENDENTRUNNER(P(.MESSAGEWRITER),0,64); 02137000 END% 02138000 ELSE M[MESSAGEHOLDER.[18:15]].[18:15] ~ MESSAGE; 02139000 M[MESSAGE]~0&MIX[4:43:5]; 02140000 MESSAGEHOLDER.[18:15] ~ MESSAGE;% 02141000 END; 02141020 M[MESSAGE-1].[9:6] ~ 0;% 02142000 M[MESSAGE-1].[AREATYPEF] := SPOUTMSGAREAV;% %167-02142100 IF P(MKSCW.[33:15],DUP) = 0 THEN% 02143000 BEGIN ; 02143050 STREAM(N~9:X~MESSAGE+1); 02144500 BEGIN SI ~ X;% 02145000 L: IF SC ! "~" THEN% 02146000 BEGIN IF SC= " " THEN% 02147000 BB: BEGIN SI~ SI+1; 02148000 IF SC=" " THEN GO BB; 02149000 IF SC = ALPHA THEN% 02150000 BEGIN SI ~ SI-1;% 02151000 DS ~ CHR;% 02152000 END ELSE GO TO L;% 02154000 END;% 02155000 IF SC = @14 THEN% 02156000 BEGIN DS ~ CHR;% 02157000 Q: IF SC = @14 THEN% 02158000 BEGIN SI ~ SI+1;% 02159000 GO TO Q; 02160000 END;% 02162000 GO TO L;% 02163000 END;% 02164000 DS ~ CHR;% 02165000 GO TO L;% 02167000 END;% 02168000 DS ~ CHR;% 02169000 N ~ DI; 02171000 END;% 02172000 NT1~P;NT1~((NT1.[33:15]-(MESSAGE+1))|8+NT1.[30:3])|6; 02173000 END ELSE NT1 ~ P | 6; 02173050 $ SET OMIT = NOT(PACKETS) 02173069 IF UNITNO!0 THEN IF PACKETPAGE[UNITNO-32]>1 THEN 02173075 BEGIN UNITNO:=UNITNO-32; 02173080 IF NOT PACKETFREE THEN SLEEP([PSEUDO[UNITNO]],PACKETMASK);02173085 IF (PSD:=PACKETPAGE[UNITNO])>1 THEN 02173087 BEGIN % JUST TO BE SURE 02173088 PACKETFREE:=FALSE; 02173090 Z:=IF (PSW:=PACKETREC[UNITNO]) THEN 60 ELSE 30; 02173095 S:=((Y:=IF NT1>725 THEN 120 ELSE NT1 DIV 6)+7) DIV 8; 02173100 BUG:=[M[T:=SPACE(Z+S)]]&Z[8:38:10]; 02173110 M[BUF-2].[9:6]:=0; 02173120 STREAM(N:=S,AA:=MESSAGE+1,BUF:=BUF INX Z); 02173150 BEGIN SI:=AA; DS:=N WDS END; 02173160 DISKWAIT(-T,Z,PSD+PSW DIV 2); 02173210 R:=(PSW|18) MOD 30; 02173220 IF (BB:=BUF[R+17].[CF]) GEQ PAGEFULL THEN 02173230 BEGIN STREAM(BUF:=[BUF[R]]); 02173240 BEGIN DS:=12LIT" "; 02173245 DS:=28LIT"ALL FURTHER MESSAGES LOST "; 02173250 2(DI:=DI+48); DS:=6LIT":|5908"; 02173255 END; 02173260 PACKETPAGE[UNITNO]:=1; % TO MARK OVERFLOW 02173265 END 02173270 ELSE BEGIN P(@1540005000100000&(RB+1)[CTC]); % PBDSTOPPER 02173275 IF PSW=0 THEN 02173280 BEGIN P(BUF[29],XCH); 02173282 P([BUF[29]],STD); 02173284 DISKWAIT(T,30,PSD+5); 02173286 P([BUF[29]],STD); 02173288 END ELSE 02173290 P([BUF[R-1]],STD); 02173292 BUF[R+17]:=@1540000104000000&BB[CTC]& 02173294 (S+2+(M[BUF INX Z].[1:5]!">"))[8:38:10]; 02173296 FORMTIME([LFT],XCLOCK~P(RTR)); %154-02173297 STREAM(N:=S-1,CL:=S|8-Y,AA:=BUF INX Z,BB := LFT,%154-02173300 BUF:=[BUF[R]]); 02173301 BEGIN DS := 7 LIT " "; SI := LOC BB; DS := 8 CHR; 02173305 DS := 9 LIT " "; SI := AA; %154-02173306 IF SC!">" THEN DS:=8 CHR ELSE 02173310 BEGIN DI:=DI-8; 8(IF SC!">" THEN DS:=CHR ELSE 02173315 BEGIN DI:=DI+1; SI:=SI+1; END); 02173320 END; N(DS:= 8 CHR); DI:=DI-CL; AA:=DI; 02173325 SI:=AA; SI:=SI-1; 02173330 IF SC="~" THEN BEGIN DI:=DI-1; DS:=LIT" "; END; 02173335 CL(DS:=LIT" "); 02173340 END;END; 02173345 DISKWAIT(T,Z,PSD+PSW DIV 2); 02173350 IF PACKETPAGE[UNITNO]>1 THEN 02173360 IF PSW=0 THEN 02173362 BEGIN PACKETPAGE[UNITNO]:=PSD+3; 02173364 PACKETREC[UNITNO]:=4; 02173366 END ELSE 02173368 PACKETREC[UNITNO]:=PSW-1; 02173370 PACKETFREE:=TRUE; 02173375 FORGETSPACE(BUF); 02173380 END; % JUST TO BE SURE 02173383 END; 02173385 IF NOT TYPE THEN BEGIN FORGETSPACE(MESSAGE+1); P(XIT); 02173389 END; 02173390 $ POP OMIT 02173391 IOTIME[P1MIX] ~ *P(DUP)+NT1;% 02174000 $ SET OMIT = NOT(DCSPO AND DATACOM ) 02174005 $ SET OMIT = DCSPO 02175002 IF (NUMESS~ NUMESS+1)>0 THEN 02175003 $ POP OMIT 02175004 BEGIN 02175010 $ SET OMIT = NOT(DATACOM AND DCSPO ) 02175020 SLEEP([NUMESS],-0);% 02176000 END; 02176100 END;% 02177000 PROCEDURE ENDOFDECK(R,TUSTA);VALUE R,TUSTA; REAL R,TUSTA; FORWARD; 02177100 PROCEDURE PBIO(A,B); VALUE A; REAL A,B; FORWARD; 02178500 REAL TERMINALCLOCK; 02179000 PROCEDURE TERMINATE(MIX); VALUE MIX; REAL MIX;% 02180000 BEGIN IF MIX LEQ 0 THEN BYBY("MCP DS-ED~",10); 02181000 IF JARROW[MIX] NEQ 0 THEN 02182000 BEGIN 02183000 IF NOTERMSET(MIX) THEN 02184000 BEGIN 02185000 TERMINALCLOCK:=CLOCK+P(RTR); 02185900 PRTROW[MIX].[FF]:=MIX.[FF]; 02186000 PRTROW[MIX].[PSF]:=1; 02186050 END; 02186100 END; 02186300 END;% 02187000 REAL PROCEDURE PLACEFINDER(S, A, L); 02187100 VALUE S, A; 02187200 REAL S, A, L; 02187300 FORWARD; 02187400 ARRAY CIDROW[*],CIDTABLE=CIDROW[*,*]; 02187500 PROCEDURE TERMINALMESSAGA(N); VALUE N; REAL N; 02188000 BEGIN LABEL FOUND,DOIT,OWT,TOIT; 02189000 REAL A,T,S,ADR;% 02190000 NAME B;% 02191000 ARRAY FIB[*]; 02191500 REAL BLEN,NBUF; 02191600 REAL MIXER,TOPIO,LUN,L;% 02192000 INTEGER I=S; LABEL QZ;% 02193000 LABEL STT;% 02194000 SUBROUTINE SLAPITOFF;% 02195000 IF LUN GEQ 32 THEN 02195100 $ SET OMIT = PACKETS 02195199 ELSE 02195300 BEGIN SLEEP([TOGGLE],STATUSMASK); 02196000 READY ~ NOT (I ~ TWO(LUN)) AND READY;% 02197000 RRRMECH ~ NOT I AND RRRMECH OR I AND SAVEWORD;% 02198000 LABELTABLE[LUN] ~ @114;% 02199000 MULTITABLE[LUN] ~ RDCTABLE[LUN] ~ 0;% 02200000 END;% 02201000 LABEL LB,LBI;% 02202000 $ SET OMIT = NOT(NEWLOGGING) 02202049 NOMEM:=NOMEM-TAR[P1MIX].[20:1]; %IF THIS JOB HAD A NOMEM 02202100 TAR[P1MIX].[20:1]:=0; %CONDITION - CLEAR IT 02202200 UNLOCKTOG(TAR[P1MIX]); 02202500 REPLY[P1MIX]~0;% 02203000 PRTROW[P1MIX].[PSF]:=3; % IN PROCESS OF DSING 02205000 PRYOR[P1MIX]~-1; 02205100 A ~ IF N < 0 THEN ABS(N) ELSE SPACE(10);% 02206000 IF N=32 THEN JAR[P1MIX,6].[1;1]~1; % MEM PAR %949-02206100 B ~ PRT[P1MIX,4];% 02207000 IF P(M[L~PRT[P1MIX,8].[CF]],TOP,XCH,DEL)THEN %TR02208000 S~ADR~0 ELSE %TR02209000 DO BEGIN IF P(M[L],TOP,XCH,0,INX,.ADR,~) THEN% OVERLAID RCWTR02210000 BEGIN IF NOT M[L].[33:1] THEN%NOT TYPE 13 INT 02211000 BEGIN S~ADR; %SEGNO IN RCW 02211010 T~0;ADR~M[M[L].MOM].[CF]; % AND THE MSCW %TR02212000 END ELSE S~-1; 02212100 END ELSE % ITS PRESENT: WDVE GOT TO WORK %TR02213000 BEGIN T~0; 02214000 WHILE (S:=M[T].[CF]) LSS ADR DO 02215000 IF S>T THEN T:=S ELSE PUNT(3); 02215500 S~IF M[T].[AREATYPEF]=CODEAREV THEN% %167-02216000 M[T+1].[CF] ELSE 0;% %167-02216010 T~T+2; END; %TR02216100 IF PRT[P1MIX,8].[CF]!L OR M[L-1].MSFF%STACK IS MARKED02216200 THEN DO L~M[L].MOM UNTIL NOT M[L].MSFF;%GET LAST MSCW02216300 L~M[L].MOM;%POINT L TO NEXT RCW,JUST IN CASE. %TR02216400 END UNTIL (IF S!0 THEN IF S=(-1) THEN 0 ELSE 02216500 (B[0]"0" THEN JUMP OUT; 02251060 TALY~TALY+1; SI~SI+1); DI~A; 02251070 T~TALLY; DS~8 CHR; DI~DI-T; 02251080 T(DS~LIT " "); DI~DI-T; A~DI); 02251090 TOG(SI~LOC DSZE; DI~LOC Q; DS~4 DEC; 02251100 DI~A; DS~5 LIT " GEQ "; SI~LOC Q; 02251110 TALLY~0; 3(IF SC>"0" THEN JUMP OUT); 02251120 TALLY~TALLY+1; SI~SI+1); 02251130 T~TALLY; DS~4 CHR; DI~DI-T; 02251140 T(DS~LIT " "); DI~DI-T; A~DI); 02251150 DI ~ A; DS ~ LIT "~";% 02252000 END;% 02253000 IF N!0 THEN FORGETSPACE(B); 02253050 S~A; 02254000 STREAM(B~S,A~A~SPACE(17));% 02255000 BEGIN 17(DS~8 LIT"#"); SI~B;DI~A;DI~DI+8;DS~2 LIT" ";% 02255100 17(8(IF SC!"~" THEN DS~CHR ELSE JUMP OUT 2 TO L1)) ; 02255200 L1: DS~2 LIT" ";% 02255500 END;% 02256000 SPOUT(S); 02256500 IF NOT TERMGO THEN BEGIN HALT;% 02257000 COMPLEXSLEEP(-100=NUMESS);% 02258000 DO UNTIL KEYIN(0)=1; 02258100 NOPROCESSTOG ~ NOPROCESSTOG-1; END;% 02258200 JAR[P1MIX,1] ~-JAR[P1MIX,1];% 02259000 UNHOOQUE(P1MIX);% 02260000 MIXER~ @300+P1MIX;% 02261000 IF N=35 THEN % ES-ED 02261050 IF JAR[P1MIX,9].SYSJOBF = PRNPBTCODE THEN 02261100 IF (L:=PRT[P1MIX,@25]) !0 THEN 02261200 BEGIN %675-02261250 IF (LUN~L.[41:5])<16 THEN SLAPITOFF; %675-02261300 LUN~L.[46:2]+19; % LPA, LPB, OR CPA %675-02261350 SLAPITOFF; %675-02261400 END; % PRNPBT/DISK ES-ED: TO CLEAR UNITS. 02261750 STT: T~MSTART;% 02262000 WHILE(L~T.[CF])!0 DO% 02263000 IF (T~M[L]).[3:12]=MIXER AND T>0% 02264000 THEN% 02265000 BEGIN LUN ~ (TOPIO ~ NFLAG(M[L+2])).[12:6]; 02266000 IF LUN }32 THEN 02266100 BEGIN 02266200 FILECLOSE(TOP10 INX 0); 02266300 GO TO STT; 02266400 END; 02266500 IF UNIT[LUN].[13:5] = @20 02267000 THEN BEGIN% 02268000 QZ:% 02269000 SLAPITOFF; 02270000 UNIT[LUN].[13:5]:=@20;% MARK IT NOT READY ANYWAYS 02270500 FORGETSPACE(L INX 2);% 02271000 GO TO STT;% 02272000 END ELSE 02273000 BEGIN T ~ 0; 02274000 FIB ~ M[TOPIO INX NOT 2]; 02275000 ADR ~ NBUF ~ FIB[13].[1:9]-1; 02275100 IF P(M[TOPIO].[3:5],DUP)=22 OR P(XCH)=26 THEN 02275150 BEGIN FOR S ~ 1 STEP 1 UNTIL ADR DO 02275200 TOIT: IF NOT M[TOPIO INX S].[19:1] THEN 02275250 DOIT: IF LUN{18 THEN 02275300 BEGIN M[TOPIO INX S].[20:1] ~ 0; 02275350 M[M[TOPIO INX S] INX 17] ~ M[TOPIO INX S]02275400 & FIB[5] [FTC]; 02275450 FIB[5] ~ P(DUP,LOD,0,1,CFX,+); 02275500 IF NOT PRTROW[P1MIX].[17:1] THEN 02275550 IF FIB[14].[CF]=FIB[14].[FF] THEN 02275600 BEGIN PBIO(TOPIO INX S,FIB[14]); 02275650 SLEEP([M[TOPIO INX S]],IOMASK);02275700 END ELSE 02275750 BEGIN STREAM(C~M[TOPIO INX S], 02275800 Z~FIB[14].[FF]); 02275850 BEGIN SI ~ C; DS ~ 18 WDS; END;02275900 FIB[14].[FF] ~ P(DUP).[FF]-18; 02275950 END; 02276000 END ELSE 02276050 BEGIN IF WAITIO(M[TOPIO INX S],@357,LUN).[45:1]02276100 THEN GO OWT; 02276150 FIB[6] ~ *P(DUP)+1; 02276200 END; 02276250 IF ADR<0 THEN 02276260 BEGIN IF ADR THEN F[17] ~ BLEN; GO OWT; 02276270 END; 02276280 S ~ 0; 02276290 IF FIB[17] < (BLEN~FIB[18].[3:15]) THEN 02276300 BEGIN IF NOT FIB[13] THEN 02276350 FIB[17] ~ *P(DUP)-(FIB[5].[46:2]=3); 02276360 M[TOPIO] ~ FLAG(FIB[16]); 02276370 STREAM(N~FIB[17],D~M[TOPIO].[CF]); 02276400 BEGIN N(DS ~ 8 LIT " "); END; 02276450 ADR ~ -1; GO DOIT; 02276500 END ELSE ADR ~ -2; 02276550 GO TOIT; 02276600 END ELSE 02276700 OWT: FOR NT1 ~ 0 STEP 1 UNTIL NBUF DO 02276750 M[TOPIO INX N[1] ! *P(DUP) OR IOMASK;% 02277000 IF LUN{22 AND LUN}20 OR (LUN{18 AND % LP OR CP BK-UP 02278000 (P(M[TOPIO].[3:5],DUP)=22 OR P(XCH)=10)) 02278100 THEN 02278500 BEGIN IF LUN { 18 THEN % UNIT IS BACKUP 02279000 BEGIN S~17;% 02280000 STREAM(A,D~L+4); 02281000 BEGIN SI~A; DS~17 WDS END;% 02282000 NT4~M[TOPIO INX NOT 2] INX 0;% 02283000 NT1~M[NT4+14];% 02284000 NT2~NT1.[FF]; NT1~NT1.[CF];% 02285000 IF M[TOPIO].[3:5]=22 THEN % NOT CP BK-UP 02285100 IF NT1=NT2-72 THEN% 02286000 BEGIN NT1~M[NT4+5].[FF];% 02287000 M[NT4+5].[FF]~NT1+1;% 02287100 M[NT2+17]~ @154000400200000 &NT1[CTC];% 02287110 M[NT4+14].[FF]~NT2-18;% 02287120 END ELSE% 02287130 IF M[NT2+35].[27:6]=0 THEN M[NT2+35].[28:1]~1; 02287140 FIB[17] ~ -1; 02287200 M[TOPIO] ~ FLAG(FIB[16]&0[20:47:1]&S[8:38:10]); 02287210 END ELSE % 02287230 BEGIN T~(A INX @540000000000000)&17[8:38:10]; %150-02287240 IF SEPARATE THEN T~T&(LUN!22)[32:47:1] %150-02287245 ELSE T~T&(LUN!22)[28:47:1]; 02287250 IF LUN!22 THEN %IF PUNCH FILE, IGNORE 02287254 IF WAITIO(@4002000000,@357,LUN).[45:1] THEN TO QZ; 02287255 T~WAITIO(T,@357,LUN);% 02287260 IF T.[45:1] THEN TO GO QZ;% 02287270 END; 02287280 END ELSE% 02290000 IF LUN=23 OR LUN=24 THEN% 02291000 BEGIN ADR~L+4;% 02292000 LB: IF(T~UNIT[LUN]).[13:5]=25 THEN% 02293000 BEGIN ADR ~ IOQUE[S~T.[FF]].[33:15];% 02294000 STREAM (A~"END":ADR); BEGIN SI ~ ADR;% 02295000 L:SI ~ SI +1; IF SC = " " THEN TO TO L;% 02296000 $ SET OMIT = PACKETS 02296999 $ SET OMIT = NOT(PACKETS) 02297009 DI:=LOC A;DI:=DI+5; IF 3SC=DC THEN TALLY:=0 ELSE 02297010 BEGIN DI~LOC A; DS~4 LIT "PACK"; DI~LOC A; 02297100 SI~SI-3; IF 4SC=DC THEN TALLY~0 ELSE 02297200 TALLY:=1 END; A:= 02297300 $ POP OMIT 02297301 TALLY END; IF P THEN BEGIN% 02298000 RETURNIOSPACE(S); 02300000 UNIT[LUN]~@7777777777% 02301000 END 02302000 ELSE BEGIN M[TOPIO]~M[TOPIO]OR@2004000000; T~0;% 02303000 M[M[TOPIO]]~"END. "&@14[1:43:5]; END;% 02304000 END; 02305000 IF T!0 THEN% 02306000 BEGIN% 02307000 LBI:T~WAITIO(@40000000+ADR,@367,LUN);% 02308000 IF T.[45:1] THEN GO TO QZ;% 02309000 IF T.[42:1] THEN GO TO LB ELSE% 02310000 GO TO LBI% 02311000 END END;% 02312000 IF T=0 THEN 02313000 IF FIB[5].[42:1] 02313500 THEN FORGETSPACE(L INX 2) 02313600 ELSE FILECLOSE(TOPIO INX 0); 02314000 GO TO SIT 02315000 END; END; 02316000 FORGETSPACE(A);% 02317000 T~MSTART;MIXER~@400+P1MIX;% 02318000 WHILE(L~T.[CF])!0 DO% 02319000 IF(T~M[L]).[3:12]=MIXER AND T>0 THEN% 02320000 IF M[M[L+4].[CF]+5].[41:1] THEN FILECLOSE(L+7); 02321000 T~MSART;MIXER~@600+P1MIX;% 02322000 WHILE(L~T.[CF])!0 DO% 02323000 IF(T~M[L]).[3:12]=MIXER AND T>0 THEN% 02324000 IF M[L+7].[41:1] THEN FILECLOSE(M[L+1] INX 3);% 02325000 FOR LUN ~ 0 STEP 1 UNTIL 31 DO% 02326000 IF RDCTABLE[LUN].[6:6] = P1MIX THEN% 02327000 SLAPITOFF;% 02328000 PRT[P1MIX,8]:=T:=NFO[(P1MIX-1)|NDX+2]INX 2; 02328100 M[T]:=-FLAG(0);M[T-1]:=-FLAG(0&(PRT)[6:33:9]); 02328200 P(.COM5); GO TO DIFFCOM; 02329000 END;% 02330000 SAVE PROCEDURE TERMINALMESSAGE(N); VALUE N; REAL N; 02330100 BEGIN NT1 ~ N; 02330200 P(0,STF); 02330300 TERMINALMESSAGE(NT1); 02330400 END; 02330500 $ SET OMIT = NOT(DEBUGGING OR CHECKLINK) 02330599 ARRAY UNITCODE[*]; 02347100 INTEGER PSEUDOCOPY;% USED BY STARTADECK TO EXERCISE SOME CONTROL %541-02347110 % OVER THE NO. OF "COPIES" OF CONTROLCARD %541-02347120 % SERVICING PSEUDO-READERS. %541-02347130 BOOLEAN PROCEDURE READEMFROMDISK(H,IB); 02347150 VALUE H,IB; ARRAY H[*],IB[*]; FORWARD; 02347160 $ SET OMIT = NOT(PACKETS) 02347199 PROCEDURE DRAINO(UNIT,BUMP,ERROR); 02347200 VALUE UNIT,BUMP,ERROR; REAL UNIT; BOOLEAN BUMP,ERROR; 02347210 BEGIN REAL T; 02347220 LABEL NEXT; 02347222 UNIT~UNIT-32; 02347230 IF BUMP THEN 02347240 PACKETACK[UNIT]:=PACKETACT[UNIT]-1; 02347250 IF ERROR THEN PACKETERR[UNIT]:=TRUE; 02347260 IF PACKETACT[UNIT]=0 THEN 02347280 IF LABELTABLE[UNIT+32]}0 THEN 02347290 IF CIDTAABLE[UNIT,3] 0 THEN% 04071000 IF FIN.[25:1] THEN% 04072000 BEGIN T ~ FIN.[3:5];% 04073000 FIN ~ FIN&IOD[3:3:5]&0[25:25:1];% 04074000 GO TO CSW[T];% 04075000 END ELSE GO ON ELSE GO ON;% 04076000 C0: GO TO C0;% 04077000 C1: FIN.[8:10] ~ V;% 04078000 GO TO C2;% 04079000 C3: FIN.[8:10] ~ V;% 04080000 C4: FIN ~ NOT V INX 1 INX FIN;% 04081000 GO TO C5;% 04082000 C6: STREAM(A~0:IOD);% 04083000 BEGIN DI ~ LOC A; SI ~ IOD; SI ~ SI+4; DS~4 OCT END; 04084000 T ~ P DIV 8-1;% 04085000 OFF: FIN.[8:10] ~ T;% 04086000 GO TO C2;% 04087000 C7: STREAM(A~0:IOD);% 04088000 BEGIN DI ~ LOC A; SI ~ IOD; DS ~ 4 OCT END;% 04089000 T ~ P DIV 8-1;% 04090000 FIN ~ (NOT T INX 1 INX FIN)&T[8:38:10];% 04091000 GO TO C5;% 04092000 ON: IF U < 16 THEN% 04093000 IF IOD.[22:1] THEN% 04094000 C5: M[IOD INX 1] ~ M[NOT V INX IOD INX 1] ~ V% 04095000 ELSE% 04096000 C2: M[IOD INX NOT 0] ~ V;% 04097000 END;% 04098000 PROCEDURE PROGRAMRELEASE;% 04099000 BEGIN NAME T; REAL FSX=JUNK; 04100000 ARRAY R=-4[*];% 04101000 REAL IOD=NT1;% 04102000 ARRAY LOCN[*];% 04103000 REAL S; 04103050 CHECKSTACKSPACE;% %WF 04103100 LOCN~M[S~(IF(IOD~NFLAG(M[P(T~[M[PRT[P1MIX,9]]],DUP,PRL)])) 04104000 .[22:1] THEN 2 ELSE NOT 1) INX IOD); 04105000 IF IOD.[3:5]= 6 THEN 04105100 BEGIN; STREAM(S:=M[PRT[P1MIX,8]] INX P(DUP,0,XCH,DIA 10, 04105200 DIB 30,TRB 2),D~@600005); 04105300 BEGIN SI~S; DS~2 CHR END; 04105400 $ SET OMIT = NOT(STATISTICS) 04105409 IF JUNK.[36:12]!45 AND RELTOG 04105500 OR M[IOD].[3:6] = 0 AND M[IOD] LSS (DIRDSK | DSKTOG) THEN 04105510 IF (USERCODE[P1MIX] EQV MCP) ! NOT 0 THEN % 04105550 BEGIN TERMINATE(P1MIX); TERMINALMESSAGE(30) END; 04105600 IF(FS[P1MIX,(FSX~P(*(NOT 2 INX LOCN),4,COC).[13:11] 04105650 DIV 5).[40:4]] 04105700 AND TWO(IOD.[24:1]&FSX[43:44:4]))!0 THEN 04105750 BEGIN T[0]:=T[0]&1[19:47:1]&0[26:40:7]; 04105800 M[(*((NOT 2)INX LOCN))INX 5 ]:= NABS(*P(DUP)); 04105850 GO TO RETURN; 04105890 END; 04105900 IF NOT IOD.[24:1] THEN M[S].[11:1]~1; 04105950 END DISK BUSINESS; 04105990 IF IOD.[3:5]=30 THEN GO RETURN; % SPO %846-04105998 IOREQUEST(R,IOD,LOCN);% 04106000 T[0].[19:1] ~ 0; 04107000 IF (NT1~P(*(NOT 2 INX LOCN),13,COC).[10:9]-1)!0 THEN% 04108000 STREAM(NT1,C~T[0],T); 04109000 BEGIN SI ~ T; SI ~ SI+8; DS ~ NT1 WDS;% 04110000 SI ~ LOC C; DS ~ WDS;% 04111000 END;% 04112000 GO TO RETURN;% 04113000 END;% 04114000 SAVE PROCEDURE NEWIO;% 04115000 BEGIN REAL S=NT3,U=NT4;% 04116000 S ~ UNIT[U~WAITQUE[FIRSTWAIT]].[18:15];% 04117000 INITIATEIO(IOQUE[S],LOCATQUE[S].[3:5],U);% 04118000 FIRSTWAIT ~ FIRSTWAIT+1 AND 31;% 04119000 UNIT[U].[13:5] ~ 3;% 04120000 END;% 04121000 REAL MDELTA = @11;% 04121050 REAL MLOG = @12;% 04121100 REAL MROW = @13;% 04121150 REAL LOGSIZE = @43;% 04121170 REAL LOGHOLDER = @56;% 04121200 REAL NUMAINTMESS = @57;% 04121250 REAL LOGENTRY = @63;% 04121300 REAL NXDISK = @76;% 04121350 ARRAY MAINTLOGARRAY = @77[*];% 04121400 PROCEDURE DISKORAUXERROR(R); VALUE R; REAL R; FORWARD; 04121410 PROCEDURE ACTUALIOERR(R); VALUE R; REAL R; FORWARD; 04121425 PROCEDURE LINKUP(TYPE,KEY); VALUE TYPE,KEY; REAL TYPE,KEY; FORWARD;% 04121450 PROCEDURE CHECKJOBORFILEMESS(MIX,FIB,U);% 04121500 VALUE MIX,FIB,U; REAL MIX,FIB,U; FORWARD;% 04121550 PROCEDURE LOGOUTMAINT(B); VALUE B; REAL B; FORWARD;% 04121600 PROCEDURE MAINTLOGGER(B); VALUE B; REAL B; FORWARD;% 04121650 DEFINE 04121700 LOGVERSION=( % VERSION NUMBER ON NEXT CARD 04121710 2 04121720 & % CURRENT ENTRIES ON NEXT CARD 04121730 21 04121740 [30:42:6])#, 04121750 TAPEBUFFERSIZE = 200#; 04121850 ARRAY MAINTBUFFER[*]; 04121950 SAVE PROCEDURE IOFINISH(C,R); VALUE R,C; REAL R,C; 04122000 BEGIN BOOLEAN STOP; 04123000 COMMENT 04123010 WHEN E!0, STOP TAKES THE FOLLOWING VALUES: 04123020 0 DISK ERROR (OTHER THAN NOT READY ON A DFX SYSTEM). 04123030 1 ANY ERROR OTHER THAN THOSE LISTED FOR 0, 2 OR 3. 04123040 2 LOCKED ADDRESS (SHAREDISK). 04123050 3 ANY ERROR OCCURRING WHEN UNIT[U].[5:8]!0 (A RETRY). 04123060 WHEN E=0, STOP TAKES THESE VALUES: 04123070 -2 IO FOR WHICH COMPLETE SHOULD NOT BE SET (DATACOM OR 04123080 DISK WRITE BEFORE READ WITH UNIT OR EU SWITCH). 04123090 1 PRINTER IO. 04123100 0 NORMAL IO. 04123110 END COMMENT; 04123120 REAL TIM=STOP+1, U=TIM+1; 04123500 LABEL TEST,NOWAIT,PROC,NEW,QUP,INCR; 04124000 LABEL ERRORS,DISKERR,DS,X,SW,LP,DK,DX,DX1,DC,OK,L1; %111-04125000 REAL T=NT1,S=NT2,S1=NT3,V=NT4,E=NT5,I=NT7;% 04126000 NAME LOCN=E; REAL IOD=NT6, FIN=S1; 04127000 SWITCH TYPE := OK,LP,OK,OK,DK,OK,OK,OK,OK,OK,DC; %111-04128000 04128010 $ SET OMIT = NOT(DFX) 04128099 $ SET OMIT = NOT(NEWLOGGING) 04128799 P(CHANIO[C]); % INITIALIZES TIM04128900 S:=(T:=UNIT[P(CHANNEL[C],DUP)]).[18:15]; % INITIALIZES U 04129000 $ SET OMIT = NOT SEPTICTANK 04129490 % %111-04129520 % CHECK FOR A PARTIAL WORD BINARY READ WITH NO PARITY ERRORS. THIS IS 04129530 % ILLEGAL AND IS MARKED AS BEING A PARITY ERROR. %111-04129540 % %111-04129550 IF U LEQ 15 THEN % TAPE I/O %111-04129560 IF (R.[18:12] AND @4462) = @0440 THEN % BIN READ-NO PAR %111-04129570 IF R.[15:3] ! ((8-R.[22:1]) AND 7) THEN % PART WD XFER%111-04129580 R.[28:1] := MOD3IOS; % MARK AS PARITY ERROR IF MOD III I/04129590 ERRORS: 04129900 IF (E ~ R.[26:7])+(V ~ T.[5:8] ) ! 0 THEN% 04130000 BEGIN IF(S1 ~ FINALQUE[S]) < 0 THEN% 04131000 IF (E ~ S1.[25:8] AND E) = 0 THEN% 04132000 IF V = 0 THEN 04133000 GO TO SW; 04133100 IF (U AND @774) ! 16 THEN 04134000 BEGIN 04134050 RDCTABLE[U]:=(*P(DUP))& (C-1)[1:46:2]& R[3:3:5];04134060 IF U=30 THEN 04134300 BEGIN 04134400 IF (R.[28:5] AND @25 ! 0 THEN 04134500 BEGIN 04134600 IF ( NOT R.[32:1] AND R.[28:1]) THEN 04134700 GO TO DC; 04134800 GO TO X; 04134900 END 04134950 ELSE GO TO DC; 04134955 END ELSE GO TO X; 04134960 END; 04134990 IF E = 0 THEN 04135000 BEGIN % RECOVERED MASS STORAGE % 04137000 MAINTBUFFER[NXDISK:=NXDISK+4 AND 15] 04137100 := -0 & U[2:46:2] & LOCATQUE[S][4:3:5] & 04137110 (LOIGENTRY:=LOGENTRY+1)[CTF] & 04137120 RDCTABLE[U]{18:1:2]; 04137130 IF FINALQUE[S] GTR 0 THEN 04137140 BEGIN 04137150 MAINTBUFFER[XNDISK]:=(*P(DUP)) & 04137160 ((M[M[S1:=LOCATQUE[S] INX NOT 2] INX 4]04137170 .[13:11] DIV ETRLNG)+1)[9:39:9]; 04137180 M[S1].[7:1] := 1; 04137190 END; 04137200 P(MAINTBUFFER[NXDISK+2]:=IOQUE[S]); 04137202 $ SET OMIT = NOT(AUXMEM) 04137203 P(NFLAG(M[P])); 04137212 P(P&V[1:44:4],[MAINTBUFFER[NXDISK+1]],STD); 04137215 MAINTBUFFER[NXDISK+3]:=MAINTBUFFER[U]; 04137220 IF (LOGHOLDER INX 0) = 0 THEN 04137230 BEGIN 04137240 LOGHOLDER.[CF]:=[MAINTBUFFER[NXDISK]]; 04137250 INDEPENDENTRUNNER(P(.MAINTLOGGER),0,100); 04137260 END ELSE M[LOGHOLDER.[FF]].[CF]:= 04137270 [MAINTBUFFER[NXDISK]]; 04137275 LOGHOLDER.[FF]:=[MAINTBUFFER[NXDISK]]; 04137280 NUMAINTMESS:= NUMAINTMESS+1; 04137290 T.[5:8] ~ 0; 04142000 GO TO SW; 04142500 END;% 04143000 IF V = 0 THEN% 04144000 $ SET OMIT = NOT(SHAREDISK) 04144099 BEGIN % ORIGINAL ERROR ON MASS STORAGE% 04145000 TINU[U].[18:2] ~ P(DUP).[18:12]+1;% 04146000 MAINTBUFFER[U]:=R&TWO(C)[18:43:4]; 04146100 RDCTABLE[U]:=(*P(DUP))&(C-1)[1:46:2]; 04146200 V:=129; 04147000 $ SET OMIT = NOT(SHAREDISK) 04147399 END% 04148000 ELSE BEGIN % RECURRENT ERROR ON MASS STORAGE% 04149000 P(MAINTBUFFER[U]:=P(DUP,LOD) OR 04150100 R&TWO(C)[18:43:4]); 04150200 IF (V ~ V+1) > 137 THEN% 04151000 BEGIN R:=P; 04151200 IF LOCATQUE[S].[9:1] THEN % OLAY I/O 04151220 M[LOCATQUE[S]:=R OR IOMASK; 04151230 $ SET OMIT = NOT(AUXMEM) 04151235 DISKERR: 04151300 $ SET OMIT = NOT(DFX) 04151399 T.[5:10]:=0; 04151400 GO TO DX; 04152600 END; 04152800 P(DEL); 04152900 END;% 04153000 UNIT[U] ~ T&V[5:40:8];% 04154000 DS:% 04155000 CHANNEL[P(TIO)] ~ U;% 04156000 P([IOQUE[S]],IIO);% 04157000 GO TO EXTERNAL ;% 04158000 X: STOP ~ (V!0)|2+1;% 04159000 T.[5:13] ~ 32|E+8;% 04160000 GO TO TEST; 04161000 END; 04161500 SW:: GO TO TYPE[T.[1:4]];% 04162000 LP: 04163000 IF STOP := (T := T&0[16:16:1]).[17:1] THEN 04164000 TEST: IF FIRSTWAIT = NEXTWAIT THEN GO TO INCR ELSE% 04165000 GO TO NEW ELSE GO TO NOWAIT;% 04166000 DK: 04167900 IF NOT (I:=IOQUE[S]).[24:1] THEN 04168000 IF FINALQUE[S].[24:1] THEN% 04169000 $ SET OMIT = DFX 04169090 BEGIN 04169100 $ SET OMIT = NOT DKBNODFX OR OMIT 04169190 $ SET OMIT = DKBNODFX OR OMIT 04170750 M[IOQUE[S]:=I&1[24:47:1]]:=*(P(DUP) INX P(0,LNG,XCH)); 04170800 $ POP OMIT 04170900 GO TO DS; 04171000 END ELSE GO TO OK ELSE GO TO OK; 04171200 $ POP OMIT 04171250 $ SET OMIT = NOT DFX 04171350 DC: 04174000 $ SET OMIT = NOT(DATACOM ) 04174999 04176000 $ SET OMIT = DFX 04176899 DX: DX1: 04176900 $ POP OMIT 04176901 OK: IF FIRSTWAIT = NEXTWAIT THEN 04177000 NOWAIT: IF (S1 := LOCATQUE[S].[18:15]) LSS @1777 THEN 04178000 INITIATEIO(IOQUE[S1],LOCATQUE[S1].[3:5],U)% 04180000 ELSE 04181000 PROC: T := T&0[16:16:2] 04182000 ELSE 04183000 BEGIN% 04187000 NEW: NEWIO;% 04188000 IF STOP THEN GO TO INCR;% 04189000 QUP: IF LOCATQUE[S].[FF] GTR @1777 THEN GO TO PROC; 04190000 QUEUEUP(U);% 04191000 T ~ T&4[13:43:5];% 04192000 END;% 04193000 INCR: 04194000 IF (TIM~CLOCK+P(RTR)-TIM) LSS THEN THEN TIM~0; 04194050 IOD:=IOQUE[S]; 04194100 IF (U OR 1 )=19 THEN 04194200 BEGIN 04194300 IF (JUNK:=M[IOD].[5:7])>9 THEN 04194400 JUNK:=NEUP.[CF]+(JUNK AND @17); 04194500 IF JUNKCLOCK+P(RTR) DO SLEEP(1,1); 04557200 T4~CLOCK+P(RTR+4); 04557300 END; 04557400 IF IOQUESLOTS=0 THENSLEEP([IOQUESLOTS],83); 04558000 IOQUESLOTS:=IOQUESLOTS-1; 04558500 IOQUEAVAIL:=IOQUE[T1:=IOQUEAVAIL]; 04559000 IOQUE[T1]~ IOD;% 04560000 LOCATQUE[T1]~LOCATQUE[T2 ~(T3~UNIT[U]).[18:15]]&RESULT]% 04561000 [33:33:15]&T2[18:33:15];% 04562000 UNIT[U] ~ T3&T1[18:33:15]&64[5:35:13];% 04563000 STARTIO(U);% 04564000 FINALQUE[T1] ~ NABS(IOD)& 0 [25:40:8] OR IOMASK;% 04565000 RESULT ~ 0;% 04566000 SLEEP([UNIT[U]],@100000000000);% 04567000 IF RESULT.[30:1] THEN % NOT READY 04567010 BEGIN 04567020 MODE := (-16); 04567030 GO TO EXIT; 04567040 END; 04567050 IF RESULT.[29:1] AND RESULT.[2:1] THEN 04567100 BEGIN 04567150 IF RESULT.[12:1] THEN % BLANK TAPE 04567200 IF IOD.[24:1] THEN % READ 04567250 TRANSACTION[U]~TRANSACTION[U]-1&IOD[1:22:1] ELSE04567300 BEGIN; % WRITE 04567310 STREAM(A~TINU[U],T~T2~SPACE(3)); 04567320 BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04567400 DS!21 LIT" BLANK TAPE ON WRITE~"; 04567500 END; 04567550 SPOUTER(T2,UNITNO,35); 04567600 GO TO XXIT; 04567700 END; 04567750 IF RESULT.[11:1] THEN % MEM PARITY 04567770 BEGIN; 04567780 STREAM(A~TINU[U],T~T2~SPACE(3)); 04567790 BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04567800 DS~13 LIT" I/O MEM PAR~"; 04567810 END; 04567820 SPOUTER(T2,UNITNO,35); 04567830 XXIT: MODE := 16; 04567840 IF TESTING THEN GO XIO; 04567845 RECORDRETRY; 04567850 GO TO EXIT; 04567855 END; 04567860 IF RESULT.[13:21]!0 THEN Y~18; 04567870 END ELSE GO TO XIO; 04567900 END;% 04568000 RESULT.[27:1]~1; MODE~32; 04568100 XIO: IF NOT SPACING THEN RECORDRETRY; 04568200 END DOIONOW;% 04568250 SUBROUTINE SPACEBACK; 04568300 BEGIN 04568310 IF TRANSACTION[U]=1 THEN 04568320 BEGIN 04568330 IOD:=@4200000000&IOD[3:3:5]; 04568340 DOIONOW; 04568350 I:=TWO(U); 04568360 T2:=CLOCK+P(RTR)+600; 04568364 COMPLEXSLEEP((P(RRR) AND I)!0 OR T2 NOT READY04568370 BEGIN MODE:=16; 04568372 GO TO EXIT; 04568374 END; 04568376 END ELSE 04568380 BEGIN 04568390 M:=W; 04568400 IOD:=SPACEIOD; 04568410 J:=0; 04568420 SPACING:= TRUE;% 04568425 DO BEGIN 04568430 DOIONOW; 04568440 TRANSACTION[U]:=(*P(DUP))+1); 04568450 J:=J+1; 04568460 END UNTIL ((M:=RESULT.[CF]-SPACEIOD.[CF]+M) LSS 0 04568470 OR RESULT.[27:1] AND J GTR 1; 04568480 IF NOT TESTING THEN SPACING:= FALSE; 04568485 TRANSACTION[U]:=(*P(DUP))-2; 04568490 IOD:=SPACEIOD&0[22:47:1]; 04568500 DOIONOW; 04568510 IF N=0 THEN BSIZE:=RESULT.[CF]-IOD.[CF] ELSE 04568520 IF BSIZE!RESULT.[CF]-IOD.[CF] THEN 04568530 BEGIN 04568540 STREAM(A:=TINU[U],D:=T2:=SPACE(10)); 04568550 BEGIN SI:=LOC A;SI:=SI+5;DS:=3 CHR; 04568560 DS:=13 LIT" ERASE ERROR~"; 04568570 END; 04568580 SPOUTER(T2,UNITNO,35); 04568590 FLAGGER ~ 1; 04568595 GO GIVEUP; 04568600 END; 04568610 END; 04568620 END; % OF SPACEBACK 04568630 TINU[U].[18:12] ~ P(DUP).[18:12]~1;% 04569000 MIX ~ LOCATQUE[UNIT[U].[FF]].[3:5]; 04569100 FLAGGER ~ FINALQUE[UNIT[U].[FF]] < 0; % NOT OBJECT JOB 04569200 OIOD ~ NFLAG(IOQUE[UNIT[U].[18:15]]);% 04570000 PTR:= KEY+9; 04570100 IF R.[24:1] THEN% 04571000 BEGIN COMMENT READ RETRY;% 04572000 SPACEMASK ~ OIOD.[21:2]|@1111 EQV NOT @0123;% 04573000 SPACEIOD ~ OIOD&1[8:38:10]&1[23:47:1];% 04574000 FOR M ~ 1 STEP 1 UNTIL 3 DO% 04575000 BEGIN SPACEIOD ~ SPACEIOD&SPACEMASK[21:46:2];% 04576000 FOR N ~ 1 STEP 1 UNTIL 5 DO% 04577000 BEGIN IOD ~ SPACEIOD;% 04578000 IF N!1 OR M!1 THEN DOIONOW ELSE 04579000 IF NOT(R.[29:1]AND R.[2:1] AND R.[12:1]) 04579100 THEN DOIONOW; 04579200 IF RESULT.[28:1] THEN% 04580000 BEGIN MODE ~ 0;% 04581000 IOD ~ OIOD;% 04582000 END% 04583000 ELSE BEGIN MODE ~ 8;% 04584000 IOD ~ OIOD&SPACEMASK[21:43:2];% 04585000 END;% 04586000 DOIONOW;% 04587000 IF NOT RESULT.[28:1] THEN GO TO EXIT;% 04588000 IF MOD3IOS THEN IF OIOD.[23:1] THEN 04588010 BEGIN Z~IOD~OIOD&SPACEMAKS[21:40:2] 04588020 &(OIOD.[33:15]+(OIOD.[8:10]-1) 04588030 &OIOD[1:22:1]])[33:33:15]; 04588040 DOIONOW; MODE~0; 04588050 IF RESULT.[28:1] THEN 04588060 BEGIN IOD~OIOD; DOIONOW; 04588070 IF NOT RESULT.[28:1] THEN 04588080 GO TO EXIT; 04588090 IOD~Z&SPACEMASK[21:46:2]; 04588100 DOIONOW; MODE~8; 04588110 IF RESULT.[28:1] THEN 04588120 BEGIN IOD~OIOD&SPACEMASK 04588130 [21:43:2]; 04588140 RP: DOIONOW; 04588150 IF RESULT.[28:1] THEN 04588160 GO TO LX; 04588170 GO TO EXIT; 04588180 END; 04588190 END; 04588200 Z~ABS(IOD.[33:15]-RESULT.[33:15]); 04588210 IF IOD.[21:2]=0 THEN 04588220 Z~Z-(RESULT.[15:3]=0); 04588230 IF IOD.[8:10] 9 THEN 04652700 BEGIN 04652800 L1: SI:=SI+1; IF SC>9 THEN GO L1; 04652900 END; 04653000 L2: SI:=SI+1; IF SC{9 THEN GO L2; 04653100 SVSI:=SI; 04653200 SI:=LOC SVSI; SI:=SI+5; 04653300 DI:=LOC BUFFEND; DI:=DI+5; 04653400 IF 3 SC!DC THEN TALLY:=1; 04653500 SI:=BUFFEND; SI:=LOC TEMP; DS:= CHR; 04653600 T:=TALLY; 04653700 END; 04653800 I:=POLISH; 04653900 MEMORY[KEY+2]:= P(DUP,LOD) & 1[1:47:1]; 04654000 END; 04654100 IF STOPTEST OR FLAGGER THEN LINKUP(3,KEY) ELSE 04654200 BEGIN 04654300 MEMORY[KEY] := NABS(P(DUP,LOD)); 04654400 LINKUP(3,KEY); 04654500 TESTING:= SPACING:= TRUE; N:=0; 04654600 BUFFERSIZE:= BUFFERSIZE-1; 04654700 OIOD:= OIOD & 1[18:42:6]; 04654800 PTR:= KEY+8; 04654900 STREAM(MOD2IOS:=NOT(MOD3IOS+62), D:=[PATTERN]); 04655000 BEGIN 04655100 DS:=13 LIT"01248+|~<(.G{"; 04655200 MOD2IOS(DI:=DI-6; DS:=LIT"""; DI:=DI+5); 04655300 DS:= LIT"""; DS:= LIT"""; 04655400 DS:=3 LIT"]$("; 04655500 END; 04655600 SLEEP([MEMORY[KEY]],@1000000000000000); 04655700 MEMORY[PTR]:= 0; MOVE(191,PTR,PTR+1); 04655800 FOR K:=0 STEP 1 UNTIL 15 DO 04655900 BEGIN 04656000 STREAM(A:=[PATTERN], 04656100 K:=K+(K=15), M:=4+4|(K<14), N:=1+(K>13), 04656200 SIZEDIV64:=BUFFERSIZE.[36:6], BUFFERSIZE, 04656300 BUFFER); 04656400 BEGIN 04656500 SI:=A; SI:=SI+K; 04656600 M(DS:=N CHR; SI:=SI-N); 04656700 SI:=BUFFER; 04656800 SIZEDIV64(DS:=32 WDS; DS:=32 WDS); DS:=BUFFERSIZE WDS; 04656900 DI:=A; DI:=DI+24; DS:=WDS; 04657000 END; 04657100 IOD:= OIOD:= OIOD & ((K<7) OR (K>13))[21:47:1]; 04657200 DOIONOW; 04657300 MEMORY[PTR]:= RESULT & RDCTABLE[U][19:1:2]; 04657400 SPACEBACK; 04657500 STREAM(SIZEDIV64:=BUFFERSIZE.[36:6],BUFFERSIZE, 04657600 BUFFER); 04657700 BEGIN 04657800 DS:=8 LIT" "; SI:=BUFFER; 04657900 SIZEDIV64(DS:=32 WDS; DS:=32 WDS); DS:=BUFFERSIZE WDS; 04658000 END; 04658100 IOD:= OIOD & 1[24:47:1]; 04658200 DOIONOW; 04658300 MEMORY[PTR+1]:= RESULT & RDCTABLE[U][19:1:2]; 04658400 STREAM(A:=[PATTERN] INX 3, 04658500 CHERR:=0, WRDERR:=0, WRDCNT:=0, 04658600 LOOP:=0, FORSEVEN:=1, LEAPFROG:=0, 04658700 WDSLEFT:=I:=(J:=IF (SIZE:=ABS(BUFFER-(RESULT INX 0))) 04658800 LEQ BUFFERSIZE THEN SIZE ELSE BUFFERSIZE+1) MOD 63, 04658900 V:=IF J<64 THEN J ELSE 63, 04659000 N:=IF J<64 THEN 1 ELSE J DIV 63, 04659100 RECYCLE:= IF J<64 THEN 0 ELSE IF I=0 THEN 0 ELSE 1, 04659200 TEMP:=0, SVDI:=0, 04659300 BITLOCN:=PTR+3, WRDLOCN:=PTR+5, 04659400 BUFFER); 04659500 BEGIN; 04659600 LEAPFROG:= CI; TALLY:=0; % USED ONLY FOR LEAPFROG RETURN 04659700 N(V(SI:=A; IF 8 SC!DC THEN 04659800 BEGIN 04659900 SI:=WRDERR; SI:=SI+8; WRDERR:=SI; 04660000 FORSEVEN(SVDI:=DI; DI:=BITLOCN; LOOP(DI:=DI+2); 04660100 SI:=LOC WRDCNT; SI:=SI+6; DS:=2 CHR; 04660200 DI:=WRDLOCN; LOOP(DI:=DI+8); 04660300 SI:=WVDI; SI:=SI-8; DS:= WDS; 04660400 TALLY:=LOOP; TALLY:=TALLY+1; LOOP:=TALLY; 04660500 SI:=LOC LOOP; SI:=SI+7; 04660600 IF SC="7" THEN 04660700 BEGIN TALLY:=0; FORSEVEN:=TALLY; END; 04660800 DI:=SVDI); 04660900 SI:=A; DI:=DI-8; TALLY:=0; 04661000 8(IF SC!DC THEN TALLY:=TALLY+1); 04661100 TEMP:=TALLY; 04661200 SI:=CHRERR; TEMP(SI:=SI+8); CHRERR:=SI; 04661300 END; 04661400 SI:=WRDCNT; SI:=SI+8; WRDCNT:=SI; 04661500 )); 04661600 RECYCLE(TALLY:=1; N:=TALLY; 04661700 TALLY:=WDSLEFT; V:=TALLY; 04661800 TALLY:=0; RECYCLE:=TALLY; 04661900 JUMP OUT TO TADPOLE); 04662000 GO TO FROG; 04662100 TADPOLE: CI:=LEAPFROG; 04662200 FROG: DI:=BITLOCN; DI:=DI-5; 04662300 SI:=LOC CHRERR; SI:=SI+5; DS:=3 CHR; 04662400 SI:=LOC WRDERR; SI:=SI+6; DS:=2 CHR; 04662500 END; 04662600 IF MEMORY[PTR].[27:1] THEN SPACEBACK; 04662700 PTR:=PTR+12; 04662800 END; 04662900 MEMORY[KEY]:= P(DUP,LOD) & 0[1:1:2] & 39[39:39:9]; 04663000 MEMORY[KEY+2]:= P(DUP,LOD) & OPTION[2:2:1]; 04663100 LINKUP(20,KEY); 04663200 END;END; 04663300 END TAPEPARITYRETRY;% 04666000 REAL PROCEDURE WRITEPARITYREELSWITCH(OIOD,RC); 04667000 VALUE OIOD,RC; REAL OIOD,RC; 04667050 % 04667100 % THE PURPOSE OF THIS ROUTINE IS TO ALLOW OBJECT PROGRAMS 04667150 % TO CHANGE MAG TAPE UNITS WHEN ENCOUNTERING A WRITE PARITY 04667200 % ERROR. THIS ROUTINE IS CALLED FROM EITHER TAPEPARITYRETRY 04667250 % IN RESPONSE TO A FATAL WRITE PARITY ERROR OR FROM 04667300 % REELCHANGER AFTER AN "RC" KEYBOARD REQUEST BY THE OPERATOR. 04667350 % 04667400 % BASICALLY, THIS ROUTINE READS INTO CORE THE LAST TWO 04667450 % SUCESSFULLY WRITTEN BLOCKS ON THE TAPE, CLOSES THE FILE 04667500 % (MARKING THE TAPE AS AN END OF REEL), OBTAINS ANOTHER 04667550 % TAPE UNIT, RE-WRITES THE TWO BLOCKS IN CORE FOLLOWED 04667600 % BY THE BLOCK IN WHICH THE PARITY ERROR OCURRED, AND 04667650 % ALLOWS THE PROGRAM TO CONTINUE WRITING ON THE NEW TAPE. 04667700 % 04667750 % WHEN THIS ROUTINE IS CALLED DUE TO AN OPERATOR "RC" 04667800 % MESSAGE, THERE IS NO FATAL PARITY ERROR AT THIS POINT. 04667850 % SO THE SAVING OF THE LAST TWO RECORDS IS UNNECESSARY 04667900 % AND ONLY THE CLOSING OF THE FILE AND OBTAINING OF A NEW 04667950 % UNIT ARE REQUIRED. 04668000 % 04668050 % THE PARAMETERS ARE USED AS FOLLOWS: 04668100 % OIOD THE ORIGINAL I/O DESCRIPTOR ON WHICH 04668150 % A FATAL ERROR OCCURRED 04668200 % 04668250 % RC 1 IF CALLED FROM REELCHANGER, 0 OTHERWISE 04668300 % 04668350 BEGIN 04668400 INTEGER I,LOGICLRC; 04668450 REAL BSIZE,FNUM,NUMBUFFS,NUMRECS,REEL); 04668500 REAL S,Y,U,OLDU,SAVEU,MIX; 04668550 REAL TEMP,T1,T2,T3,T4; 04668600 REAL IOD,RESULT,MODE,TOPIOD,TM,HOLDCT; 04668650 REAL FIRSTREC,SECREC,FIRSTRECIO,SECRECIO; 04668700 BOOLEAN TOGGLES; 04668750 ARRAY FIB[*],FPB[*],LABELA[*],TANK[*]; 04668800 % 04668850 % THE LOCAL VARIABLES ARE USED AS FOLLOWS: 04668900 % INTEGERS 04668950 % I TEMPORARY 04669000 % LOGICLRC CONTAINS THE LOGICAL RECORD COUNT 04669050 % REALS 04669100 % BSIZE BLOCK SIZE OF FILE 04669150 % FNUM FILE NUMBER WITHIN FPB 04669200 % NUMBUFFS TOTAL NUMBER OF BUFFERS DECLARED FOR FILE 04669250 % NUMRECS RECORDS PER BLOCK (BSIZE DIV RECORD SIZE) 04669275 % REEL CONTAINS THE CURRENT REEL NUMBER +1 04669300 % S INDEX INTO IOQUE OF UNSUCCESSFUL I/O 04669350 % Y TEMPORARY 04669400 % U LOGICAL UNIT NUMBER OF TAPE UNIT BEING WRITTEN 04669450 % OLDU HARDWARE UNIT NUMBER OF TAPE UNIT 04669500 % SAVEU LOGICAL UNIT OF ORIGINAL TAPE UNIT WITH ERROR 04669550 % MIX MIX INDEX OF JOB FOR WHICH RECOVERY IS ATTEMPTED 04669600 % TEMP 04669650 % T1,T2,T3,T4 TEMPORARY 04669700 % IOD HOLDS THE I/O DESCRIPTOR FOR EACH I/O ATTEMPTED 04669750 % RESULT RECEIVES THE LAST I/O RESULT DESCRIPTOR 04669800 % MODE USED TO INDICATE A SUCCESSFUL RECOVERY ATTEMPT 04669850 % TOPIOD LOCATION OF TOP I/O DESCRIPTOR IN TANK 04669900 % TM TEMPORARY, USED FOR WRITING TAPE MARK 04669950 % HOLDCT CONTAINS THE NUMBER OF FILLED BUFFERS 04670000 % FIRSTREC 04670050 % SECREC ADDRESSES OF AREAS TO HOLD LAST TWO BLOCKS 04670100 % FIRSTRECIO 04670150 % SECRECIO VARIABLE LENGTH BLOCK I/O DESCRIPTORS 04670200 % BOOLEAN 04670250 % TOGGLES USED TO HOLD VARIOUS BOOLEANS (SEE DEFINES) 04670300 % ARRAYS 04670350 % FIB FIB ARRAY, USED FOR CLOSEING THE FILE 04670400 % FPB FPB ARRAY, USED FOR OPENING NEW FILE 04670450 % LABELA ARRAY DESCRIPTOR FOR IN-CORE LABEL RECORD 04670500 % TANK TANK ARRAY, CONTAINING I/O DESCRIPTORS 04670550 % 04670600 LABEL L1,RETRY,PROB,KAPUT,RESETUNITS,ARN,ERROROUT,XIO,EXIT; 04670650 DEFINE ALFA = TOGGLES.[47:1]#, 04670700 DSED = TOGGLES.[46:1]#, 04670750 LABELED = TOGGLES.[45:1]#, 04670800 NORMALPROCESS = TOGGLES.[44:1]#, 04670850 PBT = TOGGLES.[43:1]#; 04670900 $ SET OMIT = NOT(PACKETS) 04670950 DEFINE UNITNO = PSEUDOMIX[MIX]#; 04671000 $ POP OMIT 04671050 SUBROUTINE DOIONOW; 04671100 BEGIN 04671150 % DOIONOW IS COPIED FROM TAPEPARITYRETRY 04671200 FOR Y ~ 1 STEP 1 UNTIL 18 DO 04671250 BEGIN IF IOD.[24:1] THEN 04671300 BEGIN % WAIT 1/15 SECOND BETWEEN READ RETRIES 04671350 WHILE T4 > CLOCK+P(RTR) DO SLEEP(1,1); 04671400 T4 ~ CLOCK+P(RTR)+4; 04671450 END; 04671500 IF IOQUESLOTS=0 THEN SLEEP([IOQUESLOTS],63); 04671550 IOQUESLOTS ~ IOQUESLOTS-1; 04671600 IOQUEAVAIL ~ IOQUE[T1~IOQUEAVAIL]; 04671650 IOQUE[T1] ~ IOD; 04671700 IF (T2~(T3~UNIT[U]).[FF])=@77777 THEN T3.[CF]~T1; 04671750 LOCATQUE[T1] ~ [RESULT] & MIX[3:43:5] & 04671800 U[12:42:6] & T2[CTF]; 04671850 UNIT[U] ~ T3 & T1[CTF] & 100[5:35:13]; 04671900 STARTIO(U); 04671950 FINALQUE[T1] ~ NABS(IOD) & 0[25:40:8] OR IOMASK; 04672000 RESULT ~ 0; 04672050 SLEEP([UNIT[U]],@100000000000); 04672100 IF RESULT.[30:1] THEN GO ERROROUT; % NOT READY 04672150 IF RESULT.[29:1] AND RESLT.[2:1] THEN 04672200 BEGIN 04672250 IF RESLT.[12:1] THEN % BLANK TAPE 04672300 IF IOD.[24:1] THEN % READ 04672350 TRANSACTION[U] ~ (*P(DUP))-(1 & IOD[1:22:1]) ELSE 04672400 BEGIN % WRITE 04672450 STREAM(A~TINU[U], T~T2~SPACE(3)); 04672500 BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04672550 DS~21 LIT" BLANK TAPE ON WRITE~"; 04672600 END; 04672650 SPOUTER(T2,UNITNO,35); 04672700 GO ERROROUT; 04672750 END; 04672800 IF RESULT.[11:1] THEN % MEM PARITY 04672850 BEGIN 04672900 STREAM(A~TINU[U], T~T2~SPACE(3)); 04672950 BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04673000 DS~13 LIT" I/O MEM PAR~"; 04673050 END; 04673100 SPOUTER(T2,UNITNO,35); 04673150 GO ERROROUT; 04673200 END; 04673250 IF RESULT.[13:2]!0 THEN Y ~ 18; 04673300 END ELSE 04673350 GO XIO; 04673400 END; 04673450 RESULT.[27:1] ~ 1; MODE ~ 32; 04673500 XIO: END DOIONOW; 04673550 % 04673600 U ~ SAVEU ~ OIOD.[3:4]; 04673650 % SAVE OFF ORIGINAL UNIT FOR DS-ING. 04673700 OLDU ~ UNIT[U]; 04673750 % SAVE OFF ORIGINAL UNIT TABLE ENTRY 04673800 MIX ~ RDCTABLE[U].[8:6]; 04673850 MODE ~ 16; 04673900 % SET MODE TO FLAG PARITY, MODE WILL BE SET TO ZERO IF CHANGE OK 04673950 LABELA ~ M[(TOPIOD~PRNTABLE[U].[15:15])-2] & @05000[CTF]; 04674000 FIB ~ M[TOPIOD-3]; 04674050 PBT ~ FIB[4].[8:4]=7; 04674100 FNUM ~ FIB[4].[13.11]; 04674150 BSIZE ~ IF PBT THEN 90 ELSE FIB[18].[3:15]; 04674200 NUMRECS ~ IF PBT THEN 5 ELSE BSIZE DIV FIB[18].[33:15]; 04674225 REEL ~ FIB[13].[28:10]+1; 04674250 ALFA ~ (NOT FIB[13]).[24:1]; 04674300 LABELED ~ (NOT FIB[4]).[2:1]; 04674350 NUMBUFFS ~ FIB[13].[10:9]; 04674400 TANK ~ [M[TOPIOD]] & NUMBUFFS[8:38:10]; 04674450 HALT; 04674500 % STOP NORMAL STATE PROCESSING. 04674550 IF RC THEN 04674600 IF TANK[0].[24:1] THEN 04674650 BEGIN 04674700 STREAM(T~T2~SPACE(5)); 04674750 DS ~ 40 LIT"#REEL SWITCH NOT POSSIBLE ON INPUT FILE~"; 04674800 SPOUTER(T2,UNITNO,1); 04674850 GO EXIT; 04674900 END; 04674950 STREAM(A~TINU[U], T~T2~SPACE(5)); 04675000 BEGIN 04675050 DS ~ 34 LIT"#REEL SWITCH TO BE ATTEMPTED FROM "; 04675100 SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; DS ~ LIT"~"; 04675150 END; 04675200 SPOUTER(T2,UNITNO,1); 04675250 IF PBT THEN 04675300 BEGIN 04675350 LABELA.[8:10] ~ 8; % PRINTER LABELS ARE 15 WORDS 04675400 LABELA[1] ~ MULTITABLE[U].[3:45]; 04675450 LABELA[2] ~ LABELTABLE[U].[3:45]; 04675500 END; 04675550 IF RC THEN GO L1; 04675600 FIRSTREC ~ GETSPACE(BSIZE+4,0,1)+4; 04675650 SECREC ~ GETSPACE(BSIZE+4,0,1)+4; 04675700 % GETSPACE ON TWO BUFFERS FOR BACKWARD READ. 04675750 IF ALFA THEN 04675800 BEGIN 04675850 IOD ~ @340000000 & OIOD[3:3:5] & [T2][CTC]; 04675900 DOIONOW; DOIONOW; 04675950 IOD ~ OIOD & 1[24:47:1] & FIRSTREC[CTC]; 04676000 DOIONOW; 04676050 IF RESULT.[27:2]!0 THEN GO ERROROUT; 04676100 IOD ~ IOD & SECREC[CTC]; 04676150 DOIONOW; 04676200 IF RESULT.[27:2]!0 THEN GO ERROROUT; 04676250 IOD ~ @340000000 & OIOD[3:3:5] & [T2][CTC]; 04676300 DOIONOW; DOIONOW; 04676350 GO L1; 04676400 END; 04676450 IOD ~ OIOD & (SECREC+BSIZE-1)[CTC] & 5[22:45:3]; 04676500 DOIONOW; 04676550 % BUILD BACKWARD DESCRIPTOR AND EXECUTE FIRST BACKWARD READ. 04676600 IF RESULT.[27:2]!0 THEN GO ERROROUT; 04676650 IF (TEMP ~ M[IOD INX 1])!BSIZE THEN 04676700 % VARIABLE LENGTH BLOCK. 04676750 SECRECIO ~ ((IOD INX 1)-TEMP) & TEMP[8:38:10]; 04676800 IOD ~ IOD & (FIRSTREC+BSIZE-1)[CTC]; 04676850 DOIONOW; 04676900 % NEXT BACKWARD READ. 04676950 IF RESULT.[27:2]!0 THEN GO ERROROUT; 04677000 IF (TEMP ~ M[IOD INX 1])!BSIZE THEN 04677050 % VARIABLE LENGTH BLOCK. 04677100 FIRSTRECIO ~ ((IOD INX 1)-TEMP) & TEMP[8:38:10]; 04677150 L1: 04677200 FOR I ~ 0 STEP 1 UNTIL NUMBUFFS-1 DO 04677250 IF (NOT TANK[I]).[19:1] THEN HOLDCT ~ HOLDCT+1; 04677300 % SCAN FOR THE NUMBER OF FILLED BUFFERS. 04677350 FIB[6] ~ FIB[6]-((RC=0)|2)-HOLDCT; 04677400 LOGICLRC ~ FIB[7] MOD NUMRECS; 04677450 % DETERMINE THE NUMBER OF LOGICAL RECORDS WRITTEN. 04677500 FIB[7] ~ FIB[6] | NUMRECS; 04677550 % LOAD FIB WITH RECORD COUNT FOR TRAILER LABEL. 04677600 IF HOLDCT=NUMBUFFS THEN 04677650 BEGIN 04677700 NOPROCESSTOG ~ NOPROCESSTOG-1; 04677750 NORMALPROCESS ~ 1; 04677800 END; 04677850 % IF THERE ARE NO UNFILLED BUFFERS THEN ALLOW NORMAL STATE 04677900 % PROCESSING TO CONTINUE. 04677950 % FLAG THE RELEASE OF NORMAL STATE. 04678000 % THE CHANCE OF UNFILLED BUFFERS IS VERY REMOTE, BUT JUST IN CASE 04678050 P1MIX ~ MIX; 04678100 % LOAD P1MIX FOR CONSOLE MESSAGES. 04678150 TEMP ~ U; 04678200 % SAVE OFF CURRENT UNIT IN CASE DS CALLED AT THIS POINT. 04678250 RETRY: 04678300 IF TERMSET(MIX) THEN 04678350 BEGIN 04678400 U ~ (-1); 04678450 GO ERROROUT; 04678500 END; 04678550 TEMP ~ U; 04678600 TM ~ @ 1737000000000000; 04678650 % TAPE MARK. 04678700 IOD ~ NFLAG([TM]) & OIOD[3:3:5]; 04678750 DOIONOW; 04678800 % WRITE TAPE-MARK. 04678850 FIB[13].[28:10] ~ REEL; 04678900 IF LABELED THEN 04678950 BEGIN 04679000 STREAM(BC~FIB[6], RC~FIB[7], BKUP~PBT, D~LABELA); 04679050 BEGIN 04679100 DI ~ DI+39; DS ~ LIT"1"; 04679150 % END OF REEL FLAG. 04679200 BKUP(DI ~ DI+12; JUMP OUT TO OWT); 04679250 SI ~ LOC BC; DS ~ 5 DEC; DS ~ 7 DEC; 04679300 OWT: DS ~ LIT"1"; 04679350 % SPECIAL FLAG FOR SORT AND USE PROCEDURES 04679400 END; 04679450 IOD ~ NFLAG(LABELA) & OIOD[3:3:5]; 04679500 IF NOT PBT THEN IF ALFA THEN 04679550 IOD.[21:1] ~ 0; 04679600 DOIONOW; 04679650 % BUILD I/O DESCRIPTOR AND WRITE THE TRAILER LABEL. 04679700 IOD ~ NFLAG([TM]) & OIOD[3:3:5]; 04679750 DOIONOW; 04679800 END; 04679850 IOD ~ IOD & @42[18:42:6]; 04679900 % BUILD THE REWIND DESCRIPTOR. 04679950 DOIONOW; 04680000 STOPTIMING(FNUM,1023); 04680050 FPB ~ PRT[MIX,3]; 04680100 LABELTABLE[U] ~ @214; % RW/L 04680150 MULTITABLE[U] ~ RDCTABLE[U] ~ PRNTABLE[U] ~ 0; 04680200 IF LABELED THEN 04680250 BEGIN 04680300 STREAM(R~REEL, BKUP~PBT, D~LABELA); 04680350 BEGIN 04680400 SI ~ LOC R; DI ~ DI+24; DS ~ 3 DEC; 04680450 % LOAD REEL NUMBER INTO LABEL. 04680500 DI ~ DI+12; DS ~ LIT"0"; 04680550 BKUP(DI ~ DI+12; JUMP OUT TO OWT); 04680600 DS ~ 12 LIT"0"; 04680650 OWT: DS ~ LIT "0"; 04680700 % CLEAN OUT OLD TRAILER LABEL INFO. 04680750 END; 04680800 IF NOT PBT THEN IF ALFA THEN 04680850 LABELA.[7:1] ~ 1; 04680900 U ~ LABELASCRATCH(LABELA); 04680950 % FIND TAPE FOR LABELED OUTPUT. 04681000 IF U=(-1) THEN GO ERROROUT; 04681050 % OPERATOR DS-ED. 04681100 END ELSE 04681150 BEGIN 04681200 U ~ FINDOUTPUT(FPB[FNUM],FPB[FNUM+1],REEL,0,0,2,0,TM); 04681250 % FIND UNLABELED OUTPUT TAPE. 04681300 IF U=(-1) THEN GO ERROROUT; 04681350 T2 ~ 0; 04681400 STREAM(PRN~PRNTABLE[U].[30:18], D~[T2]); 04681450 BEGIN SI ~ LOC PRN; DS ~ 8 DEC; 04681500 DI ~ DI-7; DS ~ 6 FILL; 04681550 END; 04681600 $ SET OMIT = PACKETS 04681650 FILEMESSAGE(" OUT" & TINU[U][6:30:18],T2, 04681800 FPB[FNUM],FPB[FNUM+1],REEL,0,0,OPNMESS); 04681850 END; 04681900 RDCTABLE[U] ~ (*P(DUP)) & MIX[8:42:6]; 04681950 PRNTABLE[U] ~ (*P(DUP)) & TOPIOD[15:33:15]; 04682000 FPB[FNUM+3].[36:6] ~ U+1; 04682050 % LOAD LOGICAL UNIT NUMBER +1 INTO FPB. 04682100 TEMP ~ OIOD.[3:4]; 04682150 % LUN OF OLD UNIT. 04682200 S ~ UNIT[TEMP].[FF]; 04682250 % SAVE OFF INDEX INTO IOQUE 04682300 UNIT[TEMP] ~ (*P(DUP)) & @77777[14:29:19]; 04682350 % CLEAR UNIT TABLE ON OLD UNIT. 04682400 UNIT[U] ~ OLDU; 04682450 % LOAD NEW UNIT TABLE ENTRY. 04682500 OIOD ~ OIOD & TINU[U][3:3:5]; 04682550 % LOAD OIOD WITH NEW UNIT NUMBER. 04682600 FOR I ~ 0 STEP 1 UNTIL NUMBUFFS-1 DO 04682650 IF TANK[I].[7:1] THEN 04682700 TANK[I] ~ (*P(DUP)) & OIOD[3:3:5]; 04682750 % LOAD NEW UNIT DESIGNATE INTO I/O DESCRIPTOR TANK. 04682800 TINU[U] ~ (*P(DUP)) & TINU[TEMP][24:24:6]; 04682850 TINU[TEMP] ~ (*P(DUP)) & 0[24:42:6]; 04682900 IF RC THEN GO KAPUT; 04682950 IF FIRSTRECIO!0 THEN IOD ~ OIOD&FIRSTRECIO[8:8:10]&FIRSTRECIO[CTC] 04683000 % TEST FOR BLOCK LESS THAN MAX LENGTH--VARIABLE LENGTH--. 04683050 ELSE IOD ~ OIOD & FIRSTREC[CTC]; 04683100 DOIONOW; 04683150 % WRITE FIRST RECORD 04683200 IF RESULT.[28:1] THEN % CHECK FOR WRITE ERROR 04683250 BEGIN 04683300 PROB: 04683350 FIB[13].[28:10] ~ REEL-1; 04683400 % DECREMENT REEL COUNT. 04683450 STREAM(A~TINU[U], T~T2~SPACE(6)); 04683500 BEGIN 04683550 DS ~ 23 LIT"#REEL SWITCH FAILED ON "; 04683600 SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; 04683650 DS ~ 22 LIT", ANOTHER REEL PLEASE~"; 04683700 END; 04683750 SPOUTER(T2,UNITNO,1); 04683800 GO RETRY; 04683850 END; 04683900 IF SECRECIO!0 THEN IOD ~ OIOD&SECRECIO[8:8:10]&SECRECIO[CTC] 04683950 % CHECK FOR LESS THAN MAX LENGTH BLOCKS--VARIABLE LENGTH-- 04684000 ELSE IOD ~ OIOD & SECREC[CTC]; 04684050 % STANDARD LENGTH 04684100 DOIONOW; 04684150 % WRITE SECOND RECORD. 04684200 IF RESULT.[28:1] THEN GO PROB; 04684250 IOD ~ OIOD; 04684300 % ORIGINAL BAD IO ON NEW UNIT 04684350 DOIONOW; 04684400 IF RESULT.[28:1] THEN GO PROB; 04684450 KAPUT: 04684500 IF NOT DSED THEN 04684550 BEGIN 04684600 MODE ~ 0; 04684650 STARTIMING(FNUM,U); 04684700 END; 04684750 % CHANGE OVER SUCCESSFUL. 04684800 FIB[15].[24:6] ~ U; 04684850 % NEW LUN INTO FIB. 04684900 OLDU ~ TINU[U].[3:5]; 04684950 % OLDU LOADED WITH NEW PHYSICAL UNIT NUMBER. 04685000 IF NOT RC THEN 04685050 BEGIN 04685100 RESETUNITS: 04685150 IOQUE[S] ~ (*P(DUP)) & OLDU[3:43:5]; 04685200 FINALQUE[S] ~ (*P(DUP)) & OLDU[3:43:5]; 04685250 LOCATQUE[S] ~ (*P(DUP)) & U[12:42:6]; 04685300 % RESET DESCRIPTORS IN IOQUE. 04685350 IF (S ~ LOCATQUE[S].[FF]!@77777 THEN GO RESETUNITS; 04685400 END; 04685450 FIB[16] ~ (*P(DUP)) & OLDU[3:43:5]; 04685500 FIB[19] ~ (*P(DUP)) & OLDU[3:43:5]; 04685550 % CHANGE UNIT FIELD OF DESCRIPTORS IN FIB. 04685600 FIB[6] ~ ((RC=0)|2)+HOLDCT; 04685650 % LOAD NEW BLOCK COUNT INTO FIB 04685700 FIB[7] ~ (((RC=0)|2) | NUMRECS)+HOLDCT | NUMRECS+LOGICLRC; 04685750 % LOAD NEW RECORD COUNT 04685800 TINU[U].[24:6] ~ 0; 04685850 UNIT[U].[5:10] ~ 0; 04685900 % RESET ERROR FLAGS. 04685950 IF NOT DSED THEN 04686000 BEGIN 04686050 STREAM(A~TINU[U], T~T2~SPACE(4)); 04686100 BEGIN 04686150 DS ~ 26 LIT"#REEL SWITCH COMPLETED ON "; 04686200 SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; DS ~ LIT"~"; 04686250 END; 04686300 SPOUTER(T2,UNITNO,1); 04686350 END; 04686400 TOPIOD ~ TEMP ~ (IF RC THEN FIB[19] ELSE OIOD).[CF]-2; 04686450 % MUST RESET LUN IN I/O BUFFER FOR PROGRAM RELEASE 04686500 ARN: M[TEMP] ~ (*P(DUP)) & U[12:42:6]; 04686550 IF M[TEMP].[FF]-2!TOPIOD THEN 04686600 BEGIN 04686650 TEMP ~ M[TEMP].[FF]-2; 04686700 GO ARN; 04686750 END; 04686800 GO EXIT; 04686850 ERROROUT: 04686900 STREAM(T~T2~SPACE(3)); 04686950 DS ~ 21 LIT"#REEL SWITCH ABORTED~"; 04687000 SPOUTER(T2,UNITNO,1); 04687050 IF U < 0 THEN % JOB BEING DS-ED AT MT REQ 04687100 BEGIN 04687150 U ~ TEMP; 04687200 % SET U TO LAST UNIT. 04687250 IF U=SAVEU THEN GO EXIT; 04687300 DSED ~ 1; 04687350 GO KAPUT; 04687400 % GO TO KAPUT TO COUNTINUE HOUSE-KEEPING 04687450 END; 04687500 EXIT: 04687550 P1MIX ~ 0; 04687600 IF FIRSTREC!0 THEN 04687650 BEGIN 04687700 FORGETSPACE(FIRSTREC-2); 04687750 FORGETSPACE(SECREC-2); 04687800 END; 04687850 IF NOT NORMALPROCESS THEN NOPROCESSTOG ~ NOPROCESSTOG-1; 04687900 % WAS UNABLE TO FREE NORMAL PROCESS DUE TO UNFILLED BUFFERS. 04687950 % THIS SITUATION MAY NEVER OCCUR, BUT JUST IN CASE 04688000 WRITEPARITYREELSWITCH ~ UNIT[U] & MODE[5:40:8]; 04688050 END WRITEPARITYREELSWITCH; 04688100 REAL PROCEDURE PLACEFINDER(S, A, L); 04700000 VALUE S, A; 04701000 REAL S, A, L; 04702000 BEGIN INTEGER I; ARRAY B[*]; 04703000 REAL T, W, E, J, AA; 04704000 LABEL NULL, FOUND, EXIT; 04705000 LABEL SANDA; REAL SS; 04705500 W ~ -1; 04706000 B ~ [M[T ~ SPACE(30)]]&30[8:38:10]; 04707000 SS:=S; 04707500 IF S=0 THEN 04708000 NULL: BEGIN STREAM(T); DS:=20 LIT " "; GO EXIT; END; 04709000 DISKWAIT(-T,30,JAR[P1MIX,10]); 04710000 IF (JAR[P1MIX,10]=0) OR (AA~B[0].[FF])=0 THEN 04711000 SANDA: BEGIN STREAM(S:=SS,A,K:=M[PRT[P1MIX,8]].[10:2],T); 04712000 BEGIN DS~5 LIT ", S ="; 04713000 SI~LOC S; DS~4 DEC; 04714000 DS~5 LIT ", A ="; 04715000 DS~4 DEC; 04716000 DS:=LIT ":"; SI:=SI+7; DS:=CHR; 04716100 DI~T; DI~DI+5; DS~3 FILL; 04717000 DI~T; DI~DI+14; DS~3 FILL; 04718000 END STREAM; 04719000 GO EXIT; 04720000 END; 04721000 DISKWAIT(-T,30,I:=JAR[P1MIX,AA DIV JAR[P1MIX,8]+10+ 04722000 AA MOD JAR[P1MIX,8]+S DIV 30); 04723000 IF (J~B[S MOD 30])<0 THEN GO TO NULL; 04725000 AA ~ I ~ JAR[P1MIX,J.[CF] DIV JAR[P1MIX,8]+10]+ 04726000 J.[CF] MOD JAR[P1MIX,8]; 04727000 I~0; J~J.[FF]; 04728000 DO BEGIN S~(I+J).[36:11]; 04729000 IF W!(W:=S DIV 30) THEN DISKWAIT(-T,30,AA+W); 04731000 IF (E ~ B[S-W|30].[38:10])=A THEN GO TO FOUND; 04732000 IF E0 THEN SLEEP([Z],-0); Z~-Z; 05703500 $ SET OMIT = NOT(SHAREDISK) 05703699 DISKWAIT(-B,30,Z); 05704000 IF (I~A[0])+6+N}(J~A[1]) THEN BEGIN I~0; K~1 END %WRAP AROUND 05705000 ELSE IF I+N+100 GEQ J THEN 05706000 BEGIN INDEPENDTRUNNER(P(.LOGOUT),1,128); 05706100 K:=2; 05706200 END 05706300 ELSE IF I1020 THEN 1020 ELSE K,Z+I); 05728180 J:=J+1020; 05728200 I:=I+34; 05728220 END UNTIL (K:=K-1020) LEQ 0; 05728240 END; 05728260 $ SET OMIT = NOT(STATISTICS) 05728299 FORGETSPACE(A); 05729000 $ SET OMIT = NOT(SHAREDISK ) 05729199 Z:=-Z; 05729300 END OF LOGSPACE; 05730000 DEFINE 05780000 MAXSIZ[1:20]#, TOMAXSIZ=1:28:20#, 05780010 SPEED = [23:3]#, TOSPEED= 23:45:3#, 05780020 EUNP = [21:1]#, TOENUP = 21:47:1#, 05780025 STARTWRD=[26:12]#, TOSTARTWRD=26:36:12#, 05780030 NUMENT=[38:10]#, TONUMENT=38:38:10#, NUMENTM=1023#, 05780040 DSIZE=[2:20]#, TODSIZE=2:28:20#, 05780100 DENT=[22:26]#, TODEND=22:22:26#, 05780200 TOSIZE=8:38:10#, NEUF=[18:15]#, 05780300 EUIOFFSET=4 #, % ONE WORD FOR EACH I/O CHANNEL. 05780310 AVDIFFMIN=15#, AVDIFFMAX=50#, % AVDIFFMAX GTR AVDIFFMIN GTR 14. 05780400 AVTMAX=3900#, % MAX # WORDS ALLOWED FOR AVAILABLE TABLE ON DISK. 05780500 % IS REFLECTED IN USERDISKBOTTOM & DISKAVAILTABLEMAX05780505 AVSMIN=90# , AVSMAX=300#, % MIN AND MAX # WORDS TO READ IN @ 1 TIM05780600 % AVSMAX GTR AVSMIN GTR 85 05780605 % BOTH MUST BE MULTIPLES OF 30 05780610 FIXARRAY(FIXARRAY1,FIXARRAY2,FIXARRAY3)=FIXARRAY1~[M[FIXARRAY2~ 05780700 SPACE(FIXARRAY3)]]&FIXARRAY3[TOSIZE]# ; 05780800 $ SET OMIT = NOT (SHAREDISK ) 05800000 REAL PROCEDURE PETUSERDISK(N,T); VALUE N,T; REAL N,T ; 05839400 % N IS THE NUMBER OF SEGMENTS REQUESTED, AND T IS THE EU# OR THE SPEED#.05839600 % GETUSERDISK WILL RETURN -1, 0, OR THE ABSOLUTE DISK SEGMENT ADDRESS OF05839700 % THE RESULTANT AREA. SEE T.[2:1] FOR THE -1, AND N.[2:1] FOR THE 0. 05839800 % T>0 => T IS A PREFERRED SPEED#: T=1,2,3,4,..., OR 31. 05840000 % T<0 => -T IS A PREFERRED EU#: T=-1,-2,-3,-4,..., OR -20. 05840100 % T=0 => DONT CARE ABOUT SPEED# OR EU#, USE EU WITH LEAST EU I/O. 05840200 % T.[2:1]=1 => IF CANT GET PREFERRED SPEED# OR EU#, RETURN -1. 05840300 % T.[2:1]=0 => IF CANT GET PREFERRED SPEED# OR EU#, TREAT AS T=0 (ABOVE)05840400 % N>0 => MAKE A SCRATCHDIRECTORY ENTRY. 05840500 % N<0 => DONT MAKE A SCRATCHDIRECTORY ENTRY. 05840600 % N=0 => IMMEDIATELY RETURN WITH A 0. 05840700 % N.[2:1]=0 => IF CANT FIND ANY USERDISK, AND T.[2:1]=0, NO-USER-DISK. 05840800 % N.[2:1]=1 => IF CAND FIND ANY USERDISK, ANT T.[2:1]=0, RETURN 0. 05840900 BEGIN 05841200 INTEGER K=+1, % K IS ALSO "GETUSERDISK"; DONT USE K ABOVE LABEL D. 05841300 Z=K+1, NS=Z+1, I=NS+1, 05841350 $ SET OMIT = NOT(SHAREDISK ) 05841380 $ SET OMIT = SHAREDISK 05841610 R=I+1, AVS=R+1, H=NT6, L=AVS ; 05841615 REAL M1=NT5 M2=NT4,; ARRAY UT=J+1[*]; DEFINE U=AVTABLE # ; 05841620 $ POP OMIT 05841621 LABEL A,B,C,D,E,F,G,W ; 05841650 DEFINE GETUSERDISK=PETUSERDISK#;%***************************************05841700 IF N=0 THEN GO W ; 05842100 P(T.[2:1],ABS(N),1,0,0,0,0) ; 05842200 $ SET OMIT = NOT(SHAREDISK ) 05842205 A: SLEEP([TOGGLE],USERDISKMASK); LOCKTOG(USERDISKMASK); 05842300 $ SET OMIT = NOT(SHAREDISK ) 05842390 $ SET OMIT = SHAREDISK 05842405 M1:=M2:=P(D) ; 05842410 $ POP OMIT 05842411 L:=NEUP.NEUF ; 05842450 IF T LSS 0 THEN IF U[J:=IF -T GTR L THEN L+1 ELSE -T].MAXSIZ GEQ NS 05842475 THEN GO E ELSE IF Z THEN GO C ; 05842500 B: IF U[I].MAXSIZ}NS THEN 05842700 BEGIN 05842800 P(EUIO[(NT1:=I-1)+EUIOFFSET]+PEUIO[NT1],.NT2,SND,DUP) ; 05842900 IF P LSS M1 THEN BEGIN M1:=NT2; H:=NT1 END ; 05842930 IF P LSS M2 THEN IF UPI[.SPPED=T THEN BEGIN M2:=NT2;J:=NT1 END;05843000 END; 05843100 IF (I:=I+1) LEQ L THEN GO B ; 05843200 IF P(D)!M1 THEN 05843300 BEGIN 05843400 IF M2=M2:=P(D) THEN IF Z AND T!0 THEN 05843500 C: BEGIN GETUSERDISK~-1; GO G END 05843600 ELSE J~H ; 05843700 J:=J+1; GO E ; 05843800 END; 05843900 IF Z THEN GO C ; 05843950 IF N.[2:1] THEN GO G ; 05844000 $ SET OMIT = NOT(SHAREDISK ) 05844050 $ SET OMIT = SHAREDISK 05844090 FIXARRAY(UT,R,30); USERDISKSPECIALCASE(I:=1,R,UT,NS); GO A ; 05844110 $ POP OMIT 05844111 D:::@0777777777777777 ; 05844200 $ SET OMIT = NOT(SHAREDISK ) 05844290 $ SET OMIT = SHAREDISK 05844915 E: IF (AVS:=(K:=(T:=U[J] AND NUMENTM)+I:=(Z:=U[J].STARTWRD) MOD 30) MOD05844920 30) NEQ 0 THEN AVS:=30-AVS; AVS:=AVS+K; P(M2) ; 05844925 FIXARRAY(UT,R,AVS); DISKWAIT(-R,AVS,Z~Z DIV 30+USERDISKBOTTOM) ; 05844930 M2:=P; P(K-1); NT2:=0; NT3:=K:=U[J].MAXSIZ ; 05844935 $ POP OMIT 05844936 E: IF (NT1~UT[I].DSIZE)>NT2 THEN IF NT1!K THEN NT2~NT1 ELSE K:=0; 05845000 IF NT1}NS THEN IF NT1NS THEN NT2 ELSE NS ; 05845400 GETUSERDISK~UT[H].DEND-M2; I:=P ; 05845500 $ SET OMIT = NOT(SHAREDISK ) 05845590 IF N~NS=0 THEN BEGIN MOVE(I-H,[UT[H+1]],[UT[H]]);U[J].NUMENT~T-1END;05845700 $ SET OMIT = NOT(SHAREDISK ) 05845790 $ SET OMIT = SHAREDISK 05846350 DISKWAIT(R,AVS,Z); 05846360 $ POP OMIT 05846361 $ SET OMIT = NOT(SHAREDISK ) 05846370 $ SET OMIT = SHAREDISK 05846385 FORGETSPACE(R) ; 05846390 G: UNLOCKTOG(USERDISKMASK); 05846395 $ POP OMIT 05846396 W: END OF GETUSERDISK ; 05846500 PROCEDURE FORGETUSERDISK(A,N); VALUE A,N; REAL A,N ; 05846600 % A IS THE ABSOLUTE DISK SEGMENT ADDRESS OF AN AREA N SEGMENTS LONG 05846800 % WHICH IS TO BE MADE AVAILABLE AGAIN. 05846900 % N<0 => MAKE A SCRATCHDIRECTORY DELETION. 05847000 % N>0 => DONT MAKE A SCRATCHDIRECTORY DELETION. 05847100 % N=0 => IMMEDIATELY GO AWAY ; 05847200 BEGIN 05847400 $ SET OMIT = NOT(SHAREDISK ) 05847490 $ SET OMIT = SHAREDISK 05847590 INTEGER AVS,F=AVS; ARRAY UT[*]; DEFINE U=AVTABLE #; 05847600 $ POP OMIT 05847601 REAL E; INTEGER B,C,D,I,J,R,S,H=NT7,K=NT6,L=NT5,G=NT4,T=NT3,Q=JUNK;05847700 LABEL V,W,X,Y,Z,AZ,BZ,CZ,DZ ; 05847800 SUBROUTINE SETSHIFT ; 05847900 BEGIN 05848000 S:=P(XCH) ; 05848100 $ SET OMIT = NOT(SHAREDISK ) 05848190 $ SET OMIT = SHAREDISK 05848250 U[J].STARTWRD:=I+S; G:=D+S; 05848255 $ POP OMIT 05848256 K:=G+C-1; 05848300 END OF SETSHIFT; 05848500 IF N=0 OR (J:=A DIV 1000000) GEQ NEUP.NEUF 05848900 OR A LSS USERDISKBOTTOM+DISKAVAILTABLEMAX THEN GO BZ ; 05849000 SLEEP([TOGLE],USERDISKMASK); LOCKTOG(USERDISKMASK); 05849300 $ SET OMIT = NOT(SHAREDISK ) 05849390 IF (D:=U[0].MAXSIZ) NEQ 0 AND N GTR 0 THEN IF (TWO(J) AND D) NEQ 0 05849420 THEN BEGIN USERDISKSPECIALCASE(3,N,U,A); IF NOT P THEN GO DZ END ; 05849460 J:=J+1 ; 05849480 V: D~(I~(E~U[J]).STARTWRD) MOD 30 ; 05849500 $ SET OMIT = NOT(SHAREDISK ) 05849590 $ SET OMIT = SHAREDISK 05850105 AVS:=30-(S:=(C:=E AND NUMENTM)+D) MOD 30+S ; 05850110 FIXARRAY(UT,R,AVS); DISKWAIT(-R,AVS,B:=I DIV 30+USERDISKBOTTOM) ; 05850120 K:=S; L:=D; S:=I+C ; 05850130 $ POP OMIT 05850131 G~I-(NT2:=(P(U[J-1],DUP) AND NUMENTM)+P(XCH).STARTWRD) ; 05850200 S~U[J+1].STARTWRD-S; H~K~K-1; IF UT[T~L].DEND}A THEN GO X ; 05850300 W: IF UT[T~(H+L+1)DIV 2].DEND}A THEN IF UT[H~T-1].DEND}A THEN GO W ELSE05850400 ELSE IF UT[T~T+1].DEND0 THEN P(DEL,D);05851220 $ POP OMIT 05851221 P(SSN);SETSHIFT;MOVE(C,[UT[G-S]],[UT[G]]);T~Q~T+S; 05851300 END; 05851400 FOR H~K STEP -1 UNTIL T DO UT[H+1]~UT[H]; H~ABS(N); GO AZ ; 05851500 Y: USERDISKSPECIALCASE(2,E,UT,J) ; 05851600 $ SET OMIT = NOT(SHAREDISK ) 05851650 GO V ; 05851675 Z: IF P(UT[Q~Q+1],DUP).DEND=P(XCH).DSIZE{L THEN GO Z ; 05851700 IF P(UT[NT1:=Q-1].DEND,DUP) LSS L THEN P(DEL,L) ; 05851800 H:=(L:=P)-(IF A LSS H THEN A ELSE H) ; 05851850 IF NT1 GTR T THEN MOVE(K-NT1,[UT[Q]],[UT[T+1]]) ; 05851900 AZ: UT[T]~L&H[TODSIZE]; C~(Q~T-Q+1)+C ; 05852000 IF(S~S-Q)>T~IF AVDIFFMAX>T~C DIV 2 THEN AVDIFFMAX ELSE T THEN IF J=105852100 OR S+G>T+(IF AVDIFFMAX>T~NT2 DIV 2 THEN AVDIFFMAX ELSE T) THEN GO Y 05852200 ELSE BEGIN 05852300 IF (NT1~F-1-K)=0 THEN GO Y; 05852350 IF P((S+G) DIV 2,DUP) GTR NT1 THEN P(DEL,NT1);SETSHIFT; 05852400 FOR NT1~K STEP -1 UNTIL G DO UT[NT1]~UT[NT1-S] ; 05852500 END ; 05852600 U[J]~(NT1~U[J])&C[TONUMENT]&(IF E~(NT1~NT1.MAXSIZ) A THEN IF UT[H~T-1].DEND > A THEN GO W05962200 ELSE ELSE IF UT[T~T+1].DEND { A THEN BEGIN L~T+1; GO W END; 05962400 X: IF A GEQ L:=(H:=UT[T].DEND)-(Q:=UT[T].DSIZE) THEN 05962600 IF (LA:=(A+N)) LEQ H THEN GO AZ%AREA AVAILABLE 05962700 ELSE IF LA LEQ SA1:=(UT[T+1].DEND-UT[T+1].DSIZE) THEN 05962800 N:=LA-A:=H ELSE N:=SA1-A:=H ELSE IF (LA:=A+N) GTR L THEN 05962900 N:=L-A ELSE RDT:=RDT OR @100000; 05963000 GO INUSE; 05963100 Y: TMID:=IF RDT THEN "DKTEST " ELSE "BADISK "; 05963800 $ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05963809 STREAM(TMID,FID,N,MID,B,BUFF); 05964000 BEGIN DS:=LIT "."; SI:=LOC TMID; SI:=SI+1; DS:=7 CHR; 05964200 DS:=LIT "/"; SI:=SI-1; DS:=7 CHR; 05964400 DS:=13 LIT " NOT CREATED("; SI:=SI+8; SKIP SB; 05964500 IF SB THEN ELSE 05964600 BEGIN SI:=LOC N; DS:=7 DEC; N:=DI; DI:=DI-7; DS:=7 FILL; 05964800 DI:=N; DS:=5 LIT " SEGS"; SI:=SI+1; 05964900 END; DS:=11 LIT " IN USE BY "; DS:=7 CHR; DS:=LIT"/"; 05965000 SI:=SI+1; DS:=7 CHR; 05965200 DS:=2 LIT")~"; 05965400 END; 05965600 FORGETSPACE(R); 05966100 GO EXIT; 05966110 INUSE: % SEARCH THE DIRECTORY TO FIND THE NAME OF THE CONFLICTING05966200 % FILE. SINCE USERDISK REMAINS LOCKED, DISK ALLOCATION 05966210 % CANNOT CHANGE. HENCE, THE DIRECTORY NEED NOT BE LOCKED.05966220 FORGETSPACE(R); 05966400 FIXARRAY(UT,R,480); 05966600 FOR J:=DIRECTORYTOP+4 STEP 16 WHILE TRUE DO 05967000 BEGIN DISKWAIT(-R,480,J); 05967200 FOR I:=14 STEP -1 UNTIL 0 DO 05967400 BEGIN E:=UT[450+2|I]; 05967600 IF(E EQV @114)=NOT 0 THEN 05967800 BEGIN MID:="SYSTEM "; B:=FID; GO Z; END; 05967900 IF (E EQV @14) NEQ NOT 0 THEN 05968000 BEGIN B:=UT[30|I+9] AND 31; 05968200 FOR K:=1 SETP 1 UNTIL B DO 05968400 IF (C:=UT[30|I+9+K))NEQ 0 THEN 05968600 IF A GEQ C THEN IF A LSS 05968800 SA1:=(C+D:=UT[30|I+8]) THEN 05968900 BEGIN MID:=E&((LA LEQ SA1) AND 05969000 (RDT.[18:15]))[1:47:1]; 05969100 IF A+N GTR SA1 THEN N~SA1-A; 05969150 B:=UT[451+2|I]; 05969200 GO TO Z; 05969400 END; 05969600 END; 05969800 END; 05970000 END; 05970200 Z: 05970300 $ SET OMIT = NOT SHAREDISK 05970390 UNLOCKTOG(USERDISKMASK); 05970500 GO TO Y; 05970600 AZ: IF A NEQ L AND LA NEQ H THEN 05970800 BEGIN IF S=0 THEN 05971000 $ SET OMIT = NOT (SHAREDISK) 05971005 $ SET OMIT = SHAREDISK 05971095 BEGIN IF G=0 OR D=0 THEN 05971200 BEGIN USERDISKSPECIALCASE(2,E,UT,J); GO TO BZ END; 05971400 S:=IF P((G+1) DIV 2,DUP) > D THEN P(DEL,D) ELSE P; 05971600 U[J].STARTWRD:=I-S; G:=D-S; K:=G+C-1; 05971800 $ POP OMIT 05971801 MOVE(C,[UT[D]],[UT[G]]); T:=T-S; 05972000 END; 05972200 FOR G:=K STEP -1 UNTIL T DO UT[G+1]:=UT[G]; 05972400 UT[T]:=A&(A-L)[TODSIZE]; 05972600 UT[T+1]:=H&(H-LA)[TODSIZE]; 05972800 C:=C+1; 05973000 K ~ K+1; 05973100 END ELSE 05973200 IF A=L AND LA=H THEN 05973400 BEGIN C:=C-1; MOVE(K-T,[UT[T+1]],[UT[T]]); K:=K-1 END 05973600 ELSE UT[T]:=(IF A=L THEN H ELSE A)&(Q-N)[TODSIZE]; 05973800 U[J].NUMENT:=C; 05974000 IF Q=U[J].MAXSIZ THEN 05974200 BEGIN Q:=UT[H:=K-C+1].DSIZE; 05974400 FOR H:=H STEP 1 UNTIL K DO 05974600 IF P(UT[H].DSIZE,DUP) GTR Q THEN Q:=P ELSE P(DEL); 05974800 U[J].MAXSIZ:=Q; 05975000 END; 05975200 MID:=IF RDT THEN "DKTEST " ELSE "BADISK "; 05975400 $ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05975404 $ SET OMIT = NOT(SHAREDISK) 05975410 $ SET OMIT = SHAREDISK 05975595 DISKWAIT(R,AVS,B); 05975600 $ POP OMIT 05975601 UNLOCKTOG(USERDISKMASK); 05975610 FORGETSPACE(R); 05975620 CZ: ENTERFILE; 05975630 GO EXIT; 05975640 XDFILE: 05975700 IF (HEADER:=DIRECTORYSEARCH(TMID,NFLAG(-TFID OR M),4)) LSS 64 THEN 05975750 BEGIN 05975800 TYPE:=HEADER; 05975850 GO MSG; 05975900 END; 05975950 HA~HEADER.[FF]; 05976000 HDR~[M[HEADER~HEADER INX 0]) & 30[8:38:10]; 05976050 MID~-"BADISK "; 05976100 S~HDR[8]; % SEGMENTS PER ROW 05976150 IF A!0 THEN 05976200 BEGIN 05976250 FOR I!HDR[9] STEP -1 UNTIL 1 DO 05976300 IF (LA~HDR[I+9])!0 THEN 05976350 IF A GEQ LA AND A LSS LA+S THEN % FOUND ROW 05976400 IF A+N LEQ LA+S THEN GO FOUND ELSE GO CONFLICT; 05976450 TYPE~4; 05976500 IF FALSE THEN 05976550 BEGIN 05976600 CONFLICT: TYPE~3; 05976650 SEGS~A+N-LA-S; 05976700 END; 05976750 HEADERUNLOCK(TMID,TFID,HEADER&HA[CTF]); 05976800 GO MSG; 05976850 FOUND: 05976900 HDR[I+9]~0; 05976950 DISKWAIT(HEADER,30,HA); 05977000 IF (I~A-LA) GTR 0 THEN FORGETUSERDISK(LA,I); 05977050 IF (I~LA+S-(LA~A+N)) GTR 0 THEN FORGETUSERDISK(LA,I); 05977100 $ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05977124 ENTERFILE; 05977150 GO FINIS; 05977200 END; 05977250 N~S; SEGS~0; 05977300 FOR I~HDR[9] STEP -1 UNTIL 1 DO 05977350 IF (A~HDR[I+9])!0 THEN 05977400 BEGIN 05977450 HDR[I+9]~0; 05977500 DISKWAIT(HEADER,30,HA); 05977550 WORD~A; FID~DECWORD; 05977600 $ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05977624 ENTERFILE; 05977650 SEGS~SEGS+N; 05977700 END; 05977750 FINIS: 05977800 FORGETSPACE(HEADER); 05977850 P(DIRECTORYSEARCH(-TMID,TFID,6),DEL); 05977900 TYPE~5; 05977950 MSG: 05978000 STREAM(TMID,TFID,SEGS,A,TYPE,BUFF); 05978050 BEGIN 05978100 SI~LOC SEGS; DI~LOC SEGS; DS~8DEC; DS~8DEC; 05978150 DI~LOC SEGS; DS~8FILL; DI~LOC A; DS~8 FILL; DI~BUFF; 05978200 DS~LIT","; SI~LOC TMID; SI~SI+1; DS~7CHR; 05978250 DS~LIT"/"; SI~SI+1; DS~7CHR; 05978300 DS~11 LIT" NOT XD-ED("; 05978350 CI~CI+TYPE; 05978400 GO T0; GO T1; GO T2; GO T3; GO T4; GO T5; 05978450 T0: DS~11 LIT"NOT ON DISK"; GO EXT; 05978500 T3: DS~8 CHR; DS~6 LIT" SEGS "; 05978550 T1: DS~6 LIT"IN USE"; GO EXT; 05978600 T2: DS~11 LIT"SYSTEM FILE"; GO EXT; 05978650 T4: SI~SI+8; DS~8 CHR; 05978700 DS~12 LIT" NOT IN FILE"; GO EXT; 05978750 T5: DI~DI-11; 05978800 DS~6 LIT" SEGS="; DS~8 CHR; DS~7 LIT" XD-ED~"; 05978850 TYPE~DI; DI~BUFF; DS~LIT" "; DI~TYPE; GO EXT; 05978900 EXT: DS~2 LIT")~"; 05978950 END STREAM; 05979000 A~1; N~SEGS; % FOR LOGGING 05979050 GO EXIT; 05979100 EXIT: 05979310 IF A!0 THEN 05979320 BEGIN 05979330 B~BUFF; 05979340 MLOGIT; 05979350 END; 05979360 IF RDT THEN M[SLEEPER INX 0] :=1 ELSE SPOUT(BUFF); 05979400 BUFF:=0; IF MSCW NEQ 1 THEN KILL([MSCW]); % CALLED AS IND. RUNNER 05979500 END; 05979600 SAVE PROCEDURE DISKIO(LOCIOD,CORE,SIZE,DISK);% 06000000 VALUE CORE,SIZE,DISK;% 06001000 REAL LOCIOD;% 06002000 INTEGER CORE,SIZE,DISK;% 06003000 BEGIN REAL IOD, OLAYIO, FIN; 06004000 OLAYIO := SIZE.[3:1]; SIZE.[3:1] := 0; 06004010 CORE:=CORE; SIZE:=SIZE; DISK:=DISK; % INTEGERIZE %645-06004100 IF DISK.[1:1] THEN 06005000 BEGIN % AUXILIARY MEMORY 06006000 $ SET OMIT = NOT(AUXMEM) 06006999 $ SET OMIT = AUXMEM 06009200 PUNT(NVLDAUXIO); 06009300 $ POP OMIT 06009400 END 06009500 ELSE BEGIN IOD := ABS(CORE) & SIZE[8:38:10] 06010000 & ((SIZE INX 29) DIV 30 +@1000)[CTF] 06011000 & CORE[24:1:1] & 3[5:46:2]; 06012000 $ SET OMIT = NOT(SHAREDISK) 06012499 STREAM(DISK,D:=CORE.[CF]); 06013000 BEGIN SI ~ LOC DISK; DS ~ 8 DEC END;% 06014000 SIZE ~ 2;% 06015000 END;% 06016000 FIN:=IF OLAYIO THEN IOD&DISK[CTC]&DISK[8:21:12] ELSE IOD; 06016100 % ACTUAL DISK ADDRESS IN FINALQUE FOR OLAY I/O-S 06016200 IOREQUEST(NABS(FIN)&@377[25:40:8],IOD,[LOCIOD]&% 06017000 (SIZE+16)[12:42:6]&OLAYIO[9:47:1]); 06018000 LOCIOD ~ 0;% 06019000 END DISKIO;% 06020000 PROCEDURE FORGETESPDISK(SEGMENT); VALUE SEGMENT; REAL SEGMENT; FORWARD; 06020500 REAL PROCEDURE GETESPDISK;% 06021000 BEGIN REAL T=NT1; 06022000 IF ESPCOUNT=0 THEN 06022100 BEGIN 06022200 STREAM(D:=T:=SPACE(2)); 06022300 DS~12 LIT " NO ESPDISK~"; 06022400 SPOUT(T); 06022500 SLEEP([ESPCOUNT],NOT 0); 06022600 END; 06022700 STREAM(T~0,A~ESPTAB:X~0); 06023000 BEGIN SI~A; 06024000 L1: IF SC=""" THEN BEGIN SI~SI+1; GO TO L1 END; 06025000 A~SI; DI~A; 06026000 L2: IF SB THEN 06027000 BEGIN TALLY~TALLY+1; SKIP SB; SKIP DB; GO TO L2 END; 06028000 T~TALLY; DS~SET; 06029000 END; 06030000 GETESPDISK~((P(DUP).[CF]-ESPTAB)|8 06031000 +P(XCH).[30:3])|6+P+ESPDISKBOTTOM; 06032000 ESPCOUNT~ESPCOUNT-1; 06033000 END; 06033100 PROCEDURE FORGETESPDISK(SEGMENT); VALUE SEGMENT; REAL SEGMENT;% 06036000 BEGIN REAL S,T; 06037000 IF SEGMENT LSS ESPDISKBOTTOM OR 06037100 SEGMENT GTR ESPDISKTOP THEN 06037200 BYBY("ESPDISK ERROR~",14); 06037300 T:=(S:=(T:=SEGMENT-ESPDISKBOTTOM) DIV 6)|6-T; 06037700 S~S.[30:15]&S[30:45:3]|ESPTAB; 06038000 STREAM(T,S); BEGIN SKIP T DB; DS~RESET END; 06038100 ESPCOUNT~ESPCOUNT+1; 06038200 END;% 06039000 $ SET OMIT = NOT(DEBUGGING) 06045999 REAL SCHEDULEIDS; % A BIT IN POSITION X MEANS THAT THERE IS A JOB IN THE06056099 % SCHEDULE(SHEET) WITH SCHEDULE-ID X. USED BY COM5, 06056100 % SELECTRUN AND CCFINISH. 06056200 $ SET OMIT = NOT(SHAREDISK) 06057000 SAVE PROCEDURE DISKWAIT(CORE,SIZE,DISK); 06061500 VALUE CORE,SIZE,DISK; 06062000 REAL CORE,SIZE,DISK; 06063000 BEGIN REAL T; 06064000 DISKIO(T,(ABS(CORE)-1)&CORE[1:1:1],SIZE,DISK); 06065000 SLEEP([T],IOMASK); 06066000 END; 06067000 PROCEDURE DISKSQUASH(BUFF); 06068000 VALUE BUFF; REAL BUFF; 06068100 BEGIN 06068200 REAL RCW=+0, B=+1, E=B+1, F=E+1, R=F+1, HI=R+1, LO=HI+1, 06068300 MSCW=-2, 06068350 CNT=LO+1, USE=CNT+1, TOG=USE+1, IOD=TOG+1; 06068400 REAL T=IOD+1, SUM=T; 06068500 REAL A1= T+1, A2=A1+1, A3=A2+1, A4=A3+1, A5=A4+1; % ARRAY VARIABLES 06068600 REAL X1=A5+1, X2=X1+1, X3=X2+1, X4=X3+1, X5=X4+1; % SCRATCH VARIABLES 06068700 REAL LOCIOD=X4, HICNT=X4, LSTCNT=X5; 06068800 BOOLEAN CONFLICT=X5+1, PASTWO=CONFLICT+1, EUNOTSQUASHED=PASSTWO+1, 06068900 FILEOK=EUNOTSQUASHED+1, SQALL=FILEOK+1; 06069000 INTEGER C=SQALL+1, D=C+1, I=D+1, S=I+1, EU=S+1, AV=EU+1, 06069100 AVSIZE=AV+1, DISKAV=AVSIZE+1, SQSIZE=DISKAV+1; 06069200 ARRAY UT=SQSIZE+1[*], MV=UT+1[*], DIR=MV+1[*], EUS=DIR+1[*]; 06069300 REAL PRTADDR=EUS+1, PRTVALUE=PRTADDR+1; 06069400 $ SET OMIT = NOT SHAREDISK 06069500 LABEL SCAN, SPOUTER,CK,OKINUSE,NOTOK,OKBOUNDS,MVEMORE,MVE, 06069900 ENDMVE,AGAIN,OK,NEXT,SQIT,STOPSQ,STOPIT,SDXIT,OUT,FIXMV; 06070000 DEFINE 06070100 $ SET OMIT = SHAREDISK 06070200 U = AVTABLE#, 06070300 $ POP OMIT 06070400 LINK = [12:10]#, 06070500 ASIZE = [3:19]#, 06070600 LOCKED = [2:1]#, 06070700 FACTOR = 10000#, 06070800 MINSIZE = 10#, 06070900 MAXMVSIZE = 900#, 06071000 KEYINMASK = [18:15]#; 06071100 COMMENT 06071200 FACTOR: THE MAXIMUM SEPARATION, IN SEGMENTS, ALLOWED 06071300 BETWEEN TWO AVAILABLE AREAS WHICH ARE TO BE 06071400 SQUASHED. IN GENERAL, FACTOR SHOULD NOT BE MADE 06071500 LARGER THAN THE CAPACITY OFA 20 ML SUBMOD,I.E., 06071600 10,000 SEGMENTS. 06071700 MINSIZE: THE MINIMUM SIZE, IN SEGMENTS, ALLOWED FOR AN 06071800 AVAILABLE AREA TO BE CONSIDERED AS A CANDIDATE 06071900 FOR SQUASHING. MINSIZE MAY BE MADE AS SMALL AS 06072000 ONE, BUT AS SQUASH TIME VARIES INVERSLY WITH 06072100 MINSIZE, SMALLER VALUES WILL INCREASE SQUASH- 06072200 ING TIME PROPORTIONALLY. MINSIZE LIMITA- 06072300 TIONS MAY BE OVERRIDEN BY THE LOOKAHEAD 06072400 FACILITY. 06072500 MAXMVSIZE: LIMITS THE NUMBER OF INDIVIDUAL AREAS IN AN 06072600 IN-USE AREA TO BE AT MOST MAXMVSIZE/3 AREAS 06072700 FOR SQUASHING TO OCCUR. 06072800 NOTE: 06072900 1) MAXMVSIZE MUST BE LESS THAN 1024, 06073000 2) MAXMVSIZE MUST BE A MULTIPLE OF 3. ; 06073100 DEFINE CELL = M[PRTADDR]#, 06073200 STOP = M[PRTADDR]#, 06073300 STOPCK = IF M[PRTADDR] THEN GO STOPSQ#, 06073400 MOVEABLE = NOT DIR[X3+4].[42:1]#, 06073500 TEMPDSK = MV[I+2].[1;1]#; 06073600 SUBROUTINE SQUASHMESS; 06073700 BEGIN 06073800 IF (X1:=P(XCH))>1 THEN X3:=IF SQSIZE!0 THEN SQSIZE 06073900 ELSE EUS[EU-1].DSIZE; 06074000 STREAM(A:=EU-1,B:=X1,C:=X3,C1:=0,C2:=0,CX:=0, 06074100 NOSQ:=EUNOTSQUASHED, X2:=X2:=SPACE(10)); 06074200 BEGIN 06074300 C1:=CI; GO TO L0; 06074400 SI:=LOC A; DS:=4 LIT" EU"; DS:=2 DEC; 06074500 A:=DI; DI:=DI-2; DS:=FILL; DS:=A; CI:=CX; 06074600 L0: C2:=CI; GO TO L2; DS:=4 LIT"NULL"; CI:=CX; 06074700 L1: DS:=7 LIT" SQUASH"; CI:=CX; 06074800 L2: CI:=CI+B; 06074900 GO TO LL0; GO TO LL0; GO TO LL2; TO TO LL2; 06075000 LL0: CX:=CI; CI:=C1; 06075100 N(NOSQ(DS:=LIT" "; CX:=CI; CI:=C2)); 06075200 CX:=CI; GO TO L1; 06075300 B(NOSQ(JUMP OUT 2 TO LL1); DS:=2 LIT"ED"; 06075400 JUMP OUT TO LL1); 06075500 DS:=3 LIT"ING"; 06075600 LL1: GO TO EXT; 06075700 LL2: DS:=LIT" "; CX:=C1; CI:=C2; 06075800 CX:=CI; GO TO L1; 06075900 SI:=B; 2(SI:=SI-8); B:=SI; 06076000 B(CX:=CI; CI:=C1); 06076100 DS:=2 LIT" ("; SI:=LOC C; 06076200 DS:=6 DEC; C:=DI; DI:=DI-6; DS:=5 FILL; DI:=C; 06076300 DS:=19 LIT" SEGMENTS AVAILABLE"; 06076400 B(JUMP OUT TO LL3); DS:=4 LIT" ON "; 06076500 CX:=CI; CI:=C1; 06076600 LL3: DS:=LIT")"; 06076700 EXT: DS:=LIT"~"; 06076800 END; 06076900 SPOUT(X2); 06077000 END PRINTING MESSAGES; 06077100 SUBROUTINE SCANMESSAGE; 06077200 BEGIN 06077300 X1:=(X5:=NEUP.[FF])-1; X2:=BUFF.[30:18]; 06077400 FIXARRAY(EUS,A5,X5); 06077500 MOVE(X5,A5-1,A5); 06077600 X5:=-1; % WILL BE GEQ ZERO AFTER FIRST PASS THRU SCAN 06077700 SCAN: 06077800 STREAM(A:=0,SIZ:=0,EU1:=-1,EU2:=-1,ERRTOG:=0:NO:=0, 06077900 B:=X5<0,EU:=@2564000000000000,CX:=0,C1:=0, 06078000 C2:=0,KTR:=X2); 06078100 BEGIN 06078200 C1:=CI; GO TO L2; 06078300 IF SC<0 THEN 06078400 A0: BEGIN TALLY:=1; NO:=TALLY; CI:=CX END; 06078500 IF SC=12 THEN GO TO A0; 06078600 DI:=LOC SIZ; 06078700 L1: IF SC GEQ 0 THEN IF SC<12 THEN 06078800 BEGIN 06078900 TALLY:=TALLY+1; 06079000 SI:=SI+1; 06079100 GO TO L1; 06079200 END; 06079300 NO:=TALLY; 06079400 SI:=SI-NO; 06079500 DS:=NO OCT; 06079600 TALLY:=0; NO:=TALLY; 06079700 CI:=CX; 06079800 L2: C2:=CI; GO TO STR; 06079900 TALLY:=1; DI:=LOC EU; 06080000 IF 2 SC=DC THEN % AN EU SPECIFIED 06080100 BEGIN 06080200 CX:=CI; GO TO L3; 06080300 IF SC GEQ 0 THEN IF SC<12 THEN 06080400 BEGIN 06080500 SI:=SI+1; DI:=LOC EU1; 06080600 IF SC GEQ 0 THEN IF SC<12 THEN 06080700 TALLY:=2 ELSE GO TO A1; 06080800 SI:=SI-1; NO:=TALLY; 06080900 DS:=NO OCT; TALLY:=0; 06081000 END ELSE GO TO A1; 06081100 END; 06081200 NO:=TALLY; CI:=A; 06081300 CI:=A; 06081400 L3: IF SC=" " THEN BEGIN SI:=SI+1; GO TO L3 END; CI:=CX; 06081500 STR: SI:=KTR; CI:=CI+B; GO TO L5; GO TO L4; 06081600 L4: IF SC="~" THEN GO TO EXT; 06081700 CX:=CI; CI:=C1; % SIZE CHECK 06081800 NO(JUMP OUT TO L5); 06081900 CX:=CI; GO TO L3; 06082000 IF SC!"~" THEN 06082100 A1: GO TO ERR; 06082200 GO EXT; 06082300 L5: A:=CI; CI:=C2; % EU CHECK 06082400 NO(JUMP OUT TO ERR); 06082500 IF SC="-" THEN 06082600 BEGIN 06082700 SI:=SI+1; CX:=CI; GO TO L3; 06082800 CX:=CI; CI:=C1; % SIZE CHECK 06082900 NO(JUMP OUT TO L6); GO TO L7; 06083000 L6: TALLY:=EU1; EU2:=TALLY; 06083100 A:= CI; CI:=C2; % EU CHECK 06083200 NO(JUMP OUT TO ERR); 06083300 END; 06083400 L7: A:=TALLY; % ZERO OUT A 06083500 IF SC="~" THEN GO TO EXT; 06083600 IF SC="," THEN 06083700 BEGIN SI:=SI+1; A:=SI; GO EXT END; 06083800 ERR: TALLY:=1; ERRTOG:=TALLY; 06083900 EXT: 06084000 END; 06084100 IF P THEN % ERROR IN INPUT MESSAGE 06084200 BEGIN 06084300 SPOUTERR: 06084400 SPOUT(P(BUFF.[15:15]-1,DUP)&M[P-1][9:9:9]); 06084500 FORGETSPACE(A5); 06084600 P(XIT); 06084700 END; 06084800 IF (X3:=P) GEQ 0 THEN % AN EU RANGE SPECIFIED. 06084900 BEGIN 06085000 IF (X4:=P)>X1 OR X3X1 THEN GO SPOUTERR ELSE 06085600 EUS[X4]:=1&X5[TODSIZE] ELSE IF X5=0 THEN SQALL:=1 06085700 ELSE SQSIZE:=X5; 06085800 CK: IF (XS:=P)!0 THEN GO SCAN; % NOT FINISHED YET 06085900 END SCANNING INPUT MESSAGE; 06086000 SUBROUTINE FIXANDWRITEHEADER; 06086100 BEGIN 06086200 M[A4+9+X2.[28:5]]:=C; 06086300 DISKWAIT(A4,30,X2.[CF]); 06086400 END WRITING NEW HEADER; 06086500 SUBROUTINE BOUNDARYCK; 06086600 BEGIN 06086700 LSTCNT:=0; M[X2-1]:=-1; 06086800 MVEMORE: 06086900 X3:=HICNT:=0; STOPCK; 06087000 FOR I:=CNT SETP -3 UNTIL 0 DO 06087100 IF P(MV[I],DUP).DEND>X3 AND P(XCH)>0 THEN 06087200 BEGIN X3:=MV[I].DEND; HICNT:=I END; 06087300 IF X3=0 THEN % RE-ORDERING OF MV ARRAY COMPLETE 06087400 BEGIN 06087500 MV[LSTCNT+2].LINK:=@1777; 06087600 GO OKBOUNDS; 06087700 END; 06087800 IF M[A2-1]<0 THEN M[A2-1]:=HICNT ELSE MV[LSTCNT+2].LINK:=HICNT; 06087900 MV[LSTCNT:=HICNT]:=NABS(*P(DUP)); 06088000 MV[HICNT+1].[2:26]:=HI; 06088100 HI:=HI-(X3:=MV[HICNT].DSIZE); 06088200 IF X3 LEQ UT[AV+1].ASIZE THEN 06088300 OK: BEGIN 06088400 MV[HICNT+2]:=0; 06088500 GO MVEMORE; 06088600 END ELSE 06088700 BEGIN % LOOKING FOR TEMPORARY STORAGE 06088800 FOR I:=S-2 STEP -1 UNTIL D DO 06088900 IF X3 LEQ UT[I].ASIZE THEN 06089000 IF NOT UT[I].LOCKED THEN % OK FOR TEMP STORAGE 06089100 BEGIN 06089200 MV[HICNT+2]:=UT[I].DEND&I[2:38:10]; 06089300 GO MVEMORE; 06089400 END; 06089500 END; 06089600 IF PASSTWO THEN % NON-PROTECTED FILE TRANSFER 06089700 BEGIN 06089800 DISKWAIT(-A4,30,MV[HICNT+2].[CF]); 06089900 STREAM(A:=[M[A4+MV[HICNT+2].[FF]]],X2:=X2:=SPACE(6)); 06090000 BEGIN 06090100 DS:=27 LIT" #FILE INTEGRITY CONFLICT: "; SI:=A; 06090200 SI:=SI+1; DS:=7 CHR; DS:=LIT"/"; SI:=SI+1; 06090300 DS:=7 CHR; DS:=LIT"~"; 06090400 END; 06090500 SPOUT(X2); CELL.KEYINMASK:=7; 06090600 SLEEP((PRTADR INX M),@77777); STOPCK; 06090700 IF CELL=2 THEN BEGIN CELL:=0&1[CTF]; GO TO OK END; 06090800 END ELSE CONFLICT:=TRUE; 06090900 TOG:=0; 06091000 OKBOUNDS: 06091100 END BOUNDARY AND CONFLICT CHECKING; 06091200 BOOLEAN SUBROUTINE INUSEOK; 06091300 BEGIN 06091400 UT[AV+1].[1:1]:= NOT PASSTWO; TOG:=1; CNT:=0; 06091500 FOR X1:=DIRECTORYTOP+4 STEP 16 WHILE TRUE DO 06091600 BEGIN STOPCK; 06091700 DISKWAIT(-A1,480,X1); 06091800 FOR I:=14 STEP -1 UNTIL 0 DO 06091900 BEGIN STOPCK; 06092000 IF((E:=DIR[450+P(I,DUP,+)]) EQV @114)=NOT 0 THEN 06092100 GO TO NOTOK; 06092200 IF (E EQV @14)! NOT 0 THEN 06092300 BEGIN FILEOK:=FALSE; % INITIATE STATUS CHECKING 06092400 B:=DIR[(X3:=30|I)+9].[43:5]; 06092500 FOR X2:=1 STEP 1 UNTIL B DO 06092600 IF (C:=DIR[X3+9+X2])!0 THEN 06092700 IF P(C,DUP)LO THEN 06092800 IF FILEOK THEN GO FIXMV ELSE % CHECK STATUS 06092900 IF NOT SYSTEMFILE(E,DIR[450+P(I,DUP,+)+1]) AND 06093000 DIR[X3+4].[12:4]=0 THEN % NOT SYSTEM FILE 06093100 IF (P(DIR[X3+4],DUP).[1:3] OR P(XCH).[16:20] OR 06093200 DIR[X3+9].[1:28])=0 THEN % FILE NOT IN USE 06093300 IF MOVEABLE THEN % NOT PERMANENT 06093400 BEGIN 06093500 FILEOK:=TRUE; % ELIMINATE STATUS CHECKING 06093600 FIXMV: USE:=USE-(MV[CNT]:=C&DIR[X3+8][TODSIZE]) 06093700 .DSIZE; 06093800 MV[CNT+1]:=(X1+I)&X2[CTF]; % HEADER INFO 06093900 IF PASSTWO THEN % SAVE LOC OF FIDS 06094000 MV[CNT+2]:=(X1+15)&(I|2)[CTF]; 06094100 IF USE=0 THEN % FOUND ALL USERS OF IN-USE AREA 06094200 BEGIN 06094300 BOUNDARYCK; 06094400 GO OKINUSE; 06094500 END; 06094600 IF USE<0 THEN GO TO NOTOK; % DIERCTORY ERROR 06094700 IF (CNT:=CNT+3) MOD 150 = 0 THEN 06094800 BEGIN 06094900 IF CNT=MAXMVSIZE THEN GO TO NOTOK; 06095000 FIXARRAY(MV,X4,(CNT+150)); 06095100 MOVE(CNT,A2,X4); 06095200 FORGETSPACE(A2); 06095300 A2:=X4; 06095400 END; 06095500 END ELSE GO TO NEXT ELSE GO TO NEXT; 06095600 END; 06095700 NEXT: END; 06095800 END; 06095900 NOTOK: 06096000 TOG:=0; 06096100 OKINUSE: 06096200 INUSEOK:=TOG; 06096300 END SEARCHING IN USE AREAS; 06096400 SUBROUTINE MOVEANDFIX; 06096500 BEGIN 06096600 I:=M[X2-1]; STOPCK; 06096700 WHILE I<@1777 DO 06096800 BEGIN 06096900 DISKWAIT(-A4,30,(X2:=MV[I+1]).[CF]); % READ IN HEADER 06097000 MVE: X1:=-30; F:=P(MV[I],DUP).DEND+(B:=P(XCH).ASIZE); 06097100 IF P(MV[I+2].DEND=0,DUP) THEN C:=MV[I+1].[2:26] ELSE 06097200 MV[I].DEND:=(C:=MV[I+2].DEND)-B; 06097300 WHILE (X1:=X1+30)USE THEN USE:=P ELSE P(DEL); 06101100 U[EU]:=P(DUP,LOD,DUP)&USE[1:28:20]&(P(XCH).NUMENT-1)[TONUMENT]; 06101200 EUNOTSQUASHED:=FALSE; 06101300 IF NOT SQALL THEN 06101400 BEGIN 06101500 IF P(SQSIZE,DUP)!0 AND P(XCH) LEQ USE THEN CELL:=1 06101600 ELSE IF P(EUS[EU-1],DSIZE,DUP)!0 AND P(XCH) LEQ USE 06101700 THEN ELSE GO TO ENDMVE; 06101800 P(DEL); GO STOPSQ; 06101900 END; 06102000 ENDMVE: 06102100 END FIXING AND MOVING; 06102200 $ SET OMIT = NOT SHAREDISK 06102220 P(0,0,0,0,0,0,0,0,0,0); 06102500 P(0,0,0,0,0,0,0,0,0,0); 06102600 P(0,0,0,0,0,0,0,0,0,0); 06102700 P(0,0,0,0,0,0,0,0,0); 06102800 P(.DISKSQUASH,DUP,M[(P)]); % PRTADDR,PRTVALUE 06102900 $ SET OMIT = NOT SHAREDISK 06103000 SCANMESSAGE; 06103300 $ SET OMIT = SHAREDISK 06103400 LOCKDIRECTORY; 06103500 $ POP OMIT 06103600 SLEEP([TOGLE],USERDISKMASK); LOCKTOG(USERDISKMASK); 06103700 HALT; % STOP NORMAL STATE PROCESSING WHILE SQUASHING 06103800 A4:=SPACE(30); 06103900 $ SET OMIT = NOT SHAREDISK 06104000 FIXARRAY(DIR,A1,480); FIXARRAY(MV,A2,150); 06107200 A3:=SPACE(900); 06107300 IOD:=@140000100000000&(A3-1)[CTC]; 06107400 IF NOT SQALL THEN FOR EU:=1 STEP 1 UNTIL NEUP.[FF] DO 06107900 IF (CELL:=(P(SQSIZE,DUP)!0 AND P(XCH) LEQ U[EU].[1:20])) 06108000 THEN BEGIN P(2); SQUASHMESS; GO STOPIT END; 06108100 FOR EU:=1 STEP 1 UNTIL NEUP.[FF] DO % 06108200 IF NOT (E:=U[EU]).EUNP THEN % NOT A DUMMY EU 06108300 IF EUS[EU-1] OR SQALL OR SQSIZE!0 THEN % SQUASH THIS EU 06108400 BEGIN 06108500 EUNOTSQUASHED:=TRUE; 06108600 IF NOT SQALL THEN % CHECK IF SQUASH IS NECESSARY 06108700 IF (P(EUS[EU-1].DSIZE,DUP) LEQ E.[1:20] AND P(XCH)!0) 06108800 THEN BEGIN P(3); SQUASHMESS; GO STOPIT END; 06108900 CELL:=0&1[CTF]; 06109000 P(0); SQUASHMESS; 06109100 D:=(I:=E.STARTWRD) MOD 30; 06109200 AVSIZE:=30-(S:=(E AND NUMENTM)+D) MOD 30+S; 06109300 FIXARRAY(UT,R,AVSIZE); 06109400 DISKAV:=I DIV 30+USERDISKBOTTOM; 06109500 $ SET OMIT = NOT SHAREDISK 06109600 DISKWAIT(-R,AVSIZE,DISKAV); 06110300 AGAIN: SUM:=USE:=0; 06110400 FOR I:=S-3 STEP -1 UNTIL D DO 06110500 BEGIN STOPCK; 06110600 IF (UT[I+1]<0)=PASSTWO THEN % NOT CHECKED THIS PASS 06110700 IF ((X1:=UT[I].ASIZE)+(X2:=UT[I+1].ASIZE)) GEQ SUM 06110800 THEN IF (X3:=(((X4:=UT[I+1].DEND)-1)-UT[I+1].ASIZE)- 06110900 X5:=(UT[I].DEND-1)) LEQ FACTOR THEN IF MINSIZE LEQ X2 06111000 THEN IF MINSIZE LEQ X1 THEN 06111100 BEGIN 06111200 SQIT: USE:=X3; AV:=I; 06111300 SUM:=X1-X2; % SUM OF CURRENT AVAILABLE AREAS 06111400 HI:=X4; LO:=X5; 06111500 END ELSE IF I!0 THEN % LOOK AHEAD TO NEXT AREA 06111600 IF ((MINSIZE LEQ UT[I-1].ASIZE) AND (((X5-X1)- 06111700 UT[I-1].DEND-1) LEQ FACTOR)) THEN GO SQIT; 06111800 END; 06111900 IF USE!0 THEN % FOUND A POSSIBLE SQUASH SITUATION 06112000 BEGIN 06112100 IF INUSEOK THEN MOVEANDFIX; 06112200 GO AGAIN; 06112300 END ELSE % TIME TO WRAP IT UP FOR THIS EU UNLESS.... 06112400 IF CONFLICT THEN IF NOT PASSTWO THEN % ..CONFLICTS EXIST 06112500 BEGIN 06112600 PASSTWO:=TRUE; 06112700 GO AGAIN; 06112800 END ELSE 06112900 BEGIN % CLEAN-UP PASS AFTER CONFLICTS RESOLVED. 06113000 PASSTWO:=CONFLICTS:=0; 06113100 GO AGAIN; 06113200 END; 06113300 STOPSQ: FOR I:=D STEP 1 UNTIL S DO UT[I]:=ABS(P(DUP.LOD)&0[2:2:1]); 06113400 IF NOT EUNOTSQUASHED THEN 06113500 $ SET OMIT = NOT SHAREDISK 06113600 DISKWAIT( R,AVSIZ,DISKAV); 06114300 FORGETSPACE(R); 06114400 P(1); SQUASHMESS; 06114500 STOPIT: IF STOP THEN GO OUT; % STOPCK GOT US HERE 06114600 END EU LOOP; 06114700 OUT: 06114800 FORGETSPACE(A1); FORGETSPACE(A2); FORGETSPACE(A3); 06114900 $ SET OMIT = NOT SHAREDISK 06115000 SDXIT: 06115500 FORGETSPACE(A4); FORGETSPACE(A5); 06115600 CELL:=PRTVALUE; 06115700 STREAM(A:=BUFF.[15:15]-1); DS:=13 LIT" END SQUASH.~"; 06115800 SPOUT(BUFF.[15:15]-1); 06115900 $ SET OMIT = SHAREDISK 06115990 UNLOCKDIRECTORY; 06116000 $ POP OMIT 06116010 UNLOCKTOG(USERDISKMASK); 06116100 NOPROCESSTOG:=NOPROCESSTOG-1; 06116200 KILL([MSCW]); 06116300 END SQUASHING; 06116400 PROCEDURE CHANGEABORT(X); VALUE X; REAL X; FORWARD;% 06179000 REAL LOOKQ; 06179200 PROCEDURE SIGNOFF(VECTOR,FILEBLOCK,PKT); 06180000 VALUE VECTOR,FILEBLOCK,PKT; 06181000 ARRAY VECTOR[*],FILEBLOCK[*];% 06182000 REAL PKT; 06182100 BEGIN ARRAY NAME LOG; 06183000 INTEGER N,L,I,J,TIMEX;% 06184000 INTEGER MIX; 06184100 $ SET OMIT = NOT STATISTICS 06184199 REAL TIMEAX,T,A,Q,ESED; 06185000 $ SET OMIT = NOT(PACKETS) 06185099 REAL UNITNO; 06185100 INTEGER ARRAY PM[*]; 06185105 $ POP OMIT 06185110 $ SET OMIT = NOT(WORKSET AND WORKSETMONITOR) 06185111 REAL DD; 06185112 $ POP OMIT % WORKSET AND WORKSETMONITOR 06185113 SUBROUTINE TIMEIT;% 06186000 BEGIN CHANGEABORT(0);% 06187000 WHILE (NT2:=XCLOCK+P(RTR)) GEQ WITCHINGHOUR DO 06188000 MIDNIGHT; 06188100 LOG[TIMEAX+2] ~ NT2;% 06189000 $ SET OMIT = NOT(STATISTICS) 06189099 STOPLOG(P1MIX,0); 06190000 MIX~P1MIX; P1MIX~0; 06190100 IDLETIME;% 06191000 OLDIDLETIME ~ (LOG[TIMEX] ~ VECTOR[3]+% 06192000 PROCTIME[MIX])+OLDIDLETIME; 06193000 PROCTIME[MIX] ~ -VECTOR[3];% %127-06193500 LOG[TIMEX+1]~VECTOR[4]+IOTIME[MIX]; 06194000 $ SET OMIT = NOT WORKSET 06194890 LOG[TIMEX+2] ~ OLAYTIME[MIX]; %710-06194900 $ SET OMIT = WORKSET%710-06194990 $ SET OMIT = NOT(WORKSET AND WORKSETMONITOR) 06195090 IF WKSETMONITOR AND (DD=0) THEN 06195095 BEGIN 06195100 STREAM(N1 := VECTOR[0], N2 := VECTOR[1], 06195105 T1 := ((LOG[TIMEX]+0.5)/60 DIV 1), 06195110 T2 := ((LOG[TIMEX+1]+0.5)/60 DIV 1), 06195115 T4 ~ (OLAYTIME[MIX]+59) DIV 60, % OLAY I/O TIME IN SECS %710-06195118 T3:=(((LOG[TIMEAX+2]-VECTOR[5].[24:24])+0.5)/60 DIV 1), 06195120 DV:=0, DD := DD := SPACE(10)); 06195125 BEGIN 06195130 SI:=LOC N; DS:=LIT" "; 06195135 2(SI:=SI+1; DS:=7CHR; DS:=LIT" "); 06195140 DS:=4LIT"CPU="; 06195145 DS:=6DEC; DV:=DI; DI:=DI-6; DS:=5FILL; DI:=DV; 06195150 DS:=5LIT" I/O="; 06195155 DS:=6DEC; DV:=DI; DI:=DI-6; DS:=5FILL; DI:=DV; 06195160 DS~ 6LIT" OLAY="; %710-06195161 DS~ 6DEC; DV~ DI; DI~ DI-6; DS~ 5FILL; DI~ DV; %710-06195162 DS:=6LIT" ELAP="; 06195165 DS:=6DEC; DV:=DI; DI:=DI-6; DS:=5FILL; DI:=DV; 06195170 DS:=LIT"~"; 06195175 END STREAM STATEMENT; 06195180 SPOUT(DD); 06195185 END; 06195190 $ POP OMIT % WORKSET AND WORKSETMONITOR 06195195 STREAM(A~VECTOR[5].[1:23]:B~0);% 06196000 BEGIN SI ~ LOC A; DI ~ LOC A; DS ~ 8 DEC END;% 06197000 LOG[TIMEAX] ~ P(XCH);% 06198000 LOG[TIMEAX+1] ~ VECTOR[5].[24:24];% 06199000 $ SET OMIT = NOT(STATISTICS) 06199099 NT4 ~ VECTOR[2].[8:10];% 06200000 LOG[TIMEAX+3] ~ IF VECTOR[1] < 0 THEN (NT4= 99) 06201000 +2 ELSE NT4 = 3;% 06202000 LOG[TIMEAX+3].[1:30]~ DATE.[18:30]; 06202100 LOG[TIMEAX+4]:=USERCODE[MIX]; 06203000 $ SET OMIT = NOT(DCLOG AND DATACOM) 06203099 IF TABCNT[MIX]!0 THEN 06203600 BEGIN T:=CLOCK+900; 06203650 COMPLEXSLEEP(TABACNT[MIX]=0 OR CLOCK>T); 06203700 END; 06203750 $ SET OMIT = NOT (DATACOM AND NOT DCLOG) 06203790 PRTROW[MIX].[PSF]:=0; 06204000 $ SET OMIT = NOT(PACKETS) 06205009 UNITNO:=PSEUDOMIX[MIX]; 06205010 PSEUDOMIX[MIX]:=0; 06205020 PM[0]:=LOG[TIMEX ]/60; 06205030 PM[1]:=LOG[TIMEX+1]/60; 06205040 $ SET OMIT = NOT(WORKSET) OR OMIT %759-06205049 PM[2]:=OLAYTIME[MIX]/60; %759-06205050 $ POP OMIT 06205051 $ POP OMIT %759-06205052 USERCODE[MIX] := 0; 06205100 STREAM(S~[NFO[(MIX-1)|NDX]]);% 06205200 BEGIN DS~8 LIT "0"; DI~S; DS~2 WDS; END;% 06205300 $ SET OMIT = NOT STATISTICS 06205540 JARROW[MIX]:=PRTROW[MIX]:=0; 06206000 END TIMET; 06206100 $ SET OMIT = NOT(PACKETS) 06206109 SUBROUTINE MESSAGE; 06206110 IF UNITNO!0 OR (VECTOR.[24:9]!0) THEN 06206120 BEGIN 06206130 STREAM(A:=[VECTOR[0]],MIX,B:=[PM[0]],T:=T:=SPACE(10)); 06206140 BEGIN DS:=5LIT" FOR";SI:=A;SI:=SI+1;DS:=7CHR; 06206150 DS:=LIT"/";SI:=SI+1;DS:=7CHR;SI:=LOC MIX; 06206160 DS:=LIT"=";DS:=2DEC; 06206170 A:=DI;DI:=DI-2;DS:=FILL;DI:=A; SI:=B; 06206175 DS:=10 LIT ": PROCESS="; DS:=5 DEC; %759-06206180 A:=DI;DI:=DI-5;DS:=4FILL;DI:=A; 06206190 DS:=10 LIT " SECS, IO="; DS:=5 DEC; %759-06206200 A:=DI;DI:=DI-5;DS:=4FILL;DI:=A; 06206205 $ SET OMIT = NOT(WORKSET) OR OMIT %759-06206209 DS:=12 LIT " SECS, OLAY="; DS:=5 DEC; %759-06206210 A:=DI;DI:=DI-5;DS:=4FILL;DI:=A; %759-06206215 $ POP OMIT %759-06206216 DS:=LIT"~"; 06206220 END; 06206230 SPOUTER(T,IF VECTOR.[24:9] NEQ 0 THEN 06206240 VECTOR.[24:9] ELSE UNITNO,64); 06206250 END; 06206260 $ POP OMIT 06206261 A ~ VECTOR[6].[33:15];% 06207000 ESED:=VECTOR[2].[2:1]; 06207100 T:=Q:=((L:=VECTOR[6].[18:15])+(IF ESED THEN N~0 ELSE 06208000 N:=FILEBLOCK.[8:10])+60) DIV 25|27; 06209000 LOG:=[M[TYPEDSPACE(T,LOGAREAV)]];% %167-06210000 M[LOG INX NOT 1].[9:6] ~ 0;% 06211000 $ SET OMIT = NOT(PACKETS) 06211099 PM:=[M[SPACE(5)]]&5[8:38:10]; 06211100 M[PM INX NOT 1].[9:6]:=0; 06211200 $ POP OMIT 06211201 J ~ A;% 06212000 DO BEGIN I ~ I+27;% 06213000 DISKIO( T ,-( LOG INX I),26,J);% 06214000 SLEEP([T],IOMASK);% 06215000 J ~ LOG[I+1];% 06216000 END UNTIL J=0 OR I+53>Q;% 06217000 IF VECTOR[2].[8:10]=0 THEN L ~ LOG[29]; 06217100 IF(I:=(L-5) MOD 25+I+7) LSS Q-3 THEN 06218000 IF I MOD 27 = 0 THEN% 06219000 BEGIN LOG[I] ~ LOG[I+1] ~ 0;% 06220000 I ~ I+2 END;% 06221000 $ SET OMIT = NOT(STATISTICS) 06221099 LOG[I]:= IF VECTOR[0] LSS 0 06222000 THEN IF VECTOR[0]=(-"COBOL ") THEN 2 06222100 ELSE IF VECTOR[0]=(-"FORTRAN") THEN 6 06222200 ELSE IF VECTOR[0]=(-"BASIC ") THEN 7 06222300 ELSE IF VECTOR[0]=(-"XALGOL ") THEN 9 06222400 ELSE IF VECTOR[0]=(="TSPOL ") THEN 10 06222500 ELSE IF VECTOR[0]=(-"COBOL68") THEN 11 06222550 ELSE 1 ELSE 0; 06222600 LOG[I+1] ~ N DIV 5;% 06223000 IF(I:=(TIMEX:=I+2)+3) LSS Q-1 THEN 06224000 IF I MOD 27 = 0 THEN% 06225000 BEGIN LOG[I] ~ LOG[I+1] ~ 0;% 06226000 I ~ I+2;% 06227000 END;% 06228000 I ~ (TIMEAX ~ 1)+5;% 06229000 IF NOT ESED THEN%IF JOB ES-ED THEN NO FPB ENTRIES 06229100 FOR J ~ 5 STEP 5 UNTIL N DO% 06230000 IF FILEBLOCK[J-1]=0 THEN LOG[TIMEX -1]~*P(DUP)-1 ELSE 06230100 BEGIN IF I MOD 27 = 0 THEN% 06231000 BEGIN LOG[I] ~ LOG[I+1] ~ 0;% 06232000 I ~ I+2 END;% 06233000 IF I+4 LEQ Q THEN 06233100 STREAM(A~[FILEBLOCK[J-5]],B~[LOG[I]]);% 06234000 BEGN SI ~ A; DS ~ 5 WDS END;% 06235000 IF I+4 LEQ Q THEN 06235100 IF LOG[I+4] < 0 THEN 06236000 BEGIN LOG[I+4] ~ *P(DUP)+CLOCK+P(RTR);% 06237000 LOG[I+3].[24:12]~P(DUP,DUP).[24:12]+TINU06238000 [NT1~P(XCH).[36:6]-1].[18:12];% 06239000 TINU[NT1].[18:12] ~ 0;% 06240000 END;% 06241000 IF LOG[I+2].[18:30]=0 THEN 06241100 LOG[I+2].[18:30]:=DATE.[18:30];%ENTER CURR DATE 06241200 I ~ I+5% 06242000 END;% 06243000 N ~ LOG[TIMEX -1]|5; 06243100 FORGETSPACE(FILEBLOCK);% 06244000 J ~ 0;% 06245000 IF VECTOR[2].[8:10] = 1 THEN% 06246000 BEGIN DO J ~ J+27 UNTIL LOG[J+1] = 0;% 06247000 WHILE J+27 LSS I AND I LSS Q DO% 06248000 BEGIN LOG[J+1] ~ GETESPDISK;% 06249000 J ~ J+27;% 06250000 END;% 06251000 I ~ 27;% 06252000 TIMEIT;% 06253000 LOG[29]~5|LOG[40]+20; 06253500 DO BEGIN DISKIO(T,LOG INX I,26,A);% 06254000 A ~ LOG[I+1];% 06255000 I ~ I+27;% 06256000 SLEEP([T],IOMASK);% 06257000 END UNTIL A = 0;% 06258000 END% 06259000 ELSE BEGIN 06260000 DO BEGIN J~J+27; 06260100 FORGETESPDISK(A);% 06261000 A ~ LOG[J+1];% 06262000 END UNTIL A = 0;% 06263000 IF LOGFREE=0 THEN TIMEIT ELSE 06263100 BEGIN A~J+29; 06263200 LOG[29]~3; 06265000 I ~ I+6;% 06266000 WHILE (J ~ J+27) < I DO% 06267000 BEGIN A ~ A+25;% 06268000 STREAM(X~[LOG[J]],Y~[LOG[A]]);% 06269000 BEGIN SI ~ X; DS ~ 25 WDS END;% 06270000 IF TIMEX } A THEN TIMEX ~ TIMEX-2; 06271000 IF TIMEAX } A THEN TIMEAX ~ TIMEAX-2; 06272000 END;% 06273000 N ~ (N+L) DIV 5+3;% 06278000 L ~ 28;% 06279000 IF TIMEX+2 LSS Q AND TIMEAX+4 LSS Q THEN 06279100 TIMEIT; LOGSPACE(L+1 INX LOG,(N-1)|5); 06280000 END;% 06327000 END;% 06328000 $ SET OMIT = NOT(PACKETS) 06328099 MESSAGE; FORGETSPACE(PM); 06328100 IF UNITNO!0 THEN 06328200 DRAINO(UNITNO,(VECTOR[2].[8:10]!1) OR (PKT!0), 06328300 ((VECTOR[1]<0) OR (VECTOR[2].[8:10]=3)) 06328400 %VECTOR[6][1:1:1]); 06328500 $ POP OMIT 06328501 FORGETSPACE(LOG);% 06329000 END SIGNOFF;% 06330000 PROCEDURE USERDISKSPECIALCASE(Q,R,UT,J) ; 06350000 VALUE Q,J; REAL R,J; INTEGER Q; ARRAY UT[*] ; 06350300 BEGIN 06350600 REAL BUFF=Q,N=J,Z=UT,E=R ; 06351000 $ SET OMIT = NOT(SHAREDISK ) 06351050 $ SET OMIT = SHAREDISK 06351100 REAL NEU,NT; ARRAY UA[*]; 06351104 DEFINE U=AVTABLE #, AVS=B #, NEU1=J-1 #, NEU2=NT-1 #; 06351105 $ POP OMIT 06351106 INTEGER NT1,NT3,NT4,B ; 06351250 LABEL L1,L2,L3,UP,PU,BD,WHY,M1,T10 ; 06351500 SWITCH SW,~L1,L2,L3 ; 06351800 IF Q!0 THEN GO SW[Q-1] ; 06352000 $ SET OMIT = NOT(SHAREDISK ) 06352490 L1: BUFF:=R; Z:=0; UNLOCKTOG(USERDISKMASK); 06353500 IF N LEQ RESERVEDISKSIZE THEN% CALL OUT RESERVES 06353510 IF (Z:=DIRECTORYSEARCH("RESERVE","DISK ",6)) NEQ 0 THEN 06353530 BEGIN FORGETSPACE(Z); 06353540 IF N>0 THEN 06353541 $ SET OMIT = PACKETS 06353542 BEGIN STREAM(Z:=Z:=SPACE(3)); 06353545 DS!23 LIT "**RESERVE/DISK REMOVED~"; 06353550 SPOUTER(Z,25,(NOT LIBMSG) AND 1); %523-06353551 END; 06353552 FORGETSPACE(BUFF); P(XIT); %528-06353555 END OF RESERVE CALL UP; 06353570 IF AUTOUNLD THEN 06353580 BEGIN P(P1MIX); AUTOUNLD:=P1MIX:=0; 06353590 STREAM(A:=DATE,Z:=Z:=SPACE(10)+2); 06353600 BEGIN DS:=23 LIT"CC UNLOAD EXPIRED TO XP"; 06353610 SI:=LOC A; SI:=SI+3; DS:=5 CHR; 06353620 DS:=9 LIT " =/=;END."; 06353630 END; 06353640 INDEPENDENTRUNNER(P(.CONTROLCARD),Z&31[3:43:5],192); 06353650 P1MIX:=P; 06353660 IF N GEQ 0 THEN 06353670 BEGIN STREAM(Z:=Z:=SPACE(10)); 06353680 DS:=18 LIT"18 AUTOUNLD RESET~"; 06353690 SPOUT(Z); 06353700 END END AUTOMATIC UNLOADING; 06353710 IF NOT N.[2:1] THEN 06353720 BEGIN IF P1MIX!0 THEN 06354000 BEGIN 06354100 NT1 ~ NOTERMSET(P1MIX); % NOTE: NT1 IS LOCAL %537-06354200 WHY: STREAM(J:=JARROW[P1MIX],P1MIX,N,BUFF); 06355000 BEGIN DS~14 LIT "#NO USER DISK:"; 06356000 SI~J; SI~SI+1; DS~7 CHR; 06357000 DS~LIT "/"; SI~SI+1; DS~7 CHR; 06358000 SI~LOC P1MIX; DS~LIT "="; DS~2 DEC; 06359000 J:=DI; DI:=DI-2; DS:=FILL; DI:=J; DS:=LIT"-"; 06359500 SI:=LOC N; DS:=8 DEC; DS:=7 LIT" SEGS.~"; 06360000 DI:=DI-15; DS:=7 FILL; 06360500 END; 06360505 SPOUT(BUFF); 06360510 IF AUTODS AND NOTERMSET(P1MIX) THEN %747-06360515 TERMINATE(P1MIX&61[CTF]) ELSE %747-06360516 BEGIN %747-06360517 REPLY[P1MIX]:=-VWY&VOK[36:42:6]; 06360520 COMPLEXSLEEP((REPLY[P1MIX] GTR 0) OR 06360530 (TERMSET(P1MIX) AND NT1)); %537-06360540 END; %747-06360542 IF NT1 THEN %537-06360545 IF TERMSET(P1MIX) THEN 06360550 BEGIN PRTROW[P1MIX].[7:1]~1; 06360560 GO TO INITIATE; 06360570 END; 06360580 IF NOT WHYSLEEP(VWY&VOK[36:42:6]) THEN 06360590 BEGIN BUFF~SPACE(10); 06360600 GO TO WHY; 06360610 END; 06360620 END ELSE 06361000 BEGIN 06361010 STREAM(N,BUFF); 06361100 BEGIN DS:=20 LIT"#NO USER DISK:MCP - "); 06361200 SI:=LOC N; DS:=8 DEC; 06361300 DS:=6 LIT" SEGS~"; 06361400 DI:=DI-14; DS:=7 FILL; 06361500 END; 06361600 SPOUT(BUFF); 06361610 NT1:=0; DO SLEEP([CLOCK], NOT CLOCK) 06361700 UNTIL (NT1~NT1+1)=30); 06361705 END; 06361710 END ELSE FORGETSPACE(BUFF); 06365110 P(XIT) ; 06380070 L2: U[J]:=E; E:=NEU:=(NT:=NEUP.NEUF)+2+(NT+1)DIV 2; P(NT); J:=1; 06380100 $ SET OMIT = SHAREDISK 06380120 NT1:=NT+NT+NT; FORGETSPACE(UT); FIXARRAY(UA,NT2,NT1); E:=0; 06380140 $ POP OMIT 06380141 UP: IF (NT4:=E MOD 30) LSS (NT3:=(NT1:=U[J].STARTWRD) MOD 30) 06380150 THEN NT4:=NT3 ; 06380200 IF (NT2:=(Q:=U[J] AND NUMENTM)+NT4) GTR 1023 06380250 OR ((Q+E+1) DIV 30+1-E DIV 30) GTR 34 THEN 06380300 BD: BYBY("ODISK IS TOO CHECKERED...PLEASE COMPACT IT~",43) ; 06380350 DISKWAIT(-((UA[NEU1]:=(UA[NEU2+J]:=SPACE(NT2))+NT4)-NT3),Q+NT3, 06380400 USERDISKBOTTOM~NT1 DIV 30) ; 06380450 $ SET OMIT = NOT(SHAREDISK ) 06380490 $ SET OMIT = SHAREDISK 06380520 IF J=1 THEN B:=UA.[CF]+NT+NT-1 ; 06380525 $ POP OMIT 06380526 M[B+J]:=U[J]&E[TOSTARTWRD] ; 06380550 IF (NT1:=Q DIV 4) LSS AVDIFFMIN THEN NT1:=AVDIFFMIN ; 06380600 IF (E:=E+Q+NT1) GTR AVTMAX THEN GO TO BD; 06380650 IF P(DUP) GEQ J:=J+1 THEN GO UP; E:=E-NT1; J:=1 ; 06380700 PU: NT2:=(NT3:=P(M[B+J],DUP).STARTWRD)+NT5:=P(XCH) AND NUMENTM ; 06380750 IF P(DUP)!J THEN IF (NT2-1)DIV 30=(NT4~M[B+J+1].STARTWRD)DIV 30 THEN06380800 MOVE(NT1~NT2 MOD 30,UA[NEU1]+NT5-NT1,NT1~UA[NEU1+1]-NT4 MOD 30); 06380850 DISKWAIT(UA[NEU1]-NT1~NT3 MOD 30,NT1~NT5,USERDISKBOTTOM+NT3 DIV 30);06380900 $ SET OMIT = NOT(SHAREDISK) 06380924 FORGETSPACE(UA[NEU2+J]); 06380950 IF P(DUP) GEQ J:=J+1 THEN GO PU ; 06381000 $ SET OMIT = SHAREDISK 06381020 MOVE(NT,[UA[NT+NT]].[AVTABLE[1]]) ; 06381070 $ POP OMIT 06381071 $ SET OMIT = NOT(SHAREDISK ) 06381075 FORGETSPACE(UA) ; 06381085 $ SET OMIT = NOT(SHAREDISK ) 06381095 P(DEL,Q&AVS[TOSIZE] OR M,RTN) ; 06381250 L3: P(U[NEUP.NEUF+2+(Q:=J DIV P(M1)) DIV 2],IF Q THEN P.[8:20] ELSE 06381300 P.[28:20]) ; 06381310 IF U[Q+1].SPEED = 2 THEN 06381320 BEGIN % 40-MILL MASK CONSTRUCTION. 06381330 Q:=P ; 06381335 STREAM(S:=0:Q); 06381340 BEGIN 06381345 SI:=LOC Q; SKIP 28SB; DI:=LOC S; SKIP 8DB; 06381350 5(4(IF SB THEN DS:=SET ELSE SKIP DB;SKIP SB); SKIP 4 DB); 06381355 SI:=LOC Q; SKIP 28 SB; DI:=LOC S; DI:=DI+2; 06381360 5(4(IF SB THEN DS:=SET ELSE SKIP DB;SKIP SB); SKIP 4 DB); 06381365 END STREAM; 06381380 END ; 06381390 STREAM(MSG:=0:V:=47-(J:=((Q:=J MOD P(M1))+ABS(R)-1) DIV P(T10)), 06381395 W:=1+J-Q DIV P(T10)); 06381400 BEGIN DI:=LOC MSK; SKIP V DB; DS:=W SET; END; 06381405 P(LND,LNG,0,LNG,=,RTN); 06381410 M1::: @3641100; % DECIMAL 1000000. 06381450 T10::: @23420; % DECIMAL 10000. 06381500 END OF USERDISKSPECIALCASE ; 06381550 PROCEDURE GETMOREOLAYDISK(MIX);% 06400000 VALUE MIX;% 06401000 INTEGER MIX;% 06402000 BEGIN INTEGER I=+1,% 06403000 J=+2,% 06404000 T=+3;% 06405000 ARRAY A=+4[*];% 06406000 REAL MSCW=-2; 06406500 REAL RCW=+0;% 06407000 LABEL EXIT;% 06408000 DEFINE DALOCMAXSZ = 06408100 $ SET OMIT = NOT(AUXMEM) 06408199 $ SET OMIT = AUXMEM 06408299 127#; %DALOC SIZE MUST = 9 INIITALLY. 06408300 $ POP OMIT 06408301 P(0, 0, 0, 0); TOGLE ~ TOGLE OR STACKMASK;% 06410000 IF (T~DALOC[MIX,0].[CF]+1)=DALOCMAXSZ THEN BEGIN 06411000 TERMINATE (MIX&111[CTF]); %517-06411010 GO TO EXIT; END; 06411030 IF T=DALOCROW[MIX].[8:10] THEN% 06412000 BEGIN IF (J~T+P(DUP) - 1)=129 THEN J~DALOCMAXSZ; 06413000 WHILE (I := GETSPACE(J, 0, 3)+2)=2 DO 06414000 SLEEP([CLOCK], NOT CLOCK); 06415000 MOVE(T, DALOCROW[MIX], I); 06416000 FORGETSPACE(DALOCROW[MIX]); 06417000 DALOCROW[MIX] := (*P(DUP)) & I[CTC] & J[8:38:10]; 06417500 M[I-2].[9:6] := MIX; 06418000 END AIT TYPE ACTION;% 06419000 IF (I ~ GETUSERDISK(500 OR MEMORY))=0 THEN GO TO EXIT;% 06420000 DALOC[MIX,0] ~ (*P(DUP))&(T+1)[CTC];% 06421000 DALOC[MIX,T] ~ I;% 06422000 DALOC[MIX,T+1] ~ 0;% 06423000 EXIT: OLAYMASK ~ TWO(MIX) OR OLAYMASK;% 06424000 KILL([MSCW]); 06425000 END GET MORE OVERLAY DISK FOR A MIX INDEX;% 06426000 REAL PROCEDURE SECURITYCHECK(MID,FID,USERID,HEADER); 06460000 VALUE MID,FID,USERID; 06460100 REAL MID,FID,USERID,HEADER; 06460200 % MID MULTI FILE ID OF FILE TO BE CHECKED 06460300 % FID FILE ID OF FILE TO BE CHECKED 06460400 % USERID USER IDENTIFICATION 06460500 % HEADER 06460600 % >512 CORE ADDRESS OF HEADER IN 33:15. JUST CHECK IT. 06460700 % >0, <512 VALUE FOR DIRECTORYSEARCH, FIND THE FILE AND PASS 06460800 % BACK THE HEADER IN ADDITION TO SECURITY INFO. 06460900 % <0 DISK ADDRESS OF HEADER. READ IT IN AND CHECK IT, BUT 06460950 % DONT PASS IT BACK. 06460960 % 06461100 % RESULT FROM SECURITYCHECK 06461200 % =0 NO LEGITIMATE USER FOUND 06461300 % =2 TERTIARY USER ( INPUT ONLY) 06461400 % =3 SECONDARY USER (INPUT/OUTPUT) 06461500 % =7 PRIMARY USER (INPUT/OUTPUT/LIB MAINT.) 06461600 BEGIN 06462000 REAL T2,DKSGROW,CODES,ROWS,ROW,DKADR,ROWSZ,C,USER,TYPE,SH; 06462100 REAL I=DKSGROW, FPBSIZE=CODES; 06462105 ARRAY FH[*],FPB=ROW[*]; 06462110 LABEL FOUND; 06462120 LABEL EXYT,NOTFOUND,LOOK,WHY,FORGET; 06462200 REAL SUBROUTINE DIRSRH; 06463000 BEGIN 06463100 LOOK: IF (T2:=DIRECTORYSEARCH(MID,FID,HEADER)) LSS 64 THEN 06463200 WHY: BEGIN 06463210 IF T2=0 THEN FILEMESS("#NO FIL","ON DISK",MID,FID,0,0,0) 06463220 ELSE IF T2=1 THEN BEGIN P(DEL); TYPE:=-1; GO EXYT; END 06463225 ELSE IF T2=2 THEN FILEMESS("#SYSFIL","ERROR ", 06463230 MID,FID,0,0,0); 06463240 IF AUTODS THEN TERMINATE(P1MIX&61[CTF]) ELSE %747-06463260 BEGIN %747-06463270 REPLY[P1MIX]:=-(SH:=VWY&VOK[36:42:6]&VIL[30:42:6]); 06463280 COMPLEXSLEEP((REPLY[P1MIX] GTR 0) OR TERMSET(P1MIX)); 06463300 END; 06463310 IF TERMSET(P1MIX) THEN GO INITIATE; 06463340 IF NOT WHYSLEEP(SH) THEN GO TO WHY; 06463360 IF (SH~T2~REPLY[P1MIX].[FF]) > PSEUDOMAXT THEN % IL%540-06463380 BEGIN STREAM(T2:); 06463400 BEGIN SI:=T2; 06463420 LL: SI:=SI+1; IF SC!"L" THEN GO TO LL; 06463440 SI:=SI+1; T2:=SI; 06463460 END; 06463480 T2:=P; 06463500 FPBSIZE:=(FPB:=PRT[P1MIX,3]).[8:10]; 06463520 FOR I:=0 STEP ETRLNG UNTIL FPBSIZE DO 06463540 IF (FPB[I] EQV MID)=NOT 0 THEN 06463560 IF (FPB[I+1] EQV ABS(FID))=NOT 0 THEN GO FOUND; 06463580 FOUND: NAMEID(C,T2); MID:=C; NAMEID(C,T2); 06463600 NAMEID(C,T2); FID:=C&FID[1:1:1]; 06463620 IF I LSS 1020 THEN 06463640 BEGIN FPB[I]:=MID; 06463660 FPB[I+1]:=C; 06463680 END; 06463700 FORGETSPACE(SH-1); 06463720 END ELSE LABELTABLE[T2]:=-(*P(DUP)); %764-06463740 REPLY[P1MIX]:=0; 06463760 GO TO LOOK; 06463780 END; 06463800 DIRSRH := T2; 06463810 END DIRSRH; 06463820 IF HEADER GEQ 0 THEN 06463840 SH:=IF HEADER GTR 511 THEN HEADER ELSE DIRSRH 06463860 ELSE DISKWAIT(-(SH:=SPACE(30)),30,HEADER.[CF]); 06463880 FH:=IOQUE&SH[CTC]; 06463900 IF(FH[2] EQV 0)=NOT 0 OR (ABS(USERID) EQV ABS(FH[2]))=NOT 0 06463910 OR (USERID EQV MCP)=NOT 0 THEN TYPE+7 ELSE% 06463920 IF HEADER<0 THEN GO EXYT ELSE 06463925 IF (FH[5] EQV @14)=NOT 0 THEN% 06463930 IF (FH[6] EQV @14)=NOT 0 THEN TYPE~2 ELSE TYPE~3;% 06463940 IF TYPE ~ 0 THEN GO TO EXYT; 06463950 IF FH[5].[1:1] THEN 06463960 BEGIN IF (SH:=DIRECTORYSEARCH(ABS(FH[5]),FH[6],19))=0 06463970 THEN BEGIN TYPE:=0; GO TO EXYT END; 06463980 M[SH+4].[11:1]:=1; 06463982 STREAM(DATE,J:=5); BEGIN SI:=LOC DATE; DS:=8OCT; END; 06463984 M[SH+3].[12:18]:=JUNK; 06463986 DISKWAIT(SH.[CF],-30,SH.[FF]); 06463988 $ SET OMIT = SHAREDISK 06463990 UNLOCKDIRECTORY; 06463992 $ POP OMIT 06463994 DKSGROW:=M[SH INX 8]; 06463996 CODES:=SPACE(30); 06464000 ROWS:=(M[SH INX 9] AND 31)-1; 06464050 FOR ROW:=0 STEP 1 UNTIL ROWS DO 06464100 BEGIN IF (DKADR:=M[SH INX 10+ROW])=0 THEN 06464200 NOTFOUND: BEGIN TYPE := 0; 06464300 FORGETSPACE(CODES); FORGETSPACE(SH);GO TO EXYT; 06464400 END; 06464500 ROWSZ := DKADR + DKSGROW; 06464600 WHILE DKADR < ROWSZ DO 06464700 BEGIN DISKIO(C,1-CODES,30,DKADR); 06464800 SLEEP([C],IOMASK); 06464900 FOR C:=0 STEP 1 UNTIL 29 DO 06465000 BEGIN IF((USER:=NFLAG(M[CODES INX C]))EQV @114= 06465100 NOT 0 THEN GO TO NOTFOUND; 06465200 IF (USER EQV @14)! NOT 0 THEN 06465210 IF USER.[3:3]=0 THEN 06465220 BEGIN 06465230 IF (USERID EQV ABS(USER))=NOT 0 THEN 06465300 BEGIN TYPE := 06465400 IF USER < 0 THEN 2 ELSE 3; 06465500 GO TO FORGET; 06465600 END; 06465700 END ELSE 06465800 BEGIN 06465805 IF P1MIX ! 0 THEN 06465810 IF (ABS)JAR[P1MIX,0])EQV 06465820 USER.[6:42])= NOT 0 THEN 06465830 IF((IF JAR[P1MIX,0]<0 THEN "DISK "ELSE JAR[P1MIX,1])EQV 06465840 M[CODES INX C+1].[6:42])= NOT 0 06465850 THEN 06465860 BEGIN 06465870 TYPE := USER.[3:3]; 06465880 GO TO FORGET; 06465900 END; C:=C+1; 06465910 END; 06465920 END; % 30 USERS 06466000 DKADR := DKADR + 1; 06466100 END; % ROW 06466200 END; % ROWS 06466300 GO TO NOTFOUND; 06466310 END; % NO SECURITY BLOCK FILE 06466400 TYPE :=0; 06466500 EXYT: 06466600 IF HEADER LSS 512 THEN 06466610 IF HEADER GEQ 0 THEN HEADER:=FH ELSE FORGETSPACE(FH); 06466620 SECURITYCHECK :=TYPE; 06466700 END SECURITYCHECK; 06467500 $ SET OMIT = NOT(DATACOM ) 06499999 % * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *%JS06845900 $ SET OMIT = NOT(DCLOG AND DATACOM ) 06845999 DEFINE KLULMP=@174#; @173 IS RESERVED FOR THE DISK ADDRESS 07000000 COMMENT LASTCDNUM, FIRSTDECK, AND LASTDECK ARE STORED IN THE 07000010 FIRST THREE WORDS OF THE DISK SEGMENT LOCATED AT DIRECTORYTOP 07000015 +3. IN A NON SHARED DISK SYSTEM, THEY ARE WRITTEN OUT EACH 07000020 TIME ONE OF THEM IS CHANGED SO THAT THEY WILL BE PRESERVED 07000025 IF A HALT/LOAD OCCURS. N A SHARED DISK SYSTEM, THEY ARE 07000030 READ INTO THE PRT WITH A READ-LOCK COMMAND EACH TIME THEY ARE 07000035 USED. THIS PROVIDES CONTROL DECK INTERLOCKING BETWEEN SYSTEMS 07000040 IN ADDITION TO PASSING THE INFORMATION BETWEEN SYSTEMS. 07000045 END COMMENT; 07000050 INTEGER LASTCDNUM=@174; 07000100 REAL FIRSTDECK=@175; 07000200 REAL LASTDECK=@176; 07000300 DEFINE LOCKCONTROLDECKS=BEGIN SLEEP([TOGLE],CDMASK); LOCKTOG(CDMASK); 07001000 $ SET OMIT = NOT(SHAREDISK) 07001099 END#, 07001200 UNLOCK(CONTROLDECKS=BEGIN 07001300 $ SET OMIT = NOT(SHAREDISK) 07001399 UNLOCKTOG(CDMASK) END#; 07001500 REAL PROCEDURE NEXTCDNUM(UPDATE); VALUE UPDATE; BOOLEAN UPDATE; 07001600 BEGIN 07001620 LOCKCONTROLDECKS; 07001640 LASTCDNUM := (LASTCDNUM MOD 9999) + 1; 07001660 STREAM(CDNUM:=0; LNUM:=LASTCDNUM); 07001680 BEGIN 07001700 SI:=LOC LNUM; DI:=LOC CDNUM; DS:=8 DEC; 07001720 END; 07001740 NEXTCDNUM := P; 07001760 IF UPDATE THEN 07001780 BEGIN 07001800 DISKWAIT(KLUMP,-3,DIRECTORYTOP+3); 07001820 UNLOCKTOG(CDMASK); 07001840 END; 07001860 END; 07001880 PROCEDURE STARTADECK(N); VALUE N; REAL N; FORWARD; 07002000 PROCEDURE ENTERCONTROLDECK(H); VALUE H; ARRAY H[*]; FORWARD; 07002100 REAL RUNNUMBER;% 07003000 %891-07003250 %#######################################################################07003251 %891-07003252 PROCEDURE EBTABLE; %890-07003270 BEGIN LABEL L; %890-07003280 P(0,XIT,.L,DEL); %890-07003290 L::: %890-07003300 0," 32?","1???","0TS?","/???","-LK?","J???","????","????","&CB?","A???",07003310 "!???","????","????","????","????",""????", %890-07003312 "9???","????","Z???","????","R???","????","????","????","I???","????", 07003320 "????","????","????","????","????","????", %890-07003322 "8#:?","????","Y,|?","????","Q$]?","????","????","????","H.[?","????", 07003330 "????","????","????","????","????","????", %890-07003332 @07770675,@05770413,@067146616,@65176473, %892-07003340 @47574656,@45554453,"????","????", @27742620,@25352436, %890-07003342 "????","????","????","????","????","????", %891-07003344 %QMARKADDRESSES %890-07003350 "????","????","????","????","????","????","????","????","????","????", 07003352 "????","????","????","????","????","????", %890-07003354 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, % SPACE FOR ADDRESSES %890-07003360 0,0,0,0,0,0,0; %890-07003370 END; %890-07003380 %891-07003390 %#######################################################################07003391 %891-07003392 PROCEDURE SETUPEBTABLE; %890-07003400 BEGIN REAL ADR; LABEL EXIT; %890-07003410 DEFINE STOREADDRESS= %890-07003412 X:=SI; SI:=LOC X; SI:=SI+5; %890-07003414 DS:=3 CHR; DI:=DI+5 #; %890-07003416 EBTABLE; %890-07003420 P([M[(ADR:=*P(.EBTABLE) INX NOT 1)]],IOR); %890-07003430 SETUPEBTABLE:=ADR:=ADR.[CF]+3; %890-07003440 IF M[ADR+81] = 0 THEN %890-07003450 STREAM (X:=0,TABLE:=ADR,QMARKTABLEADDRESS:=ADR+32,LOCATIONS:=ADR+40); 07003462 BEGIN %890-07003464 DI:=TABLE; SI:=TABLE; SI:=SI+8; %890-07003466 2(40(SI:=SI+4; DS:=4 CHR;)); %890-07003468 %FIRST FILL ALL OF ADDRESSES WITH ADDRESS OF ?S %890-07003482 SI:=QMARKTABLEADDRESS; %890-07003484 X:=SI; %890-07003486 SI:=LOC X; SI:=SI+5; %POINT SI AT ADDRESS OF QMARKS %890-07003488 DI:=LOCATIONS; %890-07003490 DS:=3 CHR; %890-07003492 SI:=LOCATIONS; %890-07003494 DS:=63 WDS; %890-07003496 %NOW SET ADDRESSES FOR VALID CHARS INTO EBCDIC TABLE %890-07003498 SI:=TABLE; %890-07003500 DI:=LOCATIONS; %890-07003502 3(STOREADDRESS; %STORE ADDRESSES FOR LP=0,1,2 %890-07003504 %CORRESPONDING TO BLANK,9 HOLE,8 HOLE %890-07003506 SI:=X; %890-07003508 SI:=SI+63; SI:=SI+1); %SKIP 8 WORDS DOWN TABLE %890-07003510 DI:=DI+8; %LP=3 IN INVALID %890-07003512 STOREADDRESS; %LP=4..... 7 HOLE %890-07003514 DI:=DI+8; %LP=5 IS INVALID %890-07003516 SI:=X; %890-07003518 SI:=SI+1; %SKIP 1 CHAR DOWN TABLE %890-07003520 STOREADDRESS; %LP=6....7&8 HOLES TOGETHER %890-07003522 DI:=DI+8; %890-07003524 SI:=X; %890-07003526 SI:=SI+1; %890-07003528 STOREADDRESS; %LP=8....6 HOLE %890-07003530 DI:=DI+8; %890-07003532 SI:=X; %890-07003534 SI:=SI+1; %890-07003536 STOREADDRESS; %LP=10....6&8 HOLES TOGETHER %890-07003538 SI:=DI+40; %MISS 5 WORDS...LP=11,12,13,14,15 %890-07003540 SI:=X; %890-07003542 SI:=SI+1; %890-07003544 STOREADDRESS; %LP:=16.... 5 HOLE %890-07003546 DI:=DI+8; %890-07003548 SI:=X; %890-07003550 SI:=SI+1; %890-07003552 STOREADDRESS; %LP=18.... 5&8 HOLES TOGETHER %890-07003554 2(DI:=DI+52); %MISS 13 WORDS....LP=19-31 %890-07003556 SI:=X; %890-07003558 SI:=SI+1; %890-07003560 STOREADDRESS; %LP=32..... 4 HOLE %890-07003562 DI:=DI+8; %890-07003564 SI:=X; %890-07003566 SI:=SI+1; %890-07003568 STOREADDRESS; %LP=34...... 4&8 HOLES TOGETHER %890-07003570 END; %890-07003580 END; %890-07003590 %***********************************************************************07003600 STREAM PROCEDURE EBCDICCONVERT(INTO,TABLE,POINTERS); %890-07003610 VALUE INTO,TABLE,POINTERS; %890-07003615 %***********************************************************************07003620 BEGIN %890-07003630 LOCAL HP,LP,SRCE,DEST,HPPTR,LPPTR; %890-07003640 %POINT HPPTR & LPPTR TO LAST CHAR OF HP,LP %890-07003650 SI:=LOC HP; %890-07003660 SI:=SI+7; %890-07003670 HPPTR:=SI; %HIGH PART %890-07003680 SI:=LOC LP; %890-07003690 SI:=SI+7; %890-07003700 LPPTR:=SI; %LOW PART %890-07003710 SI:=INTO; SI:=SI+8; %890-07003720 DI:=INTO; %890-07003730 %START CHARACTER TRANSLATE LOOP %890-07003740 2(40( %890-07003750 DEST:=DI; %890-07003760 %TRANSFER LOW & HIGH PARTS %890-07003770 DI:=HPPTR; %890-07003780 DS:=1 CHR; %890-07003790 DI:=LPPTR; %890-07003800 DS:=1 CHR; %890-07003810 SRCE:=SI; %STORE SI FOR NEXT PASS THRU LOOP %890-07003820 %NOW FIND THE POINTER INTO TABLE APPROPRIATE TO LP %890-07003830 SI:=POINTERS; %890-07003840 LP(SI:=SI+8); %890-07003860 SI:=SC; %SI NOW POINTS INTO TABLE @ POINT DEPENDANT ON LP %890-07003870 DI:=DEST; %890-07003880 SI:=SI+HP; %SKIP SI THROUGH TABLE HP CHARS %890-07003890 DS:=CHR; %890-07003900 SI:=SRCE)); %890-07003910 DI:=TABLE; DI:=DI+3; %POINT TO QMRK %890-07003920 END CONVERT; %890-07003950 PROCEDURE COM23;% 07004000 BEGIN% 07005000 REAL INBUFF,% ADDRESS OF THE INPUT BUFFER. 07006000 OUTBUFF,% " " " OUTPUT BUFFER. 07006010 FIRSTCARD,% " " " CARD IMAGE OF THE FIRST CARD 07006020 OUTBUFFOLD,% " " " LAST OUTPUT BUFFER. 07006030 RESERVE,% " " 30 WDS OF CORE USED TO BUILD THE 07006040 T,T1,T2,% TEMPORARY VARIABLES. 07006050 R,L,N,% " " USED TO COUNT CARD IMAG 07006060 Q,% USUALLY INDICATES COL 1 HAS A QUESTION MARK 07006070 IU,% UNIT NUMBER OF THE INPUT UNIT. 07006080 OU,% " " " " OUTPUT UNIT. 07006090 FIRST,% TRUE IF THE FIRST CARD OF A DECK. 07006100 S,% USED AS A TEMPROARY VARIABLE IN SUBROUTINE 07006140 % AND TO HAND THE UNIT NUMBER TO SUBROUTINE S 07006150 D;% USED AS A MASK TO SLEEP UNTIL DISK OPERATIO 07006160 % ARE COMPLETED. 07006161 $ SET OMIT = NOT(PACKETS) 07006169 REAL VERYFIRST, %TRUE IF THE FIRST CARD OF THE FIRST DECK 07006172 %IN SINCE LOAD CONTROL WAS EXECUTED. 07006174 FIRSTORSEC, %TRUE IF THE FIRST OR SEC. CARD OF NEW DECK 07006176 PTYPE,% CONTAINS THE RESULT OF REAL SUBROUTINE 07006180 % PACKETCARD.SAVING SOME NEEDLESS EXTRA 07006190 % CALLS ON IT TO CHECK THE TYPE OF A CARD. 07006200 % THE VALUE OF PTYPE IS AS FOLLOWS: 07006210 % 0 = NOT A PACKET CONTROL CARD 07006220 % 1 = "PACKEND"CARD, (USED BY THE 07006230 % OPERATORS TO END A GROUP 07006240 % OF PACKETS BEING LOADED TO 07006250 % DISK) 07006260 % 3 = "PACKET" CARD,(FIRST CARD 07006270 % OF A PACKET) 07006280 % 5 = "END PACKETS" CARD, (USED BY 07006290 % THE OPERATORS TO BOTH END 07006300 % A GROUP OF PACKETS AND 07006310 % SIMULTANEOUSLY DISCONTINUE 07006320 % LOAD CONTROL). 07006330 PLUGGED;% TRUE IF THE LAST "PACKET" CARD(I.E., 07006340 % PTYPE=3), WAS BOTH THE START OF A NEW 07006350 % PACKET AND WAS USED TO "PLUG" THE END 07006360 % OF THE LAST PACKET WITH AN ARTIFICIAL 07006370 % "-QUESTION MARK- PACKET." CARD; 07007000 $ POP OMIT 07007001 BOOLEAN CDONLY; 07007100 INTEGER A,I;% 07008000 $ SET OMIT = NOT(PACKETS) 07008199 REAL CONTINUE,DISKCHAIN,ADECK; LABEL OK; 07008200 $ POP OMIT 07008251 LABEL AGAIN,INL,ERROR,SUPER,BOMB,SKIPIT,EXIT; 07009000 LABEL INPUTL; 07009100 BOOLEAN EBCDIC; REAL EBTABLEADR; %890-07009200 ARRAY FPB[*],H[*];% 07010000 SUBROUTINE STOP;% 07011000 BEGIN IF S ! 18 THEN% 07012000 BEGIN READY ~ NOT(Q ~ TWO(S)) AND READY;% 07013000 RRRMECH ~ NOT Q AND RRRMECH OR Q AND SAVEWORD;% 07014000 LABELTABLE[S] ~ @114;% 07015000 RDCTABLE[S] ~ MULTITABLE[S] ~ 0% 07016000 END;% 07017000 FPB[T+1]~ *P(DUP)+CLOCK+P(RTR);% 07018000 FPB[T].[24:12] ~ TINU[S].[18:12];% 07019000 TINU[S].[18:12]:=0; 07020000 END;% 07021000 $ SET OMIT = PACKETS 07021999 $ SET OMIT = NOT(PACKETS) 07022099 SUBROUTINE FORGETONE; 07022100 $ POP OMIT 07022101 BEGIN T1 ~ H[9]+9;% 07023000 FOR T2 ~ 10 STEP 1 UNTIL T1 DO% 07024000 FORGETUSERDISK(H[T2],-H[8]); 07025000 END;% 07026000 $ SET OMIT = NOT(PACKETS) 07026099 SUBROUTINE FORGETIT; 07026100 BEGIN FORGETONE; 07026200 WHILE DISKCHAIN NEQ 0 DO 07026300 BEGIN DISKWAIT(-(H INX 0),30,DISKCHAIN); 07026400 DISKCHAIN:=H[6].[FF]; 07026500 FORGETONE; 07026600 END; 07026700 END FORGETIT; 07026800 $ POP OMIT 07026801 SUBROUTINE BOMBTIME;% 07027000 BEGIN WHILE STOPSET(P1MIX) DO STOPM(FALSE); 07028000 IF TERMSET(P1MIX) THEN GO BOMB; END; 07028100 $ SET OMIT = NOT(PACKETS) 07028999 REAL SUBROUTINE PACKETCARD;% THIS USED TO BE "ENDCARD" 07029000 BEGIN IF Q THEN% 07030000 BEGIN;% 07031000 IF EBCDIC THEN %890-07031200 BEGIN %890-07031300 EBCDIC:=FALSE; %890-07031400 M[(*P(.EBTABLE) INX NOT 1)].[2:1]:=0; %890-07031500 END; %890-07031600 STREAM(X:="PACKETS":Y:="CONTINU",Z:="END. ", %890-07032000 EB:="DATA029",INBUFF); %890-07032100 BEGIN SI ~ INBUFF;% 07033000 L: SI ~ SI+1; IF SC = " " THEN GO TO L;% 07034000 INBUFF:=SI; %890-07034500 DI~LOC X; DI~DI+1;% POINT TO "PACKETS" 07035000 IF 4SC=DC THEN% A "PACKET" OR "PACKEND" CARD 07036000 IF 2SC=DC THEN TALLY~3% A "PACKET" CARD 07036100 ELSE TALLY~1% A "PACKEND" CARD 07036150 ELSE BEGIN DI~DI-4;% POINT TO "PACKETS" 07036200 IF 7 SC=DC THEN TALLY:=5 %"END PACKET" 07036210 ELSE BEGIN SI:=INBUFF;DI:=LOC Y; %890-07036220 DI:=DI+1;IF 7SC=DC THEN TALLY:=6 07036230 ELSE BEGIN DI:=LOC Z;DI:=DI+1; 07036240 SI:=INBUFF; %890-07036250 IF 3 SC=DC THEN TALLY:=7 %890-07036260 ELSE BEGIN %890-07036270 DI:=LOC EB;DI:=DI+1 %890-07036280 SI:=INBUFF; 07036290 IF 6 SC=DC THEN %890-07036300 $VOID %890-07036310 TALLY:=4; 07036320 $ VOID 07036351 %890-07036330 END END END; %890-07036390 END;% 07036400 X ~ TALLY;% 07037000 END;% 07038000 END ELSE P(0);% 07039000 PTYPE:=P; 07039100 IF PTYPE=6 THEN BEGIN PTYPE:=3; CONTINUE:=TRUE END 07039200 ELSE CONTINUE:=FALSE; 07039300 IF PTYPE=7 THEN PTYPE:=ADECK; 07039410 IF PTYPE = 4 THEN %890-07039500 BEGIN PTYPE:=0; EBCDIC:=TRUE; %890-07039600 EBTABLEADR:=SETUPEBTABLE; %890-07039700 END; %890-07039800 PACKETCARD:=PTYPE; 07040000 END;% 07041000 $ POP OMIT 07041001 $ SET OMIT = PACKETS 07041099 REAL SUBROUTINE ADR;% 07042000 BEGIN IF (T2 ~ H[(T1 ~ R DIV 200)+10]) = 0 THEN% 07043000 BEGIN H[9] ~ T1+1;% 07044000 H[T1+10] ~ T2 ~ GETUSERDISK(200);% 07045000 END;% 07046000 ADR ~ R MOD 200+T2% 07047000 END;% 07048000 SUBROUTINE INPUT;% 07049000 BEGIN% 07050000 IF IU < 16 THEN% 07051000 $ SET OMIT = NOT(PACKETS) 07051099 BEGIN 07051100 INPUTL: T ! WAITIO (@120540000000 + INBUFF, 07051110 @6000040, IU); 07051120 IF T=@40 THEN GO TO INPUTL; 07051130 IF T!0 THEN 07051140 BEGIN 07051150 P(DEL); 07051160 GO TO ERROR 07051170 END; 07051180 $ POP OMIT 07051181 $ SET OMIT = PACKETS 07051999 Q ~ M[INBUFF-1]=9;% 07057000 END% 07058000 ELSE BEGIN WHILE(Q:=WAITIO(@40000000+INBUFF+ %890-07059000 EBCDIC|@400000001,FIRST|4+ %890-07059010 @4000000,IU).[45:1] DO 07059100 IF FIRST AND CDONLY AND NOT CONTINUE THEN %654-07059110 GO EXIT ELSE %654-07059112 BEGIN SLEEP([TOGLE],STATUSMASK); 07059200 RRRMECH~RRRMECH AND NOT Q~TWO(IU); 07059300 READY~READY AND NOT Q; 07059400 SLEEP([READY],Q); 07059500 END; 07060000 IF EBCDIC THEN EBCDICCONVERT(INBUFF, %890-07060100 EBTABLEADR,EBTABLEADR+40) ELSE %890-07060200 IF Q ~ Q ! 0 THEN 07061000 BEGIN S:=(T:=UNIT[IU]).[FF]; 07062000 RETURNIOSPACE(S); 07063000 UNIT[IU] ~ T&@77777[5:20:28]; 07065000 END;% 07066000 STREAM(QMK:=12:BCL:=1-EBCDIC,INBUFF); %890-07066100 BEGIN %890-07066200 SI:=INBUFF; %890-07066300 BCL (IF SC=""" THEN JUMP OUT TO L1); 07066350 IF SC=@14 THEN %890-07066400 L1: BEGIN SI:=LOC QMK;SI:=SI+7; %890-07066500 DS:=1 CHR; %890-07066550 TALLY:=1; %890-07066600 SI:=INBUFF; %890-07066610 2(36(IF SC=">" THEN %890-07066620 BEGIN INBUFF:=SI; DI:=INBUFF; %890-07066630 DS:=LIT "="; %890-07066635 END; %890-07066640 IF SC="}" THEN %890-07066650 BEGIN INBUFF:=SI; DI:=INBUFF; %890-07066660 DS:= LIT """ %890-07066665 END; SI:=SI+1;)) %890-07066670 END; %890-07066700 QMK :=TALLY; %890-07066800 END; %890-07066850 Q:=P OR Q; %890-07066900 T = 0;% 07067000 END;% 07068000 END INPUT; % -07069000 %---------------- COM23 ------------------- -07069200 $ SET UP INPUT VARIABLES% 07071000 IF CDONLY:=(PRT[P1MIX,@25]>22) THEN 07072000 BEGIN IU:=PRT[P1MIX,@25]; 07072100 PRT[P1MIX,@25]:=0; % DISK 07072200 END ELSE 07072300 BEGIN IF (IU:=FINDINPUT("CONTROL","DECK ",0,0,0,0,0,0, 07072400 0,0)) LSS 0 THEN GO INITIATE; % BEEN DS-ED 07072500 IF IU GEQ 32 THEN P(XIT); % EOJ IF PSEUDODCK07072600 END; 07072700 STARTIMING(0,IU); 07073000 FPB:=PRT[P1MIX,3]; 07073500 $ SET OMIT = PACKETS 07073999 IF NOT(JAR[P1MIX,9].[2:1]) THEN % DONT SUPPRESS MESSAGE 07074090 FILEMESSAGE(" IN "&TINU[IU][6:30:18],0, 07074100 "CONTROL","DECK ",0,0,0,OPNMESS); 07074200 RDCTABLE[IU].[8:6] ~ P1MIX;% 07075000 IF IU LSS 16 THEN BEGIN% 07076000 FPB[3].[23:1]:=1; %SET INPUT FLAG FOR LOG 07076010 T ~ WAITIO(@540000005,0,IU)% 07077000 END% 07077010 ELSE IF IU=23 AND READERA NEQ 0 THEN 07078000 BEGIN FORGETSPACE(READERA-2);% 07079000 READERA ~ 0;% 07080000 END% 07081000 ELSE IF IU=24 AND READERB NEQ 0 THEN 07082000 BEGIN FORGETSPACE(READERB-2);% 07083000 READERB ~ 0;% 07084000 END;% 07085000 $ VOIDT %890-07086000 FIRSTCARD ~ GETSPACE(10,CONTROLCARDAREAV,1)_2);% %167-07087000 % SET UP OUTPUT VARIABLES% 07088000 IF PRT[P1MIX,@25] THEN% 07089000 BEGIN OU ~ LABELASCRATCH(T ~% 07090000 TAPELABEL("CONTROL","DECK ",1,1,100));% 07091000 IF OU<0 THEN GO INITIATE; %BEEN DS-ED 07091100 FORGETSPACE(I);% 07093000 FPB[3].[23:1]:=0; %SET OUTPUT FLAG FOR LOG 07093010 END% 07094000 ELSE BEGIN OUTBUFFOLD ~ OUTBUFF ~% %167-07095000 GETSPACE(60,IOBUFERAREAV,1)+2;% %167-07095100 RESERVE ~ GETSPACE(30,0,1)+2;% 07096000 H := SAVEARRAYDESC(30,DISKHEADERAREAV); %167-07097000 OU ~ 18;% 07098000 INBUFF ~ GETSPACE(21,IOBUFFERAREAV,1) + 2; %892-07101000 END;% 07103000 STARTIMING(5,OU); 07104000 FPB:=PRT[P1MIX,3]; % STARTIMING MAY HAVE MOVED IT. 07104500 $ SET OMIT = NOT(PACKETS) 07105499 VERYFIRST~1;% 07105500 $ POP OMIT 07105501 % BEGIN ONE DECK% 07106000 AGAIN: OUTBUF ~ OUTBUFFOLD;% 07107000 L ~ N ~ 0;% 07108000 $ SET OMIT = NOT(PACKETS) 07108099 ADECK ~ 0; FIRSTORSEC ~ %178-07108100 $ POP OMIT 07108101 FIRST ~ D ~ 1; 07109000 IF OU = 18 THEN% 07110000 BEGIN H[ 9] ~ 0;% 07111000 MOVE(20,[H[9]],[H[10]]); 07112000 H[8]~200; 07112100 END;% 07113000 % BEGIN ONE CARD% 07114000 INL: 07115000 $ SET OMIT = NOT(PACKETS) 07115099 IF PTYPE NEQ 3 OR VERYFIRST THEN 07115100 $ POP OMIT 07115101 INPUT; 07115200 $ SET OMIT = NOT(PACKETS) 07115499 IF FIRSTORSEC THEN% 07115500 $ POP OMIT 07115501 IF FIRST THEN% 07116000 BEGIN 07117000 $ SET OMIT = NOT(PACKETS) 07117099 PLUGGED:=VERYFIRST; 07117100 $ POP OMIT 07117101 $ SET OMIT = PACKETS 07117199 MOVE(10,INBUFF,FIRSTCARD);% 07118000 $ SET OMIT = NOT(PACKETS) 07118099 IF PACKETCARD=5 THEN %124-07118500 IF OU<16 THEN FIRST:=VERYFIRST:=0 ELSE 07118510 GO TO EXIT ELSE 07118520 IF PTYPE!3 OR CONTINUE THEN 07118550 BEGIN 07118600 ADECK:=1; GO DK; 07118690 END; 07118700 END ELSE% THIS MUST BE THE SECOND CARD IN 07119000 $ POP OMIT 07119001 $ SET OMIT = PACKETS 07119009 $ SET OMIT = NOT(PACKETS) 07119099 DK: IF Q THEN FIRSTORSEC:=0 ELSE%BAD SEC./FIRST 07119100 BEGIN VERYFIRST+4; % CARD 07119200 GO TO ERROR;% 07119300 END;% INV DECK SET-UP 07119400 $ POP OMIT 07119401 IF T NEQ 0 THEN 07120000 $ SET OMIT = NOT(PACKETS) 07120009 IF PTYPE NEQ 3 OR VERYFIRST THEN 07120010 $ POP OMIT 07120011 GO TO ERROR; 07120020 BOMBTIME;% 07121000 IF OU < 16 THEN % OUTPUT TO TAPE ( OU = 18 NORMALLY) -07122000 BEGIN 07122010 $ SET OMIT = NOT(PACKETS) 07122999 PLUGGED ~ VERYFIRST OR (PACKETCARD!3) 07123500 OR FIRST; 07124000 IF PLUGGED THEN 07124500 $ POP OMIT 07124501 T~WAITIO(INBUFF&@5000[18:33:15] 07125000 &(10-Q)[8:38:10],0,OU); 07125500 $ SET OMIT = PACKETS 07125599 $ SET OMIT = NOT(PACKETS) 07125999 IF VERYFIRST THEN VERYFIRST~PTYPE~0; 07126000 IF FIRST THEN FIRST~PTYPE~0; 07126500 IF PTYPE=0 THEN GO TO INL; 07127000 $ POP OMIT 07127001 M[INBUFF-1] ~ @1737000000000000; 07127500 T ~ WAITIO(INBUFF-1,0,OU); 07128000 SUPER:: 07129000 $ SET OMIT = NOT(PACKETS) 07129099 IF PTYPE=5 THEN GO TO EXIT; 07129100 IF PTYPE=1 THEN VERYFIRST:=TRUE; 07129200 GO TO AGAIN; 07129300 $ POP OMIT 07129301 $ SET OMIT = PACKETS 07129999 END;% 07139000 IF D = 0 THEN SLEEP([D],NOT 0); 07139500 $ SET OMIT = NOT(PACKETS) 07139509 IF PACKETCARD NEQ 0 AND NOT(ADECK AND PTYPE=1) THEN 07139510 BEGIN IF NOT(PLUGGED OR FIRST) THEN% 07139511 BEGIN STREAM(D~OUTBUFF); BEGIN DS~27 LIT 07139512 "CC END...IN CASE YOUR FORGOT";DS~45LIT" " END; 07139513 IF PTYPE = 3 AND NOT CONTINUE AND NOT ADECK THEN %124-07139520 BEGIN STREAM(FIRSTCARD,T!T!SPACE(13)); 07139530 BEGIN DS~24LIT"#NO PACKEND CARD, PKT - "; SI~FIRSTCARD; 07139540 DS!9 WDS; DS~LIT"~"; 07139550 END; 07139560 SPOUT(T); 07139565 END; 07139570 END ELSE MOVE(10,INBUFF,OUTBUFF);% 07139575 END ELSE% 07139590 $ POP OMIT 07139591 MOVE(10,INBUFF,OUTBUFF);% 07140000 $ SET OMIT = NOT(PACKETS) 07140099 IF VERYFIRST THEN PLUGGED~0;% 07140100 $ POP OMIT 07140101 IF Q THEN% 07141000 BEGIN IF L DIV 6 ! N DIV 6 THEN% 07142000 BEGIN R ~ L DIV 3;% 07143000 A ~ ADR;% 07144000 DISKIO(T,1-RESERVE,30,A);% 07145000 SLEEP([T],IOMASK);% 07146000 M[I~L MOD 3|10+9+RESERVE] ~ N;% 07147000 DISKIO(T,RESERVE-1,30,A);% 07148000 SLEEP([T],IOMASK);% 07149000 END% 07150000 ELSE M[I ~(L-N)|10+9+OUTBUFF] ~ N;% 07151000 L ~ M[OUTBUFF+9] ~ N;% 07152000 END;% 07153000 IF N = 12000 THEN% 07154000 BEGIN I ~ SPACE(14);% 07155000 STREAM(FIRSTCARD,T); 07156000 BEGIN DS ~ 32 LIT% 07157000 $ SET OMIT = NOT(PACKETS) 07157099 "#MORE THAN 12000 CARDS IN PKT - "; 07157100 $ POP OMIT 07157101 $ SET OMIT = PACKETS 07157999 SI~FIRSTCARD;DS~9WDS;DS~LIT "~"; 07159000 END;% 07160000 GO TO SKIPIT; 07161000 END;% 07162000 IF (N ~ N+1) MOD 6 = 0 THEN% 07163000 BEGIN R ~ N DIV 3-2;% 07164000 A ~ ADR;% 07165000 OUTBUFF ~ OUTBUFFOLD;% 07166000 DISKIO(D,OUTBUFF-1,60,A); 07167000 END ELSE OUTBUFF ~ OUTBUFF+10;% 07169000 $ SET OMIT = NOT(PACKETS) 07169099 IF FIRST THEN FIRST~PTYPE~0;% 07169100 IF VERYFIRST THEN VERYFIRST:=PTYPE:=0; 07169110 $ POP OMIT 07169201 $ SET OMIT = NOT(PACKETS) 07169499 IF PTYPE=0 THEN GO INL; 07169500 $ POP OMIT 07169501 $ SET OMIT = PACKETS 07169999 IF D = 0 THEN SLEEP([D],NOT 0); 07171000 OUTBUFF ~ OUTBUFFOLD;% 07173000 R ~ N DIV 6|2;% 07174000 A ~ ADR;% 07175000 IF N MOD 6 ! 0 THEN 07175100 BEGIN 07175200 DISKIO(T,OUTBUFF-1,60,A);% 07176000 SLEEP([T],IOMASK);% 07177000 END;% 07178000 IF R+2 < 200 THEN 07178100 BEGIN H[8] ~ R+2; 07178200 FORGETUSERDISK(A+2,R-198); 07178300 END; 07178400 H[7]~N-1; 07179000 H[4]~H[6]~0; 07179050 H[5]:= -0; 07179100 $ SET OMIT = NOT(PACKETS) 07179199 H[6]~0&DISKCHAIN[CTF]&(IF IU<23 THEN 2 ELSE IU-23) 07179200 [2:42:6]; 07179202 IF CONTINUE THEN 07179205 BEGIN 07179210 H[2]:=NEXTCDNUM(1); 07179220 DISKCHAIN:=GETESPDISK; 07179230 DISKWAIT(H INX 0,30,DISKCHAIN); 07179250 STREAM(A:=H[2],B:=FIRSTCARD,INBUFF); 07179260 BEGIN SI:=B; DS:=8 CHR;DS:=15 LIT" CONTINUES PKT#"; 07179270 DS:=15 LIT" CONTINUES PKT#"; 07179280 SI:=LOC A; SI:=SI+4; DS:=4 CHR; DS:=LIT":"; 07179290 END; 07179300 END ELSE 07179310 BEGIN DISKCHAIN:=0; 07179320 $ POP OMIT 07179321 ENTERCONTROLDECK(H); 07180000 $ SET OMIT = NOT(PACKETS) 07180009 END; 07180010 $ POP OMIT 07180011 GO TO SUPER; 07181000 ERROR: T ~ SPACE(12);% 07214000 $ SET OMIT = NOT(PACKETS) 07214099 STREAM(FIRSTCARD,X~VERYFIRST,T);% 07214100 BEGIN SI~LOC X; SI~SI+7; IF SC="2" THEN 07214110 DS~16 LIT "#INV PKT CARD - "% 07214120 ELSE IF SC="4" THEN% 07214130 DS~16 LIT "#INV DECK,PKT - "% 07214140 ELSE DS~16 LIT "#READ ERR,PKT - ";% 07214150 $ POP OMIT 07214151 $ SET OMIT = PACKETS 07214999 SI ~ FIRSTCARD; DS ~ 9 WDS; DS ~ LIT "~";% 07217000 END;% 07218000 SKIPIT: SPOUT(T); 07219000 DO BEGIN INPUT;% 07220000 VOMVRIMW;% 07221000 $ SET OMIT = PACKETS 07221999 $ SET OMIT = NOT(PACKETS) 07222099 END UNTIL PACKETCARD NEQ 0; 07222100 $ POP OMIT 07222101 IF OU < 16 THEN% 07223000 BEGIN DO BEGIN T ~ WAITIO(@340000005,@60,OU);% 07224000 BOMBTIME;% 07225000 END UNTIL T.[42:1];% 07226000 T ~ WAITIO(@140000005,@60,OU);% 07227000 END;% 07228000 ELSE FORGETIT;% 07229000 GO TO SUPER;% 07230000 BOMB:: IF OU=18 THEN FORGETIT;% %164-07231000 EXIT: SLEEP([TOGLE]),STATUSMASK); 07232000 IF IU GEQ 23 THEN UNITCODE[IU-23]:=-0; 07232500 S ~ IU; T ~ 3; STOP;% 07233000 S ~ OU; T ~ 8; STOP;% 07234000 FORGETSPACE(INBUFF);% 07235000 FORGETSPACE(FIRSTCARD);% 07236000 IF OU > 16 THEN% 07237000 BEGIN FORGETSPACE(H);% 07238000 FORGETSPACE(OUTBUFFOLD);% 07239000 FORGETSPACE(RESERVE);% 07240000 END;% 07241000 END COM23;% 07242000 PROCEDURE STARTLOADN(KTR); VALUE KTR; REAL KTR;% 07243000 BEGIN REAL HDR,SEG0,I,F,T,C; ARRAY SHEAT[*]; 07244000 LABEL TRYAGAIN,LDCNTRL,DISK; 07244100 STREAM(K~0:KTR);% 07245000 BEGIN SI ~ KTR;% 07246000 L: IF SC = " " THEN% 07247000 BEGIN SI ~ SI+1; GO TO L END;% 07248000 DI ~ LOC K; DI ~ DI+6; DS ~ 2 CHR;% 07249000 END;% 07250000 C ~ P;% 07251000 T ~ KTR.[15:15]-1;% 07252000 IF (C NEQ "MT" AND C NEQ "DK") OR 07253000 (C = "DK" AND CDONLY ) THEN 07253100 SPOUT(T INX M[T-1]) 07254000 ELSE BEGIN C ~ C = "MT";% 07255000 TRYAGAIN: 07255100 IF (HDR:=DIRECTORYSEARCH(P(LDCNTRL),P(DISK),3)) ! 0 THEN 07256000 BEGIN 07256200 SHEAT := [M[F:=TYPEDSPACE(31,SHEETAREAV)]] & 30[8:38:10];%07256400 STREAM(S:=F-1, D:=F); % ZERO OUT THE SHEAT ENTRY 07256600 BEGIN 07256800 SI:=S; DS:=30 WDS; 07257000 END; 07257200 SEG0 := TYPEDSPACE(30,SEGZEROAREAV);% %167-07257400 DISKWAIT(-SEG0, 30, M[HDR INX 10]); 07257600 F.[FF] := HDR; % CORE ADDRESS OF HEADER IN [FF] OF PARAM. 07257800 SHEAT[7] := SEG0; % CORE ADRS.OF SEGMENT ZERO IN SHEAT[7]07258000 SHEAT[0] := P(LDCNTRL); 07258200 SHEAT[1] := P(DISK); 07258400 SHEAT[2] := 0 & LDCNTRLCODE[5:45:3] & 2[8:38:10]; 07258600 % [4:1] IN SHEET[2] MEANS SUPRESS BOJ/EOJ MESSAGES 07258800 SHEAT[16] := SHEAT[17] := @377777777777; % TIME LIMITS 07259000 SHEAT[19] := C; % COMMON VALUE 07259200 SHEAT[20] := 4; % CORE ESTIMATE 07259400 SHEAT[21] := 150; % STACK SIZE 07259600 07259800 STREAM(A:=0 : S := P(.SCHEDULEIDS)); 07260000 BEGIN 07260200 SI:=S; 07260400 47(SKIP SB; SKIP DB; TALLY:=TALLY+1; 07260600 IF SB THEN ELSE JUMP OUT); 07260800 DS:=SET; A:=TALLY; 07261000 END STREAM STATEMENT; 07261200 07261400 I := P; 07261600 SHEAT[3].[8:10] := 1; % SCHEDULE NUMBER 07261800 SHEAT[23] := (CLOCK + P(RTR)) DIV 60; 07262000 SHEAT[24] := MCP; %131-07262100 SHEAT[25] := HDR.[FF]; % DISK ADDRESS OF FILE HEADER 07262200 STREAM(C, T); 07262400 BEGIN 07262600 DI:=DI+16; 07262800 DS:=31LIT"CC EXECUTE LDCNTRL/DISK;COMMON="; 07263000 SI:=LOC C; DS:=8DEC; 07263200 DS:=6LIT";END.~"; 07263400 END STREAM STATEMENT; 07263600 M[T] := 0; M[T+1] := 10; 07263700 SHEAT[6] := GETESPDISK & 10[18:33:15]; 07263800 DISKWAIT(T, 11, SHEAT[6].[CF]); 07264000 FORGETSPACE(T); 07264200 INDEPENDENTRUNNER(P(.SELECTRUN),F,160); 07264400 END ELSE % IF IN DIRECTORY 07265000 BEGIN 07265100 ENTERSYSFILE(2); 07265200 GO TRYAGAIN; 07265300 LDCNTRL::: "LDCNTRL"; 07265400 DISK::: "DISK "; 07265500 END; 07265600 END;% 07266000 END;% 07267000 PROCEDURE TABLEOFCONTENTS(B,COUNT);% 07268000 VALUE B,COUNT; REAL B,COUNT;% 07268100 BEGIN REAL I,T,NA,TUSTA,TU,BU; 07269000 $ SET OMIT = NOT(PACKETS) 07269099 REAL FIRST,START,FINAL,PKTCT;% 07269100 $ POP OMIT 07269101 LABEL L,EXIT,G;% 07270000 $ SET OMIT = NOT(SHAREDISK) 07270099 A:=B.[15:15]-1; 07271900 TUSTA:=M[A-1]; 07272000 LOCKCONTROLDECKS; 07272500 A:=FIRSTDECK; 07273000 $ SET OMIT = NOT(PACKETS) 07273099 FIRST~1;% 07273100 $ POP OMIT 07273101 L: I:=SPACE(14) INX TUSTA; 07274000 G: IF A = 0 THEN GO TO EXIT;% 07275000 DISKWAIT(-1,12,A); 07276000 A:=M[I+6].[CF]; 07278000 $ SET OMIT = NOT(DATACOM AND RJE ) 07278499 $ SET OMIT = NOT(SHAREDISK) 07279000 N ~ M[I+2];% 07281000 $ SET OMIT = NOT(PACKETS) 07281099 IF NOT COUNT THEN% 07281100 BEGIN% 07281200 $ POP OMIT 07281201 DISKWAIT(-I-4,9,M[I+10]); 07282000 STREAM(N,T,TU,BU,I); 07284000 BEGIN SI ~ LOC N; SI ~ SI+1;% 07285000 $ SET OMIT = NOT(PACKETS) 07285099 DS:=8 LIT " PACKET ";DS:=5 CHR; 07285100 $ POP OMIT 07285111 $ SET OMIT = PACKETS 07285999 $ SET OMIT = NOT(SHAREDISK) 07286100 $ SET OMIT = SHAREDISK 07286400 DS:=8 LIT" "; 07286500 $ POP OMIT 07286501 $ SET OMIT = NOT(PACKETS) 07286509 DS:=3 LIT " ="; 07286510 $ POP OMIT 07286511 $ SET OMIT = NOT(RJE AND DATACOM ) 07286599 DS:=8 LIT " "; 07286800 NEX: 07286900 $ SET OMIT = PACKETS 07286999 $ SET OMIT = NOT(PACKETS) 07288099 DI:=DI+40;DI:=DI+19;DS:=LIT"~"; 07288100 $ POP OMIT 07288101 END;% 07289000 SPOUT(I);% 07290000 $ SET OMIT = NOT(PACKETS) 07290099 END ELSE% 07290100 BEGIN% OPERATOR WANTS A COUNT 07290200 IF FIRST THEN BEGIN% STORE FIRST DECK #. 07290300 FIRST~0; START~N;% 07290400 END;% 07290500 PKTCT~PKTCT+1; FINAL~N;% 07290600 FORGETSPACE(I);% 07290650 END;% 07290700 $ POP OMIT 07290701 GO TO L;% 07291000 EXIT:IF N=0 THEN 07292000 BEGIN STREAM(I); 07293000 $ SET OMIT = NOT(PACKETS) 07293099 DS:=20 LIT " NO PACKETS ON DISK~"; 07293100 $ POP OMIT 07293101 $ SET OMIT = PACKETS 07293199 SPOUT(I);% 07294000 $ SET OMIT = PACKETS 07294899 $ SET OMIT = NOT(PACKETS) 07294999 END ELSE% CHECK FOR COUNT REQUEST. 07295000 IF COUNT THEN% 07295010 BEGIN;STREAM(C~PKTCT,S~START,% 07295020 F~FINAL,T1~0,T2~0,I);% 07295030 BEGIN DS~LIT " "; T2~DI;% 07295040 SI~LOC C; DI~LOC T1;% 07295050 DS~2 DEC; SI~LOC T1; DI~T2; 07295060 DS~2 CHR; T2~DI; DI~DI-2;% 07295070 DS~FILL; DI~T2;% 07295080 DS~7 LIT " PACKET";% 07295090 SI~LOC T1; %511-07295100 IF SC!"0" THEN GO TO AQ %511-07295102 ELSE SI~SI+I; %511-07295104 IF SC="1" THEN% ONLY 1 DECK %511-07295110 BEGIN DS~2LIT ", ";% 07295120 SI~LOC F; SI~SI+1;% 07295130 DS~5 CHR;% 07295140 END ELSE% MORE THAN 1 07295150 AQ: BEGIN DS~3 LIT "S, "; %511-07295160 SI~LOC S; SI~SI+1;% 07295170 DS~5 CHR;% 07295180 DS~6 LIT " THRU ";% 07295190 SI~SI+4; DS~4 CHR;% 07295200 END;% 07295210 DS~LIT "~"; 07295220 END;% 07295230 SPOUT(I);% 07295235 END ELSE FORGETSPACE(I);% 07295240 $ POP OMIT 07295241 UNLOCKCONTROLKECKS; 07296000 END;% 07297000 PROCEDURE REMOVEDECK(N,TUSTA);VALUE N,TUSTA;REAL N,TUSTA; 07298000 BEGIN REAL I,T,A,L1,J=I,L2,V;% 07299000 $ SET OMIT = NOT(PACKETS) 07299499 REAL L3; 07299500 LABEL FAIL,CONTINUE; 07299600 $ POP OMIT 07299601 LABEL L,EXIT,REMOVE;% 07300000 LOCKCONTROLDECKS; 07301000 IF (I ~ DIRECTORYSEARCH("DECK ",N,5)) = 0 THEN% 07303000 $ SET OMIT = NOT(PACKETS) 07303499 FAIL: 07303500 $ POP OMIT 07303501 BEGIN I ~ SPACE(5);% 07304000 STREAM(N,I);% 07305000 $ SET OMIT = NOT(PACKETS) 07305099 BEGIN DS:=5 LIT " PKT "; 07305100 $ POP OMIT 07305101 $ SET OMIT = PACKETS 07305999 SI ~ LOC N; SI ~ SI+1; DS ~ 5 CHR;% 07307000 DS ~ 13 LIT " NOT ON DISK~";% 07308000 END;% 07309000 GO TO EXIT;% 07310000 END;% 07311000 $ SET OMIT = NOT(SHAREDISK) 07311199 $ SET OMIT = NOT(PACKETS) 07311499 L3:=M[I+6].[FF]; 07311500 $ POP OMIT 07311501 L2:=M[I+6].[CF]; 07312000 IF (A:=FIRSTDECK)=(L1:=I.[FF]) THEN 07313000 BEGIN 07314000 $ SET OMIT = PACKETS 07314099 $ SET OMIT = NOT(PACKETS) 07314109 FIRSTDECK:=IF L3 NEQ 0 THEN L3 ELSE L2; 07314110 IF L2=0 THEN LASTDECK~IF L3 NEQ 0 THEN L3 ELSE 0; 07314120 $ POP OMIT 07314121 DISKWAIT(KLUMP,3,DIRECTORYTOP+3); 07314200 $ SET OMIT = NOT(PACKETS) 07314289 IF L3 NEQ 0 THEN GO TO CONTINUE ELSE 07314290 $ POP OMIT 07314291 GO TO REMOVE; 07314300 END; 07314400 J ~ I.[33:15];% 07315000 L: 07316000 DISKWAIT(-J,30,A); 07317000 IF (V:=M[J+6].[CF])=0 THEN 07318000 $ SET OMIT = NOT(PACKETS) 07318009 IF A=L1 THEN GO REMOVE ELSE BEGIN FORGETSPACE(I); GO FAIL 07318010 END; 07318012 $ POP OMIT 07318013 $ SET OMIT = PACKETS 07318019 IF V ! L1 THEN% 07319000 BEGIN A ~ V; GO TO L END;% 07320000 $ SET OMIT = PACKETS 07320999 $ SET OMIT = NOT(PACKETS) 07321099 M[J+6].[CF]~IF L3!0 THEN L3 ELSE L2; 07321100 $ POP OMIT 07321101 DISKWAIT(J,30,A); 07322000 IF L2 = 0 THEN% 07324000 BEGIN 07325000 $ SET OMIT = PACKETS 07325999 $ SET OMIT = NOT(PACKETS) 07326099 LASTDECK:=IF L3 NEQ 0 THEN L3 ELSE A; 07326100 $ POP OMIT 07326101 DISKWAIT(KLUMP,3,DIRECTORYTOP+3); 07327000 $ SET OMIT = PACKETS 07327999 $ SET OMIT = NOT(PACKETS) 07329999 END ELSE IF L3=0 THEN ELSE 07330000 CONTINUE: 07330050 BEGIN J~I INX 0; 07330100 DISKWAIT(-J,30,L3); 07330200 M[J+6].[CF]~L2; 07330300 DISKWAIT(J,30,L3); 07330400 END; 07330500 $ POP OMIT 07330501 REMOVE: 07331000 FORGETSPACE(I); 07332000 I:=DIRECTORYSEARCH("DECK ",N,8).[CF]; 07333000 T ~ M[I+9];% 07343000 FOR V ~ 1 STEP 1 UNTIL T DO% 07344000 IF M[I+V+9]!0 THEN FORGETUSREDISK(M[I+V+9],M[I+8]); 07345000 STREAM(N,I);% 07346000 $ SET OMIT = NOT(PACKETS) 07346099 BEGIN DS:=5 LIT " PKT "; 07346100 $ POP OMIT 07346101 $ SET OMIT = PACKETS 07346999 SI ~ LOC N; SI ~ SI+1; DS ~ 5 CHR;% 07348000 DS ~ 9 LIT " REMOVED~";% 07349000 END;% 07350000 $ SET OMIT = PACKETS 07350099 EXIT: SPOUTER(I&TUSTA[9:9:9],TUSTA,LIBMSG) 07351000 $ SET OMIT = PACKETS 07351099 ;UNLOCKCONTROLDECKS; 07352000 END;% 07353000 PROCEDURE DECKREMOVER(B); BALUE B; REAL B;% 07354000 BEGIN REAL K,N,F;% 07355000 INTEGER U; LABEL ON,ERR; 07355100 REAL D; 07355200 LABEL L,TRYIT,GIVEUP; 07356000 K ~ B.[15:15]-1;% 07357000 L: STREAM(X~12,B:A~0);% 07358000 BEGIN SI ~ B;% 07359000 U: IF SC = " " THEN BEGIN SI~SI+1; GO TO U END;% 07360000 IF SC="=" THEN BEGIN DI~LOC X; DI~DI+6; DS~CHR; 07360100 SI~SI-1; B~SI; GO TO E END;07360200 IF SC = "#" THEN SI:=SI+1; 07361000 BL: IF SC=" " THEN BEGIN SI:=SI+1;GO TO BL; END; 07361500 DI:=LOC X; DI:=DI+1; DS:=5 LIT "#0000"; 07362000 4(IF SC < "0" THEN JUMP OUT TO EN; 07363000 IF SC > "9" THEN JUMP OUT TO EN; 07364000 SI:=SI+1; TALLY:=TALLY+1); 07365000 EN: A:=TALLY; SI:=SI-A; DI:=DI-A; DS:=A CHR; 07365500 N: IF SC = " " THEN BEGIN SI~SI+1; GO TO N END;% 07366000 DS ~ CHR; B ~ SI;% 07367000 E: END;% 07368000 P(.B,~,.N,~);% 07369000 F~N.[36:6]; N.[36:6]~"~"; 07370000 IF F="~" OR F="," OR F="=" THEN 07371000 BEGIN IF F="=" THEN 07371100 BEGIN IF D=0 THEN D~SPACE(30); 07371200 LOCKCONTROLDECKS; 07371300 IF (N:=FIRSTDECK)=0 THEN 07371400 GIVEUP: 07371450 BEGIN F:="~"; 07371500 UNLOCKCONTROLDECKS; 07371600 GO ON; 07371700 END; 07371750 TRYIT: DISKWAIT(-D,30,N); 07371800 $ SET OMIT = NOT(SHAREDISK) 07371809 N:=M[D+2]; 07371900 UNLOCKCONTROLDECKS; 07371950 END; 07372000 FOR U ~ 0 STEP 1 UNTIL PSEUDOMAX DO 07372090 IF CIDROW[U]!0 THEN 07372100 IF(CIDTABLE[U,2] EQV N)=NOT 0 THEN 07372200 IF LABELTABLE[U+32]}0 07372300 $ SET OMIT = NOT(PACKETS) 07372309 AND LABELTABLE[U+32]!@214 AND 07372310 PACKETACT[U]=0 07372320 $ POP OMIT 07372321 THEN 07372330 BEGIN 07372400 ENDOFDECK(U,M[K-1]); 07372500 GO ON; 07372600 END ELSE GO TO ERR; 07372700 REMOVEDECK(N,M[K-1]); 07372800 ON: IF F!"~" THEN GO TO L; 07372900 FORGETSPACE(K);% 07373000 END ELSE 07374000 ERR: SPOUT(K INX M[K-1]); 07374100 IF D!0 THEN FORGETSPACE(D); 07374200 END;% 07375000 BOOLEAN PROCEDURE READEMFROMDISK(H,IB);% 07376000 VALUE H,IB; ARRAY H[*],IB[*];% 07377000 BEGIN% 07378000 % H[0] = ADDRESS OF BU+1 (B)% 07379000 % H[1] = ADDRESS OF B2+1% 07380000 % H[2] = DECK NAME% 07381000 % H[3] = RECORDCOUNT (N)% 07382000 % H[4] = NEXT CONTROL CARD (L)% 07383000 % H[5] = RECORDS USED IN THIS BLOCK | 10 (R)% 07384000 % H[7] - H[30] ARE FILE HEADER% 07385000 REAL A,B;% 07386000 DEFINE N=H[3]#,L=H[4]#,R=H[5]#;% 07387000 INTEGER I=A; DEFINE MOM=CIDROW[M[B]]#; 07388000 $ SET OMIT = NOT(BREAKOUT) 07388010 B ~ H[0];% 07389000 IF R = 0 THEN% 07390000 IF (M[B-2] AND IOMASK) = 0 THEN% 07391000 SLEEP([M[B-2]],IOMASK);% 07392000 STREAM(B!B+R,IB);% 07393000 BEGIN SI ~ B; DS ~ 10 WDS END;% 07394000 M[IB INX NOT 0] ~ 10; 07394500 IF (READEMFROMDISK ~ N=L) THEN% 07395000 L ~ IB[9];% 07396000 IF (A:=N:=*P(DUP)+1) > (H[7]+1) THEN %639-07397000 BEGIN READEMFROMDISK:=1; 07398000 STREAM(IB); 07398100 BEGIN 07398200 $ SET OMIT = NOT(PACKETS) 07398299 DS:=8LIT" "; SI:=IB; DS:=8 WDS; DI:=IB; 07398300 $ POP OMIT 07398301 DS:=5LIT"-END."; DI:=DI-5; DS:=RESET; 07398400 END; 07398500 END 07398600 ELSE BEGN IF (R ~ *P(DUP)+10) = 30 THEN% 07399000 BEGIN IB ~ [M[B-2]];% 07400000 R ~ 0; 07400400 A ~ A DIV 3+1; 07400500 I~H[A DIV H[8]+10]+A MOD H[8]; 07401000 IF I>0 THEN % NEXT BUFF EXISTS %639-07401900 DISKIO(IB,1-B,30,I);% 07402000 H[0] ~ H[1];% 07403000 H[1] ~ B;% 07404000 END; END; END;% 07405000 BOOLEAN PROCEDURE PRINTORPUNCHWAIT(Q,PNCH);VALUE Q,PNCH;REAL Q,PNCH; 07405100 FORWARD; 07405110 PROCEDURE ENDOFDECK(R,TUSTA);VALUE R,TUSTA; REAL R,TUSTA; 07406000 BEGIN ARRAY H[*];% 07407000 REAL B,I;% 07408000 $ SET OMIT = NOT(PACKETS) 07408099 REAL DISKAD,PBREC,T,USERIO; % %750-07408100 $ POP OMIT 07408101 LABEL EXIT; 07408500 IF (H:=CIDROW[R])=0 THEN GO TO EXIT; 07409000 LABELTABLE[R+32] ~ @114; 07409100 MULTITABLE[R+32] ~ RDCTABLE[R+32] ~ 0; 07409200 USERID~UNITCODE[R+29]; % %750-07409250 UNITCODE[R+9]:=-0; 07409300 IF NOT TUSTA.[1:1] THEN REMOVEDECK(H[2],ABS(TUSTA)) ELSE 07410000 P(DIRECTORYSEARCH(-"DECK ",H[2],14),DEL);07410100 FOR I ~ 0 STEP 1 UNTIL 1 DO% 07411000 BEGIN B ~ H[I];% 07412000 IF (M[B-2] AND IOMASK) = 0 THEN 07413000 SLEEP([M[B-2]],IOMASK);% 07414000 END;% 07415000 IF CIDROW[R]=0 THEN GO TO EXIT; % FIXES TIMING PROB. 07415100 IF H.[18:15] ! 0 THEN 07416000 FORGETSPACE(H.[18:15]-2); 07417000 $ SET OMIT = NOT(PACKETS) 07417099 IF PACKETPBD[R] GEQ 11 THEN 07417100 BEGIN 07417200 PBCOUNT := PBCOUNT+1; 07417300 I := 001 & CIDTABLE[R,6][6:6:24]; 07417400 IF (PBREC := DIRECTORYSEARCH("PBD ",I,5))!0 THEN 07417500 BEGIN 07417600 IF PACKETPAGE[R]>1 THEN 07417700 BEGIN 07417800 PBREC := PBREC.[CF]; 07417900 T := M[PBREC+6]; 07418000 DISKAD := M[PBREC+10]+2; 07418100 DISKWAIT(-PBREC,30,DISKAD); 07418200 IF (M[PBREC+12] EQV (-"ABORTED"))=NOT 0 THEN 07418300 STREAM(B:=PBREC+11); 07418500 BEGIN 07418600 DS:=8LIT":|0|4000"; DS:=8LIT"0PACKET "; 07418700 END; 07418800 M[PBREC+15]~M[PBREC+27]~USERID; % %750-07418850 DISKWAIT(PBREC,30,DISKAD); 07418900 END; 07419000 P(DIRECTORYSEARCH(-"PBD ",1,14),DEL); 07419100 IF AUTOPRINT OR T0 THEN 07419200 P(PRINTORPUNCHWAIT(I,0&T[9:39:9[),DEL); 07419300 FORGETSPACE(PBREC); 07419400 END; 07419500 END; 07419600 PSEUDO[R] := 07419700 $ POP OMIT 07419701 CIDROW[R] := 0; 07419800 IF(RUNUMBER~RUNUMBER+1)>0 THEN 07420000 STARTADECK(IF TUSTA.[1:1] THEN -H[2] ELSE 0); 07420010 FORGETSPACE(H); 07420050 EXIT: 07420100 END;% 07421000 % PSEUDOCOPY DECLARATION MOVED TO 02347110 TO %541-07421500 % ALLOW ACCESS IN DRANO %541-07421505 PROCEDURE STARTADECK(N); VALUE N; REAL N; 07422000 BEGIN LABEL EXIT,L,POSSIBLE,NEXT;% 07423000 REAL I,R,T,A,S; 07424000 READ SDED; 07424100 ARRAY H[*];% 07425000 LABEL AGAIN,START; 07425500 START: 07425600 IF N.[1:1] THEN BEGN SDED~ABS(N); N~0 END; 07425700 LOCKCONTROLDECKS; 07426000 IF RUNUMBER LEQ 0 AND N=0 THEN GO TO EXIT; 07426100 AGAIN: 07427500 IF PSEUDOCOPY > 2 THEN% TOO MANY COPIES CONTROLCARD 07427600 IF STARTOG AND N=0 THEN GO TO EXIT % 07427610 ELSE BEGIN STARTOG ~ TRUE; 07427620 UNLOCKCONTROLDECKS; 07427625 COMPLEXSLEEP(PSEUDOCOPY { 2);% 07427630 STARTOG ~ FALSE;% 07427640 GO TO START;% 07427645 END;% 07427650 FOR R ~ 0 STEP 1 UNTIL PSEUDOMAX DO 07428000 IF CIDROW[R] = 0 THEN GO TO POSSIBLE;% 07429000 STREAM(S~S~SPACE(4)); 07429100 DS:=27 LIT" ALL PSEUDO-READERS IN USE~"; 07429200 SPOUT(S); 07429300 GO TO EXIT;% 07430000 POSSIBLE:% 07431000 IF (A:=FIRSTDECK)=0 THEN GO TO EXIT; 07432000 LABELTABLE[R+32]:=@114; 07432100 W~CIDROW[R]~[M[S~GETSPACE(94,20,1)+2]]&94[8:38:10]; 07433000 M[S-2].[9:6] ~ 0; H[2] ~ 0;% 07434000 L: DISKWAIT(-S,30,A); 07435000 IF N!0 THEN 07436000 BEGIN 07436100 IF H[2].[12:24]~N THEN GO TO NEXT; 07436200 IF H[4].[2:1] THEN 07436300 BEGIN 07436400 STREAM(A:=[H[2]], 07436500 $ SET OMIT = NOT(SHAREDISK) 07436509 S); 07436520 $ SET OMIT = PACKETS 07436599 $ SET OMIT = NOT(PACKETS) 07436609 BEGIN SI:=A;SI:=SI+1;DS:=5 LIT" PKT "; 07436610 $ POP OMIT 07436611 SI:=5 CHR;DS:=7LIT" IN USE"; 07436700 $ SET OMIT = NOT(SHAREDISK) 07436799 DS:=LIT"~"; 07437000 END; 07437100 SPOUT(S); 07437200 CIDROW[R]:=0; 07437300 GO TO EXIT; 07437400 END; 07437500 END ELSE 07437600 IF H[4].[2:1] OR (SDED!0 AND H[2]=SDED) 07437800 $ SET OMIT = NOT(SHAREDISK) 07437899 THEN GO TO NEXT; 07438000 H[4]:=(*P(DUP))&2[2:46:2]&SYSNO[4:46:2]; 07438100 DISKWAIT(S,30,A); 07438200 $ SET OMIT = NOT (DATACOM AND RJE) 07438250 H[0] ~ S+32;% 07441000 H[1] ~ S+64;% 07442000 T ~ [H[30]]; DISKIO(T,1-H[0],30,H[10]);% 07444000 IF H[7] LSS 3 THEN H[62]:=IOMASK ELSE 07445000 BEGIN T:=[H[62]]; IF H[8]=1 THEN 07445100 DISKIO(T,1-H[1],30,H[11]) ELSE 07445200 DISKIO(T,1-H[1],30,H[10]+1); 07445300 END; 07445400 T:=GTSPACE(13,20,0)+4; 07446000 $ SET OMIT = NOT(BREAKOUT) 07446010 M[T INX 10] := H[5]; 07446100 $ SET OMIT = NOT(PACKETS) 07446149 T.[24:6]+H[6].[2:6]; 07446150 $ POP OMIT 07446151 H[3] := H[4] := H[5] := H[6] := 0; 07446200 M[T-4].[9:6] ~ 0;% 07447000 LABELTABLE[R+32]~-@14; %LET IT BE MOVED 07448000 I~READEMFROMDISK(H,[M[T]]&10[8:38:10]); 07448500 INDEPENDENTRUNNER(P(.CONTROLCARD),T& 07449000 $ SET OMIT = NOT(DATACOM AND RJE ) 07449099 (R+32)[2:42:6],192); 07449200 PSEUDOCOPY ~ PSEUDOCOPY + 1;% 07449500 IF (RUNUMBER~RUNUMBER-1) LEQ 0 OR N!0 THEN GO TO EXIT; 07450000 GO TO AGAIN; 07450200 NEXT:IF (A:=H[6].[CF])!0 THEN GO TO L; 07451000 IF N!0 THEN 07452000 BEGIN 07452100 STREAM(N,S); 07452200 $ SET OMIT = PACKETS 07452299 $ SET OMIT = NOT(PACKETS) 07452309 BEGIN SI~LOC N; SI~SI+4; DS:=6 LIT" PKT #"; 07452310 $ POP OMIT 07452311 DS:=4 CHR;DS:=13 LIT" NOT ON DISK~"); 07452400 END; 07452500 SPOUT(S); 07452600 END ELSE FORGETSPACE(S); 07452700 CIDROW[R] ~ 0;% 07453000 EXIT: UNLOCKCONTROLDECKS; 07455000 END;% 07456000 PROCEDURE RUNTHEDECK(B);VALUE B; REAL B;% 07457000 BEGIN REAL I,J;% 07458000 STREAM(S:=0:B,A:=[I]); 07461000 BEGIN SI ~ B;% TO REAL IN I 07461100 L: IF SC=" " THEN BEGIN SI:=SI+1; GO TO L END; 07461120 IF SC="#" THEN 07461140 BEGIN 07461160 L1: SI:=SI+1; IF SC=" " THEN GO TO L1; 07461180 DS:=8 LIT"00000000"; 07461200 4(IF SC<"0" THEN JUMP OUT; 07461220 IF SC>"9" THEN JUMP OUT; 07461240 SI:=SI+1; TALLY:=TALLY+1); 07461260 S:=TALLY; SI:=SI-S; DI:=DI-S; DS:=S CHR; 07461280 TALLY:=1; 07461300 GO TO FX; 07461320 DS:=4 LIT"0000";DS:=4 CHR;TALLY:=1;GO TO EX; 07461330 END; 07461340 SI ~ SI + 1;% 07461400 IF SC { "9" THEN IF SC } "0" THEN GO TO TWO; 07461500 SI ~ SI - 1; DS ~ OCT;% 07461510 GO TO EX; 07461520 TWO: SI ~ SI - 1; DS ~ 2 OCT; 07461530 EX:S:=TALLY; 07461540 END; 07461550 J:=P; 07461560 B:=B.[15:15]-1; 07461570 IF J THEN 07461600 BEGIN 07461700 FORGETSPACE(B); 07461800 STARTADECK(I); 07461900 END ELSE 07462000 BEGIN 07462100 IF I GTR PSEUDOMAX1 THEN I:=NABS(RUNUMBER) ELSE 07462200 BEGIN 07462250 RUNUMBER:=I; 07462300 FOR J:=0 STEP 1 UNTIL PSEUDOMAX DO 07462400 RUNUMBER:=RUNUMBER-(CIDROW[J]!0); 07462500 END; 07462600 STREAM(X1:=1-I.[1:1],K2:=RUNUMBER.[1:1],I:=ABS(I),B);07463000 BEGIN CI:=CI+X1; GO L1; DS:=10LIT" WILL USE ";GO L2; 07464000 L1: CI:=CI+X2; GO L2; DS:=LIT"-"; L2: 07464100 SI:=LOC I;DS:=2 DEC; 07465000 DS ~ 13 LIT " PSEUDO-RDRS~"; 07466000 END;% 07467000 SPOUT(B INX M[B-1]); 07468100 IF RUNUMBER GTR 0 THEN STARTADECK(0); 07469000 END; 07472500 END;% 07473000 PROCEDURE EXTERNALEND(B); VALUE B; REAL B; 07473100 BEGIN REAL U; LABEL EXIT; 07474000 U ~ UNITIN(TINU,B); 07475000 B ~ B.[15:15]-1; 07476000 IF 32 { U AND U { PSEUDOMAXT THEN 07477000 IF LABELTABLE[U] } 0 THEN 07478000 $ SET OMIT = NOT(PACKETS) 07478099 IF LABELTABLE[U] NEQ @214 AND PACKETACT[U=32]=0 THEN 07478100 $ POP OMIT 07478101 IF CIDROW[U-32] ! 0 THEN 07478500 BEGIN 07479000 ENDOFDECK[U-32],M[B-1]); 07479100 FORGETSPACE(B); 07480000 GO TO EXIT; 07481000 END; 07482000 SPOUT(B INX M[B-1]); 07483000 EXIT:END; 07484000 PROCEDURE CHANGEPRIORITY(BUFF,MIX); VALUE BUFF,MIX; REAL BUFF,MIX; 07485000 BEGIN INTEGER PRIORITY; REAL B; 07486000 $ SET OMIT = NOT(PACKETS) 07486499 DEFINE UNITNO = PSEUDOMIX[MIX]#; 07486500 $ POP OMIT 07486501 BUFF ~ ((B~BUFF).[15:15]-1)&M[P(DUP)-1][9:9:9]; 07487000 STREAM(PRIORITY:B); 07488000 BEGIN SI~B; 07489000 N: IF SC="~" THEN GO TO X; 07490000 IF SC<"0" THEN BEGIN SI~SI+1; GO TO N; END; B~SI; 07491000 K: IF SC}"0" THEN IF SC{"9" THEN 07492000 BEGIN TALLY~TALLY+1; SI~SI+1; GO TO K END; 07493000 SI~B; DI~LOC PRIORITY; B~TALLY; DS~B OCT; GO TO Z; 07494000 X: DI~LOC PRIORITY; SKIP DB; DS~11 SET; 07495000 Z: 07496000 END STREAM; 07497000 IF (PRIORITY~P) } 0 THEN 07498000 IF PRYOR[MIX]}0 THEN% 07501000 IF JAR[MIX,*]~0 THEN 07502000 BEGIN JAR[MIX,2].[CF]~ PRYOR[MIX]~ P(PRIORITY~ 07503000 IF PRIORITY}32766 THEN 32766 ELSE PRIORITY, DUP) & P[CTF]; 07503500 STREAM(J~JAR[MIX,*],MIX,PRIORITY,BUFF); 07504000 BEGIN DS~10 LIT " PRIORITY="; 07505000 SI~LOC PRIORITY; BUFF~DI; DS~6 DEC; DI~DI-6; 07506000 DS~5 FILL; DI~BUFF; DI~DI+6; DS~LIT":"; 07507000 SI~J; SI~SI+1; DS~7 CHR; SI~SI+1; DS~LIT"/"; DS~7 CHR;07508000 DS~LIT"="; SI~LOC MIX; DS~2DEC; DS~LIT"~"; 07509000 DI~DI-3; DS~FILL; 07509500 END END; 07510000 SPOUTER(BUFF,UNITNO,1); 07511000 END CHANGEPRIORITY; 07512000