1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-25 19:25:53 +00:00
Files
retro-software.B5500-software/SYMBOL/DCMCP.esp_m
2012-06-05 14:34:31 +00:00

2777 lines
244 KiB
Plaintext

%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 <JOB SPECIFIERS> 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]<I THEN GO TO HB; 00656200
IF TMB.[FF]!0 THEN GO TO HA; 00656400
$ SET OMIT = NOT AUTODUMP 00656500
IF NOT HALTSET AND PUNTER[DUMPADR]=@501 THEN 00656600
BEGIN 00656800
STREAM(S:=[PUNTER[DUMPCRD]], D:=@20); 00657000
BEGIN SI:=S; DS:=19 WDS; END; 00657200
GO TO P(0,STS,0,STF,[M[@20]]); 00657400
END; 00657600
$ POP OMIT 00657700
DO UNTIL FALSE; 00657800
END; 00662000
$ SET OMIT = DATACOM 00689990
$ RESET SEPTICTANK 00690000
$ POP OMIT 00699990
$ SET OMIT = NOT DATACOM 00699999
$ SET OMIT = NOT(DFX) 00999999
SAVE PROCEDURE STARTIO(U); VALUE U; REAL U; FORWARD; 01165000
SAVE PROCEDURE COMPLEXSNOOZE(PRI,CODE); VALUE PRI; REAL PRI,CODE; 01240000
BEGIN SNOOZE(PRI,1,P(.CODF,LOD)); END; 01240100
DEFINE COMPLEXSLEEP(COMPLEXSLEEP1)=COMPLEXSNOOZE(PRYOR[P1MIX], 01240200
COMPLEXSLEEP1)#; 01240300
PROCEDURE USASITAPE(AREA,TYPE,FROM,U,DIR); %RHR 01250100
VALUE AREA,FROM,U,DIR; REAL AREA,TYPE,FROM,U,DIR; 01250200
BEGIN REAL PIN,Y; 01250300
ARRAY ULAB[*]; 01250400
LABEL EXIT,ERROR,VOL,BAD,WAIT,TIP,ETIP; 01250500
SUBROUTINE LABELSPACE; 01250600
BEGIN ULAB:=[M[SPACE(11)]]&10[8:38:10]; 01250700
MOVE(10,ULAB.[CF]-1,ULAB,[CF]); 01250800
END LABELSPACE; 01250900
SUBROUTINE VOL1FILL; 01251000
BEGIN STREAM(AREA,ULAB); 01251100
BEGIN DS:=8 LIT " LABEL "; DI:=DI+1; SI:=AREA; 01251200
SI~SI+11;IF SC=" " THEN DS~7LIT"0" ELSE DS~7CHR; 01251300
DI~DI+37; %MID 01251310
SI:=AREA; SI:=SI+5; DS:=5 CHR; %PHYSICAL TAPE NO. 01251400
END; 01251500
END VOL1FILL; 01251600
SUBROUTINE HDR1CHK; 01251700
BEGIN STREAM(Y:=0:AREA,X:=0); 01251800
BEGIN DI:=LOC X; DS:=4 LIT "HDR1"; 01251900
SI:=AREA; DI:=LOC X; 01252000
IF 4 SC=DC THEN TALLY:=1; 01252100
Y:=TALLY; 01252200
END; 01252300
Y:=P; 01252350
END HDR1CHK; 01252400
SUBROUTINE HDR1FILL; 01252500
BEGIN STREAM(AREA,ULAB); 01252600
BEGIN SI:=AREA; SI:=SI+4; 01252700
DI:=DI+17; DS:=7 CHR; %FID 01252800
SI:=SI+17; DS:=3 CHR; %REEL 01252900
SI:=SI+11; DS:=5 CHR; %C-DATE 01253000
SI:=SI-8; DS:=2 CHR; %CYCLE 01253100
SI:=SI+7; DS:=5 CHR; %P-DATE 01253200
DI:=DI+1; SI:=SI+2; 01253300
DS:=5 CHR; %BLOCK COUNT 01253400
DS:=7 CHR; %RECORD COUNT 01253500
END; 01253600
END HDR1FILL; 01253700
SUBROUTINE HARDFILL; 01253800
BEGIN RTN:=PRNTABLE[U].[30:18]; 01253900
STREAM(PTN,AREA,ULAB); 01254000
BEGIN SI:=LOC PIN; DI:=DI+53; 01254100
DS:=5 DEC; DI:=ULAB; %PHYSICAL TAPE NO. 01254200
DS:=8 LIT " LABEL "; 01254300
END; 01254600
ULAB[1]:=MULTITABLE[U]; 01254650
END HARDFILL; 01254700
LABELSPACE; 01254800
IF FROM=1 THEN 01254900
BEGIN VOL1FILL; 01255000
P(WAITIO(@140000005,@377,U);DEL); 01255100
P(WAITIO(AREA INX @120540000000,@377,U),DEL); 01255200
HDR1CHK; 01255300
IF Y THEN HDR1FILL ELSE GO TO ERROR; 01255400
P(WAITIO(@340000005,@55,U),DEL); 01255450
P(WAITIO(@340000005,@55,U),DEL); 01255500
GO TO WAIT; 01255600
END; 01255700
IF FROM =2 THEN 01255800
BEGIN IF TYPE=1 THEN 01255900
BEGIN VOL1FILL; 01256000
VOL: P(WAITIO(AREA INX @120540000000,@377,U),DEL); 01256100
HDR1CHK; 01256200
IF Y THEN HDR1FILL ELSE GO TO ERROR; 01256300
P(WAITIO(@340000005,@377,U),DEL); 01256400
GO TO WAIT; 01256500
END; 01256600
IF TYPE=2 THEN 01256700
BEGIN HDR1FILL; 01256800
HARDFILL; 01256900
GO TO EXIT; 01257000
END; 01257100
END; 01257200
IF FROM=3 OR FROM=4 THEN 01257300
BEGIN IF TYPE=1 THEN 01257400
BEGIN VOL1FILL; 01257500
GO TO VOL; 01257600
END; 01257700
IF TYPE=2 OR TYPE=4 THEN 01257800
BEGIN HDR1FILL; 01257900
HARDFILL; 01258000
GO TO EXIT; 01258100
END; 01258200
IF TYPE=3 OR TYPE=5 THEN 01258300
BEGIN IF DIR=0 THEN 01258400
BEGIN P(WAITIO(@340000005,@377,U),DEL); 01258500
P(WAITIO(@340000005,@377,U),DEL); 01258600
P(WAITIO(AREA INX @120540000000,@377,U),DEL); 01258700
END ELSE 01258800
P(WAITIO(AREA INX @120740000000,@377,U),DEL); 01258900
HDR1CHK; 01259000
IF Y THEN HDR1FILL ELSE GO TO ERROR; 01259100
HARDFILL; 01259200
GO TO WAIT; 01259300
END; 01259400
IF TYPE=6 THEN 01259500
BEGIN HDR1FILL; 01259600
HARDFILL; 01259700
STREAM(ULAB); 01259800
BEGIN DI:=ULAB; DI:=DI+39; 01259900
DS:=1 LIT "1"; 01260000
END; 01260100
GO TO EXIT; 01260200
END; 01260300
END; 01260400
WAIT: PTN:=0; 01260425
TIP: IF((TWO(U) AND P(RRR)) !0) THEN 01260450
GO TO EXIT ELSE SLEEP([CLOCK], NOT CLOCK); 01260455
PTN:=PTN+1; 01260460
IF(PTN>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]<S OR NOT B[S].PBIT) 02216510
ELSE (P(M[T-2].[3:12],DUP)!@700 AND P(XCH)!@1500)); 02216600
FOUND: ADR ~ ADR-T;% 02217000
T:=PLACEFINDER(S,ADR,S); 02217100
IF N GTR 0 THEN 02217200
BEGIN 02217300
B ~ [M[SPACE(TERMMSGSZ)]]; 02218000
DISKWAIT(-(B INX 0),TERMSGSZ,MESSAGETABLE[1].[22:26]); 02219000
END ELSE N:=0; 02220000
STREAM(Z:=N!0,X:=T,T:=6,J:=JAR[P1MIX,0]], 02221000
P1MIX,INDX~PRT[P1MIX,8] INX NOT 2 INX 0, 02222000
DSZE~IF P(M[P(DUP)+1],TOP) THEN P ELSE P.[8:10], 02222200
TOG~(N=7), Q~[B[N]], A); 02223000
BEGIN CI ~ CI+Z; GO TO L1;% 02224000
DS:=LIT "-"; SI:=Q; 02225000
L: SI:=SI+1; 02226000
IF SC = "8" THEN SI:=SI+1 ELSE 02227000
BEGIN A:=DI; DI:=LOC T; 02228000
DS:=OCT; DI:=A; 02229000
END; 02230000
DS:=T CHR; 02231000
IF TOGGLE THEN GO TO L; 02232000
DS ~ LIT " "; GO TO L2;% 02234000
L1: SI ~ A;% 02235000
IF SC ! "~" THEN% 02236000
BEGIN SI ~ SI+1; A ~ SI;% 02237000
GO TO L1;% 02238000
END;% 02239000
DI ~ A;% 02240000
L2:% 02241000
SI ~ J; SI ~ SI+1; DS ~ 7 CHR; DS ~ LIT "/";% 02242000
SI ~ SI+1; DS ~ 7 CHR; DS ~ LIT "=";% 02243000
SI~LOC P1MIX; DS~2DEC; A~DI; 02244000
DI~DI-2; DS~FILL; DS~A; 02244500
SI:=X; DS:=20 CHR; A:=DI; 02245000
TOG(DI~A; DS~2 LIT ". "; A~DI; SI~INDX; 02251010
SKIP SB; IF SB THEN BEGIN DI~INDX; 02251020
SKIP DB; DS~RESET; DI~A; TOG~TALLY; 02251030
DS~12 LIT "EFF INX IS -"; END; 02251040
A~DI; DI~INDX; DI~LOC Q; DS~8 DEC; 02251050
SI~LOC Q; 7(IF SC>"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]<CIDTABLE[UNIT,7] THEN 02347300
BEGIN 02347310
LABELTABLE[UNIT+32]~-@14; 02347315
T~SPACE(13)+2; M[T-4].[9:6]~0; 02347320
M[T INX 10]~UNITCODE[UNIT+9]; 02347325
NEXT: DO UNTIL READEMFROMDISK(CIDROW[UNIT], 02347330
[M[T]]&10[8:38:10]); 02347335
IF PACKETERR[UNIT] THEN BEGIN; 02347340
STREAM(E~"END": Q~@14,D~T); 02347350
BEGIN SI~LOC Q; SI~SI+7; IF SC!DC THEN DI~DI+1; 02347360
Q~DI; S1~Q; 02347370
L: IF SC=" " THEN BEGIN SI~SI+1; GO TO L END; 02347380
DI~LOC E; DI~DI+5; IF 3 SC!DC THEN TALLY+1; 02347390
E~TALLY; END; 02347400
IF P THEN GO TO NEXT; END; 02347410
INDEPENDENTRUNNER(P(.CONTROLCARD),T&(UNIT+32)[2:42:6] 02347430
&ERROR[1:1:1],192); 02347435
PSEUDOCOPY~PSEUDOCOPY+1;% %541-02347437
END ELSE 02347440
ENDOFDECK(UNIT,(UNIT+32)&ERROR[1:1:1]); 02347450
END DRAINO; 02347460
$ POP OMIT 02347461
REAL PROCEDURE UNITIN(TINU,WHAT); VALUE WHAT; REAL WHAT; 02348000
ARRAY TINU[*]; 02348500
BEGIN REAL HOLD; INTEGER T;% 02349000
STREAM(A~0:WHAT);% 02350000
BEGIN SI ~ WHAT;% 02351000
L: IF SC = " " THEN 02352000
BEGIN SI ~ SI + 1; GO TO L; END;% 02353000
DI ~ LOC A; DI ~ DI + 5; DS ~ 3 CHR;% 02353500
END STREAM;% 02354000
HOLD ~ POLISH;% 02355000
$ SET OMIT = NOT(SHAREDISK) 02355999
$ SET OMIT = SHAREDISK 02356499
FOR I~0 STEP 1 UNTIL 64 DO 02356500
$ POP OMIT 02356501
IF TINU[I].[30:18]=HOLD.[30:18] THEN 02357000
BEGIN 02357500
HOLD~I; 02357600
I~70; 02357700
END; 02357800
UNIT~IF I<70 THEN 69 ELSE HOLD; 02358000
END UNITIN; 02359000
PROCEDURE IDLETIME;% 02360000
BEGIN REAL C,N;% 02361000
INTEGER T;% 02362000
HALT;% 02363000
C ~ ((P2MIX}0)+1)|(CLOCK+P(RTR));% 02364000
FOR T ~ 1 STEP 1 UNTIL MIXMAX DO% 02365000
IF JAR[T,*] ! 0 THEN% 02366000
BEGIN N ~ N+1;% 02367000
C ~ -JAR[T,3]-PROCTIME[T]+C; 02368000
END;% 02369000
IF N ! 0 THEN% 02370000
T ~ (C-OLDIDLETIME)/N);% 02371000
OLDIDLETIME ~ C;% 02372000
FOR N ~ 1 STEP 1 UNTIL MIXMAX DO% 02373000
IF JAR[N,*] ! 0 THEN% 02374000
JAR[N,7] ~ *P(DUP)+T;% 02375000
NOPROCESSTOG ~ NOPROCESSTOG-1;% 02376000
END;% 02377000
DEFINE ENTERUSERFILE(ENTERUSEFILE1,ENTERUSERFILE2,ENTERUSERFILE3)= 02378000
P(EUF(ENTERUSERFILE1,ENTERUSERFILE2,ENTERUSERFILE3),DEL);% 02378500
REAL PROCEDURE FUF(A,B,L); VALUE A,B,L; REAL A,B,L; FORWARD; 02379000
INTEGER PROCEDURE CALCULATEPURGE(PURGE);% 02380000
VALUE PURGE; REAL PURGE;% 02381000
BEGIN REAL Y,D;% 02382000
REAL J;% 02383000
REAL C=+1;;% 02384000
STREAM(A~[DATE],B~[Y]);% 02385000
BEGIN S1~A; SI~SI+3; DS ~ 2 OCT; DS ~ 3 OCT END;% 02386000
J ~ (D ~ ( Y+3) DIV 4|1461+(Y+3) MOD 4 | 365 +D+PURGE-% 02387000
1) DIV 1461;% 02388000
IF (Y ~ (D ~ D MOD 1461) DIV 365) = 4 THEN% 02389000
BEGIN Y ~ 3; D ~ 365 END ELSE D ~ D MOD 365;% 02390000
CALCULATEPURGE ~ (4|J+Y-3)|1000+D+1;% 02391000
STREAM(C~[C]); BEGIN SI~C; DS ~ 8 DEC END;% 02392000
END;% 02393000
PROCEDURE CHANGEDATE(BUFF); VALUE BUFF; REAL BUFF; FORWARD; 02393100
DEFINE MIDNIGHT = BEGIN XCLCK:=XCLOCK-WITCHINGHOUR; 02393200
DATE:=CALCULATEPURGE(1); 02393225
CHANGEDATE(SPACE(10)); 02393250
END#; 02393300
REAL PROCEDURE TAPELABEL(M,F,R,C,P); VALUE M,F,R,C,P; %AI02393400
REAL M,F,R,C,P; FORWARD; %AI02393500
$ SET OMIT = NOT (DUMP OR DEBUGGING OR BREAKOUT) 02393790
REAL MFMASK; 02393800
$ POP OMIT 02393810
$ SET OMIT = NOT DEBUGGING %763-02393999
$ SET OMIT = NOT (DEUBGGING OR DUMP) %763-02434051
PROCEDURE DUMPCODE(BUFF); %AI02434100
VALUE BUFF; REAL BUFF; %AI02434110
BEGIN REAL B,S,N,TM,TA,U,D; %AI02434120
INTEGER I; REAL MASK,PARITY; 02434125
ARRAY TP[*]; ARRAY TL[*]; %AI02434130
LABEL X,L1,ERR; 02434135
SUBROUTINE CHECK; 02434162
BEGIN 02434164
IF P(XCH)=@20 THEN 02434166
BEGIN 02434168
STREAM(B~BUFF~BUFF.[15:15]-1); 02434170
DS~32LIT"-DPMT ABORTED, TRY ANOTHER TAPE~"; 02434172
P(WAITIO(@4740000020,@377,U),DEL); % SPACEBACK 02434174
PARITY~1; 02434176
GO ERR; 02434178
END; 02434180
END; 02434182
FOR U~0 STEP 1 UNTIL 15 DO 02434185
IF (MULTITABLE[U] EQV "MEMORY ")=NOT 0 THEN 02434190
IF (LABELTABLE[U].[5:25]="1DUMP") THEN GO L1; 02434195
FOR U~0 STEP 1 UNTIL 15 DO IF LABELTABLE[U]=0 %AI02434200
AND PRNTABLE[U].[1:1] THEN TO GO TO L1; %AI02434210
BUFF:=BUFF.[15:15]-1; %AI02434215
STREAM(BUFF); %AI02434220
DS:=17LIT"#NO MEMDUMP TAPE~"; 02434230
GO TO X; %AI02434240
L1: MULTITABLE[U]:="MEMORY "; %AI02434250
LABELTABLE[U].[1:29]:=@1024644447; %AI02434260
STREAM(A:="001",B:=[LABELTABLE[U]]); %AI02434270
BEGIN SI := LOC A; SI := SI + 5; %AI02434280
DI:=DI+5; DS:=3ADD; %AI02434290
END; %AI02434300
RRRMECH := TWO(U) OR RRRMECH; %AI02434310
B~(SPACE(20))&20[8:38:10]&5[21:45:3]; 02434320
STREAM(LTT~BUFF.[33:15]<100,BUFF~BUFF.[33:15],B); 02434330
BEGIN %AI02434340
DS:=8LIT" "; SI:=B; DS:=19WDS; %AI02434350
DI ~ B; 02434360
LTT(SI ~ LOC BUFF; DS ~ 2 DEC; JUMP OUT 1 TO L);02434365
SI ~ BUFF; 02434367
20(8(IF SC!"~" THEN DS~CHR ELSE JUMP OUT 2 %AI02434370
TO L)); L: %AI02434380
END; 02434390
LABELTABLE[U].[1:5]:=@20; %AI02434400
TL:=[M[TAPELABEL("MEMORY ",LABELTABLE[U].[6:42], %AI02434410
1,1,100]]710[8:28:10]&5[21:45:3]; 02434420
STREAM(A~PRNTABLE[U],[30:18],TL); 02434424
BEGIN SI~LOC A; DI~DI+53; DS~5 DEC END; %AI02434426
TP:=[M[TA:=TYPEDSPACE(513,MDUMPAREAV)]]&513[8:38:10]&02434430
5[21:45:3];% %167-02434435
TM:=0&@1737[1:37:11]; %AI02434440
MASK~@40 & @20[CTF]; %AI02434445
S:=0; %AI02434470
HALT; SLEEP([TOGLE],STOREMASK); %AI02434480
LOCKTOG(STOREMASK); 02434490
WHILE (S:=M[S]).[33:15] NEQ 0 DO %AI02434500
IF M[S].[1:17]=@1000 THEN %AI02434510
D:=OLAY(S.[33:15]); %AI02434520
UNLOCKTOG(STOREMASK); 02434530
P(WAITIO(TL,MASK,U),DEL); 02434532
P(WAITIO([TM],MASK,U),DEL); 02434534
S:=0; %AI02434540
DO BEGIN %AI02434550
N:=S.[33:3]; %AI02434560
IF(MEMASK AND TWO(N))NEQ 0 THEN S:=-S 02434570
ELSE MOVE(512,S,TA+1); %AI02434580
TP[0] := S; %AI02434590
P(WAITIO(TP,MASK,U)); CHECK; 02434600
IF S LSS 0 THEN S := 3584 - S; %AI02434610
END UNTIL (S:=S+512).[18:15]; %AI02434620
P(WAITIO(B,MASK,U)); CHECK; 02434630
LABELTABLE[U].[1:5]~@01; %AI02434690
BUFF:=BUFF.[15:15-1; %AI02434695
STREAM(U~TINU[U],L~LABELTABLE[U],BUFF); %AI02434700
BEGIN %AI02434710
SI:=LOC U; SI := SI + 5; %AI02434720
DS:=1LIT" "; DS:=3CHR; %AI02434730
SI~LOC L; SI~SI+1; DS~ 1 LIT " "; DS~7 CHR; %AI02434735
DS:=7LIT" DP-ED~"; %AI02434740
END; %AI02434750
ERR: P(WAITIO([TM],MASK,U),DEL); 02434760
P(WAITIO(TL,MASK,U),DEL); 02434770
IF PARITY HEN SETNOTINUSE(U,1) ELSE 02434780
BEGIN 02434790
P(WAITIO([TM],MASK,U),DEL); 02434800
P(WAITIO(@4740000020,@377,U),DEL); 02434810
END; 02434820
FORGETSPACE(TP); 02434830
FORGETSPACE(TL); 02434840
FORGETSPACE(B); 02434850
NOPROCESSTOG!NOPROCESSTOG-1; 02434860
X: SPOUT(BUFF); 02434870
END DUMPCORE; 02434880
$ POP OMIT 02434890
$ SET OMIT = NOT(DEBUGGING) 02434999
$ SET OMIT = NOT(DATACOM AND DCSPO ) 02522099
PROCEDURE NAMEIO(A,KTR);% 02603000
REAL A,KTR;% 02604000
BEGIN;% 02605000
STREAM(A~[A]:KTR);% 02606000
BEGIN DI ~ A; DS ~ 8 LIT "0 ";% 02607000
DI ~ DI-7; SI ~ KTR;% 02608000
L: IF SC = " " THEN% 02609000
BEGIN SI ~ SI+1; GO TO L END;% 02610000
IF SC = """ THEN% 02611000
BEGIN SI ~ SI+1;% 02612000
7(IF SC = "~" THEN JUMP OUT TO EXIT;% 02613000
DS ~ CHR;% 02614000
IF SC = """ THEN JUMP OUT TO LQ;);% 02615000
LS: IF SC ! """ THEN IF SC ! LEFTARROW THEN %152-02615100
BEGIN SI := SI + 1; GO TO LS; END; %152-02615200
IF SC = LEFTARROW THEN GO TO EXIT; %152-02615300
LQ: SI ~ SI+1;% 02616000
GO TO EXIT;% 02617000
END;% 02618000
IF SC = ALPHA THEN% 02619000
BEGIN 7(DS ~ CHR;% 02620000
IF SC = ALPHA THEN GO TO LA;% 02621000
JUMP OUT TO EXIT;% 02622000
LA: );% 02623000
LE: IF SC = ALPHA THEN % 02623500
BEGIN SI~SI+1; GO TO LE; END; % 02623501
GO TO FIXIT;% 02624000
END;% 02625000
IF SC = "~" THEN% 02626000
BEGIN DS ~ CHR; SI ~ SI-1; GO TO EXIT END;% 02627000
IF SC = "=" THEN% 02628000
BEGIN DS~2 LIT"~~"; SI~SI+1; GO TO EXIT END; 02629000
DS ~ CHR;% 02630000
EXIT:A ! SI;% 02631000
END;% 02632000
KTR ~ P(XCH);% 02633000
END;% 02634000
REAL PROCEDURE TAPELABEL(MULFID,FID,REELNO,CYCLE,PURGE);% 02635000
VALUE MULFID,FID,REELNO,CYCLE,PURGE;% 02636000
REAL MULFID,FID,REELNO,CYCLE,PURGE;% 02637000
BEGIN REAL LBL;% 02638000
LBL:=TYPEDSPACE(10,LABELAREAV);% %167-02639000
STREAM(% 02640000
DATE, MULFID,FID,REELNO,CYCLE,PU~CALCULATEPURGE(PURGE),% 02641000
LBL);% 02642000
BEGIN% 02643000
DS~8 LIT" LABEL ";% 02644000
SI~LOC MULFID;% 02645000
DS~WDS;% 02646000
DS~WDS;% 02647000
DS~3 DEC;% 02648000
SI ~ LOC DATE; SI ~ SI+3;% 02649000
DS ~ 5 CHR;% 02650000
SI~LOC CYCLE;% 02651000
DS~ 2 DEC; 02652000
SI~LOC PU; SI~SI+3;% 02653000
DS~5 CHR; DS~1 LIT"0";% 02654000
5(DS~8 LIT"00000000")% 02655000
END;% 02656000
TAPELABEL~LBL;% 02657000
END;% 02658000
REAL PROCEDURE LABELASCRATCH(LBL); VALUE LBL; REAL LB;% 02659000
BEGIN% 02660000
REAL LUN,TM,REEL,T; 02661000
LBL ~ P(.LBL,LOD).]CF] & 10[8:38:1]; & 02662000
(IF P(.LBL,LOC).[7:1] THEN 1 ELSE 5)[21:45:3]; 02662050
STREAM(L~LBL+3,R~[REEL]); 02662100
BEGIN SI~L; DSD~3 OCT END; 02662200
LUN~FINDOUTPUT(M[LBL+1],M[LBL+2],REEL,0,0,2,0,TM); 02663000
IF LUN}0 THEN 02663100
BEGIN; 02663200
STREAM(A~PRNTABLE[LUN].[30:18]],T~[T],L~LBL+6); 02664000
BEGIN DI~DI+5; SI~LOC A; DS~5DEC; SI~SI-8; DI~T; 02664100
DS~8DEC; DI~DI-7; DS~6FILL; END; 02665000
RDCTABLE[LUN].[8:6]~P1MIX; 02665100
M[LBL+1].[1:5]:=0; %148-02665110
MULTITABLE[LUN]~M[LBL+1]; 02665150
RRRMECH~TWO(LUN) OR RRRMECH; 02665200
P(WAITIO(LBL,0,LUN),DEL); 02666000
TM~0&"}~"[1:37:11];% 02667000
P(WAITIO([TM],0,LUN),DEL);% 02668000
$ SET OMIT = PACKETS 02668099
FILEMESSAGE(" OUT"&TINU[LUN][6:30:18],T, 02668500
M[LBL+1],M[LBL+2],REEL,0,0,OPNMESS); 02668600
END; 02668800
LABELASCRATCH~LUN% 02669000
END LABELASCRATCH;% 02670000
PROCEDURE NSECOND;FORWARD;% 02692000
DEFINE CHECKSTACKSPACE = IF P(PRT[P1MIX,*] INX 0)-P(0,RDS)<128 %WF 02693000
THEN BEGIN P(64,STS); GO TO STACKOVERFLOW; END#; %WF 02694000
ARRAY USERCODE[*]; 02695000
REAL PROCEDURE SECURITYCHECK(M,F,U,H); 02696000
VALUE M,F,U; REAL M,F,U,H; FORWARD; 02696100
PROCEDURE MAKEPRESENT(C); VALUE C; REAL C; FORWARD; 02696200
PROCEDURE SIGNOFF(V,F,W);VALUE V,F,W;ARRAY V[*],F[*];REAL W;FORWARD; 02696300
SAVE PROCEDURE IOREQUEST(F,I,L); VALUE F,I,L; ARRAY F,L[*]; REAL I; 02696500
FORWARD; 02696600
BOOLEAN PROCEDURE MTXIN(I,UMB); REAL U,B; INTEGER I; FORWARD; 02696700
$ SET OMIT = NOT(BREAKOUT AND AUXMEM) 02697299
DEFINE CODEADDRESS(CODEADDRESS1,CODEADDRESS2)= 02697710
ACTUALOVERLAYADDRESS(1,CODEADDRESS1,CODEADDRESS2)#, 02697720
DATAADDRESS(DATAADDRESS1,DATAADDRESS2)= 02697730
ACTUALOVERLAYADDRESS(0,DATAADDRESS1,DATAADDRESS2)#; 02697740
SAVE INTEGER PROCEDURE ACTUALOVERLAYADDRESS(TYPE,MIX,LOC); 02697750
VALUE TYPE,MIX,LOC); INTEGER TYPE,MIX,LOC; FORWARD; 02697770
$ SET OMIT = NOT(BREAKOUT) 02700000
$ SET OMIT = NOT(DATACOM AND DCSPO ) 03500099
SAVE PROCEDURE INITIATEIO(IODESC,MIX,U);% 04000000
VALUE IODESC,MIX,U;% 04001000
REAL MIX,U;% 04002000
REAL IODESC;% 04003000
BEGIN REAL C=+1;LABEL EXIT; 04004000
$ SET OMIT = NOT(STATISTICS) 04004099
IF (P(IODESC.[3:5] %204-04004110
$SET OMIT = DKBNODFX %204-04004119
,DUP)= @14 OR P(XCH %204-04004120
$ POP OMIT %204-04004121
) = @6) AND %204-04004130
NOT IODESC.[24:1] AND %204-04004140
(((P(M[IODESC.[CF]],DUP) EQV 0)=NOT 0) OR %204-04004150
((P(XCH) EQV 32)=NOT 0)) AND %204-04004155
NOT OKSEGZEROWRITE THEN %204-04004160
BYBY("SEGMENT ZERO OVERWRITE~",23); %204-04004170
P(TIO); 04004200
CHANNEL[P(DUP)]*U; 04005000
P([IODESC],TIO); 04006000
CNANIO[C]~CLOCK+P(RTR); 04007000
$ SET OMIT = NOT(STATISTICS AND AUXMEM) 04007099
IF U < 16 THEN 04008000
BEGIN 04008100
IF IODESC.[22:1] THEN% 04009000
BEGIN TRANSACTION[U] ! IF IODESC.[18:1] THEN 0% 04010000
ELSE TRANSACTION[U]-1;% 04011000
GO TO EXIT;% 04012000
END; 04013000
$ SET OMIT = NOT(STATISTICS) 04013009
END 04013100
ELSE 04013200
IF (U OR 1)=19 THEN 04013300
BEGIN 04014000
FUIO[C]~CLOCK+P(RTR); 04014002
$ SET OMIT = NOT(STATISTICS) 04014009
END; 04014100
$ RESET OMIT 04014105
TRANSACTION[U] := P(DUP,LOD)+1; 04014500
EXIT:END;% 04015000
SAVE PROCEDURE QUEUEUP(U); VALUE U; REAL U;% 04016000
BEGIN IF U=30 THEN 04016100
WAITQUE[FIRSTWAIT:=(FIRSTWAIT+31) AND 31]:=U ELSE 04016200
BEGIN WAITQUE[NEXTWAIT] ~ U;% 04017000
NEXTWAIT ~ NEXTWAIT+1 AND 31;% 04018000
END;% 04019000
END; 04019100
$ SET OMIT = NOT(DFX) 04019499
SAVE PROCEDURE STARTIO(U); VALUE U; REAL U; 04020000
BEGIN REAL T=NT1,R=NT2, S=NT3;% 04021000
$ SET OMIT = NOT(DFX) 04021099
IF (T ~ UNIT[U]).[13:5] = 0 THEN% 04022000
IF (S ~ T.[18:15]) < @1777 THEN% 04023000
$ SET OMIT = NOT(DFX) 04023099
BEGIN IF P(TIO) ! 0 THEN% 04024000
BEGIN INITIATEIO(IOQUE[S],LOCATQUE[X].[3:5]04025000
,U);% 04026000
P(3);% 04027000
END% 04028000
ELSE BEGIN QUEUEUP(U);% 04029000
P(4);% 04030000
END;% 04031000
P(T&P(XCH)[15:45:3],UNIT[U],~);% 04032000
$ SET OMIT = DFX 04032999
END;% 04033000
$ POP OMIT 04033001
$ SET OMIT = NOT(DFX) 04033049
END;% 04034000
SAVE PROCEDURE PRINTERFINISHED(U); VALUE U; REAL U;% 04035000
BEGIN 04036000
$ SET OMIT = NOT(NEWLOGGING) 04036099
IF NOT UNIT[U].[16:1] THEN UNIT[U].[17:1] ~ 0; 04036200
STARTIO(U);% 04037000
GO TO EXTERNAL;% 04038000
END;% 04039000
SAVE PROCEDURE IOREQUEST(FINAL,IODESC,LOCATION);% 04040000
VALUE FINAL,IODESC,LOCATION;% 04041000
ARRAY FINAL,LOCATION[*];% 04042000
REAL IODESC;% 04043000
BEGIN REAL U=NT1,T=NT2,S=NT3,R=+1;% 04044000
$ SET OMIT = NOT(DFX) 04044099
IF IOQUESLOTS LEQ 04045000
(U:=IF LOCATION.[9:1] OR P1MIX=0 THEN 0 ELSE 7) THEN 04045100
SLEEP([IOQUESLOTS],@77-U); 04045200
IOQUEAVAIL ~ IOQUE[S:=IOQUEAVAIL]; 04046000
$ SET OMIT = NOT(STATISTICS) 04047009
$ SET OMIT = NOT(DFX) 04047099
$ SET OMIT = NOT(DKBNODFX AND NOT DFX) 04048701
$ SET OMIT = DFX 04048799
IF (T ~ UNIT[U ~ LOCATION.[12:6]]).[13:5] = 0 THEN 04048800
$ POP OMIT 04048801
BEGIN IF P(TIO) ! 0 THEN% 04049000
BEGIN INITIATEIO(IODESC,P1MIX,U);% 04050000
P(3);% 04051000
END ELSE BEGIN QUEUEUP(U);% 04052000
P(4);% 04053000
END;% 04054000
T ~ T&P(XCH)[15:45:3]&S[18:33:15];% 04055000
END ELSE% 04056000
IF T.[18:6] = @77 THEN% 04057000
T.[18:15] ~ S ELSE% 04058000
LOCATQUE[P(T.[33:15],DUP)]~LOCATQUE[R]&% 04059000
S[18:33:15];% 04060000
$ SET OMIT = NOT(DFX) 04060099
IOQUESLOTS:=IOQUESLOTS-1; 04060500
LOCATQUE[S] ~ LOCATION&P1MIX[3:43:5] OR @7777700000;% 04061000
$ SET OMIT = DFX 04061999
UNIT[U] ~ T&S[33:33:15];% 04062000
$ POP OMIT 04062001
IOQUE[S] ~ IODESC;% 04063000
FINALQUE[S] ~ FINAL;% 04064000
END;% 04065000
SAVE PROCEDURE FINISHOFFIO(U); VALUE U; REAL U;% 04067000
BEGIN REAL T=NT1, FIN=NT3, V=NT4, IOD=NT6; 04068000
LABEL ON,OFF,C0,C1,C2,C3,C4,C5,C6,C7;% 04069000
SWITCH CSW ~ C0,C1,C2,C3,C4,C5,C6,C7;% 04070000
IF FIN > 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<NEUP.[FF] THEN 04194550
PEUIO[JUNK]:=P(DUP,LOD)+CLOCK+P(RTR)-EUIO[C]; 04194600
END; 04194650
I~(S1~LOCATQUE[S]).[3:5]; % FIND MIX INDEX 04194700
$ SET OMIT = NOT(NEWLOGGING) 04194799
IOTIME[I]~(*P(DUP))+TIM; 04195000
IF P(.S1,LOD).[10:1] THEN FORGETSPACE(IOD); % NO MEM MESSAGE 04195100
IF F!0 THEN 04196200
IF STOP THEN 04196400
P(T) 04196600
ELSE GO TO L1 04196800
ELSE BEGIN 04197000
RETURNIOSPACE(S); 04199000
L1: P(T&P(.L1,LOD)[FTF]); 04201000
END; 04202000
P([UNIT[U]],STD); 04203000
FIN ~ FINALQUE[S] AND NOT MEMORY;% 04205000
IF (U OR 1) NEQ 17 THEN 04205012
IF IOD.[24:1] THEN% 04206000
BEGIN V ~ ABS(IOD.[33:15]-R.[33:15]);% 04207000
IF IOD.[8:10] < V THEN% 04208000
IF IOD.[23:1] THEN% 04209000
V ~ IOD.[8:10];% 04210000
IF U < 16 THEN% 04211000
IF IOD.[21:2] = 0 THEN% 04212000
BEGIN; STREAM(A!0:B~M[S1.[33:15]+V-1]);% 04213000
BEGIN SI ~ LOC B;% 04214000
IF SC = "~" THEN TALLY ~ 1;% 04215000
A ~ TALLTY;% 04216000
END;% 04217000
V ~ -P+V;% 04218000
END;% 04219000
IF U ! 30 THEN % NOT DCA 04219100
FINISHOFFIO(U);% 04220000
END;% 04221000
IF E ! 0 THEN% 04222000
$ SET OMIT = NOT(SHAREDISK) 04222499
BEGIN IF STOP LEQ 1 THEN 04223000
BEGIN 04223500
INDEPENDENTRUNNER( 04224000
P(.DISKORAUXERROR)+((U AND @774) NEQ 16), 04224010
R&S[3:43:5],240); 04224100
LOCATQUE[S].[11:1]:=1; 04224500
END 04224750
ELSE IF FIN < 0 THEN P(LOCATQUE[S],R,XCH,~);% 04225000
END% 04226000
$ SET OMIT = NOT(SHAREDISK) 04226499
ELSE BEGIN% 04227000
IF FIN < 0 THEN P(R OR IOMASK,LOCATQUE[S],~)% 04228000
ELSE 04229000
$ SET OMIT = NOT (DATACOM OR DFX OR DKBNODFX) 04229099
BEGIN 04229200
LOCN ~ [M[LOCATQUE[S]]];% 04230000
IOD ~ IOD.[33:15];% 04231000
WHILE LOCN[0].[33:15] ! IOD DO% 04232000
LOCN ~ 1 INX LOCN;% 04233000
LOCN[0] ~ M OR FIN;% 04234000
END END;% 04235000
IF P1MIX = 0 THEN GO TO NOTHINGTODO;% 04236000
IF I = P1MIX THEN GO TO RETURN;% 04237000
GO TO INITIATE;% 04238000
END IOCOMPLETE;% 04239000
SAVE REAL PROCEDURE WAITIO(IOD,MASK,U);% 04240000
VALUE MASK,U,IOD;% 04241000
REAL MASK,U,IOD;% 04242000
BEGIN% 04243000
REAL T; 04243100
DEFINE OCTADE= DS~3 RESET;3(IF SB THEN DS!SET ELSE 04243200
DS~RESET;SKIP SB)#; 04243300
IOD ~ NFLAG(P(.IOD,LOC))&TINU[U][3:3:5];% 04244000
MASK ~ NOT MASK;% 04245000
IOREQUEST(NABS(IOD)&MASK[25:40:8],IOD, 04246000
[IOD]&U[12:42:6]);% 04247000
IOD ~ IOD&0[25:25:8]&0[19:19:1];% 04248000
SLEEP([IOD],IOMASK);% 04249000
IF ((WAITIO~IOD.[26:7]) AND MASK AND MAKS.[18:15])!0 THEN 04250000
BEGIN 04251000
T~SPACE(12); 04251100
STREAM(IOD~IOD.[26:7],MASK~(NOT MASK).[41:7], 04251200
Z~[TINU[U]],T~T); 04251300
BEGIN DS~20 LIT" UNEXP I-O ERROR ON ";SI~Z; 04251400
SI~SI+5;DS~3 CHR;DS~8 LIT":RESULT="; 04251500
SI~LOC IOD;SI~SI+6;SKIP 3 SB;3(OCTADE); 04251600
DS~6 LIT",MASK=" ;SI~SI+6;SKIP 3 SB; 04251700
3(OCTADE);DS~2 LIT".~"; 04251800
END; 04251900
IF P1MIX = 0 THEN BEGIN P(T); PUNT(0) END; 04252000
IF NOTERMSET(P1MIX) THEN 04252100
BEGIN 04252200
TERMINATE(P1MIX&19[18:33:15]); 04252300
IF JAR[P1MIX,9].SYSJOBF THEN %SYSTEM JOB 04252500
BEGIN 04252600
SPOUT(T); 04252700
BLASTQ(U); 04252800
END ELSE 04252900
TERMINALMESSAGE(-T); 04253000
END; 04253100
END; 04253200
END; 04253300
REAL PROCEDURE TAPEPARITYRETRY(R,U,KEY);% 04254000
VALUE R,U,KEY; REAL R,U,KEY; FORWARD; 04255000
REAL PROCEDURE WRITEPARITYREELSWITCH(OIOD,RC); 04255100
VALUE OIOD,REC; REAL OIOD,RC; FORWARD; 04255200
PROCEDURE DISKORAUXERROR(R); VALUE R; REAL R; 04256000
04256200
BEGIN 04256400
REAL MSCW = -2, 04256600
U = +1, 04256800
S = +2, 04257000
E = +3, 04257200
T = +4, 04257400
MK = +5, CELL = MK, 04257600
IOD = +6, 04257800
MIX = +7, 04258000
FIN = +8, PARITY= FIN, 04258200
KEY1 = +9, 04258400
KEY2 = +10, 04258600
DISC = +11, 04258800
MASK = +12, 04259000
AREA = +13, U1 = AREA, 04259200
RLST = +14, MSG = RSLT, 04259400
PRTMAX = +15, T1 = PRTMAX, 04259600
DISKCELL= +16, T2 = DISKCELL, 04259800
TERMNATE = +17, 04260000
OLAYIO = +18, 04260200
DSKADRS = +19; 04260400
04260600
NAME LOCN = +16; 04260800
04261000
LABEL DSIT, START, QUIT, RETRY, KILLL, KILLER; 04261200
$ SET OMIT = NOT(PACKETS) 04261299
DEFINE UNITNO = PSEUDOMIX[MIX]#; 04261300
$ POP OMIT 04261301
04261400
$ SET OMIT = NOT(AUXMEM) 04261600
04271200
SUBROUTINE DISKMESSAGE; 04271400
BEGIN 04271600
STREAM(MSG, MK, A:=TINU[U], MIX, B:=DSKADRS, 04271800
S:=IOQUE[S].[27:6], R, KEY1:=KEY1:=SPACE(10)); 04272000
BEGIN 04272200
SI:= LOC MK; SI:=SI+7; DS:= CHR; 04272400
SI:=SI+5; DS:=3CHR; DS:=LIT" "; 04272600
CI:=CI+MSG; 04272800
GO L0; GO L1; GO L2; GO L3; GO L4; GO L5; GO L6; GO L7; 04273000
L0: DS:= 9LIT"NOT READY"; GO TO MX; 04273200
L1: DS:= 4LIT"BUSY"; GO TO MX; 04273400
L2: DS:= 8LIT"I/O MEM "; 04273600
L3: DS:= 6LIT"PARITY"; GO TO MX; 04273800
L4: DS:=12LIT"I/O INV ADDR"; GO TO MX; 04274000
L5: DS:= 3LIT"EU "; GO TO L0; 04274200
L6: DS:=13LIT"INV DISK ADDR";GO TO MX; 04274400
L7: DS:=10LIT"WRITE LOCK"; 04274600
MX: DS:= 6LIT", MIX="; DS:=2DEC; 04274800
MSG:=DI; DI:=DI-2; DS:=FILL; DI:=MSG; 04275000
DS:=5LIT", DA="; DS:=8CHR; 04275200
DS:=7LIT", SEGS="; DS:=2DEC; 04275400
DS:=4LIT", R="; 04275600
16(DS:=3RESET; 3(IF SB THEN DS:=SET ELSE DS:=RESET; SKIP SB)); 04275800
SI:=SI-5; DS:=5LIT", IO="; 04276000
IF SB THEN DS:=2LIT"4,"; SKIP SB; 04276200
IF SB THEN DS:=2LIT"3,"; SKIP SB; 04276400
IF SB THEN DS:=2LIT"2,"; SKIP SB; 04276600
IF SB THEN DS:=2LIT"1,"; 04276800
DI:=DI-1; DS:=LIT"~"; 04277000
END STREAM STATEMENT; 04277200
END SUBROUTINE DISKMESSAGE; 04277400
04277600
SUBROUTINE DETAILRECORDENTRY; 04277800
BEGIN 04278000
KEY2 := TYPEDSPACE(6,MAINTBUFFAREAV);% %167-04278200
M[KEY2] := 0 & RDCTABLE[U][18:1:2]; 04278400
IF MIX NEQ 0 THEN 04278600
BEGIN 04278800
M[KEY2] := (*P(DUP)) & MIX[20:43:5] & 04279000
(IF FINALQUE[S] LSS 0 THEN 0 ELSE 04279200
(M[M[LOCATQUE[S] INX NOT 2] INX 4].[13:11] DIV ETRLNG)+1)[9:39:9];04279400
END; 04279600
M[KEY2+1] := TRANSACTION[U]; 04279800
IF NOT DISC THEN 04280000
BEGIN 04280200
STREAM(S:=IOD.[FF], D:=KEY2+2); 04280400
BEGIN 04280600
SI:=LOC S; DS:=8DEC; 04280800
END; 04281000
END 04281200
ELSE M[KEY2+2] := DSKADRS; 04281400
M[KEY2+3] := IOQUE[S]; 04281600
M[KEY2+4] := R & RDCTABLE[U][3:5:5]; 04281800
M[KEY2+5] := IF FINALQUE[S] LSS 0 THEN 0 ELSE LOCATQUE[S] INX NOT 2; 04282000
END DETAILRECORDENTRY; 04282200
04282400
SUBROUTINE FINISHDETAIL; 04282600
BEGIN 04282800
IF MIX NEQ 0 THEN CHECKJOBORFILEMESS(MIX,M[KEY2+5],U); 04283000
LINKUP(4+DISK,KEY2); 04283200
END; 04283400
04283600
P(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 04283800
04284000
DISC:=(U:=LOCATQUE[S:=R.[3:5]].[12:6]).[46:1]; 04284200
MIX:=LOCATQUE[S].[3:5]; 04284400
IF (OLAYIO := ((FINALQUE[S] LSS 0) AND (LOCATQUE[S].[9:1]))) THEN 04284600
BEGIN 04284800
STREAM(S:=0&FINALQUE[S][CTC]&FINALQUE[S][21:8:12], D:=[DSKADRS]); 04285000
BEGIN 04285200
SI:=LOC S; DS:=8DEC; % DISK ADDRESS IN FINALQUE FOR OLAY I/O 04285400
END; 04285600
END ELSE DSKADRS := M[IOQUE[S]]; 04285800
MK:="*"; MSG:=(-1); 04286000
R:=R&IOQUE[S][3:3:5]; % RESTORE HARDWARE UNIT TYPE 04286200
IOD := IOQUE[S]; 04286400
IF DISC THEN 04286600
BEGIN 04286800
IF R.[30:1] THEN % DISK NOT READY 04287000
BEGIN 04287200
$ SET OMIT = NOT(DFX) 04287400
UNIT[U]:=(*P(DUP))&@77777[5:20:28]; 04295400
MSG:=0; MK:="#"; % NOT READY 04295600
DISKMESSAGE; 04295800
DETAILRECORDENTRY; 04296000
READY := NOT TWO(U) AND READY; 04296200
RRRMECH := NOT TWO(U) AND RRRMECH; 04296400
UNIT[U].[5:10] := 2; 04296600
GO TO KILLL; 04298800
END; % IF NOT READY 04299000
LOCATQUE[S].[FF] := NOT 0; 04299200
IF R.[26:7] NEQ 1 AND NOT OLAYIO THEN % NOT BUSY OR SPECIAL I/O 04299600
BEGIN 04299800
PARITY := (IOD.[24:1] AND (R.[26.7]=16)); % PARITY CONDITION 04300000
IF FINALQUE[S] GTR 0 THEN % OBJECT JOB ERROR 04300200
BEGIN 04300400
IF PARITY THEN GO TO START; % RECOVERABLE ERROR 04300500
DSIT: TERMINATE(MIX&20[CTF]); 04300600
END % OBJECT ERROR 04301000
ELSE 04301200
BEGIN % MCP I/O 04301400
IF MIX NEQ 0 THEN 04301600
BEGIN 04302000
IF JAR[MIX,9].SYSJOBF THEN % "SYSTEM" JOB 04302200
IF PARITY THEN GO TO START; 04302600
% DONT DS LIBMAIN/DISK ON PARITY ERROR 04302800
GO TO DSIT; 04303000
END; % NON-ZERO MIX 04303200
END; % MCP I/O 04303400
END; % NOT BUSY OR SPECIAL I/O 04303600
04303800
START: 04304000
04304200
TRANSACTION[U] := TRANSACTION[U]-1; 04304400
MASK := IF (FIN := FINALQUE[S]) LSS 0 THEN FIN.[25:8] ELSE @377; 04304600
IF (E := R.[25:8] AND MASK) = 0 THEN % ERRORS ARE ACCEPTABLE 04304800
BEGIN % FIX UP IOQUE 04305000
QUIT: 04305200
IF MSG NEQ (-1) AND DISC THEN DISKMESSAGE; 04305400
DETAILRECORDENTRY; 04305600
$ SET OMIT = NOT(AUXMEM); 04305800
RETURNIOSPACE(S); 04309200
04309400
FIN:=FINALQUE[S] AND NOT MEMORY; 04309600
IF (T1:=FIN) LSS 0 THEN % MCP I/O 04309800
BEGIN 04310000
IF NOT OLAYIO THEN % I/O FINISH PLACES RESULT DESC. FOR OLAY04310200
M[LOCATQUE[S]]:=R&E[25:40:8]&IOD[3:3:5] OR IOMASK; 04310400
END % IF MCP I/O 04310600
ELSE 04310800
BEGIN 04311000
IF E NEQ 0 THEN % ERRORS 04311200
BEGIN 04311400
P(.T1,PRL); 04311600
T1 := T1&E[25:40:8]; 04311800
END 04312000
ELSE P(.T1,IOR); 04312200
LOCN := [M[LOCATQUE[S]]]; 04312400
IOD := IOD.[33:15]; 04312600
WHILE LOCN[0].[33:15] NEQ IOD DO LOCN := 1 INX LOCN; 04312800
LOCN[0] := P(.T1,LOD); 04313000
END; 04313200
GO TO KILLL; 04313600
END; 04313800
IF E THEN % BUSY 04314000
BEGIN 04314200
MSG:=1; % BUSY 04314400
RETRY: 04314600
$ SET OMIT = NOT(AUXMEM) 04314790
DISKMESSAGE; 04314820
DETAILRECORDENTRY; 04315000
$ SET OMIT = NOT(AUXMEM) 04315190
T1:=(IF DISC THEN IOQUE[S]&6[3:43:5] ELSE IOQUE[S]; 04315400
RETURNIOSPACE(S); 04315600
04315800
P1MIX:=MIX; 04316000
IF NOT OLAYIO THEN % RETRIES ARE OK 04316400
IOREQUEST(FINALQUE[S], T1, 04316600
(IF DISC THEN LOCATQUE[S]&@22[12:42:6] ELSE 04316800
LOCATQUE[S])); 04317000
P1MIX:=0; 04317200
GO TO KILLER; 04317400
END; % IF BUSY 04317600
IF E.[46:1] THEN % I/O MEMORY PARITY 04317800
BEGIN 04318000
MSG:=2; 04318200
E:=@1537; 04318400
GO TO QUIT; 04318600
END; 04318800
IF E.[41:1] THEN % INVALID ADDRESS 04319000
BEGIN 04319200
MSG:=4; 04319400
E:=@1537; 04319600
GO TO QUIT; 04319800
END; 04320000
$ SET OMIT = NOT(SHAREDISK) 04320200
IF NOT E.[43:1] THEN % NOT PARITY,CHECK DISK ADDRESS 04325400
BEGIN 04325600
STREAM(DA:=MASK:=DSKADRS : EU:=MASK.[6:6], A:=0, 04325800
EUA:=[MULTITABLE[16+2|MAXK.[5:1]]]); 04326000
BEGIN 04326200
SI:=LOC DA; 04326400
IF SC GTR "1" THEN GO TO BAD; 04326600
IF SC LSS "0" THEN GO TO BAD; 04326800
$ SET OMIT = SHAREDISK 04327000
7( 04327200
$ POP OMIT 04327400
$ SET OMIT = NOT(SHAREDISK) 04327600
IF SC LSS "0" THEN JUMP OUT TO BAD; SI:=SI+1; 04328200
IF SC GTR "9" THEN JUMP OUT TO BAD); 04328400
$ SET OMIT = SHAREDISK 04328600
SI:=SI-5; 04328800
$ POP OMIT 04329000