%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 JUNK