1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-01-13 15:17:03 +00:00

7841 lines
689 KiB
Plaintext

BEGIN 00000100
COMMENT MCP LISTING DIRECTORY 00001000
010000000 INDEPENDENT RUNNER FORWARD DECLARATION 00002000
020000000 FORWARD PROCEDURE DECLARATION 00003000
08000000 INITIAL VALUE TABLES 00004000
08000000 BCL TO EBCEDIC 00005000
08018000 EBCEDIC TO BCL 00006000
08084000 TRUTH SETS 00007000
08106000 POWER OF TEN TABLES 00007100
08247000 CONTROL CARD 00007200
09000000 STANDARD QUEUE DECLARATION 00008000
10000000 GLOBALS 00009000
10017000 INTERRUPT - EVENT HANDLING GLOBALS 00010000
10055000 TAG DEFINITION 00011000
10075000 CONTROL WORD LAYOUTS 00012000
10252000 REGISTERS DEFINITIONS 00013000
11000000 STORAGE ALLOCATION GLOBALS 00014000
12000000 INITIALIZE GLOBALS 00015000
13000000 INPUT - OUTPUT GLOBALS 00016000
13056500 VALUE ARRAYS - MCPID,KEYIN GLOSSARIES,ETC. 00016100
13276000 KEYIN - SPOUT GLOBALS 00017000
13318000 IOQUE QUEUE DECLARATION 00018000
13375000 WAITCHANNELQUE QUEUE DECLARATION 00019000
14000000 DISK MANAGEMENT 00020000
15000000 GETAREA - FORGET AREA GLOBALS 00021000
16000000 STANDARD INSERT 00022000
16016000 STANDARD DELINK 00023000
17000000 NAMEQUE QUEUE DECLARATION 00024000
17021000 BLOCKSOFAREAQUE QUEUE DECLARATION 00025000
17035000 KEYING QUEUE DECLARATION 00026000
18007000 FILE MANAGEMENT 00027000
19000000 REPLY MESSAGE 00028000
20000000 INDEPENDENT RUNNER GLOBALS 00029000
21140000 READYQ QUEUE DECLARATION 00030000
21263000 SHEETQ QUEUE DECLARATION 00031000
21357000 TERMINATEQ QUEUE DECLARATION 00032000
23000000 DIRECTORY MANAGEMENT 00034000
24000000 I/0 INTRINSIC DECLARATIONS 00034100
30000000 GETSPACE / FORGETSPACE 00035000
31000000 GETAREA / FORGETAREA 00036000
32000000 INITIALIZE 00037000
33000000 HARDWAREINTERRUPT 00038000
33167000 PRESENCEBIT 00039000
33538000 WHATDOIDO 00040000
33567000 EVENTHANDLER 00041000
33763000 SOFTWAREINTERRUPTDEC 00042000
33855000 HOLD 00043000
33890000 HOLDINITIALIZE 00044000
33961000 GETINDEPENDENTRUNNERSTACK 00045000
33960000 INDEPENDENTRUNNER 00046000
34051000 RUN 00047000
34086000 LOADFIXDIRSTACK 00048000
38000000 CONTROL CARD 00048600
40000000 INPUT - OUTPUT ROUNTINES 00049000
40005000 STARTIO 00050000
40037000 INITIATEIO 00051000
40075000 IOREQUEST 00052000
40089000 WAITIO 00053000
40131000 NEWIO 00054000
40154000 IOFINISH 00055000
40316000 STATUS 00056000
40565000 DISKIO 00057000
40597000 DISKWAIT 00058000
44022000 DISPLAY ROUTINES 00059000
44097000 KEYIN 00060000
44176000 SPOUT 00061000
50000000 ERROR ROUTINES 00062000
50000000 IOERROR 00063000
55000000 DISK MANAGEMENT 00064000
55018000 FORGETESPDISK 00066000
55039000 GETUSERDISK 00067000
55123000 FORGETUSERDISK 00068000
58000000 LIBRARY MAINTENANCE 00068900
59000000 PERIPHERALINITIALIZE 00069000
60000000 PROGRAM INTRINSICS 00070000
65000000 ARRAYDEC 00071000
65174000 BLOCKEXIT 00072000
65228000 GOTOSOLVER 00073000
70000000 PROGRAM INPUT- OUTPUT INTRINSICS 00074000
80000000 SELECTION - PROCESS HANDLING 00075000
80361000 INITIATE 00076000
80519000 SELECTION 00077000
80600000 TERMINATE 00077200
99000000 MONITOR 00078000
99970000 MCP OUTER BLOCK 00079000
; 00999999
COMMENT FOLLOWING ARE FORWARD DECLARATIONS FOR PROCEDURES CAPABLE OF 01000000
RUNNING AS INDEPENDENT RUNNERS. THE FORWARD DECLARATION FOR 01001000
A NEW INDEPENDENT RUNNER MUST APPEAR BEFORE THAT FOR STATUS IF 01001500
IT IS CAPAPABLE OF MULTIPLE REPRESENTATION. AN INDICATOR MAY. 01002000
BE ASSOCIATED WITH AN INDEPENDENT RUNNER (SEE CROSS FEFERENCE 01002500
FOR "TERMINATE" AND "TERMINATEINDICATOR" FOR HOW THIS IS 01003000
EFFECTED). THIS INDICATOR ISNOT NECESSARY TO THE 01003500
IMPLEMENTATION, HOWEVER IT IS NECESSARY IF INDEPENDENTRUNNER IS01004000
01004300
TO RECOGNISE THE NEW RUNNER AS A SPECIAL CASE 01004500
01004600
; 01005000
PROCEDURE CONTROLCARD (PARAMETER); 01006000
WORD PARAMETER; FORWARD; 01007100
PROCEDURE READALABEL(LINFO);VALUE LINFO;REAL LINFO;FORWARD; 01007105
PROCEDURE PURGIT(U);VALUE U;REAL U;FORWARD; 01007107
PROCEDURE DIRECTORYCOMPLEMENT(ROW); ARRAY ROW[*]; FORWARD; 01007200
PROCEDURE IRTEST(IND); INTEGER IND; FORWARD; 01008000
PROCEDURE INITIATE (DUMMY); REAL DUMMY; FORWARD; 01008200
PROCEDURE IOERROR(RD); REAL RD; FORWARD; 01008500
01009000
PROCEDURE STATUS (COUNT); INTEGER COUNT; FORWARD; 01009100
PROCEDURE KEYIN(COUNT); REAL COUNT; FORWARD; 01009110
PROCEDURE CONNSOUL(COUNT); REAL COUNT; FORWARD;% 01010000
PROCEDURE TERMINATE (PARAMETER); REAL PARAMETER ; FORWARD; 01011000
COMMENT: FOR THOSE OF YOU WHO DON"T KNOW SO, TERMINATE MUST BE THE 01011100
LAST INDEPENDENTRUNNER DECLARED IN THIS FORWARD LIST. 01011200
ONE WRITES "FORK(<PROCEDURE ID>, <PARAMETER>)" TO START ONE OF 01011300
THESE GUYS UP; 01011400
PROCEDURE WHATDOIDO; FORWARD; 02000000
PROCEDURE INDEPENDENTRUNNER(INDEX,PAR);VALUE INDEX,PAR;REAL INDEX; 02001000
WORD PAR; FORWARD; 02002000
PROCEDURE LOADFIXEDIRSTACK(STACKNO);VALUE STACKNO;INTEGER STACKNO; 02003000
FORWARD; 02004000
SAVE INTEGER PROCEDURE TRACE = (0,19) ( TRACTER ) ; 02005000
VALUE TRACTER; INTEGER TRACTER; FORWARD; 02006000
SAVE REAL PROCEDURE GETSPACE (SIZE, WHOFOR, TYPE, ADDRESS); 02007000
VALUE SIZE, WHOFOR, TYPE, ADDRESS; 02008000
INTEGER SIZE, WHOFOR, TYPE; 02009000
REAL ADDRESS; FORWARD; 02010000
SAVE INTEGER PROCEDURE FORGETSPACE (ADDRESS); 02011000
VALUE ADDRESS; INTEGER ADDRESS; FORWARD; 02012000
SAVE PROCEDURE OVERLAY (ADDRESS); VALUE ADDRESS;INTEGER ADDRESS;FORWARD;02013000
REAL PROCEDURE DIRECTORYSEARCH(POINT, CODE, LLOCK); 02016100
VALUE POINT, CODE, LLOCK; 02016200
POINTER POINT; 02016300
REAL CODE; 02016400
BOOLEAN LLOCK; FORWARD; 02016500
SAVE PROCEDURE IOFINISH(MPXINDEX); VALUE MPXINDEX; 02017000
INTEGER MPXINDEX; FORWARD; 02018000
PROCEDURE FINISHOFFIO(IOCB); VALUE IOCB; REFERENCE IOCB; FORWARD;02019000
PROCEDURE FINISHOFFIO(IOCB); VALUE IOCB; REFERENCE IOCB; ; COMMENT * * ;02020000
SAVE 02020998
PROCEDURE SPOUT(IOCB,U);VALUE IOCB,U;REAL U;REFERENCE IOCB;FORWARD; 02021000
PROCEDURE MESSER(W,INFO);VALUE W,INFO;REAL W;WORD INFO;FORWARD;% 02021100
PROCEDURE MIXPRINT(BUF);ARRAY BUF[*]; FORWARD;% 02022000
BOOLEAN PROCEDURE JULIT(P);POINTER P; FORWARD; 02022300
PROCEDURE DATIT(P); POINTER P; FORWARD;% 02022400
REAL PROCEDURE CURRENTTIME; FORWARD; 02022500
PROCEDURE CHANLOUT(I,BUFF);VALUE I;REAL I;ARRAY BUFF[*];FORWARD; 02022600
SAVE PROCEDURE CONNQUEST(UNIT); VALUE UNIT; REAL UNIT; FORWARD; 02023000
SAVE PROCEDURE UNEXPIOERROR(IOCB,IOERRORMASK); 02024000
VALUE IOCB,IOERRORMASK; 02025000
REFERENCE IOCB; 02026000
REAL IOERRORMASK; ; COMMENT * * * * * * * * ** ; 02027000
SAVE REAL PROCEDURE WAITIO(AREA, USER, IOMASK); 02030000
VALUE USER, IOMASK; 02031000
ARRAY AREA[*]; 02032000
REAL USER, IOMASK; 02033000
FORWARD; 02034000
SAVE PROCEDURE IOREQUEST(IOCB);VALUE IOCB;REFERENCE IOCB;FORWARD; 02034100
SAVE REFERENCE PROCEDURE DISKIO(CORE,INDEX,SIZE,DISK,MASK,DISKIOEVNT); 02035000
VALUE INDEX,SIZE,DISK,MASK; 02036000
INTEGER INDEX,SIZE,DISK,MASK; 02037000
ARRAY CORE [*]; 02038000
EVENT DISKIOEVNT ; FORWARD; 02039000
SAVE PROCEDURE DISKWAIT(CORE,INDEX,SIZE,DISK,MASK); 02040000
VALUE INDEX,SIZE,DISK,MASK; 02041000
INTEGER INDEX,SIZE,DISK,MASK; 02042000
ARRAY CORE[*]; 02043000
FORWARD; 02044000
PROCEDURE HARDWAREINTERRUPT(P1,P2); VALUE P1,P2; 02045000
INTEGER P1; WORD P2; FORWARD; 02046000
WORD HARDWAREINTERRUPTPCW = HARDWAREINTERRUPT; 02046100
WORD D03 = (0, 3); 02046200
SAVE PROCEDURE HOLDINITIALISE; FORWARD; 02047000
SAVE PROCEDURE PERIPHERALINITIALIZE; FORWARD; 02048000
REAL MCPDISKBASE = PERIPHERALINITIALIZE; COMMENT ADDRESS OF MCP DISK; 02049000
SAVE PROCEDURE INITIALIZE(P1, P2); 02050000
VALUE P1; 02051000
INTEGER P1; 02052000
WORD P2; FORWARD; 02053000
REAL MAXCHANNELS = INITIALIZE; COMMENT THE NUMBER OF MULTIPLEXORS; 02054000
BOOLEAN MAXMPX = MAXCHANNELS; 02055000
WORD INITIALIZEPCW = INITIALIZE; 02055100
SAVE INTEGER PROCEDURE GETAREA(SIZE); VALUE SIZE; INTEGER SIZE; FORWARD;02057000
SAVE PROCEDURE FORGETAREA(SIZE,ADDRESS); VALUE SIZE,ADDRESS; 02058000
INTEGER SIZE,ADDRESS; FORWARD; 02059000
PROCEDURE UPDATEUNITBITSTABLE(TABLENAME,U); VALUE U; 02060000
INTEGER U; 02061000
BOOLEAN ARRAY TABLENAME[*]; FORWARD; 02062000
PROCEDURE EVENTHANDLER = (0,15) (THEEVENT,EVENTWORD1,WAITFLAG); 02063000
VALUE EVENTWORD1,WAITFLAG; 02064000
WORD THEEVENT,EVENTWORD1; 02065000
BOOLEAN WAITFLAG; FORWARD; 02066000
WORD PROCEDURE SOFTWAREINTERRUPTDEC = (0,14) (THEEVENT,EVENTWORD1, 02067000
EVENTWORD2,KLUDGE,PCWPOINTER); 02068000
VALUE EVENTWORD1,EVENTWORD2,PCWPOINTER,KLUDGE; 02069000
WORD THEEVENT,EVENTWORD1,EVENTWORD2,PCWPOINTER,KLUDGE; 02070000
FORWARD; 02071000
DEFINE INTERLOCK = EVENT # 02071100
, PROCURE(LOCK) = GAOLER(LOCK, FALSE) # 02071200
, LIBERATE(LOCK) = GAOLER(LOCK, TRUE) # 02071300
; 02071400
PROCEDURE GAOLER = (0,18) (E,U); VALUE U; EVENT E; BOOLEAN U; FORWARD; 02071500
SAVE WORD PROCEDURE DOPEVECTOR(MOM); 02072000
VALUE MOM; 02073000
WORD MOM; FORWARD; 02074000
SAVE PROCEDURE ARRAYDEC =(0,7) (NOOFDIMS,NOOFARRAYS,TYPE); 02075000
VALUE NOOFDIMS,NOOFARRAYS,TYPE; 02076000
INTEGER NOOFDIMS,NOOFARRAYS,TYPE; FORWARD; 02077000
SAVE PROCEDURE DUMMYFORCUTTINGSTACK; ; 02077100
WORD DUMMYFORCUTTINGSTACKPCW=DUMMYFORCUTTINGSTACK; 02077200
SAVE WORD PROCEDURE SIM1TOR(A,V); VALUE A, V; REAL A; WORD V; 02078000
BEGIN 02079000
INTEGER T; 02080000
T ~REGISTERS [63]; 02081000
SIM1TOR ~ V; 02082000
END; 02083000
SAVE PROCEDURE MEMDUMP = (0,20) (I,J);VALUE I,J;REAL I,J;FORWARD; 02083100
WORD PROCEDURE JACKMONITOR (A, V); VALUE A, V; REAL A; WORD V; 02084000
FORWARD; 02085000
WORD PROCEDURE RAJMONITOR (A, V); VALUE A, V; REAL A; WORD V; 02086000
FORWARD; 02087000
WORD PROCEDURE BOBMONITOR (A, V); VALUE A, V; REAL A; WORD V; 02088000
FORWARD; 02089000
WORD PROCEDURE DONMONITOR (A, V); VALUE A, V; REAL A; WORD V; FORWARD; 02090000
WORD PROCEDURE STEVEMONITOR(A,V);VALUE A,V;REAL A;WORD V; FORWARD; 02090100
WORD PROCEDURE MIKEMONITOR(A,V); VALUE A,V; REAL A; WORD V; FORWARD; 02090200
REAL PROCEDURE GETUSERDISK(SEGMENTS, SPEED); 02091000
VALUE SEGMENTS, SPEED; 02092000
REAL SEGMENTS, SPEED; FORWARD; 02093000
PROCEDURE FORGETUSERDISK(DKADDR, SEGMENTS); 02094000
VALUE DKADDR, SEGMENTS; 02095000
REAL DKADDR, SEGMENTS; FORWARD; 02095500
REAL PROCEDURE NOUSERDISK(SEGMENTS, SPEED); 02095600
VALUE SEGMENTS, SPEED; 02095700
REAL SEGMENTS, SPEED; FORWARD; 02095800
SAVE PROCEDURE BLOCKEXIT = (0,10); FORWARD; 02096000
PROCEDURE FORGETDOPEVECTORS(DD); WORD ARRAY DD[*]; FORWARD; 02097000
SAVE PROCEDURE MOMTOVECTOR (MOM, VECTOR, INDEX); 02098000
VALUE COMMENT A COPY OR MOM DESCRIPTOR THAT IS AC- 02098100
CEPTABLE TO PRESENCE BIT; 02098200
COMMENT AN-UNINDEXED DESCRIPTOR THAT IS AC- 02099000
CEPTABLE TO AN NXLN OPERATOR; 02099100
INDEX; COMMENT THE INDEX FOR VECTOR WHERE MOM IS TO 02100000
BE PLACED; 02100100
WORD ARRAY MOM[*], 02100200
VECTOR[*]; 02100300
INTEGER INDEX; FORWARD; 02100400
SAVE REFERENCE PROCEDURE ALLOCATEMAMEQ; FORWARD; 02101000
SAVE BOOLEAN PROCEDURE TURNOVERLAYKEY (ADDRESSOFMOM); 02102000
VALUE ADDRESSOFMOM; 02103000
INTEGER ADDRESSOFMOM; FORWARD; 02104000
SAVE PROCEDURE MAKEPRESENTANDSAVE (DATA); 02104100
WORD ARRAY DATA [*]; FORWARD; 02104200
PROCEDURE LIBMAIN(MFID);VALUE MFID;POINTER MFID;FORWARD; 02105000
SAVE INTEGER PROCEDURE CONSOLIDATEANDORDER(ADDRESS); 02109000
VALUE ADDRESS; 02110000
INTEGER ADDRESS; FORWARD; 02111000
PROCEDURE OPEN=(0,31)(FIB,TYPEV);VALUE TYPEV;ARRAY FIB[*];REAL TYPEV; 02111100
FORWARD; 02111200
PROCEDURE GOTOSOLVER = (0,11) (SIRW); VALUE SIRW; REAL SIRW; FORWARD; 02112000
REAL PROCEDURE FINDINPUT(LEB,CODE);VALUE CODE;INTEGER CODE;ARRAY LEB[*];02112010
FORWARD; 02112020
SAVE 02113000
WORD PROCEDURE MON1TOR (A, V); VALUE A, V; REAL A; WORD V; FORWARD; 02114000
INTEGER PROCEDURE VECTORINSERT(READYINDICATOR,NEWENTRY); 02115000
VALUE READYINDICATOR 02116000
, NEWENTRY 02117000
; 02118000
REAL READYINDICATOR 02119000
; 02120000
WORD NEWENTRY 02121000
; FORWARD; 02122000
PROCEDURE STACKQREARRANGE(READYINDICATOR) ; 02123000
VALUE READYINDICATOR 02124000
; 02125000
BOOLEAN READYINDICATOR 02126000
; FORWARD; 02127000
PROCEDURE STACKQREMOVE (PATH,STACKINDICATOR); 02128000
VALUE PATH 02129000
, STACKINDICATOR 02130000
; 02131000
REAL PATH 02132000
; 02133000
INTEGER STACKINDICATOR 02134000
; FORWARD; 02135000
PROCEDURE INSERTINQUEUE (PATH,STACKINDICATOR); 02136000
VALUE PATH 02137000
, STACKINDICATOR 02138000
; 02139000
REAL PATH 02140000
, STACKINDICATOR 02141000
; FORWARD; 02142000
INTEGER PROCEDURE GETINDEPENDENTRUNNERSTACK(STAKADRES);REAL STAKADRES; 02143000
FORWARD; 02144000
02145000
02146000
PROCEDURE NEXTPROCESS; FORWARD; 02147000
INTEGER PROCEDURE NEXTINSCHEDULE; FORWARD; 02148000
02149000
02150000
02151000
PROCEDURE SELECTION; FORWARD; 02152000
PROCEDURE RUN (PARAMETER,PROCEEDURE); 02153000
VALUE PARAMETER 02154000
; 02155000
WORD PARAMETER 02156000
; 02157000
PROCEDURE PROCEEDURE 02158000
; FORWARD; 02159000
WORD RUNPCW = RUN; COMMENT USED BY INDEPENDENTRUNNER MECHANISM; 02160000
PROCEDURE STANDARDINSERT(FIRSTENTRY,LASTENTRY,ENTRY); 02161000
VALUE ENTRY; 02162000
REFERENCE FIRSTENTRY,LASTENTRY,ENTRY; FORWARD; 02163000
PROCEDURE STANDARDDELINK(FIRSTENTRY,LASTENTRY,ENTRY); 02164000
VALUE ENTRY; 02165000
REFERENCE FIRSTENTRY,LASTENTRY,ENTRY; FORWARD; 02166000
SAVE PROCEDURE QUEUEMYSTACK (AUTHORITY, REQUIRED, COUNT, MYEVENT, HEAD);02167000
VALUE AUTHORITY, COMMENT THE SORTKEY FOR THIS QUEUE; 02168000
REQUIRED, COMMENT AN ADDITIONAL INFORMATION WORD FOR THE 02169000
QUEUE ENTRY; 02170000
COUNT; COMMENT A 10 BIT COUNTER IN THE STACK LINK 02171000
WORD FOR THIS QUEUE; 02172000
EVENT MYEVENT; COMMENT THE LOCAL EVENT MY STACK IS TO WAIT ON;02172500
INTEGER COUNT; 02172550
REAL AUTHORITY, 02172600
REQUIRED, 02172700
HEAD ; COMMENT A GLOBAL REAL THAT CONTAINS THE BACK- 02173000
WARD AND FORWARD LINKS FOR THE QUEUE. THE BACK 02174000
WARD LINK POINTS TO THE ENTRY WITH THE HIGHEST 02175000
AUTHORITY; FORWARD; 02176000
PROCEDURE DELINKASTACK (WHOSE, HEAD); 02177000
VALUE WHOSE; 02178000
INTEGER WHOSE; COMMENT THE AUTHORITY TYPE STACK TO DELINK; 02179000
REAL HEAD ; COMMENT THE HEAD OF THE AUTHORITY TYPE STACK; 02180000
FORWARD; 02181000
PROCEDURE PARAMETERINSERT (FIRSTPARAM, LASTPARAM, ENTRY); 02182000
VALUE ENTRY; 02183000
REFERENCE FIRSTPARAM, LASTPARAM, ENTRY; FORWARD; 02184000
BOOLEAN SIMULATING = (0,12); % TRUE FOR SIMULATOR RUN 02560000
VALUE ARRAY BCLTOEBC = (0,33) ~ ( 08000000
4"F0F1F2F3" 08001000
, 4"F4F5F6F7" 08002000
, 4"F8F97B7C" 08003000
, 4"6F7A6E69" 08004000
, 4"4EC1C2C3" 08005000
, 4"C4C5C6C7" 08006000
, 4"C8C94B70" 08007000
, 4"504D4C48" 08008000
, 4"00D1D2D3" 08009000
, 4"D4D5D6D7" 08010000
, 4"D8D95B5C" 08011000
, 4"605D5E49" 08012000
, 4"4061E2E3" 08013000
, 4"E4E5E6E7" 08014000
, 4"E8E96B6C" 08015000
, 4"597E6A7F" 08016000
); 08017000
VALUE ARRAY EBCTOBCL = (0,34) ~ ( 08018000
4"0C0C0C0C" 08019000
, 4"0C0C0C0C" 08020000
, 4"0C0C0C0C" 08021000
, 4"0C0C0C0C" 08022000
, 4"0C0C0C0C" 08023000
, 4"0C0C0C0C" 08024000
, 4"0C0C0C0C" 08025000
, 4"0C0C0C0C" 08026000
, 4"0C0C0C0C" 08027000
, 4"0C0C0C0C" 08028000
, 4"0C0C0C0C" 08029000
, 4"0C0C0C0C" 08030000
, 4"0C0C0C0C" 08031000
, 4"0C0C0C0C" 08032000
, 4"0C0C0C0C" 08033000
, 4"0C0C0C0C" 08034000
, 4"300C0C0C" 08035000
, 4"0C0C0C0C" 08036000
, 4"1F2F0C1A" 08037000
, 4"1E1D100C" 08038000
, 4"1C0C0C0C" 08039000
, 4"0C0C0C0C" 08040000
, 4"0C3C0C2A" 08041000
, 4"2B202E0C" 08042000
, 4"2C310C0C" 08043000
, 4"0C0C0C0C" 08044000
, 4"0C0F3E3A" 08045000
, 4"3B0C0E0C" 08046000
, 4"1B0C0C0C" 08047000
, 4"0C0C0C0C" 08048000
, 4"0C0C0D0A" 08049000
, 4"0B0C3D3F" 08050000
, 4"0C0C0C0C" 08051000
, 4"0C0C0C0C" 08052000
, 4"0C0C0C0C" 08053000
, 4"0C0C0C0C" 08054000
, 4"0C0C0C0C" 08055000
, 4"0C0C0C0C" 08056000
, 4"0C0C0C0C" 08057000
, 4"0C0C0C0C" 08058000
, 4"0C0C0C0C" 08059000
, 4"0C0C0C0C" 08060000
, 4"0C0C0C0C" 08061000
, 4"0C0C0C0C" 08062000
, 4"0C0C0C0C" 08063000
, 4"0C0C0C0C" 08064000
, 4"0C0C0C0C" 08065000
, 4"0C0C0C0C" 08066000
, 4"0C111213" 08067000
, 4"14151617" 08068000
, 4"18190C0C" 08069000
, 4"0C0C0C0C" 08070000
, 4"0C212223" 08071000
, 4"24252627" 08072000
, 4"28290C0C" 08073000
, 4"0C0C0C0C" 08074000
, 4"0C0C3233" 08075000
, 4"34353637" 08076000
, 4"38390C0C" 08077000
, 4"0C0C0C0C" 08078000
, 4"00010203" 08079000
, 4"04050607" 08080000
, 4"08090C0C" 08081000
, 4"0C0C0C0C" 08082000
); 08083000
SAVE VALUE ARRAY FOURBITSTUFF = (0,39) ~ ( 08083100
4"00010203", 4"04050607", 4"08091112", 4"13141516", 08083200
8"0123", 8"4567", 8"89AB", 8"CDEF" ); 08083300
DEFINE HEXTOBCL = FOURBITSTUFF[0]#, 08083400
HEXTOEBC = FOURBITSTUFF[4]#; 08083500
VALUE ARRAY TRUTHSETS = (0,38) ~ ( 08084000
6(0) % EBCDIC ALPHA-NUMERIC 08085000
, 4"7FC07FC0" % EBCDIC ALPHA-NUMERIC 08086000
, 4"3FC0FFC0" % EBCDIC ALPHA-NUMERIC 08087000
, 6(0) % EBCDIC ALPHABETIC 08088000
, 4"7FC07FC0" % EBCDIC ALPHABETIC 08089000
, 4"3FC00000" % EBCDIC ALPHABETIC 08090000
, 7(0) % EBCDIC NUMERIC 08091000
, 4"0000FFC0" % EBCDIC NUMERIC 08092000
, 4"FFC07FC0" % BCL ALPHA NUMERIC 08093000
, 4"7FC03FC0" % BCL ALPHA NUMERIC 08094000
, 4"00007FC0" % BCL ALPHABETIC 08095000
, 4"7FC03FC0" % BCL ALPHABETIC 08096000
, 4"FFC00000" % BCL NUMERIC 08097000
, 0 % BCL NUMERIC 08098000
, 2(0) % EBCDIC SPECIAL CHARACTERS 08098100
, 4"803F803F" % EBCDIC SPECIAL CHARACTERS 08098200
, 4"C03F007F" % EBCDIC SPECIAL CHARACTERS 08098300
, 0 % EBCDIC SPECIAL CHARACTERS 08098400
, 4"40000000" % EBCDIC SPECIAL CHARACTERS 08098500
, 4"80008000" % EBCDIC SPECIAL CHARACTERS 08098600
, 4"C0000000" % EBCDIC SPECIAL CHARACTERS 08098700
); 08099000
DEFINE EBCDICALPHANUMERIC = TRUTHSETS[00] #, 08100000
EBCDICALPHABETIC = TRUTHSETS[08] #, 08101000
EBCDICNUMERIC = TRUTHSETS[16] #, 08102000
BCLALPHANUMERIC = TRUTHSETS[24] #, 08103000
BCLALPHABETIC = TRUTHSETS[26] #, 08104000
BCLNUMERIC = TRUTHSETS[28]#, 08105000
EBCDICSPECIALS = TRUTHSETS[30]#, 08105100
ENDTRUTHSETS=0#;% 08105990
COMMENT THESE ARE THE 6500 POWERS OF TEN TABLES. 08106000
10*I=POTL[I.[05:06]]|POTM[I.[11:06])|POTH[I.[14:03]]. 08106500
THE VALUES ARE ALL DOUBLE PRECISION AND ARE ALL --TRUNCATED--. THE 08107000
FLAG-BIT OF THE MOST-SIGNIFICANT WORD IS THE FIRST BIT DROPPED 08107500
(FIRST BIT AFTER THE PERCENT). ALL VALUES WERE CALCULATED TO FULL 08108000
SIGNIFICANCE (I.E., AS INTEGERS), THEN CHOPPED TO 78 BITS.; 08108500
08109000
DOUBLE VALUE ARRAY POTL 08109500
08110000
~(3"1141000000000000",3"0000000000000000", % =@0000008110500
3"1131200000000000",3"0000000000000000", % =@0000108111000
3"1121440000000000",3"0000000000000000", % =@0000208111500
3"1111750000000000",3"0000000000000000", % =@0000308112000
3"1102342000000000",3"0000000000000000", % =@0000408112500
3"1073032400000000",3"0000000000000000", % =@0000508113000
3"1063641100000000",3"0000000000000000", % =@0000608113500
3"1054611320000000",3"0000000000000000", % =@0000708114000
3"1045753604000000",3"0000000000000000", % =@0000808114500
3"1037346545000000",3"0000000000000000", % =@0000908115000
3"1011124027620000",3"0000000000000000", % =@0001008115500
3"0001351035564000",3"0000000000000000", % =@0001108116000
3"0011643245121000",3"0000000000000000", % =@0001208116500
3"0022214116345200",3"0000000000000000", % =@0001308117000
3"0032657142036440",3"0000000000000000", % =@0001408117500
3"0043432772446150",3"0000000000000000", % =@0001308118000
3"0054341571157602",3"0000000000000000", % =@0001608118500
3"0065432127413542",3"0004000000000000", % =@0001708119000
3"0076740555316473",3"0001000000000000", % =@0001808119500
3"0111053071060221",3"0001720000000000", % =@0001908120000
3"0121265707274265",3"0004304000000000", % =@0002008120500
3"0131543271153342",3"0007365000000000", % =@0002108121000
3"0142074147406233",3"0005262200000000", % =@0002208121500
3"0152513201307702",3"0004536640000000", % =@0002308122000
3"0163236041571663",3"0001666410000000", %0 =@0002408122500
3"0174105452130240",3"0000244112000000", %00 =@0002508123000
3"0205126764556310",3"0000315134400000", %000 =@0002608123500
3"0216354561711772",3"0000400363500000", %0000 =@0002708124000
3"0231004771627437",3"0000450046042000", %000000 =@0002808124500
3"0241206170175346",3"0006562057453400", %0000000 =@0002908125000
3"0251447626234640",3"0004316473365100", %00000000 =@0003008125500
3"0261761573704010",3"0005402212262320", %000000000 =@0003108126000
3"0272356132665012",3"0006702654737004", %0000000000 =@0003208126500
3"0303051561442215",3"0004463430126605", %00000000000 =@0003308127000
3"0313664115752660",3"0007600336154346", %200000000000 =@0003408127500
3"4324641141345435",3"0001540425607437", %6400000000000 =@0003508128000
3"4336011371636744",3"0004070533151347", %6100000000000 =@0003608128500
3"4347413670206535",3"0005106662003641", %5520000000000 =@0003708129000
3"0361131664625026",3"0005033043640461", %2104400000000 =@0003808129500
3"4371360241772234",3"0002241654610575", %4525500000000 =@0003908130000
3"4401654312370703",3"0002712227752734", %7653020000000 =@0004008130500
3"0412227375067064",3"0001474675745524", %1625624000000 =@0004108131000
3"0422675274304701",3"0002014055337051", %2173171000000 =@0004208131500
3"4433454553366061",3"0004417070626663", %4632027200000 =@0004308132000
3"4444367706263475",3"0007522706774440", %4000435040000 =@0004408132500
3"4455465667740415",3"0003347470573550", %5000544250000 =@0004508133000
3"4467003245730520",3"0006361406732502", %6200675322000 =@0004608133500
3"0501060411731664",3"0005005571052122", %3364105460640 =@0004708134000
3"0511274514320241",3"0006207127264547", %0261126775010 =@0004808134500
3"4521553637404312",3"0001650755141700", %6335354574212 =@0004908135000
3"0532106607305374",3"0006223150372261", %0024647733254 =@0005008135500
3"0542530351166673",3"0007670002470735", %2032021722127 =@0005108136000
3"4553256443424452",3"0007646003207124", %4440426306555 =@0005208136500
3"4564132154331565",3"0005617404050751", %5550533770310 =@0005308137000
3"0575160607420123",3"0001163305063144", %1102662766373 =@0005408137500
3"0606414751324147",3"0007420166277775", %1323437564071 =@0005508138000
3"4621012014361120",3"0001732422375777", %4361034752111 =@0005608138500
3"0631214417455344",3"0002321127075377", %3455244144533 =@0005708139000
3"0641457523370635",3"0003005354714677", %2370515175662 =@0005808139500
3"0651773450267004",3"0005606650100057", %1066640435236 =@0005908140000
3"4662372362344605",3"0007150422120072", %7304410544506 =@0006008140500
3"4673071057035747",3"0003002526544111", %5165512675627 =@0006108141000
3"0703707272645341",3"0001603254275134", %0423035455175 =@0006208141500
3"0714671151416631",3"0004144127354363");%0527644770435 =@0006308142000
DOUBLE VALUE ARRAY POTM 08142500
08143000
~(3"1141000000000000",3"0000000000000000", % =@0000008143500
3"4726047403722377",3"0007175154247457", %6655616166544 =@0006408144000
3"4014473510762300",3"0023514315770633", %6315541553040 =@0012808144500
3"0103403417361516",3"0032235253250267", %3704517643661 =@0019208145000
3"0172523756577347",3"0043747364335667", %3440156307756 =@0025608145500
3"0262014102745174",3"0055463433536324", %1053014006506 =@0032008146000
3"0351423057061025",3"0066761250270402", %3777752636047 =@0038408146500
3"4441125722256075",3"0073757717235176", %5234420343164 =@0044808147000
3"0527061464053523",3"0100164434331431", %2561245705013 =@0051208147500
3"4615310177342265",3"0115474537630672", %7473770141554 =@0057608148000
3"0704060636744362",3"0125124721622671", %1262127057024 =@0064008148500
3"4773070652155207",3"0137074016271665", %5207710607022 =@0070408149000
3"4062271771625063",3"0152002464306621", %5177450026246 =@0076808149500
3"0151627122640561",3"0165346774161061", %0506313263060 =@0083208150000
3"4241272171262634",3"0173653557514160", %5215416216354 =@0089608150500
3"0331022323162501",3"0205135477216203", %1245320571711 =@0096008151000
3"0416227316541500",3"0215650301354503", %2364507430552 =@0102408151500
3"0504620511515514",3"0225724603203653", %0555750424133 =@0108808152000
3"0573504063603007",3"0230356777015603", %0655471421103 =@0115208152500
3"0662605010657142",3"0245363441540115", %3421137501315 =@0121608153000
3"0752061310601672",3"0257025566260413", %3631527002756 =@0128008153500
3"0041457313355310",3"0276331702015753", %3773670162764 =@0134408154000
3"4131153323315222",3"0306736070051361", %5040437573377 =@0140808154500
3"4217264213744524",3"0311675660467444", %4154541753113 =@0147208155000
3"4305453406516634",3"0326235176210225", %7260732301656 =@0153608155500
3"0374174156441746",3"0333645413752311", %0303470002531 =@0160008156000
3"4463162072241271",3"0341737734347416", %7422224407341 =@0166408156500
3"0552345400577533",3"0356011231622714", %1525032050036 =@0172808157000
3"0641670156730222",3"0362225342141324", %0160746354415 =@0179208157500
3"4731323261527331",3"0372522515457463", %6343655705733 =@0185608158000
3"4021045371360351",3"0413414001145703", %5702156731116 =@0192008158500
3"4106413245605716",3"0426047563137443", %5242020310123 =@0198408159000
3"0174750547327342",3"0434752736224723", %2243161451531 =@0204808159500
3"4263606774750311",3"0446764211226705", %4547637466166 =@0211208160000
3"4352667652055261",3"0454023267541401", %7377467717610 =@0217608160500
3"4442127774503364",3"0463742052221706", %4122154367526 =@0224008161000
3"0531514561003110",3"0471751001571765", %0310004020172 =@0230408161500
3"4621201540275231",3"0506473330776521", %5366506221123 =@0236808162000
3"0707473511634104",3"0517004116002775", %1152751023607 =@0243208162500
3"4775622261444010",3"0521205705141406", %7655434075660 =@0249608163000
3"4064312252460020",3"0542417412313577", %5502311046401 =@0256008163500
3"0153255351072377",3"0556751574341722", %1215026472552 =@0262408164000
3"4242422450716472",3"0565704017717023", %6360057144043 =@0268808164500
3"4331732353517622",3"0577535625522740", %5134162537656 =@0275208165000
3"0421355270251523",3"0603662737142310", %0207247354427 =@0281608165500
3"0511071176733572",3"0613704412666424", %2133176163115 =@0288008166000
3"0576603323156425",3"0623433740626150", %0550153112134 =@0294408166500
3"0665103732441040",3"0630015131727227", %3211033421651 =@0300808167000
3"0753714225644566",3"0641055324257642", %0430466411545 =@0307208167500
3"4042754362757206",3"0667221753325314", %7312430336457 =@0313608168000
3"4132177767210373",3"0670275217323337", %7025527435203 =@0320008168500
3"0221553062356341",3"0707214653450062", %3447603463570 =@0326408169000
3"0311230607367652",3"0716463771052416", %1546004325010 =@0332808169500
3"0377707704136465",3"0723164760756106", %3250540305734 =@0339208170000
3"4465774701726534",3"0732463541673204", %4732427535727 =@0345608170500
3"0554433204752653",3"0746747152676716", %3707123370534 =@0352008171000
3"0643352734424257",3"0756237637571265", %2043073016410 =@0358408171500
3"0732501217041756",3"0762617070716002", %2726527630323 =@0364808172000
3"0021775736715436",3"1005415273205562", %1025012750314 =@0371208172500
3"4111410235752271",3"1011076017302041", %6734200515373 =@0377608173000
3"0201115560167157",3"1025614475554304", %3513554047640 =@0384008173500
3"4266777643636764",3"1030310431025755", %4146654653371 =@0390408174000
3"0355242335310112",3"1046512350074012", %0066765167472 =@0396808174500
3"4444024052516417",3"1051111675276213");%4500576335227 =@0403208175000
DOUBLE VALUE ARRAY POTH 08175500
08176000
~(3"1141000000000000",3"0000000000000000", % =@0000008176500
3"4533043005100212",3"1064202274654451", %4052376002244 =@0409608177000
3"4431132435035057",3"2157536204320307", %6050444301372 =@0819208177500
3"0323470676540576",3"3242655607106551", %3574104722476 =@1228808178000
3"0221305102507076",3"4331314016653042", %3341046467066 =@1638408178500
3"4114177702444352",3"5423212615565017", %4553563624050 =@2048008179000
3"4011502433123006",3"6513114751647704", %4507464541024 =@2457608179500
3"4705000563145240",3"7575774067453713");%5601112567747 =@2867208180000
08180500
COMMENT SKELETON PARAMETER QUEUE ENTRIES FOR COMPILER 08247000
FILES.; 08248000
SAVE ARRAY COMPILERCODEFILE ~ ( 08249000
4"000003000008", 4"010104C3D6C4C500"), 08250000
COMPILERCARDFILE ~ ( 08251000
4"000003000008", 4"010104C3C1D9C400"), 08252000
COMPILERCARDEXTERNAL ~ ( 08253000
4"000005000015", 4"010112000000", 0, 0, 0); 08254000
QUEUE STANDARDQUEUE (PREVIOUSSTANDARD, NEXTSTANDARD); 09000000
VALUE PREVIOUSSTANDARD, NEXTSTANDARD; 09001000
REFERENCE PREVIOUSSTANDARD, NEXTSTANDARD; 09002000
COMMENT STANDARDQUEUE EXISTS ONLY TO ESTABLISH THE LOCATION OF ITS09003000
ITEMS FOR USE BY QUEUEING ALGORITHMS THAT DEAL WITH QUEUES09004000
THAT ARE ORDERED ON A FIRST IN - FIRST OUT BASIS.; 09005000
USING LOCKED; 09006000
INTEGER PBLOK %PRESENCE BIT LOCK 10000000
, GROSSLOK % LOCK ON INTERRUPTS 10001000
, PROCESSCHANGELOCK 10002000
; 10003000
DEFINE SETOVERFLOWFF = ; # 10004000
; 10005000
REAL MULTIPLEREFERENCELOK %FOR PRESENCE BIT 10006000
; 10007000
REAL MONITORLOCK; % MONITOR 10008000
REAL MONITORVALUE = (0,8), 10009000
MONITORMASK = (0,9); 10010000
FIELD MONMASKF = 19:10, MONVALF =9:10; 10011000
DEFINE JACKBIT =2# 10012000
,RAJBIT =4# 10013000
,DONBIT = 8# 10014000
,BOBBIT =16# 10015000
,STEVEBIT = 32# 10015100
,MIKEBIT = 64# 10015200
,GLOBALSTOP = STOP (PDR, PIR)# 10015990
; 10016000
COMMENT THE FOLLOWING DEFINES SPECIFY VALUES OF 10017000
PARAMETERS TO PROCEDURES SUCH AS KILLME, 10018000
NOTYETCODED AND ARITHMETICFAULT 10019000
; 10020000
DEFINE DZ = 1# )"DIVIDE BY ZERO "(10021000
EO = 2# )"EXPONENT OVERFLOW "(10022000
EU = 3# )"EXPONENT UNDERFLOW "(10023000
II = 4# )"INVALID INDEX "(10024000
IO = 5# )"INTEGER OVERFLOW "(10025000
GCAINTERRUPT = 6# )"FIRST UNASSIGNED MPX INT"(10026000
STACKOVER = 7# )"STACK OVERFLOW "(10027000
SYLLABLEDEPENDENT2 = 8# )"COMPROMISED SYLLABLE DEP"(10028000
BLOWUP = 9# )"BASE FOR ALARM INTERRUPT"(10029000
LOOP = 10# )" "(10030000
MEMPARITY = 11# )" "(10031000
MPXPARITY = 12# )" "(10032000
INVALIDADDRESS = 13# )" "(10033000
STACKUNDER = 14# )"STACK UNDERFLOW "(10034000
INVALIDOPCODE = 15# )"CODE NOT VALID OPERATOR "(10035000
MEMPROTECT = 16# )" "(10036000
INVALIDOP = 17# )"OPERATION ILLEGAL "(10037000
SEQERROR = 18# )"SEQUENCE ERROR "(10038000
ML1 = 19# )"INTERUPT ON MULTI-LINE 1"(10039000
ML2 = 20# )"INTERUPT ON MULTI-LINE 2"(10040000
ML3 = 21# )" "(10041000
ML4 = 22# )" "(10042000
EXTMPX = 23# )"EXTERNAL MPX "(10043000
UA2 = 24# )"SECND UNASSIGNED MPX INT"(10044000
UA3 = 25# )"THIRD UNASSIGNED MPX INT"(10045000
UA4 = 26# )"FORTH UNASSIGNED MPX INT"(10046000
MACHINEERROR = 27# )"HOPEFULLY "(10047000
PRTOPR = 28# )"PROCESSOR TO PROCESSOR "(10048000
STACKBOTTOM = 29# )"BOTTOM OF STACK INT "(10049000
EVENTLISTERR = 30 # %ERROR IN EVENTIST 10050000
, INTERRUPTDEC = 31 # %ERROR IN INTERRUPT DEC 10051000
10052000
, GROSSLOCK = 64 # % TEMPORARY GROSSLOK STOP 10053000
; 10054000
COMMENT FOLLOWING ARE THE VARIOUS VALUES OF THE TAG FIELD; 10055000
DEFINE SINGL = 0 #, 10056000
IRW = 1 #, 10057000
DOUBL = 2 #, 10058000
MEMLINK = 3 #, 10059000
CODE = 3 #, 10060000
SEGDESC = 3 #, 10061000
MSCW = 3 #, 10062000
TOS = 3 #, 10063000
RCW = 3 #, 10064000
DATADESC = 5 #, 10065000
STRINGDESC = 5#, 10066000
UNITAL = 6 #, 10067000
PCW = 7 # 10068000
; 10069000
10070000
DEFINE SINGLE = SINGL# 10071000
; 10072000
FIELD FULLWORD = 47:48 10073000
; 10074000
LAYOUT DATADESCRIPTOR ( TAG ~ DATADESC 10075000
, PBITF = 47:1 %PRESENCE BIT 10076000
, CBITF = 46:1 %COPY BIT 10077000
, IBITF = 45:1 %INDEXED BIT 10078000
, SBITF = 44:1 %SEGMENT BIT 10079000
, RBITF = 43:1 %READ ONLY BIT 10080000
, NUF =42:2:=0 %MUST BE ZERO 10081000
, DBITF = 40:1 %DOUBLE PREC. BIT 10082000
, LENTHINDEXF=39:20 %LENGTH/INDEX FLD 10083000
, ADDRESSF = 19:20 %ADDRESS FIELD 10084000
) 10085000
, REFERENCED ( PBITF 10086000
, IBITF 10086100
, LENTHINDEXF 10087000
, ADDRESSF 10088000
) 10089000
, DESCADDRESS ( ADDRESSF 10090000
) 10091000
, STRINGDESCRIPTOR ( TAG ~ STRINGDESC 10092000
, PBITF 10093000
, CBITF 10094000
, IBITF ~ 0 10095000
, SBITF 10096000
, RBITF 10097000
, SZF = 42:3 %CHARACTER SIZE 10098000
, LENGTHSTF = 39:20 %LENGTH FIELD 10099000
, ADDRESSF 10100000
) 10101000
, INDEXEDSTRINGDESCRIPTOR(TAG ~ STRINGDESC 10102000
, PBITF 10103000
, CBITF 10104000
, IBITF ~ 1 10105000
, SBITF 10106000
, RBITF 10107000
, SZF 10108000
, BYTEF = 39:4 %BYTE FILED 10109000
, INDEXSTF = 35:16 %INDEX FILED 10110000
, ADDRESSF 10111000
) 10112000
, SEGMENTDESCRIPTOR( TAG ~ SEGDESC 10113000
, PBITF 10114000
, CBITF 10115000
, DICTIONARYF = 45:1 10116000
, LOCKBITF = 44:1 10117000
, LENGTHSEGF 10118000
, ADDRESSF 10119000
, SVBITF =19:1 %SAVE BIT FIELD 10120000
) 10121000
, SETTAG ( TAG 10122000
) 10123000
; 10124000
DEFINE LENGTHF = LENTHINDEXF #%)CONVENIENT 10125000
, INDEXF = LENTHINDEXF #%)NOMENCLATUR10126000
, EBCDIC = 4 # %CHARACTER SIZE AS 10127000
, BCL = 3 # %PER SZF FIELD IN 10128000
, DIGIT = 2 # %STRING DESCRIPTOR 10129000
, TAGZOT(X) = (X) & SETTAG(SINGL) # 10130000
, DESCRIPTORLOCK =(MOM.DESCRIPTORLOCKF 10130100
=7 AND KIND = DATADESC) # 10130200
; 10131000
FIELD OLAYTYPEF = 18:1 10132000
10133000
, FILETYPEF = 18:1 10134000
, MCPF = 19:1 10135000
, AITINDICATORF = 17:1 10136000
, ADDRESF = 16:17 10137000
, DESCRIPTORLOCKF = 19:3 10137100
, MCPCODEF =19:2 10138000
; 10139000
LAYOUT NOTPRESENTARRAYDESCL( 10139050
PCBITSF = 47:2 ~0 10139100
, LENGTHF 10139150
, MCPCODEF 10139200
, AITINDICATORF 10139300
, ADDRESF 10139350
), 10139400
ARRAYDESCL ( 10139430
PCBITSF ~ 2 10139450
, LENGTHF 10139500
, ADDRESSF 10139550
); 10139600
COMMENT FOLLOWING IS THE FORMAT OF THE NORMAL AND STUFFED IRWS; 10140000
LAYOUT NORMALIRW ( TAG ~ IRW 10141000
, EBITF = 46:1 ~ 0 % E BIT 10142000
, ADRCPLF = 13:14 10143000
) 10144000
, STUFFEDIRW ( TAG ~ IRW 10145000
, EBITF ~ 1 10146000
, STKNRF = 45:10 10147000
, DISPF = 35:16 %OF MKST10148000
, SIRWDELTAF = 12:13 %DELTA 10149000
) 10150000
, MARKSTACKCW( TAG ~ MSCW 10151000
, DSBITF =47:1 10152000
, EBITF 10153000
, STKNRF 10154000
, VBITF = 19:1 10155000
, LLF = 18:5 10156000
, DFF = 13:14 10157000
) 10158000
, MARKSTACKWD( TAG ~ MSCW 10159000
, DSBITF 10160000
, EBITF 10161000
,STKNRF 10162000
, DISPFMS = 35:16 10163000
, VBITF 10164000
, LLF 10165000
, DFF 10166000
) 10167000
, RETURNCONTROLWORD (TAG ~ RCW 10168000
, STKNRF 10169000
, PSRF =35:3 10170000
, PIRF = 32:13 10171000
, NCSFF= 19:1 10172000
, LLF 10173000
, SDIF = 13:14 10174000
) 10175000
, POINTTOIOCB ( LOCKBITF 10176000
, ADDRESSF 10177000
) 10178000
; 10179000
COMMENT FOLLOWING IS FORMAT OF TOS CONTROL WORD; 10180000
LAYOUT TOSCW ( TAG ~ TOS 10181000
, SGNFFF = 47:1 10182000
, OFFFF = 46:1 10183000
, TFFFF = 45:1 10184000
, FLTFF = 44:1 10185000
, DSF = 39:20 10186000
, NCSFF 10187000
, LLF 10188000
, DF = 13:14 10189000
) 10190000
; 10191000
COMMENT FOLLOWING IS THE FORMAT OF THE FIRST WORD OF AN EVENT; 10192000
LAYOUT FIRSTEVENTWORD(TAG~DOUBL 10193000
,COUNTF = 47:27 10194000
, WAITQHEADF= 18:10 % HEAD WAITQ 10195000
, WAITQTAILF= 22:10 % TAIL WAITQ 10196000
, AVAILABLEBITF= 2:1 10197000
, HAPPENEDBITF = 1:1 10198000
, EVENTLOCKBITF= 0:1 10199000
) 10200000
; 10201000
FIELD EVENTLINKSF = 22:20 10202000
; 10203000
LAYOUT LOKMOM(LOCKBITF,DESCRIPTORLOCKF) 10204000
, FIXDESC(PBITF,LOCKBITF,ADDRESSF) 10205000
, SETCOPYBIT(CBITF) 10206000
; 10207000
SAVE 10208000
REAL ARRAY SOFTWAREINTERRUPTMASK[32]%EACH BIT INDICATES WHETHER 10209000
%THERE ARE ANY SOFTWARE 10210000
%INTERRUPTS FOR THE CORRES- 10211000
%PONDING STACK 10212000
; 10213000
10214000
FIELD ENABLEBITF = 46:1 10215000
, MOD32F = 4:5 10216000
, DIV32F = 9:5 10217000
, MOD64F = 5:6 10217010
, DIV64F = 9:4 10217020
, D0DISPF = 12:13 10217100
, D2DISPF = 11:12 10217200
, D4DISPF = 10:11 10217300
, D8DISPF = 9:10 10217400
, D16DISPF = 8:9 10217500
, D0D1SEGBIT= 13:1 10217600
, REALSDIF = 12:13 10217700
; 10218000
DEFINE MYCOURSEWORD = 20 # 10219000
, CODEFILEDESC=1# 10220000
, OLAYFILEDESC=2# 10221000
; 10222000
10223000
10224000
REAL COUNTFORTIMERINTERRUPTEVENT 10225000
, NUMBEROFPROCESSORS 10226000
; 10227000
BOOLEAN MORETHANONEPROCESSOR 10228000
; 10229000
DEFINE IFTHEREISASOFTWAREINTERRUPT = 10230000
IF BOOLEAN (SOFTWAREINTERRUPTMASK 10231000
[MYSNR.DIV32F].MOD32F)# 10232000
, MYCOURSE = STACK[MYSNR,MYCOURSEWORD] # 10233000
, MYDIVIDEBYZERO(X) = KILLME(WHICH) # 10234000
, MYEXPONENTUNDERFLOW(X) = KILLME(WHICH) # 10235000
, MYEXPONENTOVERFLOW(X) = KILLME(WHICH) # 10236000
, MYINVALIDINDEX(X) = KILLME(WHICH) # 10237000
, MYINTEGEROVERFLOW(X) = KILLME(WHICH) # 10238000
; 10239000
REAL CORESIZE = (0,6) 10240000
, SOFTWAREINTERRUPTLOCK= (0,17) 10241000
, INDEPENDENTRUNNERSTACKS 10242000
; 10243000
SAVE REFERENCE ARRAY 10244000
SHEETVECTOR = (0,16) [* ] 10245000
; 10246000
SAVE WORD ARRAY 10247000
SHEETARRAY = SHEETVECTOR[*,*] 10248000
; 10249000
SAVE REAL ARRAY 10250000
SHEETREALS = SHEETVECTOR[*,*] 10250200
; 10251000
COMMENT THE FOLLOWING ILLUSTRATE THE METHOD OF ACCESSIN REGISTERS; 10252000
DEFINE D = REGISTERS # , 10253000
D0 = D[0] #, 10254000
D1 = D[1] #, 10255000
D2 = D[2] #, 10256000
D3 = D[3] #, 10257000
D4 = D[4] #, 10258000
D5 = D[5] #, 10259000
D6 = D[6] #, 10260000
D7 = D[7] #, 10261000
D8 = D[8] #, 10262000
D9 = D[9] #, 10263000
D10 = D[10]#, 10264000
D11 = D[11]#, 10265000
D12 = D[12]#, 10266000
D13 = D[13]#, 10267000
D14 = D[14]#, 10268000
D15 = D[15]#, 10269000
D16 = D[16]#, 10270000
D17 = D[17]#, 10271000
D18 = D[18]#, 10272000
D19 = D[19]#, 10273000
D20 = D[20]#, 10274000
D21 = D[21]#, 10275000
D22 = D[22]#, 10276000
D23 = D[23]#, 10277000
D24 = D[24]#, 10278000
D25 = D[25]#, 10279000
D26 = D[26]#, 10280000
D27 = D[27]#, 10281000
D28 = D[28]#, 10282000
D29 = D[29]#, 10283000
D30 = D[30]#, 10284000
D31 = D[31]#, 10285000
IRSR(X) = REGISTERS[X+32]#, 10286000
PIR = REGISTERS[32]#, 10287000
SIR = REGISTERS[33]#, 10288000
DIR = REGISTERS[34]#, 10289000
TIR = REGISTERS[35]#, 10290000
LOSR = REGISTERS[36]#, 10291000
BOSR = REGISTERS[37]#, 10292000
F = REGISTERS[38]#, 10293000
BRSR(X) = REGISTERS[X+48] #, 10294000
PBR = REGISTERS[48]#, 10295000
SBR = REGISTERS[49]#, 10296000
DBR = REGISTERS[50]#, 10297000
TBR = REGISTERS[51]#, 10298000
S = REGISTERS[52]#, 10299000
SNR = REGISTERS[53]#, 10300000
PDR = REGISTERS[54]# 10301000
; 10302000
DEFINE OLAYROWLENTH = 180 # 10303000
, CODEROWLENTH = 180 # 10304000
; 10305000
DEFINE UPTOYOU =0# )"THE MCP DOES AS IT PLEASES "(10306000
FINISH =1# )"THE MCP MUST D-ES ME "(10307000
CARRYON =3# )"THE MCP MUST IGNORE INTERRUPT "(10308000
TELLME =4# )"THE MCP MUST SET SOME FLAGS "(10309000
SELECT =5# )"ACCESS PCW APPROPRIATE TO INTERUPT"(10310000
FAULTROUTINE =6# 10311000
; 10312000
DEFINE DISABLEOVERLAY = ;# % DUMMY DECLARATION 10313000
, ENABLEOVERLAY = ;# % DUMMY DECLARATION 10314000
; 10315000
PROCEDURE HANDLETHESOFTWAREINTERRUPT;; 10316000
COMMENT THIS IS A DUMMY PROCEDURE; 10317000
QUEUE SOFTWAREINTERRUPTQ(Y);REAL Y; 10318000
COMMENT THIS IS A DUMMY DECLARATION; 10319000
USING 10320000
TO INSERT,ENTRY ~ENTRY 10321000
; 10322000
DEFINE SETINTERVALTIMER = TIMER(100)#; 10323000
SAVE PROCEDURE KILLME(KILLVALUE); VALUE KILLVALUE; REAL KILLVALUE; 10324000
BEGIN 10325000
MONITOR JACKMONITOR(KILLVALUE); 10326000
LAYOUT KILLLAYOUT (39:16, 19:20); 10326100
KILLVALUE~KILLVALUE; 10327000
STOP (0&KILLLAYOUT (KILLVALUE, PDR), PIR); 10328000
IF NOT SIMULATING THEN MEMDUMP(0,0); 10328100
STOP(4"93C838E049E4",4"038038E491C0"); 10328200
END KILLME; 10329000
PROCEDURE MYFAULT(W); WORD W;; %DUMMY DEC 10330000
LAYOUT FIRSTPOINTERWORDL 10982000
(TOTALINFOWORDSF= 47:16 10983000
,INFOINDEXF = 31: 8 10984000
,INFOLENGTHF = 23: 8 10985000
,INFOTYPEF = 15: 9 10986000
,ALFALENGTHF = 6: 7 10987000
,KEYFIELDF = 15:16 10988000
); 10989000
COMMENT DEFINES FOR INFOTYPEF AS USED IN PARAMETER QUEUE10990000
ALGORITHMS. VALUES SHOULD BE GREATER THAN 128 10991000
AND LESS THAN 511.; 10992000
DEFINE FILETYPEP = 129#, 10993000
ENDOFPTYPE= 511#; 10994000
DEFINE UPDATEWORDCOUNT(NEWWORDS, ENTRY) = 10995000
REPLACE POINTERTOID@(ENTRY) 10996000
BY (REAL(POINTERTOID@(ENTRY) , 6) & 10997000
FIRSTPOINTERWORDL(NEWWORDS)) 10998000
FOR 6 #, 10999000
UPDATEINFOINDEX (INFOI, ENTRY) = 10999900
REPLACE POINTERTOID@(ENTRY) 10999930
BY (REAL(POINTERTOID@(ENTRY), 6) & 10999960
FIRSTPOINTERWORDL(*,*,INFOI))FOR 6 ;#;10999990
COMMENT STORAGE ALLOCATION VARIABLES ***********; 11000000
INTEGER PREVADDR, COMMENT THE ABSOLUTE ADDRESS FOR AVAILA OF THE 11001000
LARGEST AVAILABLE AREA NOT FOLLOWING AN OVER- 11002000
LAYABLE AREA OF MEMORY; 11003000
AVAILI, COMMENT THE ABSOLUTE ADDRESS OF THE FIRST 11004000
AVAILABLE LINK.; 11005000
MINDEX, COMMENT A UTILITY MEMORY INDEX; 11006000
MLENGTH, COMMENT A UTILITY MEMORY LENGTH; 11007000
AVAILABLECORE, COMMENT THE AMOUNT OF PRIMARY MEMORY(FRAGMENTED 11007100
OR OTHERWISE) THAT IS AVAILABLE AT ANY MOMENT; 11007200
SPACEQHEAD, COMMENT THE STACK THAT CONTAINS THE SUPER 11007300
SPACE AUTHORITY AND THE LINK TO THE STACK THAT 11007400
HAS THE SPACE REQUEST WITH THE HIGHEST PRIORITY;11007500
BACKALLOCATED, COMMENT ABSOLUTE ADDRESS LINKA FOR MOST 11008000
RECENTLY ALLOCATED AREA.; 11009000
LEFTOFF, COMMENT ABSOLUTE ADDRESS OF LINKA FOR HEAD OF 11010000
LEFTOFF LIST.; 11011000
STOPPER; COMMENT ABSOLUTE ADDRESS OF AVAILA FOR END OF 11012000
AVAILABLE LIST. BIT 42:1 = 1, I.E. SIZE IS 11013000
LARGER THAN LARGEST MEMORY POSSIBLE AND THE LINK11014000
IS ZERO. AVAILB OF STOPPER IS ADDRESS OF LARG- 11015000
EST AVAILABLE AREA.; 11016000
REAL SPACELOCK; COMMENT SPACELOCK INSURES THAT ONLY ONE PROC- 11017000
CESS AT A TIME HAS ACCESS TO MEMORY LINKS. IT 11018000
IS THEREFORE BUZZED UPON ENTRY TO GETSPACE AND 11019000
FORGETSPACE AND UNLOCKED BEFORE THESE PROCEDURES11020000
ARE EXITED.; 11021000
DEFINE FASTPLACE = BACKWARDLINKF#, 11021100
SLOWPLACE = FORWARDLINKF #, 11021200
RETRYCOUNT = SELFIDENTF #, 11021300
SPACERETRY = 10#; COMMENT THE MAXIMUM NUMBER OF TIMES A 11021400
SPACE "QUEUE" ENTRY CAN BE IGNORED BECAUSE AN 11021500
ORDERED SIZE IS NOT ADEQUATE. THE ENTRY MUST BE11021600
AT THE HEAD OF THE QUEUE BEFORE THE COUNTER IS 11021700
DECREMENTED.; 11021800
LAYOUT LINKA COMMENT THE FIRST LINK WORD OF AN IN-USE AREA; 11022000
(TAG ~ 3, 11023000
INUSEID = 47:10, COMMENT THE USERS ID FOR THIS AREA ; 11024000
INUSELENGTH = 37:17, COMMENT A SELF-RELATIVE INDEX FOR 11025000
FINDING LINKZ FOR THIS AREA. I.E. LENGTH OF 11026000
AREA + NUMBER OF LINK WORDS; 11027000
AVAILABLE = 20:1 ~ 0, 11028000
BACKLINK = 19:20), COMMENT THE LINK TO THE LAST PREVIOUSLY11029000
ALLOCATED AREA FOR THIS USER; 11030000
LINKB COMMENT THE SECOND LINK WORD OF AN IN-USE AREA;11031000
(TAG ~ 3, 11032000
USAGE = 47:7, COMMENT THE USAGE OF THE AREA; 11033000
ADDRTYPE = 40:1, COMMENT IS THE ADDRESS OF MOM ABSOLUTE OR11034000
BOS RELATIVE. 1 IS BOS RELATIVE.; 11035000
ADDRMOM = 39:20, COMMENT THE ADDRESS OF THE MOM DESCRIPT;11036000
DISKADDR = 19:20), COMMENT THE DISK ADDRESS OF THE AREA 11037000
DESCRIBED BY MOM. 19:1 = 1 INDICATES OVERLAY 11038000
DISK.; 11039000
LINKC COMMENT THE THIRD LINK WORD OF AN IN-USE AREA; 11040000
(TAG ~ 3 11041000
), COMMENT THIS WORD IS RESERVED FOR EXPANSION; 11042000
LINKZ COMMENT THE FINAL LINK WORD OF AN IN-USE AREA; 11043000
(TAG ~ 3, 11044000
OLAY = 47:1, COMMENT THE PERMANENT OVERLAYABLE STATE OF 11045000
AN AREA. GETSPACE PLACES THE RESULT OF A 11046000
LOGICAL AND OF THE OERLAY BIT OF ITS TYPE 11047000
AND ADDRESS (OF MOM)! 0 IN THIS BIT; 11048000
DELTAWDS = 46:5, 11049000
FRONTLINK =43:20, COMMENT - CHECK-OUT * * * * * * * 11050000
FRONTLINK = 41:20, COMMENT THE LINK TO THE NEXT ALLOCATED11051000
AREA FOR THIS IN-USE ID.; 11052000
SPACEOLAYLOCK = 21:1, COMMENT IF BIT IS ON AREA IS OVER-11053000
LAYABLE. GETSPACE TURNS THE BIT OFF AND THE 11054000
CALLER HAS THE RESPONSIBILITY OF EXCHANGING THE 11055000
OLAY BIT AND THIS BIT.; 11056000
AVAILABLE ~ 0, 11057000
INUSELENGTHZ = 19:20), COMMENT A SELF-RELATIVE INDEX FOR 11058000
FINDING LINKA OF THIS AREA.; 11059000
AVAILA COMMENT THE FIRST LINK WORD OF AN AVAILABLE AREA.; 11060000
(TAG ~ 3, 11061000
PREOLAY = 41:1, COMMENT THE OLAY BIT OF THE PREVIOUS 11062000
AREA; 11063000
LENGTH = 40:20, COMMENT A SELF-RELATIVE INDEX TO AVAILZ 11064000
OF THIS AREA. LENGTH = WORDS IN AREA + LINKSIZ;11065000
AVAILABLE ~ 1, 11066000
LINK = 19:20), COMMENT THE ABSOLUTE ADDRESS OF THE NEXT 11067000
AVAILABLE AREA; 11068000
AVAILB COMMENT THE SECOND LINK WORD OF AN AVAILABLE AREA.; 11069000
(TAG ~ 0, 11070000
LINKTOPREVIOUSAVAILABLEAREA = 47:48), 11071000
AVAILZ COMMENT THE FINAL LINK WORD OF AN AVAILABLE AREA.; 11072000
(TAG ~ 3, 11073000
AVAILABLE ~ 1, 11074000
LENGTHZ = 19:20), COMMENT A SELF-RELATIVE INDEX TO FIND 11075000
AVAILA FOR THIS AREA.; 11076000
SPACETYPE 11077000
( 11078000
PRINTNOMEM = 4:1, COMMENT 1 = PRINT NO MEM MESSAGE; 11079000
MAKEROOM = 3:1, COMMENT 1 = OVERLAY IF REQUIRED; 11080000
SLEEPY = 2:1, COMMENT 1 = SLEEP IF MEMORY N/A; 11081000
11082000
OERLAY = 0:1), COMMENT 1 = SPACE FOR OVERLAYABLE; 11083000
LLLUARG 11084000
(21:1, COMMENT PREVIOUS OVERLAYABILITY; 11085000
20:20); COMMENT SIZE; 11086000
DEFINE INITIALIZETOZERO (ADDRESS, LENGTH) = 11087000
REPLACE POINTER(M[ADDRESS]) BY 0 FOR LENGTH OVERWRITE#; 11088000
FIELD AVAILKEY = 47:28; COMMENT AVAILA SORT KEY FIELD.; 11089000
DEFINE LINKSIZE = COMMENT NUMBER OF WORDS IN MEMORY LINKS -1; 11090000
3#, 11091000
LINKSIZETIMES2PLUS1 = COMMENT SIZE OF TEMPLINKS ARRAY.; 11092000
8#; 11093000
DEFINE PROCSTACKSIZE = 12000000
512#, 12001000
COMMENT ARBITRARY - F AND S ARE SET TO 12002000
SOME ADDRESS IN THE SECOND HALF OF MOD 0 12003000
UNTIL MORE PERMANENT STACKS CAN BE GOTTEN.;12004000
12005000
12006000
COMMENT THEN NUMBER OF WORDS IN A SHEET ENTRY 12007000
AND THE NUMBER OF WORDS THAT ARE RESERVED AT THE12008000
BOTTOM OF A PROCESSES LOWEST LEVEL STACK. ;12009000
STACKOFLOWSIZE = 12010000
64 #, 12011000
COMMENT THE NUMBER OF WORDS THAT ARE RESERVED 12012000
ABOVE LOSR TO HANDLE STACK OVERFLOWS. ;12013000
STACKSPERMODULE = 12014000
32#; 12015000
COMMENT THE NUMBER OF STACK VECTOR WORDS THAT 12016000
ARE ALLOCATED FOR EACH PRESENT MEMORY MODULE UP 12017000
TO THE MAXIMUM OF 1024 STACKS.; 12018000
INTEGER MAXSTACKS; COMMENT THE MAXIMUM INDEX FOR THE 12019000
STACK VECTOR.; 12020000
SAVE WORD ARRAY TEMPLINKS [LINKSIZETIMES2PLUS1]; 12021000
COMMENT RESERVES SPACE IN LEVEL 0 12022000
STACK FOR FIRST AVAILABLE 12023000
AND STOPPER LINKS; 12024000
ARRAY MEMMODS [64]; COMMENT DURING MEMORY INITIALIZATION EACH12025000
WORD CONTAINS A ONE IF THE CORRESPONDING 12026000
MODULE IS PRESENT. AFTER MISSING MODS ARE 12027000
ACCOUNTED FOR THE ELEMENTS ARE AVAILABLE TO12028000
BE DEFINED AS VARIOUS LOCAL INITIALIZE 12029000
VARIABLES. AFTER INITIALIZE THE AREA IS 12030000
FORGOTTEN AND THE STACK CELL IS AVAILABLE 12031000
FOR A PERMANENT GLOBAL.; 12032000
INTEGER PROCSTACKSTART = MEMMODS; 12033000
WORD PROCSTACKSTARTW= MEMMODS;COMMENT ONLY WAY TO OVERWRITE DESC.;12034000
REAL SLAVEQUARTERS, COMMENT USED TO LOCK ALL PROCESSORS EX- 12035000
CEPT THE ONE THAT LOCKS IT UNTIL INITIAL- 12036000
IZATION HAS THE SITUATION SOMEWHAT UNDER 12037000
CONTROL; 12038000
TIMEOUT, COMMENT CONTAINS SOME VALUE OF THE TIME- 12039000
OF-DAY CLOCK + AN INCREMENT OF TIME THAT IS12040000
SUFFICIENT TO ALLOW ALL EXPECTED PROCESSORS12041000
TO GET THEIR STACKS IN TEMPORARY ORDER.; 12042000
MEMMAX, COMMENT THE MAXIMUM AMOUNT OF AVAILABLE 12043000
MEMORY.; 12044000
SAVE1ADDRESS, COMMENT THE ADDRESS OF MEMORY AREA THAT 12045000
CONTAINS INITIALIZATION CODE AND IS TO BE 12046000
FORGOTTEN AFTER INITIALIZATION. STACK CELL12047000
IS AVAILABLE AFTER INITIALIZATION.; 12048000
PROCMASK = NUMBEROFPROCESSORS; 12049000
COMMENT A ONE BIT IN THIS WORD IDENTIFIES12050000
AN AVAILABLE PROCESSOR, THE BITS POSITION 12051000
IS THE PROCESSOR ID.; 12052000
BOOLEAN INITSWITCH; COMMENT USED TO CHANGE MPX INTERRUPT TO 12053000
PTPI INTERRUPT IN INITIALIZE AND 12054000
TO TELL STORAGE ALLOCATION WHEN A 12054500
PERMANENT LEFTOFF HEAD IS READY.; 12055000
LAYOUT SEGTRACEL (STKNRF~1, PIRF, ADDRESSF); 12055500
SAVE REAL PROCEDURE SEGTRACE(SEGTRACTER);% 12055600
VALUE SEGTRACTER; REAL SEGTRACTER;% 12055610
BEGIN 12055620
IF NOT SIMULATING THEN RETURN(0);% 12055625
SEGTRACE~REGISTERS[60]; 12055630
REGISTERS[60]~SEGTRACTER; 12055640
END SEGTRACE; 12055650
SAVE INTEGER PROCEDURE TRACE (TRACTER); 12056000
VALUE TRACTER; 12057000
INTEGER TRACTER; 12058000
BEGIN 12059000
IF NOT SIMULATING THEN RETURN(0);% 12059100
TRACE ~ REGISTERS [64]; 12060000
REGISTERS [64] ~ TRACTER; 12061000
END TRACE; 12062000
COMMENT THE ARRAYS BETWEEN "UNIT" AND 13000000
"TRANSACTION" ARE INITIALIZED TO MAXI-13001000
MUM NUMBER OF UNITS ON A GIVEN SYSTEM 13002000
BY THE CALL: 13003000
INITIALIZEARRAY(UNIT,TRANSACTION,MAXU)13004000
IN THE INITIALIZE PROCEDURE. THIS 13005000
SERIES OF ARRAY DECLARATIONS SERVES TO13006000
ILLUSTRATE THE METHOD FOR THE DECLAR- 13007000
ATION AND INITIALIZATION OF A NUMBER 13008000
(ONE OR MORE) ARRAYS TO THE SAME SIZE.13009000
ALL ARRAYS INITIALIZED THIS MANNER 13010000
ARE PLACED IN HIGH CONTIGUOUS MEMORY 13011000
AND MARKED AS NON-OVERLAYABLE. TO ADD13012000
ANOTHER ARRAY THAT IS TO HAVE A LENGTH13013000
OF MAXU, IT IS ONLY NECESSARY TO DE- 13014000
CLARE THE ARRAY BETWEEN "UNIT" AND 13015000
"TRANSACTION". (ALSO SEE DECLARATION &13016000
PROCEDURE CALL FOR "OLDSTATUSWORD"). 13017000
13018000
FROM THE FOREGOING IT SHOULD BE 13019000
APPARENT THAT: 13020000
1. ARRAYS THAT ARE TO BE INITIALIZED13021000
TO THE SAME LENGTH SHOULD BE DE- 13022000
CLARED CONTIGUOUSLY. 13023000
2. AT LEAST ONE PROCEDURE CALL IS 13024000
REQUIRED FOR EACH SERIES (ONE OR 13025000
MORE) OF ARRAYS THAT ARE TO BE 13026000
INITIALIZED TO THE SAME LENGTH. 13027000
3. ALL STACKCELLS BETWEEN THE FIRST 13028000
AND LAST ARRAY DECLARATIONS WILL 13029000
BE INITIALIZED TO ARRAY DESCRIP- 13030000
TORS. 13031000
;13032000
INTEGER DIAGNOSTICUNIT;COMMENT THE LOGICAL UNIT NO. OF THE 13033000
DIAGNOSTIC FILE; 13034000
DEFINE DIAGNOSTICIOCW = 40"04004" #, % IOCW FOR PRINTER-BCL SNG SPACE 13037100
DIAGNOSTICUNITTYPE = BUFFPRINTER#; %UNIT TYPE FOR MONITOR UNIT 13037200
SAVE WORD ARRAY DIAGNOSTICARRAY[22]; %BUFFER AND IOCW FOR MONITOR 13037300
ARRAY MONITER[*]; %DESCRIPTOR TO I/O AREA OF ABOVE 13037400
EVENT MONITORFINISH; %MONITOR I/O FINISH EVENT 13037500
REAL DCPSANDGCAS; 13037600
BOOLEAN MULTIPLEXORMASK; % A ONE BIT "N" MEANS THERE IS AN MPX-N 13037700
ARRAY UNIT[ * ]; COMMENT CONTAINS INFORMATION OF EACH UNITS CURRENT 13038000
STATE; 13039000
REFERENCE ARRAY LASTIO [*]; 13040000
ARRAY UINFO[*], % DESCRIPTORS FOR NON-DISK UNITS WHICH ARE 13041000
% READY. THE DESCRIPTORS POINT TO A "LABEL 13042000
% BLOCK" WHICH HAS THE SAME FORM AS A "LABEL- 13043000
% EQUATION BLOCK" (LEB) (SEE 24000000 FOR THE 13044000
% FORMAT OF THE LEB). 13045000
13046000
IOTIME [*], COMMENT ARRAY FOR RECORDING USERS IO TIME; 13047000
TRANSACTION[*], COMMENT FOR RECORDING RECORD TRANSACTIONS; 13048000
DUMMYAREA[1]; % FOR MAKING I/O REQUEST 13050000
WORD ARRAY UINFOW = UINFO[*]; 13050100
ARRAY UINFOP = UINFO[*,*]; 13050200
WORD ARRAY UINFOPW=UINFOW[*,*]; 13050210
BOOLEAN OPTIONS;% OPTIONS BIT WORD 13051000
DEFINE% OPTIONS 13051100
RETTOG = OPTIONS.BIT47#,% 13051200
13052000
ENDOPTDEF=0#;% 13054000
COMMENT 13054990
SCREEN IS INITIALIZED BY PERIPHERALINITIALIZE--SHOULD BE DYNAMIC;13055000
ARRAY SCREEN[*];% 13055010
% GLOBALS FOR OUTPUTMESS AND MESSER 13056000
LAYOUT WHOCALLSL (WHOF=47:24,WHICHF=11:12,WHATF=23:12);% 13056100
DEFINE% FOR OUTPUTMESS AMD MESSER 13057000
BEGFINMSG = 0#,% 13057100
BEGFOUTMSG = BEGFINMSG + FINSZ#,% 13057200
BEGMATHERR = BEGFOUTMSG + FOUTSZ#,% 13057300
BEGSTATMSG = BEGMATHERR + MATHERRSZ#,% 13057400
BEGMCPID = BEGSTATMSG + STATSZ#,% 13057500
BEGIOERR = BEGMCPID + MCPIDSZ#, 13057510
BEGSTDIOERR =BEGIOERR + IOERRSZ#,% 13057520
BEGMISCMSG= BEGSTDIOERR + STDIOERRSZ#,% 13057530
FINSZ = 6#,% 13057600
FOUTSZ = 4#,% 13057700
MATHERRSZ = 30#,% 13057800
STATSZ = 11#,% 13057900
MCPIDSZ = 4#,% 13058000
IOERRSZ = 5#,% 13058010
STDIOERRSZ = 18#,% 13058020
MISCSZ= 2#,% 13058030
FINMSGSEC= 0#,% 13058100
FOUTMSGSEC= 1#,% 13058200
MATHERRMSGSEC= 2#,% 13058300
STATMSGSEC= 3#,% 13058400
MCPIDSEC= 4#,% 13058500
IOERRSEC=5#,% 13058600
STDIOERRSEC=6#,% 13058700
MISCMSGSEC= 7#,% 13058710
OPMINDXR(N) = CASE N OF (% 13059000
BEGFINMSG,BEGFOUTMSG,BEGMATHERR,% 13059010
BEGSTATMSG,% 13059020
BEGMCPID,% 13059030
BEGIOERR,% 13059040
BEGSTDIOERR,% 13059050
13059055
BEGMISCMSG,% 13059060
0)#,% 13059090
IOERRMESSL(A,B,C)=MESSER(0&WHOCALLSL(5,A,B),C)#, 13059800
BOJMESSER(SNR)= MESSER(0&WHOCALLSL(MISCMSGSEC),SNR)#,% 13059810
EOJMESSER(SNR)= MESSER(1&WHOCALLSL(MISCMSGSEC),SNR)#,% 13059820
ENDOPMDEF=0#; % 13059990
ARRAY% **** "SCAN" DOES NOT LIKE READ ONLY ARRAYS 13060000
OUTPUTMESS~(% ALL MESSAGES USED BY MESSER 13065000
8"NO FILE"4"00"% **** FINDINPUT MSG**13066000
8"UNMATCHED GENEALOGY"4"00"% * 13066100
8"DUP FIL"4"00"% * 13067000
,% END FIND-INPUT MSG** 13068000
8"REQUIRED"4"00" 8"NEW PBT ON"4"00"% FIND-OUTPUT MSG### 13069000
,% END FIND-OUTPUT MSG### 13070000
8"ALGAMA"4"00" 8"ALOG"4"00" 8"ALOG10"4"00"%MATH ERRORS*** 13071000
8"ARCOS"4"00" 8"ARSIN"4"00" 8"ATAN"4"00" % * 13072000
8"ATAN2"4"00" 8"COS"4"00" 8"COSH"4"00" 8"COTAN"4"00"% * 13073000
8"ERF"4"00" 8"EXP"4"00" 8"GAMMA"4"00" 8"SIN"4"00"% * 13074000
8"SINH"4"00" 8"SQRT"4"00" 8"TAN"4"00" 8"TANH"4"00"% * 13075000
8"XTOI"4"00"% * 13076000
8"DATAN"4"00" 8"DATAN2"4"00" 8"DCOS"4"00" 8"DEXP"4"00"% * 13077000
8"DLOG"4"00" 8"DLOG10"4"00" 8"DSIN"4"00" 8"DSQRT"4"00"% * 13078000
8"CABS"4"00" 8"CCOS"4"00" 8"CEXP"4"00" 8"CLOG"4"00"% * 13079000
8"CSIN"4"00" 8"CSQRT"4"00",% END MATH ERRORS*** 13080000
8"NOT READY"4"00"% STATUS MESSAGES SSSS 13081000
8"UNIDENTIFIED FLYING UNIT"4"00"% S 13081200
8"PARITY RW/L"4"00"% S 13081300
8"RET"4"00"% S 13081500
8"MCP PBT ON"4"00"% S 13081700
,% END STATUS MESSAGES SSSS 13081990
8"B6500 MCP"% **** BEGINNING MCP ID ******* 13082000
8" LEVEL "% * 13082100
8"0"% LEVEL NUMBER * 13082200
8"."% * 13082300
8"0"% PATCH NUMBER WITHIN LEVEL * 13082400
4"00",% **** END MCPID ******* 13082500
8"FILE OPEN"4"00" % I/O ERRORS 13082600
8"FILE ATTRIBUTE"4"00" 13082700
, % END I/O ERRORS 13082800
8"DESCRIPTOR ERROR"4"00" % STD I/O ERRORS 13082900
8"INVALID MEM ADDRESS"4"00"% 13083000
8"I/O MEMORY PARITY"4"00"% 13083100
8"MEMORY PROTECT ERROR"4"00"% 13083200
8"UNIT READ CHECK"4"00"% 13083300
8"WRITE LOCK-OUT"4"00"% 13083400
, % END STD I/O ERRORS 13084000
8"BOJ"4"00"% BEGIN MISCELLANEOUS MESSAGES MMM 13085000
8"EOJ"4"00"% M 13085100
,% END MISCELLANEOUS MESSAGES MMM 13085900
0),% END MESSAGES USED BY MESSER 13099900
MONTHS ~( 8"JANUARY"4"00",8"FEBRUARY"4"00",8"MARCH"4"0000", 13120000
8"APRIL"4"0000",8"MAY"4"00000000",8"JUNE"4"000000", 13120010
8"JULY"4"000000",8"AUGUST","00",8"SEPTEMBER"4"00", 13120020
8"OCTOBER"4"00",8"NOVEMBER"4"00",8"DECEMBER"4"00"), 13120030
PIE~( 8"3.1415926535897932384626433832795028841971693993751058" 13120100
8"209749445923078164062862089986280348253421170679821480" 13120110
8"865132823066470938446095505822317253594081284811174502" 13120120
8"841027019385211055596446229489549303819644288109756659" 13120130
8"334461284756482337867831652712019091456485669234603486" 13120140
8"104543266482133936072602491412737245870066063155881748" 13120150
8"815209209628292540917153643678925903600113305305488204" 13120160
8"665213841469519415116094330572703657595919530921861173" 13120170
8"819326117931051185480744623799627495673518857527248912" 13120180
8"279381830119491298336733624406566430860213949463952247" 13120190
8"371907021798609437027705392171762931767523846748148676" 13120200
8"694051320005681271452635608277857713427577896091736371" 13120210
8"787214684409012249534301465495853710507922796892589235" 13120220
8"420199561121209219608640344181598136297747713099605187" 13120230
8"072113499999983729780499510597317328160963185950244594" 13120240
8"553469083026425223082533446850352619311881710100031378" 13120250
8"387528865875332083814206171776691473035982534904287554" 13120260
8"6873115956286388235378759375195778185778 5321712268066"), 13120270
DICA~(8"MIXSCHJOB PERPCD DIREXP "),% 13124000
DICB~(% 13125000
8"TISTXSES"% PREFIX, NO SUFFIX 13125100
8"DSRMOKILFMULOUFROFUSAXPR"% PREFIX, NO SUFFIX--VALID REPLIES 13125200
8"OLRYPGPBSVRWCL"% SUFFIX, NO PREFIX 13125300
8"TRDRRDSFSOROTC"% SUFFIX, NO PREFIX 13125400
8"LORNTO"% NO PREFIX, SUFFIX OPTIONAL 13125500
8"TFWTWDWMPIEILE"% NO PREFIX, NO SUFFIX 13125600
),% 13125900
MNEMONIC~(8" DKSCODPRPPLPLP CRCPCP MTMTMT ",% BE SURE THESE13131000
8" MT");% ARE CONTIGUOUS 13132000
ARRAY 13133000
MNEMTOUNIT [*],% USED TO OBTAIN PHYS. UNIT NO. FROM UNIT MNEM. 13134000
TYPEINDX[*];% USED TO OBTAIN INDEX INTO MNEMTOUNIT OF LOWEST 13135000
% NUMBERED UNIT OF TYPE I. 13136000
COMMENT THE ARRAYS DICA THROUGH TYPEINDX WILL BE CONVERTED TO 13137000
EBCDIC STRING DESCRIPTORS IN PERIPHERALINITIALIZE. CARE SHOULD BE 13138000
USED WHEN ADDING DECLARATIONS INBETWEEN AND WHEN USING THE 13139000
DESCRIPTORS, SINCE ALL INDEXING WILL BE BY CHARACTERS; 13140000
ARRAY DATE ~(8"1969182TUESDAY, JULY 1, 1969"4"00",0);% 13140100
REAL TODAYSDATE~69182; 13140110
DEFINE FORMATTEDDATEPOINTER = POINTER(DATE,8) + 7 #; 13140150
ARRAY TIME[1];% 13140200
LAYOUT TIMEL ( 47:16,31:16,15:16);% 13140210
BOOLEAN ARRAY OLDSTATUSWORD[*]; % OLD STATUS 13141000
REAL RDLBLP; % READALABEL PROCESS CONTROL WORD 13142000
DEFINE% FOR STATUS, READALABEL 13143000
MAXRDLBLP = 6#,% MAXIMUM # READALABELS 13143010
STATOPM(N)= N&WHOCALLSL(STATMSGSEC)#,% 13143020
NOTREADYMSG(U)= MESSER(STATOPM(0),U)#,% 13143030
UFUMSG(U)= MESSER(STATOPM(1),U)#,% 13143040
PARITYRWLMSG(U)=MESSER(STATOPM(2),U)#,% 13143050
RETMSG(U)= MESSER(STATOPM(3),U)#,% 13143060
PBTONMSG(U)= MESSER(STATOPM(4),U)#,% 13143070
ENDSTATDEF=0#;% 13143990
FIELD RF = 6:6; % READALABEL CONTROL FIELD (0:1-LOCK)13144000
REAL PRGT; % PURGIT PROCESS CONTROL WORD 13145000
FIELD 13146000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13147000
% UNIT TABLE %13148000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%13149000
UNITTYPE = 47:5, 13150000
UNITTYPECNTRF =42:8,% ORDINAL # OF UNIT WITHIN TYPE 13150100
UERRORSTATUSBITS = 34:14,COMMENT COMBINED FIELD FOR ERROR 13151000
AND STATUS BITS; 13152000
UNITERRORFIELD = 30:5, % UNIT ERROR COUNT (USED BY IOFINISH) 13154000
UNITSTATUS =25:5 , COMMENT FIELD INDICATING UNIT STATE-AS13155000
UNITREADY,UNITERROR,UNITBUSY ETC; 13156000
UNITNOTREADY=25:1, COMMENT 1- NOT READY 13157000
0- READY; 13158000
UNITERROR=24:1 , COMMENT IF SET(=1),ERROR ON UNIT; 13159000
UCHANWAITORBUSY=23:3, COMMENT UNIT BUSY OR WAITING FOR A 13160000
CHANNEL; 13161000
UCHANWAIT=23:1, COMMENT UNIT WAITING FOR A CHANNEL; 13162000
UNITIOBUSY=22:2, COMMENT I/O IN PROCESS & UNITBUSY; 13163000
% 01 - AWAITING PRINTER FINISH 13164000
IOINPROCESS=22:1, COMMENT I/O IN PROCESS; 13165000
UNITINPROCESS=22:1, COMMENT UNIT IN PROCESS; 13166000
UNITSTATE = 20:15, % STATE OF UNIT 13167000
UNITRETRY =20:1, COMMENT UNIT BEING RETRIED; 13168000
ULOCKED = 19:1, % UNIT LOCKED 13169000
USAVED = 18:1, % UNIT SAVED 13170000
DENSITYF = 17:3, % DISK TYPE 13171000
USCRATCH = 14:1, % UNIT IS SCRATCH 13172000
UNITASSIGNED = 13:1, % UNIT ASSIGNED TO A USER 13173000
ULABELLED = 12:1, % UNIT LABELLED 13174000
UINREWIND = 11:1, % UNIT REWINDING 13175000
UCLOSEDNOREWIND= 10:1, % UNIT CLOSED WITH NO REWIND 13176000
UTOBEPURGED = 9:1, % UNIT CLOSED WITH PURGE 13177000
UWRITERING = 8:1, % WRITE RING 13178000
UNITMPXD =5:4, COMMENT MPXDESIGNATOR FOR THE UNIT; 13179000
UNITMPXI =1:1; COMMENT MPXINDICATOR FOR THE UNIT; 13180000
COMMENT =0:1 RESERVED FOR UNITNOLOCK; 13181000
LAYOUT UNITL(UNITNOTREADY,19:2,14:3,UINREWIND); 13182000
REAL 13183000
MAXUNIT, COMMENT MAXIMUM UNIT NO ON THE SYSTEM. UNIT13187000
NO ASSIGNED TO PSEUDO CARD READER IS 13188000
MAXUNIT + 1; 13189000
MINUNIT ~ - 1; COMMENT MINIMUM UNIT ON SYSTEM; 13190000
INTEGER MAXPSEUDOUNIT, COMMENT MAXIMUM UNIT FOR PSEUDO 13191000
CARD READERS - IT IS EQUAL TO 13192000
MAXUNIT + NO. OF PSEUDO CARD 13193000
READERS; 13194000
UBITSTABLESIZE; COMMENT SIZE = HIGHEST WHOLE NO. 13195000
OF MAXPSEUDOUNITS/48; 13196000
FIELD RDMEMADDR=47:20, COMMENT MEMORY ADDRESS FIELD OR RESULT DESC;13198000
RDCHRCNT =27:3 , COMMENT CHARACTER COUNT FIELD OF R.D.; 13199000
RDUNUMERR=24:25,% BOTH UNIT NUMBER AND ERROR FIELD. 13200000
RDUNITNO =24:8 , COMMENT UNIT NO. FIELD IN RESULT DESC.; 13201000
RDERROR =16:17, COMMENT RESULT DESCRIPTOR ERROR FIELD; 13202000
RDSTNDERROR=6:7, COMMENT STANDARD ERROR FIELD OF R.D.; 13203000
RDATTNEXCP=1:2, % ATTENTION EXCEPTION BITS 13204000
RDEXCEPTION=0:1, % HARDWARE EXCEPTN13205000
RDATTENTION=1:1, % SOFTWARE ATTNTN 13206000
RDBIT432 =4:3, COMMENT UNITUSABLE BITS; 13207000
RDBUSY =2:1, COMMENT BUSY; 13208000
RDNOTREADY =3:1, COMMENT NOT READY; 13209000
RDERRORBIT =4:1, COMMENT DESCRIPTOR ERROR; 13210000
RDMEMADDRBIT =5:1, COMMENT MEMORY ADDRESS ERROR; 13211000
RDMEMPARITY =6:1, COMMENT MEMORY PARITY ERROR; 13212000
RDUNITERROR=15:9, COMMENT UNIT ERROR FIELD OF R. D. ; 13213000
RDMEMACCESS =7:1, COMMENT MEMORY ACCESS ERROR; 13214000
RDENDOFTAPE =8:1, COMMENT END OR BEGINNING OF TAPE; 13215000
RDLOWPAPER= 8:1, % LOW PAPER 13216000
RDWLOOREOF =9:1, COMMENT WRITE LOCK-OUT OR END OF FILE;13217000
RDCNTRLCARD =10:1,COMMENT CONTROL CARD; 13218000
RDINCREC = 10:1, % INCOMPLETE RECORD 13219000
RDDENSITY = 11:2, % DENSITY IN RD AFTER TEST 13220000
RDOVERFLOW =11:1,COMMENT EXCEED WORD COUNT; 13221000
RDCRCCORRECT =12:1,COMMENT CRC CORRECTION; 13222000
RDNONPRESENT =13:1,COMMENT NON-PRESENT; 13223000
RDREWINDING =14:1,COMMENT REWINDING; 13224000
RDBLANKTAPE =15:1,COMMENT BLANK TAPE; 13225000
RDMEMPROTECT =16:1;COMMENT MEMORY PROTECT ERROR; 13225500
FIELD RDDISKFILETYPEF= 11:2; 13226000
COMMENT 1C-5 = 0 13227000
1A-X = 1 13228000
1C-3 = 2 13229000
1C-4 = 3; 13230000
COMMENT 1A-X = 0 ALSO, BUT ONLY ON 101, I HOPE; 13231000
FIELD SLCNTRDY = 15:1; COMMENT SINGLE LINE CONTROL TIMEOUT; 13232000
FIELD CONSOLEIDF = 14:3; 13232100
FIELD COMMENT I/O CONTROL WORD FIELDS; 13233000
IOSTANDARDFIELD =45:10, 13234000
IOATTENTION =45:1, 13235000
IOREADBIT =44:1, 13236000
IOMEMINHIBIT =43:1, 13237000
IOMODE =42:2, 13238000
IOTRANSLATE =42:1, 13239000
IOFRAMESIZE =41:1, 13240000
IOMEMPROTECT =40:1, 13241000
IOBACKWARD =39:1, 13242000
IOTESTBIT =38:1, 13243000
IOTRANSFERTAG =37:1, 13244000
IOFORCETAG =36:1, 13245000
IOUNITFIELD =35:36; 13246000
FIELD ADDRESS =19:20, 13247000
USTATUSVECTORNO=11:3, COMMENT EACH VECTOR NO REPRESENTS 13248000
READY STATUS OF 32 UNITS; 13249000
MPXDESIGNATOR = 4:4, COMMENT MPXA(=1), MPXB(=2), ETC; 13250000
MPXINDICATOR = 0:1, COMMENT 0 MEANS INTERROGATE ALL MPXS 13251000
1 MEANS INTERROGATE THE ONE 13252000
SPECIFIED BY MPXDESIGNATOR; 13253000
UNITNO =16:8, COMMENT NOTE-UNITNO WITH UNIT STATUS 13254000
VECTOR NO PRECEEDING MAKES UNITNOS 13255000
FROM 0 TO 255; 13256000
BUFFERLENGTH =39:20, COMMENT BUFFER LENGTH IN AREA DESC.; 13257000
SIGNBITF=46:1, 13260000
DIV4E = 47:46,% 13260100
MOD4F = 1:2,% 13260200
DIV2F = 47:47,% 13260300
MOD2F = 0:1,% 13260400
FIRSTCHRF =47:6, COMMENT FIELD FOR FIRST CHARACTER; 13261000
CONTROLFIELD =8:4; COMMENT CONTROL FIELD FOR VARIOUS 13262000
SCAN IN FUNCTIONS; 13263000
DEFINE IOCBSIZE =6#, % SIZE OF IOCB 13263100
% INDICES OF ITEMS IN IOCB 13263200
USERINDEX =0#, 13263300
MISCINDEX =1#, 13263400
AREADESCINDEX =2#, 13263500
EVENTINDEX =3#; 13263600
COMMENT FIELDS FOR USER WORD OF IOCB; 13264000
FIELD IDNO =47:10, COMMENT USER IDENTIFICATION NO.; 13265000
PRIORITYF =37:5 , COMMENT CONTAINS PRIORITY; 13266000
UNITNOF =32:9 , COMMENT CONTAINS LOGICAL UNIT NO.; 13267000
IOERRORRECOVERY= 23:1, % I/O RECOVEIQ09N PROCESS FOR THIS I/O13268000
USERIOFIELD =22:10, % FIELD FOR USER I/O ACTION 13269000
USERPARITYBIT =22:1, % PARITY ACTION TO BE TAKEN BY USER 13269200
USEREOFORTBIT =21:1, % END OF FILE OR END OF TAPE ACTION 13269400
USERIOFINISH =20:1, % USER I/O FINISHED 13269600
USERSPECIALID =19:1 , % SPECIAL ACTION TO BE TAKEN 13269800
USERIOBIT =18:1; % USER I/O 13270000
COMMENT FIELDS FOR MISC WORD OF IOCB; 13270100
FIELD 13270200
WORDCOUNTF =47:20, % WORD COUNT FIELD 13270300
COMMENT RDCHRCNT =27:3, CHARACTER COUNT FIELD; 13270400
COMMENT RDUNITNO =24:8, UNIT NUMBER; 13270500
IOERRORMASKFIELD =16:17; % FOR MASKING I/O ERRORS IN 13270600
% IOFINISH 13270700
COMMENT AFTER SUCCESSFUL IOFIMISH , IOERRORMASKFIELD CONTAINS 13270800
ERROR FIELD (AFTER MASKING) OF RESULT DESCRIPTOR; 13270850
COMMENT ADDITIONAL FIELDS HAVE BEEN ADDED TO USERL. PRESENT REFERENCES13270880
TO USERL WILL NOT BE AFFECTED,FOR USING ADDITIONAL FIELDS 13270900
NEW LAYOUT MAY BE NECESSARY; 13270950
LAYOUT IOPATHWORD(UNITNO,MPXDESIGNATOR,MPXINDICATOR), 13271000
COMMENT WORD USED FOR INTERROGATING I/O PATH; 13272000
USTATUSWORD(USTATUSVECTORNO, 8:4~1,MPXDESIGNATOR,MPXINDICATOR),13273000
COMMENT WORD USED FOR INTERROGATING PERIPHERAL 13274000
STATUS; 13275000
UNITINITIALIZE (UNITTYPE, UNITMPXD, UNITMPXI), 13276000
COMMENT TO INITIALIZE UNIT TABLE; 13277000
BINEL (47:8), 13278000
TYPEINTERROGATE(UNITNO, 13279000
CONTROLFIELD ~6, 13280000
MPXDESIGNATOR, 13281000
MPXINDICATOR), 13282000
COMMENT TO INTERROGATE TYPE (AND PATH) AT 13283000
INITIALIZE TIME.; 13284000
BITL( BIT47=47:1, BIT46=46:1, BIT45=45:1, BIT44=44:1, 13285000
BIT43=43:1, BIT42=42:1, BIT41=41:1, BIT40=40:1, 13286000
BIT39=39:1, BIT38=38:1, BIT37=37:1, BIT36=36:1, 13287000
BIT35=35:1, BIT34=34:1, BIT33=33:1, BIT32=32:1, 13288000
BIT31=31:1, BIT30=30:1, BIT29=29:1, BIT28=28:1, 13289000
BIT27=27:1, BIT26=26:1, BIT25=25:1, BIT24=24:1, 13290000
BIT23=23:1, BIT22=22:1, BIT21=21:1, BIT20=20:1, 13291000
BIT19=19:1, BIT18=18:1, BIT17=17:1, BIT16=16:1, 13292000
BIT15=15:1, BIT14=14:1, BIT13=13:1, BIT12=12:1, 13293000
BIT11=11:1, BIT10=10:1, BIT9 = 9:1, BIT8 = 8:1, 13294000
BIT7 = 7:1, BIT6 = 6:1, BIT5 = 5:1, BIT4 = 4:1, 13295000
BIT3 = 3:1, BIT2 = 2:1, BIT1 = 1:1, BIT0 = 0:1), 13296000
DIVMOML(PCBITSF~0,ADDRESSF~0), 13297010
IOL(BL=39:20,FL=19:20), 13297020
IOLINKL(NUMRECSLNK=47:16,BCKWRDLNK=31:16,FRWRDLNK=15:16), 13297030
SCANINWORD(CONTROLFIELD,MPXDESIGNATOR,MPXINDICATOR), 13298000
COMMENT CONTROL WORD USED FOR VARIOUS SCAN IN FUNCTIONS; 13299000
SCANOUTWORD(CONTROLFIELD,MPXDESIGNATOR,MPXINDICATOR), 13299100
COMMENT SCAN OUT CONTROL WORD; 13299200
RDLBL(PNO=19:8,PTP=11:4,UNO=7:8), % READALABL LAYOUT13300000
IOCWDISKL(REPORTF=35:4,DECADDRF=27:28), 13301000
COMMENT UNIT FIELD OF IOCW FOR DISK; 13302000
IOCWPRINTERL(SKIPF=35:4,SPACEF=31:2), COMMENT FOR MAKING 13303000
UNIT FIELD OF IOCW FOR PRINTER; 13304000
IOCWTAPEL(FUNCTIONF=35:2,BPISPECF=33:1,BPIF=32:2, 13305000
PARITYF=30:1,CRCSPECF=29:1,CRCTRACK=28:3), 13306000
COMMENT FOR MAKING UNIT FIELD OF IOCW FOR TAPE; 13307000
COMMENT TO MAKE UP A DESCRIPTOR; 13308000
IOCWL(IOSTANDARDFIELD,IOUNITFIELD), COMMENT TO FORM IOCW; 13309000
IOCWDETAILL(IOATTENTION,IOREADBIT,IOMODE,IOUNITFIELD), 13310000
COMMENT FOR SETTING UP IOCW FOR DIFF. RECORDING MODE;13311000
IOCWSPACEL(IOSTANDARDFIELD~@600,39:1,23:16) 13312000
, COMMENT TO MAKE UP TAPE SPACE ; 13313000
TAPEIOCWL(IOREADBIT,IOTRANSLATE,IOFRAMESIZE,33:3,PARITYF), 13313010
PRINTIOCWL(IOREADBIT~0,IOTRANSLATE,IOFRAMESIZE,SKIPF,SPACEF), 13313020
PPRTIOCWL(IOREADBIT,IOTRANSLATE,IOFRAMESIZE,IOMEMPROTECT, 13313030
FUNCTIONF), 13313040
MISCL (SIGNBITF~1,IOERRORMASKFIELD), 13314000
IOERRORMASKL(BUFFERLENGTH,ADDRESS), 13315000
COMMENT TO MAKE UP IOERRORMASK FOR WAITIO; 13316000
USERL(IDNO,PRIORITYF,UNITNOF,IOERRORRECOVERY); 13317000
COMMENT TO FORM USER WORD FOR IOCB; 13318000
REAL 13319000
MAXVECTORNO; COMMENT MAXIMUM VECTOR NO; 13321000
DEFINE TIMEOFDAYWORD=96 #; COMMENT CONTROL WORD FOR SETTING & 13324000
READING TIME OF DAY; 13325000
DEFINE BASICCLOCKUNIT = 2.4 # % BASIC UNIT TOD CLOCK 13326000
, ONESECOND = 416667 # % NUMBER OF BASIC UNITS13327000
% IN ONESECOND(ACTUALLY13328000
% IN 1.0000008 SECONDS)13329000
13330000
, REARRANGETIME = 416667 # % NUMBER OF BASIC UNITS13331000
% BETWEEN RE-ARRANGING 13332000
% READYQ 13333000
; 13334000
DEFINE COMMENT DEFINES FOR UNIT TYPES-(REF FIELD UNITTYPE); 13335000
NOUNIT =0#, 13336000
DISKFILE =1#, 13337000
CONN = 2#, 13338000
SPO = CONN#,% SPO IS HOLD-OVER FROM B5500. 13339000
PAPERTAPERDR =4#, COMMENT PAPER TAPE READER; 13340000
PAPERTAPEPNCH =5#, COMMENT PAPER TAPE PUNCH; 13341000
BUFFPRINTER =6#, COMMENT LINE PRINTER I BUFFERED; 13342000
UNBUFFPRINTER =7#, COMMENT LINE PRINTER IIUNBUFFERED; 13343000
CARDREADER =9#, 13344000
CARDPUNCH1 =10#, COMMENT CARD PUNCH I; 13345000
CARDPUNCH2 =11#, COMMENT CARD PUNCH II ; 13346000
MAGTAPE1 =13#, COMMENT MAGNETIC TAPE I(7 TRACK); 13347000
MAGTAPE2 =14#, COMMENT MAGNETIC TAPE II (9 TRACK); 13348000
MAGTAPE3 = 15#, COMMENT MAGNETIC TAPE III (9 TRACK); 13349000
MAGTAPCLUSTER1= 29#,% MAGNETIC TAPE CLUSTER I (7 TRACK) 13350000
MAGTAPCLUSTER2= 30#,% MAGNETIC TAPE CLUSTER II (9 TRACK) 13351000
MAGTAPCLUSTER3= 31#,% MAGNETIC TAPE CLUSTER III (9 TRACK) 13352000
MAGTAPE(TYPE) = (TYPE } 13 AND TYPE { 15 OR TYPE } 29) #; 13353000
DEFINE MAXUNITTYPE = 31 #; 13353100
13354000
DEFINE% FOR KEYIN AND ASSOCIATED PROCEDURES 13355000
POINTTOMSGAREA= POINTER(MSGAREA[1],BYTESZ)#, 13356000
MCP = 0#, 13357000
KEYINQSZ = 2#, 13358000
INVKBDSZ = 2#, 13359000
JFACTOR = INVKBDSZ+3#, 13360000
TI(X) = REAL(POINTER(TYPEINDX[X], *), 1) #, 13361000
UNITBL(U1,U2) = REAL(POINTER(MNEMTOUNIT[U1+U2-1],*),1)#, 13362000
CLEAR(P,B) = REPLACE P BY B" " FOR B WORDS#,% 13363000
ETX = 48"03"#,% 13364000
BLANK = 8" "#,% 13366000
CLEARSCREEN = 48"0C0000" #, 13367000
LINEERASE = 48"00110000"#,% 13368000
REVERSELF = 48"00130000"#,% 13369000
HOME = 48"3C00"#,% 13370000
CARRETURN = 48"0D0000"#,% 13371000
LINEFEED = 48"2500"#,% 13372000
COLON = 8":"#,% 13373000
EQUAAL = 8"="#,% 13374000
AT = 8"@"#,% 13375000
SLASH = 8"/"#,% 13376000
PERIOD = 8"."#,% 13377000
COMMA = 8","#,% 13377100
QUESTION = 48"6F"#,% 13378000
BACKSPACE = 48"1600"#,% 13379000
NUL = 48"00"#,% 13379900
ZERO = 8"0"#,% 13380100
DISPLAYONMIX = DISPLAYONKEYER#, 13381000
DISPLAYONPER = DISPLAYONKEYER#, 13382000
DISPLAYONKEYER= SCREEN[2]#, 13383000
DISPLAYONCON = DISPLAYONKEYER#, 13384000
NOOFSCREENSRQD= 4#, 13385000
MNEMLIM = 14#, 13386000
MNEMSZ = 2#, 13387000
BUFFS = 6#, 13388000
CHRS = 6#, 13389000
BYTESZ = 8#, 13390000
RUSER(U) = 0&USERL(,,U,)#, 13391000
RIOCW = 0&IOCWL(@440)#,% 13392000
RERRMSK = @116001#, 13393000
WIOCW = 0%IOCWL(#40)#,% 13394000
WUSER(U) = 0%USERL(*,*,U,*)#, 13395000
WERRMSK = @110001#, 13396000
RDTIMEOUT = RDBLANKTAPE#, 13397000
DATEIS = 8"DATE IS "#,% 13398100
TIMEIS = 8"TIME IS "#,% 13398200
MAXMSGSZ = 1000#, 13399000
LINESZ = 40#,% 13400000
SCREENSZ = 960#,% 13400100
MAXPGS = 2#,% 13400200
MAXLNS = 20#,% 13401000
DICASZ = 3#, 13402000
MAXDICA = 24#, 13403000
DICBSZ = 2#, 13404000
MAXDICB = 102#, 13405000
MIN(A,B) = (IF A{B THEN A ELSE B)#, 13406000
INPUT(IOCW) = BOOLEAN(IOCW.IOREADBIT)#, 13407000
TIMEDOUT = BOOLEAN(RSDS.RDTIMEOUT)#,% 13407100
INTEVNTARY(S,D,L) = 13408000
REPLACE POINTER(D) BY POINTER(S) FOR 2|(L-1) OVERWRITE#, 13409000
USINGSTACK(S) = NOT STACKVECTOR[S] IS 0&DATADESCRIPTOR()#,% 13410000
MCPNOTUSINGSTACK(S)=STACK[S,FIRSTMSCWPLACE].STKMRF!0#,% 13410100
D2STACKIS(S) = STACK[S,PROCESSNATUREPLACE].PROCESSHISTORYF!0#,13410200
HAVENTSUSPENDED(S)=WORDSTACK[S,REPLYEVENTPLACE].TAG=0 OR% 13410300
BOOLEAN(M[STACK[S,REPLYEVENTPLACE]])#, 13410302
JOBREF(S) = WORDSTACK[S,JOBIDPLACE]#,% 13410400
KFPSCRATCHWORDSZ= 1#,% 13428000
LEAP(Y) = Y.MOD4F=0 AND(Y MOD 100!0 OR(Y MOD 400=0 AND 13428100
Y MOD 4000!0))#, 13428102
DAY = 8"DAY, "#,% 13428200
JULDATESZ = 7#,% 13428300
13428400
STARTYEARPLACE= 0#,% 13428500
STARTDAYPLACE = 4#,% 13428600
YEARSZ = 4#,% 13428700
DAYSZ = 3#,% 13428800
BASEYEAR = 1700#,% 13428900
PERCENTAGE(X) = X DIV 10 FOR 2 DIGITS,PERIOD,% 13431000
X MOD 10 FOR 1 DIGITS#,% 13432000
TIMECORRFACT = 2400#,% ::= (2.4|10@6)/10@3 GIVING SECONDS 13433000
DIV2(X) = REAL(BOOLEAN(X)AND NOT BOOLEAN(3))#,% 13433100
DEFINEND=0#; 13434000
DEFINE 13435000
% FOR READALABEL AND PURGIT 13436000
USAH = 0&USERL(,,U,)#, 13437000
SCHANNEL = UNT.UNITTYPE=13#, 13438000
NCHANNEL = NOT SCHANNEL#, 13439000
ERAH(M,S) = 0&IOERRORMASKL(M,S)#, 13440000
UNEXP = 3"377635"#, 13441000
TAPETEST = 4#, 13442000
TAPEPARITY=BOOLEAN(RSLT.RDMEMACCESS)AND RSLT.RDDENSITY=3#,13444000
GETUNT = WHILE BOOLEAN(UNT~READLOCK(1,UNIT[U])) DO#, 13445000
PUTUNT(A,B,C,D)=GETUNT;UNIT[U]~UNT&UNITL(A,B,C,D)#, 13446000
GETOLDS = OLDSTATUS~OLDSTATUSWORD[VECTORNO]; 13447000
% KLUDGE 13448000
OLDSTATUSWORD[VECTORNO]~OLDSTATUS AND NOT 13449000
BOOLEAN(BITWORD)#, 13450000
RD432 = RDBIT432#, 13451000
PHDR1 = PVOL1#, 13452000
PHDR2 = PVOL1#, 13453000
RCRDFRMT = IF TAPETYPE=1 THEN 13454000
IF URF=6"F"THEN 0 ELSE IF URF=6"D"THEN 1 13455000
ELSE IF URF=6"V"THEN 2 ELSE 13456000
IF URF=6"I"THEN 4 ELSE IF URF=6"L"THEN 5 13457000
ELSE IF URF=6"Z"THEN 6 ELSE 3 13457050
ELSE 13458000
IF URF=8"F"THEN 0 ELSE IF URF=8"D"THEN 1 13459000
ELSE IF URF=8"V"THEN 2 ELSE 13460000
IF URF=8"I"THEN 4 ELSE IF URF=8"L"THEN 5 13461000
ELSE IF URF=8"Z"THEN 6 ELSE 3#, 13461050
WERRORS = BOOLEAN(@260201)#; 13462000
COMMENT DECLARATIONS FOR QUEUES OF I/O REQUESTS WAITING FOR UNIT 13463000
ONE QUEUE FOR EACH UNIT; 13464000
ARRAY DUMMYIOQUE[*]; COMMENT FOR MAKING ENTRY IN IOQUE; 13465000
DEFINE FIRSTIOU=FIRSTIO[INDEX]#, COMMENT INDEX IS QUEUE HEAD INDEX; 13466000
LASTIOU=LASTIO[INDEX]#; 13467000
QUEUE ARRAY IOQUE:FIRSTIO[*](USER,MISC,AREADESC,EVNT: 13468000
PRVSIO,NEXTIO); 13469000
VALUE USER,MISC,AREADESC, 13470000
PRVSIO,NEXTIO; 13471000
REAL USER,MISC; 13472000
EVENT EVNT; 13473000
REFERENCE PRVSIO,NEXTIO,AREADESC; 13474000
USING 13475000
ALLOCATE IS REFERENCE(DUMMYIOQUE & 13476000
ARRAYDESCL(3, 6, GETAREA(6))): 13477000
NEXT IS NEXTIO @ FIRSTIO[INDEX]: 13478000
TO INSERT, COMMENT QUEUE IS ARRANGED ON A FIRST COME FIRST 13479000
BASIS; 13480000
BEGIN 13481000
IF LASTIOU=NULL THEN COMMENT QUEUE IS EMPTY; 13482000
BEGIN 13483000
LASTIOU~FIRSTIOU~ENTRY; COMMENT ENTRY IS THE ADDRESS OF 13484000
DESC. POINTING TO DATA OF NEW 13485000
ENTRY; 13486000
NEXTIO@(FIRSTIOU)~PRVSIO @(FIRSTIOU)~ NULL; 13487000
END ELSE 13488000
BEGIN COMMENT PUT ENTRY AT TAIL OF QUEUE; 13489000
PRVSIO @(ENTRY)~ LASTIOU; 13490000
NEXTIO @(LASTIOU)~ENTRY; 13491000
LASTIOU ~ENTRY; 13492000
NEXTIO @(ENTRY)~NULL; 13493000
END; 13494000
END INSERTION OF ENTRY IN QUEUE: 13495000
TO DELINK, 13496000
BEGIN 13497000
IF ENTRY=FIRSTIOU THEN COMMENT ENTRY IS THE TOP OF QUEUE; 13498000
IF FIRSTIOU=LASTIOU THEN COMMENT ONLY ONE ENTRY IN QUEUE; 13499000
FIRSTIOU ~ LASTIOU ~NULL ELSE 13500000
BEGIN COMMENT REMOVES ENTRY FROM TOP; 13501000
FIRSTIOU ~NEXTIO @ FIRSTIOU; 13502000
PRVSIO @(FIRSTIOU) ~ NULL; 13503000
END ELSE 13504000
IF ENTRY=LASTIOU THEN COMMENT REMOVES LAST ENTRY OF QUEUE; 13505000
BEGIN 13506000
LASTIOU~PRVSIO @ ENTRY; 13507000
NEXTIO @(LASTIOU)~ NULL; 13508000
END ELSE COMMENT REMOVES ANY OTHER ENTRY; 13509000
BEGIN 13510000
COMMENT FIX NEXTIO POINTER IN THE UPPER LINK OF ENTRY; 13511000
NEXTIO @(PRVSIO @ ENTRY)~ NEXTIO @ ENTRY; 13512000
COMMENT FIX PRVSIO POINTER IN THE LOWER LINK OF ENTRY; 13513000
PRVSIO @(NEXTIO @ ENTRY)~ PRVSIO @ ENTRY; 13514000
END; 13515000
END DELINKING OF ENTRY FROM QUEUE; 13516000
COMMENT DECLARATIONS FOR QUEUES OF UNITS WAITING FOR CHANNEL. 13517000
ONE QUEUE FOR EACH MPX; 13518000
ARRAY DUMMYWAITCHANNELQUE[*]; COMMENT FOR MAKING ENTRY IN 13519000
WAITCHANNELQUE; 13520000
REFERENCE ARRAY LASTUNIT[*]; COMMENT POINTS TO LAST ENTRY IN 13521000
WAITCHANNELQUE; 13522000
DEFINE FIRSTUNITI=FIRSTUNIT[INDEX]#, COMMENT INDEX-QUEUE HEAD INDEX; 13523000
LASTUNITI=LASTUNIT[INDEX]#; 13524000
QUEUE ARRAY WAITCHANNELQUE:FIRSTUNIT[1](UNTWORD:PRVSUNIT,NEXTUNIT); 13525000
VALUE UNTWORD,PRVSUNIT,NEXTUNIT; 13526000
REAL UNTWORD; 13527000
REFERENCE PRVSUNIT,NEXTUNIT; 13528000
USING 13529000
ALLOCATE IS REFERENCE(DUMMYWAITCHANNELQUE & 13530000
ARRAYDESCL(,3,GETAREA(3))): 13531000
NEXT IS NEXTUNIT @ FIRSTUNIT[INDEX]: 13532000
TO INSERT, COMMENT QUEUE IS ARRANGED ON A FIRST COME FIRST 13533000
BASIS; 13534000
BEGIN 13535000
IF LASTUNITI=NULL THEN COMMENT QUEUE IS EMPTY; 13536000
BEGIN 13537000
LASTUNITI~FIRSTUNITI~ENTRY; COMMENT ENTRY IS THE ADDRESS 13538000
OF DESC. POINTING TO DATA OF 13539000
NEW ENTRY; 13540000
NEXTUNIT @(FIRSTUNITI)~PRVSUNIT @(FIRSTUNITI) ~NULL; 13541000
END ELSE 13542000
BEGIN COMMENT PUT ENTRY AT TAIL OF QUEUE; 13543000
PRVSUNIT @(ENTRY)~ LASTUNITI; 13544000
NEXTUNIT @(LASTUNITI) ~ ENTRY; 13545000
LASTUNITI ~ ENTRY; 13546000
NEXTUNIT @ (ENTRY) ~NULL; 13547000
END; 13548000
END INSERTION OF ENTRY IN WAITCHANNELQUE: 13549000
TO DELINK, 13550000
BEGIN 13551000
IF ENTRY=FIRSTUNITI THEN COMMENT ENTRY IS THE TOP OF QUEUE; 13552000
IF FIRSTUNITI=LASTUNITI THEN COMMENT ONLY ONE ENTRY IN QUEUE;13553000
FIRSTUNITI~LASTUNITI~NULL ELSE 13554000
BEGIN COMMENT REMOVE ENTRY FROM TOP; 13555000
FIRSTUNITI ~ NEXTUNIT @ FIRSTUNITI; 13556000
PRVSUNIT @ (FIRSTUNITI) ~ NULL; 13557000
END ELSE 13558000
IF ENTRY=LASTUNITI THEN COMMENT REMOVE LAST ENTRY OF QUEUE; 13559000
BEGIN 13560000
LASTUNITI ~ PRVSUNIT @ ENTRY; 13561000
NEXTUNIT @(LASTUNITI)~NULL; 13562000
END ELSE COMMENT REMOVES ANY OTHER ENTRY; 13563000
BEGIN 13564000
COMMENT FIX NEXTUNIT POINTER IN THE UPPER LINK OF ENTRY; 13565000
NEXTUNIT @(PRVSUNIT @ ENTRY) ~ NEXTUNIT @ ENTRY; 13566000
COMMENT FIX PRVSUNIT POINTER IN THE LOWER LINK OF ENTRY; 13567000
PRVSUNIT @(NEXTUNIT @ ENTRY) ~ PRVSUNIT @ ENTRY; 13568000
END; 13569000
FORGETAREA(3,WORD(ENTRY).ADDRESS); 13570000
END DELINKING OF ENTRY FROM QUEUE; 13571000
13572000
EVENT TIMERINTERRUPTEVENT, 13573000
STATUSEVENT, COMMENT EVENT CAUSED AFTER EACH STATUS RUN; 13574000
ERRORFLAGEVENT; 13575000
COMMENT GLOBALS FOR DISK MANAGEMENT; 14000000
REAL MCPTOP; COMMENT THE HIGHEST DISKADDRESS OF THE MCP CODE FILE; 14000100
DEFINE MCPINFOSIZE = 60 #; COMMENT SIZE IN WORDS OF DISK INFO; 14001000
ARRAY MCPINFO[MCPINFOSIZE]; COMMENT WE WILL STUFF THE DISK ADDRESS OF 14002000
THE INFO SEGMETNS IN THE DESCRIPTOR SO THAT14002010
PRESENCEBIT WILL READ IT IN FOR US IF 14002020
IT IS NOT PRESENT; 14002030
REAL NEXTADDR, LASTADDR, NEXTROW, FIRSTADDR, MAXADDR, 14002040
DIRECTORYCOMPLEMENTREPORTBACK; 14002050
BOOLEAN PERIPHERALINVALIDADDRESS = DIRECTORYCOMPLEMENTREPORTBACK; 14002060
COMMENT THE ABOVE ARE USED IN BUILDING THE DISK TABLES AND CAN BE 14003000
RE-USED ONCE PERIPHERALINITIALIZE HAS EXITED; 14004000
BOOLEAN PROCEDURE GIVEBACKDISK(DKADDR, SIZE); 14005000
VALUE DKADDR, SIZE; 14006000
REAL DKADDR, SIZE; FORWARD; 14007000
ARRAY DISKMAPARRAY[*,*]; %USED FOR DISK TABLE BUILDING 14008000
DEFINE LLLROWS = 10 #, %THE NUMBER OF ROWS FOR THE ABOVE 14009000
LLLCHUNK = 100 #; %THE ROW SIZE OF THE ABOVE; 14010000
COMMENT THE CELL FOR DISKMAPARRAY IS AVAILABLE AFTER DISKMAPING; 14011000
COMMENT DECLARATIONS FOR USER DISK MANAGEMENT; 14012000
COMMENT FIELD DEFINES FOR USERDISK TABLE; 14013000
FIELD 14014000
DISKADDRF=19:20, COMMENT DISK ADDRESS; 14020000
EUNOF = 27:8; COMMENT UNIT NUMBER OF EU; 14021000
LAYOUT DISKADDRESSL(EUNOF, DISKADDRF); 14025000
LAYOUT FIRSTMAPWORD ( 14026000
MAPUNITNOF = 47:8 14027000
, MAPADDRESSF = 39:20 14028000
, ADDRESSF 14029000
) 14030000
, FIRSTMAPWORDRIME( 14031000
MAPAREAF = 47:28 14032000
, ADDRESSF 14033000
) 14034000
; 14035000
SAVE ARRAY NEXTEU[3]; COMMENT ONE WORD FOR EACH DISK DENSITY; 14035100
ARRAY USERDISKLIST[*,*], % ROW SIZE MUST BE EVEN 14036000
USERDISKDOPEVECTOR = USERDISKLIST [*], %DOPE VECTOR OF ABOVE 14036500
GETUSERDISKHEAD[*], % SIZE IS NUMBER OF ROWS IN 14037000
FORGETUSERDISKHEAD[*]; % USERDISKLIST 14038000
INTERLOCK USERDISKLOCK; 14039000
DEFINE DISKRETURNLOCK = HEADERLOCKS[1] #, 14039100
EUFACTOR = 2 #, 14039150
USERDISKLISTROWSIZE = 30 #; 14039160
LAYOUT USERDISKHEADWORD( 14041000
USERDISKINDEXF = 47:20 14042000
, EUNOF 14043000
, ADDRESSF 14044000
) 14045000
, DISKAREAWORDL( 14046000
DISKAREASIZEF = 47:20 14047000
, DISKADDRESSF = 27:28 14048000
) 14049000
; 14050000
VALUE ARRAY DISKFILE1C5 := ( % DISK TYPE MOD SWITCH 14051000
0 % 1C-5 0 0 14052000
, 25200 % 1C-5 0 1 14053000
, 50400 % 1C-5 0 2 14054000
, 75600 % 1C-5 0 3 14055000
, 100800 % 1C-5 1 0 14056000
, 126000 % 1C-5 1 1 14057000
, 151200 % 1C-5 1 2 14058000
, 176400 % 1C-5 1 3 14059000
, 201600 % 1C-5 2 0 14060000
, 226800 % 1C-5 2 1 14061000
, 252000 % 1C-5 2 2 14062000
, 277200 % 1C-5 2 3 14063000
, 302400 % 1C-5 3 0 14064000
, 327600 % 1C-5 3 1 14065000
, 352800 % 1C-5 3 2 14066000
, 378000 % 1C-5 3 3 14067000
, 403200 % 1C-5 4 0 14068000
, 428400 % 1C-5 4 1 14069000
, 453600 % 1C-5 4 2 14070000
, 478800 % 1C-5 4 3 14071000
, 503000 % 1C-5 5 0 14072000
), 14073000
DISKFILE1AX := ( % DISK TYPE MOD SWITCH 14074000
0 % 1A-X 0 0 14075000
, 12500 % 1A-X 0 1 14076000
, 25000 % 1A-X 0 2 14077000
, 37500 % 1A-X 0 3 14078000
, 50000 % 1A-X 1 0 14079000
, 62500 % 1A-X 1 1 14080000
, 75000 % 1A-X 1 2 14081000
, 87500 % 1A-X 1 3 14082000
, 100000 % 1A-X 2 0 14083000
, 112500 % 1A-X 2 1 14084000
, 125000 % 1A-X 2 2 14085000
, 137500 % 1A-X 2 3 14086000
, 150000 % 1A-X 3 0 14087000
, 162500 % 1A-X 3 1 14088000
, 175000 % 1A-X 3 2 14089000
, 187500 % 1A-X 3 3 14090000
, 200000 % 1A-X 4 0 14091000
, 212500 % 1A-X 4 1 14092000
, 225000 % 1A-X 4 2 14093000
, 237500 % 1A-X 4 3 14094000
, 250000 % 1A-X 5 0 14095000
), 14096000
DISKFILESIM := ( % DISK TYPE MOD SWITCH 14097000
0 % SI-M 0 0 14098000
,0,0,0 COMMENT FILLER TO MAKE IT WORK LIKE THE REST OF THEM; 14098100
, 1250 % SI-M 0 1 14099000
), 14100000
DISKFILE1C3 := ( % DISK TYPE MOD SWITCH 14101000
0 % 1C-3 0 0 14102000
, 27600 % 1C-3 0 1 14103000
, 55600 % 1C-3 0 2 14104000
, 83400 % 1C-3 0 3 14105000
, 111200 % 1C-3 1 0 14106000
, 139000 % 1C-3 1 1 14107000
, 166800 % 1C-3 1 2 14108000
, 194600 % 1C-3 1 3 14109000
, 222400 % 1C-3 2 0 14110000
, 250200 % 1C-3 2 1 14111000
, 278000 % 1C-3 2 2 14112000
, 305800 % 1C-3 2 3 14113000
, 333600 % 1C-3 3 0 14114000
, 361400 % 1C-3 3 1 14115000
, 389200 % 1C-3 3 2 14116000
, 417000 % 1C-3 3 3 14117000
, 444800 % 1C-3 4 0 14118000
, 472600 % 1C-3 4 1 14119000
, 500400 % 1C-3 4 2 14120000
, 528200 % 1C-3 4 3 14121000
, 556000 % 1C-3 5 0 14122000
), 14123000
DISKFILE1C4 := ( % DISK TYPE MOD SWITCH 14124000
0 % 1C-4 0 0 14125000
, 31800 % 1C-4 0 1 14126000
, 63600 % 1C-4 0 2 14127000
, 95400 % 1C-4 0 3 14128000
, 127200 % 1C-4 1 0 14129000
, 159000 % 1C-4 1 1 14130000
, 190800 % 1C-4 1 2 14131000
, 222600 % 1C-4 1 3 14132000
, 254400 % 1C-4 2 0 14133000
, 286200 % 1C-4 2 1 14134000
, 318000 % 1C-4 2 2 14135000
, 349800 % 1C-4 2 3 14136000
, 381600 % 1C-4 3 0 14137000
, 413400 % 1C-4 3 1 14138000
, 445200 % 1C-4 3 2 14139000
, 477000 % 1C-4 3 3 14140000
, 508800 % 1C-4 4 0 14141000
, 540600 % 1C-4 4 1 14142000
, 572400 % 1C-4 4 2 14143000
, 604200 % 1C-4 4 3 14144000
, 636000 % 1C-4 5 0 14145000
); 14146000
COMMENT GLOBALS FOR GETAREA/FORGETAREA; 15000000
COMMENT FIELD DECLARATIONS FOR AREASTATUS ITEM OF BLOCKOFAREASQUE;15001000
FIELD BASEADDRF =39:20, COMMENT BASE ADDRESS OF THE BLOCK; 15002000
AREASIZEFF=47:4 , COMMENT SIZE OF AREA IN A BLOCK; 15003000
AREASTATUSBITSF=19:20; COMMENT BITS FOR INDICATING 15004000
AVAILABLITY OF AREAS; 15005000
DEFINE MAXNOOFAREAS =20#; COMMENT KLUDGE UNTIL BOBS PATCH IS IN 15006000
INTEGER MAXNOOFAREAS; COMMENT NO. OF AREAS ALLOWED IN A BLOCK WHICH IS15007000
ALLOCATED AT A TIME. MAXIMUM NO OF AREAS IS 20; 15008000
DEFINE AITDESCRIPTORPLACE=19#; COMMENT TEMP DEFINE FOR AIT; 15009000
COMMENT DECLARATION FOR QUEUE OF BLOCKS OF AREAS OF DIFFERENT SIZE; 15010000
ARRAY DUMMYBLOCKOFAREASQUE[*]; COMMENT FOR MAKING ENTRY IN 15011000
BLOCKOFAREASQUE; 15012000
REFERENCE LASTBLOCK; COMMENT POINTS TO LAST BLOCK IN BLOCKOFAREASQUE;15013000
PROCEDURE STANDARDINSERT (FIRSTENTRY, LASTENTRY, ENTRY); 16000000
VALUE ENTRY; 16001000
REFERENCE FIRSTENTRY, LASTENTRY, ENTRY; 16002000
COMMENT ASSUMES FIRST 2 ITEMS OF QUEUE ARE PREVIOUS ENTRY 16003000
AND NEXT ENTRY, RESPECTIVELY. SEE STANDARDQUEUE.; 16004000
IF LASTENTRY =NULL 16005000
THEN BEGIN COMMENT QUEUE IS EMPTY; 16006000
FIRSTENTRY ~ LASTENTRY ~ ENTRY; 16007000
PREVIOUSSTANDARD @(ENTRY) ~ NEXTSTANDARD @(ENTRY) ~ NULL; 16008000
END 16009000
ELSE BEGIN COMMENT NEW ENTRY TO TAIL OF QUEUE; 16010000
PREVIOUSSTANDARD @(ENTRY) ~ LASTENTRY; 16011000
NEXTSTANDARD @ (LASTENTRY) ~ ENTRY; 16012000
LASTENTRY ~ ENTRY; 16013000
NEXTSTANDARD @ (ENTRY) ~ NULL; 16014000
END OF STANDARD QUEUE INSERTION ALGORITHM; 16015000
PROCEDURE STANDARDDELINK (FIRSTENTRY, LASTENTRY, ENTRY); 16016000
VALUE ENTRY; 16017000
REFERENCE ENTRY, FIRSTENTRY, LASTENTRY; 16018000
COMMENT ASSUMES FIRST 2 ITEMS OF QUEUE ARE PREVIOUS ENTRY 16019000
AND NEXT ENTRY, RESPECTIVELY. SEE STANDARDQUEUE.; 16020000
IF ENTRY =FIRSTENTRY COMMENT ENTRY IS THE TOP OF THE QUEUE; 16021000
THEN IF FIRSTENTRY = LASTENTRY 16022000
THEN FIRSTENTRY ~LASTENTRY ~NULL 16023000
ELSE BEGIN 16024000
FIRSTENTRY ~ NEXTSTANDARD @ FIRSTENTRY; 16025000
PREVIOUSSTANDARD @(FIRSTENTRY) ~NULL; 16026000
END 16027000
ELSE IF ENTRY =LASTENTRY 16028000
THEN BEGIN COMMENT REMOVE LAST ENTRY; 16029000
LASTENTRY ~PREVIOUSSTANDARD @ ENTRY; 16030000
NEXTSTANDARD @ (LASTENTRY) ~NULL; 16031000
END 16032000
ELSE BEGIN COMMENT REMOVE ANY OTHER ENTRY; 16033000
NEXTSTANDARD @(PREVIOUSSTANDARD @ ENTRY) ~ 16034000
NEXTSTANDARD @ ENTRY; 16035000
PREVIOUSSTANDARD @ (NEXTSTANDARD @ ENTRY) ~ 16036000
PREVIOUSSTANDARD @ ENTRY; 16037000
END OF DELINKING STANDARD QUEUE; 16038000
REFERENCE LASTNAME; 17000000
SAVE REFERENCE PROCEDURE allocatenameq; FORWARD; 17000100
QUEUE NAMEQUEUE:FIRSTNAME(PREVNAME,NEXTNAME,POINTERTONAME,CHARCOUNT); 17001000
VALUE POINTERTONAME, CHARCOUNT, PREVNAME, NEXTNAME; 17002000
REFERENCE PREVNAME, NEXTNAME; 17003000
POINTER POINTERTONAME; 17004000
INTEGER CHARCOUNT; 17005000
COMMENT QUEUE INDIVIDUAL NAMES UNTIL A "DIRECTORYSEARCH" TYPE 17006000
POINTER CAN BE BUILT; 17007000
USING LOCKED: 17008000
ALLOCATE IS ALLOCATENAMEQ: 17009000
TO INSERT, 17010000
STANDARDINSERT (FIRSTNAME, LASTNAME, ENTRY): 17011000
TO DELINK, 17012000
STANDARDDELINK (FIRSTNAME, LASTNAME, ENTRY); 17013000
SAVE REFERENCE PROCEDURE ALLOCATENAMEQ; 17014000
BEGIN 17015000
REFERENCE R; 17016000
ARRAY A [3]; 17017000
ALLOCATENAMEQ ~ R ~ R & DATADESCRIPTOR(,1,*,,,,,,4,GETAREA(4));17018000
POINTERTONAME @(R) ~ POINTER (A); 17019000
RETURN (R); 17019100
END NAMEQUEUE ALLOCATION AND INITIALIZATION; 17020000
QUEUE BLOCKOFAREASQUE :FIRSTBLOCK(PRVSBLOCK, NEXTBLOCK, AREASTATUS); 17021000
VALUE PRVSBLOCK, NEXTBLOCK, AREASTATUS; 17022000
REFERENCE PRVSBLOCK, NEXTBLOCK; 17023000
REAL AREASTATUS; 17024000
USING 17025000
ALLOCATE IS REFERENCE (DUMMYBLOCKOFAREASQUE & 17026000
ARRAYDESCL( ,3,GETSPACE(3,0,4,0))): 17027000
TO INSERT, 17028000
STANDARDINSERT (FIRSTBLOCK, LASTBLOCK, ENTRY): 17029000
TO DELINK, 17030000
BEGIN 17031000
STANDARDDELINK (FIRSTBLOCK, LASTBLOCK, ENTRY); 17032000
FORGETSPACE (WORD(ENTRY).ADDRESS); 17033000
END; 17034000
% GLOBALS FOR KEYINQ 17035000
REAL KEYINLK; 17036000
REFERENCE FIRSTINP, 17037000
NEXTINP, 17038000
LASTINP; 17039000
INTEGER PROCEDURE CENSUS(O,Y);VALUE O,Y;REFERENCE O,Y;FORWARD; 17039100
QUEUE KEYINQ:KEYQHD (KUSER,KRD,KBUF,KEVNT:PREINP,NEXINP); 17040000
VALUE KUSER,KRD,KBUF,KEVNT,PREINP,NEXINP; 17041000
REFERENCE KBUF, PREINP, NEXINP; 17042000
REAL KUSER, KRD, KEVNT; 17043000
USING 17045000
NEXT IS 17046000
(NEXTINP~NEXINP @ NEXTINP): 17047000
LOCKED: 17048000
POPULATION = CENSUS(FIRSTINP,LASTINP):% 17048100
TO DELINK, 17049000
BEGIN 17050000
IF ENTRY=FIRSTINP THEN 17051000
IF ENTRY=LASTINP THEN 17052000
FIRSTINP~LASTINP~NULL 17053000
ELSE BEGIN 17054000
FIRSTINP~NEXINP @ FIRSTINP; 17055000
PREINP @ (FIRSTINP)~NULL; 17056000
END 17057000
ELSE IF ENTRY=LASTINP THEN 17058000
BEGIN 17059000
LASTINP~PREINP @ LASTINP; 17060000
NEXINP @ (LASTINP)~NULL; 17061000
END 17062000
ELSE BEGIN 17063000
NEXINP @ (PREINP @ ENTRY)~NEXINP @ ENTRY; 17064000
PREINP @ (NEXINP @ ENTRY)~PREINP @ ENTRY; 17065000
END; 17066000
END: 17067000
TO INSERT, 17068000
BEGIN 17069000
IF LASTINP=NULL THEN% EMPTY 17070000
BEGIN 17071000
LASTINP~FIRSTINP~ENTRY; 17072000
NEXINP @ (FIRSTINP)~PREINP @ (FIRSTINP)~NULL; 17073000
END 17074000
ELSE BEGIN 17075000
PREINP @ (ENTRY)~LASTINP; 17076000
NEXINP @ (LASTINP)~ ENTRY; 17077000
LASTINP~ENTRY; 17078000
NEXINP @ (ENTRY)~ NULL; 17079000
END; 17080000
END; 17081000
INTEGER PROCEDURE CENSUS(OLDEST,YOUNGEST);VALUE OLDEST,YOUNGEST; 17082000
REFERENCE OLDEST,YOUNGEST; 17082100
BEGIN INTEGER TMP~1;% 17082200
IF OLDEST=NULL THEN RETURN(0) ELSE% 17082400
BEGIN 17082410
NEXTINP~OLDEST;% 17082500
WHILE OLDEST!YOUNGEST DO% 17082600
BEGIN% 17082610
TMP~*+1;% 17082620
OLDEST~NEXT(KEYINQ);% 17082630
END;% 17082690
END;% 17082700
RETURN(TMP);% 17082900
END CENSUS;% 17082990
% GLOBALS FOR SPOUTQ 17090000
REAL SPOUTLK;% 17090100
REFERENCE FIRSTOUTP,% 17090200
NEXTOUTP,% 17090300
LASTOUTP;% 17090400
QUEUE SPOUTQ:SPOQHD(SUSER,SRD,SBUF,SEVNT:PREOUTP,NEXOUTP); 17091000
VALUE SUSER,SRD,SBUF,SEVNT,PREOUTP,NEXOUTP; 17091100
REAL SUSER,SRD;% 17091200
WORD SEVNT;% 17091210
REFERENCE SBUF, PREOUTP,NEXOUTP; 17091300
USING 17091400
NEXT IS 17091500
(NEXTOUTP~NEXOUTP@NEXTOUTP):% 17091600
LOCKED: 17091700
TO INSERT,% 17091800
BEGIN% 17091900
IF LASTOUTP=NULL THEN% EMPTY 17092000
BEGIN% 17092100
LASTOUTP~FIRSTOUTP~ENTRY;% 17092200
NEXOUTP@(FIRSTOUTP)~PREOUTP@(FIRSTOUTP)~NULL;% 17092300
END% 17092400
ELSE BEGIN% 17092500
PREOUTP@(ENTRY)~LASTOUTP;% 17092600
NEXOUTP@(LASTOUTP)~ENTRY;% 17092700
LASTOUTP~ENTRY;% 17092800
NEXOUTP@(ENTRY)~NULL;% 17092900
END;% 17093000
END:% 17093100
TO DELINK,% 17094000
BEGIN% 17094100
IF ENTRY=FIRSTOUTP THEN% 17094200
IF ENTRY=LASTOUTP THEN% ONE AND ONLY ONE ITEM IN QUEUE 17094300
FIRSTOUTP~LASTOUTP~NULL% 17094400
ELSE BEGIN% TOP ITEM IN QUEUE 17094500
FIRSTOUTP~NEXOUTP@FIRSTOUTP;% 17094600
PREOUTP@(FIRSTOUTP)~NULL;% 17094700
END 17094800
ELSE IF ENTRY=LASTOUTP THEN% BOTTOM ITEM IN QUEUE 17094900
BEGIN% 17095000
LASTOUTP~PREOUTP@LASTOUTP;% 17095100
NEXOUTP@(LASTOUTP)~NULL;% 17095200
END% 17095300
ELSE BEGIN% ITEM IS IN THE MIDDLE OF QUEUE 17095400
NEXOUTP@(PREOUTP@ENTRY)~NEXOUTP@ENTRY;% 17095500
PREOUTP@(NEXOUTP@ENTRY)~PREOUTP@ENTRY;% 17095600
END;% 17095700
END;% 17095800
INTERLOCK ARRAY CHANNELLOCKS[*];% 17100000
ARRAY CHANNELGUIDE[*];% 17100100
LAYOUT LNDESCL (FIRF=19:1,LASF=18:1,PGF=17:10,LNF=7:8),% 17100500
GYDEFORM (RATINGSAMPLEF=47:30,SERF=17:8,CUSTF=9:8,0:1~1); 17100590
FIELD LNSTATF = 19:2;% 17100600
PROCEDURE CHANLINSERT(E,I);VALUE E,I;REAL I;REFERENCE E; FORWARD; 17101000
PROCEDURE CHANLREPLACE(E); VALUE E; REFERENCE E; FORWARD;% 17101100
DEFINE% FOR TUNING CHANNELS 17102000
MAXPSUEDOCHANNELS=10#,% 17102100
PICQSZ= 6#,% 17102110
MIXPIC = 0%,% 17102200
PERPIC = 1#,% 17102210
SCHPIC = 2#,% 17102220
DIRPIC = 3#,% 17102230
MIXCHNLLK = CHANNELLOCKS[MIXPIC]#,% 17102300
MIXQ(R) = PICQ,R,MIXPIC#,% 17102310
MIXQHD = CHANLHD[MIXPIC]#,% 17102320
PRINTMIXPIC(A)= CHANLOUT(MIXPIC,A)#,% 17102330
FIRSTLN= CHANLHD[INDEX]#,% 17102340
TOPLINE= 1&LNDESCL(,,1)#,% 17102350
FIRSTIMAGE(L,P)= L&LNDESCL(1,0,P)#,% 17102360
LASTIMAGE(L,P)= L&LNDESCL(0,1,P)#,% 17102370
CURRENTIMAGE(L,P)= L&LNDESCL(1,1,P)#,% 17102380
AVAILABLEIMAGE(L,P)= L&LNDESCL(0,0,P)#,% 17102390
AVAILINE(L)= (L).LNSTATF=0#,% 17102400
STATUSPOSIT= 28#,% 17102500
STATUSSZ= 3#,% 17102600
ENDCHANLQDEF=0#;% 17102990
QUEUE ARRAY PICQ:CHANLHD[*](LNID,LNDESC,LNBUF,INTERPICLNK,PRELN,NEXLN); 17103000
VALUE LNID,LNDESC, INTERPICLNK,PRELN,NEXLN; 17103100
REAL LNID,LNDESC, INTERPICLNK; 17103200
ARRAY LNBUF[*];% 17103210
REFERENCE PRELN,NEXLN; 17103300
USING LOCKED:% 17103400
TO INSERTINTO, CHANLINSERT(ENTRY,INDEX):% 17103500
TO REPLACIT, CHANLREPLACE(ENTRY):% 17103600
TO INSERT,% 17103700
BEGIN% 17103710
IF FIRSTLN=NULL THEN% 17103720
BEGIN% 17103730
FIRSTLN~ENTRY;% 17103740
PRELN@(ENTRY)~ENTRY;% 17103750
NEXLN@(ENTRY)~NULL;% 17103760
END% 17103770
ELSE BEGIN% 17103780
NEXLN@(ENTRY)~FIRSTLN;% 17103790
NEXLN@(PRELN@FIRSTLN)~ENTRY;% 17103800
PRELN@(ENTRY)~PRELN@FIRSTLN;% 17103810
PRELN@(FIRSTLN)~ENTRY; 17103820
END; 17103830
END: 17103890
TO DELINK,% 17104000
BEGIN% 17104010
IF ENTRY=FIRSTLN THEN% 17104020
IF NEXLN@ENTRY=NULL THEN FIRSTLN~NULL% 17104030
ELSE BEGIN% 17104040
FIRSTLN~NEXLN@ENTRY;% 17104050
PRELN@(FIRSTLN)~PRELN@ENTRY;% 17104060
END% 17104070
ELSE IF NEXLN@ENTRY=NULL THEN NEXLN@(PRELN@ENTRY)~NULL% 17104080
ELSE BEGIN% 17104090
NEXLN@(PRELN@ENTRY)~NEXLN@ENTRY;% 17104100
PRELN@(NEXLN@ENTRY)~PRELN@ENTRY;% 17104110
END;% 17104120
FORGETAREA(WORD(ENTRY).LENGTHF,WORD(ENTRY).ADDRESSF); 17104130
END:% 17104190
TO REARRANGE,% 17104200
BEGIN% 17104210
ENTRY~NEXLN@ENTRY; 17104220
WHILE PRELN@ENTRY!PRELN@FIRSTLN DO% 17104230
BEGIN% 17104240
PRELN@(ENTRY)~PRELN@(PRELN@ENTRY);% 17104250
IF AVAILINE(LNDESC@(NEXLN@(PRELN@ENTRY))) THEN% 17104260
FORGETAREA(WORD(NEXLN@(PRELN@ENTRY)).LENGTHF,% 17104270
WORD(NEXLN@(PRELN@ENTRY)).ADDRESSF);% 17104280
END;% 17104290
END;% 17104300
PROCEDURE CHANLINSERT(ENTREE,CHNNO);VALUE ENTREE,CHNNO;% 17110000
REAL CHNNO; REFERENCE ENTREE;% 17110100
BEGIN% 17111000
INTEGER TMPLN, TMPPG~-1;% 17112000
REFERENCE TMPENTRY~CHANLHD[CHNNO];% 17113000
LABEL LOOP;% 17119000
LOOP: TMPLN:=(TMPLN MOD MAXLNS)+1;% 17121000
IF TMPENTRY=NULL THEN% 17122000
BEGIN% 17123000
LNDESC@(ENTREE)~FIRSTIMAGE(TMPLN,TMPPG+REAL(TMPLN=1)); 17124000
PICQ[CHNNO]~ENTREE;% 17125000
END% 17126000
ELSE BEGIN% 17127000
IF AVAILINE(TMPLN~LNDESC@TMPENTRY) THEN% 17128000
BEGIN% 17129000
LNDESC@(ENTREE)~FIRSTIMAGE(TMPLN,TMPLN.PGF);% 17130000
PRELN@(ENTREE)~TMPENTRY;% 17131000
REPLACIT(PICQ,ENTREE,CHNNO);% 17132000
END% 17133000
ELSE BEGIN% 17134000
TMPENTRY~NEXLN@TMPENTRY;% 17135000
GO TO LOOP;% 17136000
END;% 17137000
END;% 17138000
END CHANLINSERT;% 17139900
PROCEDURE CHANLREPLACE(ENTREE);VALUE ENTREE;REFERENCE ENTREE; 17150000
BEGIN% 17150100
REFERENCE PREVLINE~PRELN@ENTREE;% 17150200
PRELN @ (ENTREE) ~ PRELN @ PREVLINE;% 17150300
NEXLN @ (ENTREE) ~ NEXLN @ PREVLINE;% 17150400
NEXLN @ (PRELN @ ENTREE) ~ PRELN @ (NEXLN @ ENTREE) ~ENTREE; 17150500
FORGETAREA(WORD(PREVLINE).LENGTHF,% 17150700
WORD(PREVLINE).ADDRESSF);% 17150702
END CHANLREPLACE;% 17151990
REFERENCE LASTPARAM; 17152000
QUEUE PARAMETERQUEUE:FIRSTPARAM 17153000
(PREVPARAM, NEXTPARAM, POINTERTOID, PARAMETERINFO); 17154000
VALUE PREVPARAM, NEXTPARAM, POINTERTOID, PARAMETERINFO; 17155000
REFERENCE PREVPARAM, NEXTPARAM, PARAMETERINFO; 17156000
POINTER POINTERTOID; 17157000
COMMENT QUEUE PARAMETER NAMES AND THEIR ASSOCIATED INFO 17158000
UNTIL ALL ITEMS CAN BE PLACED IN A SINGLE 17159000
VECTOR.; 17160000
USING LOCKED: 17161000
ALLOCATE IS ALLOCATENAMEQ: 17162000
TO INSERT, 17163000
BEGIN 17164000
PARAMETERINSERT (FIRSTPARAM, LASTPARAM, ENTRY); 17165000
END: 17166000
TO DELINK, 17167000
BEGIN 17168000
STANDARDDELINK (FIRSTPARAM, LASTPARAM, ENTRY); 17169000
FORGETAREA (4, WORD (ENTRY).ADDRESSF); 17170000
END: 17171000
TO INITIALINSERT, 17172000
STANDARDINSERT (FIRSTPARAM, LASTPARAM, ENTRY); 17173000
PROCEDURE PARAMETERINSERT (FIRSTPARAM, LASTPARAM, ENTRY); 17174000
VALUE ENTRY; 17175000
REFERENCE FIRSTPARAM, LASTPARAM, ENTRY; 17176000
BEGIN 17177000
POINTER PT, PE; 17178000
ARRAY PB [*]; 17179000
REFERENCE RT, PBR = PB; 17180000
INTEGER IT, IE, WORDS; 17181000
REAL T; 17182000
LABEL AWAY; 17183000
IF RT ~ FIRSTPARAM ! NULL 17184000
THEN BEGIN 17185000
WORDS~REAL(POINTERTOID@(RT),6).TOTALINFOWORDSF; 17186000
DO IF IT ~ REAL(PT ~POINTERTOID@(RT), 6). 17187000
KEYFIELDF = 17188000
IE ~ REAL(PE ~POINTERTOID@(ENTRY),6). 17189000
KEYFIELDF 17190000
THEN IF PT+6 = PE+6 FOR IT.ALFALENGTHF 17191000
THEN BEGIN 17192000
PBR ~ PARAMETERINFO@(RT); 17193000
WORDS ~ WORDS - REAL(PT,6).INFOINDEXF - 17194000
PB.LENGTHF; 17195000
STANDARDDELINK (FIRSTPARAM, LASTPARAM, RT); 17196000
FORGETSPACE(PT.ADDRESSF); 17197000
FORGETSPACE(PB.ADDRESSF); 17198000
FORGETAREA(4, WORD (RT).ADDRESSF); 17199000
GO AWAY 17200000
END 17201000
UNTIL RT ~ NEXTPARAM@(RT) = NULL; 17202000
END 17203000
ELSE PE ~ POINTERTOID@(ENTRY); 17204000
AWAY: PBR ~ PARAMETERINFO@(ENTRY); 17205000
STANDARDINSERT (FIRSTPARAM, LASTPARAM, ENTRY); 17206000
UPDATEWORDCOUNT 17207000
(WORDS + (REAL(PE,6).INFOINDEXF) + 17208000
(T ~ PB.LENGTHF), FIRSTPARAM); 17209000
UPDATEINFOINDEX (T, ENTRY); 17210000
END; 17211000
% GLOBALS FOR LOGGING 17300000
ARRAY LOGBUF[*],% 17300100
LOGHDR[*];% 17300200
REAL LOGLOCK,% 17300300
LOGRECCNT;% 17300400
DEFINE 17301000
LOGROWSZ= 1000#,% 17301100
SEGMENTSZ= 30#,% 17301200
LOGRECSZ= 15#,% 17301300
LOGHDRSZ= 30#,% 17301400
ENDLOGDEF=0#;% 17301900
COMMENT GLOBALS FOR ARRAYDEC; 18000000
DEFINE MCPAITSIZE=10#, 18000300
AITSIZE=64#; 18000700
ARRAY MCPARRAYINFOT[MCPAITSIZE]; 18001000
LAYOUT SARRAYDESCL(TAG~5,LENGTHF,MCPARRAYBIT=19:1,FILETYPEF, 18002000
AITINDICATORF,AITINDEXF=16:12,ARRAYTYPEF=4:5); 18003000
COMMENT TO MAKE UP A SPECIAL ARRAY 18004000
DESCRIPTOR FOR ARRAY DECLARATIONS; 18005000
FIELD DOUBLEBIT=2:1,LSAVEBIT=0:1; 18006000
COMMENT GLOBALS FOR FILE MANAGEMENT; 18007000
DEFINE STOPFILETIMING=STARTFILETIMING #, COMMENT WHEN 18008000
STOPFILETIMING IS CALLED SECOND PARAMETER IS FALSE; 18009000
SETUNITAVAILABLE=SETUNITINUSE #, COMMENT WHEN 18010000
SETUNITAVAILABLE IS CALLED SECOND PARAMETER IS FALSE;18011000
LEBZERO=LEB[0]#, 18012000
LEBONE=LEB[1]#, 18013000
LEBTWO=LEB[2]#; 18014000
FIELD BYTE1F=47:8, 18015000
BYTE2F=39:8, 18016000
BYTE3F=31:8, 18017000
BYTE4F=23:8, 18018000
BYTE5F=15:8, 18019000
BYTE6F=7:8; 18020000
DEFINE PUTINBITSTABLE(TABLE,U) =TABLE[U DIV 48].[U MOD 48:1]~1#; 18021000
FIELD PTYPEF =4:5, % DEVICE CODE OF PERIPHERAL TYPE 18022000
PTYPECODEF=7:3, % QUALIFYING CODE FOR PERIPHERAL TYPE 18023000
UNOF =U:1; % FOR RESETTING BITS IN UNIT BITS TABLE 18024000
EVENT FINDINPUTEVENT; % NOW YOU CAN CALL FINDINPUT 18024100
REAL MCPDISKUNITNO; % UNIT NO TO BE USED FOR TALKING ABOUT DISK18024200
COMMENT DEFINES FOR CODE VALUE PASSED TO FINDINPUT; 18024300
DEFINE SEARCHONLY=1# % DONOT WAIT IF DISK FILE IS LOCKED 18024400
; 18024800
ARRAY REPLY[*]; COMMENT FOR STORING REPLYCODE FOR CHECKING 19002000
VALID RESPONSES FROM SPO FOR EACH STACK NO.19003000
(SNR).WHEN VALID RESPONSE IS RECEIVED 19004000
REPLY[SNR]>0 AND WILL CONTAIN THE RECEIVED 19005000
MESSAGE; 19006000
% THE ARRAY REPLY[*] IS TEMPORARILY BEING INITIALIZED 19006200
% TO MAXIMUM NO OF STACKS -- EVENTUALLY IT SHOULD BE MADE DYNAMIC, 19006210
% POSSIBLY BY A QUEUE MECHANISM OR BY STANDARD OFFSET FROM BOSR. 19006220
LAYOUT REPWRDL (% 19006500
REPINFOF=23:9,% MISC. INFO 19006510
REPVALF=14:15);% RESPONSE VALUE 19006590
DEFINE% REPLY BIT VALUE REPINFOF 19006900
DSREP = 1#,% NOTHING 19007000
RMREP = 2#,% NOTHING 19007010
OKREP = 4#,% NOTHING 19007020
ILREP = 8#,% UNIT NO. 19007030
FMREP = 16#,% UNIT NO. 19007040
ULREP = 32#,% UNIT NO. 19007050
OUREP = 64#,% UNIT TYPE 19007060
FRREP = 128#,% NOTHING 19007070
OFREP = 256#,% NOTHING 19007080
USREP = 512#,% GEN AND VER NOS. 19007090
AXREP = 1024#,% DONT KNOW YET 19007100
DEFINEREPEND=O#; 19014000
COMMENT DEFINES FOR BIT NO VALUE IN REPLY MASK; 19014010
DEFINE DSV =0# 19014020
,RMV =1# 19014030
,OKV =2# 19014040
,ILV =3# 19014050
,FMV =4# 19014060
,ULV =5# 19014070
,OUV =6# 19014080
,FRV =7# 19014090
,OFV =8# 19014100
,USV =9# 19014110
,AXV =10# 19014120
; 19014300
COMMENT DEFINES FOR FIB; 19015000
20000000
20001000
DEFINE INDEPENDENTRUNNERCORE = 512 # %***STACK CORE 20002000
, IRCORE = 500 # %TOTAL CORE 20003000
, IRPROCTIME = 1000 # 20004000
, IRIOTIME = 500 # 20005000
, D0OFFSET = 0 # 20006000
; 20007000
REAL INDEPENDENTRUNNERLOK 20008000
; 20009000
COMMENT THE FOLLOWING INDICES ARE USED FOR PARTITIONING INDEPENDENT 20009100
RUNNER PROCEDURES 20009200
; 20009300
REAL IRPCWSTARTPLACE~NAME(CONTROLCARD).ADRCPLF 20009400
, ONEONLYINDEX ~ NAME(STATUS).ADRCPLF -IRPCWSTARTPLACE 20009500
, MAXIRINDEX ~ NAME(TERMINATE).ADRCPLF -IRPCWSTARTPLACE20009600
, MAXIRINDEXPLUS1 ~ MAXIRINDEX+1 20009700
; 20009800
COMMENT THE FOLLOWING INDICATORS ARE USED BY INDEPENDENT RUNNER IN 20010000
RECOGNISING THOSE RUNNERS REQUIRING SPECIAL ACTION. FOR 20010200
EXAMPLE INITIALISE WILL PUT PRIORITIES FOR RECOGNISED RUNNERS 20010400
INTO "IRPRIORITIES"(NOTE - THIS HAS TO BE CODED) - NON 20010600
RECOGNISED RUNNERS WILL HAVE DEFAULT PRIORITIES 20010800
; 20011000
20011100
20011200
REAL CONTROLCARDINDICATOR ~ NAME(CONTROLCARD).ADRCPLF 20013000
-IRPCWSTARTPLACE 20013200
, INITIATEINDICATOR ~ NAME(INITIATE).ADRCPLF 20014000
-IRPCWSTARTPLACE 20014200
, TERMINATEINDICATOR ~ NAME(TERMINATE).ADRCPLF 20015000
-IRPCWSTARTPLACE 20015200
, DIRCOMPLEMENTINDICATOR := NAME(DIRECTORYCOMPLEMENT). 20015300
ADRCPLF - IRPCWSTARTPLACE 20015400
; 20016000
DEFINE FORK(PROC,PARAM)=INDEPENDENTRUNNER(NAME(PROC).ADRCPLF20020020
-IRPCWSTARTPLACE,PARAM) # ; 20020040
COMMENT FOLLOWING DEFINE DEFAULT PRIORITY AND PRIORITIES FOR RUNNERS 20020100
WITH WHICH INDICATORS ARE ASSOCIATED; 20020200
DEFINE IRDEFAULTPRIORITY 20020300
= 10 # 20020400
, DIRCOMPLEMENTPRIORITY = 18 # 20020420
, CONTROLCARDPRIORITY 20020500
= 12 # 20020600
, INITIATEPRIORITY 20020620
= 12 # 20020640
, TERMINATEPRIORITY 20020660
= 19 # 20020680
; 20020900
REAL IRSTACKS %~2 20023000
, PIRSTACKS 20024000
; 20025000
ARRAY STACKINUSE[*], 20026000
IRPRIORITIES[*] 20026100
%EACH IR MUST BE INITI-20027000
%ALISED 20028000
; 20029000
ARRAY IRPARAMETERLOK[*] 20030000
; 20031000
BOOLEAN NOTFIRSTWAIT % *** KLUDGE 20032000
; 20033000
INTEGER TERMINATESTACK % STACK NUMBER FOR TERMINATE 20034000
; 20035000
LAYOUT REDYQHEAD( FIRSTREADYF = 12:10 21000000
,LASTREADYF = 22:10 21001000
) 21002000
; 21003000
REAL ARRAY VECTORLOK[2] 21004000
; 21005000
DEFINE SHEETINDICATOR = FALSE # 21006000
, READYINDICATOR = TRUE # 21007000
, SVECTORPLACE = 16 # 21008000
21009000
21010000
, PRIORITYRANGE = 9 # % UPPER LIMIT ON PRIORITIES 21011000
, PRIORITYRANGEPLUS1 = 10 # 21011100
, TIMELOAD = 10# % NO OF RE-ARRANGES OF SHEET21012000
% BEFORE PRIORITY INCREASE 21013000
, ALLOWABLESLACK = 120# % IN SHEET,STACK VECTOR SIZE21014000
, VECTORMODULE = 100# % SHEET AND STACK VECTOR 21015000
; 21016000
REAL LASTNOTAVAILABLEINVECTOR 21017000
, FIRSTAVAILABLEINVECTOR 21018000
; 21019000
21020000
21021000
ARRAY PRIORITYLEVEL[PRIORITYRANGEPLUS1] 21022000
; 21023000
REAL HIGHESTSHEETVECTOR 21024000
, HIGHESTSTACKVECTOR 21025000
; 21026000
DEFINE SHEET = 0 # %NORMAL 21027000
, REDY = 1 # %FROM WAITQ 21028000
, SHEETI = SHEET # 21029000
, WAITI = 2 # 21030000
, OTHERREDY = 3 # 21031000
, OTHER = OTHERREDY # 21032000
, GETIRS = 4 # 21033000
, TERMINATEI = 5 # 21034000
, READYQHEAD = READYQHED # 21034100
; 21035000
21036000
21037000
21038000
COMMENT FOLLOWING ARE FORMATS OF SHEET PSEUDO-STACK,PROCESS STACK, 21039000
D1 STACK AND D2 STACK NOTE CORRESPONDENCE WITH SHEETQ AND READYQ 21040000
DECLARATIONS - IN GENERAL THERE ARE TWO WAYS OF REFERENCING STACK 21041000
OR PSEUDO STACK INFORMATE - THROUGH ITEM REFERENCES OR THROUGH 21042000
DIRECT INDEXING INTO STACK OR SHEET ARRAY 21043000
; 21044000
DEFINE FIRSTPLACE = 0 # 21045000
, LINKPLACE = 1 # 21046000
, COREPLACE = 2 # 21047000
, PRIORITYPLACE = 3 # 21048000
, PROCTIMEPLACE = 4 # 21049000
, IOTIMEPLACE = 5 # 21050000
, FPBDESCPLACE = 6 # 21051000
, COMMONVALUEPLACE = 7 # 21052000
, PROCESSNATUREPLACE= 8 # 21053000
, FIRSTPARAMETERPLACE = 9# 21053200
, LASTPARAMETERPLACE =10# 21053400
, STACKOLAYABLECOREPLACE = 9 # 21054000
, STACKNONOLAYABLECOREPLACE= 10# 21055000
, TARGETTIMEPLACE = 13# 21056000
, IDPLACE = 14# 21057000
, TIMEENTEREDPLACE = 15 # 21058000
, FIRSTXPLACE = 16# 21059000
, CODEFILEDESCPLACE= 17# 21060000
, CODEFILENAMEDESCPLACE= 18# 21061000
, STACKSIZEPLACE = 20# 21062000
, SEPCOMPILEINFOPLACE = 21# 21063000
, EXTERNALINFOPLACE = 22# 21064000
, D1DESCRIPTORPLACE = 23# 21065000
, D2DESCRIPTORPLACE = 24# 21066000
, NEXTPROGRAMPLACE = 26# 21066100
, AUTHORITYLINKPLACE = 32# 21067000
, REQUIREDPLACE = 33 # 21067200
, AUTHORITYPLACE = 34 # 21067400
, AUTHORITYEVENTPLACE = 35# 21067600
, FIRSTMSCWPLACE 21072000
= 36 # 21072050
, FIRSTRCWPLACE 21072100
= 37 # 21072150
, IRPARAMETERPLACE 21072200
= 38 # 21072250
, IRPCWPLACE 21072300
= 39 # 21072350
, SECNDMSCWPLACE 21072400
= 40 # 21072450
, RETURNCONTROLWORDPLACE 21072500
= 41 # 21072550
; 21073000
DEFINE EVENTWAITQLINK = LINKPLACE # ; 21074000
COMMENT FOLLOWING APPLY TO PSEUDO-STACK ONLY; 21075000
DEFINE SCHEDULEIDPLACE= 14# 21076000
, COLLAPSEDNAMEPLACE = 15# 21077000
; 21078000
21079000
COMMENT FOLLOWING APPY TO PROCESS STACK ONLY; 21080000
DEFINE JOBIDPLACE = 14# 21081000
, PROCESSIDPLACE = 16# 21082000
, TRPLACE = 17# 21083000
, TWPLACE = 18# 21084000
, AITDESCPLACE = 19# 21085000
, TPPLACE = 20# 21086000
, CURRENTPRIORITYPLACE= 23# 21087000
, MYCOURSEPLACE = 24# 21088000
, IOTIMEACCUMPLACE = 25# 21089000
21090000
, DATDESCRIPTORPLACE = 26# 21091000
, OLAYFILEDESCRIPTORPLACE= 27# 21092000
, PROCESSFAMILYLINKPLACE = 28# 21093000
, ERRORCOUNTPLACE = 29 # 21094000
, ABORTEVENTPLACE = 30 # 21095000
, REPLYEVENTPLACE = 31 # 21096000
; 21097000
COMMENT FOLLOWING APPLY TO D1 STACK ONLY; 21098000
DEFINE SEGDICTIDENTPLACE = 2 # 21099000
, FIRSTPCWPLACE = 3 # 21100000
, D1CODEFILEDESCPLACE = 4 # 21101000
, D1CODEFILENAMEDESCPLACE =5# 21102000
, USERCOUNTNLINKAGEPLACE =6 # 21103000
, D1MSCWPLACE = 13# 21104000
, D1RCWPLACE = 14# 21105000
, MYCODEFILENAME(D2STKNR)= WORDSTACK[WORDSTACK[D2STKNR,21105100
PROCESSFAMILYLINKPLACE].FATHERF, 21105102
D1CODEFILENAMEDESCPLACE]#% 21105104
; 21106000
DEFINE D1INFO = D1MSCWPLACE # 21107000
; 21108000
LAYOUT READYWAITLINK ( BACKWARDLINKF = 22:10 21109000
, FORWARDLINKF = 12:10 21110000
, SELFIDENTF = 45:10 21111000
, HEYOUINTERRUPTF= 24:1 21112000
) 21113000
; 21114000
FIELD DEDICATEDSTACKF = 25:1 21114200
; 21114400
WORD D2MSCW2 21115000
, SHEETTOSCW 21116000
, D2MSCW1 21117000
, IRMSCW1 21118000
, IRMSCW2 21119000
, D1MSCW 21120000
, D2RCW1 21121000
, IRTOSCW 21122000
, D2TOSCW 21122100
; 21123000
FIELD DYNAMICLINKSF =22:23 21124000
, STATUSINDICATORF = 23:21 21125000
, FULLINDICATORF = 23:1 21126000
; 21127000
DEFINE 21128000
21129000
D1TOSCW = SHEETTOSCW # 21130000
, IRRCW1 = D2RCW1 # 21131000
21131200
, D1RCW = D2RCW1 # 21132000
; 21133000
LAYOUT USERLINK ( LATENTUSERSF = 39:10 21134000
, ACTIVEUSERSF = 29:10 21135000
, FIRSTD2VALUE = 19:20 21136000
) 21137000
; 21138000
FIELD NUMBEROFUSERSF = 39:20 21138010
; 21138020
LAYOUT PROCESSFAMILYLINKAGE 21138100
% *** AT PRESENT ,A D2 STACK CAN HAVE NO FATHER AND 21138110
% *** FATHERPROCESSF HOLDS THE D1 STACK NO. THE 21138120
% *** D1LINKFLAGF(WHICH AT PRESENT IS UNUSED) MAY PROVE 21138130
% *** USEFUL IF THIS SITUATION CHANGES.15 MARCH 1969 21138140
( FATHERF = 9:10 21138200
, D1LINKFLAGF = 10:1 21138300
, ELDESTSONF = 20:10 21138400
, OLDERBROTHERF = 30:10 21138500
, YOUNGERBROTHERF = 40:10 21138600
); 21138900
21139000
QUEUE READYQ :WRONGTYPEREADYQHEAD ( 21140000
READYQBOTTOM 21141000
, READYQLINK 21142000
, READYQCORE 21143000
, DECLAREDPRIORITY 21144000
, PROCESSLIMIT 21145000
, IOLIMIT 21146000
, FPBDESCRIPTOR 21147000
, COMMONVALUE 21148000
, PROCESSCLASS 21149000
, STACKOLAYABLECORE 21149200
, STACKNONOLAYABLECORE 21149400
, DUMMYREDY1 21149600
, DUMMYREDY2 21149800
, TARGETTIME 21150000
, JOBID 21151000
, TIMEENTERED 21152000
, PROCESSID 21153000
, TIMEINREADYQ 21154000
, WAITTIME 21155000
, AITDESCRIPTOR 21155200
, PROCESSTIME 21156000
, SEPCOMPILEINFO 21156200
, EXTERNALINF 21156400
, CURRENTPRIORITY 21157000
, MYCOURSEITEM 21158000
, ACCUMULATEDIOTIME 21159000
21160000
, OATDESCRIPTOR 21161000
, OLAYFILEDESCRIPTOR 21162000
, PROCESSFAMILYLINK 21163000
, ERRORCOUNT 21164000
, ABORTEVENT 21165000
, REPLYEVENT 21166000
, AUTHORITYLINK 21166010
, REQUIRED 21166100
, AUTHORITY 21166200
, AUTHORITYEVENT 21166300
, FIRSTMSCW 21166400
, FIRSTRCW 21166500
, IRPARAMETER 21166600
, IRPCW 21166700
, SECNDMSCW 21166800
, RETURNCONTROLWD 21166900
); 21167000
VALUE READYQBOTTOM 21168000
, READYQLINK 21169000
, READYQCORE 21170000
21171000
, DECLAREDPRIORITY 21172000
, PROCESSLIMIT 21173000
, IOLIMIT 21174000
, FPBDESCRIPTOR 21175000
, COMMONVALUE 21176000
, TARGETTIME 21177000
, JOBID 21178000
, TIMEENTERED 21179000
, PROCESSCLASS 21180000
, PROCESSID 21181000
, TIMEINREADYQ 21182000
, WAITTIME 21183000
, PROCESSTIME 21184000
, CURRENTPRIORITY 21185000
, MYCOURSEITEM 21186000
, ACCUMULATEDIOTIME 21187000
, AITDESCRIPTOR 21188000
, OATDESCRIPTOR 21189000
, OLAYFILEDESCRIPTOR 21190000
, PROCESSFAMILYLINK 21191000
, ERRORCOUNT 21192000
, DUMMYREDY1 21193000
, DUMMYREDY2 21193200
, SEPCOMPILEINFO 21193400
, EXTERNALINF 21193600
, AUTHORITYLINK 21193800
, REQUIRED 21194000
, AUTHORITY 21194200
, IRPARAMETER 21194400
, FIRSTMSCW 21194600
, FIRSTRCW 21194800
, IRPCW 21195000
, SECNDMSCW 21195200
, RETURNCONTROLWD 21195400
, STACKOLAYABLECORE 21195700
, STACKNONOLAYABLECORE 21195800
; 21195900
REAL READYQCORE 21196000
21197000
, DECLAREDPRIORITY 21198000
, PROCESSLIMIT 21199000
, IOLIMIT 21200000
, COMMONVALUE 21201000
, TARGETTIME 21202000
, JOBID 21203000
, TIMEENTERED 21204000
, PROCESSCLASS 21205000
, PROCESSID 21206000
, TIMEINREADYQ 21207000
, WAITTIME 21208000
, PROCESSTIME 21209000
, CURRENTPRIORITY 21210000
, MYCOURSEITEM 21211000
, ACCUMULATEDIOTIME 21212000
, PROCESSFAMILYLINK 21213000
, ERRORCOUNT 21214000
, DUMMYREDY1 21214100
, DUMMYREDY2 21214200
, SEPCOMPILEINFO 21214300
, EXTERNALINF 21214400
, AUTHORITYLINK 21214500
, REQUIRED 21214600
, AUTHORITY 21214700
, IRPARAMETER 21214800
, STACKOLAYABLECORE 21214820
, STACKNONOLAYABLECORE 21214840
; 21215000
WORD READYQBOTTOM 21216000
, READYQLINK 21217000
, FPBDESCRIPTOR 21218000
, AITDESCRIPTOR 21219000
, OATDESCRIPTOR 21220000
, OLAYFILEDESCRIPTOR 21221000
, FIRSTMSCW 21221100
, FIRSTRCW 21221200
, IRPCW 21221300
, SECNDMSCW 21221400
, RETURNCONTROLWD 21221500
; 21222000
EVENT ABORTEVENT 21223000
, REPLYEVENT 21224000
, AUTHORITYEVENT 21224100
; 21225000
USING 21226000
LOCKED 21227000
:TO INSERT, VECTORINSERT(REDY ,ENTRY) 21228000
:TO REARRANGE, STACKQREARRANGE(READYINDICATOR) 21229000
:EMPTY IF REAL(M[NAME(WRONGTYPEREADYQHEAD)])=0 21230000
:TO INSERTINQ, INSERTINQUEUE(REDY ,INDEX) 21231000
: TO MOVETONEXTINREADY ,NEXTPROCESS 21232000
: TO MOVEFROMSHEET, SELECTION 21233000
; 21234000
21235000
21236000
DEFINE FIRSTATLEVEL = FIRSTREADYF # 21237000
, LASTATLEVEL = LASTREADYF # 21238000
; 21239000
FIELD COUNTATLEVEL = 45:20 21240000
; 21241000
LAYOUT LEVELFORMAT ( FIRSTATLEVEL 21241010
, LASTATLEVEL 21241020
,COUNTATLEVEL 21241030
); 21241040
DEFINE DEFAULTPRIORITY= 5 # 21241100
; 21241200
COMMENT FOLLOWING ARE THE CURRENT WEIGHTING COEFFICIENTS OF THE 21242000
SCHEDULING ALGORITHMS. THEY ARE PURELY TEMPORARY FOR THE 21243000
FOLLOWING REASONS : 21244000
A THEIR DERIVATION WAS PURELY ARBITRARY. AS YET THERE HAS 21245000
BEEN NO ATTEMPT TO ARRIVE AT GOOD VALUES. FURTHER ANALYSIS21246000
,SIMULATION AND EXPERIENCE ARE REQUIRED 21247000
B THE VALUES OF THE COEFFICIENTS WILL BE DYNAMIC RATHER 21248000
THAN FIXED AS SHOWN BELOW 21249000
; 21250000
REAL DECLAREDPRIORITYWEIGHT ~ 1.0 21251000
21252000
%)TIMES IN SECS21253000
, READYTIMEWEIGHT ~ 0.0017 %)THUS 1 ADDED 21254000
, WAITTIMEWEIGHT ~ 0.0017 %)EVERY 10 OR 21255000
, ELAPSEDTIMEWEIGHT ~ 0.00017 %)HUNDRED MINS 21256000
%)TO PRIORITY 21257000
21258000
, TARGETTIMEWEIGHT ~ 0.1 21259000
, COREWEIGHT ~ 0.002 21260000
, TIMEINSCHEDULEWEIGHT ~ 0.0017 21261000
; 21262000
QUEUE SHEETQ :WRONGTYPESHEETQHEAD ( 21263000
SHEETBOTTOM 21264000
, SHEETLINK 21265000
, SHEETCORE 21266000
, SHEETPRIORITY 21267000
, PROCESSLIMITINSHEET 21268000
, IOLIMITINSHEET 21269000
, FPBDESCRIPTORINSHEET 21270000
, COMMONVALUEINSHEET 21271000
, PROCESSNATURE 21272000
, FIRSTPARAMETER 21272200
, LASTPARAMETER 21272400
, DUMMYSHEET3 21272600
, DUMMYSHEET4 21272800
, TARGETTIMEINSHEET 21273000
, SCHEDULEID 21274000
, TIMEENTEREDINSHEET 21275000
, FIRSTXINSHEET 21276000
, SHEETCODEFILEDESCRIPTOR 21277000
, SHEETCODEFILENAMEDESCRIPTOR 21278000
, COLLAPSEDNAME 21279000
, STACKSIZEINSHEET 21280000
, SEPARATELYCOMPILEDINFO 21281000
, EXTERNALINFO 21282000
, D1DESCRIPTOR 21283000
, D2DESCRIPTOR 21284000
, PREVIOUSPROGRAM 21285000
, NEXTPROGRAM 21286000
, DUMMYSHEET5 21286020
, DUMMYSHEET6 21286040
, DUMMYSHEET7 21286060
, DUMMYSHEET8 21286080
, DUMMYSHEET9 21286100
, AUTHORITYLINKINSHEET 21286120
, REQUIREDINSHEET 21286140
, AUTHORITYINSHEET 21286160
, AUTHORITYEVENTINSHEET 21286180
, FIRSTMSCWINSHEET 21286200
, FIRSTRCWINSHEET 21286220
, IRPARAMETERINSHEET 21286240
, IRPCWINSHEET 21286260
, SECNDMSCWINSHEET 21286280
, RETURNCONTROLWORDINSHEET 21286300
); 21287000
VALUE SHEETBOTTOM 21288000
, SHEETLINK 21289000
, SHEETCORE 21290000
, SHEETPRIORITY 21291000
, PROCESSLIMITINSHEET 21292000
, IOLIMITINSHEET 21293000
, FPBDESCRIPTORINSHEET 21294000
, COMMONVALUEINSHEET 21295000
, TARGETTIMEINSHEET 21296000
, SCHEDULEID 21297000
, TIMEENTEREDINSHEET 21298000
, PROCESSNATURE 21299000
, FIRSTPARAMETER 21299200
, LASTPARAMETER 21299400
, FIRSTXINSHEET 21300000
, SHEETCODEFILEDESCRIPTOR 21301000
, SHEETCODEFILENAMEDESCRIPTOR 21302000
, COLLAPSEDNAME 21303000
, STACKSIZEINSHEET 21304000
, SEPARATELYCOMPILEDINFO 21305000
, EXTERNALINFO 21306000
, D1DESCRIPTOR 21307000
, D2DESCRIPTOR 21308000
, PREVIOUSPROGRAM 21309000
, NEXTPROGRAM 21310000
, AUTHORITYLINKINSHEET 21310020
, REQUIREDINSHEET 21310040
, AUTHORITYINSHEET 21310060
, FIRSTMSCWINSHEET 21310080
, FIRSTRCWINSHEET 21310100
, IRPARAMETERINSHEET 21310120
, IRPCWINSHEET 21310140
, SECNDMSCWINSHEET 21310160
, RETURNCONTROLWORDINSHEET 21310180
; 21311000
REAL SHEETCORE 21312000
, SHEETPRIORITY 21313000
, PROCESSLIMITINSHEET 21314000
, IOLIMITINSHEET 21315000
, COMMONVALUEINSHEET 21316000
, TARGETTIMEINSHEET 21317000
, SCHEDULEID 21318000
, TIMEENTEREDINSHEET 21319000
, PROCESSNATURE 21320000
, COLLAPSEDNAME 21321000
, STACKSIZEINSHEET 21322000
, SEPARATELYCOMPILEDINFO 21323000
, EXTERNALINFO 21324000
21324020
21324040
, DUMMYSHEET3 21324060
, DUMMYSHEET4 21324080
, DUMMYSHEET5 21324100
, DUMMYSHEET6 21324120
, DUMMYSHEET7 21324140
, DUMMYSHEET8 21324160
, DUMMYSHEET9 21324180
, AUTHORITYLINKINSHEET 21324200
, REQUIREDINSHEET 21324220
, AUTHORITYINSHEET 21324240
; 21325000
WORD SHEETBOTTOM 21326000
, SHEETLINK 21327000
, FPBDESCRIPTORINSHEET 21328000
, SHEETCODEFILEDESCRIPTOR 21329000
, SHEETCODEFILENAMEDESCRIPTOR 21330000
, D1DESCRIPTOR 21331000
, D2DESCRIPTOR 21332000
, FIRSTMSCWINSHEET 21332020
, FIRSTRCWINSHEET 21332040
, IRPARAMETERINSHEET 21332060
, IRPCWINSHEET 21332080
, SECNDMSCWINSHEET 21332100
, RETURNCONTROLWORDINSHEET 21332120
, FIRSTXINSHEET 21333000
; 21334000
REFERENCE PREVIOUSPROGRAM 21335000
, FIRSTPARAMETER 21335200
, LASTPARAMETER 21335400
, NEXTPROGRAM 21336000
; 21337000
EVENT 21337020
AUTHORITYEVENTINSHEET 21337040
; 21337100
USING 21338000
LOCKED 21339000
:TO INSERT, VECTORINSERT(SHEETI ,ENTRY) 21340000
:TO REARRANGE, STACKQREARRANGE(SHEETINDICATOR) 21341000
:EMPTY IF REAL(M[NAME(WRONGTYPESHEETQHEAD)])=0 21342000
: NEXTINDEX = NEXTINSCHEDULE 21343000
; 21344000
DEFINE MOVETONEXTINREADYQ = MOVETONEXTINREADY(READYQ)# 21345000
, MOVETONEXTONEINREADYQ = MOVETONEXTINREADYQ # 21346000
, NEXTSTACKINREADYQ = READYQHED.FIRSTREADYF# 21347000
, NOTHINGTODO = (EMPTY(READYQ) AND EMPTY(SHEETQ))# 21347100
; 21348000
WORD WORDREADYQHEAD = WRONGTYPEREADYQHEAD 21349000
, WORDSHEETQHEAD = WRONGTYPESHEETQHEAD 21350000
; 21351000
DEFINE FILLARRAY(ARAY,VALU ,LENGTH) 21352000
= REPLACE POINTER(ARAY) BY VALU FOR LENGTH 21353000
OVERWRITE # 21354000
; 21355000
21356000
QUEUE TERMINATEQ:WRONGTYPETERMINATEQHEAD(DUMMY); REAL DUMMY; 21357000
USING 21358000
LOCKED 21358200
: TO INSERTINQ , INSERTINQUEUE(TERMINATEI,INDEX) 21358400
: EMPTY IF REAL(M[NAME(WRONGTYPETERMINATEQHEAD)])= 0 21358600
: TO REMOVE, STACKQREMOVE(TERMINATEI,INDEX) 21359000
; 21360000
DEFINE NEXTINTERMINATEQ=TERMINATEQHEAD.FIRSTREADYF # 21361000
; 21361500
WORD WORDTERMINATEQHEAD = WRONGTYPETERMINATEQHEAD ; 21362000
REAL READYQHED =WRONGTYPEREADYQHEAD 21363000
, TERMINATEQHEAD = WRONGTYPETERMINATEQHEAD 21364000
, SHEETQHEAD=WRONGTYPESHEETQHEAD 21365000
; 21366000
21367000
21368000
21369000
DEFINE FORWARDLINKSF = FORWARDLINKF # 21370000
, SELFIDENTSF = SELFIDENTF # 21371000
, BACKWARDLINKSF = BACKWARDLINKF # 21372000
; 21373000
21374000
21375000
REAL FIRSTLOK 21376000
; 21377000
LAYOUT LINKWORD ( FORWARDLINKSF 21378000
, SELFIDENTSF 21379000
, BACKWARDLINKSF 21380000
) 21381000
; 21382000
BOOLEAN MUSTREARRANGE 21383000
; 21384000
DEFINE RUNRETURNCONTROLWORD = RUNPCW&RETURNCONTROLWORD 21385000
(,*,*,*,*,*,*) # 21386000
; 21387000
21388000
DEFINE LOOKFORSOMETHING = 21388200
BEGIN 21388300
UNLOCK(READYQ); 21388320
IF NOTFIRSTWAIT AND NOT BUSY(INDEPENDENTRUNNERLOK) 21388400
THEN FORK(STATUS,0); 21388500
ALLOW; ALLOW; DISALLOW; 21388600
GO LOOKFORNEWPROCESS; 21388700
END # ; 21388800
21389000
21390000
DEFINE TIMEOFDAY = SCANIN(TIMEOFDAYWORD) # 21391000
; 21392000
LAYOUT JOBTIME ( TIMEOFDAYF = 47:36) 21393000
; 21394000
REAL SHEETENTRYSIZE ~ SIZE(SHEETQ)-4; 21394200
DEFINE READYENTRYSIZE=SHEETENTRYSIZE # 21394300
, FIXEDIRSIZE = SHEETENTRYSIZE # 21394400
; 21394500
REFERENCE DUMMYREF; 21395000
REAL NEXTINREADYVECTOR 21395100
, NEXUNSHEETVECTOR 21395200
; 21395300
SAVE EVENT ARRAY HOLEINVECTOR[2] 21395400
; 21395500
DEFINE PUTINJOBIDANDTIME(S,N) 21395600
=S[JOBIDPLACE]~N&JOBTIME(S[TIMEENTEREDPLACE] 21395700
~TIMEOFDAY)# 21395800
; 21395900
COMMENT *** FOLLOWING IS DUMMY UNTIL COREFACTOR DEFINED; 21399000
BOOLEAN COREFACTOR; COMMENT TRUE IF MEMORY USAGE IS SATIS- 21400000
FACTORY FOR NEW PROCESS INITIATION; 21400100
DEFINE FIRSTBITPH = 20 # 21400200
, LENGTHPH = 5 # 21400300
, FIRSTBITPC = 15 # 21401000
, LENGTHPC = 8 # 21401500
; 21402000
LAYOUT NATUREOFPROCESS(PROCESSHISTORYF=FIRSTBITPH:LENGTHPH 21402500
,PROCESSCLASSF= FIRSTBITPC:LENGTHPC ) 21403000
; 21403200
DEFINE AD1STACK 21403500
= 0 # 21404000
, NORMAL 21404500
= 1 # 21405000
, XSED 21405500
= 2 # 21406000
, DSED 21406500
= 3 # 21407000
, DEPENDENT 21407200
= 4 # 21407400
, INDEPENDENT 21407600
= 5 # 21407800
, TERMINATEIR 21408000
= 6 # 21408200
; 21408800
COMMENT THE FOLLOWING ARE VALUES FOR PROCESSCLASS; 21409000
DEFINE GOJOB = 0 # 21410000
, EXECUTEJOB= 1 # 21411000
, COMPILENGOJOB= 10# 21412000
, COMPILENSYNTAXJOB= 11# 21413000
, COMPILETOLIBRARYJOB=12# 21414000
, COMPILETOLIBRARYANDGOJOB = 19 # 21414100
, RUNJOB = 20# 21415000
, LIBRARYNGOJOB = 6# 21415100
, COMPILENSYNTAXOBJECT = 7# 21415200
; 21416000
DEFINE FIRSTCOMPILEROPTION = COMPILENGOJOB # 21416200
, LASTCOMPILEROPTION = COMPILETOLIBRARYJOB # 21416300
; 21416400
FIELD INITIATESTACKF = 21:1 21416500
; 21416600
DEFINE COMPILEFORSYNTAX(P) = 21417000
P.PROCESSCLASSF = COMPILENSYNTAXOBJECT#; 21418000
COMMENT DIRECTORY MANAGEMENT GLOBALS; 23000000
DEFINE DIRECTORYBITE = 90 #, %THE SIZE OF A DIRECTORY RECORD 23001000
SEGMENTSPERDIRECTORYBITE = 3 #, 23002000
SYSTEMDIRECTORYINDEX = 0 # %INDEX INTO DISKFILEHEADERS 23002100
; 23003000
ARRAY DISKFILEHEADERS[*,*]; 23003100
INTERLOCK HEADERLOCK; 23003200
ARRAY DISKFILEHEADERSDOPEVECTOR = DISKFILEHEADERS [*]; 23003250
REAL DISKB;%KLUDGE FOR SIMULATOR"S DIRECTORY SEARCH 23003301
DEFINE DIRECTORYLOCK = HEADERLOCKS[0] # 23003310
, HEADERSTOSTARTWITH = 10 # 23003320
; 23003330
INTERLOCK ARRAY HEADERLOCKS[HEADERSTOSTARTWITH]; 23003335
ARRAY SYSTEMDIRECTORY[*]; 23003340
LAYOUT DIRECTORYSEARCHCODES( 23003355
DCODE1 = 38:15 23003360
,DCODE2 = 23:8 23003370
,DCODE3 = 14:15 23003375
); 23003380
COMMENT DEFINES FOR DCODE3 FIELD VALUE WHEN DIRECTORYSEARCH IS 23003383
UNSUCCESSFUL- (WHEN IT RETURNS NEGATIVE VALUE); 23003387
DEFINE NOSUCHFILE=1#, 23003390
NOTAVALIDFILENAME=2#, % DIRECTORY NAME MISSING 23003393
FILETHEREBUTLOCKED=3#, 23003395
FILEWITHWRONGGENEALOGY=4#; 23003397
LAYOUT STANDARDMASSADDRESSWORD( %STANDARD MASS STORAGE 23004000
%ADDRESS FORMAT 23005000
VOLUMEKIND = 47:3 %VOLUME TYPE 23006000
, VOLUMENOEUNOF = 44:25 %VOLUME OR EU UNIT 23007000
%AS PER ABOVE. 23008000
, BLOCKADDRESSF = 19:20 %BLOCK ADDRESS OR BLOCK23009000
%NUMBER. 23010000
); 23011000
DEFINE VOLUMENOF = VOLUMENOEUNOF # 23012000
; 23013000
COMMENT EUNOF = VOLUMENOEUNOF%UNIT NO. OF EU 23014000
, DISKADDRESS = BLOCKADDRESSF 23015000
; 23016000
DEFINE %THESE DEFINITIONS ARE TO 23017000
%BE USED FOR "VOLUMEKIND" 23018000
%IN STANDARD MASS ADDRESS 23019000
%WORDS 23020000
FIXEDDISK = 0# 23021000
, DISKPACK = 1# 23022000
, TAPE = 2# 23023000
; 23024000
COMMENT: 23024050
THE FOLLOWING ARE THE FIRST FOUR WORDS OF A DIRECTORY RECORD. 23024100
SUCCESSOR RECORD = WORD 0 23024150
PREDICESSOR RECORD = WORD 1 23024200
FIRST AVAILABLE NAME BLOCK INDEX = WORD 2 23024250
RECORD NUMBER OF THIS RECORD = WORD 3 23024300
NOTE: 23024350
THERE IS ALWAYS AT LEAST ONE WORD AT THE END OF A RECORD 23024400
WHICH IS USED AS A STOPPER. IT HAS A VALUE OF EITHER 23024450
THREE OR ONE, AS DESCRIBED BY "ENDER" IN THE NAME BLOCK 23024500
DESCRIPTION. 23024550
; 23024600
COMMENT: 23025000
THE FOLLOWING IS A DESCRIPTION OF THE NAME ENTRY FOR A FILE 23026000
IN A DIRECTORY RECORD. 23027000
; 23028000
LAYOUT DIRECTORYENTRYINFOWORD( %WORD 0 23029000
USEMEDIUMF = 47:5 %STORAGE MEDIUM WHERE 23030000
%FILE IS SUPOSED TO BE 23031000
%WHEN IT IS IN USE. 23032000
%USEMEDIUM=0 MEANS THAT23033000
%IT IS WHERE IT SHOULD 23034000
%BE. 23035000
, FILEKINDF = 36:8 %FILE TYPE FOR THE FILE23038000
%(PROGRAM,DIRECTORY...)23039000
, HEADERSIZEF = 28:10 %SIZE (IN WORDS) OF THE23040000
%HEADER FOR THIS FILE. 23041000
, ENDER = 1:2 %DIRECOTRY END MARKER 23042000
% =3 IS END OF RECORD 23043000
% =1 IS END OF FILE 23044000
%IF THE WORD IS -1 THEN23044100
%IT MARKS THE END OF A 23044200
%SCRAMBLED DIRECTORY. 23044300
) 23045000
COMMENT ADDRESSOFFILEHEADER = STANDARDMASSADDRESSWORD-WORD 1;23046000
, DIRECTORYENTRYFILENAME( %WORD 2 23047000
CHARACTERCOUNTF= 47:8 %CHARACTER COUNT FOR 23048000
%FILE NAME. 23049000
, FIRSTFIVECHRS = 39:40 %FIRST FIVE EBCDIC 23050000
%CHARACTERS OF THE FILE23051000
%NAME. (LEFT JUSTIFIED23052000
%WITH TRAILING ZEROS IF23053000
%NECESSARY. 23054000
) 23055000
; 23056000
COMMENT THE NEXT TWO WORDS CONTAIN THE REST OF THE NAME. THE NAME 23057000
IS LIMITED TO 17 CHARACTERS; 23058000
COMMENT: 23069000
THE FOLLOWING IS A DESCRIPTION OF A FILE HEADER 23070000
; 23071000
COMMENT ADDRESSOFHEADER = STANDARDMASSADDRESSWORD 23072000
THIS WORD IS WORD -1 23073000
OF THE CORE COPY OF THE23074000
HEADER RELATIVE TO THE 23075000
DESCRIPTOR RETURNED BY 23076000
DIRECTORY SEARCH 23077000
IT IS IN THE MEMORY LINK 23078000
; 23079000
LAYOUT COREADDRANDLOCKER( %WORD 0 23080000
COREADDRF = 19:20 %ON DISK THIS FIELD IS 23086000
%THE POINTER TO THE 23087000
%CORE COPY OF THIS 23088000
%HEADER. IF THIS FIELD23089000
%IS ZERO, THERE IS NO 23090000
%COPY IN CORE. 23091000
) 23092000
, HEADERINFOONE( %WORD 1 23093000
UPDATEBITF = 47:1 %TRUE IF FILE UPDATED 23094000
, OPENCOUNTF = 46:10 %NUMBER OF PROCESSES 23095000
%LOOKING AT THE HEADER.23096000
, FILEKINDF %SAME AS IN 23097000
%DIRECTORYENTRYINFOWORD23098000
, HEADERSIZEF %SAME AS IN 23099000
%DIRECTORYENTRYINFOWORD23100000
, SECURITYCODEF = 18:4 %CLASS OF SECURITY ON 23101000
%THIS FILE. 23102000
, SECINFOSIZEF = 14:8 %SIZE (IN WORDS) OF THE23103000
%SECURITY INFORMATION 23104000
%IN THIS HEADER. 23105000
, LOGICALMODEF = 3:4 %EBCDIC, DOUBLE, ETC...23106000
) 23108000
, HEADERINFOTWO( % FILE ORGANIZATION 23109000
PACKEDB = 47:1 % (IF 1 FILE IS PACKED)23110000
, PROTECTIONF = 46:1 % (1 IF FILE PROTECTED)23110100
, PERMANENCYF = 45:1 % (1 IF TEMPORARY FILE)23110200
, RECORDTYPEF = 42:3 % RECORD TYPE 23111000
, FILEORGF = 39:40 % FILE ORGANIZATION 23113000
) 23114000
COMMENT WORD 3 IS FIB TANKDATA2; 23115000
COMMENT ENDOFFILECOUNT WORD 4; 23116000
, ROWINFO( %WORD 5 23117000
NUMROWSF = 29:10 %NUMBER OF ROWS FOR 23120000
%WHICH ROW ADDRESS 23121000
%WORDS ARE ASSIGNED. 23122000
, ROWSIZEF = 19:20 %SIZE (IN SEGMENTS) OF 23123000
%EACH ROW . 23124000
) 23125000
, NAMEQUALIFICATIONINFO( %WORD 6 23126000
SAVEFACTORF = 47:10 %SAVE TIME 23127000
, CREATEDDATEF = 37:18 %WHEN THE FILE WAS MADE23128000
, GENERATIONNOF = 19:15 %USASCI GENERATION NO. 23128100
, MAXGENERATIONSF= 4:5 %PURGE ANY OVER THIS 23128200
, GENERATIONNO = 19:20 %USASCI GENERATION NO. 23129000
) 23130000
, ACCESSINFO( %WORD 7 23131000
LASTACCESSDATEF=17:18 %DATE LAST USED 23132000
) 23133000
COMMENT WORD 8 IS USED FOR VARIOUS PURPOSES DEPENDING ON THE FILE KIND.23134000
FOR DIRECTORIES, IT IS THE SCRAMBLE MODULUS. 23134100
FOR CODE FILES, IT IS THE STACK NUMBER FOR THE D1 STACK WHEN 23134200
A COPY OF THE PROGRAM IS RUNNING. 23134300
; 23134900
COMMENT SPARE (WORD 9) = RESERVED FOR EXPANSION; 23135000
COMMENT ROW ADDRESS WORDS IN STANDARD MASS ADDRESS WORD 23136000
FORMAT. ONE WORD PER ROW FOR 23137000
NUMROWS ROWS; 23138000
COMMENT SECURITYINFO SECINFOSIZE WORDS; 23139000
; 23141000
DEFINE FIRSTROWINDEX = 10 # 23141100
, FIRSTROWADDRESS(HDR) = HDR[FIRSTROWINDEX] # 23141120
, ROWADDRESS(HDR, ROW) = HDR[FIRSTROWINDEX + ROW] # 23141130
, SCRAMBLEMOD(HDR) = HDR[8] # 23141150
, HEADERSIZE(HDR) = HDR[1].HEADERSIZEF # 23141200
, HEADERUPDATED(HDR) = TRUE # % TEMPORARY 23141250
, OPENCOUNT(HDR) = HDR[1].OPENCOUNTF # 23141300
, ROWSIZE(HDR) = HDR[5].ROWSIZEF # 23141350
, CRUNCHED(HDR) = 0 # COMMENT TEMPORARY ONLY; 23141400
, NUMBEROFROWS(HDR) = HDR[5].NUMROWSF # 23141450
, D1STACKNUMBER(HDR) = HDR[8] # 23141500
, UPDATED(HDR) = HDR[1].UPDATEBITF# 23141550
, DISKBLOCKING(HDR) = HDR[3]# 23141600
, FIBINFO(HDR) = HDR[2]# 23141650
; 23141950
DEFINE %THESE DEFINITIONS ARE TO 23142000
%BE USED FOR "FILEKIND" IN 23143000
%FILE HEADERS AND DIRECTORY 23144000
%NAME ENTRIES 23145000
DIRECTORY = 0# 23146000
, DATA = 1# 23147000
; 23148000
COMMENT *** FOLLOWING FIELD AND DEFINE ARE TEMPORARY ; 23177100
FIELD TYPEINFOF = 35: 36 ; 23177200
DEFINE COMPILERS = 0 # ; 23177300
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24000000
% I/O INTRINSIC DECLARATIONS %24001000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24002000
% %24003000
% * WARNING * %24004000
% %24005000
% DO NOT REFER TO FIB WORDS OR FIELDS DIRECTLY. INSERT YOUR FIB %24006000
% REFERENCE INTO THE MASTER-FIB DEFINE LIST. ONLY THIS LIST WILL %24007000
% BE CHECKED WHEN IT IS NECESSARY TO CHANGE THE DEFINITION OF A FIB %24008000
% WORD OR FIELD. %24009000
% (HONI SOIT QUI MAL Y PENSE) %24010000
% %24011000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24012000
24013000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24252000
% FIXED PART OF FILE INFORMATION BLOCK %24253000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24254000
DEFINE 24255000
%%%%% SIMPLE I/O 24256000
FIBSIZE = FIB[0]#, % SIZE OF FILE INFO BLOCK 24257000
RECORDSTATUS = FIB[1]#, 24258000
FILESTATUS = FIB[2]#, 24259000
TANKDATA1 = FIB[3]#, % BLOCK SIZE INFORMATION 24260000
TANKDATA2 = FIB[4]#, % RECORD SIZE INFORMATION 24261000
TANKDATA3 = FIB[5]#, % BUFFER SIZE INFORMATION 24262000
IOINFO = FIB[6]#, % HARDWARE INFORMATION 24263000
IOADESC = FIBW[7]#, % TOP IOAREA 24264000
LBLEQTN = FIBW[8]#, % LABEL EQUATION BLOCK 24265000
%%%%% REGULAR I/O 24266000
BUFDESC = FIBW[9]#, % BUFFER DESCRIPTOR 24267000
UNITSLEFT = FIB[10]#, % WORDS OR CHARACTERS LEFT 24268000
BLOCKCOUNT = FIB[11]#, % BLOCK COUNT OR PAGE COUNT 24269000
RECORDCOUNT = FIB[12]#, % RECORD COUNT OR LINE COUNT24270000
LABELATT = FIB[13]#; % LABEL ATTRIBUTES 24272000
LAYOUT 24273000
FIBSIZEL ( 24274000
FIBFXD = 47:8, % SIZE OF FIXED PART 24275000
FIBOPT = 39:40), % VARIABLE PART MASK 24276000
RECORDSTATUSL ( 24277000
MTBUF = 0:1, % BUFFER NEEDS I/O 24278000
UFEAT = 1:1, % UNIT FEATURE 24279000
DRCDSIZE = 2:1, % RECORD SIZE REQUIRED OR DESIRED24280000
EXCEPTION = 3:1, % EXCEPTION CONDITION 24281000
OPNOUT = 4:1, % OPEN OUTPUT 24282000
OPNIN = 5:1, % OPEN INPUT 24283000
DIO = 6:1, % DIRECTED I/O (DATA COMM) 24284000
SIO = 7:1), % SIMPLE I/O 24285000
FILESTATUSL ( 24286000
% EXCEPTION CONDITIONS 24287100
STATEF = 9:10, % STATE OF FILE 24287200
% 0:1 = EOF (DISCONNECT) 24287300
% 1:1 = PARITY ERROR 24287400
% 2:1 = DATA ERROR 24287500
% 3:1 = LOCKOUT 24287600
% 4:1 = NO INPUT(TIME OUT) 24287700
% 5:1 = BREAK 24287800
% ERROR HANDLING LEVEL 24287900
ERRLEVEL = 12:2, % LEVEL OF ERROR RECOVERY 24288000
% 0 = FULL SYSTEM ACTION 24288100
% 1 = INHIBIT COPY 24288200
EXCEPTIONT= 13:1, % EXCEPTION ACTION TAKEN 24288300
OPT = 14:1, % OPTIONAL 24288400
IMPOPEN = 15:1, % (1 IF IMPLICIT OPEN IS NOT OK) 24288410
% EXCEPTION ACTION 24288500
% CODES ARE: 24288600
% 0 = MARK AND EXIT 24288700
% 1 = EVENT OR IMPLICIT LABEL 24288800
% 2 = RETURN OR USE ROUTINE 24288900
% 3 = TERMINATE 24289000
EOFACTION = 22:3, 24289100
PARACTION = 25:3, 24289200
DATACTION = 28:3, 24289300
LOCACTION = 31:3, 24289400
NOIACTION = 34:3, 24289500
BREACTION = 37:3), 24289600
TANKDATA1L ( 24345000
BLKFUNNY = 47:1, % ALTERNATE AREA IN USE 24346000
BLKD = 46:1, % BLOCKED 24347000
MLTBLK = 45:1, % MULTI-PHYSICAL-RECORD BLOCK 24348000
PNTR = 44:1, % (1 IF POINTER TO BE RETURNED) 24349000
INTMODE = 43:3, % INTERNAL RECORD FORM - 24350000
% RECORD DESCRIPTOR TYPE: 24351000
% 0 = SINGLE DATA 24352000
% 1 = DOUBLE DATA 24353000
% 2 = PACKED-DECIMAL (4) 24354000
% 3 = BCL (6) 24355000
% 4 = EBCDIC (8) 24356000
% 5 = ASCII (8) 24357000
RCDUNTS = 40:2, % RECORD UNITS: 24358000
% 0 = WORDS 24359000
% 1 = CHARACTERS 24360000
RCRDTYPE = 38:4, % RECORD TYPE 24361000
% 0 = "F" - FIXED LENGTH 24362000
% 1 = "D" = VARIABLE, LENGTH24363000
% IN BINARY IN FIRST 2 24363100
% CHARACTERS 24363200
% 2 = "V" - VARIABLE, LENGTH24364000
% IN DECIMAL IN FIRST 424364100
% CHARACTERS 24364200
% 3 = "U" - UNDEFINED, SIZE 24365000
% PROVIDED EXPLICITLY 24365100
% 4 = "I" - VARIABLE, LENGTH24366000
% IN RECORD AT FIXED 24366100
% LOCATION 24366200
% 5 = "L" - LINKS 24367000
% 6 = "Z" - FORTRAN 24367100
% 7 = DEPENDENT SPECIFICATN 24367200
% FIXED UP AT OPEN 24368000
SIZEMODE = 34:3, % SIZE MODE 24369000
SIZEOFF = 31:16, % SIZE OFFSET 24370000
SIZESZ = 15:16), % SIZE SIZE 24371000
TANKDATA2L ( 24372000
BLOCKSIZE = 47:16, % BLOCK SIZE 24373000
MINRECSIZE= 31:16, % MINIMUM RECORD SIZE 24374000
MAXRECSIZE= 15:16), % MAXIMUM RECORD SIZE 24375000
TANKDATA3L ( 24376000
BUFFERD = 47:1, % (1 IF BUFFERED - LEVEL 2&3 I/O)24377000
CNTGS = 44:1, % CONTIGUOUS - BUFFERS ADJACENT 24378000
BFFRLCK = 45:1, % (1 IF BUFFERS NEED LOCKS) 24378100
BUFFPROT = 44:1, % (1 IF MUST PROTECT BUFFERS) 24378200
BEVNT = 43:12, % BUFFER EVENT # 24379000
BFFRSZ = 31:16, % BUFFER SIZE (IOAREA SIZE) 24380000
BUFFREQSTD= 15:8, % BUFFERS REQUESTED 24381000
BUFFASSGND= 7:8), % BUFFERS ASSIGNED 24382000
IOINFOL ( 24383000
%%%%% FOR DATACOM USE THIS WORD FOR LAST STATION 24383100
SKLTNIOCW = 47:27, % SKELETON IOCW 24384000
UNITNUM = 12:8, % UNIT NUMBER 24385000
UNITYPP = 4:5), % UNIT TYPE 24386000
LABELATTL ( 24387000
LABELUSER = 47:1, % LABEL USE ROUTINES 24388000
LABELTYP = 46:3, % LABEL TYPE 24389000
% 0 = B6500 USASI 24390000
% 1 = UNLABELLED 24391000
% 2 = SYSTEM STANDARD 24392000
WRPRND = 17:1, % (1 IF WRAPAROUND SPECIFIED) 24392100
USERSIZE = 16:4, % NUMBER OF USERS LABELS 24393000
LBLEQTD = 12:1, % (1 IF HAVE LOCATED FPB) 24394000
EVNTNO = 11:12); % FILE EVENT # 24395000
FIELD 24396000
%%%%% RECORDSTATUS 24397000
OPENBITS = 9:2, 24398000
%%%%% FILESTATUS 24398010
EOFB = 0:1, % END-OF-FILE (DISCONNECT) 24398020
PARITYB = 1:1, % PARITY ERROR 24398030
DATAERRORB= 2:1, % DATA ERROR 24398040
LOCKOUTB = 3:1, % LOCKOUT 24398050
NOINPUTB = 4:1, % NO INPUT (TIME OUT) 24398060
BREAKB = 5:1, % BREAK 24398070
%%%%% IOINFO 24404000
SIOCWSTANDARD = 45:10; % STANDARD FIELD OF IOCW 24405000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24406000
% OPTIONAL PART OF FILE INFORMATION BLOCK %24407000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24408000
DEFINE 24409000
ALTDESCF = 0#, 24410000
FIBLOCKF = 1#, 24411000
FRMTLOCKF = 2#, 24412000
DISKHDRF = 3#, 24413000
DISKINFOF = 4#, 24414000
LIMITSF = 5#, 24415000
USERSF = 6#, 24416000
RERUNF = 7#, 24417000
EOFF = 8#, 24418000
PARITYP = 9#, 24419000
NOINPUTF = 10#, 24420000
BREAKF = 11#, 24421000
QUEUEFULLF= 12#, 24422000
INQUEUEF = 13#, 24423000
TLISTF = 14#, 24424000
TOWF = 15#, 24425000
TMISCF = 16#, 24426000
OUTQUEUEF = 17#, 24426100
SORTWORDF = 18#, 24426200
% FIBOVERFLOW=39#, % RESERVED FOR EXPANSION 24426900
FIIB(FLD) = FIB[FIB0.FIBFXD 24428000
+ONES(FIB0.[39:FLD])]#, 24429000
FIIBW(FLD)= FIBW[FIB0.FIBFXD 24430000
+ONES(FIB0.[39:FLD])]#, 24431000
FIBB(FLD) = BOOLEAN(FIB0.[39-(FLD):1])#, 24432000
ALTDESC = FIBW[FIB0.FIBFXD]#, % ALTERNATE DESCRIPTOR 24433000
% IF BLOCKEDFUNNY THEN DESCRIPTOR FOR ALTERNATE 24434000
% AREA. IF COPY BLOCKING THEN POINTER TO OTHER 24435000
% FIB. 24436000
LOCKER = FIIB(FIBLOCKF)#, % LOGICALRECORD LOCK 24437000
FLOCK = FIIB(FRMTLOCKF)#, % FORMATTER LOCK 24438000
DISKHEADER= FIIBW(DISKHDRF)#, % DISK HEADER 24439000
FILEACCESS= FIIB(DISKINFOF)#, % FILE ACCESS INFORMATION 24440000
FILELIMITS= FIIB(LIMITSF)#, % FILE LIMITS 24441000
USEROUTINES=FIIBW(USERSF)#, % USE-ROUTINE-INDEX ARRAY 24442000
RERUNATT = FIIB(RERUNF)#, % RERUN ATTRIBUTES 24443000
EOFE = FIIBW(EOFF)#, % END OF FILE EVENT 24444000
PARITYE = FIIBW(PARITYP)#, % PARITY EVENT 24445000
NOINPUTE = FIIBW(NOINPUTF)#, % NO INPUT EVENT 24446000
BREAKE = FIIBW(BREAKF)#, % BREAK EVENT 24447000
QUEUEFULLE= FIIBW(QUEUEFULLF)#,% QUEUE FULL EVENT 24448000
INQUEUE = FIIBW(INQUEUEF)#, % INPUT QUEUE 24449000
TERMINALISTF=FIIBW(TLISTF)#, % TERMINAL LIST 24450000
TOCCURSWORD=FIIB(TOWF)#, % TERMINAL OCCURS WORD 24451000
TMISC = FIIB(TMISCF)#, % TERMINAL MISC WORD 24452000
OUTQUEUE = FIIBW(OUTQUEUEF)#,% OUTPUT QUEUE 24452100
SORTWORD = FIIB(SORTWORDF)#, % SORT INFO 24452200
USERS = FIBB(USERSF)#, 24453000
KLUDGED = 0#; 24454000
LAYOUT 24455000
FILEACCESSL ( 24456000
EXPADRS = 41:1, % (1 IF EXPLICIT ADDRESS IS 24459000
% PERMITTED WITH SEQUENTIAL 24460000
% FILE) 24461000
BEGINO = 40:1, % (1 IF FILE BEGINS AT 1) 24462000
ACSSTYPE = 39:4, % FILE ACCESS TYPE: 24463000
% 0 = SERIAL 24464000
% 1 = RANDOM 24465000
% 2 = LINKED 24466000
% 3 = DIRECTED 24467000
ACSSMODES = 35:1, % (1 IF ACCESS MODE SPECIFIED) 24467100
ACSSMODE = 34:3, % ACCESS MODE (IF LINKED) 24468000
% SAME VALUES AS INTMODES 24469000
ACSSOFF = 31:16, % ACCESS OFFSET 24473000
ACSSZ = 15:16), % ACCESS SIZE 24474000
RERUNATTL ( 24475000
RERUNEOR = 47:2, % RERUN END-OF-REEL 24476000
% 0 = NONE 24477000
% 1 = EOR 24478000
% 2 = RECORDS 24479000
% 3 = CLOCK UNITS 24480000
RERUNHERE = 45:1, % RERUN ON THIS TAPE 24481000
RERUNCOUNT= 31:16, % NUMBER OF RECORDS: ACCUMULATOR 24482000
RERUNNO = 15:16), % NUMBER OF RECORDS: TARGET 24483000
TOCWL ( 24484000
TERMINALSZ= 47:16, % TERMINAL SIZE 24485000
NUMTERMS = 31:16); % NUMBER OF TERMINALS 24486000
DEFINE 24487000
% TERMINAL LIST 24488000
TOUTQUEUE = TLISTW[TSZ]#, % OUTPUT QUEUE (DIRECTED) 24489000
TSTATUS = TLIST[TSZ+1]#, % TERMINAL STATUS 24490000
TFILE = TLISTW[TSZ+2]#, % TERMINAL FILE 24491000
TTIME = TLIST[TSZ+3]#, % TERMINAL TIME DATA 24492000
TINQUEUE = TLISTW[TSZ+4]#, % INPUT QUEUE (TERMINAL) 24493000
TSTAT = TLIST[TSZ+5]#; % TERMINAL STATISTICS 24494000
DEFINE 24494100
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24494110
% LABEL-EQUATION BLOCK (LEB) %24494120
% SAME FORMAT ALSO USED IN LABEL TABLE AND FPB %24494130
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24494140
% FIXED PART LEB 24494150
LEBC = LEB[0]#, % BASIC DATA: SIZE,KIND ... 24494160
GEN1 = LEB[1]#, % REEL, CYCLE, VERSION 24494170
GEN2 = LEB[2]#, % DATE, SAVE FACTOR 24494180
DSKS = LEB[3]#, % DISK INFO AND MYUSE,OTHERUSE...24494190
OPENTIME = LEB[4]#, % TIME FILE OPEN 24494200
% OPTIONAL PART LEB 24494210
% BLK1 = LEB[U]#, % FILE TYPE,BLOCK SIZE,MAX REC SZ24494220
% BLK2 = LEB[U+1]#, % MINIMUM RECORD SIZE 24494230
% TITLE FOLLOWS LAST WORD OF OPTIONAL PART 24494240
% LABEL TABLE 24494250
LCNTRL = UINFOP[U,0]#, 24494260
LGEN1 = UINFOP[U,1]#, 24494270
LGEN2 = UINFOP[U,2]#, 24494280
LMISC = UINFOP[U,3]#, 24494290
USERFIB = UINFOPW[U,4]#,% SIRW TO USERS FIB 24494300
LBLK1 = UINFOP[U,5]#, 24494310
LBLK2 = UINFOP[U,6]#; 24494320
LAYOUT 24495000
% LABEL-EQUATION BLOCK (LEB) 24496000
LEBCNTRL ( 24497000
FXD = 47:4, % NUMBER OF WORDS IN FIXED PART 24498000
OPTMASK = 43:15, % OPTIONAL-PART MASK 24499000
% OPTIONALF = 23:1, % OPTIONAL 24499010
% FPRTCTD = 20:1, % FILE PROTECTED 24499020
LPARITY = 19:1, % PARITY (1 IS ODD) 24500000
DENSITYS = 18:1, % ON IF DENSITY SPECIFIED 24501000
DENSITYL = 17:2, % DENSITY: 0-800, 1-556, 2-200, 24502000
% 3-1600 24503000
LABELTYPES= 15:1, % ON IF LABEL TYPE SPECIFIED 24504000
LABELTYPEL= 14:4, % LABEL TYPE: 24505000
% 0 - B6500 USASI 24506000
% 1 - UNLABELLED 24507000
% 2 - B5500 24508000
% 3 - SYSTEM STANDARD 24509000
% 4 - B3500 USASI 24510000
% 5 - NON-STANDARD USASI 24511000
% 6 - BACKUP TAPE 24512000
% 7 - LIBRARY TAPE 24513000
% 8 - LOAD-CONTROL TAPE 24514000
% 9 - SYSTEM TAPE 24515000
% 10 - B5500 BACKUP 24516000
% 11 - B5500 LIBRARY 24517000
EXTFORML = 10:3, % EXTERNAL FORM 24518000
% PROBLEM WITH UNSPECIFIED Q 24518010
PTYPEL = 7:8), % PERIPHERAL TYPE 24519000
%%%%% FOR CARD READERS HAVE ONLY THIS BLOCK PLUS THE NAMES 24520000
GENEALOGY1 ( 24521000
CYCLE =38:15, % CYCLE (GENERATION NUMBER) 24522000
GENVERSN = 23:8, % GENERATION VERSION 24523000
REELS = 15:1, % ON IF REEL NUMBER SPECIFIED 24524000
REEL = 14:15), % REEL NUMBER 24525000
GENEALOGY2 ( 24526000
% SERIALN = 45:20, % SERIAL # (FOR LABEL TABLE) 24526010
SAVFACTOR = 25:11, % SAVE FACTOR 24527000
CRTNDATE = 14:15), % CREATION DATE 24528000
LMISCL ( % USED IN LABEL TABLE 24529000
BCNTL = 43:20, % BLOCK COUNT 24530000
RCNTL = 23:24), % RECORD COUNT 24531000
DISKSPECL ( 24532000
DIRECTIONF= 47:1, % (1 IF REVERSED) 24533000
REVACTIONF= 46:1, % (1 IF OPEN REVERSE GOES 1 REEL)24533100
DRCTRYF = 43:1, % (1 IF GOES IN DIRECTORY) 24533200
PACKEDF = 42:1, % PACKED 24533300
FLEXIBLEF = 41:1, % FLEXIBLE 24533400
SPEEDF = 40:3, % SPEED 24534000
OTHERUSEF = 37:2, % OTHER USE 24535000
MYUSEF = 35:2, % MY USE 24536000
ACCSSTYPEF= 33:4, % ACCESS TYPE 24537000
NUMAREAS = 29:10, % NUMBER OF AREAS 24538000
AREASIZE = 19:20), % AREA SIZE 24539000
% OPTIONAL PART OF LEB RELATIVE WORD #24540000
%*************************************************************%24540050
% POINTER TO INTERNAL NAME (IF ANY) % 124540100
%*************************************************************%24540110
BLOCKING1 ( % 224541000
FILETYPEL = 41:3, % FILE TYPE 24542000
NONBUFFRDL= 38:1, % NON-BUFFERED 24543000
BUFFERNOL = 37:6, % NUMBER OF BUFFERS 24544000
MAXRECSZL = 31:16, % MAXIMUM RECORD SIZE 24545000
BLOCKSZL = 15:16), % BLOCK SIZE 24546000
BLOCKING2 ( % 324547000
MINRECSZL = 15:16); % MINIMUM RECORD SIZE 24548000
FIELD 24549000
FPRTCTD = 20:1, % FILE PROTECTED 24550000
OPTIONALF =23:1, % ON, IF OPTIONAL FILE 24551000
% GENEALOGY2 24552000
SERIALN = 45:20; % SERIAL # (FOR LABEL TABLE) 24553000
DEFINE 24553100
INTNAME = 0#, 24553110
BLCKNG1 = 1#, 24553120
BLCKNG2 = 2#, 24553130
FRMS = 3#, 24553140
LEEB(FLD) = LEB[LEBC.FXD+ONES(LEBC.[43:FLD])]#, 24553150
LEBB(FLD) = BOOLEAN(LEB[LEBC.FXD+ONES(LEBC.[43-FLD:1])])#,24553160
BLK1 = LEEB(BLCKNG1)#,% FILE TYPE, BLOCKING INFO 24553170
BLK2 = LEEB(BLCKNG2)#,% MINIMUM RECORD SIZE 24553180
KLUDGED1 = 0#; 24553190
DEFINE 24571000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24571100
% FILE LABEL DEFINES %24571200
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24571300
24571400
% B6500 USASI LABELS 24572000
% VOL1 24573000
UVSN = PVOL1+4#, % SERIAL NUMBER 24574000
UMFID = PVOL1+11#, % MULTIPLE FILE ID 24575000
USYSN = PVOL1+28#, % "65" 24576000
USYST = PVOL1+30#, % TAPE TYPE 24577000
% 0 - SCRATCH 24578000
% 1 - USER 24579000
% 2 - LIBRARY 24580000
% 3 - BACK UP 24581000
% 4 = LOAD CONTROL 24582000
ULSL = PVOL1+79#, % 1 IF STANDARD USASI 24583000
% HDR1 24584000
UFID = PHDR1+4#, % FILE ID 24585000
URLNMBR = PHDR1+27#, % FILE SECTION NUMBER (REEL #) 24586000
USQNCNMBR = PHDR1+31#, % FILE SEQUENCE NUMBER (POSITION)24587000
UGNRTN = PHDR1+35#, % GENERATION NUMBER 24588000
UVRSN = PHDR1+39#, % VERSION 24589000
UCDT = PHDR1+42#, % CREATION DATE 24590000
UEDT = PHDR1+48#, % EXPIRATION DATE 24591000
UBCNT = PHDR1+54#, % BLOCK COUNT 24592000
URCNT = PHDR1+60#, % RECORD COUNT 24593000
USYSL = PHDR1+67#, % " B6500" 24594000
% HDR2 24595000
URF = PHDR2+4#, % RECORD FORMAT 24596000
UBL = PHDR2+5#, % BLOCK LENGTH 24597000
URL = PHDR2+10#, % RECORD LENGTH 24598000
UDNSTY = PHDR2+15#, % DENSITY 24599000
USNTNL = PHDR2+16#, % SENTINEL 24600000
UPRTY = PHDR2+17#, % PARITY 24601000
UFORM = PHDR2+18#, % EXTERNAL FORM 24602000
UMRL = PHDR2+19#, % MINIMUM RECORD LENGTH 24603000
UOFS = PHDR2+50#, % OFFSET TO DATA 24604000
% B3500 USASI LABELS 24605000
% VOL1 ALL BLANKS EXCEPT "VOL1",SERIAL NUMBER, AND "1" 24606000
% HDR1 24607000
B35FID = PHDR1+13#, % B3500 FILE ID 24608000
B35MFID = PHDR1+21#, % B3500 MULTIPLE FILE ID 24609000
% NO HDR2 24610000
% B5500 LABELS 24611000
% B5500 LABEL 24612000
LMFIO = PVOL1+9#, 24613000
LFID = PVOL1+17#, 24614000
LREEL = PVOL1+24#, 24615000
LCDT = PVOL1+27#, 24616000
LCYCLE = PVOL1+32#, 24617000
LEDT = PVOL1+34#, 24618000
LSNTNL = PVOL1+39#, 24619000
LBCNT = PVOL1+40#, 24620000
LRCNT = PVOL1+45#, 24621000
LMEMDUMP = PVOL1+52#, 24622000
LVSN = PVOL1+53#; 24623000
LAYOUT 24624000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24624100
% UNIT FEATURE WORD (PASSED BY COMPILERS TO LOGICALRECORD) %24624200
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24624300
UFEATL ( % UNIT FEATURE LAYOUT 24625000
MOTIONF = 47:1, % (1 IF PRINT AFTER PAPER MOTION)24626000
DRCTNF = 46:1, % (1 IF REVERSE SPACE) 24627000
SKIPFF = 45:1, % (1 IF SKIP TO CHANNEL) 24628000
ABSLINEF = 44:1, % (1 IF ABSOLUTE LINE NUMBER) 24629000
WRAPF = 43:1, % ( 1 IF WRAPAROUND) 24630000
REUSEF = 42:1, % (1 IF REUSE THIS RECORD) 24631000
FORMATTERF= 41:1, % (1 STILL IN THE FORMATTER) 24632000
MEMINHIBITF=40:1, % (1 NO DATA TRANSFER) 24632010
CVALUEF = 15:16); % CONTROL VALUE: 24633000
% ABSOLUTE LINE NUMBER 24634000
% RELATIVE LINE NUMBER 24635000
% CHANNEL # 24636000
% ABSOLUTE RECORD # 24637000
% RELATIVE RECORD # 24638000
DEFINE 24639000
% USE-ROUTINES-INDEX ARRAY 24640000
% INPUT 24641000
BBRI = PUSE#, % BEFORE BEGINNING REEL INPUT 24642000
ABRI = PUSE+1#, % AFTER BEGINNING REEL INPUT 24643000
BBFI = PUSE+2#, % BEFORE BEGINNING FILE INPUT 24644000
ABFI = PUSE+3#, % AFTER BEGINNING FILE INPUT 24645000
BERI = PUSC+4#, % BEFORE ENDING REEL INPUT 24646000
AERI = PUSE+5#, % AFTER ENDING REEL INPUT 24647000
BEFI = PUSE+6#, % BEFORE ENDING FILE INPUT 24648000
AEFI = PUSE+7#, % AFTER ENDING FILE INPUT 24649000
% OUTPUT 24650000
BBRO = PUSE+8#, % BEFORE BEGINNING REEL OUTPUT 24651000
ABRO = PUSE+9#, % AFTER BEGINNING REEL OUTPUT 24652000
BBFO = PUSE+10#, % BEFORE BEGINNING FILE OUTPUT 24653000
ABFO = PUSE+11#, % AFTER BEGINNING FILE OUTPUT 24654000
BERO = PUSE+12#, % BEFORE ENDING REEL OUTPUT 24655000
AERO = PUSE+13#, % AFTER ENDING REEL OUTPUT 24656000
BEFO = PUSE+14#, % BEFORE ENDING FILE OUTPUT 24657000
AEFO = PUSE+15#, % AFTER ENDING FILE OUTPUT 24658000
% IO 24659000
BBRIO = PUSE+16#, % BEFORE BEGINNING REEL IO 24660000
ABRIO = PUSE+17#, % AFTER BEGINNING REEL IO 24661000
BBPIO = PUSE+18#, % BEFORE BEGINNING FILE IO 24662000
ABFIO = PUSE+19#, % AFTER BEGINNING FILE IO 24663000
BERIO = PUSE+20#, % BEFORE ENDING REEL IO 24664000
AERIO = PUSE+21#, % AFTER ENDING REEL IO 24665000
BEFIO = PUSE+22#, % BEFORE ENDING FILE IO 24666000
AEFIO = PUSE+23#, % AFTER ENDING FILE IO 24667000
% ERROR 24668000
EI = PUSE+24#, % ERROR INPUT 24669000
ERO = PUSE+25#, % ERROR OUTPUT 24670000
EIO = PUSE+26#; % ERROR IO 24671000
DEFINE 24672000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24673000
% IOAREA - NORMAL STATE I/O BUFFER LAYOUT %24674000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24675000
% AT THE FRONT OF THE IOAREA IS THE IOCB - I/O CONTROL BLOCK %24676000
% USER = 0 % USER WORD: 24677000
% PRIORITY, UNIT-NUMBER, 24678000
% WORD-COUNT, I/O-ERROR RECOVERY 24679000
% MISC = 1 % RECEIVES RESULT DESCRIPTOR 24680000
% AREADESC= 2 % POINTS AT BEGINNING OF BUFFER (IOCW)24681000
% EVNT = 3 % POINTS AT THE BUFFER (FILE) EVENT 24682000
% PRVSIO = 4 % FORWARD QUEUE LINK 24683000
% NEXTIO = 5 % BACKWARD QUEUE LINK 24684000
% A FEW WORDS ARE NEEDED FOR BUFFER CONTROL ... %24685000
IOAL = 6#, % FORWARD & REVERSE BUFFER LINKS 24686000
IOAW = 7#, % HOLDS NECESSARY FIELDS 24687000
% REWRITE,BEFORE,PASSED,ACTIVE 24688000
% THE BEGINNING OF THE BUFFER %24689000
IOCWP = 8#, % IOCW - I/O CONTROL WORD 24690000
FRSTDATA = 9#, % FIRST DATA 24691000
IOTANKSZ = 9#; 24692000
FIELD 24693000
% IOAW FIELDS 24694000
RWRT = 47:1, % REWRITE 24695000
BFR = 46:1, % BEFORE 24696000
RCN = 39:20, % RECORD NUMBER 24697000
PSSD = 39:10, % PASSED 24698000
ACTV = 29:10, % ACTIVE 24699000
ACTLKY = 19:20; % ACTUAL KEY 24700000
DEFINE 24701000
% ARGUMENT 24702000
INV = 1#, 24703000
OUTV = 2#, 24704000
IOV = 3#, 24705000
REGOPEN = 0#, 24706000
RLSWTCH = 1#, 24707000
STATUSV = 2#, 24708000
PRESENTV = 3#, 24709000
REGCLOSE = 0#, 24709100
RELEASEV = 1#, 24710000
PURGEV = 2#, 24710100
MOREWINDV = 3#, 24710200
LOCKV = 4#, 24711000
CRUNCHV = 5#, 24711100
HERE = 6#, 24712000
ASTRSK = 7#; 24713000
DEFINE 24714000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24715000
% MASTER LIST OF FIB DEFINES %24716000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24717000
ACCESSMODE = FILEACCESS.ACSSMODE#, %24718000
ACCESSOFF = FILEACCESS.ACSSOFF#, 24719000
ACCESSZ = FILEACCESS.ACSSZ#, 24720000
ACCESSTYPE= FILEACCESS.ACSSTYPE#, 24720100
ACTIONTAKEN=BOOLEAN(ATAKEN)#, 24720150
ACTIVE = IOAREA[IOAW].ACTV#, 24721000
ACTUALKEY = IOAREA[IOAW].ACTLKY#, 24722000
ADD1TOBIT32=4294967296#, 24722100
ADRSF = ADDRESSF#, 24723000
AFTER = BOOLEAN(UNITFEATURE.MOTIONF)#, 24723100
ALREADYOPEN = RECORDSTATUS.OPENBITS!0#, 24724000
ATAKEN = FILESTATUS.EXCEPTIONT#, 24724010
ARRAYROW = BOOLEAN(TANKDATA1.PNTR)#, 24724100
BEFORE = NOT AFTER#, 24724200
BFFRD = TANKDATA3.BUFFERD#, 24726000
BEFOREACTION=BOOLEAN(IOAREA[IOAW].BFR)#, 24727000
BFFRXHSTD = RECORDSTATUS.MTBUF#, 24728000
BLCKDFNNY = TANKDATA1.BLKFUNNY#, 24729000
BFRACTN = IOAREA[IOAW].BFR#, 24730000
BLKDFNNY(P1,P2,SZ) = IF BLOCKEDFUNNY THEN 24731000
REPLACE P1 BY P2 FOR SZ WORDS#, 24732000
BLOCKED = BOOLEAN(TANKDATA1.BLKD)#, 24733000
BLOCKEDFUNNY = BOOLEAN(TANKDATA1.BLKFUNNY)#, 24734000
BLOCKSZ = TANKDATA2.BLOCKSIZE#, 24735000
BUFFERED = BOOLEAN(BFFRD)AND NUMBEROFBUFFERS!0#, 24736000
BUFFEREXHAUSTED = BOOLEAN(RECORDSTATUS.MTBUF)#, 24737000
BUFFERSZ = TANKDATA3.BFFRSZ#, 24738000
BUFFREQ = TANKDATA3.BUFFREQSTD#, 24739000
CARRIAGECONTROL=RECORDSTATUS.UFEAT#, 24740000
CHANNELNO = UNITFEATURE.ADDRESSF#, 24741000
CHANNELSKIP=BOOLEAN(UNITFEATURE.SKIPF)#, 24742000
CHARECORD = BOOLEAN(RECORDUNITS)#, 24742100
CHERE = FILESTATUS.CLSHR#, 24743000
CLOSEHERE = BOOLEAN(FILESTATUS.CLSHR)#, 24744000
CONTGS = TANKDATA3.CNTGS#, 24745000
CONTIGUOUS= BOOLEAN(TANKDATA3.CNTGS)#, 24746000
CRRGCNTRL = BOOLEAN(CARRIAGECONTROL)#, 24747000
DIRECTION = IOINFO.IOBACKWARD#, 24748000
DISC = UNITYP=DISKFILE#, 24749000
DISKREAD = @460#, % MEMORY PROTECT 24749100
DISKWRITE = @040#, 24749200
DIVORCEMOM(A)=A~A&DIVMOML(,)#, 24750000
ENDOF = BOOLEAN(FILESTATUS.EOFB)#, 24751000
ENDOFACTION = FILESTATUS.EOFACTION#, 24752000
ENDOFTAKEN= ENDOF AND ACTIONTAKEN#, 24753000
ENDOV = FILESTATUS.EOFB#, 24754000
ENTERDIR = FILEACCESS.DRCTRYF#, 24755000
EVENTNO = TANKDATA3.BEVNT#, 24756000
EXPLICITADDRESS=BOOLEAN(FILEACCESS.EXPADRS)#, 24757000
FFORTRAN = RECORDTYPE=6#, 24757100
BIB0 = FIBSIZE#, 24757200
FIBUZZ = IF FIBB(FIBLOCKF) THEN BEGIN 24758000
WHILE BOOLEAN(READLOCK(1,LOCKER)) DO 24759000
WAIT(IOEVENT[FILEVENT]); 24760000
RESET(IOEVENT[FILEVENT]) END#, 24761000
FILEDRCDSIZE=BOOLEAN(RECORDSTATUS.DRCDSIZE)#, 24761050
FILEMTBUF = BOOLEAN(RECORDSTATUS.MTBUF)#, 24761100
FILENOTOPEN = RECORDSTATUS.OPENBITS=0#, 24762000
FILEVENT = LABELATT.EVNTNO#, 24763000
FILEXCPTN = BOOLEAN(RECORDSTATUS.EXCEPTION)#, 24764000
FIXEDL = RECORDTYPE=0#, 24764100
FLINKED = RECORDTYPE=5#, 24764200
FORMATD = RECORDTYPE=1#, 24764300
FORMATI = RECORDTYPE=4#, 24764400
FORMATTER = BOOLEAN(TANKDATA1.PNTR)AND PFOCRCSZ#, 24764450
FORMATU = RECORDTYPE=3#, 24764500
FORMATV = RECORDTYPE=2#, 24764600
FORMSMESSAGE=LEBB(FRMS)#, 24764700
GENSZ= 4#,% 24766000
IMPLCTOPN = FILESTATUS.IMPOPEN#, 24767000
IMPLICITOPEN=NOT BOOLEAN(IMPLCTOPN)#, 24768000
INOUTPART = DSKS.MYUSEF#, 24769000
INTERNALMODE = FILESTATUS.INTMODE#, 24770000
IOCOMPLET = USER@(IOCB).USERIOFINISH#, 24771000
IOCOMPLETE= BOOLEAN(WORD(USER@IOCB).(USERIOFINISH)#, 24772000
IOCWSKLTN= IOINFO#, 24774000
IOPENDING = NOT IOCOMPLETE#, 24775000
IOTERMINATE=BEGIN TRACE(18);TRACE(21)END#, 24776000
LABELEQTD = BOOLEAN(LABELATT.LBLEQTD)#, 24777000
LABELTYPE = LABELATT.LABELTYP#, 24778000
LASTBUFFER=IOAREA~*&ARRAYDESCL(,*,IOAREA[IOAL].BL)#, 24778100
LASTLENGTH= TANKDATA1.SIZESZ#, 24778200
LBLEQUATED= LABELATT.LBLEQTD#, 24779000
LOCKOUT = FILESTATUS.LOCKOUTB#, 24780000
MAGICNUMBER=150#, 24781000
MAXGENNO= 9999#,% 24781100
MAXNO = 549755813887#, 24782000
MAXRECSZ = TANKDATA2.MAXRECSIZE#, 24783000
MAXVERNO= 99#,% 24783100
MINRECSZ = TANKDATA2.MINRECSIZE#, 24784000
MLTBLCK = TANKDATA1.MLTBLK#, 24785000
MULTIBLOCK= BOOLEAN(TANKDATA1.MLTBLK)#, 24786000
NEXTBUFFER=IOAREA~*&ARRAYDESCL(,*,IOAREA[IOAL].FL)#, 24786100
NOACTION = BOOLEAN(UNITFEATURE.REUSEF)#, 24786200
NOLINES = UNITFEATURE.ADDRESSF#, 24786600
NOMORE = BOOLEAN(WORD(USER@IOCB).USEREOFORTBIT)#, 24789000
NOTOPEN = RECORDSTATUS.OPENBITS=0#, 24791000
NUMBEROFBUFFERS = TANKDATA3.BUFFASSGND#, 24792000
NUMLABELS = LABELATT.USERSIZE#, 24794000
ONEREELREVERSE=BOOLEAN(DSKS.REVACTIONF)#, 24795000
OPENINPUT = BOOLEAN(RECORDSTATUS.OPNIN)#, 24796000
OPENIO = RECORDSTATUS.OPENBITS=3#, 24797000
OPENOUTPUT = BOOLEAN(RECORDSTATUS.OPNOUT)#, 24798000
OPNINPUT = RECORDSTATUS.OPNIN#, 24799000
OPNOUTPUT = RECORDSTATUS.OPNOUT#, 24800000
NOPTIONAL = LEBC.OPTIONALF#, 24801000
OPTSPACE(SYZE)=GETSPACE(SYZE,0,0,0)#, 24802000
PARITYERROR=BOOLEAN(WORD(USER@IOCB).USERPARITYBIT)#, 24802100
PARITYERR = FILESTATUS.PARITYB#, 24802500
PARITYACTION=FILESTATUS.PARACTION#, 24802600
PASSED = IOAREA[IOAW].PSSD#, 24803000
PFOCRCSZ = BOOLEAN(PFOC.DRCDSIZE)#, 24807000
PFOCMTBUF = BOOLEAN(PFOC.MTBUF)#, 24808000
PLMT(UT) = ((UT=CARDREADER OR UT=CARDPUNCH1 OR 24810000
UT=CARDPUNCH2) AND BLOCKSZ>10 OR 24811000
(UT=BUFFPRINTER OR UT=UNBUFFPRINTER) AND 24812000
BLOCKSZ>17 24813000
)#, 24814000
PNCH(UT) = (UT=CARDPUNCH1 OR UT=CARDPUNCH2)#, 24814010
POINTEREQD=ARRAYROW#, 24814050
PRINTSPACE= @200#, 24814100
PRNTR(UT) = (UT=BUFFPRINTER OR UT=UNBUFFPRINTER)#, 24816000
PROPERIOACTION = RECORDSTATUS.OPNIN=PFOC.OPNIN#, 24817000
PROTECTED = LEBC.FPRTCTD#, 24818000
PRTY = BOOLEAN(FILESTATUS.PARITYB)#, 24819000
PRTYACTN = FILESTATUS.PARACTION#, 24820000
RANDOM = ACCESSTYPE=1#, 24821000
RCRDSZ(A,B)=IF FIXEDL THEN MAXRECSZ ELSE IF FLINKED THEN 24821100
IF WORDORIENTED THEN M[A.ADDRESSF].FRWRDLNK 24821200
ELSE REAL(B,WORDSTO).FRWRDLNK ELSE 24821300
CALCRECSZ(A,FIB)#, 24821400
RECINBLK = IOAREA[IOAW].RCN#, 24824000
RECORDMODE = TANKDATA1.SIZEMODE#, 24827000
RECORDOFF = TANKDATA1.SIZEOFF#, 24828000
RECORDSZ = TANKDATA1.SIZESZ#, 24829000
RECORDUNITS=TANKDATA1.RCDUNTS#, 24830000
RECORDTYPE= TANKDATA1.RCRDTYPE#, 24831000
RECSIZE = TANKDATA2.MAXRECSIZE#, 24832000
REQSPACE(SYZE)=GETSPACE(SYZE,0,0&SPACETYPE(0,1,1,0),0)#, 24833000
REVERSED = BOOLEAN(DIRECTION)#, 24834000
REVERSETYPE = UNITYP=DISKFILE OR MAGTAPE(UNITYP)#, 24835000
REWRITE = BOOLEAN(IOAREA[IOAW].RWRT)#, 24836000
REWRT = IOAREA[IOAW].RWRT#, 24837000
ROTATEBUFFERS=IF BUFFERED THEN 24837100
IOCB~REFERENCE(IOAREA~IOADESC~ 24837200
IOAREA&ARRAYDESCL(,*,IOAREA[IOAL].FL))#, 24837300
SIZEPROBLEM=FILESTATUS.DATAERRORB#, 24841000
SKLTN = IOINFO.SKLTNIOCW#, 24843000
SKLTNSTNDRD = IOINFO.SIOCWSTANDARD#, 24844000
TANKEY = IOAREA[IOAW].ACTLKY#, 24845000
TAPEFILE = MAGTAPE(IOINFO.UNITYPP)#, 24846000
TAPEREWIND=@210#, 24847000
TAPESPACE = @600#, 24847100
UNBLOCKED = NOT BOOLEAN(TANKDATA1.BLKD)#, 24848000
UNITNUMBER=IOINFO.UNITNUM#, 24849000
UNITYP=IOINFO.UNITYPP#, 24850000
UNLABELLED= LABELTYPE=1#, 24851000
UNLOCKFIB = IF FIBB(FIBLOCKF) THEN BEGIN 24852000
READLOCK(0,LOCKER); 24853000
CAUSE(IOEVENT[FILEVENT]) END#, 24854000
USASILABEL= LABELTYPE=0#, 24855000
VERSZ= 2#,% 24856000
WORDORIENTED=NOT CHARECORD#, 24856050
WORDSLEFT = UNITSLEFT#, 24856100
WORDSTO = CASE INTERNALMODE OF(1,.5,12,8,6,6)#, 24857000
WORDSTORND= CASE INTERNALMODE OF (0,0,11,7,5,5)#, 24858000
WRAPAROUND= LABELATT.WRPRND#; 24859000
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24860000
SAVE PROCEDURE AVAILREMOVE (AVAILZLINK); 30000000
VALUE AVAILZLINK; 30001000
INTEGER AVAILZLINK; 30002000
BEGIN COMMENT REMOVE AN AREA FROM THE AVAILABLE LIST; 30003000
INTEGER MI ~ AVAILZLINK - M[AVAILZLINK].LENGTHZ + 1; 30004000
INTEGER T; 30005000
IF MI-1 = PREVADDR 30006000
THEN BEGIN COMMENT THE AREA TO BE REMOVED IS THE LARGEST 30007000
AREA THAT FOLLOWS A NON-OVERLAYABLE AREA. 30008000
AVAILB CONTAINS THE NEW PREVADDR.; 30009000
PREVADDR ~ M[MI] 30010000
END; 30011000
M[M[MI]].LINK ~ T ~ M[MI-1].LINK; 30012000
COMMENT PREVIOUS POINTS AT NEXT; 30013000
M[T+1] ~ M[MI]; 30014000
COMMENT NEXT POINTS AT PREVIOUS; 30015000
END OF AVAIL REMOVE; 30016000
SAVE PROCEDURE ORDER (ADDRESS); 30017000
VALUE ADDRESS; 30018000
INTEGER ADDRESS; 30019000
BEGIN COMMENT ORDER PLACES THE AREA WITH AVAILA AT ADDRESS IN 30020000
THE AVAILABLE LIST ACCORDING TO THE ARGUMENT IN 30021000
BITS 47:27 OF THE WORD AT ADDRESS.; 30022000
INTEGER T; COMMENT THE LINK THIS LINK WILL POINT AT.; 30023000
REAL RETRIES; 30023100
IF NOT BOOLEAN (M[ADDRESS].PREOLAY) 30024000
THEN BEGIN COMMENT UPDATE PREVADDR IF REQUIRED AND DETER- 30025000
MINE HIGHEST STARTING POINT FOR LLLU OPERATOR.; 30026000
IF M[ADDRESS].LENGTH > M[PREVADDR].LENGTH 30027000
THEN PREVADDR ~ ADDRESS; 30028000
MINDEX ~ AVAILI; 30029000
END 30030000
ELSE MINDEX ~ PREVADDR; 30031000
M[ADDRESS + 1] ~ MINDEX ~ 30032000
LISTLOOKUP (M[ADDRESS].AVAILKEY, M, MINDEX); 30033000
M [ADDRESS].LINK ~ T ~ M[MINDEX].LINK; 30034000
M [MINDEX].LINK ~ ADDRESS; 30035000
M [T + 1] ~ ADDRESS; 30036000
IF SPACEQHEAD !0 THEN 30036050
IF ((RETRIES ~ ( STACK [T~SPACEQHEAD.FASTPLACE, 30036100
AUTHORITYLINKPLACE]).RETRYCOUNT) =0 30036200
OR STACK [T, REQUIREDPLACE] { M [ADDRESS].LENGTH) 30036250
THEN BEGIN 30036300
DELINKASTACK (T, SPACEQHEAD); 30036400
CAUSE (AUTHORITYEVENT @(REFERENCE(STACK[T,*]))); 30036500
END 30036600
ELSE STACK [T, AUTHORITYLINKPLACE].RETRYCOUNT ~ RETRIES - 1; 30036650
END OF ORDERING AVAILABLE LIST; 30037000
DEFINE GETLEFTOFF (ADDRESS) = 30038000
IF ADDRESS = LEFTOFF 30039000
THEN LEFTOFF ~ M[M[ADDRESS].INUSELENGTH + ADDRESS].FRONTLINK; 30040000
#; 30041000
DEFINE CONSOLIDATE (ADDRESS, MINDEX) = 30042000
BEGIN 30043000
MLENGTH ~ M[ADDRESS].INUSELENGTH; 30044000
IF BOOLEAN (M [MINDEX ~ ADDRESS + M[ADDRESS].INUSELENGTH +1] 30045000
.AVAILABLE) 30046000
THEN BEGIN 30047000
MLENGTH ~ * + (T ~ M[MINDEX].LENGTH) + 1; 30048000
AVAILREMOVE (MINDEX + T); 30049000
END; 30050000
IF BOOLEAN (M[ADDRESS - 1].AVAILABLE) 30051000
THEN BEGIN COMMENT PREVIOUS AREA IS AVAILABLE; 30052000
MLENGTH ~ * + (T ~ M[ADDRESS - 1].LENGTHZ)+1; 30053000
MINDEX ~ ADDRESS - T - 1; 30054000
AVAILREMOVE (ADDRESS-1); 30055000
END 30056000
ELSE MINDEX ~ ADDRESS; 30057000
END 30058000
#; 30059000
SAVE BOOLEAN PROCEDURE TURNOVERLAYKEY (ADDRESSOFMOM); 30060000
VALUE ADDRESSOFMOM; 30061000
INTEGER ADDRESSOFMOM; 30062000
BEGIN COMMENT IF THE SPACE POINTED AT BY MOM IS PRESENT AND 30063000
NON-OVERLAYABLE, SET IT TO ITS PERMANENT STATE 30064000
AND RETURN TRUE OTHERWISE RETURN FALSE; 30065000
WORD MOM, ZLINK; 30066000
INTEGER T, TA, I; 30067000
BOOLEAN B; 30067100
LABEL AWAY; 30067200
IF B ~ UNLOCK (SPACELOCK) THEN BUZZCONTROL (SPACELOCK); 30068000
MOM ~ M[ADDRESSOFMOM]; 30069000
IF MOM.PBITF =1 30070000
THEN BEGIN COMMENT MOM HAS SPACE TO CHANGE; 30071000
T ~ (TA ~ MOM.ADDRESSF) - LINKSIZE - 1; 30072000
DO I ~ * + M[TA ~ * -1].TAG UNTIL TA =T; 30072100
IF I ! (LINKSIZE + 1) | MEMLINK 30072200
THEN GO AWAY; 30072300
T ~ * + 1; 30072400
ZLINK ~ M[T ~ T + M[T].INUSELENGTH]; 30073000
IF TURNOVERLAYKEY ~ ZLINK.SPACEOLAYLOCK =0 30074000
THEN M[T].SPACEOLAYLOCK ~ ZLINK.OLAY; 30075000
END; 30076000
AWAY: 30076100
IF B THEN UNLOCK (SPACELOCK); 30077000
END TURNOVERLAYKEY; 30078000
SAVE PROCEDURE MAKEPRESENTANDSAVE (DATA); 30078100
WORD ARRAY DATA [*]; 30078200
BEGIN 30078300
WORD MPS; MONITOR DONMONITOR (MPS); MPS ~ DATA; %%%%%%%% 30078380
DATA [0] ~ *; 30078500
COMMENT * * * * * * FIX IOFINISH TURNOLAYKEY 2/17 30078599
M[DATA.ADDRESSF + DATA.LENGTHF].SPACEOLAYLOCK ~ 0; 30078600
END OF INSURING PRESENCE AND SAVING DATA; 30078800
SAVE INTEGER PROCEDURE CONSOLIDATEANDORDER(ADDRESS); 30156000
VALUE ADDRESS; 30157000
INTEGER ADDRESS; 30158000
BEGIN 30159000
INTEGER MINDEX, T; 30160000
WORD ZLINK; 30161000
CONSOLIDATE (ADDRESS, MINDEX); 30162000
ZLINK ~ M[MINDEX-1]; 30163000
T ~ REAL(ZLINK.OLAY = 1 OR ZLINK.SPACEOLAYLOCK = 1); 30164000
M[MINDEX] ~ 0 & AVAILA (, T,MLENGTH, , *); 30165000
M[MINDEX ~ MLENGTH] ~ 0 & AVAILZ (,, MLENGTH); 30166000
ORDER (MINDEX); 30167000
CONSOLIDATEANDORDER ~ MINDEX; 30168000
END OF CONSOLIDATING RETURNED AREA AND ORDERING IT IN LIST; 30169000
SAVE INTEGER PROCEDURE FORGETSPACE(ADDRESS); 30170000
VALUE ADDRESS; 30171000
INTEGER ADDRESS; 30172000
BEGIN COMMENT RETURN THE SPACE DESCRIBED BY THE IN-USE LINK 30173000
POINTED AT BY ADDRESS TO THE AVAILABLE LIST. 30174000
WHEN "ADDRESS" IS POSITVE CONSOLIDATION WITH 30175000
ADJACENT AVAILABLE AREAS IS PERFORMED AND THE 30176000
LIST IS RE-ORDERED AND THE NEW ADDRESS IS 30177000
RETURNED. WHEN "ADDRESS" IS NEGATIVE CONSOLI- 30178000
DATION AND ORDERING ARE NOT PERFORMED.; 30179000
LABEL AWAY; 30180000
INTEGER TADDR ~ ABS (ADDRESS) - LINKSIZE, 30181000
FRONTLNK, 30182000
30183000
T, COMMENT TEMPORARY; 30184000
TRACTER, 30185000
MINDEX; 30186000
TRACTER~TRACE(0); 30186100
MINDEX ~ TADDR -1; 30187000
DO T ~ *+M[MINDEX].TAG UNTIL MINDEX ~ * +1 = ABS(ADDRESS); 30188000
IF T ! (LINKSIZE +1) | MEMLINK 30189000
THEN BEGIN 30190000
FORGETSPACE ~ -MINDEX; 30191000
GO AWAY; 30192000
END; 30193000
FRONTLNK ~ M[TADDR + M[TADDR].INUSELENGTH].FRONTLINK; 30194000
IF FRONTLNK ! 0 30195000
THEN BEGIN COMMENT REMOVE AREA FROM IN-USE LIST; 30196000
M[FRONTLNK].BACKLINK ~ MINDEX ~ M[TADDR ].BACKLINK; 30197000
M[MINDEX + M[MINDEX].INUSELENGTH].FRONTLINK ~ 30198000
M[TADDR + M[TADDR ].INUSELENGTH].FRONTLINK; 30199000
END 30200000
ELSE BEGIN COMMENT AREA BEING FORGOTTEN WAS LAST ALLOCATED;30201000
BACKALLOCATED ~ M[TADDR ].LINK; 30202000
M[M[BACKALLOCATED].INUSELENGTH + BACKALLOCATED]. 30203000
FRONTLINK ~ 0; 30204000
END; 30205000
GETLEFTOFF (TADDR); 30206000
IF ADDRESS > 0 30207000
THEN BEGIN COMMENT CONSOLIDATE WITH ADJACENT AVAILABLE 30208000
AREAS AND ORDER NEW AREA IN LIST; 30209000
FORGETSPACE ~ CONSOLIDATEANDORDER (TADDR); 30210000
END 30211000
ELSE FORGETSPACE ~ ADDRESS; 30212000
AWAY: 30213000
TRACE(TRACTER); 30214000
UNLOCK (SPACELOCK); 30214100
END OF FORGETSPACE; 30215000
SAVE PROCEDURE OVERLAY (ADDRESS); VALUE ADDRESS; INTEGER ADDRESS; ; 30216000
SAVE REAL PROCEDURE GETSPACE (SIZE, WHOFOR, TYPE, ADDRESS); 30217000
VALUE SIZE, WHOFOR, TYPE, ADDRESS; 30218000
INTEGER SIZE, WHOFOR, TYPE; 30219000
REAL ADDRESS; 30220000
BEGIN COMMENT 30221000
;30222000
LABEL OVERSRCH, STARTSRCH, TRUBLE, AROUND, ALLDONE; 30223000
LABEL RETRY; 30223100
INTEGER S ~ SIZE + LINKSIZE, 30224000
START, 30225000
ARGS; 30226000
INTEGER TRACTER; COMMENT SAVE AND RESTORE TRACE; 30227000
BOOLEAN TRYAGAIN; 30227100
SAVE INTEGER PROCEDURE TROUBLE (REQ); 30228000
VALUE REQ; 30229000
INTEGER REQ; 30230000
BEGIN COMMENT TROUBLE IS RESPONSIBLE FOR CHASING THE LEFT-OFF 30231000
LIST AND RETURNING WITH AN ADDRESS OF AN AREA 30232000
THAT WILL SATISFY THE SIZE REQUIREMENT (REQ). 30233000
IF AN ADEQUATE AREA CANNOT BE FOUND, A NEGATIVE 30234000
VALUE IS RETURNED. 30235000
;30236000
INTEGER LEFTOFFT ~ LEFTOFF, COMMENT THE NEXT ADDRESS IN THE30237000
LEFT-OFF LIST.; 30238000
R, COMMENT TEMPORARY REQ; 30239000
MINDEX, 30240000
INITIAL, COMMENT THE ABSOLUTE ADDRESS OF THE AREA 30241000
BEING MADE AVAILABLE.; 30242000
FINAL; COMMENT THE FINAL ADDRESS OF THE AREA 30243000
BEING MADE AVAILABLE.; 30244000
BOOLEAN FIRST, COMMENT WHEN TRUE THE SUCCEEDING AS 30245000
WELL AS PRECEDING AREAS ARE EXAMINED 30246000
FOR AVAILABILITY.; 30247000
AVAILB; COMMENT TRUE WHEN THE ADDRESS OF AN 30248000
IN-USE AREA HAS BEEN RECORDED FOR 30249000
OVERLAY BECAUSE OF THE AVAILABILITY OF30250000
AN ADJACENT AREA.; 30251000
LABEL NEXT, 30252000
EXIT; 30253000
WORD TLINK; COMMENT TEMPORARY MEMORY LINK.; 30254000
MONITOR DONMONITOR 30254100
(R 30254200
,INITIAL 30254300
,FINAL 30254400
, TLINK); 30254500
IF TYPE.MAKEROOM = 0 30255000
THEN BEGIN 30256000
MINDEX ~ -1; 30257000
GO EXIT; 30258000
END; 30259000
NEXT: COMMENT EXAMINE NEXT AREA IN LEFT=OFF LIST.; 30260000
SETINTERVALTIMER; 30260100
R ~ REQ; 30261000
MINDEX ~ LEFTOFFT; 30262000
FIRST ~ TRUE; 30263000
DO BEGIN COMMENT BY-PASS NON-OVERLAYABLE ITEMS LEFT- 30264000
OFF LIST.; 30265000
IF LEFTOFFT !0 THEN 30266000
IF NOT BOOLEAN ((TLINK ~ M[LEFTOFFT + M[LEFTOFFT] 30267000
.INUSELENGTH]).SPACEOLAYLOCK) 30268000
THEN MINDEX ~ LEFTOFFT ~ TLINK.FRONTLINK; 30269000
END UNTIL BOOLEAN(TLINK.SPACEOLAYLOCK) OR LEFTOFFT = 0; 30270000
IF MINDEX = 0 30271000
THEN BEGIN COMMENT LEFT-OFF LIST HAS BEEN EXHAUSTED.; 30272000
MINDEX ~ -(IF BOOLEAN (TYPE.SLEEPY) THEN 3 ELSE 5) 30273000
+ TYPE.PRINTNOMEM; 30274000
GO EXIT; 30275000
END; 30276000
FINAL ~ M[MINDEX].INUSELENGTH + MINDEX; 30277000
LEFTOFFT ~ TLINK.FRONTLINK; 30278000
WHILE R > 0 30279000
DO BEGIN COMMENT EXAMINE THIS AREA AND ADJACENT AREAS 30280000
IN DESCENDING MEMORY LOCATIONS UNTIL R { 0 OR 30281000
A NON-OVERLAYABLE AREA IS ENCOUNTERED.; 30282000
AVAILB ~ FALSE; 30283000
IF FIRST 30284000
THEN BEGIN COMMENT THE FIRST TIME THE AREA SUC- 30285000
CEEDING THE LEFT-OFF AREA MUST BE EX- 30286000
AMINED FOR AVAILABILITY.; 30287000
IF INITSWITCH 30287100
THEN BEGIN 30287200
LEFTOFF ~ MINDEX; 30287300
INITSWITCH ~ FALSE; 30287400
END; 30287500
INITIAL ~ MINDEX; 30288000
FIRST ~ FALSE; 30289000
IF BOOLEAN ((TLINK ~ M[(FINAL ~ MINDEX + 30290000
M[MINDEX].INUSELENGTH+1)]).AVAILABLE) 30291000
THEN BEGIN 30292000
INITIAL ~ MINDEX; 30293000
FINAL ~ FINAL + TLINK.LENGTH +1; 30294000
AVAILB ~ TRUE; 30295000
R ~ R - TLINK.LENGTH 30296000
- M[MINDEX].INUSELENGTH; 30297000
END; 30298000
END; 30299000
IF BOOLEAN ((TLINK ~ M[MINDEX - 1]).AVAILABLE) 30300000
THEN BEGIN COMMENT ALL AREAS PRECEDING IN-USE 30301000
AREAS ARE EXAMINED FOR AVAILABILITY.; 30302000
INITIAL ~ MINDEX - TLINK.LENGTHZ - 1; 30303000
R ~ R - TLINK.LENGTHZ - 30304000
(IF AVAILB THEN 1 ELSE M[MINDEX] 30305000
.INUSELENGTH); 30306000
AVAILB ~ TRUE; 30307000
END 30308000
ELSE INITIAL ~ MINDEX; 30308100
R ~ R-(IF AVAILB THEN 1 ELSE M[MINDEX].INUSELENGTH); 30309000
IF R > 0 30310000
AND NOT BOOLEAN (M[INITIAL - 1].SPACEOLAYLOCK) 30311000
THEN GO NEXT; 30312000
MINDEX ~ INITIAL -1 - M[INITIAL -1].INUSELENGTHZ; 30313000
END; 30314000
IF BOOLEAN ((TLINK ~ M[INITIAL - 1]).AVAILABLE) 30315000
THEN INITIAL ~ INITIAL - TLINK.LENGTHZ -1; 30316000
MINDEX ~ INITIAL; 30317000
DO IF AVAILB ~ BOOLEAN ( (TLINK ~ M[MINDEX]).AVAILABLE) 30318000
THEN BEGIN 30319000
AVAILREMOVE (MINDEX + TLINK.LENGTH); 30320000
R ~ TLINK.LENGTH; 30321000
END 30322000
ELSE R ~ TLINK.INUSELENGTH 30323000
UNTIL MINDEX ~ * + R + 1 > FINAL; 30324000
MINDEX ~ INITIAL; 30325000
DO IF NOT AVAILB ~ BOOLEAN ((TLINK ~ M[MINDEX]).AVAILABLE) 30326000
THEN BEGIN 30327000
GLOBALSTOP; 30327100
OVERLAY (MINDEX + LINKSIZE); 30328000
FORGETSPACE (-MINDEX - LINKSIZE); 30329000
R ~ TLINK.INUSELENGTH; 30330000
END 30331000
ELSE R ~ TLINK.LENGTH 30332000
UNTIL MINDEX ~ * + R + 1 > FINAL; 30333000
MINDEX ~ INITIAL; 30334000
EXIT: 30335000
IF TROUBLE ~ MINDEX > 0 30336000
THEN BEGIN COMMENT MAKE AREA LOOK AVAILABLE.; 30337000
M[INITIAL] ~ 0 & AVAILA(,*, FINAL-INITIAL,, *); 30338000
M[FINAL] ~ 0 & AVAILZ (,, FINAL - INITIAL); 30339000
END; 30340000
END OF TROUBLE; 30341000
SAVE INTEGER PROCEDURE ALOCATE (SIZE, MINDEX); 30342000
VALUE SIZE, MINDEX; 30343000
INTEGER SIZE, MINDEX; 30344000
BEGIN COMMENT ALOCATE ASSIGNS IN-USE LINKS FOR AN AREA OF SIZE30345000
SOMEWWERE IN THE AREA STARTING AT MINDEX. NON- 30346000
OVERLAYABLE AREAS ARE ASSIGNED AT THE FRONT OF 30347000
AN AREA. THAT PORTION OF AN AREA THAT IS NOT 30348000
USED IS RETURNED TO THE AVAILABLE LIST.; 30349000
INTEGER AVLINK; 30350000
IF (MLENGTH ~ M[MINDEX].LENGTH- SIZE - 1) { LINKSIZE 30351000
THEN SIZE ~ SIZE + MLENGTH + 1; 30352000
IF TYPE.OERLAY = 0 30353000
THEN AVLINK ~ MINDEX + SIZE + 1 30354000
ELSE BEGIN 30355000
AVLINK ~ MINDEX; 30356000
MINDEX ~ M[MINDEX].LENGTH - SIZE + AVLINK; 30357000
IF LEFTOFF { 0 THEN LEFTOFF ~ MINDEX; 30358000
END; 30359000
M[MINDEX + SIZE] ~ 0 & LINKZ(, REAL(TYPE.OERLAY=1 AND 30360000
ADDRESS!0),,,,, SIZE); 30361000
IF MLENGTH > LINKSIZE 30362000
THEN BEGIN 30363000
M[AVLINK] ~ 0 & AVAILA 30364000
(, M[AVLINK-1].OLAY, MLENGTH, ,*); 30365000
COMMENT ORDER WILL SUPPLY LINK; 30366000
M[AVLINK + MLENGTH] ~ 0 & AVAILZ 30367000
(, , MLENGTH); 30368000
ORDER (AVLINK); 30369000
END; 30370000
M[MINDEX] ~ 0 & LINKA (, WHOFOR, SIZE, *, BACKALLOCATED); 30371000
M[MINDEX + 1] ~ 0 & LINKB 30372000
(, % TAG =3 30373000
, % USAGE 30374000
*, % ADDRESS TYPE - ABSOLUTE FOR NOW 30375000
ADDRESS, % OF MOM 30376000
IF ADDRESS ! 0 THEN M[ADDRESS].ADDRESSF ELSE 0); % DISK 30377000
COMMENT NUMEROUS UNANSWERED QUESTIONS.; 30378000
M[MINDEX +2] ~ 0 & LINKC ( ); COMMENT UNUSED; 30379000
M[BACKALLOCATED + M[BACKALLOCATED].INUSELENGTH].FRONTLINK ~ 30380000
MINDEX; 30381000
BACKALLOCATED ~ MINDEX; 30382000
ALOCATE ~ MINDEX + LINKSIZE; 30383000
END OF ALOCATE; 30384000
TRACTER ~ TRACE(0); COMMENT TURN OFF & SAVE TRACE; 30385000
BUZZCONTROL (SPACELOCK); 30385100
RETRY: 30385200
MINDEX ~ M[STOPPER + 1]; 30386000
IF BOOLEAN (TYPE.OERLAY) 30387000
THEN BEGIN COMMENT LOOK FOR AN AREA ADJACENT TO OVERLAY- 30388000
ABLE STORAGE.; 30389000
IF S { M[MINDEX].LENGTH 30390000
AND BOOLEAN (M[MINDEX].PREOLAY) 30391000
THEN BEGIN COMMENT START SEARCH IN OVERLAYABLE 30392000
PORTION OF LIST; 30393000
OVERSRCH: START ~ PREVADDR; 30394000
ARGS ~ 1 & LLLUARG (1, S); 30395000
END 30396000
ELSE IF S > M[PREVADDR].LENGTH 30397000
THEN GO TRUBLE 30398000
ELSE BEGIN 30399000
STARTSRCH: START ~ AVAILI; 30400000
ARGS ~ 1 & LLLUARG (0, S); 30401000
END 30402000
END 30403000
ELSE IF S > M[PREVADDR].LENGTH 30404000
THEN IF S > M[MINDEX].LENGTH THEN GO TRUBLE ELSE GO 30405000
OVERSRCH 30406000
ELSE GO STARTSRCH; 30407000
MINDEX ~ M[LISTLOOKUP(ARGS, M, START)].LINK; 30408000
AVAILREMOVE (MINDEX + M[MINDEX].LENGTH); 30409000
GO AROUND; 30410000
TRUBLE: MINDEX ~ TROUBLE(S); 30411000
IF MINDEX < 1 30412000
THEN BEGIN 30413000
SAVE PROCEDURE DAMMIT; 30413020
BEGIN 30413040
EVENT SPACESHOT; 30413160
TRYAGAIN ~ FALSE; 30413200
QUEUEMYSTACK (STACK[WHOFOR, PRIORITYPLACE], S, SPACERETRY, 30413400
SPACESHOT, SPACEQHEAD); 30413500
UNLOCK (SPACELOCK); 30413760
WAIT (SPACESHOT); 30413780
BUZZ (SPACELOCK); 30413800
TRYAGAIN ~ TRUE; 30413810
END OF QUEUEING UNSATISFIED REQUEST; 30413820
SAVE PROCEDURE SPOUTIT; 30413840
BEGIN 30413860
END OF SPOUTIT; 30413980
CASE ABS (MINDEX) OF 30413990
BEGIN 30414000
; COMMENT - SHOULD NEVER HAPPEN 0;30415000
; COMMENT - NO OVERLAY, SPOUT OR SLEEP 1;30416000
BEGIN 30417000
SPOUTIT; DAMMIT; % 2 30418000
END; 30419000
BEGIN 30420000
DAMMIT; % 3 30421000
END; 30422000
BEGIN 30423000
SPOUTIT; 30424000
END; 30425000
BEGIN 30426000
30427000
END; 30428000
END 30429000
END OF UNSATISFIED REQUESTS; 30429100
IF TRYAGAIN THEN GO RETRY ELSE IF MINDEX < 0 THEN GO ALLDONE; 30430000
AROUND: MINDEX ~ ALOCATE (S, MINDEX); 30431000
ALLDONE: GETSPACE ~ MINDEX; 30436000
UNLOCK (SPACELOCK); 30436100
TRACE (TRACTER); COMMENT RESTORE TRACE; 30437000
END OF GETSPACE; 30438000
SAVE PROCEDURE MOMTOVECTOR (MOM, VECTOR, INDEX); 30439000
VALUE COMMENT A COPY OR MOM DESCRIPTOR THAT IS AC- 30440000
CEPTABLE TO PRESENCE BIT; 30441000
COMMENT AN-UNINDEXED DESCRIPTOR THAT IS AC- 30442000
CEPTABLE TO AN NXLN OPERATOR; 30443000
INDEX; COMMENT THE INDEX FOR VECTOR WHERE MOM IS TO 30444000
BE PLACED; 30445000
WORD ARRAY MOM[*], 30446000
VECTOR[*]; 30447000
INTEGER INDEX; 30448000
BEGIN 30449000
MOM[0] ~ *; 30456000
VECTOR[INDEX] ~ MOM & SETCOPYBIT (0); 30457000
M [MOM.ADDRESSF - LINKSIZE +1].ADDRMOM ~ VECTOR.ADDRESSF+INDEX;30458000
END MOM TO VECTOR OR QUEUE; 30459000
30460000
SAVE PROCEDURE QUEUEMYSTACK (AUTHORITY, REQUIRED, COUNT, MYEVENT, HEAD);30461000
VALUE AUTHORITY, COMMENT THE SORTKEY FOR THIS QUEUE; 30462000
REQUIRED, COMMENT AN ADDITIONAL INFORMATION WORD FOR THE 30463000
QUEUE ENTRY; 30464000
COUNT; COMMENT A 10 BIT COUNTER IN THE STACK LINK 30465000
WORD FOR THIS QUEUE; 30466000
REAL HEAD ; COMMENT A GLOBAL REAL THAT CONTAINS THE BACK- 30467000
WARD AND FORWARD LINKS FOR THE QUEUE. THE BACK 30468000
WARD LINK POINTS TO THE ENTRY WITH THE HIGHEST 30469000
AUTHORITY; 30470000
EVENT MYEVENT; COMMENT THE EVENT THAT IS WAITED UPON AND 30471000
CAUSED BY THE CALLER; 30472000
REAL AUTHORITY, 30473000
REQUIRED; 30474000
INTEGER COUNT; 30475000
BEGIN COMMENT PLACE MYEVENT, REQUIRED AND AUTHORITY IN MY30476000
STACK AND PLACE MY STACK IN THE QUEUE POINTED AT30477000
BY HEAD BASED ON AUTHORITY.; 30478000
INTEGER FASTER, % THAN ME 30479000
SLOWER, % THAN ME 30480000
FASTEST, % ACCORDING TO HEAD 30481000
SLOWEST, % DITTO 30482000
I, % THE NEXT FASTEST ENTRY 30483000
INDEX, % THE ENTRY FASTER THAN MINE 30484000
ME ; % THE CALLERS (AND MY) STACK 30485000
MONITOR DONMONITOR (ME, HEAD, 30485100
SLOWER, 30485200
FASTER, 30485300
I); 30485400
ARRAY MY [*]; 30486000
REFERENCE MYREFERENCE = MY; 30486100
LABEL AHEAD, AROUND; 30487000
DEFINE AUTHORITYLINKL = READYWAITLINK#; 30488000
MY ~ STACK [ME ~ SNR, *]; 30489000
STOREITEM (AUTHORITYEVENT@(MYREFERENCE), MYEVENT); 30490000
MY [AUTHORITYPLACE] ~ AUTHORITY; 30492000
MY [REQUIREDPLACE] ~ REQUIRED; 30493000
SLOWEST ~ HEAD.SLOWPLACE; 30495000
IF I ~ FASTEST ~ HEAD.FASTPLACE = 0 30496000
THEN BEGIN COMMENT AN EMPTY HEAD; 30497000
%FASTER ~ SLOWER ~ 0; 30498000
HEAD ~ 0 & AUTHORITYLINKL(ME, ME); 30499000
GO AROUND; 30500000
END; 30501000
WHILE AUTHORITY { STACK [I, AUTHORITYPLACE] 30502000
DO BEGIN COMMENT I"M HIGHER LOOK FOR LESSER OR LEAST; 30503000
INDEX ~ I; 30504000
IF I ~ STACK[I, AUTHORITYLINKPLACE].SLOWPLACE = 0 30505000
THEN GO AHEAD; 30506000
END; 30507000
IF I = FASTEST 30508000
THEN BEGIN COMMENT I"M FASTER THAN THE FASTEST - TELL EM;30509000
STACK [SLOWER ~ FASTEST, AUTHORITYLINKPLACE]. 30510000
FASTPLACE ~ ME; 30511000
HEAD.FASTPLACE ~ ME; 30512000
% FASTER ~ 0; 30513000
GO AROUND; 30514000
END 30515000
ELSE BEGIN COMMENT THERE ARE HIGHER & LOWER AUTHORITIES; 30516000
FASTER ~ INDEX; 30517000
SLOWER ~ STACK [INDEX, AUTHORITYLINKPLACE].SLOWPLACE;30518000
STACK[FASTER, AUTHORITYLINKPLACE].SLOWPLACE ~ ME; 30519000
STACK[SLOWER,AUTHORITYLINKPLACE].FASTPLACE ~ ME; 30520000
GO AROUND END; 30521000
AHEAD: STACK [FASTER ~ SLOWEST, AUTHORITYLINKPLACE].SLOWPLACE ~ ME; 30522000
HEAD.SLOWPLACE ~ ME; 30523000
% SLOWER ~ 0; NOBODY IS SLOWER THAN ME 30524000
AROUND: MY [AUTHORITYLINKPLACE] ~ 0 & AUTHORITYLINKL 30525000
(FASTER, SLOWER, COUNT); 30526000
END; 30527000
PROCEDURE DELINKASTACK (WHOSE, HEAD); 30528000
VALUE WHOSE; 30529000
INTEGER WHOSE; COMMENT THE AUTHORITY TYPE STACK TO DELINK; 30530000
REAL HEAD ; COMMENT THE HEAD OF THE AUTHORITY TYPE STACK; 30531000
BEGIN COMMENT UNDO ALL THE GOOD WORK OF QUEUEMYSTACK; 30532000
INTEGER SLOWEST, 30533000
FASTEST, 30534000
SLOWER, 30535000
FASTER; 30536000
REAL LINK; 30537000
MONITOR DONMONITOR (HEAD 30537100
); 30537200
ARRAY WHO [*]; 30538000
LABEL AWAY; 30539000
DEFINE ALP = WHO [AUTHORITYLINKPLACE]#; 30540000
WHO ~ STACK [WHOSE, *]; 30541000
SLOWEST ~ HEAD.SLOWPLACE; 30542000
FASTEST ~ HEAD.FASTPLACE; 30543000
IF SLOWEST = FASTEST 30544000
THEN BEGIN COMMENT ONLY ONE ENTRY; 30545000
IF WHOSE!SLOWEST THEN EXIT; % CALLER GOOFED 30546000
HEAD ~ 0; 30547000
END 30548000
ELSE IF WHOSE=FASTEST 30549000
THEN BEGIN COMMENT SLOWER OF WHOSE IS FASTEST; 30550000
HEAD.FASTPLACE~SLOWER~WHO[AUTHORITYLINKPLACE]. 30551000
SLOWPLACE; 30552000
STACK [SLOWER, AUTHORITYLINKPLACE].FASTPLACE ~0;30553000
END 30554000
ELSE IF WHOSE = SLOWER 30555000
THEN BEGIN COMMENT FASTER OF WHOSE IS SLOWEST; 30556000
HEAD.SLOWPLACE ~ FASTER ~ ALP.FASTPLACE; 30557000
STACK [SLOWER, AUTHORITYLINKPLACE]. 30558000
SLOWPLACE ~ 0; 30559000
END 30560000
ELSE BEGIN 30561000
FASTER ~(LINK ~ ALP).FASTPLACE; 30562000
SLOWER ~ LINK.SLOWPLACE; 30563000
STACK[FASTER, AUTHORITYLINKPLACE]. 30564000
SLOWPLACE ~ SLOWER; 30565000
STACK[SLOWER, AUTHORITYLINKPLACE]. 30566000
FASTPLACE ~ FASTER 30567000
END; 30568000
ALP ~ 0; 30569000
END OF DELINKING A QUEUE; 30570000
SAVE INTEGER PROCEDURE GETAREA(SIZE); VALUE SIZE; INTEGER SIZE; 31000000
COMMENT GETAREA SEARCHES BLOCKOFAREASQUE FOR A BLOCK OF A GIVEN SIZE 31001000
AREA. IF BLOCK IS NOT IN THE QUEUE IT CALLS GETSPACE PROCEDURE31002000
AND BUILDS UP AREASTATUS WORD FOR THE OBTAINED BLOCK- IT THEN 31003000
MAKES ENTRY INTO THE QUEUE, IT RESETS BIT REPRESNTING THE 31004000
FIRST AREA OF THE BLOCK AND RETURNS BASE ADDRESS OF THE BLOCK.31005000
IF BLOCK IS IN QUEUE,IT FINDS BITNO REPRESENTING AVAILABLE 31006000
AREA, RESETS THAT BIT IN AREASTATUSBITS FIELD AND RETURNS THE 31007000
ADDRESS AS BASE ADDRESS OF BLOCK INDEXED BY (BITNO-1). 31008000
SIZE -SIZE OF AREA IN NO. OF WORDS; 31009000
BEGIN 31010000
DEFINE AREASIZEF=AREASIZEFF#; 31011000
REFERENCE BLOCKPOINTER; COMMENT CURRENT POINTER OF QUEUE; 31012000
ARRAY QENTRY =BLOCKPOINTER [*]; 31013000
REAL AREASTATUSWORD; COMMENT LOCAL FOR AREASTATUS ITEM; 31014000
INTEGER BITNO; COMMENT BIT NO. FOR AVAILABLE AREA; 31015000
INTEGER COREADDR, COMMENT GETSPACE ADDRESS; 31016000
TRACTER,% MAR USED TO SHUT OFF TRACE IN THIS PROCEDURE 31017000
COREAREASIZE; 31018000
LABEL TRYANOTHER,LOOP; 31019000
LABEL NOQUENTRY; 31020000
FIELD SETFIELD=MAXNOOFAREAS-2:MAXNOOFAREAS-1; 31021000
TRACTER~TRACE(0); 31022000
IF FIRSTBLOCK=NULL THEN GO NOQUENTRY; 31023000
BLOCKPOINTER~ FIRSTBLOCK; 31024000
LOOP: 31025000
AREASTATUSWORD~ AREASTATUS @ BLOCKPOINTER; 31026000
IF SIZE=AREASTATUSWORD.AREASIZEF THEN COMMENT FOUND BLOCK; 31027000
BEGIN 31028000
BITNO~ FIRSTONE(AREASTATUSWORD.AREASTATUSBITSF )-1; 31029000
IF BITNO!-1 THEN AREASTATUS@(BLOCKPOINTER)~ 31030000
RESET(AREASTATUS@BLOCKPOINTER,BITNO) 31031000
ELSE GO TRYANOTHER; 31032000
END ELSE 31033000
BEGIN 31034000
TRYANOTHER: 31035000
BLOCKPOINTER ~ NEXTBLOCK @ BLOCKPOINTER; 31036000
IF BLOCKPOINTER!NULL THEN GO LOOP 31037000
ELSE 31038000
BEGIN 31039000
NOQUENTRY: 31040000
AREASTATUSWORD ~ 0; 31041000
AREASTATUSWORD.SETFIELD ~ @77777777; 31042000
BITNO~MAXNOOFAREAS-1; 31043000
AREASTATUSWORD.AREASIZEF~ SIZE; 31044000
COREAREASIZE~SIZE | MAXNOOFAREAS + 1; 31045000
COREADDR~GETSPACE(COREAREASIZE,0,4,0); 31046000
AREASTATUSWORD.BASEADDRF~COREADDR + 1; 31047000
M [COREADDR] ~ 0; 31047100
BLOCKPOINTER ~ ALLOCATE(BLOCKOFAREASQUE); 31048000
INITIALIZETOZERO(QENTRY.ADDRESSF, 3); 31049000
AREASTATUS@(BLOCKPOINTER)~AREASTATUSWORD; 31050000
BLOCKOFAREASQUE ~ BLOCKPOINTER; 31051000
END; 31052000
END; 31053000
INITIALIZETOZERO(COREADDR ~ AREASTATUSWORD.BASEADDRF + 31054000
BITNO | SIZE, SIZE); 31055000
TRACE(TRACTER); 31055100
RETURN(COREADDR); 31056000
END GETAREA; 31058000
SAVE PROCEDURE FORGETAREA(SIZE,ADDRESS); VALUE SIZE,ADDRESS; 31059000
INTEGER SIZE,ADDRESS; 31060000
COMMENT FORGETAREA SEARCHES BLOCKOFAREASQUE FOR A BLOCK OF A GIVEN 31061000
SIZE AREA. IF NO BLOCK IS FOUND THEN THE SIZE SPECIFIED MUST 31062000
BE WRONG. WHEN THE BLOCK OF GIVEN SIZE IS FOUND IT CHECKS 31063000
WHETHER SPECIFIED ADDRESS FALLS WITHIN THE BLOCK RANGE. WHEN 31064000
THE RIGHT BLOCK IS FOUND,IT FINDS BITNO REPRESENTING AREA TO 31065000
BE FORGOTTEN. IT SETS THAT BIT NO IN AREASTATUS ITEM OF QUEUE.31066000
IF ALL THE AREAS WITHIN BLOCK ARE AVAILABLE IT CALLS 31067000
FORGETSPACE TO FORGET THE BLOCK.NOTE QUEUE IS SEARCHED FROM 31068000
THE END TO DEALLOCATE ADDITIONAL BLOCKS (OF GIVEN SIZE) AS 31069000
SOON AS POSSIBLE: 31070000
SIZE - SIZE OF AREA IN NO OF WORDS 31071000
ADDRESS- BASE ADDRESS OF THE AREA; 31072000
IF SIZE = 0 31073000
THEN FORGETSPACE (ADDRESS) ELSE 31074000
BEGIN 31075000
DEFINE AREASIZEF=AREASIZEFF#; 31076000
REFERENCE BLOCKPOINTER; COMMENT CURRENT POINTER OF QUEUE; 31077000
REAL AREASTATUSWORD; COMMENT LOCAL FOR AREA STATUS ITEM; 31078000
INTEGER BITNO; COMMENT BIT NO FOR AREA TO BE FORGOTTEN; 31079000
LABEL LOOP,QUIT; 31080000
BLOCKPOINTER ~ LASTBLOCK ; 31081000
LOOP: 31082000
AREASTATUSWORD~ AREASTATUS @ BLOCKPOINTER; 31083000
IF SIZE=AREASTATUSWORD.AREASIZEF THEN 31084000
BEGIN COMMENT BLOCK OF RIGHT SIZE; 31085000
IF BITNO~ADDRESS-AREASTATUSWORD.BASEADDRF>0 THEN 31086000
IF BITNO~BITNO DIV SIZE < MAXNOOFAREAS THEN 31087000
BEGIN COMMENT BLOCK OF RIGHT SIZE AND ADDRESS; 31088000
AREASTATUSWORD~ SET(AREASTATUSWORD,BITNO); 31089000
COMMENT COUNT NO. OF BITS ON (NO OF AVAILABLE 31090000
AREAS); 31091000
BITNO~ ONES(AREASTATUSWORD.AREASTATUSBITSF); 31092000
IF BITNO=MAXNOOFAREAS THEN 31093000
BEGIN 31094000
FORGETSPACE(AREASTATUSWORD.BASEADDRF-1); 31095000
DELINK(BLOCKOFAREASQUE,BLOCKPOINTER) 31096000
END ELSE 31097000
AREASTATUS @(BLOCKPOINTER)~AREASTATUSWORD; 31098000
GO QUIT; 31099000
END; 31100000
END; 31101000
BLOCKPOINTER~ PRVSBLOCK @ BLOCKPOINTER; 31102000
IF BLOCKPOINTER=NULL THEN 31103000
BEGIN 31104000
COMMENT BUILD A MESSAGE "WRONG SIZE OR ADDRESS FOR AREA"; 31105000
%SPOUT(MSGAREA,DISPLAYONCON);% MAR 31106000
END ELSE GO LOOP; 31107000
QUIT: 31108000
END FORGETAREA; 31109000
SAVE 1 PROCEDURE INITIALIZEARRAY(FIRSTARRAY, LASTARRAY, LENGTH); 32000000
VALUE LENGTH; 32001000
INTEGER LENGTH; 32002000
WORD ARRAY FIRSTARRAY,LASTARRAY [*]; 32003000
BEGIN COMMENT GET SPACE AND INITIALIZE ALL DESCRIPTORS BETWEEN32004000
FIRSTARRAY AND LASTARRAY (INCLUSIVE). (SEE COM- 32005000
MENT AT "UNIT" ARRAY DECLARATION) "LENGTH" IS 32006000
THE NUMBER OF WORDS GOTTEN FOR EACH ARRAY AND 32007000
THE LENGTH FIELD OF THE ARRAY DESCRIPTOR. ;32008000
INTEGER MOMF ~ NAME(FIRSTARRAY).ADRCPLF, 32009000
MOML ~ NAME(LASTARRAY).ADRCPLF, 32010000
T, 32011000
A; 32012000
MOMF ~ * + D0; 32013000
MOML ~ * + D0; 32014000
T ~ MOML - MOMF + 1; 32015000
LENGTH~*|(FIRSTARRAY.DBITF+1); 32015100
M[MOMF] ~ FIRSTARRAY & DATADESCRIPTOR 32016000
(,1,0,*,*,*,*,*,LENGTH, A ~ 32017000
GETSPACE (T | LENGTH, 0, 1, 0)); 32018000
INITIALIZETOZERO (A, T | LENGTH); 32019000
WHILE MOMF ~ * + 1 { MOML DO 32020000
M[MOMF] ~ 0 & DATADESCRIPTOR 32021000
(,1,0,*,*,*,*,*, LENGTH, A ~ A + LENGTH); 32022000
END INITIALIZE ARRAYS; 32023000
SAVE 1 PROCEDURE INITIALIZEQARRAY (QARRAYW, LENGTH); 32024000
VALUE LENGTH; 32025000
INTEGER LENGTH; 32026000
WORD ARRAY QARRAYW [*]; 32027000
BEGIN COMMENT GET "LENGTH" SPACE AND FILL IT WITH NULL DATA 32028000
DESCRIPTORS; 32029000
WORD DD; 32030000
WORD WT1 = QARRAYW; 32031000
INTEGER MOMQ ~ WT1.ADRCPLF, 32032000
A; 32033000
INTEGER I ~ LENGTH - 1; 32034000
M[MOMQ] ~ 0 & DATADESCRIPTOR 32035000
(,1,*,*,*,*,*,*, LENGTH, 32036000
A ~ GETSPACE (LENGTH, 0, 1, 0)); 32037000
DD ~ 0 & DATADESCRIPTOR (,1,1,*,*,*,*,*,*,*); 32038000
DO QARRAYW[I] ~ DD UNTIL I ~1 - 1 < 0; 32039000
END INITIALIZEQARRAY; 32040000
SAVE 1 PROCEDURE INITIALIZE (P1, P2); 32041000
VALUE P1; 32042000
INTEGER P1; 32043000
WORD P2; 32044000
BEGIN 32045000
DEFINE TIMEINCR = 32048000
1000 COMMENT THE TIME IN MICRO-SECONDS THAT 32049000
SHOULD BE ADEQUATE TO INITIALIZE A PROCES- 32050000
SORS STACK.; 32051000
/BASICCLOCKUNIT 32052000
| 0 COMMENT ************ CHECK-OUT; 32053000
| 8 #, COMMENT MAXIMUM NUMBER OF PROCESSORS.; 32054000
DD = DATADESCRIPTOR#, 32055000
MINDEX = TIMEOUT#, 32056000
MLENGTH = MAXADDR#,% 32057000
T = NEXTADDR #, 32058000
CODE = FIRSTADDR #, 32059000
OLDS = NEXTROW #, 32059100
STOPPIT = GLOBALSTOP#; 32060000
FIELD PROCIDBITS = (MYSELF-1):1, 32061000
MODULE = 19:6, 32062000
SDBITS = 9:10, 32063000
MOD2F = 0:1, 32064000
DIV2F = 47:47; 32065000
LAYOUT MSCW (35:16, 13:14); 32066000
DEFINE TYPEINT = TYPEINTERROGATE#, PATHINT = TYPEINT#; 32067000
DEFINE INITIALIZERARRAY (QARRAY, RARRAY, LENGTH) = 32068000
REPLACE POINTER (RARRAY) BY POINTER (QARRAY) 32069000
FOR LENGTH OVERWRITE;#; 32070000
DEFINE MOVESTACK (NEWF) = 32071000
BEGIN 32072000
D[30] ~ F; COMMENT D[30] IS TEMPORARY FOR WHERE WE 32073000
MOVE FROM; 32074000
F ~ NEWF ~ SHEETENTRYSIZE + 2; 32075000
COMMENT ALL PROCESSORS HAVE AN INITIAL S REG 32076000
SETTING OF 8192. WHEN INITIALIZE IS INVOKED, IT32077000
RUNS WITH A D[1] AND F OF 8193 AND THIS IS IM- 32078000
MEDIATELY CHANGED TO A LOCATION SOME PLACE IN 32079000
THE SECOND HALF OF MOD 0. THE EXACT LOCATION IS32080000
BASED ON THE PROCESSOR ID.; 32081000
D[1] ~ F; 32082000
S ~ S + F - D[30]; 32083000
M[F] ~ 0 & MARKSTACKCW (, 32084000
REAL (SNR ! 0), 1, *, *, 1, 32085000
IF SNR =0 THEN F ELSE SHEETENTRYSIZE +1); 32086000
REPLACE POINTER (M[F+1]) BY POINTER (M[D[30] + 1]) 32087000
FOR S - F OVERWRITE; 32088000
D[30] ~ 0; 32089000
END #; 32090000
DEFINE MISSINGMODS = 32091000
BEGIN COMMENT MISSINGMODS ALLOCATES MISSING MEMORY MODULES AS 32092000
NON-OVERLAYABLE AREAS AND PRESENT MODULES AS 32093000
OVERLAYABLE AREAS. WHEN MISSINGMODS IS INVOKED 32094000
THE SITUATION IS THIS: 32095000
1. THERE ARE "HOLES" IN MEMORY. I.E. THERE ARE32096000
ONE OR MORE INACTIVE MODULES SURROUNDED BY 32097000
ONE OR MORE ACTIVE MODULES. 32098000
2. ACTIVE MODULES INCLUDE 0 AND THE HIGHEST 32099000
AVAILABLE. 32100000
3. ZERO WORDS HAVE BEEN ALLOCATED AT THE HIGH-32101000
EST POSSIBLE MEMORY LOCATION. 32102000
4. MEMMODS ARRAY (INDEXED BY MODULE) HAS BEEN 32103000
INITIALIZED (1 IS ACTIVE MODULE). 32104000
5. THE REMAINDER OF THE HIGHEST MODULE IS A- 32105000
VAILABLE FOR ALLOCATION. WE WILL DO THIS 32106000
IN SUCH A WAY THAT THE ZERO WORD OF THE 32107000
MODULE IS AVAILABLE FOR SOME "Z" LINK. ;32108000
MINDEX ~ GETSPACE(16382-(LINKSIZE+1)|2,0,1,1).MODULE -1; 32109000
MLENGTH ~ 16384; 32110000
WHILE MINDEX } 1 DO 32111000
BEGIN 32112000
IF MEMMODS[MINDEX] = 0 32113000
THEN BEGIN COMMENT THE MOD IS MISSING; 32114000
IF MEMMODS[MINDEX -1] = 1 32115000
THEN BEGIN COMMENT BUT THE ONE BELOW IT IS 32116000
READY SO WE ALLOCATE THE MISSING 32117000
ONE AS NON-OVERLAYABLE.; 32118000
GETSPACE (MLENGTH, 0, 1, 0); 32119000
MLENGTH ~ 16364; 32120000
END OTHERWISE WE INCREASE THE AMOUNT WE 32121000
GET WHEN WE CAN 32122000
ELSE IF (MLENGTH ~ MLENGTH + 16364).MODULE > 7 32123000
THEN STOP COMMENT DONT EXCEDE GETSPACE MAX;32124000
END OTHERWISE ALLOCATE AS OVERLAYABLE SAVING FIRST 32125000
WORD OF MODULE FOR Z LINK 32126000
ELSE GETSPACE (16383 - LINKSIZE, 0, 1, 1); 32127000
MINDEX ~ MINDEX - 1; 32128000
END 32129000
END #; 32130000
DISALLOW; 32131000
CASE FIRSTONE(ABS(P1))-21+REAL(NOT INITSWITCH).MPXINDICATOR OF 32132000
BEGIN 32133000
CASE FIRSTONE (P1.SDBITS) - 1 OF 32134000
BEGIN 32135000
STOPPIT; 32136000
STOPPIT; 32137000
STOPPIT; 32138000
STOPPIT; 32139000
STOPPIT; 32140000
STOPPIT; 32141000
STOPPIT; 32142000
STOPPIT; 32143000
STOPPIT; 32144000
BEGIN 32145000
STOPPIT; 32145050
END IO FINISH; 32145100
; 32146000
; 32147000
; 32148000
; 32149000
; 32150000
; 32151000
END MPX INTERRUPTS CASE; 32153000
BEGIN COMMENT PROCESSOR TO PROCESSOR INTERRUPT; 32154000
MOVESTACK (PROCSTACKSIZE | MYSELF + F); 32155000
PROCMASK.PROCIDBITS ~ 1; COMMENT IDENTIFY MYSELF; 32156000
IF TIMEOUT = 0 32157000
THEN BEGIN COMMENT FIRST PROCESSOR SAYS HOW LONG32158000
IT SHOULD TAKE TO INITIALIZE 32159000
ALL PROCESSORS; 32160000
TIMEOUT ~ SCANIN (TIMEOFDAYWORD)+ TIMEINCR;32161000
INITSWITCH ~ TRUE; 32162000
END; 32163000
HEYOU; COMMENT ALL PROCESSORS HAVE BEEN IDLING OR 32164000
EXECUTING THE CODE IN THIS COMPOUND 32165000
STATEMENT.; 32166000
COMMENT ONLY ONE PROCESSOR CAN SUCCESSFULLY 32167000
COMPLETE THE TWO FOLLOWING STATEMENTS 32168000
AND IT IS THE ONE THAT COMPLETES THE 32169000
INITIALIZATION.; 32170000
DO UNTIL SCANIN (TIMEOFDAYWORD) > TIMEOUT; 32171000
BUZZCONTROL (SLAVEQUARTERS); 32172000
IF LOCK(SLAVEQUARTERS) 32173000
THEN BEGIN COMMENT GET MEMORY 32174000
UNDER CONTROL.; 32175000
MINDEX := INITIALIZEPCW := 0; 32176000
MCPINFO ~ MCPINFO & 32177000
NOTPRESENTARRAYDESCL(,*,3,0,MCPTOP := 32177040
M[2]); 32177050
COMMENT THE MCP LOADERS 32177100
WILL ALWAYS PLACE THIS 32178000
ADDRESS IN MEMORY[2] SO32179000
THAT WE WILL KNOW WHERE32180000
TO FIND THE MCP INFO 32181000
SEGMENTS; 32182000
SIMULATING := BOOLEAN(M[2]).BIT45 ; 32182100
M[2] := 0; 32182200
DO MINDEX ~ M[MINDEX].INUSELENGTH + MINDEX32183000
+ 1 UNTIL BOOLEAN(M[MINDEX].AVAILABLE);32184000
PREVADDR ~ MINDEX; 32185000
AVAILI ~ TEMPLINKS.ADDRESSF; 32186000
COMMENT FIX FIRST AVAILABLE LINK; 32187000
TEMPLINKS[0] ~ 0 & 32188000
AVAILA (,*,LINKSIZE,, PREVADDR); 32189000
TEMPLINKS [LINKSIZE] ~ 0 & 32190000
AVAILZ (,, LINKSIZE); 32191000
COMMENT FIX STOPPER; 32192000
STOPPER ~ LINKSIZE + 1; 32193000
TEMPLINKS [STOPPER] ~ 4"040000000001" & 32194000
AVAILA (,*, LINKSIZE,,*); 32195000
TEMPLINKS[STOPPER+1] ~ PREVADDR; 32196000
TEMPLINKS[STOPPER+LINKSIZE] ~ 32197000
0 & AVAILZ (,, LINKSIZE); 32198000
COMMENT UPDATE AVAILABLE AREA LINK; 32199000
STOPPER ~STOPPER +TEMPLINKS.ADDRESSF; 32200000
M[PREVADDR].LINK ~STOPPER; 32201000
M[PREVADDR+1] ~ AVAILI; 32202000
COMMENT SAVE INITIALIZATION CODE 32203000
ADDRESS FOR LATER FORGETING;32204000
SAVE1ADDRESS ~ PREVADDR - M[PREVADDR -1]. 32205000
INUSELENGTHZ + 2; 32206000
32207000
BACKALLOCATED ~ SAVE1ADDRESS - LINKSIZE; 32208000
MEMMODS ~ MEMMODS&DD 32209000
COMMENT IT SEEMS LIKE A REASONABLE PLACE;32210000
( ,1,0,*,*,*,*,*,*, 12000); 32211000
REPLACE POINTER(MEMMODS) BY 1 FOR 64 32212000
OVERWRITE; 32213000
COMMENT ASSUME ALL POSSIBLE MEMORY IS 32214000
PRESENT AND MARK ABSENT MODS IN INVALID 32215000
ADDRESS.; 32216000
MEMMAX ~ M.LENGTHF; 32217000
COMMENT LET INVALID ADDRESS WORK; 32218000
MINDEX ~ 0; 32219000
DO BEGIN 32220000
M[MINDEX := MINDEX + 16384] := 0; 32220500
IF BOOLEAN(MEMMODS[MINDEX.MODULE]) THEN 32220600
M[MINDEX+1] := 0; %CHECK INTERLACING 32220700
END UNTIL MINDEX = 1032192; 32221000
COREFACTOR ~ TRUE; COMMENT * * * * * * * * * * ; 32221050
AVAILABLECORE ~ MEMMAX - PREVADDR; 32221100
COMMENT FIND HIGHEST POSSIBLE ADDRESS; 32222000
MINDEX~MASKSEARCH(1,1,MEMMODS)|16384+16382;32223000
M.LENGTHF ~MINDEX + 1; 32224000
COMMENT WHEN THERE IS MAXIMUM MEMORY32225000
THE LAST WORD IS NOT INDEXABLE THROUGH32226000
M AND SO WE WASTE IT ALLCASES.; 32227000
M[PREVADDR].LENGTH ~ MINDEX - PREVADDR; 32228000
M[MINDEX] ~ 0 & AVAILZ (,,MINDEX-PREVADDR);32229000
COMMENT NOW ALL MEMORY ABOVE INITIALIZA- 32230000
TION AND INCLUDING MEMMAX LOOKS 32231000
AVAILABLE. THIS MAY NOT BE TRUE 32232000
BECAUSE OF MISSING MODS, BUT ALL 32233000
THE SPACE ROUTINES WILL FUNCTION,32234000
AND TO AVOID REPETITIVE CHECKS AS32235000
TO WHETHER WE ARE AT THE END OF 32236000
MEMORY WE WILL ALLOCATE 0 NON- 32237000
OVERLAYABLE WORDS AT THE END OF 32238000
MEMORY.; 32239000
GETSPACE (0, 0, 1, 0); 32240000
MEMMAX ~ MEMMAX -1; 32241000
IF MINDEX ! MEMMAX 32242000
THEN BEGIN COMMENT THERE ARE MISSING MODS.32243000
REGARDLESS OF THE STATUS OF OTHER32244000
MODS, 16375 WORDS CAN BE GOTTEN 32245000
IN THE FINAL MOD AND THE FIRST 32246000
WORD OF THE MOD WILL BE AVAILABLE32247000
FOR SOME "Z" LINK.; 32248000
MISSINGMODS; 32249000
END; 32250000
MINDEX ~ M.LENGTHF -1; 32251000
DO BEGIN 32252000
IF BOOLEAN(M[MINDEX].OLAY) 32253000
THEN FORGETSPACE(MINDEX +LINKSIZE32254000
-M[MINDEX].INUSELENGTHZ); 32255000
MINDEX ~ MINDEX 32256000
- M[MINDEX].INUSELENGTHZ -1;32257000
END 32258000
UNTIL MINDEX + LINKSIZE +1= SAVE1ADDRESS; 32259000
REPLACE POINTER(MEMMODS) BY 0 FOR 64 WORDS;32260000
T ~ D31; 32261000
MONITORMASK ~ T.MONMASKF; 32262000
D31 := MONITORVALUE := T.MONVALF; 32263000
IF SIMULATING 32265000
THEN BEGIN 32266000
MINDEX ~ NAME(MON1TOR).SDIF; 32267000
M[MINDEX] ~ M[NAME(SIM1TOR)]; 32268000
END ELSE 32269000
LOCK(MONITORLOCK); 32269100
IF MAXSTACKS ~ (MEMMAX.MODULE +1) | 32270000
STACKSPERMODULE > 1024 32271000
THEN MAXSTACKS ~ 1024; 32272000
STACK ~ 32273000
STACK & DD(,1,0,*,*,*,*,*, MAXSTACKS, 32274000
GETSPACE(MAXSTACKS, 0, 1, 0)) ; 32275000
INITIALIZEARRAY(REPLY,REPLY,MAXSTACKS); 32275100
MAXSTACKS ~ * -1; 32276000
COMMENT ******** SOMETHING WILL EVENTUALLY HAVE TO BE DONE 32277000
ABOUT THE FOLLOWING TWO STATEMENTS IN REGARDS 32278000
TO NON-SEOUENTIALLY NUMBERED PROCESSORS 8/16; 32279000
PROCSTACKSTARTW~ WORD(GETSPACE( 32280000
PROCSTACKSIZE|FIRSTONE(PROCMASK),0,1,0)); 32281000
STACKVECTOR [0] ~ 0 & DD(); 32282000
REPLACE POINTER (STACKVECTOR[1]) BY 32283000
POINTER (STACKVECTOR[0]) 32284000
FOR MAXSTACKS - 1 OVERWRITE; 32285000
STACKVECTOR [0] ~ STACKVECTOR [0] 32286000
&DD(,1,0,*,*,*,*,*, 1+ 32287000
M[0].INUSELENGTH, *); 32288000
PERIPHERALINVALIDADDRESS := TRUE; 32288050
MAXCHANNELS := 4"F"; 32288060
FOR CODE := 0 STEP 1 UNTIL 3 DO 32288100
BEGIN % MPX 32288150
OLDS := S; 32288200
SCANIN(0 & SCANINWORD(2, SET(0, CODE),32288250
1)); %MIGHT AS WELL READ R.D. 32288300
S := OLDS; % TO DELETE IN ADDR CRAP 32288350
END; 32288400
MULTIPLEXORMASK := BOOLEAN(2|MAXCHANNELS); 32288420
DCPSANDGCAS := 4"FFFFFFFFFF"; 32288440
FOR CODE := 4 STEP 1 UNTIL 19 DO 32288450
BEGIN % DCP 32288500
OLDS := S; 32288550
SCANOUT(0, 4"C0000" & SCANOUTWORD 32288600
(2, CODE - 4, 0)); % HALT DCP 32288650
S := OLDS; 32288700
END; 32288750
COMMENT DO THE GCA HERE---CODE GEQ 20; 32288800
UNLOCK (SLAVEQUARTERS); 32289000
32290000
COMMENT *** SOME QUEUE HEADS HAVE TO BE SMASHED AT INITIALISATION; 32292000
; 32293000
WORDREADYQHEAD ~ 0; 32294000
WORDSHEETQHEAD ~ 0; 32295000
WORDTERMINATEQHEAD ~ 0; 32296000
COMMENT *** END OF QUEUE HEAD SMASHING; 32297000
INITIALIZEARRAY(STACKINUSE, IRPARAMETERLOK, 32297100
MAXIRINDEXPLUS1); 32297200
INITIALIZEARRAY(PRIORITYLEVEL,PRIORITYLEVEL,PRIORITYRANGE+1); 32297300
32297400
COMMENT *** THE NUMBER OF INDEPENDENT RUNNER STACKS MAY BE A DEFINE OR32298000
IT MAY BE A SYSTEM PARAMETER, FOR THE MOMENT, IT IS AN 32299000
INITIALISED VARIABLE AS DEMONSTRATED BELOW; 32300000
INDEPENDENTRUNNERSTACKS ~ 2; 32301000
COMMENT STACKINUSE GIVES THE STACK NO OF EACH INDEPENDENT RUNNER 32302000
WHICH IS CURRENTLY RUNNING AND WHICH DOES NOT REQUIRE MORE32303000
THAN ONE STACK, IT MUST BE INITIALISED TO ZERO; 32304000
FILLARRAY(STACKINUSE,0,MAXIRINDEX); 32305000
COMMENT IRPRIORITIES GIVES PRIORITY OF EACH INDEPENDENT RUNNER, 32306000
THOSE RUNNERS ASSIGNED INDICATORS MUST HAVE PRIORITIES 32306200
ASSIGNED.OTHER RUNNERS WILL HAvE DEFAULT PRIORITIES 32306400
; 32307000
FILLARRAY(IRPRIORITIES,IRDEFAULTPRIORITY,MAXIRINDEX);32308000
IRPRIORITIES[CONTROLCARDINDICATOR] 32308200
~CONTROLCARDPRIORITY; 32308400
IRPRIORITIES[INITIATEINDICATOR]~INITIATEPRIORITY; 32308600
IRPRIORITIES[TERMINATEINDICATOR]~TERMINATEPRIORITY; 32308800
IRPRIORITIES[DIRCOMPLEMENTINDICATOR] := 32308900
DIRCOMPLEMENTPRIORITY; 32308950
COMMENT FOLLOWING ARE INITIALIZATIONS OF SOME CONTROL WORDS; 32309000
D2MSCW2~0&MARKSTACKWD(,*,1,*,READYENTRYSIZE-2,*,2,4);32310000
IRMSCW2~0&MARKSTACKWD(,*,1,*,FIXEDIRSIZE-2,*,2,4); 32311000
SHEETTOSCW~0&TOSCW(,0,0,0,0,SHEETENTRYSIZE+1,1,1,2); 32312000
D2MSCW1~0&MARKSTACKWD(,1,1,*,D0OFFSET,*,1, 32313000
READYENTRYSIZE-3); 32314000
IRMSCW1~0&MARKSTACKWD(,1,1,*,D0OFFSET,*,1,FIXEDIRSIZE32315000
-3); 32315100
D1MSCW~0&MARKSTACKWD(,1,1,*,D0OFFSET,*,1,D1INFO-1); 32316000
32317000
D2RCW1 ~ 0&RETURNCONTROLWORD(,*,*,*,*,*,*); 32318000
IRTOSCW~0&TOSCW(,,,,,FIXEDIRSIZE+4,1,2,2); 32319000
D2TOSCW~0&TOSCW(,,,,,READYENTRYSIZE+4,1,2,2); 32319100
D03 := HARDWAREINTERRUPTPCW; 32320000
END OF NON PROCESSOR INITIALIZATION; 32321000
SNR ~ MYSELF; 32322000
P1 ~ PROCSTACKSTART.ADDRESSF + (MYSELF-1)| 32323000
PROCSTACKSIZE; 32324000
MOVESTACK (P1); 32324100
INITIALIZETOZERO (P1, SHEETENTRYSIZE); 32324900
STACKVECTOR [MYSELF] ~ 32325000
0 & DD ( ,1,*,*,*,*,*,*, PROCSTACKSIZE, 32326000
F - SHEETENTRYSIZE - 2); 32327000
STACK [SNR, 0]~MYSELF; % PROCESSOR ID TO TOS 32328000
WORDSTACK [MYSELF, 1] ~ 0 & 32329000
MARKSTACKCW (,*,1, SNR, *,*,*); 32330000
BOSR ~ STACKVECTOR[SNR].ADDRESSF; 32331000
LOSR ~ BOSR + PROCSTACKSIZE - STACKOFLOWSIZE; 32332000
MORETHANONEPROCESSOR ~ (NUMBEROFPROCESSORS ~ 32333000
ONES(PROCMASK)) > 1; 32334000
PROCSTACKSTART.LENGTHF ~ PROCSTACKSTART.LENGTHF+1; 32335000
INITIALIZEARRAY(SHEETVECTOR,SHEETVECTOR, 32336000
IF STACKVECTOR.LENGTHF<511 32336100
THEN STACKVECTOR.LENGTHF|2 ELSE 1024); 32336200
COMMENT *** THERE IS NO JUSTIFICATION FOR THIS; 32336400
HOLDINITIALISE; 32337000
END PROCESSOR TO PROCESSOR INTERRUPT; 32338000
BEGIN COMMENT TIMER & STACK OVERFLOW; 32339000
STOPPIT 32340000
END; 32341000
BEGIN COMMENT SYLLABLE DEPENDENT - CLASS 2; 32342000
STOPPIT 32343000
END; 32344000
CASE FIRSTONE (P1.SDBITS) - 1 OF 32345000
BEGIN 32346000
STOPPIT; COMMENT MEMORY PROTECT; 32347000
STOPPIT; COMMENT INVALID OPERATOR; 32348000
STOPPIT; COMMENT DIVIDE BY ZERO; 32349000
STOPPIT; COMMENT EXPONENT OVERFLOW; 32350000
STOPPIT; COMMENT EXPONENT UNDEHFLOW; 32351000
STOPPIT; COMMENT INVALID INDEX; 32352000
STOPPIT; COMMENT INTEGER OVERFLOW; 32353000
STOPPIT; COMMENT BOTTOM OF STACK; 32354000
BEGIN COMMENT PRESENCE BIT - 32355000
AS LONG AS P2 POINTS TO A WELL FORMED DATA 32356000
DESCRIPTOR THAT DOES NOT REQUIRE I-O, WE SHOULD 32357000
BE ABLE TO SATISFY PB INTERRUPTS DURING INITIAL-32358000
IZATION. HOWEVER, IT SHOULD BE REMEMBERED 32359000
THAT MOST ALLOCATION DURING INITIALIZATION IS 32360000
NON-STANDARD. I.E. NON-OVERLAYABLE AND HIGH IN 32361000
MEMORY. THIS PRESENCE BIT WILL CAUSE THE SAME 32362000
TYPE OF ACTION. NOTE - OP NOT CONSIDERED .; 32363000
ALLOW; 32364000
M[P2.ADDRESSF] ~ M[P2.ADDRESSF] & DD 32365000
(*,1,0,*,*,*,*,*,*, GETSPACE( M[P2.ADDRESSF]. 32366000
LENGTHF , 0,1, P2.ADDRESSF)); 32367000
INITIALIZETOZERO(M[P2.ADDRESSF].ADDRESSF, 32368000
M[P2.ADDRESSF].LENGTHF); 32368100
IF P2.TAG ! 1 32369000
THEN P2~P2 & DD (*,1,1,*,*,*,*,*,*, 32370000
M[P2.ADDRESSF].ADDRESSF); 32370100
IF P1 < 0 32371000
THEN RETURN(P2); 32372000
32373000
END INITIALIZE PRESENCE BIT; 32374000
STOPPIT; COMMENT SEQUENCE ERROR; 32375000
END SYLLABLE DEPENDENT; 32376000
CASE FIRSTONE(P1.SDBITS) OF 32377000
BEGIN COMMENT ALARM INTERRUPTS; 32378000
STOPPIT; 32379000
STOPPIT; COMMENT OPERATOR LOOP; 32380000
STOPPIT; COMMENT MEMORY PARITY; 32381000
STOPPIT; COMMENT MPX PARITY; 32382000
IF PERIPHERALINVALIDADDRESS THEN 32383000
BEGIN COMMENT PERIPHERAL TYPE INVALID ADDRESS; 32383100
IF CODE < 4 THEN 32383200
MAXCHANNELS := RESET(MAXCHANNELS,CODE) ELSE 32383300
DCPSANDGCAS := RESET(DCPSANDGCAS, CODE - 4 | 32383400
REAL(CODE < 20)); 32383500
END ELSE 32383600
BEGIN COMMENT MEMORY TYPE INVALID ADDRESS; 32383700
MEMMODS[MINDEX.MODULE] ~ 0; 32384000
MEMMAX ~ MEMMAX - 16384; 32385000
M[F+1] ~ IF M[F+1].PSRF = 0 32386000
THEN M[F+1] & RETURNCONTROLWORD 32387000
(*,*,5,M[F+1].PIRF-1,*,*,*) 32388000
ELSE M[F+1] & RETURNCONTROLWORD 32389000
(*,*,M[F+1].PSRF-1,*,*,*,*); 32390000
M[F-1].INDEXF ~ 16383; 32391000
COMMENT SET BACK PIR & PSR SO THAT THE 32392000
INVOKING OPERATOR IS REPEATED AND32393000
THE STACK IS PROPERLY CUT BACK. 32394000
THE WORD AT 16383 IS AVAILABLE 32395000
AND UNUSED AT THIS TIME.; 32396000
END; 32397000
STOPPIT; COMMENT STACK UNDERFLOW; 32398000
STOPPIT; COMMENT INVALID OPERATOR; 32399000
END ALARM INTERRUPTS; 32400000
END MAJOR INTERRUPT CASE; 32401000
32402000
END INITIALIZE; 32403000
32404000
33000000
SAVE PROCEDURE HARDWAREINTERRUPT (P1,P2); VALUE P1,P2; 33001000
INTEGER P1; COMMENT IDENTIFIES TYPE OF INTERRUPT; 33002000
WORD P2; COMMENT USED BY PRESENCE BIT AND POSSIBLY OTHERS; 33003000
COMMENT FURTHER GLOBALS ARE 33004000
33005000
33006000
33007000
PROCEDURE MYFAULT ) NOTE THAT THESE NAMES 33008000
MYDIVIDEBYZERO ) ACCESS PCWS STUFFED IN 33009000
MYEXPONENTOVERFLOW ) KNOWN STACK LOCATIONS BY 33010000
MYEXPONENTUNDERFLOW ) COMPILES,LINKAGE LOADERS ETC. 33011000
MYINVALIDINDEX ) THEY ARE ASSOCIATED WITH E.G. 33012000
MYINTEGEROVERFLOW ) ALGOL FAULT STATEMENTS THUS 33013000
) PCWS SHOULD HAVE CONTROL BIT ON33014000
) AND ACCESSED STATEMENTS SHOULD 33015000
) NOT INVOKE SYLLABLE DEPENDENT 33016000
) INTERRUPTS 33017000
SIZE IS NUMBER OF WORDS REQUIRED, 33018000
THERE ARE POTENTIALLY 8 TYPES ONLY TWO ARE DISTINGUISHED SO 33019000
FAR(AND MUST BE GLOBALLY DEFINED): 33020000
OVLAYABLE 33021000
NONOVLAYABLE 33022000
GREATESTTYPE MAXIMUM VALUE OF TYPE FOR GETSPACE 33023000
MASSIN(DISKTYPE,DISKADDRESS,EVENT, SOME OTHER PARAMETERS) 33024000
DISKTYPE CODEDISK 33025000
OVERLAYDISK 33026000
EVENT IS SET ON COMPLETION 33027000
FIREUP TRANSFERS PROCESSES FROM EVENT QUEUE 33028000
TO READYQ 33029000
; 33030000
COMMENT THIS PROCEDURE HANDLES ALL INTERRUPTS 33031000
IT USES AS BIBLE :- "INTERRUPT HANDLING AND ACCIDENTAL ENTRY"33032000
, E.A. HAUK, JULY 25 1967 33033000
(1) NOTE THAT THE PROCEDURE MAY EITHER EXIT ON COMPLETION OR 33034000
CHANGE TO ANOTHER PROCESS(JOB). THUS ALL PROCESS INITIATION 33035000
AND RE-ACTIVATION MAY BE HANDLED IN THIS PROCEDURE IF SUCH A 33036000
COURSE PROVES DESIRABLE 33037000
(2) NOTE THAT A SINGLE PROCESSOR USER PAYS A PRICE BECAUSE OF 33038000
POTENTIAL MULTIPROCESSOR USERS. SOME ATTEMPT TO MINIMISE THIS 33039000
PRICE MAY BE WORTHWHILE. SOURCE EDITING AND THE USE OF DEFINES 33040000
MAY BE APPROPRIATE; 33041000
33042000
BEGIN COMMENT MCS 1; 33043000
REAL TRACTER ; 33044000
PROCEDURE NOTYETCODED (X); VALUE X; REAL X; FORWARD; 33045000
LAYOUT P1PARAMETER 33046000
( IOFFIELD = 0:1 % INT MASK FIELD FOR IOFINISH 33047000
, MPXSPECFIELD= 3:4 % SPECIFIES MPXA OR MPXB 33048000
, ALARMFIELD = 5:6 % ALARM TYPE 33049000
, IFFIELD = 7:4 % MPX INTERFACE 33050000
, INTFIELD = 9:10 % SD INTERRUPT TYPE 33051000
, MPXFIELD = 20:1 % MPX INTERRUPT 33052000
, SDFIELD = 24:1 % SYLLABLE DEP INT FLAG 33053000
, RTBITF = 46:1 % RETURN BIT 33054000
) ; 33055000
33056000
33057000
33058000
DEFINE INTERVALTIMERSPEC = @020000001# 33059000
, STACKOVERFLOWSPEC = @020000002# 33060000
, SYLLABLEDEPNDNT2SPEC= @040000000# 33061000
, ALARMSPEC = @200000001# 33062000
, PROCTOPROCSPEC = @010000000# 33063000
, SYLABLEDEPENDENT2 = SYLLABLEDEPNDNT2SPEC# 33064000
; 33065000
DEFINE LITERALFUNCTIONA = @ 743 # 33066000
, LITERALFUNCTIONB = @ 745 # 33067000
; 33068000
INTEGER MYSNR 33069000
, MYF 33070000
33071000
; 33072000
LABEL LOOKAROUND 33073000
, AGAIN 33074000
, FINI 33075000
; 33076000
BOOLEAN FIRST )"TRUE IF FIRST TIME AT LOOKAROUND "(33077000
RTBIT 33078000
; 33079000
MONITOR JACKMONITOR(P1); 33080000
WORD ACTUALCOPY = P2 33081000
; 33082000
FIELD BITONEF = 1:1 33082100
, BITTWOF = 2:1 33082200
; 33082300
COMMENT THE FOLLOWING LOCAL PROCEDURES HANDLE ALL INTERRUPTS OTHER 33083000
THAN INTERVAL TIMER, GCA AND IOFINISH, 33084000
; 33085000
SAVE PROCEDURE PROCTOPROC; 33086000
NOTYETCODED(PRTOPR); 33087000
SAVE PROCEDURE STACKOVERFLOW; 33088000
NOTYETCODED(STACKOVER); 33089000
SAVE PROCEDURE SYLLABLEDEPENDENT2; 33090000
KILLME(SYLABLEDEPENDENT2); 33091000
SAVE PROCEDURE ALARM; 33092000
NOTYETCODED(BLOWUP+P1.ALARMFIELD); 33093000
SAVE PROCEDURE MEMORYPROTECT; 33094000
NOTYETCODED(MEMPROTECT); 33095000
SAVE PROCEDURE INVALIDOPERATOR; 33096000
NOTYETCODED(INVALIDOP); 33097000
SAVE PROCEDURE SEQUENCEERROR; 33098000
NOTYETCODED(SEQERROR); 33099000
SAVE PROCEDURE MLL1; 33100000
NOTYETCODED(ML1); 33101000
SAVE PROCEDURE MLL2; 33102000
NOTYETCODED(ML2); 33103000
SAVE PROCEDURE MLL3; 33104000
NOTYETCODED(ML3); 33105000
SAVE PROCEDURE MLL4; 33106000
NOTYETCODED(ML4); 33107000
SAVE PROCEDURE EXTERNALMPX; 33108000
NOTYETCODED(EXTMPX); 33109000
SAVE PROCEDURE MPXUNASSIGNED(SPEC); VALUE SPEC; INTEGER SPEC; 33110000
NOTYETCODED(SPEC); 33111000
SAVE PROCEDURE BOTTOMOFSTACK; 33112000
NOTYETCODED(STACKBOTTOM); 33113000
SAVE PROCEDURE ARITHMETICFAULT(WHICH); VALUE WHICH; 33114000
INTEGER WHICH; COMMENT SPECIFIES INTERRUPT; 33115000
COMMENT HANDLES DIVIDE BY ZERO,EXPONENT OVERFLOW,EXPONENT UNDERFLOW, 33116000
INVALID INDEX AND INTEGER OVERFLOW 33117000
THE PROCEDURE ACCESSES "MYCOURSE" (A DEFINE OR 33118000
INTRINSIC ACCESSING A STACK LOCATION SET BY THE COMPILER. THE 33119000
LINKAGE LOADER OR SOMETHING) 33120000
MYCOURSE = UPTOYOU THE MCP DOES AS IT PLEASES 33121000
= FINISH THE MCP MUST D-ES ME 33122000
= CARRYON THE MCP IGNORES THIS INTRUPT33123000
= TELLME THE MCP SETS SOME FLAGS 33124000
= FAULTROUTINE ENTER GENERAL FAULT ROUTINE 33125000
= SELECT ACCESS PCW APPROPRIATE TO 33126000
INTERRUPT 33127000
THESE CHOICES COULD BE LIMITED. GIVING A MORE 33128000
UNIFORM APPROACH BUT USING MORE CORE STORAGE. THEY ALLOW ALGOL,33129000
COBOL ETC. TO REACT DIFFERENTLY TO FAULT CONDITIONS - DO WE 33130000
WANT THIS 33131000
ALL CHOICES EXCEPT THE LAST TWO INVOLVE RETURN TO THE33132000
INTERRUPT ROUTINE. HOWEVER BAD GO TOS ASSOCIATED WITH THE LAST 33133000
TWO CHOICES (A LIKELY OCCURRENCE)MAY PREVENT SUCH A RETURN. 33134000
HENCE THE BAD GO TO MECHANISM MUST CALL THE PROCEDURE 33135000
WHATDOIDO (AMONG OTHER THINGS) 33136000
NOTE THAT THE CONCEPT OF MASTER AND SLAVE PROCESSORS 33137000
AS DESCRIBED BY DAHM IS CONSIDERED AN UNNECESSARY COMPLICATION 33138000
IN THE HANDLING OF SYLLABLE DEPENDENT INTERRUPTS 33139000
; 33140000
BEGIN 33141000
INTEGER MYACTION 33142000
; 33143000
LABEL BUZZ,LOOKFORJOB 33144000
; 33145000
33146000
33147000
33148000
IF MYACTION ~ MYCOURSE=UPTOYOU OR MYACTION=FINISH THEN 33149000
KILLME(WHICH) 33150000
ELSE IF MYACTION =CARRYON THEN GO LOOKFORJOB 33151000
ELSE IF MYACTION =TELLME THEN BEGIN SETOVERFLOWFF; 33152000
GO LOOKFORJOB END 33153000
ELSE IF MYACTION =FAULTROUTINE THEN 33154000
MYFAULT(P2) 33155000
ELSE 33156000
CASE WHICH OF 33157000
BEGIN 33158000
MYDIVIDEBYZERO(P2); 33159000
MYEXPONENTOVERFLOW(P2); 33160000
MYEXPONENTUNDERFLOW(P2); 33161000
MYINVALIDINDEX(P2); 33162000
MYINTEGEROVERFLOW(P2); 33163000
END CASE EXPRESSION; 33164000
LOOKFORJOB: 33165000
END ARITHMETICFAULT; 33166000
SAVE WORD PROCEDURE PRESENCEBIT; 33167000
COMMENT 33168000
(1) THE PROCEDURE DOES NOT RUN AROUND MAKING ABSENT COPIES PRESENT 33169000
MAYBE IT SHOULD; 33170000
BEGIN COMMENT MCS 1; 33171000
LABEL TOSLEEP 33172000
,FIN 33173000
,LOOKFORPREEMPT 33174000
,MOMPRESENT 33175000
33176000
; 33177000
INTEGER 33178000
TI1,TI2,TI3, 33179000
IOCW, 33180000
KIND )"WHETHER P2 IS OPERAND,DD,SEGDESC OR IRW "(33181000
FIRSTLOC )"MULTIPLE DESCRIPTORS-LOCATION FIRST ARG "(33182000
LASTLOC 33183000
; 33184000
EVENT EVNN 33185000
; 33186000
33187000
33188000
33189000
WORD 33190000
MOM %HOLDS MOM (NOT COPY) 33191000
, MOMLOCATION %INDEX INTO M FOR MOM 33192000
, TW1 = TI2 33193000
; 33194000
33195000
33196000
33197000
BOOLEAN ALREADYPRESENT; 33198000
33199000
33200000
33201000
33202000
BOOLEAN NOCHANGE 33203000
, OLAY 33203100
; 33204000
ARRAY DISKADDRESSES[*] 33205000
, IOCBREFERENCE [IOCBSIZE] 33206000
; 33207000
REFERENCE IOCB = IOCBREFERENCE 33208000
; 33209000
DEFINE FIXRECORDDESC(X) = WORD(AREADESC @ X).ADDRESSF # 33210000
; 33211000
33212000
BUZZCONTROL(PBLOK); COMMENT *** BUZZ; 33213000
COMMENT*** AT PRESENT THIS LOCK IS REDUNDANT. HOWEVER WHEN GROSS LOCK 33214000
IS REMOVED, AN EVEN FINER LOCK MAY BE REQUIRED; 33215000
ALREADYPRESENT~FALSE; 33216000
RTBIT ~ BOOLEAN(P1.RTBITF); 33217000
NOCHANGE~FALSE; 33218000
IF (KIND ~ ACTUALCOPY.TAG) = SINGL 33219000
THEN BEGIN COMMENT MCS 2MULTIPLE DESCRIPTORS; 33220000
LASTLOC := MYF - REAL(ACTUALCOPY); 33221000
FIRSTLOC := MYF - 1; 33222000
UNLOCK(PBLOK); 33223000
33224000
FOR TI1 := FIRSTLOC STEP -1 UNTIL LASTLOC DO 33225000
BEGIN 33226000
IF (TW1 := P2 := M[TI1]).TAG = DOUBL THEN 33227000
BEGIN 33227100
LASTLOC := * - 1; 33227200
TI1 := * - 1; 33227300
COMMENT P2 DOESN"T COUNT DOUBLES AS 2 33227400
WORDS; 33227500
END ELSE 33227600
IF TW1.TAG = DATADESC THEN 33228000
IF NOT BOOLEAN(REAL(TW1).PBITF) THEN 33229000
M[TI1] ~ PRESENCEBIT; 33230000
33231000
END; 33232000
GO TO FIN; 33233000
END MCS 2 MULTIPLE DESCRIPTORS 33234000
ELSE 33235000
33236000
IF (REAL(MOM~M[MOMLOCATION~(IF KIND=IRW 33237000
THEN STACKVECTOR [ACTUALCOPY.STKNRF].ADDRESSF33238000
+ACTUALCOPY.DISPF 33239000
+ACTUALCOPY.SIRWDELTAF 33240000
ELSE ACTUALCOPY.ADDRESSF)] 33241000
).LOCKBITF=1 AND KIND=SEGDESC) 33242000
OR DESCRIPTORLOCK 33242100
THEN 33243000
COMMENT *** NOTE ABSOLUTE ADDRESSES, THIS IS A MESSY BUSINESS AND33244000
SHOULD BE CHANGED IF POSSIBLE. NOTE THAT THE SIRW 33245000
IS CHANGED INTO AN ABSOLUTE ADDRESS BECAUSE GETSPACE 33246000
EXPECTS ONE; 33247000
BEGIN COMMENT MCS 3; 33248000
UNLOCK(PBLOK); 33249000
WAIT(EVNT @ REFERENCE(IOCBREFERENCE ~ 33250000
IOCBREFERENCE&REFERENCED 33251000
(1,*,* 33251100
,TI3~IF KIND=SEGDESC 33251200
THEN MOM.ADDRESSF 33251300
ELSE MOM.ADDRESF 33251400
) 33251500
)); 33252000
TI2~WORD(AREADESC@IOCB).ADDRESSF+1; 33253000
33254000
COMMENT *** MAYBE THIS CAN BE FIXED LATER; 33255000
GO TOSLEEP; 33256000
END MCS 3 33257000
ELSE; 33258000
33259000
33260000
33261000
33262000
UNLOCK(PBLOK); 33263000
IF MOM.AITINDICATORF=1 AND KIND=DATADESC 33264000
THEN BEGIN M[MOMLOCATION]~MOM~DOPEVECTOR(MOM); 33265000
IF BOOLEAN(ACTUALCOPY.IBITF) THEN 33266000
ACTUALCOPY~ MOM &DATADESCRIPTOR 33267000
(*,*,1,1,*,*,*,*, 33268000
ACTUALCOPY.INDEXF,*) ELSE 33269000
ACTUALCOPY~MOM&DATADESCRIPTOR(*,*,1,*,*,*,*33270000
,*,*,*); 33271000
GO LOOKFORPREEMPT; 33272000
END; 33273000
IF MOM.PBITF= 1 33274000
THEN 33275000
BEGIN COMMENT MCS 4; 33276000
TI2~MOM.ADDRESSF; 33277000
ALREADYPRESENT ~ TRUE; 33278000
MOMPRESENT: IF KIND!IRW THEN PREsENCEBIT~ACTUALCOPY 33279000
~ACTUALCOPY&FIXDESC(1,*,TI2); 33280000
IF NOT ALREADYPRESENT 33281000
THEN 33282000
BEGIN COMMENT MCS 4A ; 33283000
MOM~MOM&FIXDESC(1,*,TI2); 33284000
IF KIND=SEGDESC 33285000
THEN MOM.LOCKBITF~0; 33286000
M [MOMLOCATION] ~ MOM; 33287000
TURNOVERLAYKEY(MOMLOCATION); 33288000
END MCS 4A; 33288100
IF NOCHANGE 33289000
THEN 33290000
BEGIN COMMENT MCS 4B; 33291000
IF NOT ALREADYPRESENT THEN 33294000
FORGETAREA(IOCBSIZE,TI333294100
); 33294200
UNLOCK(MULTIPLEREFERENCELOK);33295000
GO FIN; 33296000
END MCS 4B; 33297000
33298000
LOOKFORPREEMPT: % *** THERE WAS A CONDITIONAL CALL ON WHATDOIDO 33299000
END MCS 4 33300000
ELSE 33301000
BEGIN COMMENT MCS 5 ; 33302000
COMMENT ********** *************33303000
******************* *************33304000
DATA AND SEGMENT DESCRIPTORS ARE INTERPRETED AS FOLLOWS 33305000
***** DATA DESCRIPTORS ***** 33306000
INTERPRETATION 33307000
FIELD OLAYTYPEF 33308000
MCPF FILETYPEF AITINDICATORF ADDRESF 33309000
(MCPCODEF) 33310000
BITS 19:1 18:1 17:1 16:17 33311000
0 0 0 >1 NON-MCP READ IN OLAYABLE 33312000
FROM OLAY FILE 33313000
0 0 0 0 NON-MCP GET OLAYABLE 33314000
0 0 0 1 NON-MCP GET SAVE SPACE 33315000
0 0 1 * NON-MCP AIT REFERENCE 33316000
0 1 0 * NON-MCP READ ONLY 33317000
FROM CODE FILE 33318000
0 1 1 * NOT USED 33319000
1 0 0 >1 NOT USED 33320000
1 0 0 0 MCP GET OLAYABLE SPACE 33321000
1 0 0 1 MCP GET SAVE SPACE 33322000
1 0 1 * MCP.AIT REFERENCE 33323000
1 1 0 * MCP READ ONLY 33324000
FROM CODE FILE 33325000
1 1 1 * ADDRESS IS THAT OF IOCB 33326000
SOMEBODY ELSE IS READING 33326100
IN ARRAY.WAIT ON EVENT IN 33326200
IOCB. (NOTE THIS IS A 33326300
SPECIAL COMBINATION WHERE 33326400
MEANINGS OF INDIVIDUAL 33326500
BITS DO NOT APPLY). 33326600
*****SEGMENT DESCRIPTORS ***** 33327000
INTERPRETATION 33328000
FIELD DICTIONARYF LOCKBITF ADDRESSF 33329000
BITS 45:1 44:1 19:20 33330000
1 0 * DO DICTIONARY READ IN 33331000
OVERLAYABLE PROGRAM FROM 33332000
MCP CODE FILE 33333000
0 0 * D1 DICTIONARY.READ IN 33334000
OVERLAYABLE FROM PROGRAM 33335000
CODE FILE 33336000
0 1 * ) ADDRESS IS THAT OF IOCB 33337000
1 1 * ) SOMEBODY ELSE IS READING 33338000
IN PROGRAM. WAIT ON EVENT 33339000
IN IOCB 33340000
DD FORMAT TO BE DETERMINED NON OLAYABLE FROM OLAY FILE 33343000
DD FORMAT TO BE DETERMINED NON OLAYABLE FROM CODE FILE 33344000
SD >1 * 0 READ IN OVERLABLE PROGRAM 33345000
SD >1 * 1 READ NON OVERLAYABLE PROGRAM33346000
; 33347000
TI1~MOM.LENGTHF; 33348000
COMMENT *** MAYBE WE SHOULD CALL GETAREA SOMETIMES; 33349000
TI2 ~GETSPACE 33350000
( TI1 ~(IF KIND=SEGDESC 33351000
THEN TI1 33352000
ELSE IF MOM.SZF = 1 33353000
THEN TI1 | 2 33354000
ELSE IF TI3~ MOM.SZF= 0 33355000
THEN TI1 33356000
ELSE (TI1 ~ (IF TI3 = 4 THEN 33357000
(TI3~6) - 1 33358000
ELSE IF TI3 = 3 THEN 33359000
(TI3~8) - 1 33360000
ELSE (TI3~12) - 1)) 33361000
DIV TI3) 33362000
, MYSNR 33363000
,0&SPACETYPE (1,1,1, 33364000
REAL(NOT ( KIND = DATADESC AND REAL(MOM).ADDRESSF = 1))) 33365000
33366000
,MOMLOCATION 33367000
); 33368000
IF KIND = SEGDESC OR MOM.ADDRESF > 1 OR 33369000
MOM.DESCRIPTORLOCKF = 2 THEN 33369100
33370000
BEGIN COMMENT MCS 6; 33371000
IF(KIND=SEGDESC AND MOM.DICTIONARYF=1) OR 33372000
(KIND=DATADESC AND MOM.MCPCODEF=3) 33373000
THEN TI3 ~ MOM.ADDRESF+MCPDISKBASE 33374000
ELSE 33375000
BEGIN 33376000
DISKADDRESSES~WORDSTACK 33377000
[IF(OLAY~KIND=DATADESC AND MOM.FILETYPEF=0) 33377500
THEN MYSNR 33378000
ELSE WORDSTACK[MYSNR,PROCESSFAMILYLINKPLACE]. 33378500
FATHERF 33378502
, IF OLAY 33379000
THEN OLAYFILEDESCRIPTORPLACE 33379500
ELSE D1CODEFILEDESCPLACE 33380000
]; 33380800
33381000
TI3~DISKADDRESSES 33382000
[FIRSTROWINDEX + (TI3 := MOM.ADDRESF) 33383000
DIV(IF OLAY THEN OLAYROWLENTH ELSE CODEROWLENTH)33384000
] 33385000
+TI3 MOD(IF OLAY THEN OLAYROWLENTH ELSE CODEROWLENTH)33386000
; 33387000
33388000
END; 33389000
IOCW ~ @440 + REAL(KIND = SEGDESC); 33390000
RESET(EVNN); 33391000
DISKADDRESSES~DISKADDRESSES&ARRAYDESCL(3,TI1,TI2); 33392000
MOM~MOM&POINTTOIOCB(*, 33393000
WORD(DISKIO(DISKADDRESSES,-1,TI1,TI3,IOCW,EVNN))); 33394000
M[MOMLOCATION]~MOM 33394100
~IF KIND=SEGDESC THEN MOM&LOKMOM(1,*) 33394200
ELSE MOM&LOKMOM(*,7); 33394300
UNLOCK(PBLOK); 33396000
WAIT (EVNN); 33397000
TI3 ~ MOM.ADDRESSF; 33398000
33399000
TOSLEEP: NOCHANGE~ TRUE; 33400000
BUZZCONTROL(MULTIPLEREFERENCELOK); COMMENT *** BUZZ; 33401000
IF BOOLEAN (M[MOMLOCATION].PBITF) 33402000
THEN BEGIN 33403000
ALREADYPRESENT ~ TRUE; 33404000
END; 33405000
33406000
GO TO MOMPRESENT; 33407000
END MCS 6 33408000
ELSE BEGIN 33409000
MOM~MOM&FIXDESC(1,*,TI2); 33410000
INITIALIZETOZERO (TI2, TI1); 33411000
COMMENT *** OPTIMISE LATER; 33412000
GO TO MOMPRESENT; 33413000
END; 33414000
END MCS 5; 33415000
FIN: 33416000
RETURN(ACTUALCOPY); 33417000
END MCS 1 PRESENCEBIT; 33418000
PROCEDURE NOTYETCODED(SPEC); VALUE SPEC; 33419000
REAL SPEC; COMMENT SPECIFIES MSSING CODE; 33420000
BEGIN 33421000
COMMENT MUST IMSERT CODE TO PRINT OUT MESSAGE HERE; 33422000
KILLME(SPEC); 33423000
END NOTYETCODED; 33424000
%%%%% INTERRUPT PROCEDURE OUTER BLOCK CODE %%%% 33425000
%%%%% %%%% 33426000
%%%%% %%%% 33427000
TRACTER~TRACE(0); 33428000
IF SIMULATING THEN 33428990
MONITORVALUE~D[31]; 33429000
P1~P1; COMMENT ***** REDUNDANT- FOR MONITORING; 33430000
COMMENT 33431000
IF P1= INTERVALTIMERSPEC AND BUSY(GROSSLOK) 33432000
THEN GO FINI 33433000
ELSE IF LOCK(GROSSLOK) THEN KILLME(GROSSLOCK); 33434000
COMMENT *** ELSE BUZZ(GROSSLOK) LATER; 33435000
COMMENT GROSSLOK IS NOMINALLY SET AT ENTRY TO INTERRUPT 33436000
PROCEDURE AND DETERMINES THAT ONLY ONE INTERRUPT33437000
AT A TIME IS HANDLED. THIS MAY BE A TEMPORARY 33438000
MEASURE IN WHICH CASE A LOCK LESS POWERFUL THAN 33439000
GROSSLOK, WHICH PREVENTS OVERLAY ACTION, WILL BE33440000
USED 33441000
WHEN AN INTERRUPT GOES THROUGH THE LOCK, IT33442000
MAY NOT BE INTERRUPTED (FOR HARDWARE OR 33443000
SOFTWARE REASONS) BY ANYTHING EXCEPT INTERVAL 33444000
TIMER. HENCE INTERVAL TIMER MUST NOT BUZZ THE 33445000
LOCK IF IT HAS BEEN SET BY SOMEBODY ELSE- IN 33446000
THIS CIRCUMSTANCE THE INTERVAL TIMER INTERRUPT 33447000
IS LOST 33448000
; 33449000
DISABLEOVERLAY; 33450000
COMMENT THIS SHOULD 33451000
(1) MAKE THE STACK NON OVERLAYABLE 33452000
(2) MARK THE STACK APPROPRIATELY 33453000
AT PRESENT IT DOES NOTHING. NOTE THAT THIS HAS TO MESH IN WITH 33454000
GENERAL SCHEME FOR HANDLING ABSOLUTE ADDRESSES IN STACKS 33455000
; 33456000
MYF ~ F; 33457000
MYSNR~SNR; 33458000
COMMENT *** ABSOLUTE ADDRESS; 33459000
COMMENT * ** * * * * * * *; CASE P1.MPXFIELD | P1.IFFIELD OF 33460000
BEGIN COMMENT MCS 2; 33461000
COMMENT ALL NON MPX INTERRUPTS HERE; 33462000
CASE P1.SDFIELD|FIRSTONE(P1.INTFIELD) OF 33463000
BEGIN COMMENT MCS 3; 33464000
COMMENT ALL NON MPX,NON SYLLABLE DEPENDENT INTERRUPTS HERE; 33465000
IF P1 = PROCTOPROCSPEC THEN PROCTOPROC 33466000
ELSE IF P1=INTERvALTIMERsPEc THEN 33467000
BEGIN COMMENT MCS 3A; 33468000
IF (COUNTFORTIMERINTERRUPTEVENT~*+1) 33469000
= NUMBEROFPROCESSORS AND NOT 33470000
BUSY(READYQ) 33470100
THEN BEGIN COMMENT MCS 3B; 33471000
COUNTFORTIMERINTERRUPTEVENT 33472000
~0; 33473000
CAUSE (TIMERINTERRUPTEVENT);33474000
END MCS 3B; 33475000
END MCS 3A 33476000
ELSE IF P1=STACKOVERFLOWSPEC THEN STACKOVERFLOW 33477000
ELSE IF P1=SYLLABLEDEPNDNT2SPEC THEN 33478000
SYLLABLEDEPENDENT2 33479000
ELSE IF P1 } ALARMSPEC THEN ALARM 33480000
ELSE STOP; 33481000
MEMORYPROTECT; 33482000
INVALIDOPERATOR; 33483000
ARITHMETICFAULT(DZ); COMMENT DIVIDE BY ZERO; 33484000
ARITHMETICFAULT(EO); COMMENT EXPONENT OVERFLOW; 33485000
ARITHMETICFAULT(EU); COMMENT EXPONENT UNDERFLOW; 33486000
ARITHMETICFAULT(II); COMMENT INVALID INDEX; 33487000
ARITHMETICFAULT(IO); COMMENT INTEGER OVERFLOW; 33488000
BOTTOMOFSTACK; 33489000
BEGIN 33490000
PRESENCEBIT; 33491000
33492000
GO FINI; 33493000
END; 33494000
STOP; 33495000
WHATDOIDO; 33496000
GO FINI; 33497000
END MCS 3 SYLLABLE DEPENDENT INTERRUPTS; 33498000
MLL1; 33499000
MLL2; 33500000
MLL3; 33501000
MLL4; 33502000
EXTERNALMPX; 33503000
COMMENT FIRST MPX UNASSIGNED INTERRUPT HANDLED HERE.IN-LINE CODE USED; 33504000
NOTYETCODED(GCAINTERRUPT); 33505000
COMMENT OTHER MPX UNASSIGNED INTERRUPTS HANDLED HERE; 33506000
MPXUNASSIGNED(UA2); 33507000
MPXUNASSIGNED(UA3); 33508000
AGAIN: 33508100
IOFINISH(P1.MPXSPECFIELD); 33509000
COMMENT SKIP UNUSED BIT POSITIONS IN IFFIELD HERE; 33510000
;;;;; 33511000
COMMENT REST OF THIS PROCEDURE DEVOTED TO IOFINISH. NOTE THE FOLLOWING:33512000
(1) IOFINISH AND GCA INTERRUPTS ARE HANDLED BY CODE LOCAL33513000
TO INTERRUPT PROCEDURE . ALL OTHER INTERRUPTS 33514000
HANDLED BY PROCEDURE CALLS 33515000
(2) CALLED PROCEDURES ARE DECLARED LOCAL TO THE 33516000
INTERRUPT PROCEDURE 33517000
(3) THERE MAY BE DUPLICATION OF CODE IN ORDER TO 33518000
SPEED THE PROCESSING OF SOME INTERRUPTS 33519000
; 33520000
STOP; 33522000
END MCS CASE EXPRESSION; 33523000
IF MULTIPLEXORMASK.BITONEF 33524000
THEN IF (P1~SCANIN(LITERALFUNCTIONA))!1 33525000
THEN GO AGAIN; 33526000
IF MULTIPLEXORMASK.BITTWOF 33527000
THEN IF (P1~SCANIN(LITERALFUNCTIONB))!2 33528000
THEN GO AGAIN; 33529000
WHATDOIDO; 33529100
FINI: 33530000
UNLOCK(GROSSLOK); 33531000
ENABLEOVERLAY; 33532000
TRACE(TRACTER); 33534998
IF RTBIT THEN RETURN(ACTUALCOPY); 33535000
END MCS 1 HARDWAREINTERRUPT; 33537000
SAVE PROCEDURE WHATDOIDO; 33538000
COMMENT IF THERE IS SOMETHING OF HIGHER PRIORITY IN THE READYQ THEN 33539000
FIRE IT UP ELSE EXIT. SIMILAR TO WAIT AND HOLD 33540000
; 33541000
BEGIN 33542000
LABEL FINI 33543000
; 33544000
REAL MYSNR 33545000
, NEXTSTACKNO 33546000
; 33547000
MONITOR JACKMONITOR(MYSNR); 33548000
33549000
SETINTERVALTIMER; 33550000
MYSNR ~ SNR; 33551000
STACK[MYSNR,PRIORITYPLACE]~0;% *** TAKE OUT WHEN PRIORITY ALGORTHMS OK 33551100
IF LOCK(READYQ) THEN GO FINIS; % *** WITH NO INTERVAL TIMER 33552000
% *** PROBLEMS BUZZCONTROL 33552100
COMMENT ***** SHOULD THIS BE BUZZ; 33553000
IF NOTHINGTODO 33554000
THEN GO FINI 33555000
ELSE IF STACK[NEXTSTACKNO~NEXTSTACKINREADYQ,PRIORITYPLACE]33556000
}STACK[MYSNR,PRIORITYPLACE] 33557000
THEN BEGIN 33558000
INSERTINQ(READYQ,DUMMYREF,MYSNR); 33559000
MOVETONEXTINREADYQ; 33560000
END 33561000
ELSE ; 33562000
33563000
FINI: UNLOCK(READYQ); 33564000
FINIS: 33564100
END WHATDOIDO; 33565000
33566000
SAVE PROCEDURE EVENTHANDLER (THEEVENT,EVENTWORD1,WAITFLAG); 33567000
VALUE EVENTWORD1,WAITFLAG; 33568000
WORD THEEVENT %IRW OR INDEXED DD POINTING TO EVENT 33569000
, EVENTWORD1 %FIRST WORD OF EVENT 33570000
; 33571000
BOOLEAN WAITFLAG %TRUE IF WAIT, FALSE IF CAUSE 33572000
; 33573000
COMMENT 33574000
THE ESPOL INTRINSIC WAIT(WAITFLAG TRUE) OR CAUSE, LOCKS THE EVENT 33575000
AND PASSES TO THIS PROCEDURE: 33576000
AN IRW OR INDEXED DD POINTING TO THE EVENT 33577000
THE FIRST WORD OF THE EVENT (WITH A DOUBLE TAG) 33578000
A FLAG INDICATING WHETHER CAUSE OR WAIT IS REQUIRED 33579000
33580000
33581000
WAIT ACTION: 33582000
1) THE INTERVAL TIMER IS RESET 33583000
2) IF THE READYQ IS EMPTY, THE NOTHING TO DO LOOP IS 33584000
ENTERED. IN THE NOTHING TO DO LOOP: 33585000
A THE READYQ IS BUZZED 33586000
B IF READYQ NON EMPTY THEN GO TO 3 33587000
C IF EVENT HAS HAPPENED,UNLOCK READYQ,E GO TO 4 33588000
D OTHERWISE CALL STATUS AND GO TO A 33589000
3) IF THE READYQ IS NOT EMPTY 33590000
A PUT THIS PROCESS IN EVENT QUEUE 33591000
B UNLOCK EVENT (BY REPLACING FIRST WORD OF EVENT) 33592000
C UNLOCK READYQ 33593000
D MOVE TO NEW JOB 33594000
E ON RETURN PROCESS ANY OUTSTANDING SOFTWARE 33595000
INTERRUPTS 33596000
4) EXIT 33597000
CAUSE ACTION 33598000
1) MOVE WAITQ TO READYQ 33599000
2) CHECK SOFTWARE INTERRUPT COUNT IN FIRST WORD OF EVENT 33600000
IF ZERO GO TO OTHERWISE 33601000
3) FOR EACH STACK IN INTERRUPT QUEUE IN TURN 33602000
A BUZZ SOFTWAREINTERRUPTLOCK 33603000
B IS THE INTERRUPT ENABLED,IF NOT GO TO NEXT STACK33604000
C OTHERWISE ENTER INTERRUPT IN SOFTWAREINTERRUPTQ 33605000
D IF STACK ACTIVE THEN DO A HEYOU 33606000
E UNLOCK SOFTWARE INTERRUPT LOCK 33607000
4) UNLOCK AND SET THE EVENT 33608000
; 33609000
BEGIN 33610000
LABEL LOOKFORNEWPROCESS 33611000
, LOOKFORANOTHER 33612000
; 33613000
EVENT THISEVENT=THEEVENT 33614000
; 33615000
DEFINE NEXTINTERRUPTPCW = 33616000
STACK[(NEXTSNR~NEXTSTACK.STKNRF), 33617000
DISPPCW~NEXTSTACK.DISPF+NEXTSTACK.SIRWDELTAF]# 33618000
33619000
33620000
,UNLOCKEVENT=THEEVENT~EVENTWORD1&FIRSTEVENTWORD(,*,*,33621000
*,*,*,0)# 33622000
, PROCESSINHOLD = REFERENCE(WORD(NEXTSNR))# 33623000
, EVENTWAITQ= EVENTWORD1 # 33624000
; 33625000
WORD EVENTPOINTER=THEEVENT %PREVENTS PARAMETER ACTION 33626000
, NEXTSTACK 33627000
, INTERRUPTPOINTER 33628000
; 33629000
REAL INTERRUPTQCOUNT 33630000
, NEXTSNR 33631000
, DISPPCW = NEXTSTACK 33632000
, MYSNR 33633000
; 33634000
REFERENCE REFERENCEINTERRUPTPOINTER=INTERRUPTPOINTER 33635000
; 33636000
MONITOR JACKMONITOR(WAITFLAG); 33637000
INTEGER IDLETI, REALTI; 33638000
MONITOR DONMONITOR (REALTI, IDLETI); 33639000
MYSNR~SNR; 33640000
IF SIMULATING THEN BEGIN 33641100
WAITFLAG ~ *; 33641200
REALTI ~ REGISTERS[61]; 33642000
IDLETI ~ REGISTERS[62]; 33643000
END; 33643100
IF WAITFLAG 33644000
THEN 33645000
BEGIN%%%%%%%%%%%%%%% %%%MCS 133646000
% WAIT PROCESSING 33647000
SETINTERVALTIMER; 33649000
IF BOOLEAN(EVENTWORD1.HAPPENEDBITF) 33649100
THEN BEGIN UNLOCKEVENT;GO FINI;END; 33649200
LOOKFORNEWPROCESS: BUZZCONTROL(READYQ); 33650000
COMMENT ***** SHOULD THIS BE BUZZ; 33651000
IF NOTHINGTODO 33652000
THEN 33653000
BEGIN%%%%%%%%%%%%%%% %%%MCS 233654000
% READYQ EMPTY 33655000
UNLOCK(READYQ); 33655100
UNLOCKEVENT; 33656000
33657000
33658000
COMMENT *** 33659000
ALLOW; 33660000
COMMENT * * * * SIMULATOR ONLY; PAUSE; 33661000
DISALLOW; 33662000
IF HAPPENED(THISEVENT) 33663000
THEN 33664000
BEGIN%%%%%%%%%%%%%%% %%%MCS 333665000
% CLEAN UP AND GET OUT 33666000
UNLOCK(READYQ); 33667000
33668000
COMMENT THE EVENT IS UNLOCKED WITH FIRST 33669000
WORD RESTORED; 33670000
END %%%%%%%%%%%%%%% %%%MCS 333671000
ELSE LOOKFORSOMETHING; 33672000
END %%%%%%%%%%%%%%% %%%MCS 233682000
ELSE 33683000
BEGIN%%%%%%%%%%%%%%% %%%MCS 533684000
% SEND PROCESS TO SLEEP 33685000
WORDSTACK[MYSNR,EVENTWAITQLINK] 33686000
.FULLINDICATORF~1; 33687000
IF EVENTWORD1.WAITQHEADF=0 33688000
THEN 33689000
%%%%%%%%%%%%%%%%%%%% %%%%%%% 33690000
%FIRST IN QUEUE 33691000
EVENTWORD1.WAITQHEADF~MYSNR 33692000
ELSE 33693000
BEGIN%%%%%%%%%% %%%MCS5133694000
% SECOND AND SUBSEQUENT IN QUEUE 33695000
33696000
WORDSTACK[MYSNR,EVENTWAITQLINK].BACKWARDLINKF~EVENTWORD1.WAITQTAILF; 33697000
WORDSTACK[EVENTWORD1.WAITQTAILF,EVENTWAITQLINK].FORWARDLINKF~MYSNR; 33698000
33699000
33700000
33701000
END; %%%%%%%%%% %%%MCS5133702000
EVENTWORD1.WAITQTAILF~MYSNR; 33703000
UNLOCKEVENT; 33704000
MOVETONEXTINREADYQ; 33705000
COMMENT A READYQ ALGORITAM:DELINKS,UNLOCKS,MOVES; 33706000
COMMENT AT THIS POINT WE LOSE CONTROL SOME LOGGING 33707000
ACTION IS REQUIRED; 33708000
LOOKFORANOTHER: IFTHEREISASOFTWAREINTERRUPT 33709000
THEN 33710000
BEGIN%%%%%%%%%%%%%%% %%%MCS 633711000
HANDLETHESOFTWAREINTERRUPT; 33712000
GO LOOKFORANOTHER; 33713000
END %%%%%%%%%%%%%%% %%%MCS 633714000
END %%%%%%%%%%%%%%% %%%MCS 533715000
END %%%%%%%%%%%%%%% %%%MCS 133716000
ELSE 33717000
BEGIN%%%%%%%%%%%%%%% %%%MCS 733718000
% CAUSE PROCESSING 33719000
IF EVENTWORD1.WAITQHEADF!0 33720000
THEN 33721000
BEGIN%%%%%%%%%%%%%%% %%%MCS 833722000
BUZZCONTROL(READYQ); 33723000
INSERTINQUEUE(WAITI,EVENTWAITQ); 33724000
UNLOCK(READYQ); 33725000
END ; %%%%%%%%%% %%%MCS 833726000
IF INTERRUPTQCOUNT ~ EVENTWORD1.COUNTF!0 33727000
THEN 33728000
BEGIN%%%%%%%%%%%%%%% %%%MCS 933729000
NEXTSTACK~INTERRUPTPOINTER 33730000
~SECONDWORD(THISEVENT) ;33731000
DO 33732000
BEGIN%%%%%%%%%%%%%%% %%%MCS9A33733000
BUZZ(SOFTWAREINTERRUPTLOCK); 33734000
IF BOOLEAN(NEXTINTERRUPTPCW). 33735000
ENABLEBITF 33736000
THEN 33737000
BEGIN%%%%%%%%%%%%%%% %%%MCS1033738000
INTERRUPTPOINTER~INTERRUPTPOINTER&STUFFEDIRW(,,*,*,*); 33739000
INSERT(SOFTWAREINTERRUPTQ,REFERENCEINTERRUPTPOINTER); 33740000
IF WORDSTACK[NEXTSNR,0].TAG = SINGL 33741000
THEN HEYOU 33742000
ELSE IF STACK[NEXTSNR,READYQLINK].FULLINDICATORF=0 33743000
THEN 33744000
BEGIN%%%%%%%%%%%%%%% %%%MCS5033745000
BUZZ(READYQ); 33746000
INSERTINQ(READYQ,DUMMYREF,MYSNR); 33747000
33748000
UNLOCK(READYQ); 33749000
END ;%%%%%%%%%%%%%%% %%%MCS5033750000
END ;%%%%%%%%%%%%%%% %%%MCS1033751000
NEXTSTACK~INTERRUPTPOINTER 33752000
~STACK[NEXTSNR,DISPPCW-1]; 33753000
UNLOCK(SOFTWAREINTERRUPTLOCK); 33754000
END %%%%%%%%%%%%%%% %%%MCS9A33755000
UNTIL INTERRUPTQCOUNT~INTERRUPTQCOUNT-1=0; 33756000
END ;%%%%%%%%%%%%%%% %%%MCS 933757000
THEEVENT~EVENTWORD1&FIRSTEVENTWORD(,*,0,0,*,1,0); 33758000
GO LOOKFORANOTHER; 33759000
END ;%%%%%%%%%%%%%%% %%%MCS 733760000
FINI: 33761000
END EVENTHANDLER; 33762000
SAVE PROCEDURE GAOLER(EVENTT, UNLOCK); 33762100
VALUE UNLOCK; 33762120
EVENT EVENTT; 33762140
BOOLEAN UNLOCK; 33762160
COMMENT THE GAOLER KEEPS THE KEYS TO THE INTERLOCKS; 33762180
BEGIN 33762200
LABEL LOCKUP; 33762220
IF UNLOCK THEN 33762240
BEGIN 33762260
FREE(EVENTT); 33762280
CAUSE(EVENTT); 33762300
END 33762320
ELSE 33762340
LOCKUP: IF FIX(EVENTT) THEN 33762360
BEGIN 33762400
WAIT(EVENTT); 33762420
GO LOCKUP; 33762440
END 33762460
ELSE 33762465
RESET(EVENTT); 33762470
END GAOLER; 33762480
SAVE WORD PROCEDURE SOFTWAREINTERRUPTDEC(THEEVENT,EVENTWORD1,EVENTWORD2,33763000
KLUDGE,PCWPOINTER); 33764000
VALUE EVENTWORD1,EVENTWORD2,PCWPOINTER,KLUDGE; 33765000
WORD THEEVENT, % IRW OR INDEXED DD POINTING TO 33766000
% INTERRUPT EVENT 33767000
EVENTWORD1, % FIRST WORD OF EVENT 33768000
EVENTWORD2, % ZERO USED TO FIX UP SECOND WORD OF 33769000
% EVENT AT FIRST ENTRY 33770000
PCWPOINTER % POINTER TO INTERRUPT PCW (SIRW) 33771000
,KLUDGE % HORRIBLE KLUDGE FOR COMPILER 33772000
; 33773000
COMMENT 33774000
THE ESPOL INTERRUPT DECLARATION PLACES ZERO IN THE FIRST WORD OF 33775000
INTERRUPT AND A PCW REFERENCING THE STATEMENT IN THE SECOND WORD. IT33776000
GENERATES A CALL ON THIS PROCEDURE. 33777000
THIS PROCEDURE LINKS THIS STACK INTO THE INTERRUPT QUEUE BEHIND33778000
THE EVENT AFTER FIRST CHECKING THAT THE STACK IS NOT ALREADY SO 33779000
LINKED (A RUN TIME ERROR IS NOTED IF THIS CHECK FAILS) 33780000
THE INTERRUPT QUEUE IS DERIVED AS FOLLOWS: 33781000
(1) THE EVENT DECLARATION HAS PRODUCED A DOUBLE-LENGTH REAL 33782000
(2) THE FIRST (ENCOUNTERED) INTERRUPT DECLARATION REFERENCING 33783000
THE EVENT CAUSES THE SECOND WORD OF THE EVENT TO POINT TO 33784000
THE INTERRUPT PCW.THE SECOND WORD OF THE EVENT IS NOW 33785000
ESSENTIALLY A STUFFED IRW EXCEPT FOR ITS TAG FIELD. 33786000
(3) THE SECOND AND SUBSEQUENT INTERRUPT DECLARATIONS CAUSE THE33787000
FIRST WORD OF INTERRUPT IN THE STACK AT THE END OF THE 33788000
INTERRUPT QUEUE TO BE CHANGED FROM ZERO TO A STUFFED IRW 33789000
THIS STUFFED IRW POINTS TO THE PCW OF THE NEW 33790000
INTERRUPT DECLARATION. 33791000
; 33792000
BEGIN 33793000
DOUBLE EVENTVALUE=EVENTWORD1 %TWO WORDS OF EVENT STARTING WITH33794000
%EVENTWORD1 33795000
, EVENTPLACE=THEEVENT %THEEVENT INVOKES OVRD.EVENTPLACE33796000
% INVOKES STOD.NOTE NO EVAL FOR 33797000
% EVENTPLACE, HOWEVER STOD CHASES33798000
% IRWS. 33799000
; 33800000
BOOLEAN FIRST % TRUE WHEN FIRST DECLARATION 33801000
; 33802000
INTEGER COUNT % NUMBER OF STACKS IN QUEUE (INC THIS ONE) 33803000
; 33804000
WORD NEXTSTACK % POINTS TO NEXT STACK IN QUEUE 33805000
; 33806000
REAL NEXTSTACKNO 33807000
, DISPSIRW 33808000
, MYSNR 33809000
; 33810000
DEFINE NEXTINTERRUPTSIRW = STACK 33811000
[NEXTSTACKNO 33812000
~NEXTSTACK.STKNRF,33813000
DISPSIRW~NEXTSTACK.DISPF-1 33814000
+ NEXTSTACK.SIRWDELTAF]# 33815000
; 33816000
MYSNR ~ SNR; 33817000
SOFTWAREINTERRUPTDEC~KLUDGE; 33818000
EVENTWORD1.COUNTF ~ COUNT ~ EVENTWORD1.COUNTF+1; 33819000
IF COUNT=1 33820000
THEN 33821000
BEGIN%%%%%%%%%%%%%%% %%%MCS 133822000
% FIRST DECLARATION 33823000
FIRST~TRUE; 33824000
COMMENT *** THIS CODE SLOPPY-OPTIMISE LATER; 33825000
END %%%%%%%%%%%%%%% %%%MCS 133826000
ELSE 33827000
33828000
BEGIN%%%%%%%%%%%%%%% %%%MCS 233829000
% SECOND AND SUBSEQUENT DECS. 33830000
NEXTSTACK~SECONDWORD(EVENTVALUE); 33831000
DO 33832000
BEGIN%%%%%%%%%%%%%%% %%%MCS 333833000
NEXTSTACK ~ NEXTINTERRUPTSIRW; 33834000
33835000
IF MYSNR=NEXTSTACKNO THEN KILLME(INTERRUPTDEC); 33836000
END %%%%%%%%%%%%%%% %%%MCS 333837000
UNTIL (COUNT~COUNT-1)=1; 33838000
STACK[NEXTSTACKNO,DISPSIRW-1] ~ PCWPOINTER; 33839000
END; %%%%%%%%%%%%%%% %%%MCS 233840000
%%%%%%%%%%%%%%% CLEAN UP 33841000
EVENTWORD1.EVENTLOCKBITF~0; 33842000
EVENTWORD1.TAG~DOUBL; 33843000
IF FIRST 33844000
THEN BEGIN 33845000
COMMENT *** (NO GOOD) EVENTWORD2~PCWPOINTER&STUFFEDIRW(DOUBL,*,*,*,*);33846000
PCWPOINTER.TAG~DOUBL;EVENTWORD2~PCWPOINTER; 33847000
THEEVENT~EVENTWORD1; 33848000
COMMENT THIS IS TERRIBLE,DOUBLE TAG SCREWS EVERYTHING; 33849000
EVENTPLACE~EVENTVALUE; 33850000
COMMENT *** OPTIMISE LATER; 33851000
END 33852000
ELSE THEEVENT ~ EVENTWORD1; % INVOKES OVRD 33853000
END SOFTWAREINTERRUPTDEC; 33854000
SAVE PROCEDURE HOLD; 33855000
COMMENT SENDS A PROCESS TO SLEEP. THE PROCESS WILL NOT WAKE UP UNTIL 33856000
A SOFTWARE INTERRUPT IS DIRECTED TO IT 33857000
IF THERE IS NOTHING IN THE READYQ, THE PROCESS ENTERS A 33858000
NOTHING TO DO LOOP (WITH INTERRUPTS ALLOWED). SHOULD A SOFTWARE33859000
INTERRUPTED BE DIRECTED AT IT IN THIS CONDITION, IT WILL BE 33860000
INTERRUPTED BY A HEYOU (HARDWARE) INTERRUPT 33861000
THE HEYOU INTERRUPT WILL TURN ON THE HEYOUINTERRUPT FIELD 33862000
TO INDICATE THE PROCESSING OF THE SOFTWARE INTERRUPT 33863000
33864000
PART OF THE NOTHING TO DO LOOP TESTS THE READYQLINK AND 33865000
THE PROCESS EXITS IF IT IS NON ZERO 33866000
; 33867000
BEGIN 33868000
REAL MYSNR 33869000
; 33870000
LABEL LOOKFORNEWPROCESS 33871000
,FINI 33872000
; 33873000
SETINTERVALTIMER; 33874000
MYSNR~SNR; 33875000
BUZZCONTROL(READYQ); % *** BUZZ 33876000
LOOKFORNEWPROCESS: 33877000
IF NOTHINGTODO 33878000
THEN IF WORDSTACK[MYSNR,LINKPLACE].HEYOUINTERRUPTF!0 33879000
THEN 33880000
BEGIN%%%%%%%%%%%%%%% %%%MCS 133881000
WORDSTACK[MYSNR,LINKPLACE].HEYOUINTERRUPTF~0; 33882000
UNLOCK(READYQ); 33883000
GO FINI; 33884000
END %%%%%%%%%%%%%%% %%%MCS 133885000
ELSE LOOKFORSOMETHING 33886000
ELSE MOVETONEXTONEINREADYQ; 33887000
FINI: 33888000
END HOLD; 33889000
SAVE PROCEDURE HOLDINITIALISE; 33890000
COMMENT THIS PROCEDURE IS ENTERED FROM INITIALISE AND PERFORMS THE 33891000
FOLLOWING FUNCTIONS: 33892000
A.FORGETS SPACE ASSOCIATED WITH INITIALISE 33893000
B.FIXES UP STACK SO THAT RUN WILL BE ENTERED WHEN IT IS 33894000
MOVED TO LATER ON (I.E. IT IS AN INDEPENDENTRUNNER STACK) 33895000
C.ENTERS A NOTHING-TO-DO LOOP 33896000
; 33897000
BEGIN 33898000
INTEGER I 33899000
, STACKNO 33899200
; 33900000
MONITOR JACKMONITOR(IRSTACKS) 33901000
; 33902000
REAL STAKADRES 33903000
, MYSNR 33904000
; 33905000
ARRAY MYSTACK[*]; 33906000
WORD ARRAY MYWORDSTACK = MYSTACK[*]; 33907000
33908000
LABEL FIXUPPROCESSOR 33909000
; 33910000
INTEGER HI % *** FOR MONITOR ONLY 33911000
; 33912000
MONITOR JACKMONITOR(HI) 33913000
; 33914000
HI~HI; % *** FOR MONITOR ONLY 33915000
MYSNR ~ SNR; 33916000
PIRSTACKS~IRSTACKS~SET(IRSTACKS,MYSNR); 33917000
WORDSTACK[MYSNR,PROCESSNATUREPLACE].DEDICATEDSTACKF ~ 1; 33918000
IF NOT LOCK(FIRSTLOK) 33919000
THEN BEGIN %%%MCS000010033920000
PERIPHERALINITIALIZE; 33921000
FORGETSPACE(SAVE1ADDRESS); 33922000
33922500
IF INDEPENDENTRUNNERSTACKS > NUMBEROFPROCESSORS 33923000
THEN 33924000
BEGIN %%%MCS000012533925000
COMMENT WE HAVE TO BUILD SOME MORE INDEPENDENT RUNNER STACKS; 33926000
DISABLEOVERLAY; 33927000
FOR I~NUMBEROFPROCESSORS+1 STEP 1 UNTIL INDEPENDENTRUNNERSTACKS DO 33928000
BEGIN %%%MCS000015033929000
IRSTACKS~SET(IRSTACKS,(STACKNO~GETINDEPENDENTRUNNERSTACK( 33930000
STAKADRES)));33931000
WORDSTACK[STACKNO,LINKPLACE ].DEDICATEDSTACKF ~ 1; 33932000
COMMENT *** 33933000
CHANGESPACE(STAKADRES); 33934000
END; %%%MCS000015033935000
ENABLEOVERLAY; 33936000
END %%%MCS000012533937000
ELSE INDEPENDENTRUNNERSTACKS~I~ 33938000
NUMBEROFPROCESSORS ; 33939000
PIRSTACKS~IRSTACKS~RESET(IRSTACKS,TERMINATESTACK~MYSNR); 33946000
NOTFIRSTWAIT~TRUE; COMMENT *** IS THIS A KLUDGE; 33947000
33948000
END; %%%MCS000010033949000
33950000
MYSTACK~STACK[MYSNR ,*]; 33951000
MYSTACK[COREPLACE]~IRCORE; 33952000
MYSTACK[PROCTIMEPLACE]~IRPROCTIME; 33953000
MYSTACK[IOTIMEPLACE]~IRIOTIME; 33954000
MYWORDSTACK[FIRSTPLACE]~IRTOSCW; 33954100
MYWORDSTACK[FIRSTMSCWPLACE]~IRMSCW1; 33955000
MYWORDSTACK[FIRSTRCWPLACE]~IRRCW1; 33956000
MYWORDSTACK[SECNDMSCWPLACE]~IRMSCW2&MARKSTACKWD(*,*,*,MYSNR 33957000
,*,*,*,*); 33958000
MYWORDSTACK[RETURNCONTROLWORDPLACE]~RUNRETURNCONTROLWORD; 33959000
LASTNOTAVAILABLEINVECTOR~(FIRSTAVAILABLEINVECTOR~FIRSTONE 33959020
(IRSTACKS))-1; 33959040
FORK(DIRECTORYCOMPLEMENT, SYSTEMDIRECTORY); 33959060
HOLD; 33959200
END HOLDINITIALISE; 33960000
SAVE 33960100
INTEGER PROCEDURE GETINDEPENDENTRUNNERSTACK(STAKADRES); 33961000
REAL STAKADRES 33962000
; 33963000
BEGIN 33964000
INTEGER NEWSTACK 33965000
; 33967000
INTEGER GIR ; % ***FOR MONITOR ONLY 33970000
MONITOR JACKMONITOR(GIR); 33971000
STAKADRES~GETSPACE ( INDEPENDENTRUNNERCORE 33973000
, 0 33974000
, 0&SPACETYPE(1,1,1,0) 33975000
, 0 33976000
) 33977000
; 33978000
GIR~STAKADRES; %*** FOR MONITOR ONLY 33979000
M[STAKADRES-LINKSIZE].INUSEID~NEWSTACK~ 33980000
GETINDEPENDENTRUNNERSTACK ~ 33981000
VECTORINSERT ( GETIRS 33982000
, DUMMYAREA & DATADESCRIPTOR 33983000
(*,1,0,0,0,0,0,0 33984000
,INDEPENDENTRUNNERCORE 33985000
,STAKADRES 33986000
) 33987000
) ; 33988000
M[STAKADRES-LINKSIZE+1].ADDRMOM ~ STACKVECTOR.ADDRESSF 33989000
+ NEWSTACK; 33990000
INITIALIZETOZERO(STAKADRES,INDEPENDENTRUNNERCORE); 33991000
LOADFIXEDIRSTACK(NEWSTACK); 33992000
UNLOCK(READYQ); 33993000
UNLOCK(VECTORLOK[1]); 33993100
END GETINDEPENDENTRUNNERSTACK; 33994000
33995000
SAVE PROCEDURE INDEPENDENTRUNNER(INDEX,PAR); 33996000
VALUE INDEX,PAR; 33997000
REAL INDEX; 33998000
WORD PAR; 33999000
BEGIN 34000000
INTEGER STACKNO 34001000
; 34002000
WORD ARRAY IRWORDSTACK [*]; 34002020
ARRAY IRSTACK=IRWORDSTACK[*] ; 34002040
BOOLEAN NEWSTACK 34002100
; 34002200
DEFINE MYSNR = SNR # 34002300
; 34002400
INTEGER IR; % ***FOR MONITOR ONLY 34003000
MONITOR JACKMONITOR(IR); 34004000
IR~INDEX; %*** FOR MONITOR ONLY 34005000
IR~PAR; %*** FOR MONITOR ONLY 34006000
BUZZCONTROL(INDEPENDENTRUNNERLOK); 34007000
IF INDEX=TERMINATEINDICATOR AND STACK[SNR,PROCESSNATUREPLACE] 34007200
.PROCESSHISTORYF =TERMINATEIR 34007400
THEN BEGIN %%%MCS000050034007600
UNLOCK(INDEPENDENTRUNNERLOK); 34007620
STACKINUSE[INDEX]~0 ; 34007700
IR~STACKINUSE[TERMINATEINDICATOR]; %*** FOR MONITOR ONLY 34007710
GO FINI; 34007800
END; %%%MCS000050034007900
BUZZCONTROL(IRPARAMETERLOK[INDEX]); 34007910
IF(NEWSTACK~(INDEX<ONEONLYINDEX OR((STACKNO~STACKINUSE[INDEX]) 34008000
=0))) 34009000
34010000
THEN 34011000
BEGIN %%%MCS000100034012000
COMMENT WE HAVE TO GET A NEW STACK; 34013000
UNLOCK(IRPARAMETERLOK[INDEX]); 34013100
IF INDEX=TERMINATEINDICATOR 34014000
THEN BEGIN %%%MCS000080034015000
STACKNO ~ TERMINATESTACK; 34015200
GO TO FIXEDSTACKS; 34015400
END %%%MCS000080034015600
ELSE 34016000
IF STACKNO~FIRSTONE(IRSTACKS)=0 34017000
THEN 34018000
34019000
COMMENT WE HAVE TO BUILD A NEW STACK; 34020000
BEGIN %%%MCS000200034021000
STACKNO~GETINDEPENDENTRUNNERSTACK(STACKNO);34022000
34023000
34024000
34025000
END %%%MCS000200034026000
ELSE 34027000
BEGIN %%%MCS000300034028000
IRSTACKS~RESET(IRSTACKS,STACKNO~STACKNO-1); 34029000
FIXEDSTACKS: REPLACE POINTER(STACK 34029200
[STACKNO,RETURNCONTROLWORDPLACE+1] 34029400
) BY 0 FOR INDEPENDENTRUNNERCORE 34029600
- RETURNCONTROLWORDPLACE -1 34029800
OVERWRITE; 34030000
END ; %%%MCS000300034030200
IRSTACK ~ STACKVECTOR[STACKNO]; 34031000
IRWORDSTACK[ FIRSTPLACE]~IRTOSCW; 34031200
IRWORDSTACK [IRPARAMETERPLACE]~PAR; 34031500
IRWORDSTACK [IRPCWPLACE]~0&NORMALIRW(,,IRPCWSTARTPLACE+INDEX); 34032000
PUTINJOBIDANDTIME(IRWORDSTACK ,STACKNO); 34032500
IRWORDSTACK [SECNDMSCWPLACE]~IRMSCW2&MARKSTACKWD(*,*,*,STACKNO,34033000
*,*,*,*); 34033500
IRWORDSTACK [RETURNCONTROLWORDPLACE]~ RUNRETURNCONTROLWORD; 34034000
IRSTACK [PRIORITYPLACE]~ IRPRIORITIES[INDEX]; 34034500
IRSTACK [PROCESSNATUREPLACE]~*&NATUREOFPROCESS(IF INDEX = 34035000
TERMINATEINDICATOR THEN TERMINATEIR ELSE INDEPENDENT, 34035500
INDEX);34035800
IRSTACK [STACKSIZEPLACE]~INDEPENDENTRUNNERCORE; 34036000
COMMENT *** WE SHOULD USE DIFFERENT STACK SIZES FOR DIFFERENT IR S; 34036200
END ELSE UNLOCK(IRPARAMETERLOK[INDEX]); %%%MCS000100034036500
IF INDEX } ONEONLYINDEX THEN 34037000
BEGIN %%%MCS000400034038000
BUZZCONTROL(IRPARAMETERLOK[INDEX]); 34039000
STACK[STACKNO,IRPARAMETERPLACE]~*+1; 34040000
UNLOCK(IRPARAMETERLOK[INDEX ]); 34041000
34042000
END ; %%%MCS000400034043000
STACKINUSE[INDEX ]~STACKNO; 34043100
IF INDEX = TERMINATEINDICATOR THEN 34043200
BEGIN %%%MCS000500034043300
BUZZCONTROL(IRPARAMETERLOK[TERMINATEINDICATOR]); 34043400
INSERTINQ(TERMINATEQ,DUMMYREF,MYSNR ); 34043500
UNLOCK(IRPARAMETERLOK[TERMINATEINDICATOR]); 34043600
END ; %%%MCS000500034043700
UNLOCK(INDEPENDENTRUNNERLOK); 34044000
BUZZCONTROL(READYQ); 34045200
IF NEWSTACK THEN 34046000
INSERTINQUEUE(OTHERREDY,STACKNO); 34047000
FINI: 34047200
UNLOCK(READYQ); 34048000
EXIT; 34048100
END INDEPENDENTRUNNER; 34049000
SAVE 34050000
PROCEDURE RUN (PARAMETER,PROCEEDURE); 34051000
VALUE PARAMETER 34052000
; 34053000
WORD PARAMETER 34054000
; 34055000
PROCEDURE PROCEEDURE 34056000
; 34057000
COMMENT INDEPENDENT RUNNER STACKS, INITIATE STACKS AND JOB (D2) STACKS 34058000
ALL EXIT TO RUN AFTER A MVST TAKES THEM OUT OF THE READYQ FOR 34058020
THE FIRST TIME 34058040
RUN DETERMINES (FROM "NATURE OF PROCESS" IN THE PROCESS 34058060
STACK) WHETHER INITIATE, AN INDEPENDENT RUNNER OR A NORMAL 34058080
STATE PROGRAM (WHICH MAY BE A TYPED OR UNTYPED PROCEDURE 34058100
REQUIRING OR NOT REQUIRING PARAMETERS) IS TO BE ENTERED 34058120
UPON RETURN TO RUN (AT EXIT OR RETURN FROM THE CALLED 34058140
PROCEDURE), RUN TAKES APPROPRIATE ACTION AS REQUIRED BY 34058160
COMPILERS, DIFFERENT INDEPENDENT RUNNERS ETC. AND THEN CALLS 34058180
TERMINATE 34058200
; 34059000
BEGIN 34059200
REAL PROCESSNATUR 34059300
, RESULT 34059400
, TEMPORARY = RESULT 34059500
, MYSNR 34059600
; 34060000
DEFINE COMPILER = PROCESSNATUR 34060200
.PROCESSHISTORYF!INDEPENDENT AND 34060220
(TEMPORARY~PROCESSNATUR.PROCESSCLASSF)34060240
}FIRSTCOMPILEROPTION AND 34060260
TEMPORARY{LASTCOMPILEROPTION# 34060400
, IFINDEPENDENTRUNNER 34060600
= IF (PROCESSNATUR~MYSTACK[PROCESSNATUREPLACE]) 34060800
.PROCESSHISTORYF=INDEPENDENT 34060802
OR PROCESSNATUR.PROCESSHISTORYF=TERMINATEIR34060805
OR PROCESSNATUR.INITIATESTACKF=1# 34060810
, SYNTAXTOG = PROCESSNATUR.PROCESSCLASSF= 34060820
COMPILENSYNTAXJOB# 34060830
; 34061000
ARRAY MYSTACK[*] 34061200
; 34062000
REAL PROCEDURE REALPROCEEDURE=PROCEEDURE;NULL; 34062010
INTEGER GALLOP ; % *** FOR MONITOR ONLY 34064740
MONITOR JACKMONITOR(GALLOP); 34064760
GALLOP~TRACE(0); 34064800
MYSTACK~STACKVECTOR[MYSNR~SNR]; 34065000
LOSR~MYSTACK[STACKSIZEPLACE]-STACKOFLOWSIZE; 34065200
IFINDEPENDENTRUNNER 34066000
THEN 34066020
BEGIN %%%MCS000100034066040
PROCEEDURE(PARAMETER); 34066200
END %%%MCS000100034066800
ELSE 34066900
BEGIN %%%MCS000150034067000
BOJMESSER(MYSNR); 34067200
IF COMPILER 34067400
THEN 34067600
BEGIN %%%MCS000200034067800
RESULT~REALPROCEEDURE(SYNTAXTOG);34068000
END %%%MCS000200034070600
ELSE 34070800
BEGIN %%%MCS000300034071000
COMMENT WE HAVE A PROGRAM WITH NO PARAMETERS; 34071200
PROCEEDURE; 34071400
END; %%%MCS000300034072800
EOJMESSER(MYSNR); 34073000
END; %%%MCS000150034074000
COMMENT *** 5 MARCH 1969, THE ABOVE CODE WILL HAVE TO BE EXPANDED TO 34074010
CATER FOR MORE EXTENSIVE TREATMENT OF COMPILERS AND PROGRAMS AS34074020
(TYPED OR UNTYPED) PROCEDURES. ALSO THE FOLLOWING TERMINATE 34074040
CODE MAY REQUIRE ALTERING 34074060
; 34074080
FORK(TERMINATE,0); 34075000
IF SIMULATING THEN 34075010
GALLOP~GALLOP; %*** FOR MONITOR ONLY 34075100
TRACE(GALLOP); 34075200
HOLD; 34076000
END RUN ; 34077000
SAVE PROCEDURE IRTEST(IND); INTEGER IND; 34077200
BEGIN 34078000
MONITOR JACKMONITOR(IND); 34079000
REAL MYSNR; 34080000
REAL OLDTIME; 34080100
MONITOR JACKMONITOR(MYSNR); 34081000
IND~IND; %*** FOR MONITOR ONLY 34082000
MYSNR~SNR; %*** FOR MONITOR ONLY 34083000
DO BEGIN 34083100
IF(OLDTIME~OLDTIME+1) MOD 10 = 0 THEN 34083200
FORK(STATUS,0); 34083300
WAIT(TIMERINTERRUPTEVENT); 34083400
END UNTIL FALSE; 34083500
HOLD; 34084000
END IRTEST; 34085000
SAVE 34085300
34085310
PROCEDURE LOADFIXEDIRSTACK(STACKNO); 34086000
VALUE STACKNO ; 34087000
INTEGER STACKNO 34088000
; 34089000
COMMENT PUTS THE FIRST (TOSCW),SECOND (SELF IDENTIFYING MSCW) WORDS 34090000
IN AN INDEPENDENT RUNNER STACK.PUTS THE RUN RETURN CONTROL 34091000
WORD AND THE PROCESS INFORMATION WHICH IS FIXED FOR ALL 34092000
INDEPENDENT RUNNERS I.E. CORE ESTIMATE,PROCESSOR TIME 34093000
ESTIMATE,I/O TIME ESTIMATE.PUTS IN SOME OTHER CONTROL WORDS 34094000
; 34095000
BEGIN 34096000
INTEGER LFI = STACKNO % *** FOR MONITOR ONLY 34097000
; 34098000
MONITOR JACKMONITOR(LFI) 34099000
; 34100000
ARRAY MYSTACK[*]; 34101000
WORD ARRAY MYWORDSTACK =MYSTACK[*] 34102000
; 34103000
LFI~LFI; % *** FOR MONITOR ONLY 34104000
MYSTACK~STACK[STACKNO,*]; 34105000
MYWORDSTACK[FIRSTPLACE]~IRTOSCW; 34106000
MYWORDSTACK[LINKPLACE]~0&MARKSTACKWD(,*,1,STACKNO,*,*,*,*); 34107000
34110100
MYWORDSTACK[FIRSTMSCWPLACE]~IRMSCW1; 34111000
MYWORDSTACK[FIRSTRCWPLACE]~IRRCW1; 34112000
EXIT; 34115100
END LOADFIXEDIRSTACK; 34116000
PROCEDURE CONTROLCARD (PARAMETER); 38000000
WORD PARAMETER; 38001000
BEGIN COMMENT CONTROL CARD PROCESSES THE EBCDIC RECORD AS 38002000
DESCRIBED BY THE AREA DESCRIPTOR OF THE IOCB AND38003000
READS ADDITIONAL RECORDS UNTIL A "LABEL", "DATA"38004000
OR "END" IS ENCOUNTERED. WHILE A CONTROL DECK 38005000
IS BEING PROCESSED, THE UNIT OF THE IOCB IS 38006000
ASSIGNED TO THE CONTROL CARD PROCEDURE. THE 38007000
FINAL OUTPUT OF CONTROLCARD IS ONE OR MORE SHEET38008000
ENTRIES OR AN ASSIGNMENT OF A LABEL TO A UNIT. 38009000
;38010000
REFERENCE IOCB =PARAMETER; 38011000
INTEGER UNITNO = PARAMETER; 38012000
VALUE ARRAY RESERVED ~ (0,0,0,0,0,0,0,0,0,0,0,0,0,0, 8"UNKNOWNID", 0 38013000
, 8"# " , 114800 % CLASS 148 38014000
, 8". " , 114600 % CLASS 146 38015000
, 8"~ " , 114100 % CLASS 141 38016000
, 8"- " , 114500 % CLASS 145 38017000
, 8"; " , 114300 % CLASS 143 38018000
, 8"/ " , 114700 % CLASS 147 38019000
, 8", " , 114200 % CLASS 142 38020000
,40"7F4040404040", 114400 % QUOTE MARK CLASS 144 38021000
,40"6F4040404040", 114100 % QUEST MARK CLASS 141 38022000
, 8"ALGOL " , 505202 % CLASS 52 CASE 2 38023000
, 8"ALPHA " , 513600 % CLASS 136 38024000
, 8"BACKUP" , 608900 % CLASS 89 38025000
, 8"CC " , 214000 % CLASS 140 38026000
, 8"CHANGE" , 600701 % CLASS 7 CASE 1 38027000
, 8"COBOL " , 506502 % CLASS 65 CASE 2 38028000
, 8"COMMON" , 603902 % CLASS 39 CASE 2 38029000
, 8"COMPILE" , 700301 % CLASS 3 CASE 1 38030000
, 8"CORE " , 404002 % CLASS 40 CASE 2 38031000
, 8"DATA " , 400801 % CLASS 8 CASE 1 38032000
, 8"DATAB " , 501401 % CLASS 14 CASE 1 38033000
, 8"DISK " , 407900 % CLASS 79 38034000
, 8"DISPLAY" , 708300 % CLASS 83 38035000
, 8"DUMP " , 400601 % CLASS 6 CASE 1 38036000
, 8"END " , 302401 % CLASS 24 CASE 1 38037000
, 8"ESPOL " , 505402 % CLASS 54 CASE 2 38038000
, 8"EXECUTE" , 700201 % CLASS 2 CASE 1 38039000
, 8"EXTERNAL" , 806600 % CLASS 66 38040000
, 8"FILE " , 403502 % CLASS 35 CASE 2 38041000
, 8"FORM " , 413700 % CLASS 137 38042000
, 8"FORTRAN" , 705302 % CLASS 53 CASE 2 38043000
, 8"FREE " , 401201 % CLASS 12 CASE 1 38044000
, 8"GO ", 206900 % CLASS 69 38045000
, 8"IO " , 203702 % CLASS 37 CASE 2 38046000
, 8"LIBRARY" , 706700 % CLASS 67 38047000
, 8"LOAD " , 400501 % CLASS 5 CASE 1 38048000
, 8"PAPER " , 508600 % CLASS 86 38049000
, 8"PRINT " , 508700 % CLASS 87 38050000
, 8"PRIORITY" , 803802 % CLASS 38 CASE 2 38051000
, 8"PROCESS" , 703602 % CLASS 36 CASE 2 38052000
, 8"PROTECT" , 711200 % CLASS 112 38053000
, 8"PUBLIC" , 601301 % CLASS 13 CASE 1 38054000
, 8"PUNCH " , 508500 % CLASS 85 38055000
, 8"RANDOM" , 612500 % CLASS 125 38056000
, 8"READER" , 608800 % CLASS 88 38057000
, 8"RELEASE" , 701101 % CLASS 11 CASE 1 38058000
, 8"REMOTE" , 608400 % CLASS 84 38059000
, 8"REMOVE" , 600401 % CLASS 4 CASE 1 38060000
, 8"RUN " , 300101 % CLASS 1 CASE 1 38061000
, 8"SAVE " , 411100 % CLASS 111 38062000
, 8"SERIAL" , 612300 % CLASS 123 38063000
, 8"SPECIAL" , 710000 % CLASS 100 38064000
, 8"STACK " , 504102 % CLASS 41 CASE 2 38065000
, 8"SYNTAX" , 606800 % CLASS 68 38066000
, 8"TAPE7 " , 508100 % CLASS 81 38067000
, 8"TAPE9 " , 508200 % CLASS 82 38068000
, 8"TAPE " , 408000 % CLASS 80 38069000
, 8"UNIT " , 413800 % CLASS 138 38070000
, 8"UNLABELED" , 913900 % CLASS 139 38071000
, 8"UPDATE" , 612400 % CLASS 124 38072000
, 8"USER " , 401001 % CLASS 10 CASE 1 38073000
, 8"USE " , 300901 % CLASS 9 CASE 1 38074000
); 38075000
DEFINE 38076000
RUNCLS = 1#, 38077000
EXECUTECLS = 2#, 38078000
COMPILECLS = 3#, 38079000
REMOVECLS = 4#, 38080000
LOADCLS = 5#, 38081000
DUMPCLS = 6#, 38082000
CHANGECLS = 7#, 38083000
DATACLS = 8#, 38084000
USECLS = 9#, 38085000
USERCLS = 10#, 38086000
RELEASECLS = 11#, 38087000
FREECLS = 12#, 38088000
PUBLICCLS = 13#, 38089000
DATABCLS =14#, 38090000
ENDCLS = 24#, 38091000
FILECLS = 35#, 38092000
PROCESSCLS = 36#, 38093000
IOCLS = 37#, 38094000
PRIORITYCLS = 38#, 38095000
COMMONCLS = 39#, 38096000
CORECLS = 40#, 38097000
STACKCLS = 41#, 38098000
ALGOLCLS = 52#, 38099000
FORTRANCLS = 53#, 38100000
ESPOLCLS = 54#, 38101000
COBOLCLS = 65#, 38102000
EXTERNALCLS = 66#, 38103000
LIBRARYCLS = 67#, 38104000
SYNTAXCLS = 68#, 38105000
GOCLS = 69#, 38106000
DISKCLS = 79#, 38107000
TAPECLS = 80#, 38108000
TAPE7CLS = 81#, 38109000
TAPE9CLS = 82#, 38110000
DISPLAYCLS = 83#, 38111000
REMOTECLS = 84#, 38112000
PUNCHCLS = 85#, 38113000
PAPERCLS = 86#, 38114000
PRINTCLS = 87#, 38115000
READERCLS = 88#, 38116000
BACKUPCLS = 89#, 38117000
SPECIALCLS = 100#, 38118000
SAVECLS = 111#, 38119000
PROTECTCLS = 112#, 38120000
SERIALCLS = 123#, 38121000
UPDATECLS = 124#, 38122000
RANDOMCLS = 125#, 38123000
ALPHACLS = 1346, 38124000
FORMCLS = 137#, 38125000
UNITCLS = 138#, 38126000
UNLABELEDCLS = 139#, 38127000
CCCLS = 140#, 38128000
QUESTIONCLS = 141#,% ~ 38129000
COMMACLS = 142#,% , 38130000
SEMICOLONCLS = 143#,% ; 38131000
QUOTECLS = 144#,% " 38132000
HYPHENCLS = 145#,% - 38133000
PERIODCLS = 146#,% . 38134000
SLASHCLS = 147#,% / 38135000
CROSSHATCHCLS = 148#,% # 38136000
UNKNOWNIDCLS = 0#; 38137000
INTEGER MYCOMMON; %%%%% 38138000
ARRAY SEGZERO [SIZE(SHEETQ)]; 38139000
COMMENT SEGMENT ZERO WILL BE READ INTO THIS ARRAY AND 38140000
THE SHEET WILL BE BUILT IN THE ARRAY AND A REF- 38141000
ERENCE TO THE ARRAY WILL BE ENTERED IN THE 38142000
SHEET.; 38143000
ARRAY SEGZEROSKELETON [SIZE(SHEETQ)]; 38144000
ARRAY SEGZEROTEMP [*] ; %%%%%% 38145000
COMMENT PRESERVE FOR LOOPING; 38146000
WORD SEGZEROWORD = SEGZEROSKELETON; 38147000
WORD ARRAY HEADERW [*]; COMMENT THE DISK HEADER RETURNED BY 38148000
DIRECTORYSEARCH BASED ON NAME POINTER;38149000
ARRAY SOURCEAREA [15], 38150000
COMMENT THE AREA DESCRIPTOR OF THE IOCB.; 38151000
ACCUMULATOR [13]; 38152000
COMMENT THE FIRST 14 WORDS OF THE RESERVED ARRAY. USED 38153000
AS A TEMPORARY HOLDING AREA FOR CONTROL CARD 38154000
SYNTACTICAL UNITS AND THE RESERVED SEARCH 38155000
ARGUMENT (AND STOPPER).; 38156000
REAL RESULT COMMENT AN I/O RESULT DESCRIPTOR; 38157000
, FILEID COMMENT WAITIO CALLS IT "USER"; 38158000
,ACTION COMMENT WAITIO CALLS IT " IOERRORMASK"; 38159000
,CONTROLWORD 38160000
; 38161000
INTEGER COUNT, COMMENT A UTILITY CHARACTER COUNTER.; 38162000
LIMIT, COMMENT THE CHARACTERS OF A RECORD THAT ARE38163000
TO BE SCANNED.; 38164000
WORDDIVCHARSIZE, COMMENT THE NUMBER OF CHARACTERS IN 38165000
A WORD.; 38166000
T, COMMENT TEMPORARY; 38167000
LABELTYPE, 38168000
ORIGINALLIMIT, COMMENT THE NUMBER OF CHARACTERS IN A 38169000
RECORD.; 38170000
RESERVECASE, 38171000
CLASS, 38172000
WORDCOUNT; COMMENT THE NUMBER OF WORDS REQUIRED TO 38173000
CONTAIN AN IDENTIFIER.; 38174000
WORD WORDMON; %%%%%%%%%%%%% 38175000
REFERENCE SOURCEREFERENCE = SOURCEAREA, 38176000
SUCCESSORSHEET, PREDECESSORSHEET; 38177000
COMMENT REFERENCES TO THE SHEET ENTRIES FOR THE 38178000
PROCESSES THAT ARE DIRECTLY RELATED TO THE 38179000
PROCESS REFERENCED BY SEGZERO.; 38180000
ARRAY SUCCESSOR = SUCCESSORSHEET [*], 38181000
PREDECESSOR = PREDECESSORSHEET [*]; 38182000
POINTER ACCUMPOINTER, COMMENT A POINTER TO THE ACCUMULATOR.; 38183000
SOURCE, COMMENT THE SOURCE AREA - MAY BE UPDATED.; 38184000
ORIGINALSOURCE, COMMENT SOURCE-MAY NOT BE UPDATED; 38185000
DESTINATION, COMMENT - DITTO FOR ACCUMULATOR.; 38186000
TSOURCE, COMMENT - USUALLY POINTS AT BEGINNING OF 38187000
LAST ENTITY SCANNED.; 38188000
NAMEPOINTER; COMMENT POINTS TO COMPLETE NAME 38189000
CHARACTER STRING.; 38190000
BOOLEAN SPECIAL, COMMENT TRUE WHILE A SPECIAL CHARACTER IS38191000
TO BE SCANNED.; 38192000
ALFA, COMMENT TRUE IF IDENTIFIER TYPE STUFF IS 38193000
BEING SCANNED.; 38194000
ENDOFRECORD, COMMENT TRUE IF LIMIT HAS BEEN REACHED 38195000
OR "." HAS BEEN SEEN.; 38196000
CONVERT, COMMENT WHEN TRUE THE SCANNER ATTEMPTS TO 38197000
LEAVE A CONVERTED INTEGER IN ACCUMULATOR[0].; 38198000
COMPILER, COMMENT TRUE WHEN "COMPILE" HAS BEE SEEN;38199000
EXECUTESHEET, COMMENT TRUE WHEN EXECUTE SHEET ENTRY 38200000
(IMPLICIT OR EXPLICIT) IS TO BE 38201000
ENTERED IN THE SHEET QUEUE.; 38202000
SHEETENTERED; COMMENT TRUE WHEN SEGZERO HAS BEEN 38203000
ENTERED IN THE SHEETQ.; 38204000
LABEL CCERROR, 38205000
NATURALDEATH, 38206000
NEWLIFE, 38207000
EXECUTE, 38208000
DATA, 38209000
SUICIDE; 38210000
DEFINE CONTROLCARDIO = 38211000
BEGIN 38212000
SOURCEAREA [0] ~ CONTROLWORD; 38213000
RESULT ~ WAITIO (SOURCEAREA, FILEID, ACTION); 38214000
LIMIT ~ORIGINALLIMIT; 38215000
SOURCE ~ ORIGINALSOURCE; 38216000
CONTROLCARDCHECK; 38217000
END #, 38218000
CONTROLCARDCHECK = 38219000
IF BOOLEAN (RESULT.RDNOTREADY) THEN GO SUICIDE; %STATUS VECTOR KLUDGE 38220000
COMMENT - WAIT ON MPX 38220100
IF NOT BOOLEAN (RESULT.RDCNTRLCARD) 38221000
THEN CONTROLCARDERROR (2); 38222000
#, 38223000
CONVERTEDINTEGER = 999#, 38224000
CHARSIZE = 8#, 38225000
QUOTE = 8 """#, 38226000
BLANK = 8 " "#, 38227000
A =8"A"#, 38228000
ZERO = 8"0"#, 38229000
DEBLANK (P) = 38230000
BEGIN 38231000
SCAN P:P FOR T:LIMIT WHILE = BLANK; 38232000
ENDOFRECORD ~ LIMIT ~ T =0; 38233000
END #, 38234000
BLANKIT (PTR, CHARS) = 38235000
REPLACE PTR BY BLANK FOR CHARS#, 38236000
CONTROLCARDERROR (WHICH) = 38237000
BEGIN 38238000
GO TO CCERROR; 38239000
END #, 38240000
LEQACTION = 0#, 38241000
CARDACTION =1#, 38242000
CODEACTION =2#, 38243000
NATUREOFPROCESS(A, V) = 38244000
A[PROCESSNATUREPLACE].PROCESSCLASSF ~ V #, 38245000
CURRENTTIME = TIMEOFDAY#, %%%%%%%%% 38246000
FIXEDFPBSIZE = 4#, 38247000
COMPARE (SOURCE, DESTINATION, COUNT) = 38248000
IF SOURCE = DESTINATION FOR COUNT 38249000
THEN TRUE ELSE FALSE#, 38250000
MOVE (SOURCE , DESTINATION , CONDITION) = 38251000
REPLACE DESTINATION BY SOURCE CONDITION #, 38252000
MOVEUPDATE (SOURCE , DESTINATION , COND) = 38253000
REPLACE DESTINATION:DESTINATION BY 38254000
SOURCE:SOURCE COND #, 38255000
RESERVEINFOWRD = 38256000
RESERVED [RESERVEI+((COUNT+WORDDIVCHARSIZE) DIV 38257000
WORDDIVCHARSIZE - 38258000
(IF COUNT MOD WORDDIVCHARSIZE=0 THEN 1 ELSE 0))]#38259000
, 38260000
RANGE (LOW, HIGH) = 38261000
(CLASS } LOW AND CLASS { HIGH)#, 38262000
COUNTDIV = 100000#, 38263000
CLASSDIV = 100#, 38264000
RESERVECOUNT = RESERVEINFOWRD DIV COUNTDIV#; 38265000
FIELD VECTOR = 7:3, 38266000
WHICHUNIT = (UNITNO MOD 32+1):1; 38267000
MONITOR DONMONITOR ( 38268000
SHEETENTERED, 38269000
RESULT, 38270000
CLASS); 38271000
SAVE INTEGER PROCEDURE SCANNER; 38272000
BEGIN 38273000
INTEGER RESERVEI 38274000
; 38275000
REAL DELIMIT 38276000
, MASK ~3"7777777777777777" 38277000
, RESERVEINFO 38278000
; 38279000
LABEL BACK 38280000
, AWAY 38281000
; 38282000
BOOLEAN FIRSTQUOTE 38283000
, FOUND 38284000
; 38285000
FIELD FIRSTCHAR = 47:CHARSIZE; 38286000
BACK: DESTINATION ~ ACCUMPOINTER; 38287000
MOVE (BLANK, DESTINATION, FOR WORDDIVCHARSIZE); 38288000
TSOURCE ~ SOURCE; 38289000
IF SPECIAL ~ SOURCE < A FOR 1 38290000
THEN MOVEUPDATE (SOURCE, DESTINATION, FOR 1) 38291000
ELSE IF ALFA ~ SOURCE < ZERO FOR 1 OR FIRSTQUOTE 38292000
THEN MOVEUPDATE (SOURCE, DESTINATION, 38293000
FOR COUNT:LIMIT UNTIL { QUOTE) 38294000
ELSE IF CONVERT 38295000
THEN BEGIN 38296000
SCAN SOURCE FOR COUNT:LIMIT UNTIL < QUOTE; 38297000
COUNT ~ LIMIT - COUNT; 38298000
LIMIT ~ LIMIT - COUNT; 38299000
ACCUMULATOR [0] ~ INTEGER (SOURCE, COUNT); 38300000
SOURCE ~ SOURCE + COUNT; 38301000
DEBLANK (SOURCE); 38302000
RETURN (CONVERTEDINTEGER); 38303000
END 38304000
ELSE MOVEUPDATE (SOURCE, DESTINATION, 38305000
FOR COUNT:LIMIT UNTIL { QUOTE); 38306000
COUNT ~ IF SPECIAL THEN 1 ELSE LIMIT - COUNT; 38307000
LIMIT ~ LIMIT - COUNT; 38308000
IF FIRSTQUOTE 38309000
THEN BEGIN 38310000
IF SOURCE ! QUOTE FOR 1 38311000
THEN BEGIN COMMENT FINISH THE STRING; 38312000
T ~ LIMIT - COUNT; 38313000
LIMIT ~ * - T; 38314000
MOVEUPDATE (SOURCE, DESTINATION, 38315000
FOR COUNT:LIMIT UNTIL = QUOTE); 38316000
COUNT ~ LIMIT - COUNT + T; 38317000
LIMIT ~ * - COUNT - 1; 38318000
END ELSE LIMIT ~ COUNT - 1; 38319000
SOURCE ~ SOURCE +1; 38320000
RESERVEI ~ 0; 38321000
END; 38322000
IF COUNT > 17 THEN COUNT ~ 17; % USASI 38323000
WORDCOUNT ~ (COUNT + WORDDIVCHARSIZE - 1) DIV WORDDIVCHARSIZE; 38324000
IF FIRSTQUOTE THEN GO AWAY; 38325000
RESERVEI ~ MASKSEARCH (RESERVED[0], MASK, RESERVED); 38326000
IF COUNT > WORDDIVCHARSIZE 38327000
THEN WHILE RESERVEI > 0 AND NOT FOUND 38328000
DO BEGIN 38329000
FOUND ~ COMPARE (ACCUMPOINTER+WORDDIVCHARSIZE, 38330000
POINTER(RESERVED[RESERVEI+1], CHARSIZE), 38331000
COUNT - WORDDIVCHARSIZE); 38332000
FOUND ~ FOUND AND COUNT = RESERVECOUNT; 38333000
IF NOT FOUND 38334000
THEN RESERVEI ~ MASKSEARCH (ACCUMULATOR[0], 38335000
MASK, 38336000
RESERVED & DATADESCRIPTOR 38337000
(,,,1,,,,,RESERVEI-1)); 38338000
END; 38339000
AWAY: DEBLANK (SOURCE); 38340000
RESERVEINFO ~ IF RESERVEI = 0 THEN 0 38341000
ELSE RESERVEINFOWRD MOD COUNTDIV; 38342000
CLASS ~ RESERVEINFO DIV CLASSDIV; 38343000
RESERVECASE ~ RESERVEINFO MOD CLASSDIV; 38344000
IF CLASS } CCCLS THEN 38345000
BEGIN 38346000
CASE CLASS - CCCLS OF 38347000
BEGIN 38348000
CLASS ~ QUESTIONCLS; % CC 38349000
; % QUESTION MARK 38350000
GO BACK; % , 38351000
CLASS ~ QUESTIONCLS; % ; 38352000
BEGIN % " 38353000
FIRSTQUOTE ~ TRUE; 38354000
GO BACK; 38355000
END; 38356000
BEGIN % - 38357000
CONTROLCARDIO; 38358000
DEBLANK (SOURCE); 38359000
GO BACK; 38360000
END; 38361000
ENDOFRECORD ~ TRUE; % . 38362000
; % / 38363000
; % # 38364000
END SPECIAL CHARACTER CASES; 38365000
END; 38366000
SCANNER ~ CLASS; 38367000
END SCANNER; 38368000
SAVE POINTER PROCEDURE NAMES (CALLER); 38369000
VALUE CALLER; 38370000
INTEGER CALLER; 38371000
BEGIN 38372000
REFERENCE THISNAME; 38373000
POINTER ANAME, ALLNAMEPTR, P; 38374000
ARRAY ONENAME, ALLNAMES, DUMMY [*]; 38375000
FIELD CHARS = 19:20; 38376000
LAYOUT WORDS (WRDCNT = 39:20); 38377000
LAYOUT IDSANDNAMES (47:8, 39:8); 38378000
FIELD COUNTF = 47:8; 38379000
INTEGER TOTALCHARS, COMMENT THE TOTAL CHARACTERS IN A NAM;38380000
TOTALNAMES, COMMENT THE NUMBER OF NAMES IN AN 38381000
IDENTIFIER (THE THING THAT UNIQUELY 38382000
IDENTIFIES A FILE); 38383000
TOTALIDENTIFIERS; COMMENT THE TOTAL NUMBER OF 38384000
IDENTIFIERS IN A SERIES (IDENTIFIERS 38385000
SEPARATED BY COMMAS); 38386000
LABEL SERIES; 38387000
TOTALCHARS ~ WORDDIVCHARSIZE + 3; % PROVIDE FOR INFO WORD, 38388000
% TOTAL IDENTIFIERS, NAMES AND 38389000
% STOPPER 38390000
IF LOCK (NAMEQUEUE) THEN BUZZ (NAMEQUEUE); 38391000
SERIES: TOTALIDENTIFIERS ~ * + 1; 38392000
DO BEGIN 38393000
SCANNER; 38394000
ONENAME ~ ONENAME & DATADESCRIPTOR 38395000
(,1,0,,,,,, WORDCOUNT+1, GETAREA (WORDCOUNT)); 38396000
ONENAME[0].COUNTF ~ COUNT; 38397000
TOTALNAMES ~ * + 1; 38398000
TOTALCHARS ~ * + COUNT + (IF CALLER =DATACLS 38399000
THEN 18 - COUNT ELSE 1); 38400000
ANAME ~ POINTER (ONENAME, CHARSIZE)+1; 38401000
MOVE (ACCUMPOINTER, ANAME, FOR COUNT); 38402000
THISNAME ~ ALLOCATE (NAMEQUEUE); 38403000
POINTERTONAME@(THISNAME) ~ANAME - 1; 38404000
CHARCOUNT @ (THISNAME) ~ COUNT +1 & WORDS(WORDCOUNT);38405000
NAMEQUEUE ~ THISNAME; 38406000
IF NOT ENDOFRECORD THEN SCANNER; 38407000
END 38408000
UNTIL CLASS !SLASHCLS; 38409000
IF CLASS = COMMACLS THEN GO SERIES; 38410000
ALLNAMES ~ ALLNAMES & DATADESCRIPTOR (,,0,,,,,, 38411000
(WORDDIVCHARSIZE - TOTALCHARS MOD WORDDIVCHARSIZE + 38412000
TOTALCHARS) DIV WORDDIVCHARSIZE, 1); 38413000
ANAME ~ POINTER (ALLNAMES, CHARSIZE); 38414000
ANAME ~ ANAME + WORDDIVCHARSIZE + 2; 38415000
WORDMON ~ WORD (ANAME); %%%%%% 38416000
WHILE THISNAME ~ FIRSTNAME ! NULL 38417000
DO BEGIN 38418000
T ~ CHARCOUNT @ (THISNAME).CHARS; 38419000
P ~ POINTERTONAME @(THISNAME); 38420000
MOVEUPDATE (P, ANAME, FOR T); 38421000
IF CALLER = DATACLS THEN ANAME ~ ANAME + (18 - T); 38422000
FORGETAREA (SIZE(NAMEQUEUE), 38423000
WORD (THISNAME).ADDRESSF); 38424000
FORGETAREA (CHARCOUNT @ (THISNAME).WRDCNT, 38425000
WORD (POINTERTONAME @ (THISNAME)).ADDRESSF); 38426000
DELINK (NAMEQUEUE, THISNAME); 38427000
END; 38428000
UNLOCK (NAMEQUEUE); 38429000
ALLNAMES [1] ~ * & IDSANDNAMES (TOTALIDENTIFIERS, TOTALNAMES); 38430000
ALLNAMES[0] ~ 0 & FIRSTPOINTERWORDL (*, ALLNAMES.LENGTHF, *, *,38431000
TOTALCHARS -6); 38432000
IF CALLER = DATACLS THEN RETURN (ALLNAMES); 38433000
RETURN( ANAME & STRINGDESCRIPTOR (,*,0,,*,*,*,TOTALCHARS,*)); 38434000
END OF NAMES; 38435000
SAVE INTEGER PROCEDURE GETANUMBER (AGAIN); 38436000
VALUE AGAIN; 38437000
BOOLEAN AGAIN; 38438000
BEGIN 38439000
SCANNER; COMMENT GET RID OF DELIMITER; 38440000
CONVERT ~ TRUE; 38441000
IF SCANNER !CONVERTEDINTEGER 38442000
THEN CONTROLCARDERROR (3) 38443000
ELSE GETANUMBER ~ ACCUMULATOR [0]; 38444000
IF AGAIN AND NOT ENDOFRECORD THEN SCANNER; 38445000
END GETANUMBER; 38446000
SAVE PROCEDURE QUEUEPARAMETERS(SEGZERO2); 38447000
ARRAY SEGZERO2[*]; 38448000
BEGIN COMMENT READ THE PARAMETER BLOCK THAT THE COMPILERS HAVE38449000
WRITTEN TO THE CODE FILE AND MAKE INDIVIDUAL 38450000
QUEUE ENTRIES FOR EACH OF THEM. IF THE BLOCK 38451000
DOES NOT EXIST, SET UP AN EMPTY QUEUE.; 38452000
ARRAY SEGZERO = SEGZERO2 [*,*]; 38453000
ARRAY PB, MYPB, HEADER [*]; 38454000
INTEGER L, A, I, T, PI, DA; 38455000
REAL X; 38456000
REFERENCE R, MYPBR = MYPB; 38457000
IF L ~ (PB ~ SEGZERO [FPBDESCPLACE,*]).LENGTHF > 1 38458000
THEN BEGIN COMMENT A COMPILE TIME PARAMETER BLOCK WAS 38459000
CREATED.; 38460000
MYPB ~ MYPB & ARRAYDESCL(0, L, 1); 38461000
HEADER ~ SEGZERO [CODEFILEDESCPLACE, *]; 38462000
BUZZ (PARAMETERQUEUE); 38463000
LASTPARAM ~ FIRSTPARAM ~ NULL; 38464000
PI ~ 1; 38465000
SEGZERO [FPBDESCPLACE, *].ADDRESSF ~ A ~ 38466000
MYPB.ADDRESSF; 38467000
DO BEGIN 38468000
A ~ A + (X ~ MYPB[PI]).INFOINDEXF; 38469000
R ~ ALLOCATE (PARAMETERQUEUE); 38470000
POINTERTOID @(R) ~ POINTER (MYPB[PI],8); 38471000
PARAMETERINFO@(R) ~ MYPBR& ARRAYDESCL 38472000
(3, X.INFOLENGTHF, A); 38473000
INITIALINSERT (PARAMETERQUEUE, R); 38474000
END 38475000
UNTIL PI ~ PI + X.TOTALINFOWORDSF ! PI; 38476000
COMMENT DITTO IS ZERO WHEN THE LAST 38477000
PARAMETER HAS BEEN PROCESSED.; 38478000
UPDATEWORDCOUNT (L, FIRSTPARAM ); 38479000
END 38480000
ELSE BEGIN 38481000
BUZZ (PARAMETERQUEUE); 38482000
FIRSTPARAM ~ LASTPARAM ~ NULL; 38483000
END; 38484000
READLOCK (FIRSTPARAM , SEGZERO[FIRSTPARAMETERPLACE, *]); 38485000
READLOCK (LASTPARAM , SEGZERO[LASTPARAMETERPLACE, *]); 38486000
UNLOCK (PARAMETERQUEUE); 38487000
EXIT; 38488000
END OF QUEUEPARAMETERS; 38489000
SAVE PROCEDURE EMPTYPARAMETERQ(SEGZERO2); 38490000
ARRAY SEGZERO2[*]; 38491000
BEGIN COMMENT EMPTY THE PARAMETER QUEUE. ALL PARAMETERS FOR 38492000
THIS RUN ARE NOW KNOWN AND THE INFORMATION FOR THEM 38493000
EXISTS AS INDIvIDUAL ENTRIES IN THE PARAMETER QUEUE. 38494000
THESE ENTRIES EXIST EITHER IN THE AREA DESCRIBED 38495000
BY THE ORIGINAL FPB DESCRIPTOR (AS SUPPLIED BY THE 38496000
COMPILER (AS SUPPLIED BY CONTROL CARD)) OR IN INDIV- 38497000
IDUAL AREAS THAT WERE OBTAINED AS INDIVIDUAL CONTROL 38498000
CARDS WERE PROCESSED. IT IS NOW TIME TO CONSOLIDATE 38499000
ALL ENTRIES INTO A SINGLE ENTRY AND PUT A NEW 38500000
DESCRIPTOR IN SEGMENT ZERO. WHEN THERE ARE ABSOLUTE-38501000
LY NO PARAMETERS, THE FPB DESCRIPTOR IS AN ABSENT 38502000
DESCRIPTOR WITH A LENGTH OF 1 WHICH WILL (AUTOMATIC- 38503000
ALLY) RETURN A ZERO WHEN THE ZEROTH WORD (WORD COUNT)38504000
IS ACCESSED.; 38505000
ARRAY SEGZERO =SEGZERO2 [*,*]; 38506000
ARRAY PB [1], PINFO [*]; 38507000
ARRAY PBW = PB [*]; 38508000
REFERENCE PINFOR = PINFO; 38509000
INTEGER PI, FWI, FWL; 38510000
POINTER PINFOP = PINFO; 38511000
REFERENCE RT, RTT; 38512000
REAL FW; 38513000
IF (RT ~ REFERENCE (SEGZERO [FIRSTPARAMETERPLACE, *]))! NULL 38514000
THEN BEGIN 38515000
FIRSTPARAM ~ RT; 38516000
LASTPARAM ~ REFERENCE(SEGZERO[LASTPARAMETERPLACE,*]);38517000
PB ~ PB & ARRAYDESCL (0, 38518000
(PI ~ REAL (POINTERTOID@(RT), 6).TOTALINFOWORDSF38519000
+1), 1); 38520000
PB[0] ~ PI; 38521000
PI ~ 1; 38522000
DO BEGIN 38523000
FW ~ REAL (POINTERTOID@(RT), 6); 38524000
PI ~ PI + FWI + FWL; 38525000
MOVE (PINFOP ~ POINTERTOID@(RT), 38526000
POINTER (PB[PI], CHARSIZE), 38527000
FOR FWI ~ FW.INFOINDEXF WORDS); 38528000
FORGETSPACE (PINFO.ADDRESSF); 38529000
PINFOR ~ PARAMETERINFO@(RT); 38530000
MOVE (POINTER(PINFO, CHARSIZE) 38531000
,POINTER(PB[PI+FWI], CHARSIZE), 38532000
FOR FWL ~ FW.INFOLENGTHF WORDS); 38533000
PB[PI].TOTALINFOWORDSF ~ FWI + FWL; 38534000
FORGETSPACE (PINFO.ADDRESSF); 38535000
RTT ~ NEXTPARAM@(RT); 38536000
DELINK (PARAMETERQUEUE, RT); 38537000
RT ~ RTT; 38538000
END 38539000
UNTIL RTT =NULL; 38540000
PB[PI].TOTALINFOWORDSF ~ 0; 38541000
FIRSTPARAM ~ LASTPARAM ~NULL; 38542000
IF SEGZERO[FPBDESCPLACE, *].LENGTHF > 1 38543000
THEN FORGETSPACE (SEGZERO [FPBDESCPLACE,*].ADDRESSF);38544000
COMMENT THIS IS THE PLACE TO WRITE PB TO MCP OLAY DISK, 38545000
FIX UP THE DESCRIPTOR ACCORDINGLY AND FORGET THE 38546000
SPACE USED BY PB. ALSO CHECK ON EXECUTABLE STATUS 38547000
OF SEGZERO BEING PROCESSED.; 38548000
END; 38549000
READLOCK (PBW,SEGZERO [FPBDESCPLACE, *]); 38550000
EXIT; 38551000
END EMPTYPARAMETERQ; 38552000
SAVE PROCEDURE FILECARD (SEGZERO, ACTION); 38553000
VALUE ACTION; 38554000
INTEGER ACTION; 38555000
ARRAY SEGZERO [*]; 38556000
BEGIN COMMENT PROCESS AND QUEUE FILE PARAMETER CARDS.; 38557000
REFERENCE THISFILE, TEMPR; 38558000
POINTER EXTERNALNAME, PT; 38559000
WORD EXTERNALNAMEW = EXTERNALNAME; 38560000
INTEGER T; 38561000
SAVE ARRAY FPB [1], 38562000
SCRATCH [1]; 38563000
REFERENCE FPBR = FPB; 38564000
WORD ARRAY SZ = SEGZERO[*], 38565000
SUCCESSOR = SUCCESSORSHEET [*,*]; 38566000
DEFINE FPPLACE = FIRSTPARAMETERPLACE #, 38567000
LPPLACE = LASTPARAMETERPLACE#, 38568000
REEDLOCK (LOCALP, GLOBALP, PLACE) = 38569000
LOCALP ~ GLOBALP; GLOBALP ~ REFERENCE (SZ[PLACE]); 38570000
SZ [PLACE] ~ WORD (LOCALP) #, 38571000
FPBSIZE (V) = 38572000
FPB ~ FPB & ARRAYDESCL (0, V + FIXEDFPBSIZE, 1)#, 38573000
SCRATCHSIZE (ARAY) = 38574000
SCRATCH ~ * & ARRAYDESCL(0,T~ARAY[0].INFOINDEXF,1)#; 38575000
IF COMPILEFORSYNTAX(SEGZERO[PROCESSNATUREPLACE]) THEN EXIT; 38576000
BUZZ (PARAMETERQUEUE); 38577000
REEDLOCK (TEMPR, FIRSTPARAM, FPPLACE); 38578000
REEDLOCK (TEMPR, LASTPARAM, LPPLACE); 38579000
THISFILE ~ ALLOCATE (PARAMETERQUEUE); 38580000
CASE ACTION OF 38581000
BEGIN 38582000
BEGIN % STANDARD LABEL EQUATION 38583000
POINTERTOID@(THISFILE) ~ PT ~ NAMES(FILECLS); 38584000
EXTERNALNAME ~ NAMES(FILECLS); 38585000
FPBSIZE (REAL (EXTERNALNAME, 6).INFOINDEXF); 38586000
WHILE CLASS ! QUESTIONCLS AND NOT ENDOFRECORD DO SCANNER; 38587000
COMMENT PRECEDING STATEMENT IS IN LIEU OF FULL LABEL 38588000
EQUATION PROCESSING.; 38589000
END; 38590000
BEGIN % COMPILE CARD FILE 38591000
SCRATCHSIZE (COMPILERCARDEXTERNAL); 38592000
MOVE (CURRENTTIME, POINTER(COMPILERCARDEXTERNAL[1], 38593000
CHARSIZE) +3, FOR 6); 38594000
MOVE (PT ~ POINTER(COMPILERCARDEXTERNAL, CHARSIZE), 38595000
POINTER (SCRATCH, CHARSIZE), FOR T WORDS); 38596000
MOMTOVECTOR (SCRATCH, UINFOW, FILEID.UNITNOF); 38597000
FPBSIZE (T); 38598000
MOVE (PT, POINTER (FPB[FIXEDFPBSIZE],CHARSIZE), 38599000
FOR T WORDS); 38600000
SCRATCHSIZE (COMPILERCARDFILE); 38601000
MOVE (POINTER(COMPILERCARDFILE, CHARSIZE), 38602000
POINTER (SCRATCH, CHARSIZE), FOR T WORDS); 38603000
POINTERTOID@(THISFILE) ~ PT ~ POINTER(SCRATCH, CHARSIZE); 38604000
END; 38605000
BEGIN % COMPILER CODE FILE 38606000
SCRATCHSIZE (COMPILERCODEFILE); 38607000
MOVE (POINTER(COMPILERCODEFILE, CHARSIZE), 38608000
POINTER(SCRATCH, CHARSIZE), FOR T WORDS); 38609000
POINTERTOID@(THISFILE) ~ PT ~ POINTER (SCRATCH, CHARSIZE);38610000
EXTERNALNAMEW~ WORD(SUCCESSOR[CODEFILENAMEDESCPLACE,*]); 38611000
FPBSIZE (REAL(EXTERNALNAME, 6).INFOINDEXF); 38612000
END; 38613000
END OF CASE; 38614000
IF ACTION ! CARDACTION 38615000
THEN MOVE (EXTERNALNAME, POINTER(FPB[FIXEDFPBSIZE], CHARSIZE), 38616000
FOR (REAL(EXTERNALNAME, 6).INFOINDEXF) WORDS); 38617000
IF ACTION = LEQACTION 38618000
THEN FORGETSPACE (EXTERNALNAME.ADDRESSF); 38619000
MOVE (REAL(PT, 6)& FIRSTPOINTERWORDL(*,*,*,FILETYPEP), PT, 38620000
FOR 1 WORDS); 38621000
PARAMETERINFO @(THISFILE) ~ FPBR; 38622000
PARAMETERQUEUE ~ THISFILE; 38623000
FIRSTPARAM ~ READLOCK(FIRSTPARAM ,SZ [FPPLACE]); 38624000
LASTPARAM ~ READLOCK (LASTPARAM , SZ [LPPLACE]); 38625000
UNLOCK (PARAMETERQUEUE); 38626000
EXIT; 38627000
END FILECARD; 38628000
SAVE PROCEDURE ENDGAME (SEGZERO); 38629000
ARRAY SEGZERO [*]; 38630000
BEGIN COMMENT DO ALL PROCESSING NORMALLY ASSOCIATED WITH THE 38631000
END OF A SCHEDULE DECK.; 38632000
REFERENCE PSR; 38633000
ARRAY PS = PSR[*]; 38634000
BOOLEAN PRIOR; 38635000
WORD ARRAY SEGZERW = SEGZERO [*]; 38636000
REFERENCE ARRAY SZR = SEGZERO [*]; 38637000
IF (PSR ~ PREVIOUSPROGRAM@(REFERENCE (SEGZERO)))! NULL 38638000
THEN BEGIN PRIOR ~ TRUE; ENDGAME (PS); END; 38639000
EMPTYPARAMETERQ(SEGZERO); 38640000
IF PRIOR THEN FIRSTPARAMETER@(PSR) ~ SZR[FPBDESCPLACE]; 38641000
SEGZERO [TIMEENTEREDPLACE] ~ TIMEOFDAY; 38642000
IF T ~ SEGZERO[PROCESSNATUREPLACE].PROCESSCLASSF ! 38643000
COMPILENSYNTAXOBJECT 38644000
THEN BEGIN 38645000
BUZZ (SHEETQ); 38646000
SHEETQ ~ REFERENCE(SEGZERO); 38647000
UNLOCK (SHEETQ); 38648000
SHEETENTERED ~ TRUE; 38649000
IF PRIOR 38650000
THEN READLOCK (SEGZERW[LINKPLACE].SELFIDENTF, 38651000
PS [NEXTPROGRAMPLACE]); 38652000
END 38653000
ELSE BEGIN 38654000
FORGETSPACE (SEGZERO.ADDRESSF); 38655000
END; 38656000
EXECUTESHEET ~ FALSE; 38657000
END ENDGAME; 38658000
SAVE PROCEDURE GETHEADER; 38659000
BEGIN COMMENT GETHEADER PRESUMES NAMEPOINTER HAS BEEN INITIAL-38660000
IZED TO POINT AT A NAME STRING. SEGMENT ZERO 38661000
WILL BE MADE PRESENT (BY PRESENCE BIT) AND 38662000
ENTRIES APPROPRIATE TO THE SHEETQ ARE MADE. 38663000
SEGZERO IS EVENTUALLY PLACED IN THE SHEETQ.; 38664000
WORD ARRAY NAMEPOINTERW = NAMEPOINTER [*]; 38665000
WORD ARRAY SEGZEROW = SEGZERO [*]; 38666000
REAL ARRAY HEADER =HEADERW [*]; 38667000
DEFINE 38668000
ARGUMENT = 0#, 38669000
LOCKER = FALSE #; 38670000
IF T ~ DIRECTORYSEARCH (NAMEPOINTER, ARGUMENT, LOCKER) < 0 38671000
THEN CONTROLCARDERROR (4) 38672000
ELSE HEADERW ~ DISKFILEHEADERS [T, *]; 38673000
T := @440; 38674000
DISKWAIT(SEGZERO, -1, SIZE(SHEETQ), FIRSTROWADDRESS(HEADER), 38675000
T); 38676000
SEGZEROW[FPBDESCPLACE].TAG ~ DATADESC; 38677000
QUEUEPARAMETERS (SEGZERO); 38678000
PREVIOUSPROGRAM@(REFERENCE(SEGZERO)) ~ NULL; 38679000
MOMTOVECTOR (NAMEPOINTERW, SEGZERO, CODEFILENAMEDESCPLACE); 38680000
MOMTOVECTOR (HEADERW, SEGZERO, CODEFILEDESCPLACE); 38681000
SEGZERO.CBITF ~ 1; 38682000
EXIT; 38683000
END OF GETTING HEADER; 38684000
COMMENT CONTROL CARD STARTS HERE; 38685000
WORDDIVCHARSIZE ~ 48 DIV CHARSIZE; 38686000
IF 5 = IOCB.TAG 38687000
THEN BEGIN COMMENT AN IOCB; 38688000
SOURCEREFERENCE ~ AREADESC @(IOCB); 38689000
RESULT ~ MISC @ (IOCB); 38690000
CONTROLCARDCHECK; 38691000
CONTROLWORD ~ SOURCEAREA [0]; 38692000
FILEID ~ USER @(IOCB); 38693000
END 38694000
ELSE BEGIN COMMENT A UNIT NUMBER; 38695000
CONTROLWORD ~ 30"044"; 38696000
FILEID ~ 0 & USERL (SNR, STACK[SNR, PRIORITYPLACE], 38697000
UNITNO); 38698000
ACTION ~ 3"1001"; % VALIDITY - WAIT FOR MPX ON CM 38698100
COMMENT * * * * 38698900
ACTION ~ 3"3001"; % CC OR CM AND VALIDITY 38699000
TRACE (23); 38700000
NEWLIFE: 38701000
SEGZERO ~ SEGZEROWORD; 38702000
CONTROLCARDIO; 38703000
ACTION ~ 3"3011"; % SIM KLUDGE 38704000
END; 38705000
LIMIT ~ ORIGINALLIMIT ~ RESULT.RDMEMADDR|WORDDIVCHARSIZE + 38707000
RESULT.RDCHRCNT - 1; 38708000
SOURCE ~ ORIGINALSOURCE ~ POINTER(SOURCEAREA, 38709000
CHARSIZE) + WORDDIVCHARSIZE; 38710000
RESULT ~ RESERVED [0]; 38711000
ACCUMULATOR ~ RESERVED & DATADESCRIPTOR 38712000
(,,,,,0,,,ACCUMULATOR.LENGTHF); 38713000
ACCUMPOINTER ~ POINTER(ACCUMULATOR, CHARSIZE); 38714000
SCANNER; 38715000
WHILE CLASS = QUESTIONCLS 38716000
DO BEGIN 38717000
SCANNER; 38718000
IF RANGE (ALGOLCLS, COBOLCLS) 38719000
THEN BEGIN COMMENT A COMPILER PARAMETER; 38720000
SCANNER; 38721000
SEGZERO ~ PREDECESSOR; 38722000
END; 38723000
CASE RESERVECASE OF 38724000
BEGIN 38725000
CONTROLCARDERROR(0); 38726000
BEGIN 38727000
IF CLASS > ENDCLS THEN CONTROLCARDERROR(1);38728000
IF EXECUTESHEET THEN ENDGAME(SEGZERO); 38729000
CASE CLASS - RUNCLS OF 38730000
BEGIN % FIRST CARD CASE 38731000
BEGIN % RUN 138732000
GO EXECUTE; 38733000
END; % RUN 138734000
EXECUTE: BEGIN 38735000
SHEETENTERED ~ FALSE; 38736000
NAMEPOINTER ~ NAMES(EXECUTECLS); 38737000
GETHEADER; 38738000
SUCCESSOR ~ SEGZERO; 38739000
NATUREOFPROCESS(SEGZERO,EXECUTEJOB); 38740000
EXECUTESHEET ~ TRUE; 38741000
END; % EXECUTE 238742000
BEGIN % COMPILE 338743000
COMPILER ~ TRUE; 38744000
NAMEPOINTER ~ NAMES (COMPILECLS); 38745000
MOMTOVECTOR (WORD(NAMEPOINTER),SEGZERO,CODEFILENAMEDESCPLACE); 38746000
SUCCESSORSHEET ~ REFERENCE (SEGZERO); 38747000
READLOCK(0&DATADESCRIPTOR (), SEGZERO[FPBDESCPLACE]); 38748000
SEGZERO ~ SEGZEROWORD; 38749000
WHILE NOT RANGE (ALGOLCLS, COBOLCLS) DO SCANNER; 38750000
SOURCE ~ TSOURCE; 38751000
NAMEPOINTER ~ NAMES (COMPILECLS); 38752000
GETHEADER; 38753000
NEXTPROGRAM@(REFERENCE(SEGZERO)) ~ SUCCESSORSHEET; 38754000
PREDECESSOR ~ SEGZERO; 38755000
PREVIOUSPROGRAM@(SUCCESSORSHEET) ~ PREDECESSORSHEET; 38756000
FILECARD (SEGZERO, CARDACTION); 38757000
WHILE NOT RANGE (LIBRARYCLS, DISKCLS -1) 38758000
DO IF CLASS ! QUESTIONCLS AND NOT ENDOFRECORD 38759000
THEN SCANNER 38760000
ELSE CLASS ~ GOCLS; 38761000
CASE CLASS - LIBRARYCLS OF 38762000
BEGIN 38763000
BEGIN % COMPILE FOR LIBRARY 38764000
NATUREOFPROCESS (SEGZERO, COMPILETOLIBRARYJOB); 38765000
DO UNTIL SCANNER = QUESTIONCLS OR ENDOFRECORD; 38766000
NATUREOFPROCESS (SUCCESSOR, IF ENDOFRECORD 38767000
THEN COMPILETOLIBRARYJOB ELSE LIBRARYNGOJOB); 38768000
FILECARD (SEGZERO, CODEACTION); 38769000
END; 38770000
BEGIN % COMPILE FOR SYNTAX 38771000
NATUREOFPROCESS (SEGZERO, COMPILENSYNTAXJOB); 38772000
NATUREOFPROCESS (SUCCESSOR, COMPILENSYNTAXOBJECT); 38773000
END; 38774000
BEGIN % COMPILE AND GO 38775000
NATUREOFPROCESS(SEGZERO, COMPILENGOJOB); 38776000
NATUREOFPROCESS(SUCCESSOR,GOJOB); 38777000
FILECARD (SEGZERO, CODEACTION); 38778000
CLASS ~ QUESTIONCLS; 38779000
END; 38780000
END; 38781000
FIRSTPARAMETER@(SUCCESSORSHEET)~LASTPARAMETER@(SUCCESSORSHEET)~38782000
NULL; 38783000
EXECUTESHEET ~ TRUE; 38784000
WHILE CLASS !QUESTIONCLS AND NOT ENDOFRECORD DO SCANNER; 38785000
END; % COMPILE 338786000
BEGIN % REMOVE 438787000
END; % REMOVE 438788000
BEGIN % LOAD 538789000
LIBMAIN(NAMES(LOADCLS)+6); 38789100
END; % LOAD 538790000
BEGIN % DUMP 638791000
END; % DUMP 638792000
BEGIN % CHANGE 738793000
END; % CHANGE 738794000
BEGIN % DATA 838795000
LABELTYPE ~ 4; %%%%%%%%%%%%%%%% 38796000
DATA: IF NOT ENDOFRECORD 38797000
THEN UINFOW [FILEID.UNITNOF] ~ WORD (NAMES(DATACLS)); 38798000
UINFOP [FILEID.UNITNOF, 0] ~ 0 & LEBCNTRL 38799000
(1,,,,,1,LABELTYPE); 38800000
GO SUICIDE; 38801000
END; % DATA 838802000
BEGIN % USE 938803000
END; % USE 938804000
BEGIN % USER 1038805000
END; % USER 1038806000
BEGIN % RELEASE 1138807000
END; % RELEASE 1138808000
BEGIN % FREE 1238809000
END; % FREE 1238810000
BEGIN % PUBLIC 1338811000
END; % PUBLIC 1338812000
BEGIN % DATAB 1438813000
LABELTYPE ~ 3; %%%%%%%%%%%% 38814000
GO DATA; 38815000
END; % DATAB 1438816000
BEGIN % UNUSED 1538817000
END; % UNUSED 1538818000
BEGIN % UNUSED 1638819000
END; % UNUSED 1638820000
BEGIN % UNUSED 1738821000
END; % UNUSED 1738822000
BEGIN % UNUSED 1838823000
END; % UNUSED 1838824000
BEGIN % UNUSED 1938825000
END; % UNUSED 1938826000
BEGIN % UNUSED 2038827000
END; % UNUSED 2038828000
BEGIN % UNUSED 2138829000
END; % UNUSED 2138830000
BEGIN % UNUSED 2238831000
END; % UNUSED 2238832000
BEGIN % UNUSED 2338833000
END; % UNUSED 2338834000
BEGIN % END 2438835000
END; % END 2438836000
END OF FIRST CARD CASE; 38837000
END; 38838000
CASE CLASS - FILECLS OF 38839000
BEGIN % PARAMETER CARD CASE 38840000
BEGIN % FILE 3538841000
FILECARD(SEGZERO, LEQACTION); 38842000
END; % FILE 3538843000
BEGIN % PROCESS 3638844000
END; % PROCESS 3638845000
BEGIN % IO 3738846000
MYCOMMON ~ 38847000
SEGZERO [IOTIMEPLACE ] ~ GETANUMBER(TRUE); 38848000
END; % IO 3738849000
BEGIN % PRIORITY 3838850000
SEGZERO [PRIORITYPLACE ] ~ GETANUMBER(TRUE); 38851000
END; % PRIORITY 3838852000
BEGIN % COMMON 3938853000
SEGZERO [COMMONVALUEPLACE ] ~ GETANUMBER(TRUE); 38854000
END; % COMMON 3938855000
BEGIN % CORE 4038856000
SEGZERO [COREPLACE ] ~ GETANUMBER(TRUE); 38857000
END; % CORE 4038858000
BEGIN % STACK 4138859000
SEGZERO [STACKSIZEPLACE ] ~ GETANUMBER(TRUE); 38860000
END; % STACK 4138861000
BEGIN % UNUSED 4238862000
END; % UNUSED 4238863000
BEGIN % UNUSED 4338864000
END; % UNUSED 4338865000
BEGIN % UNUSED 4438866000
END; % UNUSED 4438867000
BEGIN % UNUSED 4538868000
END; % UNUSED 4538869000
BEGIN % UNUSED 4638870000
END; % UNUSED 4638871000
BEGIN % UNUSED 4738872000
END; % UNUSED 4738873000
BEGIN % UNUSED 4838874000
END; % UNUSED 4838875000
BEGIN % UNUSED 4938876000
END; % UNUSED 4938877000
BEGIN % UNUSED 5038878000
END; % UNUSED 5038879000
BEGIN % UNUSED 5138880000
END; % UNUSED 5138881000
BEGIN % ALGOL 5238882000
END; % ALGOL 5238883000
BEGIN % FORTRAN 5338884000
END; % FORTRAN 5338885000
BEGIN % ESPOL 5438886000
END; % ESPOL 5438887000
BEGIN % UNUSED 5538888000
END; % UNUSED 5538889000
BEGIN % UNUSED 5638890000
END; % UNUSED 5638891000
BEGIN % UNUSED 5738892000
END; % UNUSED 5738893000
BEGIN % UNUSED 5838894000
END; % UNUSED 5838895000
BEGIN % UNUSED 5938896000
END; % UNUSED 5938897000
BEGIN % UNUSED 6038898000
END; % UNUSED 6038899000
BEGIN % UNUSED 6138900000
END; % UNUSED 6138901000
BEGIN % UNUSED 6238902000
END; % UNUSED 6238903000
BEGIN % UNUSED 6338904000
END; % UNUSED 6338905000
BEGIN % UNUSED 6438906000
END; % UNUSED 6438907000
BEGIN % COBOL 6538908000
END; % COBOL 6538909000
END; % PARAMETER CARD CASE 38910000
END RESERVED CASE; 38911000
IF ENDOFRECORD AND NOT SHEETENTERED 38912000
THEN BEGIN 38913000
CONTROLCARDIO; 38914000
SCANNER; 38915000
END; 38916000
SEGZERO ~ SUCCESSOR; 38917000
END OF QUESTION CLASS WHILE; 38918000
NATURALDEATH: 38919000
IF SCANIN (0 & USTATUSWORD (UNITNO.VECTOR,,,)).WHICHUNIT = 1 38920000
THEN GO NEWLIFE; 38921000
SUICIDE: 38922000
UNIT [FILEID.UNITNOF].UNITASSIGNED ~ 0; 38923000
EXIT; 38924000
38925000
CCERROR: 38926000
GLOBALSTOP; 38927000
END CONTROL CARD; 38928000
SAVE PROCEDURE INITIATEIO(AREADESC,UNITWORD,USERIDNO); 40000000
VALUE AREADESC,UNITWORD,USERIDNO; 40001000
REAL UNITWORD; 40002000
REFERENCE AREADESC; 40003000
INTEGER USERIDNO; FORWARD; 40004000
SAVE PROCEDURE STARTIO(U); VALUE U; INTEGER U; 40005000
COMMENT STARTIO FIRST CHECKS FOR CHANNEL IF THE UNIT IS IN AN USABLE 40006000
STATE.IF CHANNEL IS AVAILABLE, IT CALLS INITIATEIO, OTHERWISE 40007000
IT INSERTS ENTRY INTO WAITCHANNEL QUEUE. 40008000
U -LOGICAL UNIT NO.; 40009000
BEGIN 40010000
INTEGER N, COMMENT N STORES UNIT IN PROCESS OR BUSY BITS; 40011000
MPXINDEX; COMMENT MULTIPLEXOR NO. FOR WAITCHANNELQUE 40012000
INDEX; 40013000
REAL X, COMMENT X CONTAINS UNIT TABLE ENTRY; 40014000
UNITWORD; COMMENT RESULT OF INTERROGATE I/O PATH FOR 40015000
UNIT; 40016000
REFERENCE IOCB; COMMENT POINTER TO ENTRY OF I/O QUEUE; 40017000
X~ UNIT[U]; 40018000
IF X.UNITSTATUS=0 THEN COMMENT CHECKING CURRENT STATE OF UNIT;40019000
IF FIRSTIO[U]!NULL THEN COMMENT MORE I/O TO BE DONE FOR UNIT; 40020000
BEGIN 40021000
UNITWORD~SCANIN(0&IOPATHWORD(U,X.UNITMPXD,X.UNITMPXI)); 40022000
IF BOOLEAN(UNITWORD) THEN 40023000
BEGIN 40024000
IOCB ~FIRSTIO[U]; 40025000
INITIATEIO(AREADESC @IOCB,UNITWORD,USER @(IOCB).IDNO); 40026000
N~3; COMMENT SET UNIT IN PROCESS BITS; 40027000
END ELSE 40028000
BEGIN COMMENT ENTER IN WAITCHANNELQUE; 40029000
MPXINDEX~UNITWORD.MPXDESIGNATOR DIV 2; 40030000
WAITCHANNELQUE[MPXINDEX]~WAITCHANNELQUE(UNITWORD); 40031000
N~4; COMMENT SET UNIT WAITING FOR CHANNEL BIT; 40032000
END; 40033000
UNIT[U].UCHANWAITORBUSY~N; 40034000
END; 40035000
END STARTIO; 40036000
SAVE PROCEDURE INITIATEIO(AREADESC,UNITWORD,USERIDNO); 40037000
VALUE AREADESC,UNITWORD,USERIDNO; 40038000
REAL UNITWORD; 40039000
REFERENCE AREADESC; 40040000
INTEGER USERIDNO; 40041000
COMMENT INITIATEIO INITIATES I/O AND INITIALIZES I/O TIME FOR THE USER40042000
IT ALSO CHECKS FOR THE UNIT TYPE AND UPDATES THE TRANSACTION 40043000
COUNTER APPROPRIATELY 40044000
AREADESC - DESCRIPTOR POINTING TO THE I/O CONTROL WORD WHICH 40045000
PRECEEDS I/O AREA 40046000
THIS AREA MUST BE NON-OVERLAYABLE AT THIS POINT. 40046100
SEE DISKWAIT OR WAITIO FOR EXAMPLES OF HOW TO 40046200
GUARENTEE THIS. 40046300
UNITWORD - CONTROL WORD FOR THE UNIT ON WHICH I/O IS TO BE 40047000
INITIATED. 40048000
USERIDNO - USER IDENTIFICATION NO. FOR BOOK-KEEPING.; 40049000
BEGIN 40050000
REAL IOCW ; COMMENT LOCATION FOR I/O CONTROL WORD; 40052000
INTEGER U, COMMENT CONTAINS LOGICAL UNIT NO.; 40053000
TYPE; COMMENT CONTAINS UNIT TYPE; 40054000
WORD ARRAY IOAREA[*]; 40055000
IOAREA~WORD(AREADESC); 40056000
IOCW ~ TAGZOT(IOAREA[0]); 40057000
IIO(IOAREA,UNITWORD); 40060000
TYPE~UNIT[U~UNITWORD.UNITNO].UNITTYPE; 40062000
IOTIME[U] ~ * - SCANIN(TIMEOFDAYWORD); 40062100
IF BOOLEAN(IOCW.IOTESTBIT) THEN EXIT; 40063000
IF MAGTAPE(TYPE) THEN 40064000
IF BOOLEAN(IOCW.IOBACKWARD) THEN 40065000
BEGIN COMMENT IOMEMINHIBIT BIT IS USED TO CHECK WHETHER UNIT 40066000
IS REWINDING; 40067000
IF NOT BOOLEAN(IOCW.IOMEMINHIBIT) THEN 40068000
TRANSACTION[U]~*-1; 40069000
EXIT; 40070000
END; 40071000
TRANSACTION[ U ]~ * + 1; 40072000
EXIT; 40073000
END INITIATEIO; 40074000
SAVE PROCEDURE IOREQUEST(IOCB); 40075000
VALUE IOCB; 40076000
REFERENCE IOCB; 40077000
COMMENT IOREQUEST QUEUES UP I/O IN IOQUE IF THIS IS THE ONLY ENTRY 40078000
IN QUEUE IT CALLS STARTIO 40079000
IOCB - DESCRIPTOR POINTING TO THE ENTRY BLOCK FOR I/O QUEUE 40080000
6 WORDS IN A BLOCK; 40081000
BEGIN 40082000
INTEGER U; COMMENT U CONTAINS LOGICAL UNIT NO; 40083000
U~USER @(IOCB).UNITNOF; 40084000
IF UNIT[U].UNITTYPE=0 THEN 40084010
BEGIN % INVALID UNIT 40084020
MISC @(IOCB)~REAL(NOT FALSE); 40084030
USER @(IOCB).USERIOFINISH~1; 40084040
CAUSE(EVNT @ IOCB); 40084050
END ELSE 40084060
BEGIN % GO AHEAD 40084080
MISC @ (IOCB).RDEXCEPTION := 0; 40084100
IOQUE[U] ~ IOCB; 40085000
IF NEXT(IOQUE,U)=NULL THEN STARTIO(U); COMMENT ONLY ONE 40086000
ENTRY IN IOQUE; 40087000
END; 40087500
END IOREQUEST; 40088000
SAVE REAL PROCEDURE WAITIO(ARRA, USER, IOERRORMASK); 40089000
VALUE USER, IOERRORMASK; 40090000
ARRAY ARRA[*]; 40091000
REAL USER, IOERRORMASK; 40092000
COMMENT: WAITIO BUILDS AN IOCB AND CALLS IOREQUEST PASSING A LOCAL 40093000
EVENT ON WHICH IT WAITS. IF THERE ARE NO ERRORS OTHER 40094000
THAN THOSE ACCOUNTED FOR BY IOERRORMASK THEN WAITIO 40095000
RETURNS THE RESULT DESCRIPTOR. OTHERWISE IT CALLS 40096000
UNEXPECTEDIOERROR. 40097000
IOERRORMASK -ERROR MASK PROVIDED BY CALLER TO DO ITS OWN 40098000
ERROR-HANDLING 40099000
BUFFERLENGTH FIELD OF IOERRORMASK HAS A MASK 40100000
WHICH DETERMINES UNEXPECTED I/O ERROR. 40101000
USER -THIS IS THE USER WORD WHICH IS TO BE PUT IN THE IOCB. 40102000
IT MUST CONTAIN THE UNIT NUMBER IN THE UNIT FIELD. 40103000
ARRA -THIS IS AN UNINDEXED DATA DESCRIPTOR FOR THE IO AREA. 40104000
THE CALLER MUST HAVE STORED AN IOCW IN AREA[0]. ;40105000
BEGIN 40106000
REAL RD; 40107000
EVENT EVE; 40108000
REFERENCE ADAM; 40109000
WORD ARRAY AREA[*]; 40110000
INTEGER TRACTER;% USED TO SHUT OFF TRACE -- MAR 40112000
TRACTER~TRACE(0); 40113000
MAKEPRESENTANDSAVE(ARRA); %MAKE TEMPORARILY SAVE FOR I/O 40114000
AREA ~ ARRA & ARRAYDESCL(3, ARRA.LENGTHF - 1, *); 40116000
IOERRORMASK ~ REAL(NOT BOOLEAN(IOERRORMASK)); 40117000
ADAM ~ IOQUE(USER, -0, REFERENCE(AREA), EVE); 40118000
MISC@(ADAM).IOERRORMASKFIELD ~ IOERRORMASK; 40119000
IOREQUEST(ADAM); 40120000
WAIT(EVE); 40121000
IF BOOLEAN(WAITIO ~ RD ~ MISC@(ADAM)) THEN 40122000
IF REAL(BOOLEAN(RD.IOERRORMASKFIELD) AND 40123000
BOOLEAN(IOERRORMASK) AND 40124000
BOOLEAN(IOERRORMASK.BUFFERLENGTH)) !0 THEN 40125000
UNEXPIOERROR(ADAM,REAL(NOT BOOLEAN(IOERRORMASK. 40126000
IOERRORMASKFIELD))); 40127000
FORGETAREA(6,WORD(ADAM).ADDRESSF); 40128000
TURNOVERLAYKEY(ARRA.ADDRESSF);%RETURN TO PREVIOUS OLAY STATUS 40128100
TRACE(TRACTER); 40129000
RETURN(RD); 40129100
END WAITIO; 40130000
SAVE PROCEDURE NEWIO(MPXINDEX); VALUE MPXINDEX; 40131000
INTEGER MPXINDEX; 40132000
COMMENT NEWIO PICKS UP THE FIRST UNIT FOR GIVEN MPX WAITCHANNELQUE, 40133000
AND INTERROGATES FOR I/O PATH. IF PATH IS AVAILABLE IT PICKS 40134000
UP THE FIRST I/O FROM THE SPECIFIED UNIT I/O QUEUE. IT CALLS 40135000
INITIATEIO, DELINKS THE FIRST ENTRY FROM WAITCHANNELQUE AND 40136000
SETS UNIT BUSY BITS. 40137000
MPXINDEX -MULTIPLEXOR NO. FOR WAITCHANNELQUE INDEX; 40138000
BEGIN 40139000
INTEGER U; COMMENT U CONTAINS LOGICAL UNIT NO.; 40140000
REAL UNITWORD; COMMENT RESULT OF INTERROGATE I/O PATH FOR 40141000
UNIT; 40142000
REFERENCE IOCB; COMMENT POINTER TO ENTRY OF I/O QUEUE; 40143000
UNITWORD ~ SCANIN(UNTWORD @ FIRSTUNIT[MPXINDEX]); 40144000
IF BOOLEAN(UNITWORD) THEN 40145000
BEGIN 40146000
IOCB ~ FIRSTIO[U ~ UNITWORD.UNITNO]; 40147000
INITIATEIO(AREADESC @ IOCB ,UNITWORD,USER @(IOCB). IDNO); 40148000
COMMENT REMOVES ENTRY FROM TOP; 40149000
DELINK(WAITCHANNELQUE,FIRSTUNIT[MPXINDEX],MPXINDEX); 40150000
UNIT[U].UNITSTATUS ~3; COMMENT SETS UNIT BUSY BITS; 40151000
END; 40152000
END NEWIO; 40153000
SAVE PROCEDURE IOFINISH(MPXINDEX); VALUE MPXINDEX; INTEGER MPXINDEX;40154000
COMMENT IOFINISH READS A RESULT DESCRIPTOR FOR A SPECIFIED MULTIPLEXOR40155000
IT DOES ALL THE ERROR CHECKING. IF NO ERROR IS FOUND IT FIRES 40156000
UP NEW I/O WAITING FOR CHANNEL AND INSERTS I/O REQUEST FOR 40157000
THE UNIT ON WHICH I/O WAS FINISHED INTO A WAITCHANNELQUE. IF 40158000
NO UNIT IS WAITING FOR CHANNEL IT REMOVES FINISHED I/O ENTRY 40159000
FROM UNIT QUEUE AND IF QUEUE IS NOT EMPTY THEN CALLS STARTIO. 40160000
IF ERROR IS FOUND, IT SETS APPROPRIATE BITS IN THE UNIT TABLE.40161000
IF THERE IS A DISK ERROR, IT WILL TRY 10 TIMES TO RECOVER FROM40162000
THE ERROR. FOR OTHER ERRORS IT CALLS PROCESS IOERROR. IT KEEPS40163000
THE ERROR. FOR OTHER ERRORS IT CALLS PROCESS IOERR. IT KEEPS 40164000
TRACK OF I/O TIME AND FOR ERROR FREE OPERATION IT GIVES THE 40165000
WORD COUNT FOR READ OPERATION. 40166000
40167000
MPXINDEX -MULTIPLEXOR DESIGNATOR VALUE; 40168000
BEGIN 40169000
LABEL OK,NOWAIT,SETERRORBITS, RESETBUSYBITS,WRAPUP,DONEWIO, 40170000
UNITTYPETEST,EXIT; 40171000
INTEGER UNTTYPE, COMMENT UNIT TYPE; 40172000
U , COMMENT LOGICAL UNIT NO; 40173000
WORDCOUNT; COMMENT WORD COUNT FOR READ; 40174000
REAL CURRENTERROR, COMMENT ERROR FIELD OF CURRENT R. D.; 40175000
PASTERROR, COMMENT ERROR FIELD OF PAST R. D.; 40176000
UTABLEENTRY, COMMENT UNIT TABLE ENTRY; 40177000
RECDESC, COMMENT RECORD DESCRIPTOR SKELETON 40178000
IF NEGATIVE IT IS FOR MCP; 40179000
RD; COMMENT RESULT DESCRIPTOR; 40180000
WORD IOCW; COMMENT I/O CONTROL WORD; 40181000
REFERENCE IOCB; COMMENT TOP IOCB IN THE UNIT QUEUE; 40182000
BOOLEAN DELINKTOGGLE; % TRUE IF IOQUE ENTRY IS DELINKED 40183000
MONITOR RAJMONITOR(RD,IOCB); 40186000
DEFINE LINKINTOKEYINQ = 40187000
BEGIN 40188000
KEVNT @(IOCB) ~1; 40189000
BUZZCONTROL(KEYINQ); 40190000
KEYINQ~IOCB; 40191000
UNLOCK(KEYINQ);% TEMPORARY WHILE FORK MIGHT LOSE CONTROL 40192000
FORK(KEYIN,0); 40194000
END#,% 40194100
LINKINTOSPOUTQ=% 40195000
BEGIN% 40195100
BUZZCONTROL(SPOUTQ);% 40195200
SPOUTQ~IOCB;% 40195300
UNLOCK(SPOUTQ);% TEMPORARY 40195400
FORK(CONNSOUL,0);% 40195500
END#,% 40195590
ENDIOFDEF=0#;% 40195900
COMMENT READ THE RESULT DESCRIPTOR FOR A SPECIFIED MPX; 40196000
RD ~SCANIN(0&SCANINWORD(2,MPXINDEX,1)); 40197000
IF RD=0 THEN BEGIN GO EXIT; END; 40198000
MPXINDEX~FIRSTONE(MPXINDEX)-1; COMMENT TURNS MPXINDEX TO INDEX 40199000
FOR WAITCHANNELQUE; 40200000
U~ RD.RDUNITNO; 40201000
IOCB~FIRSTIO[U]; 40202000
UTABLEENTRY ~ UNIT[U]; 40203000
RECDESC~ MISC @ IOCB; 40204000
UNTTYPE~UTABLEENTRY.UNITTYPE; 40205000
IOCW~M[WORD(AREADESC @ IOCB)]; 40205200
IF MAGTAPE( UNTTYPE) AND NOT BOOLEAN(IOCW.IOTESTBIT) THEN 40205400
BEGIN % GET RID OF UNDESIRABLE BITS IN RD 40205450
IF RD.RDERROR=@2001 THEN % TURN OFF INCOMPLETE RECORD BIT 40205600
RD~REAL(BOOLEAN(RD) AND NOT BOOLEAN(@2001)); 40205800
IF BOOLEAN(RD.RDWLOOREOF) THEN 40205820
RD~REAL(BOOLEAN(RD)AND NOT BOOLEAN(4"C80")); 40205840
END; 40205860
IF BOOLEAN(CURRENTERROR := RD.RDERROR) OR 40206000
(PASTERROR~UTABLEENTRY.UNITERRORFIELD)!0 THEN 40207000
BEGIN COMMENT SOME KIND OF ERROR; 40208000
IF NOT BOOLEAN(USER@(IOCB).USERIOBIT) THEN COMMENT 40209000
MCP I/O OPERATION; 40210000
IF CURRENTERROR~ REAL(BOOLEAN(CURRENTERROR) AND 40211000
BOOLEAN(RECDESC .IOERRORMASKFIELD))=0 THEN 40212000
IF PASTERROR=0 THEN GO OK; COMMENT NO ERROR ON UNIT; 40213000
IF UTABLEENTRY.UNITTYPE !DISKFILE THEN GO SETERRORBITS; 40214000
COMMENT ERROR CHECKING FOR DISK UNIT; 40215000
IF CURRENTERROR=0 THEN COMMENT NO ERROR ON CURRENT R.D.; 40216000
IF NOT BOOLEAN(UTABLEENTRY.UNITRETRY) 40217000
THEN GO SETERRORBITS COMMENT IOERR WILL HANDLE IT; 40218000
ELSE BEGIN COMMENT ERROR ON MASS STORAGE RECOVERED; 40219000
PASTERROR~0; 40220000
UTABLEENTRY.UNITRETRY~0; 40220500
GO UNITTYPETEST; 40221000
END; 40222000
COMMENT ERROR ON CURRENT R.D.; 40223000
IF PASTERROR=0 THEN 40224000
BEGIN COMMENT ORIGINAL ERROR ON MASS STORAGE; 40225000
PASTERROR~1; 40226000
COMMENT TOTALUNITERROR~ * + 1; 40227000
UTABLEENTRY.UNITRETRY~1; 40228000
END ELSE 40229000
BEGIN COMMENT RECURRENT ERROR ON MASS STORAGE; 40230000
IF NOT BOOLEAN(UTABLEENTRY.UNITRETRY) THEN 40231000
GO SETERRORBITS; 40232000
IF (PASTERROR~* + 1)>10 THEN COMMENT THERE HAVE 40233000
BEEN 10 TRIES; 40234000
BEGIN 40235000
PASTERROR~0; 40236000
UTABLEENTRY.UNITRETRY ~0; 40237000
GO SETERRORBITS; 40238000
END; 40239000
END; 40240000
UTABLEENTRY.UNITERRORFIELD ~ PASTERROR; 40241000
UTABLEENTRY.UNITIOBUSY~0; 40242000
UNIT[U]~UTABLEENTRY; 40243000
STARTIO(U); 40244000
GO EXIT; 40245000
SETERRORBITS: 40246000
PASTERROR~ * + 1; 40247000
DELINKTOGGLE~TRUE; % PREVENTS DELINKING AT WRAPUP TIME 40248000
UTABLEENTRY.UNITERROR~1; 40249000
IF FIRSTUNIT[MPXINDEX]=NULL THEN 40251000
GO WRAPUP ELSE 40252000
GO DONEWIO; 40253000
END; 40254000
UNITTYPETEST: 40255000
COMMENT ****************** NEEDS PATCH FOR BUFFERED PRINTER; 40256000
OK: COMMENT CHECK WHETHER YOU CAN START NEW I/O ON SAME UNIT; 40257000
UTABLEENTRY.UNITIOBUSY~0; 40258000
UNIT[U]~UTABLEENTRY; 40259000
IF FIRSTUNIT[MPXINDEX]=NULL THEN 40260000
NOWAIT: COMMENT NO UNIT WAITING FOR CHANNEL; 40261000
BEGIN 40262000
DELINK(IOQUE,FIRSTIO[U],U); 40263000
DELINKTOGGLE~TRUE; 40264000
IF FIRSTIO[U]!NULL THEN 40265000
STARTIO(U) ELSE 40266000
RESETBUSYBITS: 40267000
UTABLEENTRY.UNITIOBUSY~0; 40268000
GO WRAPUP; 40269000
END; 40270000
DONEWIO: COMMENT DO NEW I/O FOR UNIT WAITING FOR CHANNEL; 40271000
NEWIO(MPXINDEX); 40272000
IF PASTERROR!0 THEN GO WRAPUP; 40273000
IF NEXT(IOQUE,U)=NULL THEN GO RESETBUSYBITS; 40274000
WAITCHANNELQUE[MPXINDEX]~ 40275000
WAITCHANNELQUE(0&IOPATHWORD(U,UTABLEENTRY.UNITMPXD, 40276000
UTABLEENTRY.UNITMPXI)); 40277000
UTABLEENTRY.UCHANWAIT~1; 40278000
WRAPUP: 40279000
COMMENT CLOCK THE OPERATION OFF 40280000
IOTIME[USER @ (IOCB).IDNO]~ * + SCANIN(TIMEOFDAYWORD); 40281000
IF CURRENTERROR=0 AND 40282000
(NOT DELINKTOGGLE) THEN DELINK(IOQUE,FIRSTIO[U],U); 40283000
UTABLEENTRY.UNITERRORFIELD~ PASTERROR; 40284000
USER @(IOCB).USERIOFINISH~1; 40284500
UNIT[U]~UTABLEENTRY; 40285000
IF BOOLEAN(IOCW.IOREADBIT) THEN COMMENT READ OPERATION; 40287000
BEGIN % COMPUTING NO OF WORDS READ 40288000
WORDCOUNT ~ABS(RD.RDMEMADDR- 40289000
((AREADESC@(IOCB)).ADDRESSF+1)); 40290000
IF ( UNTTYPE=MAGTAPE1 OR UNTTYPE=MAGTAPCLUSTER1) AND 40291000
NOT BOOLEAN(IOCW.IOBACKWARD) THEN 40292000
RD.RDCHRCNT~RD.RDCHRCNT-1; 40293000
RD.WORDCOUNTF~WORDCOUNT; 40299000
END; 40300000
IF CURRENTERROR!0 AND PASTERROR=1 THEN 40301000
BEGIN % ERROR FOR THE FIRST TIME FOR THIS I/O 40302000
USER@(IOCB).IOERRORRECOVERY~1; 40303000
FORK(IOERROR,RD); 40304000
GO EXIT; 40305000
END; 40309000
40310000
MISC @ ( IOCB ) ~ RD; 40311000
IF UNTTYPE=CONN THEN% 40312000
IF INPUT(IOCW) THEN LINKINTOKEYINQ% 40312100
ELSE IF (SEvNT@IOCB).TAG=1 THEN CAUSE(EVNT@IOCB)% 40312200
ELSE LINKINTOSPOUTQ% 40312300
ELSE% 40312400
CAUSE(EVNT @ IOCB); 40313000
EXIT: 40314000
END IOFINISH; 40315000
PROCEDURE STATUS (COUNT); INTEGER COUNT; % *** NOTE PARAMETER 40316000
COMMENT STATUS INTERROGATES ALL THE PERIPHERAL UNITS. IT COMPARES THE 40317000
NEWSTATUS WITH OLDSTATUS AND NOTES STATUS CHANGE CORRESPONDING40318000
TO EACH UNIT. IT CHECKS CURRENT STATE OF THE UNIT TO DETERMINE40319000
WHAT SHOULD BE DONE.IF A UNIT GOES NOT READY IT SETS 40320000
UNITNOTREADY IN UNIT TABLE. IF UNIT GOES READY IT RESETS 40321000
UNITNOTREADY. IF A UNIT WAS A USER AND THEN WENT READY, 40322000
IT CALLS STARTIO. 40323000
40324000
IF AN UNASSIGNED UNIT GOES READY, STATUS BRANCHES ON UNIT TYPE:40325000
RIATE ACTION ON THE RESULT. 40328000
FOR CARD READER IT CALLS INDEPENDENTRUNNER TO RUN CONTROLCARD 40329000
PROCESS AND MARKS UINFO TABLE APPROPRIATELY. 40330000
40331000
FOR TAPE, STATUS CALLS READALABEL; 40332000
BEGIN 40333000
REAL BITNO, % BIT # IN STATUS FIELD(32:32) 40334000
VECTORNO, % STATUS VECTOR # 40335000
U, % LOGICAL UNIT # 40336000
NRDLBLP, % # OF READALABEL PROCESSES 40337000
TEMP, % TEMPORARY 40337010
UNT; % UNIT TABLE ENTRY FOR UNIT[U] 40337020
40338000
BOOLEAN NEWSTATUS, % RESULT OF INTERROGATE 40339000
OLDSTATUS, % OLD STATUS OF CURRENT VECTOR 40340000
STATUSMASK, % TO MASK OUT UNITS ALREADY NOTED40341000
SAVESTATUS, % USED TO CONTROL READALABEL 40342000
BITWORD; % RELEVANT BIT # IN NEWSTATUS 40343000
LAYOUT BITSETL(BITNO:1~1); 40344000
LABEL FILENOTREADY,ENDOFREADY,SCRATCH,READALABEL2; 40350000
LABEL ENDOFUNIT,HR,PRG,UFU; 40351000
INTEGER STATEUS ; % *** FOR MONITOR ONLY 40352000
MONITOR JACKMONITOR(STATEUS); 40353000
MONITOR BOBMONITOR(NEWSTATUS,OLDSTATUS); 40353010
LABEL L;L:IF SIMULATING THEN BEGIN DISALLOW;SETINTERVALTIMER;PAUSE END; 40354000
STATEUS~STATEUS; % *** FOR MONITOR ONLY 40355000
40356000
VECTORNO~-1; 40357000
WHILE VECTORNO~VECTORNO+1{MAXVECTORNO 40358000
DO 40359000
BEGIN 40360000
OLDSTATUS~OLDSTATUSWORD[VECTORNO]; 40361000
% KLUDGE 40362000
OLDSTATUS~OLDSTATUS OR TRUE; 40363000
STATUSMASK~FALSE; 40364000
SAVESTATUS~BOOLEAN(REAL(NOT FALSE)); 40365000
WHILE REAL((NEWSTATUS~BOOLEAN(SCANIN(0& 40366000
USTATUSWORD(VECTORNO,,,)))OR STATUSMASK)AND SAVESTATUS) 40367000
! REAL(OLDSTATUS) 40368000
DO 40369000
BEGIN 40370000
U~VECTORNO|32+((BITNO~ 40371000
FIRSTONE(REAL(NEWSTATUS EQV NOT OLDSTATUS))-1)-1); 40372000
IF U>MAXUNIT THEN GO TO UFU; 40373000
WHILE BOOLEAN(UNT~READLOCK(1,UNIT[U])) DO; 40374000
40375000
BITWORD~FALSE&BITSETL(); 40376000
IF REAL(NEWSTATUS)<REAL(OLDSTATUS) THEN 40377000
BEGIN %%%%%%%%%%%%%%%%%%%%% UNIT NOT READY 40378000
OLDSTATUS~OLDSTATUS AND NOT BITWORD; 40379000
IF UNT.UNITTYPE=DISKFILE THEN 40380000
BEGIN 40381000
% CALL STEVE 40382000
END; 40383000
IF BOOLEAN(UNT.UNITASSIGNED)THEN 40384000
BEGIN % USER 40385000
IF NOT BOOLEAN(UNT.UINREWIND) THEN 40386000
IF NOT BOOLEAN(UNT.UNITNOTREADY)THEN 40387000
BEGIN 40388000
NOTREADYMSG(UNT);% 40389000
UNT.UNITNOTREADY~1; 40390000
END; 40391000
% CLOSED NO REWIND 40392000
END ELSE 40393000
% NO USER 40394000
BEGIN 40395000
UNT.ULOCKED~0; 40396000
FILENOTREADY: 40397000
UNT.UERRORSTATUSBITS~0; 40398000
UNT.UNITNOTREADY~1; 40399000
IF UINFOW[U].TAG!0 THEN 40400000
BEGIN 40401000
FORGETSPACE(UINFOW[U].ADDRESSF); 40402000
UINFOW[U]~0; 40403000
END; 40404000
END; 40405000
UNIT[U]~UNT; 40406000
STATUSMASK~STATUSMASK AND NOT BITWORD; 40407000
END ELSE 40408000
BEGIN %%%%%%%%%%%%%%%%%%%%% UNIT READY 40409000
OLDSTATUS~OLDSTATUS OR BITWORD; 40410000
UNT.UNITNOTREADY~0; 40411000
40412000
IF BOOLEAN(UNT.UNITASSIGNED) THEN 40413000
BEGIN % USER 40414000
STATUSMASK~STATUSMASK OR BITWORD; 40415000
40416000
UNT.UINREWIND~0; 40417000
UNIT[U]~UNT; 40418000
STARTIO(U); 40419000
GO TO ENDOFUNIT 40420000
END; 40421000
% UNIT NOT ASSIGNED 40422000
IF BOOLEAN(UNT.UINREWIND) THEN 40423000
IF BOOLEAN(UNT.ULOCKED) OR 40424000
BOOLEAN(UNT.USAVED) THEN 40425000
BEGIN 40426000
UNT.UINREWIND~0; 40427000
HR: 40428000
IF BOOLEAN(UNT.USAVED)THEN BITWORD~FALSE; 40429000
GO TO FILENOTREADY 40430000
END ELSE 40431000
IF BOOLEAN(UNT.UTOBEPURGED) THEN 40432000
BEGIN % PURGE THE FILE 40433000
UNT.UINREWIND~0; 40434000
PRG: 40435000
UNT.UTOBEPURGED~1; 40436000
WHILE BOOLEAN(TEMP~READLOCK(1,PRGT)) DO; 40437000
IF TEMP>0 THEN PRGT~TEMP+2 ELSE 40438000
BEGIN 40439000
PRGT~2; 40440000
FORK(PURGIT,U); 40441000
END; 40442000
END ELSE 40443000
BEGIN 40443010
UNT.UINREWIND~0; 40444000
IF BOOLEAN(UNT.ULABELLED) OR 40444010
BOOLEAN(UNT.USCRATCH)THEN GO ENDOFREADY; 40444020
END; 40444030
IF BOOLEAN(UNT.USAVED) THEN GO TO ENDOFREADY; 40445000
IF BOOLEAN(UNT.ULOCKED)THEN GO FILENOTREADY; 40446000
IF BOOLEAN(UNT.UTOBEPURGED)THEN GO TO PRG; 40447000
STATUSMASK~STATUSMASK OR BITWORD; 40448000
CASE UNT.UNITTYPE OF 40449000
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 40450000
BEGIN % NO UNIT 0 40451000
UFU: 40452000
UFUMSG(UNT);% 40453000
OLDSTATUS~OLDSTATUS AND NOT BITWORD; 40454000
STATUSMASK~STATUSMASK AND NOT BITWORD; 40455000
UNT.UNITNOTREADY~0; 40456000
IF U{MAXUNIT THEN UNIT[U]~UNT; 40457000
END; 40458000
BEGIN % DISK FILE 1 40459000
% CALL STEVE 40460000
END; 40461000
BEGIN % SNGL LINE CNTL 2 40462000
% CALL MIKE -- UNIT WENT WRITE READY 40462100
END; 40468000
; % UNASSIGNED 3 40469000
BEGIN % PAPER TAPE RDR 4 40470000
UNT.ULABELLED~1; 40471000
END; 40472000
40473000
40474000
BEGIN % PAPER TAPE PCH 5 40475000
SCRATCH: 40476000
UNT.UERRORSTATUSBITS~0; 40477000
UNT.UNITSTATE~0; 40478000
UNT.USCRATCH~1; 40479000
IF UINFOW[U].TAG!0 THEN 40480000
BEGIN 40481000
FORGETSPACE(UINFOW[U].ADDRESSF); 40482000
UINFOW[U]~0; 40483000
END; 40484000
% CHECK FOR BACKUP MESAGE PENDING 40485000
END; 40486000
40487000
GO TO SCRATCH; % LINE PRINTER I 6 40488000
GO TO SCRATCH; % LINE PRNTER II 7 40489000
40490000
; % UNASSIGNED 8 40491000
BEGIN % CARD READER 9 40492000
UNT.UNITASSIGNED~1; 40493000
UNIT[U]~UNT; 40494000
STATUSMASK~STATUSMASK OR BITWORD; 40495000
FORK(CONTROLCARD,U); 40496000
40497000
40498000
END; 40499000
GO TO SCRATCH; % CARD PUNCH I 10 40500000
GO TO SCRATCH; % CARD PUNCH II 11 40501000
; % UNASSIGNED 12 40502000
BEGIN % MAG TAPE I 13 40503000
TEMP~1; 40504000
READALABEL2: 40505000
WHILE BOOLEAN(NRDLBLP~READLOCK(1,RDLBLP))DO; 40506000
IF ONES(NRDLBLP)}MAXRDLBLP THEN 40507000
BEGIN 40508000
OLDSTATUS~OLDSTATUS AND NOT BITWORD; 40509000
SAVESTATUS~SAVESTATUS&BITSETL(0); 40510000
END ELSE 40511000
BEGIN 40512000
UNT.UERRORSTATUSBITS~0; 40513000
UNT.UNITSTATE~0; 40514000
UNT.UNITASSIGNED~1; 40515000
FORK(READALABEL,0&RDLBL(BITNO~FIRSTONE( 40516000
REAL(NOT BOOLEAN(NRDLBLP)).RF), 40517000
TEMP,U)); 40518000
NRDLBLP~*&BITSETL(); 40519000
END; 40520000