?EXECUTE B65ESP/DISK 00000010140621PK ?STACK=1000 00000020140722PK ?FILE CODE=B65MCP/DISK 00000030140621PK ?DATA CARD 00000080140621PK $ LIST PRT 00000090140724PK 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(, )" 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 OUEUE; 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 OUEUE; 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 OUEUEFULLF= 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