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