1
0
mirror of https://github.com/pkimpel/retro-b5500.git synced 2026-02-12 19:27:39 +00:00
Files
pkimpel.retro-b5500/SYMBOL/DCMCP.esp_m
paul.kimpel@digm.com 47e5d09ef7 1. Release emulator version 0.07.
2. Implement interrupt and device status latching in B5500CentralControl to support better UI display.
3. Implement B5500CardPunch device.
4. Implement preliminary and experimental B5500DummyPrinter device; correct printer I/O initiation in IOUnit.
5. Correct the way that Printer Finished interrupts are handled in IOUnit and CentralControl.
6. Implement Card Load Select in B5500Console and B5500SyllableDebugger.
7. Fix lack of presence-bit detection in return ops for returned values.
8. Redesign B5500CardReader UI to show last two cards read; change method of emptying the input hopper.
9. Set CHECK option and rework SYSTEM/LOG initialization in B5500ColdLoader.html.
10. Centralize system memory cycle time setting; change from 6us to 4us memory cycle time.
11. Increase Processor timeslice to 16ms and rework Processor.schedule() internals for more accurate performance throttling in browsers with poor setTimeout() granularity.
12. Reduce Processor syllable overhead from 2 cycles to 1.
13. Change B5500SPOUnit method of output to "paper" to work better in Google Chrome.
14. Make documentation and debugging enhancements in B5500IOUnit.
15. Release initial test website HTML and Unisys license PDF.
16. Commit Mark XVI DCMCP transcription as of 2013-06-21.
2013-06-24 05:04:15 +00:00

23564 lines
2.0 MiB

%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([TOGLE],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
$ SET OMIT = NOT(SHAREDISK) 04329200
DI:=LOC DA; DS:=2 OCT; 04329800
SI:=EUA; SI:=SI+14; SKIP EU SB; 04330000
DI:=LOC A; DI:=DI+7; SKIP 2 DB; 04330200
IF SB THEN SKIP DB; 04330400
SI:=LOC DA; SI:=SI+6; 04330600
IF SC NEQ "0" THEN GO TO BAD; SI:=SI+1; 04330800
4(IF SB THEN DS:=SET ELSE DS:=RESET; SKIP SB); 04331000
SI:=LOC A; SI:=SI+7; IF SC GTR "4" THEN GO TO BAD; 04331200
IF SC LSS "0" THEN GO BAD; 04331400
SI:=EUA; SI:=SI+EU; SKIP SB; SKIP A SB; 04331600
IF SB THEN GO TO OK; 04331800
BAD: TALLY:=1; 04332000
OK: DA:=TALLY; 04332200
END; 04332400
IF (MASK:=P) OR E.[42:1] THEN % BAD ADDRESS OR EU NOT READY 04332600
BEGIN 04332800
MSG:=5+MASK; % 5=EU NOT READY, 6=INVALID DISK ADDRESS 04333000
IF NOT MASK THEN MK:="#"; 04333200
IF (MIX NEQ 0) OR OLAYIO THEN 04333400
BEGIN 04333600
E:=@1537; GO TO QUIT; 04333800
END; 04334000
DISKMESSAGE; 04334200
DETAILRECORDENTRY; 04334400
GO TO KILLER; % LET IT HANG 04334600
END 04334800
ELSE 04335000
BEGIN % MUST BE E.[44:1], MEM.PAR. 04335200
MSG:=2; E:=@1537; GO TO QUIT; 04335400
END; 04335600
END; % IF NOT PARITY 04335800
IF IOQUE[S].[24:1] THEN % DISK PARITY ON READ 04336000
BEGIN 04336200
MSG:=3; % PARITY 04336400
E:=@20; 04336600
GO TO QUIT; 04336800
END; 04337000
MSG:=7; % WRITE LOCK 04337200
E:=@1537; 04337400
GO TO QUIT; 04337600
END; % IF DISK 04337800
04338000
$ SET OMIT = NOT(AUXMEM) 04338200
KILLL: 04351600
LOCATQUE[S].[11:1]:=0; 04351800
KILLER: 04352000
IF KEY1 NEQ 0 THEN SPOUTER(KEY1,UNITNO,35); 04352200
IF KEY2 NEQ 0 THEN FINISHDETAIL; 04352400
IF TERMINATE THEN TERMINATE(MIX&20[CTF]); 04352600
KILL([MSCW]); 04352800
END PROCEDURE DISKORAUXERROR; 04353000
PROCEDURE ACTUALIOERR(R); VALUE R; REAL R; 04353200
BEGIN 04353400
REAL MSCW = -2, 04353600
E = +1, 04353800
T = +2, 04354000
S = +3, 04354200
F = +4, 04354400
U = +5, 04354600
T1 = +6, 04354800
T2 = +7, 04355000
T3 = +8, 04355200
KEY = +9, 04355400
FIN = NT3, 04355600
IOD = NT6, 04355800
MASK = +10, 04356000
DISC = +11, 04356200
TYPE = +12, 04356400
MIX = +13; 04356500
04356600
NAME LOCN = T3; 04356800
$ SET OMIT = NOT(PACKETS) 04356899
DEFINE UNITNO = PSEUDOMIX[MIX]#; 04356900
$ POP OMIT 04356901
04357000
LABEL L1, L2, D17, D19, D22, START, NOTREADYMESS, NTRDY, 04357200
EOF, REALEOF, TAPERETRY, SIX, SEVEN, FIX, LEAVE, 04357400
REWINDING, NOCODE, CLEAR, KILLL, KILLER; 04357600
LABEL READER, PRINTER, TAPE, DRUM, DISK, SPO, PUNCH, 04357800
PAPERPUNCH, PAPER, DATACOM; 04358000
04358200
SWITCH W := READER,PRINTER,TAPE,DRUM,DISK,SPO,PUNCH,NOCODE, 04358400
PAPERPUNCH,PAPER,DATACOM; 04358600
04358800
SUBROUTINE MAKEMESS; 04359000
BEGIN 04359200
STREAM(S1:=F.[43:5], S2:=F.[38:5], A:=TINU[U], 04359400
MX~MIX, KEY~KEY~SPACE(10)); 04359600
BEGIN 04359800
SI:=LOC A; SI:=SI+5; 04360000
DS:=LIT"*"; DS:=3 CHR; DS:=LIT" "; 04360200
CI:=CI+S1; GO TO LL; 04360400
GO L1; GO L2; GO L3; GO L4; GO L5; GO L6; GO LL; GO LL; 04360600
DS:=19 LIT"BLANK TAPE ON WRITE"; GO TO MXX; 04360800
L1: DS:= 4 LIT"BUSY"; GO TO MXX; 04361000
L2: DS:= 8 LIT"I/O MEM "; 04361200
L3: DS:= 6 LIT"PARITY"; GO TO MXX; 04361400
L4: DS:=12 LIT"I/O INV ADDR"; GO TO MXX; 04361600
L5: DS:= 9 LIT"I/O ERROR"; GO TO MXX; 04361800
L6: DS:=10 LIT"WRITE LOCK"; GO TO MXX; 04362000
LL: GO TO PS; 04362200
MXX: GO TO MIXIT; 04362400
PS: DI:=DI-5; DS:=LIT"#"; DI:=DI+4; 04362600
CI:=CI+S2; GO TO LL0; GO TO LL1; GO TO LL2; 04362800
NR: DS:= 9 LIT"NOT READY"; GO TO MIXIT; 04363000
LL0: DS:= 5 LIT"PRINT"; GO TO CHK; 04363200
LL1: DS:= 4 LIT"READ"; GO TO CHK; 04363400
LL2: DS:= 5 LIT"PUNCH"; 04363600
CHK: DS:= 5 LIT"CHECK"; 04363800
MIXIT: DS:= 6 LIT", MIX="; DS:=2 DEC; DS:=LIT"~"; 04364000
DI:= DI-3; DS:=FILL; 04364200
END; 04364400
END OF MAKEMESS; 04364600
04364800
SUBROUTINE DETAILRECORDENTRY; 04365000
BEGIN 04365200
KEY := TYPEDSPACE(ABS(T2),MAINTBUFFAREAV);% %167-04365400
M[KEY] := (ABS(T2) DIV 5 -1) & RDCTABLE[U][18:1:2]; 04365600
IF MIX NEQ 0 THEN 04365800
BEGIN 04366000
M[KEY] ~ (*P(DUP)) & MIX[20:43:5] & 04366200
(IF FINALQUE[S] LSS 0 THEN 0 ELSE 04366400
(M[M[LOCATQUE[S] INX NOT 2] INX 4].[13:11] DIV ETRLNG)+1)[9:39:9];04366600
CHECKJOBORFILEMESS(MIX, 04366800
(IF FINALQUE[S] LSS 0 THEN 0 ELSE LOCATQUE[S] INX NOT 2), 04367000
U); 04367200
END; 04367400
M[KEY+1] := TRANSACTION[U]; 04367600
M[KEY+2]:=IF TYPE=2 THENRDCTABLE[U] & U[3:43:5] ELSE 0; 04367800
M[KEY+3] := IOQUE[S]; 04368000
M[KEY+4] := R & RDCTABLE[U][3:3:5]; 04368200
IF TYPE=2 THEN 04368400
BEGIN 04368600
M[KEY+5] := MULTITABLE[U]; 04368800
M[KEY+6] := LABELTABLE[U]; 04369000
M[KEY+7] := PRNTABLE[U]; 04369200
M[KEY+8] := 0; 04369400
M[KEY+9] := 16; 04369600
END; 04369800
IF T2 GTR 0 THEN LINKUP(TYPE+1,KEY); 04370000
END DETAILRECORDENTRY; 04370200
04370400
DEFINE MAKEMLOG(MAKEMLOG1) = 04370600
BEGIN 04370800
T2:=MAKEMLOG1; DETAILRECORDENTRY; 04371000
END#; 04371200
04371400
P(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 04371600
04371800
$ SET OMIT = DATACOM 04371900
% THIS CODE WAS PLACED HERE FROM OUTER BLOCK TO AVOID CAUSING 04371910
IF R=0 % OVERFLOW OF INTERRUPT STACK 04371920
THEN BEGIN STREAM(B:=T:=SPACE(10)); 04371930
DS:=42LIT"#DATACOM/INQUIRY INTERRUPT IGNORED BY MCP~"; 04371940
SPOUT(T); 04371950
GO KILLER; 04371955
END; 04371960
$ POP OMIT 04371970
U:=LOCATQUE[S:=R.[3:5]].[12:6]; 04372000
MIX~LOCATQUE[S].[3:5]; 04372050
R:=R&IOQUE[S][3:43:5]; % RESTORE UNIT DESIGNATE 04372100
START: 04372200
T:=UNIT[U]&0[13:13:2]; 04372400
TRANSACTION[U] := TRANSACTION[U]-1; 04372600
TYPE := T.[1:4]; 04372800
MASK:=IF (T2:=FINALQUE[S]) LSS 0 THEN T2.[25:8] ELSE @377; 04373000
IF (E:=T.[5:8] AND MASK) = 0 THEN % ACCEPTABLE 04373200
BEGIN 04373400
F:=1; % RETAIN ERROR FIELD 04373600
GO TO FIX; 04373800
END; 04374000
IF E THEN % BUSY 04374200
BEGIN 04374400
T3:=1 & (U=30)[43:47:1]; % BUSY/INCOMPLETE MASK 04374600
IF U LSS 16 AND TRANSACTION[U] LEQ 0 THEN 04374800
BEGIN 04375000
P(0); % DONT SPOUT MESSAGE 04375200
GO TO REWINDING; 04375400
END; 04375600
IF U NEQ 25 THEN % NOT SPO 04375800
BEGIN 04376000
F:=1; % BUSY 04376200
MAKEMESS; 04376400
SPOUTER(KEY,UNITNO,35); 04376600
END; 04376800
MAKEMLOG(IF TYPE=2 THEN 10 ELSE 5); 04377000
L1: DO BEGIN 04377200
SLEEP([CLOCK],NOT CLOCK); 04377400
UNIT[U]:=(*P(DUP))&P(T,XCH)[CTC]; 04377600
STARTIO(U); 04377800
SLEEP([UNIT[U]],@100000000000); 04378000
TRANSACTION[U] := TRANSACTION[U]-1; 04378200
END UNTIL (UNIT[U].[5:8] AND T3) = 0; 04378400
TRANSACTION[U] := TRANSACTION[U]+1; 04378600
IF (UNIT[U].[5:8] AND MASK) = 0 THEN GO TO CLEAR; 04378800
GO TO START; 04379000
END; 04379200
04379400
IF E.[45:1] THEN % NOT READY 04379600
BEGIN 04379800
IF E.[43:1] THEN 04380000
BEGIN 04380200
IF TYPE=0 THEN GO TO READER; % READ CHECK 04380400
IF TYPE=1 THEN GO TO PRINTER; % PRINT CHECK 04380600
IF TYPE=6 THEN GO TO PUNCH; % PUNCH CHECK 04380800
END; 04381000
IF U NEQ 25 THEN % NOT SPO. 04381200
BEGIN 04381400
NOTREADYMESS: 04381600
F:=96; % NOT READY 04381800
MAKEMLOG(IF TYPE=2 THEN 10 ELSE 5); 04382000
MAKEMESS; 04382200
P(1); % SPOUT MESSAGE 04382400
REWINDING: 04382600
READY := NOT TWO(U) AND READY; 04382800
NTRDY: 04383000
RRRMECH:=NOT TWO(U) AND RRRMECH; 04383200
IF P THEN SPOUTER(KEY,UNITNO,35); 04383400
END; 04383600
UNIT[U].[5:10] := 2; 04383800
RRRMECH ~ NOT TWO(U) AND RRRMECH; % LET STATUS FIND IT %115-04383900
GO TO KILLL; 04385400
END; 04385600
D17: 04385800
IF E.[46:1] THEN % I/O MEMORY PARITY 04386000
BEGIN 04386200
F:=2; % I/O MEM PARITY 04386400
L2: MAKEMESS; 04386600
SPOUTER(KEY,UNITNO,35); 04386800
MAKEMLOG(IF TYPE=2 THEN 10 ELSE 5); 04387000
P(@1537); % ACCEPT EOF/EOT/EOP 04387200
GO TO SIX; 04387400
END; 04387600
IF E.[41:1] AND TYPE NEQ 2 THEN % I/O INVALID ADDRESS 04387800
BEGIN % [41:1] FOR TAPE = BACKUP DRIVE 04388000
D22: F:=4; % I/O INVALID ADDRESS 04388200
GO TO L2; 04388400
END; 04388600
04388800
GO TO W[TYPE]; 04389000
04389200
D19: E := 1023; GO TO D17; 04389400
04389600
SPO: 04389800
IF E.[43:1] THEN GO TO L1; % ERROR BUTTON 04390000
GO TO D19; 04390200
04390400
PRINTER: 04390600
IF E.[42:1] THEN % END OF PAGE 04390800
BEGIN 04391000
IF IOQUE[S].[27:6]=0 THEN GO TO FIX; % NOT SPACING 04391200
COMMENT IGNORE EOP IF NO SPACE OR SKIP; 04391400
IF RDCTABLE[U] OR MULTITABLE[U]="FULLPAGE" %724-04391550
THEN IF IOQUE[S].[28:1] THEN IOQUE[S].[FF]~@40013 %DBL-CH 11 04391560
ELSE IOQUE[S].[FF]~@40012 % DBL SINGLE - SKIP TO CH 10 04391570
ELSE % SKIP TO CHAN 1 ON EOP IF NOT 66 LINES %724-04391580
IOQUE[S].[18:15] := @4000; % INHIBIT DATA XFER, SKIP TO CHANNEL 04391600
GO TO CLEAR; 04391800
END; 04392000
IF E.[43:1] THEN 04392200
BEGIN 04392400
E:=0; % PRINT CHECK 04392600
MAKEMESS; 04392800
SPOUTER(KEY,UNITNO,35); 04393000
IF E.[45:1] THEN GO TO NOTREADYMESS; % PRINTER NOT READY 04393200
MAKEMLOG(IF TYPE=2 THEN 10 ELSE 5); 04393400
P(0); % CLEAR ERROR FIELD 04393600
TINU[U].[18:12] := P(DUP).[18:12]+1; 04393800
GO TO SIX; 04394000
END; 04394200
GO TO D19; % PARITY 04394400
04394600
READER: 04394800
IF E.[43:1] THEN % READ CHECK 04395000
BEGIN 04395200
TINU[U].[18:12] := P(DUP).[18:12]+1; 04395400
F:=32; % READ CHECK 04395600
MAKEMLOG(5); 04395800
MAKEMESS; 04396000
P(1); % SPOUT MESSAGE 04396200
GO TO NTRDY; 04396400
END; 04396600
IF E.[42:1] THEN % EOF CARD READER-TREAT AS NOT READY 04396800
BEGIN 04397000
UNIT[U].[5:8] := 4; % ERROR FIELD=NOT READY 04397200
R.[25:8] := 4; % RESLT.DESC.=NOT READY 04397400
TRANSACTION[U] := TRANSACTION[U]+1; 04397600
GO TO START; 04397800
END; 04398000
COMMENT MUST BE D19 - USUALLY INVALID CHARACTOR; 04398200
STREAM(A:=0 : B:=IOQUE[S]); 04398400
BEGIN 04398600
DI := A; SI := B; DI := DI+8; 04398800
IF SC = @14 THEN A := DI; 04399000
2(40(DI:=DI+8; SI:= SI+1; 04399200
IF SC = @14 THEN JUMP OUT 2 TO L); 04399400
DI := DI-8; SI := SI-1;); 04399600
DI := A; 04399800
L: A := DI; 04400000
END; 04400200
IF (T1 := P) = 0 THEN GO TO D19; % NOT INVALID CHARACTER 04400400
IF T1 NEQ 1 THEN % NOT IN COLUMN 1 04400600
BEGIN 04400800
STREAM(a:=TINU[U],T1,KEY:=KEY:=SPACE(10)); 04401000
BEGIN 04401200
DS := LIT "#"; SI := LOC A; SI := SI+5; 04401400
DS := 3 CHR; 04401600
DS := 16 LIT " INV CHR IN COL "; 04401800
DS := 2 DEC; DS := LIT "~"; 04402000
END; 04402200
P(1); % SPOUT MESSAGE 04402400
GO TO NTRDY; 04402600
END; 04402800
E := @40; 04403000
F := @3100001; 04403200
GO TO LEAVE; 04403400
04403600
PUNCH: 04403800
IF E.[43:1] THEN 04404000
BEGIN 04404200
F:=64; % PUNCH CHECK 04404400
MAKEMESS; 04404600
SPOUTER(KEY,UNITNO,35); 04404800
% NEW PUNCH DOES NOT GO NOT-READY ON PUNCH CHECK 04405000
IF E.[45:1] THEN GO TO NOTREADYMESS; % NOT READY 04405200
MAKEMLOG(5); 04405400
TINU[U].[18:12]:=P(DUP).[18:12]+1; 04405600
F:=0; % ZERO ERROR FIELD 04405800
GO TO CLEAR; 04406000
END; 04406200
GO TO D19; % PARITY 04406400
04406600
PAPERPUNCH: 04406800
IF R.[27:1] THEN % EOR 04407000
BEGIN 04407200
P(@40); 04407400
GO TO SIX; 04407600
END; 04407800
GO TO D19; % PARITY 04408000
04408200
PAPER: 04408400
IF R.[27:2] NEQ 0 THEN GO TO EOF; % BOT/EOT 04408600
IF E.[44:1] THEN % PARITY 04408800
BEGIN 04409000
P(@20); 04409200
GO TO SIX; 04409400
END; 04409600
GO TO NOCODE; 04409800
04410000
DATACOM: 04410200
IF(T3:=1&E[43:43:1])=@21 THEN GO TO L1; 04410400
NOCODE: 04410600
F := 5; % I/O ERROR 04410800
GO TO L2; 04411000
04411200
DRUM: % DRUM NOW HANDLED IN DISKORAUXERROR 04411400
DISK: % DISK NOW HANDLED IN DISKORAUXERROR 04411600
DO UNTIL FALSE; 04411800
04412000
TAPE: 04412200
TRANSACTION[U] := TRANSACTION[U]+1; 04412400
IF E.[44:1] THEN 04412600
IF R.[2:1] THEN % MOD III DESCRIPTOR 04412800
BEGIN % COULD BE MEM.PAR.,BLANK TAPE,BOT,EOT 04413000
IF R.[11:1] THEN GO TO D19; % MEMORY PARITY 04413200
OPTION:=OPTION OR M; % MEANS MOD3IOS:=TRUE 04413400
IF R.[24:1] THEN % READING 04413600
BEGIN 04413800
IF R.[13:1] THEN R.[27:1]:=1; BOT, SET EOF 04414000
IF R.[14:1] THEN % EOT 04414200
IF (E AND @367)=0 THEN % PARITY 04414400
IF R.[27:1]=0 THEN % NOT EOF 04414600
GO TO FIX; % FINISH I/O 04414800
END; 04415000
ELSE 04415200
BEGIN % WRITING 04415400
IF R.[2:1] THEN % BLANK TAPE ON WRITE 04415600
BEGIN 04415800
F:=9; % BLANK TAPE ON WRITE 04416000
MAKEMESS; 04416200
SPOUTER(KEY,UNITNO,35); 04416400
MAKEMLOG(10); 04416600
P(16); 04416800
GO TO SIX; 04417000
END; 04417200
IF R.[14:1] THEN R.[27:1]:=1 ELSE GO FIX; % EOT,SET EOF BIT 04417400
END; 04417600
END % MOD III DESCRIPTOR 04417800
ELSE GO TO D19; % PARITY 04418000
IF R.[24:1] THEN 04418200
BEGIN 04418400
IF E.[41:1] THEN GO TO D22; % INVALID ADDRESS 04418600
IF R.[27:1] THEN % EOT 04418800
EOF: IF MASK.[42;1] THEN % EOF OK 04419000
BEGIN 04419200
REALEOF: F:=1&(IF R.[24:1] THEN @31 ELSE 0)[CTF]; 04419400
T.[5:8] := @40; 04419600
GO TO FIX; 04419800
END 04420000
ELSE 04420200
BEGIN % EOF NOT ACCEPTABLE 04420400
P(@40); 04420600
GO TO SIX; 04420800
END; 04421000
TAPERETRY: 04421200
MAKEMLOG(-TAPEBUFFERSIZE); 04421400
IF (T:=TAPEPARITYRETRY(R,U,KEY)).[5:8]=32 AND 04421600
LOCATQUE[S].[3:5] NEQ 0 THEN GO TO REALEOF; 04421800
U~IOQUE[T.[FF]].[3:4]; 04421900
P(T.[5:8]); 04422000
GO TO SIX; 04422200
END; 04422400
IF E.[41:1] THEN % WRITE RING 04422600
IF E.[43:1] THEN % PARITY,WRITE RING 04422800
BEGIN 04423000
F:=6; % WRITE LOCK 04423200
GO TO L2; 04423400
END 04423600
ELSE GO TO D22; % INVALID ADDRESS 04423800
IF E.[43:1] THEN GO TO TAPERETRY; % PARITY,WRITE RING ONLY 04424000
P(@40); 04424200
SIX: 04424400
T := T&P(XCH)[5:40:8]; 04424600
F := 1; 04424800
FIX: 04425000
E := T.[5:8]|F; 04425200
FIN := S; 04425400
IOD := IOQUE[S]; 04425600
SEVEN: 04425800
RETURNIOSPACE(S); 04426000
04426200
T.[FF]:=S:=LOCATUE[S].[FF]; 04426600
IF F = @3100001 THEN 04426800
IF S NEQ @77777 THEN GO TO SEVEN; 04427000
S:=FIN; 04427200
IF FALSE THEN 04427400
LEAVE: 04427600
IOD := IOQUE[S]; 04427800
FIN := FINALQUE[S] AND NOT MEMORY; 04428000
IF IOD.[24:1] THEN 04428200
BEGIN 04428400
NT4 := M[IOD INX ( IF IOD.[22:1] THEN 1 ELSE NOT 0)]; 04428600
FINISHOFFIO(U); 04428800
END; 04429000
IF ( T1:= FIN) LSS 0 THEN 04429200
P(R&E[25:40:8]&IOD[3:3:5] OR IOMASK,LOCATQUE[S],~); 04429400
ELSE 04429600
BEGIN 04429800
IF E NEQ 0 THEN 04430000
BEGIN 04430200
P(.T1,PRL); 04430400
T1 := T1&E25:40:8]; 04430600
END 04430800
ELSE P(.T,IOR); 04431000
LOCN := [M[LOCATQUE[S]]; 04431200
IOD := IOD.[33:15]; 04431400
WHILE LOCN[0].[33:15] NEQ IOD DO LOCN := 1 INX LOCN; 04431600
LOCN[0] := P(.T1,LOD); 04431800
END; 04432000
UNIT[U] := T; 04432200
CLEAR: 04432400
UNIT[U] := (*P(DUP))&F[5:20:13]; 04432600
STARTIO(U); 04432800
KILLL: 04433000
LOCATQUE[S].[11:1]:=0; 04433200
KILLER: 04433400
KILL([MSCW]); 04433600
END; 04433800
$ SET OMIT = NOT DEBUGGING 04544999
REAL PROCEDURE TAPEPARITYRETRY(R,U,KEY);% 04548000
VALUE R,U,KEY;% 04549000
REAL R,U,KEY;% 04550000
BEGIN REAL T1,T2,T3; INTEGER I= T1;% 04551000
REAL RESULT,IOD,OIOD,SPACEMASK,SPACEIOD,M,N,W,MODE;% 04552000
REAL J,K;% 04553000
REAL ERASEIOD=SPACEMASK;% 04554000
REAL Z,Y,MIX,BSIZE; 04554100
LABEL XIO,GIVEUP; 04554200
LABEL RP,LX; 04554300
REAL SIZE,T4,LIMIT; 04554500
REAL PTR,BUFFER,BUFFERSIZE,% 04554600
PATTERN,PATTERN1,PATTERN2,PATTERNWORD;% DON"T CHANGE ORDER04554700
BOOLEAN TESTING,SPACING,FLAGGER; 04554800
$ SET OMIT = NOT(PACKETS) 04554899
DEFINE UNITNO = PSEUDOMIX[MIX]#; 04554900
$ POP OMIT 04554901
LABEL XXIT,EXIT,ENDIT,XEXIT; 04555000
SUBROUTINE RECORDRETRY;% 04555050
BEGIN% 04555100
IF PTR-KEY = TAPEBUFFERSIZE-1 THEN% 04555150
BEGIN% 04555200
T4 := TYPEDSPACE(TAPEBUFFERSIZE,MAINTBUFFAREAV);% %167-04555250
MOVE(10,KEY,T4);% 04555300
MEMORY[KEY+8]:= TAPEBUFFERSIZE-10;% 04555350
MEMORY[KEY+9]:= 1023;% 04555400
LINKUP(3,KEY);% 04555450
KEY:= T4; PTR:= KEY+9;% 04555500
END;% 04555550
MEMORY[PTR:=PTR+1]:= IOD;% 04555600
MEMORY[PTR:=PTR+1]:= RESULT & RDCTABLE[U][19:1:2];% 04555650
END RECORDRETRY;% 04555700
SUBROUTINE DOIONOW;% 04556000
BEGIN FOR Y~1 STEP 1 UNTIL 18 DO 04556100
BEGIN IF R.[24:1]THEN 04557000
BEGIN % WAIT 1/15 SEC BETWEEN READ RETRIES 04557100
WHILE T4>CLOCK+P(RTR) DO SLEEP(1,1); 04557200
T4~CLOCK+P(RTR+4); 04557300
END; 04557400
IF IOQUESLOTS=0 THENSLEEP([IOQUESLOTS],83); 04558000
IOQUESLOTS:=IOQUESLOTS-1; 04558500
IOQUEAVAIL:=IOQUE[T1:=IOQUEAVAIL]; 04559000
IOQUE[T1]~ IOD;% 04560000
LOCATQUE[T1]~LOCATQUE[T2 ~(T3~UNIT[U]).[18:15]]&RESULT]% 04561000
[33:33:15]&T2[18:33:15];% 04562000
UNIT[U] ~ T3&T1[18:33:15]&64[5:35:13];% 04563000
STARTIO(U);% 04564000
FINALQUE[T1] ~ NABS(IOD)& 0 [25:40:8] OR IOMASK;% 04565000
RESULT ~ 0;% 04566000
SLEEP([UNIT[U]],@100000000000);% 04567000
IF RESULT.[30:1] THEN % NOT READY 04567010
BEGIN 04567020
MODE := (-16); 04567030
GO TO EXIT; 04567040
END; 04567050
IF RESULT.[29:1] AND RESULT.[2:1] THEN 04567100
BEGIN 04567150
IF RESULT.[12:1] THEN % BLANK TAPE 04567200
IF IOD.[24:1] THEN % READ 04567250
TRANSACTION[U]~TRANSACTION[U]-1&IOD[1:22:1] ELSE04567300
BEGIN; % WRITE 04567310
STREAM(A~TINU[U],T~T2~SPACE(3)); 04567320
BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04567400
DS!21 LIT" BLANK TAPE ON WRITE~"; 04567500
END; 04567550
SPOUTER(T2,UNITNO,35); 04567600
GO TO XXIT; 04567700
END; 04567750
IF RESULT.[11:1] THEN % MEM PARITY 04567770
BEGIN; 04567780
STREAM(A~TINU[U],T~T2~SPACE(3)); 04567790
BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04567800
DS~13 LIT" I/O MEM PAR~"; 04567810
END; 04567820
SPOUTER(T2,UNITNO,35); 04567830
XXIT: MODE := 16; 04567840
IF TESTING THEN GO XIO; 04567845
RECORDRETRY; 04567850
GO TO EXIT; 04567855
END; 04567860
IF RESULT.[13:21]!0 THEN Y~18; 04567870
END ELSE GO TO XIO; 04567900
END;% 04568000
RESULT.[27:1]~1; MODE~32; 04568100
XIO: IF NOT SPACING THEN RECORDRETRY; 04568200
END DOIONOW;% 04568250
SUBROUTINE SPACEBACK; 04568300
BEGIN 04568310
IF TRANSACTION[U]=1 THEN 04568320
BEGIN 04568330
IOD:=@4200000000&IOD[3:3:5]; 04568340
DOIONOW; 04568350
I:=TWO(U); 04568360
T2:=CLOCK+P(RTR)+600; 04568364
COMPLEXSLEEP((P(RRR) AND I)!0 OR T2<CLOCK+P(RTR)); 04568366
IF (P(RRR) AND I)=0 THEN % TIME OUT => NOT READY04568370
BEGIN MODE:=16; 04568372
GO TO EXIT; 04568374
END; 04568376
END ELSE 04568380
BEGIN 04568390
M:=W; 04568400
IOD:=SPACEIOD; 04568410
J:=0; 04568420
SPACING:= TRUE;% 04568425
DO BEGIN 04568430
DOIONOW; 04568440
TRANSACTION[U]:=(*P(DUP))+1); 04568450
J:=J+1; 04568460
END UNTIL ((M:=RESULT.[CF]-SPACEIOD.[CF]+M) LSS 0 04568470
OR RESULT.[27:1] AND J GTR 1; 04568480
IF NOT TESTING THEN SPACING:= FALSE; 04568485
TRANSACTION[U]:=(*P(DUP))-2; 04568490
IOD:=SPACEIOD&0[22:47:1]; 04568500
DOIONOW; 04568510
IF N=0 THEN BSIZE:=RESULT.[CF]-IOD.[CF] ELSE 04568520
IF BSIZE!RESULT.[CF]-IOD.[CF] THEN 04568530
BEGIN 04568540
STREAM(A:=TINU[U],D:=T2:=SPACE(10)); 04568550
BEGIN SI:=LOC A;SI:=SI+5;DS:=3 CHR; 04568560
DS:=13 LIT" ERASE ERROR~"; 04568570
END; 04568580
SPOUTER(T2,UNITNO,35); 04568590
FLAGGER ~ 1; 04568595
GO GIVEUP; 04568600
END; 04568610
END; 04568620
END; % OF SPACEBACK 04568630
TINU[U].[18:12] ~ P(DUP).[18:12]~1;% 04569000
MIX ~ LOCATQUE[UNIT[U].[FF]].[3:5]; 04569100
FLAGGER ~ FINALQUE[UNIT[U].[FF]] < 0; % NOT OBJECT JOB 04569200
OIOD ~ NFLAG(IOQUE[UNIT[U].[18:15]]);% 04570000
PTR:= KEY+9; 04570100
IF R.[24:1] THEN% 04571000
BEGIN COMMENT READ RETRY;% 04572000
SPACEMASK ~ OIOD.[21:2]|@1111 EQV NOT @0123;% 04573000
SPACEIOD ~ OIOD&1[8:38:10]&1[23:47:1];% 04574000
FOR M ~ 1 STEP 1 UNTIL 3 DO% 04575000
BEGIN SPACEIOD ~ SPACEIOD&SPACEMASK[21:46:2];% 04576000
FOR N ~ 1 STEP 1 UNTIL 5 DO% 04577000
BEGIN IOD ~ SPACEIOD;% 04578000
IF N!1 OR M!1 THEN DOIONOW ELSE 04579000
IF NOT(R.[29:1]AND R.[2:1] AND R.[12:1]) 04579100
THEN DOIONOW; 04579200
IF RESULT.[28:1] THEN% 04580000
BEGIN MODE ~ 0;% 04581000
IOD ~ OIOD;% 04582000
END% 04583000
ELSE BEGIN MODE ~ 8;% 04584000
IOD ~ OIOD&SPACEMASK[21:43:2];% 04585000
END;% 04586000
DOIONOW;% 04587000
IF NOT RESULT.[28:1] THEN GO TO EXIT;% 04588000
IF MOD3IOS THEN IF OIOD.[23:1] THEN 04588010
BEGIN Z~IOD~OIOD&SPACEMAKS[21:40:2] 04588020
&(OIOD.[33:15]+(OIOD.[8:10]-1) 04588030
&OIOD[1:22:1]])[33:33:15]; 04588040
DOIONOW; MODE~0; 04588050
IF RESULT.[28:1] THEN 04588060
BEGIN IOD~OIOD; DOIONOW; 04588070
IF NOT RESULT.[28:1] THEN 04588080
GO TO EXIT; 04588090
IOD~Z&SPACEMASK[21:46:2]; 04588100
DOIONOW; MODE~8; 04588110
IF RESULT.[28:1] THEN 04588120
BEGIN IOD~OIOD&SPACEMASK 04588130
[21:43:2]; 04588140
RP: DOIONOW; 04588150
IF RESULT.[28:1] THEN 04588160
GO TO LX; 04588170
GO TO EXIT; 04588180
END; 04588190
END; 04588200
Z~ABS(IOD.[33:15]-RESULT.[33:15]); 04588210
IF IOD.[21:2]=0 THEN 04588220
Z~Z-(RESULT.[15:3]=0); 04588230
IF IOD.[8:10]<Z THEN 04588240
BEGIN IOD~OIOD; MODE~0; GO TO RP END;04588250
IF IOD.[22;1] THEN 04588260
STREAM(Z,Y~Z DIV 64, 04588270
S~RESULT.[33:15]+1, 04588280
SK~(RESULT.[15:3]+1).[45:3], 04588290
GM~(IF IOD.[2:1] THEN 0 04588300
ELSE "~"), 04588310
D~OIOD.[33:15]); 04588320
BEGIN SI~S; SI~SI+SK; 04588330
Y(16(DS~32 CHR)); 04588340
Z(DS~8 CHR); 04588350
SK(DS~LIT "0"); 04588360
DI~DI-SK; SI~LOC GM; 04588370
SI~SI+7; DS~CHR; 04588380
END ELSE 04588390
STREAM(Z,Y~Z DIV 64, 04588400
S~RESULT.[33:15]-1, 04588410
SK~(RESULT.[15:3]+7).[45:3], 04588420
FL~(IF IOD.[21:1] THEN 0 04588430
ELSE @14), 04588440
FK~(8-RESULT.[15:3]).[45:3], 04588450
D~OIOD.[33:15]); 04588460
BEGIN SI~S; SI~SI+SK; DI~DI+7; 04588470
Y(16(32(DS~CHR); SI~SI-2; 04588480
DI~DI-2))); 04588490
Z(8(DS~CHR; SI~SI-2; DI~DI-2));04588500
SI~LOC FL; SI~SI+7; 04588510
FK(DS~CHR; SI~SI-1; DI~DI-2); 04588520
END; 04588530
IOD~@140000005&OIOD[22:22:1] 04588540
&OIOD[3:3:5]; 04588550
DOIONOW; GO TO EXIT; 04588560
LX: END; 04588570
END;% 04589000
N ~ IF TRANSACTION[U] < 15 THEN% 04590000
TRANSACTION[U] ELSE 15;% 04591000
IOD ~ SPACEIOD&SPACEMASK[21:40:2];% 04592000
SPACING:= TRUE; 04592100
FOR W ~ 1 STEP 1 UNTIL N DO% 04593000
BEGIN DOIONOW;% 04594000
IF RESULT.[27:1] THEN N~0;% 04595000
END;% 04596000
IOD ~ SPACEIOD&SPACEMASK[21:37:2];% 04597000
FOR N ~ 3 STEP 1 UNTIL W DO DOIONOW;% 04598000
IOD ~ OIOD;% 04599000
MODE ~ 0;% 04600000
SPACING:= FALSE; 04600100
DOIONOW;% 04601000
IF NOT RESULT.[28:1] THEN GO TO EXIT;% 04602000
END;% 04603000
MODE ~ 16;% 04604000
END ELSE BEGIN COMMENT WRITE RETRY;% 04605000
LIMIT ~ @15000; 04605500
ERASEIOD ~ (SPACEIOD ~ OIOD&0[8:38:10]&7[22:45:3]&[T2]% 04606000
[33:33:15])&@112[18:47:7];% 04607000
W ~ R.[33:15]-OIOD.[33:15]+2;% 04608000
WHILE TRUE DO 04609000
BEGIN 04610000
SPACEBACK; 04611000
IF MIX!0 THEN IF TERMSET(MIX) THEN GO XEXIT; 04626000
IF (N~N+W+128) GTR LIMIT THEN GO GIVEUP; 04627000
IOD ~ ERASEIOD&N[9:39:9];% 04628000
SPACING:= TRUE;% 04628100
FOR J ~ 0 STEP 512 UNTIL N DO% 04629000
BEGIN TRANSACTION[U] ~ TRANSACTION[U]-1;% 04630000
DOIONOW;% 04631000
IOD ~ ERASEIOD&1[8:47:1];% 04632000
IF RESULT.[27:1] THEN 04633000
BEGIN 04633100
IF NOT R.[27:1] THEN LIMIT~J+3000; 04633200
R.[27:1]~1; 04633300
END; 04633400
END;% 04634000
SPACING:= FALSE;% 04634100
IOD:= IOD & N[CTC];% 04634200
RECORDRETRY;% 04634300
IOD ~ OIOD;% 04635000
DOIONOW;% 04636000
IF RESULT.[27:1] THEN R.[27:1] ~ 1;% 04637000
IF NOT RESULT.[28:1] THEN% 04638000
BEGIN 04638100
SIZE~RESULT.[CF]-OIOD.[CF]; 04638200
SPACEBACK; 04638300
IOD~SPACEIOD&0[22:47:1]; 04638650
DOIONOW; 04638700
IF NOT(RESULT.[28:1] OR (OIOD.[2:1] AND 04638800
(RESULT.[CF]-SPACEIOD.[CF]!SIZE))) THEN 04638900
BEGIN 04639000
MODE~0&R[42:27:1]; 04639100
GO TO EXIT; 04639200
END; 04640000
END; 04641000
END;% 04642000
GIVEUP: 04642900
STREAM(A~TINU[U], T~T2~SPACE(6)); 04644000
BEGIN SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR;% 04645000
DS ~ 11 LIT " WR PARITY~";% 04646000
END;% 04647000
IF MIX!0 THEN IF (NOT OIOD).[21:1] THEN % ALPHA TAPE 04647050
BEGIN STREAM(T~0: S~OIOD.[CF], QM~@14); 04647100
BEGIN SI ~ S; DI ~ LOC QM; DI ~ DI+7; 04647150
ST: IF SC="~" THEN GO F; 04647200
IF SC=DC THEN GO L; 04647250
DI ~ DI-1; 04647300
GO ST; 04647350
L: TALLY~1; T~TALLY; 04647400
F: END; 04647450
IF P THEN 04647500
BEGIN STREAM(T2); 04647550
BEGIN DI ~ DI+13; 04647600
DS ~ 29LIT", TRIED TO WRITE INVALID CHR~"; 04647650
END; 04647700
FLAGGER ~ 1; 04647750
END; END; 04647800
SPOUTER(T2,UNITNO,25); 04648000
IF MIX!0 AND NOT FLAGGER THEN 04648050
BEGIN 04648100
TAPEPARITYRETRY ~ Y ~ WRITEPARITYREELSWITCH(OIOD,0); 04648150
MODE ~ Y.[5:8]; 04648200
R.[27:1] ~ 0; 04648250
GO ENDIT; 04648300
END; 04648350
XEXIT: 04648400
MODE ~ 16;% 04649000
END;% 04650000
EXIT: TAPEPARITYRETRY:= UNIT[U] & MODE[5:40:8]; 04651000
ENDIT: 04651010
MEMORY[KEY+8] := PTR-KEY-9; 04651050
MEMORY[KEY+9]:=ABS(MODE); 04651100
MEMORY[KEY] := P(DUP,LOD) & ((PTR-KEY) DIV 5)[39:39:9]; 04651200
IF (MODE!16) OR (R.[24:1]) THEN LINKUP(3,KEY) ELSE 04651300
BEGIN 04651400
BUFFER:= OIOD INX 0; 04651500
BUFFERSIZE:= OIOD.[8:10]; 04651600
IF NOT OIOD.[21:1] THEN % ALPHA WRITE - CHECK Q-MARKS 04651700
BEGIN 04651800
STREAM(T:=0: 04651900
TEMP:=0, SVSI:=0, 04652000
BUFFSTART:=BUFFER, 04652100
BUFFEND:=BUFFER+BUFFERSIZE); 04652200
BEGIN 04652300
SI:=BUFFEND; DI:=LOC TEMP; DS:= CHR; 04652400
DI:=BUFFEND; DS:=LIT"-"; DI:=DI-1; DS:=RESET; %Q-MARK 04652500
SI:=BUFFSTART; 04652600
IF SC > 9 THEN 04652700
BEGIN 04652800
L1: SI:=SI+1; IF SC>9 THEN GO L1; 04652900
END; 04653000
L2: SI:=SI+1; IF SC{9 THEN GO L2; 04653100
SVSI:=SI; 04653200
SI:=LOC SVSI; SI:=SI+5; 04653300
DI:=LOC BUFFEND; DI:=DI+5; 04653400
IF 3 SC!DC THEN TALLY:=1; 04653500
SI:=BUFFEND; SI:=LOC TEMP; DS:= CHR; 04653600
T:=TALLY; 04653700
END; 04653800
I:=POLISH; 04653900
MEMORY[KEY+2]:= P(DUP,LOD) & 1[1:47:1]; 04654000
END; 04654100
IF STOPTEST OR FLAGGER THEN LINKUP(3,KEY) ELSE 04654200
BEGIN 04654300
MEMORY[KEY] := NABS(P(DUP,LOD)); 04654400
LINKUP(3,KEY); 04654500
TESTING:= SPACING:= TRUE; N:=0; 04654600
BUFFERSIZE:= BUFFERSIZE-1; 04654700
OIOD:= OIOD & 1[18:42:6]; 04654800
PTR:= KEY+8; 04654900
STREAM(MOD2IOS:=NOT(MOD3IOS+62), D:=[PATTERN]); 04655000
BEGIN 04655100
DS:=13 LIT"01248+|~<(.G{"; 04655200
MOD2IOS(DI:=DI-6; DS:=LIT"""; DI:=DI+5); 04655300
DS:= LIT"""; DS:= LIT"""; 04655400
DS:=3 LIT"]$("; 04655500
END; 04655600
SLEEP([MEMORY[KEY]],@1000000000000000); 04655700
MEMORY[PTR]:= 0; MOVE(191,PTR,PTR+1); 04655800
FOR K:=0 STEP 1 UNTIL 15 DO 04655900
BEGIN 04656000
STREAM(A:=[PATTERN], 04656100
K:=K+(K=15), M:=4+4|(K<14), N:=1+(K>13), 04656200
SIZEDIV64:=BUFFERSIZE.[36:6], BUFFERSIZE, 04656300
BUFFER); 04656400
BEGIN 04656500
SI:=A; SI:=SI+K; 04656600
M(DS:=N CHR; SI:=SI-N); 04656700
SI:=BUFFER; 04656800
SIZEDIV64(DS:=32 WDS; DS:=32 WDS); DS:=BUFFERSIZE WDS; 04656900
DI:=A; DI:=DI+24; DS:=WDS; 04657000
END; 04657100
IOD:= OIOD:= OIOD & ((K<7) OR (K>13))[21:47:1]; 04657200
DOIONOW; 04657300
MEMORY[PTR]:= RESULT & RDCTABLE[U][19:1:2]; 04657400
SPACEBACK; 04657500
STREAM(SIZEDIV64:=BUFFERSIZE.[36:6],BUFFERSIZE, 04657600
BUFFER); 04657700
BEGIN 04657800
DS:=8 LIT" "; SI:=BUFFER; 04657900
SIZEDIV64(DS:=32 WDS; DS:=32 WDS); DS:=BUFFERSIZE WDS; 04658000
END; 04658100
IOD:= OIOD & 1[24:47:1]; 04658200
DOIONOW; 04658300
MEMORY[PTR+1]:= RESULT & RDCTABLE[U][19:1:2]; 04658400
STREAM(A:=[PATTERN] INX 3, 04658500
CHERR:=0, WRDERR:=0, WRDCNT:=0, 04658600
LOOP:=0, FORSEVEN:=1, LEAPFROG:=0, 04658700
WDSLEFT:=I:=(J:=IF (SIZE:=ABS(BUFFER-(RESULT INX 0))) 04658800
LEQ BUFFERSIZE THEN SIZE ELSE BUFFERSIZE+1) MOD 63, 04658900
V:=IF J<64 THEN J ELSE 63, 04659000
N:=IF J<64 THEN 1 ELSE J DIV 63, 04659100
RECYCLE:= IF J<64 THEN 0 ELSE IF I=0 THEN 0 ELSE 1, 04659200
TEMP:=0, SVDI:=0, 04659300
BITLOCN:=PTR+3, WRDLOCN:=PTR+5, 04659400
BUFFER); 04659500
BEGIN; 04659600
LEAPFROG:= CI; TALLY:=0; % USED ONLY FOR LEAPFROG RETURN 04659700
N(V(SI:=A; IF 8 SC!DC THEN 04659800
BEGIN 04659900
SI:=WRDERR; SI:=SI+8; WRDERR:=SI; 04660000
FORSEVEN(SVDI:=DI; DI:=BITLOCN; LOOP(DI:=DI+2); 04660100
SI:=LOC WRDCNT; SI:=SI+6; DS:=2 CHR; 04660200
DI:=WRDLOCN; LOOP(DI:=DI+8); 04660300
SI:=WVDI; SI:=SI-8; DS:= WDS; 04660400
TALLY:=LOOP; TALLY:=TALLY+1; LOOP:=TALLY; 04660500
SI:=LOC LOOP; SI:=SI+7; 04660600
IF SC="7" THEN 04660700
BEGIN TALLY:=0; FORSEVEN:=TALLY; END; 04660800
DI:=SVDI); 04660900
SI:=A; DI:=DI-8; TALLY:=0; 04661000
8(IF SC!DC THEN TALLY:=TALLY+1); 04661100
TEMP:=TALLY; 04661200
SI:=CHRERR; TEMP(SI:=SI+8); CHRERR:=SI; 04661300
END; 04661400
SI:=WRDCNT; SI:=SI+8; WRDCNT:=SI; 04661500
)); 04661600
RECYCLE(TALLY:=1; N:=TALLY; 04661700
TALLY:=WDSLEFT; V:=TALLY; 04661800
TALLY:=0; RECYCLE:=TALLY; 04661900
JUMP OUT TO TADPOLE); 04662000
GO TO FROG; 04662100
TADPOLE: CI:=LEAPFROG; 04662200
FROG: DI:=BITLOCN; DI:=DI-5; 04662300
SI:=LOC CHRERR; SI:=SI+5; DS:=3 CHR; 04662400
SI:=LOC WRDERR; SI:=SI+6; DS:=2 CHR; 04662500
END; 04662600
IF MEMORY[PTR].[27:1] THEN SPACEBACK; 04662700
PTR:=PTR+12; 04662800
END; 04662900
MEMORY[KEY]:= P(DUP,LOD) & 0[1:1:2] & 39[39:39:9]; 04663000
MEMORY[KEY+2]:= P(DUP,LOD) & OPTION[2:2:1]; 04663100
LINKUP(20,KEY); 04663200
END;END; 04663300
END TAPEPARITYRETRY;% 04666000
REAL PROCEDURE WRITEPARITYREELSWITCH(OIOD,RC); 04667000
VALUE OIOD,RC; REAL OIOD,RC; 04667050
% 04667100
% THE PURPOSE OF THIS ROUTINE IS TO ALLOW OBJECT PROGRAMS 04667150
% TO CHANGE MAG TAPE UNITS WHEN ENCOUNTERING A WRITE PARITY 04667200
% ERROR. THIS ROUTINE IS CALLED FROM EITHER TAPEPARITYRETRY 04667250
% IN RESPONSE TO A FATAL WRITE PARITY ERROR OR FROM 04667300
% REELCHANGER AFTER AN "RC" KEYBOARD REQUEST BY THE OPERATOR. 04667350
% 04667400
% BASICALLY, THIS ROUTINE READS INTO CORE THE LAST TWO 04667450
% SUCESSFULLY WRITTEN BLOCKS ON THE TAPE, CLOSES THE FILE 04667500
% (MARKING THE TAPE AS AN END OF REEL), OBTAINS ANOTHER 04667550
% TAPE UNIT, RE-WRITES THE TWO BLOCKS IN CORE FOLLOWED 04667600
% BY THE BLOCK IN WHICH THE PARITY ERROR OCURRED, AND 04667650
% ALLOWS THE PROGRAM TO CONTINUE WRITING ON THE NEW TAPE. 04667700
% 04667750
% WHEN THIS ROUTINE IS CALLED DUE TO AN OPERATOR "RC" 04667800
% MESSAGE, THERE IS NO FATAL PARITY ERROR AT THIS POINT. 04667850
% SO THE SAVING OF THE LAST TWO RECORDS IS UNNECESSARY 04667900
% AND ONLY THE CLOSING OF THE FILE AND OBTAINING OF A NEW 04667950
% UNIT ARE REQUIRED. 04668000
% 04668050
% THE PARAMETERS ARE USED AS FOLLOWS: 04668100
% OIOD THE ORIGINAL I/O DESCRIPTOR ON WHICH 04668150
% A FATAL ERROR OCCURRED 04668200
% 04668250
% RC 1 IF CALLED FROM REELCHANGER, 0 OTHERWISE 04668300
% 04668350
BEGIN 04668400
INTEGER I,LOGICLRC; 04668450
REAL BSIZE,FNUM,NUMBUFFS,NUMRECS,REEL); 04668500
REAL S,Y,U,OLDU,SAVEU,MIX; 04668550
REAL TEMP,T1,T2,T3,T4; 04668600
REAL IOD,RESULT,MODE,TOPIOD,TM,HOLDCT; 04668650
REAL FIRSTREC,SECREC,FIRSTRECIO,SECRECIO; 04668700
BOOLEAN TOGGLES; 04668750
ARRAY FIB[*],FPB[*],LABELA[*],TANK[*]; 04668800
% 04668850
% THE LOCAL VARIABLES ARE USED AS FOLLOWS: 04668900
% INTEGERS 04668950
% I TEMPORARY 04669000
% LOGICLRC CONTAINS THE LOGICAL RECORD COUNT 04669050
% REALS 04669100
% BSIZE BLOCK SIZE OF FILE 04669150
% FNUM FILE NUMBER WITHIN FPB 04669200
% NUMBUFFS TOTAL NUMBER OF BUFFERS DECLARED FOR FILE 04669250
% NUMRECS RECORDS PER BLOCK (BSIZE DIV RECORD SIZE) 04669275
% REEL CONTAINS THE CURRENT REEL NUMBER +1 04669300
% S INDEX INTO IOQUE OF UNSUCCESSFUL I/O 04669350
% Y TEMPORARY 04669400
% U LOGICAL UNIT NUMBER OF TAPE UNIT BEING WRITTEN 04669450
% OLDU HARDWARE UNIT NUMBER OF TAPE UNIT 04669500
% SAVEU LOGICAL UNIT OF ORIGINAL TAPE UNIT WITH ERROR 04669550
% MIX MIX INDEX OF JOB FOR WHICH RECOVERY IS ATTEMPTED 04669600
% TEMP 04669650
% T1,T2,T3,T4 TEMPORARY 04669700
% IOD HOLDS THE I/O DESCRIPTOR FOR EACH I/O ATTEMPTED 04669750
% RESULT RECEIVES THE LAST I/O RESULT DESCRIPTOR 04669800
% MODE USED TO INDICATE A SUCCESSFUL RECOVERY ATTEMPT 04669850
% TOPIOD LOCATION OF TOP I/O DESCRIPTOR IN TANK 04669900
% TM TEMPORARY, USED FOR WRITING TAPE MARK 04669950
% HOLDCT CONTAINS THE NUMBER OF FILLED BUFFERS 04670000
% FIRSTREC 04670050
% SECREC ADDRESSES OF AREAS TO HOLD LAST TWO BLOCKS 04670100
% FIRSTRECIO 04670150
% SECRECIO VARIABLE LENGTH BLOCK I/O DESCRIPTORS 04670200
% BOOLEAN 04670250
% TOGGLES USED TO HOLD VARIOUS BOOLEANS (SEE DEFINES) 04670300
% ARRAYS 04670350
% FIB FIB ARRAY, USED FOR CLOSEING THE FILE 04670400
% FPB FPB ARRAY, USED FOR OPENING NEW FILE 04670450
% LABELA ARRAY DESCRIPTOR FOR IN-CORE LABEL RECORD 04670500
% TANK TANK ARRAY, CONTAINING I/O DESCRIPTORS 04670550
% 04670600
LABEL L1,RETRY,PROB,KAPUT,RESETUNITS,ARN,ERROROUT,XIO,EXIT; 04670650
DEFINE ALFA = TOGGLES.[47:1]#, 04670700
DSED = TOGGLES.[46:1]#, 04670750
LABELED = TOGGLES.[45:1]#, 04670800
NORMALPROCESS = TOGGLES.[44:1]#, 04670850
PBT = TOGGLES.[43:1]#; 04670900
$ SET OMIT = NOT(PACKETS) 04670950
DEFINE UNITNO = PSEUDOMIX[MIX]#; 04671000
$ POP OMIT 04671050
SUBROUTINE DOIONOW; 04671100
BEGIN 04671150
% DOIONOW IS COPIED FROM TAPEPARITYRETRY 04671200
FOR Y ~ 1 STEP 1 UNTIL 18 DO 04671250
BEGIN IF IOD.[24:1] THEN 04671300
BEGIN % WAIT 1/15 SECOND BETWEEN READ RETRIES 04671350
WHILE T4 > CLOCK+P(RTR) DO SLEEP(1,1); 04671400
T4 ~ CLOCK+P(RTR)+4; 04671450
END; 04671500
IF IOQUESLOTS=0 THEN SLEEP([IOQUESLOTS],63); 04671550
IOQUESLOTS ~ IOQUESLOTS-1; 04671600
IOQUEAVAIL ~ IOQUE[T1~IOQUEAVAIL]; 04671650
IOQUE[T1] ~ IOD; 04671700
IF (T2~(T3~UNIT[U]).[FF])=@77777 THEN T3.[CF]~T1; 04671750
LOCATQUE[T1] ~ [RESULT] & MIX[3:43:5] & 04671800
U[12:42:6] & T2[CTF]; 04671850
UNIT[U] ~ T3 & T1[CTF] & 100[5:35:13]; 04671900
STARTIO(U); 04671950
FINALQUE[T1] ~ NABS(IOD) & 0[25:40:8] OR IOMASK; 04672000
RESULT ~ 0; 04672050
SLEEP([UNIT[U]],@100000000000); 04672100
IF RESULT.[30:1] THEN GO ERROROUT; % NOT READY 04672150
IF RESULT.[29:1] AND RESLT.[2:1] THEN 04672200
BEGIN 04672250
IF RESLT.[12:1] THEN % BLANK TAPE 04672300
IF IOD.[24:1] THEN % READ 04672350
TRANSACTION[U] ~ (*P(DUP))-(1 & IOD[1:22:1]) ELSE 04672400
BEGIN % WRITE 04672450
STREAM(A~TINU[U], T~T2~SPACE(3)); 04672500
BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04672550
DS~21 LIT" BLANK TAPE ON WRITE~"; 04672600
END; 04672650
SPOUTER(T2,UNITNO,35); 04672700
GO ERROROUT; 04672750
END; 04672800
IF RESULT.[11:1] THEN % MEM PARITY 04672850
BEGIN 04672900
STREAM(A~TINU[U], T~T2~SPACE(3)); 04672950
BEGIN SI~LOC A; SI~SI+5; DS~3 CHR; 04673000
DS~13 LIT" I/O MEM PAR~"; 04673050
END; 04673100
SPOUTER(T2,UNITNO,35); 04673150
GO ERROROUT; 04673200
END; 04673250
IF RESULT.[13:2]!0 THEN Y ~ 18; 04673300
END ELSE 04673350
GO XIO; 04673400
END; 04673450
RESULT.[27:1] ~ 1; MODE ~ 32; 04673500
XIO: END DOIONOW; 04673550
% 04673600
U ~ SAVEU ~ OIOD.[3:4]; 04673650
% SAVE OFF ORIGINAL UNIT FOR DS-ING. 04673700
OLDU ~ UNIT[U]; 04673750
% SAVE OFF ORIGINAL UNIT TABLE ENTRY 04673800
MIX ~ RDCTABLE[U].[8:6]; 04673850
MODE ~ 16; 04673900
% SET MODE TO FLAG PARITY, MODE WILL BE SET TO ZERO IF CHANGE OK 04673950
LABELA ~ M[(TOPIOD~PRNTABLE[U].[15:15])-2] & @05000[CTF]; 04674000
FIB ~ M[TOPIOD-3]; 04674050
PBT ~ FIB[4].[8:4]=7; 04674100
FNUM ~ FIB[4].[13.11]; 04674150
BSIZE ~ IF PBT THEN 90 ELSE FIB[18].[3:15]; 04674200
NUMRECS ~ IF PBT THEN 5 ELSE BSIZE DIV FIB[18].[33:15]; 04674225
REEL ~ FIB[13].[28:10]+1; 04674250
ALFA ~ (NOT FIB[13]).[24:1]; 04674300
LABELED ~ (NOT FIB[4]).[2:1]; 04674350
NUMBUFFS ~ FIB[13].[10:9]; 04674400
TANK ~ [M[TOPIOD]] & NUMBUFFS[8:38:10]; 04674450
HALT; 04674500
% STOP NORMAL STATE PROCESSING. 04674550
IF RC THEN 04674600
IF TANK[0].[24:1] THEN 04674650
BEGIN 04674700
STREAM(T~T2~SPACE(5)); 04674750
DS ~ 40 LIT"#REEL SWITCH NOT POSSIBLE ON INPUT FILE~"; 04674800
SPOUTER(T2,UNITNO,1); 04674850
GO EXIT; 04674900
END; 04674950
STREAM(A~TINU[U], T~T2~SPACE(5)); 04675000
BEGIN 04675050
DS ~ 34 LIT"#REEL SWITCH TO BE ATTEMPTED FROM "; 04675100
SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; DS ~ LIT"~"; 04675150
END; 04675200
SPOUTER(T2,UNITNO,1); 04675250
IF PBT THEN 04675300
BEGIN 04675350
LABELA.[8:10] ~ 8; % PRINTER LABELS ARE 15 WORDS 04675400
LABELA[1] ~ MULTITABLE[U].[3:45]; 04675450
LABELA[2] ~ LABELTABLE[U].[3:45]; 04675500
END; 04675550
IF RC THEN GO L1; 04675600
FIRSTREC ~ GETSPACE(BSIZE+4,0,1)+4; 04675650
SECREC ~ GETSPACE(BSIZE+4,0,1)+4; 04675700
% GETSPACE ON TWO BUFFERS FOR BACKWARD READ. 04675750
IF ALFA THEN 04675800
BEGIN 04675850
IOD ~ @340000000 & OIOD[3:3:5] & [T2][CTC]; 04675900
DOIONOW; DOIONOW; 04675950
IOD ~ OIOD & 1[24:47:1] & FIRSTREC[CTC]; 04676000
DOIONOW; 04676050
IF RESULT.[27:2]!0 THEN GO ERROROUT; 04676100
IOD ~ IOD & SECREC[CTC]; 04676150
DOIONOW; 04676200
IF RESULT.[27:2]!0 THEN GO ERROROUT; 04676250
IOD ~ @340000000 & OIOD[3:3:5] & [T2][CTC]; 04676300
DOIONOW; DOIONOW; 04676350
GO L1; 04676400
END; 04676450
IOD ~ OIOD & (SECREC+BSIZE-1)[CTC] & 5[22:45:3]; 04676500
DOIONOW; 04676550
% BUILD BACKWARD DESCRIPTOR AND EXECUTE FIRST BACKWARD READ. 04676600
IF RESULT.[27:2]!0 THEN GO ERROROUT; 04676650
IF (TEMP ~ M[IOD INX 1])!BSIZE THEN 04676700
% VARIABLE LENGTH BLOCK. 04676750
SECRECIO ~ ((IOD INX 1)-TEMP) & TEMP[8:38:10]; 04676800
IOD ~ IOD & (FIRSTREC+BSIZE-1)[CTC]; 04676850
DOIONOW; 04676900
% NEXT BACKWARD READ. 04676950
IF RESULT.[27:2]!0 THEN GO ERROROUT; 04677000
IF (TEMP ~ M[IOD INX 1])!BSIZE THEN 04677050
% VARIABLE LENGTH BLOCK. 04677100
FIRSTRECIO ~ ((IOD INX 1)-TEMP) & TEMP[8:38:10]; 04677150
L1: 04677200
FOR I ~ 0 STEP 1 UNTIL NUMBUFFS-1 DO 04677250
IF (NOT TANK[I]).[19:1] THEN HOLDCT ~ HOLDCT+1; 04677300
% SCAN FOR THE NUMBER OF FILLED BUFFERS. 04677350
FIB[6] ~ FIB[6]-((RC=0)|2)-HOLDCT; 04677400
LOGICLRC ~ FIB[7] MOD NUMRECS; 04677450
% DETERMINE THE NUMBER OF LOGICAL RECORDS WRITTEN. 04677500
FIB[7] ~ FIB[6] | NUMRECS; 04677550
% LOAD FIB WITH RECORD COUNT FOR TRAILER LABEL. 04677600
IF HOLDCT=NUMBUFFS THEN 04677650
BEGIN 04677700
NOPROCESSTOG ~ NOPROCESSTOG-1; 04677750
NORMALPROCESS ~ 1; 04677800
END; 04677850
% IF THERE ARE NO UNFILLED BUFFERS THEN ALLOW NORMAL STATE 04677900
% PROCESSING TO CONTINUE. 04677950
% FLAG THE RELEASE OF NORMAL STATE. 04678000
% THE CHANCE OF UNFILLED BUFFERS IS VERY REMOTE, BUT JUST IN CASE 04678050
P1MIX ~ MIX; 04678100
% LOAD P1MIX FOR CONSOLE MESSAGES. 04678150
TEMP ~ U; 04678200
% SAVE OFF CURRENT UNIT IN CASE DS CALLED AT THIS POINT. 04678250
RETRY: 04678300
IF TERMSET(MIX) THEN 04678350
BEGIN 04678400
U ~ (-1); 04678450
GO ERROROUT; 04678500
END; 04678550
TEMP ~ U; 04678600
TM ~ @ 1737000000000000; 04678650
% TAPE MARK. 04678700
IOD ~ NFLAG([TM]) & OIOD[3:3:5]; 04678750
DOIONOW; 04678800
% WRITE TAPE-MARK. 04678850
FIB[13].[28:10] ~ REEL; 04678900
IF LABELED THEN 04678950
BEGIN 04679000
STREAM(BC~FIB[6], RC~FIB[7], BKUP~PBT, D~LABELA); 04679050
BEGIN 04679100
DI ~ DI+39; DS ~ LIT"1"; 04679150
% END OF REEL FLAG. 04679200
BKUP(DI ~ DI+12; JUMP OUT TO OWT); 04679250
SI ~ LOC BC; DS ~ 5 DEC; DS ~ 7 DEC; 04679300
OWT: DS ~ LIT"1"; 04679350
% SPECIAL FLAG FOR SORT AND USE PROCEDURES 04679400
END; 04679450
IOD ~ NFLAG(LABELA) & OIOD[3:3:5]; 04679500
IF NOT PBT THEN IF ALFA THEN 04679550
IOD.[21:1] ~ 0; 04679600
DOIONOW; 04679650
% BUILD I/O DESCRIPTOR AND WRITE THE TRAILER LABEL. 04679700
IOD ~ NFLAG([TM]) & OIOD[3:3:5]; 04679750
DOIONOW; 04679800
END; 04679850
IOD ~ IOD & @42[18:42:6]; 04679900
% BUILD THE REWIND DESCRIPTOR. 04679950
DOIONOW; 04680000
STOPTIMING(FNUM,1023); 04680050
FPB ~ PRT[MIX,3]; 04680100
LABELTABLE[U] ~ @214; % RW/L 04680150
MULTITABLE[U] ~ RDCTABLE[U] ~ PRNTABLE[U] ~ 0; 04680200
IF LABELED THEN 04680250
BEGIN 04680300
STREAM(R~REEL, BKUP~PBT, D~LABELA); 04680350
BEGIN 04680400
SI ~ LOC R; DI ~ DI+24; DS ~ 3 DEC; 04680450
% LOAD REEL NUMBER INTO LABEL. 04680500
DI ~ DI+12; DS ~ LIT"0"; 04680550
BKUP(DI ~ DI+12; JUMP OUT TO OWT); 04680600
DS ~ 12 LIT"0"; 04680650
OWT: DS ~ LIT "0"; 04680700
% CLEAN OUT OLD TRAILER LABEL INFO. 04680750
END; 04680800
IF NOT PBT THEN IF ALFA THEN 04680850
LABELA.[7:1] ~ 1; 04680900
U ~ LABELASCRATCH(LABELA); 04680950
% FIND TAPE FOR LABELED OUTPUT. 04681000
IF U=(-1) THEN GO ERROROUT; 04681050
% OPERATOR DS-ED. 04681100
END ELSE 04681150
BEGIN 04681200
U ~ FINDOUTPUT(FPB[FNUM],FPB[FNUM+1],REEL,0,0,2,0,TM); 04681250
% FIND UNLABELED OUTPUT TAPE. 04681300
IF U=(-1) THEN GO ERROROUT; 04681350
T2 ~ 0; 04681400
STREAM(PRN~PRNTABLE[U].[30:18], D~[T2]); 04681450
BEGIN SI ~ LOC PRN; DS ~ 8 DEC; 04681500
DI ~ DI-7; DS ~ 6 FILL; 04681550
END; 04681600
$ SET OMIT = PACKETS 04681650
FILEMESSAGE(" OUT" & TINU[U][6:30:18],T2, 04681800
FPB[FNUM],FPB[FNUM+1],REEL,0,0,OPNMESS); 04681850
END; 04681900
RDCTABLE[U] ~ (*P(DUP)) & MIX[8:42:6]; 04681950
PRNTABLE[U] ~ (*P(DUP)) & TOPIOD[15:33:15]; 04682000
FPB[FNUM+3].[36:6] ~ U+1; 04682050
% LOAD LOGICAL UNIT NUMBER +1 INTO FPB. 04682100
TEMP ~ OIOD.[3:4]; 04682150
% LUN OF OLD UNIT. 04682200
S ~ UNIT[TEMP].[FF]; 04682250
% SAVE OFF INDEX INTO IOQUE 04682300
UNIT[TEMP] ~ (*P(DUP)) & @77777[14:29:19]; 04682350
% CLEAR UNIT TABLE ON OLD UNIT. 04682400
UNIT[U] ~ OLDU; 04682450
% LOAD NEW UNIT TABLE ENTRY. 04682500
OIOD ~ OIOD & TINU[U][3:3:5]; 04682550
% LOAD OIOD WITH NEW UNIT NUMBER. 04682600
FOR I ~ 0 STEP 1 UNTIL NUMBUFFS-1 DO 04682650
IF TANK[I].[7:1] THEN 04682700
TANK[I] ~ (*P(DUP)) & OIOD[3:3:5]; 04682750
% LOAD NEW UNIT DESIGNATE INTO I/O DESCRIPTOR TANK. 04682800
TINU[U] ~ (*P(DUP)) & TINU[TEMP][24:24:6]; 04682850
TINU[TEMP] ~ (*P(DUP)) & 0[24:42:6]; 04682900
IF RC THEN GO KAPUT; 04682950
IF FIRSTRECIO!0 THEN IOD ~ OIOD&FIRSTRECIO[8:8:10]&FIRSTRECIO[CTC] 04683000
% TEST FOR BLOCK LESS THAN MAX LENGTH--VARIABLE LENGTH--. 04683050
ELSE IOD ~ OIOD & FIRSTREC[CTC]; 04683100
DOIONOW; 04683150
% WRITE FIRST RECORD 04683200
IF RESULT.[28:1] THEN % CHECK FOR WRITE ERROR 04683250
BEGIN 04683300
PROB: 04683350
FIB[13].[28:10] ~ REEL-1; 04683400
% DECREMENT REEL COUNT. 04683450
STREAM(A~TINU[U], T~T2~SPACE(6)); 04683500
BEGIN 04683550
DS ~ 23 LIT"#REEL SWITCH FAILED ON "; 04683600
SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; 04683650
DS ~ 22 LIT", ANOTHER REEL PLEASE~"; 04683700
END; 04683750
SPOUTER(T2,UNITNO,1); 04683800
GO RETRY; 04683850
END; 04683900
IF SECRECIO!0 THEN IOD ~ OIOD&SECRECIO[8:8:10]&SECRECIO[CTC] 04683950
% CHECK FOR LESS THAN MAX LENGTH BLOCKS--VARIABLE LENGTH-- 04684000
ELSE IOD ~ OIOD & SECREC[CTC]; 04684050
% STANDARD LENGTH 04684100
DOIONOW; 04684150
% WRITE SECOND RECORD. 04684200
IF RESULT.[28:1] THEN GO PROB; 04684250
IOD ~ OIOD; 04684300
% ORIGINAL BAD IO ON NEW UNIT 04684350
DOIONOW; 04684400
IF RESULT.[28:1] THEN GO PROB; 04684450
KAPUT: 04684500
IF NOT DSED THEN 04684550
BEGIN 04684600
MODE ~ 0; 04684650
STARTIMING(FNUM,U); 04684700
END; 04684750
% CHANGE OVER SUCCESSFUL. 04684800
FIB[15].[24:6] ~ U; 04684850
% NEW LUN INTO FIB. 04684900
OLDU ~ TINU[U].[3:5]; 04684950
% OLDU LOADED WITH NEW PHYSICAL UNIT NUMBER. 04685000
IF NOT RC THEN 04685050
BEGIN 04685100
RESETUNITS: 04685150
IOQUE[S] ~ (*P(DUP)) & OLDU[3:43:5]; 04685200
FINALQUE[S] ~ (*P(DUP)) & OLDU[3:43:5]; 04685250
LOCATQUE[S] ~ (*P(DUP)) & U[12:42:6]; 04685300
% RESET DESCRIPTORS IN IOQUE. 04685350
IF (S ~ LOCATQUE[S].[FF]!@77777 THEN GO RESETUNITS; 04685400
END; 04685450
FIB[16] ~ (*P(DUP)) & OLDU[3:43:5]; 04685500
FIB[19] ~ (*P(DUP)) & OLDU[3:43:5]; 04685550
% CHANGE UNIT FIELD OF DESCRIPTORS IN FIB. 04685600
FIB[6] ~ ((RC=0)|2)+HOLDCT; 04685650
% LOAD NEW BLOCK COUNT INTO FIB 04685700
FIB[7] ~ (((RC=0)|2) | NUMRECS)+HOLDCT | NUMRECS+LOGICLRC; 04685750
% LOAD NEW RECORD COUNT 04685800
TINU[U].[24:6] ~ 0; 04685850
UNIT[U].[5:10] ~ 0; 04685900
% RESET ERROR FLAGS. 04685950
IF NOT DSED THEN 04686000
BEGIN 04686050
STREAM(A~TINU[U], T~T2~SPACE(4)); 04686100
BEGIN 04686150
DS ~ 26 LIT"#REEL SWITCH COMPLETED ON "; 04686200
SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; DS ~ LIT"~"; 04686250
END; 04686300
SPOUTER(T2,UNITNO,1); 04686350
END; 04686400
TOPIOD ~ TEMP ~ (IF RC THEN FIB[19] ELSE OIOD).[CF]-2; 04686450
% MUST RESET LUN IN I/O BUFFER FOR PROGRAM RELEASE 04686500
ARN: M[TEMP] ~ (*P(DUP)) & U[12:42:6]; 04686550
IF M[TEMP].[FF]-2!TOPIOD THEN 04686600
BEGIN 04686650
TEMP ~ M[TEMP].[FF]-2; 04686700
GO ARN; 04686750
END; 04686800
GO EXIT; 04686850
ERROROUT: 04686900
STREAM(T~T2~SPACE(3)); 04686950
DS ~ 21 LIT"#REEL SWITCH ABORTED~"; 04687000
SPOUTER(T2,UNITNO,1); 04687050
IF U < 0 THEN % JOB BEING DS-ED AT MT REQ 04687100
BEGIN 04687150
U ~ TEMP; 04687200
% SET U TO LAST UNIT. 04687250
IF U=SAVEU THEN GO EXIT; 04687300
DSED ~ 1; 04687350
GO KAPUT; 04687400
% GO TO KAPUT TO COUNTINUE HOUSE-KEEPING 04687450
END; 04687500
EXIT: 04687550
P1MIX ~ 0; 04687600
IF FIRSTREC!0 THEN 04687650
BEGIN 04687700
FORGETSPACE(FIRSTREC-2); 04687750
FORGETSPACE(SECREC-2); 04687800
END; 04687850
IF NOT NORMALPROCESS THEN NOPROCESSTOG ~ NOPROCESSTOG-1; 04687900
% WAS UNABLE TO FREE NORMAL PROCESS DUE TO UNFILLED BUFFERS. 04687950
% THIS SITUATION MAY NEVER OCCUR, BUT JUST IN CASE 04688000
WRITEPARITYREELSWITCH ~ UNIT[U] & MODE[5:40:8]; 04688050
END WRITEPARITYREELSWITCH; 04688100
REAL PROCEDURE PLACEFINDER(S, A, L); 04700000
VALUE S, A; 04701000
REAL S, A, L; 04702000
BEGIN INTEGER I; ARRAY B[*]; 04703000
REAL T, W, E, J, AA; 04704000
LABEL NULL, FOUND, EXIT; 04705000
LABEL SANDA; REAL SS; 04705500
W ~ -1; 04706000
B ~ [M[T ~ SPACE(30)]]&30[8:38:10]; 04707000
SS:=S; 04707500
IF S=0 THEN 04708000
NULL: BEGIN STREAM(T); DS:=20 LIT " "; GO EXIT; END; 04709000
DISKWAIT(-T,30,JAR[P1MIX,10]); 04710000
IF (JAR[P1MIX,10]=0) OR (AA~B[0].[FF])=0 THEN 04711000
SANDA: BEGIN STREAM(S:=SS,A,K:=M[PRT[P1MIX,8]].[10:2],T); 04712000
BEGIN DS~5 LIT ", S ="; 04713000
SI~LOC S; DS~4 DEC; 04714000
DS~5 LIT ", A ="; 04715000
DS~4 DEC; 04716000
DS:=LIT ":"; SI:=SI+7; DS:=CHR; 04716100
DI~T; DI~DI+5; DS~3 FILL; 04717000
DI~T; DI~DI+14; DS~3 FILL; 04718000
END STREAM; 04719000
GO EXIT; 04720000
END; 04721000
DISKWAIT(-T,30,I:=JAR[P1MIX,AA DIV JAR[P1MIX,8]+10+ 04722000
AA MOD JAR[P1MIX,8]+S DIV 30); 04723000
IF (J~B[S MOD 30])<0 THEN GO TO NULL; 04725000
AA ~ I ~ JAR[P1MIX,J.[CF] DIV JAR[P1MIX,8]+10]+ 04726000
J.[CF] MOD JAR[P1MIX,8]; 04727000
I~0; J~J.[FF]; 04728000
DO BEGIN S~(I+J).[36:11]; 04729000
IF W!(W:=S DIV 30) THEN DISKWAIT(-T,30,AA+W); 04731000
IF (E ~ B[S-W|30].[38:10])=A THEN GO TO FOUND; 04732000
IF E<A THEN I~S ELSE J~S; 04733000
END UNTIL J-I=1; 04734000
S~I; 04735000
FOUND: L ~ -B[S MOD 30].[28:10]; 04736000
IF L=0 THEN GO TO SANDA; 04736500
STREAM(L~ABS(L),T); 04737000
BEGIN DS:=11 LIT ",NEAR LINE "; 04738000
SI~LOC L; DS~8 DEC; 04739000
DS:=LIT " "; DI:=DI-9; DS:=7 FILL; 04740000
END STREAM; 04741000
EXIT: PLACEFINDER ~ T; 04742000
END PLACEFINDER; 04743000
$ SET OMIT = NOT(DATACOM ) 04999999
PROCEDURE LOGOUT(A); VALUE A; REAL A; FORWARD; %154-05606900
PROCEDURE FORMTIME(W,T); VALUE W,T; REAL W,T; %154-05607000
BEGIN INTEGER S,M; %154-05608000
T~(T+60) DIV 60; %154-05609000
S~T MOD 60; %154-05610000
T~T DIV 60; %154-05611000
M~T MOD 60; %154-05612000
T~T DIV 60; %154-05613000
STREAM(T,M,S,W~[W]); %154-05614000
BEGIN SI~LOC T; DS~2 DEC; %154-05615000
2(DS~LIT ":"; DS~2 DEC); %154-05616000
DI~W; DS~7 FILL; %154-05617000
END; %154-05618000
END; %154-05619000
PROCEDURE LOGSPACE(W,L); % THIS MAY ZIP 05700000
VALUE W,L; NAME W; INTEGER L; % FIRST WORD,WORD COUNT 05701000
COMMENT THIS WILL CLOBBER WORDS AROUND THOSE LOGGED; 05701010
BEGIN INTEGER B,I,J,K,N; ARRAY A[*]; LABEL OK; DEFINE Z=LOGFREE#; 05702000
N~L DIV 5; %NO REMAINDER ALLOWED 05702500
A:=[M[B:=SPACE(30)]]&30[8:38:10]; 05703000
IF Z>0 THEN SLEEP([Z],-0); Z~-Z; 05703500
$ SET OMIT = NOT(SHAREDISK) 05703699
DISKWAIT(-B,30,Z); 05704000
IF (I~A[0])+6+N}(J~A[1]) THEN BEGIN I~0; K~1 END %WRAP AROUND 05705000
ELSE IF I+N+100 GEQ J THEN 05706000
BEGIN INDEPENDTRUNNER(P(.LOGOUT),1,128); 05706100
K:=2; 05706200
END 05706300
ELSE IF I<J DIV 2 AND J DIV 2<I+N THEN K~3 % HALF FULL 05707000
ELSE GO TO OK; 05708000
STREAM(K:=K-1, J:=J:=SPACE(3)); 05709000
BEGIN CI:=CI+K; GO TO L2; GO TO L1; 05710000
DS:=14 LIT"#LOG HALF FULL"; GO TO L3; 05710500
L1: DS:=19 LIT" LOG FULL - AUTO LN"; GO TO L3; 05711000
L2: DS:=17 LIT"**LOG WRAP AROUND"; 05711500
L3: DS:=LIT"~"; 05712000
END; 05713000
SPOUT(J); 05714000
OK: A[0]~N+I; A[3]~K; A[2]~I~I+1; %WE NOW PUT THE WORDS IN I 05715000
W[L]~4; % END OF LOG 05715100
J~(I MOD 6)|5; %SIZE OF NEIGHBORHOOD (NBD) 05716000
$ SET OMIT = NOT(SHAREDISK) 05716999
IF (I~I DIV 6)!0 THEN DISKWAIT(B,30,Z); %DUMP RECORD ZERO 05722000
IF J!0 THEN % GET NBD 05723000
BEGIN IF I!0 THEN DISKWAIT(-B,30,Z+I); 05724000
MOVE(30-J,W INX 0,A INX J) 05725000
END 05726000
ELSE B:=W INX 0; 05727000
DISKWAIT(B,30,Z+I); 05728000
IF (L+J) GEQ 30 THEN 05728100
BEGIN K:=L-(J:=30-J)+1; 05728120
I:=I+1; 05728140
DO 05728160
BEGIN DISKWAIT(W INX J,IF K>1020 THEN 1020 ELSE K,Z+I); 05728180
J:=J+1020; 05728200
I:=I+34; 05728220
END UNTIL (K:=K-1020) LEQ 0; 05728240
END; 05728260
$ SET OMIT = NOT(STATISTICS) 05728299
FORGETSPACE(A); 05729000
$ SET OMIT = NOT(SHAREDISK ) 05729199
Z:=-Z; 05729300
END OF LOGSPACE; 05730000
DEFINE 05780000
MAXSIZ[1:20]#, TOMAXSIZ=1:28:20#, 05780010
SPEED = [23:3]#, TOSPEED= 23:45:3#, 05780020
EUNP = [21:1]#, TOENUP = 21:47:1#, 05780025
STARTWRD=[26:12]#, TOSTARTWRD=26:36:12#, 05780030
NUMENT=[38:10]#, TONUMENT=38:38:10#, NUMENTM=1023#, 05780040
DSIZE=[2:20]#, TODSIZE=2:28:20#, 05780100
DENT=[22:26]#, TODEND=22:22:26#, 05780200
TOSIZE=8:38:10#, NEUF=[18:15]#, 05780300
EUIOFFSET=4 #, % ONE WORD FOR EACH I/O CHANNEL. 05780310
AVDIFFMIN=15#, AVDIFFMAX=50#, % AVDIFFMAX GTR AVDIFFMIN GTR 14. 05780400
AVTMAX=3900#, % MAX # WORDS ALLOWED FOR AVAILABLE TABLE ON DISK. 05780500
% IS REFLECTED IN USERDISKBOTTOM & DISKAVAILTABLEMAX05780505
AVSMIN=90# , AVSMAX=300#, % MIN AND MAX # WORDS TO READ IN @ 1 TIM05780600
% AVSMAX GTR AVSMIN GTR 85 05780605
% BOTH MUST BE MULTIPLES OF 30 05780610
FIXARRAY(FIXARRAY1,FIXARRAY2,FIXARRAY3)=FIXARRAY1~[M[FIXARRAY2~ 05780700
SPACE(FIXARRAY3)]]&FIXARRAY3[TOSIZE]# ; 05780800
$ SET OMIT = NOT (SHAREDISK ) 05800000
REAL PROCEDURE PETUSERDISK(N,T); VALUE N,T; REAL N,T ; 05839400
% N IS THE NUMBER OF SEGMENTS REQUESTED, AND T IS THE EU# OR THE SPEED#.05839600
% GETUSERDISK WILL RETURN -1, 0, OR THE ABSOLUTE DISK SEGMENT ADDRESS OF05839700
% THE RESULTANT AREA. SEE T.[2:1] FOR THE -1, AND N.[2:1] FOR THE 0. 05839800
% T>0 => T IS A PREFERRED SPEED#: T=1,2,3,4,..., OR 31. 05840000
% T<0 => -T IS A PREFERRED EU#: T=-1,-2,-3,-4,..., OR -20. 05840100
% T=0 => DONT CARE ABOUT SPEED# OR EU#, USE EU WITH LEAST EU I/O. 05840200
% T.[2:1]=1 => IF CANT GET PREFERRED SPEED# OR EU#, RETURN -1. 05840300
% T.[2:1]=0 => IF CANT GET PREFERRED SPEED# OR EU#, TREAT AS T=0 (ABOVE)05840400
% N>0 => MAKE A SCRATCHDIRECTORY ENTRY. 05840500
% N<0 => DONT MAKE A SCRATCHDIRECTORY ENTRY. 05840600
% N=0 => IMMEDIATELY RETURN WITH A 0. 05840700
% N.[2:1]=0 => IF CANT FIND ANY USERDISK, AND T.[2:1]=0, NO-USER-DISK. 05840800
% N.[2:1]=1 => IF CAND FIND ANY USERDISK, ANT T.[2:1]=0, RETURN 0. 05840900
BEGIN 05841200
INTEGER K=+1, % K IS ALSO "GETUSERDISK"; DONT USE K ABOVE LABEL D. 05841300
Z=K+1, NS=Z+1, I=NS+1, 05841350
$ SET OMIT = NOT(SHAREDISK ) 05841380
$ SET OMIT = SHAREDISK 05841610
R=I+1, AVS=R+1, H=NT6, L=AVS ; 05841615
REAL M1=NT5 M2=NT4,; ARRAY UT=J+1[*]; DEFINE U=AVTABLE # ; 05841620
$ POP OMIT 05841621
LABEL A,B,C,D,E,F,G,W ; 05841650
DEFINE GETUSERDISK=PETUSERDISK#;%***************************************05841700
IF N=0 THEN GO W ; 05842100
P(T.[2:1],ABS(N),1,0,0,0,0) ; 05842200
$ SET OMIT = NOT(SHAREDISK ) 05842205
A: SLEEP([TOGLE],USERDISKMASK); LOCKTOG(USERDISKMASK); 05842300
$ SET OMIT = NOT(SHAREDISK ) 05842390
$ SET OMIT = SHAREDISK 05842405
M1:=M2:=P(D) ; 05842410
$ POP OMIT 05842411
L:=NEUP.NEUF ; 05842450
IF T LSS 0 THEN IF U[J:=IF -T GTR L THEN L+1 ELSE -T].MAXSIZ GEQ NS 05842475
THEN GO E ELSE IF Z THEN GO C ; 05842500
B: IF U[I].MAXSIZ}NS THEN 05842700
BEGIN 05842800
P(EUIO[(NT1:=I-1)+EUIOFFSET]+PEUIO[NT1],.NT2,SND,DUP) ; 05842900
IF P LSS M1 THEN BEGIN M1:=NT2; H:=NT1 END ; 05842930
IF P LSS M2 THEN IF UPI[.SPPED=T THEN BEGIN M2:=NT2;J:=NT1 END;05843000
END; 05843100
IF (I:=I+1) LEQ L THEN GO B ; 05843200
IF P(D)!M1 THEN 05843300
BEGIN 05843400
IF M2=M2:=P(D) THEN IF Z AND T!0 THEN 05843500
C: BEGIN GETUSERDISK~-1; GO G END 05843600
ELSE J~H ; 05843700
J:=J+1; GO E ; 05843800
END; 05843900
IF Z THEN GO C ; 05843950
IF N.[2:1] THEN GO G ; 05844000
$ SET OMIT = NOT(SHAREDISK ) 05844050
$ SET OMIT = SHAREDISK 05844090
FIXARRAY(UT,R,30); USERDISKSPECIALCASE(I:=1,R,UT,NS); GO A ; 05844110
$ POP OMIT 05844111
D:::@0777777777777777 ; 05844200
$ SET OMIT = NOT(SHAREDISK ) 05844290
$ SET OMIT = SHAREDISK 05844915
E: IF (AVS:=(K:=(T:=U[J] AND NUMENTM)+I:=(Z:=U[J].STARTWRD) MOD 30) MOD05844920
30) NEQ 0 THEN AVS:=30-AVS; AVS:=AVS+K; P(M2) ; 05844925
FIXARRAY(UT,R,AVS); DISKWAIT(-R,AVS,Z~Z DIV 30+USERDISKBOTTOM) ; 05844930
M2:=P; P(K-1); NT2:=0; NT3:=K:=U[J].MAXSIZ ; 05844935
$ POP OMIT 05844936
E: IF (NT1~UT[I].DSIZE)>NT2 THEN IF NT1!K THEN NT2~NT1 ELSE K:=0; 05845000
IF NT1}NS THEN IF NT1<M2 THEN BEGIN M2~NT1; H~I END ; 05845100
IF P(DUP) GTR I:=I+1 THEN GO F ; 05845200
UT[H].DSIZE~NS~M2-NS ; 05845300
IF M1:=M2=NT3 THEN U[J].MAXSIZ:=IF NT2>NS THEN NT2 ELSE NS ; 05845400
GETUSERDISK~UT[H].DEND-M2; I:=P ; 05845500
$ SET OMIT = NOT(SHAREDISK ) 05845590
IF N~NS=0 THEN BEGIN MOVE(I-H,[UT[H+1]],[UT[H]]);U[J].NUMENT~T-1END;05845700
$ SET OMIT = NOT(SHAREDISK ) 05845790
$ SET OMIT = SHAREDISK 05846350
DISKWAIT(R,AVS,Z); 05846360
$ POP OMIT 05846361
$ SET OMIT = NOT(SHAREDISK ) 05846370
$ SET OMIT = SHAREDISK 05846385
FORGETSPACE(R) ; 05846390
G: UNLOCKTOG(USERDISKMASK); 05846395
$ POP OMIT 05846396
W: END OF GETUSERDISK ; 05846500
PROCEDURE FORGETUSERDISK(A,N); VALUE A,N; REAL A,N ; 05846600
% A IS THE ABSOLUTE DISK SEGMENT ADDRESS OF AN AREA N SEGMENTS LONG 05846800
% WHICH IS TO BE MADE AVAILABLE AGAIN. 05846900
% N<0 => MAKE A SCRATCHDIRECTORY DELETION. 05847000
% N>0 => DONT MAKE A SCRATCHDIRECTORY DELETION. 05847100
% N=0 => IMMEDIATELY GO AWAY ; 05847200
BEGIN 05847400
$ SET OMIT = NOT(SHAREDISK ) 05847490
$ SET OMIT = SHAREDISK 05847590
INTEGER AVS,F=AVS; ARRAY UT[*]; DEFINE U=AVTABLE #; 05847600
$ POP OMIT 05847601
REAL E; INTEGER B,C,D,I,J,R,S,H=NT7,K=NT6,L=NT5,G=NT4,T=NT3,Q=JUNK;05847700
LABEL V,W,X,Y,Z,AZ,BZ,CZ,DZ ; 05847800
SUBROUTINE SETSHIFT ; 05847900
BEGIN 05848000
S:=P(XCH) ; 05848100
$ SET OMIT = NOT(SHAREDISK ) 05848190
$ SET OMIT = SHAREDISK 05848250
U[J].STARTWRD:=I+S; G:=D+S; 05848255
$ POP OMIT 05848256
K:=G+C-1; 05848300
END OF SETSHIFT; 05848500
IF N=0 OR (J:=A DIV 1000000) GEQ NEUP.NEUF 05848900
OR A LSS USERDISKBOTTOM+DISKAVAILTABLEMAX THEN GO BZ ; 05849000
SLEEP([TOGLE],USERDISKMASK); LOCKTOG(USERDISKMASK); 05849300
$ SET OMIT = NOT(SHAREDISK ) 05849390
IF (D:=U[0].MAXSIZ) NEQ 0 AND N GTR 0 THEN IF (TWO(J) AND D) NEQ 0 05849420
THEN BEGIN USERDISKSPECIALCASE(3,N,U,A); IF NOT P THEN GO DZ END ; 05849460
J:=J+1 ; 05849480
V: D~(I~(E~U[J]).STARTWRD) MOD 30 ; 05849500
$ SET OMIT = NOT(SHAREDISK ) 05849590
$ SET OMIT = SHAREDISK 05850105
AVS:=30-(S:=(C:=E AND NUMENTM)+D) MOD 30+S ; 05850110
FIXARRAY(UT,R,AVS); DISKWAIT(-R,AVS,B:=I DIV 30+USERDISKBOTTOM) ; 05850120
K:=S; L:=D; S:=I+C ; 05850130
$ POP OMIT 05850131
G~I-(NT2:=(P(U[J-1],DUP) AND NUMENTM)+P(XCH).STARTWRD) ; 05850200
S~U[J+1].STARTWRD-S; H~K~K-1; IF UT[T~L].DEND}A THEN GO X ; 05850300
W: IF UT[T~(H+L+1)DIV 2].DEND}A THEN IF UT[H~T-1].DEND}A THEN GO W ELSE05850400
ELSE IF UT[T~T+1].DEND<A THEN BEGIN L~T+1; GO W END ; 05850500
X: IF (L:=A+ABS(N)) GEQ H:=P(UT[Q:=T],DUP).DEND-P(XCH).DSIZE THEN GO Z;05850600
IF S=0 THEN 05850700
BEGIN 05850800
$ SET OMIT = NOT(SHAREDISK ) 05850890
$ SET OMIT = SHAREDISK 05851215
IF G=0 OR D=0 THEN GO Y; IF P((G+1)DIV 2,DUP)>0 THEN P(DEL,D);05851220
$ POP OMIT 05851221
P(SSN);SETSHIFT;MOVE(C,[UT[G-S]],[UT[G]]);T~Q~T+S; 05851300
END; 05851400
FOR H~K STEP -1 UNTIL T DO UT[H+1]~UT[H]; H~ABS(N); GO AZ ; 05851500
Y: USERDISKSPECIALCASE(2,E,UT,J) ; 05851600
$ SET OMIT = NOT(SHAREDISK ) 05851650
GO V ; 05851675
Z: IF P(UT[Q~Q+1],DUP).DEND=P(XCH).DSIZE{L THEN GO Z ; 05851700
IF P(UT[NT1:=Q-1].DEND,DUP) LSS L THEN P(DEL,L) ; 05851800
H:=(L:=P)-(IF A LSS H THEN A ELSE H) ; 05851850
IF NT1 GTR T THEN MOVE(K-NT1,[UT[Q]],[UT[T+1]]) ; 05851900
AZ: UT[T]~L&H[TODSIZE]; C~(Q~T-Q+1)+C ; 05852000
IF(S~S-Q)>T~IF AVDIFFMAX>T~C DIV 2 THEN AVDIFFMAX ELSE T THEN IF J=105852100
OR S+G>T+(IF AVDIFFMAX>T~NT2 DIV 2 THEN AVDIFFMAX ELSE T) THEN GO Y 05852200
ELSE BEGIN 05852300
IF (NT1~F-1-K)=0 THEN GO Y; 05852350
IF P((S+G) DIV 2,DUP) GTR NT1 THEN P(DEL,NT1);SETSHIFT; 05852400
FOR NT1~K STEP -1 UNTIL G DO UT[NT1]~UT[NT1-S] ; 05852500
END ; 05852600
U[J]~(NT1~U[J])&C[TONUMENT]&(IF E~(NT1~NT1.MAXSIZ)<H THEN H ELSE 05852700
NT1)[TOMAXSIZ] ; 05852800
$ SET OMIT = NOT(SHAREDISK ) 05852890
$ SET OMIT = SHAREDISK 05853420
DISKWAIT(R,AVS,B) ; 05853425
$ POP OMIT 05853426
$ SET OMIT = NOT(SHAREDISK ) 05853490
$ SET OMIT = SHAREDISK 05853593
FORGETSPACE(R) ; 05853595
DZ: UNLOCKTOG(USERDISKMASK); 05853600
$ POP OMIT 05853601
BZ: END OF FORGETUSERDISK ; 05853700
PROCEDURE DKBUSINESS(BUFF); VALUE BUFF; REAL BUFF; 05950000
BEGIN 05950200
REAL RCW=+0, 05950400
MSCW=-2, 05950500
MID=RWC+1, 05950600
FID=MID+1, 05950800
TMID=FID+1, 05950900
IFID=TMID+1, 05950950
A=TFID+1, 05951000
B=A+1; 05951200
INTEGER N=B+1; 05951400
ARRAY HD=N+1[*]; 05951600
BOOLEAN RDT=HD+1; 05951700
INTEGER C=RDT+1,D=C+1,I=D+1,J=I+1,R=J+1,S=R+1, 05951800
LA=S+1,SA1=NT2, 05951900
H=NT7,K=NT6,L=NT5,G=NT4,T=NT3,Q=JUNK; 05952000
REAL E=LA+1; 05952200
REAL KTR=B; 05952210
REAL TYPE=C; 05952220
REAL WORD=D; 05952230
REAL HA=J; 05952240
REAL HEADER=R; 05952250
ARRAY HDR=E[*]; 05952260
BOOLEAN FILTOG=E+1; 05952270
REAL SEGS=FILTOG+1; 05952300
$ SET OMIT = SHAREDISK 05952399
ARRAY UT=HD[*]; INTEGER AVS=SEGS+1; DEFINE U=AVTABLE#; 05952400
INTEGER SLEEPER=AVS+1; 05952500
$ POP OMIT 05952501
$ SET OMIT = NOT(SHAREDISK) 05952505
LABEL V,W,X,Y,Z,AZ,BZ,CZ,INUSE,EXIT; 05952600
LABEL FILEID,XDFILE,CONFLICT,FOUND,MSG,FINIS; 05952620
$ SET OMIT = NOT(SHAREDISK) 05952690
REAL SUBROUTINE DECWORD; 05952705
BEGIN 05952710
STREAM(T~0:W~[WORD]); 05952715
BEGIN 05952720
SI~W; DI~LOC T; DS~8DEC; 05952725
END STREAM; 05952730
DECWORD~P; 05952735
END DECWORD; 05952740
SUBROUTINE SCAN; 05952745
BEGIN 05952750
STREAM(KTR,TYPE~0:T~0,W~[WORD]); 05952755
BEGIN 05952760
SI~KTR; 05952765
L0: IF SC=" " THEN BEGIN SI~SI+1; GO L0; END; 05952770
IF SC=""" THEN % STRING IDENTIFIER 05952775
BEGIN 05952780
SI~SI+1; DS~LIT"0"; 05952785
IF SC=""" THEN 05952790
BEGIN 05952795
SI~SI+1; 05952800
IF SC=""" THEN DS~CHR ELSE DS~LIT" "; 05952805
DS~6LIT" "; 05952810
END ELSE 05952815
BEGIN 05952820
7(IF SC!""" THEN DS~CHR ELSE DS~LIT" "); 05952825
L1: IF SC~""" THEN BEGIN SI~SI+1; GO L1; END; 05952830
S1~SI+1; 05952835
END; 05952840
GO T1; 05952845
END; 05952850
IF SC=ALPHA THEN IF SC LSS "0" THEN 05952855
BEGIN % IDENTIFIER 05952860
ID: DS~LIT"0"; 05952865
7(IF SC=ALPHA THEN DS~CHR ELSE DS~LIT" "); 05952870
L2: IF SC=ALPHA THEN BEGIN SI~SI+1; GO L2; END; 05952875
T1: TALLY~1; 05952880
GO EXT; 05952885
END; 05952890
IF SC=ALPHA THEN IF SC LEQ "9" THEN 05952895
BEGIN % NUMBER 05952900
SI~SI+1; TALLY~1; 05952905
7(IF SC=ALPHA THEN IF SC LSS "0" THEN 05952910
BEGIN T~TALLY; SI~SI-T; JUMP OUT TO ID; END 05952915
ELSE IF SC LEQ "9" THEN 05952920
BEGIN SI~SI+1; TALLY~TALLY+1; END); 05952925
T~TALLY; SI~SI-T; DS~T OCT; 05952930
TALLY~2; 05952935
GO EXT; 05952940
END; 05952945
IF SC!"~" THEN TALLY~3 ELSE TALLY~5; 05952950
DS~7 LIT"0"; DS~CHR; 05952955
EXT: TYPE~TALLY; 05952960
KTR~SI; 05952965
END STREAM; 05952970
P(.TYPE,STD,.KTR,STD); 05952975
END SCAN; 05952980
SUBROUTINE MLOGIT; 05952985
BEGIN 05952990
S~TYPEDSPACE(15,MAINTBUFFAREAV);% %167-05952995
STREAM(B:DATE,D~S+1); 05953000
BEGIN 05953005
SI~LOC DATE; DS~8 OCT; DI~DI+8; 05953010
SI~B; 05953015
2(63(IF SC!"~" THEN DS~CHR ELSE JUMP OUT 2 TO LL)); 05953020
LL: DS~LIT"~"; DI~DI-1; B~DI; 05953025
END STREAM; 05953030
LA~ P INX 0; 05953035
M[S]~ (LA-S) DIV 5; 05953040
M[S+2]~IF FILTOG THEN -N ELSE SEGS; 05953045
LINKUP(18,S); 05953050
END MLOGIT; 05953055
SUBROUTINE ENTERFILE; 05953060
BEGIN 05953065
FIXARRAY(HD,B,30); 05953070
MOVE(30,HD-1,HD); 05953075
HD[0]~@3600036000101; 05953080
STREAM(DATE,XCLOCK,H~HD INX 3); 05953085
BEGIN 05953090
SI~LOC DATE; DS~8OCT; 05953095
DI~DI-20; SI~SI+4; DS~4CHR; 05953100
DI~DI-7; SI~H; SI~SI+5; DS~3CHR; 05953105
DI~H; DS~2LIT"+#"; SI~SI-3; DS~3CHR; 05953110
END STREAM; 05953115
HD[4].[42:1]:=1; % MAKE FILE NON-MOVEABLE 05953117
HD[7]~(HD[8]~N)-(HD[9]~1); 05953120
HD[10]~A; 05953125
ENTERUSERFILE(MID,FID.[6:42],B-1); 05953130
STREAM(MID,FID,N,TMID,TFID,FILTON, 05953135
B~IF FILTOG THEN B ELSE BUFF); 05953140
BEGIN 05953145
SI~LOC N; DI~LOC N; DS~8DEC; 05953150
DI~LOC N; DS~7FILL; DI~B; 05953155
DS~LIT" "; SI~LOC MID; SI~SI+1; DS~7CHR; 05953160
DS~LIT"/"; SI~SI+1; DS~7CHR; 05953165
DS~6LIT" SEGS="; DS~8CHR; DS~8LIT" CREATED"; 05953170
FILTOG(DS~6LIT" FROM "; DI~SI+1; DS~7CHR; 05953175
DS~LIT"/"; SI~SI+1; DS~7CHR); 05953180
DS~LIT"~"; 05953185
END STREAM; 05953190
IF FILTOG THEN 05953195
BEGIN 05953200
MLOGIT; 05953205
SPOUT(B); 05953210
END ELSE 05953215
FORGETSPACE(B); 05953220
END ENTERFILE; 05953225
P(0,0,0,0,0,BUFF,DUP); BUFF~P.[15:15]-1; P(0,0,B LSS 0); 05953250
P(0,0,0,0,0,0,0,0,0,0,0); 05953260
$ SET OMIT = NOT(SHAREDISK); 05953269
IF B.[CF]=0 THEN% MAKE RESERVE/DISK 05953400
BEGIN MID:="RESERVE"; FID:="DISK "; 05953600
IF (A:=DIRECTORYSEARCH(-MID,FID,5))!0 THEN 05953800
BEGIN STREAM(BUFF); 05954000
DS:=30LIT" RESERVE/DISK ALREADY PRESENT~"; 05954200
GO TO EXIT; 05954400
END; 05954600
IF (A~GETUSERDISK((N~RESERVEDISKSIZE)&1[2:47:1]))=0 THEN 05954800
BEGIN STREAM(BUFF); 05955000
DS:=32LIT"**NO USER DISK FOR RESERVE/DISK~"; 05955200
GO TO EXIT; 05955400
END; 05955600
GO TO CZ; 05955800
END; 05956000
IF RDT THEN 05956250
BEGIN P(B); A:=M[BUFF INX 0]; N:=M[BUFF INX 1]; END ELSE 05956300
BEGIN 05956350
SCAN; 05956400
IF TYPE=1 THEN % IDENTIFIER 05956450
BEGIN 05956500
TMID~WORD; 05956550
SCAN; IF WORD!"/" THEN GO EXIT; 05956600
FILEID: 05956650
SCAN; IF NOT TYPE=1 OR TYPE=2) THEN GO EXIT; 05956700
IF ID~IF TYPE=2 THEN DECWORD ELSE WORD; 05956750
FILTOG~TRUE; 05956800
SCAN; 05956850
END; 05956900
IF TYPE=2 THEN % NUMBER 05956950
BEGIN 05957000
A~WORD; 05957050
SCAN; 05957100
IF TYPE=3 THEN IF WORD="/" THEN 05957150
BEGIN 05957200
WORD~A; 05957250
A~0; 05957300
TMID~DECWORD; 05957350
GO FILEID; 05957400
END ELSE SCAN; 05957450
IF TYPE=2 THEN N~WORD; 05957500
END; 05957550
END; 05957600
SEGS~N~N+(N=0); 05957650
IF (A!0) THEN 05957700
BEGIN 05957750
STREAM(A,D:=[FID]); 05958600
BEGIN SI:=LOC A; DS:=8 DEC; END; 05958800
IF (J:=A DIV 1000000) GEQ NEUP.NEUF OR A LSS DIRECTORYTOP+4 THEN 05959000
V: BEGIN STREAM(FID,BUFF); 05959200
BEGIN DS:=22LIT" INVALID DISK ADDRESS "; 05959400
SI:=LOC FID; DS:=8CHR; DS:=LIT"~"; 05959600
DI:=DI=9; DS:=7 FILL; 05959800
END; 05960000
GO TO EXIT; 05960200
END; 05960400
IF WAITIO([FID]INX@100000000,@64,18+FID.[5:1]).[42:1] THEN GO TO V; 05960600
IF (R:=FID.[12:6]) GEQ 2 THEN % CHECK FOR 40 MIL ADDRESS 05960650
IF NOT WAITIO([FID]INX @140000000,@64,18+FID.[5:1]).[43:1] 05960660
THEN GO TO V ELSE IF R GEQ 4 THEN GO TO V;% INV ADD 05960670
END; 05960675
IF FILTOG THEN GO XDFILE; 05960680
IF A=0 THEN GO EXIT; 05960685
SLEEP([TOGLE],USERDISKMASK); LOCKTOG(USERDISKMASK); 05960700
$ SET OMIT = NOT(SHAREDISK) 05960705
J~J+1; 05960800
BZ: D:=(I:=(E:=U[J]).STARTWRD) MOD 30; 05961000
$ SET OMIT = NOT(SHAREDISK) 05961005
$ SET OMIT = SHAREDISK 05961199
AVS:=30-(S:=(C:=E AND NUMENTM)+D)MOD 30+S; 05961200
FIXARRAY(UT,R,AVS); DISKWAIT(-R,AVS,B:=I DIV 30+USERDISKBOTTOM); 05961400
K:=S; I:=D; S:=I+C; 05961600
$ POP OMIT 05961601
G:=I-(NT2:=(P(U[J-1],DUP) AND NUMENTM)+P(XCH).STARTWRD); 05961800
S:=U[J+1].STARTWRD-S; H:=K:=K-1; IF UT[T:=L].DEND GTR A THEN GO X; 05962000
W: IF UT[T+(H+L+1) DIV 2].DEND > A THEN IF UT[H~T-1].DEND > A THEN GO W05962200
ELSE ELSE IF UT[T~T+1].DEND { A THEN BEGIN L~T+1; GO W END; 05962400
X: IF A GEQ L:=(H:=UT[T].DEND)-(Q:=UT[T].DSIZE) THEN 05962600
IF (LA:=(A+N)) LEQ H THEN GO AZ%AREA AVAILABLE 05962700
ELSE IF LA LEQ SA1:=(UT[T+1].DEND-UT[T+1].DSIZE) THEN 05962800
N:=LA-A:=H ELSE N:=SA1-A:=H ELSE IF (LA:=A+N) GTR L THEN 05962900
N:=L-A ELSE RDT:=RDT OR @100000; 05963000
GO INUSE; 05963100
Y: TMID:=IF RDT THEN "DKTEST " ELSE "BADISK "; 05963800
$ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05963809
STREAM(TMID,FID,N,MID,B,BUFF); 05964000
BEGIN DS:=LIT "."; SI:=LOC TMID; SI:=SI+1; DS:=7 CHR; 05964200
DS:=LIT "/"; SI:=SI-1; DS:=7 CHR; 05964400
DS:=13 LIT " NOT CREATED("; SI:=SI+8; SKIP SB; 05964500
IF SB THEN ELSE 05964600
BEGIN SI:=LOC N; DS:=7 DEC; N:=DI; DI:=DI-7; DS:=7 FILL; 05964800
DI:=N; DS:=5 LIT " SEGS"; SI:=SI+1; 05964900
END; DS:=11 LIT " IN USE BY "; DS:=7 CHR; DS:=LIT"/"; 05965000
SI:=SI+1; DS:=7 CHR; 05965200
DS:=2 LIT")~"; 05965400
END; 05965600
FORGETSPACE(R); 05966100
GO EXIT; 05966110
INUSE: % SEARCH THE DIRECTORY TO FIND THE NAME OF THE CONFLICTING05966200
% FILE. SINCE USERDISK REMAINS LOCKED, DISK ALLOCATION 05966210
% CANNOT CHANGE. HENCE, THE DIRECTORY NEED NOT BE LOCKED.05966220
FORGETSPACE(R); 05966400
FIXARRAY(UT,R,480); 05966600
FOR J:=DIRECTORYTOP+4 STEP 16 WHILE TRUE DO 05967000
BEGIN DISKWAIT(-R,480,J); 05967200
FOR I:=14 STEP -1 UNTIL 0 DO 05967400
BEGIN E:=UT[450+2|I]; 05967600
IF(E EQV @114)=NOT 0 THEN 05967800
BEGIN MID:="SYSTEM "; B:=FID; GO Z; END; 05967900
IF (E EQV @14) NEQ NOT 0 THEN 05968000
BEGIN B:=UT[30|I+9] AND 31; 05968200
FOR K:=1 SETP 1 UNTIL B DO 05968400
IF (C:=UT[30|I+9+K))NEQ 0 THEN 05968600
IF A GEQ C THEN IF A LSS 05968800
SA1:=(C+D:=UT[30|I+8]) THEN 05968900
BEGIN MID:=E&((LA LEQ SA1) AND 05969000
(RDT.[18:15]))[1:47:1]; 05969100
IF A+N GTR SA1 THEN N~SA1-A; 05969150
B:=UT[451+2|I]; 05969200
GO TO Z; 05969400
END; 05969600
END; 05969800
END; 05970000
END; 05970200
Z: 05970300
$ SET OMIT = NOT SHAREDISK 05970390
UNLOCKTOG(USERDISKMASK); 05970500
GO TO Y; 05970600
AZ: IF A NEQ L AND LA NEQ H THEN 05970800
BEGIN IF S=0 THEN 05971000
$ SET OMIT = NOT (SHAREDISK) 05971005
$ SET OMIT = SHAREDISK 05971095
BEGIN IF G=0 OR D=0 THEN 05971200
BEGIN USERDISKSPECIALCASE(2,E,UT,J); GO TO BZ END; 05971400
S:=IF P((G+1) DIV 2,DUP) > D THEN P(DEL,D) ELSE P; 05971600
U[J].STARTWRD:=I-S; G:=D-S; K:=G+C-1; 05971800
$ POP OMIT 05971801
MOVE(C,[UT[D]],[UT[G]]); T:=T-S; 05972000
END; 05972200
FOR G:=K STEP -1 UNTIL T DO UT[G+1]:=UT[G]; 05972400
UT[T]:=A&(A-L)[TODSIZE]; 05972600
UT[T+1]:=H&(H-LA)[TODSIZE]; 05972800
C:=C+1; 05973000
K ~ K+1; 05973100
END ELSE 05973200
IF A=L AND LA=H THEN 05973400
BEGIN C:=C-1; MOVE(K-T,[UT[T+1]],[UT[T]]); K:=K-1 END 05973600
ELSE UT[T]:=(IF A=L THEN H ELSE A)&(Q-N)[TODSIZE]; 05973800
U[J].NUMENT:=C; 05974000
IF Q=U[J].MAXSIZ THEN 05974200
BEGIN Q:=UT[H:=K-C+1].DSIZE; 05974400
FOR H:=H STEP 1 UNTIL K DO 05974600
IF P(UT[H].DSIZE,DUP) GTR Q THEN Q:=P ELSE P(DEL); 05974800
U[J].MAXSIZ:=Q; 05975000
END; 05975200
MID:=IF RDT THEN "DKTEST " ELSE "BADISK "; 05975400
$ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05975404
$ SET OMIT = NOT(SHAREDISK) 05975410
$ SET OMIT = SHAREDISK 05975595
DISKWAIT(R,AVS,B); 05975600
$ POP OMIT 05975601
UNLOCKTOG(USERDISKMASK); 05975610
FORGETSPACE(R); 05975620
CZ: ENTERFILE; 05975630
GO EXIT; 05975640
XDFILE: 05975700
IF (HEADER:=DIRECTORYSEARCH(TMID,NFLAG(-TFID OR M),4)) LSS 64 THEN 05975750
BEGIN 05975800
TYPE:=HEADER; 05975850
GO MSG; 05975900
END; 05975950
HA~HEADER.[FF]; 05976000
HDR~[M[HEADER~HEADER INX 0]) & 30[8:38:10]; 05976050
MID~-"BADISK "; 05976100
S~HDR[8]; % SEGMENTS PER ROW 05976150
IF A!0 THEN 05976200
BEGIN 05976250
FOR I!HDR[9] STEP -1 UNTIL 1 DO 05976300
IF (LA~HDR[I+9])!0 THEN 05976350
IF A GEQ LA AND A LSS LA+S THEN % FOUND ROW 05976400
IF A+N LEQ LA+S THEN GO FOUND ELSE GO CONFLICT; 05976450
TYPE~4; 05976500
IF FALSE THEN 05976550
BEGIN 05976600
CONFLICT: TYPE~3; 05976650
SEGS~A+N-LA-S; 05976700
END; 05976750
HEADERUNLOCK(TMID,TFID,HEADER&HA[CTF]); 05976800
GO MSG; 05976850
FOUND: 05976900
HDR[I+9]~0; 05976950
DISKWAIT(HEADER,30,HA); 05977000
IF (I~A-LA) GTR 0 THEN FORGETUSERDISK(LA,I); 05977050
IF (I~LA+S-(LA~A+N)) GTR 0 THEN FORGETUSERDISK(LA,I); 05977100
$ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05977124
ENTERFILE; 05977150
GO FINIS; 05977200
END; 05977250
N~S; SEGS~0; 05977300
FOR I~HDR[9] STEP -1 UNTIL 1 DO 05977350
IF (A~HDR[I+9])!0 THEN 05977400
BEGIN 05977450
HDR[I+9]~0; 05977500
DISKWAIT(HEADER,30,HA); 05977550
WORD~A; FID~DECWORD; 05977600
$ SET OMIT = NOT(DKBNODFX AND NOT DFX) 05977624
ENTERFILE; 05977650
SEGS~SEGS+N; 05977700
END; 05977750
FINIS: 05977800
FORGETSPACE(HEADER); 05977850
P(DIRECTORYSEARCH(-TMID,TFID,6),DEL); 05977900
TYPE~5; 05977950
MSG: 05978000
STREAM(TMID,TFID,SEGS,A,TYPE,BUFF); 05978050
BEGIN 05978100
SI~LOC SEGS; DI~LOC SEGS; DS~8DEC; DS~8DEC; 05978150
DI~LOC SEGS; DS~8FILL; DI~LOC A; DS~8 FILL; DI~BUFF; 05978200
DS~LIT","; SI~LOC TMID; SI~SI+1; DS~7CHR; 05978250
DS~LIT"/"; SI~SI+1; DS~7CHR; 05978300
DS~11 LIT" NOT XD-ED("; 05978350
CI~CI+TYPE; 05978400
GO T0; GO T1; GO T2; GO T3; GO T4; GO T5; 05978450
T0: DS~11 LIT"NOT ON DISK"; GO EXT; 05978500
T3: DS~8 CHR; DS~6 LIT" SEGS "; 05978550
T1: DS~6 LIT"IN USE"; GO EXT; 05978600
T2: DS~11 LIT"SYSTEM FILE"; GO EXT; 05978650
T4: SI~SI+8; DS~8 CHR; 05978700
DS~12 LIT" NOT IN FILE"; GO EXT; 05978750
T5: DI~DI-11; 05978800
DS~6 LIT" SEGS="; DS~8 CHR; DS~7 LIT" XD-ED~"; 05978850
TYPE~DI; DI~BUFF; DS~LIT" "; DI~TYPE; GO EXT; 05978900
EXT: DS~2 LIT")~"; 05978950
END STREAM; 05979000
A~1; N~SEGS; % FOR LOGGING 05979050
GO EXIT; 05979100
EXIT: 05979310
IF A!0 THEN 05979320
BEGIN 05979330
B~BUFF; 05979340
MLOGIT; 05979350
END; 05979360
IF RDT THEN M[SLEEPER INX 0] :=1 ELSE SPOUT(BUFF); 05979400
BUFF:=0; IF MSCW NEQ 1 THEN KILL([MSCW]); % CALLED AS IND. RUNNER 05979500
END; 05979600
SAVE PROCEDURE DISKIO(LOCIOD,CORE,SIZE,DISK);% 06000000
VALUE CORE,SIZE,DISK;% 06001000
REAL LOCIOD;% 06002000
INTEGER CORE,SIZE,DISK;% 06003000
BEGIN REAL IOD, OLAYIO, FIN; 06004000
OLAYIO := SIZE.[3:1]; SIZE.[3:1] := 0; 06004010
CORE:=CORE; SIZE:=SIZE; DISK:=DISK; % INTEGERIZE %645-06004100
IF DISK.[1:1] THEN 06005000
BEGIN % AUXILIARY MEMORY 06006000
$ SET OMIT = NOT(AUXMEM) 06006999
$ SET OMIT = AUXMEM 06009200
PUNT(NVLDAUXIO); 06009300
$ POP OMIT 06009400
END 06009500
ELSE BEGIN IOD := ABS(CORE) & SIZE[8:38:10] 06010000
& ((SIZE INX 29) DIV 30 +@1000)[CTF] 06011000
& CORE[24:1:1] & 3[5:46:2]; 06012000
$ SET OMIT = NOT(SHAREDISK) 06012499
STREAM(DISK,D:=CORE.[CF]); 06013000
BEGIN SI ~ LOC DISK; DS ~ 8 DEC END;% 06014000
SIZE ~ 2;% 06015000
END;% 06016000
FIN:=IF OLAYIO THEN IOD&DISK[CTC]&DISK[8:21:12] ELSE IOD; 06016100
% ACTUAL DISK ADDRESS IN FINALQUE FOR OLAY I/O-S 06016200
IOREQUEST(NABS(FIN)&@377[25:40:8],IOD,[LOCIOD]&% 06017000
(SIZE+16)[12:42:6]&OLAYIO[9:47:1]); 06018000
LOCIOD ~ 0;% 06019000
END DISKIO;% 06020000
PROCEDURE FORGETESPDISK(SEGMENT); VALUE SEGMENT; REAL SEGMENT; FORWARD; 06020500
REAL PROCEDURE GETESPDISK;% 06021000
BEGIN REAL T=NT1; 06022000
IF ESPCOUNT=0 THEN 06022100
BEGIN 06022200
STREAM(D:=T:=SPACE(2)); 06022300
DS~12 LIT " NO ESPDISK~"; 06022400
SPOUT(T); 06022500
SLEEP([ESPCOUNT],NOT 0); 06022600
END; 06022700
STREAM(T~0,A~ESPTAB:X~0); 06023000
BEGIN SI~A; 06024000
L1: IF SC=""" THEN BEGIN SI~SI+1; GO TO L1 END; 06025000
A~SI; DI~A; 06026000
L2: IF SB THEN 06027000
BEGIN TALLY~TALLY+1; SKIP SB; SKIP DB; GO TO L2 END; 06028000
T~TALLY; DS~SET; 06029000
END; 06030000
GETESPDISK~((P(DUP).[CF]-ESPTAB)|8 06031000
+P(XCH).[30:3])|6+P+ESPDISKBOTTOM; 06032000
ESPCOUNT~ESPCOUNT-1; 06033000
END; 06033100
PROCEDURE FORGETESPDISK(SEGMENT); VALUE SEGMENT; REAL SEGMENT;% 06036000
BEGIN REAL S,T; 06037000
IF SEGMENT LSS ESPDISKBOTTOM OR 06037100
SEGMENT GTR ESPDISKTOP THEN 06037200
BYBY("ESPDISK ERROR~",14); 06037300
T:=(S:=(T:=SEGMENT-ESPDISKBOTTOM) DIV 6)|6-T; 06037700
S~S.[30:15]&S[30:45:3]|ESPTAB; 06038000
STREAM(T,S); BEGIN SKIP T DB; DS~RESET END; 06038100
ESPCOUNT~ESPCOUNT+1; 06038200
END;% 06039000
$ SET OMIT = NOT(DEBUGGING) 06045999
REAL SCHEDULEIDS; % A BIT IN POSITION X MEANS THAT THERE IS A JOB IN THE06056099
% SCHEDULE(SHEET) WITH SCHEDULE-ID X. USED BY COM5, 06056100
% SELECTRUN AND CCFINISH. 06056200
$ SET OMIT = NOT(SHAREDISK) 06057000
SAVE PROCEDURE DISKWAIT(CORE,SIZE,DISK); 06061500
VALUE CORE,SIZE,DISK; 06062000
REAL CORE,SIZE,DISK; 06063000
BEGIN REAL T; 06064000
DISKIO(T,(ABS(CORE)-1)&CORE[1:1:1],SIZE,DISK); 06065000
SLEEP([T],IOMASK); 06066000
END; 06067000
PROCEDURE DISKSQUASH(BUFF); 06068000
VALUE BUFF; REAL BUFF; 06068100
BEGIN 06068200
REAL RCW=+0, B=+1, E=B+1, F=E+1, R=F+1, HI=R+1, LO=HI+1, 06068300
MSCW=-2, 06068350
CNT=LO+1, USE=CNT+1, TOG=USE+1, IOD=TOG+1; 06068400
REAL T=IOD+1, SUM=T; 06068500
REAL A1= T+1, A2=A1+1, A3=A2+1, A4=A3+1, A5=A4+1; % ARRAY VARIABLES 06068600
REAL X1=A5+1, X2=X1+1, X3=X2+1, X4=X3+1, X5=X4+1; % SCRATCH VARIABLES 06068700
REAL LOCIOD=X4, HICNT=X4, LSTCNT=X5; 06068800
BOOLEAN CONFLICT=X5+1, PASTWO=CONFLICT+1, EUNOTSQUASHED=PASSTWO+1, 06068900
FILEOK=EUNOTSQUASHED+1, SQALL=FILEOK+1; 06069000
INTEGER C=SQALL+1, D=C+1, I=D+1, S=I+1, EU=S+1, AV=EU+1, 06069100
AVSIZE=AV+1, DISKAV=AVSIZE+1, SQSIZE=DISKAV+1; 06069200
ARRAY UT=SQSIZE+1[*], MV=UT+1[*], DIR=MV+1[*], EUS=DIR+1[*]; 06069300
REAL PRTADDR=EUS+1, PRTVALUE=PRTADDR+1; 06069400
$ SET OMIT = NOT SHAREDISK 06069500
LABEL SCAN, SPOUTER,CK,OKINUSE,NOTOK,OKBOUNDS,MVEMORE,MVE, 06069900
ENDMVE,AGAIN,OK,NEXT,SQIT,STOPSQ,STOPIT,SDXIT,OUT,FIXMV; 06070000
DEFINE 06070100
$ SET OMIT = SHAREDISK 06070200
U = AVTABLE#, 06070300
$ POP OMIT 06070400
LINK = [12:10]#, 06070500
ASIZE = [3:19]#, 06070600
LOCKED = [2:1]#, 06070700
FACTOR = 10000#, 06070800
MINSIZE = 10#, 06070900
MAXMVSIZE = 900#, 06071000
KEYINMASK = [18:15]#; 06071100
COMMENT 06071200
FACTOR: THE MAXIMUM SEPARATION, IN SEGMENTS, ALLOWED 06071300
BETWEEN TWO AVAILABLE AREAS WHICH ARE TO BE 06071400
SQUASHED. IN GENERAL, FACTOR SHOULD NOT BE MADE 06071500
LARGER THAN THE CAPACITY OFA 20 ML SUBMOD,I.E., 06071600
10,000 SEGMENTS. 06071700
MINSIZE: THE MINIMUM SIZE, IN SEGMENTS, ALLOWED FOR AN 06071800
AVAILABLE AREA TO BE CONSIDERED AS A CANDIDATE 06071900
FOR SQUASHING. MINSIZE MAY BE MADE AS SMALL AS 06072000
ONE, BUT AS SQUASH TIME VARIES INVERSLY WITH 06072100
MINSIZE, SMALLER VALUES WILL INCREASE SQUASH- 06072200
ING TIME PROPORTIONALLY. MINSIZE LIMITA- 06072300
TIONS MAY BE OVERRIDEN BY THE LOOKAHEAD 06072400
FACILITY. 06072500
MAXMVSIZE: LIMITS THE NUMBER OF INDIVIDUAL AREAS IN AN 06072600
IN-USE AREA TO BE AT MOST MAXMVSIZE/3 AREAS 06072700
FOR SQUASHING TO OCCUR. 06072800
NOTE: 06072900
1) MAXMVSIZE MUST BE LESS THAN 1024, 06073000
2) MAXMVSIZE MUST BE A MULTIPLE OF 3. ; 06073100
DEFINE CELL = M[PRTADDR]#, 06073200
STOP = M[PRTADDR]#, 06073300
STOPCK = IF M[PRTADDR] THEN GO STOPSQ#, 06073400
MOVEABLE = NOT DIR[X3+4].[42:1]#, 06073500
TEMPDSK = MV[I+2].[1;1]#; 06073600
SUBROUTINE SQUASHMESS; 06073700
BEGIN 06073800
IF (X1:=P(XCH))>1 THEN X3:=IF SQSIZE!0 THEN SQSIZE 06073900
ELSE EUS[EU-1].DSIZE; 06074000
STREAM(A:=EU-1,B:=X1,C:=X3,C1:=0,C2:=0,CX:=0, 06074100
NOSQ:=EUNOTSQUASHED, X2:=X2:=SPACE(10)); 06074200
BEGIN 06074300
C1:=CI; GO TO L0; 06074400
SI:=LOC A; DS:=4 LIT" EU"; DS:=2 DEC; 06074500
A:=DI; DI:=DI-2; DS:=FILL; DS:=A; CI:=CX; 06074600
L0: C2:=CI; GO TO L2; DS:=4 LIT"NULL"; CI:=CX; 06074700
L1: DS:=7 LIT" SQUASH"; CI:=CX; 06074800
L2: CI:=CI+B; 06074900
GO TO LL0; GO TO LL0; GO TO LL2; TO TO LL2; 06075000
LL0: CX:=CI; CI:=C1; 06075100
N(NOSQ(DS:=LIT" "; CX:=CI; CI:=C2)); 06075200
CX:=CI; GO TO L1; 06075300
B(NOSQ(JUMP OUT 2 TO LL1); DS:=2 LIT"ED"; 06075400
JUMP OUT TO LL1); 06075500
DS:=3 LIT"ING"; 06075600
LL1: GO TO EXT; 06075700
LL2: DS:=LIT" "; CX:=C1; CI:=C2; 06075800
CX:=CI; GO TO L1; 06075900
SI:=B; 2(SI:=SI-8); B:=SI; 06076000
B(CX:=CI; CI:=C1); 06076100
DS:=2 LIT" ("; SI:=LOC C; 06076200
DS:=6 DEC; C:=DI; DI:=DI-6; DS:=5 FILL; DI:=C; 06076300
DS:=19 LIT" SEGMENTS AVAILABLE"; 06076400
B(JUMP OUT TO LL3); DS:=4 LIT" ON "; 06076500
CX:=CI; CI:=C1; 06076600
LL3: DS:=LIT")"; 06076700
EXT: DS:=LIT"~"; 06076800
END; 06076900
SPOUT(X2); 06077000
END PRINTING MESSAGES; 06077100
SUBROUTINE SCANMESSAGE; 06077200
BEGIN 06077300
X1:=(X5:=NEUP.[FF])-1; X2:=BUFF.[30:18]; 06077400
FIXARRAY(EUS,A5,X5); 06077500
MOVE(X5,A5-1,A5); 06077600
X5:=-1; % WILL BE GEQ ZERO AFTER FIRST PASS THRU SCAN 06077700
SCAN: 06077800
STREAM(A:=0,SIZ:=0,EU1:=-1,EU2:=-1,ERRTOG:=0:NO:=0, 06077900
B:=X5<0,EU:=@2564000000000000,CX:=0,C1:=0, 06078000
C2:=0,KTR:=X2); 06078100
BEGIN 06078200
C1:=CI; GO TO L2; 06078300
IF SC<0 THEN 06078400
A0: BEGIN TALLY:=1; NO:=TALLY; CI:=CX END; 06078500
IF SC=12 THEN GO TO A0; 06078600
DI:=LOC SIZ; 06078700
L1: IF SC GEQ 0 THEN IF SC<12 THEN 06078800
BEGIN 06078900
TALLY:=TALLY+1; 06079000
SI:=SI+1; 06079100
GO TO L1; 06079200
END; 06079300
NO:=TALLY; 06079400
SI:=SI-NO; 06079500
DS:=NO OCT; 06079600
TALLY:=0; NO:=TALLY; 06079700
CI:=CX; 06079800
L2: C2:=CI; GO TO STR; 06079900
TALLY:=1; DI:=LOC EU; 06080000
IF 2 SC=DC THEN % AN EU SPECIFIED 06080100
BEGIN 06080200
CX:=CI; GO TO L3; 06080300
IF SC GEQ 0 THEN IF SC<12 THEN 06080400
BEGIN 06080500
SI:=SI+1; DI:=LOC EU1; 06080600
IF SC GEQ 0 THEN IF SC<12 THEN 06080700
TALLY:=2 ELSE GO TO A1; 06080800
SI:=SI-1; NO:=TALLY; 06080900
DS:=NO OCT; TALLY:=0; 06081000
END ELSE GO TO A1; 06081100
END; 06081200
NO:=TALLY; CI:=A; 06081300
CI:=A; 06081400
L3: IF SC=" " THEN BEGIN SI:=SI+1; GO TO L3 END; CI:=CX; 06081500
STR: SI:=KTR; CI:=CI+B; GO TO L5; GO TO L4; 06081600
L4: IF SC="~" THEN GO TO EXT; 06081700
CX:=CI; CI:=C1; % SIZE CHECK 06081800
NO(JUMP OUT TO L5); 06081900
CX:=CI; GO TO L3; 06082000
IF SC!"~" THEN 06082100
A1: GO TO ERR; 06082200
GO EXT; 06082300
L5: A:=CI; CI:=C2; % EU CHECK 06082400
NO(JUMP OUT TO ERR); 06082500
IF SC="-" THEN 06082600
BEGIN 06082700
SI:=SI+1; CX:=CI; GO TO L3; 06082800
CX:=CI; CI:=C1; % SIZE CHECK 06082900
NO(JUMP OUT TO L6); GO TO L7; 06083000
L6: TALLY:=EU1; EU2:=TALLY; 06083100
A:= CI; CI:=C2; % EU CHECK 06083200
NO(JUMP OUT TO ERR); 06083300
END; 06083400
L7: A:=TALLY; % ZERO OUT A 06083500
IF SC="~" THEN GO TO EXT; 06083600
IF SC="," THEN 06083700
BEGIN SI:=SI+1; A:=SI; GO EXT END; 06083800
ERR: TALLY:=1; ERRTOG:=TALLY; 06083900
EXT: 06084000
END; 06084100
IF P THEN % ERROR IN INPUT MESSAGE 06084200
BEGIN 06084300
SPOUTERR: 06084400
SPOUT(P(BUFF.[15:15]-1,DUP)&M[P-1][9:9:9]); 06084500
FORGETSPACE(A5); 06084600
P(XIT); 06084700
END; 06084800
IF (X3:=P) GEQ 0 THEN % AN EU RANGE SPECIFIED. 06084900
BEGIN 06085000
IF (X4:=P)>X1 OR X3<X1 THEN GO SPOUTERR; 06085100
FOR I:=X3 STEP 1 UNTIL X4 DO EUS[I]:=1; 06085200
P(DEL); GO CK; 06085300
END; 06085400
X5:=P(XCH); % SIZE OF SQUASH 06085500
IF (X4:=P) GEQ 0 THEN IF X4>X1 THEN GO SPOUTERR ELSE 06085600
EUS[X4]:=1&X5[TODSIZE] ELSE IF X5=0 THEN SQALL:=1 06085700
ELSE SQSIZE:=X5; 06085800
CK: IF (XS:=P)!0 THEN GO SCAN; % NOT FINISHED YET 06085900
END SCANNING INPUT MESSAGE; 06086000
SUBROUTINE FIXANDWRITEHEADER; 06086100
BEGIN 06086200
M[A4+9+X2.[28:5]]:=C; 06086300
DISKWAIT(A4,30,X2.[CF]); 06086400
END WRITING NEW HEADER; 06086500
SUBROUTINE BOUNDARYCK; 06086600
BEGIN 06086700
LSTCNT:=0; M[X2-1]:=-1; 06086800
MVEMORE: 06086900
X3:=HICNT:=0; STOPCK; 06087000
FOR I:=CNT SETP -3 UNTIL 0 DO 06087100
IF P(MV[I],DUP).DEND>X3 AND P(XCH)>0 THEN 06087200
BEGIN X3:=MV[I].DEND; HICNT:=I END; 06087300
IF X3=0 THEN % RE-ORDERING OF MV ARRAY COMPLETE 06087400
BEGIN 06087500
MV[LSTCNT+2].LINK:=@1777; 06087600
GO OKBOUNDS; 06087700
END; 06087800
IF M[A2-1]<0 THEN M[A2-1]:=HICNT ELSE MV[LSTCNT+2].LINK:=HICNT; 06087900
MV[LSTCNT:=HICNT]:=NABS(*P(DUP)); 06088000
MV[HICNT+1].[2:26]:=HI; 06088100
HI:=HI-(X3:=MV[HICNT].DSIZE); 06088200
IF X3 LEQ UT[AV+1].ASIZE THEN 06088300
OK: BEGIN 06088400
MV[HICNT+2]:=0; 06088500
GO MVEMORE; 06088600
END ELSE 06088700
BEGIN % LOOKING FOR TEMPORARY STORAGE 06088800
FOR I:=S-2 STEP -1 UNTIL D DO 06088900
IF X3 LEQ UT[I].ASIZE THEN 06089000
IF NOT UT[I].LOCKED THEN % OK FOR TEMP STORAGE 06089100
BEGIN 06089200
MV[HICNT+2]:=UT[I].DEND&I[2:38:10]; 06089300
GO MVEMORE; 06089400
END; 06089500
END; 06089600
IF PASSTWO THEN % NON-PROTECTED FILE TRANSFER 06089700
BEGIN 06089800
DISKWAIT(-A4,30,MV[HICNT+2].[CF]); 06089900
STREAM(A:=[M[A4+MV[HICNT+2].[FF]]],X2:=X2:=SPACE(6)); 06090000
BEGIN 06090100
DS:=27 LIT" #FILE INTEGRITY CONFLICT: "; SI:=A; 06090200
SI:=SI+1; DS:=7 CHR; DS:=LIT"/"; SI:=SI+1; 06090300
DS:=7 CHR; DS:=LIT"~"; 06090400
END; 06090500
SPOUT(X2); CELL.KEYINMASK:=7; 06090600
SLEEP((PRTADR INX M),@77777); STOPCK; 06090700
IF CELL=2 THEN BEGIN CELL:=0&1[CTF]; GO TO OK END; 06090800
END ELSE CONFLICT:=TRUE; 06090900
TOG:=0; 06091000
OKBOUNDS: 06091100
END BOUNDARY AND CONFLICT CHECKING; 06091200
BOOLEAN SUBROUTINE INUSEOK; 06091300
BEGIN 06091400
UT[AV+1].[1:1]:= NOT PASSTWO; TOG:=1; CNT:=0; 06091500
FOR X1:=DIRECTORYTOP+4 STEP 16 WHILE TRUE DO 06091600
BEGIN STOPCK; 06091700
DISKWAIT(-A1,480,X1); 06091800
FOR I:=14 STEP -1 UNTIL 0 DO 06091900
BEGIN STOPCK; 06092000
IF((E:=DIR[450+P(I,DUP,+)]) EQV @114)=NOT 0 THEN 06092100
GO TO NOTOK; 06092200
IF (E EQV @14)! NOT 0 THEN 06092300
BEGIN FILEOK:=FALSE; % INITIATE STATUS CHECKING 06092400
B:=DIR[(X3:=30|I)+9].[43:5]; 06092500
FOR X2:=1 STEP 1 UNTIL B DO 06092600
IF (C:=DIR[X3+9+X2])!0 THEN 06092700
IF P(C,DUP)<HI AND P(XCH)>LO THEN 06092800
IF FILEOK THEN GO FIXMV ELSE % CHECK STATUS 06092900
IF NOT SYSTEMFILE(E,DIR[450+P(I,DUP,+)+1]) AND 06093000
DIR[X3+4].[12:4]=0 THEN % NOT SYSTEM FILE 06093100
IF (P(DIR[X3+4],DUP).[1:3] OR P(XCH).[16:20] OR 06093200
DIR[X3+9].[1:28])=0 THEN % FILE NOT IN USE 06093300
IF MOVEABLE THEN % NOT PERMANENT 06093400
BEGIN 06093500
FILEOK:=TRUE; % ELIMINATE STATUS CHECKING 06093600
FIXMV: USE:=USE-(MV[CNT]:=C&DIR[X3+8][TODSIZE]) 06093700
.DSIZE; 06093800
MV[CNT+1]:=(X1+I)&X2[CTF]; % HEADER INFO 06093900
IF PASSTWO THEN % SAVE LOC OF FIDS 06094000
MV[CNT+2]:=(X1+15)&(I|2)[CTF]; 06094100
IF USE=0 THEN % FOUND ALL USERS OF IN-USE AREA 06094200
BEGIN 06094300
BOUNDARYCK; 06094400
GO OKINUSE; 06094500
END; 06094600
IF USE<0 THEN GO TO NOTOK; % DIERCTORY ERROR 06094700
IF (CNT:=CNT+3) MOD 150 = 0 THEN 06094800
BEGIN 06094900
IF CNT=MAXMVSIZE THEN GO TO NOTOK; 06095000
FIXARRAY(MV,X4,(CNT+150)); 06095100
MOVE(CNT,A2,X4); 06095200
FORGETSPACE(A2); 06095300
A2:=X4; 06095400
END; 06095500
END ELSE GO TO NEXT ELSE GO TO NEXT; 06095600
END; 06095700
NEXT: END; 06095800
END; 06095900
NOTOK: 06096000
TOG:=0; 06096100
OKINUSE: 06096200
INUSEOK:=TOG; 06096300
END SEARCHING IN USE AREAS; 06096400
SUBROUTINE MOVEANDFIX; 06096500
BEGIN 06096600
I:=M[X2-1]; STOPCK; 06096700
WHILE I<@1777 DO 06096800
BEGIN 06096900
DISKWAIT(-A4,30,(X2:=MV[I+1]).[CF]); % READ IN HEADER 06097000
MVE: X1:=-30; F:=P(MV[I],DUP).DEND+(B:=P(XCH).ASIZE); 06097100
IF P(MV[I+2].DEND=0,DUP) THEN C:=MV[I+1].[2:26] ELSE 06097200
MV[I].DEND:=(C:=MV[I+2].DEND)-B; 06097300
WHILE (X1:=X1+30)<B DO 06097400
BEGIN 06097500
E:=IF P((B-X1),DUP)<30 THEN P ELSE P(DEL,30); 06098300
DISKIO(T,1-A3,E|30,F:=F-E); 06098400
IOD:=IOD&(E|30)[8:38:10]&E[27:42:6]; 06098500
LOCIOD:=0; SLEEP([T],IOMASK); 06098600
STREAM(A:=C:=C-E,B:=A3-1); 06098700
BEGIN SI:=LOC A; DS:= 8 DEC END; 06098800
IOREQUEST(NABS(IOD)&@357[25:40:8],IOD, 06098900
[LOCIOD]&18[12:42:6]); 06099000
SLEEP([LOCIOD],IOMASK); 06099100
IF LOCIOD.[28:1] THEN % WRITE LOCKOUT OCCURED 06099200
BEGIN 06099300
UT[IF P THEN AV+1 ELSE MV[I+2].[2:10]].LOCKED:=1; 06099400
UT[AV+1].DEND:=MV[I+1].[2;26]; GO ENDMVE; 06099500
END; 06099600
END; 06099700
FIXANDWRITEHEADER; 06099800
IF NOT P THEN % TEMPORARY DISK STORAGE WAS USED. 06099900
BEGIN 06100000
MV[I-2].DEND:=0; 06100100
TEMPDISK:=1; 06100200
GO TO MVE; 06100300
END; 06100400
I:=MV[I+2].LINK; 06100500
END; 06100600
% WILL NOW RECONFIGURE THE AVAILABLE TABLE 06100700
UT[AV]:=HI&(UT[AV].ASIZE+UT[AV+I].ASIZE)[2:28:20]; 06100800
MOVE(S-AV,P([UT[AV+2]],DUP),NOT 0 INX P(XCH)); 06100900
C:=(S:=S-1)-1; FOR I:=C STEP -1 UNTIL D DO 06101000
IF P(UT[I].ASIZE,DUP)>USE THEN USE:=P ELSE P(DEL); 06101100
U[EU]:=P(DUP,LOD,DUP)&USE[1:28:20]&(P(XCH).NUMENT-1)[TONUMENT]; 06101200
EUNOTSQUASHED:=FALSE; 06101300
IF NOT SQALL THEN 06101400
BEGIN 06101500
IF P(SQSIZE,DUP)!0 AND P(XCH) LEQ USE THEN CELL:=1 06101600
ELSE IF P(EUS[EU-1],DSIZE,DUP)!0 AND P(XCH) LEQ USE 06101700
THEN ELSE GO TO ENDMVE; 06101800
P(DEL); GO STOPSQ; 06101900
END; 06102000
ENDMVE: 06102100
END FIXING AND MOVING; 06102200
$ SET OMIT = NOT SHAREDISK 06102220
P(0,0,0,0,0,0,0,0,0,0); 06102500
P(0,0,0,0,0,0,0,0,0,0); 06102600
P(0,0,0,0,0,0,0,0,0,0); 06102700
P(0,0,0,0,0,0,0,0,0); 06102800
P(.DISKSQUASH,DUP,M[(P)]); % PRTADDR,PRTVALUE 06102900
$ SET OMIT = NOT SHAREDISK 06103000
SCANMESSAGE; 06103300
$ SET OMIT = SHAREDISK 06103400
LOCKDIRECTORY; 06103500
$ POP OMIT 06103600
SLEEP([TOGLE],USERDISKMASK); LOCKTOG(USERDISKMASK); 06103700
HALT; % STOP NORMAL STATE PROCESSING WHILE SQUASHING 06103800
A4:=SPACE(30); 06103900
$ SET OMIT = NOT SHAREDISK 06104000
FIXARRAY(DIR,A1,480); FIXARRAY(MV,A2,150); 06107200
A3:=SPACE(900); 06107300
IOD:=@140000100000000&(A3-1)[CTC]; 06107400
IF NOT SQALL THEN FOR EU:=1 STEP 1 UNTIL NEUP.[FF] DO 06107900
IF (CELL:=(P(SQSIZE,DUP)!0 AND P(XCH) LEQ U[EU].[1:20])) 06108000
THEN BEGIN P(2); SQUASHMESS; GO STOPIT END; 06108100
FOR EU:=1 STEP 1 UNTIL NEUP.[FF] DO % 06108200
IF NOT (E:=U[EU]).EUNP THEN % NOT A DUMMY EU 06108300
IF EUS[EU-1] OR SQALL OR SQSIZE!0 THEN % SQUASH THIS EU 06108400
BEGIN 06108500
EUNOTSQUASHED:=TRUE; 06108600
IF NOT SQALL THEN % CHECK IF SQUASH IS NECESSARY 06108700
IF (P(EUS[EU-1].DSIZE,DUP) LEQ E.[1:20] AND P(XCH)!0) 06108800
THEN BEGIN P(3); SQUASHMESS; GO STOPIT END; 06108900
CELL:=0&1[CTF]; 06109000
P(0); SQUASHMESS; 06109100
D:=(I:=E.STARTWRD) MOD 30; 06109200
AVSIZE:=30-(S:=(E AND NUMENTM)+D) MOD 30+S; 06109300
FIXARRAY(UT,R,AVSIZE); 06109400
DISKAV:=I DIV 30+USERDISKBOTTOM; 06109500
$ SET OMIT = NOT SHAREDISK 06109600
DISKWAIT(-R,AVSIZE,DISKAV); 06110300
AGAIN: SUM:=USE:=0; 06110400
FOR I:=S-3 STEP -1 UNTIL D DO 06110500
BEGIN STOPCK; 06110600
IF (UT[I+1]<0)=PASSTWO THEN % NOT CHECKED THIS PASS 06110700
IF ((X1:=UT[I].ASIZE)+(X2:=UT[I+1].ASIZE)) GEQ SUM 06110800
THEN IF (X3:=(((X4:=UT[I+1].DEND)-1)-UT[I+1].ASIZE)- 06110900
X5:=(UT[I].DEND-1)) LEQ FACTOR THEN IF MINSIZE LEQ X2 06111000
THEN IF MINSIZE LEQ X1 THEN 06111100
BEGIN 06111200
SQIT: USE:=X3; AV:=I; 06111300
SUM:=X1-X2; % SUM OF CURRENT AVAILABLE AREAS 06111400
HI:=X4; LO:=X5; 06111500
END ELSE IF I!0 THEN % LOOK AHEAD TO NEXT AREA 06111600
IF ((MINSIZE LEQ UT[I-1].ASIZE) AND (((X5-X1)- 06111700
UT[I-1].DEND-1) LEQ FACTOR)) THEN GO SQIT; 06111800
END; 06111900
IF USE!0 THEN % FOUND A POSSIBLE SQUASH SITUATION 06112000
BEGIN 06112100
IF INUSEOK THEN MOVEANDFIX; 06112200
GO AGAIN; 06112300
END ELSE % TIME TO WRAP IT UP FOR THIS EU UNLESS.... 06112400
IF CONFLICT THEN IF NOT PASSTWO THEN % ..CONFLICTS EXIST 06112500
BEGIN 06112600
PASSTWO:=TRUE; 06112700
GO AGAIN; 06112800
END ELSE 06112900
BEGIN % CLEAN-UP PASS AFTER CONFLICTS RESOLVED. 06113000
PASSTWO:=CONFLICTS:=0; 06113100
GO AGAIN; 06113200
END; 06113300
STOPSQ: FOR I:=D STEP 1 UNTIL S DO UT[I]:=ABS(P(DUP.LOD)&0[2:2:1]); 06113400
IF NOT EUNOTSQUASHED THEN 06113500
$ SET OMIT = NOT SHAREDISK 06113600
DISKWAIT( R,AVSIZ,DISKAV); 06114300
FORGETSPACE(R); 06114400
P(1); SQUASHMESS; 06114500
STOPIT: IF STOP THEN GO OUT; % STOPCK GOT US HERE 06114600
END EU LOOP; 06114700
OUT: 06114800
FORGETSPACE(A1); FORGETSPACE(A2); FORGETSPACE(A3); 06114900
$ SET OMIT = NOT SHAREDISK 06115000
SDXIT: 06115500
FORGETSPACE(A4); FORGETSPACE(A5); 06115600
CELL:=PRTVALUE; 06115700
STREAM(A:=BUFF.[15:15]-1); DS:=13 LIT" END SQUASH.~"; 06115800
SPOUT(BUFF.[15:15]-1); 06115900
$ SET OMIT = SHAREDISK 06115990
UNLOCKDIRECTORY; 06116000
$ POP OMIT 06116010
UNLOCKTOG(USERDISKMASK); 06116100
NOPROCESSTOG:=NOPROCESSTOG-1; 06116200
KILL([MSCW]); 06116300
END SQUASHING; 06116400
PROCEDURE CHANGEABORT(X); VALUE X; REAL X; FORWARD;% 06179000
REAL LOOKQ; 06179200
PROCEDURE SIGNOFF(VECTOR,FILEBLOCK,PKT); 06180000
VALUE VECTOR,FILEBLOCK,PKT; 06181000
ARRAY VECTOR[*],FILEBLOCK[*];% 06182000
REAL PKT; 06182100
BEGIN ARRAY NAME LOG; 06183000
INTEGER N,L,I,J,TIMEX;% 06184000
INTEGER MIX; 06184100
$ SET OMIT = NOT STATISTICS 06184199
REAL TIMEAX,T,A,Q,ESED; 06185000
$ SET OMIT = NOT(PACKETS) 06185099
REAL UNITNO; 06185100
INTEGER ARRAY PM[*]; 06185105
$ POP OMIT 06185110
$ SET OMIT = NOT(WORKSET AND WORKSETMONITOR) 06185111
REAL DD; 06185112
$ POP OMIT % WORKSET AND WORKSETMONITOR 06185113
SUBROUTINE TIMEIT;% 06186000
BEGIN CHANGEABORT(0);% 06187000
WHILE (NT2:=XCLOCK+P(RTR)) GEQ WITCHINGHOUR DO 06188000
MIDNIGHT; 06188100
LOG[TIMEAX+2] ~ NT2;% 06189000
$ SET OMIT = NOT(STATISTICS) 06189099
STOPLOG(P1MIX,0); 06190000
MIX~P1MIX; P1MIX~0; 06190100
IDLETIME;% 06191000
OLDIDLETIME ~ (LOG[TIMEX] ~ VECTOR[3]+% 06192000
PROCTIME[MIX])+OLDIDLETIME; 06193000
PROCTIME[MIX] ~ -VECTOR[3];% %127-06193500
LOG[TIMEX+1]~VECTOR[4]+IOTIME[MIX]; 06194000
$ SET OMIT = NOT WORKSET 06194890
LOG[TIMEX+2] ~ OLAYTIME[MIX]; %710-06194900
$ SET OMIT = WORKSET%710-06194990
$ SET OMIT = NOT(WORKSET AND WORKSETMONITOR) 06195090
IF WKSETMONITOR AND (DD=0) THEN 06195095
BEGIN 06195100
STREAM(N1 := VECTOR[0], N2 := VECTOR[1], 06195105
T1 := ((LOG[TIMEX]+0.5)/60 DIV 1), 06195110
T2 := ((LOG[TIMEX+1]+0.5)/60 DIV 1), 06195115
T4 ~ (OLAYTIME[MIX]+59) DIV 60, % OLAY I/O TIME IN SECS %710-06195118
T3:=(((LOG[TIMEAX+2]-VECTOR[5].[24:24])+0.5)/60 DIV 1), 06195120
DV:=0, DD := DD := SPACE(10)); 06195125
BEGIN 06195130
SI:=LOC N; DS:=LIT" "; 06195135
2(SI:=SI+1; DS:=7CHR; DS:=LIT" "); 06195140
DS:=4LIT"CPU="; 06195145
DS:=6DEC; DV:=DI; DI:=DI-6; DS:=5FILL; DI:=DV; 06195150
DS:=5LIT" I/O="; 06195155
DS:=6DEC; DV:=DI; DI:=DI-6; DS:=5FILL; DI:=DV; 06195160
DS~ 6LIT" OLAY="; %710-06195161
DS~ 6DEC; DV~ DI; DI~ DI-6; DS~ 5FILL; DI~ DV; %710-06195162
DS:=6LIT" ELAP="; 06195165
DS:=6DEC; DV:=DI; DI:=DI-6; DS:=5FILL; DI:=DV; 06195170
DS:=LIT"~"; 06195175
END STREAM STATEMENT; 06195180
SPOUT(DD); 06195185
END; 06195190
$ POP OMIT % WORKSET AND WORKSETMONITOR 06195195
STREAM(A~VECTOR[5].[1:23]:B~0);% 06196000
BEGIN SI ~ LOC A; DI ~ LOC A; DS ~ 8 DEC END;% 06197000
LOG[TIMEAX] ~ P(XCH);% 06198000
LOG[TIMEAX+1] ~ VECTOR[5].[24:24];% 06199000
$ SET OMIT = NOT(STATISTICS) 06199099
NT4 ~ VECTOR[2].[8:10];% 06200000
LOG[TIMEAX+3] ~ IF VECTOR[1] < 0 THEN (NT4= 99) 06201000
+2 ELSE NT4 = 3;% 06202000
LOG[TIMEAX+3].[1:30]~ DATE.[18:30]; 06202100
LOG[TIMEAX+4]:=USERCODE[MIX]; 06203000
$ SET OMIT = NOT(DCLOG AND DATACOM) 06203099
IF TABCNT[MIX]!0 THEN 06203600
BEGIN T:=CLOCK+900; 06203650
COMPLEXSLEEP(TABACNT[MIX]=0 OR CLOCK>T); 06203700
END; 06203750
$ SET OMIT = NOT (DATACOM AND NOT DCLOG) 06203790
PRTROW[MIX].[PSF]:=0; 06204000
$ SET OMIT = NOT(PACKETS) 06205009
UNITNO:=PSEUDOMIX[MIX]; 06205010
PSEUDOMIX[MIX]:=0; 06205020
PM[0]:=LOG[TIMEX ]/60; 06205030
PM[1]:=LOG[TIMEX+1]/60; 06205040
$ SET OMIT = NOT(WORKSET) OR OMIT %759-06205049
PM[2]:=OLAYTIME[MIX]/60; %759-06205050
$ POP OMIT 06205051
$ POP OMIT %759-06205052
USERCODE[MIX] := 0; 06205100
STREAM(S~[NFO[(MIX-1)|NDX]]);% 06205200
BEGIN DS~8 LIT "0"; DI~S; DS~2 WDS; END;% 06205300
$ SET OMIT = NOT STATISTICS 06205540
JARROW[MIX]:=PRTROW[MIX]:=0; 06206000
END TIMET; 06206100
$ SET OMIT = NOT(PACKETS) 06206109
SUBROUTINE MESSAGE; 06206110
IF UNITNO!0 OR (VECTOR.[24:9]!0) THEN 06206120
BEGIN 06206130
STREAM(A:=[VECTOR[0]],MIX,B:=[PM[0]],T:=T:=SPACE(10)); 06206140
BEGIN DS:=5LIT" FOR";SI:=A;SI:=SI+1;DS:=7CHR; 06206150
DS:=LIT"/";SI:=SI+1;DS:=7CHR;SI:=LOC MIX; 06206160
DS:=LIT"=";DS:=2DEC; 06206170
A:=DI;DI:=DI-2;DS:=FILL;DI:=A; SI:=B; 06206175
DS:=10 LIT ": PROCESS="; DS:=5 DEC; %759-06206180
A:=DI;DI:=DI-5;DS:=4FILL;DI:=A; 06206190
DS:=10 LIT " SECS, IO="; DS:=5 DEC; %759-06206200
A:=DI;DI:=DI-5;DS:=4FILL;DI:=A; 06206205
$ SET OMIT = NOT(WORKSET) OR OMIT %759-06206209
DS:=12 LIT " SECS, OLAY="; DS:=5 DEC; %759-06206210
A:=DI;DI:=DI-5;DS:=4FILL;DI:=A; %759-06206215
$ POP OMIT %759-06206216
DS:=LIT"~"; 06206220
END; 06206230
SPOUTER(T,IF VECTOR.[24:9] NEQ 0 THEN 06206240
VECTOR.[24:9] ELSE UNITNO,64); 06206250
END; 06206260
$ POP OMIT 06206261
A ~ VECTOR[6].[33:15];% 06207000
ESED:=VECTOR[2].[2:1]; 06207100
T:=Q:=((L:=VECTOR[6].[18:15])+(IF ESED THEN N~0 ELSE 06208000
N:=FILEBLOCK.[8:10])+60) DIV 25|27; 06209000
LOG:=[M[TYPEDSPACE(T,LOGAREAV)]];% %167-06210000
M[LOG INX NOT 1].[9:6] ~ 0;% 06211000
$ SET OMIT = NOT(PACKETS) 06211099
PM:=[M[SPACE(5)]]&5[8:38:10]; 06211100
M[PM INX NOT 1].[9:6]:=0; 06211200
$ POP OMIT 06211201
J ~ A;% 06212000
DO BEGIN I ~ I+27;% 06213000
DISKIO( T ,-( LOG INX I),26,J);% 06214000
SLEEP([T],IOMASK);% 06215000
J ~ LOG[I+1];% 06216000
END UNTIL J=0 OR I+53>Q;% 06217000
IF VECTOR[2].[8:10]=0 THEN L ~ LOG[29]; 06217100
IF(I:=(L-5) MOD 25+I+7) LSS Q-3 THEN 06218000
IF I MOD 27 = 0 THEN% 06219000
BEGIN LOG[I] ~ LOG[I+1] ~ 0;% 06220000
I ~ I+2 END;% 06221000
$ SET OMIT = NOT(STATISTICS) 06221099
LOG[I]:= IF VECTOR[0] LSS 0 06222000
THEN IF VECTOR[0]=(-"COBOL ") THEN 2 06222100
ELSE IF VECTOR[0]=(-"FORTRAN") THEN 6 06222200
ELSE IF VECTOR[0]=(-"BASIC ") THEN 7 06222300
ELSE IF VECTOR[0]=(-"XALGOL ") THEN 9 06222400
ELSE IF VECTOR[0]=(="TSPOL ") THEN 10 06222500
ELSE IF VECTOR[0]=(-"COBOL68") THEN 11 06222550
ELSE 1 ELSE 0; 06222600
LOG[I+1] ~ N DIV 5;% 06223000
IF(I:=(TIMEX:=I+2)+3) LSS Q-1 THEN 06224000
IF I MOD 27 = 0 THEN% 06225000
BEGIN LOG[I] ~ LOG[I+1] ~ 0;% 06226000
I ~ I+2;% 06227000
END;% 06228000
I ~ (TIMEAX ~ 1)+5;% 06229000
IF NOT ESED THEN%IF JOB ES-ED THEN NO FPB ENTRIES 06229100
FOR J ~ 5 STEP 5 UNTIL N DO% 06230000
IF FILEBLOCK[J-1]=0 THEN LOG[TIMEX -1]~*P(DUP)-1 ELSE 06230100
BEGIN IF I MOD 27 = 0 THEN% 06231000
BEGIN LOG[I] ~ LOG[I+1] ~ 0;% 06232000
I ~ I+2 END;% 06233000
IF I+4 LEQ Q THEN 06233100
STREAM(A~[FILEBLOCK[J-5]],B~[LOG[I]]);% 06234000
BEGN SI ~ A; DS ~ 5 WDS END;% 06235000
IF I+4 LEQ Q THEN 06235100
IF LOG[I+4] < 0 THEN 06236000
BEGIN LOG[I+4] ~ *P(DUP)+CLOCK+P(RTR);% 06237000
LOG[I+3].[24:12]~P(DUP,DUP).[24:12]+TINU06238000
[NT1~P(XCH).[36:6]-1].[18:12];% 06239000
TINU[NT1].[18:12] ~ 0;% 06240000
END;% 06241000
IF LOG[I+2].[18:30]=0 THEN 06241100
LOG[I+2].[18:30]:=DATE.[18:30];%ENTER CURR DATE 06241200
I ~ I+5% 06242000
END;% 06243000
N ~ LOG[TIMEX -1]|5; 06243100
FORGETSPACE(FILEBLOCK);% 06244000
J ~ 0;% 06245000
IF VECTOR[2].[8:10] = 1 THEN% 06246000
BEGIN DO J ~ J+27 UNTIL LOG[J+1] = 0;% 06247000
WHILE J+27 LSS I AND I LSS Q DO% 06248000
BEGIN LOG[J+1] ~ GETESPDISK;% 06249000
J ~ J+27;% 06250000
END;% 06251000
I ~ 27;% 06252000
TIMEIT;% 06253000
LOG[29]~5|LOG[40]+20; 06253500
DO BEGIN DISKIO(T,LOG INX I,26,A);% 06254000
A ~ LOG[I+1];% 06255000
I ~ I+27;% 06256000
SLEEP([T],IOMASK);% 06257000
END UNTIL A = 0;% 06258000
END% 06259000
ELSE BEGIN 06260000
DO BEGIN J~J+27; 06260100
FORGETESPDISK(A);% 06261000
A ~ LOG[J+1];% 06262000
END UNTIL A = 0;% 06263000
IF LOGFREE=0 THEN TIMEIT ELSE 06263100
BEGIN A~J+29; 06263200
LOG[29]~3; 06265000
I ~ I+6;% 06266000
WHILE (J ~ J+27) < I DO% 06267000
BEGIN A ~ A+25;% 06268000
STREAM(X~[LOG[J]],Y~[LOG[A]]);% 06269000
BEGIN SI ~ X; DS ~ 25 WDS END;% 06270000
IF TIMEX } A THEN TIMEX ~ TIMEX-2; 06271000
IF TIMEAX } A THEN TIMEAX ~ TIMEAX-2; 06272000
END;% 06273000
N ~ (N+L) DIV 5+3;% 06278000
L ~ 28;% 06279000
IF TIMEX+2 LSS Q AND TIMEAX+4 LSS Q THEN 06279100
TIMEIT; LOGSPACE(L+1 INX LOG,(N-1)|5); 06280000
END;% 06327000
END;% 06328000
$ SET OMIT = NOT(PACKETS) 06328099
MESSAGE; FORGETSPACE(PM); 06328100
IF UNITNO!0 THEN 06328200
DRAINO(UNITNO,(VECTOR[2].[8:10]!1) OR (PKT!0), 06328300
((VECTOR[1]<0) OR (VECTOR[2].[8:10]=3)) 06328400
%VECTOR[6][1:1:1]); 06328500
$ POP OMIT 06328501
FORGETSPACE(LOG);% 06329000
END SIGNOFF;% 06330000
PROCEDURE USERDISKSPECIALCASE(Q,R,UT,J) ; 06350000
VALUE Q,J; REAL R,J; INTEGER Q; ARRAY UT[*] ; 06350300
BEGIN 06350600
REAL BUFF=Q,N=J,Z=UT,E=R ; 06351000
$ SET OMIT = NOT(SHAREDISK ) 06351050
$ SET OMIT = SHAREDISK 06351100
REAL NEU,NT; ARRAY UA[*]; 06351104
DEFINE U=AVTABLE #, AVS=B #, NEU1=J-1 #, NEU2=NT-1 #; 06351105
$ POP OMIT 06351106
INTEGER NT1,NT3,NT4,B ; 06351250
LABEL L1,L2,L3,UP,PU,BD,WHY,M1,T10 ; 06351500
SWITCH SW,~L1,L2,L3 ; 06351800
IF Q!0 THEN GO SW[Q-1] ; 06352000
$ SET OMIT = NOT(SHAREDISK ) 06352490
L1: BUFF:=R; Z:=0; UNLOCKTOG(USERDISKMASK); 06353500
IF N LEQ RESERVEDISKSIZE THEN% CALL OUT RESERVES 06353510
IF (Z:=DIRECTORYSEARCH("RESERVE","DISK ",6)) NEQ 0 THEN 06353530
BEGIN FORGETSPACE(Z); 06353540
IF N>0 THEN 06353541
$ SET OMIT = PACKETS 06353542
BEGIN STREAM(Z:=Z:=SPACE(3)); 06353545
DS!23 LIT "**RESERVE/DISK REMOVED~"; 06353550
SPOUTER(Z,25,(NOT LIBMSG) AND 1); %523-06353551
END; 06353552
FORGETSPACE(BUFF); P(XIT); %528-06353555
END OF RESERVE CALL UP; 06353570
IF AUTOUNLD THEN 06353580
BEGIN P(P1MIX); AUTOUNLD:=P1MIX:=0; 06353590
STREAM(A:=DATE,Z:=Z:=SPACE(10)+2); 06353600
BEGIN DS:=23 LIT"CC UNLOAD EXPIRED TO XP"; 06353610
SI:=LOC A; SI:=SI+3; DS:=5 CHR; 06353620
DS:=9 LIT " =/=;END."; 06353630
END; 06353640
INDEPENDENTRUNNER(P(.CONTROLCARD),Z&31[3:43:5],192); 06353650
P1MIX:=P; 06353660
IF N GEQ 0 THEN 06353670
BEGIN STREAM(Z:=Z:=SPACE(10)); 06353680
DS:=18 LIT"18 AUTOUNLD RESET~"; 06353690
SPOUT(Z); 06353700
END END AUTOMATIC UNLOADING; 06353710
IF NOT N.[2:1] THEN 06353720
BEGIN IF P1MIX!0 THEN 06354000
BEGIN 06354100
NT1 ~ NOTERMSET(P1MIX); % NOTE: NT1 IS LOCAL %537-06354200
WHY: STREAM(J:=JARROW[P1MIX],P1MIX,N,BUFF); 06355000
BEGIN DS~14 LIT "#NO USER DISK:"; 06356000
SI~J; SI~SI+1; DS~7 CHR; 06357000
DS~LIT "/"; SI~SI+1; DS~7 CHR; 06358000
SI~LOC P1MIX; DS~LIT "="; DS~2 DEC; 06359000
J:=DI; DI:=DI-2; DS:=FILL; DI:=J; DS:=LIT"-"; 06359500
SI:=LOC N; DS:=8 DEC; DS:=7 LIT" SEGS.~"; 06360000
DI:=DI-15; DS:=7 FILL; 06360500
END; 06360505
SPOUT(BUFF); 06360510
IF AUTODS AND NOTERMSET(P1MIX) THEN %747-06360515
TERMINATE(P1MIX&61[CTF]) ELSE %747-06360516
BEGIN %747-06360517
REPLY[P1MIX]:=-VWY&VOK[36:42:6]; 06360520
COMPLEXSLEEP((REPLY[P1MIX] GTR 0) OR 06360530
(TERMSET(P1MIX) AND NT1)); %537-06360540
END; %747-06360542
IF NT1 THEN %537-06360545
IF TERMSET(P1MIX) THEN 06360550
BEGIN PRTROW[P1MIX].[7:1]~1; 06360560
GO TO INITIATE; 06360570
END; 06360580
IF NOT WHYSLEEP(VWY&VOK[36:42:6]) THEN 06360590
BEGIN BUFF~SPACE(10); 06360600
GO TO WHY; 06360610
END; 06360620
END ELSE 06361000
BEGIN 06361010
STREAM(N,BUFF); 06361100
BEGIN DS:=20 LIT"#NO USER DISK:MCP - "); 06361200
SI:=LOC N; DS:=8 DEC; 06361300
DS:=6 LIT" SEGS~"; 06361400
DI:=DI-14; DS:=7 FILL; 06361500
END; 06361600
SPOUT(BUFF); 06361610
NT1:=0; DO SLEEP([CLOCK], NOT CLOCK) 06361700
UNTIL (NT1~NT1+1)=30); 06361705
END; 06361710
END ELSE FORGETSPACE(BUFF); 06365110
P(XIT) ; 06380070
L2: U[J]:=E; E:=NEU:=(NT:=NEUP.NEUF)+2+(NT+1)DIV 2; P(NT); J:=1; 06380100
$ SET OMIT = SHAREDISK 06380120
NT1:=NT+NT+NT; FORGETSPACE(UT); FIXARRAY(UA,NT2,NT1); E:=0; 06380140
$ POP OMIT 06380141
UP: IF (NT4:=E MOD 30) LSS (NT3:=(NT1:=U[J].STARTWRD) MOD 30) 06380150
THEN NT4:=NT3 ; 06380200
IF (NT2:=(Q:=U[J] AND NUMENTM)+NT4) GTR 1023 06380250
OR ((Q+E+1) DIV 30+1-E DIV 30) GTR 34 THEN 06380300
BD: BYBY("ODISK IS TOO CHECKERED...PLEASE COMPACT IT~",43) ; 06380350
DISKWAIT(-((UA[NEU1]:=(UA[NEU2+J]:=SPACE(NT2))+NT4)-NT3),Q+NT3, 06380400
USERDISKBOTTOM~NT1 DIV 30) ; 06380450
$ SET OMIT = NOT(SHAREDISK ) 06380490
$ SET OMIT = SHAREDISK 06380520
IF J=1 THEN B:=UA.[CF]+NT+NT-1 ; 06380525
$ POP OMIT 06380526
M[B+J]:=U[J]&E[TOSTARTWRD] ; 06380550
IF (NT1:=Q DIV 4) LSS AVDIFFMIN THEN NT1:=AVDIFFMIN ; 06380600
IF (E:=E+Q+NT1) GTR AVTMAX THEN GO TO BD; 06380650
IF P(DUP) GEQ J:=J+1 THEN GO UP; E:=E-NT1; J:=1 ; 06380700
PU: NT2:=(NT3:=P(M[B+J],DUP).STARTWRD)+NT5:=P(XCH) AND NUMENTM ; 06380750
IF P(DUP)!J THEN IF (NT2-1)DIV 30=(NT4~M[B+J+1].STARTWRD)DIV 30 THEN06380800
MOVE(NT1~NT2 MOD 30,UA[NEU1]+NT5-NT1,NT1~UA[NEU1+1]-NT4 MOD 30); 06380850
DISKWAIT(UA[NEU1]-NT1~NT3 MOD 30,NT1~NT5,USERDISKBOTTOM+NT3 DIV 30);06380900
$ SET OMIT = NOT(SHAREDISK) 06380924
FORGETSPACE(UA[NEU2+J]); 06380950
IF P(DUP) GEQ J:=J+1 THEN GO PU ; 06381000
$ SET OMIT = SHAREDISK 06381020
MOVE(NT,[UA[NT+NT]].[AVTABLE[1]]) ; 06381070
$ POP OMIT 06381071
$ SET OMIT = NOT(SHAREDISK ) 06381075
FORGETSPACE(UA) ; 06381085
$ SET OMIT = NOT(SHAREDISK ) 06381095
P(DEL,Q&AVS[TOSIZE] OR M,RTN) ; 06381250
L3: P(U[NEUP.NEUF+2+(Q:=J DIV P(M1)) DIV 2],IF Q THEN P.[8:20] ELSE 06381300
P.[28:20]) ; 06381310
IF U[Q+1].SPEED = 2 THEN 06381320
BEGIN % 40-MILL MASK CONSTRUCTION. 06381330
Q:=P ; 06381335
STREAM(S:=0:Q); 06381340
BEGIN 06381345
SI:=LOC Q; SKIP 28SB; DI:=LOC S; SKIP 8DB; 06381350
5(4(IF SB THEN DS:=SET ELSE SKIP DB;SKIP SB); SKIP 4 DB); 06381355
SI:=LOC Q; SKIP 28 SB; DI:=LOC S; DI:=DI+2; 06381360
5(4(IF SB THEN DS:=SET ELSE SKIP DB;SKIP SB); SKIP 4 DB); 06381365
END STREAM; 06381380
END ; 06381390
STREAM(MSG:=0:V:=47-(J:=((Q:=J MOD P(M1))+ABS(R)-1) DIV P(T10)), 06381395
W:=1+J-Q DIV P(T10)); 06381400
BEGIN DI:=LOC MSK; SKIP V DB; DS:=W SET; END; 06381405
P(LND,LNG,0,LNG,=,RTN); 06381410
M1::: @3641100; % DECIMAL 1000000. 06381450
T10::: @23420; % DECIMAL 10000. 06381500
END OF USERDISKSPECIALCASE ; 06381550
PROCEDURE GETMOREOLAYDISK(MIX);% 06400000
VALUE MIX;% 06401000
INTEGER MIX;% 06402000
BEGIN INTEGER I=+1,% 06403000
J=+2,% 06404000
T=+3;% 06405000
ARRAY A=+4[*];% 06406000
REAL MSCW=-2; 06406500
REAL RCW=+0;% 06407000
LABEL EXIT;% 06408000
DEFINE DALOCMAXSZ = 06408100
$ SET OMIT = NOT(AUXMEM) 06408199
$ SET OMIT = AUXMEM 06408299
127#; %DALOC SIZE MUST = 9 INIITALLY. 06408300
$ POP OMIT 06408301
P(0, 0, 0, 0); TOGLE ~ TOGLE OR STACKMASK;% 06410000
IF (T~DALOC[MIX,0].[CF]+1)=DALOCMAXSZ THEN BEGIN 06411000
TERMINATE (MIX&111[CTF]); %517-06411010
GO TO EXIT; END; 06411030
IF T=DALOCROW[MIX].[8:10] THEN% 06412000
BEGIN IF (J~T+P(DUP) - 1)=129 THEN J~DALOCMAXSZ; 06413000
WHILE (I := GETSPACE(J, 0, 3)+2)=2 DO 06414000
SLEEP([CLOCK], NOT CLOCK); 06415000
MOVE(T, DALOCROW[MIX], I); 06416000
FORGETSPACE(DALOCROW[MIX]); 06417000
DALOCROW[MIX] := (*P(DUP)) & I[CTC] & J[8:38:10]; 06417500
M[I-2].[9:6] := MIX; 06418000
END AIT TYPE ACTION;% 06419000
IF (I ~ GETUSERDISK(500 OR MEMORY))=0 THEN GO TO EXIT;% 06420000
DALOC[MIX,0] ~ (*P(DUP))&(T+1)[CTC];% 06421000
DALOC[MIX,T] ~ I;% 06422000
DALOC[MIX,T+1] ~ 0;% 06423000
EXIT: OLAYMASK ~ TWO(MIX) OR OLAYMASK;% 06424000
KILL([MSCW]); 06425000
END GET MORE OVERLAY DISK FOR A MIX INDEX;% 06426000
REAL PROCEDURE SECURITYCHECK(MID,FID,USERID,HEADER); 06460000
VALUE MID,FID,USERID; 06460100
REAL MID,FID,USERID,HEADER; 06460200
% MID MULTI FILE ID OF FILE TO BE CHECKED 06460300
% FID FILE ID OF FILE TO BE CHECKED 06460400
% USERID USER IDENTIFICATION 06460500
% HEADER 06460600
% >512 CORE ADDRESS OF HEADER IN 33:15. JUST CHECK IT. 06460700
% >0, <512 VALUE FOR DIRECTORYSEARCH, FIND THE FILE AND PASS 06460800
% BACK THE HEADER IN ADDITION TO SECURITY INFO. 06460900
% <0 DISK ADDRESS OF HEADER. READ IT IN AND CHECK IT, BUT 06460950
% DONT PASS IT BACK. 06460960
% 06461100
% RESULT FROM SECURITYCHECK 06461200
% =0 NO LEGITIMATE USER FOUND 06461300
% =2 TERTIARY USER ( INPUT ONLY) 06461400
% =3 SECONDARY USER (INPUT/OUTPUT) 06461500
% =7 PRIMARY USER (INPUT/OUTPUT/LIB MAINT.) 06461600
BEGIN 06462000
REAL T2,DKSGROW,CODES,ROWS,ROW,DKADR,ROWSZ,C,USER,TYPE,SH; 06462100
REAL I=DKSGROW, FPBSIZE=CODES; 06462105
ARRAY FH[*],FPB=ROW[*]; 06462110
LABEL FOUND; 06462120
LABEL EXYT,NOTFOUND,LOOK,WHY,FORGET; 06462200
REAL SUBROUTINE DIRSRH; 06463000
BEGIN 06463100
LOOK: IF (T2:=DIRECTORYSEARCH(MID,FID,HEADER)) LSS 64 THEN 06463200
WHY: BEGIN 06463210
IF T2=0 THEN FILEMESS("#NO FIL","ON DISK",MID,FID,0,0,0) 06463220
ELSE IF T2=1 THEN BEGIN P(DEL); TYPE:=-1; GO EXYT; END 06463225
ELSE IF T2=2 THEN FILEMESS("#SYSFIL","ERROR ", 06463230
MID,FID,0,0,0); 06463240
IF AUTODS THEN TERMINATE(P1MIX&61[CTF]) ELSE %747-06463260
BEGIN %747-06463270
REPLY[P1MIX]:=-(SH:=VWY&VOK[36:42:6]&VIL[30:42:6]); 06463280
COMPLEXSLEEP((REPLY[P1MIX] GTR 0) OR TERMSET(P1MIX)); 06463300
END; 06463310
IF TERMSET(P1MIX) THEN GO INITIATE; 06463340
IF NOT WHYSLEEP(SH) THEN GO TO WHY; 06463360
IF (SH~T2~REPLY[P1MIX].[FF]) > PSEUDOMAXT THEN % IL%540-06463380
BEGIN STREAM(T2:); 06463400
BEGIN SI:=T2; 06463420
LL: SI:=SI+1; IF SC!"L" THEN GO TO LL; 06463440
SI:=SI+1; T2:=SI; 06463460
END; 06463480
T2:=P; 06463500
FPBSIZE:=(FPB:=PRT[P1MIX,3]).[8:10]; 06463520
FOR I:=0 STEP ETRLNG UNTIL FPBSIZE DO 06463540
IF (FPB[I] EQV MID)=NOT 0 THEN 06463560
IF (FPB[I+1] EQV ABS(FID))=NOT 0 THEN GO FOUND; 06463580
FOUND: NAMEID(C,T2); MID:=C; NAMEID(C,T2); 06463600
NAMEID(C,T2); FID:=C&FID[1:1:1]; 06463620
IF I LSS 1020 THEN 06463640
BEGIN FPB[I]:=MID; 06463660
FPB[I+1]:=C; 06463680
END; 06463700
FORGETSPACE(SH-1); 06463720
END ELSE LABELTABLE[T2]:=-(*P(DUP)); %764-06463740
REPLY[P1MIX]:=0; 06463760
GO TO LOOK; 06463780
END; 06463800
DIRSRH := T2; 06463810
END DIRSRH; 06463820
IF HEADER GEQ 0 THEN 06463840
SH:=IF HEADER GTR 511 THEN HEADER ELSE DIRSRH 06463860
ELSE DISKWAIT(-(SH:=SPACE(30)),30,HEADER.[CF]); 06463880
FH:=IOQUE&SH[CTC]; 06463900
IF(FH[2] EQV 0)=NOT 0 OR (ABS(USERID) EQV ABS(FH[2]))=NOT 0 06463910
OR (USERID EQV MCP)=NOT 0 THEN TYPE+7 ELSE% 06463920
IF HEADER<0 THEN GO EXYT ELSE 06463925
IF (FH[5] EQV @14)=NOT 0 THEN% 06463930
IF (FH[6] EQV @14)=NOT 0 THEN TYPE~2 ELSE TYPE~3;% 06463940
IF TYPE ~ 0 THEN GO TO EXYT; 06463950
IF FH[5].[1:1] THEN 06463960
BEGIN IF (SH:=DIRECTORYSEARCH(ABS(FH[5]),FH[6],19))=0 06463970
THEN BEGIN TYPE:=0; GO TO EXYT END; 06463980
M[SH+4].[11:1]:=1; 06463982
STREAM(DATE,J:=5); BEGIN SI:=LOC DATE; DS:=8OCT; END; 06463984
M[SH+3].[12:18]:=JUNK; 06463986
DISKWAIT(SH.[CF],-30,SH.[FF]); 06463988
$ SET OMIT = SHAREDISK 06463990
UNLOCKDIRECTORY; 06463992
$ POP OMIT 06463994
DKSGROW:=M[SH INX 8]; 06463996
CODES:=SPACE(30); 06464000
ROWS:=(M[SH INX 9] AND 31)-1; 06464050
FOR ROW:=0 STEP 1 UNTIL ROWS DO 06464100
BEGIN IF (DKADR:=M[SH INX 10+ROW])=0 THEN 06464200
NOTFOUND: BEGIN TYPE := 0; 06464300
FORGETSPACE(CODES); FORGETSPACE(SH);GO TO EXYT; 06464400
END; 06464500
ROWSZ := DKADR + DKSGROW; 06464600
WHILE DKADR < ROWSZ DO 06464700
BEGIN DISKIO(C,1-CODES,30,DKADR); 06464800
SLEEP([C],IOMASK); 06464900
FOR C:=0 STEP 1 UNTIL 29 DO 06465000
BEGIN IF((USER:=NFLAG(M[CODES INX C]))EQV @114= 06465100
NOT 0 THEN GO TO NOTFOUND; 06465200
IF (USER EQV @14)! NOT 0 THEN 06465210
IF USER.[3:3]=0 THEN 06465220
BEGIN 06465230
IF (USERID EQV ABS(USER))=NOT 0 THEN 06465300
BEGIN TYPE := 06465400
IF USER < 0 THEN 2 ELSE 3; 06465500
GO TO FORGET; 06465600
END; 06465700
END ELSE 06465800
BEGIN 06465805
IF P1MIX ! 0 THEN 06465810
IF (ABS)JAR[P1MIX,0])EQV 06465820
USER.[6:42])= NOT 0 THEN 06465830
IF((IF JAR[P1MIX,0]<0 THEN "DISK "ELSE JAR[P1MIX,1])EQV 06465840
M[CODES INX C+1].[6:42])= NOT 0 06465850
THEN 06465860
BEGIN 06465870
TYPE := USER.[3:3]; 06465880
GO TO FORGET; 06465900
END; C:=C+1; 06465910
END; 06465920
END; % 30 USERS 06466000
DKADR := DKADR + 1; 06466100
END; % ROW 06466200
END; % ROWS 06466300
GO TO NOTFOUND; 06466310
END; % NO SECURITY BLOCK FILE 06466400
TYPE :=0; 06466500
EXYT: 06466600
IF HEADER LSS 512 THEN 06466610
IF HEADER GEQ 0 THEN HEADER:=FH ELSE FORGETSPACE(FH); 06466620
SECURITYCHECK :=TYPE; 06466700
END SECURITYCHECK; 06467500
$ SET OMIT = NOT(DATACOM ) 06499999
% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *%JS06845900
$ SET OMIT = NOT(DCLOG AND DATACOM ) 06845999
DEFINE KLULMP=@174#; @173 IS RESERVED FOR THE DISK ADDRESS 07000000
COMMENT LASTCDNUM, FIRSTDECK, AND LASTDECK ARE STORED IN THE 07000010
FIRST THREE WORDS OF THE DISK SEGMENT LOCATED AT DIRECTORYTOP 07000015
+3. IN A NON SHARED DISK SYSTEM, THEY ARE WRITTEN OUT EACH 07000020
TIME ONE OF THEM IS CHANGED SO THAT THEY WILL BE PRESERVED 07000025
IF A HALT/LOAD OCCURS. N A SHARED DISK SYSTEM, THEY ARE 07000030
READ INTO THE PRT WITH A READ-LOCK COMMAND EACH TIME THEY ARE 07000035
USED. THIS PROVIDES CONTROL DECK INTERLOCKING BETWEEN SYSTEMS 07000040
IN ADDITION TO PASSING THE INFORMATION BETWEEN SYSTEMS. 07000045
END COMMENT; 07000050
INTEGER LASTCDNUM=@174; 07000100
REAL FIRSTDECK=@175; 07000200
REAL LASTDECK=@176; 07000300
DEFINE LOCKCONTROLDECKS=BEGIN SLEEP([TOGLE],CDMASK); LOCKTOG(CDMASK); 07001000
$ SET OMIT = NOT(SHAREDISK) 07001099
END#, 07001200
UNLOCK(CONTROLDECKS=BEGIN 07001300
$ SET OMIT = NOT(SHAREDISK) 07001399
UNLOCKTOG(CDMASK) END#; 07001500
REAL PROCEDURE NEXTCDNUM(UPDATE); VALUE UPDATE; BOOLEAN UPDATE; 07001600
BEGIN 07001620
LOCKCONTROLDECKS; 07001640
LASTCDNUM := (LASTCDNUM MOD 9999) + 1; 07001660
STREAM(CDNUM:=0; LNUM:=LASTCDNUM); 07001680
BEGIN 07001700
SI:=LOC LNUM; DI:=LOC CDNUM; DS:=8 DEC; 07001720
END; 07001740
NEXTCDNUM := P; 07001760
IF UPDATE THEN 07001780
BEGIN 07001800
DISKWAIT(KLUMP,-3,DIRECTORYTOP+3); 07001820
UNLOCKTOG(CDMASK); 07001840
END; 07001860
END; 07001880
PROCEDURE STARTADECK(N); VALUE N; REAL N; FORWARD; 07002000
PROCEDURE ENTERCONTROLDECK(H); VALUE H; ARRAY H[*]; FORWARD; 07002100
REAL RUNNUMBER;% 07003000
%891-07003250
%#######################################################################07003251
%891-07003252
PROCEDURE EBTABLE; %890-07003270
BEGIN LABEL L; %890-07003280
P(0,XIT,.L,DEL); %890-07003290
L::: %890-07003300
0," 32?","1???","0TS?","/???","-LK?","J???","????","????","&CB?","A???",07003310
"!???","????","????","????","????",""????", %890-07003312
"9???","????","Z???","????","R???","????","????","????","I???","????", 07003320
"????","????","????","????","????","????", %890-07003322
"8#:?","????","Y,|?","????","Q$]?","????","????","????","H.[?","????", 07003330
"????","????","????","????","????","????", %890-07003332
@07770675,@05770413,@067146616,@65176473, %892-07003340
@47574656,@45554453,"????","????", @27742620,@25352436, %890-07003342
"????","????","????","????","????","????", %891-07003344
%QMARKADDRESSES %890-07003350
"????","????","????","????","????","????","????","????","????","????", 07003352
"????","????","????","????","????","????", %890-07003354
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, % SPACE FOR ADDRESSES %890-07003360
0,0,0,0,0,0,0; %890-07003370
END; %890-07003380
%891-07003390
%#######################################################################07003391
%891-07003392
PROCEDURE SETUPEBTABLE; %890-07003400
BEGIN REAL ADR; LABEL EXIT; %890-07003410
DEFINE STOREADDRESS= %890-07003412
X:=SI; SI:=LOC X; SI:=SI+5; %890-07003414
DS:=3 CHR; DI:=DI+5 #; %890-07003416
EBTABLE; %890-07003420
P([M[(ADR:=*P(.EBTABLE) INX NOT 1)]],IOR); %890-07003430
SETUPEBTABLE:=ADR:=ADR.[CF]+3; %890-07003440
IF M[ADR+81] = 0 THEN %890-07003450
STREAM (X:=0,TABLE:=ADR,QMARKTABLEADDRESS:=ADR+32,LOCATIONS:=ADR+40); 07003462
BEGIN %890-07003464
DI:=TABLE; SI:=TABLE; SI:=SI+8; %890-07003466
2(40(SI:=SI+4; DS:=4 CHR;)); %890-07003468
%FIRST FILL ALL OF ADDRESSES WITH ADDRESS OF ?S %890-07003482
SI:=QMARKTABLEADDRESS; %890-07003484
X:=SI; %890-07003486
SI:=LOC X; SI:=SI+5; %POINT SI AT ADDRESS OF QMARKS %890-07003488
DI:=LOCATIONS; %890-07003490
DS:=3 CHR; %890-07003492
SI:=LOCATIONS; %890-07003494
DS:=63 WDS; %890-07003496
%NOW SET ADDRESSES FOR VALID CHARS INTO EBCDIC TABLE %890-07003498
SI:=TABLE; %890-07003500
DI:=LOCATIONS; %890-07003502
3(STOREADDRESS; %STORE ADDRESSES FOR LP=0,1,2 %890-07003504
%CORRESPONDING TO BLANK,9 HOLE,8 HOLE %890-07003506
SI:=X; %890-07003508
SI:=SI+63; SI:=SI+1); %SKIP 8 WORDS DOWN TABLE %890-07003510
DI:=DI+8; %LP=3 IN INVALID %890-07003512
STOREADDRESS; %LP=4..... 7 HOLE %890-07003514
DI:=DI+8; %LP=5 IS INVALID %890-07003516
SI:=X; %890-07003518
SI:=SI+1; %SKIP 1 CHAR DOWN TABLE %890-07003520
STOREADDRESS; %LP=6....7&8 HOLES TOGETHER %890-07003522
DI:=DI+8; %890-07003524
SI:=X; %890-07003526
SI:=SI+1; %890-07003528
STOREADDRESS; %LP=8....6 HOLE %890-07003530
DI:=DI+8; %890-07003532
SI:=X; %890-07003534
SI:=SI+1; %890-07003536
STOREADDRESS; %LP=10....6&8 HOLES TOGETHER %890-07003538
SI:=DI+40; %MISS 5 WORDS...LP=11,12,13,14,15 %890-07003540
SI:=X; %890-07003542
SI:=SI+1; %890-07003544
STOREADDRESS; %LP:=16.... 5 HOLE %890-07003546
DI:=DI+8; %890-07003548
SI:=X; %890-07003550
SI:=SI+1; %890-07003552
STOREADDRESS; %LP=18.... 5&8 HOLES TOGETHER %890-07003554
2(DI:=DI+52); %MISS 13 WORDS....LP=19-31 %890-07003556
SI:=X; %890-07003558
SI:=SI+1; %890-07003560
STOREADDRESS; %LP=32..... 4 HOLE %890-07003562
DI:=DI+8; %890-07003564
SI:=X; %890-07003566
SI:=SI+1; %890-07003568
STOREADDRESS; %LP=34...... 4&8 HOLES TOGETHER %890-07003570
END; %890-07003580
END; %890-07003590
%***********************************************************************07003600
STREAM PROCEDURE EBCDICCONVERT(INTO,TABLE,POINTERS); %890-07003610
VALUE INTO,TABLE,POINTERS; %890-07003615
%***********************************************************************07003620
BEGIN %890-07003630
LOCAL HP,LP,SRCE,DEST,HPPTR,LPPTR; %890-07003640
%POINT HPPTR & LPPTR TO LAST CHAR OF HP,LP %890-07003650
SI:=LOC HP; %890-07003660
SI:=SI+7; %890-07003670
HPPTR:=SI; %HIGH PART %890-07003680
SI:=LOC LP; %890-07003690
SI:=SI+7; %890-07003700
LPPTR:=SI; %LOW PART %890-07003710
SI:=INTO; SI:=SI+8; %890-07003720
DI:=INTO; %890-07003730
%START CHARACTER TRANSLATE LOOP %890-07003740
2(40( %890-07003750
DEST:=DI; %890-07003760
%TRANSFER LOW & HIGH PARTS %890-07003770
DI:=HPPTR; %890-07003780
DS:=1 CHR; %890-07003790
DI:=LPPTR; %890-07003800
DS:=1 CHR; %890-07003810
SRCE:=SI; %STORE SI FOR NEXT PASS THRU LOOP %890-07003820
%NOW FIND THE POINTER INTO TABLE APPROPRIATE TO LP %890-07003830
SI:=POINTERS; %890-07003840
LP(SI:=SI+8); %890-07003860
SI:=SC; %SI NOW POINTS INTO TABLE @ POINT DEPENDANT ON LP %890-07003870
DI:=DEST; %890-07003880
SI:=SI+HP; %SKIP SI THROUGH TABLE HP CHARS %890-07003890
DS:=CHR; %890-07003900
SI:=SRCE)); %890-07003910
DI:=TABLE; DI:=DI+3; %POINT TO QMRK %890-07003920
END CONVERT; %890-07003950
PROCEDURE COM23;% 07004000
BEGIN% 07005000
REAL INBUFF,% ADDRESS OF THE INPUT BUFFER. 07006000
OUTBUFF,% " " " OUTPUT BUFFER. 07006010
FIRSTCARD,% " " " CARD IMAGE OF THE FIRST CARD 07006020
OUTBUFFOLD,% " " " LAST OUTPUT BUFFER. 07006030
RESERVE,% " " 30 WDS OF CORE USED TO BUILD THE 07006040
T,T1,T2,% TEMPORARY VARIABLES. 07006050
R,L,N,% " " USED TO COUNT CARD IMAG 07006060
Q,% USUALLY INDICATES COL 1 HAS A QUESTION MARK 07006070
IU,% UNIT NUMBER OF THE INPUT UNIT. 07006080
OU,% " " " " OUTPUT UNIT. 07006090
FIRST,% TRUE IF THE FIRST CARD OF A DECK. 07006100
S,% USED AS A TEMPROARY VARIABLE IN SUBROUTINE 07006140
% AND TO HAND THE UNIT NUMBER TO SUBROUTINE S 07006150
D;% USED AS A MASK TO SLEEP UNTIL DISK OPERATIO 07006160
% ARE COMPLETED. 07006161
$ SET OMIT = NOT(PACKETS) 07006169
REAL VERYFIRST, %TRUE IF THE FIRST CARD OF THE FIRST DECK 07006172
%IN SINCE LOAD CONTROL WAS EXECUTED. 07006174
FIRSTORSEC, %TRUE IF THE FIRST OR SEC. CARD OF NEW DECK 07006176
PTYPE,% CONTAINS THE RESULT OF REAL SUBROUTINE 07006180
% PACKETCARD.SAVING SOME NEEDLESS EXTRA 07006190
% CALLS ON IT TO CHECK THE TYPE OF A CARD. 07006200
% THE VALUE OF PTYPE IS AS FOLLOWS: 07006210
% 0 = NOT A PACKET CONTROL CARD 07006220
% 1 = "PACKEND"CARD, (USED BY THE 07006230
% OPERATORS TO END A GROUP 07006240
% OF PACKETS BEING LOADED TO 07006250
% DISK) 07006260
% 3 = "PACKET" CARD,(FIRST CARD 07006270
% OF A PACKET) 07006280
% 5 = "END PACKETS" CARD, (USED BY 07006290
% THE OPERATORS TO BOTH END 07006300
% A GROUP OF PACKETS AND 07006310
% SIMULTANEOUSLY DISCONTINUE 07006320
% LOAD CONTROL). 07006330
PLUGGED;% TRUE IF THE LAST "PACKET" CARD(I.E., 07006340
% PTYPE=3), WAS BOTH THE START OF A NEW 07006350
% PACKET AND WAS USED TO "PLUG" THE END 07006360
% OF THE LAST PACKET WITH AN ARTIFICIAL 07006370
% "-QUESTION MARK- PACKET." CARD; 07007000
$ POP OMIT 07007001
BOOLEAN CDONLY; 07007100
INTEGER A,I;% 07008000
$ SET OMIT = NOT(PACKETS) 07008199
REAL CONTINUE,DISKCHAIN,ADECK; LABEL OK; 07008200
$ POP OMIT 07008251
LABEL AGAIN,INL,ERROR,SUPER,BOMB,SKIPIT,EXIT; 07009000
LABEL INPUTL; 07009100
BOOLEAN EBCDIC; REAL EBTABLEADR; %890-07009200
ARRAY FPB[*],H[*];% 07010000
SUBROUTINE STOP;% 07011000
BEGIN IF S ! 18 THEN% 07012000
BEGIN READY ~ NOT(Q ~ TWO(S)) AND READY;% 07013000
RRRMECH ~ NOT Q AND RRRMECH OR Q AND SAVEWORD;% 07014000
LABELTABLE[S] ~ @114;% 07015000
RDCTABLE[S] ~ MULTITABLE[S] ~ 0% 07016000
END;% 07017000
FPB[T+1]~ *P(DUP)+CLOCK+P(RTR);% 07018000
FPB[T].[24:12] ~ TINU[S].[18:12];% 07019000
TINU[S].[18:12]:=0; 07020000
END;% 07021000
$ SET OMIT = PACKETS 07021999
$ SET OMIT = NOT(PACKETS) 07022099
SUBROUTINE FORGETONE; 07022100
$ POP OMIT 07022101
BEGIN T1 ~ H[9]+9;% 07023000
FOR T2 ~ 10 STEP 1 UNTIL T1 DO% 07024000
FORGETUSERDISK(H[T2],-H[8]); 07025000
END;% 07026000
$ SET OMIT = NOT(PACKETS) 07026099
SUBROUTINE FORGETIT; 07026100
BEGIN FORGETONE; 07026200
WHILE DISKCHAIN NEQ 0 DO 07026300
BEGIN DISKWAIT(-(H INX 0),30,DISKCHAIN); 07026400
DISKCHAIN:=H[6].[FF]; 07026500
FORGETONE; 07026600
END; 07026700
END FORGETIT; 07026800
$ POP OMIT 07026801
SUBROUTINE BOMBTIME;% 07027000
BEGIN WHILE STOPSET(P1MIX) DO STOPM(FALSE); 07028000
IF TERMSET(P1MIX) THEN GO BOMB; END; 07028100
$ SET OMIT = NOT(PACKETS) 07028999
REAL SUBROUTINE PACKETCARD;% THIS USED TO BE "ENDCARD" 07029000
BEGIN IF Q THEN% 07030000
BEGIN;% 07031000
IF EBCDIC THEN %890-07031200
BEGIN %890-07031300
EBCDIC:=FALSE; %890-07031400
M[(*P(.EBTABLE) INX NOT 1)].[2:1]:=0; %890-07031500
END; %890-07031600
STREAM(X:="PACKETS":Y:="CONTINU",Z:="END. ", %890-07032000
EB:="DATA029",INBUFF); %890-07032100
BEGIN SI ~ INBUFF;% 07033000
L: SI ~ SI+1; IF SC = " " THEN GO TO L;% 07034000
INBUFF:=SI; %890-07034500
DI~LOC X; DI~DI+1;% POINT TO "PACKETS" 07035000
IF 4SC=DC THEN% A "PACKET" OR "PACKEND" CARD 07036000
IF 2SC=DC THEN TALLY~3% A "PACKET" CARD 07036100
ELSE TALLY~1% A "PACKEND" CARD 07036150
ELSE BEGIN DI~DI-4;% POINT TO "PACKETS" 07036200
IF 7 SC=DC THEN TALLY:=5 %"END PACKET" 07036210
ELSE BEGIN SI:=INBUFF;DI:=LOC Y; %890-07036220
DI:=DI+1;IF 7SC=DC THEN TALLY:=6 07036230
ELSE BEGIN DI:=LOC Z;DI:=DI+1; 07036240
SI:=INBUFF; %890-07036250
IF 3 SC=DC THEN TALLY:=7 %890-07036260
ELSE BEGIN %890-07036270
DI:=LOC EB;DI:=DI+1 %890-07036280
SI:=INBUFF; 07036290
IF 6 SC=DC THEN %890-07036300
$VOID %890-07036310
TALLY:=4; 07036320
$ VOID 07036351 %890-07036330
END END END; %890-07036390
END;% 07036400
X ~ TALLY;% 07037000
END;% 07038000
END ELSE P(0);% 07039000
PTYPE:=P; 07039100
IF PTYPE=6 THEN BEGIN PTYPE:=3; CONTINUE:=TRUE END 07039200
ELSE CONTINUE:=FALSE; 07039300
IF PTYPE=7 THEN PTYPE:=ADECK; 07039410
IF PTYPE = 4 THEN %890-07039500
BEGIN PTYPE:=0; EBCDIC:=TRUE; %890-07039600
EBTABLEADR:=SETUPEBTABLE; %890-07039700
END; %890-07039800
PACKETCARD:=PTYPE; 07040000
END;% 07041000
$ POP OMIT 07041001
$ SET OMIT = PACKETS 07041099
REAL SUBROUTINE ADR;% 07042000
BEGIN IF (T2 ~ H[(T1 ~ R DIV 200)+10]) = 0 THEN% 07043000
BEGIN H[9] ~ T1+1;% 07044000
H[T1+10] ~ T2 ~ GETUSERDISK(200);% 07045000
END;% 07046000
ADR ~ R MOD 200+T2% 07047000
END;% 07048000
SUBROUTINE INPUT;% 07049000
BEGIN% 07050000
IF IU < 16 THEN% 07051000
$ SET OMIT = NOT(PACKETS) 07051099
BEGIN 07051100
INPUTL: T ! WAITIO (@120540000000 + INBUFF, 07051110
@6000040, IU); 07051120
IF T=@40 THEN GO TO INPUTL; 07051130
IF T!0 THEN 07051140
BEGIN 07051150
P(DEL); 07051160
GO TO ERROR 07051170
END; 07051180
$ POP OMIT 07051181
$ SET OMIT = PACKETS 07051999
Q ~ M[INBUFF-1]=9;% 07057000
END% 07058000
ELSE BEGIN WHILE(Q:=WAITIO(@40000000+INBUFF+ %890-07059000
EBCDIC|@400000001,FIRST|4+ %890-07059010
@4000000,IU).[45:1] DO 07059100
IF FIRST AND CDONLY AND NOT CONTINUE THEN %654-07059110
GO EXIT ELSE %654-07059112
BEGIN SLEEP([TOGLE],STATUSMASK); 07059200
RRRMECH~RRRMECH AND NOT Q~TWO(IU); 07059300
READY~READY AND NOT Q; 07059400
SLEEP([READY],Q); 07059500
END; 07060000
IF EBCDIC THEN EBCDICCONVERT(INBUFF, %890-07060100
EBTABLEADR,EBTABLEADR+40) ELSE %890-07060200
IF Q ~ Q ! 0 THEN 07061000
BEGIN S:=(T:=UNIT[IU]).[FF]; 07062000
RETURNIOSPACE(S); 07063000
UNIT[IU] ~ T&@77777[5:20:28]; 07065000
END;% 07066000
STREAM(QMK:=12:BCL:=1-EBCDIC,INBUFF); %890-07066100
BEGIN %890-07066200
SI:=INBUFF; %890-07066300
BCL (IF SC=""" THEN JUMP OUT TO L1); 07066350
IF SC=@14 THEN %890-07066400
L1: BEGIN SI:=LOC QMK;SI:=SI+7; %890-07066500
DS:=1 CHR; %890-07066550
TALLY:=1; %890-07066600
SI:=INBUFF; %890-07066610
2(36(IF SC=">" THEN %890-07066620
BEGIN INBUFF:=SI; DI:=INBUFF; %890-07066630
DS:=LIT "="; %890-07066635
END; %890-07066640
IF SC="}" THEN %890-07066650
BEGIN INBUFF:=SI; DI:=INBUFF; %890-07066660
DS:= LIT """ %890-07066665
END; SI:=SI+1;)) %890-07066670
END; %890-07066700
QMK :=TALLY; %890-07066800
END; %890-07066850
Q:=P OR Q; %890-07066900
T = 0;% 07067000
END;% 07068000
END INPUT; % -07069000
%---------------- COM23 ------------------- -07069200
$ SET UP INPUT VARIABLES% 07071000
IF CDONLY:=(PRT[P1MIX,@25]>22) THEN 07072000
BEGIN IU:=PRT[P1MIX,@25]; 07072100
PRT[P1MIX,@25]:=0; % DISK 07072200
END ELSE 07072300
BEGIN IF (IU:=FINDINPUT("CONTROL","DECK ",0,0,0,0,0,0, 07072400
0,0)) LSS 0 THEN GO INITIATE; % BEEN DS-ED 07072500
IF IU GEQ 32 THEN P(XIT); % EOJ IF PSEUDODCK07072600
END; 07072700
STARTIMING(0,IU); 07073000
FPB:=PRT[P1MIX,3]; 07073500
$ SET OMIT = PACKETS 07073999
IF NOT(JAR[P1MIX,9].[2:1]) THEN % DONT SUPPRESS MESSAGE 07074090
FILEMESSAGE(" IN "&TINU[IU][6:30:18],0, 07074100
"CONTROL","DECK ",0,0,0,OPNMESS); 07074200
RDCTABLE[IU].[8:6] ~ P1MIX;% 07075000
IF IU LSS 16 THEN BEGIN% 07076000
FPB[3].[23:1]:=1; %SET INPUT FLAG FOR LOG 07076010
T ~ WAITIO(@540000005,0,IU)% 07077000
END% 07077010
ELSE IF IU=23 AND READERA NEQ 0 THEN 07078000
BEGIN FORGETSPACE(READERA-2);% 07079000
READERA ~ 0;% 07080000
END% 07081000
ELSE IF IU=24 AND READERB NEQ 0 THEN 07082000
BEGIN FORGETSPACE(READERB-2);% 07083000
READERB ~ 0;% 07084000
END;% 07085000
$ VOIDT %890-07086000
FIRSTCARD ~ GETSPACE(10,CONTROLCARDAREAV,1)_2);% %167-07087000
% SET UP OUTPUT VARIABLES% 07088000
IF PRT[P1MIX,@25] THEN% 07089000
BEGIN OU ~ LABELASCRATCH(T ~% 07090000
TAPELABEL("CONTROL","DECK ",1,1,100));% 07091000
IF OU<0 THEN GO INITIATE; %BEEN DS-ED 07091100
FORGETSPACE(I);% 07093000
FPB[3].[23:1]:=0; %SET OUTPUT FLAG FOR LOG 07093010
END% 07094000
ELSE BEGIN OUTBUFFOLD ~ OUTBUFF ~% %167-07095000
GETSPACE(60,IOBUFERAREAV,1)+2;% %167-07095100
RESERVE ~ GETSPACE(30,0,1)+2;% 07096000
H := SAVEARRAYDESC(30,DISKHEADERAREAV); %167-07097000
OU ~ 18;% 07098000
INBUFF ~ GETSPACE(21,IOBUFFERAREAV,1) + 2; %892-07101000
END;% 07103000
STARTIMING(5,OU); 07104000
FPB:=PRT[P1MIX,3]; % STARTIMING MAY HAVE MOVED IT. 07104500
$ SET OMIT = NOT(PACKETS) 07105499
VERYFIRST~1;% 07105500
$ POP OMIT 07105501
% BEGIN ONE DECK% 07106000
AGAIN: OUTBUF ~ OUTBUFFOLD;% 07107000
L ~ N ~ 0;% 07108000
$ SET OMIT = NOT(PACKETS) 07108099
ADECK ~ 0; FIRSTORSEC ~ %178-07108100
$ POP OMIT 07108101
FIRST ~ D ~ 1; 07109000
IF OU = 18 THEN% 07110000
BEGIN H[ 9] ~ 0;% 07111000
MOVE(20,[H[9]],[H[10]]); 07112000
H[8]~200; 07112100
END;% 07113000
% BEGIN ONE CARD% 07114000
INL: 07115000
$ SET OMIT = NOT(PACKETS) 07115099
IF PTYPE NEQ 3 OR VERYFIRST THEN 07115100
$ POP OMIT 07115101
INPUT; 07115200
$ SET OMIT = NOT(PACKETS) 07115499
IF FIRSTORSEC THEN% 07115500
$ POP OMIT 07115501
IF FIRST THEN% 07116000
BEGIN 07117000
$ SET OMIT = NOT(PACKETS) 07117099
PLUGGED:=VERYFIRST; 07117100
$ POP OMIT 07117101
$ SET OMIT = PACKETS 07117199
MOVE(10,INBUFF,FIRSTCARD);% 07118000
$ SET OMIT = NOT(PACKETS) 07118099
IF PACKETCARD=5 THEN %124-07118500
IF OU<16 THEN FIRST:=VERYFIRST:=0 ELSE 07118510
GO TO EXIT ELSE 07118520
IF PTYPE!3 OR CONTINUE THEN 07118550
BEGIN 07118600
ADECK:=1; GO DK; 07118690
END; 07118700
END ELSE% THIS MUST BE THE SECOND CARD IN 07119000
$ POP OMIT 07119001
$ SET OMIT = PACKETS 07119009
$ SET OMIT = NOT(PACKETS) 07119099
DK: IF Q THEN FIRSTORSEC:=0 ELSE%BAD SEC./FIRST 07119100
BEGIN VERYFIRST+4; % CARD 07119200
GO TO ERROR;% 07119300
END;% INV DECK SET-UP 07119400
$ POP OMIT 07119401
IF T NEQ 0 THEN 07120000
$ SET OMIT = NOT(PACKETS) 07120009
IF PTYPE NEQ 3 OR VERYFIRST THEN 07120010
$ POP OMIT 07120011
GO TO ERROR; 07120020
BOMBTIME;% 07121000
IF OU < 16 THEN % OUTPUT TO TAPE ( OU = 18 NORMALLY) -07122000
BEGIN 07122010
$ SET OMIT = NOT(PACKETS) 07122999
PLUGGED ~ VERYFIRST OR (PACKETCARD!3) 07123500
OR FIRST; 07124000
IF PLUGGED THEN 07124500
$ POP OMIT 07124501
T~WAITIO(INBUFF&@5000[18:33:15] 07125000
&(10-Q)[8:38:10],0,OU); 07125500
$ SET OMIT = PACKETS 07125599
$ SET OMIT = NOT(PACKETS) 07125999
IF VERYFIRST THEN VERYFIRST~PTYPE~0; 07126000
IF FIRST THEN FIRST~PTYPE~0; 07126500
IF PTYPE=0 THEN GO TO INL; 07127000
$ POP OMIT 07127001
M[INBUFF-1] ~ @1737000000000000; 07127500
T ~ WAITIO(INBUFF-1,0,OU); 07128000
SUPER:: 07129000
$ SET OMIT = NOT(PACKETS) 07129099
IF PTYPE=5 THEN GO TO EXIT; 07129100
IF PTYPE=1 THEN VERYFIRST:=TRUE; 07129200
GO TO AGAIN; 07129300
$ POP OMIT 07129301
$ SET OMIT = PACKETS 07129999
END;% 07139000
IF D = 0 THEN SLEEP([D],NOT 0); 07139500
$ SET OMIT = NOT(PACKETS) 07139509
IF PACKETCARD NEQ 0 AND NOT(ADECK AND PTYPE=1) THEN 07139510
BEGIN IF NOT(PLUGGED OR FIRST) THEN% 07139511
BEGIN STREAM(D~OUTBUFF); BEGIN DS~27 LIT 07139512
"CC END...IN CASE YOUR FORGOT";DS~45LIT" " END; 07139513
IF PTYPE = 3 AND NOT CONTINUE AND NOT ADECK THEN %124-07139520
BEGIN STREAM(FIRSTCARD,T!T!SPACE(13)); 07139530
BEGIN DS~24LIT"#NO PACKEND CARD, PKT - "; SI~FIRSTCARD; 07139540
DS!9 WDS; DS~LIT"~"; 07139550
END; 07139560
SPOUT(T); 07139565
END; 07139570
END ELSE MOVE(10,INBUFF,OUTBUFF);% 07139575
END ELSE% 07139590
$ POP OMIT 07139591
MOVE(10,INBUFF,OUTBUFF);% 07140000
$ SET OMIT = NOT(PACKETS) 07140099
IF VERYFIRST THEN PLUGGED~0;% 07140100
$ POP OMIT 07140101
IF Q THEN% 07141000
BEGIN IF L DIV 6 ! N DIV 6 THEN% 07142000
BEGIN R ~ L DIV 3;% 07143000
A ~ ADR;% 07144000
DISKIO(T,1-RESERVE,30,A);% 07145000
SLEEP([T],IOMASK);% 07146000
M[I~L MOD 3|10+9+RESERVE] ~ N;% 07147000
DISKIO(T,RESERVE-1,30,A);% 07148000
SLEEP([T],IOMASK);% 07149000
END% 07150000
ELSE M[I ~(L-N)|10+9+OUTBUFF] ~ N;% 07151000
L ~ M[OUTBUFF+9] ~ N;% 07152000
END;% 07153000
IF N = 12000 THEN% 07154000
BEGIN I ~ SPACE(14);% 07155000
STREAM(FIRSTCARD,T); 07156000
BEGIN DS ~ 32 LIT% 07157000
$ SET OMIT = NOT(PACKETS) 07157099
"#MORE THAN 12000 CARDS IN PKT - "; 07157100
$ POP OMIT 07157101
$ SET OMIT = PACKETS 07157999
SI~FIRSTCARD;DS~9WDS;DS~LIT "~"; 07159000
END;% 07160000
GO TO SKIPIT; 07161000
END;% 07162000
IF (N ~ N+1) MOD 6 = 0 THEN% 07163000
BEGIN R ~ N DIV 3-2;% 07164000
A ~ ADR;% 07165000
OUTBUFF ~ OUTBUFFOLD;% 07166000
DISKIO(D,OUTBUFF-1,60,A); 07167000
END ELSE OUTBUFF ~ OUTBUFF+10;% 07169000
$ SET OMIT = NOT(PACKETS) 07169099
IF FIRST THEN FIRST~PTYPE~0;% 07169100
IF VERYFIRST THEN VERYFIRST:=PTYPE:=0; 07169110
$ POP OMIT 07169201
$ SET OMIT = NOT(PACKETS) 07169499
IF PTYPE=0 THEN GO INL; 07169500
$ POP OMIT 07169501
$ SET OMIT = PACKETS 07169999
IF D = 0 THEN SLEEP([D],NOT 0); 07171000
OUTBUFF ~ OUTBUFFOLD;% 07173000
R ~ N DIV 6|2;% 07174000
A ~ ADR;% 07175000
IF N MOD 6 ! 0 THEN 07175100
BEGIN 07175200
DISKIO(T,OUTBUFF-1,60,A);% 07176000
SLEEP([T],IOMASK);% 07177000
END;% 07178000
IF R+2 < 200 THEN 07178100
BEGIN H[8] ~ R+2; 07178200
FORGETUSERDISK(A+2,R-198); 07178300
END; 07178400
H[7]~N-1; 07179000
H[4]~H[6]~0; 07179050
H[5]:= -0; 07179100
$ SET OMIT = NOT(PACKETS) 07179199
H[6]~0&DISKCHAIN[CTF]&(IF IU<23 THEN 2 ELSE IU-23) 07179200
[2:42:6]; 07179202
IF CONTINUE THEN 07179205
BEGIN 07179210
H[2]:=NEXTCDNUM(1); 07179220
DISKCHAIN:=GETESPDISK; 07179230
DISKWAIT(H INX 0,30,DISKCHAIN); 07179250
STREAM(A:=H[2],B:=FIRSTCARD,INBUFF); 07179260
BEGIN SI:=B; DS:=8 CHR;DS:=15 LIT" CONTINUES PKT#"; 07179270
DS:=15 LIT" CONTINUES PKT#"; 07179280
SI:=LOC A; SI:=SI+4; DS:=4 CHR; DS:=LIT":"; 07179290
END; 07179300
END ELSE 07179310
BEGIN DISKCHAIN:=0; 07179320
$ POP OMIT 07179321
ENTERCONTROLDECK(H); 07180000
$ SET OMIT = NOT(PACKETS) 07180009
END; 07180010
$ POP OMIT 07180011
GO TO SUPER; 07181000
ERROR: T ~ SPACE(12);% 07214000
$ SET OMIT = NOT(PACKETS) 07214099
STREAM(FIRSTCARD,X~VERYFIRST,T);% 07214100
BEGIN SI~LOC X; SI~SI+7; IF SC="2" THEN 07214110
DS~16 LIT "#INV PKT CARD - "% 07214120
ELSE IF SC="4" THEN% 07214130
DS~16 LIT "#INV DECK,PKT - "% 07214140
ELSE DS~16 LIT "#READ ERR,PKT - ";% 07214150
$ POP OMIT 07214151
$ SET OMIT = PACKETS 07214999
SI ~ FIRSTCARD; DS ~ 9 WDS; DS ~ LIT "~";% 07217000
END;% 07218000
SKIPIT: SPOUT(T); 07219000
DO BEGIN INPUT;% 07220000
VOMVRIMW;% 07221000
$ SET OMIT = PACKETS 07221999
$ SET OMIT = NOT(PACKETS) 07222099
END UNTIL PACKETCARD NEQ 0; 07222100
$ POP OMIT 07222101
IF OU < 16 THEN% 07223000
BEGIN DO BEGIN T ~ WAITIO(@340000005,@60,OU);% 07224000
BOMBTIME;% 07225000
END UNTIL T.[42:1];% 07226000
T ~ WAITIO(@140000005,@60,OU);% 07227000
END;% 07228000
ELSE FORGETIT;% 07229000
GO TO SUPER;% 07230000
BOMB:: IF OU=18 THEN FORGETIT;% %164-07231000
EXIT: SLEEP([TOGLE]),STATUSMASK); 07232000
IF IU GEQ 23 THEN UNITCODE[IU-23]:=-0; 07232500
S ~ IU; T ~ 3; STOP;% 07233000
S ~ OU; T ~ 8; STOP;% 07234000
FORGETSPACE(INBUFF);% 07235000
FORGETSPACE(FIRSTCARD);% 07236000
IF OU > 16 THEN% 07237000
BEGIN FORGETSPACE(H);% 07238000
FORGETSPACE(OUTBUFFOLD);% 07239000
FORGETSPACE(RESERVE);% 07240000
END;% 07241000
END COM23;% 07242000
PROCEDURE STARTLOADN(KTR); VALUE KTR; REAL KTR;% 07243000
BEGIN REAL HDR,SEG0,I,F,T,C; ARRAY SHEAT[*]; 07244000
LABEL TRYAGAIN,LDCNTRL,DISK; 07244100
STREAM(K~0:KTR);% 07245000
BEGIN SI ~ KTR;% 07246000
L: IF SC = " " THEN% 07247000
BEGIN SI ~ SI+1; GO TO L END;% 07248000
DI ~ LOC K; DI ~ DI+6; DS ~ 2 CHR;% 07249000
END;% 07250000
C ~ P;% 07251000
T ~ KTR.[15:15]-1;% 07252000
IF (C NEQ "MT" AND C NEQ "DK") OR 07253000
(C = "DK" AND CDONLY ) THEN 07253100
SPOUT(T INX M[T-1]) 07254000
ELSE BEGIN C ~ C = "MT";% 07255000
TRYAGAIN: 07255100
IF (HDR:=DIRECTORYSEARCH(P(LDCNTRL),P(DISK),3)) ! 0 THEN 07256000
BEGIN 07256200
SHEAT := [M[F:=TYPEDSPACE(31,SHEETAREAV)]] & 30[8:38:10];%07256400
STREAM(S:=F-1, D:=F); % ZERO OUT THE SHEAT ENTRY 07256600
BEGIN 07256800
SI:=S; DS:=30 WDS; 07257000
END; 07257200
SEG0 := TYPEDSPACE(30,SEGZEROAREAV);% %167-07257400
DISKWAIT(-SEG0, 30, M[HDR INX 10]); 07257600
F.[FF] := HDR; % CORE ADDRESS OF HEADER IN [FF] OF PARAM. 07257800
SHEAT[7] := SEG0; % CORE ADRS.OF SEGMENT ZERO IN SHEAT[7]07258000
SHEAT[0] := P(LDCNTRL); 07258200
SHEAT[1] := P(DISK); 07258400
SHEAT[2] := 0 & LDCNTRLCODE[5:45:3] & 2[8:38:10]; 07258600
% [4:1] IN SHEET[2] MEANS SUPRESS BOJ/EOJ MESSAGES 07258800
SHEAT[16] := SHEAT[17] := @377777777777; % TIME LIMITS 07259000
SHEAT[19] := C; % COMMON VALUE 07259200
SHEAT[20] := 4; % CORE ESTIMATE 07259400
SHEAT[21] := 150; % STACK SIZE 07259600
07259800
STREAM(A:=0 : S := P(.SCHEDULEIDS)); 07260000
BEGIN 07260200
SI:=S; 07260400
47(SKIP SB; SKIP DB; TALLY:=TALLY+1; 07260600
IF SB THEN ELSE JUMP OUT); 07260800
DS:=SET; A:=TALLY; 07261000
END STREAM STATEMENT; 07261200
07261400
I := P; 07261600
SHEAT[3].[8:10] := 1; % SCHEDULE NUMBER 07261800
SHEAT[23] := (CLOCK + P(RTR)) DIV 60; 07262000
SHEAT[24] := MCP; %131-07262100
SHEAT[25] := HDR.[FF]; % DISK ADDRESS OF FILE HEADER 07262200
STREAM(C, T); 07262400
BEGIN 07262600
DI:=DI+16; 07262800
DS:=31LIT"CC EXECUTE LDCNTRL/DISK;COMMON="; 07263000
SI:=LOC C; DS:=8DEC; 07263200
DS:=6LIT";END.~"; 07263400
END STREAM STATEMENT; 07263600
M[T] := 0; M[T+1] := 10; 07263700
SHEAT[6] := GETESPDISK & 10[18:33:15]; 07263800
DISKWAIT(T, 11, SHEAT[6].[CF]); 07264000
FORGETSPACE(T); 07264200
INDEPENDENTRUNNER(P(.SELECTRUN),F,160); 07264400
END ELSE % IF IN DIRECTORY 07265000
BEGIN 07265100
ENTERSYSFILE(2); 07265200
GO TRYAGAIN; 07265300
LDCNTRL::: "LDCNTRL"; 07265400
DISK::: "DISK "; 07265500
END; 07265600
END;% 07266000
END;% 07267000
PROCEDURE TABLEOFCONTENTS(B,COUNT);% 07268000
VALUE B,COUNT; REAL B,COUNT;% 07268100
BEGIN REAL I,T,NA,TUSTA,TU,BU; 07269000
$ SET OMIT = NOT(PACKETS) 07269099
REAL FIRST,START,FINAL,PKTCT;% 07269100
$ POP OMIT 07269101
LABEL L,EXIT,G;% 07270000
$ SET OMIT = NOT(SHAREDISK) 07270099
A:=B.[15:15]-1; 07271900
TUSTA:=M[A-1]; 07272000
LOCKCONTROLDECKS; 07272500
A:=FIRSTDECK; 07273000
$ SET OMIT = NOT(PACKETS) 07273099
FIRST~1;% 07273100
$ POP OMIT 07273101
L: I:=SPACE(14) INX TUSTA; 07274000
G: IF A = 0 THEN GO TO EXIT;% 07275000
DISKWAIT(-1,12,A); 07276000
A:=M[I+6].[CF]; 07278000
$ SET OMIT = NOT(DATACOM AND RJE ) 07278499
$ SET OMIT = NOT(SHAREDISK) 07279000
N ~ M[I+2];% 07281000
$ SET OMIT = NOT(PACKETS) 07281099
IF NOT COUNT THEN% 07281100
BEGIN% 07281200
$ POP OMIT 07281201
DISKWAIT(-I-4,9,M[I+10]); 07282000
STREAM(N,T,TU,BU,I); 07284000
BEGIN SI ~ LOC N; SI ~ SI+1;% 07285000
$ SET OMIT = NOT(PACKETS) 07285099
DS:=8 LIT " PACKET ";DS:=5 CHR; 07285100
$ POP OMIT 07285111
$ SET OMIT = PACKETS 07285999
$ SET OMIT = NOT(SHAREDISK) 07286100
$ SET OMIT = SHAREDISK 07286400
DS:=8 LIT" "; 07286500
$ POP OMIT 07286501
$ SET OMIT = NOT(PACKETS) 07286509
DS:=3 LIT " ="; 07286510
$ POP OMIT 07286511
$ SET OMIT = NOT(RJE AND DATACOM ) 07286599
DS:=8 LIT " "; 07286800
NEX: 07286900
$ SET OMIT = PACKETS 07286999
$ SET OMIT = NOT(PACKETS) 07288099
DI:=DI+40;DI:=DI+19;DS:=LIT"~"; 07288100
$ POP OMIT 07288101
END;% 07289000
SPOUT(I);% 07290000
$ SET OMIT = NOT(PACKETS) 07290099
END ELSE% 07290100
BEGIN% OPERATOR WANTS A COUNT 07290200
IF FIRST THEN BEGIN% STORE FIRST DECK #. 07290300
FIRST~0; START~N;% 07290400
END;% 07290500
PKTCT~PKTCT+1; FINAL~N;% 07290600
FORGETSPACE(I);% 07290650
END;% 07290700
$ POP OMIT 07290701
GO TO L;% 07291000
EXIT:IF N=0 THEN 07292000
BEGIN STREAM(I); 07293000
$ SET OMIT = NOT(PACKETS) 07293099
DS:=20 LIT " NO PACKETS ON DISK~"; 07293100
$ POP OMIT 07293101
$ SET OMIT = PACKETS 07293199
SPOUT(I);% 07294000
$ SET OMIT = PACKETS 07294899
$ SET OMIT = NOT(PACKETS) 07294999
END ELSE% CHECK FOR COUNT REQUEST. 07295000
IF COUNT THEN% 07295010
BEGIN;STREAM(C~PKTCT,S~START,% 07295020
F~FINAL,T1~0,T2~0,I);% 07295030
BEGIN DS~LIT " "; T2~DI;% 07295040
SI~LOC C; DI~LOC T1;% 07295050
DS~2 DEC; SI~LOC T1; DI~T2; 07295060
DS~2 CHR; T2~DI; DI~DI-2;% 07295070
DS~FILL; DI~T2;% 07295080
DS~7 LIT " PACKET";% 07295090
SI~LOC T1; %511-07295100
IF SC!"0" THEN GO TO AQ %511-07295102
ELSE SI~SI+I; %511-07295104
IF SC="1" THEN% ONLY 1 DECK %511-07295110
BEGIN DS~2LIT ", ";% 07295120
SI~LOC F; SI~SI+1;% 07295130
DS~5 CHR;% 07295140
END ELSE% MORE THAN 1 07295150
AQ: BEGIN DS~3 LIT "S, "; %511-07295160
SI~LOC S; SI~SI+1;% 07295170
DS~5 CHR;% 07295180
DS~6 LIT " THRU ";% 07295190
SI~SI+4; DS~4 CHR;% 07295200
END;% 07295210
DS~LIT "~"; 07295220
END;% 07295230
SPOUT(I);% 07295235
END ELSE FORGETSPACE(I);% 07295240
$ POP OMIT 07295241
UNLOCKCONTROLKECKS; 07296000
END;% 07297000
PROCEDURE REMOVEDECK(N,TUSTA);VALUE N,TUSTA;REAL N,TUSTA; 07298000
BEGIN REAL I,T,A,L1,J=I,L2,V;% 07299000
$ SET OMIT = NOT(PACKETS) 07299499
REAL L3; 07299500
LABEL FAIL,CONTINUE; 07299600
$ POP OMIT 07299601
LABEL L,EXIT,REMOVE;% 07300000
LOCKCONTROLDECKS; 07301000
IF (I ~ DIRECTORYSEARCH("DECK ",N,5)) = 0 THEN% 07303000
$ SET OMIT = NOT(PACKETS) 07303499
FAIL: 07303500
$ POP OMIT 07303501
BEGIN I ~ SPACE(5);% 07304000
STREAM(N,I);% 07305000
$ SET OMIT = NOT(PACKETS) 07305099
BEGIN DS:=5 LIT " PKT "; 07305100
$ POP OMIT 07305101
$ SET OMIT = PACKETS 07305999
SI ~ LOC N; SI ~ SI+1; DS ~ 5 CHR;% 07307000
DS ~ 13 LIT " NOT ON DISK~";% 07308000
END;% 07309000
GO TO EXIT;% 07310000
END;% 07311000
$ SET OMIT = NOT(SHAREDISK) 07311199
$ SET OMIT = NOT(PACKETS) 07311499
L3:=M[I+6].[FF]; 07311500
$ POP OMIT 07311501
L2:=M[I+6].[CF]; 07312000
IF (A:=FIRSTDECK)=(L1:=I.[FF]) THEN 07313000
BEGIN 07314000
$ SET OMIT = PACKETS 07314099
$ SET OMIT = NOT(PACKETS) 07314109
FIRSTDECK:=IF L3 NEQ 0 THEN L3 ELSE L2; 07314110
IF L2=0 THEN LASTDECK~IF L3 NEQ 0 THEN L3 ELSE 0; 07314120
$ POP OMIT 07314121
DISKWAIT(KLUMP,3,DIRECTORYTOP+3); 07314200
$ SET OMIT = NOT(PACKETS) 07314289
IF L3 NEQ 0 THEN GO TO CONTINUE ELSE 07314290
$ POP OMIT 07314291
GO TO REMOVE; 07314300
END; 07314400
J ~ I.[33:15];% 07315000
L: 07316000
DISKWAIT(-J,30,A); 07317000
IF (V:=M[J+6].[CF])=0 THEN 07318000
$ SET OMIT = NOT(PACKETS) 07318009
IF A=L1 THEN GO REMOVE ELSE BEGIN FORGETSPACE(I); GO FAIL 07318010
END; 07318012
$ POP OMIT 07318013
$ SET OMIT = PACKETS 07318019
IF V ! L1 THEN% 07319000
BEGIN A ~ V; GO TO L END;% 07320000
$ SET OMIT = PACKETS 07320999
$ SET OMIT = NOT(PACKETS) 07321099
M[J+6].[CF]~IF L3!0 THEN L3 ELSE L2; 07321100
$ POP OMIT 07321101
DISKWAIT(J,30,A); 07322000
IF L2 = 0 THEN% 07324000
BEGIN 07325000
$ SET OMIT = PACKETS 07325999
$ SET OMIT = NOT(PACKETS) 07326099
LASTDECK:=IF L3 NEQ 0 THEN L3 ELSE A; 07326100
$ POP OMIT 07326101
DISKWAIT(KLUMP,3,DIRECTORYTOP+3); 07327000
$ SET OMIT = PACKETS 07327999
$ SET OMIT = NOT(PACKETS) 07329999
END ELSE IF L3=0 THEN ELSE 07330000
CONTINUE: 07330050
BEGIN J~I INX 0; 07330100
DISKWAIT(-J,30,L3); 07330200
M[J+6].[CF]~L2; 07330300
DISKWAIT(J,30,L3); 07330400
END; 07330500
$ POP OMIT 07330501
REMOVE: 07331000
FORGETSPACE(I); 07332000
I:=DIRECTORYSEARCH("DECK ",N,8).[CF]; 07333000
T ~ M[I+9];% 07343000
FOR V ~ 1 STEP 1 UNTIL T DO% 07344000
IF M[I+V+9]!0 THEN FORGETUSREDISK(M[I+V+9],M[I+8]); 07345000
STREAM(N,I);% 07346000
$ SET OMIT = NOT(PACKETS) 07346099
BEGIN DS:=5 LIT " PKT "; 07346100
$ POP OMIT 07346101
$ SET OMIT = PACKETS 07346999
SI ~ LOC N; SI ~ SI+1; DS ~ 5 CHR;% 07348000
DS ~ 9 LIT " REMOVED~";% 07349000
END;% 07350000
$ SET OMIT = PACKETS 07350099
EXIT: SPOUTER(I&TUSTA[9:9:9],TUSTA,LIBMSG) 07351000
$ SET OMIT = PACKETS 07351099
;UNLOCKCONTROLDECKS; 07352000
END;% 07353000
PROCEDURE DECKREMOVER(B); BALUE B; REAL B;% 07354000
BEGIN REAL K,N,F;% 07355000
INTEGER U; LABEL ON,ERR; 07355100
REAL D; 07355200
LABEL L,TRYIT,GIVEUP; 07356000
K ~ B.[15:15]-1;% 07357000
L: STREAM(X~12,B:A~0);% 07358000
BEGIN SI ~ B;% 07359000
U: IF SC = " " THEN BEGIN SI~SI+1; GO TO U END;% 07360000
IF SC="=" THEN BEGIN DI~LOC X; DI~DI+6; DS~CHR; 07360100
SI~SI-1; B~SI; GO TO E END;07360200
IF SC = "#" THEN SI:=SI+1; 07361000
BL: IF SC=" " THEN BEGIN SI:=SI+1;GO TO BL; END; 07361500
DI:=LOC X; DI:=DI+1; DS:=5 LIT "#0000"; 07362000
4(IF SC < "0" THEN JUMP OUT TO EN; 07363000
IF SC > "9" THEN JUMP OUT TO EN; 07364000
SI:=SI+1; TALLY:=TALLY+1); 07365000
EN: A:=TALLY; SI:=SI-A; DI:=DI-A; DS:=A CHR; 07365500
N: IF SC = " " THEN BEGIN SI~SI+1; GO TO N END;% 07366000
DS ~ CHR; B ~ SI;% 07367000
E: END;% 07368000
P(.B,~,.N,~);% 07369000
F~N.[36:6]; N.[36:6]~"~"; 07370000
IF F="~" OR F="," OR F="=" THEN 07371000
BEGIN IF F="=" THEN 07371100
BEGIN IF D=0 THEN D~SPACE(30); 07371200
LOCKCONTROLDECKS; 07371300
IF (N:=FIRSTDECK)=0 THEN 07371400
GIVEUP: 07371450
BEGIN F:="~"; 07371500
UNLOCKCONTROLDECKS; 07371600
GO ON; 07371700
END; 07371750
TRYIT: DISKWAIT(-D,30,N); 07371800
$ SET OMIT = NOT(SHAREDISK) 07371809
N:=M[D+2]; 07371900
UNLOCKCONTROLDECKS; 07371950
END; 07372000
FOR U ~ 0 STEP 1 UNTIL PSEUDOMAX DO 07372090
IF CIDROW[U]!0 THEN 07372100
IF(CIDTABLE[U,2] EQV N)=NOT 0 THEN 07372200
IF LABELTABLE[U+32]}0 07372300
$ SET OMIT = NOT(PACKETS) 07372309
AND LABELTABLE[U+32]!@214 AND 07372310
PACKETACT[U]=0 07372320
$ POP OMIT 07372321
THEN 07372330
BEGIN 07372400
ENDOFDECK(U,M[K-1]); 07372500
GO ON; 07372600
END ELSE GO TO ERR; 07372700
REMOVEDECK(N,M[K-1]); 07372800
ON: IF F!"~" THEN GO TO L; 07372900
FORGETSPACE(K);% 07373000
END ELSE 07374000
ERR: SPOUT(K INX M[K-1]); 07374100
IF D!0 THEN FORGETSPACE(D); 07374200
END;% 07375000
BOOLEAN PROCEDURE READEMFROMDISK(H,IB);% 07376000
VALUE H,IB; ARRAY H[*],IB[*];% 07377000
BEGIN% 07378000
% H[0] = ADDRESS OF BU+1 (B)% 07379000
% H[1] = ADDRESS OF B2+1% 07380000
% H[2] = DECK NAME% 07381000
% H[3] = RECORDCOUNT (N)% 07382000
% H[4] = NEXT CONTROL CARD (L)% 07383000
% H[5] = RECORDS USED IN THIS BLOCK | 10 (R)% 07384000
% H[7] - H[30] ARE FILE HEADER% 07385000
REAL A,B;% 07386000
DEFINE N=H[3]#,L=H[4]#,R=H[5]#;% 07387000
INTEGER I=A; DEFINE MOM=CIDROW[M[B]]#; 07388000
$ SET OMIT = NOT(BREAKOUT) 07388010
B ~ H[0];% 07389000
IF R = 0 THEN% 07390000
IF (M[B-2] AND IOMASK) = 0 THEN% 07391000
SLEEP([M[B-2]],IOMASK);% 07392000
STREAM(B!B+R,IB);% 07393000
BEGIN SI ~ B; DS ~ 10 WDS END;% 07394000
M[IB INX NOT 0] ~ 10; 07394500
IF (READEMFROMDISK ~ N=L) THEN% 07395000
L ~ IB[9];% 07396000
IF (A:=N:=*P(DUP)+1) > (H[7]+1) THEN %639-07397000
BEGIN READEMFROMDISK:=1; 07398000
STREAM(IB); 07398100
BEGIN 07398200
$ SET OMIT = NOT(PACKETS) 07398299
DS:=8LIT" "; SI:=IB; DS:=8 WDS; DI:=IB; 07398300
$ POP OMIT 07398301
DS:=5LIT"-END."; DI:=DI-5; DS:=RESET; 07398400
END; 07398500
END 07398600
ELSE BEGN IF (R ~ *P(DUP)+10) = 30 THEN% 07399000
BEGIN IB ~ [M[B-2]];% 07400000
R ~ 0; 07400400
A ~ A DIV 3+1; 07400500
I~H[A DIV H[8]+10]+A MOD H[8]; 07401000
IF I>0 THEN % NEXT BUFF EXISTS %639-07401900
DISKIO(IB,1-B,30,I);% 07402000
H[0] ~ H[1];% 07403000
H[1] ~ B;% 07404000
END; END; END;% 07405000
BOOLEAN PROCEDURE PRINTORPUNCHWAIT(Q,PNCH);VALUE Q,PNCH;REAL Q,PNCH; 07405100
FORWARD; 07405110
PROCEDURE ENDOFDECK(R,TUSTA);VALUE R,TUSTA; REAL R,TUSTA; 07406000
BEGIN ARRAY H[*];% 07407000
REAL B,I;% 07408000
$ SET OMIT = NOT(PACKETS) 07408099
REAL DISKAD,PBREC,T,USERIO; % %750-07408100
$ POP OMIT 07408101
LABEL EXIT; 07408500
IF (H:=CIDROW[R])=0 THEN GO TO EXIT; 07409000
LABELTABLE[R+32] ~ @114; 07409100
MULTITABLE[R+32] ~ RDCTABLE[R+32] ~ 0; 07409200
USERID~UNITCODE[R+29]; % %750-07409250
UNITCODE[R+9]:=-0; 07409300
IF NOT TUSTA.[1:1] THEN REMOVEDECK(H[2],ABS(TUSTA)) ELSE 07410000
P(DIRECTORYSEARCH(-"DECK ",H[2],14),DEL);07410100
FOR I ~ 0 STEP 1 UNTIL 1 DO% 07411000
BEGIN B ~ H[I];% 07412000
IF (M[B-2] AND IOMASK) = 0 THEN 07413000
SLEEP([M[B-2]],IOMASK);% 07414000
END;% 07415000
IF CIDROW[R]=0 THEN GO TO EXIT; % FIXES TIMING PROB. 07415100
IF H.[18:15] ! 0 THEN 07416000
FORGETSPACE(H.[18:15]-2); 07417000
$ SET OMIT = NOT(PACKETS) 07417099
IF PACKETPBD[R] GEQ 11 THEN 07417100
BEGIN 07417200
PBCOUNT := PBCOUNT+1; 07417300
I := 001 & CIDTABLE[R,6][6:6:24]; 07417400
IF (PBREC := DIRECTORYSEARCH("PBD ",I,5))!0 THEN 07417500
BEGIN 07417600
IF PACKETPAGE[R]>1 THEN 07417700
BEGIN 07417800
PBREC := PBREC.[CF]; 07417900
T := M[PBREC+6]; 07418000
DISKAD := M[PBREC+10]+2; 07418100
DISKWAIT(-PBREC,30,DISKAD); 07418200
IF (M[PBREC+12] EQV (-"ABORTED"))=NOT 0 THEN 07418300
STREAM(B:=PBREC+11); 07418500
BEGIN 07418600
DS:=8LIT":|0|4000"; DS:=8LIT"0PACKET "; 07418700
END; 07418800
M[PBREC+15]~M[PBREC+27]~USERID; % %750-07418850
DISKWAIT(PBREC,30,DISKAD); 07418900
END; 07419000
P(DIRECTORYSEARCH(-"PBD ",1,14),DEL); 07419100
IF AUTOPRINT OR T0 THEN 07419200
P(PRINTORPUNCHWAIT(I,0&T[9:39:9[),DEL); 07419300
FORGETSPACE(PBREC); 07419400
END; 07419500
END; 07419600
PSEUDO[R] := 07419700
$ POP OMIT 07419701
CIDROW[R] := 0; 07419800
IF(RUNUMBER~RUNUMBER+1)>0 THEN 07420000
STARTADECK(IF TUSTA.[1:1] THEN -H[2] ELSE 0); 07420010
FORGETSPACE(H); 07420050
EXIT: 07420100
END;% 07421000
% PSEUDOCOPY DECLARATION MOVED TO 02347110 TO %541-07421500
% ALLOW ACCESS IN DRANO %541-07421505
PROCEDURE STARTADECK(N); VALUE N; REAL N; 07422000
BEGIN LABEL EXIT,L,POSSIBLE,NEXT;% 07423000
REAL I,R,T,A,S; 07424000
READ SDED; 07424100
ARRAY H[*];% 07425000
LABEL AGAIN,START; 07425500
START: 07425600
IF N.[1:1] THEN BEGN SDED~ABS(N); N~0 END; 07425700
LOCKCONTROLDECKS; 07426000
IF RUNUMBER LEQ 0 AND N=0 THEN GO TO EXIT; 07426100
AGAIN: 07427500
IF PSEUDOCOPY > 2 THEN% TOO MANY COPIES CONTROLCARD 07427600
IF STARTOG AND N=0 THEN GO TO EXIT % 07427610
ELSE BEGIN STARTOG ~ TRUE; 07427620
UNLOCKCONTROLDECKS; 07427625
COMPLEXSLEEP(PSEUDOCOPY { 2);% 07427630
STARTOG ~ FALSE;% 07427640
GO TO START;% 07427645
END;% 07427650
FOR R ~ 0 STEP 1 UNTIL PSEUDOMAX DO 07428000
IF CIDROW[R] = 0 THEN GO TO POSSIBLE;% 07429000
STREAM(S~S~SPACE(4)); 07429100
DS:=27 LIT" ALL PSEUDO-READERS IN USE~"; 07429200
SPOUT(S); 07429300
GO TO EXIT;% 07430000
POSSIBLE:% 07431000
IF (A:=FIRSTDECK)=0 THEN GO TO EXIT; 07432000
LABELTABLE[R+32]:=@114; 07432100
W~CIDROW[R]~[M[S~GETSPACE(94,20,1)+2]]&94[8:38:10]; 07433000
M[S-2].[9:6] ~ 0; H[2] ~ 0;% 07434000
L: DISKWAIT(-S,30,A); 07435000
IF N!0 THEN 07436000
BEGIN 07436100
IF H[2].[12:24]~N THEN GO TO NEXT; 07436200
IF H[4].[2:1] THEN 07436300
BEGIN 07436400
STREAM(A:=[H[2]], 07436500
$ SET OMIT = NOT(SHAREDISK) 07436509
S); 07436520
$ SET OMIT = PACKETS 07436599
$ SET OMIT = NOT(PACKETS) 07436609
BEGIN SI:=A;SI:=SI+1;DS:=5 LIT" PKT "; 07436610
$ POP OMIT 07436611
SI:=5 CHR;DS:=7LIT" IN USE"; 07436700
$ SET OMIT = NOT(SHAREDISK) 07436799
DS:=LIT"~"; 07437000
END; 07437100
SPOUT(S); 07437200
CIDROW[R]:=0; 07437300
GO TO EXIT; 07437400
END; 07437500
END ELSE 07437600
IF H[4].[2:1] OR (SDED!0 AND H[2]=SDED) 07437800
$ SET OMIT = NOT(SHAREDISK) 07437899
THEN GO TO NEXT; 07438000
H[4]:=(*P(DUP))&2[2:46:2]&SYSNO[4:46:2]; 07438100
DISKWAIT(S,30,A); 07438200
$ SET OMIT = NOT (DATACOM AND RJE) 07438250
H[0] ~ S+32;% 07441000
H[1] ~ S+64;% 07442000
T ~ [H[30]]; DISKIO(T,1-H[0],30,H[10]);% 07444000
IF H[7] LSS 3 THEN H[62]:=IOMASK ELSE 07445000
BEGIN T:=[H[62]]; IF H[8]=1 THEN 07445100
DISKIO(T,1-H[1],30,H[11]) ELSE 07445200
DISKIO(T,1-H[1],30,H[10]+1); 07445300
END; 07445400
T:=GTSPACE(13,20,0)+4; 07446000
$ SET OMIT = NOT(BREAKOUT) 07446010
M[T INX 10] := H[5]; 07446100
$ SET OMIT = NOT(PACKETS) 07446149
T.[24:6]+H[6].[2:6]; 07446150
$ POP OMIT 07446151
H[3] := H[4] := H[5] := H[6] := 0; 07446200
M[T-4].[9:6] ~ 0;% 07447000
LABELTABLE[R+32]~-@14; %LET IT BE MOVED 07448000
I~READEMFROMDISK(H,[M[T]]&10[8:38:10]); 07448500
INDEPENDENTRUNNER(P(.CONTROLCARD),T& 07449000
$ SET OMIT = NOT(DATACOM AND RJE ) 07449099
(R+32)[2:42:6],192); 07449200
PSEUDOCOPY ~ PSEUDOCOPY + 1;% 07449500
IF (RUNUMBER~RUNUMBER-1) LEQ 0 OR N!0 THEN GO TO EXIT; 07450000
GO TO AGAIN; 07450200
NEXT:IF (A:=H[6].[CF])!0 THEN GO TO L; 07451000
IF N!0 THEN 07452000
BEGIN 07452100
STREAM(N,S); 07452200
$ SET OMIT = PACKETS 07452299
$ SET OMIT = NOT(PACKETS) 07452309
BEGIN SI~LOC N; SI~SI+4; DS:=6 LIT" PKT #"; 07452310
$ POP OMIT 07452311
DS:=4 CHR;DS:=13 LIT" NOT ON DISK~"); 07452400
END; 07452500
SPOUT(S); 07452600
END ELSE FORGETSPACE(S); 07452700
CIDROW[R] ~ 0;% 07453000
EXIT: UNLOCKCONTROLDECKS; 07455000
END;% 07456000
PROCEDURE RUNTHEDECK(B);VALUE B; REAL B;% 07457000
BEGIN REAL I,J;% 07458000
STREAM(S:=0:B,A:=[I]); 07461000
BEGIN SI ~ B;% TO REAL IN I 07461100
L: IF SC=" " THEN BEGIN SI:=SI+1; GO TO L END; 07461120
IF SC="#" THEN 07461140
BEGIN 07461160
L1: SI:=SI+1; IF SC=" " THEN GO TO L1; 07461180
DS:=8 LIT"00000000"; 07461200
4(IF SC<"0" THEN JUMP OUT; 07461220
IF SC>"9" THEN JUMP OUT; 07461240
SI:=SI+1; TALLY:=TALLY+1); 07461260
S:=TALLY; SI:=SI-S; DI:=DI-S; DS:=S CHR; 07461280
TALLY:=1; 07461300
GO TO FX; 07461320
DS:=4 LIT"0000";DS:=4 CHR;TALLY:=1;GO TO EX; 07461330
END; 07461340
SI ~ SI + 1;% 07461400
IF SC { "9" THEN IF SC } "0" THEN GO TO TWO; 07461500
SI ~ SI - 1; DS ~ OCT;% 07461510
GO TO EX; 07461520
TWO: SI ~ SI - 1; DS ~ 2 OCT; 07461530
EX:S:=TALLY; 07461540
END; 07461550
J:=P; 07461560
B:=B.[15:15]-1; 07461570
IF J THEN 07461600
BEGIN 07461700
FORGETSPACE(B); 07461800
STARTADECK(I); 07461900
END ELSE 07462000
BEGIN 07462100
IF I GTR PSEUDOMAX1 THEN I:=NABS(RUNUMBER) ELSE 07462200
BEGIN 07462250
RUNUMBER:=I; 07462300
FOR J:=0 STEP 1 UNTIL PSEUDOMAX DO 07462400
RUNUMBER:=RUNUMBER-(CIDROW[J]!0); 07462500
END; 07462600
STREAM(X1:=1-I.[1:1],K2:=RUNUMBER.[1:1],I:=ABS(I),B);07463000
BEGIN CI:=CI+X1; GO L1; DS:=10LIT" WILL USE ";GO L2; 07464000
L1: CI:=CI+X2; GO L2; DS:=LIT"-"; L2: 07464100
SI:=LOC I;DS:=2 DEC; 07465000
DS ~ 13 LIT " PSEUDO-RDRS~"; 07466000
END;% 07467000
SPOUT(B INX M[B-1]); 07468100
IF RUNUMBER GTR 0 THEN STARTADECK(0); 07469000
END; 07472500
END;% 07473000
PROCEDURE EXTERNALEND(B); VALUE B; REAL B; 07473100
BEGIN REAL U; LABEL EXIT; 07474000
U ~ UNITIN(TINU,B); 07475000
B ~ B.[15:15]-1; 07476000
IF 32 { U AND U { PSEUDOMAXT THEN 07477000
IF LABELTABLE[U] } 0 THEN 07478000
$ SET OMIT = NOT(PACKETS) 07478099
IF LABELTABLE[U] NEQ @214 AND PACKETACT[U=32]=0 THEN 07478100
$ POP OMIT 07478101
IF CIDROW[U-32] ! 0 THEN 07478500
BEGIN 07479000
ENDOFDECK[U-32],M[B-1]); 07479100
FORGETSPACE(B); 07480000
GO TO EXIT; 07481000
END; 07482000
SPOUT(B INX M[B-1]); 07483000
EXIT:END; 07484000
PROCEDURE CHANGEPRIORITY(BUFF,MIX); VALUE BUFF,MIX; REAL BUFF,MIX; 07485000
BEGIN INTEGER PRIORITY; REAL B; 07486000
$ SET OMIT = NOT(PACKETS) 07486499
DEFINE UNITNO = PSEUDOMIX[MIX]#; 07486500
$ POP OMIT 07486501
BUFF ~ ((B~BUFF).[15:15]-1)&M[P(DUP)-1][9:9:9]; 07487000
STREAM(PRIORITY:B); 07488000
BEGIN SI~B; 07489000
N: IF SC="~" THEN GO TO X; 07490000
IF SC<"0" THEN BEGIN SI~SI+1; GO TO N; END; B~SI; 07491000
K: IF SC}"0" THEN IF SC{"9" THEN 07492000
BEGIN TALLY~TALLY+1; SI~SI+1; GO TO K END; 07493000
SI~B; DI~LOC PRIORITY; B~TALLY; DS~B OCT; GO TO Z; 07494000
X: DI~LOC PRIORITY; SKIP DB; DS~11 SET; 07495000
Z: 07496000
END STREAM; 07497000
IF (PRIORITY~P) } 0 THEN 07498000
IF PRYOR[MIX]}0 THEN% 07501000
IF JAR[MIX,*]~0 THEN 07502000
BEGIN JAR[MIX,2].[CF]~ PRYOR[MIX]~ P(PRIORITY~ 07503000
IF PRIORITY}32766 THEN 32766 ELSE PRIORITY, DUP) & P[CTF]; 07503500
STREAM(J~JAR[MIX,*],MIX,PRIORITY,BUFF); 07504000
BEGIN DS~10 LIT " PRIORITY="; 07505000
SI~LOC PRIORITY; BUFF~DI; DS~6 DEC; DI~DI-6; 07506000
DS~5 FILL; DI~BUFF; DI~DI+6; DS~LIT":"; 07507000
SI~J; SI~SI+1; DS~7 CHR; SI~SI+1; DS~LIT"/"; DS~7 CHR;07508000
DS~LIT"="; SI~LOC MIX; DS~2DEC; DS~LIT"~"; 07509000
DI~DI-3; DS~FILL; 07509500
END END; 07510000
SPOUTER(BUFF,UNITNO,1); 07511000
END CHANGEPRIORITY; 07512000
PROCEDURE ENTERCONTROLDECK(H); VALUE H; ARRAY H[*]; 07541000
BEGIN REAL R,S,T,T1,T2; 07542000
INTEGER I; 07543000
$ SET OMIT = NOT(PACKETS) 07543099
LABEL MORE; 07543100
$ POP OMIT 07543101
T~"DECK "&H[4][1:47:1]; % FOR SCRATCHDIR DELETE 07545000
S:=NEXTCDNUM(0); 07547000
DISKWAIT(KLUMP,3,DIRECTORYTOP+3); % CHANGE LASTCDNUM ON DISK07547100
$ SET OMIT = NOT(PACKETS) 07547499
MORE: 07547500
$ POP OMIT 07547501
H[0]:=@001200036000301; 07548000
$ SET OMIT = NOT(PACKETS) 07548099
T2~H[6].[FF]; H[6].[FF]~T; 07548100
$ POP OMIT 07548101
STREAM(DATE,B~[H[3]]); 07549000
BEGIN SI~LOC DATE;DS~8 OCT;DI~DI-8;DS~2 LIT"+7";END; 07549100
H[4] := 0& 07550000
$ SET OMIT = NOT SHAREDISK 07550003
15[12:44:4]; 07550010
H[1]~(XCLOCK+P(RTR))&H[3][6:30:18]; 07550100
H[2]:=S:=@14&@12[6:42:6]&S[12:24:24]&@37[36:42:6]; 07557000
T1:=EUF(T,S,H.[CF]-1); 07559000
$ SET OMIT = NOT(PACKETS) 07559099
IF T2 NEQ 0 THEN 07559100
BEGIN DISKWAIT(-(H INX 0), 30, T2); 07559110
FORGETSPACE(T2); 07559120
S~H[2]; GO TO MORE; 07559180
END; 07559190
$ POP OMIT 07559191
H[2]~LASTCDNUM; 07559500
IF FIRSTDECK=0 THEN FIRSTDECK:=T1 ELSE 07560000
BEGIN 07561000
$ SET OMIT = SHAREDISK 07561990
LOCKDIRECTORY; 07562000
$ POP OMIT 07562010
DISKWAIT(-(I:=SPACE(30)),-30,LASTDECK); 07564000
M[I+6].[CF]:=T1; 07565000
DISKWAIT(I,-30,LASTDECK); 07566000
FORGETSPACE(I); 07567000
$ SET OMIT = SHAREDISK 07567990
UNLOCKDIRECTORY; 07568000
$ POP OMIT 07568010
END; 07569000
LASTDECK:=T1; 07570000
DISKWAIT(KLUMP,-3,DIRECTORYTOP+3); 07571000
UNLOCKTOG(CDMASK); 07572000
IF RUNUMBER GTR 0 THEN STARTADECK(0); 07573000
END ENTERCONTROLDECK; 07575000
BOOLEAN PROCEDURE MTXIN(I,U,BUFF);% 08000000
REAL U,BUFF; INTEGER I;% 08001000
BEGIN LABEL EXIT,X;% 08002000
U ~ UNITIN(TINU,BUFF); 08003000
BUFF ~ BUFF.[15:15]-1; 08004000
IF U > 15 THEN% 08005000
BEGIN;STREAM(BUFF); DS ~ 8 LIT "INV KBD ";% 08006000
GO TO EXIT;% 08007000
END ELSE I ~ TWO(U); 08008000
STREAM(A~TINU[U];BUFF);% 08009000
BEGIN SI~LOC A; SI~SI+5; DS~LIB" "; DS~3 CHR;% 08010000
DS ~ LIT " "; A ~ DI;% 08011000
END;% 08012000
P([BUFF].~);% 08013000
IF LABELTABLE[U] = @114 OR LABELTABLE[U] = @214 THEN% 08014000
BEGIN 08015000
STREAM(SAV:=((I AND SAVEWORD) NEQ 0), BUFF); 08015100
BEGIN 08015200
DS:=10LIT"NOT READY~"; 08015300
SAV(DI:=DI-1; DS:=8LIT"*SAVED)~"); 08015400
END; 08015500
GO TO EXIT; 08016000
END;% 08017000
IF LABELTABLE[U] < 0 THEN% 08018000
BEGIN;STREAM(BUFF); DS ~ 7 LIT "IN USE~";% 08019000
END% 08020000
ELSE GO TO X;% 08021000
EXIT:MTXIN ~ TRUE;% 08022000
X:END;% 08023000
PROCEDURE TAPEPURGE(BUFF); VALUE BUFF; REAL BUFF;% 08024000
BEGIN LABEL EXIT;% 08025000
REAL I,U;% 08026000
REAL R,T; 08027000
BOOLEAN TEST; 08027100
REAL WHAT = BUFF;% 08028000
IF MTXIN(I,U,WHAT) THEN GO TO EXIT;% 08029000
STREAM(B:=BUFF,T~[T]); 08029015
BEGIN SI:=B; SI:=SI+6; 08029020
IF SC="-" THEN 08029025
BEGIN SI:=SI+1; 08029030
5(IF SC="~" THEN JUMP OUT; 08029035
TALLY:=TALLY+1;SI:=SI+1); 08029040
B:=TALLY; SI:=SI-B; DS:=B OCT; 08029045
DI~DI-8; DS:=LIT "+"; %725-08029046
END; 08029050
END; 08029055
LABELTABLE[U] ~ -@14; 08029100
IF (R~WAITIO(@500000000,@177,U))!0 THEN 08030000
IF R!@120 THEN %ERROR OTHER THAN WRITE LOCK 08030100
BEGIN;STREAM(U~TINU[U],BUFF); 08030200
BEGIN DS~14 LIT "#CANNOT PURGE "; 08030300
SI~LOC U; SI~SI+5; DS~3CHR; 08030310
DS~LIT"~"; 08030320
END; 08030330
LABELTABLE[U]~@214; 08030400
GO TO EXIT; 08030500
END ELSE %NO WRITE RING 08030600
BEGIN; STREAM(BUFF); DS ~ 11 LIT "WRITE LOCK.";% 08031000
LABELTABLE[U] ~ @114; 08031100
GO TO EXIT;% 08032000
END;% 08033000
IF NOT T.[1:1] THEN IF T=0 THEN %725-08033980
BEGIN T:=PRNTABLE[U].[30:18]; TEST:= TRUE END; 08033990
IF I.[1:1]=0 AND T=0 THEN BEGIN %725-08033992
STREAM(BUFF); DS~17 LIT "NOT PG-ED(PRN=0)~"; %725-08033993
LABELTABLE[U]~ @14; GO EXIT END; T~ABS(T); %725-08033994
STREAM(A:=T,BUFF); 08034000
BEGIN DI ~ DI + 3; DS ~ 8 LIT " LABEL "; 08035000
8(DS~2 LIT "0X"); 08035100
24(DS~2 LIT "0"); DS~2 LIT "}!"; 08036000
DI ~ DI-21; SI ~ LOC A; DS ~ 5 DEC;% 08037000
END;% 08038000
RRRMECH ~ I OR RRRMECH;% 08039000
MULTITABLE[U] ~ 0;% 08041000
P(WAITIO(@4200000000,0,U),DEL);% 08042000
R ~ WAITIO(BUFF INX @120500000001,@2000000,U) OR% 08043000
WAITIO(BUFF INX 10,@2000000,U);% 08044000
IF MOD3IOS THEN %AI08044500
DO UNTIL P(WAITIO(BUFF INX @340000012,@50,U))=@10 %AI08044600
ELSE %AI08044700
P(WAITIO(@4200000000,0,U),DEL);% 08045000
SLEEP([TOGLE],STATUSMASK); 08046000
RRRMECH ~ RRRMECH AND NOT I;% 08047000
READY ~ READY AND NOT I;% 08048000
IF R = 0 THEN BEGIN% 08049000
LABELTABLE[U] ~ @114;% 08050000
IF TEST THEN BEGIN STREAM(B~T,BUFF); %708-08051000
BEGIN DS~10 LIT"PG-ED(PRN="; SI~LOC B; DS~5 DEC; DS~2 LIT")~";%708-08051004
END; END % PRINT PRN WITH PLAIN PGMT %708-08051005
ELSE BEGIN STREAM(A:=T,B:=PRNTABLE[U],[30:18],BUFF); 08051010
BEGIN DS:=10LIT"PG-ED(PRN="; 08051020
SI:=LOC A; DS:=5 DEC; 08051030
DS:=5LIT",WAS "; 08051040
SI:=LOC B; DS:=5 DEC;DS:=2LIT")~"; 08051050
END; 08051060
PRNTABLE[U].[30:18] ~ T; 08051065
END; 08051070
EXIT: SPOUT(NABS(BUFF INX M[BUFF-1]));% 08052000
END ELSE BEGIN% 08053000
LABELTABLE[U] ~ @214;% 08054000
FORGETSPACE(BUFF);% 08055000
END;% 08056000
END;% 08057000
PROCEDURE GIMEDATE(B,DT); VALUE B,DT; REAL B,DT; FORWARD; 08070000
PROCEDURE REWINDANDLOCK(WHAT); VALUE WHAT; REAL WHAT;% 08079000
BEGIN REAL BUFF=WHAT,U;% 08080000
INTEGER I;% 08081000
LABEL EXIT;% 08082000
IF MIXIN(I,U,BUFF) THEN GO TO EXIT;% 08083000
RRRMECH ! RRRMECH OR I;% 08084000
LABELTABLE[U] ~ -@14;% 08085000
MULTITABLE[U] ~ 0;% 08086000
P(WAITIO(@4200000000,0,U),DEL);% 08087000
SLEEP([TOGLE],STATUSMASK); 08088000
RRRMECH ~ RRRMECH AND NOT I;% 08089000
READY ~ READY AND NOT I;% 08090000
LABELTABLE[U] ~ @214;% 08091000
STREAM(BUFF); DS ~ 5 LIT "RW/L~";% 08092000
EXIT: SPOUT(BUFF INX M[BUFF-1]); 08093000
END;% 08094000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%08095050
%**********************************************************************%08095100
%* *%08095150
%* P R I N T D I R E C T O R Y *%08095200
%* - - - - - - - - - - - - - - *%08095250
%* *%08095300
%* PURPOSE: THIS PROCEDURE HANDLES THE PD, EX, LF, LC AND LS *%08095350
%* MESSAGES. ALL MESSAGES ARE FORMS OF THE PD MESSAGE *%08095400
%* EXCEPT FOR CERTAIN DIFFERENCES. THE PD MESSAGE WILL *%08095450
%* LIST THE NAMES OF THE DESIRED FILES AS WELL AS *%08095500
%* CERTAIN PIECES OF INFORMATION IF REQUESTED. *%08095550
%* *%08095600
%* SYNTAX: THE FORMAT OF ALL THE KEYIN MESSAGES WITH THE *%08095650
%* EXCEPTION OF THE LF MESSAGE IS AS FOLLOWS: *%08095700
%* *%08095750
%* <MESSAGE> <FILE SPECIFIER> <OPTION-LIST> *%08095800
%* *%08095850
%* <MESSAGE> ::= PD / EX / LC / LS *%08095900
%* *%08095950
%* <FILE SPECIFIER> ::= <FILENAME> / <FILENAME> "/" *%08096000
%* <FILENAME> *%08096050
%* *%08096100
%* <OPTION-LIST> ::= <EMPTY> / <OPTION> / <OPTION> , *%08096150
%* <OPTION-LIST> *%08096200
%* *%08096250
%* <OPTION> ::= RECS / LAST / DATE / SAVE / SIZE / *%08096300
%* CREATOR / SECURITY / ALL *%08096350
%* *%08096400
%* <FILENAME> ::= [FROM 1 TO 7 CHARACTERS OPTIONALLY *%08096450
%* ENCLOSED IN QUOTES] / = *%08096500
%* *%08096550
%* THE SYNTAX FOR THE LF MESSAGE IS: *%08096600
%* *%08096650
%* LF <USERID> <OPTION-LIST> *%08096700
%* *%08096750
%* SEMANTICS: THE EX, LF, LC, AND LS MESSAGES ARE JUST *%08096800
%* MODIFIED FORMS OF THE PD MESSAGE. THE EX MESSAGE IS *%08096850
%* THE SAME AS A PD EXCEPT THAT ONLY THE EXPIRED FILES *%08096900
%* ARE LISTED. THE LF IS THE SAME AS A PD=/= EXCEPT *%08096950
%* THAT ONLY THE FILES BELONGING TO THE SPECIFIED USER *%08097000
%* ARE LISTED. THE LC MESSAGE IS THE SAME AS A "PD *%08097050
%* <FILE SPECIFIER> CREATOR". THE LS MESSAGE IS THE *%08097100
%* SAME AS "PD <FILE SPECIFIER> SECURITY,CREATOR". *%08097150
%* *%08097200
%* THE OPTIONS SPECIFY WHAT ADDITIONAL INFORMATION *%08097250
%* IS TO BE LISTED BESIDES THE DEFAULT INFORMATION, IF *%08097300
%* AN UNRECOGNIZABLE WORD IS ENCOUNTERED IN THE OPTION *%08097350
%* LIST, IT IS IGNORED. THE AVAILABLE OPTIONS ARE: *%08097400
%* *%08097450
%* RECS - NUMBER OF RECORDS IN THE FILE, (SPECIAL LOGIC *%08097500
%* IS INCORPORATED TO THE LIST THE CORRECT NUMBER *%08097550
%* FOR BACKUP FILES). *%08097600
%* *%08097650
%* LAST - LAST ACCESS DATE. *%08097700
%* *%08097750
%* DATE - CREATION DATE. *%08097800
%* *%08097850
%* SAVE - SAVE FACTOR. *%08097900
%* *%08097950
%* SIZE - SIZE OF THE FILE IN SEGMENTS. *%08098000
%* *%08098050
%* CREATOR - PRIVILEGED USERCODE ASSOCIATED WITH FILE. *%08098100
%* (FOR BACKUP FILES THE LABEL OF THE PRINT FILE *%08098150
%* AND THE NAME OF THE PROGRAM CREATING THE BACKUP *%08098200
%* IS ALSO LISTED). *%08098250
%* *%08098300
%* SECURITY - ACCESS PRIVILEGES OF THE FILE, I.E., *%08098350
%* LOCKED, UNLOCKED, PUBLIC, PRIVATE, FREE. *%08098400
%* *%08098450
%**********************************************************************%08098500
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%08098550
PROCEDURE PRINTDIRECTORY(BUFF,CODE); %152-08098600
VALUE BUFF,CODE; %152-08098650
REAL BUFF, %152-08098700
BEGIN %152-08098750
%152-08098800
INTEGER %152-08098850
I, % NORMALLY CONTAINS OPTION NUMBER. %152-08098900
J; % JUNK. %152-08098950
%152-08099250
REAL %152-08099300
MFID, % MFID OF DESIRED FILE OR -1 IF "=". %152-08099350
FID, % FID OF DESIRED FILE OR -1 IF "=". %152-08099400
C, % ADDRESS OF DISK HEADER. %152-08099450
D, % MFID OF LAST FILE FOUND BY SEEKNAM. %152-08099500
E, % FID OF LAST FILE FOUND BY SEEKNAM. %152-08099550
N, % WORK VARIABLE USED BY SEEKNAM TO SAVE INFO. %152-08099600
T, % NORMALLY USED TO SAVE DEST. INDEX. %152-08099650
INFO, % BIT MASK FOR OPTIONS SELECTED. %152-08099700
LABELREC, % ADDRESS OF LABEL RECORD FOR PDB ( IF LC ). %152-08099750
STA, % ORIGINATING STATION. TU/BUFF IN [9:9] FIELD. %152-08099775
USERID, % USERID IF LF. %152-08099800
X; % JUNK. %152-08099850
%152-08099900
ARRAY %152-08099950
HDR[*], % DESCRIPTOR TO DISK HEADER. %152-08100000
XLST[*];% SOME DAY WE MAY ALLOW EXCEPTION LIST. %152-08100050
%152-08100100
BOOLEAN %152-08100150
PBDTOG, % TRUE IF SELECTED FILE IS A PBD. %152-08100200
FOUNDAFILE; % TRUE IF WE LISTED OUT AT LEAST ONE FILE. %152-08100250
%152-08100300
LABEL EXIT,DROPOUT,DUMMY,OPTIONS; %152-08100350
DEFINE NUMOPTS = 7#; %152-08100500
DEFINE %152-08100510
TUANDBUF = [9:9]%, % TU/BUFF STORED IN [9:9] FIELD. %152-08100520
STATUANDBUF = STA.TUANDBUF#; % TU/BUFF OF ORIGINATING STATION. %152-08100530
DEFINE PD = (CODE = 0)#, %152-08100550
EX = (CODE = 1)#, %152-08100600
LC = (CODE = 2)#, %152-08100650
LF = (CODE = 3)#, %152-08100700
LS = (CODE = 4)#; %152-08100750
DEFINE %152-08100800
PRIMARYUSER = HDR[2]#, % PRIV. USER CODE. %152-08100850
SAVEFACTOR = HDR[3].[2:10]#, % SAVE FACTOR. %152-08100900
LASTACCESSDATE = HDR[3].[12:18]#, % LAST ACCESS DATE. %152-08100950
CREATIONDATE = HDR[3].[30:18]#, % CREATION DATE. %152-08101000
GUARDFILEMFID = HDR[5]#, % MFID OF GUARD FILE. %152-08101050
GUARDFILEFID = HDR[6]#, % FID OF GUARD FILE. %152-08101100
PBDTUANDBUF = HDR[6].[39:9]#, % RJE TU/BUFF FOR PBD. %152-08101110
PBDTU = HDR[6].[39:4]#, % RJE TU NUMBER FOR PBD. %152-08101120
PBDBUF = HDR[6].[44:4]#, % RJE BUF NUMBER FOR PBD. %152-08101130
EOFPOINTER = HDR[7]#, % EOF POINTER. %152-08101150
SEGSPERROW = HDR[8]#, % SEG. POER ROW. %152-08101200
NOOFROWS = HDR[9].[43:5]#, % NO. OF ROWS DECLARED. %152-08101250
HEADERADDRESS = HDR.[CF]#; % CORE ADDRESS OF HEADER. %152-08101300
%******************** S U B R O U T I N E S **************************08101350
SUBROUTINE GETREADY; %152-08101400
% ---------- -------- %152-08101450
BEGIN %152-08101500
STA := M[(BUFF := (T:=BUFF).[15:15] -1) -1]; %152-08101520
$ SET OMIT = NOT(DATACOM) %152-08101540
INFO := 0 & (LC OR LF OR LS)[42:47:1] & LS[43:47:1]; %152-08101650
END OF GETREADY; %152-08101700
% %152-08101750
SUBROUTINE GETFILESPECIFIER; %152-08101800
% ---------- ---------------- %152-08101850
BEGIN %152-08101900
NAMEID(MFID,T); % GET MFID (OR USERCODE IF "LF") %152-08101950
IF LF THEN USERID := MFID; % FIRST THING IS USERID FOR LF. %152-08102000
IF MFID = "~~ " OR LF THEN %152-08102050
MFID := - 1; %152-08102100
NAMEID(FID,T); %152-08102150
IF FID = "/ " THEN % GET FID %152-08102200
BEGIN %152-08102250
NAMEID(FID,T); %152-08102300
NAMEID(N,T); % GET NEXT ITEM. %152-08102350
END %152-08102400
ELSE % NO FID SPECIFIED IMPLIES FID OF "=" %152-08102450
BEGIN %152-08102500
N := FID; %152-08102550
FID := -1; %152-08102600
END; %152-08102650
IF FID.[6:6] = LEFTARROW OR LF THEN % NO FID SPECIFIED %152-08102700
FID := - 1; %152-08102750
END OF GETFILESPECIFIER; %152-08102800
% %152-08102850
SUBROUTINE PROCESSOPTIONLIST; %152-08102900
% ---------- ----------------- %152-08102950
BEGIN %152-08103000
WHILE N ! "~ " DO % ACCUMULATE OPTIONS %152-08103050
BEGIN %152-08103100
FOR I := -1 STEP 1 UNTIL (NUMOPTS - 2) DO %152-08103150
DUMMY:: IF P(.OPTIONS,I,+,LOD) = N THEN % MATCHES AN OPTION WORD 08103200
BEGIN %152-08103250
INFO := INFO OR TWO(I+1); % SET BIT CORRESPONDING TO OPT08103300
GO TO DROPOUT; %152-08103350
END %152-08103400
ELSE % CHECK FOR "ALL" %152-08103450
IF N = "ALL " THEN % SET ALL OPTION WORD BITS. %152-08103500
INFO := NOT 0; %152-08103550
DROPOUT: %152-08103600
NAMEID(N,T); % GET NEXT OPTION WORD. %152-08103650
IF N = ", " THEN NAMEID(N,T); % SKIP OVER COMMA. %152-08103700
END; %152-08103750
GO TO EXIT; %152-08103800
% %152-08103850
OPTIONS ::: "RECS ", % OPTION 0 (INFO.[47:1]) %152-08103900
"LAST ", % OPTION 1 (INFO.[46:1]) %152-08103950
"DATE ", % OPTION 2 (INFO.[45:1]) %152-08104000
"SIZE ", % OPTION 3 (INFO.[44:1]) %152-08104050
"SECURIT", % OPTION 4 (INFO.[43:1]) %152-08104100
"CREATOR", % OPTION 5 (INFO.[42:1]) %152-08104150
"SAVE "; % OPTION 6 (INFO.[41:1]) %152-08104200
EXIT: %152-08104250
END OF PROCESSOPTIONLIST; %152-08104300
% %152-08104350
SUBROUTINE GETSET; %152-08104400
% ---------- ------ %152-08104450
BEGIN %152-08104500
IF EX OR INFO ! 0 OR (PD AND USERID ! 0) THEN % WE WILL NEED HDR. 08104550
HDR := IOQUE & SPACE(30) [CTC]; %152-08104600
END OF GETSET; %152-08104650
% %152-08104700
BOOLEAN SUBROUTINE WEGOTAFILE; %152-08104750
% ------- ---------- ---------- %152-08104800
BEGIN %152-08104850
SEEKNAM(MFID,FID,C,D,E,N,XLST); % FIND A FILE. %152-08104900
WEGOTAFILE := C ! 0; % C IS ADDRESS OF DISK HEADER. %152-08104950
END OF WEGOTAFILE; %152-08105000
% %152-08105050
BOOLEAN SUBROUTINE WEWANTTHISFILE; %152-08105100
% ------- ---------- -------------- %152-08105150
BEGIN %152-08105200
PBDTOG := ((D EQV "PBD ") = NOT 0 OR (D EQV "PUD ") %152-08105250
= NOT 0); %152-08105300
IF HEADERADDRESS ! 0 THEN % WE NEED THE HEADER. %152-08105350
DISKWAIT(-HEADERADDRESS,30,C); % READ HEADER. %152-08105400
IF LF THEN % CHECK TO SEE IF WE WANT THIS FILE. %152-08105450
WEWANTTHISFILE := PRIMARYUSER = USERID %152-08105500
ELSE %152-08105550
IF EX THEN %152-08105600
BEGIN %152-08105650
STREAM(A:=CALCULATEPURGE(-SAVEFACTOR),X:=[X]); %152-08105700
BEGIN %152-08105750
SI := LOC A; DS := 8 OCT; %152-08105800
END; %152-08105850
WEWANTTHISFILE := X > LASTACCESSDATE; % TRUE IF FILE EXPIRED08105900
END %152-08105950
ELSE %152-08106000
IF PD AND USERID ! 0 THEN % NEED TO CHECK SECURITY. %152-08106020
WEWANTTHISFILE := SECURITYCHECK(D,E,USERID,HEADERADDRESS)!0 08106040
ELSE %152-08106060
WEWANTTHISFILE := TRUE; %152-08106080
END OF WEWANTTHISFIE; %152-08106100
% %152-08106150
SUBROUTINE PUTINFILENAME; %152-08106200
% ---------- ------------- %152-08106250
BEGIN %152-08106300
STREAM(A:=0 : D, E, BUFF); % SET UP FILE NAME. %152-08106350
BEGIN %152-08106400
SI := LOC D; %152-08106450
DS := LIT " "; %152-08106500
2 ( SI := SI + 1; DS := 7 CHR; DS := LIT "/"); %152-08106550
DI := DI - 1; %152-08106600
DS := 2 LIT " "; % NEED 2 SPACES TO ALLOW FOR ARROW. %152-08106650
A := DI; %152-08106700
END; %152-08106750
T := P; % SAVE OFF DEST. INDEX. %152-08106800
END OF PUTINFILENAME; %152-08106850
% %152-08106900
SUBROUTINE DORECS; %152-08106950
% ---------- ------ %152-08107000
BEGIN %152-08107050
STREAM(A:=IF PBDTOG THEN EOFPOINTER|5 ELSE EOFPOINTER+1 :T); %152-08107100
%152-08107150
BEGIN %152-08107200
DS := 9 LIT "RECORDS: "; %152-08107250
SI := LOC A; %152-08107300
DS := 8 DEC; % CONVERT NUMBER OF RECORDS TO DEC. %152-08107350
A := DI; % SAVE OFF DI BEFORE ZERO SUPPRESSING. %152-08107400
DI := DI - 8; %152-08107450
DS := 7 FILL; %152-08107500
END; %152-08107550
T := P; % SAVE DESTINATION ADDRESS. %152-08107600
END OF DORECS; %152-08107650
% %152-08107700
SUBROUTINE DODATEORLAST; %152-08107750
% ---------- ------------ %152-08107800
BEGIN %152-08107850
% %152-08107900
STREAM(X:=[X]); %152-08107950
BEGIN %152-08108000
SI := X; %152-08108050
DS := 8 DEC; % CONVERT DATE TO DECIMAL. %152-08108100
END; %152-08108150
GIMEDATE([X].[CF],-X); % CONVERT JUILIAN DATE TO 6 DIGITS. %152-08108200
STREAM(A:=(I=1) : X, T); %152-08108250
BEGIN %152-08108300
A ( DS := 10 LIT "ACCESSED: "; JUMP OUT TO L1); %152-08108350
DS := 9 LIT "CREATED: "; %152-08108400
L1: %152-08108450
SI := LOC X; %152-08108500
SI := SI + 2; %152-08108550
3 ( DS := 2 CHR; DS := LIT "/"); %152-08108600
DI := DI - 1; % ERASE THE EXTRA SLASH. %152-08108650
A := DI; % SAVE DEST. INDEX. %152-08108700
END; %152-08108750
T := P; % SAVE DESTINATION ADDRESS. %152-08108800
END OF DODATEORLAST; %152-08108850
% %152-08108900
SUBROUTINE DOSIZE; %152-08108950
% ---------- ------ %152-08109000
BEGIN %152-08109050
NT2 := NOOFROWS; % NO. OF ROWS DECLARED. %152-08109100
NT1 := 0; % NUMBER OF ROWS PROCESSED. %152-08109150
FOR J := 1 STEP 1 UNTIL NT2 DO % CHECK TO SEE IF ROW EXISTS. %152-08109200
IF HDR[J+9] ! 0 THEN NT1 := NT1 + 1; % BUMP UP COUNT. %152-08109250
STREAM(A:=NT1|SEGSPERROW : T); %152-08109300
BEGIN %152-08109350
DS := 10 LIT "SEGMENTS: "; %152-08109400
SI := LOC A; %152-08109450
DS := 8 DEC; %152-08109500
A := DI; %152-08109550
DI := DI - 8; %152-08109600
DS := 7 FILL; %152-08109650
END; %152-08109700
T := P; % SAVE DESTINATION ADDRESS. %152-08109750
END OF DOSIZE; %152-08109800
% %152-08109850
SUBROUTINE DOSECURITY; %152-08109900
% ---------- ---------- %152-08109950
BEGIN %152-08110000
J:= IF PRIMARYUSER = 0 THEN % FREE FILE %152-08110050
ELSE IF GUARDFILEMFID = "?" THEN % UNLOCK OR PUBLIC %152-08110100
IF GUARDFILEFID = "?" THEN 1 % UNLOCKED %152-08110150
ELSE 2 % PUBLIC %152-08110200
ELSE IF GUARDFILEMFID < 0 THEN 3 % PRIVATE %152-08110250
ELSE 4; % LOCKED %152-08110300
STREAM(J := A:=GUARDFILEMFID, B:=GUARDFILEFID, T); %152-08110350
BEGIN %152-08110400
DS := 10 LIT "SECURITY: "; %152-08110450
CI := CI + J; %152-08110500
GO TO FREE; %152-08110550
GO TO UNLOK; %152-08110600
GO TO PUBLIC; %152-08110650
GO TO PRIVATE; %152-08110700
LOCK: DS := 6 LIT "LOCKED"; GO TO EXIT; %152-08110750
PRIVATE:DS := 22 LIT "PRIVATE (SECURED WITH "; %152-08110800
SI := LOC A; %152-08110850
2 ( SI := SI + 1; DS := 7 CHR; DS := LIT "/"); %152-08110900
DI := DI - 1; %152-08110950
DS := LIT ")"; %152-08111000
GO TO EXIT; %152-08111050
PUBLIC: DS := 6 LIT "PUBLIC"; GO TO EXIT; %152-08111100
UNLOK: DS := 8 LIT "UNLOCKED"; GO TO EXIT; %152-08111150
FREE: DS := 4 LIT "FREE"; %152-08111200
EXIT: J := DI; %152-08111250
END; %152-08111300
T := P; % SAVE DESTINATION ADDRESS. %152-08111350
END OF DOSECURITY; %152-08111400
% %152-08111450
SUBROUTINE DOCREATOR; %152-08111500
% ---------- --------- %152-08111550
BEGIN %152-08111600
$SET OMIT = PACKETS %152-08111650
$SET OMIT = NOT(PACKETS) %152-08111800
IF J:=(PBDTOG AND (E.[42:6] = 1)) THEN % REEL 1 OF PBD %152-08111850
$POP OMIT %152-08111900
BEGIN %152-08111950
IF LABELREC = 0 THEN LABELREC := SPACE(30); %152-08112000
DISKWAIT(-LABELREC,30,HDR[10]+2); %152-08112050
END; %152-08112100
STREAM(J : B:= PRIMARYUSER=0, C:=PRIMARYUSER, %152-08112150
RJE := PBDTUANDBUF!0, TU:=PBDTU, BUF:=PBDBUF, %152-08112175
D:=LABELREC INX 12, T); %152-08112200
BEGIN %152-08112250
DS := 9 LIT "CREATOR: "; %152-08112300
B ( DS := 4 LIT "NONE"; JUMP OUT TO L2 ); %152-08112350
SI := LOC C; %152-08112400
SI := SI + 1; %152-08112450
DS := 7 CHR; %152-08112500
L2: %152-08112550
J ( DS := 2 LIT " ("; %152-08112600
SI := D; %152-08112650
2 ( SI := SI + 1; DS := 7 CHR; DS := LIT "/"); %152-08112700
DI := DI - 1; DS := 4 LIT " OF "; %152-08112750
2 ( SI := SI + 1; DS := 7 CHR; DS := LIT "/"); %152-08112800
DI := DI - 1; %152-08112820
RJE (DS := 2 LIT " ["; SI := TU; %152-08112840
DS := 2 DEC; DS := LIT "/"; DS := 2 DEC; %152-08112860
DS := LIT "]"); %152-08112880
DS := LIT ")"); %152-08112890
J := DI; %152-08112900
END; %152-08112950
T := P; % SAVE DESTINATION ADDRESS. %152-08113000
END OF DOCREATOR; %152-08113050
% %152-08113100
SUBROUTINE DOSAVEFACTOR; %152-08113150
% ---------- ------------ %152-08113200
BEGIN %152-08113250
STREAM(A := SAVEFACTOR : T); %152-08113300
BEGIN %152-08113350
DS := 6 LIT "SAVE: "; %152-08113400
SI := LOC A; %152-08113450
DS := 3 DEC; %152-08113500
A := DI; %152-08113550
DI := DI - 3; %152-08113600
DS := 2 FILL; %152-08113650
END; %152-08113700
T := P; % SAVE DESTINATION ADDRESS; %152-08113750
END OF DOSAVEFACTOR; %152-08113800
% %152-08113850
SUBROUTINE DOOPTIONS; %152-08113900
% ---------- --------- %152-08113950
BEGIN %152-08114000
FOR I := 0 STEP 1 UNTIL (NUMOPTS - 1) DO % SEE IF OPTION BIT SET. 08114050
IF (TWO(I) AND INFO) ! 0 THEN %OPTION SELECTED. %152-08114100
BEGIN %152-08114150
CASE I OF %152-08114200
BEGIN %152-08114210
DORECS; % CASE 0 - "RECS" %152-08114250
BEGIN % CASE 1 - "LAST" %152-08114290
X := LASTACCESSDATE; %152-08114300
DODATEORLAST; %152-08114310
END OF CASE 1; %152-08114320
BEGIN % CASE 2 - "DATE" %152-08114340
X := CREATIONDATE; %152-08114350
DODATEORLAST; %152-08114360
END OF CASE 2; %152-08114370
DOSIZE; % CASE 3 - "SIZE" %152-08114400
DOSECURITY; % CASE 4 - "SECURITY" %152-08114450
DOCREATOR; % CASE 5 - "CREATOR" %152-08114500
DOSAVEFACTOR; % CASE 6 - "SAVE" %152-08114550
END OF CASES; %152-08114600
STREAM(I : T); % PUT COMMA AFTER LAST OPTION. %152-08114650
BEGIN %152-08114700
DS := 2 LIT ", "; %152-08114750
I := DI; %152-08114800
END; %152-08114850
T := P; %152-08114900
END OF LOOP TO PROCESS OPTIONS; %152-08114950
END OF DOOPTIONS; %152-08115000
% %152-08115050
SUBROUTINE MAKETHEMESSAGE; %152-08115100
% ---------- -------------- %152-08115150
BEGIN %152-08115200
IF FOUNDAFILE THEN % WE NEED A BUFFER. %152-08115250
BUFF := SPACE(30); %152-08115300
PUTINFILENAME; %152-08115350
DOOPTIONS; %152-08115400
STREAM(T); % PUT IN THE LEFT ARROW. %152-08115450
BEGIN %152-08115500
DI := DI -2; %152-08115550
DS := LIT LEFTARROW; %152-08115600
END; %152-08115650
END OF MAKETHEMESSAGE; %152-08115700
% %152-08115750
SUBROUTINE COMPLAIN; %152-08115800
% ---------- -------- %152-08115850
BEGIN %152-08115900
STREAM(BUFF); %152-08115950
DS := 8 LIT " NULL "; % ORIGINAL INPUT IS AT BUFF + 1, %152-08116000
SPOUT(BUFF INX STA); %152-08116050
END OF COMPLAIN; %152-08116100
% %152-08116150
SUBROUTINE FORGETEVERYTHING; %152-08116200
% ---------- ---------------- %152-08116250
BEGIN %152-08116300
IF HEADERADDRESS ! 0 THEN FORGETSPACE(HEADERADDRESS); %152-08116350
IF LABELREC ! 0 THEN FORGETSPACE(LABELREC); %152-08116400
END OF FORGETEVERYTHING; %152-08116450
%******************** S T A R T O F C O D E ***********************08116500
GETREADY; %152-08116550
GETFILESPECIFIER; %152-08116600
PROCESSOPTIONLIST; %152-08116650
GETSET; %152-08116700
WHILE WEGOTAFILE DO %152-08116750
IF WEWANTTHISFILE THEN %152-08116800
BEGIN %152-08116850
MAKETHEMESSAGE; %152-08116900
SPOUT(BUFF INX STA); %152-08116950
FOUNDAFILE := TRUE; %152-08117000
END; %152-08117050
IF NOT FOUNDAFILE THEN COMPLAIN; %152-08117100
FORGETEVERYTHING; %152-08117150
END OF PRINTDIRECTORY; %152-08117200
$ SET OMIT = NOT(DCSPO AND DATACOM ) 08135999
PROCEDURE CONTINUITYBIT;% 08171000
BEGIN REAL T,IOD,LINK,U;% 08172000
ARRAY A[*]; 08172500
REAL RCW=+0;% 08173000
ARRAY R=-4[*]; DEFINE FIB=A#; %P 08173100
CHECKSTACKSPACE;% %WF 08173200
U ~(LINK ~ NFLAG(M[(IOD ~ NFLAG(M[T~PRT[P1MIX,9]]) INX% 08174000
P(0,LNG,XCH)) INX NOT 0])).[12:6];% 08175000
IF U } 32 THEN 08175100
BEGIN A ~ M[T]; 08175200
IF READEMFROMDISK(CIDROW[U-32],A) THEN 08175300
M[T] ~ A&1[27:47:1]&0[2:47:1] ELSE 08175400
M[1] ~ R; GO TO RETURN; 08175500
END; 08175600
M[IOD INX NOT 1]~FLAG(LINK); FIB~M[T-3]; %P 08176000
M[FIX[14]INX 17]~[M[FIB[5].[FF]]]&IOD[3:3:30]&0[20:20:1]; 08177000
;FIB[5]~P(DUP,LOD,0,1,CFX,ADD); %P 08177100
IF FIB[14].[FF]{FIB[14].[CF] THEN %% BUFFER FULL %P 08177200
PBIO(T,FIB[14]) %P 08178000
ELSE %P 08179000
BEGIN; STREAM(A~FIB[14].[CF], B~FIB[14].[FF]); %P 08179600
BEGIN SI~A; DS~18 WDS END; %P 08179700
FIB[14].[FF]~FIB[14].[FF]-18; %P 08179800
END; %P 08179900
GO RETURN %P 08180000
END CONTINUITYBIT; %P 08181000
BOOLEAN PROCEDURE PRINTORPUNCHWAIT(Q,PNCH);VALUE Q,PNCH;REAL Q,PNCH; 08255000
% 08255050
% THIS PROCEDURE IS RESPONSIBLE FOR STARTING PRNPBT/DISK. IT CHECKS 08255055
% FOR I/O UNITS AS REQUIRED AND, IF AVAILABLE, GRABS THEM. THE 08255060
% PARAMETERS ARE: 08255065
% Q {-16 LOGICAL UNIT NUMBER FOR OUTPUT. TAPES AND DISK ARE 08255070
% SEARCHED TO FIND A FILE TO PRINT. THIS IS USED ONLY 08255075
% WHEN AUTOPRINT IS SET OR FOR RJE. 08255080
% >-16, {0 LOGICAL UNIT NUMBER OF A BACK-UP TAPE. CHECK FOR AN 08255085
% AVAILABLE OUTPUT UNIT. 08255090
% >0 FID OF A DISK FILE. CHECK FOR OUTPUT UNIT. 08255095
% PNCH.[47:1] ON FOR PUNCH BACK-UP. 08255100
% [39:8] NUMBER OF COPIES FROM PB MESSAGE. 08255105
% [31:8] IF TAPE, NUMBER OF FILE TO PRINT (FROM PB). 08255110
% IF DISK, =0 IF ENTRIE PACKET SHOULD BE PRINTED, =1 IF08255115
% NOT. 08255120
% [30:1] ON IF =0 WAS USED IN PB MSG. 08255122
% [9:9] RJE TU/BUFF. 08255125
% [2:1] ON IF CALLED FROM PRINTBACKUP, I.E, A PB MESSAGE. 08255130
% [1:1] ON IF CALLED FROM PRNPBT/DISK. 08255135
% 08255140
BEGIN INTEGER U,V,I,J,J1,J2,S; 08255200
REAL A,HDR,SEG0=S,F=J; 08255400
REAL PBT,PBD,PUD; 08255500
ARRAY D[*],SHEAT=D[*]; 08255600
LABEL TRYAGAIN,PRNPBT,DISK; 08255700
LABEL FOUND,FIREITUP,QUIT; %717-08255800
DEFINE MFID = (IF V=22 THEN PUD ELSE PBD)#; 08255900
DEFINE STACURR = STATION[STA.[44:4],STA.[39:4]]#; 08256000
$ SET OMIT = SHAREDISK 08256190
DEFINE SIXTY = 60%; 08256200
$ SET OMIT = NOT SHAREDISK 08256210
$ SET OMIT = NOT RJE 08256390
% 08256420
SUBROUTINE LABELTHEPRINTER; 08256430
BEGIN LABELTABLE[V]:=Q&@21[1:43:5]; 08256440
MULTITABLE[V]:=IF V=22 THEN PUD ELSE PBD; 08256450
END; 08256460
% 08256470
PBT := "PBT "; PUD := "PUD "; PBD := "PBD "; 08256500
$ SET OMIT = NOT(DATACOM AND RJE ) 08256699
IF Q}(-15) THEN %%% PR GIVEN: LOOK FOR LP. 08257000
BEGIN 08257100
$ SET OMIT = NOT(DATACOM AND RJE ) 08257199
IF PNCH THEN IF LABELTABLE[V:=22]!0 THEN V:=0 ELSE ELSE 08257500
IF LABELTABLE[V~20]!0 THEN 08257600
IF LABELTABLE[V~21]!0 THEN V~0; 08258000
IF V!0 THEN % WE HAVE AN OUTPUT UNIT 08258200
IF Q>0 THEN % BACK-UP DISK 08258400
BEGIN U:=18; 08258600
LABELTHEPRINTER; % TO HOLD IT DURING DISK I/O-S. 08258700
IF AUTOPRINT % CHECK IF A PRNPBT WAS STARTED; 08258800
$ SET OMIT = NOT RJE % IF SO, START THIS ONLY FOR PB. 08258990
THEN 08259200
IF (A:=DIRECTORYSEARCH(MIFD,Q,19))!0 THEN 08259225
BEGIN IF M[A+4].[6:1] THEN% NOT FIRST TIME. 08259250
BEGIN 08259275
$ SET OMIT = NOT SHAREDISK 08259300
P(PNCH.[2:1]); % SEE 08259625 08259375
END ELSE % FIRST TIME, MARK IT. 08259400
BEGIN M[A+4].[6:1]:=1; 08259425
DISKWAIT(A.[CF],-30,A.[FF]); 08259450
P(1); 08259475
END; 08259500
FORGETSPACE(A); 08259525
$ SET OMIT = SHAREDISK 08259550
UNLOCKDIRECTORY; 08259575
$ POP OMIT 08259600
IF P THEN ELSE GO QUIT; 08259625
END ELSE GO QUIT; 08259650
GO FIREITUP; 08259700
END ELSE % Q{0, PB MT %717-08259800
BEGIN RRRMECH~TWO(U~ABS(Q)) OR RRRMECH; %717-08259810
LABELTABLE[U] ~ %717-08259820
PBT&TINU[V][6:30:18]&@21[1:43:5]; %717-08259830
MULTITABLE[V] ~ PBT; %717-08259840
LABELTABLE[V] ~ PBT&TINU[U][6:30:18]& %717-08259850
@21[1:43:5]; %717-08259860
GO FIREITUP; %717-08259870
END %717-08259880
ELSE GO QUIT; % V =0, NO OUTPUT UNIT 08260000
END; 08260250
BEGIN V:=ABS(Q); % LP (OR PUNCH) GIVEN, LOOK FOR FILE. 08260500
IF PBCOUNT!0 THEN % TRY FOR DISK 08267000
BEGIN D:=[M[SPACE(90)]]&90[8:38:10]; 08267500
$ SET OMIT = SHAREDISK 08267990
LOCKDIRECTORY; 08268000
$ POP OMIT 08268010
A:=MFID; 08268500
J1:=(A.[6:18] + A.[24:24]) MOD MODULUS; 08268600
FOR J2:=0 STEP 1 UNTIL (MODULUS-1) DO 08268700
BEGIN 08268750
$ SET OMIT = NOT SHAREDISK 08268790
J:=SCRAMBLE(J1,J2); 08268900
DO BEGIN DISKWAIT(-(D INX 30),SIXTY,J); 08268950
FOR I:=30 STEP 3 UNTIL 87 DO 08269000
IF (D[I] EQV A) = NOT 0 THEN 08269100
IF D[I+1].[CF]=1 THEN 08269200
BEGIN DISKWAIT(-D.[CF],-30,D[I+2].[CF]); 08269300
IF D[4].[1:3] ! 0 OR D[4].[6:1] 08269400
$ SET OMIT = NOT(RJE AND DATACOM ) 08269499
$ SET OMIT = NOT(PACKETS) 08269509
OR LABELTABLE[IF V=20 THEN 21 ELSE 08269510
IF V=21 THEN 20 ELSE 22].[6:24] 08269520
=D[I+1].[6:24] 08269530
$ POP OMIT 08269531
OR (D[4].[16:20] OR D[9].[1:28])!0 08269600
THEN 08269650
$ SET OMIT = NOT SHAREDISK 08269690
ELSE 08269750
BEGIN D[4].[6:1]:=1; 08269800
PBCOUNT:=PBCOUNT-1; 08269900
DISKWAIT(D.[CF],-30,D[I+2].[CF]);08270000
$ SET OMIT = NOT SHAREDISK 08270040
U:=18; 08270100
Q:=D[I+1]; 08270200
GO FOUND; 08270300
END END; 08270350
$ SET OMIT = NOT SHAREDISK 08270390
END UNTIL (J:=D[32].[FF])=0; 08270450
$ SET OMIT = NOT SHAREDISK 08270490
END; 08270550
FOUND: FORGETSPACE(D); 08270600
$ SET OMIT = SHAREDISK 08270640
UNLOCKDIRECTORY; 08270650
$ POP OMIT 08270660
END SEARCHING FOR DISK; 08270700
END; 08270725
% IF WE HAVE BOTH AN INPUT FILE AND AN OUTPUT UNIT, 08270740
% FIRE UP PRNPBT/DISK. 08270745
IF U!0 AND V!0 THEN 08270750
BEGIN 08270800
$ SET OMIT = NOT(DATACOM AND RJE ) 08270819
LABELTHEPRINTER; 08271000
FIREITUP: 08271750
A:=V&U[38:43:5]&PNCH[21:30:17]; 08272000
$ SET OMIT = NOT RJE 08272240
IF PNCH.[1:1] THEN P(A) ELSE 08272250
BEGIN 08272500
TRYAGAIN: 08272600
IF (HDR:=DIRECTORYSEARCH(P(PRNPBT),P(DISK),3)) ! 0 THEN 08272750
BEGIN 08273000
SHEAT := [M[F:=TYPEDSPACE(31,SHEETAREAV)]]&30[SIZE]; 08273250
M[F-1].[9:6] := 0; M[HDR INX NOT 1],[9:6]:=0; 08273260
MOVE(30,F-1,F); 08274500
SEG0 := TYPEDSPACE(30,SEGZEROAREAV);% %167-08275500
M[SEG0-2].[AREAMIXF] := 0;% %167-08275600
DISKWAIT(-SEG0, 30, M[HDR INX 10]); 08275750
F.[FF] := HDR; % CORE ADDRESS OF HEADER 08276000
SHEAT[7] := SEG0; % CORE ADDRESS OF SEGMENT ZERO 08276050
SHEAT[0] := P(PRNPBT); 08276100
SHEAT[1] := P(DISK); 08276150
SHEAT[2] := 0 & PRBPBTCODE[5:45:3] & 2[8:38:10] & 08276200
%PRIORITY=0.EXECUTE CODE 08276203
(PNCH.[2:1]=0)[4:47:1]; % SET IF NOT "PB" 08276205
SHEAT[16] := SHEAT[17] := @377777777777; % TIME LIMITS08276210
SHEAT[19] := A; % COMMON VALUE 08276220
SHEAT[20] := 4; % CORE ESTIMATE 08276230
SHEAT[21] := 150; % STACK SIZE 08276240
08276250
STREAM(A:=0: S:=P(.SCHEDULEIDS)); 08276260
BEGIN 08276270
SI:=S; 08276280
47(SKIP SB; SKIP DB; TALLY:=TALLY+1; 08276290
IF SB THEN ELSE JUMP OUT); 08276300
DS:=SET; A:=TALLY; 08276310
END STREAM STATEMENT; 08276320
08276330
I := P; 08276340
SHEAT[3].[8:10] := I; % SCHEDULE NUMBER 08276350
SHEAT[23] := (CLOCK + P(RTR)) DIV 60); 08276360
SHEAT[24] := MCP; %131-08276365
$ SET OMIT = NOT(DATACOM AND RJE) 08276370
SHEAT[25] := HDR.[FF]; % DISK ADDRESS OF FILE HEADER 08276400
STREAM(A, I:=I:=SPACE(11)); 08276410
BEGIN 08276420
DI:=DI+16; 08276430
DS:=30LIT"CC EXECUTE PRNPBT/DISK;COMMON="; 08276440
SI:=LOC A; DS:=8DEC; 08276450
DS:=6LIT";END.~"; 08276460
END STREAM STATEMENT; 08276470
M[I] := 0; M[I+1]:=10; 08276480
SHEAT[6] := GETESPDISK & 10[18:33:15]; 08276490
DISKWAIT(I, 11, SHEAT[6].[CF]); 08276500
FORGETSPACE(I); 08276510
INDEPENDENTRUNNER(P(.SELECTRUN),F,160); 08276520
P(1); 08276530
END ELSE % IF IN DIRECTORY 08276540
BEGIN 08276550
ENTERSYSFILE(3); 08276560
GO TRYAGAIN; 08276570
PRNPBT::: "PRNPBT "; 08276580
DISK::: "DISK "; 08276590
END; 08276600
END; 08277000
PRINTORPUNCHWAIT:=P; 08277500
END ELSE 08278000
08279000
QUIT: IF V NEQ 0 THEN 08280000
$ SET OMIT = NOT(RJE AND DATACOM ) 08280009
LABELTABLE[V]:=MULTITABLE[V]:=0; 08280030
END PRINTWAIT;% 08281000
PROCEDURE PRINTBACKUP(BUFF); VALUE BUFF; REAL BUFF; %P 08282000
% 08282100
% THIS PROCEDURE HANDLES THE PB MESSAGE, MAKING THE NECESSARY CHECKS 08282110
% AND THEN CALLING PRINTORPUNCHWAIT. THE SYNTAX OF THE MESSAGE IS: 08282120
% <PB MSG> ::= PB<INPUT FILE><PB SPECS> 08282140
% <INPUT FILE> ::= <TAPE UNIT> / <DISK FILE NUMBER> 08282150
% <PB SPECS> ::= <PB ELEMENT> / <PB ELEMENT><PB SPECS> / <EMPTY> 08282160
% <PB ELEMENT> ::= P / =<NUMBER OF COPIES> / #<STARTING FILE NUMBER>08282170
% 08282180
BEGIN REAL U,I,COPY,MS,STA,B=BUFF; 08283000
$ SET OMIT = NOT (DATACOM AND DCSPO) 08283400
LABEL OK,BAD,SPIT; 08284000
$ SET OMIT = NOT (DATACOM AND DCSPO) 08284450
STREAM(PCPY:=1, NUMB:=1, N:=1, CPY:=-0: B:=BUFF); 08285000
BEGIN SI~B; DI~LOC N; %P 08286000
L: IF SC=" " THEN BEGIN SI~SI+1; GO TO L END; %P 08287000
IF SC<"0" THEN BEGIN DS~5 LIT"+0000"; DS~3 CHR END ELSE%P 08288000
BEGIN B:=SI; 08289000
4(IF SC<"0" THEN JUMP OUT; TALLY~TALLY+1; SI~SI+1); 08289500
SI:=B; B:=TALLY; DI:=DI+5; DI:=DI-B; 08290000
DS~B CHR; %P 08290500
END; 08291000
LL: IF SC=" " THEN BEGIN SI:=SI+1; GO TO LL END; 08291025
IF SC="=" THEN BEGIN DI:=LOC CPY; GO TO CNT END; 08291050
IF SC="#" THEN 08291075
BEGIN DI:=LOC NUMB; 08291100
CNT: SI:=SI+1; B:=SI; IF SC=" " THEN GO TO CNT;TALLY:=0; 08291125
3(IF SC < "0" THEN JUMP OUT; 08291150
IF SC > "9" THEN JUMP OUT; 08291175
TALLY:=TALLY+1; SI:=SI+1); 08291200
SI:=B; B:=TALLY; DS:=8 OCT; 08291225
GO TO LL; 08291250
END; 08291275
IF SC="P" THEN 08291300
BEGIN TALLY:=0; PCPY:=TALLY; SI:=SI+1; 08291325
5(IF SC=ALPHA THEN IF SC<"0" THEN SI:=SI+1 ELSE 08291350
JUMP OUT ELSE JUMP OUT); 08291375
GO TO LL; 08291400
END; 08291425
END; 08291450
COPY:=(COPY:=P)&(NOT COPY = NOT 0)[31:47:1]; 08291460
% 08291470
% BACK UP TAPE. CHECK THE LABEL THEN CALL PRINTORPUNCHWAIT. 08291475
% 08291480
IF (U:=P) < 0 THEN 08291500
BEGIN COPY:=COPY&(P(XCH)-1)[32:40:8]; 08291750
IF NOT MTXIN(I,U,B) THEN 08292000
IF (STA:=MULTITABLE[U]!"PBTMCP " OR STA) AND 08292500
MULTITABLE[U]!"PUTMCP " THEN 08293000
BEGIN STREAM(BUFF); DS:=19 LIT" NOT A BACKUP TAPE~"; 08293500
GO TO SPIT; 08294000
END 08294500
ELSE 08295000
IF PRINTORPUNCHWAIT(-U, STA&COPY[30:31:17] OR M) THEN 08295200
GO TO OK ELSE BEGIN MS:=-1; GO TO BAD END 08295600
ELSE GO TO SPIT; 08295800
END; 08296000
% BACK UP DISK. SET FIRST REEL NUMBER. IF COPIES OR REEL NUMBER 08296160
% GIVEN, DISK IN "P" BIT, ELSE LEAVE IT OFF TO PRINT ENTIRE 08296170
% THING. CHECK FOR THE FILE, THEN CALL PRINTORPUNCHWAIT. 08296180
% 08296190
% 08296200
STREAM(I:=P: U:=[U]); 08296225
BEGIN SI:=LOC I; DI:=DI+5; 08296250
DS:=3 DEC; 08296275
END; 08296300
I:=P-1; 08296325
IF (COPY OR I).[CF]=0 THEN P(DEL) ELSE 08296350
COPY:=COPY&P(XCH)[39:47:1]; 08296375
BUFF:=BUFF.[15:15]-1; 08296400
IF (I:=DIRECTORYSEARCH("PBD ",U,5))=0 THEN 08296600
IF (I:=DIRECTORYSEARCH("PUD ",U,5))=0 THEN GO TO BAD 08296800
ELSE STA:=STA OR 1; 08297000
P(M[I+4]); 08297200
FORGETSPACE(I); 08297300
IF P.[2:1] THEN BEGIN MS:=2; GO TO BAD END; 08297400
IF PBCOUNT LSS 1 THEN PBCOUNT:=1; 08297600
IF PRINTORPUNCHWAIT(U, STA&COPY[30:31:17] OR M) THEN 08298000
OK: FORGETSPACE(BUFF) 08298200
ELSE 08298400
BEGIN MS:=1; 08298600
BAD: STREAM(MS, X:=MS<0, U:=IF P(DUP) THEN TINU[U] ELSE U, 08298800
BUFF:=BUFF.[CF]); 08299000
BEGIN DS:=8 LIT" NULL PB"; 08299200
SI:=LOC U; CI:=CI+X; GO TO DK; 08299400
SI:=SI+5; DS:=3 CHR; GO TO LL; 08299600
DK: SI:=SI+1; DS:=4 CHR; 08299800
BUFF:=DI; DI:=DI-4; DS:=3 FILL; DI:=BUFF; 08300000
LL: DS:=2 LIT"-("; 08300200
CI:=CI+MS; GO TO L0; GO TO L1; 08300400
DS:= 6 LIT"IN USE"; GO TO L; 08300600
L1: DS:=14 LIT"NO OUTPUT UNIT"; GO TO L; 08300800
L0: DS:=11 LIT"NOT ON DISK"; 08301000
L : DS:= 2 LIT")~"; 08301200
END; 08301400
SPIT: SPOUT(BUFF 08301600
$ SET OMIT = NOT (DATACOM AND DCSPO) 08301650
); 08301800
END; 08302000
END OF PB KEYBOARD MESSAGE HANDLER; 08302500
SAVE PROCEDURE INITIALIZE; FORWARD; 08303000
REAL ACTDATE=INITIALIZE; 08303100
SAVE REAL PROCEDURE COREND; FORWARD; 08303200
REAL WEEKDAY=COREND; 08303300
PROCEDURE TIMEOUT (B); VALUE B; REAL B;% 08305000
BEGIN INTEGER M,H,C;% 08306000
C ~XCLOCK/3600;% 08307000
M ~ C MOD 60;% 08308000
H ~ C DIV 60;% 08309000
STREAM(H,M,B);% 08310000
BEGIN DS ~ 9 LIT " TIME IS ";% 08311000
SI ~ LOC H; DS ~ 2 DEC; DS ~ 2 DEC;% 08312000
DS ~ LIT "~"% 08313000
END;% 08314000
SPOUT(B INX MEMORY[B-1]); 08315000
END;% 08316000
PROCEDURE GIMEDATE(B,DT); VALUE B,DT; REAL B,DT; 08317000
%% PARAMETER USE IS: 08317100
%% B=OUTPUT AREA FOR MESSAGE OR DATE 08317200
%%DT=0 RECONVERT ACTDATE,WEEKDAY THEN SPOUT TIME MSG 08317300
%% DT>0 SPOUT TIME MSG ONLY 08317400
%% DT<0 CONVERT MMDDYY USING DT (ACTDATE,WEEKDAY NOT CHANGED) 08317500
BEGIN REAL M,D,Y,NCV,NMG; 08318000
REAL SUBROUTINE DAY; 08318100
BEGIN;STREAM(M:X~0,Y~0,Z~0); 08318200
BEGIN DI~LOC X; DS~24 LIT"000~0%1.1Y2G2V3D3T4A4 5>";08318300
DI~LOC X; SI~SI+M; SI~SI+M; 08318400
DI~LOC M; DI~DI+6; DS~2 CHR; 08318500
END; 08318600
DAY~P; 08318700
END DAY; 08318800
LABEL DAYS; 08318900
LABEL ON;;% 08319000
IF NOT (NCV~(DT>0)) THEN % NOT PRINT ONLY 08319700
BEGIN 08319900
STREAM(DATE~IF (NMG~DT.[1:1]) THEN DT ELSE DATE,R~[Y]); 08320000
BEGIN SI ~ LOC DATE; SI ~ SI+3;% 08321000
DS~2 OCT; DI~DI-16; DS~3 OCT; 08322000
END;% 08323000
IF Y MOD 4 = 0 AND Y ! 0 THEN% 08324000
BEGIN IF D = 60 THEN% 08325000
BEGIN M~2; GO ON END; 08326000
IF D > 60 THEN D ~D-1;% 08327000
END;% 08328000
FOR M~1 STEP 1 UNTIL 11 DO 08329000
IF DAY}D THEN GO ON; 08330000
ON: M~M-1; 08331000
D~D-DAY; 08332000
IF M<2 THEN P(Y-1,M+11) ELSE P(Y,M-1); 08332100
P(26,|,2,-,10,IDV,D,+,XCH,P(DUP).[36:10],+,+,7,RDV,5,ISN);08332200
:: P(.DAYS,+,LOD); 08332300
M~M+1; 08332400
END ELSE P(WEEKDAY); 08332500
STREAM(M~[M],NMG,NCV,MDY~[ACTDATE],B,DATE,DW~[WEEKDAY]); 08333000
BEGIN NMG(JUMP OUT TO NOMSG); 08334000
SI~LOC M; SI~SI-16; 08334100
NCV(SI~SI+2; JUMP OUT TO NOCNV); 08334300
DS~WDS; SI~SI-6; 08334500
NOCNV: DI~B; DS~9 LIT" DATE IS "; DS~6 CHR; 08334700
DS~5 LIT"DAY, "; B~DI; NCV(JUMP OUT TO NULCV); 08334900
NOMSG: SI~M; NMG(DI~B; JUMP OUT TO NULMS); 08335000
DI~MDY; 08335200
NULMS: DS~4 DEC; DS~2 DEC; DS~2 DEC; 08335400
NMG(JUMP OUT TO OXIT); DI~B; 08335600
NULCV: SI~MDY; SI~SI+2; 08335800
DS~2 CHR; 2(DS~LIT "/"; DS~2 CHR); 08336000
DS:=2 LIT"-("; SI:=LOC DATE; 08336500
SI:=SI+3; DS:=5 CHR; DS:=2 LIT")~"; 08337000
SI:=B; 08337500
3(DI ~ B; DS ~ FILL; SI ~ SI+3; B ~SI);% 08338000
OXIT: END; 08339000
IF DT}0 THEN 08339500
IF NOT NMG THEN SPOUT(B INX MEMORY[B-1]); 08340000
P(XIT); 08340100
DAYS::: " MON"," TUES","WEDNES"," THURS"," FRI"," SATUR", 08340200
" SUN"; 08340300
END;% 08341000
DEFINE DATEOUT(DATEOUT1)=GIMEDATE(DATEOUT1,0)#; %CHANGE DATE & SPOUT IT 08342000
PROCEDURE SETDATE(BUFF); VALUE BUFF; REAL BUFF;% 08343000
BEGIN REAL DY,MN,YR; INTEGER D=DY; REAL B,T=MN; 08344000
REAL SUBROUTINE C; 08344100
BEGIN;STREAM(C~0:B~[B]); 08344200
BEGIN% 08345000
SI ~ B; SI ~ SI+5; SI ~ SC;% 08346000
L: IF SC < "0" THEN% 08347000
BEGIN IF SC = "~" THEN GO TO X;% 08348000
SI ~ SI+1; GO TO L;% 08349000
END;% 08350000
K: IF SC } "0" THEN% 08351000
BEGIN TALLY ~ TALLY+1;% 08352000
SI ~ SI+1; GO TO K END;% 08353000
DI ~ B; B ~ SI; SI ~ LOC B; DS ~ WDS;% 08354000
SI ~ B; B ~ TALLY; DI ~ LOC C;% 08355000
SI ~ SI-B; DS ~ B OCT;% 08356000
X:END;% 08357000
C~P;% 08358000
END C; 08358100
B ~ BUFF;% 08359000
MN~C; DY~C; YR~C;% 08360000
BUFF ~ BUFF.[15:15]-1;% 08361000
IF MN > 0 AND MN { 12 AND% 08362000
DY > 0 AND DY { 31 AND% 08363000
YR > 0 THEN% 08364000
BEGIN;STREAM(M~MN-1:X~0,Y~0,Z~0); 08365000
BEGIN DI~LOC X; DS~24 LIT"000~0%1.1Y2G2V3D3T4A4 5>";08365100
SI~LOC X; SI~SI+M; SI~SI+M; 08365200
DI~LOC M; DI~DI+6; DS~2 CHR; 08365300
END; 08365400
DY~P+DY; 08366000
IF YR MOD 4 = 0 AND MN > 2 AND(YR MOD 100 ! 0 OR% 08367000
YR MOD 400 = 0) THEN% 08368000
DY ~ DY+1;% 08369000
D ~ YR MOD 100 | 1000+DY;% 08370000
STREAM(D,A~[DATE]);% 08371000
BEGIN SI ~ LOC D; DS ~ 8 DEC END;% 08372000
CHANGEDATE(BUFF);% 08373000
END ELSE SPOUT(BUFF INX MEMORY[BUFF -1]); 08374000
END;% 08375000
PROCEDURE CHANGEDATE(BUFF); VALUE BUFF; REAL BUFF;% 08376000
BEGIN REAL B,C,D,T;% 08377000
SLEEP([TOGLE],HOLDMASK); 08378000
LOCKTOG(HOLDMASK); 08379000
B ~ SPACE(30);% 08380000
DISKWAIT(-B,-30,DIRECTORYTOP); 08381000
D:= M[B+1];% 08381100
M[B+1] ~ DATE;% 08383000
M[B+18]:=XCLOCK; 08383100
DISKIO(T,B-1,-30,DIRECTORYTOP); 08384000
IF BUFF!0 THEN 08384100
BEGIN% 08384200
DATEOUT (BUFF);% 08385000
C := TYPEDSPACE(5,MAINTBUFFAREAV);% %167-08385100
M[C ]:= M[C+2]:= 0;% 08385200
M[C+3]:= D;% 08385300
STREAM(DATE,A:=C+1); BEGIN SI:=LOC DATE; DS:=8 OCT; END;% 08385400
LINKUP(17,C);% 08385500
END;% 08385600
SLEEP([T],IOMASK);% 08386000
FORGETSPACE(B);% 08387000
UNLOCKTOG(HOLDMASK); 08388000
END;% 08389000
PROCEDURE SETIME(BUFF); VALUE BUFF; REAL BUFF;% 08390000
BEGIN REAL B=BUFF,T;% 08391000
REAL I,R;% 08392000
LABEL EXIT;% 08393000
REAL CLOCK=XCLOCK;% 08394000
INTEGER CLCK=CLOCK;;% 08395000
T ~ -1;% 08396000
STREAM(B,T~[T]);% 08397000
BEGIN SI ~ B;% 08398000
L: IF SC = " " THEN% 08399000
BEGIN SI ~ SI+1; GO TO L END;% 08400000
IF SC < "0" THEN GO TO X;% 08401000
K: IF SC } "0" THEN% 08402000
BEGIN SI ~ SI+1; TALLY ~ TALLY+1;% 08403000
GO TO K END;% 08404000
B ~ TALLY; SI ~ SI-B; DS ~ B OCT;% 08405000
X:% 08406000
END;% 08407000
BUFF ~ BUFF.[15:15]-1;% 08408000
IF T } 0 AND T DIV 100 < 24 AND T MOD 100 < 60 THEN% 08409000
BEGIN R := TYPEDSPACE(5,MAINTBUFFAREAV);% %167-08410000
M[R+2]:= XCLOCK;% 08410100
CLCK:= (T DIV 100 | 60 + T MOD 100)|3600;% 08410200
CLOCK ~ (CLOCK OR @77)+1;% 08411000
TIMEOUT (BUFF);% 08412000
M[R]:= M[R+3]:= 0;% 08412100
STREAM(DATE,A:=R+1);% 08412200
BEGIN SI:=LOC DATE; DS:=8 OCT; END;% 08412300
LINKUP(17,R);% 08412400
GO TO EXIT;% 08413000
END;% 08414000
SPOUT(BUFF INX MEMORY[BUFF-1]); 08415000
EXIT:% 08416000
END;% 08417000
REAL PROCEDURE FORMESS(BUFF,H1); VALUE BUFF,H1; REAL BUFF,H1; 08418000
BEGIN REAL B,H,U,M1; 08418500
INTEGER I; 08418700
LABEL AGAIN,EXIT,AWAY; 08419000
M1:=M[BUFF.[15:15]-2]; 08419100
STREAM(BUFF:); 08419200
BEGIN SI:=BUFF; 08419300
L: IF SC=" " THEN BEGIN SI:=SI+1; GO TO L END; 08419400
BUFF:=SI; 08419500
END; 08419600
BUFF:=P; 08419700
AGAIN: U:=FORMESS:=UNITIN(TINU,BUFF); 08420000
IF U{31 THEN BEGIN SLEEP([TOGLE],STATUSMASK); 08421000
IF LABELTABLE[U] < 0 THEN% 08422000
BEGIN STREAM(A:=TINU[U],B:=B:=SPACE(5)); 08424000
BEGIN SI ~ LOC A; SI ~ SI + 5; DS ~ 3 CHR;% 08425000
DS:=24LIT" IN USE(TO BE READIED)~"; 08426000
END;% 08427000
SAVEWORD := SAVEWORD AND NOT TWO(U); 08427100
SPOUT(B); 08428000
IF H1 THEN GO AWAY ELSE GO TO EXIT; 08429000
END; 08429500
LABELTABLE[U]:=@114&H1[1:47:1]; 08430000
MULTITABLE[U] ~ 0;% 08431000
I ~ TWO(U);% 08432000
IF H1 THEN B:=NOT 0 ELSE 08433000
BEGIN B:=NOT I; H:=I:=0; 08434000
IF U=23 THEN H:=P(.READERA); 08434100
IF U=24 THEN H:=P(.READERB); 08434200
IF H!0 THEN 08434300
BEGIN UNITCODE[U-23]:=-0; 08434400
IF (*H).[CF]!0 THEN 08434500
BEGIN FORGETSPACE(*H-2); 08434600
M[H]:=0; 08434700
END; 08434800
END; 08434900
END; 08434950
READY ~ READY AND B OR I;% 08435000
RRRMECH ~ RRRMECH AND B OR I;% 08436000
SAVEWORD ~ SAVEWORD AND B OR I;% 08437000
END; 08437050
EXIT: IF NOT H1 THEN 08437100
BEGIN IF U GTR 31 THEN 08437150
BEGIN STREAM(BUFF,B:=B:=SPACE(5)); 08437200
BEGIN DS:=10 LIT"INV KBD RY"; 08437250
SI:=BUFF; DS:=3 CHR; 08437300
DS:=LIT"~"; 08437350
END; 08437400
SPOUT(B INX M1); 08437450
END; 08437500
STREAM(OK:=0,BUFF:); 08437550
BEGIN SI:=BUFF; 08437600
3(IF SC=" " THEN JUMP OUT; 08437650
IF SC="," THEN JUMP OUT; 08437700
IF SC="~" THEN JUMP OUT TO L3; 08437750
SI:=SI+1); 08437800
L1: IF SC=" " THEN 08437850
L2: BEGIN SI:=SI+1; GO TO L1 END; 08437900
IF SC="," THEN GO TO L2; 08437950
BUFF:=SI; 08438000
IF SC!"~" THEN TALLY:=1; 08438050
L3: OK:=TALLY; 08438100
END; 08438150
BUFF:=P; 08438200
IF P THEN GO AGAIN; 08438250
AWAY: FORMESS:=-1; 08438300
END; 08438350
I:=SPACE(30); %146-08438400
DISKWAIT(-I,30,DIRECTORYTOP-SYSNO); %146-08438410
M[I+29]:=SAVEWORD; %146-08438420
DISKWAIT( I,30,DIRECTORYTOP-SYSNO); %146-08438430
FORGETSPACE(I); %146-08438440
END; 08438500
PROCEDURE SUSTATUS(A,DDD,B); VALUE A,DDD,B; REAL A,B; ARRAY DDD[*]; 08438900
FORWARD; 08438910
PROCEDURE OUTPUTLABEL(B); VALUE B; REAL B;% 08439000
BEGIN REAL BU=B,U,T,A;% 08440000
REAL G,Q;% 08441000
REAL TUSTA,TEMP; 08441050
BOOLEAN SCHTOG; 08441100
LABEL EXIT;% 08442000
SUBROUTINE DOIT;% 08443000
BEGIN; STREAM(A~TINU[U]:B);% 08444000
BEGIN SI ~ LOC A; SI ~ SI+5; DS ~ LIT" ";% 08445000
DS ! 3 CHR; DS ~ LIT " "; A ~ DI END;% 08446000
A ~ P; T ~ LABELTABLE[U];% 08447000
IF U LSS 16 THEN TEMP:=PRNTABLE[U].[30:18]; 08447100
IF T=0 THEN 08448000
STREAM(B:=TEMP,V:=(U LSS 16),A); 08448050
BEGIN SI:=LOC V;SI:=SI+7; 08448100
IF SC NEQ "0" THEN BEGIN SI:=LOC B;DS:=5DEC END; 08448110
DS:=9LIT" SCRATCH~" END 08448150
ELSE IF T = @114 OR T = @214 THEN% 08449000
BEGIN 08450000
STREAM(SAV:=((TWO)U) AND SAVEWORD) NEQ 0),A); 08450100
BEGIN 08450200
DS:=10LIT"NOT READY~"; 08450300
SAV(DI:=DI-1; DS:=8LIT"(SAVED)~"); 08450400
END 08450500
END 08450600
ELSE IF ABS(T)=@314 THEN 08451000
STREAM(B:=TEMP,V:=(U LSS 16),A); 08451100
BEGIN SI:=LOC V; SI:=SI+7; 08451200
IF SC NEQ "0" THEN BEGIN SI:=LOC B;DS:=5DEC END; 08451210
DS:=11 LIT " UNLABELED~"; 08452000
END 08452100
ELSE BEGIN;% 08453000
STREAM(K:=T<0: TEMP, V:=U<16, A); 08454000
BEGIN V(SI:=LOC TEMP; DS:=5 DEC; DS:=LIT" "); 08454500
CI:=CI+K; GO TO LAB; 08455000
DS:=6 LIT"IN USE"; GO TO L; 08455500
LAB: DS:=7 LIT"LABELED"; 08456000
L: DS:=LIT" "; K:=DI; 08457000
END; 08458000
A ~ P;% 08459000
IF (NT1 ~ RDCTABLE[U].[8:6]) ! 0 THEN% 08460000
IF JARROW[NT1] ! 0 THEN% 08461000
BEGIN;STREAM(J~JARROW[NT1]:NT1,A);% 08462000
BEGIN DS ~ 3 LIT "BY "; SI ~ J;% 08463000
SI ~ SI+1; DS ~ 7 CHR;% 08464000
DS ~ LIT "/"; SI ~ SI+1;% 08465000
DS ~ 7 CHR; DS ~ LIT "=";% 08466000
SI~LOC NT1; DS~2DEC; 08467000
DS ~ LIT ":"; J ~ DI;% 08468000
DI~DI-3; DS~FILL; 08468500
END;% 08469000
A ~ P;% 08470000
END ELSE ELSE 08471000
IF T<0 AND (U=23 OR U=24) THEN 08471010
BEGIN 08471020
STREAM(S:=0 : A); 08471030
BEGIN 08471040
DS:=22LIT"BY AUTO LOAD CONTROL: "; 08471050
S:=DI; 08471060
END; 08471070
A:=P; 08471080
END ELSE 08471090
IF U GEQ 20 AND U LEQ 22 THEN 08471100
IF LABELTABLE[U].[1:5]=@21 THEN 08471105
BEGIN STREAM(S:=0,A); 08471110
BEGIN 08471120
DS:=13 LIT "BY SCHEDULED "; 08471130
DS:=13 LIT "PRNPBT/DISK: "; 08471140
S:=DI; 08471150
END; 08471160
A:=P; 08471170
END; 08471180
STREAM(S~0:K~MULTITABLE[U],T,R~RDCTABLE[U]. 08472000
[14:10],D~RDCTABLE[U].[24:17],C~RDCTABLE[U].% 08473000
[41:7],A); BEGIN SI ~ LOC K;% 08474000
2(SI ~ SI+1; DS ~ 7 CHR; DS ~ LIT " ");% 08475000
DS ~ 3 DEC; DS ~ LIT " ";% 08476000
DS ~ 5 DEC; DS ~ LIT " ";% 08477000
DS ~ 2 DEC; DS ~ LIT "~";% 08478000
S~DI; 08478500
END; 08478600
A~P; 08478700
IF U}32 THEN IF CIDROW[U -32]!0 THEN 08478800
STREAM(DK~CIDTABLE[U -32,2],A); 08478900
BEGIN 08479000
DI~DI-1; 08479100
$ SET OMIT = NOT(PACKETS) 08479109
DS:=5 LIT ",PKT "; 08479110
$ POP OMIT 08479111
$ SET OMIT = PACKETS 08479199
SI~LOC DK; SI~SI+1; 08479300
DS~7 CHR; 08479400
END; 08479500
END; 08479600
SPOUT(B INX TUSTA); 08480000
B ~ 0;% 08481000
END;% 08482000
TUSTA~M[B.[15:15]-2]; 08482050
IF (U ~ UNITIN(TINU,B)){ PSEUDOMAXT THEN 08483000
BEGIN B ~ B.[15:15]-1;% 08484000
IF (U OR 1)=19 THEN SUSTATUS(B INX TUSTA,0,U) ELSE 08484500
DOIT;% 08485000
GO TO EXIT;% 08486000
END;% 08487000
$ SET OMIT = SHAREDISK 08487099
SCRTOG ~ U = PSEUDOMAXT + 1; 08487100
$ POP OMIT 08487101
$ SET OMIT = NOT(SHAREDISK) 08487199
STREAM(A~0:B);% 08488000
BEGIN SI ~ B;% 08489000
L: IF SC = " " THEN% 08490000
BEGIN SI ~ SI+1; GO TO L END;% 08491000
DI ~ LOC A; DI ~ DI+6; DS ~ 2 CHR;% 08492000
END;% 08493000
Q ~ P; B ~ B.[15:15]-1;% 08494000
FOR U ~ 0 STEP 1 UNTIL PSEUDOMAXT DO 08495000
IF TINU[U].[30:12] = Q THEN% 08496000
IF (G ~ LABELTABLE[U])!0 AND G!@114 AND G!@214 08497000
AND NOT SCRTOG OR G=0 AND SCRTOG THEN 08497100
BEGIN IF B = 0 THEN B ~ SPACE(10);% 08498000
DOIT;% 08499000
END;% 08500000
IF B ! 0 THEN% 08501000
BEGIN;STREAM(Q,R);% 08502000
BEGIN DS ~ 6 LIT " NULL ";% 08503000
SI ~ LOC Q; SI ~ SI+6; DS ~ 2 CHR;% 08504000
DS ~ 7 LIT " TABLE~";% 08505000
END;% 08506000
SPOUT(B INX TUSTA); 08507000
END;% 08508000
EXIT: END;% 08509000
PROCEDURE TIMEUSED(B, X); 08525000
VALUE B, X; 08526000
REAL B, X; 08527000
BEGIN INTEGER T, H, M, S, CPT, IOT, ET; 08528000
$ SET OMIT = NOT(PACKETS) 08528499
DEFINE UNITNO = PSEUDOMIX[X]#; 08528500
$ POP OMIT 08528501
REAL SUBROUTINE CONVERTIME; 08529000
BEGIN S ~ T-60|(T ~ T DIV 60); 08530000
M ~ T-60|(H ~ T DIV 60); 08531000
STREAM(R~0: A~[H]); 08532000
BEGIN DI~LOC R; DI~DI+2; SI~A; 3(DS~2 DEC) END; 08533000
CONVERTIME ~ POLISH 08533100
END; 08533200
T ~ JAR[X,3]+PROCTIME[X]; 08533400
$ SET OMIT = NEWLOGGING 08533499
IF X=P2MIX OR X=P1MIX THEN 08533500
$ POP OMIT 08533501
$ SET OMIT = NOT(NEWLOGGING) 08533599
T ! T+CLOCK+P(RTR); 08533700
T ~ T/60; CPT ~ CONVERTIME; 08534000
T ~ JAR[X,4]+IOTIME[X]; 08535000
WHILE T<0 DO T ~ T+CLOCK+P(RTR); 08536000
T ~ T/60; IOT ~ CONVERTIME; 08537000
T ~ ((CLOCK+P(RTR))/60)-NFO[(X-1)|NDX+2].[1:17]; 08538000
ET ~ CONVERTIME; 08538500
STREAM(J~JARROW[X],X,T~[CPT],B); 08540000
BEGIN DS~10 LIT " TIME FOR "; SI~J; SI~SI+1; DS~7 CHR; 08540100
SI~SI+1; DS~LIT "/"; DS~7 CHR; DS~LIT"="; 08540200
SI~LOC X; DS~2 DEC; X~DI; DI~DI-2; DS~FILL; 08540300
DI~X; DS~8 LIT " IS: CP="; SI~T; SI~SI+2; 08541000
3(DS~LIT ":"; DS~2 CHR); 08542000
X~DI; DI~DI-9; DS~8 FILL; DI~X; 08543000
DS~5 LIT ", IO="; SI~SI+2; 08544000
3(DS~LIT ":"; DS~2 CHR); 08544100
X~DI; DI~DI-9; DS~8 FILL; DI~X; 08544200
DS~3 LIT " IN"; SI~SI+2; 08544300
3(DS~LIT ":"; DS~2 CHR); DS~LIT "~"; 08544400
DI~DI-10; DS~8 FILL 08544500
END; 08544600
SPOUTER(B INX MEMORY[B-1],UNITNO,1); 08544700
COMMENT MESSAGE PRESENTLY 72 CHARACTERS LONG; 08544800
END; 08545000
REAL PROCEDURE ANVIL(IL,Z); VALUE IL,Z; REAL IL,Z;% 08546000
BEGIN REAL B=Z,U=+1;% 08547000
REAL ZZ; 08547050
LABEL EXIT; 08547100
ZZ:=Z; 08547200
NAMEID(U,ZZ); 08547300
NAMEID(U,ZZ); 08547400
IF U="/ " THEN 08547500
BEGIN U:=Z.[15:15]; GO EXIT END ELSE 08547600
IF (U ~ UNITIN(TINU,B)) { PSEUDOMAXT THEN 08548000
BEGIN% 08549000
IF LABELTABLE[U] = @114 OR LABELTABLE[U] = @214 THEN% 08550000
BEGIN 08551000
STREAM(A:=TINU[U],SAV:=((TWO(U) AND SAVEWORD) ! 0 ), 08551100
X:=Z.[15:15]-1); 08551200
BEGIN 08551300
SI:=LOC A; SI:=SI+5; DS:=3CHR; 08552000
DS:=11LIT" NOT READY~"; 08553000
SAV(DI:=DI-1; DS:=8LIT"(SAVED)~"); 08554000
END; 08554100
U ~ PSEUDOMAXT + 1; 08555000
END ELSE 08556000
IF LABELTABLE[U] < 0 THEN% 08557000
BEGIN;STREAM(A~TINU[U],X~Z.[15:15]-1);% 08558000
BEGIN SI ~ LOC A; SI ~ SI+5;% 08559000
DS ~ 3 CHR; DS ~ 8 LIT " IN USE~";% 08560000
END;% 08561000
U ~ PSEUDOMAXT + 1; 08562000
END;% 08563000
IF U { PSEUDOMAXT THEN 08564000
LABELTABLE[U] ~ -(IF IL THEN *P(DUP) ELSE @314);% 08565000
EXIT: END; END; 08566000
PROCEDURE LOGOUT(A); VALUE A; REAL A; 08568000
BEGIN REAL RCW=+0; 08568100
REAL MSCW=-2; 08568125
INTEGER I=RCW+1; 08568150
REAL J=I+1, L=J+1; % L MUST BE LAST DECLARATION. 08568200
LABEL EXIT; 08568300
P(0,0,SPACE(335)); % INITIALIZES L 08568600
IF (J:=DIRECTORYSEARCH("SYSTEM ","LOG ",4))=0 THEN 08568700
BEGIN; 08568800
STREAM(L); 08568900
BEGIN DS:=10 LIT "-NULL LOG~" END; 08569000
GO TO EXIT; 08569100
END; 08569200
IF LOGFREE GTR 0 THEN SLEEP([LOGFREE],-0); 08569300
LOGFREE:=ABS(LOGFREE); 08569400
$ SET OMIT = NOT(SHAREDISK) 08569499
MOVE(30,J INX 0,L); 08569600
M[L+10] ~ GETUSERDISK(-(M[L+8]~M[L+8]+10)); % GET XTRA TEN 08569700
DO BEGIN % TO MAKE COPY 08569800
DISKWAIT (-L-31,300,M[J+10]+I); % SIMPLER 08569900
DISKWAIT ( L+31,300,M[L+10]+I); 08569910
END UNTIL (I~I+10)}M[J+8]; 08569920
LOGFREE ~ M[J+10]; 08570000
J:=J INX 0; 08570300
M[J]:=M[J+2]:=M[J+3]:=0; 08570400
M[J+1]:=M[J+8]|6; 08570500
M[J+4]:="DISKLOG"; 08570600
M[J+5]:=4; 08570700
DISKWAIT(J,30,LOGFREE); 08570800
$ SET OMIT = NOT(SHAREDISK) 08570849
LOGFREE~NABS(LOGFREE); 08570870
P(DIRECTORYSEARCH(-"SYSTEM ","LOG ",14),DEL); 08570880
IF HOLDFREE=0 THEN SLEEP([TOGLE],HOLDMASK); 08571000
LOCKTOG(HOLDMASK); 08571100
DISKWAIT(-J,-30,DIRECTORYTOP); 08571200
I:=(M[J+20].[8:10]+1) MOD 1000; 08571300
M[J+20]:=(*P(DUP))&I[8:38:10]; 08571400
DISKWAIT(J,-30,DIRECTORYTOP); 08571500
UNLOCKTOG(HOLDMASK); 08571600
STREAM(J~[ACTDATE],D~[I]); 08571800
BEGIN SI:=D;DS:=8 DEC;DI:=DI-7;SI:=J; 08571900
SI~SI+2; DS~4 CHR; 08572000
END; 08572300
FORGETSPACE(J); 08572400
M[L+4]:=(*P(DUP))&0[1:43:5]&1[11:47:1]&0[12:44:4]; 08572500
M[L+1]~XCLOCK+P(RTR); 08572510
STREAM(DATE,A~0,B~L+1); 08572520
BEGIN SI~ LOC DATE;DI~LOC A;DS~8 OCT;SI~LOC A; 08572530
SI~SI+5;DI~B;DI~DI+1;DS~3 CHR; END; 08572540
ENTERUSERFILE(-I,"SYSLOG ",L-1); 08572600
STREAM(I,L); 08572700
BEGIN DS:=21 LIT"**** NEW LOG FILE IS ";SI:=LOC I;SI:=SI+1; 08572800
DS:=7 CHR;DS:=8 LIT"/SYSLOG~" ; 08572900
END; 08573000
EXIT: 08573100
SPOUT(L); 08573200
IF A THEN KILL([MSCW]); 08573300
END; 08573400
PROCEDURE SAVETHEUNIT(B); VALUE B; REAL B;% 08575000
BEGIN REAL A=B,T,U,I,M1; 08576000
LABEL AGAIN,EXIT; 08576100
M1:=M[B.[15:15]-2]; 08577000
STREAM(B:); 08577100
BEGIN SI:=B; 08577200
L: IF SC=" " THEN BEGIN SI:=SI+1; GO TO L END; 08577300
B:=SI; 08577400
END; 08577500
B:=P; 08577600
AGAIN: T:=SPACE(10); 08577700
IF (U:=UNITIN(TINU,A)) GTR 31 THEN 08578000
STREAM(A,T); 08578100
BEGIN DS:=10 LIT"INV KBD SV"; 08578200
SI:=A; DS:=3 CHR; 08578300
DS:=LIT"~"; 08578400
END ELSE 08578500
BEGIN I ~ TWO(U);% 08579000
SLEEP([TOGLE],STATUSMASK); 08580000
IF LABELTABLE[U] } 0 THEN% 08581000
BEGIN LABELTABLE[U] ~ @114;% 08582000
MULTITABLE[U]~RDCTABLE[U]~0; 08582100
RRRMECH ~ RRRMECH OR I;% 08583000
READY ~ READY OR I;% 08584000
SAVEWORD := SAVEWORD OR I; 08584100
I ~ " ";% 08585000
END% 08586000
ELSE BEGIN SAVEWORD ~ SAVEWORD OR I;% 08587000
I ~ " TO BE";% 08588000
END;% 08589000
STREAM(A~TINU[U],I,T);% 08590000
BEGIN DS ~ LIT " ";% 08591000
SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR;% 08592000
SI ~ SI+2; DS ~ 6 CHR;% 08593000
DS ~ 7 LIT " SAVED~";% 08594000
END;% 08595000
END;% 08596000
SPOUT(T INX M1); 08597000
STREAM(OK:=0,A:); 08597050
BEGIN SI:=A; 08597100
3(IF SC=" " THEN JUMP OUT; 08597150
IF SC="," THEN JUMP OUT; 08597200
IF SC="~" THEN JUMP OUT OT L3; 08597250
SI:=SI+1); 08597300
L1: IF SC=" " THEN 08597350
L2: BEGIN SI:=SI+1; GO TO L1 END; 08597400
IF SC="," THEN GO TO L2; 08597450
A:=SI; 08597500
IF SC!"~" THEN TALLY:=1; 08597550
L3: OK:=TALLY; 08597600
END; 08597650
A:=P; 08597700
IF P THEN GO AGAIN; 08597750
T:=SPACE(30); %146-08597800
DISKWAIT(-1,30,DIRECTORYTOP-SYSNO); %146-08597810
M[T+29]:=SAVEWORD; %146-08597820
DISKWAIT( T,30,DIRECTORYTOP-SYSNO); %146-08597830
FORGETSPACE(T); %146-08597840
END;% 08598000
BOOLEAN PROCEDURE WHYSLEEP(MASK); VALUE MASK; REAL MASK; 08599000
BEGIN 08600000
REAL A, B; 08601000
IF REPLY[P1MIX]=VWY THEN 08602000
BEGIN 08603000
B:=SPACE(KEYMSGSZ); 08604000
DISKWAIT(-B,KEYMSGSZ,MESSAGETABLE[2].[22:26]); 08604100
STREAM(B,MASK,T:=0,O:=0,D:=0,A:=A:=SPACE(4)); 08605000
BEGIN 08606000
SI:=LOC MASK; 08607000
8(IF SC="0" THEN GO TO NEXT; 08608000
IF SC=VWY THEN 08609000
BEGIN 08610000
DI:=A; DS:=3LIT" DS"; A:=DI; GO TO NEXT; 08611000
END; 08612000
T:=SI; DI:=LOC 0; DI:=DI+7; DS:=CHR; 08613000
SI:=LOC O; DI:=LOC D; DI:=DI+6; DS:=2DEC; 08614000
SI:=B; 08615000
R: SI:=SI+6; DI:=DI-2; 08616000
IF SC="*" THEN % END OF FIRST PART OF TABLE 08617000
BEGIN 08617500
SI:=T; GO TO NEXT; 08618000
END; 08618500
IF 2SC NEQ DC THEN GO TO R; 08619000
SI:=SI-6; DI:=A; DS:=LIT" "; DS:=2CHR; A:=DI; SI:=T; 08619500
NEXT: SI:=SI+1); 08620000
DI:=A; DS:=LIT"~"; 08620500
END STREAM STATEMENT; 08621000
SPOUT(A); 08621500
FORGETSPACE(B); 08621600
END % IF "WY" 08622000
ELSE WHYSLEEP:=TRUE; 08622500
END PROCEDURE WHYSLEEP; 08623000
PROCEDURE CHANGEOPTION(BUFF,RS);% 08624000
VALUE BUFF,RS;REAL BUFF,RS;% 08625000
BEGIN REAL B,T,OP,BUS,MASK,OPTER; 08626000
SLEEP([TOGLE],HOLDMASK); 08627000
LOCKTOG(HOLDMASK); 08628000
BUS ~ BUFF.[15:15]-1; B ~ SPACE(30);% 08629000
DISKIO(T,1-B,-30,DIRECTORYTOP-SYSNO); 08630000
OPTER ~ SPACE(OPTIONSZ); 08630100
DISKWAIT(-OPTER,OPTIONSZ,MESSAGETABLE[0].[22:26]); 08631000
STREAM(BUFF,T~0,OPTER,R~[OP]);% 08632000
BEGIN% 08633000
L0: SI~BUFF; %535-08634000
L1: IF SC=" " THEN BEGIN SI~SI+1; GO TO L1; END; %535-08635000
IF SC<"0" THEN %535-08636000
IF SC!"~" THEN %535-08637000
BEGIN TALLY~0; T~TALLY; DI~LOC T; %535-08638000
8(IF SC=" " THEN JUMP OUT ELSE %535-08639000
IF SC="~" THEN JUMP OUT ELSE %535-08640000
IF SC}"0" THEN JUMP OUT ELSE DS ~CHR); %535-08641000
BUFF~SI; SI~OPTER; %535-08642000
63(DI~LOC T; %535-08643000
IF 8 SC=DC THEDN JUMP OUT TO L2 ELSE %535-08644000
IF SC="~" THEN JUMP OUT TO L0 ELSE TALLY~TALLY+1);08645000
GO TO L3; %535-08646000
L2: IF SC="~" THEN GO TO L0; %535-08647000
END ELSE %535-08648000
L3: TALLY~48 ELSE %535-08649000
BEGIN DI~LOC T; SI~SI+1; %535-08650000
IF SC<"0" THEN BEGIN SI~SI-1; DS~1 OCT; END %535-08651000
ELSE BEGIN SI~SI-1; DS~2 OCT; END; %535-08652000
TALLY~47; T(TALLY~TALLY+63); %535-08653000
END; %535-08654000
T~TALLY; SI~LOC T; DI~R; DS~WDS; %535-08655000
END;% 08657000
IF OP<47 THEN 08658000
BEGIN;STREAM(A ~ IF RS THEN " RESET" ELSE " SET",% 08659000
O~OPTER INX OP,OP ~ 47-OP,BUS);% 08660000
BEGIN DS ~ LIT " "; SI ~ LOC OP; DS ~ 2 DEC;% 08661000
DS ~ LIT " "; SI ~ O;% 08662000
8(IF SC=0 THEN JUMP OUT TO L; DS~CHR);% 08663000
L: SI ~ LOC A; SI ~ SI+2; DS ~ 6 CHR;% 08664000
DS ~ LIT"~";% 08665000
END;% 08666000
MASK~TWO(OP);% 08667000
M[BUS-1].[9:9]:=0; 08667100
END;% 08668000
SPOUT(BUS INX M[BUS-1]); 08669000
SLEEP([T],IOMASK); 08670000
M[B]~OPTION~IF RS THEN OPTION AND NOT MASK ELSE OPTION OR MASK;08671000
DISKWAIT(B,-30,DIRECTORYTOP-SYSNO); 08673000
FORGETSPACE(OPTER);% 08674000
FORGETSPACE(B);% 08676000
UNLOCKTOG(HOLDMASK); 08677000
END;% 08678000
PROCEDURE TYPOP(KTR,PO); VALUE KTR,PO; REAL KTR,PO; 08679000
BEGIN REAL VASE,TUSTA,N,X,OPTER; 08680000
LABEL INCR; 08680500
REAL SUBROUTINE SETT; 08681000
BEGIN 08681100
STREAM(OPT:=[OPTION]:OPTER,N,NBS:=47-N,VASE); 08681200
BEGIN 08681300
DI:=DI+4; 08682000
SI~OPTER;N(SI~SI+8);IF SC="~" THEN GO TO EXIT;% 08683000
8(IF SC<"0" THEN DS~CHR ELSE DS~1 LIT" ");DS~2 LIT" ";% 08684000
SI:=OPT; SKIP NBS SB; 08684500
IF SB THEN TALLY:=1 ELSE 08685000
BEGIN DS:=3 LIT"NOT"; TALLY:=2; END; 08685500
DS~5 LIT" SET~";% 08686000
DI:=VASE; SI:=LOC NBS; DS:=LIT" "; DS:=2 DEC; DS:=LIT" "; 08686500
EXIT: OPT:=TALLY; 08687000
END; 08688000
SETT~P; 08689000
END SETT; 08689100
% 08689110
SLEEP([TOGLE],HOLDMASK); 08689200
LOCKTOG(HOLDMASK); 08689300
TUSTA:=M[(VASE:=KTR.[15:15]-1)-1]; 08689900
OPTER ~ SPACE(OPTIONSZ)&OPTIONSZ[8:38:10]; 08690000
DISKWAIT(-OPTER,OPTIONSZ,MESSAGETABLE[0].[22:26]); 08690020
IF PO THEN 08690080
BEGIN 08690090
STREAM(BUFF:=KTR, T:=0, OPTER, D:=[N]); 08690100
BEGIN SI~BUFF;63(IF SC=" " THEN SI~SI+1 ELSE JUMP OUT TO L);L: 08690110
IF SC GEQ "0" THEN GO TO L4; 08690120
DI~LOC T; 08690130
8(IF SC=" " THEN JUMP OUT TO L1 ELSE 08690140
IF SC="~" THEN JUMP OUT TO L1 ELSE 08690150
IF SC}"0" THEN JUMP OUT TO L1 ELSE 08690160
DS~1 CHR); L1: 08690170
TALLY~0; BUFF~SI; SI~OPTER; 08690180
63(DI~LOC T;IF 8 SC!DC THEN 08690190
BEGIN IF SC="~" THEN 08690200
BEGIN TALLY~48; JUMP OUT TO L3 END 08690210
ELSE TALLY~TALLY+1; 08690220
END ELSE JUMP OUT TO L2); TALLY~48;GO TO L3;L2: 08690230
IF SC="~" THEN BEGIN SI~BUFF;63(IF SC<"0" THEN SI~SI+1 08690240
ELSE JUMP OUT TO L4); L4: DI~LOC T; SI~SI+1; 08690250
IF SC<"0" THEN BEGIN SI~SI-1; SI~1 OCT END ELSE 08690260
BEGIN SI~SI-1; DS~2 OCT END; 08690270
TALLY~47; T(TALLY~TALLY+63); 08690280
END; 08690290
L3: T~TALLY; SI~LOC T; DI~D; DS~ WDS; 08690300
END; 08690310
IF N LSS OPTER.[8:10] THEN P(SETT,DEL); 08690400
SPOUT(VASE INX TUSTA); 08690600
END ELSE 08690800
BEGIN 08691000
STREAM(KTR:); 08691200
BEGIN SI:=KTR; 08691400
IF SC="S" THEN TALLY:=1 ELSE 08691600
IF SC="R" THEN TALLY:=2 ELSE TALLY:=3; 08691800
KTR:=TALLY; 08692000
END; 08692200
X:=P; N:=-1; 08692400
INCR: N:=N+1; 08692600
IF ((KTR:=SETT) AND X) ! 0 THEN 08692800
BEGIN SPOUT(VASE INX TUSTA); 08693000
VASE:=SPACE(3); 08693200
GO TO INCR; 08693400
END; 08693600
IF KTR=0 THEN 08693800
IF X!3 THEN 08694000
BEGIN STREAM(X:=X=1, VASE); 08694200
BEGIN DS:=12 LIT" ALL OTHERS "; 08694400
X(DS:=4 LIT"NOT "); 08694600
DS:=4 LIT"SET~"; 08694800
END; 08695000
SPOUT(VASE INX TUSTA); 08695200
END ELSE FORGETSPACE(VASE); 08695400
ELSE GO TO INCR; 08695600
END; 08695800
FORGETSPACE(OPTER);% 08696000
UNLOCK(HOLDMASK); 08696100
END;% 08697000
$ SET OMIT = NOT(DISKLOG) 08697099
% THE FOLLOWING THREE DEFINES MUST EACH BE CHANGED IF THE 08699000
% DISK ROW SIZE OF PBD AND PUD FILES IS TO BE CHANGED. 08699050
DEFINE PBDROWSZ = 08699100
300# % %732-08699150
% PBDROWSZ IS THE DISK ROW SIZE, IN SEGMENTS, OF PBD AND 08699200
% PUD FILES. PBDROWSZ MUST BE A MULTIPLE OF THREE. 08699250
,PBDRECS = 08699300
100# % %732-08699350
% PBDRECS=PBDROWSZ/3 : NO. OF LOGICAL RECORDS PER ROW. 08699400
,PBDTOTRECS = 08699450
2000# % %732-08699500
;% PBDTOTRECS=PBDRECS|20 : NO. OF TOTAL RECORDS PER BACK-UP FILE. 08699550
PROCEDURE PBIO(ALPHA,POINTER); VALUE ALPHA; REAL ALPHA,POINTER; %P 08700000
% 08700900
% THIS PROCEDURE HANDLES IO FOR THE CREATION OF BACK-UP FILES. FOR 08700910
% DISK, IT OBTAINS NEW ROWS AND NEW FILES AS NECESSARY. IF IT RUNS 08700920
% OUT OF FILES, HEADER[5].[4:1] IS SET AND THE JOB TERMINATED, LEAVING08700930
% ONE BLOCK FOR THE LABEL AND DS MESSAGE. 08700940
% 08700950
% ALPHA IS ADDRESS OF TOP I/O DESCRIPTOR. <0 MEANS READ %P 08701000
% POINTER IS FIB[14] %P 08702000
BEGIN NAME HEADER; 08703000
REAL T=-2,IOD,H,S; 08704000
INTEGER I=IOD; 08704100
LABEL OK; 08704500
POINTER.[FF]~POINTER INX 72; %P 08705000
IF (HEADER~POINTER.[3:15])!0 THEN %%%%PB ON DISK %%%%% %P 08706000
BEGIN 08707000
HEADER := [M[(*HEADER)]]; 08707500
IF HEADER[7] GEQ PBDTOTRECS-2 THEN % CHECK FOR NEW FILE 08708000
BEGIN 08708200
$ SET OMIT = PACKETS 08708400
IF HEADER[6].[42:6]="9" THEN 08709000
$ POP OMIT OMIT 08709200
IF HEADER[7] GEQ PBDTOTRECS THEN P(XIT) ELSE 08709400
IF HEADER[5].[4:1] THEN GO TO OK ELSE 08709500
BEGIN STREAM(F:=PRT[P1MIX,3] INX M[M[ALPHA-3] INX 4].08709600
[13:11], H:=H:=NABS(SPACE(12))); 08709800
BEGIN SI:=F; SI:=SI+1; 08710000
DS:=24 LIT"TOO MANY BACKUP RECS ON "; 08710200
DS:=7 CHR; DS:=LIT"/"; SI:=SI+1; DS:=7 CHR;08710400
DS:=2 LIT":~"; 08710600
END; 08710800
HEADER[5].[4:1]:=1; 08711000
GO TO OK; 08711200
END; 08711400
IF HEADER[7] GEQ PBDTOTRECS THEN % GET A NEW FILE 08711600
BEGIN 08711800
IF I:=HEADER[5].[3:1] THEN HEADER[5].[3:1]:=0; 08712000
H~SPACE(30); S~M[HEADER INX NOT 0]; 08712100
DISKWAIT(-H,30,S); 08712110
M[H+7]~HEADER[7]; 08712120
M[H+5].[2:1]~0; 08712130
DISKWAIT(H,30,S); 08712140
M[H+7]~M[H+9]~0; 08712150
MOVE(20,H+9,H+10); 08712160
M[H+5]~(*P(DUP)) OR H; 08712170
HEADER[5].[3:1]:=1; %SET CP BK UP TOG 08712200
HEADER[7] := 0; 08712500
HEADER[3] := XCLOCK + P(RTR); 08713000
STREAM(ONE:=1, H:=[HEADER[6]]); 08713250
BEGIN SI:=LOC ONE; DS:=8 ADD; 08713500
DI:=DI+24; 20(DS:=8 LIT"0"); 08713750
END; 08714000
M[H+7]~PBDROWSZ DIV 3; 08714110
HEADER[9]~M[H+9]~1; 08714120
HEADER[10]~M[H+10]~GETUSERDISK(-(PBDROWSZ+1)); 08714130
M[HEADER INX NOT 0] := EUF(-(IF I THEN "PUD " 08714140
ELSE "PBD "),HEADER[6],H-1); 08714150
FORGETSPACE(H); 08714170
$ SET OMIT = PACKETS 08714199
FILEMESSAGE((IF I THEN "PUD " ELSE 08714300
"PBD ")&HEADER[6][24:6:24], 08714310
"OUT " &HEADER[6][30:30:18], 08714320
0," ",0,0,0, 08714330
(PBDREL OR OPNMESS)); 08714340
END; 08714400
END ELSE 08714500
IF HEADER[7] MOD PBDRECS=0 THEN %GET NEW ROW 08715000
BEGIN H:=SPACE(30); S:=M[HEADER INX NOT 0]; 08715100
DISKWAIT(-H,30,S); 08715200
HEADER[9+HEADER[9]~*P(DUP)+1]~ 08716000
GETUSERDISK(-(PBDROWSZ+1)); 08716010
M[H+9+HEADER[9]]~HEADER[9+HEADER[9]]; 08716100
M[H+9]~HEADER[9]; 08716110
M[H+7]~HEADER[7] + PBDROWSZ DIV 3; 08716200
DISKWAIT(H,30,S); 08716300
FORGETSPACE(H); 08716500
END; 08716600
OK: 08716800
STREAM(A~1~HEADER[HEADER[9]+9]+(HEADER[7] MOD 08717000
PBDRECS)|3,D~POINTER.[CF]-1); 08718000
BEGIN SI~LOC A; DS~8 DEC END; %P 08720000
HEADER[7]~(*P(DUP))+1; %P 08721000
IOD~@141330100477777; 08722000
END ELSE %% ON TAPE %% %P 08723000
IOD~@21320500000000&M[POINTER INX NOT 1][3:14:4]; %P 08724000
IOREQUEST(M[ALPHA],POINTER INX IOD&ALPHA[24:1:1], %P 08726000
M[POINTER INX NOT 1]); 08727000
M[T]~IOD INX M[T]$0[26:26:7]&0[19:19:1] AND NOT M; 08728000
IF H LSS 0 THEN 08728500
BEGIN TERMINATE(P1MIX); 08728600
TERMINALMESSAGE(H); 08728700
END; 08728800
END PBIO; 08729000
PROCEDURE TIMERELAXER(KTR,TYPE,MIX);% 08730000
VALUE KTR,TYPE,MIX;% 08731000
REAL KTR,TYPE,MIX;% 08732000
BEGIN INTEGER BUFF,PRT,IOT,T,P1,I1;% 08733000
LABEL SPIT;% 08734000
DEFINE VCT = 29#, % CHANGE TIME LIMITS 08734010
VXT = 30#, % EXTEND TIME LIMITS 08734020
VTL = 31#; % PRINT TIME LIMITS 08734030
COMMENT: THIS ROUTINE SHOULD BE BLAMED ON WWF4;% 08734100
$ SET OMIT = NOT(PACKETS) 08734499
DEFINE UNITNO = PSEUDOMIX[MIX]#;% 08734500
$ POP OMIT 08734501
BUFF ~ KTR.[15:15]-1;% 08735000
IF TYPE NEQ VTL THEN BEGIN; 08736000
STREAM(IOT~0,PRT~0,CODE~0: KTR);% 08737000
BEGIN SI~KTR; IF SC=" " THEN BEGIN L1: SI~SI+1;% 08738000
IF SC=" " THEN GO L1; END; %534-08739000
IF SC="*" THEN BEGIN SI~SI+1; GO L5; END; %534-08739500
IF SC="," THEN GO L2; IF SC<"0" THEN GO EXIT;% 08740000
KTR~SI; L3: TALLY~TALLY+1; SI~SI+1; 08741000
IF SC}"0" THEN GO L3; SI~KTR; CODE~TALLY; 08742000
DI~LOC PRT; DS~CODE OCT; TALLY~0;% 08743000
L5: IF SC=" " THEN BEGIN L4: SI~SI+1;% 08744000
IF SC=" " THEN GO L4 END; IF SC="," THEN GO L2;% 08745000
IF SC="~" THEN TALLY~1; GO EXIT;% 08746000
L2: SI~SI+1; IF SC=" " THEN BEGIN L6: SI~SI+1;% 08747000
IF SC=" " THEN GO L6 END ; KTR~SI;% 08748000
IF SC="*" THEN BEGIN TALLY~1; GO EXIT END;% 08749000
IF SC="~" THEN BEGIN TALLY~1; GO EXIT; END; %534-08749500
IF SC<"0" THEN GO EXIT; L7: TALLY~TALLY+1;% 08750000
SI~SI+1; IF SC}"0" THEN GO L7; DI~ LOC IOT;% 08751000
SI~KTR; CODE~TALLY; DS~CODE OCT; TALLY~1;% 08752000
EXIT: CODE~TALLY;% 08753000
END STREAM;% 08754000
IF NOT P THEN GO SPIT;% 08755000
PRT ~ P|3600; IOT ~ P|3600;% 08756000
IF TYPE=VXT THEN BEGIN 08757000
IF PRT!0 THEN BEGIN% 08758000
PROCTIME[MIX] ~ *P(DUP)-PRT;% 08759000
JAR[MIX,3] ~ *P(DUP)+PRT;% 08760000
END;% 08761000
IF IOT!0 THEN BEGIN% 08762000
IOTIME[MIX] ~ *P(DUP)-IOT;% 08763000
JAR[MIX,4] ~ *P(DUP)+IOT;% 08764000
END END ELSE BEGIN% 08765000
IF PRT!0 THEN BEGIN% 08766000
PROCTIME[MIX] ~ *P(DUP)+JAR[MIX,3]-PRT;% 08767000
JAR[MIX,3] ~ PRT;% 08768000
END;% 08769000
IF IOT!0 THEN BEGIN% 08770000
IOTIME[MIX] ~ *P(DUP)+JAR[MIX,4]-IOT; 08771000
JAR[MIX,4] ~ IOT;% 08772000
END END; 08773000
STREAM(TEST~0: X~JARROW[MIX],MIX,Z~PRT!0,I~IOT!0,% 08774000
K:=TYPE=VXT,T:=T:=SPACE(10)); 08775000
BEGIN DS~LIT " "; Z(DS~4 LIT "PRT "; TALLY~1;% 08776000
I(DS~4 LIT"AND ")); I(DS~4 LIT "IOT "; TALLY~1);% 08777000
DS~8 LIT "ESTIMATE"; Z(I(DS~LIT "S"));% 08778000
DS~8LIT" CHANGED"; K(DI~DI-7; DS~8LIT"EXTENDED"0;% 08779000
DS~5LIT" FOR"; SI~S; SI~SI+1; DS~7CHR; SI~SI+1;% 08780000
DS~LIT"/"; DS~7CHR; DS~LIT"="; SI~LOC Z;% 08781000
SI~SI-8; DS~2DEC; DS~LIT"~"; TEST~TALLY; 08782000
DI~DI-3; DS~FILL; 08782500
END STREAM;% 08783000
IF P THEN SPOUTER(T INX M[BUFF-1],UNITNO,1) ELSE 08784000
FORGETSPACE(T); 08784100
END; 08785000
IOT ~ PRT ~ -0;% 08786000
IF P(JAR[MIX,3],DUP)=@377777777777 THEN P(DEL)ELSE% 08787000
P1 ~ (PRT ~ P DIV 3600)-60|(PRT ~ PRT DIV 60);% 08788000
IF P(JAR[MIX,4],DUP)=@377777777777 THEN P(DEL) ELSE% 08789000
I1 ~ (IOT ~ P DIV 3600)-60|(IOT ~ IOT DIV 60);% 08790000
STREAM(X~JARROW[MIX], MIX,PRT,P1,IOT,I1,BUFF); 08791000
BEGIN DS~17LIT" TIME LIMITS FOR"; SI~X; SI~SI+1; DS~7CHR;% 08792000
DS~LIT"/"; SI~SI+1; DS~7CHR; DS~LIT"="; DI~LOC MIX; 08793000
DS~2DEC; MIX~DI; DI~DI-2; DS~FILL; DI~MIX; 08793500
DS~10LIT" ARE: PRT="; IF SC="+" THEN 08794000
BEGIN SI~SI+16; DS~8LIT"NO LIMIT" END ELSE BEGIN% 08795000
DS~8DEC; DS~LIT":"; DS~2DEC; BUFF~DI; DI~DI-11;% 08795500
DS~7FILL; DI~BUFF END; DS~6LIT"; IOT="; IF SC="+" THEN 08796000
DS~10LIT"NO LIMIT.~" ELSE BEGIN DS~8DEC; DS~LIT":";% 08796500
DS~2DEC; DS~2LIT".~"; DI~DI-13; DS~7FILL END; 08797000
END STREAM;% 08797500
SPIT:% 08798000
SPOUTER(BUFF INX M[BUFF-1],UNITNO,1); 08798500
END TIMERELAXER; 08799000
PROCEDURE CHANGEFACTOR(BUFF,TF); VALUE BUFF,TF; REAL BUFF; BOOLEAN TF; 08800000
BEGIN REAL FACTOR,B,T; INTEGER TEMP=T; 08801000
LABEL TYPEOUT,EXIT; 08802000
BUFF ~ ((B~BUFF).[15:15]-1)&M[P(DUP)-1][9:9:9]; 08802500
IF TF THEN GO TYPEOUT; 08803000
STREAM(ANS~0:B); 08804000
BEGIN SI~B; DI~LOC B; DS~8LIT"00000000:; DI~DI-2; 08805000
L: IF SC = " " THEN BEGIN SI~SI+1; GO TO L END; 08806000
IF SC < "0" THEN GO TO L1; 08807000
IF SC > "9" THEN GO TO L1; 08808000
SI~SI+1; 08809000
IF SC < "0" THEN GO TO ONECHR; 08810000
IF SC { "9" 08810500
THEN BEGIN SI~SI-1; DI~DI-2; DS~2 CHR; END 08811000
ELSE ONECHR: BEGIN SI~SI-1; DI~DI-1; DS~1 CHR; END; 08812000
IF SC = "." THEN GO TO L2 ELSE GO TO L3; 08813000
L1: IF SC ! "." THEN GO TO ERROR; 08814000
L2: SI~SI+1; 08815000
IF SC < "0" THEN GO TO ERROR; 08816000
IF SC > "0" THEN GO TO ERROR; 08817000
DS~CHR; 08818000
IF SC } "0" THEN IF SC { "9" THEN DS~CHR; 08819000
L3: IF SC = " " THEN GO CONVERT; 08820000
IF SC = "~" THEN GO CONVERT; 08821000
ERROR:DI~LOC ANS; SKIP 1 DB; DS~ 10 SET; GO TO EXITS; 08822000
CONVERT: SI~LOC B; SI~SI+4; DI~LOC ANS; DS~4 OCT; 08823000
EXITS: 08824000
END STREAM; 08825000
P(.FACTOR,~); 08826000
IF FACTOR < 0 THEN GO TO EXIT; 08828000
CORE.[4:14] ~ FACTOR; 08829000
SLEEP([TOGLE],HOLDMASK); LOCKTOG(HOLDMASK); 08830000
B ~ SPACE(30); 08831000
DISKWAIT(-B,30,DIRECTORYTOP-SYSNO); 08832000
M[B+9] ~ CORE; % CHANGE FACTOR 08833000
DISKWAIT(B,-30,DIRECTORYTOP-SYSNO); 08834000
FORGETSPACE(B); 08835000
UNLOCKTOG(HOLDMASK); 08836000
SELECTION; 08836500
TYPEOUT: 08837000
STREAM(I~(FACTOR~CORE.[4:14]) DIV 100, FR~(TEMP~FACTOR MOD 100), 08838000
MX~(TEMP~CORE.[CF]|64|FCTOR/100),US~CORE.[FF]|64, %749-08839000
$ SET OMIT = NOT WORKSET %749-08839499
NOSELECT~WKSETNOSELECT, %749-08839500
$ POP OMIT %749-08839501
BUFF); %749-08839600
BEGIN DS~9 LIT"FACTOR = "; 08840000
SI~LOC I; DS~2 DEC; I~DI; DI~DI-2; DS~FILL; DI~I; 08841000
DS~LIT"."; DS~2 DEC; 08842000
DS~13 LIT", MAX CORE = "; DS~7 DEC; 08843000
I~DI; DI~DI-7; DS~6 FILL; DI~I; 08844000
DS~7LIT",USING "; DS~7 DEC; I~DI; DI~DI-7; DS~6 FILL;%749-08845000
DI:=I; %749-08845500
$ SET OMIT = NOT WORKSET %749-08845999
NOSELECT(DS:=14 LIT ",WKSETNOSELECT"); %749-08846000
$ POP OMIT %749-08846001
DS:=LIT"~"; %749-08846010
END STREAM; 08847000
EXIT: SPOUT(BUFF); 08848000
END CHANGEFACTOR; 08849000
PROCEDURE SHEETDIDDLER(BUFF,TYPE,STD); VALUE BUFF,TYPE,SID; 08850000
REAL BUFF,TYPE,SID; 08850100
COMMENT TYPE = 6: PS -- CHANGE PRIORITY OF JOB IN SCHEDULE 08850200
= 8: XS -- EXECUTE JOB IN SCHEDULE (FORCE SELECTION) 08850300
= 7: ES -- ELIMINATE JOB FROM SCHEDULE (FORCE SELECTION, 08850400
THEN "DS") 08850500
= 5: TS -- TYPE OUT SCHEDULE; 08850600
BEGIN REAL IOD,T,PRIORITY; 08851000
INTEGER LEVEL,NEXTLINK,THISLINK,LASTLINK; 08852000
INTEGER ES,EM,EH; DEFINE ET = EH#; 08852500
$ SET OMIT = NOT(DATACOM ) 08852599
BOOLEAN LASTPASED,ATLEASTONE; 08853000
ARRAY S[*],DLNK[*]; 08854000
$ SET OMIT = NOT(PACKETS) 08854499
DEFINE UNITNO = S[23].[2:6]#; % ORIGINATING UNIT 08854500
$ POP OMIT 08854501
LABEL CONTINUE,C1,READIN,GNX,TS,TS1,TS2, 08855000
XSES,ESLL,PS,PS1,PS2,SPIT,EXIT; 08856000
SUBROUTINE GETNEXT; % READS IN NEXT JOB SHEET ENTRY 08858000
BEGIN 08859000
CONTINUE: LASTLINK ~ THISLINK; 08860000
IF (THISLINK~NEXTLINK) ! 0 THEN GO TO READIN; 08860500
C1: IF (LEVEL~LEVEL+1) > MIXMAX THEN 08861000
BEGIN LASTPASSED ~ TRUE; GO TO GNX END; 08862000
LASTLINK ~ NEXTLINK ~ 0; 08863000
IF (THISLINK~SHEET[LEVEL].[CF]) = 0 THEN GO TO C1; 08864000
READIN: DISKIO(IOD,-(S INX 0-1),30,THISLINK); 08865000
SLEEP([IOD],IOMASK); 08866000
NEXTLINK ~ S[29]; 08867000
IF S[0].[36:6]=@14 THEN GO CONTINUE;%PASS LM ENTRY 08868000
GNX: 08869000
END GETNEXT; 08870000
SLEEP([TOGLE],SHEETMASK); LOCKTOG(SHEETMASK); 08880000
S := [M[TYPEDSPACE(31,SHEETAREAV)]] & 30[SIZE];% %167-08881000
LEVEL ~ -1; LASTPASSED ~ FALSE; 08882000
IF BUFF!0 THEN 08882050
BUFF ~ ((T~BUFF).[15:15]-1)&M[P(DUP)-1][9:9:9]; 08882500
$ SET OMIT = NOT(DATACOM ) 08882599
IF TYPE=5 THEN GO TS; IF TYPE GTR 6 THEN GO XSES; GO PS; 08883000
IS: ATLEASTONE ~ FALSE; 08884000
IS1: GETNEXT; IF LASTPASSED THEN GO TO TS2; 08885000
IF SID NEQ 63 THEN BEGIN IF S[3].[8:10]NEQ SID THEN GO TS; END ELSE 08885500
IF ATLEASTONE THEN BUFF.[CF]~SPACE(12); 08886000
ET~((CLOCK+P(RTR))/60)-S[23].[24:24]; 08886300
ES ~ ET MOD 60; ET ~ ET DIV 60; EM ~ ET MOD 60; EH ~ ET DIV 60; 08886600
STREAM(TU~S[23].[9:4],BUF~S[23].[14:4], 08887000
RT:=S[23].[9:4] NEQ 0,C:=LEVEL,J1:=(S[0] LSS 0) OR 08887001
(S[2].SSYSJOBF = LIBMAINCODE),J2:=S[27], 08887010
J~S[*],ID~S[3].[8:10],EH,EM,ES,A~S[20]|64,BUFF); % 08887100
BEGIN SI~LOC C; DS~6 DEC; DI~DI-6; DS~5 FILL; DI~BUFF; DI~DI+6; 08888000
DS~LIT":"; SI~J; SI~SI+1; DS~7 CHR; DS~LIT"/"; SI~SI+1; 08889000
DS:=7CHR;J1(DS:=LIT" ";SI:=LOC J2;SI:=SI+1;DS:=7CHR); 08890000
DS:=LIT"=";SI:=LOC ID;DS:=2 DEC; 08890010
RT(DS~6 LIT " FROM "; SI~LOC TU; DS~2 DEC; % 08890100
DS~1 LIT "/"; SI~LOC BUF; DS~2 DEC;); % 08890200
DS~7 LIT" IN FOR"; SI~LOC EM; 08891000
3(DS ~ LIT":"; DS~2 DEC); ES~DI; DI~DI-9; DS~8 FILL; 08892000
DI~ES; DS~8 LIT", NEEDS "; 08893000
SI~LOC A; DS~5 DEC; DS~LIT"~"; DI~DI-6; DS~4 FILL; 08899000
END STREAM; 08900000
SPOUTER(BUFF,IF SID!63 THEN UNITNO ELSE 0,1); 08901000
IF SID NEQ 63 THEN BEGIN TYPE:=5;GO EXIT END; 08901500
ATLEASTONE~TRUE; 08902000
GO TO TS; 08903000
TS2: IF ATLEASTONE THEN GO TO EXIT; 08904000
IF SID NEQ 63 THEN YTPE:=5 ELSE% 08904050
STREAM(BUFF); DS ~ 15 LIT " NULL SCHEDULE~";% %WF 08905000
SPOUT(BUFF); GO TO EXIT; 08906000
XSES: GETNEXT; 08910000
IF LASTPASSED THEN BEGIN IF BUFF!0 THEN SPOUT(BUFF); 08911000
GO TO EXIT; END; 08911050
IF S[3].[8:10]~SID THEN GO TO XSES; 08912000
$ SET OMIT = NOT(DATACOM ) 08912099
S[2].[1:2]:=(IF TYPE=8 THEN 2 ELSE 3); % 7=ES,8=XS 08913000
DISKIO(IOD,S INX 0-1,30,THISLINK); SLEEP([IOD],IOMASK); 08915000
GO TO SPIT; 08915100
PS: STREAM(PRIORITY:T); 08916000
BEGIN SI~T; 08917000
N: IF SC="~" THEN GO TO X; 08918000
IF SC<"0" THEN BEGIN SI~SI+1; GO TO N; END; T~SI; 08919000
K: IF SC}"0" THEN IF SC{"9" THEN 08920000
BEGIN TALLY~TALLY+1; SI~SI+1; GO TO K END; 08921000
SI~T; DI~LOC PRIORITY; T~TALLY; DS~T OCT; GO TO Z; 08922000
X: DI~LOC PRIORITY; SKIP DB; DS~11 SET; 08923000
Z: 08924000
END STREAM; 08925000
IF (PRIORITY~P)<0 THEN BEGIN SPOUT(BUFF); GO TO EXIT END; 08926000
PS1: GETNEXT; IF LASTPASSED THEN BEGIN SPOUT(BUFF); GO TO EXIT END; 08927000
IF S[3].[8:10]!SID THEN GO TO PS1; 08928000
% DELINK AND RELINK THIS SHEET ENTRY 08929000
DLNK := [M[TYPEDSPACE(31,SHEETAREAV)]] & 30[SIZE];% %167-08930000
IF NEXTLINK = 0 THEN SHEET[LEVEL].[FF] ~ LASTLINK; 08931000
IF LASTLINK = 0 THEN BEGIN SHEET[LEVEL].[CF]~ NEXTLINK;GO PS2 END;08932000
DISKIO(IOD,-(DLNK INX 0-1),30,LASTLINK); SLEEP([IOD],IOMASK); 08933000
DLNK[29] ~ NEXTLINK; 08934000
DISKIO(IOD,+(DLNK INX 0-1),30,LASTLINK); SLEEP([IOD],IOMASK); 08935000
PS2: S[2].[CF] ~ IF (S[18]~PRIORITY) > 32767 THEN 32767 ELSE PRIORITY; 08936000
LEVEL ~ IF PRIORITY > MIXMAX THEN MIXMAX ELSE PRIORITY; 08937000
IF SHEET[LEVEL].[CF] ~ 0 THEN 08938000
BEGIN DISKIO(IOD,-(DLNK INX 0-1),30,SHEET[LEVEL].[FF]); 08939000
SLEEP([IOD],IOMASK); 08940000
DLNK[29] ~ THISLINK; 08941000
DISKIO(IOD,+(DLNK INX 0-1),30,SHEET[LEVEL].[FF]); 08942000
SLEEP([IOD],IOMASK); 08943000
END ELSE SHEET[LEVEL] ~ THISLINK; 08944000
SHEET[LEVEL].[FF] ~ THISLINK; 08944500
S[29] ~ 0; S[3] ~ ABS(S[3]); % TO GET SELECTION TO PRINT MESSAGE; 08945000
DISKIO(IOD,+(S INX 0-1),30,THISLINK); SLEEP([IOD],IOMASK); 08946000
FORGETSPACE(DLNK); 08947000
SPIT: IF BUFF!0 THEN 08947100
$ SET OMIT = NOT(PACKETS) 08947199
IF UNITNO GEQ 32 THEN 08947200
BEGIN 08947300
MOVE(9,BUFF+1,BUFF); SPOUTER(BUFF,UNITNO,64); 08947400
END ELSE 08947500
$ POP OMIT 08947501
FORGETSPACE(BUFF); 08947600
EXIT: UNLOCKTOG(SHEETMASK); 08997000
FORGETSPACE(S); 08998000
IF TYPE!5 THEN BEGIN KEYBOARDCOUNTER ~ KEYBOARDCOUNTER-1; 08998200
SELECTION; 08998400
KEYBOARDCOUNTER ~ KEYBOARDCOUNTER+1; 08998600
END; 08998800
END SHEETDIDDLER; 08999000
$ SET OMIT = NOT(DCSPO AND DATACOM ) 08999999
$ SET OMIT = NOT(DISKLOG) 09299999
PROCEDURE WHATINTRNSIC(BUFF); VALUE BUFF; REAL BUFF; FORWARD; 09400000
$ SET OMIT = NOT(AUXMEM) 09400099
$ SET OMIT = NOT MONITOR 09410100
$ SET OMIT = NOT AUXMEM 09433590
PROCEDURE INTRINSICTABLEBUILDER(FH); VALUE FH; REAL FH; 09500000
BEGIN 09500500
% WHEN CALLED WITH FH= (-1), TRANSFER TO AUXMEM ONLY 09500510
REAL DISKADDR=+1,T=+2,INTLOC=+3,T17SIZE=+4,MAXINT=+5; 09501000
$ SET OMIT = NOT(AUXMEM) 09501500
P(0, 0, 0, 0, 0); 09504570
IF (T:=FH.[FF])=0 THEN T:=SPACE(30); 09505000
$ SET OMIT = NOT(AUXMEM) 09505100
DISKWAIT(-T, 30, DISKADDR:=M[FH INX 10]); 09505500
MAXINT := M[T] ~ 1; % NUMBER OF INTRINSICS + 1 09505600
T17SIZE := M[T INX 17].[8:10]+1; % INTR.#17 SIZE+1WD.FOR DISK.ADDR. 09505700
FORGETSPACE(T); 09505750
INTRNSC:=[M[INTLOC:=GETSPACE(MAXINT+I17SIZE,INTARRAYAREAV,1)+2]]& 09506000
(MAXINT+T17SIZE)[8:38:10]; % SPACE FOR INTRINSIC TABLE + INT.#17 09506100
DISKWAIT(-(INTRNSC INX 0),MAXINT,DISKADDR); 09506500
M[INTRNSC INX NOT 0] := 0; MAXINT := MAXINT -1; 09507000
FOR T := 1 STEP 1 UNTIL MAXINT DO 09507500
INTRNSC[T]:=NABS(([(*P(DUP),DUP).[8:10]+INTSIZE) & 09508000
(P(XCH) INX 0 + DISKADDR)[6:21:27]); 09508500
DISKWAIT(-(INTLOC:=INTLOC+MAXINT+2),(T17SIZE-1),INTRNSC[17].[6:27]); 09508600
INTRNSC[17] := (*P(DUP))&INTLOC[CTC]; % MARK PERCENT 09508700
M[INTLOC-1]:=0&(T17SIZE-1)[CTF]; % DUMMY MARKER FOR DUMP/ANALYZE 09508800
DISKADDR:=0&1[4:47:1]; 09509000
INTRNSC[2]:=*P(DUP) OR DISKADDR; 09509500
FOR T:=18 STEP 1 UNTIL 20 DO INTRNSC[T]:=*P(DUP) OR DISKADDR; 09510000
$ SET OMIT = NOT(AUXMEM) 09510500
INTSIZE:=(INTRNSC[0] + 3 ) DIV 4; 09534500
$ SET OMIT = NOT(PACKETS) 09534999
T:=SPACE(15); WHATINTRNSIC(T); 09535000
STREAM(S:=T,D:=3); 09535100
BEGIN 09535200
SI:=S; DI:=DI+4; % CMBIT IN M[3].[1:1] 09535300
63(IF SC="." THEN JUMP OUT; SI:=SI+1); S:=SI; 09535400
4(SI:=SI+1; IF SC="." THEN JUMP OUT); 09535500
IF TOGGLE THEN ELSE SI:=S; SI:=SI+1; 09535600
3(IF SC<"0" THEN JUMP OUT; TALLY:=TALLY+1; SI:=SI+1); 09535700
S:=TALLY; SI:=SI-S; DI:=DI-S; DS:=S CHR; 09535800
END; 09535900
FORGETSPACE(T); 09536000
$ POP OMIT 09536001
END INTRINSCI TABLE BUILDER; 09537000
PROCEDURE CHANGEINTRINSICFILE(BUFF); VALUE BUFF; REAL BUFF;% 09600000
BEGIN REAL A,B,IOD,I,J,K,L; 09601000
REAL FH,T,IT; LABEL FXIT,WITHOUT; 09602000
REAL SIZE=I,DISKADDR=T,LOC=IT,WI=J; 09602100
BOOLEAN SUBROUTINE NULLMIX;% 09603000
BEGIN POLISH(1);% 09604000
IF INTSIZE!0 THEN BEGIN INTSIZE ~ 0;% 09605000
FOR I~1 STEP 1 UNTIL MIXMAX DO% 09606000
IF JARROW[I]!0 THEN% 09607000
IF NOT (JAR[I,9].SYSJOBF) THEN % NOT "SYSTEM" JOB 09608000
BEGIN P(DEL, 0); I ~ MIXMAX; END;% 09611000
IF NOT P(DUP) THEN INTSIZE ~ (INTRNSC[0]+3) DIV 4;% 09612000
END;% 09613000
NULLMIX ~ POLISH;% 09614000
END NULLMIX;% 09615000
SUBROUTINE FORGETEM;% 09616000
BEGIN SLEEP([TOGLE],STOREMASK); LOCKTOG(STOREMASK); 09617000
WHILE (K ~ M[L]).[CF]!0 DO% 09618000
BEGIN IF K>0 THEN% 09619000
IF K.[3:12]=@700 THEN% 09620000
FORGETSPACE(L+2);% 09621000
L ~ K.[CF];% 09622000
END;% 09623000
UNLOCKTOG(STOREMASK); 09624000
$ SET OMIT = NOT(AUXMEM) 09624010
FORGETSPACE(INTRNSC INX 0); INTRNSC~0 09624100
END FORGETEM;% 09625000
DEFINE ERROR = GO TO EXIT#;% 09626000
SLEEP([TOGLE], FREEMASK); INTFREE ~ FALSE;% 09630000
T ~ BUFF;% 09631000
NAMEID(A,T); NAMEID(B,T); NAMEID(B,T);% 09632000
IF (FH:=DIRECTORYSEARCH(A,B,17))=0 THEN ERROR; 09633000
IF (J~M[FH+4].[36:6])!0 THEN 09633100
IF J!DCINTYPE AND J!TSSINTYPE THEN 09633200
BEGIN % DONT ALLOW CI ON KNOWN NON-INTRINSICS FILE 09633300
STREAM(A,B,NT1:=BUFF.[15:15]-1); 09633400
BEGIN DS:=2LIT"# "; SI:=LOC A; 09633500
SI:=SI+1; DS:=7CHR; DS:=LIT"/"; 09633600
SI:=SI+1; DS:=7 CHR; 09633700
DS:=24 LIT" NOT AN INTRINSICS FILE~"; 09633800
END; 09633900
FORGETSPACE(FH); 09634000
FORGETSPACE(DIRECTORYSEARCH(A,B,16)); 09634100
ERROR; 09634200
END; 09634300
IF NOT NULLMIX THEN COMPLEXSLEEP(NULLMIX); 09635000
IF INTRNSC!0 THEN FORGETEM; 09636000
$ SET OMIT = SHAREDISK 09636999
IF MCPFREE=0 THEN SLEEP([TOGLE],MCPMASK); 09637000
LOCKTOG(MCPMASK); 09638000
$ POP OMIT 09638001
T:=SPACE(30); 09639000
OKSEGZEROWRITE:=TRUE; %204-09639001
DISKWAIT(-T,-30,0); 09640000
I:=T+13+5|SYSNO; 09641000
IF (IT:=DIRECTORYSEARCH(M[I],M[I+1],16))!0 THEN 09642000
FORGETSPACE(T); 09643000
M[I]:=A; 09644000
M[I+1]:=B; 09645000
DISKWAIT(T,-30,0); 09646000
OKSEGZEROWRITE:=FALSE; %204-09646001
$ SET OMIT = SHAREDISK 09646999
UNLOCKTOG(MCPMASK); 09647000
$ POP OMIT 09647001
$ SET OMIT = NOT(AUXMEM) 09647999
FORGETSPACE(T); 09648000
INTRINSICTABLEBUILDER(FH.[CF]); 09657000
FORGETSPACE(FH); 09658000
WHATINTRNSIC(BUFF.[15:15]); 09659000
STREAM(B:=BUFF.[15:15]-1); DS:=8 LIT" NEW "; 09670000
EXIT: SPOUT(BUFF.[15:15]-1);% 09676000
INTFREE ~ TRUE;% 09677000
END CHANGING INTRINSIC FILES ON USER DISK WITH MANY PRECAUTIONS;% 09679000
PROCEDURE CHANGEMCP(BUFF); VALUE BUFF; REAL BUFF; 09679100
BEGIN 09679200
REAL A,B,T,Z,BASE; 09679300
LABEL EXIT; 09679400
T:=BUFF; 09679800
NAMEID(A,T); NAMEID(B,T); NAMEID(B,T); 09679900
$ SET OMIT = SHAREDISK 09679999
IF MCPFREE=0 THEN SLEEP([TOGLE],MCPMASK); 09680000
LOCKTOG(MCPMASK); 09680100
$ POP OMIT 09680101
Z:=SPACE(30); 09680200
OKSEGZEROWRITE:=TRUE; %204-09680229
DISKWAIT(-Z,-30); 09680300
BASE:=Z+10+5|SYSNO; 09680400
IF (A EQV M[BASE])!NOT 0 OR 09680500
(B EQV M[BASE+1])!NOT 0 THEN 09680600
BEGIN 09680700
IF (T:=DIRECTORYSEARCH(A,B,17))=0 THEN 09680800
BEGIN; 09680900
STREAM(A:=[A],T:=BUFF.[15:15]-1); 09681000
BEGIN DS:=13 LIT"#NO MCP FILE ";SI:=A;SI:=SI+1; 09681100
DS:=7 CHR;DS:=LIT"/";SI:=SI+1;DS:=7 CHR; 09681200
DS~LIT"~"; 09681250
END; 09681300
GO TO EXIT; 09681400
END; 09681500
IF (NT1~M[T+4].[36:6])!0 THEN IF NT1!MCPTYPE THEN 09681505
BEGIN % DONT ALLOW CM ON KNOWN NON-MCP FILE 09681510
STREAM(A:=[A],T:=BUFF.[15:15]-1); 09681515
BEGIN DS:=2LIT"# "; SI:=A; SI:=SI+1; 09681520
DS:=7CHR; DS:=LIT"/"; SI:=SI+1; 09681525
DS:=7CHR; DS:=12LIT" NOT AN MCP~"; 09681530
END; 09681535
FORGETSPACE(T); 09681540
FORGETSPACE(DIRECTORYSEARCH(A,B,16)); 09681545
GO TO EXIT; 09681550
END; 09681555
IF M[BASE+2]-2!MCPBASE THEN 09681600
FORGETSPACE(DIRECTORYSEARCH(M[BASE],M[BASE+1],16)); 09681650
M[BASE]:=A; 09681700
M[BASE+1]:=B; 09681800
M[BASE+2]:=M[T+10]; 09681900
$ SET OMIT = NOT(AUXMEM) 09681909
FORGETSPACE(T); 09682000
END; 09682100
STREAM(A:=[A],T:=BUFF.[15:15]-1); 09682200
BEGIN DS:=18 LIT " NEXT MCP WILL BE ";SI:=A;SI:=SI+1; 09682300
DS:=7 CHR;DS:=LIT"/";SI:=SI+1;DS:=7 CHR; 09682400
DS~LIT"~"; 09682450
END; 09682500
M[3]~NABS(*P(DUP)); % SET FLAG FOR WM 09682550
EXIT: 09682600
DISKWAIT(Z,-30,0); 09682610
OKSEGZEROWRITE:=FALSE; %204-09682611
$ SET OMIT = NOT(NOT SHAREDISK) 09682619
UNLOCKTOG(MCPMASK); 09682620
$ POP OMIT 09682621
FORGETSPACE(Z); 09682700
SPOUT(BUFF.[15:15]-1); 09682800
END CHANGING OF THE MCP; 09683100
BOOLEAN PROCEDURE SYSTEMFILE(A,B); VALUE A,B; REAL A,B;% 09700000
BEGIN LABEL DISK,LOG,TRUTH,DIR,SYS,REM,DECK,MASK,TEST; 09701000
LABEL DMP; 09701500
LABEL MAINT; 09701550
$ SET OMIT = NOT(STATISTICS) 09701599
DEFINE T=P(TRUTH)#;% 09702000
IF (B EQV P(DISK))=T THEN% 09703000
P(((A EQV P(DIR))=T) OR 09704000
((A EQV P(LOG))=T) OR 09704100
((A EQV P(DMP))=T)) 09704500
ELSE IF (B EQV P(LOG))=T THEN% 09705000
P(((A EQV P(SYS))=T) % 09706000
$ SET OMIT = SHAREDISK 09706049
OR ((A EQV P(MAINT))=T)% 09706050
OR ((A EQV P(REM))=T)% 09706100
$ POP OMIT 09706101
)% 09706150
$ SET OMIT = NOT(SHAREDISK) 09706199
ELSE IF (A EQV P(DECK))=T THEN% 09707000
P(((B AND P(MASK)) EQV P(TEST))=T)% 09708000
$ SET OMIT = NOT(STATISTICS) 09708099
ELSE P(0);% 09709000
P(RTN);% 09710000
DISK ::: "DISK ";% 09711000
LOG ::: "LOG ";% 09712000
TRUTH::: @3777777777777777;% 09713000
DIR ::: "DIRCTRY";% 09715000
SYS ::: "SYSTEM ";% 09716000
REM ::: "REMOTE ";% 09717000
DECK ::: "DECK ";% 09718000
MASK ::: @77000000007777;% 09719000
TEST ::: @12000000003714;% 09720000
DMP ::: "DMPAREA";% 09720500
MAINT::: "MAINT ";% 09720650
$ SET OMIT = NOT(STATISTICS) 09720699
END;% 09721000
$ SET OMIT = NOT(DEBUGGING) 09999999
$ SET OMIT = NOT(WORKSET) 12200000
12200500
PROCEDURE WKSETVALUES(KTRX); VALUE KTRX; REAL KTRX; 12201000
BEGIN 12201500
12202000
% ROUTINE FOR HANDLING KEYIN WORKSET REQUESTS. 12202500
12203000
REAL 12203500
BUFF, 12204000
CYCLETOG, 12204500
ERRORTOG, 12205000
INS, 12205500
INSTRUCT, 12206000
KTR, 12206500
$ SET OMIT = NOT(WORKSETMONITOR) OR OMIT 12207000
MONTOG, 12207500
$ POP OMIT % WORKSET MONITOR 12208000
N, 12208500
NAM, 12209000
NEXTNAME, 12209500
OLAYTOG, 12210000
STARTING, 12210500
TOLTOG, 12211000
USETOG, 12211500
VALU, 12212000
ZZSTA; 12212500
12213000
ARRAY NAMS[*]; 12213500
12214000
LABEL NU, NEW, SKAN, SKP, ERROR; 12214500
12215000
DEFINE 12215500
OLAYINDX = 1#, % CODE FOR "OLAY RATIO" 12216000
PRIORINDX = 2#, % CODE FOR "PRIORITY", 12216500
ETIMEINDX = 3#, % CODE FOR "ELAPSED TIME", 12217000
COREINDX = 4#, % CODE FOR "CORE USAGE" 12217500
SAVEINDX = 5#, % CODE FOR "SAVE CORE USAGE" 12218000
INFOSIZE = 5#, % NUMBER OF ENTRIES FOR EACH MIX 12218500
12219000
DEFINE PRINTDIGIT = % OUTPUT ROUTINE FOR STREAM STATEMENT 12219500
DV:=DI; DS:=5DEC; DI:=DV; DS:=4FILL; 12220000
DI:=DV; SI:=DV; 5(IF SC=" " THEN SI:=SI+1 ELSE DS:=CHR); 12220500
DS:=LIT","#; 12221000
12221500
BUFF := KTRX.[15:15]; % KEYIN BUFFER LOCATION 12222000
KTR := KTRX.[15:33]; % LOCATION OF REQUEST IN KEYIN BUFFER 12222500
ZZSTA := 0 & M[BUFF-2][9:9:9]; % REMOTE STATION 12223000
12223500
SKAN: % SCAN INPUT BUFFER FOR REQUEST ANALYSIS 12224000
12224500
STREAM(NAM :=0, VALU:=(-1), LOCN:=0, NEXTNAME:="~" : 12225000
TOG:=0, EQLTOG:=0, T:=0, KTR); 12225500
BEGIN 12226000
SI:=KTR; GO TO L2; 12226500
L0: 63(IF SC=ALPHA THEN SI:=SI+1 ELSE JUMP OUT TO L2); 12227000
L1: SI:=SI+1; 12227500
L2: IF SC="~" THEN GO TO L3; % END OF RECORD 12228000
IF SC=" " THEN GO TO L1; % IGNORE BLANKS 12228500
IF SC="," THEN GO TO L1; % COMMA IS OPTIONAL 12229000
IF SC="=" THEN % SET "EQUAL" TOGGLE 12229500
BEGIN 12230000
TALLY:=1; EQLTOG:=TALLY; GO TO L1; 12230500
END; 12231000
IF SC=ALPHA THEN ELSE GO TO XX0; % NO OTHER SPECIAL CHR.ALLOWED 12231500
% TREAT STRING AS NUMERIC ONLY IF PRECEEDED BY "=" 12232000
EQLTOG(IF SC GEQ "0" THEN IF SC LEQ "9" THEN JUMP OUT TO L4); 12232500
L3: TOG(DI:=LOC NEXTNAME; JUMP OUT TO LL1); % USE "NEXTNAME" 2ND.PASS 12233000
DI:=LOC NAM; % USE "NAM" ON FIRST PASS 12233500
GO TO LL1; GO TO L0; XX0: GO TO XXIT; LL1: % BRANCH POINT 12234000
DI:=DI+5; % NAME STORED IN LAST 3 CHRS. 12234500
IF SC="~" THEN % END OF RECORD,DONT MOVE SI; 12235000
BEGIN 12235500
DS:=3LIT"00~"; GO TO XXIT; 12236000
END; 12236500
T:=SI; DS:=CHR; 12237000
2(IF SC=ALPHA THEN DS:=CHR ELSE DS:=LIT" "); 12237500
TOG(SI:=T; JUMP OUT TO XXIT); % BRANCH OUT ON 2ND PASS 12238000
TALLY:=1; TOG:=TALLY; % SET SECOND PASS TOGGLE 12238500
GO TO LL0; 12239000
% NUMERICS CONVERTED AT "L4" 12239500
L4: LOCN:=SI; SI:=SI+1; TALLY:=0; EQLTOG:=TALLY; TALLY:=1; 12240000
7(IF SC GEQ "0" THEN IF SC LEQ "9" THEN; 12240500
IF TOGGLE THEN ELSE JUMP OUT; SI:=SI+1; TALLY:=TALLY+1; 12241000
SI:=LOCN; T:=TALLY; DI:=LOC VALU; DS:=T OCT; GO TO LL0; 12241500
XXIT: LOCN:=SI; 12242000
END STREAM STATEMENT; 12242500
12243000
NEXTNAME := P; % VALUE OF NEXT ITEM IN REQUEST 12243500
KTR := P; % ADDRESS OF NEXT ITEM IN KEYIN BUFFER 12244000
VALU := P; % NUMERIC VALUE OF REQUEST (-1 IF NONE GIVEN) 12244500
NAM := P; % REQUEST ITEM 12245000
12245500
IF NAM="~" THEN % NULL INPUT, TREAT AS "LIST" REQUEST 12246000
BEGIN 12246500
NU: USETOG := TOLTOG := OLAYTOG := CYCLETOG := 1; 12247000
GO TO NEW; 12247500
END 12248000
ELSE IF USETOG = 3 THEN % SETTING NEW OPTIONS 12248500
BEGIN 12249000
IF (N:=(IF (NAM="OLA" AND VALU=(-1)) THEN OLAYINDX ELSE 12249500
IF NAM="PRI" THEN PRIORINDX ELSE 12250000
IF NAM="TIM" THEN ETIMEINDX ELSE 12250500
IF NAM="COR" THEN COREINDX ELSE 12251000
IF NAM="SAV" THEN SAVEINDX ELSE 0)) NEQ 0 THEN 12251500
INSTRUCT := 0 & INSTRUCT[8:4:40] & N[4:44:4] 12252000
ELSE GO TO SKP; % MAY NOT BE PART OF "USE" COMMAND 12252500
END % IF USETOG = 3 12253000
ELSE 12253500
SKP: IF (NAM="ON " OR NAM="OFF") THEN 12254000
BEGIN 12254500
STARTING := 1 + (NAM="OFF"); 12255000
GO TO NU; 12255500
END 12256000
ELSE IF NAM="USE" THEN % SETTING NEW VALUES 12256500
BEGIN 12257000
INSTRUCT := 0; 12257500
USETOG := 3; 12258000
END 12258500
ELSE IF NAM="OPT" THEN USETOG := 1 % LISTING OPTIONS 12259000
ELSE IF NAM="TOL" THEN % TOLERANCE FOR OPTIONS 12259500
BEGIN 12260000
TOLTOG := 1; 12260500
IF VALU GEQ 0 THEN 12261000
BEGIN 12261500
IF VALU GTR 100 THEN GO TO ERROR; 12262000
WKSETTOLERANCE := VALU | 0.01; 12262500
END; 12263000
END 12263500
ELSE IF NAM = "OLA" THEN 12264000
BEGIN 12264500
OLAYTOG := 1; 12265000
IF VALU GEQ 0 THEN 12265500
BEGIN 12266000
WKSETMAXOLAY := VALU/100; 12266500
END; 12267000
END 12267500
ELSE IF NAM="CYC" THEN % CYCLE TIME 12268000
BEGIN 12268500
CYCLETOG := 1; 12269000
IF VALU GEQ 0 THEN % SETTING NEW VALUE 12269500
BEGIN 12270000
NEW: IF WKSETCYCLETIME=0 THEN % NO PREVIOUS VALUE 12270500
BEGIN 12271000
STFIRST := 0; STNEXT := 0; 12271500
IF WKSETINSTRUCT=0 THEN % SET DEFAULT OPTIONS 12272000
BEGIN 12272500
WKSETINSTRUCT := PRIORINDX & 12273000
OLAYINDX [40:44:4] & 12273500
COREINDX [36:44:4] & 12274000
ETIMEINDX[32:44:4] & 12274500
SAVEINDX [28:44:4]; 12275000
END; 12275500
IF WKSETOLERANCE=0 THEN WKSETOLERANCE := 0.10; 12276000
IF WKSETMAXOLAY=0 THEN WKSETMAXOLAY := 0.40; 12276500
END; % IF NOT PREVIOUS VALUE 12277000
IF STARTING NEQ 0 THEN % "WK ON" OR "WK OFF" 12277500
BEGIN 12278000
IF STARTING = 2 THEN % "OFF" 12278500
WKSETCYCLETIME := NABS(WKSETCYCLETIME) ELSE 12279000
BEGIN % "ON" 12279500
WKSETCYCLETIME:= 12280000
(IF WKSETCYCLETIME=0 THEN 20|64 ELSE 12280500
ABS(WKSETCYCLETIME)); 12281000
END; % IF STARTING = 1 12281500
STARTING := 0; 12282000
END; % IF STARTING GTR 0 12282500
IF VALU GEQ 0 THEN WKSETCYCLETIME := VALU|64; 12283000
IF WKSETCYCLETIME LEQ 0 THEN WKSETNOSELECT:=0; % TELL SELECTRUN12283500
END; % IF VALU GEQ 0 12284000
END % IF NAM="CYC" 12284500
$ SET OMIT = NOT(WORKSETMONITOR) OR OMIT 12285000
ELSE IF NAM="MON" THEN 12285500
BEGIN 12286000
IF (VALU LSS 0) OR (VALU GTR 1) THEN GO TO ERROR; 12286500
WKSETMONITOR :=VALU; MONTOG:=1; 12287000
END 12287500
$ POP OMIT % WORKSETMONITOR 12288000
ELSE GO TO ERROR; 12288500
12289000
IF NAM NEQ "~" THEN 12289500
IF NEXTNAME NEQ "~" THEN 12290000
GO TO SKAN; 12290500
12291000
IF FALSE THEN 12291500
ERROR: 12292000
ERRORTOG:=1; 12292500
12293000
IF USETOG THEN 12293500
BEGIN 12294000
IF USETOG=3 THEN % NEW OPTIONS SET 12294500
IF INSTRUCT NEQ 0 THEN % NEW INSTRUCTIONS OBTAINED 12295000
BEGIN 12295500
WHILE (INSTRUCT.[44:4]=0) DO INSTRUCT:=INSTRUCT.[4:40]; 12296000
WKSETINSTRUCT := INSTRUCT; 12296500
END; 12297000
INSTRUCT := WKSETINSTRUCT; 12297500
NAMS := [M[BUFF INX 20]]&20[8:38:10]; % USE PART OF KEYIN BUFFER 12298000
NAMS[0]:=0; 12298500
N:=(-1); 12299000
WHILE (INS := INSTRUCT.[44:4]) GTR 0 DO 12299500
BEGIN 12300000
INSTRUCT := INSTRUCT.[4:40]; 12300500
NAMS[N:=N+1] := 12301000
(IF INS=1 THEN "OLAY " ELSE 12301500
IF INS=2 THEN "PRIORTY" ELSE 12302000
IF INS=3 THEN "TIME " ELSE 12302500
IF INS=4 THEN "CORE " ELSE 12303000
IF INS=5 THEN "SAVCOR " ELSE 12303500
"UNKNOWN") & 1[5:47:1]; 12304000
NAMS[N+1]:=0; 12304500
END; 12305000
END; % IF USETOG 12305500
STREAM(CYCLETOG, NEG:=(WKSETCYCLETIME.[1:1]), 12306000
CYC:=(ABS[WKSETCYCLETIME)/64+0.5) DIV 1, 12306500
ERRORTOG, VALUTOG:=(VALU GEQ 0), NAM, VALU, 12307000
OLAYTOG, OLA:=(WKSETMAXOLAY|100+0.5) DIV 1, 12307500
TOLTOG, TOL:=(WKSETOLERANCE|100+0.5) DIV 1, 12308000
$ SET OMIT = NOT(WORKSETMONITOR) OR OMIT 12308500
MONTOG, MON:=WKSETMONITOR, 12309000
$ POP OMIT % WORKSETMONITOR 12309500
USETOG, NM:=NAMS INX 0, DV:=0, BUFF:=BUFF-1); 12310000
BEGIN 12310500
DS:=4LIT"WK:"; 12311000
ERRORTOG(DS:=7LIT" ERROR:"; SI:=LOC NAM; SI:=SI+5; DS:=3CHR; 12311500
VALUTOG(DS:=LIT"="; SI:=LOC VALU; DS:=8DEC; 12312000
DV:=DI; DI:=DI-8; DS:=7FILL; DI:=DV); DS:=LIT" "); 12312500
$ SET OMIT = NOT(WORKSETMONITOR) OR OMIT 12313000
MONTOG(DS:=4LIT"MON="; SI:=LOC MON; PRINTDIGIT); 12313500
$ POP OMIT % WORKSETMONITOR 12314000
CYCLETOG(DS:=6LIT"CYCLE="; NEG(DS:=LIT"-"); 12314500
SI:=LOC CYC; PRINTDIGIT); 12315000
OLAYTOG(DS:=5LIT"OLAY="; 12315500
SI:=LOC OLA; PRINTDIGIT); 12316000
TOLTOG(DS:=4LIT"TOL="; 12316500
SI:=LOC TOL; PRINTDIGIT); 12317000
USETOG(SI:=NM; DS:=9LIT"OPTIONS: "; 12317500
L1: IF SC="0" THEN JUMP OUT; 12318000
SI:=SI+1; 7(IF SC=" " THEN SI:=SI+1 ELSE DS:=CHR); 12318500
DS:=LIT","; GO TO L1); 12319000
DI:=DI-1; DS:=LIT"~"; 12319500
END STREAM STATEMENT; 12320000
12320500
SPOUT((BUFF-1) INX (0&ZZSTA[9:9:9])); 12321000
NAMS:=[M[NAM:=SPACE(30)]] & 30[8:38:10]; %143-12321100
DISKWAIT(-NAM,30,DIRECTORYTOP+1); %143-12321110
NAMS[N:=4|SYSNO+4]:=WKSETCYCLETIME; %143-12321120
NAMS[N+1 ]:=WKSETINSTRUCT; %143-12321130
NAMS[N+2 ]:=WKSETOLERANCE; %143-12321140
NAMS[N+3 ]:=WKSETMAXOLAY; %143-12321150
DISKWAIT( NAM,30,DIRECTORYTOP+1); %143-12321160
FORGETSPACE(NAM); %143-12321170
END PROCEDURE WKSETREQUESTS; 12321500
12350000
PROCEDURE WORKSET(N); VALUE N; REAL N; 12350500
BEGIN 12351000
REAL MSCW = -2; 12351500
REAL 12352000
DEVIATION, 12352500
INS, 12353000
INSTRUCT, 12353500
LINK, 12354000
LOC, 12354500
MAXMIX, 12355000
MAXOLAY, 12355500
MAXVALUE, 12356000
MIX, 12356500
NJOBS, 12357000
PTIME, 12357500
TOTALPTIME, 12358000
OLAY, 12358500
TOTALOLAY, 12359000
STARTING, 12359500
STOPMIX, 12360000
SIZE, 12360500
T1, 12361000
T2, 12361500
TOTALOLAYCORE, 12362000
TOTALSAVECORE, 12362500
TOTALSYSTEMCORE, 12363000
VALU; 12363500
12364000
ARRAY JOBINFO[*]; 12364500
ARRAY RUNNING[*]; 12365000
12365500
DEFINE 12366000
OLAYINDX = 1#, % CODE FOR "OLAY RATIO" 12366500
PRIORINDX = 2#, % CODE FOR "PRIORITY", 12367000
ETIMEINDX = 3#, % CODE FOR "ELAPSED TIME", 12367500
COREINDX = 4#, % CODE FOR "CORE USAGE" 12368000
SAVEINDX = 5#, % CODE FOR "SAVE CORE USAGE" 12368500
INFOSIZE = 5#; % NUMBER OF ENTRIES FOR EACH MIX 12369000
12369500
DEFINE INFO[INFO1,INFO2] = JOBINFO[INFO1|INFOSIZE+INFO2-1]#; 12370000
12370500
LABEL START, LOOP, FINISHED; 12371000
12371500
COMMENT 12372000
THE "INSTRUCTIONS" ARE STORED IN THE GLOBAL VARIABLE 12372500
"WKSETINSTRUCT", USING FIELDS FOUR BITS IN LENGTH. 12373000
THE FIRST "INSTRUCTION" WILL BE IN THE [44:4] FIELD, THE 12373500
SECOND "INSTRUCTION" WILL BE IN THE [40:4] FIELD, AN SO FORTH. 12374000
THESE "INSTRUCTIONS" ARE THE NUMERICAL VALUES CORRESPONDING TO 12374500
CODES DEFINED ABOVE. 12375000
12375500
AS AN EXAMPLE OF HOW THESE "INSTRUCTIONS" ARE USED, SUPPOSE THAT 12376000
WKSETINSTRUCT.[44:4] CONTAINED A VALUE OF 3, 12376500
WKSETINSTRUCT.[40:4] CONTAINED A VALUE OF 2, AND THE 12377000
REMAINDER OF THE WKSETINSTRUCT WORD WERE ZERO. IN THIS 12377500
INSTANCE, THIS ROUTINE WOULD FIRST EXAMINE ALL JOBS IN THE 12378000
MIX, FINDING THE JOB WHICH HAD BEEN RUNNING FOR THE LONGEST 12378500
PERIOD OF TIME. NEXT, ALL JOBS WHICH HAVE BEEN RUNNING FOR A 12379000
PERIOD OF TIME WHICH IS WITHIN THE "WKSETOLERANCE" (NORMALLY 12379500
WITHIN ABOUT 10% OF THE MAXIMUM VALUE FOUND ABOVE) ARE EXAMINED 12380000
FOR THE NEXT "INSTRUCTION", THAT IS, THE PRIORITY. 12380500
IN THIS MANNER, THE JOB WHICH HAS BEEN RUNNING FOR THE LONGEST 12381000
PERIOD OF TIME, AND WHICH HAS THE HIGHEST PRIORITY WILL BE 12381500
SELECTED FOR "STOPPING". 12382000
END OF COMMENT; 12382500
12383000
12383500
SUBROUTINE CORESEARCH; 12384000
BEGIN 12384500
MAXMIN := 0; 12385000
% SEARCH THE LINKS TO DETERMINE CORE USAGE 12385500
IF NOT STOREDY THEN SLEEP([TOGLE],STOREMASK); 12386000
LOC := 0; % START AT LOW WND OF MEMORY 12386500
TOTALSYSTEMCORE := TOTALOLAYCORE := TOTALSAVECORE := 0; 12387000
WHILE (SIZE:=(LINK:=M[LOC]).[CF] -LOC) GEQ 0 DO 12387500
BEGIN 12388000
TOTALSYSTEMCORE := TOTALSYSTEMCORE + SIZE; 12388500
IF NOT LINK.[1:1] THEN % IN-USE AREA 12389000
BEGIN 12389500
IF (MIX:=LINK.[9:6]) GTR MAXMIX THEN MAXMIX := MIX; 12390000
IF LINK.[2:1] THEN % SAVE AREA 12390500
BEGIN 12391000
TOTALSAVECORE := TOTALSAVECORE + SIZE; 12391500
INFO[MIX,SAVEINDX] := INFO[MIX,SAVEINDX] - SIZE; 12392000
% NOTE: JOBS SHOULD BE STOPPED IN INVERSE RELATION TO 12392500
% AMOUNT OF SAVE CORE USED 12393000
END 12393500
ELSE 12394000
BEGIN 12394500
TOTALOLAYCORE := TOTALOLAYCORE + SIZE; 12395000
INFO[MIX,COREINDX] := INFO[MIX,COREINDX] + SIZE; 12395500
END; 12396000
END; % IF IN-USE AREA 12396500
LOC := LINK.[CF]; % NEXT LINK 12397000
END; % WHILE STATEMENT 12397500
FOR MIX := 1 STEP 1 UNTIL MAXMIX DO 12398000
IF RUNNING[MIX] THEN 12398500
IF PRYOR[MIX] LSS 0 THEN % CHECK AGAIN (LOSS OF CNTRL,ABOVE)12399000
BEGIN 12399500
RUNNING[MIX] := 0; 12400000
NJOBS := NJOBS - 1; 12400500
END; 12401000
% DONT USE JOBS WHICH ARE TERMINATING OR JUST STARTING 12401500
IF NJOBS LSS 2 THEN GO TO FINISHED; 12402000
END SUBROUTINE CORESEARCH; 12402500
12403000
IF (CLOCK+P(RTR)-WKSETSWITCHTIME) LSS 960 THEN 12403500
BEGIN 12404000
% ALLOW 15 SECONDS AFTER THE LAST "BOJ" OR "EOJ" 12404500
% BEFORE TESTING THE OVERLAY RATE 12405000
WKSETCLOCK:=(P(DUP)) + 960; 12405500
GO TO FINISHED; 12406000
END; 12406500
RUNNING := [M[T1:=SPACE(MIXMAX+1)]] & 12407000
(MIXMAX+1)[8:38:10]; 12407500
JOBINFO := [M[T2:=SPACE((MIXMAX+1)|INFOSIZE)]] & 12408000
((MIXMAX+1)|INFOSIZE)[8:38:10]; 12408500
12409000
START: 12409500
12410000
STREAM(F1:=T1-1,SZ1:=MIXMAX+1,F1:=T2-1, 12410500
SZ2 := (MIXMAX+1)|INFOSIZE, T1,T2); 12411000
BEGIN % ZERO OUT THE ARRAYS 12411500
SI:=F2; DS:=SZ2 WDS; SI:=F1; DI:=T1, DS:=SZ1 WDS; 12412000
END; 12412500
NJOBS := TOTALPTIME := TOTALOLAY := MAXOLAY := 0; 12413000
FOR MIX:=1 STEP 1 UNTIL MIXMAX DO 12413500
IF JARROW[MIX] NEQ 0 THEN % RUNNING JOB 12414000
IF NOT(JAR[MIX,9].[3:1]) THEN % NOT ALREADY STOPPED 12414500
IF (PRYOR[MIX] GEQ 0) AND (REPLY[MIX]=0) THEN 12415000
BEGIN 12415500
IF NOT(JAR[MIX,9].SYSJOBF) THEN %NOT "SYSTEM JOB 12416000
BEGIN 12416500
RUNNING[MIX] := 1; 12417000
NJOBS := NJOBS + 1; % COUNT THE NUMBER OF JOBS 12417500
END; 12418000
INFO[MIX,ETIMEINDX]:= 12418500
NABS(CLOCK+P(RTR)-NFO[MIX-1)|NXD+2].[1:17]|60); 12419000
PTIME := JAR[MIX,3] + PROCTIME[MIX]; 12419500
$ SET OMIT = NEWLOGGING OR OMIT 12419599
IF (P1MIX=MIX OR P2MIX=MIX) THEN 12419600
$ POP OMIT 12419601
$ SET OMIT = NOT(NEWLOGGING) OR OMIT 12419699
PTIME := PTIME+CLOCK+P(RTR); 12420000
IF (INFO[MIX,OLAYINDX]:= 12420500
OLAYTIME[MIX]/PTIME) GTR MAXOLAY THEN 12421000
IF RUNNING[MIX] THEN 12421500
MAXOLAY:=INFO[MIX,OLAYINDX]; % FIND MAX.VALUE 12422000
INFO[MIX,PRIORINDX] := PRYOR[MIX].[CF]; 12422500
TOTALOLAY := TOTALOLAY + OLAYTIME[MIX]; 12423000
TOTALPTIME:= TOTALPTIME + PTIME; 12423500
END; % MIX LOOP; 12424000
12424500
MIX~WKSETNOSELECT; %525-12424700
WKSETNOSELECT:=((OLAY:=TOTALOLAY/TOTALPTIME) GEQ (WKSETMAXOLAY|.85));12425000
IF MIX AND NOT WKSETNOSELECT THEN SELECTION; % SEE IF ANYTHING CAN GO 12425200
% NOTE: WKSETNOSELECT IS A FLAG TO PROCEDURE SELECTRUN TO 12425500
% PREVENT ENTERING ADDITIONAL JOBS INTO THE MIX 12426000
IF (OLAY GTR WKSETMAXOLAY) OR (MAXOLAY GTR (WKSETMAXOLAY|4)) THEN 12426500
% SUSPEND SOMETHING IF THE TOTAL OLAY RATE EXCEEDS MAX. VALUE 12427000
% SPECIFIED, OR ANY INDIVIDUAL RATE EXCEEDS 4 TIMES THE MAX. 12427500
% RATE SPECIFIED. 12428000
IF NJOBS GTR1 THEN % MORE THAN ONE JOB IS RUNNING 12428500
BEGIN 12429000
CORESEARCH; % SEARCH MEMORY TO DETERMINE CORE USAGE 12429500
% NOW DETERMINE WHICH JOB TO STOP BASED ON THE PRIORITY OF 12430000
% THE INSTRUCTIONS IN "WKSETINSTRUCT" 12430500
STOPMIX := -1; 12431000
INSTRUCT := WKSETINSTRUCT; 12431500
STARTING := TRUE; 12432000
12432500
LOOP: 12433000
12433500
IF (INS:=INSTRUCT.[44:4]) NEQ 0 THEN % MORE INSTRUCTIONS 12434000
BEGIN 12434500
INSTRUCT := 0 & INSTRUCT[8:4:40]; % SHIFT RIGHT FOR NXT.INSTR. 12435000
MAXVALUE := (IF STARTING THEN (-33000) ELSE INFO[STOPMIX,INS]);12435500
STARTING := FALSE; 12436000
% FIRST, FIND THEMAXIMUM VALUE 12436500
FOR MIX:=1 STEP 1 UNTIL MAXMIX DO 12437000
IF RUNNING[MIX] THEN 12437500
IF (VALU := INFO[MIX,INS]) GTR MAXVALUE THEN 12438000
BEGIN 12438500
MAXVALUE := VALU; 12439000
STOPMIX := MIX; 12439500
END; 12440000
12440500
% NEXT, FIND THE VALUES WITHIN THE WORK SET TOLERANCE 12441000
12441500
FOR MIX:=1 STEP 1 UNTIL MAXMIX DO 12442000
IF MIX NEQ STOPMIX THEN 12442500
IF RUNNING[MIX] THEN 12443000
BEGIN 12443500
DEVIATION := (MAXVALUE-INFO[MIX,INS])/MAXVALUE; 12444000
IF ABS(DEVIATION) GTR WKSETOLERANCE THEN 12444500
BEGIN 12445000
RUNNING[MIX]:=0; 12445500
NJOBS := NJOBS -1; 12446000
END; 12446500
END; 12447000
IF NJOBS GTR 1 THEN GO TO LOOP; 12447500
END; % IF THERE WERE MORE INSTRUCTIONS 12448000
12448500
IF STOPMIX GTR 0 THEN % SOMETHING SHOULD BE STOPPED 12449000
BEGIN 12449500
IF NOTERMSET(STOPMIX) THEN % JOB IS NOT TERMINATING 12451000
BEGIN 12451500
PRTROW[STOPMIX].[PSF]:=2; % MARK IT STOPPED 12452000
WKSETSWITCHTIME:=CLOCK+P(RTR); 12452500
WKSETSTOPJOBS:=WKSETSTOPJOBS OR TWO(STOPMIX); % MARK AUTO-ST12453000
WKSETNOSELECT:=TRUE; %138-12453100
JAR[STOPMIX,9].[3:1]:=1; % MARK IT STOPPED 12453500
STQUE[STNEXT]:=STOPMIX; % PUT IT IN THE STQUE 12454000
STNEXT := (STNEXT+1).[44:4]; % CIRCULAR QUEUE, 16 ENTRIES 12454500
END; % IF WE ARE STOPPING THE JOB 12455000
END; % IF SOMETHING SHOULD BE STOPPED 12455500
$ SET OMIT = NOT(WORKSETMONITOR) OR OMIT 12456000
IF WKSETMONITOR THEN 12456500
IF STOPMIX GTR 0 THEN 12457000
FOR STOPMIX:=1 STEP 1 UNTIL MIXMAX DO 12457500
IF JARROW[STOPMIX] NEQ 0 THEN 12458000
IF PRTROW[STOPMIX] NEQ 0 THEN 12458500
IF INFO[STOPMIX,OLAYINDX] GTR 0 THEN 12459000
BEGIN 12459500
STREAM( 12460000
V1:="MIX=", 12460500
V2:=STOPMIX, 12461000
V3:="RAT=", 12461500
V4:=(INFO[STOPMIX,OLAYINDX]|100+0.5) DIV 1, 12462000
V5:="PRI=", 12462500
V6:=INFO[STOPMIX,PRIORINDX], 12463000
V7:="TIM=", 12463500
V8:=(ABS(INFO[STOPMIX,ETIMEINDX])/64+ 0.5) DIV 1, 12464000
V9:="COR=", 12464500
V10:=INFO[STOPMIX,COREINDX], 12465000
V11:="SAV=", 12465500
V12:=ABS(INFO[STOPMIX,SVEINDX]), 12466000
V13 := "TOT=", 12466500
V14 := (TOTALOLAY/TOTALPTIME|100+0.5) DIV 1, 12467000
DV:=0, 12467500
D:=T1:=SPACE(15)); 12468000
BEGIN 12468500
SI:=LOC V1; DS:=LIT" "; 12469000
7(SI:=SI+4; DS:=4CHR; DS:=5DEC; 12469500
DV:=DI; DI:=DI-5; DS:=4FILL; DS:=DV; DS:=LIT" "); 12470000
DS:=LIT"~"; 12470500
END STREAM; 12471000
SPOUT(T1); 12471500
END; 12472000
$ POP OMIT % WORKSETMONITOR 12472500
END %142-12473000
ELSE %142-12473010
ELSE %142-12473020
IF WKSETSTOPJOBS GTR 0 THEN %142-12473030
IF (OLAY LSS (WKSETMAXOLAY/2)) THEN % START SOMETHING %142-12473040
BEGIN %142-12473050
STNEXT:=IF STNEXT=0 THEN STQUEMAX ELSE STNEXT-1; %142-12473060
STOPMIX:=STQUE[STNEXT]; %142-12473070
STQUE[STNEXT]:=0; %142-12473080
IF (STOPMIX GTR 0) AND (STOPMIX LEQ MIXMAX) THEN %142-12473090
IF JARROW[STOPMIX] NEQ 0 THEN %142-12473100
BEGIN %142-12473110
IF STOPSET(STOPMIX) THEN % NOT YET STOPPED %142-12473120
BEGIN %142-12473130
PRTROW[STOPMIX].[PSF]:=0; %142-12473140
WKSETSTOPJOBS:=WKSETSTOPJOBS AND NOT(TWO(STOPMIX)); %142-12473150
JAR[STOPMIX,9].[3:1]:=0; %142-12473160
END ELSE %142-12473170
BEGIN %142-12473180
REPLY[STOPMIX]:=VOK; % WAKE IT UP %142-12473190
STREAM(J:=JARROW[STOPMIX], STOPMIX, %142-12473200
D:=T1:=SPACE(10)); %142-12473210
BEGIN %142-12473220
SI:=J; DS:=9 LIT" AUTO-OK "; %142-12473230
2(SI:=SI+1; DS:=7 CHR; DS:=LIT "/"); %142-12473240
DI:=DI-1; DS:=LIT"="; SI:=LOC STOPMIX; %142-12473250
DS:=2 DEC; DS:=LIT"~"; DI:=DI-3; DS:=FILL; %142-12473260
END STREAM STATEMENT; %142-12473270
SPOUTER(T1,PSEUDOMIX[STOPMIX],1); %525-12473280
END; %142-12473290
END; %142-12473300
END; %142-12473310
FINISHED: 12473500
IF JOBINFO NEQ 0 THEN FORGETSPACE(JOBINFO INX 0); 12474000
IF RUNNING NEQ 0 THEN FORGETSPACE(RUNNING INX 0); 12474500
WKSETRUNNING := 0; % READY FOR NEXT CYCLE 12475000
KILL([MSCW]); 12475500
END; 12476000
$ POP OMIT % WORKSET 12477000
REAL PROCEDURE PRNPBTSPECASE1(Z); 12500000
% 12500100
% THIS PROCEDURE HANDLES THE FOLLOWING FUNCTIONS FOR COM19, DEPENDING 12500110
% ON THE VALUE OF Z: 12500120
% 0 FINDS THE NEXT REEL OF TAPE. 12500130
% 1 FINDS THE NEXT REEL OF A BACK-UP DISK FILE. 12500140
% 2 HANDLES THE QT + OR - MESSAGE. 12500150
% 3 INITAILIZES A NEW FILE (OR PACKET). 12500160
% 4 HANDLES TERMINATION OF A FILE. 12500170
% 12500180
VALUE Z; REAL Z; 12500500
BEGIN 12501000
REAL RCW=+0, MSCW=-2, COMMON=-4; 12501500
ARRAY INREC=+1[*]; 12502000
ARRAY FPB=INREC+1[*], LOGINFO=FPB+1[*], HEADER=LOGINFO+1[*]; 12502500
REAL UNIT=HEADER+1, V=UNIT+1, COPY=V+1, MFID=COPY+1, FID=MFID+1, 12503000
IOD=FID+1, T=IOD+1, B=T+1; 12503500
REAL SEARCHVAL=B+1, CURROW=SEARCHVAL+1, FIRSTFID=CURROW+1, 12504000
SEGNR=FIRSTFID+1; 12504500
REAL X=SEARCHVAL, NUM=CURROW, RECOUNT=SEGNR; 12505000
BOOLEAN SIGNEDON=SEGNR+1, FORMTOG=SIGNEDON+1, ABORTED=FORMTOG+1; 12505500
BOOLEAN TERMFLAG=LOGINFO, NOCONT=FIRSTFID; 12506000
$ SET OMIT = NOT PACKETS 12506500
BOOLEAN STOG=ABORTED+1; 12507000
REAL PCOPY=STOG+1, PFIRSTFID=PCOPY+1; 12507500
$SET OMIT = NOT (RJE AND PACKETS) 12508000
$ SET OMIT = PACKETS 12509500
12512000
LABEL RD, RED, SPACEND, NOMORE, NOFILE, AUT, BOMBER, NEXTFILE, 12512500
PNCHLK, PRINTITAGAIN, EOF, PRNTDS, PNCHDS, TAPEND, CONTINUE,12513000
RETURNFALSE, REMOVEM, TEST, TAPECL, STOPTIME, RETURNTRUE, 12513500
RETURNTOCOM19; 12513750
LABEL LOOK4TAPE, NOMOREELS, QTSPEC, INITIALIZE, STARTANEWFILE; 12514000
SWITCH SW := 12514500
LOOK4TAPE, NOMOREELS, QTSPEC, INITIALIZE, STARTANEWFILE; 12515000
DEFINE DSED = TERMSET(P1MIX)#, 12515500
QTED = (PRT[P1MIX,@25]!0)#, 12516000
VF = 43:5#, 12516100
UNITE = 38:5#, 12516150
COPYF = 30:8#, 12516200
NUMF = 22:8#, 12516250
NOTP = 29:1#, 12516300
COPY0 = 21:1#, 12516350
$ SET OMIT = PACKETS 12516500
REELNO = 42:6#, 12518000
$ POP OMIT OMIT 12518500
$ SET OMIT = RJE 12518600
STA = 0#, 12518700
$ POP OMIT 12518800
SEPARATION = 46#; % FOR 6 LPI. SET IT TO 70 FOR 8 LPI. 12519000
%***********************************************************************12519500
12520000
SUBROUTINE RDYTAPE; 12520500
BEGIN 12521000
B.[18:9]:=@54; 12521500
P(WAITIO(@4200000000,0,UNIT),DEL); 12522000
P(WAITIO(B,0,UNIT),WAITIO(B,@40,UNIT),DEL,DEL); 12522500
RECOUNT:=@77777; 12523000
END; 12523500
12524000
%***********************************************************************12524500
12525000
SUBROUTINE REWIND; 12525500
BEGIN 12526000
STOPIMING(1,1023); 12526500
P(WAITIO(@4200000000,0,UNIT),DEL); 12527000
IF (SAVEWORD AND TWO(UNIT))=0 AND PRNTABLE[UNIT].[1:1] 12527500
AND NOT (SVPBT OR QTED OR NOCONT) THEN 12528000
BEGIN RDCTABLE[UNIT].[8:6]~0; %539-12528400
INDEPENDENTRUNNER(P(.PURGEIT),UNIT,64) 12528500
END %539-12528600
ELSE 12529000
BEGIN LABELTABLE[UNIT]~@114; 12529500
MULTITABLE[UNIT]~RDCTABLE[UNIT]~0; 12530000
SLEEP([TOGLE],STATUSMASK); 12530500
READY~READY AND NOT NT1~TWO(UNIT); 12531000
RRRMECH~NOT NT1 AND RRRMECH OR NT1 AND SAVEWORD; 12531500
END; 12532000
END; 12532500
12533000
%***********************************************************************12533500
12534000
BOOLEAN PROCEDURE LOOKFORTAPE; 12534500
BEGIN 12535000
T:=RDCTABLE[UNIT]; 12535500
REWIND; 12536000
IF SIGNEDON THEN FPB[4]:=FPB[4]-LOGINFO[24]-CLOCK-P(RTR); 12536500
IF P((T:=FINDINPUT(MFID,@122212342546447,T.[14:10]+1,T.[24:17],12537000
-0,0,T:=0,0,0,0)) GEQ 0, DUP) THEN 12537500
BEGIN 12538000
RDCTABLE[UNIT:=T].[8:6]:=P1MIX; 12538500
LABELTABLE[UNIT]:=FID; 12539000
FPB:=PRT[P1MIX,3]; % FINDINPUT CALLS STARTIMING 12539500
IF SIGNEDON THEN FPB[4]:=FPB[4]+LOGINFO[24]+CLOCK+P(RTR); 12540000
RDYTAPE; 12540500
END; 12541000
LOOKFORTAPE:=P; 12541500
END; 12542000
12542500
%***********************************************************************12543000
12543500
REAL SUBROUTINE READTAPE; 12544000
BEGIN 12544500
RD: IF DSED OR PRT[P1MIX,@25]=5 THEN BEGIN P(5); GO TO RED END; 12545000
IF WAITIO(B,@2000040,UNIT).[42:1] THEN 12545500
BEGIN 12546000
P(WAITIO(B,@3000040,UNIT),DEL); 12546500
IF M[B INX 3] THEN 12547000
IF LOOKFORTAPE THEN GO TO RD; 12547500
P(3); 12548000
GO TO RED; 12548500
END; 12549000
FOR T:=17 STEP 18 UNTIL 89 DO 12549500
IF M[B INX T].[20:1] THEN T:=256; 12550000
P(T>200); 12550500
RED: READTAPE:=P; 12551000
END; 12551500
12552000
%***********************************************************************12552500
12553000
BOOLEAN SUBROUTINE SPACETOFILE; 12553500
BEGIN 12554000
X:=NUM; 12554500
WHILE (X:=X-1) GEQ 0 DO 12555000
BEGIN 12555500
DO UNTIL (T:=READTAPE); 12556000
IF T GEQ 3 THEN BEGIN P(1) GO TO SPACEND END; 12556500
END; 12557000
P(0); 12557500
SPACEND: 12558000
SPACETOFILE:=P; 12558500
END; 12559000
12559500
%***********************************************************************12560000
12560500
BOOLEAN SUBROUTINE FINDFILE; 12561000
BEGIN 12561500
IF HEADER.[CF] GEQ 64 THEN FORGETSPACE(HEADER); %159-12561600
IF (HEADER:=DIRECTORYSEARCH(MFID,-FID,SEARCHVAL)) LSS 64 THEN 12562000
GO TO NOMORE; 12562500
HEADER:=[M[HEADER]]&30[8:38:10]; 12563000
SEGNR:=0; 12563500
CURROW:=10; 12564000
IF ABORTED:=HEADER[5].[2:1] THEN 12564500
IF HEADER[7]=0 THEN 12565000
BEGIN 12565500
NOMORE: P(1); 12566000
GO TO NOFILE; 12566500
END; 12567000
LABELTABLE[V]:=NABS(FID); 12567500
P(0); 12568000
NOFILE: FINDFILE:=P; 12568500
END; 12569000
12569500
%***********************************************************************12570000
12570500
BOOLEAN SUBROUTINE NOMOREREELS; 12571000
BEGIN 12571500
IF FID.[REELNO]=0 THEN 12572500
P(1) %159-12573500
ELSE %159-12574000
BEGIN 12574500
STREAM[ONE:=1, F:=[FID]); 12575000
BEGIN SI:=LOC ONE; DS:=8 ADD END; 12575500
P(FINDFILE); 12576000
END; 12576500
NOMOREREELS:=P; 12577000
END; 12577500
$ SET OMIT = NOT PACKETS 12578000
12578500
%***********************************************************************12579000
12579500
BOOLEAN SUBROUTINE NOMOREFILES; 12580000
BEGIN 12580500
IF NOT P(FID.[30:12]="99" OR COMMON.[NOTP],DUP) THEN 12581000
BEGIN 12581500
P(DEL); 12582000
STREAM(ONE:=1, F:=[FID]); 12582500
BEGIN SI:=LOC ONE; SI:=SI+6; SI:=SI+5; 12583000
DS:=2 ADD; DS:=LIT"1"; 12583500
END; 12584000
FIRSTFID:=FID; 12584500
P(FINDFILE); 12585000
END; 12585500
NOMOREFILES:=P; 12586000
END; 12586500
$ POP OMIT 12587000
12587500
%***********************************************************************12588000
12588500
SUBROUTINE REMOVEIT; 12589000
BEGIN 12589500
T:=DIRECTORYSEARCH(-MFID,-(FID:=PFIRSTFID),SEARCHVAL); 12590000
IF T GEQ 64 THEN 12590500
$ SET OMIT = NOT PACKETS 12591000
DO BEGIN 12591500
$ POP OMIT 12592000
DO IF FID=IOD THEN GO AUT UNTIL NOMOREREELS; 12592500
$ SET OMIT = NOT PACKETS 12593000
END UNTIL NOMOREFILES; 12593500
$ POP OMIT 12594000
AUT: 12594500
END; 12595000
12595500
%***********************************************************************12596000
12596500
SUBROUTINE PAGEJECT; 12597000
BEGIN 12597500
$ SET OMIT = NOT RJE 12598000
P(WAITIO(@4000100000,0,V), DEL); 12600500
END; 12601000
12601500
%***********************************************************************12602000
12602500
SUBROUTINE WRITER; 12603000
BEGIN 12603500
$ SET OMIT = NOT RJE 12604000
P(WAITIO(B INX @210104000000,0,V), DEL); 12607000
END; 12607500
12608000
%***********************************************************************12608500
12609000
SUBROUTINE IDLETIMER; 12609500
BEGIN 12610000
STOPLOG(P1MIX,1); 12610100
P(P1MIX); P1MIX:=0; 12610500
IDLETIME; 12611000
P1MIX:=P; 12611500
$ SET OMIT = NOT(NEWLOGGING) 12611899
STARTLOG(P1MIX); 12612000
END IDLETIMER; 12612500
12613000
%***********************************************************************12613500
12614000
SUBROUTINE SETUPINREC; 12614500
BEGIN 12615000
INREC:=[M[B INX (UNIT=18)]]&18[8:38:10]; 12615500
INREC[17]:=0; 12616000
END; 12616500
12617000
%***********************************************************************12617500
12618000
SUBROUTINE INVALIDNUM; 12618500
BEGIN 12618750
FILEMESS("INVALID","FILE ",0,"NUMB #",NUM+1,0,0); 12619000
END; 12619250
12619500
%***********************************************************************12620000
12620500
P(DEL,Z,MSCW,STF); 12621000
GO TO SW[P]; % LOOK4TAPE,NOMOREELS,QTSPEC,INITIALIZE,STARTANEWFILE12621500
% 12621900
% LOOKFORTAPE FINDS THE NEXT REEL. THE FIRST RECORD IS A LABEL SO 12621910
% INREC IS MOVED DOWN TO SKIP IT. 12621920
12621930
LOOK4TAPE: 12622000
12622100
P(LOOKFORTAPE); 12622500
IF M[B+89].[1:11]=0 THEN % LABEL RECORD 12623000
BEGIN 12623100
INREC~(NOT 17) INX INREC; 12623200
RECOUNT~0; 12623300
END; 12623400
GO RETURNTOCOM19; 12624000
12624400
NOMOREELS: 12624500
12624600
P(NOMOREREELS); 12625000
GO RETURNTOCOM19; 12625500
12625900
QTSPEC: 12626000
12626100
PRT[P1MIX,@25]:=0; 12626250
P(T); % BE CAREFUL OF THIS. 12626500
IF UNIT=18 THEN % DISK PORTION 12626750
BEGIN NT2:=(T.[9:24] DIV 5)&T[1:2:1]; 12627000
IOD:=(HEADER[8] DIV 3)|3; % CALCULATE TRUE ROW SIZE 12627500
IF (T:=3|NT2+SEGNR) LSS 0 THEN % SPACE BACKWARD 12628000
DO IF (CURROW:=CURROW-1) LSS 10 THEN 12628500
BEGIN 12629000
IF FID=FIRSTFID THEN GO TO BOMBER; 12629500
IF SEARCHVAL=3 THEN P(DIRECTORYSEARCH(-MFID,FID,13),DEL); 12630000
FORGETSPACE(HEADER); 12630500
STREAM(ONE:=1, F:=[FID]); 12631000
BEGIN SI:=LOC ONE; DS:=8 SUB END; 12631500
IF (HEADER:=DIRECTORYSEARCH(MFID,FID,5)) LSS 64 12632000
THEN GO BOMBER; 12632002
HEADER:=[M[HEADER]]&30[8:38:10]; 12632500
CURROW:=HEADER[9].[43:5]+9; 12633000
WHILE HEADER[CURROW]=0 DO CURROW:=CURROW-1; 12633500
IF CURROW<10 THEN 12634000
BEGIN 12634500
BOMBER: NT1:="RANGE +"; 12635000
IF (NT2:=P).[2:1] THEN % LEFT AT 12626500%168-12635500
NT1:=NT1&"-"[42:42:6]; 12636000
FILEMESS("INVALID","QT ",0, 12636500
NT1,NT2.[9:24],0,0); 12637000
PRT[P1MIX,@25]:=5; % FORCE A QT 12637500
GO RETURNFALSE; 12638500
END; 12639000
END UNTIL (T:=IOD+T) GEQ 0 12639500
ELSE % SPACE DISK FORWARD 12640000
BEGIN 12640500
IF T GEQ IOD THEN % TO ANOTHER ROW, 12641000
DO % CHECKING FOR NEW FILE12641500
IF (CURROW:=CURROW+1) GEQ (HEADER[9].[43:5]+10) THEN 12642000
NEXTFILE: IF NOMOREREELS THEN GO TO BOMBER 12642500
UNTIL (T:=T-IOD) LSS 100; 12643000
IF (CURROW-10)|IOD+T GTR HEADER[7]|3 THEN 12643500
GO TO NEXTFILE; 12644000
END; 12644500
SEGNR:=T; 12645000
P(19); 12645500
END ELSE % TAPE PORTION 12646000
BEGIN 12646500
IF T.[2:1] THEN % SPACE BACKWARD 12647000
IF (T:=T.[9:24]) LSS INREC[17].[CF] THEN 12647500
BEGIN IOD:=(I+4) DIV 5; 12648000
DO P(WAITIO((89 INX B)&7[22:45:3],0,UNIT),DEL) 12648500
UNTIL (IOD:=IOD-1) LEQ 0 OR DSED OR QTED; 12649000
RECOUNT:=5; 12649500
END ELSE GO TO BOMBER % REEL SWITCH NOT ALLOWED 12650000
ELSE 12650250
BEGIN IF (IOD:=T.[9:24] DIV 5) ! 0 THEN % SPACE FORWARD %168-12650500
DO UNTIL (X:=READTAPE) OR (IOD:=IOD-1)=0; 12651000
IF IOD!0 THEN 12651500
IF X!5 THEN GO TO BOMBER; % 5=DS-ED, LET IT FALL THRU.12652000
RECOUNT:=0; 12652500
END; 12653000
RECOUNT:=(M[B INX 17] INX NOT RECOUNT).[CF]; 12653500
P(18); 12654000
END; 12654500
% 12654900
% FIX UP INREC, BUILD IO DESC AND QT MESSAGE AS NEXT TO BE WRITTEN. 12654910
% 12654920
P(T:=B INX P(XCH)); 12655000
INREC:=INREC&P(XCH)[CTC]; 12655500
M[T-1]:=(RECOUNT+1)&74[11:41:7]&(V!22)[29:44:4]; 12656000
NT1:=P; % LEFT AT 12626500 12656500
STREAM(A:=NT1.[9:24], C:=NT1.[2:1], PNCH:=V=22, B:=T-18); 12657000
BEGIN DS:=16 LIT"<<<<<<<<<<<<<<< "; 12657500
CI:=CI+PNCH; GO TO PRNT; DS:=7 LIT" PUNCH"; GO TO L1; 12658000
PRNT:DS:=7 LIT"PRINTER"; 12658500
L1: DS:=21 LIT" BACK UP FILE SPACED "; 12659000
CI:=CI+C; GO TO FER; DS:=4 LIT"BACK"; GO TO L2; 12659500
FER: DS:=4 LIT" FOR"; 12660000
L2: DS:=4 LIT"WARD"; 12660500
SI:=LOC A; DS:=6 DEC; B:=DI; DI:=DI-6; 12661000
DS:=5 FILL; DI:=B; 12661500
CI:=CI+PNCH; GO TO LIN; DS:=5 LIT" CARD"; GO TO L3; 12662000
LIN: DS:=5 LIT" LINE"; 12662500
L3: DS:=17 LIT"S. >>>>>>>>>>>>>>"; 12663000
B:=DI; SI:=B; SI:=SI-8; DS:=7 WDS; 12663500
END; 12664000
GO RETURNTRUE; 12664500
12664900
INITIALIZE: 12665000
12665100
% HANDLES MISCELLANEOUS SETUP TASKS, INCLUDING STARTING THE TIMING FOR12665110
% LOGGING, CHECKING AND READYING THE INPUT FILE AND SPREADING COMMON. 12665120
% 12665130
RCW.[CF]:=P(.COM19,LOD) INX 1; 12665500
$ SET OMIT = NOT RJE 12665750
V:=COMMON.[VF]; 12667750
IF P(.INREC,LOD)=0 THEN 12668000
BEGIN 12668250
$ SET OMIT = NOT RJE 12668500
BEGIN 12669250
IF LABELTABLE[V].[1:5]!@21 THEN % PRINTER CL-ED 12669500
BEGIN 12669750
IF (UNIT:=COMMON.[UNITF])<16 THEN 12670000
IF LABELTABLE[UNIT]=@2100000060606060& 12670250
TINU[V][6:30:18] THEN SETNOTINUSE(UNIT,0); 12670500
GO TO INITIATE; 12670750
END; 12671000
LABELTABLE[C].[5:1]:=0; 12671250
END; 12671500
PRT[P1MIX,@25]:=0; 12672000
P:=(GETSPACE[91,IOBUFFERAREAV,1)+2)&90[8:38:10];% %167-12672500
END; 12673000
$ SET OMIT = NOT RJE 12673500
RDCTABLE[V].[8:6]:=P1MIX; 12675000
STARTIMING(5,V); 12675250
STARTIMING(0,UNIT:=COMMON.[UNITF]); 12675500
FPB:=PRT[P1MIX,3]; 12675750
COPY:=COMMON.[COPYF]; 12676000
IF UNIT=18 THEN 12676500
BEGIN 12677000
MFID:=IF V=22 THEN "PUD " ELSE "PBD "; 12677500
$ SET OMIT = NOT RJE 12678000
FIRSTFID:=LABELTABLE[V].[6:42]; 12679500
$ SET OMIT = NOT PACKETS 12680000
IF NOT COMMON.[NOTP] THEN BEGIN PCOPY:=COPY; COPY:=0 END; 12680250
PFIRSTFID:= 12680500
$ POP OMIT 12681000
FID:=FIRSTFID; 12681500
SEARCHVAL:=3; 12682000
IF FINDFILE THEN GO RETURNFALSE; 12682500
END ELSE 12684000
BEGIN 12684500
ABORTED:=0; 12686000
NOCONT:=((NUM:=COMMON.[NUMF]) OR COPY)!0; 12686500
MFID:=MULTITABLE[UNIT]; 12687000
IF LABELTABLE[UNIT].[1:5]!@21 THEN % UNIT WAS CL-ED WHILE 12687300
BEGIN ABORTED:=2; % WE WERE SCHEDULED. 12687400
GO RETURNFALSE; 12687500
END; 12687600
FID:=LABELTABLE[UNIT]:=(*P(DUP))&0[5:47:1]; 12687700
RDCTABLE[UNIT].[8:6]:=P1MIX; 12688000
RDYTAPE; 12689000
IF SPACETOFILE THEN 12690500
BEGIN 12691000
IF T=3 THEN INVALIDNUM; % SET BY READTAPE IF EOT. 12691500
GO RETURNFALSE; 12692000
END; 12692500
END; 12693000
SETUPINREC; 12693500
GO RETURNTRUE; 12694000
12694400
STARTANEWFILE: 12694500
12694600
% HANDLES THE END OF A FILE AND FIGURES OUT WHAT TO DO NEXT. BUT 12694610
% FIRST, THE LOG MUST BE TAKEN CARE OF. (DONT USE T BETWEEN HERE AND 12694620
% THE TEST AT 12705750.) 12694630
% 12694640
IF ABORTED=2 THEN GO TO TAPECL; 12694800
IF SIGNEDON THEN 12695000
BEGIN 12695500
LOGINFO[12]:=-P(DUP)+PROCTIME[P1MIX]+CLOCK+P(RTR); 12696000
LOGINFO[13]:=IOTIME[P1MIX]-(IOTIME[P1MIX]:=LOGINFO[13]); 12696500
OLDIDLETIME:=OLDIDLETIME+LOGINFO[12]; 12697000
PROCTIME[P1MIX]:=*P(DUP)-LOGINFO[12]; 12697500
IDLETIMER; 12698000
LOGINFO[14]:=JAR[P1MIX,7]-(JAR[P1MIX,7]:=LOGINFO[14]); 12698500
LOGINFO[17]:=XCLOCK+P(RTR); 12699000
LOGINFO[18]:=(DSED|2)&DATE[1:18:30]; 12699500
LOGINFO[23]:=FPB[3]&TINU[UNIT][24:18:12]; 12700000
LOGINFO[28]:=FPB[8]&TINU[V][24:18:12]&FORMTOG[42:47:1]; %750-12700500
TINU[UNIT].[18:12]:=0; TINU[V].[18:12]:=0; 12701000
SIGNEDON:=LOGINFO[24]+CLOCK+P(RTR); 12701500
LOGINFO[24]:=LOGINFO[29]:=SIGNEDON; 12702000
FPB[4]:=(*P(DUP))-SIGNEDON; 12702500
FPB[9]:=(*P(DUP))-SIGNEDON; 12703000
LOGSPACE([LOGINFO[0]],30); 12703500
FORGETSPACE(LOGINFO); 12704000
SIGNEDON:=0; 12704500
END; 12705000
% 12705100
% IF DSED OR QTED, SKIP THE CHECKS FOR COPIES. 12705110
% 12705120
IF (TERMFLAG:=DSED OR QTED|3) THEN 12705250
IF V=22 THEN GO TO PNCHDS ELSE GO TO PRNTDS; 12705500
% 12705600
% T IS SET IF THE FIRST GET FAILS. THIS SHOULD ONLY HAPPEN AT THE END 12705610
% OF A BACK-UP TAPE. NOTE THAT IF A FILE NUMBER IS SPECIFIED, INITIAL-12705620
% IZE ONLY SPACES TO ITS START, SO WE MAY CATCH AN INVALID NUMBER 12705630
% HERE. SINCE ONLY ONE FILE IS PRINTED WHEN A NUMBER IS GIVEN, IF WE 12705640
% ARRIVE HERE, IT MUST HAVE BEEN A BAD NUMBER. IF IT IS DESIRED TO 12705650
% CONTINUE DOWN THE TAPE AFTER THE SPECIFIED FILE, THIS TEST WILL NEED12705660
% TO BE CHANGED. 12705670
% 12705680
IF T THEN % FIRST GET FAILED 12705750
IF UNIT!18 THEN 12706000
BEGIN 12706250
IF COMMON.[NUMF]!0 THEN INVALIDNUM; 12706500
GO TO TAPEND; 12706750
END ELSE GO REMOVEM; 12707000
% 12707100
IF (COPY:=COPY-1) GTR 0 THEN % MORE COPIES OF FILE RQD. 12707250
BEGIN 12707500
IF V=22 AND PUNCHLCK THEN 12707750
BEGIN 12708000
PUNCHLK: STREAM(P1MIX, T:=T:=SPACE(10)); 12708250
BEGIN DS:=25 LIT"#PNCH LOCKED;PRNPBT/DISK="; 12708500
SI:=LOC P1MIX; DS:=2 DEC; DS:=LIT"~"; 12708750
DI:=DI-3; DS:=FILL; 12709000
END; 12709250
SPOUT(T); 12709500
REPLY[P1MIX]:=NABS(T:=VOK&VWY[36:42:6]&VQT[30:42:6]); 12709750
COMPLEXSLEEP(REPLY[P1MIX]>0 OR DSED); 12710000
IF NOT WHYSLEEP(T) THEN GO TO PNCHLK; 12710250
IF DSED OR QTED THEN GO STARTANEWFILE; 12710500
END; 12710750
IF UNIT=18 THEN % DISK 12711000
BEGIN 12711250
$ SET OMIT = NOT PACKETS 12711500
IF NOT STOG THEN STOG:=SEARCHVAL=3; 12712000
$ POP OMIT 12712500
PRINTITAGAIN: 12713000
FID:=FIRSTFID; 12713500
SEARCHVAL:=5; 12714000
IF FINDFILE THEN GO TO EOF ELSE GO TO CONTINUE; 12714500
END; 12715000
% % TAPE 12715400
IF RDCTABLE[UNIT].[14:10]!1 THEN % THIS ISNT FIRST REEL 12715500
BEGIN 12716000
RDCTABLE[UNIT].[14:10]:=0; 12716500
IF NOT LOOKFORTAPE THEN GO TO EOF; 12717000
END ELSE 12717500
RDYTAPE; 12718000
IF SPACETOFILE THEN GO TO EOF ELSE GO TO CONTINUE; 12718500
END; 12719000
$ SET OMIT = NOT PACKETS 12719500
IF UNIT=18 THEN % CHECK FOR COPIES OF PACKET 12720000
BEGIN 12720500
IF STOG THEN BEGIN SEARCHVAL:=3; STOG:=0 END; 12721000
IF NOMOREFILES THEN 12721500
IF (PCOPY:=PCOPY-1) GTR 0 THEN 12722000
BEGIN 12722500
FIRSTFID:=PFIRSTFID; 12723000
GO PRINTAGAIN; 12723500
END ELSE 12724000
ELSE GO CONTINUE; 12724500
END; 12725000
$ POP OMIT 12725500
12725900
EOF: 12726000
12726100
% AT THIS POINT, WE ARE THROUGH WITH THIS FILE OR PACKET. CLEAN UP 12726110
% THE OUTPUT BEFORE COING ON. 12726120
% 12726130
PRNTDS: 12728000
PNCHDS: 12740000
IF UNIT!18 THEN % TAPE 12740500
BEGIN 12741000
IF TERMFLAG OR NOCONT OR ABORTED THEN 12741500
BEGIN 12742000
TAPEND: 12742500
REWIND; 12743000
GO TO TEST; 12743500
END ELSE 12744000
BEGIN % TRY THE NEXT FILE 12744500
NUM:=NUM+1; 12745000
RECOUNT:=@77777; 12745500
CONTINUE: SETUPINREC; 12746000
RETURNFALSE: 12746500
P(0); 12747000
GO RETURNTOCOM19; 12747500
END; 12748000
END; 12748500
12748900
REMOVEM: 12749000
12749100
% DISK - CLOSE THE OPENED FILES AND, IF NOT QTED, REMOVE THEM. 12749110
% 12749120
IOD:=IF SEARCHVAL=3 THEN FID ELSE NOT 0; 12749500
SEARCHVAL:=13; REMOVEIT; 12750000
FPB[4]:=(*P(DUP))+CLOCK+P(RTR); 12750250
IF TERMFLAG!3 THEN % NOT QT-ED 12750500
BEGIN 12751000
IOD:=NOT 0; 12751500
SEARCHVAL:=7; REMOVEIT; 12752000
TEST: % FOR CONTINUATION FOR AUTOPRINT OR RJE. 12752500
IF AUTOPRINT AND NOT (FORMTOG OR TERMFLAG) AND 12753000
(TWO(V) AND SAVWORD)=0 12753500
$ SET OMIT = NOT RJE 12753750
THEN 12755000
IF (COMMON:=PRINTORPUNCHWAIT(-V,-STA))!0 THEN GO TO STOPTIME;12755500
END; 12756000
TAPECL: 12756400
COMMON:=0; 12756500
FORGETSPACE(B); 12757000
$ SET OMIT = NOT RJE 12757350
SETNOTINUSE(V,FORMTOG); 12757500
STOPTIME: 12757750
STOPTIMING(5,1023); 12758000
RETURNTRUE: 12758250
P(1); 12758500
RETURNTOCOM19: 12759000
P(0,RDS,1,SUB,0,XCH,CFX,STF); 12759500
END OF FIRST PRINTER BACKUP SPECIAL CASES PROCEDURE; 12760000
PROCEDURE PRNPBTSPECASE2(Z); 12800000
% 12800100
% THIS PROCEDURE HANDLES ADDITIONAL THINGS FOR COM19. VALUES OF Z ARE:12800110
% 0 INITIALIZE LOGGING. 12800120
% 1 WRITE ABORT OR DSED MESSAGE AND CONSTRUCT ENDING LABEL. 12800130
% 2 HANDLE PARITY ON INPUT FILE. 12800140
% 12800150
VALUE Z; REAL Z; 12800500
BEGIN 12801000
REAL RCW=+0, MSCW=-2, COMMON=-4; 12801500
ARRAY INREC=+1[*]; 12802000
ARRAY FPB=INREC+1[*], LOGINFO=FPB+1[*], HEADER=LOGINFO+1[*]; 12802500
REAL UNIT=HEADER+1, V=UNIT+1, COPY=V+1, MFID=COPY+1, FID=MFID+1, 12803000
IOD=FID+1, T=IOD+1, B=T+1; 12803500
REAL SEARCHVAL=B+1, CURROW=SEARCHVAL+1, FIRSTFID=CURROW+1, 12804000
SEGNR=FIRSTFID+1; 12804500
REAL X=SEARCHVAL, NUM=CURROW, RECOUNT=SEGNR; 12805000
BOOLEAN SIGNEDON=SEGNR+1, FORMTOG=SIGNEDON+1, ABORTED=FORMTOG+1; 12805500
BOOLEAN NOCOUNT=FIRSTFID; 12806000
$ SET OMIT = NOT PACKETS 12806500
BOOLEAN STOG=ABORTED+1; 12807000
REAL PCOPY=STOG+1, PFIRSTFID=PCOPY+1; 12807500
$SET OMIT = NOT (RJE AND PACKETS) 12808000
$ SET OMIT = PACKETS 12809500
12812000
LABEL SLEAP, WHY, EXITTOCOM19; 12812500
LABEL SIGNIN, ABORTMSG, PARERR; 12813000
SWITCH SW := 12813500
SIGNIN, ABORTMSG, PARERR; 12814000
DEFINE DSED = TERMSET(P1MIX)#, 12814500
QTED = (PRT[P1MIX,@25]!0)#, 12815000
VF = 43:5#, 12815100
UNITF = 38:5#, 12815200
COPYF = 30:8#, 12815300
NUMF = 22:8#, 12815400
NOTP = 29:1#, 12815500
COPY0 = 21:1#; 12815600
12815900
%***********************************************************************12816000
12816500
SUBROUTINE IDELTIMER; 12817000
BEGIN 12817500
STOPLOG(P1MIX,1); 12817600
P(P1MIX); P1MIX:=0; 12818000
IDLETIME; 12818500
P1MIX:=P; 12819000
$ SET OMIT = NOT(NEWLOGGING) 12819399
STARTLOG(P1MIX); 12819500
END IDLETIMER; 12820000
12820500
%***********************************************************************12821000
12821500
SUBROUTINE FM; %% BUILD AND SPOUT FORMS MESSAGE %% 12822000
BEGIN 12822500
STREAM(U:=TINU[V], P1MIX, INREC, D:=T:=SPACE(10)); 12823000
BEGIN DS:=LIT"#"; 12823500
SI:=LOC U; SI:=SI+5; DS:=3 CHR; 12824000
DS:=20 LIT" FM RQD:PRNPBT/DISK="; DS:=2 DEC; 12824500
U:=DI; DI:=DI-2; DS:=FILL; DI:=U; 12825000
SI:=INREC; DS:=5 LIT" FOR "; 12825500
SI:=SI+1; DS:=7 CHR; DS:=LIT"/"; 12826000
SI:=SI+1; DS:=7 CHR; DS:=4 LIT" OF "; 12826500
SI:=SI+1; DS:=7 CHR; DS:=LIT"/"; 12827000
SI:=SI+1; DS:=7 CHR; 12827500
DS:=LIT"~"; 12828000
END; 12828500
SPOUT(T); 12829000
REPLY[P1MIX] := 12829500
NABS(T:=VOK&VWY[36:42:6]&VQT[30:42:6]&VFM[24:42:6]); 12830000
END FM SUBROUTIN; 12830500
12831000
%***********************************************************************12831500
SUBROUTINE BADFM; %BUILD AND SPOUT BAD FM MESSAGE % 12832000
BEGIN 12832500
STREAM(A:=TINU[T],MX:=P1MIX,T:=T:=SPACE(10)); 12833000
BEGIN DS:=19 LIT"INVALID INPUT UNIT "; 12833500
SI:=LOC MX; DS:=2 DEC;DS:=2 LIT"FM"; 12834000
SI:=LOC A; SI:=SI+5; DS:=3 CHR; 12834500
DS:=LIT "~"; DI:=DI-8; DS:=FILL; 12835000
END; 12835500
SPOUT(T); 12836000
END BADFM SUBROUTINE; 12836500
12837000
%***********************************************************************12837500
12838000
SUBROUTINE WRITEBANDEJECT; 12838500
BEGIN 12839000
$ SET OMIT = NOT RJE 12839500
BEGIN 12842500
P(WAITIO(B INX @210104000000,0,V),DEL); 12843000
IF V!22 THEN % %150-12843500
IF SEPARATE THEN P(WAITIO(@4000100000,0,V),DEL) %150-12843600
ELSE P(WAITIO(@4002000000,0,V),DEL);%150-12843700
END; 12844000
END; 12844500
12845000
%***********************************************************************12845500
12846000
% 12846500
P(Z,MSCW,STF); 12847000
GO TO SW[P]; 12847500
12847600
SIGNIN: 12848000
12848100
% HANDLES FIRST RECORD OF FILE, PICKING UP LOGGING INFO AS WELL AS 12848110
% COPIES OR FORM SPECIFICATIONS. NOTE THAT LABEL INFO IS SAVED IN 12848120
% LOGARRAY FOR USE AT ABORTMSG. TIMING IS STARTED AT INITIALIZE AND 12848130
% STOPPED IN REWIND, AT REMOVEM OR AT STOPTIME FOR TAPE, DISK AND THE 12848140
% OUTPUT UNIT RESPECTIVELY. LOGARRAY IS USED TO REMOVE THE TIME 12848150
% ASSOCIATED WITH A GIVEN BACK UP FILE FROM THE TIMING IN THE FPB AND 12848160
% LOG IT TO THE USER. THAT IS DONE IN SIGNOUT. THUS, THE TIME LOGGED 12848170
% AT PRNPBT/DISK EOJ IS OVERHEAD TIME OCURRING DURING SWITCHING FROM 12848180
% FILE TO FILE. 12848190
% 12848200
LOGINFO := SAVEARRAYDESC(31,LOGAREAV); %167-12848500
IF FORMTOG:=INREC[13] THEN FM; 12849000
IF COPY LEQ 0 AND NOT COMMON.[COPY0] THEN 12849500
COPY:=IF (INREC[14] AND NOT @377)=0 THEN INREC[14]+1 ELSE 0; 12850000
LOGINFO[0]:=3; 12850500
STREAM(S:=[INREC[4]],D:=[LOGINFO[1]]); 12851000
BEGIN SI:=S; DS:=9 WDS; END; 12851500
LOGINFO[10]:=5; 12852000
LOGINFO[11]:=2; 12852500
LOGINFO[12]:=-(PROCTIME[P1MIX]+CLOCK+P(RTR)); 12853000
LOGINFO[13]:= IOTIME[P1MIX]; 12853500
IDLETIMER; LOGINFO[14]:=JAR[P1MIX,7]; 12854000
LOGINFO[15]:=DATE; 12854500
LOGINFO[16]:=XCLOCK+P(RTR); 12855000
LOGINFO[19]:=INREC[15]; %132-12855500
LOGINFO[20]:="PRINTER"; 12856000
LOGINFO[21]:="BACK-UP"; 12856500
LOGINFO[22]:=LOGINFO[27]:=0; 12857000
LOGINFO[24]:=-CLOCK-P(RTR); 12857500
LOGINFO[25]:=INREC[0]; % SAVE LABEL INFO FOR ABORT 12858000
LOGINFO[26]:=INREC[1]; 12858500
LOGINFO[28]:=M[INREC INX NOT 14]; 12859000
LOGINFO[29]~INREC[2]; 12859500
LOGINFO[30]~INREC[3]; 12860000
RDCTABLE[V].[47:1]~INREC[0]="FULLPGE"; % LINES66 OPTION %724-12860100
IF FORMTOG THEN 12860500
SLEAP: 12861000
BEGIN COMPLEXSLEEP(REPLY[P1MIX] GEQ 0 OR DSED OR QTED); 12861500
IF NOT WHYSLEEP(I) THEN 12862000
BEGIN FM; GO TO SLEAP END; 12862500
IF REPLY[P1MIX].[CF]=VFM THEN 12863000
IF (T:=REPLY[P1MIX].[FF]) NEQ 20 AND T NEQ 21 THEN 12863500
BEGIN % ILLEGAL UNIT. 12864000
LABELTABLE[T]:=@114; 12864500
BADFM; 12865000
READY:=READY AND (T:=NOT TWO(T)); 12865500
RRRMECH:=RRRMECH AND T; 12866000
SAVEWORD:=SAVEWORD AND T; FM; GO SLEAP 12866500
$ SET OMIT = NOT(RJE AND DATACOM ) 12867000
END ELSE 12873000
IF T!V THEN 12873500
BEGIN % SWITCH UNITS. 12874000
LABELTABLE[T] := LABELTABLE[V]; 12874500
RDCTABLE[T] := RDCTABLE[V]; 12875000
MULTITABLE[T] := MULTITABLE[V]; 12875500
LABELTABLE[V] := MULTITABLE[V] := RDCTABLE[V] := 0; 12876000
FPB[8].[36:6]:=(V:=T)+1; 12876500
END; 12877000
END; 12877500
FORMTOG:=(FORMTOG OR PUNCHLCK AND V=22) AND NOT (DSED OR QTED); 12878000
SIGNEDON:=TRUE; 12878500
GO EXITTOCOM19; 12879000
12879100
ABORTMSG: 12879500
12879600
% ABORTED=3 IMPLIES ABORT HAS OCCURRED. CURRENTLY, NOTHING ATTEMPTS TO12879610
% DISTINGUISH BETWEEN 1 AND 3, BUT ABORTED MUST BE SET HERE FOR TAPE 12879620
% SO WHY NOT MAKE IT DIFFERENT. 12879630
% 12879640
ABORTED:=3; 12880000
STREAM(T:=DSED OR QTED, B); 12880500
BEGIN 12881000
DS:=8 LIT"#"; SI:=B; DS:=16 WDS; DI:=B; 12881500
CI:=CI+T; GO TO AB; 12882000
DI:=DI+24; 12882500
DS:=34 LIT" BACK-UP TERMINATED BY OPERATOR "; 12883000
GO TO LEND; 12883500
AB: DI:=DI+34; DS:=11 LIT" ABORTED "; 12884000
LEND: 12884500
END; 12885000
WRITEBANDEJECT; 12885500
IF V!22 AND SIGNEDON THEN 12886000
BEGIN 12886500
STREAM(S~[LOGINFO[1]],T~0,B); 12887000
BEGIN DS~ 8LIT" LABEL "; SI~S; 24(SI~SI+8); DS~16CHR; 12887500
SI~SI+8; DS~8CHR; T~SI; SI~S; DS~9WDS; SI~T; 12888000
SI~SI+1; DS~LIT" "; DS~7CHR; DS~LIT"/"; DI~SI+1; DS~7CHR;12888500
DS~ 12 LIT " "; 12889000
END; 12889500
WRITEBANDEJECT; 12890000
IF NOT SEPARATE THEN P(WAITIO(@4000100000,0,V),DEL); %150-12890100
END; 12890500
GO TO EXITTOCOM19; 12891000
12891100
PARERR: 12891500
12891600
% BUILDS ERROR MESSAGE FOR OUTPUT AND ALLOWS OPERATOR TO OK OR DS. 12891610
% T IS USED TO PASS BACK WHETHER OR NOT TO TERMINATE. 12891620
% 12891630
IF V=22 THEN GO TO WHY; 12892000
STREAM(A:=UNIT, T:=T:=SPACE(15)); 12892500
BEGIN 22(DS:=2 LIT ">>");SI:=LOC A;SI:=SI+7; 12893000
IF SC="B" THEN DS:=6 LIT " DISK " ELSE 12893500
DS:=6 LIT " TAPE "; 12894000
DS:=26 LIT "PARITY ON PRINTER BACK UP "; 12894500
22(DS:=2 LIT ">>"); 12895000
END STREAM; 12895500
$ SET OMIT = NOT(RJE AND DATACOM ) 12896000
P(WAITIO(T&16[CTF],0,V),DEL); 12897500
FORGETSPACE(T); 12898000
WHY: 12898500
FILEMESS("#PARITY",0,0,"ERROR ",0,0,0); 12899000
REPLY[P1MIX]:=-VQT&VWY[36:42:6]&VOK[30:42:6]; 12899500
COMPLEXSNOOZE(MIXMAX,REPLY[P1MIX] GEQ 0 OR DSED OR QTED); 12900000
IF NOT WHYSLEEP(VQT&VWY[36:42:6]&VOK[30:42:6]) THEN GO TO WHY; 12900500
T:=DSED OR QTED; 12901000
EXITTOCOM19: 12901500
P(0,RDS,0,XCH,CFX,STF); 12902000
END OF SECOND GROUP OF PRINTER BACKUP SPECIAL CASES; 12902500
PROCEDURE COM19; 13000000
% 13000100
% COM19, TOGETHER WITH PRNPBTSPECASE1 AND PRNPBTSPECASE2 WHICH SHARE 13000110
% ITS STACK, ARE THE WORKING PART OF PRINTER BACK-UP. INFORMATION IS 13000120
% PASSED TO COM19 IN COMMON AND LABELTABLE, AS FOLLOWS: 13000130
% COMMON.[43:5] LOGICAL UNIT NUMBER OF OUTPUT UNIT. 13000140
% [38:5] INPUT UNIT NUMBER. IF DISK, THE LABELTABLE ENTRY FOR 13000160
% THE OUTPUT UNIT CONTAINS THE FILE ID. 13000170
% [30:8] NUMBER OF COPIES SPECIFIED IN PB MESSAGE. 13000180
% [22:8] IF TAPE, STARTING FILE NUMBER GIVEN IN PB MESSAGE. 13000190
% IF DISK, =0 IF ENTIRE PACKET IS TO BE PRINTED, =1 IF 13000200
% NOT. 13000210
% [21:1] ON IF "=0" APPEARED IN PB MESSAGE. 13000215
% FOR RJE, COMMON IS THE ADDRESS OF A TWO WORD ARRAY. THE FIRST WORD 13000220
% CONTAINS THE INFORMATION DESCRIBED ABOVE AND THE SECOND CONTAINS THE13000230
% FILE ID FOR DISK (WHICH IS IN LABELTABLE FOR NON-RJE FILES). 13000240
% 13000250
BEGIN 13001000
REAL RCW=+0, COMMON=-4; 13002000
ARRAY INREC[*], FPB[*], LOGINFO[*], HEADER[*]; 13003000
REAL UNIT, V, COPY, MFID, FID, IOD, T, B; 13004000
REAL SEARCHVAL, CURROW, FIRSTFID, SEGNR; 13005000
REAL X=SEARCHVAL, NUM=CURROW, RECOUNT=SEGNR; 13006000
BOOLEAN SIGNEDON, FORMTOG, ABORTED; 13007000
BOOLEAN NOCONT=FIRSTFID; 13008000
$ SET OMIT = NOT PACKETS 13009000
BOOLEAN STOG; 13010000
REAL PCOPY, PFIRSTFID; 13011000
$ SET OMIT = PACKETS 13012000
$ SET OMIT = NOT RJE 13015000
% 13017100
% THE LOCAL VARIABLES ARE USED AS FOLLOWS: 13017110
% ARRAYS 13017120
% INREC ARRAY DESCRIPTOR FOR THE CURRENT RECORD. 13017130
% FPB FPB ARRAY. INPUT IS THE FIRST FILE; OUTPUT THE 2ND. 13017140
% LOGINFO ARRAY IN WHICH THE LOG ENTRY IS BUILT. THE FIRST TEN 13017150
% WORDS ARE THE CONTROL CARD ENTRY; THE NEXT 10, THE 13017160
% PRINTER BACK-UP ENTRY AND THE LAST 10, THE FILE ENTRIES.13017170
% HEADER DISK FILE HEADER. 13017180
% REALS 13017190
% UNIT LOGICAL UNIT NUMBER FOR INPUT. 13017200
% V LOGICAL UNIT NUMBER FOR OUTPUT. 13017210
% COPY NUMBER OF COPIES OF THIS FILE TO BE PRINTED. IF IT IS 13017220
% NOT SPECIFIED, IT EQUALS 0. 13017230
% MFID MULTI-FILE ID OF INPUT FILE. 13017240
% FID FILE ID OF INPUT FILE. 13017250
% IOD, T TEMPORARY STORAGE. 13017260
% B ADDRESS OF 90 WORD BUFFER FOR INPUT. 13017270
% BOOLEANS 13017280
% SIGNEDON ON IF LOGGING IS INITIALIZED. THIS SHOULD BE OFF ONLY 13017290
% FOR FILES WHICH DO NOT START AT THE BEGINING, E.G., 13017300
% WHEN A STARTING REEL IS SPECIFIED ON DISK. 13017310
% FORMTOG ON IF FORM IS SPECIFIED OR PNCHLOCK IS SET. 13017320
% ABORTED =1, DISK ABORTED BY H/L. CHECK IN GET TO FIND OUT WHERE.13017330
% =2, TERMINATION DUE TO CL OF INPUT TAPE WHILE SCHEDULED.13017335
% =3, TAPE ABORTED BY H/L. FOUND BY RECOUNT MISMATCH. 13017340
% 13017350
% THE FOLLOWING APPLY ONLY TO DISK FILES: 13017360
% SEARCHVAL THIRD PARAMETER FOR DIRECTORYSEARCH. IT IS 3 OR 5 DURING13017370
% PRINTING, DEPENDING ON WHETHER IT IS THE FIRST COPY OR 13017380
% NOT, AND 13 OR 7 DURING FILE TERMINATION. 13017390
% CURROW INDEX OF THE ROW CURRENTLY BEING PRINTED. 13017400
% FIRSTFID FILE ID OF FIRST REEL, USED FOR MULTIPLE COPIES OF 13017410
% MULTI-REEL FILES. 13017420
% SEGNR NUMBER OF NEXT SEGMENT TO READ FROM THE CURRENT ROW. 13017430
% 13017440
% THE FOLLOWING APPLY ONLY TO TAPES: 13017450
% X TEMPORARY STORAGE. 13017460
% NUM NUMBER OF CURRENT FILE ON TAPE, USED FOR COPIES. 13017470
% RECOUNT NUMBER OF RECORDS PRINTED IN THIS FILE. THIS IS CHECKED 13017480
% AGAINST THE C-FIELD OF THE IO DESCRIPTORS IN THE FILE TO13017490
% SPOT ABORTS. 13017500
% NOCONT TRUE IF CONTINUATION FROM FILE TO FILE IS NOT ALLOWED. 13017510
% 13017520
% THE FOLLOWING APPLY ONLY TO PACKETS: 13017530
% PCOPY NUMBER OF COPIES FROM PB MESSAGE, WHICH MAY APPLY TO THE13017540
% ENTIRE PACKET. "COPY" IS SET ONLY FROM LABEL EQUATION. 13017550
% PFIRSTFID FILE ID OF FIRST FILE IN THE PACKET, USED FOR COPIES OF 13017560
% THE PACKET. FIRSTFID APPLIES TO INDIVIDUAL FILES WITHIN 13017570
% THE PACKET AND IS USED FOR COPIES SPECIFIED VIA LABEL 13017580
% EQUATION. 13017590
% STOG SET DURING THE FIRST PRINTING OF THE PACKET IF ONE OF 13017600
% THE FILES SPECIFIES MULTIPLE COPIES. IT IS USED TO 13017610
% RESTORE THE VALUE OF 3 TO SEARCHVAL WHEN THE FILE IS 13017620
% COMPLETED. 13017630
% 13017640
% THE FOLLOWING APPLIES ONLY TO RJE: 13017650
% STA TERMINAL UNIT AND BUFFER NUMBER OF THE RJE TERMINAL. 13017660
% 13017670
LABEL TRYNEXT, TAPERDR, TAPERD, TAPECHK, ABORT, NOGET, GOTTEN, 13018000
START, RESTART, MAINLOOP, GOTIT, QUIT, TESTEND; 13019000
DEFINE DSED = TERMSET(P1MIX)#, 13020000
QTED = (PRT[P1MIX,@25]!0)#; 13021000
DEFINE LINECT = LOGINFO[27]#; % %750-13021900
DEFINE LOOKFORTAPE = PRNPBTSPECASE1(0)#, 13022000
NOMOREREELS = PRNPBTSPECASE1(1)#, 13023000
QTSPEC = P(PRNPBTSPECASE1(2),DEL)#, 13024000
INITIALIZE = PRNPBTSPECASE1(3)#, 13025000
STARTANEWFILE = PRNPBTSPECASE1(4)#, 13026000
SIGNIN = PRNPBTSPECASE2(0)#, 13027000
ABORTMSG = PRNPBTSPECASE2(1)#, 13028000
PARERR = PRNPBTSPECASE2(2)#; 13029000
13030000
%***********************************************************************13031000
13032000
BOOLEAN SUBROUTINE GET; 13033000
BEGIN 13034000
IF INREC[17].[20:1] THEN GO TO NOGET; 13035000
IF (INREC:=(NOT 17) INX INREC).[CF] GEQ B.[CF] THEN 13036000
IF UNIT!18 THEN GO TO TAPECHK ELSE 13037000
ELSE % READ NEXT BLOCK 13038000
IF UNIT=18 THEN 13039000
BEGIN 13040000
IF SEGNR > HEADER[7]|3 THEN GO TRYNEXT; % END OF FILE 13041000
IF (SEGNR GEQ HEADER[8]-1) THEN 13042000
BEGIN % END OF ROW 13043000
IF (CURROW:=CURROW+1) GEQ HEADER[9].[43:5]+10 THEN 13044000
TRYNEXT: IF NOMOREREELS THEN GO TO NOGET; 13045000
SEGNR:=0; 13046000
END; 13047000
INREC:=90 INX INREC; 13048000
DISKIO(IOD,-B,90,HEADER[CURROW]+SEGNR); 13049000
SEGNR:=SEGNR+3; 13050000
SLEEP([IOD],IOMASK); 13051000
IF IOD.[28:1] THEN 13052000
BEGIN PARERR; 13053000
IF T THEN GO TO NOGET; % DSED OR QTED 13054000
END; 13055000
IF ABORTED THEN % TEST FOR BAD IO DESC. 13056000
IF (M[B INX 18].[6:42] EQV " ")=NOT 0 THEN 13057000
GO ABORT; 13058000
END ELSE 13059000
BEGIN % TAPE 13060000
TAPERDR: X:=0; 13061000
TAPERD: IF (IOD:=WAITIO(B,@2000040,UNIT)).[43:1] THEN 13062000
BEGIN PARERR; 13063000
IF T THEN GO TO NOGET; % DSED OR QTED 13064000
END; 13065000
IF IOD.[42:1] OR X THEN 13066000
BEGIN 13067000
IF (X:=NOT X) THEN GO TO TAPERD; 13068000
IF M[B INX 3] THEN 13069000
IF LOOKFORTAPE THEN GO TO TAPERDR ELSE GO NOGET; 13070000
END; 13071000
IF (X:=M[B INX NOT 0])!90 THEN 13072000
IF (X AND @7775)=16 THEN % OLD FORMAT TAPE 13073000
BEGIN 13074000
INREC.[CF]:=B INX 1; 13075000
INREC[17]:=M[B]&0[20:20:7]; 13076000
END ELSE GO TO NOGET 13077000
ELSE 13078000
BEGIN 13079000
INREC:=90 INX INREC; 13080000
IF RECOUNT=@77777 THEN RECOUNT~INREC[17].[CF] ELSE 13080100
TAPECHK: IF (RECOUNT:=RECOUNT INX 1) ! INREC[17].[CF] THEN 13081000
BEGIN 13082000
ABORT: ABORTMSG; 13083000
NOGET: P(0); 13084000
GO TO GOTTEN; 13085000
END; 13086000
END; 13087000
END; 13088000
P(1); 13089000
GOTTEN: GET:=P; 13090000
END; 13091000
% -13091500
%%%%% START OF CODE %%%%% -13091600
% 13092000
% START IS USED FOR A NEW FILE (OR NEW PACKET), RESTART ISUSED FOR 13092010
% A COPY (OR A NEW FILE WITHIN A PACKET). 13092020
13092030
START: 13093000
IF COMMON=0 THEN GO TO INITIATE; 13094000
IF INITIALIZE THEN 13095000
BEGIN 13096000
RESTART: IF GET THEN 13097000
BEGIN 13098000
IF INREC[17].[1:11]=0 THEN SIGNIN ELSE GO GOTIT; 13099000
IF UNIT!18 THEN RECOUNT:=INREC[17].[CF]; 13101000
END ELSE % BAD FIRST BLOCK, USUALLY EOT. 13102000
BEGIN P(1); 13103000
GO TO TESTEND; 13104000
END; 13105000
MAINLOOP: 13106000
IF STOPSET(P1MIX) THEN STOPM(0); 13107000
IF (T:=PRT[P1MIX,@25])!0 OR DSED THEN 13108000
BEGIN 13109000
IF T<0 THEN % + OR - SPECIFIED. 13110000
BEGIN 13111000
QTSPEC; 13112000
GO TO MAINLOOP; 13113000
END; 13114000
ABORTMSG; % DSED OR QTED 13115000
GO TO QUIT; 13116000
END; 13117000
IF GET THEN % VALID REC. WRITE IT & CONTINUE 13118000
BEGIN 13119000
GOTIT: 13119100
$ SET OMIT = NOT RJE 13120000
IF V EQL 22 AND INREC[17].[18:1] THEN ELSE %206-13127899
BEGIN % %750-13127990
P(WAITIO(INREC[17]&(INREC)[CTC]&8[21:42:6],0,V),DEL); 13128000
LINECT~*P(DUP) + 1; % %750-13128010
END; % %750-13128020
GO TO MAINLOOP; 13129000
END; 13130000
END; 13131000
QUIT: 13132000
P(0); 13133000
TESTEND: 13134000
P:=P; % I=1 IF FIRST GET FAILS, ELSE 0.13135000
IF STARTANEWFILE THEN GO TO START ELSE GO TO RESTART; 13136000
END OF PRINTING BACKUP TAPE AND DISK FILES; 13137000
$ SET OMIT = NOT(DATACOM ) 13198999
$ SET OMIT = NOT(DATACOM AND RJE ) 13299999
REAL PROCEDURE ANALYSIS;% 14000000
BEGIN% 14001000
REAL ICW,IRCW,INCW,CL,T1,C,T2=SYLLABLE ;% 14002000
$ SET OMIT = NOT(NEWLOGGING) 14002099
LABEL GETOUT;% 14003000
COMMENT ANALYSIS EXAMINS THE SYLLABLE WHICH CAUSED THE INTURRUPT AND% 14004000
FROM THE RELATIVE ADDRESS OF THE SYLLABLE (INCLUDING% 14005000
VARIENT OPERATOR CONSIDERATIONS) COMPUTES THE LOCATION,C, 14006000
OF A COPY OF THE DESCRIPTOR ON THE TOP OF THE STACK.% 14007000
THE PREVIOUS TWO SYLLABLES ARE FETCHED BY THE STREAM% 14008000
STATEMENT GETSYLLABLES WHICH ALSO ADJUSTS THE C-L REGIST- 14009000
ERS PROPERLY.% 14010000
FINALLY THE STACK IS ADJUSTED AS FOLLOWS:% 14011000
DECREASE S BY 1,IF OPDC OR DESC% 14012000
XCH A AND B REGISTERS,IF COC OR CDC% 14013000
OTHERWISE LEAVE THE SAME. ;14014000
CHECKSTACKSPACE;% %WF 14014100
$ SET OMIT = NOT(NEWLOGGING) 14014199
INCW = PRT[P1MIX,8];% 14015000
IF INCW.[CF]<@1777 THEN % SOMETHING VERY WRONG %602-14015200
BEGIN JAR[P1MIX,6].[1:1]~1; % SD BIT %602-14015210
FILEMESS(-"SEE MCP"," PATCH ",0,0,0,0,602)%KLUGE MSG&DS14015220
END; 14015240
POLISH(.INCW,IOR);% 14016000
IRCW ~ * INCW ;% 14017000
ICW ~ *( (NOT 0) INX INCW);% 14018000
CL ~ (IRCW INX 0) & IRCW[30:10:2];% 14019000
STREAM (T1~0,T2~0,CL:X~0);% 14020000
BEGIN% 14021000
SI~CL; SI~SI-2 ; CL ~ SI; DI ~ LOC T2; DI~DI+6;% 14022000
DS ~ 2 CHR; SI ~ SI-3;% 14023000
IF SC = "/" THEN% 14024000
BEGIN% 14025000
SI~SI-1; IF SC ="0" THEN% 14026000
BEGIN TALLY~1; T1~TALLY ;CL ~ SI END;% 14027000
END;% 14028000
END GETSYLLABLE ;% 14029000
POLISH(.CL,~,.T2,~,.T1,~);% 14030000
IF INCW.[32:1] THEN% 14031000
BEGIN COMMENT P-BIT IN CHARACTER MODE ;% 14032000
IF T2 = @4441 THEN% 14033000
BEGIN COMMENT ENTER CHARACTER MODE;% 14034000
P(M[(IRCW ~ *(NOT 0 INX INCW ~ PRT[P1MIX,8] ~% 14035000
(NOT 1 INX INCW)&0[32:1:1])).[18:15]]&% 14036000
1[16:47:1]&0[18:18:15],(NOT 0)INX INCW,~); 14037000
C ~ INCW INX 0 -2;% 14038000
END ELSE BEGIN% 14039000
IF MEMORY[ C ~ IRCW.[18:15]-T2.[36:6]].[1:3] = 4% 14040000
THEN% 14041000
BEGIN% 14042000
IF T2.[42:6]= @53 THEN BEGIN% 14043000
COMMENT CONTROL WORD MEANS CHARACTER MODE RELEASE;% 14044000
T1~PRT[P1MIX,9]~M[(*((NOT 1)INX INCW)).[18:15]].[33:15];% 14045000
POLISH(M[T1],0,0);% 14046000
IF M[T1].[20:1] THEN CONTINUITYBIT;% 14047000
PROGRAMRELEASE;% 14048000
END% 14049000
END;% 14050000
IF T2 = 0 THEN GO TO GETOUT;% 14051000
END% 14052000
END% 14053000
ELSE% 14054000
BEGIN% 14055000
IF T2.[46:1] THEN% 14056000
BEGIN% 14057000
C ~ ICW.[33:15];% 14058000
POLISH(ICW, (NOT 1)INX INCW, ~,IRCW,% 14059000
PRT[P1MIX,8]~INCW ~ (NOT 0)INX INCW ,~);% 14060000
END OPDC DESC PART% 14061000
ELSE% 14062000
BEGIN% 14063000
C ~ INCW INX 0 -2;% 14064000
IF (NT1 ~ T2 AND @77) = @41 THEN% 14065000
BEGIN C ~C-1 ;% 14066000
POLISH(MEMORY[C],MEMORY[C+1],[MEMORY[C]], ~ ,[MEMORY[C+1] 14067000
],~);% 14068000
END COC CDC PART% 14069000
ELSE IF NT1 = @31 THEN% 14070000
BEGIN COMMENT THIS IS A BRANCH;% 14071000
GETOUT: CL ~ P([PRT[P1MIX,1]],DUP,T2,XCH,~) INX @600000;14072000
END BRANCH PART% 14073000
ELSE IF NT1 = @35 THEN GO TO GETOUT; COMMENT RETURN;% 14074000
END ALL SYLLABLES BUT OPDC DESC ;% 14075000
END WORD MODE INTERRUPT ;% 14076000
POLISH(IRCW & CL[33:33:15]&CL[10:30:2],INCW,~) ;% 14077000
ANALYSIS ~ C ;% 14078000
$ SET OMIT = NOT(NEWLOGGING) 14078099
END ANALYSIS OF P BIT ;% 14079000
SAVE INTEGER PROCEDURE ACTUALOVERLAYADDRESS(TYPE, MIX, LOC); 14105000
VALUE TYPE, MIX, LOC; 14106000
INTEGER TYPE, MIX, LOC; 14107000
BEGIN INTEGER T = +1; 14108000
$ SET OMIT = NOT(AUXMEM) 14108999
IF TYPE THEN % CODE... 14110000
BEGIN 14110100
$ SET OMIT = NOT(AUXMEM) 14110999
LOC := LOC INX 0; 14112000
T := JAR[MIX,LOC DIV (T:=JAR[MIX,8])+10]+LOC MOD T; 14113000
END ELSE % BETTER BE DATA... 14114000
$ SET OMIT = NOT(AUXMEM) 14114999
T~DALOC[MIX,LOC.[33:6]+P(DUP)-1]+LOC.[39:9] 14117000
$ SET OMIT = NOT(AUXMEM) 14117999
END; 14119000
$ SET OMIT = NOT(AUXMEM) 14119999
COMMENT THE SEGMENT DICTIONARY IS CONSTRUCTED BY THE% 14125000
COMPILERS AND EACH ENTRY HAS THE FORMAT:% 14126000
[ 1: 1] = 1 FOR TYPE 2 SEGMENTS, =0 OTHERWISE,% 14127000
[ 2: 1] = 1 FOR INTRINSICS , = 0 OTHERWISE.% 14128000
[ 3: 1] = 1 IF BEING MADE PRESENT, = 0 OTHERWISE 14128100
(INTERLOCK FOR RE-ENTRANT CODE) 14128200
[ 4: 2] = 0 FOR NORMAL SEGMENTS 14128300
= 3 FOR SEGMENTS OVERLAID TO AUX. MEM. 14128400
= 2 FOR SEGMENTS TO BE OVERLAID TO 14128500
AUXILIARY MEMORY WHICH HAVEN"T BEEN 14128600
[ 6: 1] = 1 FOR COBOL68 FILE TANK, 14128700
[ 7: 1] = 1 FOR COBOL68 READ ONLY ARRAY. 14128800
[ 8:10] = LINK TO PRT FOR 1ST DESCRIPTOR FOR% 14129000
THIS SEGMENT.% 14130000
[16:15] = SEGMENT SIZE(<1024) FOR ABSENT 14131000
SEGMENTS.% 14132000
= CORE ADDRESS OF PRESENT SEGMENTS.% 14133000
= 1 FOR NEVER-PRESENT INTRINSICS.% 14134000
[33:15] = DISK ADDRESS OF SEGMENT.% 14135000
= INTRINSIC-NUMBER FOR INTRINSICS.% 14136000
THE PRT FOR PROGRAM SEGMENTS IS CONSTRUCTED BY THE% 14137000
COMPILERS IN THE FORMAT :% 14138000
[ 0:5] = PROGRAM DESCRIPTOR BITS.% 14139000
[ 6:1] = STOPPER BIT WHICH DEFINES THE [ 7:11]% 14140000
FIELD.% 14141000
[ 7:11] = LINK TO NEXT DESCRIPTOR THAT BELONGS TO% 14142000
THIS SEGMENT, IF STOPPER BIT FALSE.% 14143000
= SEGMENT NUMBBER, IF STOPPER TRUE.% 14144000
[18:15] = F-REGISTER FIELD USED AT RUN TIME IN% 14145000
LABEL AND ACCIDENTAL DESCRIPTORS.% 14146000
= SEGMENT NUMBER FOR WORD MODE AND% 14147000
CHARACTER MODE DESCRIPTORS.% 14148000
[33:15] = CORE ADDRESS FOR PRESENT SEGMENTS.% 14149000
= RELATIVE ADDRESS FOR ABSENT SEGMENTS.% 14150000
I.E. RELATIVE TO BEGINNING OF SEGMENT.% 14151000
EACH PRT (R+4) CONTAINS A DESCRIPTOR WHICH POINTS 14152000
TO THE SEGMENT DICTIONARY.% 14153000
;% 14154000
PROCEDURE MAKEPRESENT(C); VALUE C; REAL C;% 14155000
BEGIN% 14156000
REAL SAVEBIT, MINE;% 14157000
REAL D,MOTHER,MOM,LOC,SIZE;% 14158000
INTEGER DISKADDR = SAVEBIT;% 14159000
DEFINE LINK= [ 7:11]#,STOPPER=[ 6: 1]#,PROGRAMDESC=[5:1]#;% 14160000
DEFINE NOTOPEN =[25:1] #;% 14161000
ARRAY NAME DD ;% 14162000
ARRAY AIT[*]; 14162500
ARRAY PRTR[*] ;% 14163000
REAL SEGNO=MOTHER, X=MOM,IOD ;% 14164000
REAL SPACE;% SPACE FOR SEGMENT NUMBERS (INTRINSICS) BY MIX 14164100
REAL MES,SAGE,GM; % SPACE FOR NO MEM MESSAGE. 14164200
REAL I,J; %101-14164300
$ SET OMIT = NOT(NEWLOGGING) 14164399
LABEL EXIT; % ALL AVENUES MUST LEAD TO HERE 14164500
LABEL WRAP,AROUND,TESTREADY;% 14165000
LABEL OPEN,CLOSE;% 14166000
LABEL CODEIN,INT; 14166100
LABEL DLOOP, NG; 14166200
DEFINE REVERSE =[22:1]#,READY =[19:1]#,PRESENT =[2:1]#;% 14167000
COMMENT MAKEPRESENT HAS THE FOLLOWING ACTIONS,DEPENDING ON THE TYPE% 14168000
OF DESCRIPTOR CAUSING PRESENCE BIT :% 14169000
DATA DESCRIPTOR :% 14170000
IF MOTHER ABSENT THEN GET CORE SPACE AND SET% 14171000
MOTHER PRESENT WITH PROPER CORE ADDRESS% 14172000
THEN IF INITIAL ACCESS,ZERO THE SPACE ELSE% 14173000
READ IN FROM DISK AND RETURN DISK SPACE% 14174000
THEN SET 1ST MEMORY LINK TO SAVE OR NOT SAVE% 14175000
AND SET 2ND LINK TO ADDRESS OF MOTHER% 14176000
IN ANY EVENT, SET COPY PRESENT WITH CORRECT CORE% 14177000
ADDRESS.% 14178000
IO DESCRIPTOR:% 14179000
PROGRAM DESCRIPTOR:% 14180000
;% 14181000
SUBROUTINE RUNAROUND;% 14182000
BEGIN WHILE NOT (PRTR[X] ~ ((LOC+2) INX PRTR[X])% 14183000
OR MEMORY).STOPPER DO X ~ PRTR[X].LINK;% 14184000
END RUNAROUND;% 14185000
% 14185100
$ SET OMIT = NOT(NEWLOGGING) 14185199
IF (D ~ M[C]).[1:1] THEN% 14186000
IF D.[6:2]=1 THEN % TYPE 13 INTRINSIC 14186010
BEGIN X:=[INTRINSC[SEGNO~MINE~NFLAG(D) INX 0]]; 14186020
SEGNO:=SEGNO-1; 14186030
STREAM(T:=SEGNO AND 3, I:=[INTABLE[P1MIX,SEGNO DIV 4]]); 14186100
BEGIN DI:=DI+T;DI:=DI+T;SKIP 1 DB;DS:=SET;END;%MARK TYPE 13 BIT14186110
IF X>0 THEN SLEEP([X],-0); 14186120
$ SET OMIT = NOT MONITOR 14186121
IF (X INX 0){1023 THEN 14186130
BEGIN P(ABS(X),[X],~); SIZE~X INX 0; 14186140
$ SET OMIT = NOT(AUXMEM) 14186143
DISKADDR := X.[6:27]; 14186148
MINE~MINE&SIZE[8:38:10]&3[1:46:2]; 14186150
IOD:=13; GO TO CODEIN; 14186152
END ELSE BEGIN M[C].[CF]~INTRNSC[MINE].[CF]; 14186160
M[C].[2:1]:=1; 14186170
GO EXIT; 14186180
END 14186190
END ELSE 14186200
BEGIN PRTR ~ PRT[P1MIX,*]; LOC ~ NFLAG(D)&0[5:5:1]; 14187000
DO IF LOC.PROGRAMDESC THEN SEGNO ~ LOC.[18:15]% 14188000
ELSE IF LOC.STOPPER THEN SEGNO ~ LOC.LINK% 14189000
ELSE LOC ~ NFLAG(PRTR[LOC.LINK])% 14190000
UNTIL SEGNO!0;% 14191000
DD ~ SEGNO INX PRTR[4];% 14192000
IF DD[0].[3:1] AND NOTERMSET(P1MIX) THEN 14193000
COMPLEXSLEEP((TERMSET(P1MIX) OR NOT DD[0].[3:1])); 14193100
IF TERMSET(P1MIX) THEN GO INITIATE; 14193200
IF (SIZE ~ (MINE ~ DD[0]).[18:15]){1023 THEN% 14194000
BEGIN DD[0].[3:1] ~ `;% 14195000
IF MINE<0 THEN% 14196000
IF PRTR[X ~ MINE.[8:10]].[2:1] THEN GO AROUND;% 14197000
IF MINE.[2:1] THEN% 14198000
BEGIN X ~ [INTRNSC[MINE INX 0]];% 14198100
IF X>0 THEN SLEEP([X],-0);% 14198200
IF (X INX 0){1023 THEN BEGIN P(ABS(X),[X],~);% 14198300
SIZE ~ X INX 0; 14198400
$ SET OMIT = NOT MONITOR 14198410
$ SET OMIT = NOT(AUXMEM) 14198499
DISKADDR ~ X.[6:27]; 14198700
END ELSE BEGIN LOC ~ (SIZE ~ X INX 0)-2; 14198800
DD[0].[FF] ~ SIZE; GO AROUND;% 14199000
END;% 14200000
END ELSE IF JAR[P1MIX,10]=0 THEN% 14201000
DISKADDR := DATADDRESS(P1MIX, MINE) 14202000
ELSE DISKADDR := CODEADDRESS(P1MIX, MINE); 14203000
IOD:=6|MINE.[2:1]+(MINE LSS 0)+1; 14203010
CODEIN:: WHILE (LOC~GETSPACE(SIZE,IOD,(MINE<0 AND MINE.[6:1])+66)) 14203020
= 0 DO 14203021
BEGIN IF TERMSET(P1MIX) THEN 14203100
BEGIN IF MINE.[2:1] THEN 14203200
INTRNSC[MINE]:=NABS(*P(DUP)); 14203300
IF D.[6:2]=1 THEN 14203400
INTRNSC[D]:=NABS(*P(DUP)); 14203500
DD[0].[3:1]:=0; GO TO INITIATE; 14203600
END; 14203700
IF(SPACE:=SPACE+1)=5 THEN 14204000
BEGIN STREAM(P1MIX,SIZE,T:=[MES]); 14204100
BEGIN SI:=LOC P1MIX; DS:=2 DEC; 14204200
DS:=8LIT" NO MEM ";DS:=5 DEC; 14204300
DS:=5 LIT " WDS~"; 14204400
END; 14204500
P(WAITIO([MES],@177,25),DEL); 14204600
END; 14204700
SLEEP([CLOCK],NOT CLOCK); 14205000
END; 14205100
IF MES NEQ 0 THEN 14205200
BEGIN STREAM(T:=[MES]); 14205300
BEGIN DI:=DI+3;DS:=7LIT"OK MEM~" END; 14205400
P(WAITIO([MES],@177,25),DEL); 14205500
END; 14205600
DISKIO(IOD, -LOC-1, SIZE, DISKADDR); X ~ MINE.[8:10];% 14206000
SLEEP([IOD],IOMASK); 14206100
IF IOD.[26:7] NEQ 0 THEN 14206110
BEGIN 14206120
IF MINE.[2:1] THEN INTRNSC[MINE]:=NABS(*P(DUP)); 14206135
DD[0].[3:1] := 0; 14206140
GO TO NG; 14206145
END; 14206160
$ SET OMIT = NOT(STATISTICS) 14206299
IF D.[6:2]=1 THEN 14206310
BEGIN M[C].[CF]~LOC+2; 14206320
M[C].[2:1]~1; 14206330
GO TO INT; 14206340
END; 14206350
IF MINE>0 THEN BEGIN RUNAROUND;% 14207000
M[C] ~ ((LOC+2) INX D) OR MEMORY;% 14208000
INT: 14208010
IF MINE.[2:1] THEN% 14209100
BEGIN M[LOC] ~ (*P(DUP))&0[9:9:6];% 14209200
INTRNSC[MINE INX 0] ~ -(*P(DUP))&(LOC+2)[CTC];% 14209300
END ELSE% 14209500
IF (X ~ PRTR[4].[18:6])!0 THEN% 14210000
M[LOC] ~ (*P(DUP))&X[9:42:6];% 14211000
IF DISKADDR>0 THEN M[LOC+1] := 0 & SIZE[CTF]; 14212000
M[LOC+1] := (*P(DUP)) & SEGNO[CTC]; 14212010
IF MINE.[2:1] THEN M[LOC+1] ~ (*P(DUP))&MINE[8:38:10];% 14212100
IF D.[6:2]=1 THEN 14212200
BEGIN M[LOC].[2:1]~0; GO EXIT; 14212300
END; 14212400
DD[0].[18:15] ~ LOC+2;% 14213000
END PROGRAM CODE SEGMENTS% 14214000
ELSE BEGIN 14215000
M[C] ~ PRTR[X] ~ M OR ((LOC+2)% 14216000
&(M[LOC+1] ~ [PRTR[X]] INX 0)[18:33:15]% 14217000
& (MINE.[7:1]|24) [3:43:5] % COBOL68 READ ONLY 14217500
&SIZE[8:38:10]);% 14218000
IF MINE.[6:1] THEN % COBOL68 FILE TANK 14218010
IF NOT P(M[LOC+4],TOP,XCH,DEL) THEN% BUILD FIB PTR14218025
BEGIN 14218027
P([M[LOC+4]],DUP,DUP,LOD,XCH,INX,M[C],FFX, 14218030
@100026,DIA 32,DIB 2 TRB 16,XCH,~); 14218035
WHILE (AIT~PRTR[AITNDX]).PBIT=0 14218040
DO MAKEPRESENT([PRTR[AITNDX]] INX 0); 14218045
IF AIT.[8:10] < AIT[0]+2 THEN 14218050
BEGIN P(AIT,0,0); INTERRUPT(1);% PHONEY INVALID14218055
P(DEL,DEL,DEL); % INDEX ON AIT 14218060
AIT ~ PRTR[AITNDX]; 14218065
END; 14218070
IF AIT[AIT[0]].[8:10] NEQ 1 THEN %101-14218072
BEGIN %101-14218074
I := 1; %101-14218076
WHILE AIT[I].[8:10] = 1 DO I := I + 1;%101-14218078
FOR J := AIT[0] STEP -1 UNTIL I DO %101-14218080
AIT[J+1] := AIT[J]; %101-14218082
END ELSE I := AIT[0] + 1; %101-14218084
AIT[0] := *P(DUP) + 1; %101-14218086
AIT[I] := -(1 & 1[8:38:10] & M[C][FTF]); %101-14218088
END; 14218090
$ SET OMIT = NOT(STATISTICS) 14218099
END TYUPE TWO DATA SEGMENTS;% 14219000
IF NOT MINE.[6:1] THEN M[LOC].[2:1] ~ 0; 14220000
END ABSENT SEGMENTS% 14221000
ELSE BEGIN LOC ~ SIZE-2;% 14222000
AROUND: IF DD[0]>0 THEN% 14223000
IF NOT PRTR[X ~ DD[0].[8:10]].[2:1] THEN RUNAROUND;% 14224000
M[C] ~ IF DD[0]>0 THEN ((SIZE INX D) OR M)% 14225000
ELSE PRTR[DD[0].[8:10]];% 14226000
END;% 14227000
IF DD[0].[2:1] THEN% 14227100
BEGIN % INTRINSIC 14227200
IF (SIZE:=(DD[0] INX 0)-1) NEQ 16 THEN %NOT INTRINSIC 17 14227210
BEGIN 14227220
STREAM(SEGNO, T ~ SIZE AND 3,% 14227300
I ~ [INTABLE[P1MIX,SIZE DIV 4]]);% 14227400
BEGIN 14227500
SI:=I; SI:=SI+T; SI:=SI+T; SKIP 1 SB; 14227520
IF SB THEN; % REMEMBER TYPE 13 REFERENCE 14227540
DI:=DI+T; DI:=TI+T; T:=DI; SI:=LOC T; 14227560
SI:=SI-2; DS:=2 CHR; 14227580
IF TOGGLE THEN BEGIN DI:=T; SKIP 1 DB; DS:=SET; END; 14227600
END; 14227620
END; 14227630
END;% 14227700
DD[0].[3:1] ~ 0; GO EXIT; 14228000
END;% 14229000
IF (MOM:=D.[3:5])!0 AND (MOM AND @33)!@30 THEN 14230000
BEGIN% 14231000
COMMENT I/O DESCRIPTOR;% 14232000
IF JAR[P1MIX,2] < 0 THEN 14233000
BEGIN TERMINATE(P1MIX); 14233100
TERMINALMESSAGE(25); 14233200
END; 14233300
MOM~ MEMORY[D INX (IF D.REVERSE THEN 2 ELSE NOT 1)]% 14234000
INX 0;% 14235000
TESTREADY: IF NOT MEMORY[MOM].READY THEN% 14236000
SLEEP([MEMORY[MOM]],IOMASK);% 14237000
IF MEMORY[MOM].PRESENT THEN% 14238000
MEMORY[C]~MEMORY[MOM]% 14239000
ELSE% 14240000
BEGIN% 14241000
IF MEMORY[MOM].NOTOPEN THEN% 14242000
OPEN: BEGIN SAVEOPEN(MOM); IF TERMSET(P1MIX) THEN GO EXIT; 14243000
GO TESTREADY END 14244000
ELSE BEGIN% 14245000
COMMENT READY AND NOT PRESENT INDICATES REEL-SWITCH OR TERMINATE;% 14246000
PRTR~M[MOM-3];% 14247000
LOC~PRTR[15].[25:5];% 14248000
SIZE~PRTR[4].[8:4];% 14249000
IF M[MOM].[27:1] THEN% 14250000
IF M[MOM].[24:1] THEN% 14251000
BEGIN IF SIZE=2 AND NOT PRTR[4].[2:1]% 14252000
AND NOT M[MOM].[22:1] THEN% 14253000
BEGIN BLASTQ(LOC);% 14254000
P(WAITIO(M[MOM-2],0,LOC),DEL);% 14255000
P(WAITIO(@1000000340000005,0,LOC),DEL);% 14256000
IF M[M[MOM-2] INX 4].[42:6]=1 THEN% 14257000
CLOSE: BEGIN LOC~PRTR[13].[28:10];% 14258000
FILECLOSE(MOM&@12[18:33:15]);% 14259000
PRTR[13].[28:10]~LOC+1;% 14260000
GO TO OPEN;% 14261000
END;% 14262000
END;% 14263000
END ELSE% 14264000
BEGIN IF SIZE=2 OR SIZE=7 OR SIZE=8 THEN% 14265000
BEGIN IF NOT PRTR[4].[2:1] THEN% 14266000
M[M[MOM-2] INX 4].[42:6]~1;% 14267000
GO TO CLOSE;% 14268000
END;% 14269000
END;% 14270000
P(MOM,M[MOM].[27:1]+1,0,0,);% 14271000
COM11;% 14272000
END;% 14273000
END;% 14274000
END% 14275000
ELSE% 14276000
BEGIN% 14277000
COMMENT DATA DESCRIPTOR;% 14278000
DLOOP: 14278100
IF (MOTHER~MEMORY[MOM ~ D.[18:15]]).[2:1] THEN GO WRAP;% 14279000
IF (MOTHER INX 0) = 6 THEN % I/O ERROR FROM OLAY 14279150
BEGIN 14279200
TERMINATE(P1MIX & 20[CTF]); 14279250
GO TO INITIATE; 14279350
END; 14279400
IF (MOTHER INX 0) = 5 THEN % INTERLOCK FROM OLAY 14279450
BEGIN 14279500
COMPLEXSLEEP(((M[MOM] INX 0) NEQ 5)); 14279550
GO TO DLOOP; 14279600
END; 14279650
SAVEBIT ~ MOTHER.[CF]=1; 14280000
MEMORY[MOM] ~ MOTHER&((LOC ~GETSPACE(SIZED~MOTHER.[8:10],2,% 14281000
SAVEBIT+64))+2)[CTC]&1[2:47:1]; 14282000
$ SET OMIT = NOT(AUXMEM) 14282099
IF MOTHER.[CF]{3 THEN 14283000
STREAM(L~LOC+2, S~SIZE-1, T~0, W~(MOTHER.[CF]=2)); 14284000
BEGIN SI ~ LOC S;SI~SI+6;DI~LOC T;DI~DI+7;DS~CHR;% 14285000
DI~L; SI~LOC W; SI~WDS; 14286000
SI~L; T(DS~32 WDS; DS~32 WDS); DS~S WDS;% 14287000
END ZERO SPACE% 14288000
ELSE% 14289000
BEGIN% 14290000
COMMENT READ ARRAY FROM DISK AND RETURN DISK SPACE;% 14291000
$ SET OMIT = NOT(STATISTICS) 14291099
DISKIO(IOD,-LOC-1,MOTHER.[8:10],% 14292000
DATADDRESS(P1MIX, MOTHER)); 14292100
SLEEP([IOD],IOMASK); 14292110
IF IOD.[26:7] NEQ 0 THEN 14292120
BEGIN 14292130
NG: FORGETSPACE(LOC+2); 14292140
COMPLEXSLEEP(TERMSET(P1MIX)); 14292150
GO TO INITIATE; 14292160
END; 14292170
$ SET OMIT = NOT(STATISTICS) 14292199
MOM~MOM&MOTHER[CTF]; 14293000
END ;% 14295000
MEMORY[LOC].[2:1] ~ SAVEBIT;% 14296000
MEMORY[LOC+1] ~ MOM ;% 14297000
$ SET OMIT = NOT(STATISTICS) 14297099
WRAP:% 14298000
MEMORY[C] ~ IF D.[8:10] = 0 THEN P(M[MOM],0,CDC,D,XCH,INX)% 14299000
ELSE MEMORY[MOM];% 14300000
END;% 14301000
EXIT: 14301100
$ SET OMIT = NOT(NEWLOGGING) 14301199
END MAKEPRESENT ;% 14302000
REAL ADDRS=NT1;% 14342000
PROCEDURE ZIPPER(A,B,C);VALUE A,B,C; REAL A,B,C; FORWARD; 14342100
PROCEDURE COM5;% 14343000
BEGIN% 14344000
REAL RCW=+0,% 14345000
ERTOG=+2,% 14346000
I =+3,% 14347000
T =+4,% 14348000
INTEGER J=1;% 14349000
ARRAY VECTOR=+5[*],S=+6[*];% 14350000
INTEGER Q=S; 14350100
ARRAY FILEBLOCK=+7[*];% 14351000
ARRAY TSKA=+13[*]; 14351050
INTEGER LINK; LABEL RETURNEM; 14351100
INTEGER MOTHER=+8, NEXTMOM=+9, MOMMIX=+10, CATCH=+11;% 14351200
REAL ENDAIT=MOMMIX,A=MOMMIX,K=NEXTMOM; 14351205
REAL CHAIN=+12,ABSEVT=CHAIN; 14351210
REAL MSCW = -1; 14351220
REAL JAR9 = TSKA+1; %519-14351230
$ SET OMIT = NOT(WORKSET) 14351240
REAL STOPMIX=JAR9+1; LABEL STOPLOOP; 14351250
$ POP OMIT % WORKSET 14351260
SUBROUTINE DELINKIT; 14351300
BEGIN T:=M[I] INX 0; 14351310
IF NOT M[T].[4:1] THEN SLEEP([M[T]],@200000000000000); 14351320
M[T].[4:1]:=0; 14351330
IF M[I].[2:1] THEN%IN CONTROL 14351340
BEGIN M[T].[CF]:=M[I].[FF]; 14351350
IF (M[T] INX 0) NEQ 0 THEN M[M[T] INX 0].[2:1]:=1 14351360
ELSE M[T]:=ABS(M[T]);%UNLOCK IT 14351370
END ELSE% IN WAIT QUEUE 14351380
BEGIN T:=M[T] INX 0; 14351390
WHILE M[T].[FF] NEQ (I INX 0) DO 14351400
T:=M[T].[FF]; 14351410
M[T].[FF]:=M[I].[FF]; 14351420
END; 14351430
M[T].[4:1]:=1; 14351440
END; 14351450
PRYOR[P1MIX] ~ -1; 14351500
P((ADDRS:=GETSPACE(196,12,0))+1,STS,.COM5,RCW,0,RDS,0,XCH,CFX, 14353000
STF); 14353002
P(P&[MSCW][CTF],0,0,0,0,0,0); 14354000
P(0,0,0,0,0,0,0); % ZERO FILEBLOCK THRU JAR9... %172-14355000
$ SET OMIT = NOT(WORKSET) 14355020
P(0); % STOPMIX 14355030
$ POP OMIT % WORKSET 14355040
M[(FILEBLOCK~PRT[P1MIX,3]) INX 0-2].[9:6] ~ 0;% 14356000
M[ADDRS]~(*P(DUP))&0[9:9:6]; 14357000
M[(VECTOR~JARROW[P1MIX]) INX 0-2]~(*P(DUP))&0[9:9:6]; 14358000
IF VECTOR[0]<0 THEN% 14358100
BEGIN CATCH~PRT[P1MIX,@26]; 14358150
ERTOG ~ (VECTOR[1]>0) OR (PRT[P1MIX,@25]!0);% 14358200
END; 14358300
IF VECTOR[2].[6:1] THEN % IPC 14358310
BEGIN IF VECTOR[1]<0 THEN % DS-ED TASK 14358315
BEGIN WHILE (S~PRT[P1MIX,AITNDX]).PBIT=0 DO % SEARCH AIT FOR 14358320
MAKEPRESENT( PRTROW[P1MIX] INX AITNDX); % TASK ARRAYS 14358325
MEMORY[S INX NOT 1].[2:1] ~ 1; % MARK SAVE 14358330
ENDAIT ~ S[0]; 14358335
FOR K~1 STEP 1 UNTIL ENDAIT DO 14358340
BEGIN TSKA ~ MEMORY[(NT1~S[K]).MOM]; 14358345
IF NT1.[1:2]=3 THEN IF % DEPENDENT TASK 14358355
((NT2~TSKA[3])=1 OR (NT2=2 AND TSKA[4]!P1MIX)) THEN 14358360
% TASK ARRAY OF A SCHEDULED OR RUNNING OFFSPRING14358365
BEGIN IF NT2=1 THEN 14358370
BEGIN 14358373
SHEETDIDDLER(0,20,TSKA[4]); % ES14358375
END; 14358377
IF TSKA[3]=2 THEN % RUNNING 14358380
BEGIN 14358382
TERMINATE(TSKA[4]&86[CTF]); HALT; % DS14358383
NOPROCESSTOG ~ NOPROCESSTOG-1; 14358384
END; 14358385
COMPLEXSLEEP((TSKA[3] LSS 0)); 14358386
END; 14358389
END; 14358390
END; IF VECTOR[2].[5:1] THEN SOFTI ~ SOFTI-1; 14358391
IF (TSKA~PRT[P1MIX,TSX]).PBIT THEN 14358392
BEGIN IF TSKA[6]=1 THEN TSKA[7]:=1; 14358393
IF (I:=TSKA[5]) NEQ 0 THEN BEGIN I:=[PRT[P1MIX,I]] INX 0; 14358394
DELINKIT;WHILE(I:=M[I].[8:10]) NEQ 0 DO 14358395
BEGIN I:=[PRT[P1MIX,I]]INX 0;DELINKIT END END; 14358397
IF (I~TSKA[8].[CF])!0 THEN % SOFTWARE INTERRUPTS DECLARED 14358398
BEGIN IF NOT TSKA[8].[4:1] THEN 14358400
SLEEP([TSKA[8]],@200000000000000); 14358450
TSKA[8].[4:1] ~ 0; 14358460
DO % DETACH SOFTWARE INTERRUPTS 14358550
BEGIN IF (ABSEVT~PRT[P1MIX,I].[FF])!0 THEN 14358580
BEGIN WHILE NOT M[ABSEVT].[5:1] DO 14358582
ABSEVT ~ M[ABSEVT].[FF]; 14358584
IF M[ABSEVT]}0 THEN 14358586
SLEEP([M[ABSEVT]],@2000000000000000);14358588
M[ABSEVT] ~ P(LOD,DUP,SSP); 14358590
T ~ (K~PRT[P1MIX,I]).[FF]; 14358595
A ~ [PRT[P1MIX,I]] INX 0; 14358597
WHILE M[T].[FF]!A DO T ~ M[T].[FF]; 14358598
M[T].[FF] ~ K.[FF]; 14358600
M[ABSEVT] ~ P(DUP,LOD,SSN); 14358605
END; 14358610
I ~ PRT[P1MIX,I].[CF]; 14358615
END UNTIL I=0; 14358620
TSKA[8].[4:1] ~ 1; 14358625
END; 14358630
TSKA[3]:=-1; 14358640
END; 14358650
END; 14358700
JAR9 := VECTOR[9]; 14358710
CHAIN ~ 0&VECTOR[9][FTC]&VECTOR[1][1:1:1]; VECTOR[9].[FF] ~ 0; 14358800
$ SET OMIT = NOT(BREAKOUT) 14358999
IF VECTOR[2]<0 THEN % COBOL 14360100
IF VECTOR[1]>0 THEN % NOT DS-ED 14360200
WHILE PRT[P1MIX,16]>0 DO ASR;%CLEAN OUT AIT 14360300
IF VECTOR[1]>0 THEN % NOT DS-ED 14360310
FOR MOMMIX:=6 STEP 5 UNTIL 11 DO 14360320
BEGIN Q:=NFLAG(PRT[P1MIX,MOMMIX]); % AIT OR OAT ENTRY 14360330
IF Q.[2:1] THEN % PRESENT, GRAB ADDRESS FROM LINK 14360340
Q := Q & M[Q INX NOT 0];[FTC]; 14360350
IF Q.[33:3]=7 THEN % AUXILIARY MEMORY IN THE ACT 14360360
DISKRTN(Q.[CF], Q.[8:10]); 14360370
IF VECTOR[2]<0 THEN MOMMIX:=11; % COBOL HAS NOT OAT 14360380
END; 14360390
SLEEP([OLAYMASK],MOMMIX~TWO(P1MIX)); 14360400
OLAYMASK ~ NOT MOMMIX AND OLAYMASK; 14360500
MOTHER ~ DALOC[P1MIX,0].[CF]; 14360600
NEXTMOM := -1; S := DALOCROW[P1MIX]; 14360700
WHILE (NEXTMOM := NEXTMOM+2)<MOTHER DO 14360800
FORGETUSERDISK(S[NEXTMOM],-500); 14360900
SLEEP([TOGLE],STOREMASK); 14361000
MOTHER ~ (MOMMIX ~ (NEXTMOM ~% 14361100
PRT[P1MIX,4].[18:12]).[36:6])=P1MIX;% 14361200
NEXTMOM ~ NEXTMOM AND @77;% 14361300
$ SET OMIT = NOT(AUXMEM) 14361309
$ SET OMIT = NOT(DEBUGGING AND AUXMEM) 14361512
WHILE(T~M[I]).[CF] ! 0 DO% 14362000
BEGIN% 14363000
IF T > 0 THEN % IN USE AREA %167-14364100
IF T.AREAMIXF = P1MIX THEN % IN USE BY THIS MIX 14364200
IF MOTHER AND (P(T.AREATYPEF,DUP) = CODEAREAV 14364300
OR P(XCH) = SEGDICTAREAV) THEN % GIVE CODE 14364400
M[I].AREAMIXF := NEXTMOM % TO NEW MOM %167-14364500
ELSE %167-14364600
FORGETSPACE(I INX 2); %167-14364700
I := T.AREAFWDLINKF; %167-14364800
END;% 14367000
INTABLEROW[P1MIX] ~ 0;% 14367100
$ SET OMIT = NOT(BREAKOUT) 14367199
$ SET OMIT = NOT(BREAKOUT) 14367999
IF NEXTMOM!0 THEN BEGIN% 14370010
IF MOTHER THEN% 14370020
IF PRT[NEXTMOM,4].[24:6]=@77 THEN% 14370030
NFO[(NEXTMOM-1)|NDX+1] ~% 14370035
PRT[NEXTMOM,4] ~ (*P(DUP))&0[18:18:15]% 14370040
ELSE BEGIN MOTHER ~ NEXTMOM;% 14370050
DO UNTIL (MOTHER ~ (PRT[MOTHER,4] ~% 14370060
NFO[(MOTHER-1)|NXD+1] ~% 14370065
(*P(DUP))&NEXTMOM[18:42:6]).[24:6])=@77;% 14370070
END% 14370080
ELSE BEGIN% 14370090
IF (PRT[MOMMIX,4].[24:6]=P1MIX) AND% 14370100
NEXTMOM=@77 THEN NFO[(MOMMIX-1)|NDX+1] ~% 14370110
PRT[MOMMIX,4] ~ (*P(DUP))&0[18:18:15]% 14370115
ELSE BEGIN% 14370120
DO BEGIN MOTHER ~ MOMMIX; 14370130
MOMMIX ~ PRT[MOMMIX,4].[24:6];% 14370140
END UNTIL MOMMIX=P1MIX;% 14370150
NFO[(MOTHER-1)|NDX+1] ~% 14370155
PRT[MOTHER,4] ~% 14370160
(*P(DUP))&NEXTMOM[24:42:6];% 14370165
END END;% 14370170
NFO[(P1MIX-1)|NDX+1] ~% 14370180
PRT[P1MIX,4] ~ (*P(DUP))&0[18:18:15];% 14370190
END;% 14370200
$ SET OMIT = NOT(AUXMEM) 14370299
IF VECTOR[2].[8:10]! 0 THEN% 14371000
$ SET OMIT = STATISTICS 14371999
FORGETSPACE(DIRECTORYSEARCH(ABS(VECTOR[0]),IF VECTOR[0]<0 14372000
THEN "DISK " ELSE ABS(VECTOR[1]),13)); 14373000
$ POP OMIT 14373001
$ SET OMIT = NOT(STATISTICS) 14373099
IF VECTOR[2].[8:10] = 1 THEN % COMPILER ON COMPILE AND GO 14374000
BEGIN% 14375000
IF ERTOG=0 THEN% 14376000
BEGIN% 14377000
COMPLEXSLEEP((SCHEDULEIDS!NOT 0) AND 14378000
SHEETFREE); 14378100
LOCKTOG(SHEETMASK); 14379000
S~[M[GETSPACE(31,2,0)+2]]&30[8:38:10];14380000
DISKIO(T,-(S INX 0-1),30, 14381000
VECTOR[2].[FF]); 14382000
SLEEP([T],IOMASK); 14383000
STREAM(A~0:B~P(.SCHEDULEIDS)); 14383100
BEGIN SI~B; 14383200
47(SKIP SB; SKIP DB; TALLY~TALLY+1;14383300
IF SB THEN BEGIN END % -14383400
ELSE JUMP OUT); 14383450
DS~SET; A~TALLY; 14383500
END STREAM; 14383600
T ~ P; S[3] ~ D&T[8:38:10]; 14383700
S[25] ~ CATCH; 14383740
S[23].[24:24]~(CLOCK+P(RTR))DIV 60; 14383750
DISKIO(T,+(S INX 0-1),30, 14383800
VECTOR[2].[FF]); 14383900
SLEEP([T],IOMASK); 14384000
I ~ IF S[18] > MIXMAX THEN MIXMAX 14385000
ELSE S[18]; 14386000
IF SHEET[I].[CF] ! 0 THEN 14387000
BEGIN DISKIO(T,-(S INX 0-1),30, 14388000
SHEET[I].[FF]); 14389000
SLEEP([T],IOMASK); 14390000
S[29] ~ VECTOR[2].[FF]; 14391000
DISKIO(T,+(S INX 0-1),30, 14392000
SHEET[I].[FF]); 14392500
SLEEP([T],IOMASK); 14393000
END ELSE SHEET[I] ~ VECTOR[2].[FF]; 14394000
SHEET[I].[FF] ~ VECTOR[2].[FF]; 14395000
UNLOCKTOG(SHEETMASK); 14396000
FORGETSPACE(S INX 0);% %165-14396100
END% 14397000
ELSE BEGIN% 14398000
RETURNEM: 14398500
S~[M[GETSPACE(31,2,0)+2]]&30[8:38:10]; 14398600
DISKIO(T,-(S INX 0-1),30,VECTOR[2].[FF]); 14398700
SLEEP([T],IOMASK); 14398800
FORGETESPDISK(VECTOR[2].[18:15]);% 14399000
LINK ~ S[13]; 14399100
WHILE LINK!0 DO 14399200
BEGIN DISKIO(T,-(S INX 0-1),30,LINK); 14399300
SLEEP([T],IOMASK); 14399400
FORGETESPDISK(LINK); LINK ~ S[29]; 14399500
END; 14399600
FORGETSPACE(S); 14399700
END 14400000
END ELSE% 14401000
IF VECTOR[2].[8:10] = 0 THEN% 14402000
BEGIN% 14403000
VECTOR[9]:=VECTOR[9].[CF]; 14403900
FOR I~1 STEP 1 UNTIL VECTOR[9] DO% 14404000
IF VECTOR[9+I] ! 0 THEN% 14405000
FORGETUSERDISK[VECTOR[9+I],-VECTOR[8]); 14406000
IF VECTOR[2].[7:1] THEN VECTOR[2].[8:10]~2;%FOR TASK LOG 14406100
END ELSE 14407000
IF VECTOR[2].[8:10]=4% 14407100
THEN GO TO RETURNEM; 14407200
IF VECTOR[0]<0 THEN 14408000
IF ERTOG ! 0 THEN% 14409000
VECTOR[2].[8:10] ~ 3;% 14410000
I ~ P1MIX;% 14411000
COMMENT SUBTRACT CORE REQUIREMENTS FROM CORE WORD; 14411100
CORE.[18:15]~CORE.[18:15] - NFO[(P1MIX-1)|NDX+2].[18:15]; 14411200
$ SET OMIT = NOT(AUXMEM) 14411309
$ SET OMIT = NOT(DATACOM ) 14411499
IF CHAIN GTR 0 THEN 14411620
BEGIN S:=[M[SPACE(5)]]&5[8:38:10]; 14411640
DISKWAIT(-(S INX 0),5,CHAIN); 14411660
ZIPPER(S[1],S[2],S[3]); 14411680
FORGETSPACE(S); 14411700
END; 14411720
IF CHAIN ! 0 THEN FORGETESPDISK(ABS(CHAIN)); 14411740
IF VECTOR[2].[3:1] THEN 14411800
BEGIN 14411810
NT1:=TYPEDSPACE(5,MAINTBUFFAREAV);% %167-14411820
M[NT1-2].[9:6] := 0; 14411830
M[NT1 ]:= 0 & P1MIX[20:43:5]; 14411840
M[NT1+1]:= VECTOR[5].[1:23]; 14411850
M[NT1+2]:= XCLOCK & VECTOR[2][1:1:17] & 14411860
(VECTOR[1]<0)[18:42:6]; 14411870
M[NT1+3]:= VECTOR[0]; 14411880
M[NT1+4]:= VECTOR[1]; 14411890
LINKUP(14,NT1); 14411900
END; 14411910
$ SET OMIT = PACKETS 14411999
BEGIN; STREAM(TK~VECTOR[2].[7:1],B~IF VECTOR[1] <0 THEN 2 ELSE%110-14414000
VECTOR[2].[8:10]!3,I,Q~Q~((NT1~(XCLOCK DIV 3600)14415000
) MOD 60 + (NT1 DIV 60)|100), V:=VECTOR 14415100
$ SET OMIT = NOT PACKETS 14415150
,T:=T:=SPACE(10) 14415200
$ POP OMIT 14415250
); 14415300
BEGIN% 14416000
$ SET OMIT = PACKETS 14416999
$ SET OMIT = NOT(PACKETS) 14418099
SI:=V;SI:=SI+1;DS:=LIT" ";DS:=7CHR; 14418100
SI:=SI+1;DS:=LIT"/";DS:=7CHR; 14418110
$ POP OMIT 14418111
DS~LIT"="; SI~LOC I; DS~2DEC; 14419000
I~DI; DI~DI-2; DS~FILL; DI~I; 14419500
CI ~ CI+B;% 14420000
GO TO E;% 14421000
GO TO OK;% 14422000
DS~7 LIT " DS-ED "; 14423000
GO TO X;% 14424000
OK:% 14425000
DS~5 LIT " EOJ "; 14426000
TK(DI~DI-2; DS~2 LIT "T "); % END OF TASK %110-14426100
GO TO X;% 14427000
E: DS~11 LIT " SYNTX ERR "; 14428000
X: DS~ 4 DEC; DS~LIT "~"; 14429000
END; 14429100
$ SET OMIT = PACKETS 14429150
$ SET OMIT = NOT RJE OR OMIT 14430190
SPOUTER(T,0,(EOJMESS AND NOT(JAR9.[2:1]))); 14430400
END; 14430600
SIGNOFF(VECTOR,FILEBLOCK,0); 14430800
FORGETSPACE(VECTOR); 14431000
$ POP OMIT OMIT 14431010
$ SET OMIT = NOT(AUXMEM) 14431299
$ SET OMIT = NOT(WORKSET) 14431400
STOPLOOP: 14431410
IF WKSETSTOPJOBS NEQ 0 THEN % JOB WAS AUTO-STOPPED 14431420
IF NOT(JAR9.SYSJOBF) THEN % NOT EOJ FOR "SYSTEM" JOB 14431425
BEGIN 14431430
STNEXT:=IF STNEXT=0 THEN STQUEMAX ELSE STNEXT-1; %138-14431440
STOPMIX:=STQUE[STNEXT]; %138-14431450
STQUE[STNEXT]:=0; %138-14431460
STFIRST := (STFIRST+1).[44:4]; % POINT TO NEXT CELL 14431470
IF (STOPMIX GTR 0) AND (STOPMIX LEQ MIXMAX) THEN 14431480
IF JARROW[STOPMIX] NEQ 0 THEN 14431490
BEGIN 14431500
IF STOPSET(STOPMIX) THEN % NOT YET STOPPED 14431502
BEGIN 14431504
PRTROW[STOPMIX,X].[PSF]:=0; 14431506
WKSETSTOPJOBS:=WKSETSTOPJOBS AND 14431508
NOT (TWO(STOPMIX)); 14431510
JAR[STOPMIX,9].[3:1]:=0; 14431512
GO STOPLOOP; 14431514
END ELSE 14431516
BEGIN REPLY[STOPMIX]:=VOK; % WAKE IT UP 14431518
STREAM(J:=JARROW[STOPMIX],STOPMIX, 14431520
D:=Q:=SPACE(10)); 14431530
BEGIN 14431540
SI:=J; DS:=9LIT" AUTO-OK "; 14431550
2(SI:=SI+1; DS:=7CHR; DS:=LIT"/"); 14431560
DI:=DI-1; DS:=LIT"="; SI:=LOC STOPMIX; 14431570
DS:=2DEC; DS:=LIT"~"; DI:=DI-3; DS:=FILL; 14431580
END STREAM STATEMENT; 14431590
SPOUTER(Q,PSEUDOMIX[STOPMIX],1); %525-14431600
END; 14431602
END % IF AWAKENING A JOB 14431610
ELSE GO TO STOPLOOP 14431620
ELSE GO TO STOPLOOP; 14431630
END; % IF JOBS WHERE AUTO-STOPPED 14431640
WKSETSWITCHTIME := CLOCK + P(RTR); 14431650
$ POP OMIT % WORKSET 14431660
$ SET OMIT = NOT(WORKSET) 14431970
WKSETNOSELECT~(WKSETNOSELECT AND (WKSETSTOPJOBS ! 0)); 14431975
IF WKSETSTOPJOBS=0 THEN 14431980
$ POP OMIT % WORKSET 14431990
SELECTION;% 14432000
KILL([MSCW]); 14433000
END L5COM;% 14434000
PROCEDURE ZIPPER(W1,W2,USERSTA);VALUE W1,W2,USERSTA; 14531000
REAL W1,W2,USERSTA; 14531100
BEGIN REAL T,I; 14532000
T ~ GETSPACE(12,CONTROLCARDAREAV,0)+4;% %167-14533000
M[T-4].[9:6]~0;% 14534000
IF (I~USERCODE[P1MIX])=ABS(NOT 0) THEN I~ 0; 14534500
STREAM(K~@14,A~[W1],C~I,B~T); 14535000
BEGIN 14536000
SI~LOC K; SI~SI+7; DS~ CHR; 14537000
DS:= 5 LIT "USER="; SI:=LOC C; SI:=SI+1; DS:= 7 CHR; 14537100
DS~ 9 LIT ";EXECUTE "; SI~A; SI~SI+1; 14537200
DS~ 7 CHR; DS~ LIT "/"; SI~SI+1); DS~ 7 CHR; 14538000
DS~ 6 LIT ";END.~"; 37(DS~ LIT " "); 14539000
END; 14540000
IF USERSTA!0 THEN 14540100
BEGIN 14540200
I:=30; 14540300
IF USERSTA.[19:1] THEN ELSE T:=T&USERSTA[9:15:9]; 14540350
END 14540400
ELSE 14540500
I~IF P1MIX=0 OR USERCODE[P1MIX]=MCP THEN 31 ELSE 26; 14541000
$ SET OMIT = PACKETS 14541049
$ SET OMIT = NOT(PACKETS) 14541089
IF PSEUDOMIX[P1MIX] NEQ 0 THEN NYLONZIPPER[P1MIX].[2:1]:=0; 14541090
INDEPENDENTRUNNER(P(.CONTROLCARD),T&I[2:42:6] 14541100
&P1MIX[18:42:6]&PSEUDOMIX[P1MIX][24:39:9],192); 14541110
IF PSEUDOMIX[P1MIX] NEQ 0 THEN 14541120
SLEEP([NYLONZIPPER[P1MIX]],@1000000000000000); 14541130
$ POP OMIT 14541131
END ZIPPER;% 14542000
REAL PROCEDURE EUF(A,B,L); VALUE A,B,L; REAL A,B,L; 14543000
BEGIN% 14544000
REAL I,J,R,T,Z;% 14545000
REAL H; 14545100
ARRAY X[*];% 14546000
INTEGER S; 14546100
$ SET OMIT = SHAREDISK 14546199
DEFINE R1=R#, X1=X#; 14546200
$ POP OMIT 14546201
$ SET OMIT = NOT SHAREDISK 14546299
LABEL LL,FOUND,WHY,BYE; 14547000
LABEL CHECK,DOWN,BOMBOUT,DSD; 14548000
% 14548900
REAL SUBROUTINE THERE;% 14549000
% 14549100
% ON EXIT, X IS THE LAST BYPASS BLOCK READ AND J IS ITS ADDRESS. 14549110
% IF THERE IS TRUE, I IS THE INDEX OF THE ENTRY FOR THE FILE AND,14549120
% FOR SECURITYCHECK, H IS THE NEGATIVE OF ITS HEADER ADDRESS. 14549125
% IF THERE IS FALSE, T IS THE ADDRESS OF THE FIRST BLOCK WHICH 14549130
% HAS A VACANT SLOT. 14549140
% 14549150
BEGIN% 14550000
T:=0; 14550500
LL: FOR I:=0 STEP 3 UNTIL 57 DO 14551000
BEGIN IF (X[I] EQV A) = NOT 0 THEN 14551500
IF (X[I+1] EQV B) = NOT 0 THEN 14552000
BEGIN P(1); 14552500
H:=NABS(X[I+2]); 14552750
GO DOWN; 14553000
END; 14553500
IF (X[I] EQV @14) = NOT 0 THEN 14554000
IF T=0 THEN T:=J; 14554500
END; 14555000
IF (Z:=X[2].[FF])!0 THEN 14555500
BEGIN DISKWAIT(-R,60,J:=Z); 14556000
GO TO LL; 14556500
END; 14557000
IF T=0 THEN T:=J; 14557500
P(0); 14558000
DOWN: THERE:=P; 14558500
END;% 14559000
$ SET OMIT = NOT(SHAREDISK) 14559099
A:=ABS(A); 14559200
X:=[M[R:=SPACE(60)]]&60[8:38:10]; 14559250
IF (A OR B).[1:5]!0 OR A=@14 OR A=@114 THEN 14559300
BEGIN 14559400
TERMINATE(P1MIX&75[18:33:15]); GO DSD; 14559500
END; 14559600
$ SET OMIT = SHAREDISK 14559990
LOCKDIRECTORY; 14560000
$ POP OMIT 14560010
S:=SCRAMBLE(A,B); 14562000
CHECK: DISKWAIT(-R,-60,(J:=S)); 14563000
IF P1MIX !0 THEN 14564000
IF THERE THEN% 14567000
BEGIN 14568000
$ SET OMIT = NOT SHAREDISK 14568890
UNLOCKDIRECTORY; 14569000
$ POP OMIT OMIT 14569010
H~SECURITYCHECK(A,B,USERCODE[P1MIX],H)!7; 14569200
Z:=VWY&VOK[36:42:6]&(IF H THEN 0 ELSE VRM)[30:42:6]; 14569500
WHY: STREAM(A:=[A], B:=JAR[P1MIX], C:=P1MIX, UC:=H, 14570000
D:=J:=SPACE(10)); 14570100
BEGIN% 14571000
DS~13LIT"#DUP LIBRARY ";% 14572000
UC(DS~15LIT"(ILLEGAL USER) "); 14572100
SI~A ;SI~SI+1;DS~7CHR;% 14573000
DS~LIT"/" ;SI~SI+1;DS~7CHR;% 14574000
DS~LIT":";% 14575000
SI~B ;SI~SI+1;DS~7CHR;% 14576000
DS~LIT" " ;SI~SI+1;DS~7CHR;% 14577000
DS:=LIT"="; SI:=LOC C; DS:=2 DEC; DS:=LIT"~": 14578000
DI~DI-3; DS~FILL; 14578500
END;% 14579000
SPOUT(J); 14580000
REPLY[P1MIX]:=-Z; 14581000
IF AUTODS THEN %747-14581500
IF H=1 THEN TERMINATE(P1MIX&61[CTF]) ELSE REPLY[P1MIX]~VRM%747-14581700
ELSE %757-14581800
COMPLEXSLEEP(TERMSET(P1MIX) OR (REPLY[P1MIX] GTR 0)); 14582000
IF TERMSET(P1MIX) THEN 14583000
DSD: BEGIN FOR I:=M[L+10]+10 STEP -1 UNTIL 11 DO 14583100
IF M[L+I]!0 THEN FORGETUSERDISK(M[L+I],-M[L+9]); 14583200
GO TO BOMBOUT; 14583300
END; 14583400
IF NOT WHYSLEEP(Z) THEN GO TO WHY; 14584000
IF REPLY[P1MIX].[18:30]=VRM THEN 14585000
$ SET OMIT = NOT(DATACOM ) 14585050
BEGIN 14585200
IF P(DIRECTORYSEARCH(-A,B,7),DUP)=2 14585300
THEN BEGIN P(DEL); % ALWAYS TO SPO %589-14585350
LBMESS( A, B, -7, 25, 0, 0, 1 ); END %589-14585360
ELSE IF P=3 THEN GO DSD; 14585400
$ SET OMIT = NOT DATACOM 14585490
END; 14587200
REPLY[P1MIX]:=0; 14588000
$ SET OMIT = SHAREDISK 14588090
LOCKDIRECTORY; 14588100
$ POP OMIT 14588110
GO TO CHECK;% 14589000
END ELSE ELSE T:=S; % SETS UP FOR P1MIX=0 14590000
% 14590900
% THE FILE IS NOT THERE. WE SEARCH FOR A VACANCY. IF ONE IS FOUND14590910
% Z AND T ARE ITS ADDRESS. IF THERE ISNT ONE, Z IS THE ADDRESS OF14590920
% THE LAST BLOCK AND T IS SET TO THE ADDRESS OF THE NEW BLOCK. 14590930
% 14590940
$ SET OMIT = NOT SHAREDISK 14590990
DO BEGIN 14591500
IF (Z:=T)!J THEN DISKWAIT(-R,60,Z); 14592000
FOR I~0 STEP 3 UNTIL 57 DO 14593000
IF (X[I] EQV @14)= NOT 0 THEN GO TO FOUND; 14594000
END UNTIL (T:=X[2].[FF])=0; 14595000
X[2].[FF]~ BYPASS ~ BYPASS-2; 14596000
IF BYPASS.[CF] LEQ BYPASS.[FF] THEN GO TO BYE; 14598000
$ SET OMIT = SHAREDISK 14598090
DISKWAIT(R,60,Z); % WRITE OUT POINTER TO NEW BLOCK 14598100
$ POP OMIT 14598110
T:=BYPASS.[CF]; 14598200
X1[0]:=@14; MOVE(59,X1,X1 INX 1); 14598300
$ SET OMIT = NOT SHAREDISK 14598390
T:=0; 14598500
FOUND:% 14599000
PBCOUNT~PBCOUNT+((((A EQV"PBD ")=NOT 0) OR 14599900
((A EQV"PUD ")=NOT 0)) AND (B.[CF]=1)); 14599910
X[I]~A; X[I+1]~B; X[I+2].[CF]~NEXTSLOT; 14600000
$ SET OMIT = NOT SHAREDISK 14600290
DISKWAIT(R1,60,T); 14600500
% 14600900
% UPDATE THE NAME SEGMENT, BUT DONT WRITE IT OUT UNTIL THE NEW 14600910
% HEADER IS WRITTEN. 14600920
% 14600930
J~(NEXTSLOT-DIRECTORYTOP-3)&0[44:44:4]+DIRECTORYTOP+19; 14601000
I:=((T:=NEXTSLOT)-J)|2+30; 14601500
DISKWAIT(-R1,-30,J); 14602000
NEXTSLOT:=X1[I+1]; 14602500
X1[I]:=A; X1[I+1]:=B; 14603000
IF NEXTSLOT=0 THEN % GOING TO USE EOF RECORD 14603100
IF I=0 THEN % WRITE NEW EOF RECORD BEFORE 14603110
BEGIN P(X1[28],X1[29]); % DESTROYING CURRENT ONE 14603200
X1[28]:=@114; 14603300
X1[29]:=0; 14603310
NEXTSLOT:=T+30; 14603320
BYPASS.[FF] ~ J+16; 14603330
DISKWAIT(R1,30,J+16); 14603400
P([X1[29]],~,[X1[28]],~); % RESTORE CLOBBERED NAME 14603600
IF J~16 GEQ BYPASS.[CF] THEN 14603700
BYE: BYBY("DIRECTORY FULL~",15); 14603750
END ELSE 14603800
BEGIN X1[I-2]:=@114; X1[I-2]:=0; NEXTSLOT:=T-1 END; 14604000
% 14604900
% NOW WE CAN WRITE EVERYTHING OUT, NOTE THAT IN ORDER TO MINIMIZE14604910
% THE DAMAGE CAUSED BY AN UNTIMELY HANG, THE MAIN AND (FOR 14604920
% SHAREDISK) THE BYPASS DIRECTORIES ARE CORRECT AT ALL TIMES. 14604930
% 14604940
$ SET OMIT = NOT SHAREDISK 14605490
DISKWAIT(L+1,-30,T); % FILE HEADER 14607000
$ SET OMIT = NOT SHAREDISK 14608490
DISKWAIT(R1,-30,J); % NAME SEGMENT 14609000
$ SET OMIT = NOT SHAREDISK 14609990
$ SET OMIT = SHAREDISK 14617990
UNLOCKDIRECTORY; 14618000
$ POP OMIT 14618010
EUF:=T; 14619000
BOMBOUT:% 14620000
FORGETSPACE(R); 14621000
END ENTERUSERFILE ;% 14622000
PROCEDURE COM11; COMMENT ALGOL I/O COMMUNICATE;% 14623000
BEGIN %740-14624000
REAL CODE=-4, TANK=-5, ROW=-6, FID=-7, MID=-8, %740-14624100
STA=-6, RESULT=-7, TIMEOUT=-7 ; %740-14624200
NAME PHYL=-5; % %740-14624300
ARRAY HEADER=-5[*], FINAL=-6[*]; % %740-14624400
REAL B, T, F, S; % %740-14624450
NAME A; % % SAME STACK LOCATIONS AS BEFORE %740-14624500
REAL INFO, LOC, USASI, I; % %740-14624550
ARRAY FPB[*], FIB[*] ; % %740-14624600
$ SET OMIT = NOT DATACOM%740-14624990
LABEL PARITY, EOF, EOT, RDATA, SELERR, MESSAGE,%740-14627200
DISKSPACE,OPEN, CLOSE, HEADC, GIN, NG, %740-14627300
SLEAP, GRABIT, READSOUGHT, READSOUGHT2, %740-14627400
BACK, SEEKDC, DCWRITER, WHILOOP, COBOLDCWR,FINDBUF,%740-14628000
PURGELOCK,SPACE, REFILL, HEADLABEL,IOREQ, DCBUFRLS, 14628100
ROTATE, ABN; % %740-14629000
%740-14630000
SWITCH FUNCTION ~ OPEN, PARITY, EOF, EOT, DISKSPACE, 14631000
SEEKDC, CLOSE, RDATA, SELERR, SPACE, %740-14632000
REFILL, READLABEL,IOREQ, ROTATE, READC, %740-14632100
READSOUGHT,DCBUFRLS,DCWRITER, FINDBUF, COBOLDCWR, 14632200
PURGELOCK ; % %740-14632900
%740-14633000
GO TO FUNCTION [CODE] ; % %740-14634000
%740-14635000
PARITY: INFO~"PARITY "; B~"ERROR~ "; % %740-14636000
GO TO MESSAGE; % %740-14636100
EOF: INFO~"END FO "; B~"FILE~ "; % %740-14637000
GO TO MESSAGE; % %740-14639000
EOT: INFO~"FILE TO"; B~"O SMALL"; I~"~ "; % %740-14640000
GO TO MESSAGE; %740-14641000
:: % AT PURGELOCK, GO TO RDATA SHOULD BE TO MESSAGE ON WORD BOUNDY14641999
RDATA: INFO~"DATA ER"; B~"ROR, FM"; T~"T=R,~ "; % %740-14642000
GO TO MESSAGE; % %740-14642100
SELERR: INFO~"INVALID"; B~" OPERAT"; T~"ION ON~"; % %740-14643000
% %740-14643100
MESSAGE: FPB~PRT[P1MIX,3]; FIB~M[P(.TANK,LOD).[33:15]-3]; %740-14644000
IF FIB[5].[1:1] THEN INFO ~ -" INV" OR M; % %740-14644400
STREAM ( X ~ INFO, B, T, % THESE 3 MUST BE THIS ORDER 14645000
Z ~ 0, Q ~ TANK!0, % %740-14645400
F ~ IF TANK=0 THEN 0 ELSE [FPB[FIB[4].[13:11]]], 14645600
D ~( CODE ~ GETSPACE(12,2,0) +2) ); % %740-14645800
BEGIN DS ~ LIT "-"; SI ~ LOC X; % %740-14646000
IF SC = 0 THEN % MESSAGES WITH NEW WORDING %740-14646200
BEGIN 3( SI~SI+1; % CHARS IN INFO, B & T IN STACK 14646400
7( IF SC!"~" THEN DS~CHR ELSE JUMP OUT 2 TO L) ); 14646600
L: DS~LIT " "; % %740-14646800
END ELSE % UNCHANGED MESSAGES %740-14647000
BEGIN SI~SI+5; DS~3 CHR; SI~LOC X; %740-14647200
IF SC!"8" THEN DS ~ 11 LIT % %740-14647400
"WRITE TU 0 " % %740-14647600
ELSE IF SC=@30 THEN DS ~ 10 LIT % "INV" %740-14648000
"ALID USER " % %740-14648200
ELSE IF SC=@20 THEN DS ~ 10 LIT % %740-14648400
" WRT/SEEK " % %740-14648600
END; % NEXT, OPTIONALLY ADD <FILE SPECIFIER> %740-14649000
Q( SI~F; X~DI; DI~LOC Z; % %740-14650000
IF 8 SC!DC THEN % MFID ! "0000000" %740-14650200
BEGIN SI~F; SI~SI+1; DI~X; % %740-14650400
DS~7 CHR; DS~LIT "/"; X~DI; % %740-14650600
END; % %740-14650800
DI~X; SI~SI+1; DS~7 CHR ); % %740-14651000
DS ~ 2 LIT ":~"; % %740-14654000
END OF STREAM; % %740-14655000
TERMINATE(P1MIX); TERMINALMESSAGE((-CODE));% 14658000
DISKSPACE:OPEN:CLOSE: GO TO INITIATE;% 14659000
$ SET OMIT = DATACOM 14660499
SEEKDC:READC:READSOURGHT:DCBUFRLS:DCWRITER:FINDBUF:COBOLDCWR: 14660500
GO INITIATE; 14660525
$ POP OMIT 14660526
$ SET OMIT = NOT(DATACOM) 14660999
GO INITIATE; :: 14670600
PURGELOCK: SAVEWORD ~ SAVEWORD OR TWO(ROW); % RDATA USED TO FOLLOW 14671000
GO TO RDATA; :: % SPACE NEEDS TO BE ON WORD BOUNDARY %740-14673000
SPACE: FIB~M[P(.TANK,LOD).[33:15]-3]; LOC~FIB[15].[25:5];% 14675000
BLASTQ(LOC);% 14676000
FPB~[MEMORY[5]]&3[23:46:2]&ROW[22:1:1];% 14677000
ROW~ABS(ROW);% 14678000
WHILE (ROW~ROW-1)}0 DO INFO~WAITIO(FPB,@40,LOC);% 14679000
GO TO INITIATE; :: 14680000
REFILL: FIB~M[(TANK~P(.TANK,LOD).[33:15])-3];% 14681000
CODE~FIB[13].[10:9]-1;% 14682000
LOC~FIB[19].[33:15]-FIB[16].[33:15];% 14683000
FPB~MEMORY[FIB[16] INX 0+ROW];% 14684000
INFO~FPB.[18:15];% 14685000
FOR I~1 STEP 1 UNTIL CODE DO% 14686000
BEGIN IOREQUEST(FLAG(FIB[19]&(INFO+LOC)[33:33:15]),% 14687000
FIB[16]&INFO[33:33:15],FPB);% 14688000
MEMORY[TANK]~MEMORY[TANK]&0[2:2:1]&0[19:19:1]% 14689000
&0[26:26:7]&INFO[33:33:15];% 14690000
STREAM(CODE,T~MEMORY[TANK],TANK);% 14691000
BEGIN SI~TANK; SI~SI+8; DS~CODE WDS;% 14692000
SI~LOC T; DS~WDS;% 14693000
END;% 14694000
INFO~MEMORY[INFO+ROW].[18:15];% 14695000
END;% 14696000
GO TO INITIATE; :: 14697000
READLABEL: FIB~M[(TANK~P(.TANK,LOD).[33:15])-3];% 14698000
LOC~FIB[15].[25:5];% 14699000
BLASTQ(LOC);% 14700000
P(WAITIO((FIB[5].[44:1]|(M[TANK-2].[8:10]-1) INX M[TANK-2]) 14701000
&M[TANK][21:21:4],@37700000,LOC),DEL); 14702000
STREAM(Y:=0:X:=0;X1:=0,X2:=0,Z:=M[TANK-2]); 14702025
BEGIN DI:=LOC X; DS:=24 LIT "VOL1HDR1HDR2EOF1EOF2EOV1"; 14702050
DI:=LOC X; 14702100
6(TALLY:=TALLY+1; 14702150
SI:=Z; 14702200
IF 4 SC=DC THEN 14702250
JUMP OUT TO A); 14702300
TALLY:=0; 14702350
A: 14702400
Y:=TALLY; 14702450
END; 14702500
IF (USASI:=P)>0 THEN 14702550
USASITAPE(M[TANK-2].[CF],USASI,3,LOC,FIB[5].[44:1]); 14702600
P(WAITIO([M[5]]&3[23:46:2]&(NOT FIB[5])[22:44:1], 14703000
@37700000,LOC),DEL); 14703100
GO TO INITIATE; :: 14704000
IOREQ: FPB~MEMORY[(IF (INFO~NFLAG(MEMORY[P(TANK,DUP,[M],INX,PRL)]))14705000
.[22:1] THEN 2 ELSE NOT 1) INX INFO];% 14706000
IOREQUEST(FINAL,INFO,FPB);% 14707000
MEMORY[TANK]~MEMORY[TANK]&0[26:26:7]&0[19:47:1];% 14708000
GO TO INITIATE;% 14709000
$ SET OMIT = NOT(DATACOM ) 14709099
:: 14709300
ROTATE: TANK~P(.TANK,LOD).[33:15];% 14710000
STREAM(T~M[TANK],N~ROW-1,D~TANK);% 14711000
BEGIN SI~D; SI~SI+8; DS~N WDS; SI~LOC T; DS~WDS END;% 14712000
IF M[TANK].[3:5]=16 THEN 14712100
IF M[TANK].[24:1] THEN 14712200
IF (I~P(M[TANK-3],14,COC))!0 THEN 14712300
BEGIN 14712350
PHYL ~ TANK INX M; 14712400
FOR LOC ~ ROW-1 STEP -1 UNTIL 0 DO 14712450
BEGIN 14712500
INFO ~ NFLAG(PHYL[LOC]); %[19:2]=0 THEN I/O IN-PROCESS 14712510
IF (B~M[INFO INX NOT(2+(INFO.[19:2]=0))])!0 THEN 14712550
BEGIN 14712600
$ SET OMIT = NOT(DATACOM ) 14712649
IF (I~I-1) { 0 THEN 14712750
LOC ~ -1; 14712800
END; 14712850
END; 14712900
END; 14712950
GO TO INITIATE;% 14713000
END COM11;% 14714000
$ SET OMIT = NOT(DATACOM ) 14715000
PROCEDURE DISPLAY(X); VALUE X; REAL X;% 14719000
BEGIN REAL T; 14720000
STREAM(X:J~JARROW[P1MIX],P1MIX,% 14721000
Y ~T~SPACE(25));% 14722000
BEGIN DS ~ LIT "#";% 14723000
2(DS ~ J; SI ~ SI+1; DS ~ 7 CHR; J ~ SI;% 14724000
L: SI ~ SI-1;% 14725000
IF SC = " " THEN% 14726000
BEGIN DI ~ DI-1; GO TO L END;% 14727000
DS ~ LIT "/";);% 14728000
DI ~ DI-1; DS ~ LIT "=";% 14729000
SI~LOC P1MIX; DS~2DEC; P1MIX~DI; DI~DI-2; 14730000
DS~FILL; DI~P1MIX; DS~2LIT": "; 14730500
SI ~ X;% 14731000
H: 4(40(IF SC="~" THEN JUMP OUT 2 TO HH; 14732000
DS~CHR)); HH: 14733000
J ~ DI; DI ~ DI+8; SI~J;% 14734000
S: SI ~ SI-1; IF SC = " " THEN GO TO S;% 14735000
SI ~ SI+1; J ~ SI; DI ~ J; DS ~ LIT "~";% 14736000
X~ DI; 14737000
END; 14738000
X~ (((X~P) INX 0) -T)|8+X.[30:31]-1; 14739000
SPOUT(P(X,T)); 14740000
END;% 14741000
PROCEDURE COM13 ;% 15060000
BEGIN% 15061000
% COBOL IO INTERFACE COMMUNICATE% 15062000
REAL CODE = -4, REEL = -6 ;% 15063000
NAME FLOC = -5 ;% 15064000
ARRAY FIB [*];% 15065000
REAL T, COB68; 15066000
LABEL L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,L12,L13,L14,L15,% 15067000
L15,L17;% 15068000
SWITCH TYPE ~ L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10,L11,% 15069000
L12,L13,L14,L15,L16,L17;% 15070000
DEFINE INOUT=FIB[13].[27:1]#,DIREC=FIB[13].[25:1]#,% 15071000
SORTFILE=FIB[14].[7:1]#,LABELSOMITTED=FIB[4].[2:1]#;% 15072000
COB68 ~ (FIB ~ *(FLOC)).[8:10] = 22; 15073000
GO TO TYPE[CODE];% 15074000
L0:% 15075000
DO UNTIL FALSE;% 15076000
L1:% 15077000
L2:% 15078000
L3:% 15079000
INOUT~CODE!3; DIREC~ CODE=2;% 15080000
IF NOT COB68 THEN 15080900
IF FIB[5].[46:2]=3 THEN BEGIN% 15081000
FIB[18].[18:15]~FIB[18].[3:15];% 15082000
IF CODE=3 THEN 15082100
FIB[18].[3:15]~FIB[18].[33:15]+FIB[18].[3:15]; END;% 15083000
NT1:=FLOC INX 3; 15084000
P(0,STF,PRT[P1MIX,8],STS); 15085000
FILEOPEN(1,NT1); 15086000
L16:% 15088000
L17:% 15089000
DO UNTIL FALSE;% 15090000
L5: L6:L7:L8:L9:L10:L11:L12:L13:L14:L15:% 15091000
DO UNTIL FALSE;% 15092000
L4:% 15093000
CODE ~ IF (CODE~ABS(REEL))=0 THEN 6 ELSE% 15094000
(IF CODE=1 THEN 7 ELSE% 15095000
(IF CODE=2 THEN 10 ELSE% 15096000
(IF CODE=4 THEN @22 ELSE %KRUNCH 15097000
(IF CODE=64 THEN @52 ELSE 0)))); %KRUNCH 15097500
IF (T~FIB[4].[8:4])!2 AND T!4 AND T!8 THEN CODE~0;% 15098000
IF T=4 AND CODE=0 THEN CODE~10 ;% 15099000
FILECLOSE(( FLOC INX 3 )& CODE[18:33:15]);% 15100000
IF CODE=0 OR CODE=10 OR CODE=@22 THEN FIB[5].[42:1]~1 15101000
ELSE FIB[5].[40:2]~(CODE=7)|2+1;% 15102000
IF NOT COB68 THEN 15102900
IF FIB[5].[46:2]=3 THEN BEGIN% 15103000
FIB[18].[3:15]~FIB[18].[18:15];FIB[18].[18:15]~0 END;% 15104000
GO TO INITIATE;% 15105000
END COM13;% 15106000
PROCEDURE REELCHANGER(U); 15110000
VALUE U; REAL U; 15110100
% 15110200
% THE PURPOSE OF THIS ROUTINE IS TO ALLOW REEL CHANGE FOR 15110300
% OUTPUT TAPE FILES BY OPERATOR REQUEST. THIS ROUTINE IS 15110400
% INITIATED FROM THE SPO WITH A KEYBOARD INPUT REQUEST OF 15110500
% "RC" FOLLOWED BY A THREE CHARACTER TAPE UNIT IDENTIFIER. 15110600
% 15110700
% IF THE WRITEPARITYREELSWITCH ROUTINE IS RUNNING 15110800
% CONCURRENTLY WHEN THE "RC" MESSAGE IS RECEIVED, 15110900
% THEN THIS ROUTINE WILL ABORT. OTHERWISE IT WILL 15111000
% CALL WRITEPARITYREELSWITCH IN ORDER TO AFFECT THE 15111100
% NECESSARY REEL CHANGE. 15111200
% 15111300
% THE PARAMETER IS USED AS FOLLOWS: 15111400
% U THE LOGICAL UNIT NUMBER OF THE TAPE UNIT TO SWITCH 15111500
% 15111600
BEGIN 15111700
REAL RCW=+0, MKSW=-2; 15111800
REAL MIX,TOPIOD,T2; 15111900
% 15112000
% THE LOCAL VARIABLES ARE USED AS FOLLOWS: 15112100
% REALS 15112200
% MIX MIX INDEX OF JOB USING TAPE UNIT U 15112300
% TOPIOD LOCATION OF TOP I/O DESCRIPTOR IN TANK 15112400
% T2 TEMPORARY 15112500
% 15112600
LABEL RESETJAR,ERROROUT,EXIT; 15112700
$ SET OMIT = NOT(PACKETS) 15112800
DEFINE UNITNO = PSEUDOMIX[MIX]#; 15112900
$ POP OMIT 15113000
MIX ~ RDCTABLE[U].[8:6]; 15113100
TOPIOD ~ PRNTABLE[U].[15:15]; 15113200
IF (MIX=0) OR (TOPIOD=0) OR TERMSET(MIX) THEN GO ERROROUT; 15113300
JAR[MIX,9] ~ (*P(DUP)) & 1[1:47:1]; 15113400
IF JAR[MIX,9].SYSJOBF = LIBMAINCODE THEN 15113500
BEGIN 15113700
STREAM(A~TINU[U], T~T2~SPACE(4)); 15113800
BEGIN 15113900
DS ~ 23 LIT"#REEL CHANGE MARKED ON "; 15114000
SI ~ LOC A; SI ~ SI+5; DS ~ 3 CHR; DS ~ LIT"~"; 15114100
END; 15114200
SPOUTER(T2,UNITNO,1); 15114300
GO EXIT; 15114400
END; 15114500
IF NOTERMSET(MIX) THEN PRTROW[MIX].[PSF] ~ 2; 15114600
COMPLEXSLEEP(NOT(STOPSET(MIX)) AND UNIT[U].[FF]=@77777); 15114700
% IF UNIT NOT ASSIGNED AT THIS POINT THEN 15114800
% WRITEPARITYREELSWITCH HAS ALREADY BEEN RUN. 15114900
IF RDCTABLE[U].[8:6]=0 OR TERMSET(MIX) THEN GO RESETJAR; 15115000
T2~NFLAG(M[TOPIOD])&TINU[U][3:3:5]; 15115100
P(WRITEPARITYREELSWITCH(T2,1),DEL); 15115200
RESETJAR: 15115300
IF NOTERMSET(MIX) THEN JAR[MIX,9] ~ (*P(DUP)) & 0[1:47:1]; 15115400
GO EXIT; 15115500
ERROROUT: 15115600
STREAM(T~T2~SPACE(3)); 15115700
DS ~ 21 LIT"#REEL CHANGE ABORTED~"; 15115800
SPOUTER(T2,UNITNO,1); 15115900
EXIT: 15116000
KILL([MKSW]); 15116100
END REELCHANGER; 15116200
BOOLEAN PROCEDURE CONQUER(C,N,L,S,G); 15168000
VALUE C,N,L,S,G; 15168100
REAL C,N,L; ARRAY S[*]; 15169000
INTEGER G; 15169100
BEGIN ARRAY B=C[*];% 15170000
REAL T,I=T;% 15171000
LABEL X;% 15172000
IF G THEN 15172500
IF N|L > 512 THEN GO TO X;% 15173000
IF (T ~ GETSPACE(N|L,2,3)) = 0 THEN% 15174000
BEGIN IF NOT G THEN P(0,RTN); 15175000
X: IF NOT N THEN 15175900
BEGIN G~CONQUER(C,N~N DIV 2,L,N INX S,1); 15176000
G~CONQUER(S INX N,N,L,X,1); 15177000
P(1,RTN); 15177800
P(XIT);% 15178000
END;% 15179000
T ~ GETSPACE(L,2,1);% 15180000
END;% 15181000
B ~ [M[T+2]]&L[8:38:10]&C[18:33:15];% 15182000
N ~ N-1;% 15183000
FOR I ~ 0 STEP 1 UNTIL N DO% 15184000
BEGIN S[I] ~ B;% 15185000
B ~ L INX B;% 15186000
END;% 15187000
CONQUER~1; 15187500
END;% 15188000
BOOLEAN PROCEDURE PRTGAMES(BUFF,MIX); VALUE BUFF,MIX; REAL BUFF,MIX; 15400000
COMMENT PRTGAMES IS THE BUSINESS END OF "IN" OR "OT" MESSAGES; 15401000
BEGIN REAL NX,INDEX,DATA; 15402000
$ SET OMIT = NOT(PACKETS) 15402499
DEFINE UNITNO = PSEUDOMIX[MIX]#; 15402500
$ POP OMIT 15402501
LABEL ECH, X;;; 15403000
STREAM(BUFF,G~MIX=63,F~BUFF<0,D~[DATA],I~[INDEX]);% %844-15404000
BEGIN SI~BUFF; 15405000
L: IF SC=" " THEN BEGIN SI~SI+1; GO L END; 15406000
G(IF SC!" " THEN IF SC!"~" THEN IF SC!"=" THEN %844-15406100
BEGIN TALLY~TALLY+1; SI~SI+1 END); %844-15406200
4(IF SC!" " THEN IF SC!"~" THEN IF SC!"=" THEN 15407000
BEGIN TALLY~TALLY+1; SI~SI+1; END); 15408000
I~TALLY; DI~DI+8; DI~DI-I; SI~SI-I; DS~I CHR; 15409000
F( 15410000
M: IF SC=" " THEN BEGIN SI~SI+1; GO M END; 15411000
IF SC!"=" THEN BEGIN E:DI~DI-1;DS~LIT""";JUMP OUT END; 15412000
SI~SI+1; 15413000
N: IF SC=" " THEN BEGIN SI~SI+1; GO N END; TALLY~0; 15414000
8(IF SC}"0" THEN BEGIN TALLY~TALLY+1; SI~SI+1 END 15415000
ELSE JUMP OUT); IF SC!" " THEN IF SC!"~" THEN GO E; 15416000
I~TALLY; DI~D; SI~SI-1; DS~I OCT); 15417000
END; IF M[X!63 THEN BEGIN % NOT ABSOLUTE CORE ADDRESS %844-15418000
IF (INDEX AND NOT @1070707)!0 THEN GO ECH; %844-15418500
IF JARROW[MIX]=0 THEN GO ECH; 15419000
IF (NX~INDEX.[45:3]&INDEX[42:39:3]&INDEX[39:33:3]&INDEX[38:29:115420000
]){20 THEN GO ECH; 15421000
IF (PRTROW[MIX] INX NX)>M[PRT[MIX,10].MOM-3].[CF] THEN GO ECH; 15422000
IF BUFF<0 THEN 15423000
IF P(PRT[MIX,NX],TOP,XCH,DEL) THEN PRT[MIX,NX]~DATA ELSE 15424000
GO ECH ELSE 15425000
BEGIN; STREAM(J~JARROW[MIX],MIX,INDEX,R~[PRT[MIX,NX]], 15426000
D~ DATA~ BUFF.[15:15]-1); 15427000
BEGIN SI~J; SI~SI+1; DS~LIT" ";% %WF 15428000
DS~7 CHR; DS~LIT"/"; SI~SI+1;% %WF 15428100
DS~7CHR; DS~LIT"="; SI~LOC MIX; DS~2DEC; 15429000
MIX~DI; DI~DI-2; DS~FILL; DI~MIX; 15429500
DS~3LIT":R+"; SI~SI+4; DS~4 CHR; D~DI; DI~DI-4; 15430000
DS~3 FILL; DI~D; DS~LIT"="; SI~R; 15431000
IF SB THEN % DESCRIPTOR:TYPE OCTAL 15432000
16(DS~3 RESET; 3(IF SB THEN DS~SET ELSE DS~ 15433000
RESET; SKIP SB)) ELSE 15434000
DS~8 DEC; 15435000
DS~LIT"~"; DI~D; DI~DI+1; DS~7 FILL; 15436000
END; 15437000
SPOUTER(DATA INX M[BUFF.[15:15]-2],UNITNO,1); 15437100
END; % %844-15438000
END ELSE BEGIN % ABSOLUTE CORE ADDRESS OUTPUT REQUIRED %844-15438010
IF (INDEX AND NOT @707070707)!0 THEN GO ECH ELSE %844-15438020
BEGIN % %844-15438030
NX~INDEX.[45:3]&INDEX[42:39:3]&INDEX[39:33:3] %844-15438040
&INDEX[36:27:3]&INDEX[33:21:3];% %844-15438050
STREAM(INDEX,R~NX,D~DATA~BUFF.[15:15]-1);% %844-15438060
BEGIN DS~15 LIT" CORE LOCATION "; SI~LOC INDEX;% %844-15438070
SI~SI+3; DS~5 CHR; D~DI; DI~DI-5; DS~4 FILL;% 15438080
DI~D; DS~LIT"="; SI~R;% %844-15438090
16(DS~3 RESET; 3(IF SB THEN DS~SET ELSE %844-15438105
DS~RESET; SKIP SB)); %844-15438120
DS~LIT"~"; DS~D; DI~DI+1; DS~15 FILL; %844-15438130
END;% %844-15438140
SPOUT(DATA INX M[BUFF.[15:15]-2]);% %844-15438150
END % %844-15438160
END; GO X; % %844-15438170
ECH: PRTGAMES~1; 15439000
X: END; 15440000
$ SET OMIT = NOT(DCLOG AND DATACOM ) 15440999
PROCEDURE WHATMCP(BUFF); REAL BUFF; % FORMATS WM MESSAGE 15500000
BEGIN REAL X; 15501000
DEFINE BUFFSIZE=36#; % INCREASE THIS WITH MORE OPTIONS 15501100
X:=(BUFF:=SPACE(BUFFSIZE+30))+BUFFSIZE; 15501200
DISKWAIT(-X,30,MCPNAMESEG); 15501300
STREAM(ML:=MARKLEVEL,PL:=PATCHLEVEL,LL:=LOCALLEVEL 15501500
,N:=X+20+2|SYSNO,A:=BUFF); 15501600
BEGIN DS~LIT" "; SI~N; SI~SI+1; DS~7 CHR; DS~LIT"/"; 15502000
SI~SI+1; DS~7 CHR; DS~6 LIT" MARK "; 15502100
SI:=LOC ML; IF SC GEQ " " THEN; 15502200
8(IF TOGGLE THEN IF SC="0" THEN SI:=SI+1 ELSE DS:=CHR 15502300
ELSE DS:=CHR); DS:=LIT"."; 15502400
SI:=LOC PL; IF SC GEQ " " THEN; 15502500
6(IF TOGGLE THEN IF SC="0" THEN SI:=SI+1 ELSE DS:=CHR 15502600
ELSE DS:=CHR); DS:=2CHR; 15502700
SI:=LOC LL; IF SC GEQ " " THEN; 15502800
8(IF TOGGLE THEN IF SC="0" THEN SI:=SI+1 ELSE DS:=CHR 15502900
ELSE DS:=CHR); 15503000
DS ~ 10 LIT " INCLUDES ";% 15504000
$ SET OMIT = NOT(AUTODUMP) 15504999
DS ~ 9 LIT "AUTODUMP,"; 15505000
$ POP OMIT 15505001
$ SET OMIT = NOT(AUXMEM) 15505499
$ SET OMIT = NOT(BREAKOUT) 15505999
$ SET OMIT = NOT(B6500LOAD) 15506499
$ SET OMIT = NOT(CHECKLINK OR DEBUGGING) 15506999
$ SET OMIT = NOT(DATACOM) 15507499
$ SET OMIT = NOT(DCLOG AND DATACOM) 15507999
$ SET OMIT = NOT(DCSPO AND DATACOM) 15508499
$ SET OMIT = NOT(DEBUGGING) 15508999
$ SET OMIT = NOT(DFX) 15509499
$ SET OMIT = NOT(DISKLOG) 15509999
$ SET OMIT = NOT(DKBNODFX) 15510499
$ SET OMIT = NOT(DUMP OR DEBUGGING) 15510999
DS ~ 5 LIT "DUMP,"; 15511000
$ POP OMIT 15511001
$ SET OMIT = NOT(MONITOR) 15511499
$ SET OMIT = NOT(NEWLOGGING) 15511999
$ SET OMIT = NOT(PACKETS) 15512499
DS ~ 8 LIT "PACKETS,"; 15512500
$ POP OMIT 15512501
$ SET OMIT = NOT(RJE AND DATACOM) 15512999
$ SET OMIT = NOT(SAVERESULTS) 15513499
$ SET OMIT = NOT(SEPTICTANK) 15513999
$ SET OMIT = NOT(SHAREDISK) 15514499
$ SET OMIT = NOT(STATISTICS) 15514999
$ SET OMIT = NOT(WORKSET) 15515499
DS ~ 8 LIT "WORKSET,"; 15515500
$ POP OMIT 15515501
$ SET OMIT = NOT(WORKSETMONITOR) 15515999
DS ~ 15 LIT "WORKSETMONITOR,"; 15516000
$ POP OMIT 15516001
DI ~ DI-1; 15523000
A~ DI; 15524000
SI~ A; DI~ A; 15525000
IF SC!"," THEN 15526000
DI~ DI- 9; 15527000
DS~ LIT "~" 15528000
END; 15529000
IF M[3].[1:1] THEN % CM HAS BEEN DONE 15530000
BEGIN DISKWAIT(-X,30,0); 15530100
STREAM(N~X+10+5|SYSNO,BUFF); 15530200
BEGIN SI~BUFF; SI~SI+16; 15530300
L: IF SC NEQ "~" THEN BEGIN SI~SI+1; GO L; END; 15530400
BUFF~SI; DI~BUFF; 15530500
DS~18 LIT"-NEXT MCP WILL BE "; 15530600
SI~N; SI~SI+1; DS~7 CHR; DS~LIT"/"; 15530700
SI~SI+1; DS~7 CHR; DS~LIT"~"; 15530800
END; END; 15530900
END WHATMCP; 15533000
PROCEDURE WHATINTRINSIC(BUFF); VALUE BUFF; REAL BUFF; 15534000
BEGIN 15535000
REAL SIZE,LOC,INTWORD,WI,I; 15536000
LABEL EXIT; 15537000
IF INTSIZE=0 THEN 15539000
BEGIN ; 15540000
STREAM(BUFF); DS~14 LIT "NO INTRINSICS~"; 15541000
GO EXIT; 15542000
END; 15543000
COMMENT MAKE WI INTRINSIC PRESENT; 15544000
SIZE := (INTWORD:=INTRNSC[INTRNSC[0]]) INX 0; 15545000
LOC := SPACE(SIZE); 15546000
$ SET OMIT = NOT(AUXMEM) 15547000
DISKWAIT(-LOC,SIZE,INTWORD.[6:27]); 15548000
DISKWAIT(-(I:=SPACE(30)),30,0); 15549000
STREAM(X:=I+13+5|SYSNO,LOK:=LOC,BUFF); 15550000
BEGIN 15551000
SI:=LOK; SI:=SI+8; 15552000
10(SI:=SI+1; 15552100
7(IF SC="~" THEN JUMP OUT 2 TO L1; 15552200
IF SC="@" THEN SI:=SI+1 ELSE DS:=CHR)); 15552300
L1: SI:=X;DS:=3LIT" ("; 15552400
SI:=SI+1; DS:=7 CHR;DS:=LIT"/"; 15552500
SI:=SI+1; DS:=7 CHR;DS:=2LIT")~"; 15552600
END STREAM; 15552700
FORGETSPACE(LOC); FORGETSPACE(I); 15552800
EXIT: 15554000
END WHATINTRNSIC; 15555000
PROCEDURE COREPRINT(Q); VALUE Q; REAL Q; 15600000
COMMENT : THIS PROCEDURE COMPUTES AND TYPES THE AMOUNTS OF SAVE 15600050
AND OVERLAYABLE CORE IN USE FOR A GIVEN MIX OR ALL MIXES; 15600100
COMMENT : Q.[1:1] = 1 IF ALL MIXES DESIRED 15600120
Q.[CF] = MIX, Q.[9:9] = REMOTE TU/BU; 15600140
BEGIN REAL LINK,SIZE,D;% 15600300
ARRAY C[*]; 15600400
INTEGER A,N; 15600500
LABEL NXT; 15600600
C ~ [M[SPACE(MIXMAX+1)]] & (MIXMAX+1) [8:38:10]; 15600800
FOR A ~ 0 STEP 1 UNTIL MIXMAX DO C[A] ~ 0;% 15600950
C[0].[FF] ~ A ~ MSTART;% 15601000
WHILE A!0 DO % STEP THROUGH MEMORY LINKS 15601150
BEGIN IF (LINK ~ M[A]).[1:1] THEN GO TO NXT; 15601200
SIZE ~ LINK.[CF] - A; 15601400
IF LINK.[2:1] THEN SIZE ~ 0 & SIZE [CTF];% SAVE 15601500
C[LINK.[9:6]] ~ (*P*DUP)) + SIZE;% 15601600
NXT: A ~ LINK.[CF];% 15602200
END;% 15602300
A ~ -1; WHILE (A~A+1) { MIXMAX DO% 15602400
BEGIN IF Q.[1:1] OR Q.[CF] = A THEN IF C[A] ! 0 THEN 15602500
BEGIN; STREAM(N~N~C[A].[FF],D~[SIZE]);% 15602600
BEGIN SI ~ LOC N; DS ~ 8 DEC; END;% 15602620
STREAM(N~N~C[A].[CF],D~[LINK]);% 15602640
BEGIN SI ~ LOC N; DS ~ 8 DEC; END;% 15602660
JOBMESS(A,Q,":SAVE=",SIZE," OLAY=",LINK);% 15602680
END;% 15602690
END;% 15602700
IF Q.[1:1] THEN% DO TOTAL 15603900
BEGIN P(C[0]); 15604000
FOR A~1 STEP 1 UNTIL MIXMAX DO P(C[A],ADD);% 15604100
N ~ P; N ~ N.[FF] + N.[CF];% 15604200
STREAM(N,D~D~SPACE(4));% 15604250
BEGIN SI ~ LOC N; DS ~ 18 LIT "TOTAL MEM IN USE= "; 15604275
DS ~ 5 DEC; DS ~ LIT "~"; 15604300
DI ~ DI = 6; DS ~ 4 FILL;% 15604400
END STREAM; 15604500
SPOUT(D & Q[9:9:9]);% 15604600
END; 15604700
FORGETSPACE(C INX 0); 15604800
END COREPRINT; 15604900
$ SET OMIT = NOT(AUXMEM) 15604999
PROCEDURE LOGCOMMENT (Q); VALUE Q; REAL Q; 15610000
BEGIN 15611000
REAL I,J,K,L; 15612000
ARRAY LOG[*]; 15613000
L ~ SPACE(72); 15614000
STREAM (Q:D~L+5); 15615000
BEGIN SI ~ Q; 15616000
L: IF SC!"~" THEN BEGIN DS ~ CHR; GO TO L; END; 15617000
5(DS ~ 8 LIT " "); DI ~ DI-32; Q ~ DI; 15618000
END; 15619000
I ~ P.[33:15]; LOG ~ [M[L]] & (I=L+4)[8:38:10]; 15620000
LOG[3] ~ I ~ I-L-5; % NUMBER OF WORDS IN COMMENT 15621000
WHILE (J:=XCLOCK+P(RTR)) GEQ WITCHINGHOUR DO MIDNIGHT; 15622000
LOG[2] ~ DATE.[18:30]; 15623000
LOG[1] ~ J; 15624000
LOG[0] ~ 99; 15625000
LOGSPACE([LOG[0]],I+9); 15626000
FORGETSPACE(LOG); 15627000
END; 15628000
REAL PROCEDURE KEYINSCAN(KTR,MIX); REAL KTR,MIX; 16034900
BEGIN 16035000
REAL TYPE=+1, TBLADDR; 16035100
% SCANS IN PUT BUFFER FROM SPO 16035200
% RETURNS ERROR FLAG IN MIX.[1:3] ... 16035300
% MIX.[1:1]=FLAG FOR EMPTY BUFFER (GROUP MARK ONLY) 16035400
% MIX.[2:1]=FLAG FOR NO INFO AFTER MIX INDEX 16035500
% MIX.[3:1]=FLAG FOR QMARK (CC) INPUT AS FIRST CHARACTER 16035600
% KTR IS INITIALLY THE ADDRESS OF SPO INPUT BUFFER 16035700
% KTR IS ASSIGNED NEXT CHARACTER LOCATION AFTER SCAN 16035800
% TYPE.[CF] IS ASSIGNED TABLE LOCATION (MIXMSG OR INFOMSG) 16035900
% TYPE.[1:5] IS ASSIGNED PROCEDURE NUMBER 16036000
% TYPE.[6:6] IS ASSIGNED MIXCODE 16036100
STREAM(MIX:=63, BUFF:=KTR :); % SCAN INPUT BUFFER 16036200
BEGIN 16036300
SI:=BUFF; 16036400
DI:=BUFF; DI:=DI-1; DS:=LIT"<"; % BACKSPACE CHARACTER 16036500
8(60(IF SC="~" THEN % END OF INPUT STRING 16036600
BEGIN 16036700
DS:=CHR; JUMP OUT 2 TO L; 16036800
END; 16036900
IF SC="<" THEN % BACK SPACE CHARACTER 16037000
BEGIN 16037100
DI:=DI-1; IF SC NEQ DC THEN DI:=DI-1; 16037200
END 16037300
ELSE DS:=CHR)); % END OF BACKSPACE CHECK 16037400
L: SI:=BUFF; DI:=LOC MIX; % CHECK FOR MIX INDEX 16037500
L1: IF SC=" " THEN 16037600
BEGIN 16037700
SI:=SI+1; GO TO L1; 16037800
END; 16037900
IF SC="~" THEN % EMPTY BUFFER 16038000
BEGIN 16038100
SKIP DB; DS:=SET; GO TO XXIT; % MIX.[1:1]=EMPTY BUFFER FLAG 16038200
END; 16038300
IF SC LSS "0" THEN GO TO XXIT; % NO MIX INDEX, SET "MIX"=63 16038400
IF SC GTR "9" THEN % QUESTION MARK, SET MIX.[3:1] 16038500
BEGIN 16038600
SI:=SI+1; SKIP 3DB; DS:=SET; GO TO XXIT; % MIX.[3:1]=QMARK FLAG16038700
END; 16038800
SI:=SI+1; IF SC LSS "0" THEN GO TO ONE; 16038900
IF SC LEQ "9" THEN 16039000
BEGIN 16039100
SI:=SI-1; DS:=2OCT; 16039200
END 16039300
ELSE 16039400
BEGIN 16039500
ONE: SI:=SI-1; DS:=OCT; 16039600
END; 16039700
L2: IF SC=" " THEN % SCAN TO NEXT VISIBLE CHARACTER 16039800
BEGIN 16039900
SI:=SI+1; GO TO L2; 16040000
END; 16040100
IF SC="~" THEN % NO INFORMATION AFTER MIX INDEX 16040200
BEGIN 16040300
DI:=LOC MIX; SKIP 2DB; DS:=SET; % MIX.[2:1]=ERROR FLAG 16040400
END; 16040500
XXIT: DI:=BUFF; DI:=DI-8; DS:=8LIT"INV KBD "; 16040600
BUFF:=SI; % SAVE LOCATION OF NEXT CHARACTER IN BUFFER 16040700
END STREAM; 16040800
IF P([KTR],STD,[MIX],SND).[1:3]=0 THEN % NOT QMARK,EMPTY OR ERROR 16040900
BEGIN 16041000
TBLADDR:=TYPE:=SPACE(KEYMSGSZ); 16041100
DISKWAIT(-TYPE,KEYMSGSZ,MESSAGETABLE[2].[22:26]); 16041110
STREAM(TBBL:=TYPE, BUFF:=KTR : TOG:=(MIX NEQ 63)); 16041200
BEGIN 16041300
SI:=TBBL; SI:=SI+1; DI:=BUFF; DI:=DI+2; 16041400
NEXT: CI:=CI+TOG; GO TO NOMIX; 16041500
MIX: IF SC GEQ 1 THEN GO TO OK ELSE % MIX SPECIFIED 16041550
BEGIN % BUT THIS IS NOT 16041600
SI:=SI+8; GO TO MIX; % A MIX MESSAGE. 16041650
END; 16041700
NOMIX: IF SC GTR 1 THEN % MIX NOT SPECIFIED 16041750
BEGIN % BUT THIS IS A 16041800
SI:=SI+8; GO TO NOMIX; % MIX MESSAGE. 16041850
END; 16041900
OK: SI:=SI+1; DI:=DI-2; 16042000
IF SC="~" THEN % END OF TABLE 16042100
BEGIN 16042200
TBBL:=TALLY; GO TO XT; 16042300
END; 16042400
IF 2 SC!DC THEN % NOT MATCHING ENTRY 16042450
BEGIN 16042500
SI:=SI+5; GO TO NEXT; 16042550
END; 16042600
TOG:=DI; DI:=LOC TBBL; SI:=SI+2; DS:=2 OCT; % SWITCH VALUE 16042650
SI:=SI-4; DI:=LOC TBBL; DS:=2CHR; % PROCED & MIXCODE 16042700
SI:=TOG; 16042800
L: IF SC=" " THEN 16042900
BEGIN 16043000
SI:=SI+1; GO TO L; 16043100
END; 16043200
BUFF:=SI; 16043300
XT: END STREAM STATEMENT; 16043400
P( [KTR],STD, .TYPE,STD); 16043500
FORGETSPACE(TBLADDR); 16043550
END % IF NOT QMARK, EMPTY OR ERROR 16043600
ELSE % QMARK, EMPTY OR ERROR 16043620
IF MIX.[3:1] THEN % QMARK 16043640
BEGIN MIX:=63; 16043660
TYPE:=VCC&@104[1:37:11]; 16043680
END 16043700
ELSE TYPE:=0; 16043750
END PROCEDURE KEYINSCAN; 16043800
PROCEDURE KEYIN0(B,KTRX); VALUE B,KTRX; REAL B,KTRX; 16044000
16045000
BEGIN 16046000
INTEGER ZZSTA; 16047000
REAL BUFF, KTR, TYPE, MIX, A, I, J, K; 16048000
REAL U = A; 16048100
ARRAY BUFA = BUFF[*]; 16049000
16050000
16051000
16052000
LABEL DSM, CUTY, FORGET, ERROR, EXIT 16053000
,AX ,IL ,QT ,OU ,WY ,RY ,DS ,TF ,RM ,DP 16054000
,DD ,ST ,CM ,SV ,CL ,BK ,TI ,PR ,RO ,IT 16055000
,WI ,RXIT ,RC 16056000
16057000
16058000
16059000
; 16060000
SWITCH S:= ERROR 16061000
,AX ,IL ,IL ,QT ,OU ,WY ,RY ,DS ,DS ,TF 16062000
,TF ,RM ,DP ,DD ,DD ,DD ,ST ,CM ,SV ,CL 16063000
,BK ,RXIT ,RY ,RXIT ,RXIT ,RI ,PR ,RO ,RO ,IT 16064000
,WI ,RXIT ,RC 16065000
16066000
16067000
16068000
; 16069000
SUBROUTINE SPOIT; M[BUFF-1]:=B AND @7570000000000; 16070000
16071000
BUFF :=KTRX.[15:15]; 16072000
MIX :=KTRX.[ 9:6 ]; 16073000
TYPE :=KTRX.[ 2:7 ]; 16074000
KTR :=KTRX.[15:33]; 16075000
ZZSTA :=0 & (M[BUFF-2])[9:9:9]; 16076000
GO TO S[TYPE]; 16077000
AX: 16078000
I := BUFF; 16079000
GO TO RXIT; 16080000
IL: 16081000
IF (I:=ANVIL(TYPE=2,KTR)) GTR PSEUDOMAXT THEN % IL=2, UL=3 16082000
IF I LSS 70 THEN GO TO ERROR; 16083000
TYPE := 2; % IL 16084000
IF I GTR PSEUDOMAXT THE BUFF:=1; 16085000
GO TO RXIT; 16086000
OU: 16087000
STREAM(A:="LP" : B:="MT", C:="DK", D:="CP", KTR); 16088000
BEGIN 16089000
SI := KTR; 16090000
DI := LOC A; DI := DI+6; 16091000
TALLY:=1; IF SC="~" THEN GO TO XT; 16092000
TALLY:=2; IF 2 SC=DC THEN GO TO XT; 16093000
TALLY:=3; SI:=SI-2; DI:=DI+14; IF 2 SC=DC THEN GO TO XT; 16094000
TALLY:=4; SI:=SI-2; DI:=DI+6; IF 2 SC=DC THEN GO TO XT; 16095000
TALLY:=5; SI:=SI-2; DI:=DI+6; IF 2 SC=DC THEN GO TO XT; 16096000
TALLY:=0; 16097000
XT: A := TALLY; 16098000
END; 16099000
IF(I:=P) = 0 THEN GO TO ERROR; 16100000
GO TO RXIT; 16101000
WY: 16102000
IF MIX LSS 63 THEN GO TO RXIT; % <MIX> WY 16103000
SPOIT; 16104000
A:=0; 16105000
FOR I:=1 STEP 1 UNTIL MIXMAX DO 16106000
IF *[JARROW[I]] NEQ 0 THEN 16107000
IF REPLY[I] LSS 0 THEN REPLY[A:=I]:=VWY; 16108000
IF A!0 THEN GO TO FORGET; 16109000
M[BUFF-1]:=FLAG(-"NULL "); 16109500
GO TO ERROR; 16110000
DS: 16111000
IF MIX=63 THEN % "DS A/B" 16112000
BEGIN 16113000
NAMEID(J,KTR); NAMEID(K,KTR); NAMEID(K,KTR); 16114000
FOR MIX:=1 STEP 1 UNTIL MIXMAX DO 16115000
IF *[JARROW[MIX]] NEQ 0 THEN 16116000
IF (J EQV ABS(JAR[MIX,0]))=(NOT 0) THEN 16117000
IF (K EQV ABS(JAR[MIX,1]))=NOT 0 THEN 16118000
BEGIN 16118100
TABCNT[MIX]:=TABCNT[MIX]+1; 16118200
GO TO DSM; 16118300
END; 16118400
GO TO ERROR; % NOT FOUND 16119000
END; % IF MIX NOT GIVEN 16120000
IF JARROW[MIX] NEQ 0 THEN 16121000
BEGIN 16122000
DSM: JAR[MIX,6].[1:1]:=((TYPE=9) OR (TYPE=20)); % DS=8,SD=9,CL=20 16123000
TERMINATE(MIX&(IF B.[9:9] GTR 0 THEN 61 ELSE 3)[CTF]); 16124000
HALT; 16125000
NOPROCESSTOG:= NOPROCESSTOG-1; 16126000
GO TO FORGET; 16127000
END; 16128000
GO TO ERROR; 16129000
TF: 16130000
IF TYPE=11 THEN SPOIT; % SF=11 16131000
CHANGEFACTOR(KTR,TYPE=10); % TF=10,SF=11 16132000
GO TO EXIT; 16133000
RM: 16134000
TYPE:=TYPE&B[9:9:9]; 16135000
GO TO RXIT; 16136000
DP: 16137000
$ SET OMIT = NOT(DEBUGGING OR DUMP) 16138000
STREAM(A:="LP", KTR : B:="MT"); 16139000
BEGIN 16140000
SI := KTR; 16141000
DI := LOC A; DI := DI + 6; TALLY:=1; 16142000
IF 2 SC=DC THEN GO TO XT; 16143000
DI := DI + 22; SI := SI - 2; TALLY:=2; 16144000
IF 2 SC=DC THEN GO TO XT; 16145000
TALLY:=0; 16146000
XT: A := TALLY; KTR := SI; 16147000
END STREAM STATEMENT; 16148000
IF (A:=P([KTR],STD))=0 THEN GO TO ERROR; 16149000
IF A=1 THEN 16150000
$ SET OMIT = DEBUGGING %763-16150099
GO TO ERROR; %763-16150100
$ POP OMIT %763-16150101
$ SET OMIT = NOT DEBUGGING %763-16150999
DUMPCORE(KTR&BUFF[15:33:15]); 16154000
$ POP OMIT 16154001
GO TO EXIT; 16155000
DD: 16156000
$ SET OMIT = NOT(DEBUGGING) 16157000
GO TO FORGET; 16161000
ST: 16162000
IF -REPLY[MIX] = (VWY&VOK[36:42:6]) OR JARROW[MIX]=0 THEN GO ERROR; 16163000
$ SET OMIT = NOT(WORKSET) 16163100
IF JAR[MIX,9].[3:1] THEN GO TO ERROR; % ALREADY ST-ED 16163200
$ POP OMIT % WORKSET 16163300
IF NOTERMSET(MIX) THEN PRTROW[MIX].[PSF]:=2; 16164000
GO TO FORGET; 16166000
CM: 16167000
CHANGEMCP(KTR); 16168000
GO TO EXIT; 16169000
SV: 16170000
SAVETHEUNIT(KTR); 16171000
GO FORGET; 16172000
QT: 16173000
IF MIX LSS 63 THEN % MIX INDEX SPECIFIED 16176000
CUTY: IF JAR[MIX,9].SYSJOBF = PRNPBTCODE THEN 16178000
BEGIN 16180000
REPLY[MIX]:=TYPE; 16181000
STREAM(A:=0, B:=0 : KTR); 16187000
BEGIN 16188000
SI:=KTR; 16189000
IF SC="+" THEN TALLY:=2 ELSE 16190000
IF SC="-" THEN TALLY:=3 ELSE GO XT; 16191000
B2: SI:=SI+1; IF SC=" " THEN GO TO B2; 16192000
B:=TALLY; TALLY:=0; 16193000
6(IF SC LSS "0" THEN JUMP OUT; SI:=SI+1; TALLY:=TALLY+1);16194000
KTR:=TALLY; DI:=LOC A; SI:=SI-KTR; DS:=KTR OCT; 16195000
XT: END STREAM STATEMENT; 16196000
NT2:=P; 16197000
NT1:=P; 16198000
PRT[MIX,@25]:=5&NT1[9:24:24]&NT2[1:46:2]; 16199000
GO TO FORGET; 16200000
END 16201000
ELSE GO TO ERROR; % NOT PRNPBT 16202000
CL: % MUST FOLLOW QT 16203000
IF (I:=UNITIN(TINU, KTR)) LSS 64 THEN % UNIT ] MTX 16204000
IF (MIX:=RDCTABLE[I].[8:6]) NEQ 0 THEN 16205000
BEGIN 16206000
TABCNT[MIX]:=TABCNT[MIX]+1; 16206100
IF TYPE=4 THEN GO TO QT ELSE GO TO DSM; 16206200
END; 16206300
$ SET OMIT = NOT(SHAREDISK) 16207000
IF TYPE=4 OR (I GTR 29) THEN GO TO ERROR; % QT OR PSEUDO UNIT 16215000
LABELTABLE[I] := P(DUP,LOC,SSP); % MARK IT NOT IN USE 16216000
MIX:=63; 16217000
GO TO RY; 16218000
BK: 16219000
$ SET OMIT = NOT(DATACOM AND DCSPO) 16220000
BEGIN 16223000
IF (I:= MESSAGEHOLDER.[CF]) NEQ 0 THEN 16224000
IF (J:= M[I].[FF]) NEQ 0 THEN 16225000
BEGIN 16226000
DO BEGIN 16227000
A:=M[J]; 16228000
IF (A.[4:5]=0 AND MIX=63) OR (A.[4:5]=MIX AND MIX NEQ 63) 16229000
$ SET OMIT = NOT(DATACOM AND DCSPO) 16230000
THEN 16232000
BEGIN 16233000
M[I]:= P(DUP,LOC)&A[18:18:15]; 16234000
NUMESS:= NUMESS-1; 16235000
FORGETSPACE(J+1); 16236000
END ELSE I:=J; 16237000
END UNTIL (J:= A.[FF])=0; 16238000
MESSAGEHOLDER.[FF]:= I; 16239000
END; 16240000
END; 16241000
MIX:=63; 16241500
GO TO FORGET; 16242000
RY: 16243000
IF (I:=FORMESS(KTR,TYPE=VFM)) LSS 0 THEN GO TO FORGET; 16244000
IF I GTR 31 THEN GO TO ERROR ELSE GO TO RXIT; 16245000
TI: 16246000
TIMEUSED(BUFF-1,MIX); 16247000
GO TO EXIT; 16248000
PR: 16249000
SPOIT; 16250000
CHANGEPRIORITY(KTR,MIX); 16251000
GO TO EXIT; 16252000
RO: 16253000
CHANGEOPTION(KTR,TYPE=28); % RO=28,SO=29 16254000
GO TO EXIT; 16255000
IT: 16256000
IF NOT JAR[MIX,9].[4:1] THEN GO ERROR; 16257000
JAR[MIX,9]~(*P(DUP)) & 1[5:47:1]; 16258000
GO FORGET; 16259000
WI: 16260000
WHATINTRINSIC(BUFF-1); 16261000
GO TO ERROR; 16262000
RC: 16263000
U ~ UNITIN(TINU,KTR); 16263100
IF U > 15 THEN GO ERROR; 16263200
IF (I~RDCTABLE[U].[8:6])=0 OR 16263300
PRNTABLE[U].[15:15]=0 OR NOT PRNTABLE[U].[1:1] THEN GO ERROR; 16263350
INDEPENDENTRUNNER(P(..REELCHANGER),U,204); 16263600
GO FORGET; 16263700
RXIT: 16343000
REPLY[MIX] := TYPE&I[18:33:15]; 16343100
IF I NEQ BUFF THEN 16343200
BEGIN 16343300
FORGET: 16343400
STREAM(T:=BUFF-1); DS:= LIT "~"; 16343500
ERROR: 16343600
SPOUT((BUFF-1) INX (0&ZZSTA[9:9:9])); 16343700
END; 16343800
EXIT: 16343900
IF(MIX>0)AND(MIX{MIXMAX)THEN TABCNT[MIX]~TABCNT[MIX]-1; %113-16343950
END PROCEDURE KEYIN0; 16344000
PROCEDURE KEYIN1(B,KTRX); VALUE B,KTRX; REAL B,KTRX; 16345000
16346000
BEGIN 16347000
INTEGER ZZSTA; 16348000
REAL BUFF, KTR, TYPE, MIX, A, I, J, K; 16349000
ARRAY BUFA = BUFF[*]; 16350000
16351000
16352000
16353000
LABEL FORGET, ERROR, EXIT 16354000
,BO ,LI ,SS ,BS ,SC ,VQ ,RR ,CA ,DT ,WD 16355000
,TR ,WT ,WM ,CC ,OL ,PB ,RN ,LD ,RD ,ED 16356000
,SI ,LR ,OT ,IN ,FE ,OC ,SQ ,CS ,HS ,WK 16357000
16358000
16359000
16360000
; 16361000
SWITCH S:= ERROR 16362000
,BO ,LI ,LI ,LI ,SS ,SS ,SS ,SS ,BS ,BS 16363000
,SC ,VQ ,RR ,CA ,CA ,DT ,WD ,TR ,WT ,WM 16364000
,CC ,OL ,PB ,RN ,LD ,RD ,RD ,ED ,SI ,LR 16365000
,OT ,IN ,FE ,OC ,SQ ,CS ,HS ,WK 16366000
16367000
16368000
16369000
; 16370000
SUBROUTINE SPOIT; M[BUFF-2]:=B AND @7570000000000; 16371000
16372000
BUFF :=KTRX.[15:15]; 16373000
MIX :=KTRX.[ 9:6 ]; 16374000
TYPE :=KTRX.[ 2:7 ]; 16375000
KTR :=KTRX.[15:33]; 16376000
ZZSTA :=0 & (M[BUFF-2])[9:9:9]; 16377000
GO TO S[TYPE]; 16378000
BO: 16379000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16380000
LI: 16386000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16387000
GO TO EXIT; 16390000
SS: 16391000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16392000
GO TO EXIT; 16394000
BS: 16395000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16396000
GO EXIT; 16406000
SC: 16407000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16408000
GO TO EXIT; 16410000
RR: 16411000
$ SET OMIT = NOT(DATACOM) 16412000
VQ: 16456000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16457000
GO TO EXIT; 16485000
CA: 16486000
$ SET OMIT = NOT(AUXMEM) 16487000
GO TO ERROR; % SPOUT AUX MESSAGE OR ERROR MESSAGE 16489000
DT: 16490000
SETDATE(KTR); 16491000
GO TO EXIT; 16492000
WD: 16493000
GIMEDATE(BUFF-1,1); 16494000
GO TO EXTI; 16495000
TR: 16496000
SETIMER(KTR); 16497000
GO TO EXIT; 16498000
WT: 16499000
TIMEOUT (BUFF-1); 16500000
GO TO EXIT; 16501000
WM: 16502000
FORGETSPACE(BUFF-1); 16503000
WHATMCP(BUFF); 16503100
BUFF:=BUFF+1; % FAKE OUT ERROR 16503200
GO TO ERROR; % SPOUT MESSAGE 16504000
CC: 16505000
A:=M[BUFF-3].[CF]-BUFF; % WDS IN MESSAGE 16505100
STREAM(BUFF, BL:=A>8, KTR:=(KTR:=SPACE(A+2)+2)); 16506000
BEGIN 16507000
SI:=BUFF; 16508000
BL(36(DS:=2LIT" "); DI:=KTR); 16508100
IF SC NEQ "~" THEN 16509000
BEGIN 16510000
DS:=CHR; 16511000
L: IF SC NEQ "~" THEN 16512000
BEGIN 16513000
IF SC NEQ @14 THEN DS:=CHR ELSE SI:=SI+1; 16514000
GO TO L; 16515000
END; 16516000
END; 16517000
DS:=CHR; 16518000
END; 16519000
M[KTR-4].[9:6]:=0; 16520000
IF ABS(B) GTR 1 THEN 16521000
INDEPENDENTRUNNER(P(.CONTROLCARD),KTR&30[2:42:6]&ZZSTA[9:9:9], 16522000
192) 16522100
ELSE INDEPENDENTRUNNER(P(.CONTROLCARD),KTR&25[2:42:6],192); 16523000
GO TO FORGET; 16524000
OL: 16525000
OUTPUTLABEL(KTR); 16526000
GO TO EXIT; 16527000
PB: 16528000
PRINTBACKUP(KTR&[6:9:9]); 16529000
GO TO EXIT; 16530000
RN: 16531000
SPOIT; 16532000
RUNTHEDECK(KTR); 16533000
GO TO EXIT; 16534000
LD: 16535000
STARTLOADN(KTR); 16536000
GO TO EXIT; 16537000
RD: 16538000
DECKREMOVER(KTR); 16539000
GO TO EXIT; 16540000
FD: 16541000
EXTERNALEND(KTR); 16542000
GO TO EXIT; 16543000
SI: 16544000
$ SET OMIT = NOT(STATISTICS) 16545000
GO TO ERROR; % SPOUT MESSAGE 16576000
LR: 16577000
$ SET OMIT = NOT(DCLOG AND DATACOM) 16578000
GO TO FORGET; 16580000
IN: 16580600
KTR:=-KTR; 16580800
OT: 16581000
$ SET OMIT = NOT(BREAKOUT) 16582000
IF PRTGAMES(KTR,MIX) THEN GO ERROR ELSE 16588000
IF KTR LSS 0 THEN GO FORGET ELSE GO EXIT; 16589000
FE: 16590000
J:= GETSPACE(35,9,0)+2; 16591000
STREAM(KTR:D:=J+2); 16592000
BEGIN 16593000
SI:=KTR; 16594000
4(63(IF SC NEQ "~" THEN DS:=CHR ELSE JUMP OUT 2 TO LL)); 16595000
LL: DS:=LIT"~"; DI:=DI-1; KTR:=DI; 16596000
END; 16597000
I:= P INX 0; 16598000
M[J]:= (I-J) DIV 5; 16599000
STREAM(DATE, A:=J+1); 16600000
BEGIN 16601000
SI:=LOC DATE; DS:=8 OCT; 16602000
END; 16603000
LINKUP(19,J); 16604000
GO TO FORGET; 16605000
OC: 16606000
LOGCOMMENT(KTR); 16607000
GO TO FORGET; 16608000
SQ: 16609000
STREAM(TYPE:=0:INFO1:="STOP0KN",INFO2:=@2567630000000000, 16609100
KTR); 16609200
BEGIN 16609300
SI:=KTR; DI:=LOC INFO1; DI:=DI+1; TALLY:=1; 16609400
IF 4 SC=DC THEN GO TO EXT; 16609500
SI:=SI-4; TALLY:=TALLY+1; 16609600
IF 2 SC=DC THEN GO EXT; 16609700
SI:=SI-2; TALLY:=TALLY+2; 16609800
IF 4 SC=DC THEN GO TO EXT; 16609900
TALLY:=TALLY+4; 16610000
EXT: TYPE:=TALLY; 16610100
END; 16610200
IF P(M[P(.DISKSQUASH)],TOP) THEN IF P(P.[FF] AND P,DUP)!0 THEN 16610300
P(.DISKSQUASH,STD) ELSE GO TO ERROR ELSE IF P(XCH)=8 THEN 16610400
BEGIN 16610500
INDEPENDENTRUNNER(P(.DISKSQUASH),KTR,128); 16610600
GO TO EXIT; 16610700
END ELSE GO TO ERROR; 16610800
GO TO FORGET; 16610900
HS: 16611000
$ SET OMIT = NOT SEPTICTANK 16611990
CS: 16613000
$ SET OMIT = NOT SEPTICTANK 16613990
GO TO EXIT; 16615000
WK: % WORKSET REQUESTS 16615100
$ SET OMIT = NOT(WORKSET) 16615110
WKSETVALUES(KTRX); GO TO EXIT; 16615200
$ POP OMIT % WORKSET 16615210
FORGET: 16689000
STREAM(T:=BUFF-1); DS:= LIT "~"; 16689100
ERROR: 16689200
SPOUT((BUFF-1) INX (0&ZZSTA[9:9:9])); 16689300
EXIT: 16689400
IF(MIX>0)AND(MIX{MIXMAX)THEN TABCNT[MIX]~TABCNT[MIX]-1; %113-16689450
END PROCEDURE KEYIN1; 16689500
PROCEDURE KEYIN2(KTRX); VALUE KTRX; REAL KTRX; 16690000
16690500
BEGIN 16691000
REAL RCW = + 0; 16691500
REAL MSCW=-2; 16691550
INTEGER ZZSTA = RCW + 1; 16692000
REAL BUFF = ZZSTA + 1, 16692500
KTR = BUFF + 1, 16693000
TYPE = KTR + 1, 16693500
MIX = TYPE + 1, 16694000
A = MIX + 1, 16694500
I = A + 1, 16695000
J = I + 1, 16695500
K = J + 1, 16696000
B = K + 1, 16696100
R = B + 1, 16696200
R1 = R + 1, 16696300
R2 = R1 + 1, 16696400
R3 = R2 + 1, 16696500
R4 = R3 + 1; 16696600
REAL UNITNO= R4 + 1; 16696650
INTEGER INT1 = NT1 , 16696700
INT2 = A , 16696800
INT3 = J , 16696900
INT4 = R4 ; 16697000
ARRAY BUFA = BUFF[*] , 16697100
UT = R3[*] 16697200
$ SET OMIT = NOT SHAREDISK 16697300
; 16697600
$ SET OMIT = SHAREDISK 16697700
DEFINE U = AVTABLE# ; 16697800
$ POP OMIT 16697900
REAL HN1 = MIX , 16698000
HN2 = TYPE ; 16698100
REAL SEG = I, 16698200
ADR = J, 16698210
LOCN = K, 16698220
HALTED= R1; 16698230
NAME SEGDICT = R3; 16698240
LABEL RR, PGA, FERGIT, FORGET, ERROR, EXIT 16698500
,WU ,WP ,WR ,MX ,TS ,LF ,LC ,LS ,EX ,PD 16699000
,SM ,PO ,PG ,AU ,MS ,LN ,CD ,CU ,SY ,SL 16699500
,RW ,CI ,CT ,XD ,MC ,RS ,HD ,RA ,EI %139-16700000
16700500
16701000
16701500
; 16702000
SWITCH S := ERROR 16702500
,WU ,WP ,WR ,MX ,TS ,TS ,TS ,TS ,LF ,LC 16703000
,LX ,EX ,PD ,SM ,PO ,PO ,PG ,AU ,MS ,LN 16703500
,CD ,CD ,CD ,CU ,SY ,SL ,RW ,CI ,CT ,CT 16704000
,CT ,XD ,XD ,MC ,RS ,HD ,RA ,EI %139-16704500
16705000
16705500
16706000
16706500
; 16707000
16707500
SUBROUTINE SPOIT; M[BUFF-2]:=B AND @7570000000000; 16708000
16708500
P(0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 16710000
P(0, 0, 0, 0, 0, 0); 16710100
BUFF :=KTRX.[15:15]; 16710500
MIX :=KTRX.[ 9:6 ]; 16711000
TYPE :=KTRX.[ 2:7 ]; 16711500
KTR :=KTRX.[15:33]; 16712000
ZZSTA :=0 & (M[BUFF-2])[9:9:9]; 16712500
B := M[BUFF-1]; 16713000
$ SET OMIT = NOT(PACKETS) 16713499
IF MIX!63 THEN UNITNO:=PSEUDOMIX[MIX]; 16713500
$ POP OMIT 16713501
STREAM(B:=BUFF-1); DS:=8LIT"INV KBD "; 16714000
GO TO S[TYPE]; 16714500
WU: 16715000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16715500
WP: 16719500
$ SET OMIT = NOT(DCSPO AND DATACOM) 16720000
RR: 16721500
$ SET OMIT = NOT(DCSPO AND DATACOM) 16722000
GO TO EXIT; 16737000
WR: 16737500
$ SET OMIT = NOT(DCSPO AND DCLOG AND DATACOM) 16738000
MX: 16739000
MIXPRINT(ZZSTA); 16739500
GO TO FORGET; 16740000
TS: 16740500
SHEETDIDDLER(KTR,TYPE,MIX); % TS=5, PS=6, ES=7, XS=8 16741000
MIX:=63; 16741250
GO TO EXIT; 16741500
LF: 16742000
I:=3; GO TO PD; 16742500
LC: 16743000
I:=2; GO TO PD; 16743500
LS: 16744000
I:=4; GO TO PD; 16744500
EX: 16745000
KTR:= -KTR; I:=1; 16745500
PD: 16746000
PRINTDIRECTORY(KTR,I); 16746500
GO TO EXIT; 16747000
SM: 16747500
$ SET OMIT = NOT(DCSPO AND DATACOM) 16748000
GO TO EXIT; 16749000
PO: 16749500
TYPOP(KTR,TYPE=16); % TO=15, PO=16 16750000
GO TO EXIT; 16750500
PG: 16751000
STREAM(Y:=KTR); 16751500
BEGIN 16752000
SI:=Y; 16752500
LA: IF SC NEQ "~" THEN 16753000
BEGIN 16753500
SI:=SI+1; DI:=DI+1; GO TO LA; 16754000
END 16754500
ELSE DS:=4LIT"~~~~"; 16755000
END; 16755500
PGA: STREAM(Y:=0, KTR: A:=A:=SPACE(12)+1); 16756000
BEGIN 16756500
SI:=KTR; 16757000
L: IF SC=" " THEN 16757500
BEGIN 16758000
SI:=SI+1; GO TO L; 16758500
END; 16759000
IF SC="~" THEN TALLY := 1 ELSE 16759500
IF SC="0" THEN TALLY := 1 ELSE 16760000
BEGIN 16760500
DS:=3CHR; 16761000
IF SC="-" THEN 16761500
BEGIN 16762000
DS:=CHR; 16762500
LL: IF SC=" " THEN 16763000
BEGIN 16763500
SI:=SI+1; GO TO LL; 16764000
END; 16764500
5(IF SC GEQ 0 THEN DS:=CHR ELSE JUMP OUT); 16765000
END; 16765500
DS:=LIT"~"; KTR:=SI; 16766000
END; 16766500
Y:= TALLY; 16767000
END STREAM STATEMENT; 16767500
IF P([KTR],STD) THEN 16768000
BEGIN 16768500
FORGETSPACE(A-1); GO TO FORGET; 16769000
END; 16769500
A:=A&A[15:33:15]; 16770000
TAPEPURGE(A); 16770500
GO TO PGA; 16771000
AU: 16771500
$ SET OMIT = NOT(AUXMEM) 16772000
GO TO FORGET; 16773000
MS: 16773500
$ SET OMIT = NOT MONITOR 16774000
GO TO FORGET; 16779500
LN: 16780000
STREAM(A:=0:KTR); 16780500
BEGIN SI:=KTR; DI:=LOC A; DI:=DI+6; 16781000
DS:=2 CHR; 16781500
END; 16782000
IF (I:=P).[36:6]=@37 THEN 16782500
LOGOUT(0) ELSE 16783000
$ SET OMIT = NOT(DISKLOG) 16783500
IF I="ML" THEN INDEPENDENTRUNNER(P(.LOGOUTMAINT),0,128) ELSE 16784500
GO TO ERROR; 16785000
GO TO FORGET; 16785500
CD: 16786000
TABLEOFCONTENTS(KTR, TYPE=23); % CD=21, PP=22, PC=23 16786500
GO TO FORGET; 16787000
CU: 16787500
COREPRINT((IF MIX=63 THEN -0 ELSE MIX)&ZZSTA[9:9:9]); 16788000
GO TO FORGET; 16788500
SY: 16789000
$ SET OMIT = NOT(STATISTICS) 16789500
GO TO FORGET; 16792000
SL: 16792500
$ SET OMIT = NOT(STATISTICS) 16793000
GO TO FORGET; 16795500
RW: 16796000
SPOIT; 16796500
REWINDANDLOCK(KTR); 16797000
GO TO EXIT; 16797500
CI: 16798000
$ SET OMIT = NOT(BREAKOUT) 16798500
CHANGEINTRINSICFILE(KTR); 16801500
GO TO EXIT; 16802000
CT: 16802500
TIMRELAXER(KTR,TYPE,MIX); % CT=29, XT=30, TL=31 16803000
GO TO EXIT; 16803500
XD: 16804000
IF TYPE=33 THEN KTR.[CF]:=0; % XD=32, MR=33 16804500
DKBUSINESS(P(1,KTR)); 16805000
GO TO EXIT; 16805500
MC: 16806000
NAMID(1,KTR); NAMID(J,KTR); NAMEID(J,KTR); 16806500
IF J.[6:6]="~" THEN GO TO ERROR; 16807000
IF (A:=DIRECTORYSEARCH(I,-J,4)) GEQ 64 THEN 16807500
BEGIN 16808000
IF J NEQ "DISK " THEN 16808500
IF(K:=DIRECTORYSEARCH(I,"DISK ",5)) NEQ 0 THEN 16809000
BEGIN 16809500
P(DIRECTORYSEARCH(-I,J,14),DEL); 16810000
FORGETSPACE(A); 16810500
FORGETSPACE(K); 16811000
LPMESS(I,J,-9,29,0,0,1); 16811500
GO FERGIT; 16812000
END 16812500
ELSE 16813000
BEGIN 16813500
M[A INX 4]:=(*P(DUP))&2[1:46:2]&1[8:47:1]; 16814000
A:=A&EUF(-I,"DISK ",A INX 0-1)[18:33:15]; 16815000
FORGETSPACE(DIRECTORYSEARCH(I,J,8)); 16815500
END ELSE M[A INX 4]:=(*P(DUP))&2[1:46:2]&1[8:47:1]; 16816000
HEADERUNLOCK(I,"DISK ",A); 16816500
LBMESS(I,J,54,I,"DISK ",0,1); 16817000
END 16817500
ELSE LBMESS(I,J,-9,IF A=1 THEN 45 ELSE 15,0,0,1); 16818000
FERGIT: 16819300
FORGETSPACE(BUFF-1); 16819400
GO TO EXIT; 16819500
RS: 16820000
$ SET OMIT = NOT(BREAKOUT) 16820500
GO TO EXIT; 16822000
HD: 16823000
STREAM(EU:=-1,ERRTOG:=0:EULIT:=@2564000000000000,CX:=0, 16823100
K:=KTR); 16823200
BEGIN 16823300
SI:=K; DO GO L1; 16823400
L0: IF SC=" " THEN BEGIN SI:=SI+1; GO TO L0 END; CI:=CX; 16823500
L1: CS:=CI; GO TO L0; 16823600
IF SC="~" THEN GO EXT; 16823700
DI:=LOC EULIT; TALLY:=1; 16823800
IF 2 SC=DC THEN % AN EU SPECIFIED 16823900
BEGIN 16824000
CS:=CI; GO TO L0; 16824100
IF SC GEQ 0 THEN IF SC<12 THEN 16824200
BEGIN 16824300
SI:=SI+1; DI:=LOC EU; 16824400
IF SC GEQ 0 THEN IF SC<12 THEN 16824500
TALLY:=2 ELSE GO TO ERR; 16824600
SI:=SI-1; CX:=TALLY; 16824700
DS:=CX OCT; GO TO EXT; 16824800
END ; 16824900
END; 16825000
ERR: ERRTOG:=TALLY; 16825100
EXT: 16825200
END; 16825300
IF P THEN GO TO ERROR; 16825400
IF (HN1:=P+1)>0 THEN IF HN1 LEQ NEUP.[FF] THEN 16825500
HN2:=HN1 ELSE GO TO ERROR ELSE 16825600
BEGIN 16825700
HN1:=1; 16825800
HN2:=NEUP.[FF]; 16825900
END; 16826000
$ SET OMIT = NOT SHAREDISK 16826100
FOR I:=HN1 STEP 1 UNTIL HN2 DO 16826500
IF NOT (NT2:=U[I]).EUNP THEN % NOT A DUMMY EU 16826600
BEGIN 16826700
INT4:=(INT1:=NT2.STARTWRD) MOD 30; 16826800
INT2:=30-(K:=(NT2 AND NUMENTM)+R4) MOD 30+K; 16826900
J:=NT1 DIV 30+USERDISKBOTTOM; 16827000
FIXARRAY(UT,R,A); 16827100
$ SET OMIT = NOT SHAREDISK 16827200
DISKWAIT(-R,A,J); J:=0; 16827900
FOR NT1:=K-2 STEP -1 UNTIL R4 DO INT3:=J+UT[NT1].[3:19]; 16828000
STREAM(A:=I-1,B:=IF U[I].SPEED=1 THEN "F" ELSE "S", 16828100
C:=U[I].[38:10]-1,D:=J,E:=U[I].[1:20], 16828200
F:=A:=SPACE(10)); 16828300
BEGIN 16828400
SI:=LOC A; DS:=4 LIT" EU "; DS:=2 DEC; 16828500
A:=DI; DI:=DI-2; DS:=FILL; DI:=A; 16828600
DS:=LIT"("; SI:=SI+7; DS:=CHR; 16828700
DS:=10 LIT"), NO. AV="; DS:=3 DEC; 16828800
A:=DI; DI:=DI-3; DS:=2 FILL; DI:=A; 16828900
DS:=11 LIT", TOTAL AV="; DS:=6 DEC; 16829000
A:=DI; DI:=DI-6; DS:=5 FILL; DI:=A; 16829100
DS:=14 LIT" SEGS, MAX AV="; DS:=6 DEC; 16829200
A:=DI; DI:=DI-6; DS:=5 FILL; DI:=A; 16829300
DS:=6 LIT" SEGS~"; 16829400
END; 16829500
FORGETSPACE(R); 16829550
SPOUT(A&ZZSTA[9:9:9]); 16829600
END; % ELSE IF HN1=HN2 THEN GO TO ERROR; 16829700
$ SET OMIT = NOT SHAREDISK 16829800
HN1:=KTRX.[9:6]; % SET "MIX" BACK TO ORIGINAL VALUE 16830100
GO TO FORGET; 16830200
RA: 16830300
IF MIX=P2MIX THEN 16830700
BEGIN 16830800
HALT; HALTED := TRUE; 16830900
END; 16831000
SEGDICT := PRT[MIX,4]; 16831100
IF P( M[LOCN:=PRT[MIX,8].[CF]], TOP, XCH, DEL ) THEN SEG:=ADR:=0 16831200
ELSE 16831300
DO BEGIN 16831400
IF P(M[LOCN], TOP, XCH, 0, INX, .ADR, STD) THEN % OVERLAID RCW 16831500
BEGIN 16831600
IF NOT M[LOCN].[33:1] THEN % NOT TYPE 13 INTRINSIC 16831700
BEGIN 16831800
SEG:=ADR; % SEGNO IN RCW 16831900
R:=0; % ADJUST FOR SUBSTRACTION BELOW 16832000
ADR:=M[M[LOCN].MOM].[CF]; % REL.ADR.IN MSCW 16832100
END 16832200
ELSE SEG := (-1); 16832300
END 16832400
ELSE 16832500
BEGIN % PRESENT RCW, CHECK THE LINKS 16832600
R:=0; 16832700
WHILE (SEG:=M[R].[CF]) LSS ADR DO 16832800
IF SEG GTR R THEN R:= SEG ELSE PUNT([PUNTER[25]]); 16832900
SEG:=IF M[R].AREATYPEF=CODEAREAV THEN M[R+1].[CF] ELSE 0; % 16833000
IF P(PRTROW[MIX],0,INX,DUP) GTR R AND P(XCH) LSS M[R].[CF] THEN16833100
R4 := "PRT "; 16833200
R:=R+2; 16833300
END; 16833400
IF PRT[MIX,8].[CF] NEQ LOCN OR M[LOCN-1].MSFF THEN % MARKED 16833500
DO LOCN:=M[LOCN].MOM UNTIL NOT M[LOCN].MSFF; % GET LAST MSCW 16833600
LOCN:=M[LOCN].MOM; % POINT LOCN TO NEXT RCW,JUST IN CASE. 16833700
END 16833800
UNTIL 16833900
(IF SEG NEQ 0 THEN IF SEG = (-1) THEN 0 16834000
ELSE (SEGDICT[0] LSS SEG OR NOT SEGDICT[SEG].PBIT) 16834100
ELSE P(M[R-2].[3:12], DUP) NEQ @700 AND P(XCH) NEQ @1500) 16834200
OR LOCN=0; 16834300
ADR := ADR-R; 16834400
STREAM(MIX, NAM:=[JAR[MIX,0]], T:=0, SEG, ADR, 16834600
SYL:=M[PRT[MIX,8]].[10:2], TOG1:=(R4 NEQ 0), R4, 16834700
TOG2:=(SEG LEQ 0), D:=BUFF-1); 16834800
BEGIN 16834900
DS:=LIT" "; 16835000
SI:=NAM; 2(SI:=SI+1; DS:=7CHR; DS:=LIT"/"); DI:=DI-1; 16835100
DS:=2LIT" ="; SI:=LOC MIX; DS:=2DEC; 16835200
TOG1(SI:=LOC R4; SI:=SI+1; DS:=LIT" "; DS:=7CHR;JUMP OUT TO XXIT);16835300
TOG2(DS:=14LIT" NOT AVAILABLE"; JUMP OUT TO XXIT); 16835400
DS:=5LIT" SEG="; SI:=LOC SEG; DS:=4DEC; 16835500
T:=DI; DI:=DI-4; DS:=3FILL; DI:=T; 16835600
DS:=5LIT" ADR="; DS:=4DEC; 16835700
T:=DI; DI:=DI-4; DS:=3FILL; DI:=T; 16835800
DS:=LIT":"; SI:=SI+7; DS:=CHR; 16835900
XXIT: DS:=LIT"~"; 16836000
END STREAM STATEMENT; 16836100
IF HALTED THEN NOPROCESSTOG := NOPROCESSTOG -1; 16836200
GO TO ERROR; 16836300
EI: %139-16836400
$ SET OMIT = NOT(BREAKOUT) %139-16836405
GO TO FORGET; %139-16866530
FORGET: 16902500
STREAM(T:=BUFF-1); DS:= LIT "~"; 16902600
$ SET OMIT = NOT(PACKETS) 16902649
UNITNO:=0; 16902650
$ POP OMIT 16902651
ERROR: 16902700
SPOUTER(BUFF-1) INX ZZSTA,UNITNO,1); 16902800
EXIT: 16902900
IF(MIX>0)AND(MIX{MIXMAX)THEN TABCNT[MIX]~TABCNT[MIX]-1; %113-16902950
KILL([MSCW]); 16903000
END PROCEDURE KEYIN2; 16903100
REAL PROCEDURE KEYIN(B); VALUE B; REAL B; 16904000
% THIS PROCEDURE FUNCTIONS AS A DRIVER FOR AUXILIARY PROCEDURES 16904500
% "KEYIN0","KEYIN1" AND "KEYIN2". PROCEDURES "KEYIN0" AND "KEYIN1" 16905000
% ARE CALLED DIRECTLY, AND PROCEDURE "KEYIN2" IS CALLED AS AN 16905500
% INDEPENDENT RUNNER. 16906000
BEGIN 16906500
REAL RCW = + 0; 16907000
REAL MSCW=-2; 16907250
INTEGER ZZSTA = RCW + 2; 16907500
REAL BUFF = ZZSTA + 1, 16908000
KTR = BUFF + 1, 16908500
TYPE = KTR + 1, 16909000
MIX = TYPE + 1, 16909500
A = MIX + 1, MIXCODE = A, KTRX = A, 16910000
I = A + 1, 16910500
J = I + 1, RJEOK = J, 16911000
K = J + 1, PROCED = K; 16911500
NAME ADDR = K + 1; ARRAY BUFA = BUFFER[*]; 16912000
INTEGER T = ADDR + 1; %801-16912100
16912500
$ SET OMIT = NOT(PACKETS) 16912999
DEFINE UNITNO = PSEUDOMIX[MIX]#; 16913000
$ POP OMIT 16913001
16913500
LABEL START, CHECK, SWITCHIT, FORGET, ERROR, TBLERR, EXIT; 16914000
LABEL RESTART; %801-16914100
16914500
P(B, 0, 0, 0, 0, 0, 0, 0, 0, 0); % NOTE P(B)=ZZSTA 16917500
P(0); % T %801-16917600
START:: 16918000
IF ABS(B) GTR 1 THEN BUFF:=B.[FF] ELSE 16918500
BEGIN 16919000
BUFF := GETSPACE(60,KEYINBUFFAREAV,0)=3; % %167-16919500
$ SET OMIT = NOT(DCSPO AND DATACOM) 16920000
M[BUFF INX NOT 2].[9:6] := 0; 16921000
P(WAITIO(BUFF&1[24:47:1],0,25), DEL); 16921500
END; 16922000
$ SET OMIT = NOT(DCSPO AND DATACOM) 16922499
RESTART: %801-16925100
M[BUFF-2]:=0&ZZSTA[9:9:9]; 16925500
KTR := BUFF; 16926000
TYPE ~ KEYINSCAN(KTR,MIX); %801-16926010
IF (PROCED~TYPE.[1:5])=1 AND ((I~TYPE.[CF])=8 OR I=VCC %801-16926020
OR I=33 OR I=34) OR (PROCED=0 AND I=1) THEN ELSE % SS,CC,OC,FF,AX 16926022
BEGIN %801-16926030
STREAM(KTR,I:); %801-16926040
BEGIN SI~KTR; %801-16926050
8(60(IF SC=""" THEN %801-16926060
BEGIN L: SI~SI+1; %801-16926070
63(SI~SI+1; IF SC=""" THEN JUMP OUT); %801-16926080
IF SC="~" THEN JUMP OUT 3 TO YECH); 16926090
SI~SI+1; %801-16926100
IF SC=""" THEN GO TO L; %801-16926110
END; %801-16926120
IF SC="~" THEN JUMP OUT 2 TO YECH; %801-16926125
IF SC=";" THEN %801-16926130
BEGIN %801-16926140
I~SI; TALLY~1; %801-16926150
DI~I; DS~LIT "~"; %801-16926152
X: SI~SI+1; IF SC=";" THEN GO TO X; I~SI; %801-16926154
JUMP OUT 2 TO YECH; %801-16926160
END; SI~SI+1)); %801-16926170
YECH: KTR~TALLY; %801-16926180
END STREAM; %801-16926190
I~P; IF P THEN %801-16926200
STREAM(I, T~T~GETSPACE(62,0,0)+3); %801-16926210
BEGIN %801-16926220
SI~I; %801-16926230
8(60(IF SC="~" THEN JUMP OUT 2 TO L ELSE DS~CHR)); L:DS~LIT"~";16926240
END STREAM; %801-16926250
END CHECK FOR KEYIN RECYCLE; %801-16926270
IF PROCED=7 THEN GO TO TBLERR; %801-16926500
KTR := KTR & BUFF[15:33:15]; 16927000
RJEOK := (MIXCODE:=TYPE.[6:6]) GEQ 4; 16927500
MIXCODE := (MIXCODE |(MIX NEQ 63)) AND 3; % ACTUAL MIX CODE 16928000
TYPE := TYPE.[CF]; 16928500
IF TYPE=0 OR MIX.[1:2]!0 THEN % EMPTY OR ERROR 16929000
BEGIN 16929500
IF MIX.[1:1] THEN % EMPTY BUFFER 16930000
BEGIN 16930500
KEYIN:=TRUE; GO TO FORGET; 16931000
END 16933500
ELSE GO TO ERROR; % TYPE=0 OR MIX.[2:1] 16934000
END; 16934500
$ SET OMIT = NOT(DCSPO AND DATACOM) 16935000
CHECK: 16946600
IF MIXCODE=1 OR MIXCODE=2 THEN % MIX INDEX REQUIRED 16947000
BEGIN 16947500
IF MIX GTR MIXMAX THEN GO TO ERROR; 16948000
IF JAR[MIX,*]=0 THEN GO TO ERROR; % JOB MUST BE RUNNING 16948500
IF MIXCODE=1 THEN % JOB SHOULD BE WAITING FOR THIS INPUT 16949000
BEGIN 16949500
J:=REPLY[MIX]; 16950000
WHILE J LSS 0 DO 16950500
BEGIN 16951000
IF J.[42:6]=TYPE THEN GO TO SWITCHIT; 16951500
J:=-J.[6:36]; % SHIFT RIGHT 16952000
END; 16952500
IF TYPE=VWY THEN % "WY", NOT WAITING FOR IT 16953000
BEGIN 16953500
M[BUFF-1]:=FLAG(-"WY NOT"&MIX[6:42:6]); 16954000
M[BUFF] :=0&(@1437)[1:37:11]; 16954500
END; 16955000
GO TO ERROR; 16955500
END; % IF MIXCODE = 1 OR 2 16955600
SWITCHIT: 16955800
TABCNT[MIX]:=TABCNT[MIX]+1; 16956000
$ SET OMIT = NOT(PACKETS) 16956019
IF PSEUDOMIX[MIX]!0 THEN 16956020
BEGIN 16956030
STREAM(BUFF, J ~ J ~ SPACE(16)) ; % %712-16956040
BEGIN SI~BUFF; DS~20 LIT "+OPERATOR KEYED IN: "; %712-16956050
2(50(IF SC="~" THEN JUMP OUT 2 TO AXET; DS~CHR));%712-16956060
AXET: DS~LIT "~" ; % %712-16956070
END ; % %712-16956080
SPOUTER(J,UNITNO,64); % %712-16956090
END ; % %712-16956100
$ POP OMIT 16956121
END; % IF MIX INDEX REQUIRED 16956500
KTRX := KTR & MIX[9:42:6] & TYPE[2:41:7]; 16957500
IF PROCED=2 THEN 16958000
BEGIN 16958500
IF JOBNUM } JOBNUMAX-10 THEN % BED IS GETTING FULL %801-16958600
BEGIN % LETS IGNORE THIS MESSAGE %801-16958610
M[BUFF-1]~-FLAG("WAIT..."); %801-16958620
GO TO ERROR; %801-16958630
END; %801-16958640
M[BUFF-1] := B; % PASS VALUE TO PROCEDURE 16959000
INDEPENDENTRUNNER(NT1:=P(..KEYIN2),KTRX,140); 16959500
END 16960000
ELSE IF PROCED=1 THEN KEYIN1(B,KTRX) ELSE KEYIN0(B,KTRX); 16960500
GO TO EXIT; 16961000
TBLERR: 16961500
STREAM(KTR,B:=BUFF-1); 16962000
BEGIN 16962500
SI:=KTR; SI:=SI-2; DS:=LIT"*"; DS:=2CHR; 16963000
DS:=21LIT" NOT COMPILED IN MCP~"; 16963500
END; 16964000
ERROR: 16964500
SPOUT( (BUFF-1) INX (0&ZZSTA[9:9:9])); 16965000
KEYIN := TRUE; 16965500
GO TO EXIT; 16966000
FORGET: 16966500
STREAM(T:=BUFF:=BUFF-1); DS:=LIT"~"; 16967000
SPOUT(BUFF INX (0&ZZSTA[9:9:9])); 16967500
EXIT: 16968000
IF T>0 THEN % ANOTHER MESSAGE %801-16968100
BEGIN %801-16968110
BUFF~T; T~0; %801-16968120
GO RESTART; %801-16968130
END; %801-16968140
IF ABS(B) LEQ 1 THEN 16968500
BEGIN 16969000
IF (KEYBOARDCOUNTER:=KEYBOARDCOUNTER-1) GTR 0 THEN GO TO START; 16969500
KEYBOARDCOUNTER:=0; 16970000
END; 16970500
IF B THEN KILL([MSCW]); 16971000
END PROCEDURE KEYIN; 16971500
REAL LBMSGCONTROL; 16995000
PROCEDURE LBMESS(EN,SN,I1,I2,E,UNITNO,X); 17000000
VALUE FN,SN,I1,I2,E,UNITNO,X; 17000200
REAL FN,SN,I1,I2,E,UNITNO,X; 17000400
%********************************************************************** 17000405
% PARAMETERS 17000410
% I1 I2 E FORM OF MESSAGE 17000420
% ------ ------ ------ --------------- 17000430
% LSS 0 0 . FN/SN I1 17000440
% LSS 0 GTR 0 0 . FN/SN NOT I1(I2) 17000450
% LSS 0 GTR 0 NEQ 0 . FN/SN NOT I1(I2), E 17000460
% GTR 0 0 0 FN/SN I1 17000470
% GTR 0 0 NEQ 0 FN/SN I1, E 17000480
% GTR 0 GTR 0 FN/SN I1 I2 17000490
% 52 OR 54 FN/SN I1 I2/E 17000500
%NOTE: IF I1 IS NEITHER 52 NOR 54 THEN I1 AND I2 ARE INDICES INTO TABL 17000510
% ELSE I2 AND E ARE MFID AND FID. 17000520
%********************************************************************* 17000530
BEGIN 17000600
REAL T, A, COUNT; 17000800
LBMSGCONTROL.[FF] := COUNT := LBMSGCONTROL.[FF] + 1; 17000900
IF NOT (LBMSGCONTROL.[2:1]) THEN % ITS NOT IN CORE -- 17001000
IF COUNT > 1 THEN BEGIN 17001300
SLEEP([LBMSGCONTROL], @1000000000000000); 17001400
% WAIT - SOMEONE ELSE IS GETTING IT 17001500
END ELSE BEGIN % GET IT YOURSELF 17001600
A := MESSAGETABLE[4].[8:10]; 17002000
LBMSGCONTROL := (GETSPACE(A,2,0)+2) & LBMSGCONTROL[FTF]; 17002600
$ VOID 17002800
DISKWAIT(-(LBMSGCONTROL,[CF]), A, MESSAGETABLE[4].[22:26]); 17003000
LBMSGCONTROL.[2:1] := 1; % MARK PRESENT 17003050
M[LBMSGCONTROL-1] := P(..LBMSGCONTROL) & A[CTF]; %LINK WD 2 17003100
M[LBMSGCONTROL-2] := (*P(DUP)) & @200[2:35:13];% LINK WORD 1 17003130
END; 17003150
STREAM 17003200
(A := [FN], I := I1<0, TBL1 := LBMSGCONTROL INX ABS(I1), E, 17003250
L := I1 < 0 AND I2 ! 0, J := I1=52 OR I1=54, 17003300
B := IF P(DUP) THEN [I2] ELSE (LBMSGCONTROL INX I2), 17003400
T := T := SPACE(10)); 17003450
BEGIN I(DS:=LIT","); DS:=LIB" "; SI:=A; 17003500
IF SC="+" THEN BEGIN DS:=LIT"="; SI:=SI+8; END 17003550
ELSE BEGIN SI:=SI+1; DS:=7CHR; END; DS:=LIT"/"; 17003600
IF SC="+" THEN BEGIN DS:=LIT"="; SI:=SI+8; END 17003700
ELSE BEGIN SI:=SI+1; DS:=7CHR; END; 17003750
DS:=LIT" "; L(DS:=4LIT"NOT "); SI:=TBL1; 17003800
63(SI:=SI+1; 7(IF SC="~" THEN JUMP OUT 2 TO L1 ELSE DS:=CHR)); 17003850
L1: SI:=B; 17003900
J(IF SC="+" THEN BEGIN DS:=LIT"="; SI:=SI+8; END 17003950
ELSE BEGIN SI:=SI+1; DS:=7CHR END; DS:=LIT"/"; 17004000
IF SC="+" THEN BEGIN DS:=LIT"="; SI:=SI+8; END 17004050
ELSE BEGIN SI:=SI+1; DS:=7CHR END; JUMP OUT TO L3); 17004100
L(DS:=LIT"("); 17004150
63(SI:=SI+1; 7(IF SC="~" THEN JUMP OUT 2 TO L2 ELSE DS:=CHR)); 17004200
L2: L(DS:=LIT")"); SI:=LOC E; SI:=SI+5; 17004250
IF SC NEQ "0" THEN BEGIN DS:=2LIT", "; DS:=3CHR; END; 17004300
L3: DS:=LIT"~"; 17004600
END; %STREAM 17005200
SPOUTER(T&UNITNO[9:9:9],UNITNO,X); 17005400
LBMSGCONTROL.[FF] := LBMSGCONTROL.[FF] - 1; 17005600
END; %LIBMSG 17006000
PROCEDURE STOPM(NCS); VALUE NCS; REAL NCS; 17900000
17900500
BEGIN 17901000
INTEGER PROTY; 17901500
REAL B; 17902000
LABEL AROUND,OUTIT; 17902500
$ SET OMIT = NOT(WORKSET) 17903000
REAL N, AUTOSTOP; 17903500
AUTOSTOP := (WKSETSTOPJOBS AND TWO(P1MIX)) NEQ 0; 17904000
JAR[P1MIX,9].[3:1]:=1; % MARK IT STOPPED 17904500
WKSETSWITCHTIME := CLOCK + P(RTR); 17904600
$ POP OMIT % WORKSET 17905000
PROTY := PRYOR[P1MIX]; % SAVE THE PRIORITY LEVEL 17905500
PRYOR[P1MIX]:=@1777; 17906000
IF NOTERMSET(P1MIX) THEN PRTROW[P1MIX].[PSF]:=0; 17906100
IF JAR[P1MIX,9].[1:1] THEN 17906150
BEGIN 17906200
COMPLEXSLEEP((TERMSET(P1MIX) OR JAR[P1MIX,9].[1:1]=0)); 17906250
GO OUTIT; 17906300
END; 17906350
AROUND: 17906500
STREAM(J:=JARROW[P1MIX], P1MIX, 17907000
$ SET OMIT = NOT(WORKSET) 17907500
AUTOSTOP, 17908000
$ POP OMIT % WORKSET 17908500
B := B := SPACE(10)); 17909000
BEGIN 17909500
$ SET OMIT = NOT(WORKSET) 17910000
AUTOSTOP(DS:=11LIT"#AUTO-STOP "; JUMP OUT TO L1); 17910500
$ POP OMIT % WORKSET 17911000
DS:=13LIT"#OPRTR ST-ED "; 17911500
L1: SI:=J; 2(SI:=SI+1; DS:=7CHR; DS:=LIT"/"); 17912000
DI:=DI-1; DS:=LIT"="; SI:=LOC P1MIX; DS:=2DEC; 17912500
DS:=LIT"~"; DI:=DI-3; DS:=FILL; 17913000
END STREAM STATEMENT; 17913500
SPOUT(B); 17914000
IF AUTODS THEN REPLY[P1MIX]~VOK ELSE %747-17914100
BEGIN %747-17914200
REPLY[P1MIX]:= -VWY & VOK[36:42:6]; 17914500
COMPLEXSLEEP((TERMSET(P1MIX) OR REPLY[P1MIX] GEQ 0)); 17915000
END; %747-17915100
IF NOTERMSET(P1MIX) THEN % MUST BE "WY" OR "OK" 17915500
BEGIN 17916000
$ SET OMIT = NOT(WORKSET) 17916500
IF AUTOSTOP THEN 17917000
IF REPLY[P1MIX]=VWY THEN GO AROUND ELSE ELSE 17917500
$ POP OMIT % WORKSET 17918000
IF NOT WHYSLEEP(VWY&VOK[36:42:6]) THEN GO AROUND; 17918500
REPLY[P1MIX]:=0; 17919000
OUTIT: 17919100
PRYOR[P1MIX]:=PROTY; 17919500
$ SET OMIT = WORKSET 17920000
$ SET OMIT = NOT(WORKSET) 17921500
JAR[P1MIX,9].[3:1]:=0; % MARK IT RUNNING 17922000
OLAYTIME[P1MIX]:= (*P(DUP)) | 0.80; 17922500
% SET THE OLAY TIME BACK NOW TO PREVENT THIS 17923500
% JOB FROM BEING IMMEDIATELY ST-ED AGAIN 17924000
END 17924500
; %138-17925000
FOR N:=0 STEP 1 UNTIL STQUEMAX DO 17925500
IF STQUE[N] = P1MIX THEN STQUE[N] := 0; % REMOVE FROM QUEUE 17926000
WKSETSWITCHTIME := CLOCK+P(RTR); 17926100
WKSETSTOPJOBS:=WKSETSTOPJOBS AND NOT(TWO(P1MIX)); 17926500
$ POP OMIT % WROKSET 17927000
IF NCS THEN GO TO INITIATE; 17927500
END PROCEDURE STOPM; 17928000
PROCEDURE TISKTASK; FORWARD; 17928500
PROCEDURE FILEHOLD(A,B,TOG,LOC,HOLD); 18000000
VALUE LOC,HOLD; 18001000
REAL A,B,TOG,LOC,HOLD; 18002000
BEGIN 18003000
REAL SZ,Y,T; 18004000
$ SET OMIT = NOIT SHAREDISK 18004490
ARRAY HOLDLIST[*]; 18005000
LABEL SLEPE; 18006000
DEFINE DSED=TERMSET(P1MIX)#; 18007000
IF HOLD THEN 18008000
BEGIN 18009000
IF TOG THEN TOG~TOG+1 ELSE 18010000
BEGIN % MAKE AN ENTRY INTHE HOLDLIST 18011000
$ SET OMIT = NOT SHAREDISK 18011490
IF (SZ:=(Y:=HOLDER.[FF])+1) GTR HOLDMAX THEN 18012000
BYBY("HOLD LIST OVERFLOW~",19); 18013000
HOLDLIST:=[M[SPACE(SZ)]]&SZ[8:38:10]; 18014000
IF Y!0 THEN 18014100
DISKWAIT(-(HOLDLIST INX 0),Y,HOLDER.[CF]); 18015000
HOLDER.[FF]:=SZ; 18016000
HOLDLIST[Y]:=LOC.[FF]&[TOG][CTF]&SYSNO[2:46:2]; 18017000
DISKWAIT(HOLDLIST INX 0,SZ,HOLDER.[CF]); 18018000
$ SET OMIT = NOT SHAREDISK 18018490
FORGETSPACE(HOLDLIST); 18019000
END; 18019500
IF M[LOC+4].[3:1] THEN 18020000
$ SET OMIT = NOT SHAREDISK 18020490
ELSE 18021000
BEGIN M[LOC+4].[3:1]:=1; 18021500
DISKWAIT(LOC.[CF],-30,LOC.[FF]); 18022000
END; 18022500
$ SET OMIT = SHAREDISK 18022990
UNLOCKDIRECTORY; 18023000
$ POP OMIT 18023010
IF P1MIX!0 THEN 18024000
BEGIN T:=VWY&(VIF|A.[3:1])[36:42:6]; 18025000
IF TOG=0 THEN 18026000
SLEPE: FILEMESS("# ",A,B," IN USE",0,0,0); 18027000
REPLY[P1MIX]:=-T; 18028000
COMPLEXSLEEP(REPLY[P1MIX]}0 OR DSED OR TOG); 18029000
IF NOT WHYSLEEP(T) THEN GO TO SLEPE; 18030000
END ELSE 18031000
WHILE NOT TOG DO %815-18031400
BEGIN LBMESS(ABS(A),B,45,0,"MCP",0,1); 18031500
COMPLEXSLEEP((CLOCK AND @17777)=0 OR TOG); %815-18032000
SLEEP([CLOCK],NOT CLOCK); %815-18032010
END; 18032500
$ SET OMIT = SHAREDISK 18032990
LOCKDIRECTORY; 18033000
$ POP OMIT 18033010
TOG:=TRUE; 18033500
IF P((P1MIX NEQ 0 AND DSED),DUP) 18034000
THEN FILEHOLD(A,B,TOG,LOC,2); 18035000
P(RTN); % 1 ON TOP OF STACK IF DSED 18037000
END; 18045000
$ SET OMIT = NOT SHAREDISK 18045490
IF (SZ:=HOLDER.[FF])=0 THEN 18046000
$ SET OMIT = NOT SHAREDISK 18046490
ELSE 18047000
BEGIN IF HOLD=2 THEN DISKWAIT(-LOC.[CF],-30,LOC.[FF]); 18047500
HOLDLIST:=[M[SPACE(SZ)]]&SZ[8:38:10]; 18048000
DISKWAIT(-(HOLDLIST INX 0),SZ,HOLDER.[CF]); 18049000
IF TOG THEN FOR T:=0 STEP 1 UNTIL SZ-1 DO 18050000
$ SET OMIT = NOT(SHAREDISK) 18051000
IF HOLDLIST[T].[FF]=[TOG].[CF] THEN 18053000
IF (SZ:=SZ-1) ! T THEN 18054000
BEGIN 18055000
MOVE(SZ-T,[HOLDLIST[T+1]],[HOLDLIST[T]]); 18056000
T:=SZ; 18057000
END; 18058000
HOLDER.[FF]:=Y:=SZ; 18059000
IF SZ!0 THEN 18060000
BEGIN 18061000
FOR Y~0 STEP 1 UNTIL SZ-1 DO 18062000
IF HOLDLIST[Y].[CF]=LOC.[FF] THEN 18063000
BEGIN 18064000
$ SET OMIT = NOT(SHAREDISK) 18065000
M[HOLDLIST[Y].[FF]]~1; 18068000
Y:=SZ; 18069000
END; 18070000
DISKWAIT(HOLDLIST INX 0,SZ,HOLDER.[CF]); 18071000
END; 18072000
$ SET OMIT = NOT SHAREDISK 18072490
IF SZ=Y THEN 18073000
BEGIN 18074000
M[LOC+4].[3:1]:=0; 18075000
IF HOLD=2 THEN DISKWAIT(LOC.[CF],-30,LOC.[FF]); 18075500
$ SET OMIT = NOT SHAREDISK 18075990
END; 18077500
FORGETSPACE(HOLDLIST); 18078000
END; 18079000
END; % OF FILEHOLDER 18080000
%COMMENT THE DISK FILE HEADER CONTAINS THE FOLLOWING INFORMATION: 18081000
%H[0].[0:15] RECORD LENGTH 18083000
% .[15:15] BLOCK LENGTH 18084000
% .[30:12] RECORD/BLOCK 18085000
% .[42:6] SEGMENTS/BLOCK 18086000
%H[1].[6:18] CREATION DATE FOR LOGGING (WHEN ON DISK) 18087000
% .[25:23] CREATION TIME FOR LOGGING (WHEN ON DISK) 18088000
% .[1:47] NUMBER OF LOGICAL RECORDS PER ROW (WHEN IN CORE) 18089000
%H[2].[0:48] =0 FREE FILE 18090000
% .[1:1] =0 SOLE USER, PUBLIC OR PRIVATE FILE 18091000
% .[1:1] =1 SECURITY FILE 18092000
% .[6:42] PRIMARY USER"S CODE 18093000
%H[3].[1:1] =1 NEW FILE HEADER FORMAT 18094000
% .[2:10] SAVE FACTOR (BINARY) 18095000
% .[12:18] DATE OF LAST ACCESS (BINARY) 18096000
% .[30:18] CREATION DATE (BINARY) 18097000
%H[4].[1:1] =1 FILE IS BEING LOADED OR NAME IS BEING CHANGED 18098000
% .[2:1] =1 FILE IS OPENED BY AN EXCLUSIVE USER 18099000
% .[3:1] =1 A PROGRAM IS WAITING TO USE THE FILE 18100000
% .[4:2] SYSTEM NUMBER OF EXCLUSIVE USER 18101000
% .[6:1] USED BY AUTOPRINT TO MARK A PBD FILE 18102000
% .[7:1] USED TO MARK PSEUDO DECKS THAT WERE CREATD ON 18103000
% .[8:1] USED TO MARK SPECIAL COMPILERS 18104000
% .[9:2] =2 FILE IS DATA 18105000
% =3 FILE IS PROGRAM 18106000
% =0 DON"T KNOW IF DATA OR PROGRAM 18107000
% .[11:1] FILE ACCESSED BIT 18108000
% .[12:4] FILE SYSTEM TOGGLES 18109000
% .[16:5] OPEN COUNT 2 FOR SYSTEM 0 (A) 18110000
% .[21:5] OPEN COUNT 2 FOR SYSTEM 1 (B) 18111000
% .[26:5] OPEN COUNT 2 FOR SYSTEM 2 (C) 18112000
% .[31:5] OPEN COUNT 2 FOR SYSTEM 3 (D) 18113000
% .[36:6] =0 TYPE IS UNKNOWN 18114000
% =1 BASIC 18115000
% =2 ALGOL 18116000
% =3 COBOL 18117000
% =4 FORTRAN 18118000
% =5 TSPOL 18119000
% =6 XALGOL 18120000
% =7 SEQ 18121000
% =8 DATA 18122000
% =9 LOCK 18123000
% .[42:1] USED TO MARK FILES WHICH CANT BE MOVED 18123100
% .[43:2] SENSITIVE DATA - ZEROING BITS 18124000
% .[45:1] COLD START FILE 18124100
% .[46:2] NOT USED 18124200
%H[5].[0:48] =0 SOLE USER FILE 18125000
% .[1:1] =1 PRIVATE FILE 18126000
% =12 IF H[6]=12 THEN INFO FILE ELSE PUBLIC FILE 18127000
%H[7] NUMBER OF LOGICAL RECORDS (EOF POINTER) 18128000
%H[8] NUMBER OF SEGMENTS PER ROW 18129000
%H[9].[1:1] TOGGLE 1 FOR SYSTEM 0 (A) 18130000
% .[2:1] TOGGLE 1 FOR SYSTEM 1 (B) 18131000
% .[3:1] TOGGLE 1 FOR SYSTEM 2 (C) 18132000
% .[4:1] TOGGLE 1 FOR SYSTEM 3 (D) 18133000
% .[5:1] TOGGLE 2 FOR SYSTEM 0 (A) 18134000
% .[6:1] TOGGLE 2 FOR SYSTEM 1 (B) 18135000
% .[7:1] TOGGLE 2 FOR SYSTEM 2 (C) 18136000
% .[8:1] TOGGLE 2 FOR SYSTEM 3 (D) 18137000
% .[9:5] OPEN COUNT 1 FOR SYSTEM 0 (A) 18138000
% .[14:5] OPEN COUNT 1 FOR SYSTEM 1 (B) 18139000
% .[19:5] OPEN COUNT 1 FOR SYSTEM 2 (C) 18140000
% .[24:5] OPEN COUNT 1 FOR SYSTEM 3 (D) 18141000
% .[29:14] NOT USED 18142000
% .[43:5] MAXIMUM NUMBER OF ROWS 18143000
%H[10]-H[29] DISK ADDRESSES OF ROWS (0 IF NOT ASSIGNED) 18144000
% 18145000
% 18146000
%THE OPEN COUNTS AND TOGGLES ARE USED IN THE FOLLOWING MANNER: 18147000
% 18148000
% TOGGLE 1 TOGGLE 2 OPEN COUNT 1 OPEN COUNT 2 18149000
% 0 0 INPUT ONLY INPUT 18150000
% 0 1 (OUTPUT) NOT USED INPUT 18151000
% 1 0 SHARED INPUT 18152000
% 1 1 PROTECT INPUT 18152100
% 18153000
%END COMMENT; 18154000
REAL PROCEDURE DIRECTORYSEARCH(A,B,OPTN);% 18155000
VALUE A,B,OPTN; REAL A,B,OPTN;% 18156000
% OPTN= 0 OPENS FOR SHARED USE 18157000
% OPTN= 1 OPENS FOR INPUT 18158000
% OPTN= 2 OPENS FOR OUTPUT 18159000
% OPTN= 3 OPENS FOR WRITELOCK 18160000
% OPTN= 4 OPENS FOR EXCLUSIVE USE 18161000
% OPTN= 5 RETURNS FILE HEADER (UNCHANGED) 18162000
% OPTN= 6 REMOVES FILE FROM DISK UNCONDITIONALLY 18163000
% OPTN= 7 REMOVES FILE FROM DISK AS SOON AS IT IS NOT IN USE 18164000
% OPTN= 8 REMOVES FILE HEADER ONLY 18165000
% OPTN= 9 HEADERUNLOCK--WRITES HEADER POINTED TO BY (F-4).[CF] 18166000
% BACK OUT ON (F-4).[FF], TURNS OFF INTERLOCK & DOES 18167000
% FORGETSPACE(F-4). 18168000
% OPTN=10 CLOSE SHARED 18169000
% OPTN=11 CLOSE INPUT 18170000
% OPTN=12 CLOSE OUTPUT 18171000
% OPTN=13 CLOSE WRITELOCK 18172000
% OPTN=14 CLOSE EXCLUSIVE 18173000
% OPTN=15 LOGS THE FILE AND RESETS ITS CREATION DATE AND TIME 18174000
% OPTN=16 MAKES THE FILE NOT A SYSTEM FILE 18175000
% OPTN=17 MAKES THE FILE A SYSTEM FILE 18176000
% OPTN=18 WILL INTERLOCK SYSTEM FILES 18177000
% OPTN=19 RETURNS FILE HEADER (UNCHANGED AND LOCKED...IT IS UP TO 18178000
% THE CALLING ROUTINE TO CLEAN UP) 18178100
% OPTN=20 CLOSE A FILE GIVEN JUST THE DISK ADDRESS OF ITS HEADER 18179000
% A CONTAINS THE DISK ADDRESS 18179010
% B CONTAINS THE OPTN NUMBER OF THE DESIRED CLOSE 18179020
% OPTN=21 OPENS PROTECT 18179100
% OPTN=22 CLOSE PROTECT 18179200
% OPTN>512 FILECLOSE--ADDRESS OF HEADER IN OPTN.[CF] 18180000
% CLOSE OPTION-10 IS IN OPTN.[FF] 18181000
% OPTN< 0 RETURNS AN AREA OF USER DISK AND UPDATES CORE COPY 18182000
% OF FILE HEADER--ADDRESS OF HEADER IS IN OPTN.[CF]-- 18183000
% NUMBER OF THE ROW TO BE FILLED IS IN OPTN.[FF] 18184000
% IS IN OPTN.[CF] 18185000
% A.[1:1] DIRECTORYSEARCH WILL FORGET THE MEMORY SPACE 18186000
% OCCUPIED BY THE FILE HEADER 18187000
% A.[2:1] IS DIALED INTO FH[4].[1:1] WHEN OPTN=4 18188000
% A.[3:1] IF A CONFLICT OCCURS, AN "IF" WILL BE ENABLED. IF THE 18189000
% OPERATOR ENTERS AN "IF", DIRECTORYSEARCH WILL RETURN A 18190000
% VALUE OF 1. CURRENTLY, THIS IS USED ONLY BY LIBMAIN. 18191000
% B.[1:1] DIRECTORYSEARCH WILL RETURN A VALUE OF 1 IF THE 18192000
% FILE IS IN USE 18193000
% B.[2:1] WILL NOT UPDATE DATE OF LAST ACCESS 18194000
% B.[3:1] WILL SET FILE ACCESSED BIT FOR CLOSE 18195000
BEGIN 18196000
REAL OLDONE=-4; 18197000
REAL TEMP,I,T,TOG,J,K,N,F,X; 18198000
INTEGER S,I1,I2,I3; 18199000
REAL UNITNO; 18199100
ARRAY FH[*],NB[*]; 18200000
$ SET OMIT = NOT SHAREDISK 18200490
DEFINE DSED=TERMSET(P1MIX)#; 18201000
$ SET OMIT = SHAREDISK 18201490
DEFINE UNLOCKHDR = EXIT#; 18201500
$ POP OMIT 18201510
LABEL LL,EXT,CHECK,LWS; 18202000
LABEL OPENSHARED,OPENINPUT,OPENOUTPUT,OPENWRITELOCK, 18203000
OPENEXCLUSIVE,L6,L7,L8,EXIT,LWRITE,FOUND, 18204000
THU,CLOSE,LW,BOMB,GETAROW,EX, 18205000
CLOSESHARED,CLOSEINPUT,CLOSEOUTPUT,CLOSEWRITELOCK, 18206000
CLOSEXCLUSIVE,ZER,UNSYS,SYS, 18207000
SEE,LOCKSYS,DONTWAIT,NOFILE,COMPLETE,LEAVLKD,UNUSED; 18208000
$ SET OMIT = NOT(DISKLOG) 18209000
LABEL OPENPROTECT,CLOSEPROTECT; 18210300
SWITCH Q~OPENSHARED,OPENINPUT,OPENOUTPUT,OPENWRITELOCK, 18211000
OPENEXCLUSIVE,EXIT,L6,L7,L8,EXIT, 18212000
CLOSESHARED,CLOSEINPUT, 18213000
CLOSEOUTPUT,CLOSEWRITELOCK,CLOSEEXCLUSIVE 18214000
$ SET OMIT = NOT(DISKLOG) 18215000
$ SET OMIT = DISKLOG 18217000
,EXIT 18218000
$ POP OMIT 18218001
,UNSYS,SYS 18219000
,LOCKSYS,LEAVELKD,UNUSED,OPENPROTECT,CLOSEPROTECT 18220000
; 18221000
%************************************************* 18222000
REAL SUBROUTINE SEARCH; 18223000
BEGIN 18224000
$ SET OMIT = NOT SHAREDISK 18224490
S:=SCRAMBLE(A,B); 18225000
DISKWAIT(-N,-60,S); 18226000
LL: FOR X:=0 STEP 3 UNTIL 57 DO 18227000
IF (NB[X] EQV A.[6:42]) = NOT 0 THEN 18227500
IF (NB[X+1] EQV B.[6:42]) = NOT 0 THEN GO TO FOUND; 18228000
IF (S:=NB[2].[FF])!0 THEN 18228500
BEGIN DISKWAIT(-N,60,S); 18229000
GO TO LL; 18229500
END ELSE 18230000
$ SET OMIT = NOT SHAREDISK 18230490
GO TO EXT; 18231000
FOUND: I~(K~NB[X+2].[CF]-DIRECTORYTOP-4).[44:4]|2; 18232000
J ~(K AND NOT 15)+DIRECTORYTOP+19; 18233000
K ~ K+DIRECTORYTOP+4; 18234000
EXT: SEARCH ~ S; 18235000
END; 18236000
%************************************************* 18237000
SUBROUTINE HEADER; 18238000
BEGIN 18239000
DISKWAIT(-F,30 18240000
$ SET OMIT = NOT SHAREDISK 18240090
,K); 18240200
$ SET OMIT = NOT SHAREDISK 18240490
TEMP:=F&K[CTF]&I[8:38:10]; 18241000
END; 18242000
%************************************************* 18243000
SUBROUTINE REMOVER; % CANT BE CALLED FROM OTHER SUBROUTINES. 18244000
BEGIN NB[X]~@14; 18245000
DISKWAIT(N,-60,S); 18245500
$ SET OMIT = NOT SHAREDISK 18245990
DISKWAIT(-N,-30,J); 18247500
NB[I]~@14; NB[I+1]~NEXTSLOT; NEXTSLOT~K; 18248000
DISKWAIT(N,-30,J); 18248500
$ SET OMIT = NOT SHAREDISK 18248990
END; 18250000
%************************************************* 18251000
SUBROUTINE HOLD; 18252000
BEGIN 18253000
$ SET OMIT = NOT SHAREDISK 18253490
IF B.[1:1] THEN GO DONTWAIT; 18254000
$ POP OMIT OMIT 18254010
FILEHOLD(A,B,TOG,TEMP,1); 18255000
IF P THEN % 0 OR 1 IS LEFT ON TOP OF STACK IN FILEHOLD 18255100
BEGIN TEMP:=3; A:=-1; GO EXIT; END % DS-ED IN FILEHOLD 18255200
ELSE 18255300
IF P1MIX!0 THEN 18256000
IF REPLY[P1MIX]=VIF THEN 18258000
BEGIN 18259000
FILEHOLD(A,B,TOG,TEMP,2); 18260000
DONTWAIT: 18260500
TEMP:=1; % IN USE 18261000
GO TO FXIT; 18262000
END; 18263000
IF SEARCH=0 THEN 18264000
BEGIN FILEHOLD(A,B,TOG,TEMP,0); 18265000
NOFILE: TEMP:=0; A:=-1; GO EXIT; 18266000
END; 18269000
HEADER; 18270000
END; % OF HOLD 18271000
%************************************************* 18272000
$ SET OMIT = NOT(PACKETS) 18272199
IF OPTN.[CF] LSS 512 THEN 18272200
BEGIN UNITNO:=OPTN.[9:21]; OPTN:=OPTN INX 0; END; 18272300
$ POP OMIT 18272301
$ SET OMIT = SHAREDISK 18272990
LOCKDIRECTORY; 18273000
$ POP OMIT 18273010
IF OPTN=20 THEN 18273020
BEGIN OPTN:=B.[CF]; 18273030
DISKWAIT(-(F:=SPACE(30)),-30,(K:=A.[CF])); 18273040
FH:=[M[F]]&30[8:38:10]; 18273050
TEMP := F & K [CTF]; %155-18273055
GO Q[OPTN]; 18273060
END; 18273070
IF OPTN=9 THEN 18274000
BEGIN 18275000
DISKWAIT(-(N:=SPACE(30)),-30,(K:=OLDONE.[FF])); 18276000
FH:=[M[F:=(TEMP:=OLDONE).[CF]]]&30[8:38:10]; 18276500
A:=NABS(A); 18277000
FH[4]:=(*P(DUP))&M[N+4][3:3:1]; 18277500
GO TO CLOSEEXCLUSIVE; 18278000
END; 18279000
NB:=[M[N:=SPACE(60)]]&60[8:38:10]; 18280000
IF SEARCH=0 THEN 18281000
BEGIN 18282000
A:=0; 18283000
GO TO EXIT; 18284000
END; 18285000
$ SET OMIT = NOT SHAREDISK 18285099
$ SET OMIT = SHAREDISK 18285999
FH:=[M[F:=TYPEDSPACE(30,DISKHEADERAREAV)]]&30[8:38:10]; % %167-18286000
$ POP OMIT 18286001
HEADER; 18287000
IF OPTN<0 THEN GO GETAROW; 18288000
IF OPTN}512 THEN GO TO Q[OPTN.[FF]+10]; 18289000
$ SET OMIT = SHAREDISK 18289999
IF OPTN LSS 5 OR OPTN=17 OR OPTN=7 THEN 18290000
$ POP OMIT 18290001
$ SET OMIT = NOT SHAREDISK 18290099
CHECK: 18291000
BEGIN 18292000
IF FH[4].[44:1] AND OPTN LSS 5 THEN 18292100
BEGIN % TRYING TO OPEN WHILE FILE IS BEING BLANKED 18292200
$ SET OMIT = NOT SHAREDISK 18292300
GO NOFILE; 18292600
END; 18292700
$ SET OMIT = SHAREDISK 18292999
IF NOT OPTN OR OPTN=7 THEN 18293000
$ POP OMIT 18293001
$ SET OMIT = NOT SHAREDISK 18293099
IF FH[4].[12:4]! 0 THEN 18293200
BEGIN % IT IS A SYSTEM FILE 18294000
TEMP:=2; % SYSTEM FILE 18295000
$ SET OMIT = NOT SHAREDISK 18295490
GO TO EXIT; 18296000
END; 18297000
SEE: 18298000
IF (FH[4].[2:2] AND (NOT TOG OR 2))!0 THEN 18299000
BEGIN 18300000
HOLD; 18301000
GO CHECK; 18302000
END; 18303000
END; 18305000
GO TO Q[OPTN]; 18306000
OPENSHARED: 18307000
IF FH[9].[5:4]=0 THEN 18308000
IF FH[9].[1:4]!0 OR FH[9].[9:20]=0 THEN 18309000
BEGIN 18310000
$ SET OMIT = NOT(SHAREDISK) 18310999
$ SET OMIT = SHAREDISK 18314099
FH[9].[9:5]:=P(DUP).[9:5]+1; 18314100
FH[9].[1:1]:=1; 18314200
$ POP OMIT 18314201
GO TO LWRITE; 18315000
END; 18316000
HOLD; 18317000
GO TO OPENSHARED; 18318000
OPENINPUT: 18319000
$ SET OMIT = NOT(SHAREDISK) 18319999
$ SET OMIT = SHAREDISK 18321099
FH[4].[16:5]:=P(DUP).[16:5]+1; 18321100
$ POP OMIT 18321101
GO TO LWRITE; 18322000
OPENOUTPUT: 18323000
IF FH[9].[5:24]=0 THEN 18324000
BEGIN 18325000
$ SET OMIT = NOT(SHAREDISK) 18325999
$ SET OMIT = SHAREDISK 18327099
FH[9].[5:1]:=1; 18327100
$ POP OMIT 18327101
GO TO LWRITE; 18328000
END; 18329000
HOLD; 18330000
GO TO OPENOUTPUT; 18331000
OPENWRITELOCK: 18332000
IF FH[9].[1:8]=0 THEN 18333000
BEGIN 18334000
$ SET OMIT = NOT(SHAREDISK) 18334999
$ SET OMIT = SHAREDISK 18336099
FH[9].[9:5]:=P(DUP).[9:5]+1; 18336100
$ POP OMIT 18336101
GO TO LWRITE; 18337000
END; 18338000
HOLD; 18339000
GO TO OPENWRITELOCK; 18340000
OPENEXCLUSIVE: 18341000
IF FH[9].[5:24]=0 THEN 18342000
IF FH[4].[16:20]=0 THEN 18343000
BEGIN 18344000
COMPLETE: FH[4]:=(P(DUP,LOD))&SYSNO[4:46:2]&1[2:47:1]&A[1:2:1]; 18345000
GO TO LWRITE; 18346000
END; 18347000
HOLD; 18348000
GO TO OPENEXCLUSIVE; 18349000
OPENPROTECT: 18349100
$ SET OMIT = NOT SHAREDISK 18349149
$ SET OMIT = SHAREDISK 18349799
GO TO OPENEXCLUSIVE; 18349800
$ POP OMIT 18349801
CLOSESHARED: 18350000
$ SET OMIT = NOT(SHAREDISK) 18350999
$ SET OMIT = SHAREDISK 18357099
IF (I:=FH[9].[9:5]-1)=0 THEN 18357100
FH[9].[1:1]:=0; 18357200
FH[9].[9:5]:=I; 18357300
$ POP OMIT 18357301
GO TO CLOSE; 18358000
CLOSEINPUT: 18359000
$ SET OMIT = NOT(SHAREDISK) 18359999
$ SET OMIT = SHAREDISK 18361099
FH[4].[16:5]:=P(DUP).[16:5]-1; 18361100
$ POP OMIT 18361101
FH[4].[6:1]:=0; 18361200
GO TO LW; 18362000
CLOSEOUTPUT: 18363000
$ SET OMIT = NOT(SHAREDISK) 18363999
$ SET OMIT = SHAREDISK 18365099
FH[9].[5:1]:=0; 18365100
$ POP OMIT 18365101
GO TO CLOSE; 18366000
CLOSEWRITELOCK; 18367000
$ SET OMIT = NOT(SHAREDISK) 18367999
$ SET OMIT = SHAREDISK 18369099
FH[9].[9:5]:=P(DUP).[9:5]-1; 18369100
$ POP OMIT 18369101
GO TO LW; 18370000
CLOSEEXCLUSIVE: 18371000
FH[4].[1:2]~0; 18372000
GO TO CLOSE; 18373000
CLOSEPROTECT: 18374000
$ SET OMIT = NOT SHAREDISK 18374001
$ SET OMIT = SHAREDISK 18374599
GO TO CLOSEEXCLUSIVE; 18374600
$ POP OMIT 18374601
$ SET OMIT = NOT SHAREDISK 18374999
SYS: 18388000
IF FH[9].[1:8]=0 THEN 18389000
BEGIN 18390000
$ SET OMIT = NOT(SHAREDISK) 18390999
$ SET OMIT = SHAREDISK 18392099
FH[4].[12:1]:=1; 18392100
$ POP OMIT 18392101
GO TO LWRITE; 18393000
END; 18394000
HOLD; 18395000
GO TO SYS; 18396000
UNSYS: 18397000
$ SET OMIT = NOT(SHAREDISK) 18397999
$ SET OMIT = SHAREDISK 18399099
FH[4].[12:1]:=0; 18399100
$ POP OMIT 18399101
GO TO LW; 18400000
LOCKSYS: 18401000
OPTN:=4; 18402000
GO SEE; 18403000
$ SET OMIT = NOT(SHAREDISK) 18403999
$ SET OMIT = NOT(DISKLOG) 18411000
GETAROW: 18421000
IF FH[I2:=OPTN.[FF]]=0 THEN 18422000
BEGIN 18423000
$ SET OMIT = NOT(DISKLOG) 18424000
IF (FH[I2]:=GETUSERDISK(FH[8]&3[1:46:2]))=0 THEN 18425100
BEGIN 18425150
$ SET OMIT = SHAREDISK 18425175
UNLOCKDIRECTORY; 18425200
$ SET OMIT = NOT SHAREDISK 18425225
I1:=GETUSERDISK(-FH[8]); 18425300
$ SET OMIT = SHAREDISK 18425390
LOCKDIRECTORY; 18425400
$ POP OMIT 18425410
IF SEARCH=0 THEN 18425500
BEGIN FORGETUSERDISK(I1,FH[8]); 18425600
TEMP:=0; A:=-1; 18425700
GO TO EXIT; 18425800
END; 18425900
HEADER; 18426000
FH[12]:=I1; 18426100
END; 18426200
END; 18427000
FOR I2:=FH[9].[43:5]+9 STEP -1 UNTIL 10 DO 18428000
M[OPTN INX I2]:=FH[I2]; 18429000
GO TO LW; 18430000
CLOSE: 18431000
IF B.[3:1] THEN FH[4].[11:1] ~ 1; 18431050
IF OPTN GTR 511 THEN 18431100
BEGIN 18431200
IF (FH[0] EQV M[OPTN])!NOT 0 THEN 18431300
IF (I1:=(((I1:=((((I2:=FH[7]+1) DIV (I3:=FH[0]).[30:2]) 18431400
|I3.[42:6])|30)+(I2 MOD I3.[30:12]) 18431500
|(IF (I2:=I3.[1:14])=0 THEN 30 ELSE I2)) DIV 30) 18431600
DIV (I3:=M[OPTN]).[42:6])|I3.[30:12] 18431700
+((((I1 DIV 30) MOD I3.[42:6])|30 18431800
+I1 MOD 30+I3.[1:14]-1) DIV I3.[1:14])-1) 18431900
=M[OPTN+7] THEN GO TO LW; 18432000
FH[0]:=M[OPTN]; 18432100
FH[4]:=(*P(DUP)) OR (M[OPTN+4] AND 16); 18432150
FH[7]:=M[OPTN+7]; 18432200
END; 18432300
GO TO LW; 18432400
L7:% 18432500
IF NOT (FH[4] AND @1400777777770000)!NOT 0 OR 18432600
FH[9].[1:28]!0 THEN 18433000
BEGIN 18434000
HOLD; 18435000
GO TO L7; 18436000
END; 18437000
L6:% 18438000
IF FH[4].[43:2] NEQ 0 THEN % TEST FILE SENSITIVE 18438100
BEGIN 18438110
STREAM(A,B,T:=T:=TYPEDSPACE(10,CONTROLCARDAREAV)+2);% %167-18438120
BEGIN 18438130
DS:=10LIT"CC REMOVE "; SI:=LOC A; SI:=SI+1; DS:=7CHR; 18438140
DS:=LIT"/"; SI:=LOC B; SI:=SI+1; DS:=7CHR; 18438150
DS:=6LIT";END.~"; 18438155
END; 18438160
FH[4].[43:2]:=1; 18438170
INDEPENDENTRUNNER(P(..CONTROLCARD),T&(IF UNITNO NEQ 0 18438180
THEN UNITNO ELSE 31)[2:46:6]&1[8:47:1],192); 18438190
IF UNITNO}32 AND UNITNO{63 THEN PSEUDOCOPY~PSUEDOCOPY+1; 18438195
M[T-4].[9:6]:=0; 18438200
$ SET OMIT = NOT(SHAREDISK) 18438202
GO COMPLETE; 18438210
END; 18438220
$ SET OMIT = PACKETS 18439000
LBMESS(ABS(A),ABS(B),7,0,0,UNITNO,LIBMSG); 18439125
$ SET OMIT = NOT(DISKLOG) 18440000
PBCOUNT:=PBCOUNT-((((A.[6:42] EQV "PBD ")=NOT 0) OR 18442000
((A.[5:42] EQV "PUD ")=NOT 0)) AND B.[CF]=1); 18443000
L8: REMOVER; 18444000
IF OPTN!8 THEN 18444500
FOR I ~ 1 STEP 1 UNTIL FH[9] DO% 18445000
IF FH[9+I]!0 THEN FORGETUSERDISK(FH[I+9],FH[8]);% 18446000
GO TO LW; 18447000
LWRITE: 18453500
IF NOT B.[2:1] THEN 18454000
STREAM(A~[DATE],B~[FH[3]],C~0); 18455000
BEGIN SI~A;DI~LOC C;DS~8 OCT;SI~LOC C;SI~SI+5; 18456000
DI~B;DI~DI+2;DS~3 CHR; 18457000
END; 18458000
LW: 18459000
IF FH[4].[3:1] OR TOG THEN FILEHOLD(A,B,TOG,TEMP,0); 18460000
IF OPTN<6 OR OPTN>8 THEN 18460500
LWS: DISKWAIT(F,-30,K); 18461000
EX: FH[9]:=(*P(DUP)) AND 31; 18462000
EXIT:% 18463000
IF A.[1:1] OR TEMP<64 AND TEMP>0 THEN FORGETSPACE(F); 18465000
$ SET OMIT = SHAREDISK 18465990
UNLOCKDIRECTORY; 18466000
$ POP OMIT 18466010
LEAVELKD: 18466100
UNUSED: 18466101
IF N NEQ 0 THEN FORGETSPACE(N); 18466200
DIRECTORYSEARCH~TEMP; 18467000
END; % OF DIRECTORYSEARCH 18468000
PROCEDURE PICKTHELOCK; FORWARD; 18468100
PROCEDURE EVENTANDINTERRUPT; FORWARD; 18468200
PROCEDURE COMMUNICATE1; 18500000
BEGIN REAL R4=-4,R5=-5,R6=-6,R7=-7,R8=-8; 18500100
INTEGER I4=-4,I5=-5,I6=-6; 18500200
ARRAY A4=-4[*],A5=-5[*],A6=-6[*]; 18500300
ARRAY A7=-7[*]; 18500400
NAME N4=-4,N5=-5,N6=-6; 18500500
LABEL C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16, 18500600
C17,C18,C19,C20,C21,C22,C23,C24,C25,C26; 18500700
LABEL C27,C28,C29,C30,C31,C32; 18500800
LABEL C33,C34,C35,C36,C37,C38,C39,C45,C47,C48,C49, 18500900
C30A,C30B,C49A, 18501000
INIT,AC0,AC1,AC2,AC3,AC4,AC5,CHANGENAME; 18501100
$ SET OMIT = NOT SHAREDISK 18501200
SWITCH AC:=AC0,AC1,AC2,AC3,AC4,AC5; 18501700
SWITCH C:=C0,INIT,INIT,INIT,C4,INIT,INIT,INIT,INIT,INIT,INIT, 18501800
INIT,INIT,INIT,INIT,C15,C16,INIT,INIT,INIT,INIT, 18501900
INIT,INIT,INIT,INIT,INIT,INIT,INIT,INIT,INIT,C30, 18502000
C31,C32,C33,INIT,INIT,INIT,INIT,INIT,INIT,INIT, 18502100
INIT,INIT,INIT,INIT,C45,INIT,INIT,INIT,C49; 18502200
REAL RCW=+0,O,I,J,T; 18502300
ARRAY A[*],FIB=A[*],FPB[*],H[*]; 18502400
BOOLEAN SUBROUTINE DELAYOK; 18503000
% CHECKS FOR TIMEOUT, DS, OR CONDITION SATISFIED FOR COMMUNICATE 31.18503100
BEGIN 18503200
DELAYOK := CLOCK+P(RTR)>I4 OR TERMSET(P1MIX) OR 18503300
(I := NOT(M[A6] AND R5)!NOT(0)); 18503400
END; 18503500
% 18503600
GO TO C[PRT[P1MIX,9]]; 18504000
INIT: GO TO INITIATE; 18505000
% COBOL INVALID EOJ 18510000
C0: TERMINATE(P1MIX); TERMINALMESSAGE(28); 18510100
% GENERALIZED ZIP 18520000
C4: IF (I~A4.[8:10]!0 THEN BEGIN 18520100
$ SET OMIT = PACKETS 18520200
$ SET OMIT = NOT(PACKETS) 18520500
M[(T:=TYPEDSPACE(I+5,CONTROLCARDAREAV)+2)-4].[AREAMIXF]:=0;% %167-18520600
$ POP OMIT 18520700
IF NOT A.[2:1] THEN MAKEPRESENT(NFLAG(NOT 3 INX [RCW])); 18520800
IF (J~USERCODE[P1MIX])=NOT(-0) THEN J~0; 18520900
STREAM(C~J,A4,I1~I.[36:6],I,Q~0,T); 18521000
BEGIN SI:=A4; SI:=SI-1; 18521100
L: SI:=SI+1; IF SC=" " THEN GO TO L; Q:=SI; DI:=Q; 18521200
IF SC=@14 THEN DS:=LIT" " ELSE DS:=2LIT" "; DI:=T; 18521300
DS:=8LIT"CC USER="; SI:=LOC C; SI:=SI+1; DS:=7 CHR; 18521400
DS:= LIT";" ; SI:=A4; 18521500
I1(DS:=32WDS; DS:=32WDS); DS:= I WDS; 18521600
$ SET OMIT = NOT(PACKETS) 18521700
DS:=8 LIT"~"; 18521800
$ POP OMIT 18521900
TALLY:=12;I:=TALLY; 18522000
DI:=Q;SI:=LOC I;SI:=SI+7;DS:=CHR; 18522100
END STREAM; 18522200
J!IF USERCODE[P1MIX]=MCP THEN 31 ELSE 26; 18522300
$ SET OMIT = NOT(PACKETS) 18522400
IF PSEUDOMIX[P1MIX] NEQ 0 THEN NYLONZIPPER[P1MIX].[2:1]:=0; 18522500
$ POP OMIT 18522600
INDEPENDENTRUNNER(P(.CONTROLCARD),T&P1MIX[18:42:6] 18522700
$ SET OMIT = NOT(DATACOM AND RJE ) 18522800
&J[3:43:5],192); 18523100
$ SET OMIT = NOT(PACKETS) 18523200
IF PSEUDOMIX[P1MIX] NEQ 0 THEN 18523300
SLEEP([NYLONZIPPER[P1MIX]],@1000000000000000); 18523400
$ POP OMIT 18523500
END ELSE 18523600
BEGIN FIB~N4[NOT 2]; 18523700
FPB~PRT[P1MIX,3]; 18523800
I~IF FIB[4].[12:1] THEN FIB[4].[13:11] 18523900
ELSE (FIB[4].[13:11]-1)|ETRLNG; 18524000
T~FPB[I+3].[43:5]; 18524100
IF T=10 OR T=12 OR T=13 OR T=26 THEN 18524200
BEGIN 18524300
IF FIB[5].[42:1] THEN GO TO CHANGENAME; 18524400
H~FIB[14]; 18524500
$ SET OMIT = DATACOM AND RJE 18524600
H[6]:=0; 18524700
$ POP OMIT 18524800
H[5]:=USERCODE[P1MIX]; 18524900
$ SET OMIT = NOT(DATACOM AND RJE ) 18525000
H[6]~(*P(DUP))&3[2:42:6]; 18525300
$ RESET OMIT 18525400
IF H[4] THEN 18525500
BEGIN FILECLOSE(N4.[33:15]); 18525600
CHANGENAME: IF (T~DIRECTORYSEARCH(FPB[I],FPB[I+1],4)) 18525700
LSS 64 18525750
THEN GO TO INITIATE; 18525800
H~[M[T]]&30[8:38:10]; 18525900
$ SET OMIT = NOT(SHAREDISK) 18526000
H[5]:=USERCODE[P1MIX]; 18526300
$ SET OMIT = NOT(PACKETS) 18526400
H[6]~(*P(DUP))&3[2:42:6]; 18526500
$ POP OMIT 18526600
ENTERCONTROLDECK(H); 18526700
P(DIRECTORYSEARCH(-FPB[I],FPB[I+1],8),DEL); 18526800
J~H[2]; % SAVED LASTCDNUM 18527000
FORGETSPACE(H); 18527100
END ELSE 18527200
BEGIN FILECLOSE((N4.[33:15])&6[18:33:15]); 18527300
ENTERCONTROLDECK(H); 18527400
J~H[2]; % SAVED LASTCDNUM 18527500
FOR T~10 STEP 1 UNTIL 29 DO H[T]~0; 18527600
FILECLOSE(N4.[33:15]); 18527700
END; 18527800
IF RUNUMBER LEQ 0 THEN 18527900
BEGIN 18528000
STREAM(A~[HAR[P1MIX,0]], B~H~USERCODE[P1MIX], 18528100
F~H!MCP AND H!0, P1MIX, J, T~T~SPACE(10)); 18528200
BEGIN SI~A; DS~LIT"#"; 18528300
2(SI~SI+1; DS~7 CHR; DS~LIT"/"); DI~DI-1; 18528400
F(SI~LOC B; SI~SI+1; DI~DI+1; DS~7 CHR); 18528500
SI~LOC P1MIX; DS~LIT"="; A~DI; 18528600
DS~2 DEC; DS~14 LIT" ZIPPED DECK #"; 18528700
SI~LOC J; DS~4 DEC; DS~LIT"~"; 18528800
DI~DI-5; DS~3 FILL; DI~A; DS~FILL; 18528900
END; 18529000
SPOUT(T); 18529100
END; 18529200
END; 18529300
END; 18529400
GO TO INITIATE; 18529500
% DISPLAY (COBOL) 18530000
C15: DISPLAY(A4 INX 1); GO TO INITIATE; 18530100
% COBOL ACCEPT 18540000
C16: DISPLAY(A4 INX 2); %747-18540100
IF AUTODS THEN TERMINATE(P1MIX&61[CTF]) ELSE %747-18540120
BEGIN REPLY[P1MIX]:=-VWY&VAX[36:42:6]; %747-18540140
COMPLEXSLEEP((TERMSET(P1MIX) OR REPLY[P1MIX] GTR 0)); 18540200
END; %747-18540220
IF TERMSET(P1MIX) THEN GO INITIATE; 18540300
IF NOT WHYSLEEP(VWY&VAX[36:42:6]) THEN GO TO C16; 18540400
T~REPLY[P1MIX].[18:15]; REPLY[P1MIX]~0; 18540500
STREAM(T,S~A4 INX 2); 18540600
BEGIN SI~T; 18540700
L: IF SC!"X" THEN BEGIN SI~SI+1; GO TO L END; 18540800
SI~SI+1; 2(DS~40 CHR); 18540900
END; 18541000
FORGETSPACE(T-1); GO TO INITIATE; 18541100
% DIRECTORYSEARCH AND UN-FILL FILE ID FOR NORMAL STATE PROGRAMS 18550000
C30: COMMENT SEARCHES DISK DIRECTORY AND RETURNS DATA IN ARRAY. 18550100
[0] IS USER-TYPE OR NOT-PRESENT FLAG 18550200
[1] IS MULTI-FILE ID 18550300
[2] IS FILE ID 18550400
IF NOT PRESENT, [3] => [5] ARE -1 18550500
IF INVALID USER, [3] => [5] ARE 0 18550600
IF PRIMARY, SECONDARY, OR TERTIARY USER: 18550700
[3] IS RECORD LENGTH 18550800
[4] IS BLOCK LENGTH 18550900
[5] IS END OF FILE POINTER 18551000
[6] IS OPEN COUNT 18551100
IF ARRAY SIZE IS GREATER THAN 9: 18551200
[7] = FILETYPE (FROM HEADER) 18551300
[8] = HEADER[3] (CREATION/ACCESS DATE,SAVE FACTOR) 18551400
[9] = HEADER[1] ( LOGGING DATES) 18551500
IF ARAY SIZE IS GREATER THAN 10: 18551600
[10]= SYSTEM NUMBER (SHAREDISK) 18551700
NOT-PRESENT FLAG IS -1 18551800
INVALID USER FLAG IS 0 18551900
PRIMARY USER FLAG IS 7 (LM,INPUT, AND OUTPUT BITS) 18552000
SECONDARY USER FLAG IS 3 (INPUT AND OUTPUT BITS) 18552100
TERTIARY USER FLAG IS 2 (INPUT BIT ONLY) 18552200
; 18552300
IF A4.[8:10]<7 THEN BEGIN TERMINATE(P1MIX);% 18552400
TERMINALMESSAGE(7); END;% 18552500
IF NOT A4.[2:1] THEN MAKEPRESENT(NFLAG(NOT 3 INX [RCW]));% 18552600
P([M[A4 INX NOT 1]],DUP,DUP,LOD,XCH,CCX,.J,STD,IOR);% 18552700
FIB ~ N5[NOT 2]; FPB ~ PRT[P1MIX,3]; 18552800
I ~ IF FIB[4].[12:1] THEN FIB[4].[13:11]% 18552900
ELSE (FIB[4].[13;11]-1)|ETRLNG; 18553000
A4[I] ~ FPB[I]; A4[2] ~ FPB[I+1]; 18553100
IF P(FPB[I+3].[43:5],DUP,DUP)=10 %RANDOM 18553200
OR (P(XCH) OR 1)=13 OR P(XCH)=26 THEN %SERIAL,UPDATE,PROTECT 18553300
IF ((T:=DIRECTORYSEARCH(A4[1],A4[2],5) ) NEQ 0 %207-18553400
AND M[T+4].[12:4] EQL 0 ) THEN %207-18553410
BEGIN IF (A4[0] ~ SECURITYCHECK(A4[1],A4[2],USERCODE[P1MIX],T))!0 18553500
AND M[T+4].[12:4]=0 18553600
THEN BEGIN A4[3] ~ M[T].[1:14];% 18553700
A4[4] ~ M[T].[15:15]; A4[5] ~ M[T+7];% 18553800
$ SET OMIT = SHAREDISK 18553900
A4[6]:=M[T+4].[16:5]+M[T+9].[9:5]; 18554000
$ POP OMIT 18554100
$ SET OMIT = NOT(SHAREDISK) 18554200
IF A4.[8:10] GTR 9 THEN 18554600
BEGIN A4[7]:=M[T+4].[36:6]; A4[8]:=M[T+3]; 18554700
A4[9]:=M[T+1]; 18554800
END; 18554900
IF A4.[8:10] GTR 10 THEN A4[10]:=SYSNO; 18555000
END ELSE A4[3]:=A4[4]:=A4[5]:=A4[6]:=0; 18555100
FORGETSPACE(T); 18555200
GO TO C30B 18555300
END ELSE GO C30A ELSE 18555400
BEGIN 18555500
T:=-1; 18555600
IF (T:=FINDINPUT(A4[1],A4[2],FPB[I+2].[1;17], 18555700
FPB[I+2].[18:30],FPB[I+3].[1:5],[A4[3]] INX 0, 18555800
T,0,0,0))=NABS(1) THEN GO TO C30A ELSE 18555900
IF T GEQ 0 THEN 18556000
BEGIN 18556100
A4[0]:=4; A4[3]:=(I:=RDCTABLE[T]).[14:10]; 18556200
A4[4]:=I.[24:17]; A4[5]:=I.[41:7]; 18556300
A4[6]:=TINU[T].[30:18]; IF T<16 THEN 18556400
A4[6]:=(*P(DUP))&PRNTABLE[T][12:30:18]; GO C30B; 18556500
END ELSE 18556600
BEGIN 18556700
A4[0]:=5; A4[3].[1:5]:=ABS(T); GO C30B 18556800
END; 18556900
END; 18557000
C30A: A4[0]:=A4[3]:=A4[4]:=A4[5]:=A4[6]:=-1; 18557100
C30B: 18557200
IF NOT J.[2:1] THEN P([M[J]],PRL);% 18557300
GO TO INITIATE;% 18557400
% ALGOL "DELAY" FUNCTION -- WAIT WITH TIMEOUT 18558990
C31: IF A6.[CF]<512 THEN % CAUGHT SOMEONE BEING SNEAKY 18559000
BEGIN TERMINATE(P1MIX); 18559100
TERMINALMESSAGE(17); 18559200
END; 18559300
I4:=60|I4+CLOCK+P(RTR); 18559400
IF NOT DELAYOK THEN COMPLEXSLEEP(DELAYOK); 18559500
I6:=I; 18559600
GO TO INITIATE; 18559700
C32:: 18560000
$ SET OMIT = NOT(DATACOM ) 18560100
GO TO INITIATE; 18565600
C33:: STREAM(R4,A~(R4!0),J~JARROW[P1MIX],P1MIX,% 18570000
T~T~SPACE(10));% 18570100
BEGIN DS~10 LIT " PAUSE # 0";% 18570200
A(DI~DI-1; DI~LOC R4; SI~SI+2; DS~6 CHR); 18570300
DS~5 LIT " FOR"; SI~J; SI~SI+1; DS~7 CHR;% 18570400
DS~LIT "/"; SI~SI+1; DS~7 CHR; DS~LIT "=";% 18570500
SI~LOC P1MIX; DS~2 DEC; DS~LIT "~"; DI~DI-3; DS~FILL;% 18570600
END;% 18570700
SPOUT(T);% 18570800
IF NOTERMSET(P1MIX) THEN PRTROW[P1MIX].[PSF]:=2; 18570900
GO TO INITIATE;% DON"T KEEP COMMUNICATE AROUND NEEDLESSLY 18571200
C45: IF R4 THEN % COBOL68 EXIT PROGRAM/ EXIT PROGRAM RETURN HERE 18580000
BEGIN IF A5.PBIT THEN % IF THERE IS A TASK ARRAY 18580100
IF A5[6]=1 THEN % TYPE = CALLED 18580200
BEGIN A5[7] ~ 1; 18580300
COMPLEXSLEEP(A5[7].[46:1] 18580400
OR (TERMSET(P1MIX))); 18580410
A5 ~ 1; 18580500
END ELSE A5 ~ 0 18580600
ELSE A5 ~ 0; 18580700
GO TO INITIATE; 18580800
END; 18580900
% DETACH TASK ARRAY: DS OR FS JOB RUNNING OR SCHEDULED 18581000
IF N5[6]=2 THEN GO TO INITIATE; 18581100
IF N5[3]=1 THEN SHEETDIDDLER(0,20,N5[4]); 18581200
IF N5[3]=2 THEN 18581300
BEGIN TERMINATE(N5[4]&61[CTF]); HALT; 18581400
NOPROCESSTOG ~ NOPROCESSTOG-1; 18581500
END; 18581600
GO TO INITIATE; 18581700
C49:: 18590000
$ SET OMIT = NOT SHAREDISK 18590100
GO INITIATE; 18593300
END OF COMMUNICATE1; 18599000
PROCEDURE COMMUNICATE0; 18700000
BEGIN REAL R4=-4,R5=-5,R6=-6,R7=-7,R8=-8; 18700100
INTEGER I4=-4,I5=-5,I6=-6; 18700200
ARRAY A4=-4[*],A5=-5[*],A6=-6[*]; 18700300
ARRAY A7=-7[*]; 18700400
NAME N4=-4,N5=-5,N6=-6; 18700500
LABEL C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16, 18700600
C17,C18,C19,C20,C21,C22,C23,C24,C25,C26; 18700700
LABEL C27,C28,C29,C30,C31,C32; 18700800
LABEL C33,C34,C35,C36,C37,C38,C39,C45,C47,C48,C49, 18700900
C21A,C3A,INIT,US,D,TD,PR,IOT,TMR,IT,AD,WD; 18701000
LABEL PE,TE,PA; %145-18701010
DEFINE CN=DIFFCOM#; 18701100
SWITCH S:=PA,PE,TE,IT,US,D ,TD,PR,IOT,TMR,AD,WD; %145-18701200
SWITCH C:=INIT,C1,INIT,C3,INIT,INIT,C6,C7,C8,INIT,INIT, 18701300
INIT,C12,INIT,INIT,INIT,INIT,C17,INIT,INIT,C20, 18701400
C21,C22,INIT,INIT,C25,C26,INIT,INIT,C29,INIT, 18701500
INIT,INIT,INIT,INIT,INIT,INIT,INIT,C38,C39,INIT, 18701600
INIT,INIT,INIT,INIT,INIT,INIT,C47,C48,INIT; 18701700
REAL I,J,T; 18701800
ARRAY AIT[*]; REAL AITL=AIT; ARRAY A=AIT[*]; 18701900
NAME ADDR; 18702000
GO TO C[PRT[P1MIX,9]]; 18702200
INIT: GO TO INITIATE; 18702300
% TIME INTRINSIC 18710000
C1: IF (I4:=I4) GEQ (-5) AND I4 LEQ 6 THEN %145-18710100
BEGIN GO TO S[I4+5]; %145-18710200
PA: %145-18710240
$ SET OMIT = NOT(PACKETS) %145-18710242
IF (I:=PSEUDOMIX[P1MIX]) GEQ 32 THEN %145-18710244
I4:=PACKETACT[I-32]; %145-18710246
$ POP OMIT %145-18710248
GO TO INITIATE; %145-18710249
PE: %145-18710250
$ SET OMIT = NOT(PACKETS) %145-18710252
IF (I:=PSEUDOMIX[P1MIX]) GEQ 32 THEN %145-18710254
BEGIN %145-18710256
I4:=PACKETERR[I-32]; %145-18710258
PACKETERR[I-32]:=TRUE; %145-18710260
END; %145-18710262
$ POP OMIT %145-18710264
GO TO INITIATE; %145-18710266
TF: %145-18710268
$ SET OMIT = NOT PACKETS %145-18710270
IF (I:=PSEUDOMIX[P1MIX]) GEQ 32 THEN %145-18710272
T4:=PACKETERR[I-32]; %145-18710274
$ POP OMIT %145-18710276
GO TO INITIATE; %145-18710278
IT: I4~JAR[P1MIX,9].[5:1]; 18710300
JAR[P1MIX,9]~(*P(DUP)) & 2[4:46:2]; 18710400
GO INITIATE; 18710500
US: R4:=USERCODE[P1MIX]; GO TO INITIATE; 18710600
D: I4~DATE; GO TO INITIATE; 18710700
TD: I4~XCLOCK+P(RTR); GO TO INITIATE; 18710800
PR: I4~JAR[P1MIX,3]+PROCTIME[P1MIX]+CLOCK+P(RTR); 18710900
GO TO INITIATE; 18711000
IOT: I4~IOTIME[P1MIX]+JAR[P1MIX,4]; 18711100
WHILE I4<0 DO I4~I4+CLOCK+P(RTR); 18711200
GO TO INITIATE; 18711300
TMR: I4~P(RTR); GO TO INITIATE; 18711400
AD: I4~ACTDATE; GO TO INITIATE; 18711500
WD: I4~WEEKDAY; GO TO INITIATE; %753-18711600
END; 18711700
IF I4 = (-6) THEN I4~P1MIX; %753-18711790
GO TO INITIATE; 18711800
% RETURN SPECIFIC ARRAY 18720000
C3: ARTN(N4[0],1); % REMOVE 1 DIM ARRAY 18720100
C3A:: T~[AITL].[CF]; % REMOVE FROM AIT 18720200
IF NOT(AIT~PRT[P1MIX,6]).[2:1] THEN MAKEPRESENT(T); 18720300
J ~ AIT[0]; T ~ N4.[CF]; 18720400
FOR I~1 STEP 1 UNTIL J-1 DO 18720500
IF AIT[I].[18:15]=T THEN 18720600
BEGIN MOVE(J-I,[AIT[I+1]],[AIT[I]]); J~0 END; 18720700
IF J=0 OR AIT[J].[FF]=T THEN AIT[0] ~ *P(DUP)-1; 18720800
N4[0]~0; 18720900
GO TO INITIATE; 18721000
% WHEN 18730000
C6: I4~60|I4+P(RTR)+CLOCK; 18730100
WHILE NOTERMSET(P1MIX) AND CLOCK+P(RTR) LSS I4 DO 18730200
SLEEP([CLOCK],NOT CLOCK); 18730300
GO TO INITIATE; 18730400
% FILL 18740000
C7: IF NOT A5.[2:1] THEN MAKEPRESENT(NFLAG(NOT 0 INX [I4])); 18740100
I~M[A5 INX NOT 0]; J~M[A5 INX NOT 1]; 18740200
P([M[A5 INX NOT 1]],IOR); 18740300
IF (NT2~(NT1~*(I4 INX PRT[P1MIX,4])).[18:15])>NT3~A5.[8:10] THEN 18740400
NT2~NT3; 18740500
I4~(IF JAR[P1MIX,10]!0 THEN JAR[P1MIX,(NT1~NT1.[CF]) 18740600
DIV (NT3~JAR[P1MIX,8])+10]+NT1 MOD NT3 18740700
ELSE DALOC[P1MIX,NT1.[33:6]+P(DUP)-1]+NT1.[39:9]); 18740800
DISKWAIT(-A5.[CF],NT2,I4); 18740900
M[A5 INX NOT 0]~*P(.I); 18741000
IF NOT (*P(.J)).[2:1] THEN P([M[A5 INX NOT 1]],PRL); 18741100
GO TO INITIATE; 18741200
% PLAIN ZIP 18750000
C8: ZIPPER(R5,R4,0); 18750100
GO TO INITIATE; 18750200
% BREAKOUT 18760000
C12: 18760100
$ SET OMIT = NOT(BREAKOUT) 18760200
GO TO INITIATE; 18760500
% COBOL I/O ERROR 18770000
C17: A5~*A5; A~PRT[P1MIX,3]; I~"I/O ERR"; 18770100
IF A5[5].[1:1] THEN 18770200
BEGIN I:= "INVALID";J:=" USER"; R6:=1 END ELSE 18770300
STREAM(R4,N~[J]); BEGIN SI~LOC R4; DI~DI+1; DS~7 DEC; 18770400
DI~DI-7; DS~5 FILL; 18770500
END; 18770600
FILEMESS(I&R6[1:47:1],J,A[T~A5[4].[13:11]],A[T+1], 18770700
IF R4~(R4=16 OR R4=17 OR R4=82) THEN R8 ELSE 0, 18770800
IF R4 THEN R7 ELSE 0,0); 18770900
GO TO INITIATE; 18771000
% TAPE SWAP FOR TAPE SORT 18780000
C20: SLEEP([N4[3]],IOMASK); SLEEP([N4[4]],IOMASK); 18780100
FOR I~3 STEP 1 UNTIL 4 DO 18780200
BEGIN N5[I].[33:15]~N4[I]; 18780300
M[N4[I] INX NOT 1]~(*P(DUP))&N5[3][14:3:4]&[N5[3]][33:33:15]18780400
END; 18780500
A~N4[0]; A[5].[39:4]~2; A[16]~0; A[18]~NABS(*P(DUP)); 18780600
NT4~A[10].[3:15]; A[10].[3:15]~0; 18780700
A~N5[0]; A[5]~0; A[16]~NFLAG(N5[3]); A[18]~ABS(*P(DUP)); 18780800
A[10].[3:15]~NT4; 18780900
GO TO INITIATE; 18781000
% SORT STORAGE ASSIGNMENT 18790000
C21: A~[M[GETSPACE(R6+R5,2,1)+2]]&R5[8:38:10]; 18790100
A[0]~(R5 INX A)&R6[8:38:10]; 18790200
N4[0]~A; 18790300
IF NOT CONQUER(0,R5-1,R6,1 INX A,J) THEN 18790400
BEGIN FORGETSPACE(A); 18790500
C21A: STREAM(P1MIX,T~R5|R6,A~I~GETSPACE(7)); 18790600
BEGIN DS~LIT "#"; SI~LOC P1MIX; 18790700
DS~2 DEC; DS~ 13 LIT " NO SORT MEM:"; 18790800
DS~5 DEC; DS~9 LIT " WDS RQD~"; 18790900
END; 18791000
$ SET OMIT = PACKETS %713-18791099
$ SET OMIT = NOT PACKETS %713-18791609
SPOUTER(I,0,0); % JOB MESSAGE PAGE ONLY %713-18791610
STREAM(P1MIX, A~I~SPACE(6)); % SIMULATE OPERATORS REPLY %713-18791620
BEGIN DS~20 LIT "+OPERATOR KEYED IN: "; %713-18791630
SI~LOC P1MIX; DS~2 DEC; %713-18791640
DS~26 LIT " OU DK.... TRY DISK SORT~~"; %713-18791650
DI~DI-28; DS~2 FILL; %713-18791655
END; % OF STREAM %713-18791660
SPOUTER(I,0,0); % MESSAGE PAGE ONLY %713-18791670
J~1; % ASSUME "OU DK" IS OPERATORS RESPONSE %713-18791680
$ POP OMIT %713-18791681
GO TO C21; 18791700
END; 18791800
GO TO INITIATE; 18791900
% SORT STORAGE RETURN 18800000
C22:: I~N4[0] INX 1; 18800100
DO FORGETSPACE(M[I]) UNTIL (I~M[I].[18:15])=0; 18800200
FORGETSPACE(N4[0]); N4[0]~0; 18800300
GO TO INITIATE; 18800400
% RETURN OLD COPY OF OWN ARRAY 18810000
C25:: ARTN(A5,R4); 18810100
M[A5.[FF]]~A~PRT[P1MIX,17]&P(.A5,LOC)[18:18:15]; 18810200
IF A.[2:1] THEN M[A.[CF]-1].[CF]~A5.[FF]; 18810300
GO TO INITIATE; 18810400
% INVALID ARGUMENTS TO ALGOL INTRINSICS %WF 18820000
C26:: IF (I ~ R4)}0 THEN 18820100
STREAM(A ~R4, I~I~SPACE(10)); 18820200
BEGIN DS~LIT "-"; % %740-18820300
CI~CI+A; %WF 18820700
GO LOG; GO ROOT; GO LOG; GO EXP; GO SIN; %WF 18820800
DS~3 LIT "COS"; GO EXIT; %WF 18820900
LOG: DS~2 LIT "LN"; GO EXIT; %WF 18821000
ROOT: DS~4 LIT "SQRT"; GO EXIT; %WF 18821100
EXP: DS~3 LIT "EXP"; GO EXIT; %WF 18821200
SIN: DS~3 LIT "SIN"; %WF 18821300
EXIT: DS~8 LIT " ARGMNT "; SI~LOC A; SI~SI+7; % %740-18821400
IF SC}@3 THEN DS~5 LIT "> 158" ELSE %740-18821410
IF SC<@2 THEN DS~5 LIT "NEGTV" ELSE DS~4 LIT "ZERO"; %740-18821420
DS~2 LIT " ~"; % %740-18821430
END; 18821500
IF I = (-7) THEN % COBOL INVALID INDEX 18821600
BEGIN 18821700
R4 ~ R5; R5 ~ R6; 18821800
ERRORFIXER(4); % INVALID INDEX CHECK 18821900
END; 18822000
TERMINATE(P1MIX); TERMINALMESSAGE(-I); %WF 18822100
C29:: COMMENT THIS COMMUNICATE PROVIDES FOR DS-ING AN OBJECT PROGRAM 18830000
AND/OR SPOUTING A MESSAGE ABOUT A PROGRAM. 18830100
R4 IS USED TO SPECIFY THE MESSAGE REQUIRED. 18830200
R5 SET TO TRUE SPECIFIES P1MIX IS TO BE DS-ED. 18830300
T IS THE ADDRESS OF THE MESSAGE(WHICH ENDS WIH A "~"). 18830400
REMAINING VARIABLES MAY BE USED AS DESIRED; 18830500
T ~ SPACE(12); 18830600
IF R4 { 2 THEN 18830700
BEGIN; % 29-1 18830800
STREAM(J:T); 18830900
BEGIN % 29-2 18831000
DS ~ 9 LIT "-DEC ERR:"; 18831100
J ~ DI; 18831200
END; % 29-2 18831300
J ~ P; 18831400
IF R4=1 THEN 18831500
BEGIN; % 29-3 18831600
STREAM(T1~(R6<0),R6~ABS(R6),J); 18831700
BEGIN % 29-4 18831800
DS~17 LIT "ARRAY DIMINSION= ";T1(DS~1 LIT "-";); 18831900
SI ~ LOC R6; 18832000
DS ~ 8 DEC; J ~DI; 18832100
DI ~ DI-8; 18832200
DS ~ 7 FILL; DI ~ J; 18832300
DS ~ 2 LIT " ~"; 18832400
END; % 29-4 18832500
END % 29-3 18832600
ELSE 18832700
BEGIN; % 29-5 18832800
STREAM(R6,7); 18832900
BEGIN % 29-6 18833000
DS ~15 LIT "NO. DISK ROWS= "; 18833100
SI ~ LOC R6; 18833200
DS ~ 8 DEC; J ~ DI; 18833300
DI ~ DI-8; 18833400
DS ~ 7 FILL; DI ~ J; 18833500
DS ~ 2 LIT " ~"; 18833600
END; % 29-6 18833700
END; % 29-5 18833800
END; % 29-1 18833900
IF R4=3 THEN 18834000
BEGIN 18834100
;STREAM(T); 18834200
BEGIN 18834300
DS ~ 18 LIT "-EXP ARGMNT >158:~; % %740-18834400
END; 18834500
END; 18834600
IF R4 = 4 THEN STREAM(R); BEGIN 18834700
DS:=37 LIT"ILLEGAL PERFORM - RETURN OR RELEASE:~"; 18834800
END; 18834900
IF R5 THEN 18835000
BEGIN % 29-7 18835100
TERMINATE(P1MIX); 18835200
TERMINALMESSAGE(-T); 18835300
END % 29-7 18835400
ELSE 18835500
SPOUT(T); 18835600
GO TO INITIATE; 18835700
C38:: % RETURN STORAGE AND AUXILIARY MEMORY FOR CODE OR DATA SEGMENT 18840000
IF A4.[1:1] THEN % CODE SEGMENT 18840100
BEGIN A ~ PRT[P1MIX,*]; T ~ NFLAG(A4 & (I~0)[5:5:1]); 18840200
DO IF T.[5:1] THEN I ~ T.[FF] ELSE 18840300
IF T.[6:1] THEN I ~ T.[7:11] ELSE 18840400
T ~ NFLAG(A[T.[7:11]]) 18840500
UNTIL I!0; 18840600
ADDR ~ I INX A[4]; 18840700
IF ADDR[0].[3:1] THEN 18840800
COMPLEXSLEEP((NOT ADDR[0].[3:1])); 18840900
ADDR[0].[3:2] ~ 2; 18841000
COMMENT TURN OFF AUXILIARY MEMORY FLAG, AND TURN 18841100
ON THE "DO NOT TOUCH" FLAG FOR 18841200
RE-ENTRANT PRESENCE-BIT PROTECTION; 18841300
IF NOT STOREDY THEN SLEEP([TOGLE], STOREMASK); 18841400
LOCKTOG(STOREMASK); 18841500
IF (I ~ (T ~ ADDR[0]).[FF])>1023 THEN % PRESENT 18841600
BEGIN J ~ M[I-1]; P(OLAY(I-2), DEL) END 18841700
$ SET OMIT = NOT(AUXMEM) 18841800
$ SET OMIT = AUXMEM 18842200
; 18842300
$ POP OMIT 18842400
$ SET OMIT = NOT(AUXMEM) 18842500
ADDR[0].[3;1]~0; 18843400
COMMENT 3:1 =0, NOT BEING MASSAGED BY PRESENCE BIT 18843500
4:2 =2, ASSIGN AUXILIARY MEMORY NEXT OVELAY; 18843600
UNLOCKTOG(STOREMASK); 18843700
GO TO INITIATE 18843800
END; % OF CODE SEGMENTS 18843900
IF NOT STOREDY THEN SLEEP([TOGLE], STOREMASK); 18844000
LOCKTOG(STOREMASK); 18844100
IF (T ~ NFLAG(M[J ~ A4.[FF]])).[2:1] THEN 18844200
BEGIN M[J].[3:3]+7; %MARK AS "READ-ONLY", ALREADY WRITTEN 18844300
M[T INX NOT 0] ~ (*P(DUP)) & ((I~P(DUP).[FF]) OR 1)[CTF]; 18844400
AITL ~ M[T INX NOT 1].[2:1]; 18844500
P(OLAY(T.[CF]-2)); 18844600
$ SET OMIT = NOT(DEBUGGING) 18844700
P(DEL) 18845100
END ELSE AITL~((I~T.[CF])=1); 18845200
IF I>511 THEN DISKRTN(I, T.[8:10]); 18845300
M[J] ~ FLAG(T&0[2;42:6]&AITL[CTC]); 18845400
UNLOCKTOG(STOREMASK); 18845500
GO TO INITIATE; 18845600
C39:: % BASIC ARRAY RETURN 18850000
ARTN(N4[0],R5); % RETURN R5 DIM ARRAY 18850100
GO TO C3A; % TO REMOVE FROM AIT 18850200
C47:: PRT[P1MIX,8] ~ FLAG(R8);%DONE ONLY AT END OF INTERRUPTER INTRIN18860000
P(8 INX PRT[P1MIX,TSX],DUP,LOD,0,FFX,XCH,STD); 18860100
GO TO INITIATE; 18860200
% MEMORY DUMP OR TRACE FROM THE INTRINSICS 18870000
C48: % 18870100
$ SET OMIT = NOT(DUMP OR DEBUGGING) 18870200
IF I4 NEQ 0 THEN 18870300
$ SET OMIT = NOT(DEBUGGING) OR OMIT 18870400
ELSE DUMPNOW(R5); 18870700
$ POP OMIT 18870800
GO TO INITIATE;% 18870900
END OF COMMUNICATE0; 18872000
SAVE PROCEDURE COM2; %721-19300000
BEGIN % SLEEP FUNCTION (ALGOL WAIT) 19301000
REAL R4=-4; ARRAY A5=-5[*]; %721-19302000
SLEEP([M[A5]],R4); %721-19303000
GO TO RETURN; %721-19304000
END COM2; %721-19305000
PROCEDURE SHORTCOMMUNICATE; 19500000
BEGIN REAL R4=-4,R5=-5,R6=-6,R7=-7,R8=-8,R9=-9; % (SHM)19501000
INTEGER I4=-4,I5=-5,I6=-6; 19502000
ARRAY A4=-4[*],A5=-5[*],A6=-6[*]; 19503000
ARRAY A7=-7[*]; 19504000
NAME N4=-4,N5=-5,N6=-6; 19505000
LABEL C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15, 19506000
C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28, 19507000
C29,C30,C31,C32,C33,C34,C35,C36,C37,C38,C39,C40,C41,C42,C43,C4419508000
,C46,SL,TW; 19508010
SWITCH C:=SL,TW,C2,TW,SL,C5,TW,TW,TW,C9,C10,C11,TW,C13,C14, 19511000
SL,SL,TW,C18,C19,TW,TW,TW,C23,C24,TW,TW,C27,C28, 19512000
TW,SL,SL,SL,SL,C34,C35,C36,C37,TW,TW,C40,C41, 19513000
C42,C43,C44,SL,C46,TW,TW,SL; 19513010
DEFINE CN=DIFFCOM#; 19515000
LABEL AC0,AC1,AC2,AC3,AC4,AC5; 19517000
SWITCH AC ~ AC0,AC1,AC2,AC3,AC4,AC5; 19518000
REAL I,J,T,RCW=+0; 19519000
ARRAY AIT[*]; REAL AITL=AIT; ARRAY A=AIT[*]; 19520000
ARRAY FIB=AIT[*],FPB[*],H[*];LABEL CHANGENAME; 19521000
NAME ADDR; 19522000
DEFINE BITS=(IF SB THEN DS~SET ELSE DS~RESET; SKIP SB)#; 19523000
CHECKSTACKSPACE;% %WF 19525000
IF P(PRT[P1MIX,9],DUP) < 0 THEN 19525100
BEGIN P(DEL); TERMINATE(P1MIX); TERMINALMESSAGE(81) END; 19525200
GO TO C[P]; 19526000
SL: P(.COMMUNCATE1); GO DIFFCOM; 19526100
TW: P(.COMMUNICATE0); GO DIFFCOM; 19526200
% SLEEP 19541100
C2: P(.COM2); GO TO CN; %721-19542000
% RETURN SPECIFIC ARRAY 19543000
% EOJ 19552000
C5: P(.COM5); GO TO CN; 19553000
% FILL WITH INQUIRY 19559000
C9: 19560000
$ SET OMIT = NOT(DATACOM) 19561000
% BLOCK EXIT 19565000
C10: P(.ASR); GO TO CN; 19566000
% ALGOL I/O FUNCTIONS 19567000
C11: % (SHM)19568000
IF R4=0 THEN FILEOPEN(0,A5,[CF]); % (SHM)19569000
IF R4=6 THEN % (SHM)19570000
BEGIN FILECLOSE(NFLAG(A5)); GO TO INITIATE END; % (SHM)19571000
IF R4=4 THEN % (SHM)19572000
BEGIN % (SHM)19573000
IF A5[4] THEN % FILE IS IN DIRECTORY % (SHM)19574000
FORGETSPACE(DIRECTORYSEARCH(R8,R7,-(A5,[CF])&R6[CTF]) ELSE 19575000
BEGIN % (SHM)19576000
IF (T:=R9.[18:5]) GTR 0 THEN % EU SPECIFIED % (SHM)19576100
T:=(IF T GTR 20 THEN 0 ELSE -T) ELSE % (SHM)19576200
IF (T:=R9.[16:2]) GTR 0 THEN % SPEED SPECIFIED % (SHM)19576300
T:=(IF T GTR 2 THEN 0 ELSE T) ELSE % (SHM)19576400
T:=0; % NO SPEED OR EU SPECIFIED % (SHM)19576500
A5[R6]:=PETUSERDISK(A5[8],T); % (SHM)19576600
END; % (SHM)19576700
GO TO INITIATE; % (SHM)19577000
END; % (SHM)19577100
P(.COM11); GO TO DIFFCOM; % (SHM)19578000
% COBOL I/O FUNCTIONS 19579000
C13: P(.COM13); GO TO CN; 19580000
% INVERT OVERLAYABLE STATUS 19581000
C14: IF NOT N4[0].[2:1] THEN MAKEPRESENT([N4[0]] INX 0); 19582000
M[N4[0] INX NOT 1]~P(DUP,LOD)&P(DUP,LNG)[2:2:1]; 19583000
GO TO INITIATE; 19584000
% ERROR - INQUIRY WRITE 19584200
C18: 19584300
$ SET OMIT = NOT(DATACOM) 19584400
GO TO INITIATE; 19584700
% PRINT BACK-UP 19585000
C19: P(.COM19); GO TO CN; 19586000
% LOAD CONTROL 19587000
C23:: P(.COM23); GO TO CN; 19588000
% RETURN ONE ROW OF A DISK FILE 19589000
C24:: T:=A4[R5]; A4[R5]:=0; 19590000
$ SET OMIT = SHAREDISK 19591000
FORGETUSERDISK(T,A4[8]); 19592000
$ POP OMIT 19592001
$ SET OMIT = NOT(SHAREDISK) 19593000
GO TO INITIATE; 19595000
% COBOL DATACOM I INTERROGATE 19601000
C27:: 19602000
$ SET OMIT = NOT(DATACOM ) 19603000
GO INITIATE; 19637000
% ALGOL DATACOM I INTERROGATE 19638000
C28:: 19639000
$ SET OMIT = NOT(DATACOM ) 19640000
GO INITIATE; 19668000
C34:: IF (T~R4) > 0 THEN STREAM(R4,T~T~SPACE(17)); 19680200
BEGIN SI~R4; DS~17 WDS END; 19680300
TERMINATE(P1MIX);% 19680400
TERMINALMESSAGE(-T);% 19680500
C35:: IF R4.[18:4]=1 THEN P(.LIBRARYZERO) 19681000
ELSE P(.LIBRARYCOPY); 19681100
GO TO CN; 19682000
C36:: % TYPE 19 DATACOM I/O INTERFACE 19683000
$ SET OMIT = DATACOM 19683499
GO TO INITIATE; 19683500
$ POP OMIT 19683501
$ SET OMIT = NOT(DATACOM ) 19684000
C37:: 19685010
AIT~JARROW[P1MIX]; 19685015
IF AIT[9].[FF]=0 THE NAIT[9].[FF]~GETESPDISK; 19685020
H~[M[SPACE(5)]]&5[8:38:10]; 19685025
H[1]~R5;H[2]~R4; 19685030
$ SET OMIT = NOT(DATACOM ) 19685035
$ SET OMIT = DATACOM 19685050
H[3]~0; 19685055
$ POP OMIT 19685060
DISKWAIT(H INX 0,5,AIT[9].[FF]); 19685065
FORGETSPACE(H); 19685070
GO TO INITIATE; 19685075
C40:: IF R5.[8:10]=1023 THEN 19685340
BEGIN M[R5.[CF]]:=PRNTABLE[R5.[FF]];GO INITIATE;END ELSE 19685350
IF R5.[CF]=0 THEN 19685360
BEGIN LINKUP(R6,R5:=R5.[FF]); 19685370
SLEEP([M[R5]],@1000000000000000); GO RETURN; 19685380
END ELSE 19685390
IF R5.[15:15]=0 THEN 19685400
BEGIN 19685410
$ SET OMIT = NOT(DATACOM ) 19685419
$ SET OMIT = DATACOM 19685429
M[R5]:=0; 19685430
$ POP OMIT 19685431
GO INITIATE; 19685440
END ELSE 19685450
IF R5.[FF]=@77777 THEN 19685452
BEGIN M[R5]:=MOD3IOS; GO INITIATE; END ELSE 19685456
BEGIN INDEPENDENTRUNNER(P(.DKBUSINESS),R5,128); SLEEP([M[R5]],1); 19685460
GO RETURN; 19685470
END; 19685480
C41:: IOREQUEST(R7,R6,FLAG(R5)); GO INITIATE; 19685550
C42:: P(..TISKTASK); GO TO CN; 19685560
C43:: H ~ PRT[P1MIX,TSX]; % SET TASK ATTRIBUTES 19685570
H[1] ~ JAR[P1MIX,0]; H[2] ~ JAR[P1MIX,1]; 19685580
H[3] ~ 2; H[4] ~ P1MIX; H[6] ~ 2; 19685585
GO TO INITIATE; 19685590
C44:: P(..PICKTHELOCK); GO TO CN; 19685595
C46:: P(..EVENTANDINTERRUPT); GO TO CN; % ATTACH, DETACH, CAUSE STMTS 19685596
END OF SHORT COMMUNICATE;% 19686000
PROCEDURE TISKTASK; 19687000
% A COBOL OR ALGOL PROGRAM WHICH EITHER CONTAINS OR IS INVOKED BY A 19687100
% PROCESS, CALL, OR RUN/EXECUTE STATEMENT, OR MANIPULATES LOCKS (COBOL)19687120
% OR EVENTS (ALGOL), WILL BE FLAGGED IN SEGMENT 0 (WORD 2 [3:1]=1) OF 19687140
% ITS CODE FILE AS HAVING A TASK ARRAY. 19687150
% THE FORMAT OF THE TASK ARRAY (MYSELF AT PRT[TSX]) IS AS FOLLOWS 19687200
% TSKA[0] = TASKVALUE: PROVIDED FOR USER 19687300
% TSKA[1] = 7 CHR MFID OF CODE FILE 19687400
% TSKA[2] = 7 CHR FID OF CODE FILE 19687500
% TSKA[3] = STATUS: 1=SCHEDULED 19687600
% 2=ACTIVE 19687610
% -1=TERMINATED (DS-ED OR EOJ) 19687650
% -2=INITIATION ATTEMPTED BUT FAILED 19687680
% TSKA[4] = STACKNO: MIX INDEX IF RUNNING 19687700
% SCHEDULE-ID IF SCHEDULED 19687750
% TSKA[5] =HEAD OF LIST OF LOCK-ITEMS IN CONTROL OR QUEUED19687780
% TSKA[6] = TYPE: 0=ASYNCHRONOUS DEPENDENT (PROCESS) 19687800
% 1=SYNCHRONOUS DEPENDENT (CALL) 19687840
% 2=INDEPENDENT (RUN/EXECUTE) 19687850
% TSKA[7] = CALL STATE: 0=INITIAL 19687860
% 1= EXIT PROGRAM/ 19687870
% EXIT PROGRAM RETURN HERE 19687872
% 2=CONTINUED OR RE-CALLED 19687874
% TSKA[8] : [1:1]=1 IFF JUST EXECUTED INTERRUPTER INTRINSC19687876
% AND SFINTQ IS NON-EMPTY 19687878
% [2:1]=1 IFF SFINTQ IS NON-EMPTY 19687880
% [3:1]=1 IFF INTERRUPTER INTRINSIC IS RUNNING 19687882
% [4:1] = SFINTQ INTERLOCK BIT (ON TO START) 19687883
% [FF] = ABSOLUTE ADDRESS OF OLD IRCW 19687884
% [CF] = HEAD OF LIST OF DECLARED INTERRUPTS 19687885
% SEGMENT 0 FOR IPC PROGRAM FILES: 19687886
% S[2].[2:1] =1 IF THERE ARE DECLARED INTERRUPTS 19687887
% S[2].[3:1] =1 FOR AN IPC PROGRAM FILE 19687888
% (EITHER INVOKING OR INVOKED) 19687889
% S[2].[4:1] =1 FOR AN INVOKED IPC PROGRAM FILE 19687890
% NOTE: S[2].[2:3] = JAR[2].[5:3]. JAR[2].[6:1]=1 INDICATES TO COM5 19687892
% THAT THIS JOB MAY HAVE DEPENDENT TASK DESCENDENTS TO BE DS-ED 19687894
% OR ES-ED AND LOCK QUEUES TO BE CLEANED UP WHEN IT TERMINATES. 19687896
% S[8] NUMBER OF TASK PARAMETERS TO BE RECEIVED 19687898
% ( = N BELOW). 19687900
% S[9] DISK ADDRESS OF PARAMETER DESCRIPTION SEG 19687910
% FORMAT OF ENTRY IN PARAMETER DESCRIPTION SEGMENT: 19687920
% (BEGINNING IN WORD 1) 19687925
% [18:15] : TYPE - 0 TASK ARRAY - NAME 19687930
% 1 EVENT/LOCK - NAME 19687935
% 2 PRT CELL - NAME 19687940
% 3 PRT CELL - VALUE 19687945
% 4 (SAVE) ARRAY - NAME 19687950
% 5 ARRAY - VALUE 19687955
% (ONLY 1-DIMENSIONAL ARRAYS CAN BE PASSED AS TASK PARAMETERS). 19687957
% [8:10] : SIZE - SIZE OF ARRAY FOR TYPES 4 AND 5, ELSE 0 19687960
% [33:15] : LOCATION-PRT LOCATION FOR TYPES 0-4, FOR TYPE 5: 19687965
% -RELATIVE DISK ADDRESS OF TYPE-2 SEGMENT 19687970
% TISTASK MAKES A TEST FOR AGREEMENT BETWEEN THE TASK PARAMETERS 19687975
% SPECIFIED IN THE PARAMETER DESCRIPTION SEGMENT AND THOSE SPECIFIED BY19687977
% THE F- CELLS (SEE BELOW). LACK OF AGREEMENT EITHER DS-ES THE PARENT 19687980
% OR CAUSES A 1 TO BE RETURNED (IN THE CASE OF A COBOL PROGRAM WHICH 19687982
% CONTAINS AN "ON EXCEPTION" CLAUSE). 19687984
% TISKTASK COPIES THE CODE FILE, FILLING NAME AND VALUE PARAMETERS INTO19687990
% THE NEW PRT AND WRITING OUT VALUE ARRAYS AS TYPE-2 SEGMENTS. THE JOB 19687995
% IS ENTERED IN THE SCHEDULE AND THE SCHEDULE-ID IS ENTERED IN THE 19687997
% TASK ARRAY. THE NEW SHEET ENTRY IS FLAGGED A GO JOB (AS FROM A 19687998
% COMPILE-AND-GO). 19687999
BEGIN 19688000
REAL MFID=-4,FID=-5, % FILE ID OF CODE FILE TO BE INVOKED 19688050
% MFID<0 IF ON EXCEPTION CLAUSE IS PRESENT19688060
% FID<0 IF CALL OR CONTINUE STATEMENT 19688070
N=-6; % NUMBER OF F- PARAMS BETWEEN F-7 AND MKSCW19689000
% THERE WILL BE A PAIR OF F- CELLS FOR 19689010
% EACH TASK PARAMETER. F(-I) CONTAINS 19689020
% THE NAME OR VALUE OF THE PARAMETER. 19689030
% F(-(I+1)) CONTAINS THE TYPE 19689040
% (AS IN SEGMENT 0). 19689050
% (TSKA IS THE FIRST TASK PARAMETER) 19689060
% N<0 IF CONTINUE STATEMENT 19689070
ARRAY NAME PARM; 19691000
ARRAY S[*],R[*],H[*],D[*],W[*], 19692000
TSKA=-7[*]; % TASK ARRAY DESCRIPTOR FOR PROCESS, CALL 19692100
% INTEGER = TASK ARRAY LENGTH FOR RUN 19692200
REAL T,T1,T2,T3,T4,ONEXCEPTION,CALLEDORCONT, 19693000
VARRAY,IOD,IOD1,NR,SR,HADDR,PRTRLOC,PRTSZ,ERR,SZ,S1,CR,PRTS; 19694000
LABEL L1,ERROR,NEXTROW,L2,XYT; 19695000
INTEGER PADDR,ADDR; 19696000
REAL COMMON,F,ESTPROC,ESTIO,STKSZ; %110-19696100
DEFINE CONTINUED = VARRAY#, SAVEBIT = IOD1#; 19696500
ONEXCEPTION ~ MFID<0; MFID ~ ABS(MFID); 19696600
CALLEDORCONT ~ FID<0; FID ~ ABS(FID); 19696700
CONTINUED ~ N<0; N ~ ABS(N); 19696800
PARM ~ [N]; 19697000
IF CALLEDORCONT THEN % CALL OR CONTINUE STATEMENT 19697200
BEGIN IF CONTINUED THEN IF TSKA[3]!2 OR TSKA[7]!1 THEN 19697300
BEGIN ERR ~ 1; TERMINATE(P1MIX&98[CTF]); GO XYT; 19697400
END; 19697500
IF TSKA[3]=2 THEN IF TSKA[7]=1 THEN 19697600
BEGIN TSKA[7] ~ 2; GO XYT; 19697700
END ELSE ELSE TSKA[7] ~ 0; 19697800
END; 19697900
IF (T:=DIRECTORYSEARCH(MFID,FID,3)) GEQ 64 THEN 19698000
BEGIN IF SECURITYCHECK(MFID,FID,USERCODE[P1MIX],T)=0 THEN 19699000
L1: BEGIN ERR ~ 1; 19700000
IF T GEQ 64 THEN FORGETSPACE(T); 19700500
GO ERROR; 19701000
END; 19702000
IF M[T INX 4].[9:2]!3 THEN GO L1; % NOT EXECUTABLE CODE 19703000
END ELSE GO L1; 19704000
IF TSKA.PBIT THEN IF TSKA[3]}1 THEN GO L1; 19704100
S ~ [M[GETSPACE(30,2,0)+2]]&30[8:38:10]; 19705000
% READ SEGMENT ZERO INTO S 19706000
DISKWAIT(-S.[CF],30,M[T INX 10]); 19707000
IF S[8]!N THEN 19708000
L2: BEGIN FORGETSPACE(S); 19709000
GO L1; 19710000
END; 19711000
W ~ [M[GETSPACE(T3~N DIV 2+1,2,0)+2]]&T3[8:38:10]; 19711100
% READ IPC PARAMETER DESCRIPTION SEGMENT INTO W 19711200
DISKWAIT(-W.[CF],T3,ADDR ~ M[T INX (10+((T2~S[9]) 19711300
DIV (SR~M[T INX 8])))] + (T2 MOD SR)); 19711400
FOR T1 ~ 2 STEP 2 UNTIL N DO 19713000
IF PARM[NOT(T1-1)]!W[T1 DIV 2].[FF] THEN 19714000
BEGIN FORGETSPACE(W); 19714100
GO L2; 19714200
END; 19714300
% READ PRT INTO R 19718000
R ~ [M[GETSPACE(S[3],2,0)+2]]&S[3][8:38:10]; 19719000
DISKWAIT(-R.[CF],S[3],PADDR ~ M[T INX (10+((PRTS~S[2].[CF]) 19720000
DIV SR))] + (PRTS MOD SR)); 19721000
FOR T1 ~ 2 STEP 2 UNTIL N DO 19722000
IF PARM[NOT(T1-1)]=5 THEN % PASS-BY-VALUE ARRAY 19723000
BEGIN PARM[NOT(T1-1)] ~ W[T1 DIV 2].[CF]; % RELATIVE DISK LOCA-19724000
VARRAY ~ VARRAY+1; % TION OF TYPE-2 SEG 19725000
END ELSE 19726000
BEGIN R[W[T1 DIV 2].[CF]] ~ *[PARM[NOT(T1-2)]];% PLACE NAME 19727000
PARM[NOT(T1-1)] ~ -@77777; % OR VALUE IN PRT19728000
END; 19729000
% BUILD HEADER FOR NEW CODE FILE IN H 19730000
H ~ [M[GETSPACE(30,2,0)+2]]&30[8:38:10]; 19731000
MOVE[30,T INX 0,[H]); 19732000
H[2] ~ H[5] ~ H[6] ~ 0; 19733000
T4 ~ M[T INX 9].[43:5]-1; 19733400
WHILE M[T INX (10+NR)]!0 AND NR{T4 DO NR ~ NR+1; % NR = # ROWS 19733600
T4 ~ NR+9; 19734000
H[4].[16:20] ~ 0; 19735000
H[9] ~ NR; 19735050
FOR T1 ~ 10 STEP 1 UNTIL T4 DO H[T1] ~ GETUSERDISK(SR); 19736000
HADDR ~ GETESPDISK; 19737000
DISKIO(IOD,H INX 0-1,30,HADDR); 19738000
F ~ S[15]; % SAVE LABEL EQUATION ENTRIES %110-19738100
ESTPROC:=S[16]; % SAVE ESTIMATED PROCESSOR TIME %110-19738110
ESTIO:= S[17]; % SAVE ESTIMATED I/O TIME %110-19738120
COMMON ~ S[19]; % SAVE COMMON VALUE %110-19738200
STKSZ:= S[21]; % SAVE STACK SIZE %110-19738210
CR ~ S[7],[FF]; % SAVE CORE REQ. 19739000
PRTRLOC ~ PRTS DIV SR; % ROW PRT IS LOCATED IN 19740000
PADDR !(PRTS MOD SR); % WHICH SEGMENT IN ROW 19741000
PRTSZ ~((S[3]+29) DIV 30); % NUMBER OF SEGMENTS IT OCCUPIES 19742000
SLEEP([IOD],IOMASK); 19743000
S1 ~ SR-1; % NO. OF SEGS/ROW - 1 19744000
FOR T1 := 10 STEP 1 UNTIL T4 DO % COPY CODE FILE CHANGEING%110-19746000
BEGIN % PRT & PASS-BY-VALUE SEGMENT19747000
FOR T3 := 0 STEP 1 UNTIL S1 DO % COPY ROW %171-19748000
BEGIN %110-19749000
DISKWAIT(-S.[CF],30,M[T INX T1]+T3); % READ SEGMENT %110-19750000
IF(T1=10) THEN IF(T3=0) THEN S[2].[3:2] ~ 3; % INVOKED 19750100
DISKWAIT( S.[CF],30,H[T1] +T3); % WRITE IT BACK%110-19751000
END; %110-19752000
IF(T1-10)=PRTRLOC THEN % PRT IS IN THIS ROW %110-19753000
DISKWAIT(R.[CF],PRTSZ|30,H[T1]+PADDR); % WRITE OUT PRT 19754000
IF VARRAY > 0 THEN % LOOK FOR TYPE-2 SEGMENTS IN THIS ROW 19755000
FOR T2:=2 STEP 2 UNTIL N DO %110-19756000
IF(T1-10)=(PARM[NOT(T2-1__DIV SR) THEN %110-19757000
% WE HAVE A TYPE-2 SEGMENT IN THIS ROW %110-19758000
BEGIN % MOVE SEGMENT TO CODE FILE ROW %110-19759000
SZ:=(W[T2 DIV 2].[8:10]+29) DIV 30; %110-19760000
D:=PARM[NOT(T2-2)]; %110-19761000
ADDR:=(PARM[NOT(T2-1)]MOD SR); %110-19762000
VARRAY:=VARRAY-1; %110-19763000
WHILE D.PBIT=0 DO %110-19764000
MAKEPRESENT([T] INX(NOT 1)); % ADDRESS OF D %110-19765000
SAVEBIT:=M[D INX (NOT 1)].[2:1]; %110-19766000
P(M[D INX (NOT 0)]); %110-19766100
M[D INX (NOT 1)].[2:1]:=1; %110-19766200
DISKWAIT(D.[CF],SZ|30,H[T1]+ADDR); %110-19766300
M[D INX (NOT 0)]:=P(XCH); %110-19766400
M[D INX (NOT 1)].[2:1]:=SAVEBIT; %110-19766500
END; %110-19766600
END; %110-19766700
FORGETSPACE(R); FORGETSPACE(T); FORGETSPACE(W); %110-19766800
% BUILD SHEET SKELETON IN S 19767700
STREAM(S);BEGIN 30(DS ~ 8 LIT "0"); END; 19767750
S[20] ~ CR; 19767760
S[25] ~ MADDR; 19767800
S[0] ~ MFID; 19767900
S[1] ~ FID; 19768000
S[2] ~ S[18] ~ PRYOR[P1MIX]; 19768050
% WRITE OUT DUMMY CONTROL CARD FOR LOGGING ROUTINE 19768100
STREAM(X~S[24]~USERCODE[P1MIX], MFID, FID, T~[H[2]] ); %722-19768200
BEGIN SI~LOC X; DS~9 LIT "CC USER ="; %722-19768300
SI!SI+1; DS~7 CHR; DS~9 LIT ";EXECUTE "; %722-19768400
2(SI~SI+1; DS~7 CHR; DS~LIT "/"); DI~DI-1; %722-19768450
DS~6 LIT ";END.~"; DS~16 LIT " "; %722-19768500
END STREAM; 19768550
H[0] ~ 0; 19768600
H[1] ~ 10; 19768650
S[6] ~ GETESPDISK & 10 [CTF]; 19768700
DISKWAIT(H.[CF],11,S[6] INX 0); 19768750
$ SET OMIT = NOT PACKETS %110-19768760
% PUT DUMMY CONTROL CARD IN PACKET PAGE ALSO %110-19768762
IF (T~PSEUDOMIX[P1MIX]) GEQ 32 THEN % ITS A PACKET JOB %110-19768764
BEGIN %110-19768766
STREAM(A~[JAR[P1MIX,0]],M~P1MIX,B~[H[2]],T1~T1~SPACE(10)); 19768768
BEGIN %110-19768770
DS~2 LIT">>>"; SI~B; DS~30 CHR; DS~14 CHR; %722-19768772
DS~13 LIT". INVOKED BY "; SI~A; SI~SI+1; DS~7 CHR;DS~LIT"/";19768774
SI~SI+1; DS~7 CHR; DS~LIT"="; SI~LOC M; DS~2 DEC; %110-19768776
DS~LIT LEFTARROW; DI~DI-3; DS~FILL; %110-19768778
END; %110-19768780
SPOUTER(T1,T,0); %110-19768782
END; %110-19768784
$ POP OMIT %110-19768786
SLEEP([TOGLE],SHEETMASK); LOCKTOG(SHEETMASK); 19768800
STREAM(A~0:B~P(.SCHEDULEIDS)); 19768900
BEGIN SI~B; 19768950
47(SKIP SB; SKIP DB; TALLY~TALLY+1; 19769000
IF SB THEN BEGIN END ELSE JUMP OUT); 19770000
DS~SET; A~TALLY; 19771000
END STREAM; 19772000
T1 ~ P; S[3] ~ D&T1[8:38:10]; 19773000
S[23]:=0&( %110-19774000
$ SET OMIT = NOT PACKETS %110-19774050
IF(T~PSEUDOMIX[P1MIX])!0 THEN T %110-19774100
ELSE %110-19774150
$ POP OMIT %110-19774200
$ SET OMIT = NOT DATACOM %110-19774250
26][2:42:6] %110-19774450
$ SET OMIT = NOT DATACOM %110-19774500
&((CLOCK+P(RTR)) DIV 60)[24:24:24]; %110-19774650
$ SET OMIT = NOT PACKETS %110-19774700
IF T GEQ 32 THEN PACKETACT[T-32]~PACKETACT[T-32]+1; %110-19774750
$ POP OMIT %110-19774800
S[24]:=USERCODE[P1MIX]; %110-19774850
S[12]:=512; %110-19775000
S[15] ~ F; % PUT LABEL EQUATION ENTRIES IN SHEET %110-19775100
S[16]:=ESTPROC; %110-19776000
S[17]:=ESTIO; %110-19776010
S[19] ~ COMMON; % AND COMMON %110-19776100
S[21]:=STKSZ; %110-19776110
HADDR ~ GETESPDISK; 19777000
IF SHEET[0].[CF]!0 THEN 19778000
BEGIN DISKWAIT(-H.[CF],30,T2 ~ SHEET[0].[FF]); 19779000
H[29] ~ HADDR; 19780000
DISKWAIT(H.[CF],30,T2); 19781000
END ELSE SHEET[0] ~ HADDR; 19782000
SHEET[0].[FF] ~ HADDR; 19783000
S[29] ~ 0; 19784000
DISKWAIT(S.[CF],30,HADDR); 19785000
UNLOCKTOG(SHEETMASK); FORGETSPACE(S); FORGETSPACE(H); 19786000
ERROR: 19787000
IF TSKA.PBIT THEN 19788000
BEGIN TSKA[3] ~ 1-3|ERR; % STATUS: SCHEDULED OR ERROR19791000
IF NOT ERR THEN TSKA[4] ~ T1; % SCHEDLE-ID 19792000
END; 19793000
IF ERR AND NOT ONEXCEPTION THEN TERMINATE(P1MIX&94[CTF]) ELSE 19796000
PARM[NOT(N+1)] ~ ERR; % PLACE BOOLEAN IN WORD BELOW MKSCW FOR 19797000
% ON EXCEPTION BRANCH IN COBOL 19798000
P(DIRECTORYSEARCH(NABS(MFID),FID,13),DEL);%CLOSE,FORGET HEADER 19799000
IF NOT ERR THEN SELECTION; 19799050
XYT:: IF CALLEDORCONT AND NOT ERR THEN COMPLEXSLEEP((TSKA[7] AND 1) 19799060
OR (TERMSET(P1MIX))); 19799070
END TISKTASK; 19800000
PROCEDURE PICKTHELOCK; 19900000
BEGIN COMMENT THIS PROCEDURE HANDLES LOCKING/UNLOCKING OF 19900010
LOCK-ITEMS FOR TASKING. IT ALSO HANDLES THE MAINTENANCE 19900020
OF A WAIT QUEUE AND PASSING CONTROL OF THE LOCK TO THE 19900030
FIRST PROCESS IN THE WAIT QUEUE. AFTER IT HAS BEEN 19900040
RELEASED BY ANOTHER PROCESS, THE HEAD OF THE QUEUE IS 19900050
THE LOCK-ITEM OF THE PROCESS CURRENTLY IN CONTROL AND 19900060
ENTRIES ARE MADE AT THE END OF THE QUEUE. LOCK-ITEMS 19900070
ARE IN THE PRT AND HAVE THE FOLLOWING FORMAT: 19900080
[1:1]=1, MEANS LOCKED(LOCK BIT,ORIGINAL ONLY) 19900090
[2:1]=1, IN CONTROL(CONTROL BIT) 19900100
[3:1]=1, ORIGINAL LOCK-ITEM(ORIGINAL BIT) 19900110
=0, A COPY 19900120
[4:1]= QUEUE INTERLOCK(ORIGINAL ONLY) 19900130
[8:10]=MIX INDEX OF PROGRAM IN CONTROL(ORIGINAL) 19900140
=RELATIVE PRT ADDRESS USED TO LINK ALL LOCK-ITEMS 19900150
IN CONTROL OR IN WAIT QUEUES(COPY) 19900160
[18:15]=POINTER TO NEXT PROCESS IN WAIT QUEUE, ELSE 0 19900170
[33:15]=POINTER TO HEAD OF QUEUE(ORIGINAL) 19900180
=POINTER TO ORIGINAL LOCK-ITEM(COPY) 19900190
"LOCKPTR" IS THE PARAMETER PASSED AND HAS THE FORMAT: 19900200
[1:1]=0, MEANS LOCK, ELSE UNLOCK 19900210
[2:1]=1, " TEST LOCK BIT, LOCK IF UNLOCKED AND 19900220
RETURN A 0, ELSE RETURN 1 19900230
[33:15]=RELATIVE PRT ADDRESS OF LOCK-ITEM; 19900240
REAL LOCKPTR=-4;%PARAMETER 19900250
REAL Q,R,S,T,U,V; 19900260
ARRAY A[*]; 19900270
DEFINE DSED=TERMSET(P1MIX)#, IMASK=@200000000000000#; 19900280
SUBROUTINE LINKIT; 19900290
BEGIN IF(V:=A[5])=0 THEN A[5]:=LOCKPTR INX 0 19900300
ELSE BEGIN WHILE PRT[P1MIX,V].[8:10] NEQ 0 DO 19900310
V:=PRT[P1MIX,V].[8:10]; 19900320
PRT[P1MIX,V].[8:10]:=LOCKPTR INX 0; 19900330
END; 19900340
END; 19900360
Q:=[PRT[P1MIX,LOCKPTR INX 0]] INX 0; 19900370
R~NFLAG(M[U+Q]); 19900380
S~IF R.[3:1] THEN Q ELSE (R INX 0); %ADDR OF ORIGINAL 19900390
A:=PRT[P1MIX,TSX];%TASK ARRAY 19900395
IF NOT M[S].[4:1] THEN SLEEP([M[S]],IMASK); 19900400
M[S].[4:1]:=0; 19900410
IF LOCKPTR.[2:1] THEN %TEST & LOCK 19900420
BEGIN IF NOT M[S].[1:1] THEN %UNLOCKED 19900430
BEGIN M[S]:=NABS(M[S])&U[CTC]&P1MIX[8:38:10]; 19900440
M[U]:=(M[U] OR M)&0[CTF]; 19900450
IF U!S THEN BEGIN M[U].[8:10]~0; 19900455
LINKIT; 19900460
END; 19900465
LOCKPTR:=0; 19900470
END ELSE LOCKPTR:=1; 19900480
M[S]:=(*P(DUP)) OR IMASK; 19900490
P(XIT); 19900500
END; 19900510
IF LOCKPTR GTR 0 THEN%LOCK 19900520
IF NOT M[U].[2:1] THEN%NOT IN CONTROL 19900530
BEGIN IF NOT M[S].[1:1] THEN 19900540
BEGIN M[S]:=NABS(M[S])&U[CTC]&P1MIX[8:38:10]; 19900550
M[U]:=((*P(DUP)) OR M)&0[CTF]; 19900560
IF U!S THEN BEGIN M[U].[8:10]~0; 19900565
LINKIT; 19900570
END; 19900575
END ELSE 19900580
BEGIN 19900590
T:=M[S] INX 0; 19900600
WHILE M[T].[FF] NEQ 0 DO T:=M[T].[FF]; 19900610
M[T].[FF]:=U; 19900620
M[U].[FF]:=0; 19900630
IF U!S THEN BEGIN M[U].[8:10]~0; LINKIT END; 19900650
M[S]:=(*P(DUP)) OR IMASK; 19900660
COMPLEXSLEEP(DSED OR M[U].[2:1]); 19900670
IF M[U].[2:1] THEN 19900675
M[S]~((*P(DUP))&P1MIX[8:38:10]) OR IMASK; 19900680
P(XIT); 19900690
END; 19900700
END ELSE ELSE %UNLOCK 19900710
BEGIN IF M[S].[1:1] THEN%LOCKED 19900720
BEGIN M[T:=M[S] INX 0].[2:1]:=0;%TURN OFF CONTROL 19900730
IF T!S THEN 19900735
BEGIN 19900740
A:=PRT[V:=M[S].[8:10],TSKX]; 19900745
R:=A[5]; 19900750
IF T NEQ ([PRT[V,R]] INX 0) THEN 19900755
BEGIN 19900758
WHILE M[S].[CF] NEQ ([PRT[V,R]] INX 0) DO 19900760
BEGIN U:=R; 19900770
R:=PRT[V,R].[8:10]; 19900780
END; 19900790
PRT[V,U].[8:10]:=PRT[V,R].[8:10];%DELINK 19900800
END ELSE A[5]:=M[T].[8:10; 19900805
END; 19900810
M[S].[CF]:=(T:=M[T].[FF]); 19900815
IF T NEQ 0 THEN 19900820
BEGIN M[T]~(*P(DUP)) OR M; P(XIT) END 19900830
ELSE M[S]:=ABS(M[S]); 19900840
END; 19900850
END; 19900855
M[S]:=(*P(DUP)) OR IMASK; 19900860
PROCEDURE EVENTANDINTERRUPT; 19900900
BEGIN 19901000
REAL TYPE=-4, % TYPE: 1=ATTACH INTERRUPT (AT REL.ADDR RELINT) 19901100
RELINT=-5, % TO EVENT (AT ABSOLUTE ADDR ABSEVT) 19901200
ABSEVT=-6; % 2=DETACH INTERRUPT (AT REL.ADDR RELINT) 19901300
% 3=CAUSE EVENT (AT ABSOLUTE ADDR ABSEVT) 19901400
REAL K,R,A,SIZE,MIX,J,I,ABSOLD=J; 19901500
LABEL ATTACHL,DETACHL,CAUSEL,ON,L1,L2,L3,L4,DONE; 19901600
SWITCH S ~ ATTACHL,DETACHL,CAUSEL; 19901700
ARRAY SFINTQ[*],TSKA[*]; 19901800
NAME BIGGERQ; 19901840
DEFINE TMASK = @200000000000000#,EMASK = @2000000000000000#; 19901850
SUBROUTINE DETACHINT; 19901900
BEGIN IF (ABSOLD~PRT[P1MIX,RELINT].[FF])!0 THEN 19902000
BEGIN WHILE NOT M[ABSOLD].[5:1] DO 19902100
ABSOLD ~ M[ABSOLD].[FF]; 19902120
IF M[ABSOLD]}0 THEN SLEEP([M[ABSOLD]],EMASK); 19902130
M[ABSOLD] ~ P(DUP,LOD,SSP); 19902140
K ~ T ~ PRT[P1MIX,RELINT].[FF]; 19902150
A ~[PRT[P1MIX,RELINT]] INX 0; 19902190
WHILE M[T].[FF]!A DO T ~ M[T].[FF]; 19902200
M[T].[FF] ~ IF T=K THEN 0 ELSE K; 19902300
PRT[P1MIX,RELINT].[FF] ~ 0; 19902350
M[ABSOLD] ~ P(DUP,LOD,SSN); 19902360
END; 19902400
END DETACHINT; 19902500
% FORMAT OF INTERRUPT (IN PRT): 19902501
% UPPER WORD (LINK WORD): 19902502
% [1:1]=1 IFF INTERRUPT IS DISALLOWED 19902503
% [FF]: ABSOLUTE ADDRESS OF NEXT INTERRUPT ON19902504
% EVENTS ATTACH LIST OR OF THE EVENT IF19902505
% THIS INTERRUPT IS THE LAST ON LIST 19902506
% [CF]: RELATIVE PRT ADDRESS OF NEXT DECLARED19902507
% INTERRUPT FOR THIS PROCESS 19902508
% LOWER WORD: PROCEDURE DESCRIPTOR FOR INTERRUPT 19902509
% FORMAT OF EVENT (IN PRT): 19902510
% "ORIGINAL" EVENT-ITEM (AT ABSOLUTE ADDR ABSEVT):19902511
% [1:1]: EVENT INTERLOCK BIT (ON TO START) 19902512
% [5:1]=1 DISTINGUISHES THE EVENT FROM 19902514
% ATTACHED INTERRUPTS 19902516
% [FF]: ABSOULTE ADDRESS OF FIRST INTERRUPT 19902520
% ON ATTACH LIST 19902522
% [47:1]: HAPPEN BIT 19902524
% "COPY" EVENT-ITEM (RECEIVED AS A PARAMETER): 19902526
% [CF]: ABSOLUTE ADDRESS OF ORIGINAL EVENT 19902527
% CONTENTS OF TSKA[8]: 19902528
% [1:1]=1 IFF INTERRUPTER HAS JUST RUN AND 19902529
% SFINTQ IS NON-EMPTY 19902530
% [2:1]=1 IFF SFINTQ IS NON-EMPTY 19902540
% [3:1]=1 IFF INTERRUPTER IS RUNNING 19902550
% [4:1]: SFINTQ INTERLOCK BIT (ON TO START) 19902560
% [FF] = ADDRESS OF OLD IRCW 19902570
% [CF] = RELATIVE PRT ADDRESS OF FIRST IN LINKED 19902580
% LIST OF DECLARED INTERRUPTS 19902593
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %19902600
GO TO S[TYPE-1]; 19902700
ATTACHL: DETACHINT; % AN ATTACH DOES AN IMPLICIT DETACH 19902800
IF M[ABSEVT]}0 THEN SLEEP([M[ABSEVT]],EMASK); 19902850
M[ABSEVT] ~ P(DUP,LOD,SSP); 19902860
IF (T~M[ABSEVT].[FF])=0 THEN T ~ ABSEVT; 19902900
PRT[P1MIX,RELINT] ~ PRT[P1MIX,RELINT]&T [CTF]&P1MIX [8:38:10]; 19903100
M[ABSEVT] ~ P(DUP,LOD,[PRT[P1MIX,RELINT]],CFX,SSN); 19903200
P(XIT); 19903300
DETACHL: DETACHINT; P(XIT); 19903400
CAUSEL: M[ABSEVT].[47:1] - 1; %SET HAPPEN BIT: AWAKEN ALL YE WHO WAIT19903500
IF M[ABSEVT].[FF]!0 THEN% IF THERE ARE INTERRUPTS ATTACHED 19903600
BEGIN IF M[ABSEVT]}0 THEN SLEEP([M[ABSEVT]],EMASK); 19903650
M[ABSEVT] ~ P(DUP,LOD,SSP); 19903660
A ~ M[ABSEVT].[FF]; 19903670
WHILE A!ABSEVT DO % INSERT ATTACHED INTERRTUPS IN THE 19903700
BEGIN % RELEVANT SFINTQS 19903800
MIX ~ (T~M[A]).[8:10]; 19903810
IF TERMSET(MIX) THEN 19903820
BEGIN IF T.[FF]!ABSEVT THEN 19903825
DO MIX ~ (T~M[A~T.[FF]]).[8:10] 19903830
UNTIL NOTERMSET(MIX) OR T.[FF]=ABSEVT; 19903850
IF TERMSET(MIX) THEN 19903860
BEGIN M[ABSEVT]~P(DUP,LOD,SSN); P(XIT);END;19903865
END; 19903870
TSKA ~ PRT[MIX,TSX]; 19903900
IF NOT TSKA[8].[4:1] THEN SLEEP([TSKA[8]],IMASK); 19903907
TSKA[8].[4:1] ~ 0; 19903908
SIZE ~ (SFINTQ~PRT[MIX,SFINTX]).[8:10]-1; 19903910
J ~ K ~ 0; 19903915
IF NOT TSKA[8].[3:1] THEN% IF INTERRUPTER INTRINSIC NOT RUNNING19903917
WHILE J{SIZE DO % COMPACT SFINTQ, PUSHING ALL NON-ZERO 19903920
BEGIN % ENTRIES TOWARD THE FRONT OF THE ARRAY 19903930
IF SFINTQ[J]=0 THEN % AND ZEROING OUT REMAINDER 19903940
BEGIN 19903950
I ~ IF K!0 THEN K+2 ELSE J+1; 19903960
L1: IF I>SIZE THEN GO DONE; 19903970
IF SFINTQ[I]=0 THEN BEGIN I ~ I+1; GO TO L1; END; 19903980
K ~ I; GO TO L3; 19903990
L2: IF K>SIZE THEN GO TO L4; 19904000
IF SFINTQ[K]!0 THEN 19904010
L3: BEGIN SFINTQ[J] ! SFINTQ[K]; 19904020
J ~ J+1; K ~ K+1; GO TO L2; 19904030
END; 19904040
L4: K ~ K-1; 19904050
FOR I ~ J STEP 1 UNTIL K DO SFINTQ[I] ~ 0; 19904060
END ELSE J ~ J+1; 19904070
END; 19904100
DONE: IF SFINTQ[SIZE]!0 THEN % QUEUE FULL--GET MORE SPACE19904300
IF SIZE+6>1023 THEN 19904340
BEGIN TERMINATE(MIX&103[CTF]); 19904350
TSKA[8] ~ *P(DUP) OR IMASK; A ~ T.[FF]; GO ON; 19904360
END ELSE 19904370
BEGIN PRT[MIX,SFINTX] ~ BIGGERQ ~FLAG(1&[PRT[MIX,SFINTX]]19904400
[CTF]&(SIZE+6) [TOSIZE]); 19904450
MAKEPRESENT([I] INX 3);%GETS SPACE AND ZEROS IT OUT19904600
M[BIGGERQ INX NOT 1].[9:6] ~ MIX; 19904650
MOVE(SIZE+1,SFINTQ,BIGGERQ); 19904700
FORGETSPACE(SFINTQ INX 0); 19904850
SFINTQ ~ BIGGERQ; 19904860
END; 19904900
K ~ 0; WHILE SFINTQ[K]!0 DO K ~ K+1; 19905000
SFINTQ[K] ~ A-1; % ABSOLUTE ADDRESS OF INTERRUPT PD 19905100
A ~ T.[FF]; 19905200
TSKA[8] ~ *P(DUP) OR @1200000000000000; 19905300
IF MIX=P2MIX THEN 19905310
BEGIN HALT; NOPROCESSTOG ~ NOPROCESSTOG-1; 19905320
END; 19905330
ON: 19905340
END; 19905350
M[ABSEVT] ~ P(DUP,LOD,SSN); 19905360
END; 19906100
END EVENTANDINTERRUPT; 19906300
% THE FORMAT OF SEGMENT ZERO OF PROGRAMS% 20000000
% S[0] = LOCATION OF SEGMENT DICTIONARY% 20001000
% S[1] = SIZE OF SEGMENT DICTIONARY% 20002000
% S[2] = LOCATION OF PRT% 20003000
% S[3] = SIZE OF PRT% 20004000
% S[4] = LOCATION OF FILE PARAMETER BLOCK% 20005000
% S[5] = SIZE OF FILE PARAMETER BLOCK% 20006000
% S[6].[1:1] = 1 FOR NEW FORMAT SEGMENT 0, ELSE 0 20006500
% S[6] = STARTING SEGMENT NUMBER% 20007000
% S[7].[2:1] = FORTRAN FAULT FLAG 20007100
% S[7].[33:15] = NUMBER OF FILES% 20008000
% S[7].[18:15] = CORE REQUIREMENT / 64% 20009000
% IF S[2] < 0 THEN THE JOB WAS COMPILED BY COBOL% 20010000
% S[15] = DISK ADDRESS OF LABEL EQUATION ENTRIES 20010100
% PRESENTED WHEN PROGRAM WAS COMPILED AND 20010200
% APPLICABLE TO ALL EXECUTIONS 20010300
% S[16] = ESTIMATED PROCESSOR TIME (FROM COMPILATN)20010400
% S[17] = ESTIMATED I/O TIME (FROM COMPILATN)20010500
% S[18] = PRIORITY (FROM COMPILATN)20010600
% S[19] = COMMON VALUE (FROM COMPILATN)20010700
% S[20] = ESTIMATED CORE REQUIREMENTS(FROM COMPILATN)20010800
% S[21] = STACK SIZE (FROM COMPILATN)20010900
20011000
20011100
PROCEDURE SELECTRUN1; 20011200
BEGIN 20011300
20011400
REAL MSCW = -2, 20011500
F = -1, 20011600
MYMSCW = -1, 20011700
RCW = +0, 20011800
I = +1, 20011900
T = +2, 20012000
L = +3, 20012100
DT = +4, 20012200
MIX = +5, 20012300
HDR = +6, 20012400
LEVEL = +7, 20012500
MCPJOB = +8, 20012600
OLAYDISK = +9, 20012700
THISLINK = +10, 20012800
NEXTLINK = +11, 20012900
PREVLINK = +12, 20013000
TYPE = +13, 20013100
STACKLOC = +14, 20013200
SHEETLOCKED = +15; 20013300
20013400
ARRAY S = +16[*], 20013500
SEG0 = +17[*], 20013600
TRP = +18[*], 20013700
LBL = +19[*], 20013800
SD = NT2[*], 20013900
TSKA = NT2[*]; 20014000
20014100
NAME ADDR = LBL +1; 20014300
REAL PASSLEVEL = ADDR + 1, 20014400
SVALUE = PASSLEVEL, 20014500
RETURNMSCW = PASSLEVEL + 1, 20014600
RETURNRCW = RETURNMSCW + 1; 20014700
20014800
DEFINE SHEETMAX = MIXMAX#; 20014900
20015000
20016100
%%%% ***NOTE**** 20016200
%%%% THE VARIABLES DECLARED ABOVE MUST CORRESPOND EXACTLY TO 20016300
%%%% THOSE DECLARED IN PROCEDURE SELECTRUN. 20016400
20016500
REAL EUVAL = RETURNRCW + 1, 20016600
FBADRS = EUVAL + 1, 20016700
FPBVERSION = FBADRS + 1, 20016800
FT = FPBVERSION+ 1, 20016900
LINDX = FT + 1, 20017000
LINK = LINDX + 1, 20017100
SENSEVAL = LINK + 1, 20017200
SPDVAL = SENSEVAL + 1, 20017300
S2 = SPDVAL + 1, 20017400
FB = S2 + 1, 20017500
FPB = FB + 1; 20017600
20017700
REAL FT1 = NT1, 20017800
TYPEDISK = NT3; 20017900
20018000
COMMENT THE VALUE OF "TYPE" DETERMINES WHICH PORTIONS OF 20018100
THIS PROCEDURE WILL BE EXECUTED. THIS PROCEDURE CAN ALSO 20018200
DETERMINE WHICH PORTIONS OF PROCEDURE "SELECTRUN" WILL BE 20018300
EXECUTED BY ASSIGNING A NEGATIVE VALUE TO "TYPE" BEFORE 20018400
RETURNING TO THAT PROCEDURE. 20018500
END OF COMMENT; 20018600
20018700
DEFINE STARTING = 1#, 20018800
CONTINUEING = 2#, 20018900
QUITTING = 3#, 20019000
RUNING = 4#, 20019100
PASSING = 5#, 20019200
EQUATING = 6#; 20019300
20019400
DEFINE XCLOCKTIME = 20019500
(((NT2:=(XCLOCK DIV 3600)) MOD 60 + (NT2 DIV 60)|100 + 20019600
0.5 ) DIV 1)#; 20019700
20019800
DEFINE ACTUALDISKADDRESS(ACTUALDISKADDRESS1) = 20019900
((JAR[MIX,((NT4:=ACTUALDISKADDRESS1) DIV (NT3:=JAR[MIX,8]))+10] 20020000
+ (NT4 MOD NT3) + 0.5) DIV 1)#; 20020100
20020110
$ SET OMIT = NOT(PACKETS) 20020119
DEFINE UNITNO = S[23].[2:6]#; % ORIGINATING UNIT 20020120
$ POP OMIT 20020121
20020200
LABEL CONTINUE, DLX, EXIT, LEM, RMSG, UNBLK, STOP; 20020300
20020400
SUBROUTINE DELINK; 20020500
% DELINKS THE SHEET ENTRY AND RETURNS SHEET DISK SPACE 20020600
BEGIN 20020700
STREAM(A:=S[3].[8:10],B:=P(.SCHEDULEIDS)); 20020800
BEGIN % MARK SCHEDULE SLOT "OPEN" 20020900
SKIP A DB; DS:=RESET; 20021000
END; 20021100
IF F = 0 THEN % SHEET ENTRY NOT PASSED AS PARAMETER 20021200
BEGIN 20021300
IF NEXTLINK=0 THEN SHEET[LEVEL].[FF]:=PREVLINK; 20021400
IF PREVLINK=0 THEN 20021500
BEGIN 20021600
SHEET[LEVEL].[CF]:=NEXTLINK; DO DLX; 20021700
END; 20021800
IF LBL=0 THEN 20021900
BEGIN 20021910
M[(LBL:=[M[SPACE(30)]]&30[8:38:10]) INX NOT 1].[9:6]:=0; 20021920
END; 20021930
DISKWAIT(-(LBL INX 0), 30, PREVLINK); 20022000
LBL[29]:=NEXTLINK; 20022100
DISKWAIT( (LBL INX 0), 30, PREVLINK); 20022200
DLX: FORGETESPDISK(THISLINK); 20022300
END; % IF SHEET ENTRY NOT A PARAMETER 20022400
END DELINK; 20022500
20022600
P(MYMSCW, STF); 20022700
20022800
P(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); % FOR VARIABLES LOCAL TO THIS 20022900
% PROCEDURE ONLY 20023000
20023100
IF TYPE=CONTINUEING THEN GO TO CONTINUE; 20023200
IF TYPE=STARTING THEN % SEARCH THE SHEET QUEUE TO FIND A CANDIDATE 20023300
% FOR SELECTION 20023400
BEGIN 20023500
PASSLEVEL:=RESTARTING; 20023800
COMMENT "PASSLEVEL" WILL BE NEGATIVE WHEN A JOB IS BEING RE-STARTED.20023900
UNDER THIS CONDITION, THE TEST FOR "LEVEL GEQ PASSLEVEL" WILL 20024000
FAIL AND NO OTHER JOBS WILL BE SELECTED UNTIL THE RE-START JOB 20024100
HAS BEEN INITIATED. 20024200
END OF COMMENT; 20024300
FOR LEVEL:=0 STEP 1 UNTIL SHEETMAX DO % FOR ALL "SHEET PRIORITIES" 20024600
BEGIN 20024700
PREVLINK:=NEXTLINK:=; % RESET FOR EACH "LEVEL" 20024800
% IF THERE IS AN ENTRY IN THE SHEET, SEE IF IT WILL FIT 20024900
IF(THISLINK:=SHEET[LEVEL].[CF]) NEQ 0 THEN GO TO LEM; 20025000
20025100
CONTINUE: 20025200
20025300
% "NEXTLINK" OBTAINED FROM "SHEET[29]" BELOW 20025400
% IF THERE IS ANOTHER ENTRY AT THIS LEVEL, PROCESS IT NOW 20025500
IF(THISLINK:=NEXTLINK) NEQ 0 THEN GO TO LEM; 20025600
END; 20025700
TYPE := -QUITTING; % END OF SHEET SEARCH 20025800
GO TO EXIT; 20025900
20026000
LEM: 20026100
20026200
% AT THIS POINT, THERE IS A CANDIDATE FOR SELECTION 20026300
IF S = 0 THEN % NO SHEET SPACE OBTAINED YET 20026400
BEGIN 20026500
S := [M[TYPEDSPACE(31,SHEETAREAV)]] & 30[SIZE];% %167-20026600
END; 20026700
20026800
% . . . . . . . . . . . . . . . . . . . . . . . 20026900
% READ SHEET ENTRY INTO CORE AT "S" 20027000
% . . . . . . . . . . . . . . . . . . . . . . . 20027100
20027200
DISKWAIT(-(S INX 0), 30, THISLINK); 20027300
NEXTLINK:=S[29]; % NEXT ENTRY IN SHEET QUEUE AT THIS LEVEL 20027400
20027500
% ***** *** * ***** * * **** ***** 20027600
% * * * * * * * * * * 20027700
% *** * * ***** ***** * * ***** 20027800
% * * * * * * * * * * 20027900
% * *** ***** ***** * * * * * * 0 20028000
20028100
HDR:=GETSPACE(30+(S[0]<0),DISKHEADERAREAV,1)+2; % S[0]<0 COMPILE 20028300
% THE EXTRA WORD IS FOR COMPILATIONS (JAR[30]=FID OF OBJECT FILE) 20028400
DISKWAIT(-HDR, 30, S[25]); % READ FILE HEADER INTO CORE AT "HDR" 20028900
GO TO EXIT; 20029000
END; % IF TYPE = STARTING OR CONTINUEING 20029100
20029200
IF TYPE=PASSING THEN % PASS THIS ENTRY WITHOUT DELINKING 20029300
BEGIN 20029400
20029500
% ***** ***** ***** ***** 20029600
% * * * * * * 20029700
% ***** ***** ***** ***** 20029800
% * * * * * 20029900
% * * * ***** ***** 20030000
20030100
IF (I:=S[2]<0) OR S[3]>0 THEN % XS/ES OR FIRST TIME THROUGH 20030200
BEGIN 20030300
S[2]:=ABS(S[2]); % MARK IT NOT XS-ED OR ES-ED. 20030350
S[3]:=NABS(S[3]); % MARK IT SCHEDULED 20030400
IF F=0 THEN % SHEET ENTRY NOT PASSED AS PARAMETER 20030500
% WRITE THE SHEET ENTR BACK OUT WITH S[3] "MARKED" 20030600
DISKWAIT((S INX 0), 30, THISLINK); 20030700
IF SCHEDMSG OR I OR (S[23].[9:4] NEQ 0) THEN %166-20030760
BEGIN 20030780
STREAM(I, L, C:=LEVEL, A:=S[*], ID:=S[3].[8:10], 20030800
$ SET OMIT = NOT(DCSPO AND DATACOM) 20031000
Q:=XCLOCKTIME, W:=S[20]|64, B:=HDR); 20031500
BEGIN 20031600
SI:=LOC C; DS:=6DEC; DI:=DI-6; DS:=5FILL; % PRIORITY20031700
DI:=B; DI:=DI+6; DS:=LIT":"; 20031800
SI:=A; SI:=SI+1; DS:=7CHR; % MFID 20031900
SI:=SI+1; DS:=LIT"/"; DS:=7CHR; % FID 20032000
DS:=LIT"="; SI:=LOC ID; DS:=2DEC; % SCH.NO. 20032100
CI:=CI+I; GO TO SCHD; 20032150
DS:=10 LIT" NOT XS-ED"; GO TO REASON; 20032200
SCHD: DS:=11 LIT" SCHEDULED "; SI:=LOC Q; DS:=4 DEC; % TIME 20032250
$ SET OMIT = NOT(DCSPO AND DATACOM) 20032400
REASON: DS:=2 LIT", "; 20032725
CI:=CI+L; GO TO L0; CO TO L1; 20032750
$ SET OMIT = NOT BREAKOUT 20032775
L2: DS:=14 LIT"TOO MANY JOBS~"; GO TO EXIT; 20032875
L1: DS:=13 LIT"NO OLAY DISK~"; GO TO EXIT; 20032900
L0: DS:= 5 LIT"NEEDS"; SI:=LOC W; DS:=6 DEC; DS:=LIT"~"; 20032925
DI:=DI-7; DS:=5 FILL; 20032930
EXIT: 20032950
END STREAM; 20033000
$ SET OMIT = NOT( DATACOM ) 20033200
SPOUTER(HDR,UNITNO,SCHEDMSG OR I); 20034000
END % IF SCHEDULE MESSAGE IS SPOUTED 20034050
ELSE FORGETSPACE(HDR); %166-20034060
END % IF XS/ES OR FIRST TIME 20034100
ELSE FORGETSPACE(HDR); 20034200
IF F NEQ 0 THEN % SHEET ENTRY PASSED AS A PARAMETER 20034300
BEGIN 20034400
DISKWAIT(F.[CF],30,T:=GETESPDISK); % WRITE SHEET ENTRY TO DISK 20034500
FORGETSPACE(S[7]); % CORE ADDRESS OF SEGMENT ZERO IN S[7] 20034600
IF SEG0=S[7] THEN SEG0:=0; % AVOID "DOUBLE "FORGETSPACE" 20034610
IF NOT SHEETLOCKED THEN 20034700
BEGIN 20034800
SLEEP([TOGLE],SHEETMASK); 20034900
LOCKTOG(SHEETMASK); 20035000
SHEETLOCKED := 1; 20035100
END; 20035200
IF (L:=S[2].[CF]) GTR SHEETMAX THEN L:=SHEETMAX; 20035300
% SHEET[2].[CF] = "SHEET" PRIORITY 20035400
IF SHEET[L].[CF] NEQ 0 THEN % SHEET QUEUE ALREADY EXISTS 20035500
BEGIN % LINK IN THIS ENTRY 20035600
DISKWAIT(-F.[CF],30,I:=SHEET[L].[FF]); %TAIL OF QUEUE 20035700
S[29]:=T; % LINK TO THIS ENTRY 20035800
DISKWAIT(F.[CF],30,I); % REPLACE ENTRY 20035900
END 20036000
ELSE SHEET[L]:=T; % ESTABLISH NEW SHEET QUEUE 20036100
SHEET[L].[FF]:=T; % LINK IN AT END OF QUEUE 20036200
TYPE := -QUITTING; 20036300
GO TO EXIT; % DONT PROCESS ANY MORE ENTRIES 20036400
END; 20036500
IF PASSLEVEL=1023 THEN PASSLEVEL:=LEVEL; 20036800
PREVLINK:=THISLINK; 20037100
IF MIX LEQ MIXMAX THEN 20037200
BEGIN 20037300
TYPE := -CONTINUEING; 20037400
GO TO CONTINUE; 20037500
END 20037600
ELSE 20037700
BEGIN 20037800
TYPE := -QUITTING; 20037900
GO TO EXIT; 20038000
END; 20038100
END; % IF TYPE = PASSING 20038200
20038300
IF TYPE=RUNING THEN % SPECIAL HANDLING FOR "RUN" JOBS 20038500
20038600
% ***** * * * * * ***** **** ***** 20038700
% * * * * ** * * * * * * * 20038800
% ***** * * * * * * * * * **** ***** 20038900
% * * * * * * * * * * * * * * 20039000
% * * ***** * ** **** ***** **** ***** 20039100
20039200
BEGIN 20039300
IF S[2].[2:1] NEQ 1 THEN % S[2].[2:1]=1 WHEN ES-ED 20039400
FOR I:=1 STEP 1 UNTIL MIXMAX DO 20039500
IF JAR[I,*] NEQ 0 THEN % JOB RUNNING AT THIS MIX INDEX 20039600
IF (S[0] EQV JAR[I,0])=(NOT 0) AND 20039700
(S[1] EQV JAR[I,1])=(NOT 0) AND 20039800
PRYOR[I] GEQ 0 THEN 20039900
BEGIN % JOB IS ALREADY RUNNING 20040000
$ SET OMIT = NOT(DCSPO AND DATACOM ) 20040100
IF BOJMESS THEN 20043000
BEGIN 20043100
$ SET OMIT = NOT (DCSPO AND DATACOM) 20043200
RMSG: BEGIN 20043600
STREAM(C:=S[18], A:=JARROW[1], I, % S[18]=PRIORITY 20043700
Q := XCLOCKTIME, B := HDR); 20043800
BEGIN 20043900
SI:=LOC C; DS:=6DEC; DI:=DI-6; DS:=5FILL; %PRIOR20044000
DI:=B; DI:=DI+6; DS:=LIT":"; 20044100
SI:=A; SI:=SI+1; DS:=7CHR; DS:=LIT"/"; % MFID20044200
SI:=SI+1; DS:=7CHR; % FID 20044300
SI:=LOC I; DS:=LIT"="; DS:=2DEC; % MIX 20044400
DS:=9LIT" RUNNING "; %161-20044500
DS:=4DEC; DS:=LIT"~"; DI:=DI-16; DS:=FILL;% TIME20044600
END STREAM; 20044700
SPOUT(HDR&S[23][9:9:9]); 20044800
END % IF BOJ MESSAGE SHOULD BE SENT 20044900
$ SET OMIT = NOT (DCSPO AND DATACOM) 20045000
END % IF BOJMESS 20045300
ELSE FORGETSPACE(HDR); 20045400
% BUMP OPEN COUNT BACK DOWN 20045500
FORGETSPACE(DIRECTORYSEARCH( ABS(S[0]), 20045600
IF S[0] LSS 0 THEN "DISK " ELSE S[1], 13)); 20045700
FORGETESPDISK(S[6] INX 0); % CARD IMAGE FOR LOG 20045800
T:=S[13]; % SAVE LINK TO LABEL EQUATION CARDS 20045900
WHILE T NEQ 0 DO % FORGET LABEL EQUATION SEGMENTS 20046000
BEGIN 20046100
DISKWAIT(-(S INX 0), 30, T); 20046200
FORGETESPDISK(T); 20046300
T:=S[29]; 20046400
END; 20046500
DELINK; % DELINK THE ENTRY FROM THE SHEET QUEUE 20046600
IF F=0 THEN % SHEET ENTRY NOT PASSED AS A PARAMETER 20046700
BEGIN 20046800
TYPE := -CONTINUEING; 20046900
GO TO CONTINUE; 20047000
END 20047100
ELSE 20047200
BEGIN % SHEET ENTRY PASSED AS A PARAMETER, DONT CONTINUE20047300
TYPE := -QUITTING; 20047400
GO TO EXIT; 20047500
END; 20047600
END; 20047700
END OF SPECIAL HANDLING OF RUN CARDS; 20047800
20048000
IF TYPE = EQUATING THEN 20048100
BEGIN 20048200
20048300
% ****** ***** ***** 20048400
% * * * * * 20048500
% **** ***** ***** 20048600
% * * * * 20048700
% * 0 * 0 ***** 0 20048800
20048900
FPB:=TYPEDSPACE(SEG0[5] INX 1,FPBAREAV); %167-20049000
% SEG0[5] = SIZE OF THE FILE PARAMETER BLOCK ON DISK 20049100
% SEG0[4] = RELATIVE DISK ADDRESS OF THE FILE PARAMETER BLOCK 20049200
% SEG0[7] = NUMBER OF FILES IN THE F.P.B. 20049300
% ETRLNG = NUMBER OF WORDS PER FILE USED IN THE F.P.B. 20049400
M[SEG0[5] INX FPB]:=0; % SET TO ZERO TO INSURE THAT STREAM STATEMENT20049500
% USED TO BUILD "IN-CORE" FPB WILL NOT SKAN 20049600
% PAST THE END OF THE COMPILER GENERATED FPB.20049700
FB:=GETSPACE(SEG0[7].[CF]|ETRLNG,FPBAREAV,1)+2; %167-20049800
% "FB" WILL BE "IN-CORE" FILE PARAMETER BLOCK LOCATION 20049900
DISKWAIT(-FPB, SEG0[5] INX 0, ACTUALDISKADDRESS(SEG0[4].[CF])); 20050000
20050100
COMMENT FORMAT OF COMPILER GENERATED FPB: 20050200
CHRS 1 AND 2 = FILE NUMBER (12 BIT BINARY) STARTING WITH 1 20050300
CHR. 3 = FILE TYPE 20050400
CHRS 4 THRU 10 = MFID 20050500
CHRS 11 THRU 17 = FID 20050600
CHR 18 = LENGTH OF INTERNAL FILE NAME (6 BIT BINARY) 20050700
CHRS 19 THRU N = INTERNAL NAME 20050800
FOR VERSION 1 ( VERSION NUMBER IN SEG0[5].[1:8] ) 20050900
NEXT TWO CHARACTERS FOLLOWING INTERNAL NAME CONTAIN: 20051000
[40:1] = SENSITIVE BIT 20051100
[41:2] = DISK SPEED (1=FAST, 2=SLOW, 0=UNSPECIFIED) 20051200
[43:5] = EU NUMBER + 1 20051300
20051400
COMMENT FORMAT OF "IN-CORE" FPB ( 5 WORDS FOR EACH FILE ENTRY ) 20051500
WORD[0].[ 6:42] = MFID 20051600
WORD[1].[ 6:42] = FID 20051700
WORD[2].[ 1:17] = REEL NUMBER (3 BCL DIGITS) 20051800
WORD[2].[18:30] = CREATION DATE (5 BCL DIGITS) 20051900
WORD[3].[ 1:5 ] = CYCLE NUMBER (BINARY) 20052000
WORD[3].[ 6:17] = PRN (PHYSICAL REEL NUMBER) FOR NON-DISK FILES 20052100
WORD[3].[15:1 ] = SENSITIVE BIT (DISK FILES ONLY) 20052200
WORD[3].[16:2 ] = DISK SPEED (DISK FILES ONLY) 20052300
WORD[3].[18:5 ] = EU. NUMBER+1 (DISK FILES ONLY) 20052400
WORD[3].[23:1 ] = IO CODE (INPUT=0,OUTPUT=1) 20052500
WORD[3].[24:12] = NUMBER OF ERRORS 20052600
WORD[3].[36:6 ] = LOGICAL UNIT NUMBER + 1 20052700
WORD[3].[43:5 ] = UNIT TYPE 20052800
END OF COMMENT; 20052900
20053000
FPBVERSION:=SEG0[5].1:8]; % NEWER VERSN.CONTAINS EU,SPD,ETC. 20053100
STREAM(TOG:=(FPBVERSION=1),T1:=0,T2:=0,C:=0,FPB,FB); 20053200
BEGIN 20053300
SI:=FPB; 20053400
LL: IF SC="0" THEN % FIRST DIGIT OF FILE NUMBER 20053500
BEGIN 20053600
SI:=SI+1; IF SC="0" THEN GO TO LP; % END OF FPB 20053700
END ELSE SI:=SI+1; 20053800
SI:=SI+1; T1:=SI; SI:=SI+1; % FILE TYPE LOCATION 20053900
2(DS:=LIT"0"; DS:=7CHR); % MFID,FID 20054000
T2:=DI; DI:=LOC C; DI:=DI+7; DS:=CHR; DI:=T2; %INT.NAME SIZE 20054100
DS:=15LIT"0"; % ZERO OUT REEL,DATE,CYCLE,ETC. 20054200
T2:=SI; SI:=T1; DS:=CHR; SI:=T2; % FILE TYPE 20054300
GO TO SK; L1: GO TO LL: L2: GO TO XXIT; SK: 20054400
SI:=SI+C; % SKIP OVER INTERNAL NAME 20054500
TOG(T2:=DI; DI:=DI-6; SKIP 3DB; SKIP 4SB; 20054600
IF SB THEN DS:=SET ELSE DS:=RESET; SKIP SB; % SENSITIVE 20054700
2(IF SB THEN DS:=SET ELSE DS:=RESET; SKIP DB); % SPEED 20054800
5(IF SB THEN DS:=SET ELSE DS:=RESET; SKIP SB); % EU 20054900
DI:=T2); 20055000
DS:=8LIT"0"; % ZERO OUT FIFTH WORD OF FB 20055100
GO TO L1; 20055200
XXIT: END STREAM STATEMENT; 20055300
20055400
IF MCPJOB THEN GO TO STOP; % NO LABEL EQUATION FOR "SYSTEM" JOBS 20055500
20055600
%%% LABEL EQUATION PROCESSING 20055700
20055800
COMMENT LABEL EQUATION RECORD FORMAT: 20055900
20056000
WORD[ 0] = MFID ( ZERO, IF NONE GIVEN ) 20056100
WORD[ 1] = FID 20056200
WORD[ 2 ].[1:17] = REEL NUMBER ( 3 BCL DIGITS ) 20056300
.[18:30] = CREATION DATE ( 5 BCL DIGITS ) 20056400
.[42:1 ] = MARKER FOR FILE OPEN ( 1 = CDATE GIVEN ) 20056500
WORD[ 3].[ 1:5 ] = CYCLE NUMBER 20056600
.[15:8 ] = NUMBER OF COPIES -1 20056700
.[23:1 ] = PACKETS 20056800
.[42:1 ] = "FORMS" REQUESTED 20056900
.[43:5 ] = UNIT TYPE 20057000
WORD[ 4].[ 0:6 ] = SIZE OF INTERNAL NAME 20057100
.[ 6:42] = FIRST SEVEN CHARACTERS OF INTERNAL NAME 20057200
WORD[ 5] THROUGH WORD[11] = REMAINDER OF INTERNAL NAME 20057300
WORD[12].[15:1 ] = SENSITIVE BIT 20057400
.[16:2 ] = DISK SPEED (1=FAST,2=SLOW,0=NOT SPECIFIED) 20057500
.[18:5 ] = EU NUMBER + 1 20057600
WORD[14] = START OF NEXT LBL.EQN.ENTRY (14 IF NO MORE ENTRIES) 20057700
WORD[29] = LINK TO NEXT ESP SEGMENT FOR LABEL EQUATION 20057800
END OF COMMENT; 20057900
20058000
FOR L := 1 STEP 1 UNTIL 2 DO 20058100
BEGIN 20058200
LINK:=IF L THEN S[15] ELSE S[13]; % EQN FROM COMPILE/EXEC, 20058300
% S[15] = RELATIVE DISK ADDRESS IN CODE FILE FOR LABEL 20058400
% EQUATION ENTERED AT COMPILE TIME 20058500
% S[13] = ACTUAL ESP DISK ADDRESS OF LABEL EQUATION ENTERED 20058600
% AT RUN TIME. 20058700
S2 := NOT L; % TRUE, IF LBL.EQN.ENTERED AT RUN TIME 20058800
WHILE LINK NEQ 0 DO % IF LBL.EQN.EXISTS 20058900
BEGIN 20059000
IF LBL=0 THEN 20059100
BEGIN 20059110
M[(LBL:=ARRAYDESC(30,LBLEQNAREAV)) INX NOT 1].AREAMIXF:=0; 20059120
END; 20059130
% IF LINK=S[15],READ FROM CODE FILE ELSE READ FROM ESP DISK 20059200
DISKWAIT(-(LBL INX 0), 30, 20059300
IF L THEN ACTUALDISKADDRESS(LINK) ELSE LINK); 20059400
I := 0; % START AT BEGINNING OF SEGMENT 20059500
IF NOT L THEN FORGETESPDISK(LINK); 20059600
LINK := LBL[29]; % NEXT LINK 20059700
IF S2 THEN % RUN TIME LABEL EQUATION 20059900
BEGIN 20060000
% IF A COMPILE JOB, SAVE FID OF OBJECT FILE NAME IN 20060100
% JAR[30] TO PRINT MIX MESSAGE OF THE FORM: 20060200
% "ALGOL"/<MFID>/<FID> 20060300
IF JAR[MIX,0] LSS 0 THEN JAR[MIX,30]:=LBL[1]; 20060400
S2:=0; % USE THE FIRST EQUATION ONLY 20060500
END; 20060600
IF LBL[0] = 14 THEN GO TO STOP; 20060800
UNBLK: LINDX:=I|14; % INDEX INTO LABEL EQUATION SEGMENT 20060900
STREAM(FN:=0 : FT:=[FT], ZERO:=0, T2:=0, 20061000
TOG:=(FPBVERSION=1), FPB, F:=[LBL[LINDX+4]], C:=0); 20061100
BEGIN 20061200
SI := F; DI:=LOC C; DI:=DI+7 ; DS:=CHR; % LBL.NAM.SIZE 20061300
SI := FPB; 20061400
L: DI:=LOC FN; DI:=DI+6; DS:=2 CHR; % FILE NUMBER 20061500
DI := LOC ZERO; SI:=SI-2; 20061600
IF 2 SC = DC THEN GO TO XXIT; % FILE NUMBER=0 20061700
DI:=FT; DS:=CHR; DI:=SI+14; % SAVE FILE TYPE FOR CHK BELOW 20061800
DI := F; % SI AT FPB INT.NAM,DI AT LBL.EQN. 20061900
IF SC = DC THEN % SAME STRING SIZE 20062000
BEGIN 20062100
IF C DC=DC THEN GO TO XXIT; % ALL CHARACTERS MATCH 20062200
END 20062300
ELSE 20062400
BEGIN % NOT THE SAME SIZE 20062500
SI:=SI-1; DI:=LOC T2; DI:=DI+7; DS:=CHR; 20062600
SI:=SI+72; % SKIP OVER FPB ENTRY 20062700
END; 20062800
TOG(SI:=SI+2); % SPEED AND EU CHARACTERS IN FPB(VERSION 1) 20062900
GO TO L; 20063000
XXIT: END; 20063100
20063200
IF (T:=P) NEQ 0 THEN % VALID LABEL EQUATION 20063300
BEGIN 20063400
FBADRS:=(T-1)|ETRLNT+FB; % ADRS OF FB FILE ENTRY 20063500
% FT IS FILE TYPE FROM FPB OBTAINED ABOVE 20063600
IF (FT1:=LBL[LINDX+3].[43:5]) NEQ @37 THEN FT:=FT1;%NEW TYP20063700
FT:=FT.[43:5]; % REMOVE "FORMS" BIT 20063800
TYPEDISK ~ (FT=10) OR (FT=12) OR (FT=13) OR (FT=26); 20063900
STREAM(X:=[LBL[LINDX]],TOG:=(TYPEDISK AND (FPBVERSION=1)), 20064000
FBADRS); 20064100
BEGIN 20064200
SI:=X; DS:=3WDS; DS:=CHR; % MFID,FID REEL,DATE,CYCLE 20064300
TOG(SI:=SI+2; SKIP 5SB; DI:=SI+2; SKIP 5DB; 20064400
IF SB THEN DS:=SET ELSE DS:=RESET; SKIP SB; 20064500
JUMP OUT TO L); % SAVE EU/SPEED SPECS FOR DISK 20064600
DS:=3CHR; 20064700
L: DS:=3CHR; 20064800
IF SC NEQ "~" THEN % NEW TYPE SPECIFIED 20064900
IF SC NEQ """ THEN DS:=CHR ELSE DS:=SET; 20065000
END STREAM STATEMENT; 20065100
SENSEVAL := (EUVAL := LBL[LINDX+12].[15:8]).[40:1]; 20065200
SPDVAL := EUVAL.[41:2]; 20065300
EUVAL := EUVAL AND @37; 20065400
IF SPDVAL GTR 0 THEN 20065500
M[FBADRS+3]:=(*P(DUP))&SPDVAL[16:46:2]; 20065600
IF SENSEVAL THEN % FILE SENSITIVE 20065700
M[FBADRS+3]:=(*P(DUP))&SENSEVAL[15:47:1]; 20065800
IF EUVAL GTR 0 THEN % NEW EU NUMBER REQUESTED IN LBL.EQN. 20065900
M[FBADRS+3]:=(*P(DUP))&EUVAL [18:43:5]; 20066000
END; % IF VALID LABEL EQUATION 20066100
IF (I:=I+1) = 1 THEN IF LBL[14] NEQ 14 THEN GO TO UNBLK; 20066200
END; % WHILE LINK NEQ 0 20066300
STOP: END; % FOR L 20066400
FORGETSPACE(FPB); 20066500
TRP[3] := [M[FB]] & (SEG0[7].[CF]|ETRLNG)[8:38:10]; 20066600
END; % IF TYPE = EQUATING 20066700
20066800
EXIT: 20080000
P([RETURNRCW], STS, 0, RDS, 0, XCH, P&P[CTF], STF); 20080100
END PROCEDURE SELECTRUN1; 20080200
20080300
20080400
PROCEDURE SELECTRUN2; 20080500
BEGIN 20080600
REAL MSCW = -2, 20080700
F = -1, 20080800
MYMSCW = -1, 20080900
RCW = +0, 20081000
I = +1, 20081100
T = +2, 20081200
L = +3, 20081300
DT = +4, 20081400
MIX = +5, 20081500
HDR = +6, 20081600
LEVEL = +7, 20081700
MCPJOB = +8, 20081800
OLAYDISK = +9, 20081900
THISLINK = +10, 20082000
NEXTLINK = +11, 20082100
PREVLINK = +12, 20082200
TYPE = +13, 20082300
STACKLOC = +14, 20082400
SHEETLOCKED = +15; 20082500
20082600
ARRAY S = +16[*], 20082700
SEG0 = +17[*], 20082800
TRP = +18[*], 20082900
LBL = +19[*], 20083000
SD = NT2[*], 20083100
TSKA = NT2[*]; 20083200
20083300
NAME ADDR = LBL +1; 20083500
REAL PASSLEVEL = ADDR + 1, 20083600
SVALUE = PASSLEVEL, 20083700
RETURNMSCW = PASSLEVEL + 1, 20083800
RETURNRCW = RETURNMSCW + 1; 20083900
20084000
DEFINE SHEETMAX = MIXMAX#; 20084100
20084200
20085300
%%%% ***NOTE**** 20085400
%%%% THE VARIABLES DECLARED ABOVE MUST CORRESPOND EXACTLY TO 20085500
%%%% THOSE DECLARED IN PROCEDURE SELECTRUN. 20085600
20085710
REAL MSGSPACE = RETURNRCW + 1; % LOCAL TO THIS PROCEDURE 20085800
LABEL DLX, BMSG, SKIP, EXIT; %127-20085900
DEFINE XCLOCKTIME = 20086000
(((NT2:=(XCLOCK DIV 3600)) MOD 60 + (NT2 DIV 60)|100 + 20086100
0.5 ) DIV 1)#; 20086200
20086300
DEFINE ACTUALDISKADDRESS(ACTUALDISKADDRESS1) = 20086400
((JAR[MIX,((NT4:=ACTUALDISKADDRESS1) DIV (NT3:=JAR[MIX,8]))+10] 20086500
+ (NT4 MOD NT3) + 0.5) DIV 1)#; 20086600
20086700
$ SET OMIT = NOT(PACKETS) 20086799
DEFINE UNITNO = S[23].[2:6]#; % ORIGINATING UNIT 20086800
$ POP OMIT 20086801
20086810
DEFINE DALOCSIZE = 9#; 20087200
20087400
% VALUES ASSOCIATED WITH "TYPE" ; 20087500
20087600
DEFINE STARTING = 1#, 20087700
CONTINUEING = 2#, 20087800
QUITTING = 3#, 20087900
RUNING = 4#, 20088000
PASSING = 5#, 20088100
EQUATING = 6#; 20088200
20088300
SUBROUTINE DELINK; 20088400
% DELINKS THE SHEET ENTRY AND RETURNS SHEET DISK SPACE 20088500
BEGIN 20088600
STREAM(A:=S[3].[8:10],B:=P(.SCHEDULEIDS)); 20088700
BEGIN % MARK SCHEDULE SLOT "OPEN" 20088800
SKIP A DB; DS:=RESET; 20088900
END; 20089000
IF F = 0 THEN % SHEET ENTRY NOT PASSED AS PARAMETER 20089100
BEGIN 20089200
IF NEXTLINK=0 THEN SHEET[LEVEL].[FF]:=PREVLINK; 20089300
IF PREVLINK=0 THEN 20089400
BEGIN 20089500
SHEET[LEVEL].[CF]:=NEXTLINK; GO DLX; 20089600
END; 20089700
IF LBL=0 THEN 20089800
BEGIN 20089810
M[(LBL:=ARRAYDESC(30,LBLEQNAREAV)) INX NOT 1].AREAMIXF:=0; 20089820
END; 20089830
DISKWAIT(-(LBL INX 0), 30, PREVLINK); 20089900
LBL[29]:=NEXTLINK; 20090000
DISKWAIT( (LBL INX 0), 30, PREVLINK); 20090100
DLX: FORGETESPDISK(THISLINK); 20090200
END; % IF SHEET ENTRY NOT A PARAMETER 20090300
END DELINK; 20090400
20090500
BOOLEAN SUBROUTINE REENTRY; 20090700
BEGIN 20090800
POLISH(FALSE); 20090900
IF JAR[MIX,2].[8:10] NEQ 0 THEN % NOT "GO" FROM COMPILE AND GO 20091000
IF NOT (S[2].[2:1]) THEN % NOT ES-ED 20091100
FOR I:=1 STEP 1 UNTIL MIXMAX DO 20091200
IF JAR[I,*] NEQ 0 THEN 20091300
IF ((JAR[MIX,0] EQV JAR[I,0])) = (NOT 0) THEN % SAME MFID 20091400
IF ((JAR[MIX,0] LSS 0) OR % COMPILER 20091500
(((JAR[MIX,1] EQV JAR[I,1])) = (NOT 0))) THEN % SAME FID 20091600
IF JAR[I,10] NEQ 0 THEN % COMPILER OR SAME MFID 20091700
IF JAR[I,2].[8:10] NEQ 0 THEN % NOT "GO" PART OF COMP.& GO 20091800
IF PRYOR[I] GEQ 0 OR 20091900
NFO[(I-1)|NDX+1].[FF] NEQ 0 THEN % RUNNING 20092000
BEGIN 20092100
COMMENT MAKE THE ENTRY IN LINKED-LIST STYLE; 20092200
IF PRT[I,4].[FF] NEQ 0 THEN % ALREADY PRESENT 20092300
BEGIN 20092400
COMMENT ENTER AT TAIL OF PREVIOUS LIST; 20092500
DO NT1:= I UNTIL (I:=PRT[I,4].[24:6])=@77; 20092600
NFO[(MIX-1)|NDX+1]:=TRP[4]:=PRT[NT1,4]; 20092700
NFO[(NT1-1)|NDX+1]:=PRT[NT1,4]:= 20092800
(*P(DUP))&MIX[24:42:6]; 20092900
END 20093000
ELSE 20093100
BEGIN 20093200
COMMENT CONSTRUCT NEW LIST; 20093300
NFO[(I-1)|NDX+1]:=PRT[I,4]:= 20093400
(*P(DUP))&I[18:42:6]&MIX[24:42:6]; 20093500
NFO[(MIX-1)|NDX+1]:=TRP[4]:= 20093600
PRT[I,4]&@77[24:42:6]; 20093700
END; 20093800
POLISH(DEL,TRUE); 20093900
I:=MIXMAX; 20094000
END; 20094100
REENTRY:=POLISH; 20094200
END REENTRANT CODE LINKAGE ESTABLISHMENT SUBROUTINE; 20094300
20094500
P(MYMSCW, STF); 20094600
P(0); % MESAGE SPACE, LOCAL TO THIS PROCEDURE 20094610
20094700
% **** ***** *** ***** ***** ***** ***** 20094800
% * * * * * * * * * * * 20094900
% **** * * * * * * ***** ***** * ** 20095000
% * * * * * * * * * * * * * 20095100
% **** ***** **** * * * ***** ***** ***** 0 20095200
20095300
$ SET OMIT = NOT( DCSPO AND DATACOM ) 20098900
IF BOJMESS THEN 20100700
IF MCPJOB.[1:1] THEN % "SYSTEM" TYPE JOB 20100800
IF NOT (AUTOMESS) THEN % SUPPRESS BOJ/EOJ MESSAGE 20100900
IF NOT (S[2].[2:1]) THEN % NOT ES-ED 20101000
IF S[2].[4:1] THEN % SUPRESS BOJ/EOJ MESSAGE 20101100
BEGIN 20101200
STREAM(N:=S[0], MIX, T:=T:=SPACE(4)); 20101300
BEGIN 20101400
DS:=6LIT" AUTO-"; 20101500
SI:=LOC N; SI:=SI+1; DS:=7CHR; 20101600
DS:=2LIT" ="; SI:=LOC MIX; DS:=2DEC; 20101700
DS:=LIT"~"; DI:=DI-3; DS:=FILL; 20101800
END; 20101900
SPOUT(T); 20102000
GO TO SKIP; 20102100
END; 20102200
$ SET OMIT = PACKETS 20104600
$ SET OMIT = NOT(PACKETS) 20104900
IF (NOT MCPJOB OR BOJMESS) 20105000
$ POP OMIT % PACKETS 20105100
AND NOT S[2].[2:1] THEN % S[2].[2:1]=1 WHEN ES-ED 20105200
BEGIN 20105300
GIMEDATE([DT].[CF],-DT); % CONVERT DATE TO "MMDDYY" FORMAT 20105350
STREAM(DAAT:=DT, DTOG:=NOT(MCPJOB) AND TRUE, SV :=0, 20105400
$ SET OMIT = NOT(DCSPO AND DATACOM) 20105500
C:=S[18], A:=JARROW[MIX], MIX, % S[18]=PRIORITY 20105900
Q:=XCLOCKTIME, B:=MESAGESPACE:=GETSPACE(12,0,0)+2); 20106000
BEGIN 20106100
SI:=LOC C; DS:=6DEC; DI:=DI-6; DS:=5FILL; % PRIORITY 20106200
DI:=B; DI:=DI+6; DS:=LIT":"; 20106300
SI:=A; SI:=SI+1; DS:=7CHR; % MFID 20106400
DS:=LIT"/"; SI:=SI+1; DS:=7CHR; % FID 20106500
SI:=LOC MIX; DS:=LIT"="; DS:=2DEC; % MIX 20106600
SV:=DI; DI:=DI-2; DS:=FILL; DI:=SV; 20106700
DS:=5LIT" BOJ "; DS:=4DEC; DS:=LIT" "; % TIME 20106800
DTOG(SI:=LOC DAAT; SI:=SI+2; 20106900
3(DS:=2CHR; DS:=LIT"/"); DI:=DI-1; % CDATE 20107000
$ SET OMIT = NOT(DCSPO AND DATACOM) 20107100
DS:=LIT"~"; 20107500
END STREAM STATEMENT; 20107600
$ SET OMIT = NOT(DCSPO AND DATACOM) 20107700
20108400
END; 20108500
20108700
SKIP: 20108800
20108900
20109000
% ***** ***** ***** ***** ***** ***** ***** 20109100
% * * * * * * * * * 20109200
% ***** ***** * ** * ***** ***** * * 20109300
% * * * * * * * * * * 20109400
% ***** ***** ***** ***** ***** * * ***** 20109500
20109600
JAR[MIX,2] := (*P(DUP)) & SEG0[2][1:1:2] & 20110700
SEG0[2][5:2:3] & 20110900
SEG0[7][3:2:1]; 20111100
% SEG0[2].[1:1] = JOB COMPILED BY COBOL ( NO "OAT" ENTRY ) 20111200
% SEG0[2].[2:3], SEG0[7].[2:1] = USED FOR INTER-PROG.COMMUNICATION 20111300
IF SEG0[2].[2:1] THEN SOFTI:=SOFTI+1; 20111500
IF SEG0[2].[4:1] AND (MESAGESPACE!0) THEN % INVOKED I.P.C. TASK%110-20111600
BEGIN % CHANGE BOJ TO BOT %110-20111610
STREAM(MESAGESPACE); BEGIN DI~DI+28; DS~LIT"T"; END; %110-20111620
END; %110-20111630
$ SET OMIT = NOT(BREAKOUT) 20111800
20115200
% ***** ***** ***** ***** * * ***** ***** ***** 20115300
% * * * * * * * * * * * * * 20115400
% ***** * ***** * * * ***** ***** ***** * 20115500
% * * * * * * * * * * * * 20115600
% ***** * * * ***** * * * * * * 20115700
20115800
IF MESAGESPACE NEQ 0 THEN % BOJ MESSAGE BUILD 20118350
BEGIN 20118360
SPOUTER(MESAGESPACE,UNITNO,(BOJMESS AND NOT S[2].[2:1])); 20118370
% S[2].[2:1] = 1 WHEN ES-ED 20118380
MESAGESPACE:=0; 20118390
END; 20118400
M[STACKLOC].[9:6] := MIX; % PLACE MIX INDEX IN MEMORY LINK 20118600
% COMPUTE THE ADDRESS FOR THE PRT SUCH THAT PRTADRS.[42:6]=0 20118800
T:=(((STACKLOC:=STACKLOC+2)+S[21]) OR 63) + 1; % S[21]=STACKSIZE 20118900
IF ((I:=M[STACKLOC-2].[CF])-(L:=SEG0[3] INX T)) GTR 10 THEN 20119000
BEGIN % RETURN REMAINDER OF PRT SPACE 20119100
IF NOT STORDY THEN SLEEP([TOGLE],STOREMASK); 20119600
LOCKTOG(STOREMASK); 20119700
M[L] := I & (STACKLOC-2)[CTF] & MIX[9:42:6]; % NEW LINK 20119900
M[I].[FF] := L; % BACK LINK 20120000
M[STACKLOC-2].[CF] := L; % FORWARD LINK 20120100
UNLOCKTOG(STOREMASK); 20120600
FORGETSPACE(L+2); 20120800
END; % IF PRT SPACE WAS TOO LARGE 20120900
% ZERO OUT STACK TO EASE PROBLEMS OF CONGENITAL DUMP-READERS 20121000
M[STACKLOC] := @3333333333333333; 20121100
MOVE(T-STACKLOC-1,STACKLOC,STACKLOC+1); 20121200
20121300
% . . . . . . . . . . . . . . . . . . . . . . . 20121400
% READ IN PRT FROM DISK 20121500
% . . . . . . . . . . . . . . . . . . . . . . . 20121600
20121700
DISKWAIT(-T, SEG0[3].[CF], ACTUALDISKADDRESS(SEG0[2].[CF])); 20121800
% SEG0[2] = RELATIVE DISK ADDRESS OF THE PRT IN THE CODE FILE 20121900
% SEG0[3] = SIZE OF THE PRT 20122000
TRP:=PRTROW[MIX]:=[M[T]]&1023[8:38:10]; % DESCRIPTOR TO THE PRT 20122100
20122200
% ***** ***** ***** **** *** ***** ***** 20122300
% * * * * * * * * 20122400
% ***** ***** * ** * * * * * 20122500
% * * * * * * * * * 20122600
% ***** ***** ***** **** *** ***** * 0 20122700
20122800
IF REENTRY THEN 20123000
BEGIN 20123100
% RE-ENTRANT JOB, PRT[4] POINTS TO EXISTING SEGMENT DICTIONARY 20123200
COMMENT BUILD PHONY ICW, IRCW, & INCW; 20123300
M[STACKLOC] := @2222222222222222; 20123400
M[STACKLOC+1] := -FLAG(0&(TRP)[6:33:9]); 20123500
M[STACKLOC+2] := -FLAG(0); 20123600
TRP[8] := -FLAG(STACKLOC+2); 20123700
TRP[10] := TRP&(STACKLOC+1)[18:33:15]; 20123800
END % REENTRY 20123900
ELSE 20124000
BEGIN 20124100
NFO[(MIX-1)|NDX+1] := 20124700
TRP[4]:=[M[T:=GETSPACE(SEG0[1].[CF],SEGDICTAREAV,1)+2]]; %167-20124900
DISKWAIT(-T, SEG0[1].[CF], ACTUALDISKADDRESS(SEG0[0].[CF])); 20125000
% SEG0[0]= RELATIVE DISK ADDRESS OF SEGMENT DICTIONARY 20125100
% SEG0[1]= SIZE OF THE SEGMENT DICTIONARY 20125200
M[TRP[4]] := SEG0[1].[CF] -1; % SEGDICT[0]=SIZE OF DICTIONARY 20125300
$ SET OMIT = NOT(AUXMEM) 20125400
END; % NOT REENTRY 20126400
20126600
% **** ***** * ***** ***** 20126700
% * * * * * * * * 20126800
% * * ***** * * * * 20126900
% * * * * * * * * 20127000
% **** * * ***** ***** ***** 20127100
20127200
STREAM(D:=DALOCROW[MIX]:=SAVEARRAYDESC(DALOCSIZE,DALOCROWAREAV)); 20127300
BEGIN 20127500
SI:=D; SI:=SI-8; DS:=DALOCSIZE WDS; 20127600
END; 20127700
IF OLAYDISK NEQ 0 THEN % OLAY DISK OBTAINED ABOVE 20127800
BEGIN 20127900
DALOC[MIX.0] := @200002; 20128000
DALOC[MIX,1] := OLAYDISK; 20128100
OLAYDISK := 0; 20128200
END; 20128300
OLAYMASK := TWO(MIX) OR OLAYMASK; % OLAYS NOW ALLOWABLE 20128400
20128500
% ***** ***** ***** ***** ***** * * 20128600
% * * * * * * * * * * * ** * 20128700
% * * * * * * * * * * * * * * 20128800
% * * * * * * * * * * * * * * 20128900
% ***** ***** * * * * * * ***** * ** 20129000
20129100
% PLACE "COMMON" VALUE IN FIRST SIMPLE VARIABLE IN THE PRT 20129200
NT1 := S[19]; % COMMON VALUE IN SHEET[19] 20129300
FOR I:= @25 STEP 1 WHILE NT1 NEQ 0 AND I LSS SEG0[3] DO 20129400
IF TRP[I]=0 THEN % SIMPLE VARIABLE (NOT A DESCRIPTOR) 20129500
BEGIN 20129600
TRP[I]:=NT1; 20129700
NT1:=0; 20129800
END; 20129900
DELINK; % DELINK SHEET ENTRY FROM SHEET QUEUE 20130000
20130100
EXIT: 20140000
20140100
P([RETURNRCW], STS, 0, RDS, 0, XCH, P&P[CTF], STF); 20140200
END PROCEDURE SELECTRUN2; 20140300
20140400
% FOR ADDITIONAL INFORMATION CONCERNING THE SHEET, SEE THE 20140500
% DOCUMENT AT SEQUENCE NUMBER 20512000 20140600
20140700
PROCEDURE SELECTRUN(F); VALUE F; REAL F; 20140800
BEGIN 20140900
20141000
REAL MSCW = -2, 20141100
F = -1, 20141200
MYMSCW = -1, 20141300
RCW = +0, 20141400
I = +1, 20141500
T = +2, 20141600
L = +3, 20141700
DT = +4, 20141800
MIX = +5, 20141900
HDR = +6, 20142000
LEVEL = +7, 20142100
MCPJOB = +8, 20142200
OLAYDISK = +9, 20142300
THISLINK = +10, 20142400
NEXTLINK = +11, 20142500
PREVLINK = +12, 20142600
TYPE = +13, 20142700
STACKLOC = +14, 20142800
SHEETLOCKED = +15; 20142900
20142940
INTEGER EST = I; % USED FROM 20163700 TO 20165300 20142950
20143000
ARRAY S = +16[*], 20143100
SEG0 = +17[*], 20143200
TRP = +18[*], 20143300
LBL = +19[*], 20143400
SD = NT2[*], 20143500
TSKA = NT2[*]; 20143600
20143700
NAME ADDR = LBL +1; 20143900
REAL PASSLEVEL = ADDR + 1, 20144000
SVALUE = PASSLEVEL, 20144100
RETURNMSCW = PASSLEVEL + 1, 20144200
RETURNRCW = RETURNMSCW + 1; 20144300
20144400
DEFINE SHEETMAX = MIXMAX#; 20144500
20144600
20145700
%%%% ***NOTE**** 20145800
%%%% THE VARIABLES DECLARED ABOVE MUST CORRESPOND EXACTLY TO 20145900
%%%% THOSE DECLARED IN PROCEDURE SELECTRUN. 20146000
20146100
DEFINE XCLOCKTIME = 20146200
(((NT2:=(XCLOCK DIV 3600)) MOD 60 + (NT2 DIV 60)|100 + 20146300
0.5 ) DIV 1)#; 20146400
20146410
$ SET OMIT = NOT(PACKETS) 20146419
DEFINE UNITNO = S[23].[2:6]#; % ORIGINATING UNIT 20146420
$ POP OMIT 20146421
20146500
LABEL START, CONTINUE, LOAD, PASS, WINDUP, QUIT; 20146600
LABEL JARSPACE, TRYAGAIN, NG; %127-20146700
20146800
SWITCH SW := QUIT, START, CONTINUE, QUIT, QUIT, PASS; 20146900
20147000
COMMENT THE VALUE OF "TYPE" MAY DETERMINE WHICH PORTIONS OF 20147100
PROCEDURES "SELECTRUN1" AND/OR "SELECTRUN2" WILL BE EXECUTED. 20147200
PROCEDURE "SELECTRUN1" AND "SELECTRUN2" MAY, IN TURN, SPECIFY 20147300
THE BRANCH POINT IN THIS PROCEDURE. 20147400
THE FOLLOWING DEFINES ARE USED TO SPECIFY THE BRANCH POINT 20147500
IN SWITCH "SW". 20147600
END OF COMMENT; 20147700
20147800
DEFINE STARTING = 1#, 20147900
CONTINUEING = 2#, 20148000
QUITTING = 3#, 20148100
RUNING = 4#, 20148200
PASSING = 5#, 20148300
EQUATING = 6#; 20148400
20148500
P(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); 20148700
RCW := RCW & P(..SELECTRUN,LOD)[CTC]; 20149200
20149300
TYPE := STARTING; 20149400
20149500
START: 20149600
20149700
P1MIX := 0; 20149800
IF F NEQ 0 THEN % SHEET ENTRY PASSED AS A PARAMETER 20149900
BEGIN 20150000
S := IOQUE & F[CTC]; % SHEET ENTRY 20150100
HDR := F.[FF]; % CORE ADDRESS OF OBJECT FILE HEADER 20150200
END 20150300
ELSE 20150400
BEGIN 20150500
IF TYPE=STARTING AND NOT SHEETLOCKED THEN 20150600
BEGIN 20150700
SLEEP([TOGLE].SHEETMASK); 20150800
LOCKTOG(SHEETMASK); 20150900
SHEETLOCKED := 1; 20151000
END; 20151100
P([SVALUE], STS); 20151200
SELECTRUN1; 20151300
IF TYPE LSS 0 THEN 20151400
GO TO SW[TYPE:=ABS(TYPE)]; 20151500
END; 20151600
20151700
CONTINUE: 20151800
20151900
P1MIX := 0; 20152000
IF (MCPJOB := S[2].SSYSJOBF) THEN 20152100
IF (MCPJOB = PRNPBTCODE AND AUTOPRINT) OR 20152200
(MCPJOB = LDCNTRLCODE AND CDONLY) THEN 20152300
MCPJOB.[1:1] := 1; 20152800
20152900
% NOTE: A NEGATIVE SIGN FOR MCPJOB IMPLIES THAT THIS JOB 20153000
% SHOULD BE STARTED REGARDLESS OF THE AVAILABILITY OF 20153100
% SYSTEM CORE. 20153200
20153300
IF INTSIZE=0 THEN % NO INTRINSICS FILE 20153400
IF NOT(MCPJOB) THEN % NOT "SYSTEM" PROGRAM 20153500
BEGIN 20153600
STREAM(NT3:=NT3:=SPACE(4)); 20153700
DS:=24 LIT"##NO INTRINSICS FILE...~"; 20153800
SPOUT(NT3); 20153900
SLEEP([INTSIZE],@1777); 20154000
END; 20154100
20154200
WHILE(NT2:=XCLOCK+P(RTR)) GEQ WITCHINGHOUR DO MIDNIGHT; 20157700
20157800
% ***** * ***** * * **** *** ***** * * 20157900
% * * * * * * * * * * * * * 20158000
% * * * ***** * * * * ***** *** 20158100
% * * * * * * * * * * * * 20158200
% ***** ***** * * * **** *** ***** * * 20158300
20158400
IF NOT MCPJOB THEN % NOT "LIBMAIN","LDCNTRL","PRNPBT" 20158500
IF OLAYDISK=0 THEN % NO OLAY DISK OBTAINED YET 20158600
IF(OLAYDISK:=PETUERDISK(500 OR M,1))=0 THEN % NO OLAY DISK 20159100
BEGIN 20159200
L:=1; 20159500
GO TO PASS; 20159900
END; % IF NOT OLAY DISK 20160000
20160200
COMMENT JOB WILL BE RUN ONLY IF: 20160300
1) AN XS OR ES MESSAGE HAS BEEN ENERED FOR THIS JOB, (IN WHICH 20160400
CASE SHEETDIDDLER TURNED ON S[2].[1:1] AND CALLED SELECTION),20160500
OR 2) THE SUM OF THIS JOBS CORE REQUIREMENTS (S[20]) PLUS THE SUM 20160600
OF THE CORE REQUIREMENTS OF ALL OTHER JOBS ACTUALLY RUNNING 20160700
(CORE.[FF]) IS LESS THAN THE TOTAL AMOUNT OF CORE AVAILABLE 20160800
FOR USER PROGRAMS (THE INITIAL SPACE AVAILABLE (CORE.[CF]) 20160900
TIMES THE MULTIPROCESSING FACTOR (CORE.[4:14]), 20161000
OR 3) "LDCNTRL/DISK" IS BEING TESTED AND THE "CDONLY" OPTION IS SET 20161100
OR 20161200
"PRNPBT/DISK" IS BEING TESTED AND THE "AUTOPRNT" OPTION IS SET20161300
20161400
IF THE JOB BEING TESTED IS A "SYSTEM" JOB (LIBMAIN,LDCNTRL, 20161500
PRNPBT) AND THE ABOVE CONDITIONS ARE NOT SATISFIED, THE 20161600
THE APPARENT AMOUNT OF AVAILABLE CORE (AS SHOWN IN THE "CORE" 20161700
WORD) IS TESTED USING A FACTOR OF 1.1 TIMES THE ACTUAL FACTOR 20161800
IN ORDER TO ATTEMPT TO FORCE THESE JOBS IN. 20161900
END OF COMMENT; 20162000
20162100
IF S[2].[8:10]=5 THEN % "RUN" JOB GETS SPECIAL HANDLING 20162300
$ SET OMIT = NOT(DATACOM AND RJE ) 20162400
BEGIN 20162700
TYPE := RUNING; 20162800
P([SVALUE],STS); 20162900
SELECTRUN1; 20163000
IF TYPE LSS 0 THEN 20163100
GO TO SW[TYPE:=ABS(TYPE)]; 20163200
END; % IF A "RUN" REQUEST 20163300
T:=S[20]; % USED UNTIL 20178900 20163600
IF (EST:=CORE.[CF]|CORE.[4:14]/100)<T THEN % ESTIMATE > TOTAL. 20163700
IF EST>0 THEN T:=EST; % SET IT TO TOTAL. 20163800
L:=0; %125-20163900
IF NOMEM NEQ 0 THEN GO TO PASS; 20164000
IF (S[2] LSS 0) OR (MCPJOB.[1:1]) THEN GO TO JARSPACE; 20164200
% MCPJOB.[1:1]=1 MEANS RUN IT REGARDLESS OF CORE AVAILABILITY 20164300
% S[2].[1:2] ::: [0=NORMAL, 1=NOT USED, 2=XS-ED, 3=ES-ED] 20164400
IF (LEVEL GTR PASSLEVEL) THEN GO TO PASS; %140-20164700
$ SET OMIT = NOT(BREAKOUT) %140-20164750
$ SET OMIT = NOT(WORKSET) 20165110
IF (WKSETSTOPJOBS NEQ 0) OR WKSETNOSELECT THEN GO TO PASS; 20165120
$ POP OMIT % WORKSET 20165130
IF CORE.[FF]+T > (IF MCPJOB THEN EST|1.1 ELSE EST) THEN GO PASS;20165300
% AN ATTEMPT IS MADE TO RUN MCPJOBS EVEN WHEN CORE IS FULL BY 20165400
% TESTING THEM AGAINST A VALUE 10% HIGHER. 20165500
20166800
% *** ***** ***** ***** ***** ***** ***** ***** 20166900
% * * * * * * * * * * * * 20167000
% * ***** ***** ***** ***** ***** * ***** 20167100
% * * * * * * * * * * * * 20167200
% ***** * * * * ***** * * * ***** ***** 20167300
20167400
JARSPACE: 20167500
20167600
IDLETIME; 20167650
% FIND A MIX SLOT FOR THIS JOB 20167700
FOR MIX:=1 STEP 1 UNTIL MIXMAX DO 20167800
IF JAR[MIX,*]=0 THEN GO LOAD; 20167900
20168000
% NO FREE SPACE IN JAR: PASS ENTRY WITHOUT DELINKING AND CONTINUE 20168100
L:=2; 20168150
GO TO PASS; 20168200
20168700
% * ***** ***** **** *** ***** ***** 20168800
% * * * * * * * * * * * * 20168900
% * * * ***** * * * ***** ***** 20169000
% * * * * * * * * * * * * * 20169100
% ***** ***** * * **** **** * * * * 20169200
20169300
LOAD: 20169400
20169500
JARROW[MIX] := IOQUE & HDR[CTC]; % FILE HEADER BECOMES JAR ROW 20169600
M[HDR-2].[9:6] := MIX; % PLACE MIX INDEX IN MEMORY LINK 20169800
M[HDR-2].[3:6] := JARROWAREAV; %167-20169900
CORE.[FF] := CORE.[FF] + T; % ADD IN CORE ESTIMATE 20170600
$ SET OMIT = NOT(PACKETS) 20170700
IF(I:=S[23].[2:6]) GEQ 32 THEN PSEUDOMIX]MIX]:=I; % PSUEDO-RDR JOB 20170800
$ POP OMIT % PACKETS 20170900
JAR[MIX,0] := S[0]; 20171000
JAR[MIX,1] := S[1]; 20171100
JAR[MIX,2]:=S[2]&(IF (NT1:=S[2].[8:10])=5 THEN 2 ELSE NT1)[8:38:10];20171200
% IF THIS IS A "RUN" JOB, CHANGE IT TO SAY "EXECUTE" 20171300
% JAR[MIX,2].[8:10] = SHEET[2].[8:10] = 20171400
% 0 = "GO" PART OF COMPILE AND GO 20171500
% 1 = COMPILE AND GO 20171600
% 2 = EXECUTE 20171700
% 3 = COMPILE FOR SYNTAX 20171800
% 4 = COMPILE TO LIBRARY 20171900
5 5 = RUN JOB 20172000
STREAM(A:=JAR[MIX,3].[30:18], D:=[DT]); % CREATION DATE FROM HDR 20172100
BEGIN 20172200
SI:=LOC A; DS:=8DEC; 20172300
END; 20172400
$ SET OMIT = NOT(NEWLOGGING) 20172499
PROCTIME[MIX] := -(JAR[MIX,3]:=S[16]); % PROCESS LIMIT %127-20172600
IOTIME [MIX] := -(JAR[MIX,4]:=S[17]); % I/O LIMIT %127-20172700
STREAM(DATE, A:=[I]); % CONVERT DATE TO OCTAL FOR LOGGING 20172800
BEGIN 20172900
SI:=LOC DATE; DS:=8OCT; 20173000
END; 20173100
JAR[MIX,5]:=(XCLOCK+P(RTR)) & I[1:25:23]; % DATE AND TIME 20173200
JAR[MIX,6] := S[6]&S[23][2:2:6]; % CARD/PSEUDO RDR. UNITNO IN [2:6] 20173300
JAR[MIX,7] := 0; % IDLETIME ENTRY 20173800
JAR[MIX,9].[FF] := 0; % ZERO OUT "CHAIN" DISK ADDRESS FIELD 20173900
% JAR[MIX,8] THROUGH JAR[MIX,29] STILL CONTAIN CONTENTS OF 20174100
% OBJECT FILE HEADER AS OBTAINED ABOVE 20174200
JAR[MIX,9] := M[HDR INX 9].[CF] & MCPJOB[6:45:3] & 20174300
(S[2].[4:1] AND NOT(S[2].[2:1] OR AUTOMESS))[2:47:1]; 20174400
% S[2].[4:1]=1 MEANS SUPPRESS BOJ/EOJ MESSAGES 20174500
% MARK JAR[9] WITH JOB CODE (1,3 OR 5 FOR SYS JOB) 20174600
% INSURE THAT THIS JOB HAS A UNIQUE STARTING TIME (FOR LOG) 20174900
TRYAGAIN: 20175000
FOR I:=1 STEP 1 UNTIL MIXMAX DO 20175100
BEGIN 20175200
IF JARROW[1] NEQ 0 THEN % JOB RUNNING HERE 20175300
IF I NEQ MIX THEN % NOT OUR JOB 20175400
IF JAR[MIX,5].[24:24]=JAR[I,5].[24:24] THEN % SAME START TIME 20175500
BEGIN 20175600
JAR[MIX,5].[24:24]:=JAR[MIX,5].[24:24]+1; % BUMP THE TIME 20175700
GO TRYAGAIN; 20175800
END; 20175900
END; 20176000
% %127-20176003
% ***** ***** ***** ***** ***** ***** ***** %127-20176006
% * * * * * * * * * %127-20176009
% ***** ***** * ** * ***** ***** * * %127-20176012
% * * * * * * * * * * %127-20176015
% ***** ***** ***** ***** ***** * * ***** %127-20176018
% %127-20176021
IF F NEQ 0 THE % SHEET ENTRY PASSED AS A PARAMETER %127-20176024
BEGIN %127-20176027
IF SEG0 NEQ 0 THEN FORGETSPACE(SEG0); %127-20176030
SEG0 := S & S[7][CTC]; % CEG. ZERO PRESENT AT CORE ADDR. "S[7]" 20176033
END %127-20176036
ELSE %127-20176039
BEGIN %127-20176042
IF SEG0 = 0 THEN % %127-20176045
M[(SEG0:=ARRAYDESC(30,SEGZEROAREAV)) INX NOT 1].AREAMIXF:=0;20176048
DISKWAIT(-(SEG0 INX 0),30,M[HDR INX 10]); % READ SEGMENT ZERO 20176054
END; % IF SEGMENT ZERO WAS NOT PRESENT %127-20176057
% %127-20176060
% ***** ***** ***** ***** * * ***** ***** ***** 20176063
% * * * * * * * * * * * * * 20176066
% ***** * ***** * *** ***** ***** ***** * 20176069
% * * * * * * * * * * * * 20176072
% ***** * * * ***** * * * * * * 20176075
% %127-20176078
% S[21] CONTAINS STACK SIZE, SEG0[3] CONTAINS PRT SIZE %127-20176081
IF SEG0[3] GTR 0 THEN % NOT A RESTART JOB %127-20176084
BEGIN %127-20176087
NFO[(MIX-1)|NDX+2] := (STACKLOC:=GETSPACE % %167-20176090
(SEG0[3] INX S[21] INX 64,STACKPRTAREAV,3))+2; % %167-20176093
IF STACKLOC = 0 THEN % NO MEMORY %127-20176096
BEGIN %127-20176099
NG: JARROW[MIX] := L := 0; % %127-20176102
CORE.[FF] := CORE.[FF] - T; % %127-20176105
$ SET OMIT = NOT(PACKETS) %127-20176117
PSEUDOMIX[MIX] := 0; % %127-20176120
$ POP OMIT %127-20176123
GO TO PASS; %127-20176126
END; % IF NO MEMORY %127-20176129
IF NOT MCPJOB.[1:1] THEN % DON-T UATO-START SYSJOB %127-20176132
IF STACKLOC GEQ @50000 THEN %127-20176135
BEGIN % SAVE SPACE TO HIGH... %127-20176138
FORGETSPACE(STACKLOC+2); % %127-20176141
STACKLOC := 0; % %127-20176144
GO TO NG; % %127-20176147
END; %127-20176150
END; % NOT RESTART %127-20176153
%%% SEE ALSO "SEGMENT ZERO" SECTION IN PROCEDURE "SELECTRUN2" FOR 20176200
%%% FURTHER ALTERATION TO THE JAR. 20176300
20176400
% ***** ***** **** * ***** ***** 20176500
% * * * * * * * * 20176600
% * ***** **** * ***** ***** 20176700
% * * * * * * * * 20176800
% * * * **** ***** ***** ***** 20176900
20177000
$ SET OMIT = NOT(STATISTICS) 20177200
IF S[2].[2:1] OR (S[21] LSS 128) THEN S[21]:=128; 20178100
% S[2].[2:1]=1 WHEN ES-ED, S[21] CONTAINS STACK SIZE 20178200
NFO[(MIX-1)|NDX+2] := P(DUP,LOC) & T [CTF] & ((CLOCK+P(RTR)) %127-20178900
DIV 60) [1:31:17]; % %127-20178910
PRYOR[MIX] := -1; 20179100
$ SET OMIT = NOT(WORKSET) 20179210
OLAYTIME[MIX] := 0; 20179220
$ POP OMIT % WORKSET 20179230
$ SET OMIT = NOT(DATACOM) %141-20179610
20179700
%%%%% % %%%%% %%% % % 20179800
% % %% % % % % % % 20179900
P1MIX:=MIX; %%%%% % % % % % % 20180000
% % % % % % % % 20180100
% %%% % % % %%% % % 20180200
20180300
STARTLOG(P1MIX); % BEGIN LOGGING FOR THIS MIX %127-20180350
USERCODE[MIX]:=ABS(S[24]); % USERCODE IN S[24] 20180400
CHANGEABORT(S[6]); 20180600
IF S[2].[8:10]=0 THEN FORGETESPDISK(S[25]); % FORGET OBJ.SKELETON 20180800
% S[2].[8:10]=0 FOR "GO" PART OF "COMPILE AND GO" 20180900
STREAM(Q:=FSROW[MIX]:=SAVEARRAYDESC(4,FSAREAV)); %167-20181000
DS:=32LIT"0"; 20181100
$ SET OMIT = NOT(AUXMEM) 20185300
20185700
TYPE := CONTINUEING; 20185800
20185900
% SELECTRUN2 IS CONCERNED WITH: 20186000
% BOJ MESSAGE 20186100
% SEGMENT ZERO 20186200
% STACK AND PRT 20186300
% SEGMENT DICTIONARY 20186400
% DALOC 20186500
% COMMON 20186600
20186700
P([SVALUE],STS); 20186800
SELECTRUN2; 20186900
IF TYPE LSS 0 THEN 20187000
GO TO SW[TYPE:=ABS(TYPE)]; 20187100
20187200
IF (SEG0[7].[CF]=0) THEN % BUILD A DUMMY FILE PARAMETER BLOCK 20187300
TRP[3]:=[M[GETSPACE(1,FPBAREAV,1)+2]] ELSE% %167-20187400
BEGIN 20187500
TYPE := EQUATING; % BUILD FPB AND PROCESS LABEL EQUATION 20187600
P([SVALUE],STS); 20187700
SELECTRUN1; 20187800
IF TYPE.[1:1] THEN GO TO SW[TYPE:=ABS(TYPE)]; 20187900
END; 20188000
20188100
NFO[(MIX-1)|NDX] := TRP[3]; 20188600
% TRP[3] VALUE SET BY SELECTRUN1 FOR NON-MCP TYPE JOB 20188800
GO TO WINDUP; 20188900
20189000
PASS: 20189100
20189200
TYPE := PASSING; 20189300
P([SVALUE],STS); 20189400
SELECTRUN1; 20189500
IF TYPE LSS 0 THEN 20189600
GO TO SW[TYPE:=ABS(TYPE)]; % SELECTRUN1 DETERMINES BRANCH POINT 20189700
20189800
WINDUP: 20189900
20190000
% *** ** * *** ***** *** ***** **** 20190100
% * ** * * * * * * * * 20190200
% * * * * * * * * * **** 20190300
% * * ** * * * * * * * * 20190400
% *** * ** *** * 0 **** ***** **** 20190500
20190600
$ SET OMIT = NOT(WORKSET) 20190610
WKSETSWITCHTIME := CLOCK + P(RTR); % TIME OF LAST SELECTION 20190620
$ POP OMIT % WORKSET 20190630
% INITIALIZE OTHER PRT CELLS 20190700
TRP[0] := WORDOFEASE; 20190800
TRP[2] := MEMORY; 20190900
TRP[10] := TRP&(STACKLOC+1)[18:33:15]; 20191000
IF JAR[MIX,0] LSS 0 THEN % COMPILE JOB 20191100
BEGIN 20191200
IF(NT1:=JAR[MIX,2].[8:10])=4 THEN % COMPILE TO LIBRARY 20191300
TRP[@26]:=S[22] % SAVE FACTOR FOR OBJECT FILE IN SHEET[22] 20191400
ELSE IF NT1=3 THEN % COMPILE FOR SYNTAX ONLY 20191500
BEGIN 20191600
TRP[@26]:=-1; % SAVE FACTOR = (-1) % DONT SAVE OBJECT 20191700
JAR[MIX,2].[8:10]:=2; % MARK IT AN "EXECUTE" JOB 20191800
END; 20191900
END; % COMPILE JOBS 20192000
TRP[6]:=FLAG(0&[TRP[6]][18:33:15]&[8:38:10]); 20192100
IF JAR[MIX,2] GEQ 0 THEN % NOT COBOL 20192200
TRP[11]:=FLAG(0&[TRP[11]][18:33:15]&8[8:38:10]); % "OAT" ENTRY 20192300
% BRING IN STARTING SEGMENT&BUILD CONTROL WORDS FOR INITIATE% 20192400
MAKEPRESENT(TRP INX POLISH(SEG0[6],TRP[4],INX,LOD).[8:10]); 20192500
% SEG0[6] = STARTING SEGMENT NUMBER 20192600
% SEGDICT[SEG0[6]].[8:10] = PRT LOCN. OF DESC. FOR STARTING SEGMENT 20192700
M[STACKLOC+2]:= -FLAG(POLISH(SEG0[6],TRP[4],INX,LOD).[18:15]); 20192800
M[STACKLOC+1]:= -FLAG(0&(TRP)[6:33:9]); 20192900
M[STACKLOC] := @2222222222222222; 20193000
TRP[8] := -FLAG(STACKLOC+2); % INITIATE CONTROL WORD 20193100
IF(NT1:=TRP[4].[18:6]) NEQ 0 THEN 20193200
INTABLEROW[MIX]:=INTABLEROW[NT1] 20193300
ELSE IF NOT(JAR[MIX,9].SYSJOBF) THEN % NOT "SYSTEM" JOB 20193400
BEGIN 20193500
I:=INTSIZE; 20194100
INTABLEROW[MIX]:=[M[GETSPACE(I,1,1)+2]]&1[8:38:10]; 20194300
STREAM(A:=I,T:=INTABLEROW[MIX]); 20194400
BEGIN 20194500
SI:=T; SI:=SI-8; DS:=A WDS; 20194600
END; 20194700
END; 20194800
20194900
20195000
IF S[2].[2:1] THEN % S[2].[2:1]=1 WHEN ES-ED, CALL TERMINATE 20195100
BEGIN 20195200
JAR[MIX,2].[2:1]:=1; % MARK IT TERMINATED 20195400
TERMINATE(MIX & 20195500
(IF JAR[MIX,2].[7:1] AND (*P(TSX INX TRP)).PBIT THEN 20195600
90 ELSE 35)[CTF]); 20195700
END 20196300
ELSE 20196400
IF JAR[MIX,2].[7:1] THEN % TASK WHOSE PARENT HAS 20196500
IF (TSKA~*P(TSX INX TRP)).PBIT THEN % DECLARED TASK ARRAY %110-20196600
BEGIN 20196700
TSKA[1] := JAR[MIX,0]; 20196800
TSKA[2] := JAR[MIX,1]; 20196900
TSKA[3] := 2; % STATUS: ACTIVE 20197000
TSKA[4] := MIX; 20197100
END; 20197200
$ SET OMIT = NOT(NEWLOGGING) 20197300
SAVEMIX(MIX); 20197600
PRYOR[MIX] := S[18]; % PRIORITY IN SHEET[18]; 20198500
IF F=0 THEN % SHEET ENTRY NOT PASSED AS A PARAMETER 20199200
BEGIN 20199300
TYPE := (IF S[2].[1:1] THEN STARTING ELSE CONTINUEING); 20199400
% IF ES-ED THEN RE-START SHEET SEARCH; OTHERWISE,CONTINUE ON 20199500
GO TO START; 20199600
END; 20199700
20199800
QUIT: 20210000
20210100
P1MIX := 0; 20210200
IF SHEETLOCKED THEN UNLOCKTOG(SHEETMASK); 20210300
IF S NEQ 0 THEN FORGETSPACE(S); % SPACE FOR SHEET ENTRY 20210400
IF SEG0 NEQ 0 THEN FORGETSPACE(SEG0); % SPACE FOR SEGMENT ZERO 20210500
IF OLAYDISK NEQ 0 THEN FORGETUSERDISK(OLAYDISK,-500); 20210600
IF LBL NEQ 0 THEN FORGETSPACE(LBL); % SPACE FOR LABEL EQN.ENTRIES 20210700
KILL([MSCW]); 20211400
END SELECTION ROUTINE; 20211600
DEFINE% 20212000
COMMA = 10#,% 20213000
EQUAL = 11#,% 20214000
PERIO = 12#,% 20215000
SLASH = 13#,% 20216000
QUEST = 14#,% 20217000
POUND = 15#,% %LP 1 20217500
RB = 16#,% RIGHT BRACKET FOR EXCEPT LIST 20217600
LB = 17#,% LEFT " " " " 20217700
SPECI = 19#,% 20218000
IDENT = 20#,% 20219000
UNLOCKV = 21#,% SWITCH LABEL (FUNC) IN 20219050
USEV = 22#,% SECURITYMAINT USES THE ORDER OF 20219060
LOCKV = 23#,% VALUES OF "UNLOCKV" THROUGH "OPEN". 20219100
FREE = 24#, 20219200
OPEN = 25#, 20219300
PACKET = 26#, 20219310
USER = 27#, 20219400
RUNV = 28#, 20219500
COMPI = 29#, 20220000
EXECU = 30#, 20221000
COPYN = 31#, 20221500
DUMP = 32#, 20222000
UNLOAD = 33#, 20223000
ADDV = 34#, 20224000
LOAD = 35#, 20224500
REMOV = 36#, 20225000
CHANG = 37#, 20225500
ENDFI = 39#,% 20226000
$ SET OMIT = NOT(PACKETS) 20226099
WAITV = 40#,% 20226100
$ POP OMIT 20226101
DATAV = 41#,% 20226500
LABEV = 42#,% 20227000
SETV = 43#,% 20228000
RESETV = 44#,% 20228100
FILEV = 47#,% -20228200
EXPIRED = 48#,% -20228300
ACCESSD = 49#,% -20228400
PROCE = 50#,% A STORE NEARE THE END OF PCC 20229000
IO = 51#,% MAKES USE OF THE ORDER AND VALUES 20230000
PRIOR = 52#,% OF "PROCE" THRU "SAVEV". 20231000
COMMONV = 53#,% 20232000
COREV = 54#,% 20232500
STACK = 55#,% 20233000
SAVEV = 56#,% (SAVE #DAYS ON COMPILE TO LIBRARY) 20233500
ALGOL = 60#,% 20234000
FORTRAN = 62#,% -20235000
TSPOL = 63#,% -20235050
BASIC = 64#,% 20235075
COBOL68 = 65#,% -20235080
WITH = 66#,% -20235099
COBOL = 67#,% -20235100
LIBRA = 68#,% 20236000
SYNTA = 69#,% 20237000
FROM = 70#,% 20238000
TOV = 71#,% 20239000
ONV = 72#,% %148-20239100
FORM = 75#,% SWITCH D(PCC)"FORM"-"SPECIAL- %846-20240000
LINES66 = 77#, % 66 LINES PER PAGE %724-20240020
NO = 79#,% 20241000
DISK = 80#,% 20242000
TAPE = 81#,% 20243000
PUNCH = 82#,% 20244000
PRINT = 82#,% 20245000
BACK = 83#,% 20246000
SPECIAL = 90#, 20247000
REMOTE = 89#, 20247500
EU = 91#,% -20247600
SLOW = 92#,% -20247700
B6500 = 93#,% -20247800
FAST = 94#, 20247900
MAXV = 96#, 20247920
FREEF = 97#,% 20247930
FIXED = 98#, 20247940
SENSE = 100#, 20247950
LATESTV = 101#, 20247960
EXCEPT = 102#, 20247970
AS = 103#, 20247980
NOHASH = 104#, 20247990
PAPER = 84#;% 20248000
COMMENT RESWDS CONTAINS RESERVED WORDS FOR CONTROL CARDS;% 20249000
DEFINE DECLARECCVARIABLES = 20288000
REAL MSCW = -2, 20288100
CARD = MSCW+1, MYMSCW = CARD, 20288105
RCW = +0, 20288110
PROCVAL = RCW+1, %IN CASE OF TYPED PROCEDURES 20288115
A = PROCVAL+1, T = A, 20288120
CADDR = A+1, SFID = CADDR, 20288125
CARDLOC = CADDR+1, 20288130
CDEX = CARDLOC+1, SDEX = CDEX, 20288135
CMPLR = CDEX+1, 20288140
ON = CMPLR+1, 20288150
KOUNT = CN+1, 20288155
LASTSCAN = KOUNT+1, 20288165
LIBNO = LASTSCAN+1, 20288170
N1 = LIBNO+1, 20288175
N2 = N1+1, 20288185
N3 = N2+1, 20288190
N4 = N3+1, U = N4, 20288195
OPTN = N4+1, 20288200
OPTNN = OPTN+1, 20288205
PADDR = OPTNN+1, SFH = PADDR, 20288210
PDEX = PADDR+1, SMID = PDEX, 20288215
PPCPROCESS = PDEX+1, 20288220
SOURCE = PPCPROCESS+1, 20288225
SPOUTUNIT = SOURCE+1, 20288240
ST = SPOUTUNIT+1, 20288245
T1 = ST+1, 20288250
UNITNO = T1+1, 20288255
USERID = UNITNO+1, 20288260
ARRAY ACCUM = USERID+1[*], 20288265
CEQN = ACCUM+1[*], 20288270
CMM = CEQN+1[*], 20288275
DIRECT = CMM+1[*], 20288280
PEQN = DIRECT+1[*], 20288285
PROG = PEQN+1[*]; 20288295
NAME ADDR = PROG+1; 20288300
BOOLEAN ABORT = ADDR+1, 20288305
TOG = ABORT+1; 20288310
REAL RETURNMSCW = TOG+1, % THESE LOCALS MUST BE THE LAST 20288315
RETURNRCW = RETURNMSCW+1, % THREE LOCALS OF CONTROLCARD 20288320
RETURNVAL = RETURNRCW+1 20288325
#; 20288900
20289000
$ SET OMIT = NOT(PACKETS) 20289009
PROCEDURE PRINTTHECOVER(CARD,UNITNO,PS); 20289010
VALUE CARD,UNITNO,PS; REAL CARD,UNITNO,PS; 20289020
% TO ALTER SIZE OF ONE-AREA PACKET PAGE CHANGE DEFINE AT 02113091 20289025
BEGIN LABEL TRYAGAIN; 20289030
REAL BUF,T,TP,X; 20289035
INTEGER I,PAGEADDR; ARRAY HEADER[*]; 20289040
SUBROUTINE BUILDHEADER; 20289045
BEGIN 20289050
HEADER:=IOQUE & BUF[CTC]; 20289055
M[BUF]:=0; 20289060
MOVE(29,BUF,BUF+1); 20289065
STREAM(DATE,H3:=HEADER INX 3); 20289080
BEGIN SI:=LOC DATE; DS:=8OCT; % CREATION 20289085
DI:=H3; DS:=2LIT"+#"; % SAVE 10 20289090
SI:=H3; SI:=SI+5; DS:=3CHR; % ACCESSED 20289095
END; 20289100
HEADER[0]:=@0013200132000103; % 90,90,1,3 20289105
HEADER[1]:=(XCLOCK+P(RTR)) & HEADER[3][6:30:18]; 20289110
HEADER[2]:=HEADER[5]:=MCP.[6:42]; %131-20289113
HEADER[4]:=0&(@1001)[2:38:10]&SYSNO[4:46:2]; %112-20289115
$ SET OMIT = NOT(DATACOM AND RJE) OR OMIT 20289117
HEADER[7]:=(PAGESIZE DIV 3)-1; 20289120
HEADER[8]:=PAGESIZE; 20289125
HEADER[9]:=1; 20289130
HEADER[10]:=PAGEADDR; 20289135
END BUILDHEADER; 20289140
TRYAGAIN: 20289142
CIDTABLE[UNITNO-32,6]:=TP:= 001 & NEXTCDNUM(1)[6:24:24]; 20289144
IF DIRECTORYSEARCH(="PBD ",TP,5)!0 THEN GO TRYAGAIN; 20289146
BUF:=SPACE(90); 20289148
PAGEADDR:=GETUSERDISK(PAGESIZE); 20289150
PS:=IF CARD.[9:9]=0 THEN 20289152
IF PS=0 THEN "CRA" ELSE IF PS=1 THEN "CRB" ELSE 20289153
IF PS=2 THEN TINU[UNITNO].[30:18] ELSE 20289154
IF PS=3 THEN "ZIP" ELSE " " ELSE 20289155
$ SET OMIT = NOT(DATACOM AND RJE) OR OMIT 20289156
" "; 20289159
STREAM(CARD,TP:=CIDTABLE[UNITNO-32,2],PS 20289160
, N:=CIDTABLE[UNITNO-32,7]+1,BUF); 20289163
BEGIN DS:=8LIT" "; SI:=BUF; 2(DS:=44 WDS); 20289165
SI:=LOC N; DI:=LOC N; DS:=8DEC; DI:=LOC N; DS:=8FILL; 20289170
SI:=LOC N; SI:=SI+3; DI:=BUF; DI:=DI+12; 20289175
DS:=7LIT"INPUT "; DS:=5CHR; DS:=12LIT" CARDS FROM "; 20289180
SI:=LOC PS; SI:=SI+5; DS:=3CHR; 20289185
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}14000"; BUF:=DI; 20289190
SI:=LOC TP; SI:=SI+2; DI:=DI+12; 20289195
DS:=8LIT"PACKET "; DS:=4CHR; DI:=DI-4; DS:=3FILL; 20289200
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}14000"; BUF:=DI; 20289205
SI:=CARD; DS:=9WDS; 20289210
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}12000"; BUF:=DI; 20289215
54(DS:=LIT"#"); DS:=11LIT" ABORTED "; 55(DS:=LIT"#"); 20289220
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}12000"; BUF:=DI; 20289225
DS:=16LIT"+ABORTED0PAGE "; DS:=9LIT"0PACKET 0"; 20289230
SI:=LOC TP; SI:=SI+2; DS:=4CHR; DI:=DI+3; 20289235
SI:=CARD; DS:=9 WDS; %131-20289240
40(DS:=LIT"0"); 20289245
END; 20289250
M[BUF+87]:=MCP; %131-20289252
DISKWAIT(BUF,90,PAGEADDR); 20289255
STREAM(A:=I:=((NT1:=((XCLOCK+P(RTR)) DIV 3600)) MOD 60 20289260
+(NT1 DIV 60)|100),DATE,WEEKDAY,ACTDATE,BUF); 20289265
BEGIN 20289270
3(4(DI:=DI+34); DS:=8LIT":|0|2000"); BUF:=DI; 20289275
DS:=8LIT" "; SI:=BUF; DS:=34 WDS; DI:=BUF; 20289280
SI:=LOC DATE; DI:=DI+12; DS:=4LIT"DATE"; DI:=DI+3; 20289285
SI:=SI+3; DS:=5CHR; DI:=DI+1; 20289287
SI:=SI+2; 6(IF SC=" " THEN SI:=SI+1 ELSE DS:=CHR); 20289290
SI:=LOC ACTDATE; DS:=5LIT"DAY, "; 20289295
SI:=SI+2; 2(DS:=2CHR; DS:=LIT"/"); DS:=2 CHR; 20289300
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}14000"; BUF:=DI; 20289305
SI:=LOC A; DI:=DI+12; DS:=4LIT"TIME"; DI:=DI+4; DS:=4DEC; 20289310
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}14000"; 20289315
END; 20289320
DISKWAIT(BUF,90,PAGEADDR+3); 20289325
X:=6; M[BUF+17]:=0; %178-20289335
IF (T:=DIRECTORYSEARCH("MESSAGE","0THEDAY",5))!0 THEN 20289340
BEGIN 20289345
FOR I:=0 STEP 1 WHILE (I<6) AND NOT M[BUF+17] DO 20289350
BEGIN 20289355
DISKWAIT(-BUF,90,M[T+10]+3|I); 20289360
DISKWAIT(BUF,90,PAGEADDR+6+3|I); 20289365
X:=X+3; 20289370
END; 20289375
FORGETSPACE(T); 20289380
END; 20289385
STREAM(ML:=MARKLEVEL,PL:=PATCHLEVEL,LL:=LOCALLEVEL 20289390
,IL:=M[3],BUF:=BUF+54); 20289395
BEGIN DS:=8LIT" "; SI:=BUF; DS:=34 WDS; DI:=BUF; 20289400
DI:=DI-8; DS:=8LIT":|0Q0803"; 20289405
DI:=DI+12; DS:=18LIT"#NO MESSAGES TODAY"; 20289410
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}12002"; BUF:=DI; 20289415
DI:=DI+8; DS:=3LIT"*** BURROUGHS B5700 DCMCP MARK "; 20289420
SI:=LOC ML; IF SC GEQ " " THEN; 20289425
8(IF TOGGLE THEN IF SC="0" THEN SI:=SI+1 ELSE DS:=CHR 20289430
ELSE DS:=CHR); DS:=LIT"."; 20289435
SI:=LOC PL; IF SC GEQ " " THEN; 20289440
6(IF TOGGLE THEN IF SC="0" THEN SI:=SI+1 ELSE DS:=CHR 20289445
ELSE DS:=CHR); DS:=2CHR; 20289450
SI:=LOC LL; IF SC GEQ " " THEN; 20289455
8(IF TOGGLE THEN IF SC="0" THEN SI:=SI+1 ELSE DS:=CHR 20289460
ELSE DS:=CHR); DS:=21LIT" AND INTRINSICS MARK "; 20289465
SI:=LOC ML; IF SC GEQ " " THEN; 20289470
8(IF TOGGLE THEN IF SC="0" THEN SI:=SI+1 ELSE DS:=CHR 20289475
ELSE DS:=CHR); DS:=LIT"."; 20289480
SI:=LOC IL; SI:=SI+1; IF SC>"0" THEN DS:=CHR ELSE 20289485
SI:=SI+1; DS:=2CHR; DS:=4LIT" ***"; 20289490
DI:=BUF; 4(DI:=DI+34); DS:=8LIT":|}12001"; 20289495
END; 20289500
DISKWAIT(BUF,90,PAGEADDR+X); 20289510
BUILDHEADER; 20289520
ENTERUSERFILE("PBD ",TP,BUF-1); 20289530
PSEUDO[UNITNO-32]:=(*P(DUP))& 20289540
11[8:38:10]& % PACKETPDB 20289550
(IF T!0 THEN 3 ELSE 2)[18:45:3]& % PACKETREC 20289560
1[21:47:1]& % PACKETFREE 20289570
(PAGEADDR+X)[22:22:26]; % PACKETPAGE 20289580
FORGETSPACE(BUF); 20289590
END PRINTTHECOVER; 20289600
$ POP OMIT 20289601
COMMENT FETCH READS THE NEXT CONTROL CARD , SETS SOURCE TO BEGINNING 20290000
OF CARD , SETS LAST WORD OF CARD TO PERIOD. ;% 20291000
PROCEDURE FETCH(UNITNO,CARDLOC,SOURCE); 20292000
VALUE UNITNO,CARDLOC; 20292100
REAL UNITNO,CARADLOC,SOURCE ; 20292200
BEGIN% 20293000
REAL T,E; 20294000
E:=@14&UNITNO[45:1:1]; UNITNO:=ABS(UNITNO); 20294800
IF (UNITNO OR 1)=31 THEN % DCOM OR ZIP 20295000
M[SOURCE:=CARDLOC]:=@1425452432373737 20295100
ELSE 20295200
BEGIN % NOT DCOM 20295300
$ SET OMIT = PACKETS 20295999
$ SET OMIT = NOT(PACKETS) 20296099
IF UNITNO GEQ 32 THEN 20296100
DO UNTIL NOT E.[45:1] OR T:= 20296200
$ POP OMIT 20296201
READEMFROMDISK(CIDROW[UNITNO-32],% 20297000
[M[CARDLOC]]&10[8:38:10]) ELSE% 20298000
DO BEGIN T~ 20298100
20298111
WAITIO(CARDLOC INX @40000000,E,UNITNO); 20299000
IF UNITNO=30 OR T.[45:1] THEN 20299020
STREAM(Q~12,CARDLOC); 20299030
BEGIN SI~LOC Q;SI~SI+7;DS~CHR;DS~4 LIT "END." END; 20299040
IF UNITNO=25 THEN 20299110
BEGIN 20299111
STREAM(T~0:CARDLOC);% 20300000
BEGIN SI~CARDLOC;SI~LOC T;DI~DI+6;SI~SI-1;DS~2CHR;SI~SI-1;20301000
DI~CARDLOC;DI~DI-1;DS~LIT"<";8(60(IF SC="~" THEN 20301100
BEGIN DS~CHR;JUMP OUT 2 TO L END;IF SC="<" THEN 20301200
BEGIN DI~DI-1;IF SC!DC THEN DI~DI-1 END ELSE 20301300
DS~CHR)); 20301400
L: DI~CARDLOC;DI~DI-1;SI~LOC T;SI~SI+6;DS~CHR; 20301500
END; 20301600
END ELSE P(0); 20301700
END UNTIL P.[42:6]!31; 20302000
M[(SOURCE ~ CARDLOC)+9]~0&"."[1:43:5];% 20303000
END; % NOT DCOM 20303900
END ;% 20304000
COMMENT THE SCAN ROUTINE IS USED FOR CONTROL CARD SCANNING.% 20305000
SCAN RETURNS THE FOLLOWING RESULTS :% 20306000
4 FOR IDENTIFIERS WHICH ARE NOT RESERVED% 20307000
0 FOR PERIOD% 20308000
1 FOR SLASH% 20309000
2 FOR QUESTION MARK% 20310000
5... FOR IDENTIFIERS IN DIRECT.% 20311000
3 FOR OTHER SPECIAL CHARACTERS.% 20312000
13 FOR "PRIORITY" ;% 20313000
REAL PROCEDURE SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN. 20314000
DIRECT); 20314050
VALUE UNITNO,CARDLOC ; 20314100
REAL UNITNO,CARDLOC,SOURCE, KOUNT,LASTSCAN ; 20314200
ARRAY ACCUM[*],DIRECT[*]; 20314300
BEGIN 20315000
LABEL GOGO, TYPE0,TYPE1,TYPE2;% 20316000
SWITCH TYPE ~ TYPE0,TYPE1,TYPE2 ;% 20317000
DEFINE DSIZE = 56#;% 20318000
REAL I;% 20319000
LABEL PERPER;% 20320000
GOTO:% 20321000
IF LASTSCAN THEN% 20322000
BEGIN IF LASTSCAN < 0 OR UNITNO = 31 THEN% 20323000
BEGIN I ~ QUEST; LASTSCAN ~ 0; GO TO TYPE1 END; 20324000
FETCH(UNITNO,CARDLOC,SOURCE); 20325000
LASTSCAN:=0 20325100
$ SET OMIT = NOT(PACKETS) 20325109
&1[2:47:1]; 20325110
$ POP OMIT 20325111
END;% 20326000
I ~ IDENT;% 20327000
STREAM (J~0,K~0,SOURCE : ACCUM);% 20328000
BEGIN% 20329000
SI ~ SOURCE ; DI ~ ACCUM ; DI~DI+1;% 20330000
L: IF SC = " " THEN BEGIN SI~SI+1; GO L END;% 20331000
IF SC = ALPHA THEN% 20332000
BEGIN% 20333000
IF SC =@14 THEN GO TO L3;% 20334000
DS ~ CHR ; TALLY ~ 1;% 20335000
L1: 63(IF SC=ALPHA THEN BEGIN DS~CHR;% 20336000
TALLY~TALLY+1 END ELSE JUMP OUT);% 20337000
K~TALLY; TALLY~0; J~TALLY; DS~8 LIT" ";% 20338000
END% 20339000
ELSE IF SC = """ THEN% 20340000
BEGIN SI ~ SI+1;% 20341000
30(IF SC=""" THEN JUMP OUT; 20342000
DS:=CHR; TALLY:=TALLY+1); 20342250
IF TOGGLE THEN % FOUND CLOSING QUOTE 20342500
BEGIN DS:=8 LIT" "; SI:=SI+1; 20342750
K:=TALLY; TALLY:=1; J:=TALLY; 20343000
END 20343250
ELSE % INVALID STRING 20343500
BEGIN 20343750
SI~SI-31; GO L3; 20344000
END; 20344250
END% 20345000
ELSE BEGIN% 20346000
L3:% 20347000
TALLY ~ 2; J~TALLY; DI~LOC K; DI~DI+7; DS~CHR ;% 20348000
END;% 20349000
SOURCE ~ SI;% 20350000
END;% 20351000
COMMENT STACK NOW CONTAINS : 0 FOR IDENTIFIER & NO. OF CHRS% 20352000
1 FOR "ID" & NO. OF CHRS% 20353000
2 FOR SPECIAL CHR & ACTUAL CHR ;% 20354000
P([SOURCE],~); 20355000
P([KOUNT],~); 20356000
GO TO TYPE[POLISH];% 20357000
TYPE0:% 20358000
BEGIN 20361000
I~-2; WHILE DIRECT[I~I+2]!0 DO% 20362000
IF (DIRECT[I] EQV ACCUM[0])= NOT 0 THEN% 20363000
BEGIN IF DIRECT[I+1] !QUEST OR UNITNO=25 OR UNITNO}30 THEN20364000
BEGIN I~DIRECT[I+1];GO TO TYPE1 END END;% 20365000
I ~ IDENT ; END;% 20366000
GO TO TYPE1 ;% 20367000
TYPE2:% 20368000
IF KOUNT!"~" THEN ACCUM[0]~ " 0" OR KOUNT; 20368100
IF KOUNT="~" OR% 20369000
KOUNT ="." THEN% 20370000
BEGIN LASTSCAN ~ 1;% 20371000
PERPER: I ~ PERIO; GO TO TYPE1;% 20372000
END;% 20373000
IF KOUNT="-" THEN BEGIN IF UNITNO}32 THEN 20374000
IF CIDTABLE[UNITNO-32,3]} 20374100
CIDTABLE[UNITNO-32,7] THEN 20374200
BEGIN I~ENDFI; GO TO TYPE1 END; 20374300
IF UNITNO = 31 THEN 20374310
BEGIN I~PERIO; GO TO TYPE1 END; 20374320
FETCH(UNITNO,CARDLOC,SOURCE); 20374400
STREAM(CARDLOC); %890-20374401
BEGIN %890-20374402
2(36(IF SC=">" THEN %890-20374403
BEGIN CARDLOC~SI;DI~CARDLOC;DS~ LIT "=" END; %890-20374404
IF SC="}" THEN %890-20374405
BEGIN CARDLOC~SI;DI~CARDLOC;DS~ LIT """ END; %890-20374406
SI~SI+1;)) %890-20374407
END; %890-20374408
$ SET OMIT = NOT(PACKETS) 20374409
IF UNITNO GEQ 32 AND NOT LASTSCAN.[2:1] THEN 20374410
BEGIN STREAM(CARDLOC, I~I~SPACE(10)); 20374415
BEGIN DS~5LIT">"; 20374420
SI~CARDLOC; 2(DS~36 CHR); DS~LIT"~"; 20374425
END; SPOUTER(I,UNITNO,64); 20374430
END; 20374435
$ POP OMIT 20374436
GO TO GOGO; 20374500
END; 20374600
IF KOUNT = "1" THEN% 20375000
BEGIN LASTSCAN ~ -1; GO TO PERPER END;% 20376000
I ~ IF KOUNT ="/" THEN SLASH ELSE% 20377000
(IF KOUNT = @14 THEN QUEST ELSE% 20378000
(IF KOUNT ="," THEN COMMA ELSE% 20379000
(IF KOUNT = "=" THEN EQUAL ELSE % THIS IS AS IN SYMBOL 20380000
(IF KOUNT = "]" THEN RB ELSE 20380100
(IF KOUNT = "[" THEN RB ELSE 20380200
(IF KOUNT = "#" THEN POUND ELSE SPECI)))))); 20380500
TYPE1: SCN~I; 20381000
END SCAN ;% 20382000
PROCEDURE SEEKNAM(A,B,C,D,E,N,XLST); VALUE A,B; 20382010
REAL A,B,C,D,E,N; ARRAY XLST[*]; 20382015
BEGIN 20382020
LABEL FIND,L; 20382030
ARRAY NB[*]; 20382040
REAL I,K,T,X; INTEGER J; BOOLEAN INXLST; 20382050
INTEGER J1,J2,J3,K1,K2; 20382052
LABEL RESTART; 20382054
IF C=0 THEN 20382056
BEGIN N:=SPACE(60);-1; 20382058
J1:=J3:=0; K1:=K2:=MODULUS-1; 20382060
IF A GEQ 0 THEN J1:=K1:=(A.[6:18]+A.[24:24]) MOD MODULUS; 20382062
IF B GEQ 0 THEN J3:=K2:=(B.[6:18]+B.[24:24]) MOD MODULUS; 20382064
END ELSE 20382066
BEGIN I:=(T:=M[N]).[42:6]; 20382068
J1:=T.[36:6]; J2:=T.[30:6]; J3:=T.[12:6]; 20382070
K1:=T.[24:6]; K2:=T.[18:6]; 20382072
END; 20382074
NB:=[M[N+1]]&60[8:38:10]; 20382076
IF C NEQ 0 THEN GO TO RESTART; 20382095
FOR J1:=J1 STEP 1 UNTIL K1 DO 20382100
FOR J2:=J3 STEP 1 UNTIL K2 DO 20382110
BEGIN J:=SCRAMBLE(J1,J2); 20382120
DO BEGIN 20382130
DISKWAIT(-N-1,60,J); 20382140
FOR I:=0 STEP 3 UNTIL 57 DO 20382150
BEGIN 20382160
IF (T:=NB[I]) NEQ @14 THEN 20382165
IF (T EQV A)=NOT 0 OR A<0 THEN 20382170
IF (NB[I+1] EQV B)=NOT 0 OR B LSS 0 THEN 20382200
IF (X:=XLST.[8:10]-2) GEQ 0 THEN % EXCEPT LIST EXISTS20382220
BEGIN INXLST:=FALSE; 20382240
FOR K:=0 STEP 2 UNTIL X DO 20382260
IF (XLST[K] EQV T)=NOT 0 OR XLST[K] LSS 0 THEN 20382280
IF (XLST[K+1] EQV NB[I+1])=NOT 0 OR XLST[K+1] LSS 0 20382300
THEN BEGIN INXLST:=TRUE; 20382320
IF NOT (XLST[K].[1:1] OR XLST[K+1].[1;1]) 20382340
THEN BEGIN XLST[K]:=XLST[X]; 20382360
XLST[K+1]:=XLST[X+1]; 20382380
XLST.[8:10]:=XLST.[8:10]-2; 20382400
END; 20382420
K:=X; 20382440
END; 20382460
IF INXLST THEN ELSE GO FIND; 20382480
END ELSE GO FIND; 20382500
RESTART: END; 20382520
END UNTIL (J:=NB[2].[FF])=0; 20382540
END; 20382560
FORGETSPACE(NB); 20382580
IF C=0 THEN N:=0 ELSE C:=0; 20382600
GO L; 20382620
FIND: 20382640
D:=NB[I]; E:=NB[I+1]; 20382660
C:=NB[I+2].[CF]; 20382680
M[N]:=I&J1[36:42:6]&J2[30:42:6]&K1[24:42:6]&K2[18:42:6]& 20382700
J3[12:42:6]; 20382720
L: 20382740
END; % SEEKNAME 20382760
REAL PROCEDURE PPC 20383000
(ADDR,EQN,X,DEX,TYPE,UNITNO,CARDLOC,SOURCE,ACCUM,LASTSCAN, 20384000
DIRECT); 20384100
VALUE TYPE,UNITNO,CARDLOC ; 20385000
REAL ADDR, DEX,TYPE,UNITNO,CARDLOC,SOURCE, LASTSCAN ; 20386000
ARRAY EQN[*],X[*],ACCUM[*],DIRECT[*]; 20386100
BEGIN% 20387000
REAL IOD,KOUNT; 20388000
LABEL EXIT,ERROR,NEXT,LFORM,LND,LDISK,LTAPE,LPUNCH,LPAPER,% 20389000
ROUND,PROTECT, 20390000
SERIAL,UPDATE,SPO,DSKCHECK, % (SHM)20391000
DOWN,LREMOTE, 20392000
LDUMMY, %846-20392870
LLINES66, % %724-20392880
LRANDOM, %603-20392890
LSPECIAL,LPRINT,LBACK,LCOPY,LFREE; 20393000
SWITCH D~LFORM, %603-20394000
LDUMMY, %846-20394070
LLINES66, %724-20394080
LRANDOM, %603-20394090
LNO,LDISK,LTAPE,LPUNCH,LPRINT,LPAPER, %603-20394900
LBACK,SERIAL,UPDATE,SPO,% 20395000
LREMOTE,LSPECIAL,ERROR,ERROR,ERROR,ERROR,LCOPY,ERROR, 20396000
LFREF,ERROR,PROTECT; 20396010
REAL NOLBL,TPNO ;% 20397000
BOOLEAN FAROUT; 20397050
REAL SUBROUTINE SCAN; 20397100
BEGIN SCAN~SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN,20397200
DIRECT) 20397300
END; 20397400
IF TYPE = FILEV THEN% 20398000
BEGIN% 20399000
IF ADDR =0 THEN ADDR~X[13]~GETESPDISK ;% 20400000
IF DEX = 2 THEN% 20401000
BEGIN% 20402000
EQN [29] ~ GETESPDISK;% 20403000
DISKIO( IOD , EQN INX 0-1 ,30, ADDR);% 20404000
ADDR ~ EQN[29];% 20405000
DEX ~ 0;% 20406000
SLEEP([IOD], IOMASK);% 20407000
END;% 20408000
IF (TYPE:=SCAN) < IDENT THEN GO TO ERROR; 20409000
EQN ~ (14 | DEX) INX EQN ;% 20410000
EQN[12]:=0; % ZERO OUT EU/SPEED CELL % (SHM)20410100
STREAM( KOUNT, ACCUM, Z ~ [EQN[4]]);% 20411000
BEGIN% 20412000
SI ~ LOC KOUNT ; SI~SI+7; DI~Z; DS~CHR;% 20413000
SI ~ ACCUM ; SI~SI+1; DS~ KOUNT CHR ;% 20414000
END ;% 20415000
IF X[0]<0 THEN IF KOUNT=4 AND ACCUM[0].[6:24]="CARD" 20415100
THEN FAROUT ~ TRUE; 20415200
IF SCAN ! EQUAL THEN GO TO ERROR; 20416000
IF SCAN < IDENT THEN GO TO ERROR; 20416500
EQN[2] ~ EQN[3]~% 20417000
EQN[0]~0; EQN[1] ~ ACCUM[0];% 20418000
IF (TYPE~SCAN)= SLASH THEN% 20419000
BEGIN IF SCAN}IDENT THEN% 20420000
BEGIN EQN[0]~EQN[1]; EQN[1]~ACCUM[0] ;% 20421000
; END ELSE GO TO ERROR;% 20422000
TYPE ~ SCAN END;% 20423000
IF TYPE = COMMA THEN% 20424000
BEGIN% 20425000
IF(TYPE~SCAN)~ IDENT OR KOUNT >3 THEN GO TO ERROR;% 20426000
STREAM ( S ~ 3-KOUNT,KOUNT,ACCUM, T~[EQN[2]]);% 20427000
BEGIN SI~ACCUM; SI~SI+1; DI~DI+S; DS~KOUNT NUM;% 20428000
END;% 20429000
IF(TYPE~SCAN)= COMMA THEN% 20430000
BEGIN% 20431000
IF(TYPE~SCAN)! IDENT OR KOUNT>5 THEN GO TO ERROR;% 20432000
STREAM( S~8-KOUNT,KOUNT,ACCUM, T~[EQN[2]]);% 20433000
BEGIN SI~ACCUM; SI~SI+1; DI~DI+S;DS~KOUNT NUM% 20434000
END;% 20435000
EQN[2].[42:1] ~ 1;% SO FILE OPEN KNOWS ITS LABELEQUAT20435500
IF(TYPE~SCAN)= COMMA THEN% 20436000
BEGIN% 20437000
IF(TYPE~SCAN)!IDENT OR KOUNT>1 THEN GO TO ERROR; 20438000
STREAM(S~1-KOUNT,KOUNT,ACCUM,T~[EQN[3]]); 20439000
BEGIN SI~ACCUM; SI~SI+1; DI~DI+S;DS~KOUNT NUM;% 20440000
END; TYPE ~ SCAN;% 20441000
END% CYCLE ;% 20442000
END% CREATION DATE ;% 20443000
END;%REEL NUMBER;% 20444000
TPNO~@37;% 20445000
NOLBL ~ 0;% 20446000
ROUND:% 20447000
WHILE TYPE NEQ PERIO AND 20448000
((TYPE LSS FORM AND TYPE NEQ COPYN) OR TYPE GTR FREEF) DO 20448050
TYPE:=SCAN; 20448100
IF TYPE = PERIO THEN GO TO EXIT;% 20449000
IF TYPE = COPYN THEN GO LCOPY; 20449100
GO TO D[TYPE-FORM];% 20450000
NEXT: TYPE~SCAN; GO TO ROUND;% 20451000
LDUMMY: TPNO~11; % " FORM SPO" - DUMMY FILE %846-20451900
LFORM:% 20452000
EQN[3].[42:1]~1; GO TO NEXT;% 20453000
LNO:% 20454000
NOLBL ~ 1; GO TO NEXT;% 20455000
LDISK:% 20456000
TPNO~12; GO TO DSKCHECK; % "DISK" MEANS DISK SERIAL %603-20457000
LTAPE:% 20458000
TPNO ~ 2; GO TO NEXT;% 20459000
LPUNCH:% 20460000
TPNO:=0; 20460100
IF (TYPE:=SCAN)=PERIO THEN GO TO EXIT; 20461000
IF TYPE=FREEF THEN GO TO LFREE ELSE 20461050
IF TYPE=BACK THEN 20461100
TPNO~20 ELSE 20461200
BEGIN TPNO~21; IF TYPE=COPYN THEN BEGIN %603-20461300
TPNO~22; GO LCOPY END ELSE %603-20461310
IF SCAN!BACK THEN GO ERROR; %603-20461320
END; %603-20461330
IF SCAN=PERIO THEN GO ERROR; 20461400
IF (TYPE~SCAN)=PERIO THEN 20461500
TPNO~TPNO+4 ELSE 20461600
IF TYPE=FREEF THEN GO TO LFREE ELSE 20461650
IF TYPE=DISK THEN 20461700
TPNO~TPNO+2 ELSE 20461800
IF TYPE=COPYN THEN BEGIN TPNO~22; GO LCOPY END ELSE %603-20461810
IF TYPE!TAPE THEN GO ERROR; 20461900
IF TYPE!PERIO THEN GO NEXT ELSE GO EXIT; 20461950
LPAPER:% 20462000
TYPE ~ SCAN; TPNO ~ 7; GO TO NEXT;% 20463000
LSPECIAL:% 20464000
TPNO ~ 3; GO TO NEXT;% 20465000
LLINES66: % %724-20465050
EQN[0] ~ "FULLPGE" ; %SET UP MFID FOR FULL PAGE %724-20465100
LPRINT:% 20466000
TPNO:=1; 20466100
IF (TYPE:=SCAN)=PERIO THEN GO TO EXIT; 20467000
IF TYPE=FREEF THEN GO TO LFREE ELSE 20467100
IF TYPE=BACK THEN %P 20468000
LBACK: TPNO~6 ELSE %P 20469000
BEGIN TPNO~4; IF TYPE=COPYN THEN BEGIN %603-20470000
TPNO~15; GO TO LCOPY END ELSE %603-20470100
IF SCAN!BACK THEN GO ERROR; %603-20470110
END; %603-20470120
IF SCAN=PERIO THEN GO ERROR; %P 20471000
IF (TYPE~SCAN)=PERIO THEN %P 20472000
TPNO~22-TPNO ELSE %P 20473000
IF TYPE=FREEF THEN GO TO LFREE ELSE 20473100
IF TYPE=DISK THEN %P 20474000
TPNO~21-TPNO ELSE %P 20475000
IF TYPE=COPYN THEN BEGIN TPNO~16; GO LCOPY END ELSE %603-20475100
IF TYPE~TAPE THEN GO ERROR; %P 20476000
IF TYPE !PERIO THEN GO NEXT ELSE GO EXIT; 20477000
LFREE: 20478500
$ SET OMIT = NOT(PACKETS) 20478504
EQN[3].[23:1]~1; 20478505
$ POP OMIT 20478506
GO TO NEXT; 20478508
LCOPY: IF (TYPE:=SCAN) NEQ IDENT OR KOUNT GTR 3 THEN GO TO ERROR;20478510
STREAM(A:=0:KOUNT,ACCUM); 20478520
BEGIN SI:=ACCUM;SI:=SI+1;DI:=LOC A;DS:=KOUNT OCT END; 20478530
IF(TYPE:=P(DUP)) GTR 256 OR P(XCH)LSS 1 THEN GO ERROR; 20478540
EQN[3].[15:8]:=TYPE-1;GO TO NEXT; 20478550
ERROR:% 20479000
PPC~TRUE;GO DOWN;% 20480000
SPO: TPNO~11;GO TO NEXT;% 20481000
LREMOTE: TPNO~ 19; GO NEXT; 20481100
LRANDOM: TPNO~10; GO TO DSKCHECK; %603-20481900
SERIAL: TPNO:=12; GO TO DSKCHECK; % (SHM)20482000
UPDATE: TPNO~13; GO TO DSKCHECK; 20483000
PROTECT: TPNO~26; 20483100
DSKCHECK: % (SHM)20484000
IF (TYPE:=SCAN)=COMMA THEN GO TO DSKCHECK; % (SHM)20484050
IF TYPE=EU THEN % (SHM)20484100
BEGIN % (SHM)20484150
IF SCAN NEQ EQUAL THEN GO TO ERROR ELSE % (SHM)20484200
IF (TYPE:=SCAN) NEQ IDENT OR KOUNT GTR 2 THEN GO ERROR;20484250
STREAM(KOUNT,ACCUM,T:=[TYPE]); % (SHM)20484300
BEGIN % (SHM)20484350
SI:=ACCUM; SI:=SI+1; DI:=T; DS:=KOUNT OCT; % (SHM)20484400
END; % (SHM)20484450
EQN[12].[18:5]:=TYPE+1; % (SHM)20484500
GO TO DSKCHECK; % (SHM)20484550
END % IF EU % (SHM)20484600
ELSE IF TYPE=FAST OR TYPE=SLOW THEN % (SHM)20484650
BEGIN % (SHM)20484700
EQN[12].[16:2]:=1+(TYPE=SLOW); % (SHM)20484750
GO TO DSKCHECK; % (SHM)20484800
END 20484850
ELSE IF TYPE = SENSE THEN 20484855
BEGIN 20484860
EQN[12].[15:1]:=1; 20484865
GO TO DSKCHECK; 20484870
END; 20484875
GO TO ROUND; 20484900
EXIT:% 20485000
IF NOLBL THEN TPNO ~ IF TPNO=2 THEN 9 ELSE% 20486000
(IF TPNO =3 THEN 5 ELSE% 20487000
(IF TPNO=7 THEN 8 ELSE% 20488000
(IF TPNO=@37 THEN 9 ELSE TPNO)));% 20489000
IF FAROUT THEN IF UNITNO}32 THEN CIDROW[UNITNO-32].[3:5] ~ 0 20489100
ELSE IF UNITNO=23 THEN READERA.[FF] ~ 0 20489200
ELSE IF UNITNO=24 THEN READERB.[FF] ~ 0; 20489300
EQN[3].[43:5]~TPNO;% 20490000
DEX ~ DEX+1;% 20491000
END% 20492000
ELSE% 20493000
BEGIN% 20494000
DO UNTIL (IOD ~ SCAN) = EQUAL OR IOD = PERIO;% 20495000
IF IOD = PERIO THEN GO TO ERROR;% 20496000
IOD ~ SCAN;% 20497000
STREAM (K~0; A ~ [ACCUM[0]],KOUNT);% 20498000
BEGIN% 20499000
SI ~ A ; SI~SI+1; DI~LOC K;% 20500000
KOUNT(IF SC<"0" THEN BEGIN DS~LIT"+"; 20500100
JUMP OUT TO ERR; END; SI~SI+1); 20500200
SI~SI-KOUNT; 20500300
DS ~ KOUNT OCT ;% 20501000
ERR: 20501100
END;% 20502000
IF (TPNO~P).[1:1] THEN GO TO ERROR; 20503000
IF TYPE=PROCE OR TYPE=IO THEN X[16+TYPE-PROCE]~TPNO|3600 20504000
ELSE IF TYPE=COREV THEN %512-20504500
BEGIN X[20] ~ TPNO DIV 64; %512-20505000
DO UNTIL (IOD ~ SCAN)=MAXV OR IOD=PERIO; %512-20507000
IF IOD=MAXV THEN P([X[20]],IOR) ELSE GO TO DOWN; %512-20507100
END %512-20507200
ELSE IF TYPE}PRIOR AND TYPE{SAVEV THEN %512-20507300
X[18+TYPE-PRIOR]~TPNO ELSE GO TO ERROR; %512-20507400
DO UNTIL SCAN = PERIO;% 20508000
END;% 20509000
DOWN:% 20510000
END;% 20511000
PROCEDURE SECURITYMAINT( TYPE,SMID,SFID,CMM,SFH,CARD); 20511100
VALUE TYPE,SMID,SFID,SFH,CARD; 20511110
REAL TYPE,SMID,SFID,SFH,CARD; 20511120
ARRAY CMM[*]; 20511130
BEGIN 20511140
DEFINE SPOUTUNIT = CARD #; % TO ALLOW "LIBERR" TO WORK %589-20511148
REAL N4,OPTN,T1; 20511150
REAL ER1,ER2,ER3; LABEL ERSYS; %169-20511152
REAL T=TYPE; 20511155
LABEL SEC3,FUNC0,FUNC1,FUNC2,FUNC3,SEC4,EXYT; 20511160
LABEL ERR,ERROR,FUNCJ;% 20511165
SWITCH FUNC,FUNCJ,FUNC0,FUNC1,FUNC2,FUNC3;% 20511170
LABEL EXIT; % 20511171
ER1:=")~ ";% %169-20511175
N4:= ABS(CMM[5]); 20511181
IF ((CMM[0]EQV "DECK ")=NOT 0) AND 20511182
(((CMM[1]AND @77000000007777)EQV @12000000003714)=NOT 0) 20511184
OR SYSTEMFILE(CMM[0],CMM[1]) THEN% %169-20511188
BEGIN ERSYS: ER1:="SYSTEM ";ER2:="FILE)~ "; GO ERROR END; %169-20511190
IF TYPE = USEV AND 20511295
((CMM[0]EQV SMID)=NOT 0 AND (CMM[1]EQV SFID)=NOT 0) THEN 20511300
BEGIN ER1:="SAME FI";ER2:="LE)~ "; GO ERROR END %169-20511303
ELSE 20511305
IF (OPTN:=DIRECTORYSEARCH(CMM[0],CMM[1],3)) GEQ 64 THEN 20511306
BEGIN 20511311
IF TYPE=USEV AND M[OPTN+2]<0 THEN% %169-20511312
BEGIN ER1:="SECURIT";ER2:="Y FILE)";ER3:="~ "; GO ERR END;20511313
IF (T1~((N4 EQV MCP)=NOT 0) OR (CMM[5]=NOT(-0))) OR 20511315
(M[OPTN+2]>0 AND(N4 EQV ABS(M[OPTN+2]))=NOT 0)THEN 20511320
GO TO SEC3 ELSE 20511330
BEGIN ER1:="INVALID";ER2:=" USER)~";% %169-20511335
ERR: FORGETSPACE(OPTN);% %169-20511340
FORGETSPACE(DIRECTORYSEARCH(CMM[0],CMM[1],14)); 20511350
END; 20511360
END ELSE IF OPTN=2 THEN GO ERSYS% @ LINE 20511190 %169-20511363
ELSE IF OPTN=1 THEN BEGIN ER1:="IN USE)";ER2:="~ " END 20511364
ELSE IF OPTN=0 THEN BEGIN ER1:="NOT ON ";ER2:="DISK)~ " END;20511365
ERROR: %169-20511366
STREAM(A:=[CMM[0]],ER:=[ER1],B:=(OPTN:=SPACE(10))); %169-20511370
BEGIN SI:=A; SI:=SI+1; DS:=LIT" "; DS:=7 CHR; 20511380
SI:=SI+1; DS:=LIT"/"; DS:=7 CHR; 20511390
DS:=25 LIT " SECURITY MAINT IGNORED ("; SI:=ER;% %169-20511400
3(SI:=SI+1; DS:=7 CHR);% %169-20511405
END STREAM; 20511410
SPOUTER(OPTN&CARD[9:9:9],CARD,LIBERR); %149-20511420
GO TO EXYT; 20511430
SEC3: 20511440
GO TO FUNC[TYPE-UNLOCKV]; 20511450
FUNCJ:M[OPTN INX 5]~M[OPTN INX 6]~@14;% 20511455
CMM[2] := " UNLOCK"; CMM[3] := "ED~~ ";% 20511457
GO TO SEC4;% 20511459
FUNC0: 20511460
M[OPTN INX 5]:=-SMID; M[OPTN INX 6]:= SFID; 20511470
CMM[2]:= " SECURE"; CMM[3]:= "D WITH "; 20511480
M[SFH+2] := P(DUP,LOD,SSB); 20511490
GO TO SEC4; 20511500
FUNC1: 20511510
IF (T1~T1 AND (M[OPTN+2]=0)) THEN M[OPTN+2]~CMM[6]; 20511515
SMID:=M[OPTN+5]; SFID:=M[OPTN+6]; 20511520
M[OPTN INX 5]:= M[OPTN INX 6]:=0; 20511525
CMM[2]~" LOCKED";CMM[3]~" FROM ";CMM[4]~" WITH :";GO TO SEC4; 20511530
FUNC2: 20511540
M[OPTN INX 5]~M[OPTN INX 2].[6:42]; M[OPTN INX 2]~M[OPTN INX 6]~0; 20511550
CMM[2]:= " FREE F"; CMM[3]:= "ILE~~ "; GO TO SEC4; 20511560
FUNC3: 20511570
M[OPTN INX 5]:= @14; M[OPTN INX 6]:= 0; 20511580
CMM[2]:= " PUBLIC";CMM[3]:= " FILE~~"; 20511590
SEC4: 20511600
DISKWAIT(OPTN,[CF],30,OPTN.[FF]); 20511610
P(DIRECTORYSEARCH(-CMM[0],CMM[1],14),DEL); 20511620
$ SET OMIT = PACKETS 20511639
STREAM(A:=ABS(SMID),B:=SFID,C:=CMM,Q:=(T LSS FREE)% 20511660
AND (T!UNLOCKV) AND (ABS(SMID)!12),% 20511662
X:=(SFID=0 OR ABS(SFID)=12) % 20511663
AND T LSS FREE AND T~UNLCOKV,% 20511664
Y~T=LOCKV AND(((N4 EQV MCP)=NOT 0)AND((CMM[6] EQV MCP)! 20511665
NOT 0)) AND T1,D~OPTN~OPTN INX 0); 20511666
BEGIN SI:=C; SI:=SI+1; DS:=LIT" "; DS:=7 CHR; DS:=LIT"/"; 20511670
3(SI:=SI+1; DS:=7 CHR); 20511680
X(DI:=DI-7; DS:=2 LIT"~~"); 20511685
Q(DS:=LIT" ";SI:=LOC A;SI:=SI+1;DS:=7 CHR; DS:=LIT"/"; 20511690
SI~SI+1; DS~7 CHR); 20511700
Y(X(DI~DI-18); SI~C;4(SI~SI+8);SI~SI+1;DS~7 CHR; 20511702
SI~SI+9; DS~7 CHR); DS~ LIT "~"; 20511704
END STREAM; 20511710
SPOUTER(OPTN&CARD[9:9:9],CARD,SECMSG); 20511720
$ SET OMIT = PACKETS 20511729
EXYT: 20511800
END SECURITYMAINT; 20511810
COMMENT THE PRT CELL "SHEET" GIVES DISK ADDRESS OF 1ST SHEET ENTRY 20512000
*** ENTRIES IN THE SHEET ARE AS FOLLOWS: 20512400
S[ 0] = 1ST NAME (7 CHRS) 20512800
.[ 2:1 ] = "CANDE" JOB (TSS ONLY) 20513200
S[ 1] = 2ND NAME (7 CHRS) 20513600
S[ 2].[ 1: 2] = 0 NORMAL 20514000
2 JOB HAS BEEN XS-ED (FORCED RUN) 20514400
3 JOB HAS BEEN ES-ED (FORCED RUN AND DS) 20514800
S[ 3].[ 4:1 ] = SUPPRESS BOJ/EOJ MESSAGES FOR SYSTEM JOBS 20515200
S[ 2].[ 5:3 ] = 0 NORMAL, 1 LIBMAIN, 3 LDCNTRL, 5 PRNPBT 20515400
S[ 2].[ 8:10] = 0 GO JOB (FROM COMPILE & GO) 20515600
= 1 COMPILER (FOR COMPILE & GO) 20516000
= 2 EXECUTE JOB 20516400
= 3 COMPILER (FOR SYNTAX CHECK)(SET TO 2 LATER) 20516800
= 4 COMPILER (FOR COMPILE TO LIBRARY) 20517200
= 5 RUN JOB 20517600
S[ 2].[18:15] = SKELETONS DISK ADDRESS (IF S[2].[8:10] = 1,2,4 20518000
S[ 2].[33:15] = PRIORITY, SAME AS S[18] 20518400
S[ 3].[ 1:1 ] = SET BY SELECTRUN WHEN "SCHEDULED" MESSAGE 20518800
IS SENT (IF SCHEDULED) 20519200
S[ 3].[ 2: 1] = 1 RESTART JOB 20519600
S[ 3].[ 8:10] = SCHEDULE-ID FOR THIS JOB 20520000
S[ 5] = STARTING TIME FOR LOG 20520400
S[ 6] = LOCATION OF LAST PART OF LOG 20520800
S[ 7] = CORE ADDRESS OF SEGMENT ZERO (WHEN THE 20521200
SHEET IS PASSED TO SELECTRUN AS A PARAMETER) 20521600
S[13] = DISK ADDRESS OF LABEL EQUATION ENTRIES 20522000
APPLICABLE TO THIS EXECUTION ONLY (SEE BELOW) 20522400
S[14] = ACTUAL MFID OF JOB (TSS ONLY). THIS MAY BE 20522800
BE DIFFERENT FROM S[0] FOR SOME JOBS 20523200
WHICH ARE STARTED BY CANDE. 20523600
S[15] = DISK ADDRESS OF LABEL EQUATION ENTRIES 20524000
PRESENTED WHEN PROGRAM WAS COMPILED AND 20524400
APPLICABLE TO ALL EXECUTIONS 20524800
S[16] = ESTIMATED PROCESSOR TIME 20525200
S[17] = ESTIMATED I/O TIME 20525600
S[18] = PRIORITY 20526000
S[19] = COMMON VALUE 20526400
S[20] = ESTIMATED CORE REQUIREMENTS 20526800
S[20].[ 2:1 ] = "CAN-T EXPAND" BIT (TSS) 20527200
.[33:15] = ESTIMATED CORE REQUIREMENT 20527600
S[21] = STACK SIZE 20528000
S[22] = SAVE FACTOR FOR OBJECT FILE (COMPILATIONS) 20528400
S[23].[2:6] = UNITNO OF CARD/PSEUDO READER IN CONTROLCARD. 20528800
S[23].[9:9] = REMOTE STATION ADDRESS, ELSE 0 20529200
S[23].[24:24] = TIME JOB PUT IN SHEET(FOR TS MSG) 20529600
S[24] = USER CODE 20530000
S[25] = DISK ADDRESS OF FILE HEADER FOR THE JOB 20530400
S[26] = LOGLINE (TSS) 20530800
S[27] = FID FOR COMPILES,TAPE NAME FOR LIBMAIN. 20531200
S[29] = DISK ADDRESS OF NEXT SHEET ENTRY (=0 IF LAST) 20531600
*** ENTRIES FOR LABEL EQAT. ARE AS FOLLOWS: 20532000
F[0] = MULTI-FILE ID (7 CHRS) 20532400
F[1] = FILE ID (7 CHRS) 20532800
F[2].[0:18] = REEL NO (3 CHRS) 20533200
F[2].[18:30] = CREATION DATE (5 CHRS) 20533600
F[3].[0:6] = CYCLE (1 CHR) 20534000
F[3].[15:8] = NUM COPIES OF PBD OR PUD FILE 20534400
F[3].[23:1] = 1, IF "FREEF" PDB PACKET FILE 20534800
F[3].[42:1] = 1 FOR FORMS REQUIRED 20535200
F[3].[43:5] = 0 FOR CP (FILE TYPES ) 20535600
1 FOR LP 20536000
2 FOR MT 20536400
3 FOR SPECIFIC UNIT 20536800
4 FOR LP (MAY BACKUP) 20537200
5 FOR SPECIFIC (UNLABELED) 20537600
6 FOR LP (MUST BACKUP) 20538000
7 FOR PT 20538400
8 FOR PT (UNLABELED) 20538800
9 FOR MT (UNLABELED) 20539200
10 FOR DISK 20539600
F[4].[0:6] = NO OF CHARS IN INTERNAL NAME 20540000
F[4].[6:42] = INTERNAL NAME (MAY CONTINUE TO F[11]) 20540400
F[12].[15:1] = "SENSITIVE" BIT 20540800
F[12].[16:2] = DISK SPEED 20541200
F[12].[18:5] = EU NUMBER + 1 20541600
F[14]- F[25] SAME AS ABOVE FOR NEXT FILE (F[14]=14 IF NO NEXT)20542000
F[29] = DISK ADRS.OF NXT.LBL.EQUAT.ENTRY(=0 IF NONE) 20542400
**** ALSO SEE PROCEDURE "SELECTRUN1" (SEQ.NO.20055600) FOR 20542800
**** FURTHER INFORMATION ON LABEL EQUATION AND THE FILE 20543200
**** PARAMETER BLOCK. 20543600
20544000
**** CONTENTS OF THE JAR: 20544400
JAR[0].[ 1:1 ] = COMPILE JOB 20544800
.[ 2:1 ] = "CANDE" JOB (TSS ONLY) 20545200
.[ 6:42] = MFID OF THE JOB 20545600
JAR[1].[ 1:1 ] = JOB IS BEING DS-ED 20546000
.[ 2:1 ] = JOB IS BEING ES-ED 20546400
.[ 6:42] = FID OF THE JOB 20546800
JAR[2].[ 1:1 ] = COBOL JOB 20547200
.[ 2:1 ] = DECLARED SOFTWARD INTERRUPTS 20547600
.[ 3:1 ] = JOB HAS MAINTENANCE LOG ENTRY 20548000
.[ 4:1 ] = NOT USED 20548400
.[ 5:1 ] = DECLARED SOFTWARE INTERRUPTS 20548800
.[ 6:1 ] = INVOKED OR INVOKING IPC PROG.FILE 20549200
.[ 7:1 ] = INVOKED IPC PROGRAM FILE 20549600
.[ 6:10] = SAME AS S[2].[8:10] ABOVE 20550000
.[18:15] = DISK ADDRESS FOR THE SKELETON SHEET (COMPILATIONS20550400
.[33:15] = PRIORITY 20550800
JAR[3] = PROCESS TIME LIMIT 20551200
JAR[4] = IO TIME LIMIT 20551600
JAR[5].[ 1:23] = STARTING DATE (OCTAL) 20552000
.[24:24] = STARTING TIME (OCTAL) 20552400
JAR[6].[ 1:1 ] = JOB IS SD-ED 20552800
.[ 2:4 ] = PSEUDO-READER NUMBER 20553200
.[18:15] = SIZE OF LOG INFORMATION (BATCH) 20553600
.[33:15] = DISK ADDRESS OF FIRST RECORD FOR THE LOG 20554000
JAR[7] = IDLETIME ENTRY (BATCH) 20554400
JAR[7] = MFID OF JOB (TSS ONLY). THIS MAY BE DIFFERENT 20554800
FROM JAR[0] FOR SOME JOBS STARTED BY CANDE. 20555200
JAR[8] = LENGTH OF CODE FILE ROW 20555600
JAR[9].[ 1:1 ] = REEL CHANGE IN PROGRESS DUE TO "RC" MESSAGE 20556000
.[ 2:1 ] = SUPPRESS PRINTING OF BOJ/EOJ MESSAGES 20556400
.[ 3:1 ] = JOB HAS BEEN "STOPPED" (WORKSET ON BATCH) 20556410
.[ 4:1 ] = KEYBOARD INTERRUPTS ARE ALLOWED 20556420
.[ 5:1 ] = A KEYBOARD INTERRUPT HAS OCCURRED 20556430
.[ 6:3 ] = 0 NORMAL JOB 20556700
= 1 LIBMAIN 20556710
= 3 LDCNTRL 20556720
= 5 PRNPBT -- ODD VALUES FOR BOOLEAN TESTING 20556730
.[18:15] = DISK ADDRESS FOR "CHAIN" IF NON-ZERO 20556800
.[33:15] = NUMBER FOR DISK ROWS IN CODE FILE 20557200
JAR[10] THROUGH JAR[29] = DISK ADDRESS OF CODE FILE ROWS 20557600
JAR[30] = FID OF OBJECT FILE (BATCH COMPILES ONLY) 20558000
END OF COMMENT; 20558400
REAL PROCEDURE CCLIB; 20566000
BEGIN LABEL NEXT,LOOP; 20566011
DECLARECCVARIABLES; 20566100
REAL CNT = RETURNVAL+1, % BEGIN LOCALS TO CCLIB 20566245
HOLD1 = CNT+1, 20566247
HOLD2 = HOLD1+1, XI = HOLD2, 20566250
HOLD3 = HOLD2+1, 20566255
REPEAT = HOLD3+1, XLSTSZ = REPEAT, 20566260
TYM = REPEAT+1, HME = TYM; 20566265
BOOLEAN FIRSTIME = TYM+1; 20566270
ARRAY XLST = FIRSTIME+1[*]; 20566280
REAL FROMHLD = XLST+1, 20566290
TOHLD = FROMHLD+1, 20566300
REMEMBER = TOHLD+1, 20566310
NAMECNT = REMEMBER+1; 20566320
BOOLEAN DIDGETESPDISK= NAMECNT + 1; 20566330
INTEGER I = DIDGETESPDISK + 1; %148-20566340
%********************************************************************** 20566350
% 20566352
% 20566354
% CCLIB HAS BEEN EXPANDED TO HANDLE NEW FACILITIES AVAILABLE 20566356
% THROUGH USE OF THE "COPY" CONTROL CARD AND THE EXTENSION OF 20566358
% "EXCEPT" LISTS TO "REMOVE" CONTROL CARDS. 20566360
% 20566362
% 20566364
% 1: COPY CONTROL CARDS 20566366
% 20566368
% PERFORMS SYNTAX ANALYSIS (SEE DOCUMENTATION) 20566370
% 20566372
% SETS UP LINKED LIST OF ESPDISK SEGMENTS PROVIDING DATA AND 20566374
% NAMES NECESSARY FOR LIBRARY MAINTENANCE PROCESSING 20566376
% (INCLUDING "EXCEPT" AND "AS" LISTS). 20566378
% 20566380
% 20566382
% 2: REMOVE CONTROL CARDS 20566384
% 20566386
% SCANS "EXCEPT" LIST ASSOCIATED WITH ANY PARTICULAR NAME 20566388
% PAIR PASSING SAID LISTS TO PROCEDURE "SEEKNAM", WHICH IN 20566390
% TURN USES THE "EXCEPT" LIST WHEN DETERMINING WHETHER OR 20566392
% NOT TO RETURN SPECIFIC NAMES FOR REMOVAL. 20566394
% 20566396
% 20566398
% CMM[19].[2:1] INDICATES ORIGINATON 20566400
% .[3:6] UNITNO FOR PACKETS 20566402
% .[9:9] USER SPECIFIED MAXIMUM NUMBER OF FILES PER 20566404
% OUTPUT UNIT 20566406
% 20566408
% XLST DESCRIPTOR TO "EXCEPT" LIST ASSOCIATED WITH 20566410
% A PARTICULAR NAME PAIR 20566412
% 20566414
% REMEMBER USED FOR CORRECT PLACEMENT OF "FROMHLD", 20566426
% "TOHLD", OPTIONS AND NAME COUNTS WITHIN THE 20566428
% LINKED LIST OF ESPDISK SEGMENTS... 20566430
% .[3:15] FIRST ESPDISK ADDRESS 20566432
% .[FF] OFFSET INTO .[CF] 20566434
% .[CF] ESPDISK ADDRESS OF OPTIONS AND NAME COUNT WORD 20566436
% 20566438
% NAMECNT.[FF] COUNT OF "EXCEPT" LIST PAIRS AND "AS" CLAUSE 20566440
% PAIRS FOR A PARTICULAR SOURCE 20566442
% .[CF] COUNT OF NAME PAIRS 20566444
% 20566446
% FROMHLD.[1:5] INPUT UNIT NUMBER + 1 %148-20566448
% IF .[1:5] = 0 THEN INPUT FROM ANY TAPE %148-20566449
% THAT WAS THE CORRECT NAME %148-20566450
% .[6:42] IF DISK THEN 0 %148-20566451
% IF TAPE THEN TAPE NAME 20566452
% 20566454
% TOHLD.[1:5] OUTPUT UNIT NUMBER + 1 %148-20566455
% IF .[1:5] = 0 THEN OUTPUT TO ANY SCRATCH %148-20566456
% TAPE. %148-20566457
% IF DISK THEN .[40:1] SPECIFIES TYPE FAST 20566458
% .[41:1] " " SLOW 20566460
% .[42:6] " EU # 20566462
% IF TAPE THEN .[6:42] HAS TAPE NAME %148-20566464
% 20566466
% 20566468
%***********************************************************************20566470
LABEL CCA,QUIT,POWIE,CHAN,REMO,INCSC,GETEM,ENTE,LCOPY,SEEK,INIT; 20566600
LABEL DOWNR,OUTR,SCNX,NEXTL,MIRID; 20566610
SWITCH SW:=LCOPY,LCOPY,LCOPY,ENTE,ENTE,REMO,CHAN; 20566620
DEFINE ZIPMIX=CARD.[18:6]#; 20566630
DEFINE UNITNUM = [1:5]#; %148-20566640
% 20566650
%************************************************** 20566655
% 20566660
SUBROUTINE CHECK; 20566665
BEGIN 20566670
IF (CNT:=CNT+2) GTR 26 THEN 20566675
BEGIN 20566680
PROG[29]:=GETESPDISK; 20566685
DIDGETESPDISK:=TRUE; 20566687
DISKWAIT(PROG INX 0,30,LIBNO); 20566690
LIBNO:=PROG[29]; 20566695
CNT:=0; 20566700
END; 20566705
END; % CHECK 20566710
% 20566744
%************************************************** 20566745
% 20566746
% - FINAL PREPARATIONS BEFORE EXITING 20566747
% - PLACEMENT OF FINAL INPUT SOURCE AND DESTINATION 20566748
% 20566749
%************************************************** 20566750
% 20566751
SUBROUTINE BOTH; 20566752
BEGIN CMM[0]:="LIBMAIN"; CMM[1]:="DISK "; 20566755
CMM[2] := 0 & LIBMAINCODE[5:45:3] & 2[8:38:10]; CMM[13]:=0; 20566760
$ SET OMIT = PACKETS 20566765
$ SET OMIT = NOT(PACKETS) 20566780
CMM[23]:=0&CARD[9:9:9]&(IF ZIPMIX NEQ 0 THEN PSEUDOMIX[ZIPMIX]20566785
ELSE UNITNO[2:42:6]; 20566790
$ POP OMIT 20566795
CHECK; PROG[CNT]:=@14; 20566805
IF T GEQ COPYN AND T LEQ LOAD THEN %543-20566807
BEGIN PROG[CNT+1]:=FROMHLD; CHECK; PROG[CNT]:=@114; 20566810
IF LIBNO=REMEMBER.[3:15] THEN PROG[1]:=TOHLD; 20566812
END; 20566815
OPTN:=CN; PROG[29]:=0; %123-20566817
DISKWAIT(PROG INX 0,30,LIBNO); 20566820
IF T GEQ COPYN AND T LEQ LOAD THEN %543-20566822
IF LIBNO NEQ REMEMBER.[3:15] THEN 20566825
BEGIN DISKWAIT(-PROG.[CF],30,REMEMBER.[3:15]); 20566830
PROG[1]:=TOHLD; 20566835
DISKWAIT(PROG INX 0,30,REMEMBER.[3:15]); 20566840
END; 20566845
LIBNO:=ABS(CMM[19]); 20566850
END OF BOTH; 20566855
% 20566864
%************************************************** 20566865
% 20566866
REAL SUBROUTINE SCAN; 20566875
SCAN~SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN, 20566900
DIRECT); 20566902
REAL SUBROUTINE SKAN; 20566905
BEGIN 20566910
STREAM(X:=0:CN:=0,ACCUM); 20566915
BEGIN 20566920
SI:=ACCUM;SI:=SI+1; 20566925
8(IF SC GEQ "0" THEN BEGIN SI:=SI+1;TALLY:=TALLY+1; END ELSE 20566930
IF SC=" " THEN JUMP OUT ELSE BEGIN TALLY:=0;JUMP OUT END); 20566935
CN:=TALLY;SI:=SI-CN;DI:=LOC X;DS:=CN OCT; 20566940
END; 20566945
SKAN:=P; 20566950
END OF SKAN; 20566955
% 20566984
%************************************************** 20566985
% 20566986
% - CREATES AN EXCEPTION LIST OF FILE NAMES WHICH ARE 20566987
% ASSOCIATED WITH A PARTICULAR PRECEDING FILE NAME 20566988
% 20566989
%************************************************** 20566990
% 20566991
SUBROUTINE SCANEXCEPT; 20567000
BEGIN IF XLST=0 THEN XLST:=[M[SPACE(XLSTSZ:=30)]]&30[8:38:10]; %177-20567005
SCNX: IF (XX:=XI+2) GEQ XLSTSZ 20567010
THEN BEGIN % EXPAND EXCEPTION LIST SIZE 20567015
ST:=SPACE(XLSTSZ:=XLSTSZ+30); 20567020
MOVE(XLSTSZ-30,XLST,ST); 20567025
FORGETSPACE(XLST); 20567030
XLST:=[M[ST]]&XLSTSZ[8:38:10]; 20567035
END; 20567040
IF (CN:=SCAN)=EQUAL 20567045
THEN BEGIN XLST[X]:=-1; 20567050
IF HME ! 2 %792-20567055
THEN BEGIN IF T1.[46:1] THEN GO POWIE; %792-20567056
XLST[XI] ~ IF T1.[45:1] THEN CMM[0] %792-20567057
ELSE PROG[CNT]; %792-20567058
END END %792-20567060
ELSE IF CN GEQ IDENT THEN XLST[XI]:=ACCUM[0] 20567065
ELSE GO POWIE; 20567070
IF SCAN NEQ SLASH THEN GO POWIE; 20567075
IF (CN:=SCAN)=EQUAL 20567080
THEN BEGIN IF XLST[XI].[1:1] THEN GO POWIE; 20567085
XLST[XI+1]:=-1; 20567090
IF HME ! 2 %792-20567095
THEN BEGIN IF T1 THEN GO POWIE; %792-20567096
XLST[SI+1] ~ IF T1.[45:1] THEN CMM[1] %792-20567097
ELSE PROG[CNT+1]; %792-20567098
END END %792-20567100
ELSE IF CN GEQ IDENT THEN XLST[X]:=ACCUM[0] 20567105
ELSE GO POWIE; 20567110
IF (CN:=SCAN)=COMMA THEN GO SCNX 20567115
ELSE IF CN NEQ RB THEN GO POWIE; 20567120
END; % SCANEXCEPT 20567125
% %148-20567140
%************************************************** %148-20567142
% %148-20567144
% - LOOK FOR TAPE UNIT ASSOCIATED WITH AN INPUT OR %148-20567145
% OUTPUT FILE NAME %148-20567146
% %148-20567148
%************************************************** %148-20567150
% %148-20567152
REAL SUBROUTINE SCANON; %148-20567154
BEGIN IF(CN:=SCAN) ! IDENT THEN GO POWIE; %148-20567158
CN:=ACCUM[0].[6:18]; %148-20567160
FOR I:=0 STEP 1 UNTIL 15 DO %148-20567162
IF TINU[1].[30:18]=CN THEN %148-20567166
BEGIN %148-20567168
P(I+1); %148-20567170
I:=16; %148-20567172
END; %148-20567174
IF I!17 THEN GO TO POWIE; %148-20567176
CN:=SCAN; %148-20567178
SCANON:=P; %148-20567180
END SCANON; 20567182
% 20567200
%************************************************** 20567201
% 20567202
SUBROUTINE SCANDSKTYP; 20567205
BEGIN 20567210
IF (CN:=SCAN)=EU 20567215
THEN BEGIN 20567220
IF (CN:=SCAN) NEQ IDENT THEN GO POWIE; 20567225
IF P(SKAN,DUP) GTR 19 THEN BEGIN P(DEL); GO POWIE; END; 20567230
CN:=P+1; TOHLD.[42:6]:=CN; 20567235
IF CN GTR NEUP.NEUF THEN GO POWIE; 20567240
END 20567245
ELSE IF CN=SLOW THEN TOHLD.[41:1]:=1 ELSE 20567250
IF CN=FAST THEN TOHLD.[40:1]:=1 ELSE 20567255
IF T NEQ COPYN THEN GO POWIE ELSE 20567260
IF CN=DISK THEN ELSE 20567265
IF CN NEQ IDENT THEN GO POWIE ELSE TOHLD:=ACCUM[0]; 20567270
IF (CN:=SCAN)=ONV THEN %148-20567271
IF TOHLD.UNITNUM!0 THEN GO POWIE %148-20567274
ELSE %148-20567276
BEGIN %148-20567278
TOHLD.UNITNUM:=SCANON; %148-20567280
END; %148-20567282
END OF SCANDSKTYP; 20567285
% 20567300
%************************************************ 20567305
% 20567310
% - PLACEMENT OF OPTIONS AND NAME COUNTS INTO CORRECT 20567311
% WORD OF CORRECT ESPDISK SEGMENT 20567312
% 20567313
%************************************************** 20567314
% 20567315
SUBROUTINE SETUP; 20567316
BEGIN 20567320
IF LIBNO NEQ REMEMBER.[CF] THEN 20567325
BEGIN DISKWAIT(PROG INX 0,30,LIBNO); 20567330
DISKWAIT(-PROG.[CF],30,REMEMBER.[CF]); 20567335
PROG[REMEMBER.[FF]]:=(*P(DUP))&NAMECNT[18:18:15]&NAMECNT[CTC]; 20567340
DISKWAIT(PROG INX 0,30,REMEMBER.[CF]); 20567345
DISKWAIT(-PROG.[CF],30,LIBNO); 20567350
END ELSE 20567355
PROG[REMEMBER.[FF]]:=(*P(DUP))&NAMECNT[18:18:15]&NAMECNT[CTC]; 20567360
END OF SETUP; 20567365
% 20567510
%****************** START HERE ****************** 20567511
% 20567512
P(RCW,MYMSCW,STF); 20567520
RCW:=RCW & P(XCH)[CTC]; 20567530
P(0,0,0,0,0,0,0,0,0,0,0,0,0); % ZERO LOCALS OF CCLIB 20567540
P(0); %148-20567550
GO SW [T-COPYN]; 20567600
LCOPY: 20569200
ENTE: 20569230
PROG[0]:=PROG[2]:=0; CNT:=2; 20569240
IF (CN:=SCAN)=IDENT THEN 20569260
BEGIN 20569290
IF (ST:=SKAN)=0 THEN ST:=511 ELSE CN:=SCAN; 20569320
IF ST GTR 511 THEN ST:=511; 20569350
END ELSE ST:=511; 20569380
REMEMBER.[3:15]:=LIBNO:=GETESPDISK; 20569400
DIDGETESPDISK:=TRUE; 20569410
CMM[19]:=0&(IF UNITNO=23 OR UNITNO=24 OR UNITNO GEQ 32 THEN 20569420
UNITNO ELSE 0)[3:42:6]&ST[9:39:9]& 20569440
LIBNO[CTC]&1[2:47:1]; 20569460
NEXTL: 20569520
FROMHLD.UNITNUM:=19; TOHLD.UNITNUM:=19; % 19=DISK UNINTO+1%148-20569522
PROG[CNT+1]:=0; 20569525
NAMECNT:=0; 20569527
IF T=ADDV THEN PROG[CNT+1].[6:1]:=1; 20569528
IF T=UNLOAD THEN PROG[CNT+1].[8:1]:=1; 20569529
$ SET OMIT = NOT B6500LOAD 20569530
IF T NEQ COPYN THEN 20569590
IF CN=TOV AND T GTR UNLOAD THEN 20569610
SCANDSKTYP; 20569630
IF CN=LATESTV THEN 20569650
BEGIN PROG[CNT+1].[5:1]:=1; CN:=SCAN; END; 20569670
IF CN=EXPIRED THEN 20569690
BEGIN PROG[CNT+1].[4:1]:=1; CN:=SCAN; END; 20569710
IF CN=ACCESSD THEN 20569730
BEGIN PROG[CNT+1].[3:1]:=1; CN:=SCAN; END; 20569750
IF CN=ADDV THEN 20569770
BEGIN PROG[CNT+1].[6:1]:=1; CN:=SCAN; END; 20569780
IF CN=NOHASH THEN 20569790
BEGIN PROG[CNT+1].[7:1]:=1; CN:=SCAN; NAMECNT.[17:1]:=1; END; 20569800
IF CN=UNLOAD THEN 20569802
BEGIN PROG[CNT+1].[8:1]:=1; CN:=SCAN; NAMECNT.[17:1]:=1; END; 20569804
IF T NEQ COPYN THEN 20569810
IF SCAN NEQ IDENT 20569830
THEN GO POWIE 20569835
ELSE IF T LEQ UNLOAD 20569840
THEN BEGIN TOHLD:=ACCUM[0]; %148-20569845
IF (CN:=SCAN)=ONV THEN TOHLD.UNITNUM:=SCANON;%148-20569846
END %148-20569847
ELSE BEGIN FROMHLD:=ACCUM[0]; %148-20569850
IF (CN:=SCAN)=ONV THEN FROMHLD.UNITNUM:=SCANON; 20569860
END; %148-20569870
REMEMBER:=REMEMBER&LIBNO[CTC]&(CNT+1)[CTF]; 20569890
GETEM: 20569920
CHECK; 20569925
T1.[46:1]~HOLD3~(CN=EQUAL); %543-20569930
IF HOLD3 THEN PROG[CNT]:=-1 ELSE %543-20569935
IF CN GEQ IDENT THEN PROG[CNT]:=ACCUM[0] ELSE GO POWIE; %543-20569940
IF SCAN NEQ SLASH THEN GO POWIE; 20569950
T1.[47:1]~HOLD3~((CN~SCAN)=EQUAL); %543-20569960
IF HOLD3 THEN PROG[CNT+1]:=-1 ELSE %543-20569965
IF CN GEQ IDENT THEN PROG[CNT+1]:=ACCUM[0] ELSE GO POWIE; 20569970
NAMECNT.[CF]:=NAMECNT.[CF]+2; 20569975
HME:=PROG[CNT].[1:1]+PROG[CNT+1].[1:1]; 20569980
HOLD3:=1; 20569985
IF (CN:=SCAN)=EXCEPT THEN BEGIN CN:=SCAN; HOLD3:=0; END; 20569990
IF CN=LB THEN IF HME NEQ 0 THEN 20570000
BEGIN XI:=-2; 20570010
SCANEXCEPT; 20570015
FOR ST:=0 STEP 2 UNTIL XI DO 20570020
BEGIN CHECK; 20570030
PROG[CNT]:=XLST[ST]&1[5:47:1]; 20570040
PROG[CNT+1]:=XLST[ST+1]&1[5:47:1]; 20570050
NAMECNT.[FF]:=NAMECNT.[FF]+2; 20570055
END; 20570060
CN:=SCAN; 20570065
FORGETSPACE(XLST); XLST:=0; %543-20570070
END ELSE GO POWIE 20570080
ELSE IF HOLD3=0 THEN GO POWIE; 20570090
IF CN=AS THEN 20570100
BEGIN 20570110
IF HME=2 OR T=UNLOAD OR NAMECNT.[17:1] THEN GO POWIE; 20570120
IF (CN~SCAN)=EQUAL THEN IF T1.[46:1] THEN %543-20570130
BEGIN CHECK; PROG[CNT]:=-1&1[4:47:1]; END ELSE GO POWIE 20570140
ELSE IF CN GEQ IDENT THEN IF T1.[46:1] THEN GO POWIE %543-20570150
ELSE BEGIN CHECK; PROG[CNT]:=ACCUM[0]&1[4:47:1]; END 20570160
ELSE GO POWIE; 20570170
IF SCAN NEQ SLASH THEN GO POWIE; 20570180
IF (CN~SCAN)=EQUAL THEN IF T1 THEN %543-20570190
PROG[CNT+1]:=-1&1[4:47:1] ELSE GO POWIE 20570200
ELSE IF CN GEQ IDENT THEN IF T1 THEN GO POWIE %543-20570210
ELSE PROG[CNT+1]:=ACCUM[0]&1[4:47:1] 20570220
ELSE GO POWIE; 20570230
NAMECNT.[FF]:=NAMECNT.[FF]+2; 20570232
CN:=SCAN; 20570235
END; 20570240
IF CN=COMMA THEN BEGIN CN:=SCAN; GO GETEM; END; 20570250
IF CN=PERIO OR CN=POUND 20570270
THEN IF T=COPYN THEN GO POWIE ELSE GO QUIT 20570280
ELSE IF T NEQ COPYN 20570290
THEN GO POWIE 20570300
ELSE IF CN=TOV 20570310
THEN BEGIN 20570320
FIRSTIME:=TRUE; 20570330
MIRID: SCANDSKTYP; 20570340
IF FIRSTIME AND (TOHLD.UNITNUM=19) %148-20570350
THEN GO POWIE 20570360
ELSE IF CN=PERIO OR CN=POUND 20570370
THEN GO QUIT ELSE GO POWIE 20570380
END 20570390
ELSE IF CN NEQ FROM 20570400
THEN GO POWIE 20570410
ELSE BEGIN 20570420
IF (CN:=SCAN)=DISK 20570430
THEN FIRSTIME:=TRUE 20570440
ELSE IF CNNEQ IDENT 20570450
THEN GO POWIE ELSE FROMHLD:=ACCUM[0]; 20570460
IF (CN:=SCAN) = ONV THEN %148-20570462
FROMHLD.UNITNUM:=SCANON; %148-20570464
IF CN=POUND OR CN=PERIO %148-20570470
THEN IF FIRSTIME THEN GO POWIE 20570480
ELSE GO QUIT 20570490
ELSE IF CN=TOV 20570500
THEN GO MIRID 20570510
ELSE IF CN NEQ COMMA 20570520
THEN GO POWIE 20570530
ELSE BEGIN 20570540
SETUP; 20570550
CHECK; PROG[CNT]:=@14; 20570560
PROG[CNT+1]:=FROMHLD; 20570570
CN:=SCAN; 20570575
CHECK; PROG[CNT]:=0; 20570577
GO NEXTL; 20570580
END; 20570590
END; 20570600
QUIT: 20571500
SETUP; BOTH; 20571600
STREAM(A:=TOHLD,B:=TOHLD.[42:6]-1,C:=TOHLD.[42:6]!0, %122-20571700
D:=[CMM[27]]); %122-20571702
BEGIN %122-20571710
SI:=LOC A; SKIP SB; %122-20571720
IF SB THEN %122-20571730
BEGIN %122-20571740
SKIP 39 SB; %122-20571750
IF SB THEN DS:=8 LIT"0FAST " %122-20571760
ELSE %122-20571770
BEGIN %122-20571780
SKIP SB; %122-20571782
IF SB THEN DS:=8 LIT"0SLOW " %122-20571790
ELSE %122-20571800
BEGIN %122-20571810
C(SI:=LOC B; %122-20571820
DS:=6 LIT"0EU # "; DS:=2 DEC; %122-20571830
JUMP OUT TO L); %122-20571840
DS:=8 LIT"0DISK "; %122-20571842
L: END %122-20571850
END %122-20571860
END %122-20571870
ELSE %122-20571880
BEGIN %122-20571890
SKIP 5 SB; %122-20571900
DS:=LIT"0"; DS:=7 CHR; %122-20571910
END; %122-20571920
END; %122-20571930
GO INIT; 20572100
POWIE: 20572200
IF DIDGETESPDISK THEN 20572210
BEGIN 20572220
IF CMM[19].[CF]!LIBNO THEN % MORE THAN ONE SEGMENT USED 20572300
BEGIN 20572400
DISKWAIT(-PROG.[CF],30,CMM[19].[CF]); 20572500
FORGETESPDISK(CMM[19].[CF]); 20572700
CMM[19]~PROG[29]; 20572800
GO POWIE; 20572900
END; 20573000
FORGETESPDISK(LIBNO); 20573100
END; 20573110
GO INCSC; 20573200
REMO: 20573300
IF XLST NEQ 0 THEN BEGIN FORGETSPACE(XLST); XLST:=0; END; %543-20573350
T1.[46:1] ~ ((CN ~ SCAN) = EQUAL); %552-20573400
IF T1.[46:1] THEN CMM[0]~-1 ELSE %552-20573402
IF CN GEQ IDENT THEN CMM[0]:=ACCUM[0] ELSE GO POWIE; 20573410
IF SCAN NEQ SLASH THEN GO POWIE; 20573420
T1.[47:1] ~ ((CN ~ SCAN) = EQUAL); %552-20573430
IF T1 THEN CMM[1]~-1 ELSE %552-20573432
IF CN GEQ IDENT THEN CMM[1]:=ACCUM[0] ELSE GO POWIE; 20573440
HME:=CMM[0].[1:1]~CMM[1].[1:1]; 20573450
XI:=-2; 20573460
IF (CN:=SCAN)=PERIO OR CN=COMMA 20573470
THEN HOLD1:=CN 20573480
ELSE BEGIN 20573490
IF CN=EXCEPT THEN CN:=SCAN; 20573500
IF CN=LB THEN IF HME NEQ 0 THEN ELSE GO POWIE 20573510
ELSE GO POWIE; 20573520
T1.[45:1] ~ 1; % FLAG FOR SCANEXCEPT. ON REMOVE = %552=20573525
SCANEXCEPT; 20573530
XLST.[8:10]:=X1+2; 20573540
HOLD1:=SCAN; 20573760
END; 20573770
CN:=T:=0; 20573850
IF (CMM[0] OR CMM[1]) LSS 0 THEN 20573900
SEEK: 20574000
SEEKNAM(CMM[0],CMM[1],CN,CMM[2],CMM[3],OPTN,XLST) ELSE 20574100
BEGIN 20574200
CMM[2]:=CMM[0]; 20574300
CMM[3]:=CMM[1]; 20574400
CN:=1; 20574500
END; 20574600
IF CN NEQ 0 20574700
THEN T:=IF SYSTEMFILE(CMM[2],CMM[3]) 20574750
THEN 2 20574800
ELSE DIRECTORYSEARCH(CMM[2],CMM[3],5) 20574850
ELSE IF OPTN NEQ 0 THEN GO OUTR; 20574875
IF T GEQ 64 THEN 20574900
BEGIN IF HOLD3:=NOT(M[T+4].[44:1]) THEN BEGIN FORGETSPACE(T); 20574905
T:=DIRECTORYSEARCH(CMM[2],CMM[3]&(UNITNO=25 OR UNITNO=30)20574910
[1:47:1],4); END; 20574915
IF T GEQ 64 THEN %508-20574917
IF M[T+4].[43:2]=3 THEN BEGIN FORGETSPACE(T); T:=1; END; 20574920
END; 20574922
IF CARD.[8:1] THEN GO DOWNR; 20574925
IF T LSS 2 20574950
THEN IF T=1 20575000
THEN LBMESS(ABS(CMM[2]),CMM[3],-7,45,0,SPOUTUNIT,LIBERR) 20575050
ELSE LBMESS(CMM[0],CMM[1],-7,15,0,SPOUTUNIT,LIBERR) %149-20575100
ELSE IF T=2 20575150
THEN LBMESS(CMM[2],CMM[3],-7,25,0,SPOUTUNIT,LIBERR) %149-20575200
ELSE IF T GEQ 64 20575250
THEN BEGIN 20575300
IF M[T+2] NEQ 0 AND (USERID EQV MCP) NEQ 20575350
NOT 0 AND (USERID EQV ABS(M[T+2])) NEQ 20575400
NOT 0 20575450
THEN BEGIN 20575500
LBMESS(CMM[2],CMM[3],-7,41, 20575550
0, SPOUTUNIT, LIBERR);%149-20575600
FORGETSPACE(DIRECTORYSEARCH(CMM[2],20575650
CMM[3],14)); 20575700
END 20575750
ELSE IF M[T+4].[43:2] NEQ 0 20575800
THEN BEGIN 20575850
DOWNR: IF NOT FIRSTIME THEN 20575900
BEGIN FIRSTIME:=1; 20576000
CMM[19]:=(LIBNO:= 20576050
GETESPDISK)&1[18:44:4]; 20576100
DIDGETESPDISK:=TRUE; 20576125
END; 20576150
M[T+4].[43:2]:=1; 20576200
DISKWAIT(T.[CF],30,T.[FF]); 20576210
IF HOLD3 THEN FORGETSPACE( 20576215
DIRECTORYSEARCH(CMM[2], 20576216
CMM[3],14)); 20576217
CHECK; 20576220
PROG[CNT]:=CMM[2]; 20576230
PROG[CNT+1]:=CMM[3]; 20576240
END 20576250
ELSE FORGETSPACE(DIRECTORYSEARCH(20576300
CMM[2],CMM[3],6 20576350
$ SET OMIT = NOT (PACKETS) 20576395
&SPOUTUNIT[9:9:9] 20576400
&SPOUTUNIT[24:42:6] 20576405
$ POP OMIT 20576410
)); 20576415
FORGETSPACE(T); 20576450
END; 20576475
IF CN NEQ 0 AND (CMM[0] OR CMM[1] LSS 0 THEN GO SEEK; 20576500
OUTR: IF (CN:=HOLD1)=COMMA THEN GO REMO; 20576600
IF CN=PERIO THEN 20576700
IF FIRSTIME THEN 20576710
BEGIN BOTH; 20576720
M[CARDLOC-2]:=0; 20576754
M[CARDLOC-1]:=10; 20576756
CMM[6]:=GETESPDISK & 10[18:33:15]; 20576758
$ SET OMIT = NOT(DATACOM AND RJE) 20576760
DISKWAIT(CARDLOC-2,11,CMM[6] INX 0); 20576768
GO INIT; 20576770
END 20576780
ELSE GO CCA 20576790
ELSE GO POWIE; 20576800
CHAN: 20576850
T:=0; % T USED AS BIT MASK FOR SYNTAX CHECK 20576900
FOR CN:=0 STEP 1 UNTIL 3 DO % SCAN INPUT REQUEST 20576925
BEGIN 20576950
OPTN := SCAN; 20576975
T := (OPTN=EQUAL) & T[43:44:4]; % SHIFT PREVIOUS VALUE LEFT 20577000
IF T THEN CMM[CN] := (-1) ELSE 20577025
IF OPTN GEQ IDENT THEN CMM[CN] := ACCUM[0] ELSE 20577050
GO TO INCSC; % INCORECT REQUEST 20577075
OPTN := SCAN; % SKIP "/","," OR ";" 20577100
END; % SCANNING INPUT REQUEST 20577125
IF (T NEQ 0) AND (T NEQ 5) AND (T NEQ 10) THEN GO INCSC; 20577150
% T=5 FOR =/<NAME1> TO =/<NAME2> 20577175
% T=10 FOR <NAME1>/= TO <NAME2>/= 20577200
% T=0 FOR <NAME1>/<NAME2> TO <NAME3>/<NAME4> 20577225
IF (REPEAT:=(T GTR 0)) THEN 20577250
BEGIN 20577275
HOLD1 := CMM[0]; HOLD2 := CMM[1]; TYM:=1; CN:=0; 20577300
LOOP: SEEKNAM(HOLD1,HOLD2,CN,CMM[1],CMM[1],HOLD3,P(0)); 20577325
IF CN = 0 THEN % NOT FOUND IN DIRECTORY 20577350
BEGIN 20577375
IF TYM = 1 THEN % FIRST PASS, NULL SEARCH 20577400
BEGIN 20577425
LBMESS(HOLD1, HOLD2, -5, 15, %NOT CHANGED, NOT ON DISK20577450
0, SPOUTUNIT, LIBERR); %149-20577475
END; 20577500
GO TO NEXT; 20577525
END; 20577550
TYM := 2; 20577575
IF HOLD1 LSS 0 THEN CMM[2] := CMM[0] ELSE 20577600
IF HOLD2 LSS 0 THEN CMM[3] := CMM[1]; % USE NAME "FOUND" 20577625
END; 20577650
IF (T:=DIRECTORYSEARCH(CMM[2],CMM[3],5)) NEQ 0 THEN 20577675
BEGIN 20577700
FORGETSPACE(T); 20577725
LBMESS(CMM[0], CMM[1], -5, 29, % NOT CHANGED, DUP FILE 20577750
0, SPOUTUNIT, LIBERR); %149-20577775
END ELSE 20577800
BEGIN 20577805
T:=IF SYSTEMFILE(CMM[0].CMM[1]) THEN 3 ELSE 20577810
DIRECTORYSEARCH(CMM[0],CMM[1],5); 20577815
IF T GEQ 64 THEN 20577820
BEGIN IF NOT(M[T+4].[44:1]) THEN BEGIN FORGETSPACE(T); 20577823
T~DIRECTORYSEARCH(CMM[0],CMM[1]&(P(UNITNO,DUP)=25 OR 20577826
P(XCH)=30)[1:47:1],4); END; %508-20577827
IF T GEQ 64 THEN %508-20577828
IF M[T+4].[43:2]=3 THEN BEGIN FORGETSPACE(T); T:=1; 20577829
END; 20577832
END; 20577833
IF T LXX 2 THEN 20577835
LBMESS(CMM[0],CMM[1],-5,15+((T=1)|30), % NOT CHANGED 20577875
% 45 = IN USE, 15 = NOT ON DISK 20577900
0, SPOUTUNIT, LIBERR) %149-20577925
ELSE IF T=2 THEN 20577950
LBMESS(CMM[0], CMM[1], -5, 25, % NOT CHANGED, SYSTEM FILE 20577975
0, SPOUTUNIT, 1 ) % 20578000
ELSE IF M[T+2] NEQ 0 AND % NOT FREE FILE 20578025
(USERID EQV MCP) NEQ NOT 0 AND % NOT MCP 20578050
(USERID EQV ABS(M[T+2])) NEQ NOT 0 THEN % NOT CREATOR 20578075
BEGIN 20578100
LBMESS(CMM[0], CMM[1], -5, 41, % NOT CHANGED, INVALID USER 20578125
0, SPOUTUNIT, 1 ); % 20578150
IF M[T+4].[43:2] NEQ 1 THEN 20578175
FORGETSPACE( DIRECTORYSEARCH(CMM[0], CMM[1], 14 ) ); 20578200
FORGETSPACE(T); 20578210
END 20578225
ELSE 20578250
BEGIN % CHANGE OK 20578275
M[T+4]:=(*P(DUP))&3[1:46:2]; 20578300
T:=T&EUF(-CMM[2],CMM[3],T INX 0-1)[18:33:15]; 20578375
FORGETSPACE(DIRECTORYSEARCH(CMM[0],CMM[1],8)); 20578400
HEADERUNLOCK(CMM[2],CMM[3],T); 20578425
$ SET OMIT = PACKETS 20578450
LBMESS(CMM[0], CMM[1], 52, % CHANGED TO 20578525
CMM[2], CMM[3], SPOUTUNIT, LIBMSG); 20578550
PBCOUNT:=PBCOUNT-((((CMM[0] EQV "PBD ")=NOT 0) OR 20578575
((CMM[0] EQV "PUD ")=NOT 0)) AND (CMM[1].[CF]=1)) 20578600
+((((CMM[2] EQV "PBD ")=NOT 0) OR 20578625
((CMM[2] EQV "PUD ")=NOT 0)) AND (CMM[3],[CF]=1)); 20578650
END; 20578675
END; 20578685
IF REPEAT THEN GO TO LOOP; % FIND REMAINING FILES 20578700
NEXT: 20578725
IF OPTN=COMMA THEN GO CHAN; 20578900
IF OPTN=PERIO THEN GO TO CCA ELSE GO INCSC; 20579000
INIT: CCLIB:=LIBNO; GO CCA; 20579100
INCSC: CCLIB:=1; 20579200
CCA: CADDR:=CDEX:=0; 20579300
IF XLST NEQ 0 THEN FORGETSPACE(XLST); 20579302
IF (LIBNO:=PROCVAL).[CF] GTR 1 THEN PROCVAL:=2 ELSE 20579305
IF LIBNO THEN PROCVAL:=6 ELSE PROCVAL:=0; 20579310
RETURNVAL:=PROCVAL; 20579330
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20579340
END; % CCLIB PROCEDURE 20579350
REAL PROCEDURE CCSET; FORWARD; 20579400
PROCEDURE CCFINISH; 20579800
BEGIN 20579852
DECLARECCVARIABLES; 20581000
REAL TEMP = RETURNRCW+1; % BEGIN LOCALS OF CCFINISH 20581080
P(RCW,MYMSCW,STF); 20581125
RCW:=RCW & P(XCH)[CTC]; 20581130
P(0); % ZERO LOCAL OF CCFINISH 20581140
PPCPROCESS:=0; 20581150
CN:=T; 20581200
IF OPTN = PERIO OR OPTN = LIBRA THEN 20581250
BEGIN 20581300
CMM[22]:= PROG[22]; 20581350
PROG[2].[CF]:= IF PROG[18] > 32767 THEN 32767 20581400
ELSE PROG[18]; 20581450
IF PROG[20] > 512 THEN PROG[20]:= 512; 20581500
IF PADDR NEQ 0 THEN 20581550
BEGIN 20581600
PEQN[29]:= 0; 20581650
IF PDEX=0 THEN PEQN[0]:=14; 20581700
IF PDEX=1 THEN PEQN[14]:= 14; 20581750
DISKWAIT(PEQN.[CF],30,PADDR); 20581800
END; 20581850
PROG[29]:= 0; 20581900
CMM[2].[FF]:=NT1:=GETESPDISK; 20581950
DISKWAIT(PROG.[CF],30,NT1); 20582000
END; 20582050
IF CADDR NEQ 0 THEN 20582100
BEGIN 20582150
CEQN[29]:= 0; 20582200
IF CDEX=0 THEN CEQN[0]:= 14; 20582250
IF CDEX=1 THEN CEQN[14]:= 14; 20582300
DISKWAIT(CEQN.[CF],30,CADDR); 20582350
END; 20582400
COMPLEXSLEEP((SCHEDULEIDS!NOT 0) AND SHEETFREE); 20582440
LOCKTOG(SHEETMASK); 20582450
CDEX:= GETESPDISK; 20582500
CMM[2].[CF]:= IF CMM[18] > 32767 THEN 32767 ELSE CMM[18]; 20582550
PDEX:= IF CMM[18] > MIXMAX THEN MIXMAX ELSE CMM[18]; 20582600
IF LIBNO NEQ 0 THEN CMM[19]:= LIBNO; 20582650
STREAM(A:=0:S:=P(.SCHEDULEIDS)); 20582750
BEGIN SI:=S; 20582800
47(SKIP SB; SKIB DB; TALLY:=TALLY+1; 20582850
IF SB THEN BEGIN END ELSE JUMP OUT); 20582900
DS:= SET; A:= TALLY; 20582950
END STREAM; 20583000
TEMP:= P; CMM[3]:= 0&TEMP[8:38:10]; 20583050
CMM[23].[24:24]~(CLOCK+P(RTR))DIV 60; 20583100
IF SHEET[PDEX].[CF] NEQ 0 THEN 20583150
BEGIN 20583200
DISKWAIT(-PROG.[CF],30,PADDR:=SHEET[PDEX].[FF]); 20583250
PROG[29]:= CDEX; 20583300
DISKWAIT(PROG.[CF],30,PADDR); 20583350
END; 20583400
ELSE SHEET[PDEX]:= CDEX; 20583450
SHEET[PDEX].[18:15]:= CDEX; 20583500
CMM[29]:= 0; 20583550
DISKWAIT(CMM.[CF],30,CDEX); 20583600
UNLOCKTOG(SHEETMASK); 20583650
T:= CN; 20583700
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20583710
END CCFINISH; 20583750
REAL PROCEDURE CCCOMPILE; 20583800
BEGIN COMMENT SETUP OF COMPILER LABEL EQUATION CODE: PN1/PN2; 20583860
DECLARECCVARIABLES; 20584000
REAL SUBROUTINE SCAN; 20584150
SCAN~SCN[UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN,DIRECT); 20584200
LABEL SKN,EXIT; 20584250
DEFINE ZIPMIX=CARD.[18:6]#; 20584275
DEFINE DISKTYPE = 10#;% 20584300
P(RCW,MYMSCW,STF); 20584325
RCW:=RCW & P(XCH)[CTC]; 20584330
CCCOMPILE~0; %510-20584340
T:=SCAN;% 20584350
CEQN[0]:=ACCUM[0]; 20584400
T:=SCAN;% 20584450
T:=SCAN;% 20584500
CEQN[1]:=ACCUM[0];% 20584550
CEQN[2]:=0;% 20584600
CEQN[3]:=DISKTYPE;% 20584650
CEQN[4]:=@423462425606060;% 20584700
CEQN[12]:=0; % EU/SPEED CELL % (SHM)20584710
CDEX :=1;% 20584750
IF ((UNITNO+1)AND 24)=24 OR UNITNO GEQ 32 THEN% 20584800
BEGIN CEQN[14]:=CEQN[16]:=CEQN[17]:=0;% 20584850
CEQN[15]:= "CARD 00" OR ((IF UNITNO GEQ 32 THEN% 20584900
"C/" ELSE @5772) + UNITNO);% 20584950
CEQN[18]:=@423215124000000; CDEX:=2;% 20585000
IF UNITNO GEQ 32 THEN CIDROW[UNITNO-32].[3:5]:=1 ELSE% 20585050
IF UNITNO=23 THEN READERA.[FF] ~ 1 ELSE 20585100
IF UNITNO=24 THEN READERB.[FF] ~ 1; 20585125
END; 20585150
WHILE (CN:=SCAN) LSS ALGOL OR CN GTR COBOL DO 20585200
IF CN=PERIO THEN BEGIN CCCOMPILE:=1; GO EXIT END; 20585250
IF CN=WITH THEN 20585300
IF (CN~SCAN)=PERIO THEN BEGIN CCCOMPILE~1; GO EXIT END; 20585350
IF CN<ALGOL OR CN>COBOL THEN 20585355
IF(T:=DIRECTORYSEARCH(ACCUM[0],"DISK ",5))!0 THEN 20585360
BEGIN IF NOT M[T+4].[8:1] THEN 20585365
BEGIN LBMESS(ACCUM[0],"DISK ",-22,0, 20585370
0, SPOUTUNIT, LIBERR); %149-20585375
FORGETSPACE(T); CCCOMPILE~1; GO EXIT; 20585380
END; FORGETSPACE(T); 20585385
END; 20585390
COMMENT SET UP NOMICAL VALUES FOR PROGRAM PARAMETERS;% 20585400
CMM[0]:=-(CMPLR:=ACCUM[0]); CMM[1]:=CEQN[0]; 20585450
CMM[2]:=0; 20585500
CMM[13]:= CADDR:= GETESPDISK; 20585550
$ SET OMIT = PACKETS 20585599
$ SET OMIT = NOT(PACKETS) 20585609
CMM[23]:=0&CARD[9:9:9]&(IF ZIPMIX NEQ 0 THEN PSEUDOMIX[ZIPMIX]20585610
ELSE UNITNO)[2:42:6]; 20585620
$ POP OMIT 20585621
CMM[27]:=CEQN[1]; %FID FOR SCHED MESS. 20585630
% GET OPTION (GO,SYNTAX CHECK, OR LIBRARY) 20585650
SKN: DO OPTN:=SCAN UNTIL OPTN=PERIO OR OPTN=SYNTA OR OPTN=LIBRA 20585700
OR OPTN=QUEST; % IN CASE OF HYPHEN IN COMMENT PORTION 20585705
IF OPTN=QUEST THEN 20585710
IF SOURCE=(CARDLOC&1[30:45:3]) THEN 20585715
BEGIN 20585720
OPTN:=PERIO; SOURCE:=CARDLOC; 20585725
END ELSE GO TO SKN; 20585730
CMM[2].[8:10] := IF OPTN=PERIO THEN 1 ELSE 20585750
IF OPTN=SYNTA THEN 3 ELSE 4;%(OPTN=LIBRA) 20585800
IF OPTN NEQ SYNTA THEN 20585850
% SET UP PROG ARRAY FOR COMPILE AND GO OR COMPILE TO LIBRARY JOBS 20585900
BEGIN 20585950
PROG[0]:= CEQN[0]; 20586000
PROG[1]:= CEQN[1]; 20586050
PROG[2]:=PROG[15]:= 0; 20586100
PROG[16]:=PROG[17]:= @377777777777; 20586150
PROG[18]:= (MIXMAX+1) DIV 2; 20586200
PROG[19]:= 0; 20586250
PROG[20]:= -1; 20586300
PROG[21]:= 512; 20586350
PROG[22]:= 10; 20586400
PROG[23]:= CMM[23]; 20586450
PROG[24]:= USERID; 20586500
END; 20586550
EXIT: RETURNVAL:=PROCVAL; % ADJUST RESULT OF TYPED PROC 20586600
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20586625
END CCCOMPILE; 20586650
REAL PROCEDURE INITIALIZEIT; 20586700
BEGIN LABEL TRYAGAIN,LS,SPLAT,SPOT,EXIT; 20586715
DECLARECCVARIABLES; 20586800
REAL CMM1 = RETURNVAL+1; % BEGIN LOCAL TO INITIALIZEIT 20586950
REAL SUBROUTINE SCAN; 20587050
SCAN~SCN(UNITNO,CARDLOC,SOURCE,ACCUM,DOUNT,LASTSCAN,DIRECT); 20587100
P(RCW,MYMSCW,STF); 20587110
RCW:=RCW & P(XCH)[CTC]; 20587120
P(0); % ZERO LOCAL TO INITIALIZEIT 20587130
PROG[13]:=PADDR:=PDEX:=0; % IN CASE PROGRAM NOT IN DIRECTORY 20587150
TRYAGAIN: 20587170
IF (T:=DIRECTORYSEARCH(ABS(CMM[0]),CMM1:=IF CMM[0] LSS 0 THEN 20587200
"DISK " ELSE CMM[1],3))=0 THEN 20587250
BEGIN 20587300
IF CMM[2].SSYSJOBF = LIBMAINCODE THEN 20587310
BEGIN 20587330
INTERSYSFILE(1); 20587340
GOTRYAGAIN; 20587350
END; 20587360
IF CARD.[9:9]=0 THEN GO TO LS; 20587370
$ SET OMIT = NOT(DATACOM) 20587399
BEGIN 20587500
LS: LBMESS(ABS(CMM[0]),CMM1,-15,0,0,SPOUTUNIT,LIBERR); %149-20587550
SPLAT: 20587650
IF UNITNO GEQ 32 THEN BEGIN INITIALIZEIT:=5;GO EXIT END; 20587700
END; 20587750
DO T~SCAN UNTIL T>IDENT AND T{RESETV; 20587800
IF UNITNO=31 THEN BEGIN INITIALIZEIT:=7; GO EXIT; END; 20587850
INITIALIZEIT:=1; GO EXIT; 20587950
END; 20587975
IF M[T INX 4].[9:2]=2 THEN 20588000
BEGIN FORGETSPACE(T); 20588010
GO TO SPOT; 20588020
END; 20588030
IF SECURITYCHECK(ABS(CMM[0]), 20588050
CMM1.USERID,T)=0 THEN 20588100
BEGIN 20588150
OPTN:=0; CMM[2]:=T; 20588200
P(DIRECTORYSEARCH(NABS(CMM[0]),CMM[1]:=CMM1,13),DEL); 20588250
INITIALIZEIT:=4; 20588350
GO TO EXIT; 20588360
END; 20588370
DISKIO(N1,-(PEQN INX 0-1),30,M[T+10]); 20588400
P(M[T INX 4].[9:2]=3); FORGETSPACE(T);%NOTE FOR BELOW 20588450
CMM[24]:= USERID; 20588500
CMM[25]:= T.[FF]; 20588550
SLEEP([N1],IOMASK); 20588600
FOR T:=1 STEP 1 UNTIL 4 DO 20588650
IF (NOT ABS(PEQN[T]&0[CTC])) NEQ NOT 0 THEN T:= 7; 20588700
IF PEQN[3] GEQ 0 THEN % SKIP IF RESTART FILE %106-20588701
IF ABS(PEQN[3])>1023 THEN P(DEL,T~0); % PRT>1023 NO WAY%202-20588702
$ SET OMIT = NOT(BREAKOUT) 20588710
$ SET OMIT = BREAKOUT 20588730
IF PEQN[3].[1:1] THE NP(DEL,T:=0);% CAN-T RESTART; 20588740
$ POP OMIT 20588745
IF PEQN[2].[3:1] THEN % I.P.C. %110-20588746
IF(PEQN[8]>2) THEN P(DEL,T~0); % I.P.C. - NEEDS PARAMETERS 20588747
IF NOT (P OR T) THEN %NOT CODE 20588750
BEGIN 20588800
SPOT: LBMESS(ABS(CMM[0]),CMM1,-19,0,0,SPOUTUNIT,LIBERR); %149-20588900
P(DIRECTORYSEARCH(NABS(CMM[0]),CMM1,13),DEL); 20589000
GO TO SPLAT; 20589150
END; 20589200
IF PEQN[6] LSS 0 THEN FOR T:=15 STEP 1 UNTIL 22 DO 20589250
CMM[T]:=PEQN[T] ELSE 20589300
BEGIN 20589350
CMM[15]:= 0; 20589400
CMM[16]:= CMM[17]:= @377777777777; 20589450
CMM[18]:=(MIXMAX-1) DIV 2; 20589460
CMM[19]:= 0; 20589470
CMM[20]:= PEQN[7].[FF]; 20589480
CMM[21]:= 512; 20589490
END; 20589500
INITIALIZEIT:=3; 20589550
EXIT: RETURNVAL:=PROCVAL; % ADJUST RESULT OF TYPED PROC 20589600
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20589610
END INITIALIZEIT; 20589650
REAL PROCEDURE CCUNIT; 20589700
BEGIN LBEL U1,ERROR,EXIT; 20589720
DECLARECCVARIABLES; 20589800
REAL SUBROUTINE SCAN; 20589950
SCAN~SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN,DIRECT); 20590000
P(RCW,MYMSCW,STF); 20590010
RCW:=RCW & P(XCH)[CTC]; 20590020
T:= SCAN; CN:= ACCUM[0]; 20590050
T~SCAN; IF T!EQUAL THEN GO ERROR; 20590100
FOR T:= 0 STEP 1 UNTIL 31 DO 20590150
IF CN.[6:18]=TINU[T].[30:18] THEN GO TO U1; 20590200
GO ERROR; 20590250
U1: IF LABELTABLE[T] NEQ @314 THEN BEGIN CCUNIT:=6; GO EXIT END; 20590300
CN:= SCAN; 20590350
MULTITABLE[T]:=RDCTABLE[T]:=0; 20590400
LABELTABLE[T]:= ACCUM[0]; 20590450
IF (CN:= SCAN) = SLASH THEN 20590500
BEGIN MULTITABLE[T]:= LABELTABLE[T]; 20590550
CN~SCAN; LABELTABLE[T]~ACCUM[0]; CN~SCAN; 20590600
END; 20590610
IF CN=COMMA THEN 20590650
BEGIN IF(CN~SCAN)!IDENT OR KOUNT>3 THEN GO ERROR; 20590655
STREAM(R~0:KOUNT,ACCUM); 20590660
BEGIN SI~ACCUM;SI~SI+1;DI~LOC R;DS~KOUNT OCT END; 20590665
RDCTABLE[T]~P(XCH,RDCTABLE[T])&P(XCH)[14:38:10]; 20590668
IF(CN~SCAN)=COMMA THEN 20590670
BEGIN IF(CN~SCAN)!IDENT OR KOUNT>5 THEN GO ERROR; 20590675
STREAM(R~0:KOUNT,ACCUM); 20590680
BEGIN SI~ACCUM;SI~SI+1;DI~LOC R;DS~KOUNT OCT END; 20590685
RDCTABLE[T]~P(XCH,RDCTABLE[T])&P(XCH)[24:31:17]; 20590688
IF(CN~SCAN)=COMMA THEN 20590690
BEGIN IF(CN~SCAN)!IDENT OR KOUNT>2 THEN GO ERROR; 20590695
STREAM(R~0:KOUNT,ACCUM); 20590700
BEGIN SI~ACCUM;SI~SI+1;DI~LOC R;DS~KOUNT OCT END; 20590705
RDCTABLE[T]~P(XCH,RDCTABLE[T])&P(XCH)41:41:17]; 20590710
END %CYCLE 20590715
END %CREATION DATE 20590720
END; %REEL NUMBER 20590725
IF CN! PERIO THEN DO CN~SCAN UNTIL CN=PERIO;CCUNIT~0;GO EXIT; 20590730
ERROR: CCUNIT~6; 20590740
EXIT: RETURNVAL:=PROCVAL; % ADJUST RESULT OF TYPED PROC 20590750
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20590751
END CCUNIT; 20590800
REAL PROCEDURE CCSECMAINT; 20590850
BEGIN LABEL EXIT,CCC; 20590910
DECLARECCVARIABLES; 20591000
REAL SUBROUTINE SCAN; 20591350
SCAN~SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN,DIRECT); 20591400
LABEL OPTNO,OPTN,OPTN2,SEC1,SEC2,SEC5,ST1, 20591500
ST2,LS; 20591550
SWITCH SW:=OPTNO,OPTN1,OPTN2; 20591600
P(RCW,MYMSCW,STF); 20591610
RCW:=RCW & P(XCH)[CTC]; 20591620
GO TO SW[OPTNN]; 20591650
OPTNO: USERID:= ABS(USERID); 20591700
IF SCAN LSS IDENT THEN BEGIN CCSECMAINT:=6;GO EXIT END; 20591750
SMID:= CMM[0]:= ACCUM[0]; CN:=SCAN; 20591800
IF SCAN LSS IDENT THEN BEGIN CCSECMAINT:=6; GO EXIT END; 20591850
SFID:= CMM[1]:= ACCUM[0]; CDEX:= 0; 20591900
IF (SFH:=DIRECTORYSEARCH(SMID,SFID,4))=0 THEN GO TO LS; 20591950
IF NOT(SYSTEMFILE(CMM[CDEX] ,CMM[CDEX+1]) OR 20592000
(SMID EQV "PBD ")=NOT 0) AND (M[SFH+5]=0 20592050
AND M[SFH+2] NEQ 0) THEN 20592100
% INHIBIT USE ON PUBLIC, SECURE FILES 20592150
BEGIN CN:=SCAN; GO TO OPTN2 END; 20592200
OPTN:=0; CMM[2]:= SFH; 20592250
P(DIRECTORYSEARCH(NABS(CMM[0]),CMM[1],14),DEL); 20592300
OPTN1: STREAM(USERID,Q:=USERID>0,B:=[CMM],D:=CN:=SPACE(10)); 20592400
BEGIN Q(SI:=LOC USERID; SI:=SI+1;DS:=LIT " "; DS:= 7CHR;); 20592450
DS:= 17LIB " INVALID USER OF "; SI:=B; 20592500
SI:=SI+1; DS:= 7CHR; DS:=LIT "/"; SI:=SI+1; DS:= 7CHR; 20592550
DS:=LIT"~"; 20592600
END STREAM; 20592650
SPOUTER( CN&CARD[9:9:9], SPOUTUNIT, 1 ); % 20592700
FORGETSPACE(CMM[2]); 20592725
IF OPTN NEQ 0 THEN GO TO SEC5; 20592750
IF UNITNO GEQ 32 THEN BEGIN CCSECMAINT:=5;GO EXIT END; 20592800
GO TO CCC; 20592850
OPTN2: CMM[5]:=USERID; 20592900
ST:= CDEX:= 0; 20592950
SEC1: FOR OPTN:=0 STEP 1 UNTIL 1 DO 20593000
BEGIN CN:=SCAN; 20593050
IF T=OPEN AND CN=UNLOCKV AND OPTN=0 THEN 20593060
BEGIN T:=UNLOCKV; GO TO SEC1 END 20593100
ELSE IF CN LSS IDENT AND CN NEQ EQUAL THEN GO TO ST1; 20593150
CMM[OPTN]:= IF CN=EQUAL THEN -1 ELSE ACCUM[0]; 20593200
CN:=SCAN; 20593250
END; 20593300
IF CN=WITH THEN BEGIN CN~SCAN;CMM[6]~IF CN}IDENT THEN ACCUM[0] 20593310
ELSE USERID; CN~SCAN END ELSE CMM[6]~USERID; 20593320
IF CMM[0] GEQ 0 AND CMM[1] GEQ 0 THEN GO TO SEC2; 20593350
N1:= CMM[0]; N2:= CMM[1]; N3:= 0; ST:= 1; 20593400
ST2: SEEKNAM(N1,N2,N3,CMM[0],CMM[1],T1,P(0)); 20593450
IF N3 NEQ 0 THEN GO TO SEC2; 20593500
ST:= 0; GO TO SEC5; 20593550
SEC2: IF (ABS(USERID)EQV MCP) NEQ NOT 0 THEN 20593600
IF SYSTEMFILE(CMM[CDEX],CMM[CDEX+1]) OR 20593650
(CMM[0] EQV "PBD ")= NOT 0 THEN GO SEC5; 20593700
SECURITYMAINT(T,SMID,SFID,CMM,SFH,SPOUTUNIT); 20593750
SEC5: IF ST THEN GO TO ST2; 20593800
IF CN=COMMA THEN GO SEC1; 20593850
IF T=USEV THEN 20593900
HEADERUNLOCK(SMID,SFID,SFH); 20593950
GO TO CCC; 20594000
LS: LBMESS(CMM[0],CMM[1],-15,0,0,SPOUTUNIT,LIBERR); %149-20594350
IF UNITNO GEQ 32 THEN BEGIN CCSECMAINT:=5; GO EXIT END; 20594400
CCC: DO T~SCAN UNTIL T>IDENT AND T{RESETV; 20594450
IF UNITNO=31 THEN BEGIN CCSECMAINT:=7; GO EXIT; END; 20594500
CCSECMAINT:=1; GO EXIT; 20594550
ST1: IF T=USEV THEN 20594600
HEADERUNLOCK(SMID,SFID,SFH); 20594650
CCSECMAINT:=6; 20594700
EXIT: RETURNVAL:=PROCVAL; % ADJUST RESULT OF TYPED PROC 20594750
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20594751
END CCSECMAINT; 20594800
REAL PROCEDURE CCLABEL; 20594850
BEGIN LABEL EXIT; 20594870
DECLARECCVARIABLES; 20595000
P(RCW,MYMSCW,STF); 20595080
RCW:=RCW & P(XCH)[CTC]; 20595090
CN:=0; 20595150
UNITCODE[UNITNO-23]:= USERID; 20595200
MULTITABLE[UNITNO]:= 0; 20595250
RDCTABLE[UNITNO]:= 1&1[14:38:10]; 20595300
IF UNITNO=23 THEN BEGIN CN:=READERA.[FF];READERA:=CARDLOC END 20595350
ELSE IF UNITNO=24 THEN BEGIN CN:=READERB.[FF];READERB:=CARDLOC END 20595400
ELSE IF UNITNO GEQ 32 THEN BEGIN CN:= CIDROW[UNITNO-32].[3:5]; 20595450
CIDROW[UNITNO-32].[3:5]:= 0; 20595500
CIDROW[UNITNO-32].[18:15]:= CARDLOC; 20595550
M[CARDLOC-4].[3:6]:=20;M[CARDLOC-3]:=UNITNO-32; 20595560
END; 20595600
IF CN THEN BEGIN LABELTABLE[UNITNO]:= "CARD 00" OR 20595650
((IF UNITNO GEQ 32 THEN "C/" ELSE @5772 + UNITNO); 20595700
CCLABEL:=8; GO EXIT; 20595750
END; 20595800
IF T = LABEV THEN BEGIN 20595850
MULTITABLE[UNINTO]:=M[CARDLOC+1].[6:42]; 20595900
STREAM(A:=0,B:=0,C:=0:D:=CARDLOC+3); 20595950
BEGIN DI:=LOC A; SI:=D;DS:=3OCT; 20596000
DS:=5OCT; DS:=2OCT; END; 20596050
P(P(XCH)&P[24:31:17]&P(XCH)[14:38:10], 20596100
[RDCTABLE[UNITNO]],~);% 20596150
LABELTABLE[UNITNO]:=M[CARDLOC+2].[6:42]; 20596200
END 20596250
ELSE IF SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN,DIRECT) 20596300
GEQ IDENT THEN LABELTABLE[UNITNO]:=ACCUM[0] 20596350
ELSE BEGIN IF UNITNO GEQ 32 THEN 20596400
CIDROW[UNITNO-32].[18:15]:=0; 20596450
CCLABEL:=6; GO EXIT; 20596500
END; 20596550
CCLABEL:=6; 20596600
EXIT: RETURNVAL:=PROCVAL; % ADJUST RESULT OF TYPED PROC 20596650
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20596651
END CCLABEL; 20596700
BOOLEAN PROCEDURE CCFIND; 20596750
BEGIN LABEL FINDX; 20596760
DECLARECCVARIABLES; 20596800
P(RCW,MYMSCW,STF); 20596945
RCW:=RCW & P(XCH)[CTC]; 20596947
IF T=ENDFI THEN BEGIN P(0); GO TO FINDX END; 20596950
IF T=DATAV THEN BEGIN P(1); GO TO FINDX; END; 20597000
IF T=LABEV THEN BEGIN P(1); GO TO FINDX; END; 20597050
$ SET OMIT = NOT(DCSPO AND DATACOM ) 20597100
FINDX: CCFIND:=P; 20597450
RETURNVAL:=PROCVAL; % ADJUST RESULT OF TYPED PROC; 20597459
P([RETURNRCW],STS,P&RCW[CTC],0,RDS,0,XCH,P&P[CTF],STF); 20597460
END CCFIND; 20597500
PROCEDURE CONTROLCARD(CARD); VALUE CARD; REAL CARD; 20597550
BEGIN 20597600
LABEL CC,CCTYPE,COMPILE,INITIALIZATION,BEFORETRYNEXT,TRYNEXT, 20597650
CONTROLER,CONTROLA,COMPILEJOB,COMJOB,EXEC,EXRUN,RUN, 20597700
USERS,USES,SECBOMB,UNLOX,LOX,FREES,OPENS,ENTE, 20597750
LCOPY,CHANGE,REMOVE,UNITI,INCSC,ENDF,ENDECK,SAVENO, 20597800
LABE,FINIS,ZIPEXIT,EXIT,SET,RSET,DOWN; 20597850
LABEL CCC,PACK,PACK2,WAIT,ZIPLIST; 20597880
SWITCH TYPE~ UNLOX,USES,LOX,FREES,OPENS,PACK,USERS, 20597900
RUN,COMPILE,EXEC,LCOPY,LCOPY,LCOPY,ENTE,ENTE,REMOVE, 20597950
CHANGE,UNITI,ENDF,WAIT,LABE,LABE,SET,RSET; 20598000
SWITCH SW~ CC,CCTYPE,INITIALIZATION,BEFORETRYNEXT,SECBOMB,ENDECK, 20599000
INCSC,ZIPEXIT,EXIT,PACK2; 20599100
DEFINE ZIPMIX=CARD.[18:6]#, PSOURCE=CARD.[24:6]#; 20600000
DECLARECCVARIABLES; 20600010
REAL SUBROUTINE SCAN; 20600020
SCAN:=SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN,DIRECT); 20600040
$ SET OMIT = NOT(PACKETS) 20600099
SUBROUTINE LISTHECARD; 20600100
IF LASTSCAN.[2:1] THEN 20600110
IF SPOUTUNIT.[CF] GEQ 32 THEN 20600120
IF T!PACKET THEN 20600130
BEGIN 20600140
LASTSCAN.[2:1]:=0; ABORT:=CARDLOC; 20600150
IF UNITNO=31 THEN 20600160
STREAM(E:="END....", CARDLOC); 20600170
BEGIN SI:=CARDLOC; DI:=LOC E; DI:=DI+1; 20600180
L1: IF SC=" " THEN BEGIN SI:=SI+1; GO L1; END; 20600190
IF SC="~" THEN GO FINI; 20600200
IF SC=ALPHA THEN 20600210
IF SC="E" THEN 20600220
BEGIN 20600230
IF 3 SC=DC THEN IF SC=ALPHA THEN ELSE 20600240
BEGIN 20600250
CARDLOC:=SI; DI:=CARDLOC; DS:=LIT"~"; 20600260
GO FINI; 20600270
END; 20600280
SI:=SI-3; DI:=DI-3; GO L2; 20600290
END ELSE % ALPHANUMERIC 20600300
BEGIN 20600310
L2: SI:=SI+1; IF SC=ALPHA THEN GO L2; 20600320
END ELSE % SPECIAL CHR 20600330
SI:=SI+1; 20600340
GO L; 20600350
FINI: 20600360
END; 20600370
ZIPLIST: 20600380
STREAM(EOS:=0; CARDLOC:=[ABORT], PC:=PPCPROCESS, 20600390
ZZP:=UNITNO=31, D:=NT1:=SPACE(10)); 20600400
BEGIN SI:=CARDLOC; SI:=SI+5; SI:=SC; 20600410
DS:=LIT">"; PPC(DS:=4LIT">"); ZZP(DS:=2LIT">"); 20600420
2(36(IF SC="~" THEN JUMP OUT 2 TO DUN; 20600425
ZZP(IF SC="1" THEN BEGIN DS:=CHR; 20600430
LUP: IF SC=" " THEN BEGIN SI:=SI+1; GO LUP; END; 20600435
JUMP OUT 3 TO AGN; END); 20600440
DS:=CHR)); 20600445
AGN: TALLY:=1; EOS:=TALLY; 20600450
DUN: DS:=LIT"~"; 20600455
ZZP(D:=SI; SI:=LOC D; DI:=CARDLOC; DS:=WDS); 20600460
END; 20600465
SPOUTER(NT1,SPOUTUNIT,64); 20600470
IF P AND (UNITNO=31) THEN 20600480
GO Z;PLIST; 20600490
ABORT:=0; 20600500
END LISTHECARD; 20600510
$ POP OMIT 20600511
P(0,0,0,0,0,0,0,0,0,0);% 20600600
P(0,0,0,0,0,0,0,0,0,0);% 20600650
P(0,0,0,0,0,0,0,0,0,0);% 20600700
P(0,0,0,0); 20600750
% DO NOT ZERO THE LAST THREE LOCALS (RETURN-MSCW, RCW, & VAL) 20600755
RCW:=RCW & P1(..CONTROLCARD,LOD)[CTC]; 20600760
UNITNO := CARD.[2:6]; 20600850
IF CARD.[33:15] = 0 THEN 20600900
BEGIN CARD.[33:15] := GETSPACE(13,0,0)+4; 20600950
IF WAITIO(CARD INX @40000000,@15,UNITNO).[45:3] NEQ 0% 20601000
THEN 20601050
BEGIN LABELTABLE[UNITNO] := @114;% 20601100
RRRMECH := NOT TWO (UNITNO) AND RRRMECH;% 20601150
FORGETSPACE(CARD INX NOT 1);% 20601200
KILL([MSCW]); 20601250
END; 20601300
END; 20601350
COMMENT GET OWN STACK AND GET RID OF INDEPENDENT STACK;% 20601400
COMMENT SET UP ACCUM ARRAY FOR SCAN;% 20601450
ACCUM:=[M[SPACE(10)]]&10[8:38:10];% 20601500
ACCUM[0] := 0;% 20601550
IF (CCTBLWORD:=P(CCTBLWORD,DUP)&(P.[FF]+1)[CTF]).[FF]>1 THEN 20601600
BEGIN 20601620
IF CCTBLADDR=0 THEN SLEEP([CCTBLWORD],@77777); 20601640
DIRECT:=[C[CCTBLWORD]]&CCTABLSZ[8:38:10]; 20601660
END ELSE 20601680
BEGIN 20601700
DIRECT:=[M[T:=SPACE(CCTABLSZ)]]&CCTABLSZ[8:38:10]; 20601720
DISKWAIT(-T,CCTABLSZ,MESSAGETABLE[3].[22:26]); 20601740
CCTABLDDR:=T; 20601760
END; 20601780
CMM:=[M[GETSPACE(130,2,0)+2]]&30[8:38:10];% 20601850
PEQN:=(31 INX (CEQN:=(31 INX(PROG:=(31 INX CMM)))));% 20601900
% PLACE "." IN COL 73 ;% 20601950
CARDLOC := CARD INX 0;% 20602000
IF UNITNO=25 OR UNITNO=26 OR UNITNO=30 OR UNITNO=31 THEN 20602050
SOURCE:=CARDLOC ELSE 20602100
M[(SOURCE:=CARDLOC)+9] := @3277320000000000; % .". 2B XTRA SAFE20602150
IF UNITNO GEQ 32 AND UNITCODE[UNITNO-23].[1:1] THEN 20602200
UNITCODE[UNITNO-23]:=M[CARDLOC + 10]; 20602250
IF UNITNO=25 OR UNITNO=31 THEN USERID:=MCP ELSE% 20602300
BEGIN IF UNITNO=26 THEN UNITNO:=31;% 20602350
USERID:=UNITCODE[UNITNO-23];% 20602400
$ SET OMIT = NOT(DATACOM AND RJE ) 20602409
END;% 20602450
SPOUTUNIT:=( 20602460
$ SET OMIT = NOT(PACKETS) 20602469
IF ZIPMIX!0 AND PSEUDOMIX[ZIPMIX] GEQ 32 THEN 20602470
PSEUDOMIX[ZIPMIX] ELSE 20602480
IF UNITNO GEQ 32 THEN UNITNO ELSE 20602490
$ POP OMIT 20602491
0)&CARD[9:9:9]; 20602500
$ SET OMIT = NOT(PACKETS) 20602509
IF UNITNO GEQ 32 THEN 20602510
IF PKTONLY THEN %124-20602515
IF PSEUDO[UNITNO-32]=0 THEN 20602520
PRINTTHECOVER(CARDLOC&CARD[9:9:9],UNITNO,PSOURCE); 20602530
LASTSCAN:=0&1[2:47:1]; 20602540
$ POP OMIT 20602541
COMMENT SCAN FOR CARD WITH QUESTION MARK IN COL. 1;% 20602550
CC: IF SCAN NEQ QUEST THEN GO TO INCSC;% 20602650
T:=SCAN; 20602700
CCTYPE: IF (T LSS UNLOCKV) OR (T GTR RESETV) THEN 20602800
GO TO INCSC;% 20602850
PPCPROCESS:=0;% %173-20602855
PROCVAL:=0; %128-20602860
IF CARD.[9:9] NEQ 0 THEN% 20602900
$ SET OMIT = NOT(DATACOM AND RJE ) 20602909
IF CCFIND THEN GO TO INCSC; 20602950
IF (T LEQ LOAD AND (T GEQ RUNV) THEN 20603000
BEGIN % 20603050
M[CARDLOC - 2] := 0;% 20603100
M[CARDLOC -1] :=10;% 20603150
CMM[6]:= GETESPDISK & 10[18:33:15];% 20603200
$ SET OMIT = NOT(DATACOM AND RJE ) 20603209
DISKWAIT(CARDLOC-2,11,CMM[6] INX 0); 20603250
END;% 20603350
$ SET OMIT = NOT(PACKETS) 20603359
LISTHECARD; 20603360
$ POP OMIT 20603361
% WRITE OUT CONTROL CARD FOR LOGGING ROUTINE% 20603400
% BRANCH ON 1ST WORD ON CONTROL CARD% 20603450
LIBNO:=0; 20603500
TOG:= FALSE; 20603550
IF UNITNO GEQ 32 THEN %780-20603560
IF T=PACKET OR T=USER THEN ELSE %780-20603565
IF (USERID.[1:1] AND USERID ! MCP) THEN %780-20603570
BEGIN USERID ~ "U000000"; %780-20603575
UNITCODE[UNIT-23] ~ USERID %780-20603580
END; %780-20603590
GO TO TYPE[T-UNLOCKV]; 20603600
% COMPILER CALL OUT CARD% 20603700
COMPILE: IF CCCOMPILE THEN GO INCSC; 20603750
INITIALIZATION: OPTNN:=INITIALIZEIT; GO DOWN; 20603900
BEFORETRYNEXT: IF OPTN=PERIO THEN GO TO CONTROLLER; 20604050
TRYNEXT: IF KOUNT=@14 THEN 20604100
IF SOURCE=(CARDLOC&1[30:45:3]) THEN 20604105
BEGIN 20604110
PPCPROCESS:=1; T:=SCAN; GO CONTROLA; 20604115
END; 20604120
IF SCAN NEQ PERIO THEN GO TRYNEXT; 20604125
CONTROLER: PPCPROCESS:= 1; 20604150
IF SCAN NEQ QUEST THEN GO TO INCSC; 20604200
T:= SCAN; 20604250
CONTROLA: IF (T < FILEV OR T > COBOL) AND ACCUM[0] ! CMPLR THEN %527-20604300
IF T GEQ UNLOCKV AND T LEQ RESETV THEN %527-20604350
GO TO FINIS ELSE GO TO INCSC; 20604360
IF CARD.[9:9] NEQ 0 THEN 20604400
$ SET OMIT = NOT(DATACOM AND RJE ) 20604409
IF CCFIND THEN GO TO INCSC; 20604450
$ SET OMIT = NOT(PACKETS) 20604479
LISTHECARD; 20604480
$ POP OMIT 20604481
IF T GEQ ALGOL OR ACCUM[0]=CMPLR THEN 20604500
IF OPTN=EXECU OR OPTN=RUNV THEN 20604550
GO TO TRYNEXT 20604600
ELSE GO TO COMPILEJOB; 20604650
IF OPTN=SYNTA THEN GO TO TRYNEXT; 20604700
IF OPTN=EXECU OR OPTN=RUNV THEN GO TO COMJOB; 20604750
% CALL RPC FOR COMPILE AND GO JOB% 20604800
IF PPC(PADDR,PEQN,PROG,PDEX,T,UNITNO,CARDLOC,SOURCE,ACCUM, 20604850
LASTSCAN,DIRECT) THEN GO TO INCSC; 20604900
GO TO CONTROLER; 20604950
COMPILEJOB: T:=SCAN; 20605000
COMJOB: IF PPC(CADDR,CEQN,CMM,CDEX,T,UNITNO,CARDLOC,SOURCE,ACCUM, 20605050
LASTSCAN,DIRECT) THEN GO TO INCSC; 20605100
GO TO CONTOLER; 20605150
COMMENT EXECUTE CARD;% 20605250
EXEC: P(EXECU); 20605300
EXRUN: OPTN:=P; 20605320
CMM[13]:=CADDR:=CDEX:=0; 20605340
T:=SCAN; CMM[0]:=ACCUM[0]; 20605360
T:=SCAN; T:=SCAN; 20605380
IF ((CMM[1]:=ACCUM[0]) EQV "DISK ") ! NOT 0 THEN T := 0 20605400
ELSE IF ((T := CMM[0]) EQV "LIBMAIN") = NOT 0 THEN 20605405
IF UNITNO ! 31 20605410
$ SET OMIT = NOT(DATACOM AND RJE) 20605415
THEN GO TO INCSC ELSE T := LIBMAINCODE 20605430
ELSE IF (T EQV "PRNPBT ") = NOT 0 THEN 20605435
IF UNITNO ! 31 20605440
$ SET OMIT = NOT(DATACOM AND RJE) 20605445
THEN GO TO INCSC ELSE T := PRNPBTCODE 20605460
ELSE IF (T EQV "LDCNTRL") = NOT 0 THEN T := LDCNTRLCODE 20605465
ELSE T := 0; 20605470
CMM[2] := 0 & (IF OPTN=RUNV THEN 5 ELSE 2)[8:38:10] & T[5:45:3]; 20605480
CMM[23]:=0&CARD[9:9:9]&( 20605500
$ SET OMIT = NOT(PACKETS) 20605509
IF ZIPMIX!0 THEN PSEUDOMIX[ZIPMIX] ELSE 20605510
$ POP OMIT 20605511
UNITNO)[2:42:6]; 20605520
GO TO INITIALIZATION; 20605550
RUN: P(RUNV); 20605600
GO TO EXRUN; 20605650
USERS: IF(T:=SCAN)!EQUAL THEN GO INCSC; %133-20605700
IF(T:=SCAN)=PERIO THEN GO INCSC; %133-20605702
IF (USERID.[1:1] AND USERID!MCP) 20605750
$ SET OMIT = NOT(DATACOM AND RJE ) 20605759
THEN BEGIN 20605800
USERID:=ACCUM[0]; 20605810
$ SET OMIT = NOT(PACKETS) 20605819
IF UNITNO GEQ 32 THEN UNITCODE[UNITNO-23]:=USERID; 20605820
$ POP OMIT 20605821
END; 20605830
CCC: %COME HERE TO FLUSH TO NEXT INITIAL WORD 20605870
$ SET OMIT = NOT(PACKETS) 20605879
DO T:=SCAN UNTIL T=QUEST;T:=SCAN; 20605880
$ POP OMIT 20605881
$ SET OMIT = PACKETS 20605899
GO TO CCTYPE; 20606000
USES: OPTNN:=0; OPTNN:=CCSECMAINT; GO DOWN; 20606050
SECBOMB: OPTNN:=1; OPTNN:=CCSECMAINT; GO DOWN; 20606100
UNLOX: 20606150
LOX: 20606200
FREES: 20606250
OPENS: 20606300
OPTNN:=2; OPTNN:=CCSECMAINT; GO DOWN; 20606350
ENTE:: 20606400
LCOPY: 20606450
CHANGE: 20606500
REMOVE: 20606550
OPTNN:=CCLIB; 20606600
DOWN: GO TO SW[OPTNN]; 20606610
SET: TOG:= TRUE; 20606650
RSET: IF CCSET THEN GO CC ELSE GO INCSC; 20606700
UNIT: OPTNN:=CCUNIT; GO DOWN; 20606800
INCSC: 20606850
IF PCPROCESS THEN 20606860
P(DIRECTORYSEARCH(-CMM[0],IF CMM[0] LSS 0 THEN "DISK " ELSE 20606865
CMM[1], 13),DEL); 20606870
$ SET OMIT = NOT(PACKETS) 20606874
LISTHECARD; 20606875
$ POP OMIT 20606876
IF UNITNO}32 THEN CIDROW[UNITNO-32].[3:5]:=0 ELSE% %173-20606900
IF UNITNO=23 THEN READERA.[FF]:=0 ELSE% %173-20606910
IF UNITNO=24 THEN READERB.[FF]:=0;% %173-20606920
LASTSCAN := 0; 20607000
STREAM(CARDLOC, U:=TINU[UNITNO], ACCUM, MIX:=ZIPMIX, 20607020
ZZP:=UNITNO=31, CRD:=SPOUTUNIT.[CF]=0, 20607040
D:=T:=SPACE(15)); 20607060
BEGIN 20607080
DS:=20LIT"#CONTROL CARD ERROR "; 20607100
SI:=LOC U; SI:=SI+5; DS:=3 CHR; 20607120
ZZP(DI:=DI-22; DS:=24LIT"ZIP ERROR, IGNORED, MIX="; 20607140
SI:=LOC MIX; DS:=2 DEC; DS:=LIT":"; 20607160
D:=DI; DI:=DI-3; DS:=FILL; DI:=D); 20607180
DS:=4LIT" AT "; 20607200
SI:=ACCUM; SI:=SI+1; 20607220
7(IF SC=" " THEN SI:=SI+1 ELSE DS:=CHR); 20607240
CRD(DS:=LIT":"; SI:=CARDLOC; 2(DS:=36 CHR)); 20607260
DS:=LIT"~"; 20607280
END; 20607300
IF UNITNO!25 THEN 20607500
BEGIN 20607550
SPOUTER(T&CARD[9:9:9],SPOUTUNIT,1); 20607600
IF UNITNO=30 OR UNITNO=31 THEN GO ZIPEXIT; 20607700
IF UNITNO GEQ 32 THEN GO ENDECK; 20607750
END ELSE 20607800
BEGIN P(WAITIO(T,0,25),DEL); 20608000
FORGETSPACE(T); 20608050
$ SET OMIT = PACKETS 20608059
$ SET OMIT = NOT(PACKETS) 20608069
FETCH(UNITNO,CARDLOC,SOURCE); 20608070
IF SCAN NEQ QUEST THEN GO TO INCSC; 20608072
T:=SCAN; 20608074
IF PPCPROCESS THEN GO TO CONTROLA; 20608076
IF (T}PACKET) AND (T{RESETV) AND (T!RUNV) THEN %527-20608078
GO TO CCTYPE; GO TO INCSC; 20608080
$ POP OMIT 20608081
END; 20608100
$ SET OMIT = NOT(PACKETS) 20608109
ENDECK: 20608110
IF ZIPMIX NEQ 0 THEN %147-20608112
IF (T:=PSEUDOMIX[ZIPMIX]) GEQ 32 THEN %147-20608114
PACKETERR[T-32]:=TRUE; %147-20608116
IF UNITNO GEQ 32 THEN 20608120
BEGIN ABORT:=TRUE; 20608130
PACKETERR[UNITNO-32]:=TRUE; 20608140
GO TO PACK2; 20608142
END; 20608144
$ POP OMIT 20608146
DO DO 20608150
FETCH(-UNITNO,CRDLOC,SOURCE) 20608200
UNTIL SCAN=QUEST 20608250
UNTIL SCAN=ENDFI; 20608300
ENDF:: 20608450
$ SET OMIT = NOT(PACKETS) 20608459
IF UNITNO LSS 32 THEN 20608460
$ POP OMIT 20608461
IF UNITNO NEQ 30 THEN UNITCODE[UNITNO-23]:=0; 20608500
IF UNITNO=23 THEN READERA:=0 ELSE 20608510
IF UNITNO=24 THEN READERB:=0 ELSE 20608520
IF UNITNO GEQ 25 THEN 20608550
IF UNITNO GEQ 32 THEN 20608600
PACK2:: %PACKET CARDS END HERE FROM PSEUDO-READERS 20608610
IF CIDTABLE[UNITNO-32,3] LSS CIDTABLE[UNITNO-32,7]THEN 20608650
BEGIN FETCH(-UNITNO,CARDLOC,SOURCE); 20608700
$ SET OMIT = NOT(PACKETS) 20608709
IF ABORT THEN 20608710
BEGIN 20608720
IF (T:=SCAN)=QUEST THEN 20608730
IF (T:=SCAN) = ENDFI THEN %129-20608740
ABORT:=FALSE; 20608750
GO TO PACK2; %129-20608760
END ELSE T:=0; 20608770
LASTSCAN:=0&1[2:47:1]; 20608780
PACKETERR(UNITNO-32]:=FALSE; 20608790
$ POP OMIT 20608801
GO CC; 20608810
END ELSE 20608820
BEGIN 20608830
$ SET OMIT = NOT(PACKETS) 20608839
LABELTABLE[UNITNO]:=@114; 20608840
IF PACKETACT[UNITNO-32]=D THEN 20608850
$ POP OMIT 20608851
$ SET OMIT = PACKETS 20608859
ENDOFDECK((UNITNO-32),SPOUTUNIT&CARD[1:1:1]); 20608870
GO ZIPEXIT; 20608880
END ELSE 20608890
GO ZIPEXIT; 20608900
IF(TWO(UNITNO) AND SAVEWORD) NEQ 0 THEN GO TO SAVENO; 20608950
IF WAITIO(CARDLOC&400[18:33:15],@15,UNITNO).[45:3] NEQ 0 THEN20609000
BEGIN 20609050
SAVEND: LABELTABLE[UNITNO]:= @114; 20609100
RRRMECH:= NOT (NT1:= TWO(UNITNO)) AND RRRMECH OR 20609150
NT1 AND SAVEWORD; 20609200
GO TO ZIPEXIT; 20609250
END; 20609300
M[(SOURCE:= CARDLOC)+9]:= 0&"."[1:43:5]; 20609350
USERID:= UNITCODE[UNITNO-23]; 20609400
GO TO CC; 20609410
PACK: IF UNITNO<32 THEN GO INCSC; 20609420
$ SET OMIT = NOT(PACKETS) %124-20609425
IF PSEUDO[UNITNO-32] = 0 THEN %124-20609430
PRINTTHECOVER(CARDLOC,UNITNO,PSOURCE); %124-20609435
IF PSOURCE = 3 THEN USERID ~USERID &1[1:47:1]; %782-20609436
$ POP OMIT %124-20609440
GO PACK2; 20609450
LABE: OPTNN:=CCLABEL; GO DOWN; 20609500
WAIT: 20609555
$ SET OMIT = NOT(PACKETS) 20609559
IF UNITNO<32 THEN GO TO CCC; 20609560
IF PACKETACT[UNITNO-32]=0 THEN GO TO CCC; 20609570
LABELTABLE[UNITNO]:=@214; GO TO ZIPEXIT; 20609580
$ POP OMIT 20609581
FINIS:: CCFINISH; 20609600
$ SET OMIT = NOT(PACKETS) 20609659
IF (NT1~IF ZIPMIX!0 THEN PSEUDOMIX[ZIPMIX] ELSE UNITNO) 20609660
GEQ 32 THEN PACKETACT[NT1-32]:=PACKETACT[NT1-32]+1; 20609670
$ POP OMIT 20609671
SELECTION; 20609700
IF UNITNO NEQ 31 THEN 20609750
BEGIN 20609760
$ SET OMIT = PACKETS 20609799
GO CCTYPE; 20610100
END; 20610150
ZIPEXIT: FORGETSPACE(CARDLOC-2); 20610200
EXIT:: 20610250
$ SET OMIT = NOT(PACKETS) 20610259
IF ZIPMIX NEQ 0 THEN NYLONZIPPER[ZIPMIX].[2:1]:=1; 20610260
$ POP OMIT 20610261
FORGETSPACE(ACCUM INX 0);% 20610300
FORGETSPACE(CMM INX 0);% 20610350
IF (CCTBLWORD:=P(CCTBLWORD,DUP)&(P.[FF]-1)[CTF]).[FF]=0 THEN 20610400
BEGIN 20610410
FORGETSPACE(CCTBLADDR); 20610420
CCTBLADDR:=0; 20610430
END; 20610440
IF UNITNO GEQ 32 AND UNITNO LEQ 63 THEN 20610500
PSEUDOCOPY:= PSEUDOCOPY - 1; 20610550
KILL([MSCW]); 20610600
END CONTROLCARD; 20610650
REAL PROCEDURE CCSET; 20700000
BEGIN LABEL MORE,SEEK,SKIP,CCERR,L1,L2; 20701000
DECLARECCVARIABLES; 20701500
REAL FXTOG = RETURNVAL+1, % BEGIN LOCALS OF CCSET 20702000
LOK = FXTOG+1, 20702100
N = LOK+1, 20703000
SENSETOG = N+1; 20704000
BOOLEAN FT=N; DEFINE FH(FH1)=M[T+FH1]#; % RESET FILE A/B %815-20704100
SUBROUTINE CLEARTHEFILE; % CLEAR AN IN-USE FILE %815-20704200
BEGIN %815-20704210
FH[4].[01:06]~0; % EXCLUSIVE %815-20704220
FH[4].[16:20]~0; % OPEN COUNT 2 %815-20704230
FH[9].[01:28]~0; % TOGS & OPEN COUNT 1 %815-20704240
DISKWAIT(T.[CF],30,T.[FF]); % FIX IT %815-20704250
FILEHOLD(CMM[2],CMM[3],0,T,0); % MAKE UP WAITING PROCESSES %815-20704260
LBMESS(CMM[2],CMM[3],11,26,0,SPOUTUNIT,1); %815-20704270
END CLEARTHEFILE; %815-20704280
REAL SUBROUTINE SCAN; 20705000
SCAN~SCN(UNITNO,CARDLOC,SOURCE,ACCUM,KOUNT,LASTSCAN,DIRECT); 20706000
P(RCW,MYMSCW,STF); 20707000
RCW:=RCW & P(XCH)[CTC]; 20708000
P(0,0,0,0); % ZERO LOCALS OF CCSET 20709000
CCSET~0; %510-20711100
IF NOT (FXTOG:=(CN:=SCAN)=FIXED) THEN 20712000
IF NOT (SENSETOG:=(CN=SENSE)) THEN 20713000
IF CN!ACCESS0 THEN %815-20714000
IF NOT (FT~FXTOG~(CN=FILEV)) THEN GO TO CCERR; %815-20714500
MORE: 20715000
IF (CN:=SCAN)=EQUAL THEN CMM[0]:=-1 ELSE 20716000
IF CN GEQ IDENT THEN CMM[0]:=ACCUM[0] ELSE GO CCERR; 20717000
IF SCAN NEQ SLASH THEN GO TO CCERR; 20718000
IF (CN:=SCAN)=EQUAL THEN CMM[1]:=-1 ELSE 20719000
IF CN GEQ IDENT THEN CMM[1]:=ACCUM[0] ELSE 20720000
GO TO CCERR; 20721000
CN:=T:=0; 20722000
SEEK: 20723000
IF (CMM[0] OR CMM[1]) LSS 0 THEN 20724000
SEEKNAM(CMM[0],CMM[1],CN,CMM[2],CMM[3],N,P(0)) ELSE 20725000
BEGIN CN:=1; CMM[2]:=CMM[0]; CMM[3]:=CMM[1] END; 20726000
IF CN NEQ 0 THEN 20727000
BEGIN 20728000
IF NOT FXTOG THEN IF SYSTEMFILE(CMM[2],CMM[3]) THEN 20729000
BEGIN T~2; GO TO L1; END; %521-20730000
T:=DIRECTORYSEARCH(CMM[2],CMM[3],19); 20731000
END ELSE IF N=0 THEN BEGIN CMM[2]:=CMM[0]; CMM[3]:=CMM[1]; GO L1; 20732000
END 20733000
ELSE GO L2; 20734000
SKIP: 20735000
IF T GEQ 64 THEN 20736000
BEGIN 20737000
IF M[T+4].[43:2]=3 THEN 20738000
BEGIN FORGETSPACE(T); T~1; GO SKIP; END; %521-20739000
IF (USERID EQV MCP)= NOT 0 OR 20740000
(USERID EQV ABS(M[T+2]))= NOT 0 OR 20741000
(NOT SENSETOG AND (M[T+2]=0)) THEN 20742000
BEGIN 20743000
LOK:=0; 20744000
IF FXTOG 20745000
THEN M[T+4].[42:1]:=TOG 20746000
ELSE IF SENSETOG 20747000
THEN IF LOK:=((M[T+4].[43:2]=1) AND NOT TOG) 20748000
THEN M[T+4].[43:2]:=0 20749000
ELSE IF M[T+4].[43:2]=1 20750000
THEN ELSE M[T+4].[43:2]:=TOG|2 20751000
ELSE BEGIN 20752000
M[T+4].[11:1]:=TOG; 20753000
IF TOG THEN % %503-20753800
BEGIN % %503-20753900
STREAM(DATE,J:=5); 20754000
BEGIN SI:=LOC DATE; DS:=8OCT; END; 20755000
M[T+3].[12:18]:=JUNK; 20756000
END; % %503-20756100
END; 20757000
DISKWAIT(T.[CF],-30,T.[FF]); 20758000
$ SET OMIT = SHAREDISK 20759000
UNLOCKDIRECTORY; 20760000
$ POP OMIT 20761000
$ SET OMIT = PACKETS 20762000
IF LOK THEN P(DIRECTORYSEARCH(-CMM[2],CMM[3],6),DEL) 20765000
ELSE LBMESS(CMM[2],CMM[3],IF TOG THEN 12 ELSE 11, 20766000
13+(SENSETOG|47)-(FXTOG|3),0,SPOUTUNIT,RSTOG) 20767000
END ELSE IF FT THEN CLEARTHEFILE ELSE BEGIN %815-20769000
$ SET OMIT = SHAREDISK %521-20769100
UNLOCKDIRECTORY; %521-20769200
$ POP OMIT %521-20769300
LBMESS(CMM[2],CMM[3],-(11+TOG),41,0,SPOUTUNIT,1); %521-20769400
END; %521-20769500
FORGETSPACE(T); %521-20769600
END 20770000
ELSE BEGIN %521-20771000
$ SET OMIT = SHAREDISK %521-20771010
UNLOCKDIRECTORY; %521-20771020
$ POP OMIT %521-20771030
L1: LBMESS(CMM[2],CMM[3],-(11+TOG),15+((T=1)|30)+((T=2)|10),20771100
0, SPOUTUNIT, 1 ); % 20772000
END; %521-20772050
IF CN NEQ 0 AND (CMM[0] OR CMM[1]) LSS 0 THEN GO SEEK; 20779000
L2: IF (CN:=SCAN)=COMMA THEN GO MORE; 20780000
IF CN=PERIO THEN CCSET:=1; 20781000
CCERR: RETURNVAL:=PROCVAL; % ADJUST RESULT OF TYPED PROC 20782000
P([RETURNRCW],STS,0,RDS,0,XCH,P&P[CTF],STF); 20783000
END CCSET; 20784000
$ SET OMIT = NOT(DATACOM ) 20999999
REAL SECONDCTR; 22000000
$ SET OMIT = NOT(SHAREDISK) 22000499
PROCEDURE NSECOND;% 22001000
BEGIN REAL RCW=+0, I=RCW+1, X=I+1, J=X+1; 22002000
REAL MSCW=-2; 22002500
ARRAY A=J+1[*]; 22003000
$ SET OMIT = NOT SHAREDISK 22003990
P(0,0,0,0); 22006000
$ SET OMIT = NOT SHAREDISK 22006090
IF (J:=TOGLE.MEMNO)!0 THEN 22007000
TOGLE.MEMNO:=IF J THEN 6 ELSE J-2; 22007100
A ~ [M[SPACE(3|MIXMAX+3)]]&90[8:38:10]; 22008000
$ SET OMIT = NOT(DCLOG AND DATACOM ) 22008049
SLEEP([TOGLE],ABORTMASK); 22009000
LOCKTOG(ABORTMASK); 22010000
HALT; IDLETIME;% 22011000
J:=NEUP.NEUF ; 22011100
$ SET OMIT = NOT(SHAREDISK ) 22011190
FOR I:=J-1 STEP -1 UNTIL 0 DO 22011300
BEGIN 22011400
EUIO[I+EUIOFFSET]:=*P(DUP)|EUTAPER+PEUIO[I]; 22011500
PEUIO[I]:=0; 22011600
END; 22011700
$ SET OMIT = NOT(SHAREDISK ) 22011790
WHILE (J:=XCLOCK+P(RTR)) GEQ WITCHINGHOUR DO MIDNIGHT; 22012000
CHANGEDATE(0); 22012500
A[0]~J; A[2]~"ABORT";J~0; 22013000
A[1] ~ DATE;% 22014000
IF (CLOCK AND @17777)=0 THEN 22014100
BEGIN FOR I:=1 STEP 1 UNTIL MIXMAX DO 22014400
IF *[JARROW[I]] NEQ 0 THEN 22014500
IF REPLY[I] LSS 0 THEN % WAITING FOR SOMETHING 22014600
$ SET OMIT = NOT(WORKSET) 22014610
IF (WKSETSTOPJOBS AND TWO(I))=0 THEN % NOT AUTO-ST22014620
$ POP OMIT % WORKSET 22014630
REPLY[I]:=VWY; 22014640
END; 22014900
FOR I ~ 1 STEP 1 UNTIL MIXMAX DO% 22015000
BEGIN J ~ J+3;% 22016000
IF JARROW[I] ! 0 THEN% 22017000
BEGIN A[J] ~ JAR[I,3]+PROCTIME[I]; 22018000
NT1 ~ IOTIME[I]+JAR[I,4];% 22019000
WHILE NT1 < 0 DO NT1~NT1+CLOCK+P(RTR);22020000
A[J+1] ~ NT1;% 22021000
A[J+2] ~ JAR[I,7];% 22022000
IF PROCTIME[I]>0 THEN 22023500
TERMINATE(I&15[18:33:15]) ELSE 22024000
IF A[J+1]> JAR[I,4] THEN 22024500
TERMINATE(I&83[18:33:15]); 22025000
END% 22026000
ELSE A[J] ~ A[J+1] ~ A[J+2] ~ 0;% 22027000
END;% 22028000
DISKIO(J,A INX 0-1,3|MIXMAX+3,ESPDISKTOP+1); 22029000
UNLOCKTOG(ABORTMASK); 22030000
$ SET OMIT = NOT(DCLOG AND DATACOM ) 22030099
NOPROCESSTOG ~ NOPROCESSTOG-1;% 22031000
FOR I ~ 20 STEP 1 UNTIL 21 DO% 22032000
BEGIN IF NOT UNIT[I].[16:1] THEN% 22033000
UNIT[I].[17:1] ~ 0;% 22034000
STARTIO(I);% 22035000
END;% 22036000
$ SET OMIT = NOT(DFX) 22036999
IF TERMINALCLOCK ! 0 THEN% 22039000
IF CLOCK-TERMINALCLOCK > 512 THEN % 22040000
BEGIN 22040500
FOR I ~ 0 STEP 2 UNTIL JOBNUM DO% 22041000
IF PRTROW[X:=BED[I].[3:5]].[PSF]=1 THEN 22042000
IF JAR[X,9].SYSJOBF ! LIBMAINCODE THEN 22042100
BEGIN BED[I] ~ BED[JOBNUM];% 22043000
BED[I+1] ~ BED[JOBNUM+1];% 22044000
INDEPENDENTRUNNER(P(.RUN),X,0); 22045000
I ~ JOBNUM ~ JOBNUM-2;% 22046000
END;% 22048000
TERMINALCLOCK:=0; 22048200
END; 22048400
SLEEP([J],IOMASK);% 22049000
FORGETSPACE(A);% 22050000
$ SET OMIT = NOT(STATISTICS) 22050909
$ SET OMIT = NOT(SHAREDISK) 22050999
NSECONDREADY:=TRUE; 22053700
SECONDCTR:=0; 22053800
KILL([MSCW]); 22053900
END;% 22054000
PROCEDURE STATUS;% 22055000
BEGIN REAL U=+1,% 22056000
MSCW=-2, 22056500
T=U+1,% 22057000
T1=T+1;% 22058000
INTEGER 22059000
I=T1+1;% 22060000
ARRAY AREA=I+1[*];% 22061000
REAL HDR = AREA+1, 22061100
SEG0= HDR + 1, 22061110
F = SEG0+1; 22061120
ARRAY SEAT = F+1[*]; 22061130
LABEL TRYAGAIN,LDCNTRL,DISK; 22061200
LABEL L,EL,NOTREADY,DIE,ACCEPT,SCRATCH,INPUT,TESTBACKUP, 22062000
COMMON; 22063000
LABEL CARD,PRINTER,TAPE,DRUM,DISC,SPO,PUNCH,UNLD, 22064000
PAPERPUNCH,PAPER,DATACOM; 22064500
SWITCH S := CARD,PRINTER,TAPE,DRUM,DISC,SPO,PUNCH,UNLD, 22065000
PAPERPUNCH,PAPER,DATACOM;% 22066000
REAL RCW=+0;% 22067000
SUBROUTINE SPACEA;% 22068000
BEGIN AREA ~ (SPACE(12) INX MEMORY)&10[8:38:10] END;% 22069000
SUBROUTINE AUTOLOADER; 22069010
BEGIN 22069020
TRYAGAIN: 22069025
IF (HDR:=DIRECTORYSEARCH(P(LDCNTRL),P(DISK),3)) ! 0 THEN 22069030
BEGIN 22069040
SHEAT := [M[F:=TYPEDSPACE(31,SHEETAREAV))] & 30[8:38:10];%%167-22069050
STREAM(S:=F-1, D:=F); % ZERO OUT THE SHEAT ENTRY 22069060
BEGIN 22069070
SI:=S; DS:=30 WDS; 22069080
END; 22069090
SEG0 := TYPEDSPACE(30,SEGZEROAREAV);% %167-22069100
DISKWAIT(-SEG0, 30, M[HDR INX 10]); 22069110
F.[FF] := HDR; % CORE ADDRESS OF HEADER IN [FF] OF PARAM. 22069120
SHEAT[7] := SEG0; % CORE ADRS.OF SEGMENT ZERO IN SHETA[7] 22069130
SHEAT[0] := P(LDCNTRL); 22069140
SHEAT[1] := P(DISK); 22069150
SHEAT[2] := 0 & 1[4:47:1] & LDCNTRLCODE[5:45:3] & 2[8:38:10]; 22069160
% [4:1] IN SHEET[2] MEANS SUPRESS BOJ/EOJ MESSAGES 22069170
SHEAT[16] := SHEAT[17] := @377777777777; % TIME LIMITS 22069180
SHEAT[19] := U; % COMMON VALUE 22069190
SHEAT[20] := 4; % CORE ESTIMATE 22069200
SHEAT[21] := 150; % STACK SIZE 22069210
SHEAT[24] := MCP; %131-22069212
22069220
STREAM(A:=0 : S := P(.SCHEDULEIDS)); 22069230
BEGIN 22069240
SI:=S; 22069250
47(SKIP SB; SKIP DB; TALLY:=TALLY+1; 22069260
IF SB THEN ELSE JUMP OUT); 22069270
DS:=SET; A:=TALLY; 22069280
END STREAM STATEMENT; 22069290
22069300
I := P; 22069310
SHEAT[3].[8:10] := 1; % SCHEDULE NUMBER 22069320
SHEAT[23] := (CLOCK + P(RTR)) DIV 60; 22069330
SHEAT[25] := HDR.[FF]; % DISK ADDRESS OF FILE HEADER 22069340
STREAM(U, I:=I:=SPACE(11)); 22069350
BEGIN 22069360
DI:=DI+16; 22069370
DS:=31LIT"CC EXECUTE LDCNTRL/DISK;COMMON="; 22069380
SI:=LOC U; DS:=8DEC; 22069390
DS:=6LIT";END.~"; 22069400
END STREAM STATEMENT; 22069410
M[I] := 0; M[I+1]:=10; 22069420
SHEAT[6] := GETESPDISK & 10[18:33:15]; 22069430
DISKWAIT(I, 11, SHEAT[6].[CF]); 22069440
FORGETSPACE(I); 22069450
MULTITABLE[U] := "CONTROL"; 22069460
LABELTABLE[U] := (-"DECK "); 22069470
RDCTABLE[U] := 1 & 1[14:38:10]; 22069480
IF U THEN READERA:=0 ELSE READERB:=0; 22069490
INDEPENDENTRUNNER(P(.SELECTRUN),F,160); 22069500
END ELSE % IF IN DIRECTORY 22069510
BEGIN 22069520
ENTERSYSFILE(2); 22069530
GO TRYAGAIN; 22069540
LDCNTRL::: "LDCNTRL"; 22069550
DISK::: "DISK "; 22069560
END; 22069570
END SUBROUTINE AUTOLOADER; 22069600
P(0,0,0,0,0,0,0,0,0);% 22071000
SPACEA;% 22073000
WHILE (T ~ P(RRR) OR RRRMECH) ! READY DO% 22074000
BEGIN I ~ 0&TINU[U ~ (P(T EQV NOT READY,DUP,DUP,|,|)% 22075000
|@1000000000000).% 22076000
[3:6]][5:11:7]/@1000000000000;% 22077000
IF T < READY THEN% 22078000
BEGIN COMMENT SOMETHING WENT NOT READY;% 22079000
READY ~ READY AND NOT I;% 22080000
IF LABELTABLE[U] } 0 THEN% 22081000
BEGIN% 22082000
L: LABELTABLE[U] ~ @114;% 22083000
IF (U AND @774) NEQ 16 THEN 22084000
MULTITABLE[U]:=0; 22084500
END;% 22085000
EL: RRRMECH ~ RRRMECH AND NOT I;% 22086000
END OF NOT READY% 22087000
ELSE BEGIN COMMENT SOMETHING WENT READY;% 22088000
READY ~ READY OR I;% 22089000
UNIT[U].[13;1] ~ 0;% 22090000
IF LABELTABLE[U] ! @114 THEN% 22091000
BEGIN RRRMECH ~ RRRMECH OR I;% 22092000
IF LABELTABLE[U] = @214 THEN% 22093000
BEGIN I ~ I AND NOT SAVEWORD;% 22094000
GO TO L;% 22095000
END;% 22096000
STARTIO(U);% 22097000
GO TO COMMON;% 22098000
END;% 22099000
IF (U AND @774) NEQ 16 THEN 22100000
MULTITABLE[U]:=RDCTABLE[U]:=0; 22100500
IF (I AND SAVEWORD) ! 0 THEN% 22101000
BEGIN RRRMECH ~ I AND SAVEWORD OR RRRMECH; 22102000
GO TO COMMON;% 22103000
END;% 22104000
GO S[UNIT[U].[1:4]];% 22105000
TAPE: P(WAITIO(@4200000000,5,U),DEL);% 22106000
IF (T ~ WAITIO(AREA INX @120540000000,@7500045,U),% 22107000
[45:3] ! 0 THEN% 22108000
NOTREADY: BEGIN READY ~ READY AND NOT I;% 22109000
GO TO L;% 22110000
END;% 22111000
IF MOD3IOS AND NOT T.[42:1] THEN BEGIN %AI22111500
DO UNTIL (T1~WAITIO(AREA INX @340000012,@75,U))!0; 22112000
IF T1.[43:2]!0 THEN T1~WAITIO(@4200000000,5,U); %697-22112100
END ELSE T1~WAITIO(@4200000000,5,U); %AI22112500
IF T1.[45:3]!0 THEN GO TO NOTREADY; %AI22113000
DO UNTIL NOT (T1~WAITIO(@500000000,@165,U)) OR 22114000
(TRANSACTION[U]~0);% 22115000
IF T1.[42:1] THEN 22115020
BEGIN; STREAM(T~TINU[U],A~AREA); 22115030
BEGIN SI~LOC T; SI~SI+5; DS~LIT"#"; 22115040
DS~3 CHR; DS~10 LIT "-BAD LOAD~"; 22115050
END; 22115060
SPOUT(AREA INX 0); SPACEA; GO TO L; 22115070
END; 22115075
IF T1.[45:1] THEN GO TO NOTREADY;% 22116000
PRNTABLE[U]~0&(NOT T1)[1:43:1];% 22117000
IF T.[43:1] THEN% 22118000
BEGIN;STREAM(T~TINU[U],AREA);% 22119000
BEGIN SI ~ LOC T; SI ~ SI+5;% 22120000
DS ~ LIT "#"; DS ~ 3 CHR;% 22121000
DS ~ 14 LIT " PARITY, RW/L~"% 22122000
END;% 22123000
DIE: SPOUT(AREA INX 0); SPACEA; 22124000
LABELTABLE[U] ~ @314;% 22125000
GO TO FL;% 22126000
END;% 22127000
IF T.[42:1] THEN% 22128000
BEGIN;STREAM(T~TINU[U],AREA);% 22129000
BEGIN SI ~ LOC T; SI ~ SI+5;% 22130000
DS ~ LIT "#"; DS ~ 3 CHR;% 22131000
DS ~ 15 LIT " TAPE MK, RW/L~";% 22132000
END;# 22133000
GO TO DIE;% 22134000
END;% 22135000
STREAM(Y~0:AREA,X~[T]);% 22136000
BEGIN DS ~ 8 LIT " LABEL ";% 22137000
SI ~ AREA; DI ~ DI-8;% 22138000
IF 8 SC = DC THEN TALLY ~ 1;% 22139000
AREA ~ TALLY;% 22140000
SI ~ SI+45; DI ~ LOC Y; DS ~ 5 OCT;% 22141000
SI ~ LOC AREA; DI ~ X; DS ~ WDS;% 22142000
END;% 22143000
NT1 ~ P;% 22144000
IF T THEN PRNTABLE[U].[30:18]:=NT1 ELSE 22145000
BEGIN STREAM(Y:=0:AREA,X:=[T]); 22145050
BEGIN DS:=4 LIT "VOL1"; 22145100
SI:=AREA; DI:=DI-4; 22145150
IF 4 SC=DC THEN TALLY:=1; 22145200
AREA:=TALLY; SI:=SI+1; 22145250
DI:=LOC Y; DS:=5 OCT; 22145300
SI:=LOC AREA; DI:=X; DS:=WDS; 22145350
END; 22145400
NT1:=P; 22145450
IF T THEN BEGIN 22145500
PRNTABLE[U]:=(*P(DUP))&NT1[30:30:18] OR M;22145525
USASITAPE([AREA].[CF],T,1,U,1); 22145550
END; 22145600
END; 22145650
IF NOT T1.[43:1] THEN% 22146000
BEGIN IF T THEN% 22147000
BEGIN 22148000
IF P(AREA[1],DUP)="PBTMCP " OR 22156000
P(XCH)="PUTMCP " THEN GO INPUT; 22156100
IF AREA[4].[12:30] > DATE THEN% 22157000
BEGIN IF RETMSG THEN 22158000
STREAM(T~TINU[U],A~[AREA[6]]); 22159000
BEGIN SI~LOC T;SI~SI+5;DS~3 CHR;22160000
DS~5 LIT " RET "; 22161000
END ELSE GO TO INPUT; 22162000
ACCEPT: T1 ~ SPACE(4);% 22163000
STREAM(A~[AREA[1]],T1);% 22164000
BEGIN SI ~ A; SI ~ SI+40;% 22165000
DS ~ LIT "#";% 22166000
DS ~ 8 CHR; SI ~ A;% 22167000
2(DS ~ LIT " ";% 22168000
SI ~ SI+1; DS ~ 7 CHR);22169000
DS ~ LIT "~";% 22170000
END;% 22171000
SPOUT(T1);% 22172000
GO TO INPUT;% 22173000
END ELSE% 22174000
SCRATCH: LABELTABLE[U] ~ 0;% 22175000
END ELSE GO TO UNLD; 22176000
END% 22177000
ELSE IF T THEN BEGIN% 22178000
INPUT: LABELTABLE[U] ~ AREA[2];% 22179000
MULTITABLE[U] ~ AREA[1];% 22180000
STREAM(A~[AREA[3]],B~[T]);% 22181000
BEGIN SI ~ A; DS ~ 3 OCT;% 22182000
DS ~ 5 OCT; DS ~ 2 OCT% 22183000
END;% 22184000
RDCTABLE[U] ~ I&T1[24:31:17]&T[14:38:10];% 22185000
IF (MULTITABLE[U]="PBTMCP " OR 22188000
MULTITABLE[U]="PUTMCP ") AND 22188100
LABELTABLE[U] = "BACK-UP" THEN% 22189000
BEGIN LABELTABLE[U] ~ @322212342546447;% 22190000
STREAM(A~TINU[U],PN~MULTITABLE[U]="PUTMCP ", 22191000
AREA); 22191100
BEGIN SI ~ LOC A; SI ~ SI+5;% 22192000
PN(DS~3 LIT"#CP"; JUMP OUT TO L);22192100
DS~3 LIT"#LP"; L: 22192200
DS~12 LIT" BACK-UP ON "; 22193000
DS ~ 3 CHR; DS ~ LIT "~";% 22194000
END;% 22195000
SPOUT(AREA INX 0); SPACEA; 22196000
END;% 22197000
END ELSE% 22198000
PAPER:% 22199000
UNLD: LABELTABLE[U] ~ @314;% 22200000
GO TO COMMON;% 22201000
PRINTER:% 22202000
T ~ WAITIO(@6000000000,4,U).[45:1];% 22203000
UNIT[U].[16:2] ~ 0;% 22204000
IF T THEN GO TO NOTREADY;% 22205000
TESTBACKUP: 22205500
IF AUTOPRINT THEN 22206000
IF PRINTORPUNCHWAIT(-U,0) THEN GO TO COMMON; 22207000
GO TO SCRATCH; 22208000
CARD:% 22209000
RRRMECH:=RRRMECH OR I; 22209200
IF CDONLY THEN 22209400
BEGIN 22209500
AUTOLOADER; 22209600
GO TO COMMON; 22209700
END; 22209800
LABELTABLE[U]:=-@14; 22212200
INDEPENDENTRUNNER(P(.CONTROLCARD),0&U[3:43:5],192); 22212400
IF U}32 AND U{63 THEN PSEUDOCOPY~PSEUDOCOPY+1;% %541-22212450
GO TO COMMON;% 22213000
PUNCH: 22213500
STARTIO(U); 22213600
IF UNIT[U].[15:3]=0 THEN GO TESTBACKUP ELSE GO TO SCRATCH;22213700
DRUM:% 22214000
DISC: 22215000
SPO:% 22216000
PAPERPUNCH:% 22218000
DATACOM:% 22219000
STARTIO(U);% 22220000
GO TO SCRATCH;% 22221000
COMMON: END OF READY;% 22222000
END;% 22223000
STATUSBIT ~ TRUE;% 22224000
FORGETSPACE(AREA.[33:15]);% 22225000
KILL([MSCW]); 22226000
END STATUS;% 22227000
BOOLEAN PROCEDURE OLAY(LOC); % MADE SAVE IN INITIALIZE 22228000
VALUE LOC; REAL LOC;% 22229000
BEGIN REAL LINK, MOM, FRONT, BACK, CHAR, BS, STACK, S, SB,% 22230000
T, X, SESC, DISK, IOD, MIX, JOBKILLED, MIXUP, SEGNO;% 22231000
ARRAY NAME SEGDICT;% 22232000
REAL RESULT=+1;% 22233000
ARRAY SPRT[*]; 22234000
REAL CORE, CUED; REAL INITCW=MIXUP; 22235000
REAL TYPE13, RSLT, NOAUX; 22235500
$ SET OMIT = NOT(NEWLOGGING) 22235599
$ SET OMIT = NOT(WORKSET) 22235610
REAL MCPTEMP; 22235620
$ POP OMIT % WORKSET 22235621
LABEL EXIT; % ALL AVENUES MUST LEAD TO HERE 22235700
LABEL AROUND, CODE, BACKAGAIN, MCP, INTRINSIC;% 22236000
LABEL RETRY, AGAIN, FOG; 22236100
DEFINE TSKA = SPRT#; 22236150
BOOLEAN SUBROUTINE AWAKEN;% 22237000
BEGIN COMMENT AWAKEN CHECKS TO SEE IF WE HAVE HALTED 22238000
THE JOB ON PROCESSOR 2. IF SO, IT RESTARTS THE 22239000
TIMING FOR HIM, AND CALLS "HALT" TO CHECK INTERRUPTS;% 22240000
IF JOBKILLED THEN% 22241000
BEGIN 22242000
$ SET OMIT = NEWLOGGING 22242099
STARTLOG(P2MIX;); 22242100
$ POP OMIT 22242101
JOBKILLED ~ FALSE; OLAY ~ RESULT OR 2;% 22243000
HALT; NOPROCESSTOG ~ NOPROCESSTOG-1;% 22244000
END;% 22245000
AWAKEN ~ RESULT END;% 22246000
SUBROUTINE STOP;% 22247000
BEGIN COMMENT STOP HALTS THE JOB ON PROCESSOR 2, AND 22248000
CLOCKS HIM OFF. IT SETS JOBKILLED SO THAT AWAKEN 22249000
CAN DO ITS DIRTY WORK BEFORE RETURNING;% 22250000
JOBKILLED ~ TRUE; P(HP2);% 22251000
STOPLOG(P2MIX,0); 22252000
END STOPPER;% 22253000
SUBROUTINE CODEOVERLAY;% 22254000
BEGIN COMMENT CODEOVERLAY HANDLES ALL CASES OF MARKING 22255000
A NORMAL-STATE SEGMENT AS NOT-PRESENT. IT DOES THIS 22256000
A SINGEL PRT AND STACK AT A TIME, AND IS ONLY CALLED 22257000
REPREATEDLY FOR RE-ENTRANT CODE OR INTRINSICS;% 22258000
IF CHAR THEN S ~ M[SB ~ M[S].[FF]].[FF] ELSE S ~ S-1;% 22259000
SPRT ~ PRT[MIX,10];% 22260000
IF SPRT[X].[2:1] THEN BEGIN% 22261000
% NEED TO DO PRT AND STACK SEARCH ONLY IF PRESENT IN THIS PRT 22262000
DO UNTIL (X ~ (SPRT[X] ~ (*P(DUP))&0[22:1]% 22263000
&(SPRT[X].[CF]-FRONT)[CTC]).[6:12])}2048;% 22264000
AROUND:% 22265000
WHILE (STACK := HUNT(BS).[CF]) LSS S DO 22266000
BEGIN CORE ~ (DESC ~ NFLAG(M[STACK])).[CF];% 22267000
IF CORE } FRONT AND CORE < BACK THEN 22268000
IF DESC LSS 0 THEN%PROG. DESC OR RCW. 22269000
IF DESC.[3:1] THEN%DESC 22270000
IF DESC.[2:1] THEN%PRESENT 22270050
IF DESC.[6:2]=1 THEN %TYPE 13 INTRINSIC DESC 22270100
M[STACK]:=FLAG(DESC & 0[2:2:1] 22270200
& (MOM.[8:10])[CTC]) ELSE 22270300
% DESCRIPTOR -- INSERT OFFSET AND RESET P-BIT 22271000
M[STACK] ~ FLAG(DESC&0[2:2:1]% 22272000
&(CORE-FRONT)[CTC])% 22273000
ELSE 22273100
ELSE BEGIN% 22274000
% CONTROL WORD (RCW) -- UNFLAG IN STACK, PUT OFFSET INTO 22275000
% CORRESPONDING MSCW, AND MOM INTO RCW.[CF] 22276000
M[X ~ DESC.[FF]] ~% 22277000
(*P(DUP))&(CORE-FRONT)[CTC];% 22278000
M[STACK] ~ DESC&SEGNO[CTC];% 22279000
END;% 22280000
BS ~ STACK+1;% 22281000
END;% 22282000
IF CHAR AND (STACK<SB) THEN% 22283000
BEGIN BS ~ SB; S ~ HUNT(BS+1).[CF]; GO AROUND END; 22284000
IF P(SPRT[19],TOP) THEN P(DEL) ELSE %DS22284100
BEGIN CORE:=POLISH.[CF]; %DS22284200
IF CORE < FRONT OR CORE } BACK THEN 22284300
ELSE SPRT[19]:=(*P(DUP))&0[2:2:1] %DS22284400
&(CORE-FRONT)[CTC]; %DS22284500
END; %DS22284600
$ SET OMIT = NOT(STATISTICS) 22284699
END OF PRESENT IN PRT CASE;% 22285000
END OF CODEOVERLAY;% 22286000
SUBROUTINE INT13; %STACK SEARCH FOR TYPE 13 INTRINSIC CALLS 22286010
BEGIN CHAR:=P(PRT[MIX,8],DUP).[32:1]; 22286020
S:1P INX 0; BS:=PRT[MIX,10].[FF]; 22286030
IF CHAR THEN S:=M[SB:=M[S].[FF]].[FF] ELSE S:=S-1; 22286040
AGAIN: WHILE (STACK := HUNT(BS).[CF]) LSS S DO 22286050
BEGIN CORE:=(DESC:=NFLAG(M[STACK])).[CF];% 22286060
IF CORE GEQ FRONT AND CORE LSS BACK THEN% 22286070
IF DESC.[1:2] NEQ 0 THEN 22286075
IF DESC.[1:3]=7 THEN% 22286080
M[STACK]:=FLAG(DESC&0[2:2:1]&(MOM.[8:10])[CTC])22286090
ELSE 22286100
BEGIN M[DESC.[FF]]:=(*P(DUP))&(CORE-FRONT)[CTC];22286110
M[STACK]:=DESC&(MOM.[8:10])[CTC]& 22286120
1[33:47:1]; 22286130
END; 22286140
BS:=STACK+1; 22286150
END; 22286160
IF CHAR AND (STACK LSS SB) THEN% 22286170
BEGIN BS:=SB; S:=HUNT(BS+1).[CF]; GO AGAIN; END; 22286180
END OF TYPE 13 INTRINSIC STACK SEARCH; 22286190
COMMENT OLAY HANDLES OVERLAYS, THERE ARE 3 CLASSES 22287000
OF THINGS WHICH MAY BE OVERLAID; 22288000
1) OBJECT PROGRAM DATA SEGMENTS 22289000
2) OBJECT PROGRAM CODE SEGMENTS 22290000
AND 3) MCP (NON-SAVE) PROCEDURES. 22291000
4) MCP TABLES - OVERLAYABLE 22291500
EACH OF THESE CLASSES GETS SPECIAL HANDLING, 22292000
WHICH WILL BE DESCRIBED AS WE COME TO IT; 22293000
% THIS CODE IS COMMON TO ALL CLASSES AND ALL CASES 22294000
$ SET OMIT = NOT(NEWLOGGING) 22294099
$ SET OMIT = NOT(WORKSET) 22294110
MCPTEMP := CLOCK + P(RTR); 22294120
$ POP OMIT % WORKSET 22294121
LINK ~ M[LOC]; MOM ~ M[LOC+1];% 22295000
FRONT := LOC + 2; BACK := LINK.[CF]; 22296000
IF (MIX ~ LINK.[AREAMIXF])=0 THEN GO TO MCP;% %167-22297000
% <MIX>=0 AND NON-SAVE MEANS MCP PROCEDURE OR INTRINSIC 22298000
IF MIX=P2MIX THEN STOP;% 22299000
CHAR ~ (INITCW ~ PRT[MIX,8]).[32:1];% 22300000
S ~ INITCW.[CF]; BS ~ PRT[MIX,10].[FF];% 22301000
% CHAR IS CWMF, S IS TOP-OF-STACK, BS IS BASE OF STACK 22302000
IF LINK.[AREATYPEF]=CODEAREAV THEN GO TO CODE;% %167-22303000
IF TERMGOING(MIX) THEN GO TO FOG; %507-22303200
% TYPE=1 MEANS PROGRAM -- ONLY ALTERNATIVE IS DATA 22304000
IF CHAR THEN% 22305000
% SPECIAL CHECKS FOR ADDRESS SAVED IN CHARACTER MODE 22306000
BEGIN CHAR:=(((T:=M[S-1].[CF]) } FRONT AND T < BACK) OR 22307000
% M-REGISTER FROM ICW (SOURCE ADDRESS) 22308000
((T:=M[S-2].[FF])} FRONT AND T < BACK)); 22309000
% S-REGISTER FROM ILCW (DESTINATION ADDRESS) 22310000
IF NOT CHAR THEN% 22311000
BEGIN X ~ M[S ~ M[S].[FF]].[FF]+1;% 22312000
% M[S].[FF] IS ADDRESS OF RCW, M[RCW].[FF] IS ADDRESS OF MSCW 22313000
DO CHAR ~ ((T ~ M[S ~ S-1].[CF])}FRONT 22314000
AND T < BACK) UNTIL (S { X) OR CHAR; 22315000
% SEARCH THROUGH STREAM LOCALS AND PARAMETERS FOR ADDRESSES 22316000
S ~ X;% 22317000
END;% 22318000
END;% 22319000
IF CHAR THEN %TELL BREAKOUT ABOUT IT 22320000
BEGIN P(AWAKEN,SSN); GO EXIT; 22320100
END; 22320200
% CANNOT OVERLAY IF MAY BE ADDRESSES IN CHAR MODE STACK 22321000
IOD~M[MOM].[8:10]; 22322000
IF (DISK:=MOM.[FF]) NEQ 0 THEN % OLAY ADDRESS PRESENT 22323000
BEGIN 22323200
$ SET OMIT = NOT(AUXMEM) 22323400
MOM.[FF]:=0; 22324800
END; 22325000
IF DISK=0 THEN DISK:=DISKSPACE(IOD,MIX,NOAUX); 22325200
IF DISK LSS 0 THEN % NO OLAY DISK 22325400
BEGIN P(AWAKEN); GO EXIT; 22325410
END; 22325430
$ SET OMIT = NOT(STATISTICS) 22325600
IF (S:=S-1) GTR MOM THEN IF MOM GTR BS THEN BS:=MOM-1; 22326400
% IF MOTHER IS IN STACK, ONLY SEARCH ABOVE IT 22326600
WHILE (STACK:=HUNT(BS).[CF]) LSS S DO 22326800
BEGIN 22327000
IF (DESC:=NFLAG(M[STACK])).[1:2]=1 THEN 22327200
% ONLY WORRY ABOUT DATA DESCRIPTORS WHICH ARE PRESENT 22327400
IF DESC.[FF]=MOM THEN 22327600
% THIS ONE DEMANDS ACTION -- IT POINTS INTO OUR ARRAY 22327800
IF DESC.[8:10]=0 THEN 22328000
% NAME DESCRIPTOR -- PUT IN OFFSET AND RESET P-BIT 22328200
M[STACK]:=FLAG((DESC.[CF]-FRONT)&MOM[CTF]) 22328400
ELSE 22328600
% NORMAL ROW DESCRIPTOR -- ZERO CORE FIELD AND RESET P-BIT 22328800
M[STACK]:=FLAG(0&DESC[8:8:25]); 22329000
BS:=STACK+1; 22329200
END; 22329400
IF M[MOM].[3:3] NEQ 7 % NOT READ ONLY ALREADY WRITTEN 22329600
$ SET OMIT = NOT(BREAKOUT) 22329800
THEN 22330400
BEGIN 22330600
$ SET OMIT = NOT(AUXMEM) 22330800
RETRY: DISKIO(RSLT,FRONT-1,IOD&1[3:47:1],DATADDRESS(MIX,DISK)); 22331400
% [3:1] IN SIZE MARKS I/O AS ORIGINATING FROM OLAY 22331600
M[MOM]:=(*P(DUP))&0[2:47:1]&5[CTC]; 22331800
P(AWAKEN,DEL); 22332000
% CF=5 IN MOTHER IS INTERLOCK FOR MAKEPRESENT 22332200
SNOOZE(0,[RSLT],IOMASK); 22332400
IF RLST.[26:7] NEQ 0 THEN % I/O ERROR 22332600
BEGIN 22332800
$ SET OMIT = NOT(AUXMEM) 22333000
IF (DISK:=DISKSPACE(IOD,MIX,-0)) LSS 0 THEN 22333800
BEGIN % NO OLAY DISK 22334000
M[MOM]:=(*P(DUP))&6[CTC]; % TERMINATE MARKER 22334200
GO TO FOG; 22334400
END; 22334600
GO TO RETRY; % TRY AGAIN WITH ANOTHER ADDRESS 22334800
END; % IF I/O ERROR 22335000
M[MOM]:=(*P(DUP))&DISK[CTC]; % PUT DISK ADDRESS IN MOTHER 22335200
END % IF READ ONLY, NOT YET WRITTEN 22335400
ELSE 22335600
BEGIN 22335800
M[MOM]:=(*P(DUP))&0[2:47:1]&DISK[CTC]; 22336000
P(AWAKEN,DEL); 22336200
END; 22336400
IF M[MOM].[3:3]=6 THEN M[MOM].[5:1]~1; 22339100
FOG: FORGETSPACE(FRONT); 22350000
P(TRUE); GO EXIT; 22351000
CODE:% 22352000
% OBJECT PROGRAM CODE TO BE OVERLAID 22353000
IF (T ~ M[S].[CF])}FRONT AND T{BACK THEN% 22354000
% CANNOT OVERLAY NORMAL STATE SEGMENT HE WILL RETURN TO 22355000
BEGIN P(AWAKEN); GO EXIT; 22356000
END; 22356020
IF SOFTI>0 THEN 22356100
IF JAR[MIX,2].[5:1] THEN % SOFTWARE INTERRUPTS 22356140
IF (TSKA ~ PRT[MIX,TSX]).PBIT THEN 22356150
IF (T ~ TSKA[8].[FF])!0 THEN 22356200
IF (M~M[T].[CF])}FRONT AND T{BACK THEN 22356300
BEGIN P(AWAKEN); GO EXIT; 22356400
END; 22356420
IF (MIXUP ~ (SEGDICT ~ PRT[MIX,4]).[FF])!0 THEN% 22357000
% RE-ENTRANT CODE TO BE OVERLAID -- CHECK OTHER USERS, TOO 22358000
BEGIN MIXUP ~ MIXUP.[39:6];% 22359000
DO BEGIN% 22360000
IF MIXUP=P2MIX THEN STOP;% 22361000
% STOP OTHER USER OF THIS CODE IF RUNNING ON PROCESSOR 2 22362000
IF (T ~ M[PRT[MIXUP,8]].[CF])}FRONT AND T{BACK% 22363000
THEN BEGIN P(AWAKEN); GO EXIT; 22364000
END; 22364100
% SAME CRITERIA APPLY TO ALL USERS OF THIS CODE 22365000
IF SOFTI>0 THEN 22365100
IF JAR[MIXUP,2].[5:1] THEN % SOFTWARE INTERRUPTS 22365140
IF (TSKA ~ PRT[MIXUP,@26]).PBIT THEN 22365150
IF (T ~ TSKA[8].[FF])!0 THEN 22365200
IF (T~M[T].[CF])}FRONT AND T{BACK THEN 22365300
BEGIN P(AWAKEN); GO EXIT; 22365400
END; 22365420
END UNTIL (MIXUP ~ PRT[MIXUP,4].[24:6])=@77;% 22366000
% CHECK ALL USERS ON MIX-INDEX LINKED LIST 22367000
END;% 22368000
% IF WE REACH THIS POINT, WE CAN AND WILL OVERLAY THE AREA 22369000
$ SET OMIT = NOT(AUXMEM) 22369999
BACKAGAIN:: 22371200
$ SET OMIT = AUXMEM 22371210
X~SEGDICT[SEGNO~MOM].[8:10];CODEOVERLAY; 22371220
$ POP OMIT 22371221
$ SET OMIT = NOT(AUXMEM) 22371299
IF MIXUP THEN% 22372000
% RE-ENTRANT CODE BEING OVERLAID -- MUST FIX ALL STACKS AND PRTS 22373000
IF (MIX ~ PRT[MIX,4].[24:6])!@77 THEN% 22374000
% SET UP CHAR, S, AND BS FOR NEXT USERS STACK 22375000
BEGIN CHAR ~ (S ~ PRT[MIX,8]).[32:1];% 22376000
S ~ S INX 0; BS ~ PRT[MX,10].[FF];% 22377000
% GO DO STACK SEARCH AND PRT FIX-UP FOR ANOTHER USER 22378000
GO TO BACKAGAIN;% 22379000
END;% 22380000
$ SET OMIT = NOT(AUXMEM) 22380049
$ SET OMIT = AUXMEM 22383049
SEGDICT[MOM]~(*P(DUP))&MOM[FTF];% 22383050
FORGETSPACE(FRONT); P(AWAKEN,DEL,TRUE); GO EXIT; 22383100
$ POP OMIT 22383101
% NOW WAS THAT NOT TRIVIALITY PERSONIFIED... 22384000
MCP:% 22385000
IF P(LINK.[AREATYPEF],DUP)=TYPE7INTAREAV OR% %167-22386000
P(XCH)=TYPE13INTAREAV THEN GO TO INTRINSIC;% %167-22386010
IF LINK.[AREATYPEF]=DATAAREAV THEN % OVERLAYABLE MCP DATA %167-22386100
BEGIN 22386150
COMMENT MCP TABLES CAN BE MARKED AS OVERLAYABLE SO THAT THEY CAN22386200
REMAIN IN CORE WHEN IN USE AND BETWEEN USES BUT CAN BE REMOVED 22386204
WHEN THE SPACE IS NEEDED, PREVIOUSLY THEY HAD TO BE LEFT IN 22386208
CORE PERMANENTLY OR READ FROM DISK WITH EACH USE. EACH TABLE 22386212
NEEDS A "DESCRIPTOR" TELLING ITS PRESENCE [2:1], ITS ADDRESS 22386216
[33:15], AND THE NUMBER OF PROCESSES ACCESSING IT[18:15]. 22386220
MEMORY LINKS MUST BE HANDLED AS IN LBMESS. WHEN AN AREA IS 22386224
IN USE, THE PAIR (MIX=0,TYPE=2(DSTA)) IN WORD 1 OF THE MEMORY 22386228
LINK INDICATES SUCH AN AREA; 22386232
IF M[MOM].[FF] = 0 THEN 22386250
BEGIN %CAN OVERLAY: NO ONE IS WAITING 22386300
M[MOM] := 0; % MARK ABSENT 22386350
FORGETSPACE(FRONT); 22386400
P(TRUE); %SIGNAL SUCCESS 22386450
GO EXIT; 22386500
END 22386550
ELSE BEGIN P(FALSE); GO EXIT END 22386600
END; 22386650
X ~ -2; BS ~ (P(0,RDF)).[FF];% 22387000
% SET BS TO POINT AT RCW FOR CALL ON OLAY 22388000
DO BEGIN% 22389000
OLAY ~ NOT(S ~ ((CORE ~ (T ~ M[BS]).[CF]){BACK 22390000
AND CORE}FRONT));% 22391000
% S IS TRUE IF THE RCW POINTS TO THE ROUTINE TO BE OVERLAID 22392000
BS ~ T.[FF];% 22393000
% POINT T TO CORRESPONDING MSCW 22394000
WHILE (T ~ M[BS]).[16:1] DO BS ~ T.[FF];% 22395000
% RUN DOWN STACK OF MSCWS UNTIL NOT MSFF 22396000
IF (BS ~ T.[FF]){64 THEN 22397000
% END OF STACK -- THIS IS RATIONALE FOR OBSCURE USE OF "P(0,STF)" 22398000
BS ~ BED[X ~ X+2].[FF];% 22399000
END UNTIL (X>JOBNUM) OR S;% 22400000
IF RESULT THEN% 22401000
BEGIN M[MOM] ~ (*P(DUP))&(*P(.ESPBIT))[CTC];% 22402000
FORGETSPACE(FRONT);% 22403000
END;% 22404000
P(RESULT AND 1); GO EXIT; 22405000
INTRINSIC:% 22406000
FOR MIX~1 STEP 1 UNTIL MIXMAX DO% 22407000
IF INTABLEROW[MIX]!0 THEN% 22408000
BEGIN IF MIX=P2MIX THEN STOP;% 22409000
IF (T ~ M[PRT[MIX,8]].[CF])}FRONT AND T{BACK% 22410000
THEN BEGIN P(AWAKEN); GO EXIT; 22411000
END; 22411020
END;% 22412000
FOR MIX~1 STEP 1 UNTIL MIXMAX DO% 22413000
IF INTABLEROW[MIX]!0 THEN 22413010
BEGIN SEGNO ~ MOM.[8:10]-1;% 22415000
STREAM(A ~ SEGNO AND 3; T ~ [INTABLE[MIX,SEGNO DIV 4]]); 22416000
BEGIN SI ~ T; SI ~ SI+A; SI ~ SI+A; DI ~ LOC A;% 22417000
DI ~ DI+6; DS ~ 2 CHR; END STREAMING;% 22418000
IF (SEGNO ~ POLISH)!0 THEN% 22419000
IF SEGNO = @2000 THEN INT13 ELSE 22419500
BEGIN CHAR ~ P(PRT[MIX,8], DUP).[32:1];% 22420000
TYPE13:=SEGNO.[37:1]; 22420200
SEGNO:=SEGNO AND @1777; %IGNORE TYPE 13 BIT 22420500
S ~ POLISH INX 0; BS ~ PRT[MIX,10].[FF];% 22421000
SEGDICT ~ PRT[MIX,4];% 22422000
X:=SEGDICT[SEGNO].[8:10]; 22423000
IF TYPE13 AND NOT PRT[MIX,X].[2:1] THEN 22423100
% TYPE 13 REFERENCE ALSO EXISTS AND TYPE 7 REFERENCE IS NOT PRESENT 22423200
INT13 ELSE 22423300
BEGIN 22423400
CODEOVERLAY; 22423500
SEGDICT[SEGNO] ~ (*P(DUP))&MOM[FTF];% 22424000
END; 22424500
END;% 22425000
END;% 22426000
INTRNSC[MOM.[8:10]] ~ (*P(DUP))&MOM[FTC];% 22427000
FORGETSPACE(FRONT);% 22428000
P(AWAKEN,DEL,TRUE); 22429000
EXIT: 22429100
$ SET OMIT = NOT(NEWLOGGING) 22429199
$ SET OMIT = NOT(WORKSET) 22429210
IF P1MIX NEQ 0 THEN 22429220
IKATTUNEPO1NUX]:=(*P(DUP))+(CLOCK+P(RTR)-MCPTEMP); 22429230
$ POP OMIT % WORKSET 22429231
P(RTN); 22429300
END OF OVERLAY;% REVISION OF MAY 31, 1967... 22430000
PROCEDURE CHANGEABORT(X); VALUE X; REAL X;% 22900000
BEGIN ARRAY A[*];, B[*];% 22901000
REAL J, T;% 22902000
22903000
A~[M[SPACE(210)]]&210[8:38:10]; 22904000
SLEEP([TOGLE], ABORTMASK);% 22905000
LOCKTOG(ABORTMASK); 22906000
DISKWAIT(-A.[CF],210,ESPDISKTOP+1); 22907000
WHILE (A[0]:=XCLOCK+P(RTR)) GEQ WITCHINGHOUR DO MIDNIGHT; 22909000
A[1] ~ DATE;% 22910000
J ~ 3|P1MIX;% 22911000
A[J] ~ A[J+1] ~ A[J+2] ~ 0;% 22912000
B~JARROW[P1MIX]; %CANT WATCH JAR AND LOSE CONTROL, TOO. 22913000
A[J+90] ~ B[0]; 22914000
A[J+91] ~ B[1]; 22915000
A[J+92] ~ X&B[5][1:25:23]; 22916000
A[180+P1MIX]~USERCODE[P1MIX]; 22917000
DISKWAIT(A.[CF],210,ESPDISKTOP+1); 22918000
UNLOCKTOG(ABORTMASK); 22919000
FORGETSPACE(A);% 22920000
END;% 22921000
$ SET OMIT = NOT(DATACOM) 22999999
REAL SPACESTACK; 23500000
SAVE PROCEDURE FORGETSPACE(LOC);% 24000000
VALUE LOC;% 24001000
REAL LOC;% 24002000
BEGIN% 24003000
REAL B,BACK,F,FRONT,LINK,X,T,SIZE;% 24004000
LOC ~ *P(.LOC) INX 0 -2;% 24005000
IF (B~ M[BACK~ (LINK~ M[LOC]).[FF]]).[CF]!LOC OR 24006000
(F~M[FRONT~LINK.[CF]]).[FF]!LOC OR LINK<0 THEN 24007000
PUNT(3); % INVALID LINK 24007100
IF F<0 THEN 24007200
BEGIN% 24008000
M[LOC]~LINK &F[CTC];% 24009000
M[F]~M[F] & LOC[CTF];% 24010000
M[T~M[FRONT+2]]~M[T] &(X~M[FRONT+1])[CTC];% 24011000
M[X+1]~T;% 24012000
END;% 24013000
IF B<0% 24014000
THEN% 24015000
BEGIN 24016000
M[BACK]~B&(T~M[LOC].[CF])[CTC];% 24017000
M[T]~M[T]& BACK[CTF];% 24018000
M[BACK+1]~M[BACK+1]&(SIZE~T-BACK-2)[CTF];% 24019000
END% 24020000
ELSE %BACK IN USE 24021000
BEGIN% 24022000
M[LOC+2]~AVAIL;% 24023000
M[LOC+1]~(T~M[AVAIL]) &(SIZE~M[LOC].[CF ]-LOC-2)[CTF24024000
];% 24025000
M[T+1]~LOC+1;% 24026000
M[AVAIL]~T &(LOC+1)[CTC]% 24027000
; M[LOC]~-M[LOC]% 24028000
END;% 24029000
IF LOC{LEFTOFF THEN IF M[LOC].[CF]>LEFTOFF THEN LEFTOFF~M[LOC].[FF];24030000
$ SET OMIT = NOT(DEBUGGING OR CHECKLINK) 24030100
END FORGETSPACE;% 24031000
SAVE INTEGER PROCEDURE ACTSPACE(SIZE,SAVEF); 24032050
VALUE SIZE,SAVEF; REAL SIZE; BOOLEAN SAVEF; 24032100
BEGIN REAL LINK,LOC,X,Y,T; 24032200
$ SET OMIT = NOT(SATISTICS 24032300
REAL SIZEF,LOS; 24032700
LABEL SVSTART,SVSEARCH,START,OVSEARCH,XX,ROCKABYE; 24032800
IF SAVEF THEN% ATTEMPT TO ALLOCATE AT START OF MEMORY 24032900
BEGIN 24033000
SVSTART: LINK:=M[0]; 24033100
SVSEARCH: IF (LOC:=LINK.[CF])=0 THEN GO TO ROCKABYE; 24033200
IF (LINK ~ M[LOC])}0 THEN% 24033300
BEGIN IF NOT LINK.[2:1] THEN% 24033400
BEGIN % OVRLAY ONLY IF POTENTIAL SPACE ADEQUATE 24033500
SIZEF ~ -2; X ~ T ~ LOC; 24033600
IF (Y~LINK.[FF]) ~ 0 THEN 24033700
IF M[Y] < 0 THEN SIZEF~M[(T~Y)+1].[FF]; 24033800
WHILE SIZE>SIZEF AND (Y~M[X]).[1:2]!1 DO 24033900
SIZEF ~ SIZEF - X + (X ~ Y.[CF]); 24034000
IF SIZE > SIZEF THEN 24034100
BEGIN LINK ~ Y; GO SVSEARCH; END; 24034200
IF OLAY(LOC) THEN % RE-SET "LINK" 24034300
IF (Y~M[LINK~T])>0 OR Y.[CF]=LOC 24034400
OR M[Y].[FF]!LINK THEN 24034500
% MEM LINK AT "T" NO LONGER VALID 24034600
GO TO SVSTART ELSE GO TO SVSEARCH 24034700
ELSE GO TO SVSEARCH; 24034750
END ELSE 24034800
GO TO SVSEARCH;% 24034900
END;% 24035000
IF (SIZEF ~ M[T~LOC+1].[FF])<SIZE THEN GO SVSEARCH;% 24035100
M[ACTSPACE:=LOC]:=ABS(LINK&1[2:47:1]); 24035200
LINK ~ M[T]; M[LINK+1] ~ Y ~ M[T+1];% 24035300
M[Y] ~ (*P(DUP))&LINK[CTC];% 24035400
IF SIZEF>SIZE+DELTA THEN% 24035500
BEGIN M[LOC] ~ (X ~ *P(DUP))&(Y ~ LOC+SIZE+2)[CTC];% 24035600
M[X] ~ (*P(DUP))&Y[CTF];% 24035700
M[Y] ~ X.[CF]&LOC[CTF];% 24035800
FORGETSPACE(Y+2);% 24035900
END;% 24036000
END ELSE 24036100
IF SAVEF}63 OR TOGLE.MEMNO=0 THEN 24036125
BEGIN% ALLOCATE ON "SPACE AVAILABLE" BASIS 24036150
START:% 24036200
IF (LINK ~ POLISH(M[AVAIL], 0, SIZE, CFX, LLL,% 24036300
0, INX, .T, STD)).[FF]=@77777 THEN% 24036400
BEGIN% 24036500
OVSEARCH:% 24036600
IF (LINK:=M[LEFTOFF]).[1:2] = 0 THEN 24036700
BEGIN% OVERLAY ONLY IF POTENTIAL SPACE ADEQUATE 24036800
SIZEF:=-2; X:=LEFTOFF; 24036900
IF (Y:=LINK.[CF]) ! 0 THEN 24037000
IF M[Y] < 0 THEN SIZEF ~ M[Y+1].[FF]; 24037100
WHILE SIZE > SIZEF AND (Y~M[X]).[1:2]!1 DO 24037200
BEGIN SIZEF~SIZEF+Y.[CF]-X; X~Y.[FF] END; 24037300
IF SIZE > SIZEF THEN 24037400
BEGIN LEFTOFF ~ Y.[FF]; 24037500
IF LEFTOFF=0 OR X=0 THEN GO TO XX 24037600
ELSE GO TO OVSEARCH END; 24037700
IF (IF P1MIX=0 THEN 1 ELSE 24037900
IF (X:=LINK.[9:6])!P1MIX THEN 1 ELSE 24038000
((TWO(X) AND OLAYMASK)!0)) THEN 24038100
IF OLAY(LEFTOFF) THEN GO TO START; 24038200
END;% 24038300
IF (LEFTOFF~LINK.[FF])=0 THEN 24038400
XX: IF LOS THEN GO TO ROCKABYE ELSE LOS~1; 24038500
GO TO OVSEARCH; 24038600
END;% 24038700
IF (SIZEF ~ LINK.[FF])>SIZE+DELTA THEN% 24038800
BEGIN M[T] ~ LINK&(X ~ SIZEF-SIZE-2)[CTF];% 24038900
LOC ~ T+X+1;% 24039000
X ~ (Y ~ M[T-1])&(T-1)[CTF];% 24039100
M[Y] ~ (*P(DUP))&LOC[CTF];% 24039200
M[T-1] ~ Y&LOC[CTC];% 24039300
END ELSE 24039400
BEGIN 24039450
M[LINK+1] ~ Y ~ M[T+1];% 24039500
M[Y] ~ (*P(DUP))&LINK[CTC];% 24039600
X ~ M[LOC ~ T-1];% 24039700
END;% 24039800
M[ACTSPACE:=LOC]:=ABS(X&1[2:47:1]); 24039900
END ELSE GO TO SVSTART; % MEMNO!0 24040000
$ SET OMIT = NOT(STATISTICS) 24040100
M[LOC+1]:=0; 24041900
ROCKABYE: 24042000
END ACTSPACE; 24042100
SAVE INTEGER PROCEDURE GETSPACE(SIZE,TYPE,SAVEF); 24042200
VALUE SIZE,TYPE,SAVEF; 24042300
REAL SIZE,TYPE; BOOLEAN SAVEF; 24042400
BEGIN 24042500
REAL COUNT,T,MESS; 24042550
% %156-24042555
% FIELDS OF SAVEF PARAMETER %156-24042560
% %156-24042565
FIELD %156-24042570
% NEEDOLAY = 09:39 % THIS FIELD IS NON ZERO IF 24042575
% REQUESTOR WANTS OLAY SPACE24042580
TYPENOMEMANDRETURN = 45:01 % IF SAVEF.[45:02] = 3 THEN24042585
,JUSTRETURN = 46:01 % GETSPACE WILL TYPE OK MEM24042590
,GETFROMFRONT = 47:01 % IF SUCCESSFUL. %156-24042595
; %156-24042596
LABEL NEWSTART; 24042600
SUBROUTINE TELLSPO; 24042625
BEGIN P(MESS!0 OR SAVEF.[45:2]=3); %156-24042650
IF (MESS:=GETSPACE(3,0,2)+2)=2 THEN PUNT(3); 24042675
M[MESS-2].[9:6]:=0; %549-24042680
STREAM(X:=P: P1MIX, SIZE, MESS); 24042700
BEGIN SI:=LOC P1MIX; DS:=2 DEC; 24042725
DS:=8 LIT" NO MEM "; 24042750
DS:=5 DEC; DS:=5 LIT" WDS~"; 24042775
X(DI:=DI-17; DS:=2 LIT"OK"); 24042800
END; 24042825
P(DEL); 24042850
IOREQUEST(MESS&@274[1:40:8], P(DUP), 24042875
[17]&@231[10:40:8]); 24042900
END OF TELLING SPO ABOUT NO MEMS; 24042925
NEWSTART: 24042950
IF NOT STOREDY THEN SLEEP([TOGLE],STOREMASK); 24043000
LOCKTOG(STOREMASK); 24043100
$ SET OMIT = NOT(DEBUGGING OR CHECKLINK) 24043200
P(SPACESTACK,STS); 24043500
T:=ACTSPACE(SIZE,SAVEF); 24043600
P([MESS],STS); 24043700
UNLOCKTOG(STOREMASK); 24043800
IF T=0 THEN 24043900
BEGIN NOMEMTOG:=1; 24044000
IF SAVEF.JUSTRETURN THEN P(0,RTN); %156-24044100
IF SAVEF.TYPENOMEMANDRETURN THEN %156-24044110
BEGIN %156-24044120
TELLSPO; %156-24044130
P(0,TRN); %156-24044140
END; %156-24044150
NOMEM~NOMEM+1; 24044200
TAR[P1MIX].[20:1]:=1; 24044250
IF (COUNT~COUNT+1)>5 THEN 24044300
IF MESS=0 THEN TELLSPO; 24044400
SLEEP([CLOCK], NOT CLOCK);% 24045100
NOMEN~NOMEN-1; 24045200
TAR[P1MIX].[20:1]:=0; 24045250
GO TO NEWSTART;% 24045300
END;% 24045400
M[GETSPACE:=T]:=(*P(DUP))&TYPE[3:42:6]&P1MIX[9:42:6]; 24045500
IF MESS!0 OR SAVEF.[45:2]=3 THEN TELLSPO; %156-24045600
END GETSPACE; 24046200
SAVE INTEGER PROCEDURE DISKSPACE(WORDS,MIX,AUX); 24101000
VALUE WORDS,MIX,AUX; 24102000
INTEGER WORDS,MIX; REAL AUX; 24103000
BEGIN ARRAY LOC=+2[*]; 24104000
INTEGER INDEX=NT1, 24105000
SEG =NT2, 24106000
CNTRS=NT3, 24107000
SIZE =NT4, 24108000
LIMIT=NT5; 24109000
REAL T =NT6; 24110000
LABEL L1, 24111000
FINAL, 24112000
BADEXIT, 24112500
EXIT; 24113000
DEFINE HEURISTIC = 2#; 24114000
REAL SUBROUTINE FINDSEG; 24115000
BEGIN; STREAM(A~0:T); 24116000
BEGIN S1~LOC T; SI~SI+3; 24117000
5(IF SC="0" THEN JUMP OUT TO L; 24118000
SI~SI+1; TALLY~TALLY+1); 24119000
L: A~TALLY; 24120000
END STREAM; 24121000
FINDSEG ~ POLISH 24122000
END FINDSEG; 24123000
SUBROUTINE FIND; 24124000
BEGIN POLISH(0); 24125000
T ~ LOC[INDEX]; 24126000
SEG ~ T.[9:3]; 24127000
CNTRS ~ T.[2:7]; 24128000
IF SEG>4 THEN 24129000
L1: IF (SEG ~ FINDSEG(=5 THEN GO TO FINAL 24130000
ELSE CNTRS ~0; 24131000
IF SIZE+CNTRS>100 THEN GO TO L1; 24132000
P(DEL,(INDEX|256)+SEG|100+CNTRS); 24133000
STREAM(A~0:SEG,T~[T]); 24134000
BEGIN SI~T; SI~SI+3; SI~SI+SEG; 24135000
DI~LOC A; DI~DI+7; SEG~DI; 24136000
T~SI; DS~CHR; TALLY~A; 24137000
TALLY~TALLY+1; A~TALLY; 24138000
SI~SEG; DI~T; DS~CHR; 24139000
L5:: 24139500
END STREAM; 24140000
IF (POLISH=63) OR (CNTRS ~ CNTRS+SIZE)=100 THEN 24141000
BEGIN CNTRS ~ 0; SEG ~ FINDSEG END; 24142000
LOC[INDEX] ~ T&SEG[9:45:3]&CNTRS[2:41:7]; 24143000
FINAL: IF (DISKSPACE ~ POLISH)!0 THEN 24144000
BEGIN IF SEG=5 THEN INDEX ~ 0; 24145000
LOC[0] ~ LIMIT&INDEX[CTF]; 24146000
GO TO EXIT; 24147000
END END FIND; 24148000
$ SET OMIT = NOT(AUXMEM) 24148999
P(DALOCROW[MIX]); 24150000
SIZE ~ (WORDS+29) DIV 30; 24151000
IF (LIMIT := LOC[0].[CF])=0 THEN GO TO BADEXIT; 24152000
IF (INDEX ~ LOC[0].[FF])!0 THEN FIND; 24153000
INDEX ~ 2; 24154000
DO FIND UNTIL (INDEX := INDEX+2)>LIMIT; 24155000
BADEXIT: 24155500
DISKSPACE ~ -1; 24156000
EXIT: 24157000
$ SET OMIT = NOT(STATISTICS) 24157199
STREAM(A~0:L~LIMIT.[41:6],T~[LOC[1]]); 24158000
BEGIN SI~T; DI~A; 24159000
L(SI~SI+11; 24160000
5(IF SC="0" THEN DI~DI+8; SI~SI+1)); 24161000
A~DI; 24162000
END STREAM; 24163000
IF (POLISH<HEURISTIC) THEN 24164000
IF ((SEG ~ TWO(MIX)) AND OLAYMASK)!0 THEN 24165000
BEGIN OLAYMASK ~ NOT SEG AND OLAYMASK; 24166000
INDEPENDENTRUNNER(P(.GETMOREOLAYDISK),MIX,100); % 24167000
END; 24168000
END DISKSPACE; 24169000
SAVE PROCEDURE DISKRTN(SEGNO, SIZE); 24200000
VALUE SEGNO, SIZE; 24201000
INTEGER SEGNO, SIZE; 24202000
BEGIN INTEGER INDEX=NT1, 24203000
WORD =NT2, 24204000
COUNT=NT3, 24205000
DRUM =NT4, 24206000
X =NT5, 24207000
ARRAY LOC =+1[*]; 24208000
LABEL L; 24209000
$ SET OMIT = NOT(AUXMEM) 24209099
P(DALOC[P1MIX,*]); 24210000
COUNT ~ TWO(24-6|(SEGNO.[39:9] DIV 100)); 24211000
X ~ (INDEX ~ 0&SEGNO[41:33:6])-1; 24212000
IF (WORD ~ LOC[INDEX].[18:30]-COUNT)=0 THEN 24213000
BEGIN LOC[INDEX] ~ 0; 24214000
L: IF P(LOC[0].[FF],DUP)!0 THEN 24221000
IF LOC[POLISH-1]<0 THEN P(XIT); 24222000
LOC[0] ~ (*P(DUP))&INDEX[CTF]; 24223000
END ELSE BEGIN LOC[INDEX]~ (*P(DUP))&WORD[18:18:30]; 24224000
IF LOC[X]<0 THEN 24225000
IF (WORD DIV COUNT).[42:6]=0 THEN GO TO L; 24226000
END END DISKRTN; 24227000
$ SET OMIT = NOT(DATACOM ) 24499999
$ SET OMIT = NOT(SHAREDISK) 24599999
$ SET OMIT = NOT(DATACOM AND DCSPO ) 24999999
$ SET OMIT = NOT(DATACOM) 25004999
$ SET OMIT = NOT(B6500LOAD) 27990099
PROCEDURE LIBRARYHELP(Z); VALUE Z; REAL Z; 28000000
% 28000002
%********************************************************************** 28000004
% 28000006
% 28000008
% LIBRARYHELP PERFORMS INFREQUENTLY NEEDED TASKS FOR THE OTHER 28000010
% LIBRARY MAINTENANCE PROCEDURES. IT SHARES LOCALS BY USING THE 28000012
% SAME STACK AS ITS CALLING PROCEDURE. LIBRARYCOPY OR 28000014
% LIBRARYTRANSFER. 28000016
% 28000018
% 28000020
% 0: A) SETS UP FPB ENTRY FOR INPUT SOURCE TAPE 28000022
% B) RETURNS DIRECTORY LEAVING TAPE POSITIONED AFTER 28000024
% ENDING LABEL OF DIRECTORY 28000026
% 28000028
% 1: RETURNS AFTER SECURING A NEW INPUT SOURCE TAPE 28000030
% 28000032
% 2: ABORT FROM LIBRARYTRANSFER 28000034
% 28000036
% 3: SETS UP FPB ENTRY FOR INPUT SOURCE DISK 28000038
% 28000040
% 4: ABORT FROM LIBRARYCOPY 28000042
% 28000044
% 5: INITIALIZATION OF LIBRARYTRANSFER INCLUDING LOCATION 28000046
% OF SPECIFIED OUTPUT UNIT 28000048
% 28000050
% 6: ERROR HANDLING OR REEL SWITCHING 28000052
% 28000054
% 7: WRITING DIRECTORY IF NOT REEL 1 28000056
% 28000058
% 8: EXTRA RECORDS DETECTED IN CURRENT FILE 28000060
% 28000062
% 9: BAD HEADER DETECTED ON SOURCE 28000064
% 28000066
% 10: INVALID RECORD SIZE ON LAST READ OR WRITE 28000068
% 28000070
% 11: KEYIN REEL SWITCH 28000072
% 28000074
% 28000076
%********************************************************************** 28000078
% 28000080
BEGIN 28000200
REAL COMMON=-4, 28000400
MSCW=-2, RCW=+0, 28000500
MFID=+1, FID=MFID+1, 28000600
ASMFID=FID+1, ASFID=ASMFID+1, 28000800
TMP=ASFID+1, TEMP=TMP+1, 28001000
FA=TEMP+1, FAINFO=FA+1, 28001200
FASZ=FAINFO+1, FAIN-FASZ+1, 28001400
TU=FAIN+1, T=IU+1, 28001600
FPBPTR=T+1, IREEL=FPBPTR+1, 28001800
NM1=IREEL+1, NM2=NM1+1, 28002000
DESTIN=NM2+1, TOGS=DESTIN+1, 28002200
DA=TOGS+1, CCAIN=DA+1, OU=CCAIN, 28002400
FAIN=CCAIN+1, OREEL=FAIN, NAIN=EAIN+1, N=NAIN, 28002600
NA=NAIN+1, CNT=NA, NASZ=NA+1, INC=NASZ, 28002800
LSX=NASZ+1, OUC=LSX, BUMPFA=LSX+1, Y=BUMPFA, 28003000
POOL=BUMPFA+1, W=POOL, INDX=POOL+1, SIZE=INDX, 28003200
UN=INDX+1, Q=UN, SEG=UN+1, J=SEG, 28003400
MAX=SEG+1, TM=MAX, K=MAX+1, 28003600
L=K+1, MIDPTR=L+1, SV=MIDPTR, 28003800
UNITNO=MIDPTR+1; 28004000
ARRAY 28004200
CCA=NITNO+1[*], H=CCA[*], X=CCA+1[*], AROW=X[*], 28004400
PAP=X+1[*], IOD=PAP[*], LAB=PAP+1[*], 28004600
LBL=LAB+1[*], WRDSZ=LBL+1[*]; 28004800
$ SET OMIT = NOT(B6600LOAD) 28005000
LABEL TRYNEXT,TRYAGN,FINDIT,BAC,BACK,P1,P2,P3,EXIT,ST,TAPEPAR; 28005800
LABEL CASE0,CASE1,CASE2,CASE3,CASE4,CASE5,CASE6,CASE7,CASE9; 28006000
DEFINE 28006200
BACKSPACER = 5&@3400[CTF]#, 28006400
SPACER = 5&@1400[CTF]#, 28006600
MM = @37700040#, 28006800
SM = @37700000#, 28007000
DSED = (TERMSET(P1MIX))#, 28007200
UNITNUM = [1:5]#, %148-28007300
SPOUTUNIT = 0#, 28007400
FORKED = TOGS.[23:1]#, 28007600
B6500 = TOGS.[24:1]#, 28007800
OE = TOGS.[26:1]#, 28008000
FROMCOPY = TOGS.[27:1]#, 28008200
REELSW = TOGS.[33:1]#, 28008400
REEL1START = TOGS.[34:1]#, 28008600
SKIPDIR = TOGS.[35:1]#, 28008800
SPACITSW = TOGS.[36:1]#, 28009000
CHKLBL = TOGS.[37:1]#, 28009200
COPYING = TOGS.[38:1]#, 28009300
OUTAPEPARITY= TOGS.[39:1]#, 28009400
SKIPFILE = TOGS.[40:1]#, 28009600
DUMPDIR = TOGS.[42:1]#; 28009800
SWITCH SWIT:=CASE0,CASE1,CASE2,CASE3,CASE4,CASE5,CASE6,CASE7, 28010000
P2,CASE9,P1,TAPEPAR; 28010200
%*********************************************************** 28010400
DEFINE NOTCOPIED(NOTCOPIED1)= 28010600
BEGIN NT3:=NOTCOPIED1; NOCOPYMESS; END#; 28010800
SUBROUTINE NCOPYMESS; 28011000
LBMESS( ABS(MFID, FID, -67, NT3, TINU[IU], SPOUTUNIT, 1 ); 28011200
%*********************************************************** 28011400
SUBROUTINE ABORT; 28011600
BEGIN 28011800
IF COPYING 28011810
THEN IF OU=18 28011820
THEN BEGIN P(DIRECTORYSEARCH(MFID,FID,6),DEL); 28011830
OE:=0; % NOT OPENED EXCLUSIVE 28011832
END 28011834
ELSE BEGIN P(WAITIO([TM],@40,OU),DEL); 28011840
P(WAITIO(LBL&@5000[CTF],@40,OU),DEL); 28011850
END; 28011860
IF NOT FROMCOPY THEN 28012000
BEGIN IF OU GEQ 0 THEN 28012010
BEGIN IF OU LSS 16 THEN 28012020
BEGIN BLASTQ(OU); 28012030
P(WAITIO([TM],@40,OU),DEL); 28012040
SETNOTINUSE(OU,1); 28012060
END; 28012070
STOPTIMING(0,1023); 28012080
END; 28012090
IF IU GEQ 0 THEN 28012100
IF IU LSS 16 THEN BLASTQ(IU); 28012110
END ELSE 28012120
WHILE CCA[29] NEQ 0 DO 28012130
BEGIN SEG:=CCA[29]; DISKWAIT(-CCA.[CF],30,SEG); 28012140
FORGETESPDISK(SEG); 28012150
END; 28012160
FOR TMP:=0 STEP 1 UNTIL (FAIN DIV 2) DO 28012800
IF (TEMP:=M[FAINFO+TMP]).[CF]=18 THEN 28013000
IF TEMP.[17:1] THEN ELSE 28013200
P(DIRECTORYSEARCH(-(TEMP.[FF]),13,20),DEL); 28013400
IF OE THEN P(DIRECTORYSEARCH(-MFID,FID,14),DEL); 28013600
IF FORKED 28013800
THEN BEGIN IF IU GEQ 0 THEN 28014000
IF IU LSS 16 THEN SETNOTINUSE(IU,0); 28014100
STOPTIMING(FPBPTR,1023); 28014200
END 28014400
ELSE FOR TMP:=5 STEP 5 UNTIL (NT1:=PRT[P1MIX,3]).[8:10]-5 DO 28014600
IF M[TN1 INX (TMP+4)] LSS 0 THEN 28014800
BEGIN IF (TEMP:=M[NT1 INX (TMP+3)].[36:6]-1) LSS 16 28015000
THEN SETNOTINUSE(TEMP,0); 28015200
STOPTIMING(TMP,1023); 28015400
END; 28015600
FOR TMP:=0 STEP 1 UNTIL 15 DO 28015800
IF LABELTABLE[TMP] LSS 0 THEN 28016000
IF RDCTABLE[TMP].[8:6]=P1MIX THEN SETNOTINUSE(TMP,0); 28016200
$ SET OMIT = PACKETS 28017200
STREAM(T:=T:=SPACE(5)); 28018000
BEGIN DS:=21LIT"LIBRARY COPY ABORTED~"; END; 28018200
SPOUT(T); 28018400
GO INITIATE; 28018600
END; 28018800
%*********************************************************** 28019000
BOOLEAN SUBROUTINE LABELCHECK; 28019200
BEGIN 28019400
TRYNEXT: 28019600
P(WAITIO(LAB INX @120540000000,0,IU),DEL); 28019800
$ SET OMIT = NOT(B6500LOAD) 28020000
IF @40!WAITIO(SPACER,@40,IU) THEN 28021800
P(WAITIO(@4740000050,0,IU),DEL); 28022000
IF DSED THEN ABORT; 28022200
IF (NOT B6500 AND ((NFLAG(LAB[0]).[6:42] EQV "LABEL ")!NOT 0 28022400
OR (NFLAG(LAB[2]).[6:24] EQV "FILE")!NOT 0)) 28022600
$ SET OMIT = NOT(B6500LOAD) 28022800
THEN BEGIN 28023600
STREAM(A:=[TINU[IU]],T:=T:=SPACE(10)); 28023800
BEGIN SI:=A;SI:=SI+5;DS:=LIT".";DS:=3 CHR; 28024000
DS:=21 LIT" NOT A LIBRARY TAPE~"; 28024200
END; 28024400
SPOUT(T); T:=1; 28024600
END ELSE T:=0; 28024800
IF T=0 AND NOT B6500 THEN 28025000
IF NFLAG(LAB[2]).[30:18]=0 AND SKIPDIR THEN 28025200
BEGIN 28025400
SPACITSW:=1; CHKLBL:=FALSE; 28025600
GO TO BACK; %BRANCH INTO SPACIT. 28025800
BAC: 28026000
SPACITSW:=0; CHKLBL:=TRUE; 28026200
GO TO TRYNEXT; 28026400
END; 28026600
LABELCHECK:=T; 28026800
END; 28027000
%*********************************************************** 28027200
SUBROUTINE FINDTHETAPE; 28027400
BEGIN 28027600
FINDIT: 28027800
IF (IU:=FINDINPUT(NM1,NM2,IREEL,-0,0,0,0,0,1,FPBPTR)) < 0 28028000
THEN ABORT: 28028100
NM1.UNITNUM:=0; %148-28028110
IREEL:=RDCTABLE[IU].[14:10]; %FORCE REEL CONTINUITY IF IL-ED. 28028200
RRRMECH:=TWO(IU) OR RRRMECH; 28028400
B6500:=PRNTABLE[IU].[2:1]; 28028600
$ SET OMIT = NOT(B6500LOAD) 28028800
IF CHKLBL THEN IF LABELCHECK THEN 28029400
BEGIN 28029600
SETNOTINUSE(IU,1); 28029800
GO FINDIT; 28030000
END; 28030200
% STARTIMING(FPBPTR,IU); DONE IN FINDINPUT 28030400
% M[PRT[P1MIX,3] INX (5|IREEL+3)].[23:1] := 1; 28030600
RDCTABLE[IU].[8:6]:=P1MIX; 28030800
STREAM (S:=PRNTABLE[IU].[18:30],T:=[T]); 28031000
BEGIN SI:=LOC S; DS:=8DEC; DI:=DI-7; DS:=6FILL; END; 28031200
$ SET OMIT = PACKETS 28031400
FILEMESSAGE(" IN "&TINU[IU][6:30:18],T, 28032000
NM1,NM2,IREEL,0,0,OPNMESS); 28032200
END; % OF FINDTHETAPE 28032400
%*********************************************************** 28032600
BOOLEAN PROCEDURE ENDOFREEL; 28032800
BEGIN 28033000
BLASTQ(IU); 28033200
IF P(WAITIO(LAB INX @120540000000,@2000040,IU),DUP)=@20 THEN 28033400
BEGIN % PAR OR ENDING LABEL:TEST FOR LAST FILE ON TAPE(EOF) 28033600
LAB[4]:=(*P(DUP))&(WAITIO(SPACER,@40,IU)=@40)[47:47:1]; 28033800
P(WAITIO(5&@3400[CTF],@377,IU),DEL); 28034000
END; 28034200
$ SET OMIT = NOT(B6500LOAD) 28034400
NT1:=P; 28036000
IF DSED THEN ABORT; 28036200
IF ((NOT B6500) AND NFLAG(LAB[4]) AND NT1!@40) 28036400
$ SET OMIT = NOT(B6500LOAD) 28036600
THEN BEGIN 28037200
STOPTIMING(FPBPTR,1023);% 28037400
SETNOTINUSE(IU,0); 28037600
IREEL:=IREEL+1; 28037800
$ SET OMIT = NOT(B6500LOAD); 28038000
NM2:=LAB[2]; 28039200
NM1:=LAB[1]; 28039400
FINDTHETAPE; 28039600
ENDOFREEL:=TRUE; 28039800
END ELSE ENDOFREEL:=FALSE; 28040000
END; % OF SUBROUTINE ENDOFREEL 28040200
%*******************************************************************28040400
SUBROUTINE WRITENDINGLABEL; 28040600
BEGIN 28040800
P(WAITIO([TM],@40,OU),DEL); 28041000
P(WAITIO(LBL&@5000[CTF],@40,OU),DEL); 28041400
IF DSED THEN ABORT; 28041600
END; % OF WRITE ENDING LABEL 28041800
%*********************************************************** 28042000
SUBROUTINE SPACIT;% 28042200
BEGIN 28042400
BACK: WHILE WAITIO(SPACER,MN,IU)!@40 DO 28042600
BEGIN 28042800
IF DSED THEN ABORT; 28043000
IF STOPSET(P1MIX) THEN STOPM(0); 28043200
END; 28043400
IF ENDOFREEL AND NOT SPACITSW THEN GO BACK; 28043600
IF SPACITSW THEN GO TO BAC; %BRNACH TO LABELCHECK ELSE EXIT 28043800
END; 28044000
%*******************************************************************28044200
SUBROUTINE SHORTHEADER; 28044400
BEGIN 28044600
P(WAITIO(H&@5000[CTF]&20[8:38:10],@40,OU),DEL); 28044800
WRITENDINGLABEL; 28045000
END; 28045200
%******************************************************** 28045400
SUBROUTINEBACKSPACIT; 28045600
BEGIN 28045800
WHILE WAITIO(BACKSPACER,MM,OU) ! @40 DO 28046000
BEGIN 28046200
IF DSED THEN ABORT; 28046400
IF STOPSET(P1MIX) THEN STOPM(0); 28046600
END; 28046800
P(WAITIO([TM],@40,OU),DEL); % WRITE THE TM BACK 28047000
END; 28047200
%*******************************************************************28047400
BOOLEAN SUBROUTINE NOTLOADINGFROMREEL1; 28047600
BEGIN %SKIP LAST PORTION OF FILE FROM PREVIOUS REEL 28047800
SPACIT; 28048000
IF LABELCHECK THEN P(0) ELSE 28048200
IF (NFLAG(LAB[2]) EQV "FILE000") = NOT 0 THEN 28048400
BEGIN REEL1START:=FALSE; P(1) END ELSE P(0); 28048600
NOTLOADINGFROMREEL1:=P; 28048800
END; 28049000
%******************************************************* 28049200
P(Z,RCW,MSCW,STF); RCW:=HCW&P(XCH)[CTC]; 28049400
TEMP:=P; FROMCOPY:=(TEMP=0) OR (TEMP=3) OR (TEMP=4) 28049600
GO TO SWIT[TEMP]; 28049800
CASE0: 28050000
CASE3: 28050100
TMP:=PRT[P1MIX,3]; 28050200
FPBPTR:=FPBPTR+5; 28050400
IF FPTPTR GTR 5 THEN 28050600
BEGIN TMP:=GETSPACE(FPBPTR+ETRLNG,FPBAREAV,1)+2;% %167-28050800
MOVE(FPBPTR,PRT[P1MIX,3],TMP); 28051000
FORGETSPACE(PRT[P1MIX,3].[CF]); 28051200
NFO[(P1MIX-1)|NDX]:=PRT[P1MIX,3]:= 28051400
[M[TMP]]&(FPBPTR+ETRLNG)[8:38:10]; 28051600
END; 28051800
IF TEMP=3 28052000
THEN BEGIN 28052200
STREAM(B:=TMP INX FPBPTR); 28052400
BEGIN DS:=16LIT"0DIRCTRY0DISK "; DS:=24LIT"0"; END; 28052600
STARTIMING(FPBPTR,18); 28052800
GO EXIT; 28053000
END 28053200
ELSE 28053400
STREAM(NM1:=NM1:=CCA[CCAIN+1],B:=(TMP INX FPBPTR)); 28053600
BEGIN DS:=LIT"0"; SI:=LOC NM1; SI:=SI+1; DS:=7CHR; 28053800
DS:=8LIT"0FILE000"; DS:=24LIT"0"; 28054000
END; 28054200
IREEL:=1; 28054400
NM1:=CCA[CCAIN+1]; 28054600
NM2:="FILE000"; 28054800
REEL1START:=TRUE; CHKLBL:=TRUE; 28055000
TRYAGAIN: FINDTHETAPE; 28055200
$ SET OMIT = NOT(B6500LOAD) 28055400
IF NM2!LAB[2] OR IREEL!1 THEN 28056000
IF NOT NOTLOADINGFROMREEL1 THEN 28056200
BEGIN STREAM(A:=[TINU[IU]],T:=T:=SPACE(10)); 28056400
BEGIN SI:=A;SI:=SI+5;DS:=LIT".";DS:=3CHR; 28056600
DS:=20 LIT" NOT A LIBRARY TAPE"; 28056800
DS:=LIT"~"; 28057000
END; 28057200
SPOUT(T); SETNOTINUSE(IU,1); 28057400
IREEL:=1; 28057600
GO TO TRYAGN; 28057800
END; 28058000
NM1:=LAB[1]; 28058200
SKIPDIR:=TRUE; 28058400
X:=[M[T:=SPACE(1024)]]&1023[8:38:10]; 28058600
P(WAITIO(( 28058800
$ SET OMIT = NOT(B6500LOAD) 28059000
X)&@5400[CTF],0,IU),DEL); 28059600
$ SET OMIT = NOT(B6500LOAD) 28059800
IF DSED THEN ABORT; 28061800
X:=[M[GETSPACE(DA:=M[T-1],0,1)+2]]&DA[8:38:10]; % RET XTRA SPACE 28062000
MOVE(DA,T,X); % AND MAKE X SAVE 28062200
FORGETSPACE(T); 28062400
CHKLBL:=FALSE; 28062600
TMP:=0; 28062800
IF @40=WAITIO(LAP INX @120540000000,@40,IU) THEN 28063000
IF B6500 THEN P(WAITIO(LAB INX @120540000000,0,IU),DEL) ELSE 28063200
TMP:=ENDOFREEL; 28063400
IF NOT TMP THEN% CHECK ENDING LABEL IF NOT LAST FILE OR B6500LOAD 28063600
IF ((NOT B6500) AND (NFLAG(LAB[1])EQV NM1)!NOT 0 OR 28063800
(NFLAG(LAB[2]) EQV "FILE000")!NOT 0) 28064000
$ SET OMIT = NOT(B6500LOAD) 28064200
THEN BEGIN STREAM(A:=[TINU[IU]],TMP:=TMP:=SPACE(10)); 28065000
BEGIN SI := A; SI := SI+5; DS := LIT"."; DS := 3 CHR; 28065200
DS := 29 LIT " BAD FILE000 ON LIBRARY TAPE~"; 28065400
END; SPOUT (TMP); ABORT; 28065600
END; 28065800
CHKLBL:=TRUE; 28066000
$ SET OMIT = NOT(B6500LOAD) 28066200
GO EXIT; 28067000
CASE1: 28067200
FINDTHETAPE; GO EXIT; 28067400
CASE2: % FROM LIBRARYTRANSFER 28067600
CASE4: % FROM LIBRARYCOPY 28067800
ABORT; 28068000
CASE5: 28068200
OU:=IU:=-1; DS:=@77777; % INITIALIZE 28068400
FPBPTR:=0; 28068600
CHKLBL:=TRUE; SKIPDIR:=TRUE; 28068800
IOD:=[M[GETSPACE(6,0,1)+2]]&2[8:38:10]; 28069000
WRDSZ:=4 INX IOD; 28069200
AROW:=2 INX IOD; 28069400
AROW[0]:=[M[GETSPACE(902,0,1)+2]]&901[8:38:10]; 28069600
AROW[1]:=AROW[0]&(GETSPACE(902,0,1)+2)[CTC]; 28069800
H:=[M[TYPEDSPACE(42,DISKHEADERAREAV))] & 30[8:38:10];% %167-28070000
IF DESTIN.UNITNUM = 19 THEN %148-28070200
BEGIN 28070400
COMMON:=IF DESTIN.[42:6] NEQ 0 THEN DESTIN OR M ELSE 28070600
IF DESTIN.[40:1] THEN 1 OR M ELSE 28070800
IF DESTIN.[41:1] THEN 2 OR M ELSE 0; 28071000
OU:=18; 28071200
STREAM(B:=PRT[P1MIX],3] INX 0); 28071400
BEGIN DS:=16LIT"0DIRCTRY0DISK "; DS:=24LIT"0"; END; 28071600
STARTIMING(0,OU); 28071800
END 28072000
ELSE 28072200
BEGIN OREEL:=1; 28072400
TM:=0&"}~"[1:37:11]; 28072600
LBL:=[M[TAPELABEL(DESTIN,NM2:-"FILE000",1,1,100)]]&10[8:38:10]; 28072800
IF (OU:=LABELASCRATCH(LBL)) LSS 0 THEN ABORT; 28073000
STREAM(N:=DESTIN,B:=PRT[P1MIX,3] INX 0); 28073200
BEGIN DS:=LIT"0"; SI:=LOC N; SI:=SI+1; DS:=7CHR; 28073400
DS:=8LIT"0FILE000"; DS:=24LIT"0"; 28073600
END; 28073800
STARTIMING(0,OU); 28074000
PRNTABLE[OU]:=(*P(DUP)) & (IOD)[15:33:15]; 28074050
SV:=M[FAINFO]; 28074200
M[FA+FASZ]:=@14; % TO REMIAN COMPATIBLE WITH EARLIER MCPS 28074400
P(WAITIO(FA&(FASZ+I)[8:38:10]&@5000[CTF],@40,OU),DEL); 28074600
M[FAINFO]:=SV; 28074800
WRITENDINGLABEL; 28075000
END; 28075200
GO EXIT; 28075400
CASE6: 28075600
IF Y.[7:1] AND Y.[27:1] THEN % END OF TAPE 28075800
IF Y.[24:1] 28076000
THEN % EOF ON SOURCE 28076200
BEGIN 28076400
IF NOT ENDOFREEL THEN 28076600
BEGIN 28076800
P(WAITIO(@4740000020,@377,IU),DEL); 28077200
TEMP:=-1; % FOR NOTCOPIED MESSAGE AT P1 28077400
IOD[1]:=IOD[0]:=IOMASK; GO P1; 28077600
END; 28077800
IF WAITIO(IOD[W] INX @16040540000000,SM,IU) NEQ 0 28078000
THEN GO P1; 28078200
IF IOD[1-W].[7:1] AND Y.[3:4]=IOD[1-W].[3:4] THEN 28078400
BEGIN 28078600
IF WAITIO(IOD[1-W],SM,IU) NEQ 0 THEN GO P1; 28078800
IOD[1-W]:=(*P(DUP)) OR IOMASK; 28079000
END; 28079200
END 28079400
ELSE 28079600
BEGIN % EOT ON DESTINATION 28079800
IF IOD[1-W].[7:1] AND Y.[3:4]=IOD[1-W].[3:4] THEN 28080000
BEGIN 28080200
SLEEP([IOD[1-W]],IOMASK); 28080400
IF IOD[1-W].[28:1] THEN GO P3; 28080600
IOD[1-W].[27:1]:=0; 28080800
END; 28081000
TAPEPAR:LBL[4]:=(*P(DUP)) OR 1; 28081200
IF LBL[2].[30:18]=0 THEN %FILE000 LAST FILE 28081400
STREAM(A:=J+2,B:=[LBL[2]]); 28081600
BEGIN SI:=LOC A; DI:=DI+5; DS:=3 DEC END; 28081800
P(WAITIO([TM],@40,OU),DEL); 28082000
P(WAITIO(LBL&@5000[CTF],@40,OU),DEL); 28082200
P(WAITIO([TM],@40,OU),DEL); 28082400
STOPTIMING(0,1023); 28082600
SETNOTINUSE(OU,1); 28082800
LBL[4]:=(*P(DUP)) AND NOT(1); 28083000
STREAM(OREEL:=OREEL:=OREEL+1,LBL); 28083200
BEGIN SI:=LOC OREEL; 28083400
DI:=DI+24; DS:=3 DEC; 28083600
END; 28083800
IF (OU:=LABELASCRATCH(LBL)) LSS 0 THEN 28084000
BEGIN COPYING:=FALSE; ABORT; END; 28084100
STARTIMING(0,OU); 28084200
PRNTABLE[OU]:=(*P(DUP)) & (IOD)[15:33:15]; 28084250
DUMPDIR:=TRUE; %DUMP DIRECTORY 28084400
END 28084600
ELSE 28084800
IF Y.[7:1] % TAPE PARITY 28085000
THEN IF Y.[24:1] 28085200
THEN BEGIN % PARITY ON INPUT TAPE 28085400
P1: COMPLEXSLEEP((((IOD[0] AND IOD[1]) AND IOMASK) NEQ 0) 28085600
OR DSED); 28085800
NOTCOPIED)27+((TEMP=10)|12)+((TEMP=(-1))|6)); 28086000
IF DSED THEN ABORT; 28086200
SKIPFILE:=TRUE; 28086400
P2: BLASTQ(IU); 28086600
P(WAITIO(@4740000020,@377,IU),DEL); 28086800
IF J NEQ ((FASZ DIV 2)-1) THEN SPACIT; 28087000
IF OU=18 28087200
THEN P(DIRECTORYSEARCH(MFID,FID,6),DEL) 28087400
ELSE BEGIN 28087600
BACKSPACIT; 28087800
SHORTHEADER; 28088000
END; 28088200
END 28088400
ELSE BEGIN % PARITY ON OUTPUT TAPE 28088600
P3: IF IU LSS 16 28088800
THEN BEGIN 28089000
WHILE WAITIO(BACKSPACER,MM,IU) NEQ @40 DO 28089200
BEGIN 28089400
IF DSED THEN ABORT; 28089600
IF STOPSET(P1MIX) THEN STOPM(0); 28089800
END; 28090000
P(WAITIO(SPACER,@40,IU),DEL); % READ TM 28090200
P(WAITIO((*[AROW[0]])&@5400[CTF],@2000000,IU),DEL); 28090400
$ SET OMIT = NOT (B6500LOAD) 28090600
IF M[AROW[0] INX NOT 0] NEQ 30 THEN ABORT; 28091200
END; 28091400
BACKSPACIT; 28091600
P(WAITIO(H&@5000[CTF],@40,OU),DEL); 28091800
OUTAPEPARITY:=TRUE; 28092000
GO TAPEPAR; 28092200
END 28092400
ELSE BEGIN % DISK PARITY 28092600
SKIPFILE:=TRUE; 28092800
BACKSPACIT; 28093000
SHORTHEADER; 28093200
NOTCOPIED(35); 28093400
P(DIRECTORYSEARCH(-DA.[FF]),13,20),DEL); 28093600
M[FAINFO+J].[17:1]:=1; % MARK CLOSED FOR ABORT 28093800
M[FAINFO+J].[8:1]:=0; % DONT REMOVE IF UNLOAD %757-28093900
END; 28094000
GO EXIT; 28094200
CASE7: 28094400
P(M[FA+1],M[FA]); % SAVE NAME FOR UNLOAD %757-28094500
M[FA]:=@114; M[FA+1]:=(J+1)|2;%FLAG [0], OFFSET [1] 28094600
LBL[2].[30:18]:=0; %FILE000 28094800
P(WAITIO(LBL&@5000[CTF],@40,OU),DEL); 28095000
P(WAITIO([TM],@40,OU),DEL); 28095400
IF DSED THEN ABORT; 28095600
IOD[0]:=0; W:=1; SIZE:=FASZ+1; 28095800
TMP:=M[FA+FASZ]; M[FA+FASZ]:=@14; 28096000
IOREQUEST(-(IOD[W]:=(FA INX @500000000)& 28096200
SIZE[8:38:10]&TINU[OU][3:3:5]) OR @2017700000, 28096400
IOD[W],[IOD[W]]&OU[12:42:6]); 28096600
COMPLEXSLEEP((((IOD[W]) AND IOMASK)+0) OR DSED); 28096800
M[FA+FASZ]:=TMP; 28097000
NT1:=P; M[FA]:=NT1; M[FA+1]:=P(XCH); % REPLACE NAMES %757-28097100
IF DSED THEN ABORT; 28097200
GO EXIT; 28097400
CASE9: 28097600
IF DESTIN.UNITNUM = 19 %148-28097800
THEN GO ST 28098000
ELSE BEGIN 28098200
SHORTHEADER; 28098400
IF IU=18 THEN 28098600
BEGIN 28098800
P(DIRECTORYSEARCH(-(DA.[FF]),13,20),DEL); 28099000
M[FAINFO+J].[17:1]:=1; % MARK CLOSED FOR ABORT 28099200
END ELSE 28099400
BEGIN 28099600
ST: H[2]:=LAB[2]; 28099800
SPACIT; 28100000
IF H[2] NEQ LAB[2] THEN ABORT; 28100200
END; 28100400
END; 28100600
NOTCOPIED(43); 28100800
GO EXIT; 28101000
EXIT: P(0,RDS,0,XCH,P&P[CTF],STF); 28101200
END OF LIBRARYHELP; 28101400
PROCEDURE LIBRARYTRANSFER; 28200000
% 28200002
%********************************************************************** 28200004
% 28200006
% 28200008
% LIBRARYTRANSFER PERFORMS THE ACTUAL PHYSICAL TRANSFER OF FILES 28200010
% BASED ON INFORMATION SUPPLIED BY LIBRARYCOPY. BASICALLY, ALL 28200012
% LIBRARYTRANSFER NEEDS FROM LIBRARYCOPY IS "FA" (THE FILE ARRAY 28200014
% WHICH CONTAINS THE NAME PAIRS TO BE TRANSFERRED), "FAINFO" 28200016
% (THE FILE ARRAY INFORMATION, WHICH CONTAINS NECESSARY INFO. 28200018
% ABOUT EACH NAME PAIR), AND "DESTIN" (THE USER SPECIFIED 28200020
% DESTINATION). 28200022
% 28200024
% TRANSFERS MAY BE MADE FROM TAPE TO TAPE, TAPE TO DISK, OR 28200026
% DISK TO TAPE. LIBRARYTRANSFER WILL ATTEMPT TO TRANSFER DATA 28200028
% FROM THE INPUT SOURCE SPECIFIED IN THE "FAINFO" ENTRY TO THE 28200030
% UNIT SPECIFIED THRU "DESTIN". THE BULK OF LIBRARYTRANSFER IS 28200032
% JUST LOOPING THROUGH "FAINFO" USING ONE ENTRY AT A TIME UNTIL 28200034
% THEY ARE EXHAUSTED. AT EACH CHANGE OF INPUT SOURCE THE FPB 28200036
% IS FIXED UP DIFFERENTLY DEPENDING UPON WHETHER THE JOB WAS 28200038
% FORKED OR NOT (REFER TO DOCUMENTATION). 28200040
% 28200042
% 28200044
% DA CURRENT "FAINFO" ENTRY 28200046
% .[CF] IF DISK THEN 18 28200048
% IF TAPE THEN UNIT NUMBER OF THE TAPE 28200050
% .[FF] IF DISK THEN DISK ADDRESS OF FILE HEADER 28200052
% IF TAPE THEN NUMBER OF THIS FILE ON TAPE 28200054
% .[5:1] SPECIFIES LATEST VERSION WANTED 28200056
% .[6:1] FILE TO BE ADDED 28200058
% .[8:1] FILE TO BE UNLOADED 28200060
% .[13:1] FILE TO BE ADDED (NOT ON DISK) %160-28200061
% 28200062
% NOTE: ANY OPTIONS SET THAT DO NOT APPLY TO A PARTICULAR 28200064
% CIRCUMSTANCE WILL BE IGNORED 28200066
% 28200068
% IU CURRENT INPUT UNIT 28200070
% 28200072
% OU " OUTPUT " 28200074
% 28200076
% IREEL CURRENT INPUT REEL NUMBER (IF TAPE) 28200078
% 28200080
% OREEL " OUTPUT " " " 28200082
% 28200084
% FA FILE ARRAY OF NAME PAIRS TO BE TRANSFERRED 28200086
% 28200088
% FAINFO TRANSFER INFO. FOR EACH NAME PAIR 28200090
% 28200092
% FPBPTR CURRENT FPB ENTRY INDEX 28200094
% 28200096
% H CURRENT FILE HEADER 28200098
% 28200100
% LAB LAST INPUT LABEL READ 28200102
% 28200104
% LBL LAST OUTPUT LABEL READ 28200106
% 28200108
% TOGS.[21:1] (BHS) INDICATES BAD HEADER 28200110
% [23:1] (FORKED) NOT ORIGINATING LIBMAIN/DISK 28200112
% [26:1] (OE) CURRENT <MFID>/<FID> HAS BEEN 28200114
% OPENED EXCLUSIVE 28200116
% 28200118
% [28:1] (SOMECOPIED) AT LEAST ONE FILE HAS BEEN 28200120
% TRANSFERED 28200122
% [38:1] (COPYING) NOTES STAGE OF PROCESSING FOR 28200124
% USE BY ABORT 28200126
% [40:1] (SKIPFILE) USED TO INDICATE ABRUPT EXIT TO 28200128
% NEXT FILE SHOULD BE TAKEN 28200130
% 28200132
% 28200134
%********************************************************************** 28200136
% 28200138
BEGIN 28200200
REAL COMMON=-4, 28200400
MSCW=-1, RCW=+0, 28200800
MFID=RCW+1, FID=MFID+1, 28201000
XX1=FID+1, XX2=XX1+1, 28201200
TMP=XX2+1, TEMP=TMP+1, 28201400
FA=TEMP+1, FAINFO=FA+1, 28201600
FASZ=FAINFO+1, FAIN=FASZ+1, 28201800
IU=FAIN+1, T=IU+1, 28202000
FPBPTR=T+1, IREEL=FPBPTR+1, 28202200
NM1=IREEL+1, NM2=NM1+1, 28202400
DESTIN=NM2+1, TOGS=DESTIN+1, 28202600
DA=TOGS+1, OU=DA+1, 28202800
OREEL=OU+1, N=OREEL+1, 28203000
CNT=N+1, INC=CNT+1, 28203200
OUC=INC+1, Y=OUC+1, 28203400
W=Y+1, SIZE=W+1, 28203600
Q=SIZE+1, J=Q+1, 28203800
TM=J+1, K=TM+1, 28204000
U=K+1, SV=U+1, 28204200
UNITNO=SV+1; 28204400
ARRAY 28204600
H=UNITNO+1[*], AROW=H+1[*], 28204800
IOD=AROW+1[*], LAB=IOD+1[*], 28205000
LBL=LAB+1[*], WRDSZ=LBL+1[*]; 28205200
ARRAY HDR=XX1[*]; 28205400
$ SET OMIT = NOT(B6500LOAD) 28205600
DEFINE 28206400
DSED = TERMSET(P1MIX)#, 28206600
SPOUNIT = 0#, 28206800
SPACER = 5&@1400[CTF]#, 28207000
MM = @37700040#, 28207200
FINDTHETAPE = LIBRARYHELP(1)#, 28207400
ABORT = LIBRARYHELP(2)#, 28207600
SWITCHREELS = LIBRARYHELP(11)#, 28207650
UNITNUM = [1:5]#, %160-28207700
LATEST = DA.[5:1]#, 28207800
ADDV = DA.[6:1]#, 28208000
UNLOAD = DA.[8:1]#, 28208200
MUSTADD = DA.[13:1]#, %160-28208300
BHS = TOGS.[21:1]#, 28208400
FORKED = TOGS.[23:1]#, 28208600
B6500 = TOGS.[24:1]#, 28208800
OE = TOGS.[26:1]#, 28209000
SOMECOPIED = TOGS.[28:1]#, 28209100
REELSW = TOGS.[33:1]#, 28209200
SKIPDIR = TOGS.[35:1]#, 28209400
SPACITSW = TOGS.[36:1]#, 28209600
CHKLBL = TOGS.[37:1]#, 28209800
COPYING = TOGS.[38:1]#, 28209900
OUTAPEPARITY = TOGS.[39:1]#, 28210000
SKIPFILE = TOGS.[40:1]#, 28210200
NOLBL = TOGS.[41:1]#, 28210400
DUMPDIR = TOGS.[42:1]#; 28210600
LABEL UP,BAC,WATE,LOOP,BACK,TTPF,BH,DK,WY,BADHDR,PRE; 28210800
LABEL TRYNEXT,PARERR,HANDLERR,NEXT,SKIPPER,FALLOUT; 28211000
%*********************************************************** 28211200
DEFINE NOTCOPIED(NOTCOPIED1) = 28211400
BEGIN NT3:=NOTCOPIED1; NOCOYMESS; END#; 28211600
SUBROUTINE NOCOPYMESS; 28211800
LBMESS( ABS(MFID), FID, -67, NT3, TINU[IU], SPOUTUNIT, 1 ); 28212000
%*********************************************************** 28212200
% 28212201
% - READS BEGINNING LABEL AND TAPE MARK CHECKING FOR 28212202
% CORRECTNESS OF LIBRARY TAPE SOURCE 28212203
% 28212204
%************************************************************ 28212205
% 28212206
BOOLEAN SUBROUTINE LABELCHECK; 28212400
BEGIN 28212600
TRYNEXT: 28212800
IF WAITIO(LAB INX @120540000000,@40&@20[CTF],IU)=@40 AND 28213000
NOT B6500 RHWN % PREMATURE EOT 28213200
BEGIN STREAM(T:=T:=SPACE(5)); 28213400
BEGIN DS:=16LIT". PREMATURE EOT~"; END; 28213600
GO PRE; 28213800
END; 28214000
$ SET OMIT = NOT(B6500LOAD) 28214600
IF @40!WIATIO(SPACER,@40,IU) THEN 28216400
P(WAITIO(@4740000005,0,IU),DEL); 28216600
IF DSED THEN ABORT; 28216800
IF (NOT B6500 AND ((NFLAG(LAB[0]).[6:42] EQV "LABEL ")!NOT 0 28217000
OR (NFLAG(LAB[2]).[6:42] EQV "FILE")!NOT 0)) 28217200
$ SET OMIT = NOT(B6500LOAD) 28217400
THEN BEGIN 28218200
STREAM(A:=[TINU[IU]],T:=T:=SPACE(10)); 28218400
BEGIN SI:=A;SI:=SI+5;DS:=LIT".";DS:=3 CHR; 28218600
DS:=21 LIT" NOT A LIBRARY TAPE~"; 28218800
END; 28219000
PRE: SPOUT(T); T:=1; 28219200
END ELSE T:=0; 28219400
IF T=0 AND NOT B6500 THEN 28219600
IF NFLAG(LAB[2]).[30:18]=0 AND SKIPDIR THEN 28219800
BEGIN 28220000
SPACITSW:=1; CHKLBL:=FALSE; 28220200
GO TO BACK; %BRANCH INTO SPACIT. 28220400
BAC: 28220600
SPACITSW:=0; CHKLBL:=TRUE; 28220800
GO TO TRYNEXT; 28221000
END; 28221200
LABELCHECK:=T; 28221400
END; 28221600
%*********************************************************** 28221800
% 28221801
% - READS ENDING LABEL CHECKING TO SEE IF INPUT TAPE 28221802
% REEL SWITCHING IS IN ORDER 28221803
% 28221804
%************************************************************ 28221805
% 28221806
BOOLEAN SUBROUTINE ENDOFREEL; 28222000
BEGIN 28222200
BLASTQ(IU); 28222400
IF P(WAITIO(LAB INX @120540000000,@2000040,IU),DUP)=@20 THEN 28222600
BEGIN % PAR ON ENDING LABEL:TEST FOR LAST FILE ON TAPE(EOF) 28222800
LAB[4]:=(*P(DUP))&(WAITIO(SPACER,@40,IU)=@40)[47:47:1]; 28223000
P(WAITIO(5&@3400[CTF],@377,IU),DEL); 28223200
END; 28223400
$ SET OMIT = NOT(B6500LOAD) 28223600
IF B6500 THEN P(DEL) ELSE NT1:=P; 28225000
IF DSED THEN ABORT; 28225200
IF ((NOT B6500) AND NFLAG(LAB[4]) AND NT1!@40) 28225400
$ SET OMIT = NOT(B6500LOAD) 28225600
THEN BEGIN 28226200
STOPTIMING(FPBPTR,1023);% 28226400
SETNOTINUSE(IU,0); 28226600
IREEL:=IREEL+1; 28226800
$ SET OMIT = NOT(B6500LOAD) 28227000
NM2:=LAB[2]; 28228200
NM1:=LAB[1]; 28228400
FINDTHETAPE; 28228600
ENDOFREEL:=TRUE; 28228800
END ELSE ENDOFREEL:=FALSE; 28229000
END; % OF SUBROUTINE ENDOFREEL 28229200
%*********************************************************** 28229400
SUBROUTINE SPACIT;% 28229600
BEGIN 28229800
BACK: WHILE WAITIO(SPACER,MM,IU)!@40 DO 28230000
BEGIN 28230200
IF DSED THEN ABORT; 28230400
IF STOPSET(P1MIX) THEN STOPM(0); 28230600
END; 28230800
IF ENDOFREEL AND NOT SPACITSW THEN GO BACK; 28231000
IF SPACITSW THEN GO BAC; % BRANCH TO LABELCHECK ELSE EXIT 28231200
END; 28231400
%*******************************************************************28231600
SUBROUTINE WRITENDINGLABEL; 28231800
BEGIN 28232000
P(WAITIO([TM],@40,OU),DEL); 28232200
P(WAITIO(LBL&@5000[CTF],@40,OU),DEL); 28232600
IF DSED THEN ABORT; 28232800
END; % OF WRITE ENDING LABEL 28233000
%*********************************************************** 28233200
% 28233201
% - HANDLES IO"S FOR DISK-TO-TAPE, TAPE-TO-DISK, OR TAPE- 28233202
% TO-TAPE TRANSFER INCLUDING B6500 TAPE SIZE ALTERATIONS 28233203
% 28233204
%************************************************************ 28233205
% 28233206
SUBROUTINE IO; 28233400
BEGIN 28233600
SIZE:=IF (N-CNT) GTR 30 THEN 900 ELSE (N-CNT)|30; 28233800
IF U LSS 16 28234000
THEN 28234200
BEGIN 28234400
TMP:=@500000000; 28234600
IF IOD[W].[24:1] 28234800
THEN TMP:=TMP+B6500 28235000
ELSE BEGIN SIZE:=SIZE+B6500; WRDSZ[W]:=SIZE; END; 28235200
IOREQUEST(-(IOD[W]:=(AROW[W] INX TMP)& 28235400
SIZE[8:38:10]& 28235600
TINU[U][3:3:5]& 28235800
(NOT IOD[W])[24:24:1]) OR @2017700000, 28236000
IOD[W], 28236200
[IOD[W]]&U[12:42:6]); 28236400
END 28236600
ELSE 28236800
BEGIN 28237000
DISKIO(IOD[W],(AROW[W] INX B6500-1)&(NOT IOD[W])[1:24:1], 28237200
SIZE,Q+CNT); 28237400
$ SET OMIT = NOT(STATISTICS) 28237600
END; 28238200
END; 28238400
%********************************************************** 28238600
% 28238601
% - COPYS EACH ROW OF A FILE CHECKING FOR ERRORS, INCORRECT 28238602
% RECORD SIZE IN TRANSFER, AND KEYIN REEL SWITCHING 28238603
% 28238604
%************************************************************ 28238605
% 28238606
SUBROUTINE COPYAROW; 28238800
BEGIN 28239000
N:= 28239200
$ SET OMIT = NOT(B6500LOAD) 28239400
H[8]; 28240000
Q:=H[K+9]; 28240200
CNT:=W:=INC:=0; OUC:=-30; 28240400
IOD[0]:=IOD[1]:=IOMASK; 28240600
U:=IU; 28240800
LOOP: 28241000
IO; 28241200
WATE: 28241400
W:=1-W; 28241600
IF IOD[W] NEQ IOMASK THEN 28241800
COMPLEXSLEEP((((IOD[W]) AND IOMASK) NEQ 0) OR DSED); 28242000
IF DSED THEN ABORT; 28242200
IF (Y:=IOD[W]).[27:2] NEQ 0 28242400
THEN BEGIN LIBRARYHELP(6); 28242600
IF OUTAPEPARITY OR SKIPFILE THEN GO HANDLERR; 28242800
END 28243000
ELSE IF (Y.[7:1] AND Y.[24:1]) 28243200
THEN IF (M[AROW[W] INX NOT 0]) NEQ WRDSZ[W] 28243400
THEN BEGIN LIBRARYHELP(10); 28243600
GO HANDLERR; 28243800
END ELSE ELSE 28244000
IF JAR[P1MIX[X,9].[1:1] % RC KEYIN 28244010
THEN BEGIN 28244020
JAR[P1MIX,9]:=(*P(DUP)) & 0[1:47:1]; 28244030
SWITCHREELS; 28244040
END; 28244050
IF IOD[W].[24:1] % LAST THING DONE ON THIS BUFFER WAS READ 28244200
THEN BEGIN U:=OU; CNT:=OUC:=OUC+30; GO LOOP; END; 28244400
IF (CNT:=INC:=INC+30) LSS N % MORE READING NECESSARY 28244600
THEN BEGIN U:=IU; GO LOOP; END; 28244800
IF IOD[1-W] NEQ IOMASK 28245000
THEN BEGIN IOD[W]:=IOMASK; GO WATE; END; 28245200
HANDLERR: 28245400
END; 28245600
%************************************************************ 28245800
P(MSCW,STF); RCW:=RCW&P(..LIBRARYTRANSFER,LOD)[CTC]; 28246000
IF FASZ GTR 0 THEN LIBRARYHELP(5) ELSE IU:=OU:=(FPBPTR:=0)-1; %134-28246200
FOR J:=0 STEP 1 UNTIL (FASZ DIV 2)-1 DO 28246400
BEGIN 28246600
COPYING:=FALSE; 28246700
% 28246701
%******************************************* 28246702
% FPB FIXUP ON CHANGE OF INPUT SOURCE 28246703
%******************************************* 28246704
% 28246705
IF DA.[CF] NEQ (TMP:=M[SV:=FAINFO+J].[CF]) THEN 28246800
BEGIN IF IU NEQ (-1) THEN 28247000
BEGIN IF IU LSS 16 THEN SETNOTINUSE(IU,0); 28247200
STOPTIMING(FPBPTR,1023); 28247400
END; 28247600
IF FORKED THEN 28247800
BEGIN 28248000
STARTIMING(FPBPTR:=5,TMP); 28248200
IF TMP LSS 16 THEN 28248400
STREAM(MF:=MULTITABLE[TMP],F:=LABELTABLE[TMP], 28248600
B:=PRT[P1MIX,3] INX 5); 28248800
BEGIN SI:=LOC MF; DS:=16CHR; 28249000
END 28249200
ELSE 28249400
STREAM(B:=PRT[P1MIX,3] INX 5); 28249600
BEGIN DS:=16LIT"0DIRCTRY0DISK "; END; 28249800
RDCTABLE[TMP].[8:10]:=P1MIX; 28250000
END ELSE 28250200
WHILE (TEMP:=M[(NT1:=(PRT[P1MIX,3] INX (FPBPTR:= 28250400
FPBPTR+5)))+3].[36:6]-1) NEQ TMP DO 28250600
IF M[NT1+4] LSS 0 THEN % NOT AREADY STOPPED 28250800
BEGIN IF TEMP LSS 16 THEN SETNOTINUSE(TEMP,0); 28251000
STOPTIMING(FPBPTR,1023); 28251200
END; 28251400
IU:=TMP; % AT THIS POINT IU CHANGES 28251600
IF IU LSS 16 THEN 28251800
IREEL:=RDCTABLE[IU].[14:10]; % PICK UP REEL NO. 28252000
$ SET OMIT = NOT(B6500LOAD) 28252200
END; 28252800
DA:=M[SV]; 28253000
MFID:=M[FA+J|2]; FID:=M[FA+1+J|2]; 28253200
SKIPFILE:=FALSE; 28253400
IF IU=18 28253600
THEN BEGIN 28253800
% 28253801
%******************************************* 28253802
% INPUT SOURCE DISK 28253803
%******************************************* 28253804
% 28253805
DISKWAIT(-H.[CF],30,DA.[FF]); 28254000
IF DESTIN.UNITNUM = 19 %148-28254200
THEN BEGIN 28254400
ABORT; 28254600
END 28254800
ELSE BEGIN 28255000
% 28255001
%******************************************* 28255002
% OUTPUT TO TAPE 28255003
%******************************************* 28255004
% 28255005
TIPE: STREAM(A:=J+1,B:=[LBL[2]]); 28255200
BEGIN SI:=LOC A;DI:=DI+5;DS:=3 DEC END; 28255400
LABELTABLE[OU]:=-LBL[2]; % ENTER FILE ID FOR OL MESSAGE 28255600
H[9]:=(*P(DUP)) AND 31; 28255800
IF NOLBL THEN NOLBL:=FALSE ELSE 28256000
BEGIN 28256200
P(WIATIO(LBL&@5000[CTF],@40,OU),DEL); 28256400
P(WAITIO([TM],@40,OU),DEL); 28256800
END; 28257200
IF BHS OR (P([H[9]],LOD,DUP)=0 OR P(XCH) GTR 20) 28257400
THEN BEGIN 28257600
BADHDR: LIBRARYHELP(9); 28257800
GO NEXT; 28258000
END; 28258200
P(WAITIO(H&@5000[CTF],@40,OU),DEL); 28258400
UP: COPYING:=TRUE; 28258600
IF DSED THEN ABORT; 28258700
FOR K:=1 STEP 1 UNTIL H[9].[43:5] DO% WRITE OUT FILE 28258800
IF H[K+9]!0 THEN 28259000
BEGIN 28259200
COPYAROW; 28259400
IF OUTAPEPARITY THEN 28259600
BEGIN 28259800
OUTAPEPARITY:=FALSE; 28260000
GO UP; 28260200
END; 28260400
IF SKIPFILE THEN GO NEXT; 28260600
IF STOPSET(P1MIX) THEN STOPM(0); 28260800
END; 28261000
COPYING:=FALSE; 28261100
IF OU LSS 16 THEN WRITENDINGLABEL; 28261200
IF IU LSS 16 THEN 28261400
$ SET OMIT = NOT B6500LOAD 28261600
IF WAITIO(SPACER,MM,IU) NEQ @40 THEN 28262200
BEGIN NOTCOPIED(56); LIBRARYHELP(8); GO NEXT; END; 28262400
$ SET OMIT = PACKETS 28262600
BEGIN 28263200
STREAM(MFID,FID,A:=TINU[IU],B:=TINU[OU],T:=T:=SPACE(10)); 28263400
BEGIN SI:=LOC MFID; SI:=SI+1; DS:=7CHR; DS:=LIT"/"; 28263600
SI:=SI+1; DS:=7CHR; DS:=13LIT" COPIED FROM "; 28263800
SI:=SI+5; DSD:=3CHR; DS:=4LIT" TO "; SI:=SI+5; 28264000
DS:=3CHR; DS:=LIT"~"; 28264200
END; 28264400
SPOUTER(T,0,L,LIBMSG); 28264600
END; 28264800
SOMECOPIED:=TRUE; 28264900
IF IU=18 THEN 28265000
BEGIN P(DIRECTORYSEARCH(-(DS.[FF],13,20),DEL); 28265200
M[FAINFO+J].[17:1]:=1; 28265400
END; 28266000
IF OU=18 THEN 28266200
BEGIN P(DIRECTORYSEARCH(-MFID,FID,14),DEL); OE:=0; END; 28266400
IF DUMPDIR THEN 28266600
BEGIN LIBRARYHELP(7); 28266800
IF (Y:=IOD[W]).[27:2] NEQ 0 THEN 28267000
IF Y.[28:1] THEN 28267200
BEGIN STREAM(T:=T:=SPACE(7)); 28267400
BEGIN DS:=31LIT"PARITY WHILE WRITING DIRECTORY~"; 28267600
END; 28267800
SPOUT(T); ABORT; 28268000
END ELSE 28268200
LIBRARYHELP(6); 28268400
IF NOT IOD[W].[27:1] THEN 28268600
BEGIN WRITENDINGLABEL; DUMPDIR:=0; END ELSE NOLBL:=1; 28268800
END; 28269000
IF IU LSS 16 THEN 28269400
$ SET OMIT = NOT B6500LOAD 28269600
GO FALLOUT; 28270200
END; 28270400
END 28270600
ELSE BEGIN % SOURCE TAPE 28270800
% 28270801
%******************************************* 28270802
% INPUT SOURCE TAPE 28270803
%******************************************* 28270804
% 28270805
%******************************************* %160-28270806
% CHECK IF FILE IS TO BE ADDED %160-28270807
%******************************************* %160-28270808
% %160-28270809
IF ADDV THEN %160-28270810
IF NOT MUSTADD THEN %160-28270812
IF DESTIN.UNITNUM = 19 THEN% TAPE TO DISK %160-28270814
IF DIRECTORYSEARCH(-MFID,FID,5) NEQ 0% ALREADY ON DISK %160-28270816
THEN BEGIN %160-28270818
LBMESS(ABS(MFID),FID,-67,68,TINU[IU],SPOUTUNIT,LIBMSG); 28270820
IF STOPSET(P1MIX) THEN STOPM(0); %160-28270822
IF DSED THEN ABORT; %160-28270824
GO NEXT; %160-28270826
END %160-28270828
ELSE BEGIN M[FAINFO+J].[13:1]:=1; MUSTADD:=1 END; %160-28270830
IF LABELCHECK THEN ABORT; 28271000
$ SET OMIT = NOT(B6500LOAD) 28271200
% 28272201
%******************************************* 28272202
% POSITION THE TAPE TO CORRECT FILE 28272203
% USING INFO. IN "FAINFO" ENTRY (UA) 28272204
%******************************************* 28272205
% 28272206
STREAM(B:=LAB[2],SV:=[SV]); 28272400
BEGIN SI:=LOC B; SI:=SI+5; DS:=3OCT; END; 28272600
IF SV NEQ DA.[FF] THEN BEGIN J:=J-1; GO SKIPPER; END; 28272800
IF WAITIO((*[AROW[0]])&@5400[CTF],@2000000,IU)=@20 28273000
THEN BEGIN P(1); GO BH; END; % RD HDR CHKING FOR PARITY 28273200
MOVE(30+5|B6500,AROW[0].[CF]+B6500,H); 28273400
$ SET OMIT = NOT B6500LOAD 28273600
T:=-1; 28275800
IF (NOT B6500) AND (M[AROW[0] INX NOT 0] NEQ 30) 28276000
THEN P(1) 28276200
ELSE 28276400
BEGIN STREAM(A:=0:D:=H); 28276600
BEGIN SI:=D; 30(IF SB THEN BEGIN TALLY:=1; JUMP OUT END28276800
ELSE SI:=SI+8); A:=TALLY; 28277000
END; 28277200
IF P THEN P(1) 28277400
ELSE IF (NT1:=H[9].[43:5]) GTR 20 OR NT1=0 28277600
THEN P(1) 28277800
ELSE 28278000
BEGIN SV:=0; 28278200
FOR W:=10 STEP 1 UNTIL 29 DO 28278400
BEGIN SV:=SV+(NT2:=(H[W] NEQ 0)); 28278600
IF W GEQ NT1+10 THEN IF NT2 THEN W:=31; 28278800
END; 28279000
IF ((W=31) OR (SV GTR NT1) OR ((SV NEQ 0) AND 28279200
(H[8]=0))) 28279400
THEN P(1) 28279600
ELSE P(0); 28279800
END; 28280000
END; 28280200
BH: BHS:=P(XCH); 28280400
IF BHS THEN 28280600
IF DESTIN.UNITNUM = 19 THEN GO BADHDR ELSE GO TTPE; %148-28280800
IF DESTIN.UNITNUM = 19 %148-28281000
THEN 28281200
BEGIN % TAPE TO DISK (LOAD) 28281400
% 28281401
%******************************************* 28281402
% OUTPUT TO DISK 28281403
%******************************************* 28281404
% 28281405
IF MUSTADD THEN T:=0 ELSE% ADD FILE NOT ON DISK %160-28281550
IF (T:=DIRECTORYSEARCH(MFID&(3+4|(ADDV))[1:45:3], 28281600
FID,4+ADDV)) GEQ 2 28281800
THEN 28282000
IF T=2 THEN NOTCOPIED(25) 28282200
ELSE BEGIN 28282400
IF (SV:=NOT ADDV AND M[T+2] NEQ 0 AND 28282600
((USERCODE[P1MIX] EQV ABS(MCP)) NEQ NOT 0) AND 28282800
((USERCODE[P1MIX] EQV ABS(M[T+2])) NEQ NOT 0)) OR 28283000
(LATEST AND M[T+3].[30:18] GTR H[3].[30:18]) THEN 28283200
BEGIN 28283400
HEADERUNLOCK(ABS(MFID),FID,T); 28283600
T:=-1; 28283800
NOTCOPIED(64-SV|23); 28284000
END; 28284200
END 28284400
ELSE 28284600
IF T=1 THEN % IT WAS "IF-ED" 28284800
BEGIN T:=-1; 28285000
NOTCOPIED(45); 28285200
END ELSE IF DSED THEN ABORT; 28285400
OE:=(T GEQ 64); 28285600
IF T=0 OR (T GEQ 64 AND NOT ADDV) THEN 28285800
BEGIN % LOAD IT 28286000
IF T GEQ 64 THEN 28286200
IF M[T+8]!H[8] THEN 28286400
BEGIN 28286600
FORGETSPACE(T); 28286800
P(DIRECTORYSEARCH(MFID,FID,6),DEL); 28287000
T:=0; 28287200
END; 28287400
IF T=0 THEN 28287600
BEGIN 28287800
T:=GETSPACE(30,DISKHEADERAREAV,1)+2;% %167-28288000
MOVE(30,T-1,T); 28288200
M[T+4]:=-0&SYSNO[4:46:2]&1[2:47:1]; 28288400
END ELSE 28288600
TMP:=T.[18:15]; 28288800
HDR := [M[T]] & 30[8:38:10]; 28289000
FOR W:=H[9].[43:5]+10 STEP 1 UNTIL 29 DO H[W]:=0; 28289200
IF (HDR[9]:=(*P(DUP)) AND 31) = 0 THEN HDR[7]:=-1; 28289400
FOR W:=HDR[9]+10 STEP 1 UNTIL 29 DO HDR[W]:=0; 28289600
W:=0; 28289800
WHILE (W:=W+1) LEQ H[9].[43:5] DO 28290000
IF H[9+W]!0 THEN 28290200
IF (H[9+W]:=HDR[9+W]) LEQ 0 THEN 28290400
OK: IF(H[9+W]:=PETUSERDISK(H[8] OR M,COMMON)) LSS 1 THEN 28290600
BEGIN 28290800
WY: TEMP:=SPACE(10); 28291000
STREAM(J:=JARROW[P1MIX],P1MIX,H:=H[8],M:=MFID,F:=FID,28291200
TEMP); 28291400
BEGIN DS:=14 LIT "#NO USER DISK:"; SI:=J;SI:=SI+1; 28291600
DS:=7CHR;DS:=LIT"/";SI:=SI+1;DS:=7CHR;DS:=LIT"="; 28291800
SI:=LOC P1MIX;DS:=2DEC;J:=DI;DI:=DI-2;DS:=FILL;DI:=J;28292000
DS:=LIT"(";SI:=LOC M;SI:=SI+1;DS:=7CHR;SI:=SI+1; 28292200
DS:=LIT"/";DS:=7CHR;DS:=2LIT")-";SI:=LOC H;DS:=8 DEC;28292400
DS:=7LIT" SEGS.~"; DI:=DI-15; DS:=7FILL; 28292600
END; 28292800
SPOUT(TEMP); 28293000
REPLY[P1MIX] := -(TEMP:=VIF&VWY[36:42:6]& 28293200
VOF[30:42:6]&VOK[24:42:6]); 28293400
COMPLEXSLEEP(REPLY[P1MIX]}0 OR DSED 28293600
OR PRT(P1MIX,@25]=5); 28293800
IF NOT WHYSLEEP(TEMP) THEN GO TO WY; 28294000
IF REPLY[P1MIX]=VOK THEN GO TO OK; 28294200
IF REPLY[P1MIX]=VOF THEN 28294400
BEGIN COMMON := COMMON AND NOT M; GO TO OK; END; 28294600
FOR W:=W STEP -1 UNTIL 1 DO 28294800
IF H[9+W]!0 THEN 28295000
IF HDR[9+W]=0 THEN 28295200
FORGETUSERDISK(H[9+W],-H[8]); 28295400
FORGETSPACE(T); 28295600
IF DSED THEN ABORT; 28295800
IF HDR[9]!0 THEN 28296000
BEGIN 28296200
P(DIRECTORYSEARCH(MFID,FID,14),DEL); 28296400
OE:=0; 28296600
END; 28296800
NOTCOPIED(31); 28297000
IF J NEQ ((FASZ DIV 2)-1) THEN SPACIT; 28297200
GO NEXT; 28297400
END; 28297600
STREAM(A:=[H[1]],D:=DATE); 28297800
BEGIN SI:=LOC D;DI:=LOC D;DS:=8 OCT; 28298000
SI:=SI-4;DI:=A;DS:=4 CHR; 28298200
END; 28298400
H[4]:=M[T+4]&H[4][8:8:3]&0[11:47:1]&H[4][36:36:6] 28298600
&H[4][43:43:1]; 28298800
H[1].[25:23]:=XCLOCK+P)RTR); 28299000
IF HDR[9]=0 THEN 28299200
ENTERUSERFILE(ABS(MFID),FID,H,[CF]-1) 28299400
ELSE 28299600
BEGIN W:=IF H[9] LSS HDR[9] THEN HDR[9] ELSE H[9]; 28299800
FOR W:=W+9 STEP -1 UNTIL 10 DO 28300000
IF H[W]=0 THEN 28300200
IF HDR[W]!0 THEN % EXTRA ROW IN DISK FILE 28300400
FORGETUSERDISK(HDR[W],HDR[8]) ELSE ELSE 28300600
$ SET OMIT = NOT SHAREDISK 28300800
;DISKWAIT(H INX 0,30,TMP); 28301600
END; 28301800
FORGETSPACE(T); 28302000
GO UP; 28302200
END % OF LOAD IT 28302400
ELSE IF J=((FASZ DIV 2)-1) THEN GO NEXT ELSE GO SKIPPER; 28302600
END % OF TAPE TO DISK 28302800
ELSE GO TIPE; 28303000
SKIPPER: DO UNTIL WAITIO(SPACER,MM,IU)=@40 OR DSED; 28303200
IF STOPSET(P1MIX) THEN STOPM(0); 28303400
IF DSED THEN ABORT; 28303600
FALLOUT: IF ENDOFREEL THEN GO SKIPPER; 28303800
END; 28304000
NEXT: 28304200
END; 28304400
IF NOT SOMECOPIED THEN 28304500
BEGIN STREAM(T:=T:=SPACE(5)); 28304510
BEGIN DS:=18LIT"NULL LIBRARY COPY~"; END; 28304520
SPOUT(T); 28304530
END; 28304540
IF OU GEQ 0 THEN % WE HAVE AN OUTPUT UNIT %130-28304590
IF (DESTIN.UNITNUM!19) THEN P(WAITIO([TM],@40,OU),DEL); %148-28304600
IF IU GEQ 0 THEN % WE HAVE AN INPUT UNIT %130-28304700
IF IU LSS 16 THEN SETNOTINUSE(IU,0); 28304800
IF FORKED 28305000
THEN STOPTIMING(FPBPTR,1023); 28305200
ELSE FOR TMP:=FPBPTR SETP 5 UNTIL (NT1:=PRT[P1MIX,3]).[8:10]-5 DO 28305400
IF M[NT1 INX (TMP+4)] LSS 0 THEN 28305600
BEGIN IF (TEMP:=M[NT1 INX (TMP+3)].[36:6]-1) LSS 16 THEN 28305800
SETNOTINUSE(TEMP,0); 28306000
STOPTIMING(TMP,1023); 28306200
END; 28306400
IF OU GEQ 0 THEN % WE HAVE AN OUTPUT UNIT %130-28306500
IF OU LSS 16 THEN SETNOTINUSE(OU,1); 28306600
STOPTIMING(0,1023); 28306800
$ SET OMIT = PACKETS 28307000
TMP:=FASZ DIV 2 - 1; %757-28307700
FOR J:=0 STEP 1 UNTIL TMP DO %757-28307705
IF (DS:=M[FAINFO+J]).[CF]=18 THEN % FROM DISK %757-28307710
IF UNLOAD THEN %757-28307715
BEGIN MFID:=M[FA+J|2]; FID:=M[FA+1+J|2]; %757-28307720
P(DIRECTORYSEARCH(-MFID&1[3:47:1].FID,7),DEL); %757-28307725
IF DSED THEN GO TO INITIATE; %757-28307730
END; %757-28307735
GO INITIATE; 28307800
END OF LIBRARYTRANSFER; 28308000
PROCEDURE LIBRARYCOPY; 28400000
% 28400002
%***********************************************************************28400004
% 28400006
% 28400008
% LIBRARYCOPY PERFORMS THE INITIAL SETUP OF FILE NAMES AND 28400010
% INFORMATION BASED ON DATA PASSED THROUGH ESPDISK FROM THE 28400012
% PROCEDURE CCLIB. THIS INFORMATION WILL BE PLACED IN THE 28400014
% FILE ARRAY "FA" AND ITS COUNTERPART "FAINFO" FOR USE LATER 28400016
% IN LIBRARYTRANSFER. IT OPERATES ON EACH <COPY SPECIFICATION> 28400018
% (REFER TO BNF DOCUMENTATION) ONE AT A TIME UNTIL THE CONTROL 28400020
% CARD HAS BEEN EXHAUSTED. 28400022
% 28400024
% THERE ARE TWO METHODS OF FINDING FILES ON A DISK INPUT SOURCE. 28400026
% ONE IS TO USE IT AS IF IT WERE A LARGE TAPE, USING THE DISK 28400028
% DIRECTORY LIKE A LARGE TAPE DIRECTORY (NOHASH); THE OTHER IS 28400030
% TO USE THE PROCEDURE SEEKNAM TO OBTAIN NAMES VIA A HASHING 28400032
% TECHNIQUE. IRREGARDLESS OF THE NAME FINDING METHOD, ONCE YOU 28400034
% HAVE A NAME PAIR THE PROCEDURE FOLLOWED IS THE SAME: 28400036
% 28400038
% 1: DETERMINE IF NAME PAIR HAS BEEN ASKED FOR BY CONTROL CARD 28400040
% 28400042
% 2: CHECK TO SEE IF IT APPEARS IN THE "EXCEPT" LIST FOR THAT 28400044
% NAME PAIR 28400046
% 28400048
% 3: IF DISK, MAKE SURE IT IS ACCESSABLE 28400050
% 28400052
% 4: CHANGE NAME IF SPECIFIED BY "AS" CLAUSE 28400054
% 28400056
% 5: CHECK THAT NAME PAIR HAS NOT ALREADY BEEN PROCESSED 28400058
% 28400060
% 6: INSERT NAME PAIR INTO "FA" 28400062
% INSERT NAME PAIR INFORMATION INTO "FAINFO" 28400064
% 28400066
% AT STEP 6, IT MUST BE DETERMINED AS TO WHETHER THE USER 28400068
% SPECIFIED MAXIMUM NUMBER OF FILES PER OUTPUT UNIT HAS BEEN 28400070
% EXCEEDED. IF SO, AN ATTEMPT TO FORK ANOTHER LIBMAIN/DISK TO 28400072
% HANDLE THE CURRENT "FA" WILL BE INITIATED (REFER TO DOCUMENTATION), 28400074
% AND THE PROCESS WILL CONTINUE WITH A NEW "FA". A LINKED LIST 28400076
% OF "FA"S IS KEPT BY THE ORIGINATING LIBMAIN/DISK FOR THE 28400078
% CONFLICT RESOLUTION OF STEP 5. 28400080
% 28400082
% 28400084
% COMMON.[2:1] INDICATES ORIGINATING LIBMAIN/DISK 28400086
% 28400088
% IF ORIGINATOR... 28400090
% 28400092
% .[3:6] UNITNO FOR PACKETS 28400094
% .[9:9] MAXIMUM NUMBER OF FILES PER OUTPUT UNIT 28400096
% .[CF] FIRST ESPDISK SEGMENT ADDRESS 28400098
% 28400100
% IF NOT ORIGINATOR... 28400102
% 28400104
% .[3:45] DISK ADDRESS OF "FA" AND "FAINFO" FOR THIS 28400106
% FORKED LIBMAIN/DISK 28400108
% 28400110
% FA FILE ARRAY FOR NAME PAIRS 28400112
% 28400114
% FAINFO TRANSFER INFORMATION FOR ASSOCIATED NAME PAIR 28400116
% 28400118
% FAIN INDEX INTO "FA" 28400120
% 28400122
% FASZ SIZE OF "FA" 28400124
% 28400126
% MFID MULTI-FILE ID 28400128
% 28400130
% FID FILE ID 28400132
% 28400134
% ASMFID MULTI-FILE ID AFTER STEP 4. 28400136
% 28400138
% ASFID FILE ID AFTER STEP 4. 28400140
% 28400142
% FPBPTR CURRENT INDEX OF FPB ENTRY 28400144
% 28400146
% DESTIN USER SPECIFIED DESTINATION 28400148
% 28400150
% TOGS.[3:1] (ACCESS0) SPECIFIES CHECK ACCESSD BIT 28400152
% .[4:1] (EXPIRED) CHECK FOR FILE BEING EXPIRED 28400154
% .[7:1] (NOHASH) USE DISK SERIALLY 28400156
% .[18:1] (OK) FILE HAS PASSED STAGE 3. 28400158
% .[19:1] (INXLST) FILE OCCURRED IN "EXCEPT" LIST 28400160
% .[20:1] (WEIRDFORK) SOME ALTERATIONS TO "FA" ARE 28400162
% NECESSARY BEFORE FORKING 28400164
% .[23:1] (FORKED) NOT ORIGINATING LIBRARYCOPY 28400166
% .[25:1] (SOURCEFILEFOUND) AT LEAST ONE FILE FROM THIS 28400168
% SOURCE WAS USED 28400170
% 28400172
% CCA HOLDS ESPDISK SEGMENTS FROM CCLIB 28400174
% 28400176
% NA, 28400178
% EA, 28400180
% POOL USED IN PREPROCESSING CONTROL CARD INFO, FROM 28400182
% CCLIB FOR USE B LIBRARYCOPY 28400184
% 28400186
% MAX USER SPECIFIED MAXIMUM NUMBER OF FILES PER 28400188
% OUTPUT UNIT 28400190
% 28400192
% X DIRECTORY OF CURRENT SOURCE (TAPE OR HOHASH) 28400194
% 28400196
% 28400198
%***********************************************************************28400200
% 28400202
BEGIN 28400300
REAL COMMON=-4, 28400400
MFID,FID,ASMFID,ASFID,TMP,TEMP, % ADD NEW LOCALS BEYOND HERE 28400600
FA,FAINFO,FASZ,FAIN, 28400800
U,T,FPBPTR,EA,NM1,NM2,DESTIN,TOGS,DA, 28401000
CCAIN,FAIN,NAIN,NA,NASZ, 28401200
LSX,BUMPFA,POOL,INDX, 28401400
UN,SEG,MAX,K,L,MIDPTR,UNITNO; 28401600
ARRAY CCA[*],X[*],PAP[*],LAB[*],LBL[*],WRDSZ[*]; 28401800
$ SET OMIT = NOT(B6500LOAD) 28402000
LABEL NEXTNAME,BACK,UP,QUIT,NEXTSEG,NXT,TRANSFER; 28402800
LABEL NEXTSOURCE,CONTINUE,ON,BADNM; 28403000
% 28403200
%***************************************************** 28403400
% 28403600
DEFINE 28403800
ACCWESS0 = TOGS.[3:1]#, 28404000
EXPIRED = TOGS.[4:1]#, 28404200
NOHASH = TOGS.[7:1]#, 28404400
OK = TOGS.[18:1]#, 28404600
INXLST = TOGS.[19:1]#, 28404800
WEIRDFORK = TOGS.[20:1]#, 28405000
FORKED = TOGS.[23:1]#, 28405200
B6500 = TOGS.[24:1]#, 28405400
SOURCEFILEFOUND=TOGS.[25:1]#, 28405600
REEL1START=TGOS.[34:1]#, 28405800
% 28406000
%***************************************************** 28406200
% 28406400
DEFINE DSED = (TERMSET(P1MIX))#, 28406600
ABORT = (LIBRARYHELP(4)#, 28406800
RB5 = @3677777777777777#, 28407000
RB4 = @3577777777777777#, 28407200
NUMOPT = 6#, 28407400
UNITNUM = [1:5]#, %148-28407500
SPOUTUNIT = 0#; 28407600
%***************************************************** 28407700
DEFINE NOTCOPIED(NOTCOPIED1) = 28407800
BEGIN NT1:=NOTCOPIED1; NOCOPYMESS; END#; 28408000
SUBROUTINE NOCOPYMESS; 28408200
LBMESS( MFID, FID, -67, NT1, TINU[U], SPOUTUNIT, 1 ); % 28408400
% 28408600
%***************************************************** 28408800
% 28409000
SUBROUTINE GETASEGMENT; 28409200
BEGIN 28409400
SEG=CCA[29]; 28409600
DISKWAIT(-CCA,[CF],30,SEG); 28409800
FORGETESPDISK(SEG); 28410000
CCAIN:=0; 28410200
END; 28410400
% 28410600
%***************************************************** 28410800
% 28411000
% - USED TO CHECK THAT FILE NAME PAIRS HAVE 28411001
% NOT APPEARED BEFORE IN THIS OR ANY OTHER "FA" 28411002
% 28411003
%****************************************************** 28411004
% 28411005
REAL STREAM PROCEDURE RESOLVE(DIRADDR,MFID); VALUE DIRADDR; 28411200
BEGIN LABEL FOUND,FINIS,AGAIN; 28411400
SI:=DIRADDR; 28411600
AGAIN: DI:=MFID; 28411800
IF SC="0" THEN 28412000
BEGIN SI:=SI-8; 28412200
IF 16 SC=DC THEN GO FOUND; 28412400
SI:=SI-24; GO AGAIN; 28412600
END ELSE 28412800
IF SC="+" THEN GO FINIS ELSE 28413000
IF SC="&" THEN BEGIN SI:=SI+5; SI:=SC; GO AGAIN; END; 28413200
FOUND: RESOLVE:=SI; 28413400
FINIS: 28413600
END; 28413800
% 28414000
%***************************************************** 28414200
% 28414400
% - USED TO RESOLVE CONFLICTS AND PROCESS 28414401
% OPTIONS ASSOCIATED ONLY WITH DISK SOURCES 28414402
% 28414403
%****************************************************** 28414404
% 28414405
SUBROUTINE SEARCHDIRECTORY; 28414600
BEGIN 28414800
OK:= FALSE; 28415000
IF NOT SYSTEMFILE(MFID,FID) 28415200
AND ((MFID EQV "BADISK ") NEQ NOT 0) %163-28415250
THEN IF (T:=DIRECTORYSEARCH(MFID&1[3:47:1],FID OR M,3)) LSS 6428415400
THEN 28415600
IF T=1 THEN NOTCOPIED(45) ELSE NOTCOPIED(15) 28415800
ELSE BEGIN 28416000
IF M[T+2] NEQ 0 THEN 28416200
IF (USERCODE[P1MIX] EQV ABS(MCP)) NEQ NOT 0 THEN 28416400
IF (USERCODE[P1MIX] EQV ABS(M[T+2])) NEQ NOT 0 THEN 28416600
BEGIN 28416800
P(DIRECTORYSEARCH(-MFID,FID,13),DEL); 28417000
NOTCOPIED(41); 28417200
GO NEXTNAME; 28417400
END; 28417600
IF EXPIRED OR ACCESSED THEN 28417800
IF EXPIRED THEN 28418000
BEGIN 28418200
STREAM(T:=0:A:=CALCULATEPURGE(-M[T+3].[2:10])); 28418400
BEGIN SI:=LOC A; DI:=LOC T; DS:=8OCT; END; 28418600
IF P GTR M[T+3].[12:18] THEN OK:=TRUE ELSE 28418800
P(DIRECTORYSEARCH(-MFID,FID,13),DEL); 28419000
END ELSE 28419200
IF M[T+4].[11:1] THEN OK:=TRUE ELSE 28419400
P(DIRECTORYSEARCH(-MFID,FID,13),DEL) 28419600
ELSE OK:=TRUE; 28419800
END 28420000
ELSE BEGIN NOTCOPIED(25); T:=2; END; 28420200
NEXTNAME: 28420400
IF T GEQ 64 THEN FORGETSPACE(T); 28420600
END; 28420800
% 28421000
%***************************************************** 28421200
% 28421400
% - USED TO DITECT THAT A PARTICULAR NAME PAIR 28421401
% IS WANTED...BASED ON DATA SUPPLIED BY CCLIB 28421402
% 28421403
%****************************************************** 28421404
% 28421405
REAL STREAM PROCEDURE COMPARE(MFID,STR); VALUE STR; 28421600
BEGIN LABEL AG,FINIS; 28421800
SI:=STR; 28422000
AG: DI:=MFID; 28422200
IF SC=">" THEN GO FINIS; % END OF NA 28422400
IF SC="+" THEN BEGIN SI:=SI+8; DI:=DI+8; END 28422600
ELSE IF 8 SC NEQ DC THEN BEGIN SI:=SI+8; GO AG; END; 28422800
IF SC="+" THEN SI:=SI+8 28423000
ELSE IF 8 SC NEQ DC THEN GO AG; 28423200
SI:=SI=16; COMPARE:=SI; 28423400
FINIS: 28423600
END; 28423800
% 28424000
%***************************************************** 28424200
% 28424400
SUBROUTINE ASIT; 28424600
BEGIN 28424800
IF PAP.[FF] 28425000
THEN BEGIN ASMFID:=IF (NT2:=M[NT1:=PAP.[CF]+(PAP.[FF] DIV 2)])28425200
LSS 0 THEN MFID ELSE NT2; 28425400
ASFID:=IF (NT2:=M[NT1+1]) LSS 0 THEN FID ELSE NT2; 28425600
END 28425800
ELSE BEGIN ASMFID:=MFID; 28426000
ASFID:=FID; 28426200
END; 28426400
END; 28426600
% 28426800
%*************************************************** 28427000
% 28427200
% - THIS ROUTINE IS RESPONSIBLE FOR EXTENDING THE SIZE 28427201
% OF AN "FA" UNTIL IT NEEDS FORKING, AT WHICH TIME IT 28427202
% WILL ATTEMPT TO START ANOTHER LIBMAIN/DISK TO HANDLE 28427203
% THE CURRENT "FA". PROCESSING SHOULD CONTINUE WITH 28427204
% A NEW "FA" (REFER TO DOCUMENTATION) 28427205
% 28427206
%******************************************************* 28427207
% 28427208
SUBROUTINE INSERTORFORK; 28427400
BEGIN 28427600
IF RESOLVE(FA+FAIN+1,ASMFID)=0 28427800
THEN IF (FAIN:=FAIN+2) LSS MAX 28428000
THEN BEGIN 28428200
ON: IF FAIN GEQ FASZ 28428400
THEN BEGIN 28428600
TMP:=SPACE((FASZ:=FASZ+BUMPFA)+ 28428800
(FASZ DIV 2)+2)+1; 28429000
M[TMP-1]:=M[FA-1]; 28429200
MOVE(TEMP:=FASZ-BUMPFA,FA,TMP); 28429400
MOVE(TEMP DIV 2,FA+TEMP,TMP+FASZ); 28429600
FORGETSPACE(FA-1); 28429800
FA:=TMP; 28430000
FAINFO:=FA+FASZ; 28430200
END; 28430400
CONTINUE: M[NT1:=FA+FAIN]:=ASMFID; 28430600
M[NT1:=ASFID; 28430800
M[FAINFO+(FAIN DIV 2)]:=T&U[CTC]; 28431000
SOURCEFILEFOUND:=TRUE; 28431200
END 28431400
ELSE BEGIN 28431600
IF (U NEQ 18 AND U=M[FAINFO+(FAIN DIV 2)-1].[CF]) 28431800
THEN IF LSX=0 THEN GO ON ELSE 28432000
BEGIN 28432200
M[(FAIN:=SPACE(FASZ+(FASX DIV 2)+2)+1)-1]:= 28432400
(FA+LSX-1)&"&"[1:43:5]; 28432600
MOVE((SEG:=FAIN-LSX),FA+LSX,EAIN); 28432800
MOVE(SEG DIV 2,FAINFO+(LSX DIV 2), 28433000
EAIN+FASZ); 28433200
WEIRDFORK:=TRUE; 28433400
FAIN:=LSX; 28433600
END; 28433800
MOVE(FAIN DIV 2,FAINFO,FA+FAIN); 28434000
FOR TMP:=5 STEP 5 UNTIL FPBPTR-5 DO 28434200
IF M[PRT[P1MIX,3] INX (TMP+4)] LSS 0 THEN 28434400
STOPTIMING(TMP,1023); 28434600
LBMESS("LIBMAIN","DISK ",50,0,0,SPOUTUNIT,1); 28434800
M[(TMP:=GETSPACE(12,CONTROLCARDAREAV,0)+4)-4] %167-28435000
.AREAMIXF:=0;% 28435010
IF (INDX:=USERCODE[P1MIX])= ABS (NOT 0) THEN 28435200
BEGIN INDX:=0; UN:=31; END ELSE UN:=26; 28435400
EA:=M[FA-1]; 28435600
COMMON:=GETUSERDISK(((TEMP:=FAIN+(FAIN DIV 2)+ 28435800
2) DIV 30)+1); 28436000
M[FA-1]:=FAIN; 28436200
M[FA+TEMP-2]:=DESTIN; 28436400
IF TEMP GTR 900 THEN 28436600
BEGIN NAIN:=M[FA+898]; 28436800
DISKWAIT(FA+899,TEMP-900,COMMON+30); 28437000
TEMP:=900; 28437200
M[FA+898]:=NAIN; 28437400
END; 28437600
DISKWAIT(FA-1,TEMP,COMMON); 28437800
M[FA-1]:=EA; 28438000
STREAM(INDX,COMMON,TMP); 28438200
BEGIN DS:=8LIT"CC USER="; SI:=LOC INDX; SI:=SI+1; 28438400
DS:=7CHR; DS:=24LIT";EX LIBMAIN/DISK;COMMON="; 28438600
DS:=8DEC; DS:=6LIT";END.~"; 28438800
END; 28439000
$ SET OMIT = NOT(PACKETS) 28439200
IF PSEUDOMIX[P1MIX] GEQ 32 THEN 28439400
NYLONZIPPER[P1MIX].[2:1]:=0; 28439600
$ POP OMIT 28439800
TMP:=TMP&P1MIX[18:42:6]&UN[3:43:5]; 28440000
INDEPENDENTRUNNER(P(.CONTROLCARD).TMP,192); 28440200
$ SET OMIT = NOT(PACKETS) 28440400
IF PSEUDOMIX[P1MIX] GEQ 32 THEN 28440600
SLEEP([NYLONZIPPER[P1MIX]],@1000000000000000); 28440800
$ POP OMIT 28441000
IF WEIRDFORK 28441200
THEN BEGIN 28441400
FA:=FAIN; 28441600
FAINFO:=FA+FASZ; 28441800
FAIN:=SEG; 28442000
WEIRDFORK:=FALSE; 28442200
END 28442400
ELSE BEGIN 28442600
TMP:=FA+FAIN-1; 28442800
M[(FA:=SPACE((FASZ:=BUMPFA)+(FASZ DIV 2)+2) 28443000
+1)-1]:=TMP&"&"[1:43:5]; 28443200
FAINFO:=FA+FASZ; 28443400
FAIN:=0; 28443600
END; 28443800
LSX:=0; 28444000
IF DESTIN.UNITNUM!19 THEN %148-28444100
BEGIN 28444150
STREAM(A:=MIDPTR:ONE:=1,MID:=[DESTIN]); 28444200
BEGIN SI:=LOC A; SI:=SI+7; IF SC="0" THEN 28444400
BEGIN TALLY:=2; SI:=MID; SI:=SI+2; 28444600
5(IF SC=" " THEN JUMP OUT; SI:=SI+1; 28444800
TALLY:=TALLY+1); A:=TALLY; DI:=DI+A; 28445000
DS:=LIT"1"; 28445200
END ELSE BEGIN DI:=DI+A; SI:=SI+16; DS:=ADD; END; 28445400
END; 28445600
MIDPTR:=P; 28445800
END; 28445900
GO CONTINUE; 28446000
END 28446200
ELSE IF U=18 THEN P(DIRECTORYSEARCH(-MFID,FID,13),DEL); %137-28446300
END; 28446400
% 28446600
%***************************************************** 28446800
% 28447000
SUBROUTINE SCANEXCEPT; 28447200
BEGIN 28447400
FOR L:=0 STEP 2 UNTIL TMP DO 28447600
IF (PAP[L] EQV MFID)= NOT 0 OR PAP[L] LSS 0 THEN 28447800
IF (PAP[L+1] EQV FID)= NOT 0 OR PAP[L+1] LSS 0 THEN 28448000
BEGIN INXLST:=TRUE; 28448200
IF NOT (PAP[L].[1:1] OR PAP[L+1].[1;1]) 28448400
THEN BEGIN 28448600
PAP[L]:=PAP[TMP]; 28448800
PAP[L+1]:=PAP[TMP+1]; 28449000
PAP.[8:10]:=PAP.[8:10]-2; 28449200
END; 28449400
L:=TMP; 28449600
END; 28449800
END; 28450000
% 28450200
%***************************************************** 28450400
% 28450600
% CODE STARTS HERE 28450800
% 28451000
%***************************************************** 28451200
% 28451400
STREAM(B:=PRT[P1MIX,3]); BEGIN 2(DS:=40LIT"0"); END; 28451600
LAB:= ARAYDESC(15,LABELAREAV); %167-28451800
IF NOT COMMON.[2:1] THEN 28452000
BEGIN 28452200
DISKWAIT(-[TEMP],1,COMMON); 28452400
FA:=TYPEDSPACE(TMP:=TEMP+(TEMP DIV 2)+2,DATAAREAV)+1;% %167-28452600
FAINFO:=FA+TEMP; 28452800
IF TEMP GTR 900 THEN 28453000
BEGIN NAIN:=M[FA+898]; 28453200
DISKWAIT(-(FA+899),TMP-900,COMMON+30); 28453400
TMP:=900; 28453600
M[FA+898]:=NAIN; 28453800
END; 28454000
DISKWAIT(-(FA-1),TMP,COMMON); 28454200
FAIN:=(FASZ:=TEMP)-2; 28454400
DESTIN:=M[FAINFO+(FASZ DIV 2)]; 28454600
FORKED:=TRUE; 28454800
LIBRARYTRANSFER; 28455000
END; 28455200
CCA:= SAVEARRAYDESC(30,ESPDISKAREAV); %167-28455400
CCA[29]:=COMMON.[CF]; 28455600
GETASEGMENT; 28455800
DESTIN:=CCA[1]; % DESTINATION 28456000
CCAIN:=2; 28456200
MAX:=COMMON.[9:9]|2; 28456400
UNITNO:=COMMON.[3:6]; 28456600
FA:=TYPEDSPACE((BUMPFA:=FASZ:=IF MAX > 128 THEN 128 ELSE MAX)+ %167-28456800
(FASZ DIV 2)+2,DATAAREAV)+1;% %167-28457000
FAINFO:=FA+FASZ; 28457200
M[FA-1]:=-0; % MARK INITIAL DIRECTORY 28457400
FAIN:=-2; 28457600
NEXTSOURCE: 28457800
X:=0; 28458000
SOURCEFILEFOUND:=FALSE; 28458200
TOGS:=0&CCA[CCAIN+1][3:3:NUMOPT]; % STORE OPTIONS 28458400
LSX:=FAIN+2; 28458600
POOL:=(EA:=(NA:=SPACE(U:=(NASZ:=CCA[CCAIN+1].[CF]+1)+ 28458800
(T:=CCA[CCAIN+1].[FF])+(NASZ DIV 2)))+NASZ)+T; 28459000
% 28459001
%***************************************** 28459002
% PREPROCESSING OF DATA FROM CCLIB 28459003
% INTO A RECOGNIZABLE FORM FOR LIBRARYCOPY 28459004
%***************************************** 28459005
% 28459006
MOVE(U,NA-1,NA); 28459200
EAIN:=NAIN:=-2; 28459400
BACK: 28459600
IF (CCAIN:=CCAIN+2) GEQ 28 THEN GETASEGMENT; 28459800
T:=CCA[CCAIN]; 28460000
UP: 28460200
IF T=@14 THEN GO QUIT; 28460400
IF T.[4:2]=0 THEN 28460600
BEGIN M[NA+(NAIN:=NAIN+2)]:=T; 28460800
M[NA+NAIN+1]:=CCA[CCAIN+1]; 28461000
GO BACK; 28461200
END ELSE K:=0; 28461400
WHILE T.[5:1] DO 28461600
BEGIN M[NT1:=EA+(EAIN:=EAIN+2)]:=(T AND RB5); 28461800
IF K=0 THEN M[POOL+(NAIN DIV 2)]:=[M[NT1]]; 28462000
M[NT1+1]:=(CCA[CCAIN+1] AND RB5); 28462200
K:=K+2; 28462400
IF (CCAIN:=CCAIN+2) GEQ 28 THEN GETASEGMENT; 28462600
T:=CCA[CCAIN]; 28462800
END; 28463000
M[NT2:=POOL+(NAIN DIV 2)].[8:10]:=K; 28463200
M[NT2]:=(*P(DUP))&(K|2)[CTF]; % NEEDED TO FIND "AS" 28463400
IF T.[4:1] THEN 28463600
BEGIN M[NT1:=EA+(EAIN:=EAIN+2)]:=(T AND RB4); 28463800
IF M[NT2]=0 THEN M[NT2]:=[M[NT1]]&1[32:47:1] 28464000
ELSE M[NT2]:=(*P(DUP))&1[32:47:1]; 28464200
M[NT1+1]:=(CCA[CCAIN+1] AND RB4); 28464400
GO BACK; 28464600
END ELSE GO UP; 28464800
QUIT: 28465000
M[NA+NAIN+2]:=0&">"[1:43:5]; % MARK END OF NA 28465200
% 28465201
%***************************************** 28465202
% BEGIN PROCESSING THE PREPROCESSED DATA 28465203
% ACCORDING TO THE SIX STAGES DETAILED ABOVE 28465204
%***************************************** 28465205
% 28465206
IF CCA[CCAIN+1].UNITNUM=19 %148-28465400
THEN BEGIN % SOURCE DISK 28465600
LIBRARYHELP(3); 28465800
U:=18; 28466000
IF NOHASH 28466200
THEN BEGIN % GO SERIALLY THRU DIRECTORY 28466400
X:=[M[SPACE(30)]]&30[8:38:10]; 28466600
DA:=3+DIRECTORYTOP; 28466800
NEXTSEG: DISKWAIT(-X.[CF],30,DA:=DA+16); 28467000
FOR K:=28 STEP -2 UNTIL 0 DO 28467200
BEGIN IF DSED THEN ABORT; 28467400
IF (MFID:=X[K])=@114 THEN GO TRANSFER; 28467600
FID:=X[K+1]; 28467800
IF MFID=@14 THEN ELSE 28468000
IF (INDX:=COMPARE(MFID,NA))=0 28468200
THEN 28468400
ELSE BEGIN PAP:=M[NT1:=POOL+((INDX-NA) DIV 2)]; 28468600
IF NOT PAP.[7:1] THEN M[NT1].[7:1]:=1; 28468800
INXLST:=FALSE; 28469000
IF (TMP:=PAP.[8:10]-2) GEQ 0 THEN %EXCEPT LIST HERE 28469200
SCANEXCEPT; 28469400
IF NOT INXLST THEN 28469600
BEGIN SEARCHDIRECTORY; 28469800
T:=0&T[FTF]&TOGS[3:3:NUMOPT]; 28470000
IF OK THEN BEGIN ASIT; INSERTORFORK; END; 28470200
END; 28470400
END; 28470600
END; % OF K LOOP 28470800
GO NEXTSEG; 28471000
END % OF LINEAR SEARCH 28471200
ELSE BEGIN % USE SEARCH 28471400
FOR K:=0 STEP 2 UNTIL NASZ-3 DO 28471600
BEGIN 28471800
NM1:=M[NT1:=NA+K]; 28472000
NM2:=M[NT1+1]; 28472200
L:=0; 28472400
PAP:=M[POOL+(K DIV 2)]; 28472600
NXT: IF DSED THEN ABORT; 28472800
IF (NM1 OR NM2) LSS 0 28473000
THEN SEEKNAM(NM1,NM2,L,MFID,FID,DA,PAP) 28473200
ELSE BEGIN MFID:=NM1; FID:=NM2; L:=1; END; 28473400
IF L LEQ 0 THEN 28473600
BEGIN SEARCHDIRECTORY; 28473800
T:=0&T[FTF]&TOGS[3:3[NUMOPT]; 28474000
IF OK THEN BEGIN ASIT; INSERTORFORK; END; 28474200
IF (NM1 OR NM2) LSS 0 THEN GO NXT; 28474400
END %589-28474500
ELSE IF DA=0 THEN LBMESS(NM1,NM2,-67,15,0,SPOUTUNIT,1); %589-28474600
END; % OF K LOOP 28474800
END % OF HASHED SEARCH 28475000
END 28475200
ELSE BEGIN % SOURCE TAPE 28475400
LIBRARYHELP(0); 28475600
$ SET OMIT = NOT B6500LOAD %123-28475605
FOR K:=(IF X[0]=@114 AND NOT REEL1START THEN X[1] ELSE 0) 28475800
STEP 2 UNTIL DA-2 DO 28476000
BEGIN IF DSED THEN ABORT; 28476200
IF ((MFID:=X[K]) OR (FID:=X[K+1])).[1:5] NEQ 0 28476400
THEN BEGIN NOTCOPIED(37); GO BADNM; END; 28476600
IF (INDX:=COMPARE(MFID,NA))=0 28476800
THEN 28477000
ELSE BEGIN PAP:=M[NT1:=POOL+((INDX-NA) DIV 2)]; 28477200
IF NOT PAP.[7:1] THEN M[NT1].[7:1]:=1; 28477400
INXLST:=FALSE; 28477600
IF (TMP:=PAP.[8:10]-2) GEQ 0 THEN % EXCEPT EXISTS 28477800
SCANEXCEPT; 28478000
IF NOT INXLST THEN 28478200
BEGIN T:=0&((K DIV 2)+1)[CTF]&TOGS[3:3:NUMOPT]; 28478400
ASIT; INSERTORFORK; 28478600
END; 28478800
END; 28479000
BADNM: END; % OF K LOOP 28479200
TRANSFER: 28479400
FOR K:=0 STEP 1 UNTIL (NASZ DIV 2)-1 DO 28479600
IF M[POOL INX K].[7:1] THEN ELSE 28479800
BEGIN MFID:=M[NT1:=NA+(K|2)]; 28480000
FID:=M[NT1+1]; 28480200
NOTCOPIED(17-(U=18)|2); 28480400
END; 28480600
END; 28480800
IF (CCAIN:=CCAIN+2) GEQ 28 THEN GETASEGMENT; 28481000
IF NOT SOURCEFILEFOUND THEN 28481200
BEGIN IF U LSS 16 THEN SETNOTINUSE(U,0); 28481400
STOPTIMING(FPBPTR,1023); 28481600
END; 28481800
IF X NEQ 0 THEN FORGETSPACE(X); 28482000
FORGETSPACE(NA); 28482200
IF CCA[CCAIN]=@114 THEN BEGIN FASZ:=FAIN+2; 28482400
FORGETSPACE(CCA); 28482600
LIBRARYTRANSFER; 28482800
END 28483000
ELSE GO NEXTSOURCE; 28483200
END OF LIBRARYCOPY; 28483400
PROCEDURE LIBRARYZERO; 28800000
BEGIN 28801000
REAL COMMON=-4; 28802000
REAL TYPE,SEG,I,J,K,N1,Q,N,W,T,THING,ZEROING; 28803000
ARRAY S[*],X[*],RSULT[*],BUFADR[*],IOD[*],H[*]; 28804000
LABEL GETONE,LOOP,WATE,ARD; 28806000
DEFINE DSED=TERMSET(P1MIX)#; 28807000
%******************************************************* 28808000
SUBROUTINE GETASEGMENT; 28809000
BEGIN 28810000
SEG:=S[29]; 28811000
DISKWAIT(-S,[CF],30,SEG); 28812000
FORGETESPDISK(SEG); 28813000
I:=0; 28814000
END; % OF GETASEGMENT 28815000
%******************************************************* 28816000
SUBROUTINE ABORT; 28817000
BEGIN 28818000
IF ZEROING THEN 28821000
BEGIN 28821500
H[4].[43:2]:=1; 28822000
H[4].[2:1]:=0; 28822500
DISKWAIT(THING,[CF],30,THING.[FF]); 28823000
FORGETSPACE(H); 28823500
END ELSE 28824000
WHILE S[29] NEQ 0 DO GETASEGMENT; 28824250
GO INITIATE; 28824500
END; % OF ABORT 28827000
%******************************************************* 28828000
SUBROUTINE IO; 28829000
BEGIN 28830000
STREAM(DSKADR:=Q+N,D:=(BUFFADR INX (2|W))); 28831000
BEGIN SI:=LOC DSKADR; DS:=8DEC; END; 28831500
RESULT[W]:=0; 28831600
IOREQUEST(-IOD[W]&@377[25:40:8], 28832000
IOD[W]&(IF (T:=N1-N) LSS 63 THEN 512+T ELSE 512+63) 28832500
[CTF],(W INX RSULT)); 28833000
N:=N+63; 28833500
END; % OF IO 28834000
%*********************************************************** 28834500
SUBROUTINE ZEROAROW; 28835000
BEGIN 28835500
N1:=W[8]; %NO. OF SEGMENTS/ROW 28836000
Q:=H[K+9]; %DISK ADDR OF ROW 28836500
W:=0; %BUFFER NO. 28837000
N:=0; %INDEX OF SEGMTS 28837500
IO; 28838000
W:=1; %SWAP BUFFERS 28838500
IF N GEQ N1 THEN RSULT[1]:=RSULT[1] OR IOMASK ELSE 28839000
LOOP: IO; 28847000
WATE: COMPLEXSLEEP((((RSULT[1-W]) AND IOMASK)!0) OR DSED); 28848000
IF DSED THEN ABORT; 28849000
W~IF (RSULT[0] AND RSULT[1] AND IOMASK)!0 THEN 1-W ELSE 28850000
((RSULT[1] AND IOMASK)!0); 28851000
IF N<N1 THEN GO TO LOOP;% ROW IS NOT FINISHED 28852000
COMPLEXSLEEP((((RSULT[1-W]) AND IOMASK) NEQ 0) OR DSED); 28852100
IF DSED THEN ABORT; 28852200
END;%OF ZEROAROW 28853000
%******************************************************* 28854000
S:= ARRAYDESC(30,ESPDISKAREAV); %167-28855000
X:=[M[SPACE(1023)]]&1023[8:38:10]; 28856000
TYPE:=COMMON.[FF]; 28857000
S[29]:=COMMON.[CF]; 28858000
GETASEGMENT; 28859000
X[0]:=@14; 28860000
MOVE(1022,X,[X[1]]); 28861000
GETONE: 28862000
IF DSED THEN ABORT; 28863000
X[J]:=S[I]; 28865000
X[J+1]:=S[I+1]; 28866000
J:=J+2; 28867000
IF (I:=I+2) GTR 26 THEN GETASEGMENT; 28868000
IF S[I] NEQ @14 THEN GO GETONE; 28868100
FORGETSPACE(S); % ZEROING IMPLIES S RETURNED. 28868200
MOVE(J+1,X,S:=GETSPACE(J+1,0,1)+2);% RETURN UNUSED SPACE AND MAKE X 28868300
FORGETSPACE(X); % INTO SAVE SPACE. 28868400
X:=[M[S]]&(J+1)[8:38:10]; 28868500
IOD:=[M[GETSPACE(8,0,1)+2]]&2[8:38:10]; 28869000
RSULT:=(2 INX IOD)&18[8:38:10]; 28870000
BUFFADR:=(4 INX 100)&4[8:38:10]; 28871000
IOD[0]:=(BUFFADR INX 0)&1[8:38:10]&3[5:46:2]; 28872000
IOD[1]:=(BUFFADR INX 2)&1[8:38:10]&3[5:46:2]; 28873000
J:=-2; 28877000
ZEROING:=1; 28878000
WHILE X[J~J+2]!@14 DO % 28879000
BEGIN 28880000
H:=[M[THING:=DIRECTORYSEARCH(X[J],X[J+1],5)]]&30[8:38:10]; 28881000
IF DSED THEN ABORT; 28882000
IF THING=0 THEN GO TO ARD; 28882100
IF M[THING+4].[42:3]=3 THEN 28882120
BEGIN FORGETSPACE(H); 28882140
GO TO ARD; 28882160
END; 28882180
H[4]:=(*P(DUP))&3[43:46:2]&1[2:47:1]&SYSNO[4:46:2]; 28882200
DISKWAIT(THING.[CF],30,THING.[FF]); 28882400
LBMESS( X[J], X[J+1], 62, 0,0,0, 1 ); % BEING BLANKED OUT 28883000
FOR K~1 STEP 1 UNTIL H[9].[43:5] DO% WRITE OUT FILE, ROW BY ROW28884000
IF H[K+9]!0 THEN BEGIN ZEROAROW; 28885000
IF STOPSET(P1MIX) THEN STOPM(0); 28885500
END; 28885600
H[4].[43:2]:=0; % NO LONGER SENSITIVE OR BEING ZEROED 28886000
DISKWAIT(THING.[CF],30,THING.[FF]); 28887000
FORGETSPACE(H); 28888000
P(DIRECTORYSEARCH(X[J],X[J+1],6),DEL); 28889000
ARD: 28889550
END; 28890000
GO INITIATE; 28891000
END; % OF LIBRARYZERO 28892000
$ SET OMIT = NOT(AUXMEM) 28999999
COMMENT ERRORMESSER IS CALLED BY ERRORFIXER (IF OPTION 33 IS ON) TO 30900000
TYPE OUT A PSEUDO-TERMINAL MESSAGE. IT DOES ABOUT THE SAME 30901000
THING AS THE FIRST PART OF TERMINALMESSAGE; 30902000
PROCEDURE ERRORMESSER(TYPE); VALUE TYPE: REAL TYPE; 30903000
BEGIN INTEGER S,ADR,BF,SA,N; 30904000
NAME SD; 30905000
LABEL L; 30906000
BF~SPACE(10); 30907000
SD~PRT[P1MIX,4]; 30908000
NT1~SD[0]; 30909000
ADR~M[PRT[P1MIX,8]].[CF]; 30910000
FOR S~1 STEP 1 UNTIL NT1 DO 30911000
IF (SA~SD[S].[18:15])>1023 AND SA{ADR AND SD[S]>0 THEN 30912000
IF M[SA-1].[18:15]+SA}ADR THEN GO L; 30913000
S~0; 30914000
L: SD~[M[SPACE(TERMSGSZ)]]; 30915000
ADR~ADR-SA; 30916000
DISKWAIT(-(SD INX 0),TERMSGSZ,MESSAGETABLE[1].[22:26]); 30917000
N~IF TYPE=1 THEN 11 ELSE IF TYPE=2 THEN 9 ELSE IF TYPE=4 THEN 30918000
7 ELSE IF TYPE=8 THEN 13 ELSE 5; 30919000
STREAM(M~[SD[N]],J~[JAR[P1MIX,0]],P1MIX,S,ADR,X~S!0,BF); 30920000
BEGIN SI~M; SI~SI+2; DS~6 CHR; BF~DI; DI~LOC M; SI+SI+1; 30921000
DI~DI+7; DS~CHR; DI~BF; DS~M CHR; DS~8 LIT" BRANCH "; 30922000
SI~J; SI+SI+1; DS~7 CHR; DS~LIT"/"; 30923000
SI~SI+1; DS~7CHR; DS~LIT"="; SI+LOC P1MIX; 30924000
DS~2DEC; BF~DI; DI~DI-2; DS~FILL; DI~BF; 30924500
X(DS~5 LIT", S ="; SI~LOC S; DS~4 DEC; DS~5 LIT", A ="; 30925000
DS~4 DEC; BF~DI; DI~DI-4; DS~3 FILL; 30926000
DI~BF; DI~DI-13; DS~3 FILL); 30927000
DI~BF; DS~ LIT"~"; 30928000
END; 30929000
FORGETSPACE(SD); 30929500
SPOUTER(BF,0,ERRORMSG); 30930000
END ERRORMESSER; 30931000
PROCEDURE ERRORFIXER(TYPE); VALUE TYPE; INTEGER TYPE; 31000000
COMMENT LOOKS FOR RUN-TIME-ERROR ACTION LABELS IN ALGOL PROGRAMS. 31001000
AND HANDLES THEM, RETURNING ONLY IF NO LABEL GIVEN; 31002000
BEGIN ARRAY AIT[*],PRTD[*]; 31003000
NAME ADDR; 31004000
REAL I, GOT, ADR=ADDR,LABLE; 31005000
CHECKSTACKSPACE; 31005010
IF TYPE =2 THEN%OVRFLW 31005050
IF JAR[P1MIX,2].[3:1] THEN 31005100
IF(PRT[P1MIX,@51]AND @20)!0 THEN 31005200
BEGIN I!M[ADR~PRT[P1MIX,8] INX 0; 31005300
STREAM(I~(I INX 0)&I[30:10:2],GOT~[GOT]); 31005310
BEGIN SI~I;SI~SI-2;DI~DI+6;DS~2 CHR END; 31005320
IF GOT.[45:3]=5 THEN M[ADR-3]~@7777777777777; 31005330
M[ADR-2]~@777777777777777; 31005350
PRT[P1MIX,@51].[45:2]~2; 31005400
GO TO INITIATE; 31005500
END; 31005600
PRTD ~ PRTROW[P1MIX]; 31006100
WHILE (AID~PRTD [AIDNDX]).PBIT=0 DO 31007000
MAKEPRESENT([PRTD [AITNDX]] INX 0); 31008000
I~AIT[0]+1; 31009000
DO I~I-1 UNTIL((GOT~ (ADDR~AIT[I]).OWNBIT AND ( ADR.[CF] 31010000
=TYPE)) OR(I{1)); % LOOK FOR ENTRY 31011000
IF GOT THEN % WILL REINITIATE THE GUY, SO SET HIM UP 31012000
BEGIN IF (LABLE~M[ ADR.MOM])!0 THEN 31013000
IF LABLE!15 THEN 31013050
IF LABLE.BLKCNTR{(PRTD[16]+(LABLE.MOM!0))THEN 31013100
BEGIN IF PRTD [CURBLKCNTR]>LABLE.BLKCNTR THEN 31014000
BEGIN PRTD [CURBLKCNTR]~LABLE.BLKCNTR+1; 31015000
ASRL 31016000
END; IF(ADDR~LABLE.MOM)=0 THEN 31017000
LABLE.MOM~ADDR~PRTD[10].MOM+2; 31017100
ADDR~ADDR&ADR[33:33:15]; 31017200
$ SET OMIT = PACKETS 31017209
ERRORMESSER(TYPE); 31017220
IF PRTD[LABLE.[CF]].PBIT=0 THEN 31017300
MAKEPRESENT([PRTD[LABLE.[CF]]].[CF]); 31017400
DO UNTIL(*(ADDR~HUNT(ADDR+1))).[1:3]=4; 31018000
ADDR [1]~M[PRTD [8] INX NOT 0]; 31019000
ADDR [2]~M[PRTD [8]]&0[10:10:2]& 31020000
(LABLE)[18:18:15]&PRTD [(LABLE).[CF]][33:33:15]; 31021000
PRTD [8]~P(DUP,LOD)&(ADDR INX 2)[33:33:15]; 31022000
GO INITIATE; 31023000
END; END; 31024000
END ERRORFIXER; 31025000
PROCEDURE JOBMESS(MIX,Q,A,B,C,D); VALUE MIX,Q,A,B,C,D;% 32000000
REAL MIX,Q,A,B,C,D;% 32000100
COMMENT : THIS PROCEDURE CAN BE USED TO BUILD AND SPOUT A MESSAGE 32000110
THAT IS TO BE PRECEEDED BY A <JOB SPECIFIER> WHICH IT 32000120
BUILDS AUTOMATICALLY FOR THE MIX GIVEN; 32000130
BEGIN REAL BUF,T;% 32000200
$ SET OMIT = NOT(PACKETS) 32000249
REAL UNITNO; 32000250
$ POP OMIT 32000251
LABEL EXIT; 32000280
BUF ~ SPACE(9); 32000300
IF MIX = 0 THEN 32000400
BEGIN T:=SPACE(30);DISKWAIT(-T,30,0); 32000500
STREAM(M:=M[T+10+5|SYSNO],F:=M[T+11+5|SYSNO],BUF); 32000510
BEGIN DS:=3 LIT" D:"; SI:=LOC M; SI:=SI+1; DS:=7 CHR; 32000520
DS:=LIT"/";SI:=SI+1;DS:=7CHR;DS:=3LIT"= 0"; 32000530
END; 32000540
FORGETSPACE(T); 32000600
T:=(BUF+2)&5[30:45:3]; 32000650
END ELSE% 32000700
IF JARROW[MIX[!0 THEN 32000750
BEGIN; STREAM(C!0:R~ IF (T~ PRYOR[MIX])<0 THEN T ELSE T INX 0, 32000800
J ~ JARROW[MIX],MIX,A ~ IF JAR[MIX,0]<0 THEN JAR[MIX,30] 32000810
ELSE 0,BUF); 32000812
BEGIN DS ~ LIT " "; SI ~ LOC R; DS ~ 6 DEC;% 32000850
DI ~ DI-6; DS ~ 5 FILL; DI ~ BUF; DI ~ DI+7;% 32001000
DS ~ LIT ":"; SI ~ J; 32001100
IF SC="+" THEN 32001120
BEGIN SI ~ SI+1; DS ~ 7 CHR; DS ~ LIT " "; 32001140
SI ~ SI+1; DS ~ 7 CHR; DS ~ LIT "/"; 32001160
SI ~ LOC A; SI ~ SI+1; DS ~ 7 CHR; 32001180
END ELSE 32001200
BEGIN SI ~ SI+1; DS ~ 7 CHR; DS ~ LIT "/"; 32001220
SI ~ SI+1; DS ~ 7 CHR; 32001240
END; 32001260
DS ~ LIT "="; SI ~ LOC MIX; DS ~ 2 DEC;% 32001300
C ~ DI; DI ~ DI -2; DS ~ 2 FILL;% 32001400
END STREAM; 32001450
T := POLISH; 32001475
$ SET OMIT = NOT(PACKETS) 32001499
IF Q.[CF]=MIX THEN UNITNO:=PSEUDOMIX[MIX]; 32001500
$ POP OMIT 32001501
END ELSE % NO SUCH MIX 32001550
BEGIN FORGETSPACE(BUF); 32001575
GO TO EXIT; 32001600
END; 32001625
STREAM(A~[A],Z~0,T);% 32001700
BEGIN SI ~ A; DS ~ LIT " ";% 32001800
4(IF SC ! "+" THEN 32001900
BEGIN TALLY ~ 7; SI ~ SI +1; % 32001910
6(L: IF SC = "0" THEN% 32001920
BEGIN TALLY ~ TALLY + 63; SI ~ SI + 1; 32002000
END ELSE JUMP OUT);% 32002050
Z ~ TALLY; DS ~ Z CHR;% 32002070
END ELSE SI ~ SI + 8);% 32002090
DS ~ LIT "~";% 32002100
END STREAM;% 32002200
SPOUTER(BUF & Q[9:9:9],UNITNO,1); 32002300
EXIT: 32002350
END JOBMESS;% 32002400
PROCEDURE MIXPRINT(Q); VALUE Q; REAL Q; 32100000
COMMENT THIS PROCEDURE INVOKES JOBMESS TO TYPE THE JOB SPECIFIERS 32100010
OF EACH ACTIVE MIX;% 32100020
BEGIN REAL T,I; 32100100
FOR I~1 STEP 1 UNTIL MIXMAX DO 32100200
IF JAR[I,*] ! 0 THEN% 32100300
BEGIN JOBMESS(I,Q,-0,-0,-0,-0); T ~ 1 END;% 32100350
IF NOT T THEN% NULL MIX 32100400
BEGIN; STREAM(T~T~SPACE(2)); DS~11LIT " NULL MIX~";% 32100500
SPOUT(T & Q[9:9:9]);% 32100600
END NULL MIX; 32100700
END MIXPRINT;% 32100800
$ SET OMIT = NOT(DATACOM AND DCSPO) 34999999
PROCEDURE DOLITTLE(OK,T,A,B,Z); VALUE T,A,B; REAL OK,T,A,B,Z; 36001000
BEGIN COMMENT FILE Q&A; 36002000
LABEL E,L; REAL Q; NAME N=Z; 36003000
DEFINE X=REPLY[P1MIX]#, DS=TERMSET(P1MIX)#; 36004000
IF OK THEN GO E; 36005000
L: FILEMESS(A,B,N[0],N[1],N[2],N[3],N[4]); 36006000
IF AUTODS THEN TERMINATE(P1MIX&61[CTF]) ELSE %747-36006500
BEGIN X~-T&1[2:47:1]; COMPLEXSLEEP(X>0 OR Q~OK OR DS); END; %747-36007000
IF DS THEN GO E; IF NOT Q THEN IF NOT WHYSLEEP(T) THEN GO L; 36008000
E: NT6~X; X~0 36009000
END OF DOLITTLE; 36010000
REAL PROCEDURE FINDOUTPUT(MID,FID,REEL,CDATE,CYCLE,TYPE,FORMS,KIND); 37000000
VALUE MID,FID,REEL,CDATE,CYCLE,TYPE,FORMS; 37001000
REAL MID,FID,REEL,CDATE,CYCLE,TYPE,FORMS,KIND; 37002000
BEGIN INTEGER GOTL,GOTT,GOTB,GOTP,GOTC; 37003000
REAL U; 37003100
LABEL EXIT,SW,ON,OWT,AROUND,OUKID,X,ROUND,CLAIMT,THERE,SOMEWHERE; 37004000
REAL MID=MID; % FAKE OUT COMPILER 37004100
$ SET OMIT = NOT(PACKETS) 37004199
REAL FREEF; LABEL FREEL; % FILE TO BE PRINTED ALONE 37004200
$ POP OMIT 37004201
LABEL W3; 37005000
DEFINE DSED = TERMSET(P1MIX)#; 37006000
LABEL CP,MT,SU,PP,CKFM,DOITOVER; %P 37007000
DEFINE PNTOG=(TYPE=0 OR TYPE GEQ 20)#; 37007100
DEFINE MAYBE(MAYBE1)=(IF FORMS THEN MAYBE1 ELSE 0)[30:42:6]#; 37007200
DEFINE UNITNUM = [1:5]#; %148-37007300
SWITCH TYPESW~CP,ROUND,MT,SU,ROUND,SU,ROUND,PP,PP,MT; %P 37008000
REAL SUBROUTINE PRINTER;% 37009000
BEGIN IF LABELTABLE[20]=0 THEN BEGIN U~20; P(1) END ELSE% 37010000
IF LABELTABLE[21]=0 THEN BEGIN U~21; P(1) END ELSE P(0);% 37011000
PRINTER~GOTL+P; 37012000
END PRINTER;% 37013000
REAL SUBROUTINE PTPUNCH;% 37014000
BEGIN IF LABELTABLE[26]=0 THEN BEGIN U~26; P(1) END ELSE% 37015000
IF LABELTABLE[29]=0 THEN BEGIN U~29; P(1) END ELSE P(0);% 37016000
PTPUNCH~GOTP~P;% 37017000
END PTPUNCH;% 37018000
REAL T1,T2,T3;% 37019000
REAL SUBROUTINE PUNCH;% 37019100
BEGIN IF LABELTABLE[22]=0 THEN BEGIN U~22;P(1) END ELSE P(0); 37019200
PUNCH~GOTC~P; 37019300
END PUNCH; 37019400
REAL SUBROUTINE MAGTAPE;% 37020000
BEGIN IF NOT(GOTL OR GOTB OR GOTC) THEN% 37021000
BEGIN IF (U:=T1,UNTINUM) ! 0 THEN %148-37022000
BEGIN U:=U-1; P(LABELTABLE[U]=0); GO OWT; END; %148-37022100
IF T1 ! 0 THEN %148-37022200
BEGIN FOR U~0 SETP 1 UNTIL 15 DO% 37023000
IF (MULTITABLE[U] EQV T1)=NOT 0 THEN% 37024000
IF LABELTABLE[U]<0 THEN% 37025000
IF RDCTABLE[U].[8:6]=P1MIX THEN% 37026000
IF (T3~PRNTABLE[U])<0 THEN% 37027000
IF T3.[15:15]!0 THEN % DONT USE NONEXISTENT FIB %548-37027500
IF M[M[T3.[15:15]-3] INX 5].[41:1] THEN% 37028000
BEGIN P(1); GO OWT END;% 37029000
END;% 37030000
FOR U~0 STEP ` UNTIL 15 DO% 37031000
IF LABELTABLE[U]=0 THEN BEGIN P(1); GO OWT END;% 37032000
END;% 37033000
P(0);% 37034000
OWT: MAGTAPE~GOTT~P;% 37035000
END MAGTAPE;% 37036000
SUBROUTINE BADFM; %BUILD AND SPOUT BAD FM MESSAGE % 37036100
BEGIN %RHR 37036200
T1~SPACE(10); 37036300
STREAM(A~TINU[U],MX~P1MIX,T1); %RHR 37036400
BEGIN DS~19 LIT "INVALID INPUT UNIT "; %RHR 37036500
SI~LOC MX; DS~2 DEC; DS~2 LIT"FM"; %RHR 37036600
SI~LOC A; SI~SI-5; DS~3 CHR; %RHR 37036800
DS~LIT "~"; DI~DI-8; DS~FILL; %RHR 37036900
END; SPOUT(T1); %RHR 37037000
LABELTABLE[U]~@114; READY~READY AND (U~NOT TWO(U)); 37037100
RRRMECH~RRRMECH AND U; SAVEWORD~SAVEWORD AND U; %RHR 37037200
END BADFM SUBROUTIN; %RHR 37037300
REAL SUBROUTINE BKUPTAPE;% 37038000
BEGIN IF NOT(GOTL OR GOTC) THEN 37039000
FOR U~0 STEP 1 UNTIL 15 DO% 37040000
IF (LABELTABLE[U] EQV T3)=NOT 0 THEN% 37041000
IF (MULTITABLE[U] EQV T2)=NOT 0 THEN% 37042000
BEGIN P(1); GO AROUND END;% 37043000
P(0); 37044000
AROUND: BKUPTAPE~GOTB~P;% 37045000
END BKUPTAPE;% 37046000
$ SET OMIT = NOT(PACKETS) 37046004
FREEF:=TYPE.[1:1]; TYPE:=ABS(TYPE); 37046005
$ POP OMIT 37046006
IF TYPE>1 AND TYPE!4 AND TYPE!6 AND TYPE<15 THEN GO SOMEWHERE; 37046020
ROUND: IF TYPE=1 OR TYPE=4 OR (TYPE>16 AND TYPE<19) THEN 37046040
IF PRINTER THEN BEGIN KIND~1; GO CKFM END; %P 37046060
IF TYPE=0 OR (TYPE>20 AND TYPE) THEN 37046070
IF PUNCH THEN BEGIN KIND~6; GO CKFM END; 37046075
IF TYPE=4 OR TYPE=6 OR TYPE=16 OR TYPE=18 OR 37046080
(TYPE GEQ 20 AND NOT TYPE.[46:1]) THEN 37046090
BEGIN T1~0; T2~IF TYPE GEQ 20 THEN "PUTMCP " ELSE "PBTMCP "; 37046100
T3~@122212342546447; 37046110
IF BKUPTAPE THEN GO THERE; %P 37046120
IF MAGTAPE THEN %P 37046140
CLAIMT: BEGIN MULTITABLE[U]~T2; LABELTABLE[U]~-T3; %P 37046160
RRRMECH~TWO(U) OR RRRMECH; %P 37046170
IF REEL=0 THEN REEL~1; 37046175
RDCTABLE[U]~P(DUP,LOD)&REEL[14:38:10]; %745-37046177
&CDATE[24:31:17]&CYCLE[41:41:7]; %745-37046178
T1~GETSPACE(10,0,0)+4; %P 37046180
STREAM(U:=TINU[U],N:=PRNTABLE[U],[30:18], 37046190
A~REEL,B~DATE,C~CYCLE,D~0,PN~TYPE GEQ 20, 37046192
T~T1-2); 37046194
BEGIN DS~12LIT" NEW PBT ON"; SI~LOC U; SI~SI+5; %P 37046200
PN(D~DI; DI~DI-6; DS~2LIT"UT"; DI~D); 37046205
DS~3 CHR;DS~25LIT"~ LABEL 0PBTMCP 0BACK-UP";%P 37046210
PN(D~DI; DI~DI-14; DS~2LIT"UT"; DI~D); 37046212
SI := LOC A; DS := 3 DEC; 37046215
SI:=SI+3;DS:=5CHR;SI:=SI+7;DI:=DI+1;DS:=CHR;37046217
15(DS:=2 LIT"0");DI:=DI-11;SI:=LOC N; 37046220
DS:=5 DEC; 37046221
END; %P 37046240
P(WAITIO(T1&8[8:38:10]&5[21:45:3],0,U),DEL); %P 37046260
SPOUT(T1-2); 37046270
T1.[1:11]:=@17437; 37046280
P(WAITIO([T1],0,U),DEL); %P 37046300
THERE: LABELTABLE[U].[1:5]~@20; KIND~7; GO EXIT %P 37046320
END; END; %P 37046340
IF (TYPE GEQ 15 AND TYPE LEQ 18) OR TYPE GEQ 22 THEN 37046350
BEGIN 37046360
$ SET OMIT = NOT(PACKETS) 37046369
IF (T1:=PSEUDOMIX[P1MIX])!0 AND TYPE<22 AND NOT FREEF THEN 37046370
BEGIN 37046380
T:=T1-32; 37046390
T2:=PACKETPBD[T1]; 37046400
T3:=CIDTABLE[T1,6].[6:24]; 37046410
IF T2=0 OR T3=0 OR (T2+10)>1000 THEN GO FREEL; 37046420
PACKETPBD[T1]:=T2+10; 37046430
END ELSE 37046440
$ POP OMIT 37046441
BEGIN 37046450
$ SET OMIT = NOT(PACKETS) 37046459
FREEL: 37046460
$ POP OMIT 37046461
T3:=NEXTCDNUM(1); 37046470
T2:=001; 37046480
END; 37046490
KIND:=12; 37046500
STREAM(T3,T2,D:=T1:=U:=SPACE(30)); 37046520
BEGIN 37046530
DS~8 LIT"0@+1.013"; 37046540
DS:=7 LIT"8400000";DS:=10 LIT"0"; 37046560
SI:=LOC T3;SI:=SI+4; DS:=4 CHR; 37046580
SI:=LOC T2; DS:=3 DEC; 37046590
46(DS~4 LIT"0"); 37046600
END; M[T1+1]+M[T1+8]~ PBDROWSZ+1; 37046620
$ SET OMIT = NOT(SHAREDISK) 37046624
M[T1+5]~MID&(TYPE GEQ 22)[3:47:1]; % CP BK UP TOG 37046630
GO EXIT %P 37046640
END; %P 37046660
W3: FILEMESS("# " 37046680
&(IF TYPE = 6 OR TYPE = 20 THEN " " 37046685
ELSE (IF PNTOG THEN "CP" ELSE "LP"))[12:36:12] 37046690
& (IF TYPE < 2 THEN " " 37046700
ELSE IF TYPE GEQ 20 THEN "PUT" ELSE "PBT")[30:30:18],37046710
" .. RQD" & (IF FORMS THEN "FM" ELSE " ")[12:36:12], 37046720
MID, FID, REEL, CDATE, CYCLE); 37046730
IF AUTODS THEN TERMINATE(P1MIX&61[CTF]) ELSE %747-37046735
BEGIN %747-37046737
REPLY[P1MIX] := -VWY & VOU[36:42:6] & MAYBE(VFW); 37046740
COMPLEXSLEEP(((IF (TYPE!6 AND TYPE!20) THEN IF PNTOG THEN 37046760
PUNCH ELSE PRINTER ELSE 0) OR REPLY[P1MIX] 37046770
>0 OR(IF TYPE>1 THEN BKUPTAPE OR MAGTAPE ELSE 0) OR 37046780
DSED); %747-37046800
END; %747-37046805
IF DSED THEN GO TO X; %747-37046810
IF NOT(GOTB OR GOTT OR GOTL OR GOTC) THEN 37046820
BEGIN IF NOT WHYSLEEP(VWY&VOU[36:42:6]&MAYBE(VFM)) 37046825
THEN GO TO W3; 37046826
IF REPLY[P1MIX] = VOK THEN GO TO W3; 37046829
IF REPLY[P1MIX].[CF] = VFM THEN BEGIN 37046830
LABELTABLE[U:=REPLY[P1MIX].[FF]] := -FID; 37046835
MULTITABLE[U] := MID; KIND := UNIT[U].[1:4]; 37046840
GO EXIT; 37046845
END; 37046850
IF PNTOG THEN BEGIN U:=REPLY[P1MIX].[FF]; GO CP END; 37046855
OUKID: TYPE~IF (U~REPLY[P1MIX].[FF])=1 THEN 4 ELSE %P 37046860
IF U=2 THEN 1 ELSE IF U=3 THEN 6 ELSE 15; 37046880
REPLY[P1MIX]~0; GO ROUND; %P 37046900
END; REPLY[P1MIX]~0; %P 37046920
IF GOTB THEN GO THERE ELSE IF GOTT THEN GO CLAIMT ELSE 37046940
IF GOTC THEN KIND~6 ELSE KIND~1; 37046950
CKFM: IF FORMS THEN %P 37046960
BEGIN LABELTABLE[U]~-FID; MULTITABLE[U]~MID; %P 37046980
DOLITTLE(FALSE, 37047000
VWY&VOK[35:42:6]&VOU[30:42:6]&VFM[24:24:6], 37047010
"#... FM"&TINU[U][12:30:18],"RQD ",MID); 37047020
IF NT6=VOK THEN GO EXIT; 37047100
IF DSED THEN GO TO INITIATE; 37047250
KIND:=LABELTABLE[U]:=MULTITABLE[U]:=GOTL:=GOTP:=U:=0; 37047500
IF NT6.[CF]=VFM THEN 37047600
IF (U:=NT6.[FF]) ! 20 AND U ! 21 AND KIND = 1 OR 37047605
U ! 22 AND KIND = 6 THEN 37047610
BEGIN BADFM; GO ROUND END ELSE 37047615
BEGIN LABELTABLE[U]~-FID; %RWR 37047625
MULTITABLE[U]~MID; KIND~UNIT[U].[1:4]; %RWR 37047650
GO EXIT; %RWR 37047660
END ELSE BEGIN REPLY[P1MIX]~NT6; GO OUKID; END; %RWR 37047670
END; GO X; %P 37047700
SOMEWHERE: IF NOT FORMS THEN GO SW; 37047800
DOLITTLE(FALSE,VWY&VFM[36:42:6],"#FM RQD",0,MID); U:=NT6.[FF]; 37048000
IF NOT DSED THEN 37048100
IF U LSS 16 THEN 37048200
IF PRINTABLE[U].[1:1] THEN ELSE %764-37048300
BEGIN LABELTABLE[U]:=-(*P(DUP));GO TO SOMEWHERE;END; %764-37048310
GO TO X; 37048400
SW: GO TO TYPESW[TYPE];% 37056000
CP: TYPE~IF U=1 THEN 21 ELSE IF U=3 THEN 20 ELSE 37058000
IF U=5 THEN 0 ELSE 22; REPLY[P1MIX]~0; GO ROUND; 37059000
PP: DOLITTLE(PTPUNCH,VWY,"#PP RQD",0,MID); GO X; 37085000
SU: T1~FID.[6:18];% 37096000
FOR U~0 STEP 1 UNTIL 31 DO% 37097000
IF TINU[U].[30:18]=T1 THEN GO ON;% 37098000
GO TO MT;% 37099000
ON: DOLITTLE(LABELTABLE[U]=0,VWY,"#... "&T1[12:30:18], 37100000
"RQD ",MID); GO X; 37100010
MT: T1~MID;% 37112000
DOLITTLE(MAGTAPE,VWY,"#MT RQD",IF MID.UNITNUM!0 THEN %148-37113000
"ON ..."&TINU[MID,UNITNUM-1][30:30:18] %148-37113100
ELSE 0,MID); %148-37113200
IF DSED THEN GO TO X; 37121000
IF (T1~PRNTABLE[U].[15:15])!0 THEN% 37122000
BEGIN FILECLOSE(T1&3[18:33:15]);% 37123000
M[M[T1-3] INX 5].[38:4]~1;% 37124000
END;% 37125000
X: IF DSED THEN U~-1 ELSE 37172000
BEGIN KIND~UNIT[U].[1:4]; 37173000
LABELTABLE[U]~-FID; MULTITABLE[U]~MID;% 37174000
RDCTABLE[U]~P(DUP,LOD)&REEL[14:38:10]&CDATE[24:31:17] 37174100
&CYCLE[41:41:7]; 37174200
END; EXIT: FINDOUTPUT~U 37175000
END FINDOUTPUT;% 37176000
REAL PROCEDURE FINDINPUT(MID,FID,REEL,CDATE,CYCLE,COBOL,UL,OF,MODE,FN); 37177000
VALUE MID,FID,REEL,CDATE,CYCLE,COBOL, OF,MODE,FN;% 37178000
REAL MID,FID,REEL,CDATE,CYCLE,COBOL,UL,OF,MODE,FN;% 37179000
BEGIN REAL T1,T2,U,LO,HI,FIRST,IL; 37180000
REAL A=COBOL; 37180100
INTEGER S,COUNT; 37180200
INTEGER USASI=IL; 37180300
ARRAY FPB=LO[*]; 37180400
LABEL LOOK,SEE,SRCHOUT; 37180500
LABEL START,WHY,SXIT,X,Y,READALABEL,REW,EXIT; 37180600
LABEL ONN,DUN,FAIL; 37180650
DEFINE UNLABELED = UL#; 37180700
DEFINE UNITNUM = [1:5]#; %148-37180800
37180990
REAL SUBROUTINE DSED; DSED:=TERMSET(P1MIX); 37181000
37185300
SUBROUTINE CHECKTERMIX; % LET CALLER ATTEND HIS RESPONSIBILITIES.37185310
BEGIN 37185320
IF DSED THEN 37185330
BEGIN 37185340
IF JAR[P1MIX,9].SYSJOBF THEN % MCP JOB 37185350
BEGIN 37185370
U:=-1; 37185380
GO TO EXIT; 37185390
END ELSE GO TO INITIATE; 37185400
END; 37185410
END; % CHECKTERMIX 37185420
37185990
REAL SUBROUTINE SEARCH;% 37186000
BEGIN COUNT:=0; 37186500
IF NOT DSED THEN 37186750
BEGIN 37187000
IF (LO:=(HI:=MID.UNITNUM-1)) GEQ 0 THEN %148-37187100
IF LABELTABLE[LO] GTR @314 THEN %148-37187110
BEGIN COUNT~COUNT+1; P(LO,XCH); %148-37187120
MID~MULTITABLE[LO]; GO SEE; %148-37187130
END; 37187140
$ SET OMIT = NOT PACKETS 37187200
IF (LO:=(HI:=PSEUDOMIX[P1MIX]))!0 THEN 37187250
$ SET OMIT = PACKETS 37187375
LOOK: FOR U:=LO STEP 1 UNTIL HI DO 37188500
BEGIN IF S GEQ 0 THEN 37188750
IF (LABELTABLE[U] EQV (-@14))=NOT 0 THEN 37189000
COMPLEXSLEEP((LABELTABLE[U] EQV (-@14))!NOT 0 OR 37189250
(IF U<32 THEN UNIT[U].[13:5]=16 ELSE 0)); 37189500
IF (LABELTABLE[U] EQV FID)=NOT 0 THEN% 37190000
IF (MULTITABLE[U] EQV MID)=NOT 0 THEN% 37191000
IF ((T1~RDCTABLE[U]).[14:10]=REEL) OR (REEL=0) THEN% 37192000
IF (T1.[24:17]=CDATE) OR (CDATE=0) THEN% 37193000
IF (T1.[41:7]=CYCLE) OR (CYCLE=0) THEN% 37194000
BEGIN 37195000
COUNT:=COUNT+1; P(U,XCH); 37195030
END; 37195040
END; 37195050
FAIL: 37195100
IF LO = HI THEN IF COUNT = 1 THEN GO SEE ELSE 37195200
IF LO=0 THEN IF (LO:=JAR[P1MIX,6].[2:6])=23 OR LO=24 37195250
THEN HI:=LO ELSE GO TO ONN ELSE 37195280
ONN: BEGIN LO:=23; HI:=24; END ELSE %754-37195300
IF LO=23 THEN BEGIN LO:= 0; HI:=15; END ELSE GO TO DUN; 37195400
GO TO LOOK; 37195450
DUN: IF CYCLE.[1:1] THEN % PBT 37195500
BEGIN 37195550
IF COUNT=0 THEN IF FID.[1:5]<3 THEN 37195600
BEGIN FID.[1:5]~FID.[1:5]+1; 37195650
LO~0; HI~15; GO LOOK; 37195700
END ELSE FID.[1:5]~1; 37195750
GO SRCHOUT; 37195800
END; 37195850
IF COUNT=0 THEN 37196200
IF MID!0 THEN% 37197000
IF NOT CDATE.[1:1] THEN % NOT LIBMAIN/DISK 37197500
FOR U~0 STEP 1 UNTIL 15 DO% 37198000
IF (MULTITABLE[U] EQV MID)=NOT 0 THEN% 37199000
IF (RDCTABLE[U].[24:17]=CDATE) OR (CDATE=0) THEN 37199100
IF LABELTABLE[U]>0 THEN% 37200000
BEGIN COUNT~COUNT+1; 37201000
P(U,XCH); 37202000
END ELSE% 37203000
IF RDCTABLE[U].[8:6]=P1MIX THEN% 37204000
IF (T1~M[M[PRNTABLE[U].[15:15]-3] INX 5]).[41:1] THEN 37205000
IF T1.[43:1] OR T1.[40:1]=0 THEN% 37206000
BEGIN COUNT~COUNT+1; P(U,XCH) END; 37207000
SEE: 37207500
END; 37208000
SRCHOUT: 37208500
SEARCH~S~COUNT>0; 37209000
END SEARCH;% 37210000
37210090
REAL SUBROUTINE RESEARCH; 37210100
BEGIN 37210150
S:=-2; 37210175
P(SEARCH); 37210200
DO P(DEL) UNTIL (COUNT:=COUNT-1) LSS 0; 37210250
RESEARCH~S; 37210300
END RESEARCH; 37210400
37210990
REAL SUBROUTINE REED;% 37211000
BEGIN IF CHI~WAITIO(T1,LO&@377[18:33:15],U) AND @367)!0 THEN 37212000
IF CHI AND NOT LO)!0 THEN 37213000
BEGIN BLASTQ(U); SETNOTINUSE(U,0); STOPTIMING(FN,1023); 37214000
FILEMESS(-:PARITY ","ON ... "&TINU[U][24:30:18],% 37215000
MID,FID,REEL,CDATE,CYCLE);% 37216000
END;% 37217000
IF DSED THEN 37218000
BEGIN 37218100
SETNOTINUSE(U,0); 37218200
STOPTIMING(FN,1023); 37218300
CHECKTERMIX; 37218400
END; 37219000
REED~HI;% 37220000
END REED;% 37221000
37221090
SUBROUTINE SEARCHCOM; % FILE SEARCH FOR COM 30 37221100
BEGIN P(DEL); 37221120
IF NOT SEARCH THEN U:=-1 ELSE 37221140
IF COUNT=1 THEN U:=P ELSE 37221160
BEGIN 37221180
S:=COUNT; T1:=0; 37221200
COUNT:=IF COUNT>8 THEN 8 ELSE COUNT; 37221220
WHILE (COUNT:=COUNT-1) GEQ 0 DO 37221240
BEGIN U:=P; 37221260
IF T1 THEN 37221280
BEGIN 37221300
T1:=0; M[A].[30:18]:=TINU[U].[30:18]; 37221320
A:=A+1; 37221340
END ELSE 37221360
BEGIN 37221380
T1:=1; M[A].[12:18]:=TINU[U].[30:18]; 37221400
END; 37221420
END; 37221440
U:=-5; 37221460
END; 37221480
GO EXIT; 37221500
END; 37221520
37221990
START:% 37222000
IF UL<0 THEN SEARCHCOM ELSE 37222100
IF UL THEN GO TO WHY ELSE % 37222500
IF NOT SEARCH THEN% 37223000
WHY: BEGIN FILEMESS("#NO FIL",IF MID.UNITNUM!0 THEN %148-37224000
"ON ..."&TINU[MID.UNITNUM-1][30:30:18] %148-37224100
ELSE 0,MID,FID,REEL,CDATE,CYCLE); %148-37224200
FIRST:=VOK&VWY[36:42:6]&VUL[30:42:6]&VIL[24:42:6]; 37225000
IF COBOL THEN 37225050
FIRST:=FIRST&(VOF|OF)[18:42:6]&(VFR|UL)[12:42:6]; 37225100
IF AUTODS THEN TERMINATE(P1MIX&61[CTF]) ELSE %747-37225800
BEGIN %747-37225900
REPLY[P1MIX]~-FIRST&1[2:47:1]; 37226000
COMPLEXSLEEP(RESEARCH OR (REPLY[P1MIX]>0) OR DSED); 37227000
END; %747-37227100
CHECKTERMIX; 37228000
IF S THEN S~SEARCH ELSE 37229000
BEGIN IF NOT WHYSLEEP(FIRST) THEN GO TO WHY; 37229500
IF (T2:=(T1:=REPLY[P1MIX]).[FF]) GTR 64 THEN % IL 37230000
BEGIN STREAM(T2:); % MID/FID37230250
BEGIN SI:=T2; 37230500
LL: SI:=SI+1; IF SC!"L" THEN GO TO LL; 37230750
SI:=SI+1; T2:=SI; 37231000
END; 37231250
T2:=P; 37231500
NAMEID(HI,T2); MID:=HI; NAMEID(HI,T2); 37232000
NAMEID(HI,T2); FID:=HI; 37232250
FORGETSPACE(T1.[FF]-1); 37232500
GO TO Y; 37232750
END; 37233000
IF T1=VOK THEN GO TO Y; % OK 37233250
IF NOT (IL:=T1.[CF]=VIL) THEN % OF, FR 37233500
BEGIN U:=-1; 37233750
REPLY[P1MIX]:=0; 37234000
GO TO EXIT; 37234250
END; 37234500
UNLABELED~-LABELTABLE[U~T1.[18:15]]=@314;% 37235000
P(U); 37235100
COUNT:=1; 37235250
IF LABELTABLE[U]=0 THEN 37235500
BEGIN MULTITABLE[U]:=MID; 37235750
LABELTABLE[U]:=FID; 37236000
END ELSE 37236250
BEGIN MID:=MULTITABLE[U].[6:42]; 37236500
FID:=LABELTABLE[U].[6:42]; 37236750
END; 37237000
END; 37238000
REPLY[P1MIX]:=0; 37239000
END;% 37240000
IF COUNT {0 THEN GO TO START; %120-37240050
IF COUNT>1 THEN 37240100
SXIT: BEGIN FILEMESS("#DUP ","FIL ",MID,FID,REEL,CDATE,CYCLE); 37240200
WHILE (COUNT~COUNT-1)}0 DO 37240300
BEGIN IF (U~P)<16 THEN IF MID!0 THEN 37240400
IF (T1~PRNTABLE[U].[15:15])!0 THEN 37240500
FILECLOSE(T1&@12[18:33:15]); 37240600
STREAM(X~[TINU[U]]:D~S~SPACE(10)); 37240700
BEGIN SI~X; SI~SI+5; DS~8 LIT " DUP ON "; 37240800
DS~3 CHR; DS~LIT "~"; 37240900
X~DI; 37240910
END; 37241000
T1~P; 37241010
IF U}32 THEN IF CIDROW[U -32]!0 THEN 37241020
STREAM(DK~CIDTABLE[U -32,2],T1); 37241030
BEGIN DI~DI-1; DS~6 LIT ",DECK "; 37241040
SI~LOC DK; SI~SI+1; DS~7 CHR; 37241050
END; 37241060
SPOUT(5); 37241100
END; 37241200
REPLY[P1MIX]:= -VWY&VOK[36:42:6]&VIL[30:42:6]; 37241300
COMPLEXSLEEP(DSED OR (REPLY[P1MIX]>0)); 37241400
CHECKTERMIX; 37241500
IF (T1:=REPLY[P1MIX]).[33:15]=VIL THEN 37241510
BEGIN REPLY[P1MIX]~0; 37241520
IF T1.[FF] > 64 THEN GO SXIT; 37241525
P(T1.[18:15]); 37241530
GO TO X; 37241540
END; 37241550
IF NOT WHYSLEEP(VWY&VOK[36:42:6]&VIL[30:42;6]) THEN 37241600
BEGIN S:=SEARCH;GO SXIT END; 37241610
Y: REPLY[P1MIX]:=0; GO TO START; 37241700
END; 37241800
X: 37241810
LABELTABLE[U~P].[1:5]~@20; 37241900
IF NOT UNLABELED THEN 37242000
BEGIN FPB:=PRT[P1MIX,3]; 37242100
FPB[FN]:=MID; 37242200
FPB[FN+1]:=FID; 37242300
END; 37242400
IF U LSS 16 THEN 37242600
IF MID!0 THEN 37242800
BEGIN IF (T1!PRNTABLE[U].[15:15])!0 THEN% 37243000
BEGIN FILECLOSE(T1&3[18:33:15]);% 37244000
M[M[T1-3] INX 5].[39:4]~1;% 37245000
END;% 37246000
RRRMECH~TWO(U) OR RRRMECH; STARTIMING(FN,U); 37248000
IF UNLABELED OR IL OR CYCLE.[1:1] THEN GO EXIT; 37248500
T1 ~ SPACE(11)&10[8:38:10]&MODE[21:47:1]% 37249000
&3[23:46:2];% 37250000
LO~@40; FIRST~1;% 37251000
READALABEL: IF REED ! 0 THEN IF FIRST THEN% 37252000
REW: BEGIN FIRST~WAITIO(@4200000000,0,U); GO READALABEL END ELSE 37253000
BEGIN SETNOTINUSE(U,I); FORGETSPACE(T1.[33:15]); 37254000
STOPTIMING(FN,1023); GO TO START END; 37255000
STREAM(Y:=0:X:=0,T1); 37255100
BEGIN DI:=LOC X; DS:=8 LIT "VOL1HDR1"; 37255200
SI:=T1; DI:=DI-8; 37255300
IF 4 SC=DC THEN TALLY:=1 ELSE 37255400
BEGIN SI:=T1; IF 4 SC=DC THEN TALLY:=2; END; 37255500
Y:=TALLY; 37255700
END; 37255800
IF(USASI:=P)>0 THEN USASITAPE(T1.[CF],USASI,2,U,0); 37255900
STREAM(M~0,F~0,R~0,D~0,C~0:S~T1 INX 1);% 37256000
BEGIN SI~S; SI~LOC M; DS~2 WDS; DS~3 OCT;% 37257000
DS:=5 OCT;DS:=2 OCT; 37258000
END;% 37259000
IF (P=CYCLE OR CYCLE=0) AND (P(XCH)=CDATE OR CDATE=0) AND% 37260000
(P(XCH)=REEL OR REEL=0)AND ((P(XCH) EQV FID)=NOT 0) AND% 37261000
((P(XCH) EQV MID)=NOT 0) THEN% 37262000
BEGIN FORGETSPACE(T1.[33:15]); T1~@340000005;% 37263000
LO~0;T1~REED; GO TO EXIT;% 37264000
END;% 37265000
IF FIRST THEN GO REW;% 37266000
LO:=@60; DO UNTIL (FIRST:=REED).[42:1]; DO UNTIL REED.[42:1]; 37267000
IF USASI>0 THEN DO UNTIL REED.[42:1] ELSE FIRST:=REED; 37267050
LO~@40; GO READALABEL; 37267100
END;% 37268000
EXIT: FINDINPUT~U;% 37269000
END FINDINPUT;% 37270000
PROCEDURE STARTIMING(FN,U); VALUE FN,U; REAL FN,U;% 37271000
BEGIN ARRAY FPB[*]; INTEGER I,J;% 37272000
FPB~PRT[P1MIX,3];% 37273000
IF U<32 THEN 37273100
BEGIN IF FPB[FN+4]}0 THEN 37274000
BEGIN IF (I+FPB[FN+3].[36:6])!0 THEN% 37275000
IF I NEQ U+1 OR FPB[FN+2].[8:10] NEQ RDCTABLE[U].[14:10] 37276000
THEN 37276010
IF (I~FPB.[8:10])<(1023-ETRLNG) THEN 37276100
BEGIN J~GETSPACE(I+ETRLNG,2,1)+2;% 37277000
$ SET OMIT = SHAREDISK 37277999
MOVE(I,FPB,J);% 37278000
$ POP OMIT 37278001
$ SET OMIT = NOT SHAREDISK 37278099
MOVE(ETRLNG,[FPB[FN]],J+I);% 37278200
FORGETSPACE(FPB.[33:15]);% 37279000
NFO[(P1MIX-1)|NDX]~ 37279100
PRT[P1MIX,3]~FPB~[M[J]]&(I+ETRLNG)[8:38:10];% 37280000
FPB[FN+4]+0; FPB[FN+3].[24:12]~0;% 37281000
END;% 37282000
FPB[FN+4]~FPB[FN+4]-CLOCK-P(RTR);% 37283000
FPB[FN+3].[36:6]~U+1;% 37284000
IF U LSS 16 THEN% RDC & PRN LOG ENTRIES 37284100
BEGIN ; 37284110
STREAM(R:=RDCTABLE[U].[14:10],D:=RDCTABLE[U].[24:17], 37284120
C:=RDCTABLE[U].[41:7],T:=[FPB[FN +2]]); 37284130
BEGIN SI:=LOC R;DS:=3DEC;DS:=5DEC;DS:=DEC END; 37284140
FPB[FN +3].[6:17]:=PRNTABLE[U].[31;17]; 37284150
END; 37284310
END END ELSE 37285000
BEGIN IF (I:=FPB[FN+4]) LSS 0 THEN 37285100
BEGIN FPB[FN+4]~I+CLOCK+P(RTR); I~FPB[FN+3].[36:6]-1; 37285200
FPB[FN+3].[24:12]~P(DUP).[24:12]+(J~TINU[I].[18:12]); 37285300
IF I<16 THEN 37285305
IF J>0 THEN FILEMESS("# IO"&TINU[I] 37285310
[12:30:18],-RETRIES",FPB[FN],FPB[FN+1],J,0,0); %715-37285320
TINU[I].[18:12]~0; 37285400
END END END TIMING; 37285500
REAL PROCEDURE DISKADDRESS(MID,FID,FPB3,A,H,IO); % (SHM)37286000
VALUE MID,FID,FPB3,A,H,IO; % (SHM)37286100
REAL MID,FID,FPB3,A,IO; % (SHM)37286200
ARRAY H[*]; 37286300
BEGIN LABEL EOF, EOF2; 37287000
INTEGER I; 37287250
REAL T, V; 37287500
IF A}0 THEN% 37288000
BEGIN T~(A DIV H[0].[30:12])|H[0].[42:6];% 37289000
IF H[9] LEQ I:=(IF H[1]=0 THEN 0 ELSE T DIV H[1]) THEN 37290000
GO TO EOF; 37290100
IF H[I:=I+10]=0 THEN % NEW ROW NEEDED. 37291000
IF IO THEN GO TO EOF ELSE % EOF ON A READ. 37291200
IF IO=2 THEN % CALLED FROM FILEOPEN SO 37291400
BEGIN % DONT EXPAND THE FILE YET. 37291600
T:=1; 37291800
GO TO EOF2; 37292000
END 37292200
ELSE 37292400
IF H[4] THEN % IN DIRECTORY, UPDATE HEADER. 37292600
P(DIRECTORYSEARCH(-MID,FID,-H&I[CTF]),DEL) 37292800
ELSE % NOT IN DIREECTORY. 37293000
BEGIN % (SHM)37293010
IF (V:=FPB3.[18:5]) GTR 0 THEN % EU SPECIFIED % (SHM)37293020
V:=(IF V GTR 20 THEN 0 ELSE -V) ELSE % (SHM)37293030
IF (V:=FPB3.[16:2]) GTR 0 THEN % SPEED SPECIFIED %(SHM)37293040
V:=(IF V GTR 2 THEN 0 ELSE V) ELSE % (SHM)37293050
V:=0; % NO SPEED OR EU SPECIFIED % (SHM)37293060
H[I] := PETUSERDISK(H[8],V); % (SHM)37293070
END; % (SHM)37293330
T~H[I]+I~T MOD H[1];% 37294000
STREAM(D~[T]); BEGIN SI~D; DS~8 DEC END;% 37295000
END ELSE% 37296000
EOF: T~0;% 37297000
EOF2: 37297500
DISKADDRESS~T;% 37298000
END DISKADDRESS;% 37299000
PROCEDURE SETNOTINUSE(U,RWL); VALUE U,RWL; REAL U,RWL; 37302000
BEGIN REAL I,J; 37303000
IF U<16 THEN P(WAITIO(@4200000000,@377,U),DEL); 37303200
SLEEP([TOGLE],STATUSMASK); 37304000
RRRMECH~((I~TWO(U)) AND SAVEWORD) OR ((I~NOT I) AND RRRMECH);% 37305000
READY~READY AND I;% 37306000
IF RWL THEN 37312000
BEGIN 37313000
STREAM(S~[TINU[U]],M~MULTITABLE[U],F~LABELTABLE[U], 37314000
N~IF U<16 THEN PRNTABLE[U].[30:18] ELSE 0, 37314100
T:=MULTITABLE[U]=0, TT:=U GEQ 16, D:=J:=SPACE(10)); 37314200
BEGIN SI~S; SI~SI+5; DS~LIT "#"; DS~3 CHR;% 37315000
DS~6 LIT " RW/L "; SI~LOC M; SI~SI+1; 37316000
DS~7 CHR; DS~LIT " "; SI~SI+1; DS~7 CHR; 37316100
T(M~DI;DI~DI-15;DS~7FILL;DI~M); TT(JUMP 37316200
OUT TO LA); DS~LIT "("; DS~5 DEC; DS~LIT")"; 37316300
LA: DS~LIT "~"; 37316400
END;% 37317000
SPOUT(J); 37318000
LABELTABLE[U]~@214; 37318100
END ELSE LABELTABLE[U]~@114; 37319000
MULTITABLE[U]~RDCTABLE[U]~0; 37319010
IF U<16 THEN PRNTABLE[U]~0 ; 37319020
END SETNOTINUSE; 37319100
PROCEDURE BLASTQ(U); 37320000
VALUE U; REAL U; 37321000
BEGIN 37322000
REAL I,X; 37323000
BOOLEAN SUBROUTINE CHECKIO; 37323100
BEGIN 37323200
CHECKIO:=(I:=UNIT[U]).[5:8]!0 OR (I.[14:1] AND I.[13:5]!@31); 37323300
END; 37323400
IF CHECKIO THEN COMPLEXSLEEP(NOT CHECKIO); 37324000
IF I.[16:1] THEN % SKIP I/O IN PROCESS 37326000
BEGIN I:=NFLAG(LOCATQUE[X:=I.[FF]]); 37327000
LOCATQUE[X].[FF]:=@77777; 37328000
UNIT[U].[CF]:=X; 37329000
END ELSE 37330000
UNIT[U].[5:43]:=(NOT 0).[18:30]; 37331000
WHILE (I:=I.[FF])!@77777 DO 37332000
BEGIN RETURNIOSPACE(I); 37333000
I:=NFLAG(LOCATQUE[I]); 37334000
END; 37335000
END BLASTQ; 37336000
PROCEDURE BUILDLABEL(LABLE,MID,FID,REEL,CDATE,CYCLE,PFACT,PTN,BLKODE,% 37337000
BSIZE,RSIZE);% 37338000
VALUE LABLE,MID,FID,REEL,CDATE,CYCLE,PFACT,PTN,BLKODE,37339000
BSIZE,RSIZE;% 37340000
ARRAY LABLE[*];% 37341000
REAL MID,FID,REEL,CDATE,CYCLE,PFACT,PTN,BLKODE,% 37342000
BSIZE,RSIZE;% 37343000
BEGIN;STREAM(D~[PFACT]); BEGIN SI~D; SI~SI+5; DS~3 OCT END;% 37344000
PFACT~CALCULATEPURGE(PFACT);% 37345000
STREAM(S~M[MID],LABLE);% 37346000
BEGIN DS~8 LIT " LABEL "; SI~S; DS~2 WDS;% 37347000
DS~3 DEC; DS~5 DEC; DS~2 DEC; SI~SI+3; DS~5 CHR;% 37348000
DS~14 LIT "0"; DS~5 DEC; SI~SI+7; DS~CHR;% 37349000
DS~5 DEC; DS~5 DEC; DS~11 LIT "0"% 37350000
END;% 37351000
IF (RSIZE~LABLE.[8:10])>10 THEN% 37352000
STREAM(J~JARROW[P1MIX],D~[LABLE[10]]);% 37353000
BEGIN SI~J; SI~SI+1; DS~LIT " "; DS~7 CHR;% 37354000
SI~SI+1; DS~LIT "/"; DS~7 CHR; 12(DS~2 LIT " ");% 37355000
END END GUILDLABEL;% 37356000
$ SET OMIT = PACKETS 37356999
$ SET OMIT = NOT(PACKETS) 37357299
PROCEDURE FILEMESSAGE(I,K,M,F,R,D,C,TYPE); 37357300
VALUE I,K,M,F,R,D,C,TYPE; 37357400
REAL I,K,M,F,R,D,C,TYPE; 37357500
$ POP OMIT 37357501
BEGIN REAL Z,L;% 37359000
L~SPACE(12);% 37360000
STREAM(Z:I~[I],J~[JAR[P1MIX,*]],P1MIX,L); 37361000
BEGIN SI~I; 37362000
IF SC="+" THEN BEGIN TALLY~1; DS~LIT "-"; SI~SI+1 END ELSE% 37363000
BEGIN SI~SI+1; IF SC!"#" THEN DS~LIT " " END;% 37364000
DS~7 CHR; DS~LIT " "; L~DI;% 37365000
2(DI~LOC Z; IF 8 SC!DC THEN BEGIN DI~L; SI~SI-7; DS~7 CHR;% 37366000
DS~LIT " "; L~DI END);% 37367000
DI~L; SI~SI+1; DS~7 CHR; DS~LIT " "; L~DI;% 37368000
3(DI~LOC Z; IF 8 SC!DC THEN BEGIN DI~L; SI~SI-8; DS~7 DEC; 37369000
L~DI; DI~DI-7; DS~6 FILL; 37370000
DI~L; DS~LIT " "; L~DI; 37371000
END); 37372000
DI~L; DS~SI-1; DS~LIT ":";% 37375000
Z~TALLY; SI~LOC Z; SI~SI+7;% 37376000
IF SC="0" THEN BEGIN SI~J; SI~SI+1; DS~7 CHR; DS~LIT "/";% 37377000
SI~SI+1; DS~7 CHR; DS~LIT "=";% 37378000
SI~LOC P1MIX; DS~2 DEC; 37379000
L~DI; DI~DI-2; DS~FILL; DI~L END; 37379500
DS~LIT "~";% 37380000
END;% 37381000
IF P THEN BEGIN TERMINATE(P1MIX); TERMINALMESSAGE(-L) END;% 37382000
SPOUTER(L,0,TYPE); 37383000
END FILEMESS;% 37384000
PROCEDURE FILLBUFFERS(CURRENT,FINAL,COBOL,NR); 37385000
VALUE CURRENT,FINAL,COBOL,NR; 37385500
REAL CURRENT,FINAL,COBOL,NR; 37386000
BEGIN ARRAY LOCAT[*];% 37387000
INTEGER I,J,K,D;% 37388000
INTEGER FIRSTLOC=J,PRELOC=K,CURLOC=D; 37388100
REAL T=LOCAT; 37388200
REAL T1; 37388250
REAL NF=T1+1; % MUST BE AT THE TOP OF THE STACK37388275
LABEL LINK; 37388300
REAL BSIZE=CURRENT,N=FINAL,U=COBOL,ALPHA=NR; 37388400
IF ALPHA<512 THEN 37388500
BEGIN 37388600
P(NR-(COBOL GTR 0)); % INITIALIZE NF 37388700
IF COBOL THEN FINAL:=CURRENT; 37388800
J~FINAL.[33:15]-K~CURRENT.[33:15];% 37389000
D~2&(NOT CURRENT)[1:22:1];% 37390000
LOCAT~M[K+D]; NR~NR-1;% 37391000
FOR I~1 STEP 1 UNTIL NF DO% 37392000
BEGIN IORREQUEST(FLAG(FINAL),CURRENT,LOCAT);% 37393000
M[LOCAT]~M[LOCAT]&0[26:26:7] AND NOT(M OR IOMASK);% 37394000
IF NOT COBOL THEN 37394025
IF I=1 THEN IF P(FINAL.[3:5],DUP)=6 OR P(XCH)=7 THEN 37394050
BEGIN 37394100
SLEEP(LOCAT & 0 [3:3:30],IOMASK); 37394150
STREAM(N~0,L~0:NDIV64~0,BACC~T1~FINAL.[7:1], 37394200
BUF ~ (M[LOCAT] INX T1)-(1-T1)); 37394250
BEGIN DI ~ LOC N; SI ~ BUF; BACC(SI ~ SI+4); 37394260
IF 4 SC!DC THEN GO OWT; 37394280
DI ~ LOC N; BACC(SI ~ BUF); DS ~ 4 OCT; 37394300
SI ~ LOC L; DI ~ LOC BACC; SI ~ SI-2; DI ~ DI-1; 37394350
DS ~ 1 CHR; SI ~ BUF; 37394360
CI ~ CI+BACC; GO FWD; 37394400
NDIV64(SI ~ SI-32; SI ~ SI-32); SI ~ SI-N; SI ~ SI+4; 37394450
GO ON; 37394460
FWD: NDIV64(SI ~ SI+32; SI ~ SI+32); SI ~ SI+N; 37394500
ON: DI ~ LOC L; DS ~ 4 OCT; 37394550
OWT: 37394560
END STREAM; 37394600
T1 ~ P; 37394650
IF P(DUP)=0 OR P(XCH)!T1 THEN TERMINATE(P1MIX&108[CTF]); 37394700
END; 37394800
IF NR>0 THEN STREAM(NR,T~M[LOCAT],LOCAT);% 37395000
BEGIN SI~LOCAT; SI~SI+8; DS~NR WDS;% 37396000
SI~LOC T; DS~WDS END;% 37397000
CURRENT.[33:15]~K~M[K+D].[18:15];% 37398000
FINAL.[33:15]~K+J;% 37399000
END END ELSE 37400000
BEGIN 37401000
T~ALPHA&U[12:42:6] OR M;% 37404000
FOR I~N-1 STEP -1 UNTIL 0 DO% 37405000
BEGIN M[ALPHA+I]~(CURLOC~GETSPACE(BSIZE+4,2,1)+2)+2; 37406000
$ SET OMIT = NOT(BREAKOUT) 37406099
IF FIRSTLOC=0 THEN FIRSTLOC~CURLOC;% 37407000
M[CURLOC+1]~0; MOVE(BSIZE+1,CURLOC+1,CURLOC+2); 37408000
LINK: M[CURLOC]~FLAG(T)&(PREVLOC+2)[18:33:15];% 37412000
M[CURLOC+BSIZE+3]~FLAG(T)&(PREVLOC+BSIZE+1)[18:33:15];% 37413000
PREVLOC~CURLOC;% 37414000
END;% 37415000
IF I=(-1) THEN BEGIN CURLOC~FIRSTLOC; GO TO LINK END;% 37416000
END END FILL OR GET BUFFERS; 37417000
REAL PROCEDURE FILEHEADER(MID,FID,NROWS,SIZE,BLEN,RLEN,S);% 37418000
VALUE MID,FID,NROWS,SIZE,BLEN,RLEN,S;% 37419000
REAL MID,FID;% 37420000
INTEGER NROWS,SIZE,BLEN,RLEN,S;% 37421000
BEGIN REAL Q,LPER,SPER; ARRAY T=Q[*]; 37422000
INTEGER N1,R1,L1,W; 37422100
$ SET OMIT = NOT SHAREDISK 37422199
LABEL T1FILL,EXIT; 37422300
SPER~(BLEN+29) DIV 30;% 37424000
IF SPER>63 THEN 37424100
FILEMESS(-"INVALID","BLOCK ",MID,FID,RLEN,BLEN,SPER); 37424200
IF S.[42:6]=0 THEN RLEN~BLEN;% 37425000
$ SET OMIT = SHAREDISK 37425499
Q:=S.[13:3]; 37425500
$ POP OMIT 37425501
$ SET OMIT = NOT SHAREDISK 37425599
LPER~BLEN DIV RLEN;% 37426000
IF (NROWS+SIZE)=0 THEN% 37427000
BEGIN 37428000
IF (N1:=SECURITYCHECK(MID,FID,USERCODE[P1MIX],Q)) LSS 0 THEN 37428100
$ SET OMIT = NOT SHAREDISK 37428199
GO TO EXIT; 37428300
$ SET OMIT = NOT SHAREDISK 37428399
T:=N1&P(.T,LOD,XCH)[CTF]; 37429000
$ SET OMIT = NOT SHAREDISK 37429099
N1~T[7]+1; 37430000
IF(L1~T[0].[1:14])=0 THEN L1~30; 37431000
R1~T[0].[30:12]; 37432000
W ~N1 DIV R1 | T[0].[42:6]|30 +N1 MOD R1|L1; 37433000
T[7]~ W~ W DIV 30 DIV SPER|LPER 37434000
+(W DIV 30 MOD SPER|30 + W MOD 30 + RLEN-1) 37435000
DIV RLEN-1; 37436000
T1FILL: T[1]~(T[8] DIV SPER)| SPER; 37437000
T[4]:=(*P(DUP))&0[11:47:1] OR 1; 37437500
END ELSE% 37439000
$ SET OMIT = SHAREDISK 37439999
BEGIN T:=M OR (GETSPACE(30,8,1)+@360000700002); 37440000
STREAM(T); BEGIN 60(DS~4 LIT "0") END;% 37441000
$ POP OMIT 37441001
$ SET OMIT = NOT SHAREDISK 37441099
T[3]~XCLOCK+P(RTR); 37441500
T[7] ~ -1; 37442000
T[1]:=T[8]:=((SIZE+(LPER-1))DIV LPER)| SPER; 37443000
T[9] ~ NROWS; 37444000
END;% 37445000
T[0] ~SPER&LPER[30:36:12]&BLEN[15:33:15]&RLEN[1:34:14]; 37446000
FILEHEADER ~ NFLAG(T); 37447000
EXIT: 37447500
END FILEHEADER;% 37448000
PROCEDURE PURGEIT(U); VALUE U; INTEGER U;% 37449000
BEGIN ARRAY LABLE=+1[*];% 37450000
REAL RCW=+0,EOF=+2;% 37451000
REAL MSCW=-2; 37451500
P(0,0); 37453000
P(WAITIO(@4200000000,@377,U),DEL); 37453100
LABLE~[M[SPACE(10)]]&10[8:38:10]&5[21:45:3];% 37454000
BUILDLABEL(LABLE,0,"X",1,0,1,0,PRNTABLE[U].[30:18],0,0,0);% 37455000
P(WAITIO(LABLE,@37700000,U),DEL);% 37456000
EOF~@1737000000000000;% 37457000
P(WAITIO([EOF],@37700000,U),DEL);% 37458000
FORGETSPACE(LABLE.[33:15]); 37463000
SETNOTINUSE(U,0); 37464000
KILL([MSCW]); 37465000
END PURGEIT; 37466000
PROCEDURE KRUNCHER(H) ARRAY H[*]; 37500000
BEGIN DEFINE E=H[7]#,RL=H[1]#,RPB=H[0].[30:12]#, 37501000
MAXROWS=H[9]#, 37501500
BCL=H[0].[42:6]#,BRL=H[8]#; 37502000
ARRAY A[*]; 37504000
LABEL FORGET,EXIT,AGAIN,DONE; 37505000
INTEGER NB,NBR; 37506000
REAL I,J,K,T; 37507000
A:=[M[SPACE(41)]]&40[8:38:10]; 37508000
MOVE(41,A.[CF]-1,A); 37509000
IF E LSS 0 THEN GO TO EXIT; 37510000
NB:=E DIV RPB; 37511000
NBR:=RL DIV BCL; 37512000
IF RL NEQ BRL THEN 37513000
FOR I:=10 STEP 1 UNTIL 29 DO 37514000
IF H[I] NEQ 0 THEN 37515000
$ SET OMIT = SHAREDISK 37515995
FORGETUSERDISK(H[I]+RL,BRL-RL); 37516000
$ SET OMIT = NOT SHAREDISK 37516050
BRL=RL; 37517000
IF NB LSS NBR THEN 37520000
BEGIN A[0]:=H[NT2:=10]; 37521000
NT4:=1; 37521100
RL:=(NB+1)|BCL; 37521200
GO TO FORGET; 37521300
END; 37521400
T:=(K:=J:=1)+NBR|20; 37522000
AGAIN: IF(NT1:=NBR DIV J)=0 THEN GO TO DONE; 37523000
IF (NT2:=NB DIV NT1) GTR 19 THEN GO TO DONE; 37524000
IF NBR MOD J=0 THEN 37525000
BEGIN IF (NT3:=NT1|NT2+NT1) LSS T THEN 37526000
BEGIN K:=J; T:=NT3; NT4:=NT2+1 END; 37527000
END; 37528000
J:=J+1; 37529000
GO TO AGAIN; 37530000
DONE: IF K=1 THEN GO TO EXIT; 37530100
NT2:=NB DIV NBR + 10; 37530200
RL:=RL DIV K; 37531000
FOR I:=10 STEP 1 UNTIL NT2 DO 37532000
BEGIN IF (NT1:=H[I]-RL) GTR 0 THEN 37533000
FOR J:=1 STEP 1 UNTIL K DO 37534000
A[(I-10)|K+J-1]:=NT1+J|RL; 37535000
END; 37536000
FOR K:=NT4 STEP 1 UNTIL 19 DO A[K]:=0; 37538000
IF MAXROWS LSS (NT5:=(NT4!20)+NT4) THEN MAXROWS:=NT5; 37538500
FORGET: IF NB+1 NEQ NBR THEN 37539000
$ SET OMIT = SHAREDISK 37541995
FORGETUSERDISK(A[NT4-1]+RL,(NT2-9)|BRL-NT4|RL); 37542000
$ SET OMIT = NOT SHAREDISK 37542005
MOVE(20,A,[H[10]]); 37543000
BRK:=RL; 37544000
EXIT: FORGETSPACE(A); 37545000
END; 37546000
PROCEDURE DISKFILEOPEN(ALPHA); VALUE ALPHA; INTEGER ALPHA; 38000000
BEGIN REAL RCW=+0,MSCW=-2; 38001000
REAL IOM=IOMASK,IOMASK=+1; 38002000
INTEGER NBUFS=+2,FNUM=+3,RLEN=+4,TYPE=+5,IO=+6,BLEN=+7,U=+8, 38003000
KIND=+9,MODE=+10,DIREC=+11,FORMS=+12,COBOL=+13, 38004000
UNLABELED=+14,OPTIONAL=+15,CNTCTL=+16; 38005000
REAL T1=+17,T2=+18,MASK=+19,STATE=+20; 38006000
REAL MFID=+21,FID=+22; INTEGER REEL=+23,CDATE=+24,CYCLE=+25; 38007000
ARRAY FIB=+26[*],FPB=+27[*];% 38008000
INTEGER ACCESS=+28,FIB7=+29; 38009000
LABEL AGN,EXIT; 38009100
ARRAY HEADER=+30[*];% 38010000
REAL TOG=+31;% 38010100
SUBROUTINE DISKSETUP;% 38011000
BEGIN IF STATE.[42:1] THEN% 38012000
BEGIN 38013000
IF MFID=0 AND USERCODE[P1MIX] ! 0 THEN %126-38013010
BEGIN %126-38013020
FPB[FNUM ]:=MFID:=FID; %126-38013030
FPB[FNUM+1]:=FID :=USERCODE[P1MIX]; %126-38013040
END; %126-38013050
IF NFLAG(FIX[14]~FLAG(FILEHEADER(MFID 38013100
$ SET OMIT = NOT SHAREDISK 38013199
,FID&FIB[5][1:45:1],FIB[8].[20:5] 38013300
,FIB[8].[25:23],BLEN,RLEN,STATE)))<6 THEN 38013400
BEGIN P(DEL); 38013500
TOG:= 1; 38013510
$ SET OMIT = NOT SHAREDISK 38013519
GO TO EXIT; 38013600
END; 38013700
IF FIB[8].[20:28]!0 THEN FPB[FNUM+2].[18:30]~DATE ELSE 38013900
BEGIN% OLD FILE,VERIFY LABEL EQUATION DATE IF ANY 38014000
HEADER := FIB[14];% 38014100
STREAM(H:=HEADER[3].[30:18],B:=[T2]); 38014200
BEGIN SI:=LOC H; DS:=8 DEC; END;% 38014300
AGN: IF CDATE NEQ 0 AND CDATE NEQ HEADER[3].[30:18] THEN38014400
BEGIN% WRITE DATE CHECK MESSAGE 38014500
DOLITTLE(FALSE, 38014600
VWY&VOF[36:42:6]&VOK[30:42:6], 38014610
"#DAT CK"," =00000"&T2[18:18:30],MFID); 38014620
IF TERMSET(P1MIX) THEN 38014700
BEGIN 38014800
FORGETSPACE(DIRECTORYSEARCH(MFID,FID, 38014900
$ SET OMIT = NOT SHAREDISK 38014949
FIB[5].[13:3]+10)); 38015000
GO TO INITIATE; 38015100
END;% 38015200
IF P(NT6,DUP)=VOK OR P(XCH)=VOF THEN CDATE~0; 38015400
GO AGN 38015500
END;% VERIFICATION 38015600
FPB[FNUM+2].[18:30]:=T2;% BCL DATE 38015700
END OLD FILES;% 38015800
STARTIMING(FNUM,18);% 38015900
FPB:=PRT[P1MIX,3]; % STARTIMING MOVES THE FPB 38015950
END;% 38016000
HEADER~FIB[14];% 38020000
KIND~4; U~18;% 38021000
MODE~0;% 38022000
IF NOT COBOL THEN UNLABELED~1;% 38023000
CNTCTL~BLEN{1023;% 38024000
$ SET OMIT = NOT SHAREDISK 38024004
IF COBOL>0 AND (FIB[13].[22:1] OR TYPE=10 OR TYPE=26) THEN 38024100
BEGIN COBOL:=3; %IF COBOL-IO OR COBOL-RANDOM 38024200
BLEN := BLEN + RLEN; % THEN CHANGE BUFFSIZE TO 38024300
END; % BUFFSIZE + RECSIZE 38024400
GETBUFFERS((IF CNTCTL THEN BLEN% 38025000
ELSE ((BLEN+29) DIV 30)|30)+1,% 38026000
NBUFS,U,ALPHA);% 38027000
IF COBOL = 3 THEN %IF COBOL-IO OR COBOL-RANDOM 38027100
BEGIN COBOL := 1; % THEN CHANGE BUFFSIZE TO 38027200
BLEN := BLEN - RLEN; % BUFFSIZE - RECSIZE 38027300
END; % (SEE ABOVE 38027400
FIB[16]~M[ALPHA]&CNTCTL[23:47:1]&10[24:47:1]% 38028000
&((BLEN+29) DIV 30)[27:42:6]% 38029000
&(IF CNTCTL THEN BLEN ELSE 1023)[8:38:10]% 38030000
&TINU[18][3:3:5] OR M OR IOMASK;% 38031000
FIB[16].[2:1]:=(HEADER.[31:2] AND (IO+1))!0; 38032000
FIB[5].[1:1]:= NOT FIB[16].[2:1]; 38033000
IF FIB[5].[1:1] THEN 38034000
FOR MASK:=10 STEP 1 UNTIL 29 DO HEADER[MASK]:=0; 38035000
FIB[19]~(IF DIREC THEN BLEN-RLEN+1 ELSE 1) 38036000
INX FIB[16]&0[27:27:6]; 38037000
IF STATE.[46:2]!0 THEN FIB[19].[8:10]~RLEN;% 38038000
FS[P1MIX,(T2:=(FNUM DIV ETRLNG)).[40:4]]~(*P(DUP)) OR 38039000
(TWO(0&T2[43:44:4])|((NOT HEADER).[31:2])); 38040000
T2~IF COBOL THEN 0 ELSE FIB[19].[33:15]-FIB[16].[33:15]; 38041000
FIB[10].[3:15]:=M[ALPHA]-2; %HEAD OF BUFFER RING 38041100
FOR MASK~0 STEP 1 UNTIL NBUFS-1 DO% 38042000
M[ALPHA+MASK]~(P(DUP,LOD)+T2)% 38043000
&P(FLAG(FIB[19-ABS(3|COBOL)]),XCH)[CTC]; 38044000
FIB[16]:=FIB[16] OR M; 38045000
FIB[5].[45:1]~0; 38045100
IF P([FIB[14]],LOD).[FF]=2 THEN FIB[5].[11:2]~1;%INPUT ONLY.38045105
IF HEADER[4].[10:1] AND NOT IO THEN 38045110
FILEMESS(-"CODE ","FILE ",MFID,FID,0,0,0); 38045120
$ SET OMIT = NOT(PACKETS) 38045149
IF PSEUDOMIX[P1MIX]!0 THEN 38045150
IF NOT FIB[5].[41:1] THEN 38045155
FILEMESSAGE((IF IO THEN " IN " ELSE "OUT") 38045160
&TINU[U][6:30:18], IF ACCESS=0 THEN " SER " 38045200
ELSE IF ACCESS=1 THEN IF TYPE=26 THEN " PRO " 38045300
ELSE " RDM " ELSE " UPD ", 38045310
MFID,FID,0,0,0,64); 38045400
$ POP OMIT 38045501
END DISKSETUP;% 38046000
P(RCW,MSCW,STF); 38047000
RCW:=RCW&P(XCH)[CTC]; 38048000
DISKSETUP; 38049000
IF COBOL<0 THEN % ADJUST UPPER BOUND FOR COBOL 68 38049200
BEGIN MASK ~ (IF IO AND NOT FIB[13].[22:1] 38049300
THEN HEADER[7] 38049400
ELSE (((HEADER[9] | HEADER[1]) DIV 38049500
HEADER[0].[42:6]) | HEADER[0].[30:12]) - 1);38049600
IF FIB[3]=0 OR FIB[3]>MASK THEN FIB[3]~MASK; %LESSOR OF 2 EVILS38049700
END; 38049800
IF P(TYPE,DUP)=10 OR P(XCH)=26 THEN 38050000
BEGIN 38051000
IF COBOL<1 THEN % ALGOL OR COBOL 68 38052000
FOR MASK ~ 0 STEP 1 UNTIL NBUFS-1 DO 38053000
IF COBOL THEN M[M[ALPHA+MASK] INX NOT 2] ~ NOT 0 38053500
ELSE M[ALPHA+MASK]~P(DUP,LOD)&1[27:47:1]; 38054000
FIB[6]~FIB[7]~0;% 38055000
FIB[17]~IF IO THEN 0 ELSE BLEN;% 38056000
END ELSE 38057000
BEGIN 38058000
T2~(MFID~FIB[16).[33:15];% 38059000
FIV7~FIB[7]; 38060000
IF COBOL THEN% 38061000
BEGIN IF COBOL>0 THEN 38062000
IF NOT (FIB7=0 OR FIB[13].[22:1]) THEN 38062500
BEGIN FIB7 ~ FIB7 - 1; 38063000
OPTIONAL ~ NBUFS - 1; 38063500
END ELSE OPTIONAL ~ NBUFS - 2 38064000
ELSE BEGIN % COBOL 68 38064200
OPTIONAL ~ NBUFS - 1; 38064400
IF DIREC THEN FIB7 ~ FIB[7] ~ FIB[3]; 38064600
END; 38065000
FID~FIB[16];% 38066000
MASK~0;% 38067000
END ELSE% 38068000
BEGIN OPTIONAL~NBUFS-1;% 38069000
MASK~(FID~FIB[19]).[33:15]-T2;% 38070000
END;% 38071000
IF (STATE.[46:2]!0 AND NOT COBOL) OR IO THEN 38072000
IF M[ALPHA].]2:1] THEN 38073000
FOR T1~0 STEP 1 UNTIL OPTIONAL DO% 38074000
BEGIN IF (M[T2]:= 38074500
DISKADDRESS(FPB[FNUM], FPB[FNUM+1], FPB[FNUM+3], 38075000
FORMS:=((HEADER[0].[30:12]|T1)&DIREC[1:47:1])+FIB7,38075500
HEADER, IO&(NOT HEADER[4])[46:47:1])) > 1 THEN 38076000
BEGIN 38076500
IF (USERCODE[P1MIX] EQV MCP)!NOT 0 THEN 38077000
IF P(M[MFID],DUP).[3:6]=0 AND 38077500
P(XCH)<DIRDSK|DSKTOG THEN 38078000
BEGIN 38078500
TERMINATE(P1MIX); 38079000
TERMINALMESSAGE(30); 38079500
END; 38080000
IOREQUEST(FLAG(FID),MFID&1[24:47:1],M[T2-2]); 38080500
M[ALPHA]:=FLAG(MFID)&0[26:26:7] AND NOT 38081000
(M OR IOMASK); 38081250
END ELSE 38081500
IF M[T2]=0 THEN % EOF IF INPUT, FULL HDR IF OUTPT38081750
M[ALPHA]:=P(DUP,LOD)&1[27:47:1] AND NOT M; 38082000
IF COBOL<0 THEN M[M[ALPHA] INX NOT 2] ~ 38082400
(IF FORMS}0 THEN FORMS DIV FIB[11] ELSE NOT 0); 38082500
STREAM(N~NBUFS-1,T~M[ALPHA],ALPHA);% 38083000
BEGIN SI~ALPHA; SI~SI+8; DS~N WDS;% 38084000
SI~LOC T; DS~WDS;% 38085000
END;% 38086000
MFID.[33:15]~T2~M[T2-2].[18:15];% 38087000
FID.[33:15]~T2+MASK;% 38088000
END;% 38089000
IF (NBUFS-1)!OPTIONAL THEN FIB[16].[33:15]~M[ALPHA] ;% 38090000
FORMS~(FORMS~FIB7 MOD HEADER[0].[30:12])|RLEN; 38091000
SLEEP([M[ALPHA]],IOMASK);% 38092000
IF COBOL } 0 THEN % NOT COBOL 68 38092900
IF FIB[13].[22:1]THEN M[ALPHA].[33:15]~FIB[16]INX 1 ELSE 38093000
M[ALPHA].[33:15]~FIB[16].[33:15]+FORMS+1;% 38094000
IF (NBUFS-1)!OPTIONAL AND IO AND NOT FIB[13].[22:1] THEN 38095000
FIB[ 17 ]~0 ELSE 38096000
FIB[17]~IF DIREC THEN FORMS~RLEN% 38097000
ELSE BLEN-FORMS;% 38098000
END; 38099000
EXIT: 38099100
P(P&RCW[CTC],0,RDS,0,XCH,P&P[CTF],STF); 38100000
END DISKFILEOPEN; 38101000
PROCEDURE OTHERFILEOPENIN(ALPHA); AVLUE ALPHA; INTEGER ALPHA; 38102000
BEGIN REAL RCW=+0,MSCW=-2; 38102100
REAL IOM=IOMASK, IOMASK=+1; 38102200
INTEGER NBUFS=+2,FNUM=+3,RLEN=+4,TYPE=+5,IO=+6,BLEN=+7,U=+8, 38102300
KIND=+9,MODE=+10,DIREC=+11,FORMS=+12,COBOL=+13, 38102400
UNLABELED=+14,OPTIONAL=+15,CNTCTL=+16; 38102500
REAL T1=+17,T2=+18,MASK=+19,STATE=+20; 38102600
REAL MFID=+21,FID=+22; INTEGER REEL=+23,CDATE=+24,CYCLE=+25; 38102700
ARRAY FIB=+26[*],FPB=+27[*];% 38102800
INTEGER ACCESS=+28,FIB7=+29; 38102900
ARRAY HEADER=+30[*];% 38103000
REAL TOG=+31; 38103100
REAL USASI=NT1, RHEAD=HEADER; 38103200
LABEL FIND,DCN,DC19; 38103300
SUBROUTINE TYPEOPEN;% 38103400
BEGIN 38103500
T1:=(OPNMESS AND ((T1:=JAR[P1MIX,0])>0 OR 38103600
COPNMESS AND T1<0)); 38103700
$ SET OMIT = PACKETS 38103800
BEGIN NT2:=0; 38104100
IF U<16 THEN 38104200
STREAM(S:=PRNTABLE[U].[30:18], D:=[NT2]); 38104300
BEGIN SI ~ LOC S; DS ~ 8 DEC; % 38104400
DI ~ DI-7; DS ~ 6 FILL; % 38104500
END; % 38104600
FILEMESSAGE((" IN ")& 38104700
TINU[U][6:30:18], NT2, FPB[FNUM], FPB[FNUM+1], 38104800
IF KIND=2 OR KIND=9 THEN P(REEL,CDATE) ELSE 38104900
P(0,0), P, CYCLE, T1) 38105000
END; 38105100
END; 38105200
SUBROUTINE REED;% 38105300
BEGIN IF (T2~WAITIO(T1,(MASK OR @40)&@377[CTF],U) AND @367)!0 THEN38105400
IF (T2 AND NOT MASK)!0 THEN 38105500
BEGIN STOPTIMING(FNUM,1023); BLASTQ(U); SETNOTINUSE(U,0); 38105600
FILEMESS(-"PARITY ","ON ... "&TINU[U][24:30:18],% 38105700
MFID,FID,REEL,CDATE,CYCLE);% 38105800
END;% 38105900
IF TERMSET(P1MIX) THEN 38106000
BEGIN STOPTIMING(FNUM,1023); SETNOTINUSE(U,0); 38106100
GO TO INITIATE; 38106200
END; 38106300
END REED;% 38106400
REAL SUBROUTINE CNTLBITS;% 38106500
CNTLBITS~IOMASK&MODE[21:47:1]&DIREC[22:47:1]&CNTCTL[23:47:1]38106600
&IO[24:47:1]&(KIND=7 OR KIND>9 AND KIND{12)[20:47:1] 38106700
&(IF KIND=1OR KIND=7OR KIND=12THEN@20ELSE 0)[27:42:6];38106800
SUBROUTINE LABELAREA;% 38106900
M[T1:=ALPHA-2]:=M OR (GETSPACE((T1:=M[T1],SIZE)+4, %167-38107000
LABELAREAV,1)+4) & T1[SIZE] & CNTLBITS[FTF];38107100
P(ALPHA); % DETERMINE IF BRANCH TO DC19 38109000
P(RCW,MSCW,STF); 38110000
RCW:=RCW&P(XCH)[CTC]; 38110500
IF P=2 THEN GO DC19; 38111000
IF STATE.[41:1] THEN% 38111500
BEGIN U~FIB[15].[25:5];% 38112000
END ELSE% 38112500
BEGIN IF (U~FINDINPUT(MFID,FID,REEL,CDATE,CYCLE,COBOL,UNLABELED, 38113000
OPTIONAL,MODE,FNUM))<0 THEN% 38113500
BEGIN FIB[5].[39:4]~9; GO TO FIND END;% 38114000
STARTIMING(FNUM,IF U>31 THEN 18 ELSE U); 38114500
FPB:=PRT[P1MIX,3]; % STARTIMING MAY HAVE MOVED IT. 38115000
KIND:=IF U GTR 31 THEN 11 ELSE UNIT[U].[1:4]; 38115100
TYPEOPEN;% 38115500
IF U<16 THEN BEGIN RRRMECH~TWO(U) OR RRRMECH; 38116000
PRNTABLE[U].[15:15]~ALPHA;% 38116500
END;% 38117000
% TGW38117500
IF (T1~RDCTABLE[U].[14:10])!0 THEN REEL~T1; 38118000
STATE.[39:4]~0;% 38118500
END;% 38119000
IF KIND=0 THEN% 38119500
BEGIN IF U=23 THEN BEGIN T1~READERA; READERA~0 END% 38120000
ELSE BEGIN T1~READERB; READERB~0 END;% 38120500
M[ALPHA-2]:=[M[T1]]&10[8:38:10]&1[24:47:1];% 38121000
M[T1-4]:=P(DUP,LOD)&P1MIX[AREAMIXF]&LABELAREAV[AREATYPEF];% 38121500
IF MODE := (MODE=0) AND BLEN=20 THEN %301-38122000
SAVEWORD:=SAVEWORD OR TWO(U); %301-38122100
CNTCTL:=DIREC:=0;% 38122500
IF BLEN<T1~(MODE+1)|10 THEN BLEN~T1;% 38123000
END ELSE% 38123500
IF KIND=2 THEN% 38124000
BEGIN IF NOT UNLABELED THEN BEGIN% 38124500
IF DIREC AND NOT FIB[16].[22:1] THEN 38125000
BEGIN IF NOT STATE.[40:1] THEN BEGIN% 38125500
T1~5&3[23:46:2] OR M;% 38126000
MASK~0; REED;% 38126500
MASK:=@60; DO REED UNTIL T2.[42:1]; 38127000
DO REED UNTIL T2.[42:1]; 38127500
MASK~0; REED; END;% 38128000
END; 38128500
CNTCTL~1; LABELAREA;% 38129000
T1:=NFLAG(M[ALPHA-2]);% 38129500
IF DIREC THEN T1:=T1.[8:10]-1 INX T1;% 38130000
MASK:=@40; REED; 38130500
STREAM(Y:=0:X:=0,X1:=0,X2:=0,Z:=T1); 38131000
BEGIN DI:=LOC X; DS:=24 LIT "VOL1HDR1HDR2EOF1EOF2EOV1"; 38131500
DI:=LOC X; 38132000
6(TALLY:=TALLY+1; 38132500
SI:=Z; 38133000
IF 4 SC=DC THEN 38133500
JUMP OUT TO B); 38134000
TALLY:=0; 38134500
B: 38135000
Y:=TALLY; 38135500
END; 38136000
IF (USASI:=P)>0 THEN 38136500
USASITAPE(T1.[CF],USASI,4,U,DIREC) ELSE 38137000
IF M[T1 INX 6].[24:6]=1 THEN 38137500
BEGIN 38138000
REED; 38138500
MASK~@60; 38139000
T1~5&3[23:46:2] OR M; 38139500
T2~0; 38140000
END; 38140500
IF T2 NEQ @40 THEN DO REED UNTIL T2.[42:1] ELSE 38141000
FOR CNTCTL~DIREC STEP 1 UNTIL 2 DO% DIREC = 0 OR 1 %DB 38141500
P(WAITIO(@4740000005&(NOT DIREC)[22:47:1],@377,U),DEL);%DB38142000
FWD;% 38142500
CNTCTL~BLEN{1023;% 38143000
END ELSE% 38143500
IF KIND=9 THEN% 38144000
BEGIN UNLABELED~CNTCTL~1;% 38144500
DIREC~0;% 38145000
END ELSE% 38145500
IF KIND=11 THEN 38146000
BEGIN T1~CIDROW[U-32].[18:15]; 38146500
CIDROW[U-32].[18:15]~0; 38147000
M[ALPHA-2]:=[M[T1]]&10[8:38:10]&1[24:47:1];% 38147500
M[T1-4]:=P(DUP,LOD)&P1MIX[AREAMIXF]&LABELAREAV[AREATYPEF];% 38148000
MODE:=0;% 38148500
CNTCTL:=DIREC:=0;% 38149000
FIB[13].[1:9]~NBUFS~1; FIB[13].[10:9]~1; 38149500
IF BLEN<10 THEN BLEN~10; 38150000
END ELSE 38150500
DCN:: FILEMESS(-"I/O ERR",0,MFID,FID,REEL,CDATE,CYCLE);% 38151000
P(1); 38151500
IF BLEN=0 THEN GO TO DCN;% 38151800
IF NOT FIB[18].[1:1] OR P THEN 38151900
GETBUFFERS(BLEN,NBUFS,U,ALPHA); 38152000
GO FIND; 38152100
DC19: 38152250
$ SET OMIT = NOT(DATACOM AND RJE ) 38152500
FIB[14]:=NBUFS; 38156500
U:=30; KIND:=13; 38157000
FIB[13].[1:9]~ NBUFS~2; 38157500
FIB[18]:=(*P(DUP))&(BLEN:=RLEN)[3:33:15]&BLEN[CTF]; 38158000
IF MFID>0 THEN 38158500
BEGIN ; 38159000
STREAM(A~0,B~0:MFID,FID,C~0); 38159500
BEGIN 38160000
SI~ LOC MFID; DI~ LOC A; 38160500
2(C~ SI; 8(IF SC}0 THEN IF SC{9 THEN TALLY~ TALLY+1 38161000
ELSE JUMP OUT ELSE JUMP OUT; SI~ SI+1);38161500
SI~ C; C~ TALLY; DS~ C OCT; TALLY~ 0; SI~ LOC FID);38162000
END; 38162500
FID~ P; 38163000
MFID~P; 38163500
END; 38164000
M[ALPHA-2]~ 0&MFID[9:44:4]&FID[14:44:4]; 38164500
FIND:: 38191500
P(P&RCW[CTC],0,RDS,0,XCH,P&P[CTF],STF); 38192000
END OTHER FILE OPEN IN; 38192500
PROCEDURE OTHERFILEOPENOUT(ALPHA); VALUE ALPHA; INTEGER ALPHA; 38200000
BEGIN REAL RCW=+0,MSCW=-2; 38200100
REAL IOM=IOMASK, IOMASK=+1; 38200200
INTEGER NBUFS=+2,FNUM=+3,RLEN=+4,TYPE=+5,IO=+6,BLEN=+7,U=+8, 38200300
KIND=+9,MODE=+10,DIREC=+11,FORMS=+12,COBOL=+13, 38200400
UNLABELED=+14,OPTIONAL=+15,CNTCTL=+16; 38200500
REAL T1=+17,T2=+18,MASK=+19,STATE=+20; 38200600
REAL MFID=+21,FID=+22; INTEGER REEL=+23,CDATE=+24,CYCLE=+25; 38200700
ARRAY FIB=+26[*],FPB=+27[*];% 38200800
INTEGER ACCESS=+28,FIB7=+29,; 38200900
ARREAY HEADER=+30[*]; 38201000
REAL TOG=+31; 38201100
REAL USASI=NT1, RHEAD=HEADER 38201200
LABEL LPS,FIND,DNC,PBS; 38201300
SUBROUTINE TYPEOPEN;% 38201400
BEGIN 38201500
T1:=(OPNMESS AND ((T1:=JAR[P1MIX,0])>0 OR 38201600
COPNMESS AND T1<0)); 38201700
$ SET OMIT = PACKETS 38201800
BEGIN NT2:=0; 38202100
IF U<16 THEN 38202200
STREAM(S:=PRNTABLE[U].[30:18], D:=[NT2]); 38202300
BEGIN SI ~ LOC S; DS ~ 8 DEC; % 38202400
DI ~ DI-7; DS ~ 6 FILL; % 38202500
END; % 38202600
FILEMESSAGE((" OUT")& 38202700
TINU[U][6:30:18], NT2, FPB[FNUM], FPB[FNUM+1], 38202800
IF KIND=2 OR KIND=9 THEN P(REEL,CDATE) ELSE 38202900
P(0,0), P, CYCLE, T1); 38203000
END; 38203100
END; 38203200
SUBROUTINE REED;% 38203300
BEGIN IF (T2~WAITIO(T1,(MASK OR @40)&@377[CTF],U) AND @367)!0 THEN38203400
IF (T2 AND NOT MASK)!0 THEN 38203500
BEGIN STOPTIMING(FNUM,1023); BLASTQ(U); SETNOTINUSE(U,0); 38203600
FILEMESS(-"PARITY ","ON ... "&TINU[U][24:30:18],% 38203700
MFID,FID,REEL,CDATE,CYCLE);% 38203800
END;% 38203900
IF TERMSET(P1MIX) THEN 38204000
BEGIN STOPTIMING(FNUM,1023); SETNOTINUSE(U,0); 38204100
GO TO INITIATE; 38204200
END; 38204300
END REED% 38204400
REAL SUBROUTINE CNTLBITS;% 38204500
CNTLBITS~IOMASK&MODE[21:47:1]&DIREC[22:47:1]&CNTCTL[23:47:1]38204600
&[24:47:1]&(KIND=7 OR KIND>9 AND KIND{12)[20:47:1] 38204700
&(IF KIND=1OR KIND=7OR KIND=12THEN@20ELSE 0)[27:42:6];38204800
SUBROUTINE LABELAREA;% 38204900
M[T1:=ALPHA-2]:=M OR (GETSPACE((T1:=M[T1],SIZE)+4, %167-38205000
LABELAREAV,1)+4) & T1[SIZE] & CNTLBITS[FTF];38205100
P(RCW,MSCW,STF); 38210000
RCW:=RCW&P(XCH)[CTC]; 38210500
IF STATE.[41:1] THEN% 38211500
BEGIN U~FIB[15].[25:5];% 38212000
END ELSE% 38212500
BEGIN T2:=FPB[FNUM+3]; % SAVES COPIES FOR BACK UP 38213000
IF (U:=FINDOUTPUT(MFID,FID,REEL,CDATE,CYCLE,TYPE 38213500
$ SET OMIT = NOT PACKETS 38214000
&FPB[FNUM-3][1:23:1] 38214500
$ POP OMIT 38215000
,FORMS,KIND))>40 THEN 38215500
BEGIN FIB[14].[3:15]~U; 38216000
FPB[FNUM+2],[18:30]~DATE; 38216500
IF MCP!NOT(-0) THEN M[U+2]~USERCODE[P1MIX]; 38217000
M[U+3]~XCLOCK+P(RTR); 38217500
T1:=SPACE(30); 38218000
MOVE(30,U,T1); 38218500
STREAM(DATE,B:=T1+3); 38219000
BEGIN SI:=LOC DATE;DS:=8OCT;DI:=DI-8;DS:=2LIT"+2";END; 38219500
M[T1+1]~(XCLOCK+P(RTR))&(M[T1+3])[6:30:18]; 38220000
M[T1+4]:= 0&SYSNO[4:46:2]&1[2:47:1]; 38220500
M[T1+5]~(*PDUP))&1[2:47:1]; %ABORTED PBD TOG. 38221000
$ SET OMIT = RJE AND DATACOM 38221500
P(0); 38222000
$ POP OMIT 38222500
$ SET OMIT = NOT(RJE AND DATACOM) 38223000
M[T1+6]~P(XCH); 38226500
M[U-1]:=EUF(IF TYPE NEQ 0 AND TYPE LSS 20 THEN 38227000
"PRD " ELSE "PUD ",M[U+6],T1-1); 38227500
FORGETSPACE(T1); 38228000
$ SET OMIT = PACKETS 38228500
FILEMESSAGE((IF TYPE GEQ 20 OR TYPE=0 THEN "PUD...." 38230000
ELSE "PBD....")&M[U+6][24:6:24], 38230500
"OUT "&M[U+6][30:30:18], 38231000
MFID,FID,0,0,0, 38231500
(PBDREL OR OPNMESS)); 38232000
STARTIMING(FNUM,U~18); 38232500
FPB:=PRT[P1MIX,3]; % STARTIMING MAY HAVE MOVED IT. 38233000
END ELSE 38233500
IF U LSS 0 THEN %DSED 38234000
BEGIN FIB[5].[39:4]:=9; GO FIND END ELSE 38234500
BEGIN 38235000
STARTIMING(FNUM,U);% 38235500
FPB:=PRT[P1MIX,3]; % WATCH OUT FOR STARTIMING, 38236000
IF KIND=7 THEN FPB[FNUM+3] := (*P(DUP))&T2[15:15:8]; 38236010
TYPEOPEN;% 38236500
IF TYPE=5 OR TYPE=8 OR TYPE=9 THEN UNLABELED~1;% 38237000
IF U<16 THEN BEGIN RRRMECH~TWO(U) OR RRRMECH; 38237500
PRNTABLE[U].[15:15]~ALPHA;% 38238000
END; END; 38238500
END;% 38239000
IF KIND=6 THEN% 38239500
BEGIN BLEN:=10; 38240000
FIB[18]:=(*P(DUP))&BLEN[CTC]&BLEN[CTF]&BLEN[3:33:15]; 38240500
MODE~DIREC~CNTCTL~0;% 38241000
END ELSE% 38241500
IF KIND=1 THEN% 38242000
BEGIN MODE~DIREC~CNTCTL~0;% 38242500
LPS: 38243000
IF NOT COBOL THEN M[ALPHA-2]~0&15[8:38:10];% 38243500
END ELSE% 38244000
IF KIND=12 THEN 38244500
BEGIN TYPE~IF (TYPE!0 AND TYPE<20) THEN 15 ELSE 22; 38245000
PBS: MODE~DIREC~0; FIB[13].[1:9]~NBUFS~CNTCTL~1; FIB[13].[10:9]~1; 38245500
BLEN~IF TYPE}20 THEN 10 ELSE IF BLEN>17 THEN 17 ELSE BLEN; 38246000
M[T1~GETSPACE(92,3,1)+2]~M[T1-1]~[M[ALPHA]]&(T1+2)[CTF]& 38246500
U[12:42:6]; 38247000
DISKIO(RHEAD,-T1-75,11,JAR[P1MIX,6].[CF]); 38247500
M[ALPHA]:=T1+2; 38248000
FIB[14]~(*P(DUP))&(T1+2)[CTC]&(T1+56)[CTF]; 38248500
FIB[18]~(*P(DUP))&BLEN[CTC]&BLEN[CTF]&BLEN[03:33:15]; 38249000
STREAM(D~T1+1); 2(36(DS~8 LIT"0")); 38249500
FIB[5].[FF]~(M[T1+91]~FIB[5].[FF]&1[18:47:1])+1; 38250000
SLEEP([RHEAD],IOMASK); 38250500
HEADER:=[M[T1]]&92[8:38:10]; 38251000
HEADER[74]~MFID; 38251500
HEADER[75]~FID; 38252000
HEADER[87]~FORMS; 38252500
HEADER[88]:=T2.[15:8]; % COPIES 38253000
HEADER[89]:=USERCODE[P1MIX]; %132-38253100
HEADER[76]~ABS(JAR[P1MIX,0]); 38253500
HEADER[77]~ABS(JAR[P1MIX,1]); 38254000
REEL~RDCTABLE[U].[14:10]; % GET ACTUAL REEL NUMBER %745-38254100
GO TO LPS; 38254500
END ELSE 38255000
IF KIND=7 THEN% 38255500
BEGIN TYPE~IF (TYPE!0 AND TYPE<20) THEN 6 ELSE 20; 38256000
IF SVPBT THEN SAVEWORD:=TWO(U) OR SAVEWORD; 38256500
GO TO PBS; 38257000
END ELSE% 38257500
IF KIND=2 THEN% 38258000
BEGIN IF PRNTABLE[U]}0 THEN GO TO DCN;% 38258500
CNTCTL~MODE;% 38259000
END ELSE% 38259500
IF KIND=8 THEN% 38260000
BEGIN UNLABELED~CNTCTL~1;% 38260500
DIREC~0;% 38261000
END;% 38261500
IF UNLABELED THEN% 38262000
BEGIN IF COBOL THEN% 38262500
BEGIN MASK~0;% 38263000
IF KIND=1 THEN BEGIN T1~@4000100000; REED END ELSE 38263500
IF KIND=7 OR KIND=12 THEN 38264000
BEGIN 38264500
IF TYPE < 20 THEN 38265000
BEGIN 38265500
HEADER[73]~@1540176000100000&FIB[5][FTC]; 38266000
FIB[5].[FF]~FIB[5].[FF]+1; 38266500
FIB[14].[FF]:=T1+38; 38267000
END; 38267500
GO FIND; 38268000
END; 38268500
END;% 38269000
END ELSE% 38269500
BEGIN IF COBOL THEN% 38270000
BEGIN M[ALPHA-2]~P(DUP,LOD)&CNTLBITS[18:18:15];% 38270500
IF U<16 THEN% 38271000
STREAM(N~PRNTABLE[U].[30:18],D~M[ALPHA-2]);% 38271500
BEGIN SI~LOC N; DI~DI+53; DS~5 DEC END;% 38272000
END ELSE% 38272500
BEGIN IF REEL=0 THEN REEL~1;% 38273000
IF CYCLE=0 THEN CYCLE~1;% 38273500
IF CDATE=0 THEN STREAM(DATE,CD~[CDATE]);% 38274000
BEGIN SI~LOC DATE; SI~SI+3; DS~5 OCT END; 38274500
LABELAREA;% 38275000
BUILDLABEL(M[ALPHA-2],MFID,FID,REEL,CDATE,CYCLE,% 38275500
FIB[4],(IF U<16 THEN PRNTABLE[U].[30:18] 38276000
ELSE 0),STATE.[46:2],% 38276500
BLEN,RLEN);% 38277000
END;% 38277500
M[M[ALPHA-2] INX P(DUP).[8:10]]~@3700000000000000;% 38278000
IF (P(KIND,DUP)=7 OR (P(XCH,DUP)=12 OR P(XCH)=1)) THEN 38278500
IF KIND=7 AND FIB[13].[28:10]!ABS(COBOL) THEN GO FIND ELSE 38279000
BEGIN IF TYPE GEQ 20 THEN % MAKE CP BACK-UP LABEL 38279500
BEGIN M[M[ALPHA-2] INX 4]:=FLAG(NABS(JAR[P1MIX,0])); 38280000
M[M[ALPHA-2] INX 5]:=FLAG(JAR[P1MIX,1]&17[1:43:5]); 38280500
STREAM(A:=[M[M[ALPHA-2] INX 6]]); 38281000
BEGIN DS:=15 LIT" PUNCH BACK-UP "; DS:=LIT"%"; 38281500
2(DS:=8 LIT"%%%%%%%%"); 38282000
END; 38282500
END ELSE % MAKE LP LABEL 38283000
BEGIN T1:=M[M[ALPHA-2]INX 3]; 38283500
DISKIO(T2,NABS(M[ALPHA-2]INX 1),11,JAR[P1MIX,6].[CF]);38284000
M[M[ALPHA-2]INX 13]:=FLAG(NABS(JAR[P1MIX,0])); 38284500
M[M[ALPHA-2]INX 14]:=FLAG(JAR[P1MIX,1]&17[1:43:5]); 38285000
SLEEP([T2],IOMASK); 38285500
M[M[ALPHA-2] INX 3]:=T1; 38286000
END; 38286500
M[M[ALPHA02] INX 1]:=MFID; 38287000
M[M[ALPHA-2] INX 2]:=FID; 38287500
IF KIND=1 THEN M[ALPHA-2]~P(DUP,LOD) & %150-38288000
(IF SEPARATE THEN 1 ELSE @20)[27:42:6] %150-38288100
ELSE %150-38288200
BEGIN HEADER[73]~(FIB[5].[FF] OR @360170100000000)& 38288500
(TYPE<20)[32:47:1]; 38289000
IF NOT SEPARATE THEN %150-38289100
IF (TYPE<20) THEN %150-38289200
HEADER[73]~P(DUP,LOD)&(@20)[27:42:6];%150-38289300
FIB[5]~P(DUP,LOD,0,1,CFX,+); 38289500
STREAM(L~M[ALPHA-2],B~[HEADER[56]]); 38290000
BEGIN SI~L; DS~17 WDS END; 38290500
FIB[14].[FF]~[HEADER[38]]; GO FIND; 38291000
END; END; 38291500
T1~NFLAG(M[ALPHA-2]);% 38292000
MASK~0L REEDL% 38292500
IF KIND=2 THEN% 38293000
BEGIN T2~@1737000000000000;% 38293500
T1~NFLAG([T2]);% 38294000
REED;% 38294500
END;% 38295000
END;% 38295500
P(0); 38296000
IF BLEN=0 THEN 38296500
DCN:: FILEMESS(-"I/O ERR",0,MFID,FID,REEL,CDATE,CYCLE); 38296750
IF NOT FIB[18].[1:1] OR P THEN 38297000
GETBUFFERS(BLEN,NBUFS,U,ALPHA); 38297500
FIND:: 38298000
P(P&RCW[CTC],0,RDS,0,XCH,P&P[CTF],STF); 38298500
END OTHER FILE OPEN OUT; 38299000
PROCEDURE DISKCLOSE(ALPHA); VALUE ALPHA; INTEGER ALPHA;% 38355000
BEGIN REAL RCW=+0,MSCW=-2; 38356000
ARRAY FIB=+1[*],FPB=+2[*],HEADER=+3[*];% 38357000
%%% DONT ADD ANY DECLARATIONS BETWEEN "HEADER" AND "KIND" %%% WCP 38358000
INTEGER KIND=+4,NUBFS=+5,U=+6,BLEN=+7,CODE=+8, 38359000
UNLABELED=+9,COBOL=+10,I=+11,J=+12, 38360000
FNUM=+13; 38361000
REAL MID=+14,FID=+15,H=+16,D=+17,C=+18,FORMS=+19,STATE=+20; 38362000
LABEL L1,L2,L3,EOF,CLEANUP; 38363000
LABEL OBJTYPE,DUMMY; 38364000
REAL STA=+21;% 38364100
REAL T1=+22,T2=+23,T3=+24,IOD=+25;% 38365000
ARRAY SEG0=+26[*],SKEL=+27[*];% 38366000
REAL T=+28,ACCESS=+29;% 38366010
BOOLEAN COMPGO=+30; 38366020
$ SET OMIT = NOT SHAREDISK 38366099
SUBROUTINE COOLOFF; 38370700
BEGIN FOR I~0 STEP 1 UNTIL NBUFS-1 DO% 38370800
BEGIN IF NOT M[ALPHA+1].[19:1] THEN% 38371000
SLEEP([M[ALPHA=I]],IOMASK);% 38372000
IF KIND!4 THEN 38373000
IF M[ALPHA+I].[27:1] THEN GO TO EOF;% 38374000
END;% 38375000
EOF: END COOLOFF;% 38376000
% 38376500
BOOLEAN SUBROUTINE WRITTENON; % PICKS UP THE ACCESSED BITS FROM38377000
BEGIN J:=0; % THE BUFFERS. 38377200
IF (T:=FIB[10].[3:15]) NEQ 0 THEN 38377400
BEGIN 38377600
FOR I:=NBUFS-1 STEP -1 UNTIL 0 DO 38377800
IF M[T].[11:1] THEN J:=I:=-1 ELSE T:=M[T].[FF]-2; 38378000
END; 38378200
WRITTENON:=J; 38378400
END; 38378600
% 38379000
DEFINE REW=CODE.[47:1]#,% 38380000
KRUNCH=NOT CODE.[42:1]#, 38381000
REL=CODE.[46:1]#,% 38382000
TIME=CODE.[45:1]#,% 38383000
LOCK=NOT CODE.[44:1]#,% 38384000
PURGE=NOT CODE.[43:1]#,% 38385000
DEFINE TECH=STATE.[46:2]#, OPENIO=FIB[13].[22:1]#, 38385400
WRITBACK=FIB[13].[23:1]#, LASTIO=FIB[13].[46:1]#, 38385500
WRITEAFTEREOF=FIB[13].[44:2]#, INPUT=STATE.[43:1]#; 38385600
% 38386000
% START OF CODE 38386010
% 38386020
P(RCW,MSCW,STF); RCW ~ RCW & P(XCH)[CTC]; 38387000
HEADER ~ FIB[14]; ACCESS ~ FIB[4].[27:3]; 38388000
IF COBOL THEN 38389000
BEGIN IF COBOL > 0 THEN % COBOL 61 38389100
BEGIN IF WRITBACK AND TECH=0 AND LASTIO AND 38389200
(OPENIO OR NOT(INPUT)) THEN 38389300
IF ACCESS=1 AND WRITEAFTEREOF!0 THEN 38389400
BEGIN FIB[7] ~ *P(DUP) - 1; 38389500
HEADER[7] ~ *P(DUP) - 1; 38389600
END ELSE WRITEAFTEREOF ~ 0; 38389700
IF TECH=0 THEN IF WRITEAFTEREOF=2 THEN 38389800
BEGIN FIB[7] ~ *P(DUP) + 1; 38389900
HEADER[7] ~ *P(DUP) + 1; 38390000
END ELSE IF WRITEAFTEREOF=1 THEN 38390100
BEGIN FIB[7] ~ *P(DUP) - 1; 38390200
HEADER[7] ~ *P(DUP) - 1; 38390300
END; 38390400
WRITEAFTEREOF ~ 0; 38390500
END; 38391000
IF ACCESS=1 THEN % IF RANDOM 38391010
BEGIN IF COBOL > 0 THEN % COBOL61 38391020
BEGIN ACCESS ~ 4; 38391025
IF FIB[13].[10:9] = 2 THEN % SEEK IN PROCESS 38391030
BEGIN 38391035
$ SET OMIT = NOT SHAREDISK 38391039
COOLOFF; FIB[13].[10:9] ~ 1; 38391050
END 38391055
END ELSE IF FIB[17]<BLEN THEN ACCESS~4; % COBOL68 38391060
END; 38391070
IF FIB[13].[23:1] AND ACCESS=0 THEN 38391080
BEGIN FIB[7]~P(DUP,LOD)-1; 38391090
ACCESS~4; 38391100
END; END; 38391110
IF NOT STATE.[41:1] THEN% 38392000
BEGIN IF ACCESS=1 THEN% 38393000
BEGIN 38394000
$ SET OMIT = NOT SHAREDISK 38394099
COOLOFF; 38394300
END ELSE% 38395000
IF ACCESS=0 THEN% 38396000
BEGIN COOLOFF; IF NOT STATE.[43:1] THEN% 38397000
IF FIB[17]<BLEN AND STATE.[46:2]!0 THEN% 38398000
BEGIN R:=SPACE(((BLEN+29) DIV 30)|30+1); 38399000
IF (M[R]~M[FIB[16]]~% 38400000
DISKADDRESS(MID,FID,FPB[FNUM+3],FIB[7]-1,HEADER,0)) NEQ 0 THEN % (SHM)38401000
BEGIN 38401100
P(WAITIO(FIB[16]&1[24:47:1]&R[33:33{15],% 38402000
0,U(,DEL);% 38403000
MOVE(FIB[17],R+BLEN-FIB[17]+1,% 38404000
FIB[16] INX BLEN-FIB[17]+1);% 38405000
P(WIATIO(FIB[16],0,U),DEL);% 38406000
IF NOT FIB[16].[24:1] THEN HEADER[4].[11:1]~1; 38406500
END; 38407000
FORGETSPACE(R);% 38408000
END;% 38409000
END ELSE% 38410000
BEGIN 38411000
$ SET OMIT = NOT SHAREDISK 38411009
COOLOFF; 38411030
IF (FIB[17]LSS BLEN AND STATE.[46:2]NEQ 0)OR ACCESS=4 THEN38411100
BEGIN IF ACCESS=4 THEN 38411200
IF FIB[13].[23:1] OR NOT STATE.[43:1] THEN 38411300
ACCESS:=2; 38411400
IF (M[FIB[16]]:=DISKADDRESS(MID,FID,FPB[FNUM+3], % (SHM)38411500
FIB[7],HEADER,0))=0 THEN ACCESS:=4; 38411600
IF ACCESS!4 THEN 38411700
BEGIN P(WAITIO(FIB[16]&0[24:24:1],0,U),DEL); 38411750
HEADER[4].[11:1]~1; END; 38411800
END; IF ACCESS = 4 THEN ACCESS := 2; 38411900
END;% 38412000