mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-04-28 20:57:48 +00:00
14334 lines
1.2 MiB
14334 lines
1.2 MiB
BEGIN 00000000
|
|
COMMENT MCP LISTING DIRECTORY 00001000
|
|
010000000 INDEPENDENT RUNNER FORWARD DECLARATION 00002000
|
|
020000000 FORWARD PROCEDURE DECLARATION 00003000
|
|
08000000 INITIAL VALUE TABLES 00004000
|
|
08000000 BCL TO EBCEDIC 00005000
|
|
08018000 EBCEDIC TO BCL 00006000
|
|
08084000 TRUTH SETS 00007000
|
|
08106000 POWER OF TEN TABLES 00007100
|
|
08247000 CONTROL CARD 00007200
|
|
09000000 STANDARD QUEUE DECLARATION 00008000
|
|
10000000 GLOBALS 00009000
|
|
10017000 INTERRUPT - EVENT HANDLING GLOBALS 00010000
|
|
10055000 TAG DEFINITION 00011000
|
|
10075000 CONTROL WORD LAYOUTS 00012000
|
|
10252000 REGISTERS DEFINITIONS 00013000
|
|
11000000 STORAGE ALLOCATION GLOBALS 00014000
|
|
12000000 INITIALIZE GLOBALS 00015000
|
|
13000000 INPUT - OUTPUT GLOBALS 00016000
|
|
13056500 VALUE ARRAYS - MCPID,KEYIN GLOSSARIES,ETC. 00016100
|
|
13276000 KEYIN - SPOUT GLOBALS 00017000
|
|
13318000 IOQUE QUEUE DECLARATION 00018000
|
|
13375000 WAITCHANNELQUE QUEUE DECLARATION 00019000
|
|
14000000 DISK MANAGEMENT 00020000
|
|
15000000 GETAREA - FORGET AREA GLOBALS 00021000
|
|
16000000 STANDARD INSERT 00022000
|
|
16016000 STANDARD DELINK 00023000
|
|
17000000 NAMEQUE QUEUE DECLARATION 00024000
|
|
17021000 BLOCKSOFAREAQUE QUEUE DECLARATION 00025000
|
|
17035000 KEYING QUEUE DECLARATION 00026000
|
|
18007000 FILE MANAGEMENT 00027000
|
|
19000000 REPLY MESSAGE 00028000
|
|
20000000 INDEPENDENT RUNNER GLOBALS 00029000
|
|
21140000 READYQ QUEUE DECLARATION 00030000
|
|
21263000 SHEETQ QUEUE DECLARATION 00031000
|
|
21357000 TERMINATEQ QUEUE DECLARATION 00032000
|
|
23000000 DIRECTORY MANAGEMENT 00034000
|
|
24000000 I/0 INTRINSIC DECLARATIONS 00034100
|
|
30000000 GETSPACE / FORGETSPACE 00035000
|
|
31000000 GETAREA / FORGETAREA 00036000
|
|
32000000 INITIALIZE 00037000
|
|
33000000 HARDWAREINTERRUPT 00038000
|
|
33167000 PRESENCEBIT 00039000
|
|
33538000 WHATDOIDO 00040000
|
|
33567000 EVENTHANDLER 00041000
|
|
33763000 SOFTWAREINTERRUPTDEC 00042000
|
|
33855000 HOLD 00043000
|
|
33890000 HOLDINITIALIZE 00044000
|
|
33961000 GETINDEPENDENTRUNNERSTACK 00045000
|
|
33960000 INDEPENDENTRUNNER 00046000
|
|
34051000 RUN 00047000
|
|
34086000 LOADFIXDIRSTACK 00048000
|
|
38000000 CONTROL CARD 00048600
|
|
40000000 INPUT - OUTPUT ROUNTINES 00049000
|
|
40005000 STARTIO 00050000
|
|
40037000 INITIATEIO 00051000
|
|
40075000 IOREQUEST 00052000
|
|
40089000 WAITIO 00053000
|
|
40131000 NEWIO 00054000
|
|
40154000 IOFINISH 00055000
|
|
40316000 STATUS 00056000
|
|
40565000 DISKIO 00057000
|
|
40597000 DISKWAIT 00058000
|
|
44022000 DISPLAY ROUTINES 00059000
|
|
44097000 KEYIN 00060000
|
|
44176000 SPOUT 00061000
|
|
50000000 ERROR ROUTINES 00062000
|
|
50000000 IOERROR 00063000
|
|
55000000 DISK MANAGEMENT 00064000
|
|
55018000 FORGETESPDISK 00066000
|
|
55039000 GETUSERDISK 00067000
|
|
55123000 FORGETUSERDISK 00068000
|
|
58000000 LIBRARY MAINTENANCE 00068900
|
|
59000000 PERIPHERALINITIALIZE 00069000
|
|
60000000 PROGRAM INTRINSICS 00070000
|
|
65000000 ARRAYDEC 00071000
|
|
65174000 BLOCKEXIT 00072000
|
|
65228000 GOTOSOLVER 00073000
|
|
70000000 PROGRAM INPUT- OUTPUT INTRINSICS 00074000
|
|
80000000 SELECTION - PROCESS HANDLING 00075000
|
|
80361000 INITIATE 00076000
|
|
80519000 SELECTION 00077000
|
|
80600000 TERMINATE 00077200
|
|
99000000 MONITOR 00078000
|
|
99970000 MCP OUTER BLOCK 00079000
|
|
; 00999999
|
|
COMMENT FOLLOWING ARE FORWARD DECLARATIONS FOR PROCEDURES CAPABLE OF 01000000
|
|
RUNNING AS INDEPENDENT RUNNERS. THE FORWARD DECLARATION FOR 01001000
|
|
A NEW INDEPENDENT RUNNER MUST APPEAR BEFORE THAT FOR STATUS IF 01001500
|
|
IT IS CAPAPABLE OF MULTIPLE REPRESENTATION. AN INDICATOR MAY. 01002000
|
|
BE ASSOCIATED WITH AN INDEPENDENT RUNNER (SEE CROSS FEFERENCE 01002500
|
|
FOR "TERMINATE" AND "TERMINATEINDICATOR" FOR HOW THIS IS 01003000
|
|
EFFECTED). THIS INDICATOR ISNOT NECESSARY TO THE 01003500
|
|
IMPLEMENTATION, HOWEVER IT IS NECESSARY IF INDEPENDENTRUNNER IS01004000
|
|
01004300
|
|
TO RECOGNISE THE NEW RUNNER AS A SPECIAL CASE 01004500
|
|
01004600
|
|
; 01005000
|
|
PROCEDURE CONTROLCARD (PARAMETER); 01006000
|
|
WORD PARAMETER; FORWARD; 01007100
|
|
PROCEDURE READALABEL(LINFO);VALUE LINFO;REAL LINFO;FORWARD; 01007105
|
|
PROCEDURE PURGIT(U);VALUE U;REAL U;FORWARD; 01007107
|
|
PROCEDURE DIRECTORYCOMPLEMENT(ROW); ARRAY ROW[*]; FORWARD; 01007200
|
|
PROCEDURE IRTEST(IND); INTEGER IND; FORWARD; 01008000
|
|
PROCEDURE INITIATE (DUMMY); REAL DUMMY; FORWARD; 01008200
|
|
PROCEDURE IOERROR(RD); REAL RD; FORWARD; 01008500
|
|
01009000
|
|
PROCEDURE STATUS (COUNT); INTEGER COUNT; FORWARD; 01009100
|
|
PROCEDURE KEYIN(COUNT); REAL COUNT; FORWARD; 01009110
|
|
PROCEDURE CONNSOUL(COUNT); REAL COUNT; FORWARD;% 01010000
|
|
PROCEDURE TERMINATE (PARAMETER); REAL PARAMETER ; FORWARD; 01011000
|
|
COMMENT: FOR THOSE OF YOU WHO DON"T KNOW SO, TERMINATE MUST BE THE 01011100
|
|
LAST INDEPENDENTRUNNER DECLARED IN THIS FORWARD LIST. 01011200
|
|
ONE WRITES "FORK(<PROCEDURE ID>, <PARAMETER>)" TO START ONE OF 01011300
|
|
THESE GUYS UP; 01011400
|
|
PROCEDURE WHATDOIDO; FORWARD; 02000000
|
|
PROCEDURE INDEPENDENTRUNNER(INDEX,PAR);VALUE INDEX,PAR;REAL INDEX; 02001000
|
|
WORD PAR; FORWARD; 02002000
|
|
PROCEDURE LOADFIXEDIRSTACK(STACKNO);VALUE STACKNO;INTEGER STACKNO; 02003000
|
|
FORWARD; 02004000
|
|
SAVE INTEGER PROCEDURE TRACE = (0,19) ( TRACTER ) ; 02005000
|
|
VALUE TRACTER; INTEGER TRACTER; FORWARD; 02006000
|
|
SAVE REAL PROCEDURE GETSPACE (SIZE, WHOFOR, TYPE, ADDRESS); 02007000
|
|
VALUE SIZE, WHOFOR, TYPE, ADDRESS; 02008000
|
|
INTEGER SIZE, WHOFOR, TYPE; 02009000
|
|
REAL ADDRESS; FORWARD; 02010000
|
|
SAVE INTEGER PROCEDURE FORGETSPACE (ADDRESS); 02011000
|
|
VALUE ADDRESS; INTEGER ADDRESS; FORWARD; 02012000
|
|
SAVE PROCEDURE OVERLAY (ADDRESS); VALUE ADDRESS;INTEGER ADDRESS;FORWARD;02013000
|
|
REAL PROCEDURE DIRECTORYSEARCH(POINT, CODE, LLOCK); 02016100
|
|
VALUE POINT, CODE, LLOCK; 02016200
|
|
POINTER POINT; 02016300
|
|
REAL CODE; 02016400
|
|
BOOLEAN LLOCK; FORWARD; 02016500
|
|
SAVE PROCEDURE IOFINISH(MPXINDEX); VALUE MPXINDEX; 02017000
|
|
INTEGER MPXINDEX; FORWARD; 02018000
|
|
PROCEDURE FINISHOFFIO(IOCB); VALUE IOCB; REFERENCE IOCB; FORWARD;02019000
|
|
PROCEDURE FINISHOFFIO(IOCB); VALUE IOCB; REFERENCE IOCB; ; COMMENT * * ;02020000
|
|
SAVE 02020998
|
|
PROCEDURE SPOUT(IOCB,U);VALUE IOCB,U;REAL U;REFERENCE IOCB;FORWARD; 02021000
|
|
PROCEDURE MESSER(W,INFO);VALUE W,INFO;REAL W;WORD INFO;FORWARD;% 02021100
|
|
PROCEDURE MIXPRINT(BUF);ARRAY BUF[*]; FORWARD;% 02022000
|
|
BOOLEAN PROCEDURE JULIT(P);POINTER P; FORWARD; 02022300
|
|
PROCEDURE DATIT(P); POINTER P; FORWARD;% 02022400
|
|
REAL PROCEDURE CURRENTTIME; FORWARD; 02022500
|
|
PROCEDURE CHANLOUT(I,BUFF);VALUE I;REAL I;ARRAY BUFF[*];FORWARD; 02022600
|
|
SAVE PROCEDURE CONNQUEST(UNIT); VALUE UNIT; REAL UNIT; FORWARD; 02023000
|
|
SAVE PROCEDURE UNEXPIOERROR(IOCB,IOERRORMASK); 02024000
|
|
VALUE IOCB,IOERRORMASK; 02025000
|
|
REFERENCE IOCB; 02026000
|
|
REAL IOERRORMASK; ; COMMENT * * * * * * * * ** ; 02027000
|
|
SAVE REAL PROCEDURE WAITIO(AREA, USER, IOMASK); 02030000
|
|
VALUE USER, IOMASK; 02031000
|
|
ARRAY AREA[*]; 02032000
|
|
REAL USER, IOMASK; 02033000
|
|
FORWARD; 02034000
|
|
SAVE PROCEDURE IOREQUEST(IOCB);VALUE IOCB;REFERENCE IOCB;FORWARD; 02034100
|
|
SAVE REFERENCE PROCEDURE DISKIO(CORE,INDEX,SIZE,DISK,MASK,DISKIOEVNT); 02035000
|
|
VALUE INDEX,SIZE,DISK,MASK; 02036000
|
|
INTEGER INDEX,SIZE,DISK,MASK; 02037000
|
|
ARRAY CORE [*]; 02038000
|
|
EVENT DISKIOEVNT ; FORWARD; 02039000
|
|
SAVE PROCEDURE DISKWAIT(CORE,INDEX,SIZE,DISK,MASK); 02040000
|
|
VALUE INDEX,SIZE,DISK,MASK; 02041000
|
|
INTEGER INDEX,SIZE,DISK,MASK; 02042000
|
|
ARRAY CORE[*]; 02043000
|
|
FORWARD; 02044000
|
|
PROCEDURE HARDWAREINTERRUPT(P1,P2); VALUE P1,P2; 02045000
|
|
INTEGER P1; WORD P2; FORWARD; 02046000
|
|
WORD HARDWAREINTERRUPTPCW = HARDWAREINTERRUPT; 02046100
|
|
WORD D03 = (0, 3); 02046200
|
|
SAVE PROCEDURE HOLDINITIALISE; FORWARD; 02047000
|
|
SAVE PROCEDURE PERIPHERALINITIALIZE; FORWARD; 02048000
|
|
REAL MCPDISKBASE = PERIPHERALINITIALIZE; COMMENT ADDRESS OF MCP DISK; 02049000
|
|
SAVE PROCEDURE INITIALIZE(P1, P2); 02050000
|
|
VALUE P1; 02051000
|
|
INTEGER P1; 02052000
|
|
WORD P2; FORWARD; 02053000
|
|
REAL MAXCHANNELS = INITIALIZE; COMMENT THE NUMBER OF MULTIPLEXORS; 02054000
|
|
BOOLEAN MAXMPX = MAXCHANNELS; 02055000
|
|
WORD INITIALIZEPCW = INITIALIZE; 02055100
|
|
SAVE INTEGER PROCEDURE GETAREA(SIZE); VALUE SIZE; INTEGER SIZE; FORWARD;02057000
|
|
SAVE PROCEDURE FORGETAREA(SIZE,ADDRESS); VALUE SIZE,ADDRESS; 02058000
|
|
INTEGER SIZE,ADDRESS; FORWARD; 02059000
|
|
PROCEDURE UPDATEUNITBITSTABLE(TABLENAME,U); VALUE U; 02060000
|
|
INTEGER U; 02061000
|
|
BOOLEAN ARRAY TABLENAME[*]; FORWARD; 02062000
|
|
PROCEDURE EVENTHANDLER = (0,15) (THEEVENT,EVENTWORD1,WAITFLAG); 02063000
|
|
VALUE EVENTWORD1,WAITFLAG; 02064000
|
|
WORD THEEVENT,EVENTWORD1; 02065000
|
|
BOOLEAN WAITFLAG; FORWARD; 02066000
|
|
WORD PROCEDURE SOFTWAREINTERRUPTDEC = (0,14) (THEEVENT,EVENTWORD1, 02067000
|
|
EVENTWORD2,KLUDGE,PCWPOINTER); 02068000
|
|
VALUE EVENTWORD1,EVENTWORD2,PCWPOINTER,KLUDGE; 02069000
|
|
WORD THEEVENT,EVENTWORD1,EVENTWORD2,PCWPOINTER,KLUDGE; 02070000
|
|
FORWARD; 02071000
|
|
DEFINE INTERLOCK = EVENT # 02071100
|
|
, PROCURE(L0CK) = GAOLER(L0CK, FALSE) # 02071200
|
|
, LIBERATE(L0CK) = GAOLER(L0CK, 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 ALLOCATENAMEQ; FORWARD; 02101000
|
|
SAVE BOOLEAN PROCEDURE TURNOVERLAYKEY (ADDRESSOFMOM); 02102000
|
|
VALUE ADDRESSOFMOM; 02103000
|
|
INTEGER ADDRESSOFMOM; FORWARD; 02104000
|
|
SAVE PROCEDURE MAKEPRESENTANDSAVE (DATA); 02104100
|
|
WORD ARRAY DATA [*]; FORWARD; 02104200
|
|
PROCEDURE LIBMAIN(MFID);VALUE MFID;POINTER MFID;FORWARD; 02105000
|
|
SAVE INTEGER PROCEDURE CONSOLIDATEANDORDER(ADDRESS); 02109000
|
|
VALUE ADDRESS; 02110000
|
|
INTEGER ADDRESS; FORWARD; 02111000
|
|
PROCEDURE OPEN=(0,31)(FIB,TYPEV);VALUE TYPEV;ARRAY FIB[*];REAL TYPEV; 02111100
|
|
FORWARD; 02111200
|
|
PROCEDURE GOTOSOLVER = (0,11) (SIRW); VALUE SIRW; REAL SIRW; FORWARD; 02112000
|
|
REAL PROCEDURE FINDINPUT(LEB,CODE);VALUE CODE;INTEGER CODE;ARRAY LEB[*];02112010
|
|
FORWARD; 02112020
|
|
SAVE 02113000
|
|
WORD PROCEDURE MON1TOR (A, V); VALUE A, V; REAL A; WORD V; FORWARD; 02114000
|
|
INTEGER PROCEDURE VECTORINSERT(READYINDICATOR,NEWENTRY); 02115000
|
|
VALUE READYINDICATOR 02116000
|
|
, NEWENTRY 02117000
|
|
; 02118000
|
|
REAL READYINDICATOR 02119000
|
|
; 02120000
|
|
WORD NEWENTRY 02121000
|
|
; FORWARD; 02122000
|
|
PROCEDURE STACKQREARRANGE(READYINDICATOR) ; 02123000
|
|
VALUE READYINDICATOR 02124000
|
|
; 02125000
|
|
BOOLEAN READYINDICATOR 02126000
|
|
; FORWARD; 02127000
|
|
PROCEDURE STACKQREMOVE (PATH,STACKINDICATOR); 02128000
|
|
VALUE PATH 02129000
|
|
, STACKINDICATOR 02130000
|
|
; 02131000
|
|
REAL PATH 02132000
|
|
; 02133000
|
|
INTEGER STACKINDICATOR 02134000
|
|
; FORWARD; 02135000
|
|
PROCEDURE INSERTINQUEUE (PATH,STACKINDICATOR); 02136000
|
|
VALUE PATH 02137000
|
|
, STACKINDICATOR 02138000
|
|
; 02139000
|
|
REAL PATH 02140000
|
|
, STACKINDICATOR 02141000
|
|
; FORWARD; 02142000
|
|
INTEGER PROCEDURE GETINDEPENDENTRUNNERSTACK(STAKADRES);REAL STAKADRES; 02143000
|
|
FORWARD; 02144000
|
|
02145000
|
|
02146000
|
|
PROCEDURE NEXTPROCESS; FORWARD; 02147000
|
|
INTEGER PROCEDURE NEXTINSCHEDULE; FORWARD; 02148000
|
|
02149000
|
|
02150000
|
|
02151000
|
|
PROCEDURE SELECTION; FORWARD; 02152000
|
|
PROCEDURE RUN (PARAMETER,PROCEEDURE); 02153000
|
|
VALUE PARAMETER 02154000
|
|
; 02155000
|
|
WORD PARAMETER 02156000
|
|
; 02157000
|
|
PROCEDURE PROCEEDURE 02158000
|
|
; FORWARD; 02159000
|
|
WORD RUNPCW = RUN; COMMENT USED BY INDEPENDENTRUNNER MECHANISM; 02160000
|
|
PROCEDURE STANDARDINSERT(FIRSTENTRY,LASTENTRY,ENTRY); 02161000
|
|
VALUE ENTRY; 02162000
|
|
REFERENCE FIRSTENTRY,LASTENTRY,ENTRY; FORWARD; 02163000
|
|
PROCEDURE STANDARDDELINK(FIRSTENTRY,LASTENTRY,ENTRY); 02164000
|
|
VALUE ENTRY; 02165000
|
|
REFERENCE FIRSTENTRY,LASTENTRY,ENTRY; FORWARD; 02166000
|
|
SAVE PROCEDURE QUEUEMYSTACK (AUTHORITY, REQUIRED, COUNT, MYEVENT, HEAD);02167000
|
|
VALUE AUTHORITY, COMMENT THE SORTKEY FOR THIS QUEUE; 02168000
|
|
REQUIRED, COMMENT AN ADDITIONAL INFORMATION WORD FOR THE 02169000
|
|
QUEUE ENTRY; 02170000
|
|
COUNT; COMMENT A 10 BIT COUNTER IN THE STACK LINK 02171000
|
|
WORD FOR THIS QUEUE; 02172000
|
|
EVENT MYEVENT; COMMENT THE LOCAL EVENT MY STACK IS TO WAIT ON;02172500
|
|
INTEGER COUNT; 02172550
|
|
REAL AUTHORITY, 02172600
|
|
REQUIRED, 02172700
|
|
HEAD ; COMMENT A GLOBAL REAL THAT CONTAINS THE BACK- 02173000
|
|
WARD AND FORWARD LINKS FOR THE QUEUE. THE BACK 02174000
|
|
WARD LINK POINTS TO THE ENTRY WITH THE HIGHEST 02175000
|
|
AUTHORITY; FORWARD; 02176000
|
|
PROCEDURE DELINKASTACK (WHOSE, HEAD); 02177000
|
|
VALUE WHOSE; 02178000
|
|
INTEGER WHOSE; COMMENT THE AUTHORITY TYPE STACK TO DELINK; 02179000
|
|
REAL HEAD ; COMMENT THE HEAD OF THE AUTHORITY TYPE STACK; 02180000
|
|
FORWARD; 02181000
|
|
PROCEDURE PARAMETERINSERT (FIRSTPARAM, LASTPARAM, ENTRY); 02182000
|
|
VALUE ENTRY; 02183000
|
|
REFERENCE FIRSTPARAM, LASTPARAM, ENTRY; FORWARD; 02184000
|
|
BOOLEAN SIMULATING = (0,12); % TRUE FOR SIMULATOR RUN 02560000
|
|
VALUE ARRAY BCLTOEBC = (0,33) ~ ( 08000000
|
|
4"F0F1F2F3" 08001000
|
|
, 4"F4F5F6F7" 08002000
|
|
, 4"F8F97B7C" 08003000
|
|
, 4"6F7A6E69" 08004000
|
|
, 4"4EC1C2C3" 08005000
|
|
, 4"C4C5C6C7" 08006000
|
|
, 4"C8C94B70" 08007000
|
|
, 4"504D4C48" 08008000
|
|
, 4"00D1D2D3" 08009000
|
|
, 4"D4D5D6D7" 08010000
|
|
, 4"D8D95B5C" 08011000
|
|
, 4"605D5E49" 08012000
|
|
, 4"4061E2E3" 08013000
|
|
, 4"E4E5E6E7" 08014000
|
|
, 4"E8E96B6C" 08015000
|
|
, 4"597E6A7F" 08016000
|
|
); 08017000
|
|
VALUE ARRAY EBCTOBCL = (0,34) ~ ( 08018000
|
|
4"0C0C0C0C" 08019000
|
|
, 4"0C0C0C0C" 08020000
|
|
, 4"0C0C0C0C" 08021000
|
|
, 4"0C0C0C0C" 08022000
|
|
, 4"0C0C0C0C" 08023000
|
|
, 4"0C0C0C0C" 08024000
|
|
, 4"0C0C0C0C" 08025000
|
|
, 4"0C0C0C0C" 08026000
|
|
, 4"0C0C0C0C" 08027000
|
|
, 4"0C0C0C0C" 08028000
|
|
, 4"0C0C0C0C" 08029000
|
|
, 4"0C0C0C0C" 08030000
|
|
, 4"0C0C0C0C" 08031000
|
|
, 4"0C0C0C0C" 08032000
|
|
, 4"0C0C0C0C" 08033000
|
|
, 4"0C0C0C0C" 08034000
|
|
, 4"300C0C0C" 08035000
|
|
, 4"0C0C0C0C" 08036000
|
|
, 4"1F2F0C1A" 08037000
|
|
, 4"1E1D100C" 08038000
|
|
, 4"1C0C0C0C" 08039000
|
|
, 4"0C0C0C0C" 08040000
|
|
, 4"0C3C0C2A" 08041000
|
|
, 4"2B202E0C" 08042000
|
|
, 4"2C310C0C" 08043000
|
|
, 4"0C0C0C0C" 08044000
|
|
, 4"0C0F3E3A" 08045000
|
|
, 4"3B0C0E0C" 08046000
|
|
, 4"1B0C0C0C" 08047000
|
|
, 4"0C0C0C0C" 08048000
|
|
, 4"0C0C0D0A" 08049000
|
|
, 4"0B0C3D3F" 08050000
|
|
, 4"0C0C0C0C" 08051000
|
|
, 4"0C0C0C0C" 08052000
|
|
, 4"0C0C0C0C" 08053000
|
|
, 4"0C0C0C0C" 08054000
|
|
, 4"0C0C0C0C" 08055000
|
|
, 4"0C0C0C0C" 08056000
|
|
, 4"0C0C0C0C" 08057000
|
|
, 4"0C0C0C0C" 08058000
|
|
, 4"0C0C0C0C" 08059000
|
|
, 4"0C0C0C0C" 08060000
|
|
, 4"0C0C0C0C" 08061000
|
|
, 4"0C0C0C0C" 08062000
|
|
, 4"0C0C0C0C" 08063000
|
|
, 4"0C0C0C0C" 08064000
|
|
, 4"0C0C0C0C" 08065000
|
|
, 4"0C0C0C0C" 08066000
|
|
, 4"0C111213" 08067000
|
|
, 4"14151617" 08068000
|
|
, 4"18190C0C" 08069000
|
|
, 4"0C0C0C0C" 08070000
|
|
, 4"0C212223" 08071000
|
|
, 4"24252627" 08072000
|
|
, 4"28290C0C" 08073000
|
|
, 4"0C0C0C0C" 08074000
|
|
, 4"0C0C3233" 08075000
|
|
, 4"34353637" 08076000
|
|
, 4"38390C0C" 08077000
|
|
, 4"0C0C0C0C" 08078000
|
|
, 4"00010203" 08079000
|
|
, 4"04050607" 08080000
|
|
, 4"08090C0C" 08081000
|
|
, 4"0C0C0C0C" 08082000
|
|
); 08083000
|
|
SAVE VALUE ARRAY FOURBITSTUFF = (0,39) ~ ( 08083100
|
|
4"00010203", 4"04050607", 4"08091112", 4"13141516", 08083200
|
|
8"0123", 8"4567", 8"89AB", 8"CDEF" ); 08083300
|
|
DEFINE HEXTOBCL = FOURBITSTUFF[0]#, 08083400
|
|
HEXTOEBC = FOURBITSTUFF[4]#; 08083500
|
|
VALUE ARRAY TRUTHSETS = (0,38) ~ ( 08084000
|
|
6(0) % EBCDIC ALPHA-NUMERIC 08085000
|
|
, 4"7FC07FC0" % EBCDIC ALPHA-NUMERIC 08086000
|
|
, 4"3FC0FFC0" % EBCDIC ALPHA-NUMERIC 08087000
|
|
, 6(0) % EBCDIC ALPHABETIC 08088000
|
|
, 4"7FC07FC0" % EBCDIC ALPHABETIC 08089000
|
|
, 4"3FC00000" % EBCDIC ALPHABETIC 08090000
|
|
, 7(0) % EBCDIC NUMERIC 08091000
|
|
, 4"0000FFC0" % EBCDIC NUMERIC 08092000
|
|
, 4"FFC07FC0" % BCL ALPHA NUMERIC 08093000
|
|
, 4"7FC03FC0" % BCL ALPHA NUMERIC 08094000
|
|
, 4"00007FC0" % BCL ALPHABETIC 08095000
|
|
, 4"7FC03FC0" % BCL ALPHABETIC 08096000
|
|
, 4"FFC00000" % BCL NUMERIC 08097000
|
|
, 0 % BCL NUMERIC 08098000
|
|
, 2(0) % EBCDIC SPECIAL CHARACTERS 08098100
|
|
, 4"803F803F" % EBCDIC SPECIAL CHARACTERS 08098200
|
|
, 4"C03F007F" % EBCDIC SPECIAL CHARACTERS 08098300
|
|
, 0 % EBCDIC SPECIAL CHARACTERS 08098400
|
|
, 4"40000000" % EBCDIC SPECIAL CHARACTERS 08098500
|
|
, 4"80008000" % EBCDIC SPECIAL CHARACTERS 08098600
|
|
, 4"C0000000" % EBCDIC SPECIAL CHARACTERS 08098700
|
|
); 08099000
|
|
DEFINE EBCDICALPHANUMERIC = TRUTHSETS[00] #, 08100000
|
|
EBCDICALPHABETIC = TRUTHSETS[08] #, 08101000
|
|
EBCDICNUMERIC = TRUTHSETS[16] #, 08102000
|
|
BCLALPHANUMERIC = TRUTHSETS[24] #, 08103000
|
|
BCLALPHABETIC = TRUTHSETS[26] #, 08104000
|
|
BCLNUMERIC = TRUTHSETS[28]#, 08105000
|
|
EBCDICSPECIALS = TRUTHSETS[30]#, 08105100
|
|
ENDTRUTHSETS=0#;% 08105990
|
|
COMMENT THESE ARE THE 6500 POWERS OF TEN TABLES. 08106000
|
|
10*I=POTL[I.[05:06]]|POTM[I.[11:06])|POTH[I.[14:03]]. 08106500
|
|
THE VALUES ARE ALL DOUBLE PRECISION AND ARE ALL --TRUNCATED--. THE 08107000
|
|
FLAG-BIT OF THE MOST-SIGNIFICANT WORD IS THE FIRST BIT DROPPED 08107500
|
|
(FIRST BIT AFTER THE PERCENT). ALL VALUES WERE CALCULATED TO FULL 08108000
|
|
SIGNIFICANCE (I.E., AS INTEGERS), THEN CHOPPED TO 78 BITS.; 08108500
|
|
08109000
|
|
DOUBLE VALUE ARRAY POTL 08109500
|
|
08110000
|
|
~(3"1141000000000000",3"0000000000000000", % =@0000008110500
|
|
3"1131200000000000",3"0000000000000000", % =@0000108111000
|
|
3"1121440000000000",3"0000000000000000", % =@0000208111500
|
|
3"1111750000000000",3"0000000000000000", % =@0000308112000
|
|
3"1102342000000000",3"0000000000000000", % =@0000408112500
|
|
3"1073032400000000",3"0000000000000000", % =@0000508113000
|
|
3"1063641100000000",3"0000000000000000", % =@0000608113500
|
|
3"1054611320000000",3"0000000000000000", % =@0000708114000
|
|
3"1045753604000000",3"0000000000000000", % =@0000808114500
|
|
3"1037346545000000",3"0000000000000000", % =@0000908115000
|
|
3"1011124027620000",3"0000000000000000", % =@0001008115500
|
|
3"0001351035564000",3"0000000000000000", % =@0001108116000
|
|
3"0011643245121000",3"0000000000000000", % =@0001208116500
|
|
3"0022214116345200",3"0000000000000000", % =@0001308117000
|
|
3"0032657142036440",3"0000000000000000", % =@0001408117500
|
|
3"0043432772446150",3"0000000000000000", % =@0001308118000
|
|
3"0054341571157602",3"0000000000000000", % =@0001608118500
|
|
3"0065432127413542",3"0004000000000000", % =@0001708119000
|
|
3"0076740555316473",3"0001000000000000", % =@0001808119500
|
|
3"0111053071060221",3"0001720000000000", % =@0001908120000
|
|
3"0121265707274265",3"0004304000000000", % =@0002008120500
|
|
3"0131543271153342",3"0007365000000000", % =@0002108121000
|
|
3"0142074147406233",3"0005262200000000", % =@0002208121500
|
|
3"0152513201307702",3"0004536640000000", % =@0002308122000
|
|
3"0163236041571663",3"0001666410000000", %0 =@0002408122500
|
|
3"0174105452130240",3"0000244112000000", %00 =@0002508123000
|
|
3"0205126764556310",3"0000315134400000", %000 =@0002608123500
|
|
3"0216354561711772",3"0000400363500000", %0000 =@0002708124000
|
|
3"0231004771627437",3"0000450046042000", %000000 =@0002808124500
|
|
3"0241206170175346",3"0006562057453400", %0000000 =@0002908125000
|
|
3"0251447626234640",3"0004316473365100", %00000000 =@0003008125500
|
|
3"0261761573704010",3"0005402212262320", %000000000 =@0003108126000
|
|
3"0272356132665012",3"0006702654737004", %0000000000 =@0003208126500
|
|
3"0303051561442215",3"0004463430126605", %00000000000 =@0003308127000
|
|
3"0313664115752660",3"0007600336154346", %200000000000 =@0003408127500
|
|
3"4324641141345435",3"0001540425607437", %6400000000000 =@0003508128000
|
|
3"4336011371636744",3"0004070533151347", %6100000000000 =@0003608128500
|
|
3"4347413670206535",3"0005106662003641", %5520000000000 =@0003708129000
|
|
3"0361131664625026",3"0005033043640461", %2104400000000 =@0003808129500
|
|
3"4371360241772234",3"0002241654610575", %4525500000000 =@0003908130000
|
|
3"4401654312370703",3"0002712227752734", %7653020000000 =@0004008130500
|
|
3"0412227375067064",3"0001474675745524", %1625624000000 =@0004108131000
|
|
3"0422675274304701",3"0002014055337051", %2173171000000 =@0004208131500
|
|
3"4433454553366061",3"0004417070626663", %4632027200000 =@0004308132000
|
|
3"4444367706263475",3"0007522706774440", %4000435040000 =@0004408132500
|
|
3"4455465667740415",3"0003347470573550", %5000544250000 =@0004508133000
|
|
3"4467003245730520",3"0006361406732502", %6200675322000 =@0004608133500
|
|
3"0501060411731664",3"0005005571052122", %3364105460640 =@0004708134000
|
|
3"0511274514320241",3"0006207127264547", %0261126775010 =@0004808134500
|
|
3"4521553637404312",3"0001650755141700", %6335354574212 =@0004908135000
|
|
3"0532106607305374",3"0006223150372261", %0024647733254 =@0005008135500
|
|
3"0542530351166673",3"0007670002470735", %2032021722127 =@0005108136000
|
|
3"4553256443424452",3"0007646003207124", %4440426306555 =@0005208136500
|
|
3"4564132154331565",3"0005617404050751", %5550533770310 =@0005308137000
|
|
3"0575160607420123",3"0001163305063144", %1102662766373 =@0005408137500
|
|
3"0606414751324147",3"0007420166277775", %1323437564071 =@0005508138000
|
|
3"4621012014361120",3"0001732422375777", %4361034752111 =@0005608138500
|
|
3"0631214417455344",3"0002321127075377", %3455244144533 =@0005708139000
|
|
3"0641457523370635",3"0003005354714677", %2370515175662 =@0005808139500
|
|
3"0651773450267004",3"0005606650100057", %1066640435236 =@0005908140000
|
|
3"4662372362344605",3"0007150422120072", %7304410544506 =@0006008140500
|
|
3"4673071057035747",3"0003002526544111", %5165512675627 =@0006108141000
|
|
3"0703707272645341",3"0001603254275134", %0423035455175 =@0006208141500
|
|
3"0714671151416631",3"0004144127354363");%0527644770435 =@0006308142000
|
|
DOUBLE VALUE ARRAY POTM 08142500
|
|
08143000
|
|
~(3"1141000000000000",3"0000000000000000", % =@0000008143500
|
|
3"4726047403722377",3"0007175154247457", %6655616166544 =@0006408144000
|
|
3"4014473510762300",3"0023514315770633", %6315541553040 =@0012808144500
|
|
3"0103403417361516",3"0032235253250267", %3704517643661 =@0019208145000
|
|
3"0172523756577347",3"0043747364335667", %3440156307756 =@0025608145500
|
|
3"0262014102745174",3"0055463433536324", %1053014006506 =@0032008146000
|
|
3"0351423057061025",3"0066761250270402", %3777752636047 =@0038408146500
|
|
3"4441125722256075",3"0073757717235176", %5234420343164 =@0044808147000
|
|
3"0527061464053523",3"0100164434331431", %2561245705013 =@0051208147500
|
|
3"4615310177342265",3"0115474537630672", %7473770141554 =@0057608148000
|
|
3"0704060636744362",3"0125124721622671", %1262127057024 =@0064008148500
|
|
3"4773070652155207",3"0137074016271665", %5207710607022 =@0070408149000
|
|
3"4062271771625063",3"0152002464306621", %5177450026246 =@0076808149500
|
|
3"0151627122640561",3"0165346774161061", %0506313263060 =@0083208150000
|
|
3"4241272171262634",3"0173653557514160", %5215416216354 =@0089608150500
|
|
3"0331022323162501",3"0205135477216203", %1245320571711 =@0096008151000
|
|
3"0416227316541500",3"0215650301354503", %2364507430552 =@0102408151500
|
|
3"0504620511515514",3"0225724603203653", %0555750424133 =@0108808152000
|
|
3"0573504063603007",3"0230356777015603", %0655471421103 =@0115208152500
|
|
3"0662605010657142",3"0245363441540115", %3421137501315 =@0121608153000
|
|
3"0752061310601672",3"0257025566260413", %3631527002756 =@0128008153500
|
|
3"0041457313355310",3"0276331702015753", %3773670162764 =@0134408154000
|
|
3"4131153323315222",3"0306736070051361", %5040437573377 =@0140808154500
|
|
3"4217264213744524",3"0311675660467444", %4154541753113 =@0147208155000
|
|
3"4305453406516634",3"0326235176210225", %7260732301656 =@0153608155500
|
|
3"0374174156441746",3"0333645413752311", %0303470002531 =@0160008156000
|
|
3"4463162072241271",3"0341737734347416", %7422224407341 =@0166408156500
|
|
3"0552345400577533",3"0356011231622714", %1525032050036 =@0172808157000
|
|
3"0641670156730222",3"0362225342141324", %0160746354415 =@0179208157500
|
|
3"4731323261527331",3"0372522515457463", %6343655705733 =@0185608158000
|
|
3"4021045371360351",3"0413414001145703", %5702156731116 =@0192008158500
|
|
3"4106413245605716",3"0426047563137443", %5242020310123 =@0198408159000
|
|
3"0174750547327342",3"0434752736224723", %2243161451531 =@0204808159500
|
|
3"4263606774750311",3"0446764211226705", %4547637466166 =@0211208160000
|
|
3"4352667652055261",3"0454023267541401", %7377467717610 =@0217608160500
|
|
3"4442127774503364",3"0463742052221706", %4122154367526 =@0224008161000
|
|
3"0531514561003110",3"0471751001571765", %0310004020172 =@0230408161500
|
|
3"4621201540275231",3"0506473330776521", %5366506221123 =@0236808162000
|
|
3"0707473511634104",3"0517004116002775", %1152751023607 =@0243208162500
|
|
3"4775622261444010",3"0521205705141406", %7655434075660 =@0249608163000
|
|
3"4064312252460020",3"0542417412313577", %5502311046401 =@0256008163500
|
|
3"0153255351072377",3"0556751574341722", %1215026472552 =@0262408164000
|
|
3"4242422450716472",3"0565704017717023", %6360057144043 =@0268808164500
|
|
3"4331732353517622",3"0577535625522740", %5134162537656 =@0275208165000
|
|
3"0421355270251523",3"0603662737142310", %0207247354427 =@0281608165500
|
|
3"0511071176733572",3"0613704412666424", %2133176163115 =@0288008166000
|
|
3"0576603323156425",3"0623433740626150", %0550153112134 =@0294408166500
|
|
3"0665103732441040",3"0630015131727227", %3211033421651 =@0300808167000
|
|
3"0753714225644566",3"0641055324257642", %0430466411545 =@0307208167500
|
|
3"4042754362757206",3"0667221753325314", %7312430336457 =@0313608168000
|
|
3"4132177767210373",3"0670275217323337", %7025527435203 =@0320008168500
|
|
3"0221553062356341",3"0707214653450062", %3447603463570 =@0326408169000
|
|
3"0311230607367652",3"0716463771052416", %1546004325010 =@0332808169500
|
|
3"0377707704136465",3"0723164760756106", %3250540305734 =@0339208170000
|
|
3"4465774701726534",3"0732463541673204", %4732427535727 =@0345608170500
|
|
3"0554433204752653",3"0746747152676716", %3707123370534 =@0352008171000
|
|
3"0643352734424257",3"0756237637571265", %2043073016410 =@0358408171500
|
|
3"0732501217041756",3"0762617070716002", %2726527630323 =@0364808172000
|
|
3"0021775736715436",3"1005415273205562", %1025012750314 =@0371208172500
|
|
3"4111410235752271",3"1011076017302041", %6734200515373 =@0377608173000
|
|
3"0201115560167157",3"1025614475554304", %3513554047640 =@0384008173500
|
|
3"4266777643636764",3"1030310431025755", %4146654653371 =@0390408174000
|
|
3"0355242335310112",3"1046512350074012", %0066765167472 =@0396808174500
|
|
3"4444024052516417",3"1051111675276213");%4500576335227 =@0403208175000
|
|
DOUBLE VALUE ARRAY POTH 08175500
|
|
08176000
|
|
~(3"1141000000000000",3"0000000000000000", % =@0000008176500
|
|
3"4533043005100212",3"1064202274654451", %4052376002244 =@0409608177000
|
|
3"4431132435035057",3"2157536204320307", %6050444301372 =@0819208177500
|
|
3"0323470676540576",3"3242655607106551", %3574104722476 =@1228808178000
|
|
3"0221305102507076",3"4331314016653042", %3341046467066 =@1638408178500
|
|
3"4114177702444352",3"5423212615565017", %4553563624050 =@2048008179000
|
|
3"4011502433123006",3"6513114751647704", %4507464541024 =@2457608179500
|
|
3"4705000563145240",3"7575774067453713");%5601112567747 =@2867208180000
|
|
08180500
|
|
COMMENT SKELETON PARAMETER QUEUE ENTRIES FOR COMPILER 08247000
|
|
FILES.; 08248000
|
|
SAVE ARRAY COMPILERCODEFILE ~ ( 08249000
|
|
4"000003000008", 4"010104C3D6C4C500"), 08250000
|
|
COMPILERCARDFILE ~ ( 08251000
|
|
4"000003000008", 4"010104C3C1D9C400"), 08252000
|
|
COMPILERCARDEXTERNAL ~ ( 08253000
|
|
4"000005000015", 4"010112000000", 0, 0, 0); 08254000
|
|
QUEUE STANDARDQUEUE (PREVIOUSSTANDARD, NEXTSTANDARD); 09000000
|
|
VALUE PREVIOUSSTANDARD, NEXTSTANDARD; 09001000
|
|
REFERENCE PREVIOUSSTANDARD, NEXTSTANDARD; 09002000
|
|
COMMENT STANDARDQUEUE EXISTS ONLY TO ESTABLISH THE LOCATION OF ITS09003000
|
|
ITEMS FOR USE BY QUEUEING ALGORITHMS THAT DEAL WITH QUEUES09004000
|
|
THAT ARE ORDERED ON A FIRST IN - FIRST OUT BASIS.; 09005000
|
|
USING LOCKED; 09006000
|
|
INTEGER PBLOK %PRESENCE BIT LOCK 10000000
|
|
, GROSSLOK % LOCK ON INTERRUPTS 10001000
|
|
, PROCESSCHANGELOCK 10002000
|
|
; 10003000
|
|
DEFINE SETOVERFLOWFF = ; # 10004000
|
|
; 10005000
|
|
REAL MULTIPLEREFERENCELOK %FOR PRESENCE BIT 10006000
|
|
; 10007000
|
|
REAL MONITORLOCK; % MONITOR 10008000
|
|
REAL MONITORVALUE = (0,8), 10009000
|
|
MONITORMASK = (0,9); 10010000
|
|
FIELD MONMASKF = 19:10, MONVALF =9:10; 10011000
|
|
DEFINE JACKBIT =2# 10012000
|
|
,RAJBIT =4# 10013000
|
|
,DONBIT = 8# 10014000
|
|
,BOBBIT =16# 10015000
|
|
,STEVEBIT = 32# 10015100
|
|
,MIKEBIT = 64# 10015200
|
|
,GLOBALSTOP = STOP (PDR, PIR)# 10015990
|
|
; 10016000
|
|
COMMENT THE FOLLOWING DEFINES SPECIFY VALUES OF 10017000
|
|
PARAMETERS TO PROCEDURES SUCH AS KILLME, 10018000
|
|
NOTYETCODED AND ARITHMETICFAULT 10019000
|
|
; 10020000
|
|
DEFINE DZ = 1# )"DIVIDE BY ZERO "(10021000
|
|
EO = 2# )"EXPONENT OVERFLOW "(10022000
|
|
EU = 3# )"EXPONENT UNDERFLOW "(10023000
|
|
II = 4# )"INVALID INDEX "(10024000
|
|
IO = 5# )"INTEGER OVERFLOW "(10025000
|
|
GCAINTERRUPT = 6# )"FIRST UNASSIGNED MPX INT"(10026000
|
|
STACKOVER = 7# )"STACK OVERFLOW "(10027000
|
|
SYLLABLEDEPENDENT2 = 8# )"COMPROMISED SYLLABLE DEP"(10028000
|
|
BLOWUP = 9# )"BASE FOR ALARM INTERRUPT"(10029000
|
|
LOOP = 10# )" "(10030000
|
|
MEMPARITY = 11# )" "(10031000
|
|
MPXPARITY = 12# )" "(10032000
|
|
INVALIDADDRESS = 13# )" "(10033000
|
|
STACKUNDER = 14# )"STACK UNDERFLOW "(10034000
|
|
INVALIDOPCODE = 15# )"CODE NOT VALID OPERATOR "(10035000
|
|
MEMPROTECT = 16# )" "(10036000
|
|
INVALIDOP = 17# )"OPERATION ILLEGAL "(10037000
|
|
SEQERROR = 18# )"SEQUENCE ERROR "(10038000
|
|
ML1 = 19# )"INTERUPT ON MULTI-LINE 1"(10039000
|
|
ML2 = 20# )"INTERUPT ON MULTI-LINE 2"(10040000
|
|
ML3 = 21# )" "(10041000
|
|
ML4 = 22# )" "(10042000
|
|
EXTMPX = 23# )"EXTERNAL MPX "(10043000
|
|
UA2 = 24# )"SECND UNASSIGNED MPX INT"(10044000
|
|
UA3 = 25# )"THIRD UNASSIGNED MPX INT"(10045000
|
|
UA4 = 26# )"FORTH UNASSIGNED MPX INT"(10046000
|
|
MACHINEERROR = 27# )"HOPEFULLY "(10047000
|
|
PRTOPR = 28# )"PROCESSOR TO PROCESSOR "(10048000
|
|
STACKBOTTOM = 29# )"BOTTOM OF STACK INT "(10049000
|
|
EVENTLISTERR = 30 # %ERROR IN EVENTIST 10050000
|
|
, INTERRUPTDEC = 31 # %ERROR IN INTERRUPT DEC 10051000
|
|
10052000
|
|
, GROSSLOCK = 64 # % TEMPORARY GROSSLOK STOP 10053000
|
|
; 10054000
|
|
COMMENT FOLLOWING ARE THE VARIOUS VALUES OF THE TAG FIELD; 10055000
|
|
DEFINE SINGL = 0 #, 10056000
|
|
IRW = 1 #, 10057000
|
|
DOUBL = 2 #, 10058000
|
|
MEMLINK = 3 #, 10059000
|
|
CODE = 3 #, 10060000
|
|
SEGDESC = 3 #, 10061000
|
|
MSCW = 3 #, 10062000
|
|
TOS = 3 #, 10063000
|
|
RCW = 3 #, 10064000
|
|
DATADESC = 5 #, 10065000
|
|
STRINGDESC = 5#, 10066000
|
|
UNITAL = 6 #, 10067000
|
|
PCW = 7 # 10068000
|
|
; 10069000
|
|
10070000
|
|
DEFINE SINGLE = SINGL# 10071000
|
|
; 10072000
|
|
FIELD FULLWORD = 47:48 10073000
|
|
; 10074000
|
|
LAYOUT DATADESCRIPTOR ( TAG ~ DATADESC 10075000
|
|
, PBITF = 47:1 %PRESENCE BIT 10076000
|
|
, CBITF = 46:1 %COPY BIT 10077000
|
|
, IBITF = 45:1 %INDEXED BIT 10078000
|
|
, SBITF = 44:1 %SEGMENT BIT 10079000
|
|
, RBITF = 43:1 %READ ONLY BIT 10080000
|
|
, NUF =42:2:=0 %MUST BE ZERO 10081000
|
|
, DBITF = 40:1 %DOUBLE PREC. BIT 10082000
|
|
, LENTHINDEXF=39:20 %LENGTH/INDEX FLD 10083000
|
|
, ADDRESSF = 19:20 %ADDRESS FIELD 10084000
|
|
) 10085000
|
|
, REFERENCED ( PBITF 10086000
|
|
, IBITF 10086100
|
|
, LENTHINDEXF 10087000
|
|
, ADDRESSF 10088000
|
|
) 10089000
|
|
, DESCADDRESS ( ADDRESSF 10090000
|
|
) 10091000
|
|
, STRINGDESCRIPTOR ( TAG ~ STRINGDESC 10092000
|
|
, PBITF 10093000
|
|
, CBITF 10094000
|
|
, IBITF ~ 0 10095000
|
|
, SBITF 10096000
|
|
, RBITF 10097000
|
|
, SZF = 42:3 %CHARACTER SIZE 10098000
|
|
, LENGTHSTF = 39:20 %LENGTH FIELD 10099000
|
|
, ADDRESSF 10100000
|
|
) 10101000
|
|
, INDEXEDSTRINGDESCRIPTOR(TAG ~ STRINGDESC 10102000
|
|
, PBITF 10103000
|
|
, CBITF 10104000
|
|
, IBITF ~ 1 10105000
|
|
, SBITF 10106000
|
|
, RBITF 10107000
|
|
, SZF 10108000
|
|
, BYTEF = 39:4 %BYTE FILED 10109000
|
|
, INDEXSTF = 35:16 %INDEX FILED 10110000
|
|
, ADDRESSF 10111000
|
|
) 10112000
|
|
, SEGMENTDESCRIPTOR( TAG ~ SEGDESC 10113000
|
|
, PBITF 10114000
|
|
, CBITF 10115000
|
|
, DICTIONARYF = 45:1 10116000
|
|
, LOCKBITF = 44:1 10117000
|
|
, LENGTHSEGF 10118000
|
|
, ADDRESSF 10119000
|
|
, SVBITF =19:1 %SAVE BIT FIELD 10120000
|
|
) 10121000
|
|
, SETTAG ( TAG 10122000
|
|
) 10123000
|
|
; 10124000
|
|
DEFINE LENGTHF = LENTHINDEXF #%)CONVENIENT 10125000
|
|
, INDEXF = LENTHINDEXF #%)NOMENCLATUR10126000
|
|
, EBCDIC = 4 # %CHARACTER SIZE AS 10127000
|
|
, BCL = 3 # %PER SZF FIELD IN 10128000
|
|
, DIGIT = 2 # %STRING DESCRIPTOR 10129000
|
|
, TAGZOT(X) = (X) & SETTAG(SINGL) # 10130000
|
|
, DESCRIPTORLOCK =(MOM.DESCRIPTORLOCKF 10130100
|
|
=7 AND KIND = DATADESC) # 10130200
|
|
; 10131000
|
|
FIELD OLAYTYPEF = 18:1 10132000
|
|
10133000
|
|
, FILETYPEF = 18:1 10134000
|
|
, MCPF = 19:1 10135000
|
|
, AITINDICATORF = 17:1 10136000
|
|
, ADDRESF = 16:17 10137000
|
|
, DESCRIPTORLOCKF = 19:3 10137100
|
|
, MCPCODEF =19:2 10138000
|
|
; 10139000
|
|
LAYOUT NOTPRESENTARRAYDESCL( 10139050
|
|
PCBITSF = 47:2 ~0 10139100
|
|
, LENGTHF 10139150
|
|
, MCPCODEF 10139200
|
|
, AITINDICATORF 10139300
|
|
, ADDRESF 10139350
|
|
), 10139400
|
|
ARRAYDESCL ( 10139430
|
|
PCBITSF ~ 2 10139450
|
|
, LENGTHF 10139500
|
|
, ADDRESSF 10139550
|
|
); 10139600
|
|
COMMENT FOLLOWING IS THE FORMAT OF THE NORMAL AND STUFFED IRWS; 10140000
|
|
LAYOUT NORMALIRW ( TAG ~ IRW 10141000
|
|
, EBITF = 46:1 ~ 0 % E BIT 10142000
|
|
, ADRCPLF = 13:14 10143000
|
|
) 10144000
|
|
, STUFFEDIRW ( TAG ~ IRW 10145000
|
|
, EBITF ~ 1 10146000
|
|
, STKNRF = 45:10 10147000
|
|
, DISPF = 35:16 %OF MKST10148000
|
|
, SIRWDELTAF = 12:13 %DELTA 10149000
|
|
) 10150000
|
|
, MARKSTACKCW( TAG ~ MSCW 10151000
|
|
, DSBITF =47:1 10152000
|
|
, EBITF 10153000
|
|
, STKNRF 10154000
|
|
, VBITF = 19:1 10155000
|
|
, LLF = 18:5 10156000
|
|
, DFF = 13:14 10157000
|
|
) 10158000
|
|
, MARKSTACKWD( TAG ~ MSCW 10159000
|
|
, DSBITF 10160000
|
|
, EBITF 10161000
|
|
,STKNRF 10162000
|
|
, DISPFMS = 35:16 10163000
|
|
, VBITF 10164000
|
|
, LLF 10165000
|
|
, DFF 10166000
|
|
) 10167000
|
|
, RETURNCONTROLWORD (TAG ~ RCW 10168000
|
|
, STKNRF 10169000
|
|
, PSRF =35:3 10170000
|
|
, PIRF = 32:13 10171000
|
|
, NCSFF= 19:1 10172000
|
|
, LLF 10173000
|
|
, SDIF = 13:14 10174000
|
|
) 10175000
|
|
, POINTTOIOCB ( LOCKBITF 10176000
|
|
, ADDRESSF 10177000
|
|
) 10178000
|
|
; 10179000
|
|
COMMENT FOLLOWING IS FORMAT OF TOS CONTROL WORD; 10180000
|
|
LAYOUT TOSCW ( TAG ~ TOS 10181000
|
|
, SGNFFF = 47:1 10182000
|
|
, OFFFF = 46:1 10183000
|
|
, TFFFF = 45:1 10184000
|
|
, FLTFF = 44:1 10185000
|
|
, DSF = 39:20 10186000
|
|
, NCSFF 10187000
|
|
, LLF 10188000
|
|
, DF = 13:14 10189000
|
|
) 10190000
|
|
; 10191000
|
|
COMMENT FOLLOWING IS THE FORMAT OF THE FIRST WORD OF AN EVENT; 10192000
|
|
LAYOUT FIRSTEVENTWORD(TAG~DOUBL 10193000
|
|
,COUNTF = 47:27 10194000
|
|
, WAITQHEADF= 18:10 % HEAD WAITQ 10195000
|
|
, WAITQTAILF= 22:10 % TAIL WAITQ 10196000
|
|
, AVAILABLEBITF= 2:1 10197000
|
|
, HAPPENEDBITF = 1:1 10198000
|
|
, EVENTLOCKBITF= 0:1 10199000
|
|
) 10200000
|
|
; 10201000
|
|
FIELD EVENTLINKSF = 22:20 10202000
|
|
; 10203000
|
|
LAYOUT LOKMOM(LOCKBITF,DESCRIPTORLOCKF) 10204000
|
|
, FIXDESC(PBITF,LOCKBITF,ADDRESSF) 10205000
|
|
, SETCOPYBIT(CBITF) 10206000
|
|
; 10207000
|
|
SAVE 10208000
|
|
REAL ARRAY SOFTWAREINTERRUPTMASK[32]%EACH BIT INDICATES WHETHER 10209000
|
|
%THERE ARE ANY SOFTWARE 10210000
|
|
%INTERRUPTS FOR THE CORRES- 10211000
|
|
%PONDING STACK 10212000
|
|
; 10213000
|
|
10214000
|
|
FIELD ENABLEBITF = 46:1 10215000
|
|
, MOD32F = 4:5 10216000
|
|
, DIV32F = 9:5 10217000
|
|
, MOD64F = 5:6 10217010
|
|
, DIV64F = 9:4 10217020
|
|
, D0DISPF = 12:13 10217100
|
|
, D2DISPF = 11:12 10217200
|
|
, D4DISPF = 10:11 10217300
|
|
, D8DISPF = 9:10 10217400
|
|
, D16DISPF = 8:9 10217500
|
|
, D0D1SEGBIT= 13:1 10217600
|
|
, REALSDIF = 12:13 10217700
|
|
; 10218000
|
|
DEFINE MYCOURSEWORD = 20 # 10219000
|
|
, CODEFILEDESC=1# 10220000
|
|
, OLAYFILEDESC=2# 10221000
|
|
; 10222000
|
|
10223000
|
|
10224000
|
|
REAL COUNTFORTIMERINTERRUPTEVENT 10225000
|
|
, NUMBEROFPROCESSORS 10226000
|
|
; 10227000
|
|
BOOLEAN MORETHANONEPROCESSOR 10228000
|
|
; 10229000
|
|
DEFINE IFTHEREISASOFTWAREINTERRUPT = 10230000
|
|
IF BOOLEAN (SOFTWAREINTERRUPTMASK 10231000
|
|
[MYSNR.DIV32F].MOD32F)# 10232000
|
|
, MYCOURSE = STACK[MYSNR,MYCOURSEWORD] # 10233000
|
|
, MYDIVIDEBYZERO(X) = KILLME(WHICH) # 10234000
|
|
, MYEXPONENTUNDERFLOW(X) = KILLME(WHICH) # 10235000
|
|
, MYEXPONENTOVERFLOW(X) = KILLME(WHICH) # 10236000
|
|
, MYINVALIDINDEX(X) = KILLME(WHICH) # 10237000
|
|
, MYINTEGEROVERFLOW(X) = KILLME(WHICH) # 10238000
|
|
; 10239000
|
|
REAL CORESIZE = (0,6) 10240000
|
|
, SOFTWAREINTERRUPTLOCK= (0,17) 10241000
|
|
, INDEPENDENTRUNNERSTACKS 10242000
|
|
; 10243000
|
|
SAVE REFERENCE ARRAY 10244000
|
|
SHEETVECTOR = (0,16) [* ] 10245000
|
|
; 10246000
|
|
SAVE WORD ARRAY 10247000
|
|
SHEETARRAY = SHEETVECTOR[*,*] 10248000
|
|
; 10249000
|
|
SAVE REAL ARRAY 10250000
|
|
SHEETREALS = SHEETVECTOR[*,*] 10250200
|
|
; 10251000
|
|
COMMENT THE FOLLOWING ILLUSTRATE THE METHOD OF ACCESSIN REGISTERS; 10252000
|
|
DEFINE D = REGISTERS # , 10253000
|
|
D0 = D[0] #, 10254000
|
|
D1 = D[1] #, 10255000
|
|
D2 = D[2] #, 10256000
|
|
D3 = D[3] #, 10257000
|
|
D4 = D[4] #, 10258000
|
|
D5 = D[5] #, 10259000
|
|
D6 = D[6] #, 10260000
|
|
D7 = D[7] #, 10261000
|
|
D8 = D[8] #, 10262000
|
|
D9 = D[9] #, 10263000
|
|
D10 = D[10]#, 10264000
|
|
D11 = D[11]#, 10265000
|
|
D12 = D[12]#, 10266000
|
|
D13 = D[13]#, 10267000
|
|
D14 = D[14]#, 10268000
|
|
D15 = D[15]#, 10269000
|
|
D16 = D[16]#, 10270000
|
|
D17 = D[17]#, 10271000
|
|
D18 = D[18]#, 10272000
|
|
D19 = D[19]#, 10273000
|
|
D20 = D[20]#, 10274000
|
|
D21 = D[21]#, 10275000
|
|
D22 = D[22]#, 10276000
|
|
D23 = D[23]#, 10277000
|
|
D24 = D[24]#, 10278000
|
|
D25 = D[25]#, 10279000
|
|
D26 = D[26]#, 10280000
|
|
D27 = D[27]#, 10281000
|
|
D28 = D[28]#, 10282000
|
|
D29 = D[29]#, 10283000
|
|
D30 = D[30]#, 10284000
|
|
D31 = D[31]#, 10285000
|
|
IRSR(X) = REGISTERS[X+32]#, 10286000
|
|
PIR = REGISTERS[32]#, 10287000
|
|
SIR = REGISTERS[33]#, 10288000
|
|
DIR = REGISTERS[34]#, 10289000
|
|
TIR = REGISTERS[35]#, 10290000
|
|
LOSR = REGISTERS[36]#, 10291000
|
|
BOSR = REGISTERS[37]#, 10292000
|
|
F = REGISTERS[38]#, 10293000
|
|
BRSR(X) = REGISTERS[X+48] #, 10294000
|
|
PBR = REGISTERS[48]#, 10295000
|
|
SBR = REGISTERS[49]#, 10296000
|
|
DBR = REGISTERS[50]#, 10297000
|
|
TBR = REGISTERS[51]#, 10298000
|
|
S = REGISTERS[52]#, 10299000
|
|
SNR = REGISTERS[53]#, 10300000
|
|
PDR = REGISTERS[54]# 10301000
|
|
; 10302000
|
|
DEFINE OLAYROWLENTH = 180 # 10303000
|
|
, CODEROWLENTH = 180 # 10304000
|
|
; 10305000
|
|
DEFINE UPTOYOU =0# )"THE MCP DOES AS IT PLEASES "(10306000
|
|
FINISH =1# )"THE MCP MUST D-ES ME "(10307000
|
|
CARRYON =3# )"THE MCP MUST IGNORE INTERRUPT "(10308000
|
|
TELLME =4# )"THE MCP MUST SET SOME FLAGS "(10309000
|
|
SELECT =5# )"ACCESS PCW APPROPRIATE TO INTERUPT"(10310000
|
|
FAULTROUTINE =6# 10311000
|
|
; 10312000
|
|
DEFINE DISABLEOVERLAY = ;# % DUMMY DECLARATION 10313000
|
|
, ENABLEOVERLAY = ;# % DUMMY DECLARATION 10314000
|
|
; 10315000
|
|
PROCEDURE HANDLETHESOFTWAREINTERRUPT;; 10316000
|
|
COMMENT THIS IS A DUMMY PROCEDURE; 10317000
|
|
QUEUE SOFTWAREINTERRUPTQ(Y);REAL Y; 10318000
|
|
COMMENT THIS IS A DUMMY DECLARATION; 10319000
|
|
USING 10320000
|
|
TO INSERT,ENTRY ~ENTRY 10321000
|
|
; 10322000
|
|
DEFINE SETINTERVALTIMER = TIMER(100)#; 10323000
|
|
SAVE PROCEDURE KILLME(KILLVALUE); VALUE KILLVALUE; REAL KILLVALUE; 10324000
|
|
BEGIN 10325000
|
|
MONITOR JACKMONITOR(KILLVALUE); 10326000
|
|
LAYOUT KILLLAYOUT (39:16, 19:20); 10326100
|
|
KILLVALUE~KILLVALUE; 10327000
|
|
STOP (0&KILLLAYOUT (KILLVALUE, PDR), PIR); 10328000
|
|
IF NOT SIMULATING THEN MEMDUMP(0,0); 10328100
|
|
STOP(4"93C838E049E4",4"038038E491C0"); 10328200
|
|
END KILLME; 10329000
|
|
PROCEDURE MYFAULT(W); WORD W;; %DUMMY DEC 10330000
|
|
LAYOUT FIRSTPOINTERWORDL 10982000
|
|
(TOTALINFOWORDSF= 47:16 10983000
|
|
,INFOINDEXF = 31: 8 10984000
|
|
,INFOLENGTHF = 23: 8 10985000
|
|
,INFOTYPEF = 15: 9 10986000
|
|
,ALFALENGTHF = 6: 7 10987000
|
|
,KEYFIELDF = 15:16 10988000
|
|
); 10989000
|
|
COMMENT DEFINES FOR INFOTYPEF AS USED IN PARAMETER QUEUE10990000
|
|
ALGORITHMS. VALUES SHOULD BE GREATER THAN 128 10991000
|
|
AND LESS THAN 511.; 10992000
|
|
DEFINE FILETYPEP = 129#, 10993000
|
|
ENDOFPTYPE= 511#; 10994000
|
|
DEFINE UPDATEWORDCOUNT(NEWWORDS, ENTRY) = 10995000
|
|
REPLACE POINTERTOID@(ENTRY) 10996000
|
|
BY (REAL(POINTERTOID@(ENTRY) , 6) & 10997000
|
|
FIRSTPOINTERWORDL(NEWWORDS)) 10998000
|
|
FOR 6 #, 10999000
|
|
UPDATEINFOINDEX (INFOI, ENTRY) = 10999900
|
|
REPLACE POINTERTOID@(ENTRY) 10999930
|
|
BY (REAL(POINTERTOID@(ENTRY), 6) & 10999960
|
|
FIRSTPOINTERWORDL(*,*,INFOI))FOR 6 ;#;10999990
|
|
COMMENT STORAGE ALLOCATION VARIABLES ***********; 11000000
|
|
INTEGER PREVADDR, COMMENT THE ABSOLUTE ADDRESS FOR AVAILA OF THE 11001000
|
|
LARGEST AVAILABLE AREA NOT FOLLOWING AN OVER- 11002000
|
|
LAYABLE AREA OF MEMORY; 11003000
|
|
AVAILI, COMMENT THE ABSOLUTE ADDRESS OF THE FIRST 11004000
|
|
AVAILABLE LINK.; 11005000
|
|
MINDEX, COMMENT A UTILITY MEMORY INDEX; 11006000
|
|
MLENGTH, COMMENT A UTILITY MEMORY LENGTH; 11007000
|
|
AVAILABLECORE, COMMENT THE AMOUNT OF PRIMARY MEMORY(FRAGMENTED 11007100
|
|
OR OTHERWISE) THAT IS AVAILABLE AT ANY MOMENT; 11007200
|
|
SPACEQHEAD, COMMENT THE STACK THAT CONTAINS THE SUPER 11007300
|
|
SPACE AUTHORITY AND THE LINK TO THE STACK THAT 11007400
|
|
HAS THE SPACE REQUEST WITH THE HIGHEST PRIORITY;11007500
|
|
BACKALLOCATED, COMMENT ABSOLUTE ADDRESS LINKA FOR MOST 11008000
|
|
RECENTLY ALLOCATED AREA.; 11009000
|
|
LEFTOFF, COMMENT ABSOLUTE ADDRESS OF LINKA FOR HEAD OF 11010000
|
|
LEFTOFF LIST.; 11011000
|
|
STOPPER; COMMENT ABSOLUTE ADDRESS OF AVAILA FOR END OF 11012000
|
|
AVAILABLE LIST. BIT 42:1 = 1, I.E. SIZE IS 11013000
|
|
LARGER THAN LARGEST MEMORY POSSIBLE AND THE LINK11014000
|
|
IS ZERO. AVAILB OF STOPPER IS ADDRESS OF LARG- 11015000
|
|
EST AVAILABLE AREA.; 11016000
|
|
REAL SPACELOCK; COMMENT SPACELOCK INSURES THAT ONLY ONE PROC- 11017000
|
|
CESS AT A TIME HAS ACCESS TO MEMORY LINKS. IT 11018000
|
|
IS THEREFORE BUZZED UPON ENTRY TO GETSPACE AND 11019000
|
|
FORGETSPACE AND UNLOCKED BEFORE THESE PROCEDURES11020000
|
|
ARE EXITED.; 11021000
|
|
DEFINE FASTPLACE = BACKWARDLINKF#, 11021100
|
|
SLOWPLACE = FORWARDLINKF #, 11021200
|
|
RETRYCOUNT = SELFIDENTF #, 11021300
|
|
SPACERETRY = 10#; COMMENT THE MAXIMUM NUMBER OF TIMES A 11021400
|
|
SPACE "QUEUE" ENTRY CAN BE IGNORED BECAUSE AN 11021500
|
|
ORDERED SIZE IS NOT ADEQUATE. THE ENTRY MUST BE11021600
|
|
AT THE HEAD OF THE QUEUE BEFORE THE COUNTER IS 11021700
|
|
DECREMENTED.; 11021800
|
|
LAYOUT LINKA COMMENT THE FIRST LINK WORD OF AN IN-USE AREA; 11022000
|
|
(TAG ~ 3, 11023000
|
|
INUSEID = 47:10, COMMENT THE USERS ID FOR THIS AREA ; 11024000
|
|
INUSELENGTH = 37:17, COMMENT A SELF-RELATIVE INDEX FOR 11025000
|
|
FINDING LINKZ FOR THIS AREA. I.E. LENGTH OF 11026000
|
|
AREA + NUMBER OF LINK WORDS; 11027000
|
|
AVAILABLE = 20:1 ~ 0, 11028000
|
|
BACKLINK = 19:20), COMMENT THE LINK TO THE LAST PREVIOUSLY11029000
|
|
ALLOCATED AREA FOR THIS USER; 11030000
|
|
LINKB COMMENT THE SECOND LINK WORD OF AN IN-USE AREA;11031000
|
|
(TAG ~ 3, 11032000
|
|
USAGE = 47:7, COMMENT THE USAGE OF THE AREA; 11033000
|
|
ADDRTYPE = 40:1, COMMENT IS THE ADDRESS OF MOM ABSOLUTE OR11034000
|
|
BOS RELATIVE. 1 IS BOS RELATIVE.; 11035000
|
|
ADDRMOM = 39:20, COMMENT THE ADDRESS OF THE MOM DESCRIPT;11036000
|
|
DISKADDR = 19:20), COMMENT THE DISK ADDRESS OF THE AREA 11037000
|
|
DESCRIBED BY MOM. 19:1 = 1 INDICATES OVERLAY 11038000
|
|
DISK.; 11039000
|
|
LINKC COMMENT THE THIRD LINK WORD OF AN IN-USE AREA; 11040000
|
|
(TAG ~ 3 11041000
|
|
), COMMENT THIS WORD IS RESERVED FOR EXPANSION; 11042000
|
|
LINKZ COMMENT THE FINAL LINK WORD OF AN IN-USE AREA; 11043000
|
|
(TAG ~ 3, 11044000
|
|
OLAY = 47:1, COMMENT THE PERMANENT OVERLAYABLE STATE OF 11045000
|
|
AN AREA. GETSPACE PLACES THE RESULT OF A 11046000
|
|
LOGICAL AND OF THE OERLAY BIT OF ITS TYPE 11047000
|
|
AND ADDRESS (OF MOM)! 0 IN THIS BIT; 11048000
|
|
DELTAWDS = 46:5, 11049000
|
|
FRONTLINK =43:20, COMMENT - CHECK-OUT * * * * * * * 11050000
|
|
FRONTLINK = 41:20, COMMENT THE LINK TO THE NEXT ALLOCATED11051000
|
|
AREA FOR THIS IN-USE ID.; 11052000
|
|
SPACEOLAYLOCK = 21:1, COMMENT IF BIT IS ON AREA IS OVER-11053000
|
|
LAYABLE. GETSPACE TURNS THE BIT OFF AND THE 11054000
|
|
CALLER HAS THE RESPONSIBILITY OF EXCHANGING THE 11055000
|
|
OLAY BIT AND THIS BIT.; 11056000
|
|
AVAILABLE ~ 0, 11057000
|
|
INUSELENGTHZ = 19:20), COMMENT A SELF-RELATIVE INDEX FOR 11058000
|
|
FINDING LINKA OF THIS AREA.; 11059000
|
|
AVAILA COMMENT THE FIRST LINK WORD OF AN AVAILABLE AREA.; 11060000
|
|
(TAG ~ 3, 11061000
|
|
PREOLAY = 41:1, COMMENT THE OLAY BIT OF THE PREVIOUS 11062000
|
|
AREA; 11063000
|
|
LENGTH = 40:20, COMMENT A SELF-RELATIVE INDEX TO AVAILZ 11064000
|
|
OF THIS AREA. LENGTH = WORDS IN AREA + LINKSIZ;11065000
|
|
AVAILABLE ~ 1, 11066000
|
|
LINK = 19:20), COMMENT THE ABSOLUTE ADDRESS OF THE NEXT 11067000
|
|
AVAILABLE AREA; 11068000
|
|
AVAILB COMMENT THE SECOND LINK WORD OF AN AVAILABLE AREA.; 11069000
|
|
(TAG ~ 0, 11070000
|
|
LINKTOPREVIOUSAVAILABLEAREA = 47:48), 11071000
|
|
AVAILZ COMMENT THE FINAL LINK WORD OF AN AVAILABLE AREA.; 11072000
|
|
(TAG ~ 3, 11073000
|
|
AVAILABLE ~ 1, 11074000
|
|
LENGTHZ = 19:20), COMMENT A SELF-RELATIVE INDEX TO FIND 11075000
|
|
AVAILA FOR THIS AREA.; 11076000
|
|
SPACETYPE 11077000
|
|
( 11078000
|
|
PRINTNOMEM = 4:1, COMMENT 1 = PRINT NO MEM MESSAGE; 11079000
|
|
MAKEROOM = 3:1, COMMENT 1 = OVERLAY IF REQUIRED; 11080000
|
|
SLEEPY = 2:1, COMMENT 1 = SLEEP IF MEMORY N/A; 11081000
|
|
11082000
|
|
OERLAY = 0:1), COMMENT 1 = SPACE FOR OVERLAYABLE; 11083000
|
|
LLLUARG 11084000
|
|
(21:1, COMMENT PREVIOUS OVERLAYABILITY; 11085000
|
|
20:20); COMMENT SIZE; 11086000
|
|
DEFINE INITIALIZETOZERO (ADDRESS, LENGTH) = 11087000
|
|
REPLACE POINTER(M[ADDRESS]) BY 0 FOR LENGTH OVERWRITE#; 11088000
|
|
FIELD AVAILKEY = 47:28; COMMENT AVAILA SORT KEY FIELD.; 11089000
|
|
DEFINE LINKSIZE = COMMENT NUMBER OF WORDS IN MEMORY LINKS -1; 11090000
|
|
3#, 11091000
|
|
LINKSIZETIMES2PLUS1 = COMMENT SIZE OF TEMPLINKS ARRAY.; 11092000
|
|
8#; 11093000
|
|
DEFINE PROCSTACKSIZE = 12000000
|
|
512#, 12001000
|
|
COMMENT ARBITRARY - F AND S ARE SET TO 12002000
|
|
SOME ADDRESS IN THE SECOND HALF OF MOD 0 12003000
|
|
UNTIL MORE PERMANENT STACKS CAN BE GOTTEN.;12004000
|
|
12005000
|
|
12006000
|
|
COMMENT THEN NUMBER OF WORDS IN A SHEET ENTRY 12007000
|
|
AND THE NUMBER OF WORDS THAT ARE RESERVED AT THE12008000
|
|
BOTTOM OF A PROCESSES LOWEST LEVEL STACK. ;12009000
|
|
STACKOFLOWSIZE = 12010000
|
|
64 #, 12011000
|
|
COMMENT THE NUMBER OF WORDS THAT ARE RESERVED 12012000
|
|
ABOVE LOSR TO HANDLE STACK OVERFLOWS. ;12013000
|
|
STACKSPERMODULE = 12014000
|
|
32#; 12015000
|
|
COMMENT THE NUMBER OF STACK VECTOR WORDS THAT 12016000
|
|
ARE ALLOCATED FOR EACH PRESENT MEMORY MODULE UP 12017000
|
|
TO THE MAXIMUM OF 1024 STACKS.; 12018000
|
|
INTEGER MAXSTACKS; COMMENT THE MAXIMUM INDEX FOR THE 12019000
|
|
STACK VECTOR.; 12020000
|
|
SAVE WORD ARRAY TEMPLINKS [LINKSIZETIMES2PLUS1]; 12021000
|
|
COMMENT RESERVES SPACE IN LEVEL 0 12022000
|
|
STACK FOR FIRST AVAILABLE 12023000
|
|
AND STOPPER LINKS; 12024000
|
|
ARRAY MEMMODS [64]; COMMENT DURING MEMORY INITIALIZATION EACH12025000
|
|
WORD CONTAINS A ONE IF THE CORRESPONDING 12026000
|
|
MODULE IS PRESENT. AFTER MISSING MODS ARE 12027000
|
|
ACCOUNTED FOR THE ELEMENTS ARE AVAILABLE TO12028000
|
|
BE DEFINED AS VARIOUS LOCAL INITIALIZE 12029000
|
|
VARIABLES. AFTER INITIALIZE THE AREA IS 12030000
|
|
FORGOTTEN AND THE STACK CELL IS AVAILABLE 12031000
|
|
FOR A PERMANENT GLOBAL.; 12032000
|
|
INTEGER PROCSTACKSTART = MEMMODS; 12033000
|
|
WORD PROCSTACKSTARTW= MEMMODS;COMMENT ONLY WAY TO OVERWRITE DESC.;12034000
|
|
REAL SLAVEQUARTERS, COMMENT USED TO LOCK ALL PROCESSORS EX- 12035000
|
|
CEPT THE ONE THAT LOCKS IT UNTIL INITIAL- 12036000
|
|
IZATION HAS THE SITUATION SOMEWHAT UNDER 12037000
|
|
CONTROL; 12038000
|
|
TIMEOUT, COMMENT CONTAINS SOME VALUE OF THE TIME- 12039000
|
|
OF-DAY CLOCK + AN INCREMENT OF TIME THAT IS12040000
|
|
SUFFICIENT TO ALLOW ALL EXPECTED PROCESSORS12041000
|
|
TO GET THEIR STACKS IN TEMPORARY ORDER.; 12042000
|
|
MEMMAX, COMMENT THE MAXIMUM AMOUNT OF AVAILABLE 12043000
|
|
MEMORY.; 12044000
|
|
SAVE1ADDRESS, COMMENT THE ADDRESS OF MEMORY AREA THAT 12045000
|
|
CONTAINS INITIALIZATION CODE AND IS TO BE 12046000
|
|
FORGOTTEN AFTER INITIALIZATION. STACK CELL12047000
|
|
IS AVAILABLE AFTER INITIALIZATION.; 12048000
|
|
PROCMASK = NUMBEROFPROCESSORS; 12049000
|
|
COMMENT A ONE BIT IN THIS WORD IDENTIFIES12050000
|
|
AN AVAILABLE PROCESSOR, THE BITS POSITION 12051000
|
|
IS THE PROCESSOR ID.; 12052000
|
|
BOOLEAN INITSWITCH; COMMENT USED TO CHANGE MPX INTERRUPT TO 12053000
|
|
PTPI INTERRUPT IN INITIALIZE AND 12054000
|
|
TO TELL STORAGE ALLOCATION WHEN A 12054500
|
|
PERMANENT LEFTOFF HEAD IS READY.; 12055000
|
|
LAYOUT SEGTRACEL (STKNRF~1, PIRF, ADDRESSF); 12055500
|
|
SAVE REAL PROCEDURE SEGTRACE(SEGTRACTER);% 12055600
|
|
VALUE SEGTRACTER; REAL SEGTRACTER;% 12055610
|
|
BEGIN 12055620
|
|
IF NOT SIMULATING THEN RETURN(0);% 12055625
|
|
SEGTRACE~REGISTERS[60]; 12055630
|
|
REGISTERS[60]~SEGTRACTER; 12055640
|
|
END SEGTRACE; 12055650
|
|
SAVE INTEGER PROCEDURE TRACE (TRACTER); 12056000
|
|
VALUE TRACTER; 12057000
|
|
INTEGER TRACTER; 12058000
|
|
BEGIN 12059000
|
|
IF NOT SIMULATING THEN RETURN(0);% 12059100
|
|
TRACE ~ REGISTERS [64]; 12060000
|
|
REGISTERS [64] ~ TRACTER; 12061000
|
|
END TRACE; 12062000
|
|
COMMENT THE ARRAYS BETWEEN "UNIT" AND 13000000
|
|
"TRANSACTION" ARE INITIALIZED TO MAXI-13001000
|
|
MUM NUMBER OF UNITS ON A GIVEN SYSTEM 13002000
|
|
BY THE CALL: 13003000
|
|
INITIALIZEARRAY(UNIT,TRANSACTION,MAXU)13004000
|
|
IN THE INITIALIZE PROCEDURE. THIS 13005000
|
|
SERIES OF ARRAY DECLARATIONS SERVES TO13006000
|
|
ILLUSTRATE THE METHOD FOR THE DECLAR- 13007000
|
|
ATION AND INITIALIZATION OF A NUMBER 13008000
|
|
(ONE OR MORE) ARRAYS TO THE SAME SIZE.13009000
|
|
ALL ARRAYS INITIALIZED THIS MANNER 13010000
|
|
ARE PLACED IN HIGH CONTIGUOUS MEMORY 13011000
|
|
AND MARKED AS NON-OVERLAYABLE. TO ADD13012000
|
|
ANOTHER ARRAY THAT IS TO HAVE A LENGTH13013000
|
|
OF MAXU, IT IS ONLY NECESSARY TO DE- 13014000
|
|
CLARE THE ARRAY BETWEEN "UNIT" AND 13015000
|
|
"TRANSACTION". (ALSO SEE DECLARATION &13016000
|
|
PROCEDURE CALL FOR "OLDSTATUSWORD"). 13017000
|
|
13018000
|
|
FROM THE FOREGOING IT SHOULD BE 13019000
|
|
APPARENT THAT: 13020000
|
|
1. ARRAYS THAT ARE TO BE INITIALIZED13021000
|
|
TO THE SAME LENGTH SHOULD BE DE- 13022000
|
|
CLARED CONTIGUOUSLY. 13023000
|
|
2. AT LEAST ONE PROCEDURE CALL IS 13024000
|
|
REQUIRED FOR EACH SERIES (ONE OR 13025000
|
|
MORE) OF ARRAYS THAT ARE TO BE 13026000
|
|
INITIALIZED TO THE SAME LENGTH. 13027000
|
|
3. ALL STACKCELLS BETWEEN THE FIRST 13028000
|
|
AND LAST ARRAY DECLARATIONS WILL 13029000
|
|
BE INITIALIZED TO ARRAY DESCRIP- 13030000
|
|
TORS. 13031000
|
|
;13032000
|
|
INTEGER DIAGNOSTICUNIT;COMMENT THE LOGICAL UNIT NO. OF THE 13033000
|
|
DIAGNOSTIC FILE; 13034000
|
|
DEFINE DIAGNOSTICIOCW = 40"04004" #, % IOCW FOR PRINTER-BCL SNG SPACE 13037100
|
|
DIAGNOSTICUNITTYPE = BUFFPRINTER#; %UNIT TYPE FOR MONITOR UNIT 13037200
|
|
SAVE WORD ARRAY DIAGNOSTICARRAY[22]; %BUFFER AND IOCW FOR MONITOR 13037300
|
|
ARRAY MONITER[*]; %DESCRIPTOR TO I/O AREA OF ABOVE 13037400
|
|
EVENT MONITORFINISH; %MONITOR I/O FINISH EVENT 13037500
|
|
REAL DCPSANDGCAS; 13037600
|
|
BOOLEAN MULTIPLEXORMASK; % A ONE BIT "N" MEANS THERE IS AN MPX-N 13037700
|
|
ARRAY UNIT[ * ]; COMMENT CONTAINS INFORMATION OF EACH UNITS CURRENT 13038000
|
|
STATE; 13039000
|
|
REFERENCE ARRAY LASTIO [*]; 13040000
|
|
ARRAY UINFO[*], % DESCRIPTORS FOR NON-DISK UNITS WHICH ARE 13041000
|
|
% READY. THE DESCRIPTORS POINT TO A "LABEL 13042000
|
|
% BLOCK" WHICH HAS THE SAME FORM AS A "LABEL- 13043000
|
|
% EQUATION BLOCK" (LEB) (SEE 24000000 FOR THE 13044000
|
|
% FORMAT OF THE LEB). 13045000
|
|
13046000
|
|
IOTIME [*], COMMENT ARRAY FOR RECORDING USERS IO TIME; 13047000
|
|
TRANSACTION[*], COMMENT FOR RECORDING RECORD TRANSACTIONS; 13048000
|
|
DUMMYAREA[1]; % FOR MAKING I/O REQUEST 13050000
|
|
WORD ARRAY UINFOW = UINFO[*]; 13050100
|
|
ARRAY UINFOP = UINFO[*,*]; 13050200
|
|
WORD ARRAY UINFOPW=UINFOW[*,*]; 13050210
|
|
BOOLEAN OPTIONS;% OPTIONS BIT WORD 13051000
|
|
DEFINE% OPTIONS 13051100
|
|
RETTOG = OPTIONS.BIT47#,% 13051200
|
|
13052000
|
|
ENDOPTDEF=0#;% 13054000
|
|
COMMENT 13054990
|
|
SCREEN IS INITIALIZED BY PERIPHERALINITIALIZE--SHOULD BE DYNAMIC;13055000
|
|
ARRAY SCREEN[*];% 13055010
|
|
% GLOBALS FOR OUTPUTMESS AND MESSER 13056000
|
|
LAYOUT WHOCALLSL (WHOF=47:24,WHICHF=11:12,WHATF=23:12);% 13056100
|
|
DEFINE% FOR OUTPUTMESS AMD MESSER 13057000
|
|
BEGFINMSG = 0#,% 13057100
|
|
BEGFOUTMSG = BEGFINMSG + FINSZ#,% 13057200
|
|
BEGMATHERR = BEGFOUTMSG + FOUTSZ#,% 13057300
|
|
BEGSTATMSG = BEGMATHERR + MATHERRSZ#,% 13057400
|
|
BEGMCPID = BEGSTATMSG + STATSZ#,% 13057500
|
|
BEGIOERR = BEGMCPID + MCPIDSZ#, 13057510
|
|
BEGSTDIOERR =BEGIOERR + IOERRSZ#,% 13057520
|
|
BEGMISCMSG= BEGSTDIOERR + STDIOERRSZ#,% 13057530
|
|
FINSZ = 6#,% 13057600
|
|
FOUTSZ = 4#,% 13057700
|
|
MATHERRSZ = 30#,% 13057800
|
|
STATSZ = 11#,% 13057900
|
|
MCPIDSZ = 4#,% 13058000
|
|
IOERRSZ = 5#,% 13058010
|
|
STDIOERRSZ = 18#,% 13058020
|
|
MISCSZ= 2#,% 13058030
|
|
FINMSGSEC= 0#,% 13058100
|
|
FOUTMSGSEC= 1#,% 13058200
|
|
MATHERRMSGSEC= 2#,% 13058300
|
|
STATMSGSEC= 3#,% 13058400
|
|
MCPIDSEC= 4#,% 13058500
|
|
IOERRSEC=5#,% 13058600
|
|
STDIOERRSEC=6#,% 13058700
|
|
MISCMSGSEC= 7#,% 13058710
|
|
OPMINDXR(N) = CASE N OF (% 13059000
|
|
BEGFINMSG,BEGFOUTMSG,BEGMATHERR,% 13059010
|
|
BEGSTATMSG,% 13059020
|
|
BEGMCPID,% 13059030
|
|
BEGIOERR,% 13059040
|
|
BEGSTDIOERR,% 13059050
|
|
1305905513059050
|
|
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
|
|
DIV4F = 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
|
|
USERSPECIALIO =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].STKNRF!0#,% 13410100
|
|
D2STACKIS(S) = STACK[S,PROCESSNATUREPLACE].PROCESSHISTORYF!0#,13410200
|
|
HAVENTSUSPENDED(S)=WORDSTACK[S,REPLYEVENTPLACE].TAG=0 OR% 13410300
|
|
BOOLEAN(M[STACK[S,REPLYEVENTPLACE]])#, 13410302
|
|
JOBREF(S) = WORDSTACK[S,JOBIDPLACE]#,% 13410400
|
|
KFPSCRATCHWORDSZ= 1#,% 13428000
|
|
LEAP(Y) = Y.MOD4F=0 AND(Y MOD 100!0 OR(Y MOD 400=0 AND 13428100
|
|
Y MOD 4000!0))#, 13428102
|
|
DAY = 8"DAY, "#,% 13428200
|
|
JULDATESZ = 7#,% 13428300
|
|
13428400
|
|
STARTYEARPLACE= 0#,% 13428500
|
|
STARTDAYPLACE = 4#,% 13428600
|
|
YEARSZ = 4#,% 13428700
|
|
DAYSZ = 3#,% 13428800
|
|
BASEYEAR = 1700#,% 13428900
|
|
PERCENTAGE(X) = X DIV 10 FOR 2 DIGITS,PERIOD,% 13431000
|
|
X MOD 10 FOR 1 DIGITS#,% 13432000
|
|
TIMECORRFACT = 2400#,% ::= (2.4|10@6)/10@3 GIVING SECONDS 13433000
|
|
DIV2(X) = REAL(BOOLEAN(X)AND NOT BOOLEAN(3))#,% 13433100
|
|
DEFINEND=0#; 13434000
|
|
DEFINE 13435000
|
|
% FOR READALABEL AND PURGIT 13436000
|
|
USAH = 0&USERL(,,U,)#, 13437000
|
|
SCHANNEL = UNT.UNITTYPE=13#, 13438000
|
|
NCHANNEL = NOT SCHANNEL#, 13439000
|
|
ERAH(M,S) = 0&IOERRORMASKL(M,S)#, 13440000
|
|
UNEXP = 3"377635"#, 13441000
|
|
TAPETEST = 4#, 13442000
|
|
TAPEPARITY=BOOLEAN(RSLT.RDMEMACCESS)AND RSLT.RDDENSITY=3#,13444000
|
|
GETUNT = WHILE BOOLEAN(UNT~READLOCK(1,UNIT[U])) DO#, 13445000
|
|
PUTUNT(A,B,C,D)=GETUNT;UNIT[U]~UNT&UNITL(A,B,C,D)#, 13446000
|
|
GETOLDS = OLDSTATUS~OLDSTATUSWORD[VECTORNO]; 13447000
|
|
% KLUDGE 13448000
|
|
OLDSTATUSWORD[VECTORNO]~OLDSTATUS AND NOT 13449000
|
|
BOOLEAN(BITWORD)#, 13450000
|
|
RD432 = RDBIT432#, 13451000
|
|
PHDR1 = PVOL1#, 13452000
|
|
PHDR2 = PVOL1#, 13453000
|
|
RCRDFRMT = IF TAPETYPE=1 THEN 13454000
|
|
IF URF=6"F"THEN 0 ELSE IF URF=6"D"THEN 1 13455000
|
|
ELSE IF URF=6"V"THEN 2 ELSE 13456000
|
|
IF URF=6"I"THEN 4 ELSE IF URF=6"L"THEN 5 13457000
|
|
ELSE IF URF=6"Z"THEN 6 ELSE 3 13457050
|
|
ELSE 13458000
|
|
IF URF=8"F"THEN 0 ELSE IF URF=8"D"THEN 1 13459000
|
|
ELSE IF URF=8"V"THEN 2 ELSE 13460000
|
|
IF URF=8"I"THEN 4 ELSE IF URF=8"L"THEN 5 13461000
|
|
ELSE IF URF=8"Z"THEN 6 ELSE 3#, 13461050
|
|
WERRORS = BOOLEAN(@260201)#; 13462000
|
|
COMMENT DECLARATIONS FOR QUEUES OF I/O REQUESTS WAITING FOR UNIT 13463000
|
|
ONE QUEUE FOR EACH UNIT; 13464000
|
|
ARRAY DUMMYIOQUE[*]; COMMENT FOR MAKING ENTRY IN IOQUE; 13465000
|
|
DEFINE FIRSTIOU=FIRSTIO[INDEX]#, COMMENT INDEX IS QUEUE HEAD INDEX; 13466000
|
|
LASTIOU=LASTIO[INDEX]#; 13467000
|
|
QUEUE ARRAY IOQUE:FIRSTIO[*](USER,MISC,AREADESC,EVNT: 13468000
|
|
PRVSIO,NEXTIO); 13469000
|
|
VALUE USER,MISC,AREADESC, 13470000
|
|
PRVSIO,NEXTIO; 13471000
|
|
REAL USER,MISC; 13472000
|
|
EVENT EVNT; 13473000
|
|
REFERENCE PRVSIO,NEXTIO,AREADESC; 13474000
|
|
USING 13475000
|
|
ALLOCATE IS REFERENCE(DUMMYIOQUE & 13476000
|
|
ARRAYDESCL(3, 6, GETAREA(6))): 13477000
|
|
NEXT IS NEXTIO @ FIRSTIO[INDEX]: 13478000
|
|
TO INSERT, COMMENT QUEUE IS ARRANGED ON A FIRST COME FIRST 13479000
|
|
BASIS; 13480000
|
|
BEGIN 13481000
|
|
IF LASTIOU=NULL THEN COMMENT QUEUE IS EMPTY; 13482000
|
|
BEGIN 13483000
|
|
LASTIOU~FIRSTIOU~ENTRY; COMMENT ENTRY IS THE ADDRESS OF 13484000
|
|
DESC. POINTING TO DATA OF NEW 13485000
|
|
ENTRY; 13486000
|
|
NEXTIO@(FIRSTIOU)~PRVSIO @(FIRSTIOU)~ NULL; 13487000
|
|
END ELSE 13488000
|
|
BEGIN COMMENT PUT ENTRY AT TAIL OF QUEUE; 13489000
|
|
PRVSIO @(ENTRY)~ LASTIOU; 13490000
|
|
NEXTIO @(LASTIOU)~ENTRY; 13491000
|
|
LASTIOU ~ENTRY; 13492000
|
|
NEXTIO @(ENTRY)~NULL; 13493000
|
|
END; 13494000
|
|
END INSERTION OF ENTRY IN QUEUE: 13495000
|
|
TO DELINK, 13496000
|
|
BEGIN 13497000
|
|
IF ENTRY=FIRSTIOU THEN COMMENT ENTRY IS THE TOP OF QUEUE; 13498000
|
|
IF FIRSTIOU=LASTIOU THEN COMMENT ONLY ONE ENTRY IN QUEUE; 13499000
|
|
FIRSTIOU ~ LASTIOU ~NULL ELSE 13500000
|
|
BEGIN COMMENT REMOVES ENTRY FROM TOP; 13501000
|
|
FIRSTIOU ~NEXTIO @ FIRSTIOU; 13502000
|
|
PRVSIO @(FIRSTIOU) ~ NULL; 13503000
|
|
END ELSE 13504000
|
|
IF ENTRY=LASTIOU THEN COMMENT REMOVES LAST ENTRY OF QUEUE; 13505000
|
|
BEGIN 13506000
|
|
LASTIOU~PRVSIO @ ENTRY; 13507000
|
|
NEXTIO @(LASTIOU)~ NULL; 13508000
|
|
END ELSE COMMENT REMOVES ANY OTHER ENTRY; 13509000
|
|
BEGIN 13510000
|
|
COMMENT FIX NEXTIO POINTER IN THE UPPER LINK OF ENTRY; 13511000
|
|
NEXTIO @(PRVSIO @ ENTRY)~ NEXTIO @ ENTRY; 13512000
|
|
COMMENT FIX PRVSIO POINTER IN THE LOWER LINK OF ENTRY; 13513000
|
|
PRVSIO @(NEXTIO @ ENTRY)~ PRVSIO @ ENTRY; 13514000
|
|
END; 13515000
|
|
END DELINKING OF ENTRY FROM QUEUE; 13516000
|
|
COMMENT DECLARATIONS FOR QUEUES OF UNITS WAITING FOR CHANNEL. 13517000
|
|
ONE QUEUE FOR EACH MPX; 13518000
|
|
ARRAY DUMMYWAITCHANNELQUE[*]; COMMENT FOR MAKING ENTRY IN 13519000
|
|
WAITCHANNELQUE; 13520000
|
|
REFERENCE ARRAY LASTUNIT[*]; COMMENT POINTS TO LAST ENTRY IN 13521000
|
|
WAITCHANNELQUE; 13522000
|
|
DEFINE FIRSTUNITI=FIRSTUNIT[INDEX]#, COMMENT INDEX-QUEUE HEAD INDEX; 13523000
|
|
LASTUNITI=LASTUNIT[INDEX]#; 13524000
|
|
QUEUE ARRAY WAITCHANNELQUE:FIRSTUNIT[1](UNTWORD:PRVSUNIT,NEXTUNIT); 13525000
|
|
VALUE UNTWORD,PRVSUNIT,NEXTUNIT; 13526000
|
|
REAL UNTWORD; 13527000
|
|
REFERENCE PRVSUNIT,NEXTUNIT; 13528000
|
|
USING 13529000
|
|
ALLOCATE IS REFERENCE(DUMMYWAITCHANNELQUE & 13530000
|
|
ARRAYDESCL(,3,GETAREA(3))): 13531000
|
|
NEXT IS NEXTUNIT @ FIRSTUNIT[INDEX]: 13532000
|
|
TO INSERT, COMMENT QUEUE IS ARRANGED ON A FIRST COME FIRST 13533000
|
|
BASIS; 13534000
|
|
BEGIN 13535000
|
|
IF LASTUNITI=NULL THEN COMMENT QUEUE IS EMPTY; 13536000
|
|
BEGIN 13537000
|
|
LASTUNITI~FIRSTUNITI~ENTRY; COMMENT ENTRY IS THE ADDRESS 13538000
|
|
OF DESC. POINTING TO DATA OF 13539000
|
|
NEW ENTRY; 13540000
|
|
NEXTUNIT @(FIRSTUNITI)~PRVSUNIT @(FIRSTUNITI) ~NULL; 13541000
|
|
END ELSE 13542000
|
|
BEGIN COMMENT PUT ENTRY AT TAIL OF QUEUE; 13543000
|
|
PRVSUNIT @(ENTRY)~ LASTUNITI; 13544000
|
|
NEXTUNIT @(LASTUNITI) ~ ENTRY; 13545000
|
|
LASTUNITI ~ ENTRY; 13546000
|
|
NEXTUNIT @ (ENTRY) ~NULL; 13547000
|
|
END; 13548000
|
|
END INSERTION OF ENTRY IN WAITCHANNELQUE: 13549000
|
|
TO DELINK, 13550000
|
|
BEGIN 13551000
|
|
IF ENTRY=FIRSTUNITI THEN COMMENT ENTRY IS THE TOP OF QUEUE; 13552000
|
|
IF FIRSTUNITI=LASTUNITI THEN COMMENT ONLY ONE ENTRY IN QUEUE;13553000
|
|
FIRSTUNITI~LASTUNITI~NULL ELSE 13554000
|
|
BEGIN COMMENT REMOVE ENTRY FROM TOP; 13555000
|
|
FIRSTUNITI ~ NEXTUNIT @ FIRSTUNITI; 13556000
|
|
PRVSUNIT @ (FIRSTUNITI) ~ NULL; 13557000
|
|
END ELSE 13558000
|
|
IF ENTRY=LASTUNITI THEN COMMENT REMOVE LAST ENTRY OF QUEUE; 13559000
|
|
BEGIN 13560000
|
|
LASTUNITI ~ PRVSUNIT @ ENTRY; 13561000
|
|
NEXTUNIT @(LASTUNITI)~NULL; 13562000
|
|
END ELSE COMMENT REMOVES ANY OTHER ENTRY; 13563000
|
|
BEGIN 13564000
|
|
COMMENT FIX NEXTUNIT POINTER IN THE UPPER LINK OF ENTRY; 13565000
|
|
NEXTUNIT @(PRVSUNIT @ ENTRY) ~ NEXTUNIT @ ENTRY; 13566000
|
|
COMMENT FIX PRVSUNIT POINTER IN THE LOWER LINK OF ENTRY; 13567000
|
|
PRVSUNIT @(NEXTUNIT @ ENTRY) ~ PRVSUNIT @ ENTRY; 13568000
|
|
END; 13569000
|
|
FORGETAREA(3,WORD(ENTRY).ADDRESS); 13570000
|
|
END DELINKING OF ENTRY FROM QUEUE; 13571000
|
|
13572000
|
|
EVENT TIMERINTERRUPTEVENT, 13573000
|
|
STATUSEVENT, COMMENT EVENT CAUSED AFTER EACH STATUS RUN; 13574000
|
|
ERRORFLAGEVENT; 13575000
|
|
COMMENT GLOBALS FOR DISK MANAGEMENT; 14000000
|
|
REAL MCPTOP; COMMENT THE HIGHEST DISKADDRESS OF THE MCP CODE FILE; 14000100
|
|
DEFINE MCPINFOSIZE = 60 #; COMMENT SIZE IN WORDS OF DISK INFO; 14001000
|
|
ARRAY MCPINFO[MCPINFOSIZE]; COMMENT WE WILL STUFF THE DISK ADDRESS OF 14002000
|
|
THE INFO SEGMETNS IN THE DESCRIPTOR SO THAT14002010
|
|
PRESENCEBIT WILL READ IT IN FOR US IF 14002020
|
|
IT IS NOT PRESENT; 14002030
|
|
REAL NEXTADDR, LASTADDR, NEXTROW, FIRSTADDR, MAXADDR, 14002040
|
|
DIRECTORYCOMPLEMENTREPORTBACK; 14002050
|
|
BOOLEAN PERIPHERALINVALIDADDRESS = DIRECTORYCOMPLEMENTREPORTBACK; 14002060
|
|
COMMENT THE ABOVE ARE USED IN BUILDING THE DISK TABLES AND CAN BE 14003000
|
|
RE-USED ONCE PERIPHERALINITIALIZE HAS EXITED; 14004000
|
|
BOOLEAN PROCEDURE GIVEBACKDISK(DKADDR, SIZE); 14005000
|
|
VALUE DKADDR, SIZE; 14006000
|
|
REAL DKADDR, SIZE; FORWARD; 14007000
|
|
ARRAY DISKMAPARRAY[*,*]; %USED FOR DISK TABLE BUILDING 14008000
|
|
DEFINE LLLROWS = 10 #, %THE NUMBER OF ROWS FOR THE ABOVE 14009000
|
|
LLLCHUNK = 100 #; %THE ROW SIZE OF THE ABOVE; 14010000
|
|
COMMENT THE CELL FOR DISKMAPARRAY IS AVAILABLE AFTER DISKMAPING; 14011000
|
|
COMMENT DECLARATIONS FOR USER DISK MANAGEMENT; 14012000
|
|
COMMENT FIELD DEFINES FOR USERDISK TABLE; 14013000
|
|
FIELD 14014000
|
|
DISKADDRF=19:20, COMMENT DISK ADDRESS; 14020000
|
|
EUNOF = 27:8; COMMENT UNIT NUMBER OF EU; 14021000
|
|
LAYOUT DISKADDRESSL(EUNOF, DISKADDRF); 14025000
|
|
LAYOUT FIRSTMAPWORD ( 14026000
|
|
MAPUNITNOF = 47:8 14027000
|
|
, MAPADDRESSF = 39:20 14028000
|
|
, ADDRESSF 14029000
|
|
) 14030000
|
|
, FIRSTMAPWORDPRIME( 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
|
|
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=0#; 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
|
|
, NEXTINSHEETVECTOR 21395200
|
|
; 21395300
|
|
SAVE EVENT ARRAY HOLEINVECTOR[2] 21395400
|
|
; 21395500
|
|
DEFINE PUTINJOBIDANDTIME(S,N) 21395600
|
|
=S[JOBIDPLACE]~N&JOBTIME(S[TIMEENTEREDPLACE] 21395700
|
|
~TIMEOFDAY)# 21395800
|
|
; 21395900
|
|
COMMENT *** FOLLOWING IS DUMMY UNTIL COREFACTOR DEFINED; 21399000
|
|
BOOLEAN COREFACTOR; COMMENT TRUE IF MEMORY USAGE IS SATIS- 21400000
|
|
FACTORY FOR NEW PROCESS INITIATION; 21400100
|
|
DEFINE FIRSTBITPH = 20 # 21400200
|
|
, LENGTHPH = 5 # 21400300
|
|
, FIRSTBITPC = 15 # 21401000
|
|
, LENGTHPC = 8 # 21401500
|
|
; 21402000
|
|
LAYOUT NATUREOFPROCESS(PROCESSHISTORYF=FIRSTBITPH:LENGTHPH 21402500
|
|
,PROCESSCLASSF= FIRSTBITPC:LENGTHPC ) 21403000
|
|
; 21403200
|
|
DEFINE AD1STACK 21403500
|
|
= 0 # 21404000
|
|
, NORMAL 21404500
|
|
= 1 # 21405000
|
|
, XSED 21405500
|
|
= 2 # 21406000
|
|
, DSED 21406500
|
|
= 3 # 21407000
|
|
, DEPENDENT 21407200
|
|
= 4 # 21407400
|
|
, INDEPENDENT 21407600
|
|
= 5 # 21407800
|
|
, TERMINATEIR 21408000
|
|
= 6 # 21408200
|
|
; 21408800
|
|
COMMENT THE FOLLOWING ARE VALUES FOR PROCESSCLASS; 21409000
|
|
DEFINE GOJOB = 0 # 21410000
|
|
, EXECUTEJOB= 1 # 21411000
|
|
, COMPILENGOJOB= 10# 21412000
|
|
, COMPILENSYNTAXJOB= 11# 21413000
|
|
, COMPILETOLIBRARYJOB=12# 21414000
|
|
, COMPILETOLIBRARYANDGOJOB = 19 # 21414100
|
|
, RUNJOB = 20# 21415000
|
|
, LIBRARYNGOJOB = 6# 21415100
|
|
, COMPILENSYNTAXOBJECT = 7# 21415200
|
|
; 21416000
|
|
DEFINE FIRSTCOMPILEROPTION = COMPILENGOJOB # 21416200
|
|
, LASTCOMPILEROPTION = COMPILETOLIBRARYJOB # 21416300
|
|
; 21416400
|
|
FIELD INITIATESTACKF = 21:1 21416500
|
|
; 21416600
|
|
DEFINE COMPILEFORSYNTAX(P) = 21417000
|
|
P.PROCESSCLASSF = COMPILENSYNTAXOBJECT#; 21418000
|
|
COMMENT DIRECTORY MANAGEMENT GLOBALS; 23000000
|
|
DEFINE DIRECTORYBITE = 90 #, %THE SIZE OF A DIRECTORY RECORD 23001000
|
|
SEGMENTSPERDIRECTORYBITE = 3 #, 23002000
|
|
SYSTEMDIRECTORYINDEX = 0 # %INDEX INTO DISKFILEHEADERS 23002100
|
|
; 23003000
|
|
ARRAY DISKFILEHEADERS[*,*]; 23003100
|
|
INTERLOCK HEADERLOCK; 23003200
|
|
ARRAY DISKFILEHEADERSDOPEVECTOR = DISKFILEHEADERS [*]; 23003250
|
|
REAL DISKB;%KLUDGE FOR SIMULATOR"S DIRECTORY SEARCH 23003301
|
|
DEFINE DIRECTORYLOCK = HEADERLOCKS[0] # 23003310
|
|
, HEADERSTOSTARTWITH = 10 # 23003320
|
|
; 23003330
|
|
INTERLOCK ARRAY HEADERLOCKS[HEADERSTOSTARTWITH]; 23003335
|
|
ARRAY SYSTEMDIRECTORY[*]; 23003340
|
|
LAYOUT DIRECTORYSEARCHCODES( 23003355
|
|
DCODE1 = 38:15 23003360
|
|
,DCODE2 = 23:8 23003370
|
|
,DCODE3 = 14:15 23003375
|
|
); 23003380
|
|
COMMENT DEFINES FOR DCODE3 FIELD VALUE WHEN DIRECTORYSEARCH IS 23003383
|
|
UNSUCCESSFUL- (WHEN IT RETURNS NEGATIVE VALUE); 23003387
|
|
DEFINE NOSUCHFILE=1#, 23003390
|
|
NOTAVALIDFILENAME=2#, % DIRECTORY NAME MISSING 23003393
|
|
FILETHEREBUTLOCKED=3#, 23003395
|
|
FILEWITHWRONGGENEALOGY=4#; 23003397
|
|
LAYOUT STANDARDMASSADDRESSWORD( %STANDARD MASS STORAGE 23004000
|
|
%ADDRESS FORMAT 23005000
|
|
VOLUMEKIND = 47:3 %VOLUME TYPE 23006000
|
|
, VOLUMENOEUNOF = 44:25 %VOLUME OR EU UNIT 23007000
|
|
%AS PER ABOVE. 23008000
|
|
, BLOCKADDRESSF = 19:20 %BLOCK ADDRESS OR BLOCK23009000
|
|
%NUMBER. 23010000
|
|
); 23011000
|
|
DEFINE VOLUMENOF = VOLUMENOEUNOF # 23012000
|
|
; 23013000
|
|
COMMENT EUNOF = VOLUMENOEUNOF%UNIT NO. OF EU 23014000
|
|
, DISKADDRESS = BLOCKADDRESSF 23015000
|
|
; 23016000
|
|
DEFINE %THESE DEFINITIONS ARE TO 23017000
|
|
%BE USED FOR "VOLUMEKIND" 23018000
|
|
%IN STANDARD MASS ADDRESS 23019000
|
|
%WORDS 23020000
|
|
FIXEDDISK = 0# 23021000
|
|
, DISKPACK = 1# 23022000
|
|
, TAPE = 2# 23023000
|
|
; 23024000
|
|
COMMENT: 23024050
|
|
THE FOLLOWING ARE THE FIRST FOUR WORDS OF A DIRECTORY RECORD. 23024100
|
|
SUCCESSOR RECORD = WORD 0 23024150
|
|
PREDICESSOR RECORD = WORD 1 23024200
|
|
FIRST AVAILABLE NAME BLOCK INDEX = WORD 2 23024250
|
|
RECORD NUMBER OF THIS RECORD = WORD 3 23024300
|
|
NOTE: 23024350
|
|
THERE IS ALWAYS AT LEAST ONE WORD AT THE END OF A RECORD 23024400
|
|
WHICH IS USED AS A STOPPER. IT HAS A VALUE OF EITHER 23024450
|
|
THREE OR ONE, AS DESCRIBED BY "ENDER" IN THE NAME BLOCK 23024500
|
|
DESCRIPTION. 23024550
|
|
; 23024600
|
|
COMMENT: 23025000
|
|
THE FOLLOWING IS A DESCRIPTION OF THE NAME ENTRY FOR A FILE 23026000
|
|
IN A DIRECTORY RECORD. 23027000
|
|
; 23028000
|
|
LAYOUT DIRECTORYENTRYINFOWORD( %WORD 0 23029000
|
|
USEMEDIUMF = 47:5 %STORAGE MEDIUM WHERE 23030000
|
|
%FILE IS SUPOSED TO BE 23031000
|
|
%WHEN IT IS IN USE. 23032000
|
|
%USEMEDIUM=0 MEANS THAT23033000
|
|
%IT IS WHERE IT SHOULD 23034000
|
|
%BE. 23035000
|
|
, FILEKINDF = 36:8 %FILE TYPE FOR THE FILE23038000
|
|
%(PROGRAM,DIRECTORY...)23039000
|
|
, HEADERSIZEF = 28:10 %SIZE (IN WORDS) OF THE23040000
|
|
%HEADER FOR THIS FILE. 23041000
|
|
, ENDER = 1:2 %DIRECOTRY END MARKER 23042000
|
|
% =3 IS END OF RECORD 23043000
|
|
% =1 IS END OF FILE 23044000
|
|
%IF THE WORD IS -1 THEN23044100
|
|
%IT MARKS THE END OF A 23044200
|
|
%SCRAMBLED DIRECTORY. 23044300
|
|
) 23045000
|
|
COMMENT ADDRESSOFFILEHEADER = STANDARDMASSADDRESSWORD-WORD 1;23046000
|
|
, DIRECTORYENTRYFILENAME( %WORD 2 23047000
|
|
CHARACTERCOUNTF= 47:8 %CHARACTER COUNT FOR 23048000
|
|
%FILE NAME. 23049000
|
|
, FIRSTFIVECHRS = 39:40 %FIRST FIVE EBCDIC 23050000
|
|
%CHARACTERS OF THE FILE23051000
|
|
%NAME. (LEFT JUSTIFIED23052000
|
|
%WITH TRAILING ZEROS IF23053000
|
|
%NECESSARY. 23054000
|
|
) 23055000
|
|
; 23056000
|
|
COMMENT THE NEXT TWO WORDS CONTAIN THE REST OF THE NAME. THE NAME 23057000
|
|
IS LIMITED TO 17 CHARACTERS; 23058000
|
|
COMMENT: 23069000
|
|
THE FOLLOWING IS A DESCRIPTION OF A FILE HEADER 23070000
|
|
; 23071000
|
|
COMMENT ADDRESSOFHEADER = STANDARDMASSADDRESSWORD 23072000
|
|
THIS WORD IS WORD -1 23073000
|
|
OF THE CORE COPY OF THE23074000
|
|
HEADER RELATIVE TO THE 23075000
|
|
DESCRIPTOR RETURNED BY 23076000
|
|
DIRECTORY SEARCH 23077000
|
|
IT IS IN THE MEMORY LINK 23078000
|
|
; 23079000
|
|
LAYOUT COREADDRANDLOCKER( %WORD 0 23080000
|
|
COREADDRF = 19:20 %ON DISK THIS FIELD IS 23086000
|
|
%THE POINTER TO THE 23087000
|
|
%CORE COPY OF THIS 23088000
|
|
%HEADER. IF THIS FIELD23089000
|
|
%IS ZERO, THERE IS NO 23090000
|
|
%COPY IN CORE. 23091000
|
|
) 23092000
|
|
, HEADERINFOONE( %WORD 1 23093000
|
|
UPDATEBITF = 47:1 %TRUE IF FILE UPDATED 23094000
|
|
, OPENCOUNTF = 46:10 %NUMBER OF PROCESSES 23095000
|
|
%LOOKING AT THE HEADER.23096000
|
|
, FILEKINDF %SAME AS IN 23097000
|
|
%DIRECTORYENTRYINFOWORD23098000
|
|
, HEADERSIZEF %SAME AS IN 23099000
|
|
%DIRECTORYENTRYINFOWORD23100000
|
|
, SECURITYCODEF = 18:4 %CLASS OF SECURITY ON 23101000
|
|
%THIS FILE. 23102000
|
|
, SECINFOSIZEF = 14:8 %SIZE (IN WORDS) OF THE23103000
|
|
%SECURITY INFORMATION 23104000
|
|
%IN THIS HEADER. 23105000
|
|
, LOGICALMODEF = 3:4 %EBCDIC, DOUBLE, ETC...23106000
|
|
) 23108000
|
|
, HEADERINFOTWO( % FILE ORGANIZATION 23109000
|
|
PACKEDB = 47:1 % (IF 1 FILE IS PACKED)23110000
|
|
, PROTECTIONF = 46:1 % (1 IF FILE PROTECTED)23110100
|
|
, PERMANENCYF = 45:1 % (1 IF TEMPORARY FILE)23110200
|
|
, RECORDTYPEF = 42:3 % RECORD TYPE 23111000
|
|
, FILEORGF = 39:40 % FILE ORGANIZATION 23113000
|
|
) 23114000
|
|
COMMENT WORD 3 IS FIB TANKDATA2; 23115000
|
|
COMMENT ENDOFFILECOUNT WORD 4; 23116000
|
|
, ROWINFO( %WORD 5 23117000
|
|
NUMROWSF = 29:10 %NUMBER OF ROWS FOR 23120000
|
|
%WHICH ROW ADDRESS 23121000
|
|
%WORDS ARE ASSIGNED. 23122000
|
|
, ROWSIZEF = 19:20 %SIZE (IN SEGMENTS) OF 23123000
|
|
%EACH ROW . 23124000
|
|
) 23125000
|
|
, NAMEQUALIFICATIONINFO( %WORD 6 23126000
|
|
SAVEFACTORF = 47:10 %SAVE TIME 23127000
|
|
, CREATEDDATEF = 37:18 %WHEN THE FILE WAS MADE23128000
|
|
, GENERATIONNOF = 19:15 %USASCI GENERATION NO. 23128100
|
|
, MAXGENERATIONSF= 4:5 %PURGE ANY OVER THIS 23128200
|
|
, GENERATIONNO = 19:20 %USASCI GENERATION NO. 23129000
|
|
) 23130000
|
|
, ACCESSINFO( %WORD 7 23131000
|
|
LASTACCESSDATEF=17:18 %DATE LAST USED 23132000
|
|
) 23133000
|
|
COMMENT WORD 8 IS USED FOR VARIOUS PURPOSES DEPENDING ON THE FILE KIND.23134000
|
|
FOR DIRECTORIES, IT IS THE SCRAMBLE MODULUS. 23134100
|
|
FOR CODE FILES, IT IS THE STACK NUMBER FOR THE D1 STACK WHEN 23134200
|
|
A COPY OF THE PROGRAM IS RUNNING. 23134300
|
|
; 23134900
|
|
COMMENT SPARE (WORD 9) = RESERVED FOR EXPANSION; 23135000
|
|
COMMENT ROW ADDRESS WORDS IN STANDARD MASS ADDRESS WORD 23136000
|
|
FORMAT. ONE WORD PER ROW FOR 23137000
|
|
NUMROWS ROWS; 23138000
|
|
COMMENT SECURITYINFO SECINFOSIZE WORDS; 23139000
|
|
; 23141000
|
|
DEFINE FIRSTROWINDEX = 10 # 23141100
|
|
, FIRSTROWADDRESS(HDR) = HDR[FIRSTROWINDEX] # 23141120
|
|
, ROWADDRESS(HDR, ROW) = HDR[FIRSTROWINDEX + ROW] # 23141130
|
|
, SCRAMBLEMOD(HDR) = HDR[8] # 23141150
|
|
, HEADERSIZE(HDR) = HDR[1].HEADERSIZEF # 23141200
|
|
, HEADERUPDATED(HDR) = TRUE # % TEMPORARY 23141250
|
|
, OPENCOUNT(HDR) = HDR[1].OPENCOUNTF # 23141300
|
|
, ROWSIZE(HDR) = HDR[5].ROWSIZEF # 23141350
|
|
, CRUNCHED(HDR) = 0 # COMMENT TEMPORARY ONLY; 23141400
|
|
, NUMBEROFROWS(HDR) = HDR[5].NUMROWSF # 23141450
|
|
, D1STACKNUMBER(HDR) = HDR[8] # 23141500
|
|
, UPDATED(HDR) = HDR[1].UPDATEBITF# 23141550
|
|
, DISKBLOCKING(HDR) = HDR[3]# 23141600
|
|
, FIBINFO(HDR) = HDR[2]# 23141650
|
|
; 23141950
|
|
DEFINE %THESE DEFINITIONS ARE TO 23142000
|
|
%BE USED FOR "FILEKIND" IN 23143000
|
|
%FILE HEADERS AND DIRECTORY 23144000
|
|
%NAME ENTRIES 23145000
|
|
DIRECTORY = 0# 23146000
|
|
, DATA = 1# 23147000
|
|
; 23148000
|
|
COMMENT *** FOLLOWING FIELD AND DEFINE ARE TEMPORARY ; 23177100
|
|
FIELD TYPEINFOF = 35: 36 ; 23177200
|
|
DEFINE COMPILERS = 0 # ; 23177300
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24000000
|
|
% I/O INTRINSIC DECLARATIONS %24001000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24002000
|
|
% %24003000
|
|
% * WARNING * %24004000
|
|
% %24005000
|
|
% DO NOT REFER TO FIB WORDS OR FIELDS DIRECTLY. INSERT YOUR FIB %24006000
|
|
% REFERENCE INTO THE MASTER-FIB DEFINE LIST. ONLY THIS LIST WILL %24007000
|
|
% BE CHECKED WHEN IT IS NECESSARY TO CHANGE THE DEFINITION OF A FIB %24008000
|
|
% WORD OR FIELD. %24009000
|
|
% (HONI SOIT QUI MAL Y PENSE) %24010000
|
|
% %24011000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24012000
|
|
24013000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24252000
|
|
% FIXED PART OF FILE INFORMATION BLOCK %24253000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24254000
|
|
DEFINE 24255000
|
|
%%%%% SIMPLE I/O 24256000
|
|
FIBSIZE = FIB[0]#, % SIZE OF FILE INFO BLOCK 24257000
|
|
RECORDSTATUS = FIB[1]#, 24258000
|
|
FILESTATUS = FIB[2]#, 24259000
|
|
TANKDATA1 = FIB[3]#, % BLOCK SIZE INFORMATION 24260000
|
|
TANKDATA2 = FIB[4]#, % RECORD SIZE INFORMATION 24261000
|
|
TANKDATA3 = FIB[5]#, % BUFFER SIZE INFORMATION 24262000
|
|
IOINFO = FIB[6]#, % HARDWARE INFORMATION 24263000
|
|
IOADESC = FIBW[7]#, % TOP IOAREA 24264000
|
|
LBLEQTN = FIBW[8]#, % LABEL EQUATION BLOCK 24265000
|
|
%%%%% REGULAR I/O 24266000
|
|
BUFDESC = FIBW[9]#, % BUFFER DESCRIPTOR 24267000
|
|
UNITSLEFT = FIB[10]#, % WORDS OR CHARACTERS LEFT 24268000
|
|
BLOCKCOUNT = FIB[11]#, % BLOCK COUNT OR PAGE COUNT 24269000
|
|
RECORDCOUNT = FIB[12]#, % RECORD COUNT OR LINE COUNT24270000
|
|
LABELATT = FIB[13]#; % LABEL ATTRIBUTES 24272000
|
|
LAYOUT 24273000
|
|
FIBSIZEL ( 24274000
|
|
FIBFXD = 47:8, % SIZE OF FIXED PART 24275000
|
|
FIBOPT = 39:40), % VARIABLE PART MASK 24276000
|
|
RECORDSTATUSL ( 24277000
|
|
MTBUF = 0:1, % BUFFER NEEDS I/O 24278000
|
|
UFEAT = 1:1, % UNIT FEATURE 24279000
|
|
DRCDSIZE = 2:1, % RECORD SIZE REQUIRED OR DESIRED24280000
|
|
EXCEPTION = 3:1, % EXCEPTION CONDITION 24281000
|
|
OPNOUT = 4:1, % OPEN OUTPUT 24282000
|
|
OPNIN = 5:1, % OPEN INPUT 24283000
|
|
DIO = 6:1, % DIRECTED I/O (DATA COMM) 24284000
|
|
SIO = 7:1), % SIMPLE I/O 24285000
|
|
FILESTATUSL ( 24286000
|
|
% EXCEPTION CONDITIONS 24287100
|
|
STATEF = 9:10, % STATE OF FILE 24287200
|
|
% 0:1 = EOF (DISCONNECT) 24287300
|
|
% 1:1 = PARITY ERROR 24287400
|
|
% 2:1 = DATA ERROR 24287500
|
|
% 3:1 = LOCKOUT 24287600
|
|
% 4:1 = NO INPUT(TIME OUT) 24287700
|
|
% 5:1 = BREAK 24287800
|
|
% ERROR HANDLING LEVEL 24287900
|
|
ERRLEVEL = 12:2, % LEVEL OF ERROR RECOVERY 24288000
|
|
% 0 = FULL SYSTEM ACTION 24288100
|
|
% 1 = INHIBIT COPY 24288200
|
|
EXCEPTIONT= 13:1, % EXCEPTION ACTION TAKEN 24288300
|
|
OPT = 14:1, % OPTIONAL 24288400
|
|
IMPOPEN = 15:1, % (1 IF IMPLICIT OPEN IS NOT OK) 24288410
|
|
% EXCEPTION ACTION 24288500
|
|
% CODES ARE: 24288600
|
|
% 0 = MARK AND EXIT 24288700
|
|
% 1 = EVENT OR IMPLICIT LABEL 24288800
|
|
% 2 = RETURN OR USE ROUTINE 24288900
|
|
% 3 = TERMINATE 24289000
|
|
EOFACTION = 22:3, 24289100
|
|
PARACTION = 25:3, 24289200
|
|
DATACTION = 28:3, 24289300
|
|
LOCACTION = 31:3, 24289400
|
|
NOIACTION = 34:3, 24289500
|
|
BREACTION = 37:3), 24289600
|
|
TANKDATA1L ( 24345000
|
|
BLKFUNNY = 47:1, % ALTERNATE AREA IN USE 24346000
|
|
BLKD = 46:1, % BLOCKED 24347000
|
|
MLTBLK = 45:1, % MULTI-PHYSICAL-RECORD BLOCK 24348000
|
|
PNTR = 44:1, % (1 IF POINTER TO BE RETURNED) 24349000
|
|
INTMODE = 43:3, % INTERNAL RECORD FORM - 24350000
|
|
% RECORD DESCRIPTOR TYPE: 24351000
|
|
% 0 = SINGLE DATA 24352000
|
|
% 1 = DOUBLE DATA 24353000
|
|
% 2 = PACKED-DECIMAL (4) 24354000
|
|
% 3 = BCL (6) 24355000
|
|
% 4 = EBCDIC (8) 24356000
|
|
% 5 = ASCII (8) 24357000
|
|
RCDUNTS = 40:2, % RECORD UNITS: 24358000
|
|
% 0 = WORDS 24359000
|
|
% 1 = CHARACTERS 24360000
|
|
RCRDTYPE = 38:4, % RECORD TYPE 24361000
|
|
% 0 = "F" - FIXED LENGTH 24362000
|
|
% 1 = "D" = VARIABLE, LENGTH24363000
|
|
% IN BINARY IN FIRST 2 24363100
|
|
% CHARACTERS 24363200
|
|
% 2 = "V" - VARIABLE, LENGTH24364000
|
|
% IN DECIMAL IN FIRST 424364100
|
|
% CHARACTERS 24364200
|
|
% 3 = "U" - UNDEFINED, SIZE 24365000
|
|
% PROVIDED EXPLICITLY 24365100
|
|
% 4 = "I" - VARIABLE, LENGTH24366000
|
|
% IN RECORD AT FIXED 24366100
|
|
% LOCATION 24366200
|
|
% 5 = "L" - LINKS 24367000
|
|
% 6 = "Z" - FORTRAN 24367100
|
|
% 7 = DEPENDENT SPECIFICATN 24367200
|
|
% FIXED UP AT OPEN 24368000
|
|
SIZEMODE = 34:3, % SIZE MODE 24369000
|
|
SIZEOFF = 31:16, % SIZE OFFSET 24370000
|
|
SIZESZ = 15:16), % SIZE SIZE 24371000
|
|
TANKDATA2L ( 24372000
|
|
BLOCKSIZE = 47:16, % BLOCK SIZE 24373000
|
|
MINRECSIZE= 31:16, % MINIMUM RECORD SIZE 24374000
|
|
MAXRECSIZE= 15:16), % MAXIMUM RECORD SIZE 24375000
|
|
TANKDATA3L ( 24376000
|
|
BUFFERD = 47:1, % (1 IF BUFFERED - LEVEL 2&3 I/O)24377000
|
|
CNTGS = 44:1, % CONTIGUOUS - BUFFERS ADJACENT 24378000
|
|
BFFRLCK = 45:1, % (1 IF BUFFERS NEED LOCKS) 24378100
|
|
BUFFPROT = 44:1, % (1 IF MUST PROTECT BUFFERS) 24378200
|
|
BEVNT = 43:12, % BUFFER EVENT # 24379000
|
|
BFFRSZ = 31:16, % BUFFER SIZE (IOAREA SIZE) 24380000
|
|
BUFFREQSTD= 15:8, % BUFFERS REQUESTED 24381000
|
|
BUFFASSGND= 7:8), % BUFFERS ASSIGNED 24382000
|
|
IOINFOL ( 24383000
|
|
%%%%% FOR DATACOM USE THIS WORD FOR LAST STATION 24383100
|
|
SKLTNIOCW = 47:27, % SKELETON IOCW 24384000
|
|
UNITNUM = 12:8, % UNIT NUMBER 24385000
|
|
UNITYPP = 4:5), % UNIT TYPE 24386000
|
|
LABELATTL ( 24387000
|
|
LABELUSER = 47:1, % LABEL USE ROUTINES 24388000
|
|
LABELTYP = 46:3, % LABEL TYPE 24389000
|
|
% 0 = B6500 USASI 24390000
|
|
% 1 = UNLABELLED 24391000
|
|
% 2 = SYSTEM STANDARD 24392000
|
|
WRPRND = 17:1, % (1 IF WRAPAROUND SPECIFIED) 24392100
|
|
USERSIZE = 16:4, % NUMBER OF USERS LABELS 24393000
|
|
LBLEQTD = 12:1, % (1 IF HAVE LOCATED FPB) 24394000
|
|
EVNTNO = 11:12); % FILE EVENT # 24395000
|
|
FIELD 24396000
|
|
%%%%% RECORDSTATUS 24397000
|
|
OPENBITS = 9:2, 24398000
|
|
%%%%% FILESTATUS 24398010
|
|
EOFB = 0:1, % END-OF-FILE (DISCONNECT) 24398020
|
|
PARITYB = 1:1, % PARITY ERROR 24398030
|
|
DATAERRORB= 2:1, % DATA ERROR 24398040
|
|
LOCKOUTB = 3:1, % LOCKOUT 24398050
|
|
NOINPUTB = 4:1, % NO INPUT (TIME OUT) 24398060
|
|
BREAKB = 5:1, % BREAK 24398070
|
|
%%%%% IOINFO 24404000
|
|
SIOCWSTANDARD = 45:10; % STANDARD FIELD OF IOCW 24405000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24406000
|
|
% OPTIONAL PART OF FILE INFORMATION BLOCK %24407000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24408000
|
|
DEFINE 24409000
|
|
ALTDESCF = 0#, 24410000
|
|
FIBLOCKF = 1#, 24411000
|
|
FRMTLOCKF = 2#, 24412000
|
|
DISKHDRF = 3#, 24413000
|
|
DISKINFOF = 4#, 24414000
|
|
LIMITSF = 5#, 24415000
|
|
USERSF = 6#, 24416000
|
|
RERUNF = 7#, 24417000
|
|
EOFF = 8#, 24418000
|
|
PARITYP = 9#, 24419000
|
|
NOINPUTF = 10#, 24420000
|
|
BREAKF = 11#, 24421000
|
|
QUEUEFULLF= 12#, 24422000
|
|
INQUEUEF = 13#, 24423000
|
|
TLISTF = 14#, 24424000
|
|
TOWF = 15#, 24425000
|
|
TMISCF = 16#, 24426000
|
|
OUTQUEUEF = 17#, 24426100
|
|
SORTWORDF = 18#, 24426200
|
|
% FIBOVERFLOW=39#, % RESERVED FOR EXPANSION 24426900
|
|
FIIB(FLD) = FIB[FIB0.FIBFXD 24428000
|
|
+ONES(FIB0.[39:FLD])]#, 24429000
|
|
FIIBW(FLD)= FIBW[FIB0.FIBFXD 24430000
|
|
+ONES(FIB0.[39:FLD])]#, 24431000
|
|
FIBB(FLD) = BOOLEAN(FIB0.[39-(FLD):1])#, 24432000
|
|
ALTDESC = FIBW[FIB0.FIBFXD]#, % ALTERNATE DESCRIPTOR 24433000
|
|
% IF BLOCKEDFUNNY THEN DESCRIPTOR FOR ALTERNATE 24434000
|
|
% AREA. IF COPY BLOCKING THEN POINTER TO OTHER 24435000
|
|
% FIB. 24436000
|
|
LOCKER = FIIB(FIBLOCKF)#, % LOGICALRECORD LOCK 24437000
|
|
FLOCK = FIIB(FRMTLOCKF)#, % FORMATTER LOCK 24438000
|
|
DISKHEADER= FIIBW(DISKHDRF)#, % DISK HEADER 24439000
|
|
FILEACCESS= FIIB(DISKINFOF)#, % FILE ACCESS INFORMATION 24440000
|
|
FILELIMITS= FIIB(LIMITSF)#, % FILE LIMITS 24441000
|
|
USEROUTINES=FIIBW(USERSF)#, % USE-ROUTINE-INDEX ARRAY 24442000
|
|
RERUNATT = FIIB(RERUNF)#, % RERUN ATTRIBUTES 24443000
|
|
EOFE = FIIBW(EOFF)#, % END OF FILE EVENT 24444000
|
|
PARITYE = FIIBW(PARITYP)#, % PARITY EVENT 24445000
|
|
NOINPUTE = FIIBW(NOINPUTF)#, % NO INPUT EVENT 24446000
|
|
BREAKE = FIIBW(BREAKF)#, % BREAK EVENT 24447000
|
|
QUEUEFULLE= FIIBW(QUEUEFULLF)#,% QUEUE FULL EVENT 24448000
|
|
INQUEUE = FIIBW(INQUEUEF)#, % INPUT QUEUE 24449000
|
|
TERMINALISTF=FIIBW(TLISTF)#, % TERMINAL LIST 24450000
|
|
TOCCURSWORD=FIIB(TOWF)#, % TERMINAL OCCURS WORD 24451000
|
|
TMISC = FIIB(TMISCF)#, % TERMINAL MISC WORD 24452000
|
|
OUTQUEUE = FIIBW(OUTQUEUEF)#,% OUTPUT QUEUE 24452100
|
|
SORTWORD = FIIB(SORTWORDF)#, % SORT INFO 24452200
|
|
USERS = FIBB(USERSF)#, 24453000
|
|
KLUDGED = 0#; 24454000
|
|
LAYOUT 24455000
|
|
FILEACCESSL ( 24456000
|
|
EXPADRS = 41:1, % (1 IF EXPLICIT ADDRESS IS 24459000
|
|
% PERMITTED WITH SEQUENTIAL 24460000
|
|
% FILE) 24461000
|
|
BEGINO = 40:1, % (1 IF FILE BEGINS AT 1) 24462000
|
|
ACSSTYPE = 39:4, % FILE ACCESS TYPE: 24463000
|
|
% 0 = SERIAL 24464000
|
|
% 1 = RANDOM 24465000
|
|
% 2 = LINKED 24466000
|
|
% 3 = DIRECTED 24467000
|
|
ACSSMODES = 35:1, % (1 IF ACCESS MODE SPECIFIED) 24467100
|
|
ACSSMODE = 34:3, % ACCESS MODE (IF LINKED) 24468000
|
|
% SAME VALUES AS INTMODES 24469000
|
|
ACSSOFF = 31:16, % ACCESS OFFSET 24473000
|
|
ACSSZ = 15:16), % ACCESS SIZE 24474000
|
|
RERUNATTL ( 24475000
|
|
RERUNEOR = 47:2, % RERUN END-OF-REEL 24476000
|
|
% 0 = NONE 24477000
|
|
% 1 = EOR 24478000
|
|
% 2 = RECORDS 24479000
|
|
% 3 = CLOCK UNITS 24480000
|
|
RERUNHERE = 45:1, % RERUN ON THIS TAPE 24481000
|
|
RERUNCOUNT= 31:16, % NUMBER OF RECORDS: ACCUMULATOR 24482000
|
|
RERUNNO = 15:16), % NUMBER OF RECORDS: TARGET 24483000
|
|
TOCWL ( 24484000
|
|
TERMINALSZ= 47:16, % TERMINAL SIZE 24485000
|
|
NUMTERMS = 31:16); % NUMBER OF TERMINALS 24486000
|
|
DEFINE 24487000
|
|
% TERMINAL LIST 24488000
|
|
TOUTQUEUE = TLISTW[TSZ]#, % OUTPUT QUEUE (DIRECTED) 24489000
|
|
TSTATUS = TLIST[TSZ+1]#, % TERMINAL STATUS 24490000
|
|
TFILE = TLISTW[TSZ+2]#, % TERMINAL FILE 24491000
|
|
TTIME = TLIST[TSZ+3]#, % TERMINAL TIME DATA 24492000
|
|
TINQUEUE = TLISTW[TSZ+4]#, % INPUT QUEUE (TERMINAL) 24493000
|
|
TSTAT = TLIST[TSZ+5]#; % TERMINAL STATISTICS 24494000
|
|
DEFINE 24494100
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24494110
|
|
% LABEL-EQUATION BLOCK (LEB) %24494120
|
|
% SAME FORMAT ALSO USED IN LABEL TABLE AND FPB %24494130
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24494140
|
|
% FIXED PART LEB 24494150
|
|
LEBC = LEB[0]#, % BASIC DATA: SIZE,KIND ... 24494160
|
|
GEN1 = LEB[1]#, % REEL, CYCLE, VERSION 24494170
|
|
GEN2 = LEB[2]#, % DATE, SAVE FACTOR 24494180
|
|
DSKS = LEB[3]#, % DISK INFO AND MYUSE,OTHERUSE...24494190
|
|
OPENTIME = LEB[4]#, % TIME FILE OPEN 24494200
|
|
% OPTIONAL PART LEB 24494210
|
|
% BLK1 = LEB[U]#, % FILE TYPE,BLOCK SIZE,MAX REC SZ24494220
|
|
% BLK2 = LEB[U+1]#, % MINIMUM RECORD SIZE 24494230
|
|
% TITLE FOLLOWS LAST WORD OF OPTIONAL PART 24494240
|
|
% LABEL TABLE 24494250
|
|
LCNTRL = UINFOP[U,0]#, 24494260
|
|
LGEN1 = UINFOP[U,1]#, 24494270
|
|
LGEN2 = UINFOP[U,2]#, 24494280
|
|
LMISC = UINFOP[U,3]#, 24494290
|
|
USERFIB = UINFOPW[U,4]#,% SIRW TO USERS FIB 24494300
|
|
LBLK1 = UINFOP[U,5]#, 24494310
|
|
LBLK2 = UINFOP[U,6]#; 24494320
|
|
LAYOUT 24495000
|
|
% LABEL-EQUATION BLOCK (LEB) 24496000
|
|
LEBCNTRL ( 24497000
|
|
FXD = 47:4, % NUMBER OF WORDS IN FIXED PART 24498000
|
|
OPTMASK = 43:15, % OPTIONAL-PART MASK 24499000
|
|
% OPTIONALF = 23:1, % OPTIONAL 24499010
|
|
% FPRTCTD = 20:1, % FILE PROTECTED 24499020
|
|
LPARITY = 19:1, % PARITY (1 IS ODD) 24500000
|
|
DENSITYS = 18:1, % ON IF DENSITY SPECIFIED 24501000
|
|
DENSITYL = 17:2, % DENSITY: 0-800, 1-556, 2-200, 24502000
|
|
% 3-1600 24503000
|
|
LABELTYPES= 15:1, % ON IF LABEL TYPE SPECIFIED 24504000
|
|
LABELTYPEL= 14:4, % LABEL TYPE: 24505000
|
|
% 0 - B6500 USASI 24506000
|
|
% 1 - UNLABELLED 24507000
|
|
% 2 - B5500 24508000
|
|
% 3 - SYSTEM STANDARD 24509000
|
|
% 4 - B3500 USASI 24510000
|
|
% 5 - NON-STANDARD USASI 24511000
|
|
% 6 - BACKUP TAPE 24512000
|
|
% 7 - LIBRARY TAPE 24513000
|
|
% 8 - LOAD-CONTROL TAPE 24514000
|
|
% 9 - SYSTEM TAPE 24515000
|
|
% 10 - B5500 BACKUP 24516000
|
|
% 11 - B5500 LIBRARY 24517000
|
|
EXTFORML = 10:3, % EXTERNAL FORM 24518000
|
|
% PROBLEM WITH UNSPECIFIED Q 24518010
|
|
PTYPEL = 7:8), % PERIPHERAL TYPE 24519000
|
|
%%%%% FOR CARD READERS HAVE ONLY THIS BLOCK PLUS THE NAMES 24520000
|
|
GENEALOGY1 ( 24521000
|
|
CYCLE =38:15, % CYCLE (GENERATION NUMBER) 24522000
|
|
GENVERSN = 23:8, % GENERATION VERSION 24523000
|
|
REELS = 15:1, % ON IF REEL NUMBER SPECIFIED 24524000
|
|
REEL = 14:15), % REEL NUMBER 24525000
|
|
GENEALOGY2 ( 24526000
|
|
% SERIALN = 45:20, % SERIAL # (FOR LABEL TABLE) 24526010
|
|
SAVFACTOR = 25:11, % SAVE FACTOR 24527000
|
|
CRTNDATE = 14:15), % CREATION DATE 24528000
|
|
LMISCL ( % USED IN LABEL TABLE 24529000
|
|
BCNTL = 43:20, % BLOCK COUNT 24530000
|
|
RCNTL = 23:24), % RECORD COUNT 24531000
|
|
DISKSPECL ( 24532000
|
|
DIRECTIONF= 47:1, % (1 IF REVERSED) 24533000
|
|
REVACTIONF= 46:1, % (1 IF OPEN REVERSE GOES 1 REEL)24533100
|
|
DRCTRYF = 43:1, % (1 IF GOES IN DIRECTORY) 24533200
|
|
PACKEDF = 42:1, % PACKED 24533300
|
|
FLEXIBLEF = 41:1, % FLEXIBLE 24533400
|
|
SPEEDF = 40:3, % SPEED 24534000
|
|
OTHERUSEF = 37:2, % OTHER USE 24535000
|
|
MYUSEF = 35:2, % MY USE 24536000
|
|
ACCSSTYPEF= 33:4, % ACCESS TYPE 24537000
|
|
NUMAREAS = 29:10, % NUMBER OF AREAS 24538000
|
|
AREASIZE = 19:20), % AREA SIZE 24539000
|
|
% OPTIONAL PART OF LEB RELATIVE WORD #24540000
|
|
%*************************************************************%24540050
|
|
% POINTER TO INTERNAL NAME (IF ANY) % 124540100
|
|
%*************************************************************%24540110
|
|
BLOCKING1 ( % 224541000
|
|
FILETYPEL = 41:3, % FILE TYPE 24542000
|
|
NONBUFFRDL= 38:1, % NON-BUFFERED 24543000
|
|
BUFFERNOL = 37:6, % NUMBER OF BUFFERS 24544000
|
|
MAXRECSZL = 31:16, % MAXIMUM RECORD SIZE 24545000
|
|
BLOCKSZL = 15:16), % BLOCK SIZE 24546000
|
|
BLOCKING2 ( % 324547000
|
|
MINRECSZL = 15:16); % MINIMUM RECORD SIZE 24548000
|
|
FIELD 24549000
|
|
FPRTCTD = 20:1, % FILE PROTECTED 24550000
|
|
OPTIONALF =23:1, % ON, IF OPTIONAL FILE 24551000
|
|
% GENEALOGY2 24552000
|
|
SERIALN = 45:20; % SERIAL # (FOR LABEL TABLE) 24553000
|
|
DEFINE 24553100
|
|
INTNAME = 0#, 24553110
|
|
BLCKNG1 = 1#, 24553120
|
|
BLCKNG2 = 2#, 24553130
|
|
FRMS = 3#, 24553140
|
|
LEEB(FLD) = LEB[LEBC.FXD+ONES(LEBC.[43:FLD])]#, 24553150
|
|
LEBB(FLD) = BOOLEAN(LEB[LEBC.FXD+ONES(LEBC.[43-FLD:1])])#,24553160
|
|
BLK1 = LEEB(BLCKNG1)#,% FILE TYPE, BLOCKING INFO 24553170
|
|
BLK2 = LEEB(BLCKNG2)#,% MINIMUM RECORD SIZE 24553180
|
|
KLUDGED1 = 0#; 24553190
|
|
DEFINE 24571000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24571100
|
|
% FILE LABEL DEFINES %24571200
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24571300
|
|
24571400
|
|
% B6500 USASI LABELS 24572000
|
|
% VOL1 24573000
|
|
UVSN = PVOL1+4#, % SERIAL NUMBER 24574000
|
|
UMFID = PVOL1+11#, % MULTIPLE FILE ID 24575000
|
|
USYSN = PVOL1+28#, % "65" 24576000
|
|
USYST = PVOL1+30#, % TAPE TYPE 24577000
|
|
% 0 - SCRATCH 24578000
|
|
% 1 - USER 24579000
|
|
% 2 - LIBRARY 24580000
|
|
% 3 - BACK UP 24581000
|
|
% 4 = LOAD CONTROL 24582000
|
|
ULSL = PVOL1+79#, % 1 IF STANDARD USASI 24583000
|
|
% HDR1 24584000
|
|
UFID = PHDR1+4#, % FILE ID 24585000
|
|
URLNMBR = PHDR1+27#, % FILE SECTION NUMBER (REEL #) 24586000
|
|
USQNCNMBR = PHDR1+31#, % FILE SEQUENCE NUMBER (POSITION)24587000
|
|
UGNRTN = PHDR1+35#, % GENERATION NUMBER 24588000
|
|
UVRSN = PHDR1+39#, % VERSION 24589000
|
|
UCDT = PHDR1+42#, % CREATION DATE 24590000
|
|
UEDT = PHDR1+48#, % EXPIRATION DATE 24591000
|
|
UBCNT = PHDR1+54#, % BLOCK COUNT 24592000
|
|
URCNT = PHDR1+60#, % RECORD COUNT 24593000
|
|
USYSL = PHDR1+67#, % " B6500" 24594000
|
|
% HDR2 24595000
|
|
URF = PHDR2+4#, % RECORD FORMAT 24596000
|
|
UBL = PHDR2+5#, % BLOCK LENGTH 24597000
|
|
URL = PHDR2+10#, % RECORD LENGTH 24598000
|
|
UDNSTY = PHDR2+15#, % DENSITY 24599000
|
|
USNTNL = PHDR2+16#, % SENTINEL 24600000
|
|
UPRTY = PHDR2+17#, % PARITY 24601000
|
|
UFORM = PHDR2+18#, % EXTERNAL FORM 24602000
|
|
UMRL = PHDR2+19#, % MINIMUM RECORD LENGTH 24603000
|
|
UOFS = PHDR2+50#, % OFFSET TO DATA 24604000
|
|
% B3500 USASI LABELS 24605000
|
|
% VOL1 ALL BLANKS EXCEPT "VOL1",SERIAL NUMBER, AND "1" 24606000
|
|
% HDR1 24607000
|
|
B35FID = PHDR1+13#, % B3500 FILE ID 24608000
|
|
B35MFID = PHDR1+21#, % B3500 MULTIPLE FILE ID 24609000
|
|
% NO HDR2 24610000
|
|
% B5500 LABELS 24611000
|
|
% B5500 LABEL 24612000
|
|
LMFID = 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
|
|
FIB0 = FIBSIZE#, 24757200
|
|
FIBUZZ = IF FIBB(FIBLOCKF) THEN BEGIN 24758000
|
|
WHILE BOOLEAN(READLOCK(1,LOCKER)) DO 24759000
|
|
WAIT(IOEVENT[FILEVENT]); 24760000
|
|
RESET(IOEVENT[FILEVENT]) END#, 24761000
|
|
FILEDRCDSIZE=BOOLEAN(RECORDSTATUS.DRCDSIZE)#, 24761050
|
|
FILEMTBUF = BOOLEAN(RECORDSTATUS.MTBUF)#, 24761100
|
|
FILENOTOPEN = RECORDSTATUS.OPENBITS=0#, 24762000
|
|
FILEVENT = LABELATT.EVNTNO#, 24763000
|
|
FILEXCPTN = BOOLEAN(RECORDSTATUS.EXCEPTION)#, 24764000
|
|
FIXEDL = RECORDTYPE=0#, 24764100
|
|
FLINKED = RECORDTYPE=5#, 24764200
|
|
FORMATD = RECORDTYPE=1#, 24764300
|
|
FORMATI = RECORDTYPE=4#, 24764400
|
|
FORMATTER = BOOLEAN(TANKDATA1.PNTR)AND PFOCRCSZ#, 24764450
|
|
FORMATU = RECORDTYPE=3#, 24764500
|
|
FORMATV = RECORDTYPE=2#, 24764600
|
|
FORMSMESSAGE=LEBB(FRMS)#, 24764700
|
|
GENSZ= 4#,% 24766000
|
|
IMPLCTOPN = FILESTATUS.IMPOPEN#, 24767000
|
|
IMPLICITOPEN=NOT BOOLEAN(IMPLCTOPN)#, 24768000
|
|
INOUTPART = DSKS.MYUSEF#, 24769000
|
|
INTERNALMODE = FILESTATUS.INTMODE#, 24770000
|
|
IOCOMPLET = USER@(IOCB).USERIOFINISH#, 24771000
|
|
IOCOMPLETE= BOOLEAN(WORD(USER@IOCB).USERIOFINISH)#, 24772000
|
|
IOCWSKLTN= IOINFO#, 24774000
|
|
IOPENDING = NOT IOCOMPLETE#, 24775000
|
|
IOTERMINATE=BEGIN TRACE(18);TRACE(21)END#, 24776000
|
|
LABELEQTD = BOOLEAN(LABELATT.LBLEQTD)#, 24777000
|
|
LABELTYPE = LABELATT.LABELTYP#, 24778000
|
|
LASTBUFFER=IOAREA~*&ARRAYDESCL(,*,IOAREA[IOAL].BL)#, 24778100
|
|
LASTLENGTH= TANKDATA1.SIZESZ#, 24778200
|
|
LBLEQUATED= LABELATT.LBLEQTD#, 24779000
|
|
LOCKOUT = FILESTATUS.LOCKOUTB#, 24780000
|
|
MAGICNUMBER=150#, 24781000
|
|
MAXGENNO= 9999#,% 24781100
|
|
MAXNO = 549755813887#, 24782000
|
|
MAXRECSZ = TANKDATA2.MAXRECSIZE#, 24783000
|
|
MAXVERNO= 99#,% 24783100
|
|
MINRECSZ = TANKDATA2.MINRECSIZE#, 24784000
|
|
MLTBLCK = TANKDATA1.MLTBLK#, 24785000
|
|
MULTIBLOCK= BOOLEAN(TANKDATA1.MLTBLK)#, 24786000
|
|
NEXTBUFFER=IOAREA~*&ARRAYDESCL(,*,IOAREA[IOAL].FL)#, 24786100
|
|
NOACTION = BOOLEAN(UNITFEATURE.REUSEF)#, 24786200
|
|
NOLINES = UNITFEATURE.ADDRESSF#, 24786600
|
|
NOMORE = BOOLEAN(WORD(USER@IOCB).USEREOFORTBIT)#, 24789000
|
|
NOTOPEN = RECORDSTATUS.OPENBITS=0#, 24791000
|
|
NUMBEROFBUFFERS = TANKDATA3.BUFFASSGND#, 24792000
|
|
NUMLABELS = LABELATT.USERSIZE#, 24794000
|
|
ONEREELREVERSE=BOOLEAN(DSKS.REVACTIONF)#, 24795000
|
|
OPENINPUT = BOOLEAN(RECORDSTATUS.OPNIN)#, 24796000
|
|
OPENIO = RECORDSTATUS.OPENBITS=3#, 24797000
|
|
OPENOUTPUT = BOOLEAN(RECORDSTATUS.OPNOUT)#, 24798000
|
|
OPNINPUT = RECORDSTATUS.OPNIN#, 24799000
|
|
OPNOUTPUT = RECORDSTATUS.OPNOUT#, 24800000
|
|
NOPTIONAL = LEBC.OPTIONALF#, 24801000
|
|
OPTSPACE(SYZE)=GETSPACE(SYZE,0,0,0)#, 24802000
|
|
PARITYERROR=BOOLEAN(WORD(USER@IOCB).USERPARITYBIT)#, 24802100
|
|
PARITYERR = FILESTATUS.PARITYB#, 24802500
|
|
PARITYACTION=FILESTATUS.PARACTION#, 24802600
|
|
PASSED = IOAREA[IOAW].PSSD#, 24803000
|
|
PFOCRCSZ = BOOLEAN(PFOC.DRCDSIZE)#, 24807000
|
|
PFOCMTBUF = BOOLEAN(PFOC.MTBUF)#, 24808000
|
|
PLMT(UT) = ((UT=CARDREADER OR UT=CARDPUNCH1 OR 24810000
|
|
UT=CARDPUNCH2) AND BLOCKSZ>10 OR 24811000
|
|
(UT=BUFFPRINTER OR UT=UNBUFFPRINTER) AND 24812000
|
|
BLOCKSZ>17 24813000
|
|
)#, 24814000
|
|
PNCH(UT) = (UT=CARDPUNCH1 OR UT=CARDPUNCH2)#, 24814010
|
|
POINTEREQD=ARRAYROW#, 24814050
|
|
PRINTSPACE= @200#, 24814100
|
|
PRNTR(UT) = (UT=BUFFPRINTER OR UT=UNBUFFPRINTER)#, 24816000
|
|
PROPERIOACTION = RECORDSTATUS.OPNIN=PFOC.OPNIN#, 24817000
|
|
PROTECTED = LEBC.FPRTCTD#, 24818000
|
|
PRTY = BOOLEAN(FILESTATUS.PARITYB)#, 24819000
|
|
PRTYACTN = FILESTATUS.PARACTION#, 24820000
|
|
RANDOM = ACCESSTYPE=1#, 24821000
|
|
RCRDSZ(A,B)=IF FIXEDL THEN MAXRECSZ ELSE IF FLINKED THEN 24821100
|
|
IF WORDORIENTED THEN M[A.ADDRESSF].FRWRDLNK 24821200
|
|
ELSE REAL(B,WORDSTO).FRWRDLNK ELSE 24821300
|
|
CALCRECSZ(A,FIB)#, 24821400
|
|
RECINBLK = IOAREA[IOAW].RCN#, 24824000
|
|
RECORDMODE = TANKDATA1.SIZEMODE#, 24827000
|
|
RECORDOFF = TANKDATA1.SIZEOFF#, 24828000
|
|
RECORDSZ = TANKDATA1.SIZESZ#, 24829000
|
|
RECORDUNITS=TANKDATA1.RCDUNTS#, 24830000
|
|
RECORDTYPE= TANKDATA1.RCRDTYPE#, 24831000
|
|
RECSIZE = TANKDATA2.MAXRECSIZE#, 24832000
|
|
REQSPACE(SYZE)=GETSPACE(SYZE,0,0&SPACETYPE(0,1,1,0),0)#, 24833000
|
|
REVERSED = BOOLEAN(DIRECTION)#, 24834000
|
|
REVERSETYPE = UNITYP=DISKFILE OR MAGTAPE(UNITYP)#, 24835000
|
|
REWRITE = BOOLEAN(IOAREA[IOAW].RWRT)#, 24836000
|
|
REWRT = IOAREA[IOAW].RWRT#, 24837000
|
|
ROTATEBUFFERS=IF BUFFERED THEN 24837100
|
|
IOCB~REFERENCE(IOAREA~IOADESC~ 24837200
|
|
IOAREA&ARRAYDESCL(,*,IOAREA[IOAL].FL))#, 24837300
|
|
SIZEPROBLEM=FILESTATUS.DATAERRORB#, 24841000
|
|
SKLTN = IOINFO.SKLTNIOCW#, 24843000
|
|
SKLTNSTNDRD = IOINFO.SIOCWSTANDARD#, 24844000
|
|
TANKEY = IOAREA[IOAW].ACTLKY#, 24845000
|
|
TAPEFILE = MAGTAPE(IOINFO.UNITYPP)#, 24846000
|
|
TAPEREWIND=@210#, 24847000
|
|
TAPESPACE = @600#, 24847100
|
|
UNBLOCKED = NOT BOOLEAN(TANKDATA1.BLKD)#, 24848000
|
|
UNITNUMBER=IOINFO.UNITNUM#, 24849000
|
|
UNITYP=IOINFO.UNITYPP#, 24850000
|
|
UNLABELLED= LABELTYPE=1#, 24851000
|
|
UNLOCKFIB = IF FIBB(FIBLOCKF) THEN BEGIN 24852000
|
|
READLOCK(0,LOCKER); 24853000
|
|
CAUSE(IOEVENT[FILEVENT]) END#, 24854000
|
|
USASILABEL= LABELTYPE=0#, 24855000
|
|
VERSZ= 2#,% 24856000
|
|
WORDORIENTED=NOT CHARECORD#, 24856050
|
|
WORDSLEFT = UNITSLEFT#, 24856100
|
|
WORDSTO = CASE INTERNALMODE OF(1,.5,12,8,6,6)#, 24857000
|
|
WORDSTORND= CASE INTERNALMODE OF (0,0,11,7,5,5)#, 24858000
|
|
WRAPAROUND= LABELATT.WRPRND#; 24859000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%24860000
|
|
SAVE PROCEDURE AVAILREMOVE (AVAILZLINK); 30000000
|
|
VALUE AVAILZLINK; 30001000
|
|
INTEGER AVAILZLINK; 30002000
|
|
BEGIN COMMENT REMOVE AN AREA FROM THE AVAILABLE LIST; 30003000
|
|
INTEGER MI ~ AVAILZLINK - M[AVAILZLINK].LENGTHZ + 1; 30004000
|
|
INTEGER T; 30005000
|
|
IF MI-1 = PREVADDR 30006000
|
|
THEN BEGIN COMMENT THE AREA TO BE REMOVED IS THE LARGEST 30007000
|
|
AREA THAT FOLLOWS A NON-OVERLAYABLE AREA. 30008000
|
|
AVAILB CONTAINS THE NEW PREVADDR.; 30009000
|
|
PREVADDR ~ M[MI] 30010000
|
|
END; 30011000
|
|
M[M[MI]].LINK ~ T ~ M[MI-1].LINK; 30012000
|
|
COMMENT PREVIOUS POINTS AT NEXT; 30013000
|
|
M[T+1] ~ M[MI]; 30014000
|
|
COMMENT NEXT POINTS AT PREVIOUS; 30015000
|
|
END OF AVAIL REMOVE; 30016000
|
|
SAVE PROCEDURE ORDER (ADDRESS); 30017000
|
|
VALUE ADDRESS; 30018000
|
|
INTEGER ADDRESS; 30019000
|
|
BEGIN COMMENT ORDER PLACES THE AREA WITH AVAILA AT ADDRESS IN 30020000
|
|
THE AVAILABLE LIST ACCORDING TO THE ARGUMENT IN 30021000
|
|
BITS 47:27 OF THE WORD AT ADDRESS.; 30022000
|
|
INTEGER T; COMMENT THE LINK THIS LINK WILL POINT AT.; 30023000
|
|
REAL RETRIES; 30023100
|
|
IF NOT BOOLEAN (M[ADDRESS].PREOLAY) 30024000
|
|
THEN BEGIN COMMENT UPDATE PREVADDR IF REQUIRED AND DETER- 30025000
|
|
MINE HIGHEST STARTING POINT FOR LLLU OPERATOR.; 30026000
|
|
IF M[ADDRESS].LENGTH > M[PREVADDR].LENGTH 30027000
|
|
THEN PREVADDR ~ ADDRESS; 30028000
|
|
MINDEX ~ AVAILI; 30029000
|
|
END 30030000
|
|
ELSE MINDEX ~ PREVADDR; 30031000
|
|
M[ADDRESS + 1] ~ MINDEX ~ 30032000
|
|
LISTLOOKUP (M[ADDRESS].AVAILKEY, M, MINDEX); 30033000
|
|
M [ADDRESS].LINK ~ T ~ M[MINDEX].LINK; 30034000
|
|
M [MINDEX].LINK ~ ADDRESS; 30035000
|
|
M [T + 1] ~ ADDRESS; 30036000
|
|
IF SPACEQHEAD !0 THEN 30036050
|
|
IF ((RETRIES ~ ( STACK [T~SPACEQHEAD.FASTPLACE, 30036100
|
|
AUTHORITYLINKPLACE]).RETRYCOUNT) =0 30036200
|
|
OR STACK [T, REQUIREDPLACE] { M [ADDRESS].LENGTH) 30036250
|
|
THEN BEGIN 30036300
|
|
DELINKASTACK (T, SPACEQHEAD); 30036400
|
|
CAUSE (AUTHORITYEVENT @(REFERENCE(STACK[T,*]))); 30036500
|
|
END 30036600
|
|
ELSE STACK [T, AUTHORITYLINKPLACE].RETRYCOUNT ~ RETRIES - 1; 30036650
|
|
END OF ORDERING AVAILABLE LIST; 30037000
|
|
DEFINE GETLEFTOFF (ADDRESS) = 30038000
|
|
IF ADDRESS = LEFTOFF 30039000
|
|
THEN LEFTOFF ~ M[M[ADDRESS].INUSELENGTH + ADDRESS].FRONTLINK; 30040000
|
|
#; 30041000
|
|
DEFINE CONSOLIDATE (ADDRESS, MINDEX) = 30042000
|
|
BEGIN 30043000
|
|
MLENGTH ~ M[ADDRESS].INUSELENGTH; 30044000
|
|
IF BOOLEAN (M [MINDEX ~ ADDRESS + M[ADDRESS].INUSELENGTH +1] 30045000
|
|
.AVAILABLE) 30046000
|
|
THEN BEGIN 30047000
|
|
MLENGTH ~ * + (T ~ M[MINDEX].LENGTH) + 1; 30048000
|
|
AVAILREMOVE (MINDEX + T); 30049000
|
|
END; 30050000
|
|
IF BOOLEAN (M[ADDRESS - 1].AVAILABLE) 30051000
|
|
THEN BEGIN COMMENT PREVIOUS AREA IS AVAILABLE; 30052000
|
|
MLENGTH ~ * + (T ~ M[ADDRESS - 1].LENGTHZ)+1; 30053000
|
|
MINDEX ~ ADDRESS - T - 1; 30054000
|
|
AVAILREMOVE (ADDRESS-1); 30055000
|
|
END 30056000
|
|
ELSE MINDEX ~ ADDRESS; 30057000
|
|
END 30058000
|
|
#; 30059000
|
|
SAVE BOOLEAN PROCEDURE TURNOVERLAYKEY (ADDRESSOFMOM); 30060000
|
|
VALUE ADDRESSOFMOM; 30061000
|
|
INTEGER ADDRESSOFMOM; 30062000
|
|
BEGIN COMMENT IF THE SPACE POINTED AT BY MOM IS PRESENT AND 30063000
|
|
NON-OVERLAYABLE, SET IT TO ITS PERMANENT STATE 30064000
|
|
AND RETURN TRUE OTHERWISE RETURN FALSE; 30065000
|
|
WORD MOM, ZLINK; 30066000
|
|
INTEGER T, TA, I; 30067000
|
|
BOOLEAN B; 30067100
|
|
LABEL AWAY; 30067200
|
|
IF B ~ UNLOCK (SPACELOCK) THEN BUZZCONTROL (SPACELOCK); 30068000
|
|
MOM ~ M[ADDRESSOFMOM]; 30069000
|
|
IF MOM.PBITF =1 30070000
|
|
THEN BEGIN COMMENT MOM HAS SPACE TO CHANGE; 30071000
|
|
T ~ (TA ~ MOM.ADDRESSF) - LINKSIZE - 1; 30072000
|
|
DO I ~ * + M[TA ~ * -1].TAG UNTIL TA =T; 30072100
|
|
IF I ! (LINKSIZE + 1) | MEMLINK 30072200
|
|
THEN GO AWAY; 30072300
|
|
T ~ * + 1; 30072400
|
|
ZLINK ~ M[T ~ T + M[T].INUSELENGTH]; 30073000
|
|
IF TURNOVERLAYKEY ~ ZLINK.SPACEOLAYLOCK =0 30074000
|
|
THEN M[T].SPACEOLAYLOCK ~ ZLINK.OLAY; 30075000
|
|
END; 30076000
|
|
AWAY: 30076100
|
|
IF B THEN UNLOCK (SPACELOCK); 30077000
|
|
END TURNOVERLAYKEY; 30078000
|
|
SAVE PROCEDURE MAKEPRESENTANDSAVE (DATA); 30078100
|
|
WORD ARRAY DATA [*]; 30078200
|
|
BEGIN 30078300
|
|
WORD MPS; MONITOR DONMONITOR (MPS); MPS ~ DATA; %%%%%%%% 30078380
|
|
DATA [0] ~ *; 30078500
|
|
COMMENT * * * * * * FIX IOFINISH TURNOLAYKEY 2/17 30078599
|
|
M[DATA.ADDRESSF + DATA.LENGTHF].SPACEOLAYLOCK ~ 0; 30078600
|
|
END OF INSURING PRESENCE AND SAVING DATA; 30078800
|
|
SAVE INTEGER PROCEDURE CONSOLIDATEANDORDER(ADDRESS); 30156000
|
|
VALUE ADDRESS; 30157000
|
|
INTEGER ADDRESS; 30158000
|
|
BEGIN 30159000
|
|
INTEGER MINDEX, T; 30160000
|
|
WORD ZLINK; 30161000
|
|
CONSOLIDATE (ADDRESS, MINDEX); 30162000
|
|
ZLINK ~ M[MINDEX-1]; 30163000
|
|
T ~ REAL(ZLINK.OLAY = 1 OR ZLINK.SPACEOLAYLOCK = 1); 30164000
|
|
M[MINDEX] ~ 0 & AVAILA (, T,MLENGTH, , *); 30165000
|
|
M[MINDEX ~ MLENGTH] ~ 0 & AVAILZ (,, MLENGTH); 30166000
|
|
ORDER (MINDEX); 30167000
|
|
CONSOLIDATEANDORDER ~ MINDEX; 30168000
|
|
END OF CONSOLIDATING RETURNED AREA AND ORDERING IT IN LIST; 30169000
|
|
SAVE INTEGER PROCEDURE FORGETSPACE(ADDRESS); 30170000
|
|
VALUE ADDRESS; 30171000
|
|
INTEGER ADDRESS; 30172000
|
|
BEGIN COMMENT RETURN THE SPACE DESCRIBED BY THE IN-USE LINK 30173000
|
|
POINTED AT BY ADDRESS TO THE AVAILABLE LIST. 30174000
|
|
WHEN "ADDRESS" IS POSITVE CONSOLIDATION WITH 30175000
|
|
ADJACENT AVAILABLE AREAS IS PERFORMED AND THE 30176000
|
|
LIST IS RE-ORDERED AND THE NEW ADDRESS IS 30177000
|
|
RETURNED. WHEN "ADDRESS" IS NEGATIVE CONSOLI- 30178000
|
|
DATION AND ORDERING ARE NOT PERFORMED.; 30179000
|
|
LABEL AWAY; 30180000
|
|
INTEGER TADDR ~ ABS (ADDRESS) - LINKSIZE, 30181000
|
|
FRONTLNK, 30182000
|
|
30183000
|
|
T, COMMENT TEMPORARY; 30184000
|
|
TRACTER, 30185000
|
|
MINDEX; 30186000
|
|
TRACTER~TRACE(0); 30186100
|
|
MINDEX ~ TADDR -1; 30187000
|
|
DO T ~ *+M[MINDEX].TAG UNTIL MINDEX ~ * +1 = ABS(ADDRESS); 30188000
|
|
IF T ! (LINKSIZE +1) | MEMLINK 30189000
|
|
THEN BEGIN 30190000
|
|
FORGETSPACE ~ -MINDEX; 30191000
|
|
GO AWAY; 30192000
|
|
END; 30193000
|
|
FRONTLNK ~ M[TADDR + M[TADDR].INUSELENGTH].FRONTLINK; 30194000
|
|
IF FRONTLNK ! 0 30195000
|
|
THEN BEGIN COMMENT REMOVE AREA FROM IN-USE LIST; 30196000
|
|
M[FRONTLNK].BACKLINK ~ MINDEX ~ M[TADDR ].BACKLINK; 30197000
|
|
M[MINDEX + M[MINDEX].INUSELENGTH].FRONTLINK ~ 30198000
|
|
M[TADDR + M[TADDR ].INUSELENGTH].FRONTLINK; 30199000
|
|
END 30200000
|
|
ELSE BEGIN COMMENT AREA BEING FORGOTTEN WAS LAST ALLOCATED;30201000
|
|
BACKALLOCATED ~ M[TADDR ].LINK; 30202000
|
|
M[M[BACKALLOCATED].INUSELENGTH + BACKALLOCATED]. 30203000
|
|
FRONTLINK ~ 0; 30204000
|
|
END; 30205000
|
|
GETLEFTOFF (TADDR); 30206000
|
|
IF ADDRESS > 0 30207000
|
|
THEN BEGIN COMMENT CONSOLIDATE WITH ADJACENT AVAILABLE 30208000
|
|
AREAS AND ORDER NEW AREA IN LIST; 30209000
|
|
FORGETSPACE ~ CONSOLIDATEANDORDER (TADDR); 30210000
|
|
END 30211000
|
|
ELSE FORGETSPACE ~ ADDRESS; 30212000
|
|
AWAY: 30213000
|
|
TRACE(TRACTER); 30214000
|
|
UNLOCK (SPACELOCK); 30214100
|
|
END OF FORGETSPACE; 30215000
|
|
SAVE PROCEDURE OVERLAY (ADDRESS); VALUE ADDRESS; INTEGER ADDRESS; ; 30216000
|
|
SAVE REAL PROCEDURE GETSPACE (SIZE, WHOFOR, TYPE, ADDRESS); 30217000
|
|
VALUE SIZE, WHOFOR, TYPE, ADDRESS; 30218000
|
|
INTEGER SIZE, WHOFOR, TYPE; 30219000
|
|
REAL ADDRESS; 30220000
|
|
BEGIN COMMENT 30221000
|
|
;30222000
|
|
LABEL OVERSRCH, STARTSRCH, TRUBLE, AROUND, ALLDONE; 30223000
|
|
LABEL RETRY; 30223100
|
|
INTEGER S ~ SIZE + LINKSIZE, 30224000
|
|
START, 30225000
|
|
ARGS; 30226000
|
|
INTEGER TRACTER; COMMENT SAVE AND RESTORE TRACE; 30227000
|
|
BOOLEAN TRYAGAIN; 30227100
|
|
SAVE INTEGER PROCEDURE TROUBLE (REQ); 30228000
|
|
VALUE REQ; 30229000
|
|
INTEGER REQ; 30230000
|
|
BEGIN COMMENT TROUBLE IS RESPONSIBLE FOR CHASING THE LEFT-OFF 30231000
|
|
LIST AND RETURNING WITH AN ADDRESS OF AN AREA 30232000
|
|
THAT WILL SATISFY THE SIZE REQUIREMENT (REQ). 30233000
|
|
IF AN ADEQUATE AREA CANNOT BE FOUND, A NEGATIVE 30234000
|
|
VALUE IS RETURNED. 30235000
|
|
;30236000
|
|
INTEGER LEFTOFFT ~ LEFTOFF, COMMENT THE NEXT ADDRESS IN THE30237000
|
|
LEFT-OFF LIST.; 30238000
|
|
R, COMMENT TEMPORARY REQ; 30239000
|
|
MINDEX, 30240000
|
|
INITIAL, COMMENT THE ABSOLUTE ADDRESS OF THE AREA 30241000
|
|
BEING MADE AVAILABLE.; 30242000
|
|
FINAL; COMMENT THE FINAL ADDRESS OF THE AREA 30243000
|
|
BEING MADE AVAILABLE.; 30244000
|
|
BOOLEAN FIRST, COMMENT WHEN TRUE THE SUCCEEDING AS 30245000
|
|
WELL AS PRECEDING AREAS ARE EXAMINED 30246000
|
|
FOR AVAILABILITY.; 30247000
|
|
AVAILB; COMMENT TRUE WHEN THE ADDRESS OF AN 30248000
|
|
IN-USE AREA HAS BEEN RECORDED FOR 30249000
|
|
OVERLAY BECAUSE OF THE AVAILABILITY OF30250000
|
|
AN ADJACENT AREA.; 30251000
|
|
LABEL NEXT, 30252000
|
|
EXIT; 30253000
|
|
WORD TLINK; COMMENT TEMPORARY MEMORY LINK.; 30254000
|
|
MONITOR DONMONITOR 30254100
|
|
(R 30254200
|
|
,INITIAL 30254300
|
|
,FINAL 30254400
|
|
, TLINK); 30254500
|
|
IF TYPE.MAKEROOM = 0 30255000
|
|
THEN BEGIN 30256000
|
|
MINDEX ~ -1; 30257000
|
|
GO EXIT; 30258000
|
|
END; 30259000
|
|
NEXT: COMMENT EXAMINE NEXT AREA IN LEFT=OFF LIST.; 30260000
|
|
SETINTERVALTIMER; 30260100
|
|
R ~ REQ; 30261000
|
|
MINDEX ~ LEFTOFFT; 30262000
|
|
FIRST ~ TRUE; 30263000
|
|
DO BEGIN COMMENT BY-PASS NON-OVERLAYABLE ITEMS LEFT- 30264000
|
|
OFF LIST.; 30265000
|
|
IF LEFTOFFT !0 THEN 30266000
|
|
IF NOT BOOLEAN ((TLINK ~ M[LEFTOFFT + M[LEFTOFFT] 30267000
|
|
.INUSELENGTH]).SPACEOLAYLOCK) 30268000
|
|
THEN MINDEX ~ LEFTOFFT ~ TLINK.FRONTLINK; 30269000
|
|
END UNTIL BOOLEAN(TLINK.SPACEOLAYLOCK) OR LEFTOFFT = 0; 30270000
|
|
IF MINDEX = 0 30271000
|
|
THEN BEGIN COMMENT LEFT-OFF LIST HAS BEEN EXHAUSTED.; 30272000
|
|
MINDEX ~ -(IF BOOLEAN (TYPE.SLEEPY) THEN 3 ELSE 5) 30273000
|
|
+ TYPE.PRINTNOMEM; 30274000
|
|
GO EXIT; 30275000
|
|
END; 30276000
|
|
FINAL ~ M[MINDEX].INUSELENGTH + MINDEX; 30277000
|
|
LEFTOFFT ~ TLINK.FRONTLINK; 30278000
|
|
WHILE R > 0 30279000
|
|
DO BEGIN COMMENT EXAMINE THIS AREA AND ADJACENT AREAS 30280000
|
|
IN DESCENDING MEMORY LOCATIONS UNTIL R { 0 OR 30281000
|
|
A NON-OVERLAYABLE AREA IS ENCOUNTERED.; 30282000
|
|
AVAILB ~ FALSE; 30283000
|
|
IF FIRST 30284000
|
|
THEN BEGIN COMMENT THE FIRST TIME THE AREA SUC- 30285000
|
|
CEEDING THE LEFT-OFF AREA MUST BE EX- 30286000
|
|
AMINED FOR AVAILABILITY.; 30287000
|
|
IF INITSWITCH 30287100
|
|
THEN BEGIN 30287200
|
|
LEFTOFF ~ MINDEX; 30287300
|
|
INITSWITCH ~ FALSE; 30287400
|
|
END; 30287500
|
|
INITIAL ~ MINDEX; 30288000
|
|
FIRST ~ FALSE; 30289000
|
|
IF BOOLEAN ((TLINK ~ M[(FINAL ~ MINDEX + 30290000
|
|
M[MINDEX].INUSELENGTH+1)]).AVAILABLE) 30291000
|
|
THEN BEGIN 30292000
|
|
INITIAL ~ MINDEX; 30293000
|
|
FINAL ~ FINAL + TLINK.LENGTH +1; 30294000
|
|
AVAILB ~ TRUE; 30295000
|
|
R ~ R - TLINK.LENGTH 30296000
|
|
- M[MINDEX].INUSELENGTH; 30297000
|
|
END; 30298000
|
|
END; 30299000
|
|
IF BOOLEAN ((TLINK ~ M[MINDEX - 1]).AVAILABLE) 30300000
|
|
THEN BEGIN COMMENT ALL AREAS PRECEDING IN-USE 30301000
|
|
AREAS ARE EXAMINED FOR AVAILABILITY.; 30302000
|
|
INITIAL ~ MINDEX - TLINK.LENGTHZ - 1; 30303000
|
|
R ~ R - TLINK.LENGTHZ - 30304000
|
|
(IF AVAILB THEN 1 ELSE M[MINDEX] 30305000
|
|
.INUSELENGTH); 30306000
|
|
AVAILB ~ TRUE; 30307000
|
|
END 30308000
|
|
ELSE INITIAL ~ MINDEX; 30308100
|
|
R ~ R-(IF AVAILB THEN 1 ELSE M[MINDEX].INUSELENGTH); 30309000
|
|
IF R > 0 30310000
|
|
AND NOT BOOLEAN (M[INITIAL - 1].SPACEOLAYLOCK) 30311000
|
|
THEN GO NEXT; 30312000
|
|
MINDEX ~ INITIAL -1 - M[INITIAL -1].INUSELENGTHZ; 30313000
|
|
END; 30314000
|
|
IF BOOLEAN ((TLINK ~ M[INITIAL - 1]).AVAILABLE) 30315000
|
|
THEN INITIAL ~ INITIAL - TLINK.LENGTHZ -1; 30316000
|
|
MINDEX ~ INITIAL; 30317000
|
|
DO IF AVAILB ~ BOOLEAN ( (TLINK ~ M[MINDEX]).AVAILABLE) 30318000
|
|
THEN BEGIN 30319000
|
|
AVAILREMOVE (MINDEX + TLINK.LENGTH); 30320000
|
|
R ~ TLINK.LENGTH; 30321000
|
|
END 30322000
|
|
ELSE R ~ TLINK.INUSELENGTH 30323000
|
|
UNTIL MINDEX ~ * + R + 1 > FINAL; 30324000
|
|
MINDEX ~ INITIAL; 30325000
|
|
DO IF NOT AVAILB ~ BOOLEAN ((TLINK ~ M[MINDEX]).AVAILABLE) 30326000
|
|
THEN BEGIN 30327000
|
|
GLOBALSTOP; 30327100
|
|
OVERLAY (MINDEX + LINKSIZE); 30328000
|
|
FORGETSPACE (-MINDEX - LINKSIZE); 30329000
|
|
R ~ TLINK.INUSELENGTH; 30330000
|
|
END 30331000
|
|
ELSE R ~ TLINK.LENGTH 30332000
|
|
UNTIL MINDEX ~ * + R + 1 > FINAL; 30333000
|
|
MINDEX ~ INITIAL; 30334000
|
|
EXIT: 30335000
|
|
IF TROUBLE ~ MINDEX > 0 30336000
|
|
THEN BEGIN COMMENT MAKE AREA LOOK AVAILABLE.; 30337000
|
|
M[INITIAL] ~ 0 & AVAILA(,*, FINAL-INITIAL,, *); 30338000
|
|
M[FINAL] ~ 0 & AVAILZ (,, FINAL - INITIAL); 30339000
|
|
END; 30340000
|
|
END OF TROUBLE; 30341000
|
|
SAVE INTEGER PROCEDURE ALOCATE (SIZE, MINDEX); 30342000
|
|
VALUE SIZE, MINDEX; 30343000
|
|
INTEGER SIZE, MINDEX; 30344000
|
|
BEGIN COMMENT ALOCATE ASSIGNS IN-USE LINKS FOR AN AREA OF SIZE30345000
|
|
SOMEWWERE IN THE AREA STARTING AT MINDEX. NON- 30346000
|
|
OVERLAYABLE AREAS ARE ASSIGNED AT THE FRONT OF 30347000
|
|
AN AREA. THAT PORTION OF AN AREA THAT IS NOT 30348000
|
|
USED IS RETURNED TO THE AVAILABLE LIST.; 30349000
|
|
INTEGER AVLINK; 30350000
|
|
IF (MLENGTH ~ M[MINDEX].LENGTH- SIZE - 1) { LINKSIZE 30351000
|
|
THEN SIZE ~ SIZE + MLENGTH + 1; 30352000
|
|
IF TYPE.OERLAY = 0 30353000
|
|
THEN AVLINK ~ MINDEX + SIZE + 1 30354000
|
|
ELSE BEGIN 30355000
|
|
AVLINK ~ MINDEX; 30356000
|
|
MINDEX ~ M[MINDEX].LENGTH - SIZE + AVLINK; 30357000
|
|
IF LEFTOFF { 0 THEN LEFTOFF ~ MINDEX; 30358000
|
|
END; 30359000
|
|
M[MINDEX + SIZE] ~ 0 & LINKZ(, REAL(TYPE.OERLAY=1 AND 30360000
|
|
ADDRESS!0),,,,, SIZE); 30361000
|
|
IF MLENGTH > LINKSIZE 30362000
|
|
THEN BEGIN 30363000
|
|
M[AVLINK] ~ 0 & AVAILA 30364000
|
|
(, M[AVLINK-1].OLAY, MLENGTH, ,*); 30365000
|
|
COMMENT ORDER WILL SUPPLY LINK; 30366000
|
|
M[AVLINK + MLENGTH] ~ 0 & AVAILZ 30367000
|
|
(, , MLENGTH); 30368000
|
|
ORDER (AVLINK); 30369000
|
|
END; 30370000
|
|
M[MINDEX] ~ 0 & LINKA (, WHOFOR, SIZE, *, BACKALLOCATED); 30371000
|
|
M[MINDEX + 1] ~ 0 & LINKB 30372000
|
|
(, % TAG =3 30373000
|
|
, % USAGE 30374000
|
|
*, % ADDRESS TYPE - ABSOLUTE FOR NOW 30375000
|
|
ADDRESS, % OF MOM 30376000
|
|
IF ADDRESS ! 0 THEN M[ADDRESS].ADDRESSF ELSE 0); % DISK 30377000
|
|
COMMENT NUMEROUS UNANSWERED QUESTIONS.; 30378000
|
|
M[MINDEX +2] ~ 0 & LINKC ( ); COMMENT UNUSED; 30379000
|
|
M[BACKALLOCATED + M[BACKALLOCATED].INUSELENGTH].FRONTLINK ~ 30380000
|
|
MINDEX; 30381000
|
|
BACKALLOCATED ~ MINDEX; 30382000
|
|
ALOCATE ~ MINDEX + LINKSIZE; 30383000
|
|
END OF ALOCATE; 30384000
|
|
TRACTER ~ TRACE(0); COMMENT TURN OFF & SAVE TRACE; 30385000
|
|
BUZZCONTROL (SPACELOCK); 30385100
|
|
RETRY: 30385200
|
|
MINDEX ~ M[STOPPER + 1]; 30386000
|
|
IF BOOLEAN (TYPE.OERLAY) 30387000
|
|
THEN BEGIN COMMENT LOOK FOR AN AREA ADJACENT TO OVERLAY- 30388000
|
|
ABLE STORAGE.; 30389000
|
|
IF S { M[MINDEX].LENGTH 30390000
|
|
AND BOOLEAN (M[MINDEX].PREOLAY) 30391000
|
|
THEN BEGIN COMMENT START SEARCH IN OVERLAYABLE 30392000
|
|
PORTION OF LIST; 30393000
|
|
OVERSRCH: START ~ PREVADDR; 30394000
|
|
ARGS ~ 1 & LLLUARG (1, S); 30395000
|
|
END 30396000
|
|
ELSE IF S > M[PREVADDR].LENGTH 30397000
|
|
THEN GO TRUBLE 30398000
|
|
ELSE BEGIN 30399000
|
|
STARTSRCH: START ~ AVAILI; 30400000
|
|
ARGS ~ 1 & LLLUARG (0, S); 30401000
|
|
END 30402000
|
|
END 30403000
|
|
ELSE IF S > M[PREVADDR].LENGTH 30404000
|
|
THEN IF S > M[MINDEX].LENGTH THEN GO TRUBLE ELSE GO 30405000
|
|
OVERSRCH 30406000
|
|
ELSE GO STARTSRCH; 30407000
|
|
MINDEX ~ M[LISTLOOKUP(ARGS, M, START)].LINK; 30408000
|
|
AVAILREMOVE (MINDEX + M[MINDEX].LENGTH); 30409000
|
|
GO AROUND; 30410000
|
|
TRUBLE: MINDEX ~ TROUBLE(S); 30411000
|
|
IF MINDEX < 1 30412000
|
|
THEN BEGIN 30413000
|
|
SAVE PROCEDURE DAMMIT; 30413020
|
|
BEGIN 30413040
|
|
EVENT SPACESHOT; 30413160
|
|
TRYAGAIN ~ FALSE; 30413200
|
|
QUEUEMYSTACK (STACK[WHOFOR, PRIORITYPLACE], S, SPACERETRY, 30413400
|
|
SPACESHOT, SPACEQHEAD); 30413500
|
|
UNLOCK (SPACELOCK); 30413760
|
|
WAIT (SPACESHOT); 30413780
|
|
BUZZ (SPACELOCK); 30413800
|
|
TRYAGAIN ~ TRUE; 30413810
|
|
END OF QUEUEING UNSATISFIED REQUEST; 30413820
|
|
SAVE PROCEDURE SPOUTIT; 30413840
|
|
BEGIN 30413860
|
|
END OF SPOUTIT; 30413980
|
|
CASE ABS (MINDEX) OF 30413990
|
|
BEGIN 30414000
|
|
; COMMENT - SHOULD NEVER HAPPEN 0;30415000
|
|
; COMMENT - NO OVERLAY, SPOUT OR SLEEP 1;30416000
|
|
BEGIN 30417000
|
|
SPOUTIT; DAMMIT; % 2 30418000
|
|
END; 30419000
|
|
BEGIN 30420000
|
|
DAMMIT; % 3 30421000
|
|
END; 30422000
|
|
BEGIN 30423000
|
|
SPOUTIT; 30424000
|
|
END; 30425000
|
|
BEGIN 30426000
|
|
30427000
|
|
END; 30428000
|
|
END 30429000
|
|
END OF UNSATISFIED REQUESTS; 30429100
|
|
IF TRYAGAIN THEN GO RETRY ELSE IF MINDEX < 0 THEN GO ALLDONE; 30430000
|
|
AROUND: MINDEX ~ ALOCATE (S, MINDEX); 30431000
|
|
ALLDONE: GETSPACE ~ MINDEX; 30436000
|
|
UNLOCK (SPACELOCK); 30436100
|
|
TRACE (TRACTER); COMMENT RESTORE TRACE; 30437000
|
|
END OF GETSPACE; 30438000
|
|
SAVE PROCEDURE MOMTOVECTOR (MOM, VECTOR, INDEX); 30439000
|
|
VALUE COMMENT A COPY OR MOM DESCRIPTOR THAT IS AC- 30440000
|
|
CEPTABLE TO PRESENCE BIT; 30441000
|
|
COMMENT AN-UNINDEXED DESCRIPTOR THAT IS AC- 30442000
|
|
CEPTABLE TO AN NXLN OPERATOR; 30443000
|
|
INDEX; COMMENT THE INDEX FOR VECTOR WHERE MOM IS TO 30444000
|
|
BE PLACED; 30445000
|
|
WORD ARRAY MOM[*], 30446000
|
|
VECTOR[*]; 30447000
|
|
INTEGER INDEX; 30448000
|
|
BEGIN 30449000
|
|
MOM[0] ~ *; 30456000
|
|
VECTOR[INDEX] ~ MOM & SETCOPYBIT (0); 30457000
|
|
M [MOM.ADDRESSF - LINKSIZE +1].ADDRMOM ~ VECTOR.ADDRESSF+INDEX;30458000
|
|
END MOM TO VECTOR OR QUEUE; 30459000
|
|
30460000
|
|
SAVE PROCEDURE QUEUEMYSTACK (AUTHORITY, REQUIRED, COUNT, MYEVENT, HEAD);30461000
|
|
VALUE AUTHORITY, COMMENT THE SORTKEY FOR THIS QUEUE; 30462000
|
|
REQUIRED, COMMENT AN ADDITIONAL INFORMATION WORD FOR THE 30463000
|
|
QUEUE ENTRY; 30464000
|
|
COUNT; COMMENT A 10 BIT COUNTER IN THE STACK LINK 30465000
|
|
WORD FOR THIS QUEUE; 30466000
|
|
REAL HEAD ; COMMENT A GLOBAL REAL THAT CONTAINS THE BACK- 30467000
|
|
WARD AND FORWARD LINKS FOR THE QUEUE. THE BACK 30468000
|
|
WARD LINK POINTS TO THE ENTRY WITH THE HIGHEST 30469000
|
|
AUTHORITY; 30470000
|
|
EVENT MYEVENT; COMMENT THE EVENT THAT IS WAITED UPON AND 30471000
|
|
CAUSED BY THE CALLER; 30472000
|
|
REAL AUTHORITY, 30473000
|
|
REQUIRED; 30474000
|
|
INTEGER COUNT; 30475000
|
|
BEGIN COMMENT PLACE MYEVENT, REQUIRED AND AUTHORITY IN MY30476000
|
|
STACK AND PLACE MY STACK IN THE QUEUE POINTED AT30477000
|
|
BY HEAD BASED ON AUTHORITY.; 30478000
|
|
INTEGER FASTER, % THAN ME 30479000
|
|
SLOWER, % THAN ME 30480000
|
|
FASTEST, % ACCORDING TO HEAD 30481000
|
|
SLOWEST, % DITTO 30482000
|
|
I, % THE NEXT FASTEST ENTRY 30483000
|
|
INDEX, % THE ENTRY FASTER THAN MINE 30484000
|
|
ME ; % THE CALLERS (AND MY) STACK 30485000
|
|
MONITOR DONMONITOR (ME, HEAD, 30485100
|
|
SLOWER, 30485200
|
|
FASTER, 30485300
|
|
I); 30485400
|
|
ARRAY MY [*]; 30486000
|
|
REFERENCE MYREFERENCE = MY; 30486100
|
|
LABEL AHEAD, AROUND; 30487000
|
|
DEFINE AUTHORITYLINKL = READYWAITLINK#; 30488000
|
|
MY ~ STACK [ME ~ SNR, *]; 30489000
|
|
STOREITEM (AUTHORITYEVENT@(MYREFERENCE), MYEVENT); 30490000
|
|
MY [AUTHORITYPLACE] ~ AUTHORITY; 30492000
|
|
MY [REQUIREDPLACE] ~ REQUIRED; 30493000
|
|
SLOWEST ~ HEAD.SLOWPLACE; 30495000
|
|
IF I ~ FASTEST ~ HEAD.FASTPLACE = 0 30496000
|
|
THEN BEGIN COMMENT AN EMPTY HEAD; 30497000
|
|
%FASTER ~ SLOWER ~ 0; 30498000
|
|
HEAD ~ 0 & AUTHORITYLINKL(ME, ME); 30499000
|
|
GO AROUND; 30500000
|
|
END; 30501000
|
|
WHILE AUTHORITY { STACK [I, AUTHORITYPLACE] 30502000
|
|
DO BEGIN COMMENT I"M HIGHER LOOK FOR LESSER OR LEAST; 30503000
|
|
INDEX ~ I; 30504000
|
|
IF I ~ STACK[I, AUTHORITYLINKPLACE].SLOWPLACE = 0 30505000
|
|
THEN GO AHEAD; 30506000
|
|
END; 30507000
|
|
IF I = FASTEST 30508000
|
|
THEN BEGIN COMMENT I"M FASTER THAN THE FASTEST - TELL EM;30509000
|
|
STACK [SLOWER ~ FASTEST, AUTHORITYLINKPLACE]. 30510000
|
|
FASTPLACE ~ ME; 30511000
|
|
HEAD.FASTPLACE ~ ME; 30512000
|
|
% FASTER ~ 0; 30513000
|
|
GO AROUND; 30514000
|
|
END 30515000
|
|
ELSE BEGIN COMMENT THERE ARE HIGHER & LOWER AUTHORITIES; 30516000
|
|
FASTER ~ INDEX; 30517000
|
|
SLOWER ~ STACK [INDEX, AUTHORITYLINKPLACE].SLOWPLACE;30518000
|
|
STACK[FASTER, AUTHORITYLINKPLACE].SLOWPLACE ~ ME; 30519000
|
|
STACK[SLOWER,AUTHORITYLINKPLACE].FASTPLACE ~ ME; 30520000
|
|
GO AROUND END; 30521000
|
|
AHEAD: STACK [FASTER ~ SLOWEST, AUTHORITYLINKPLACE].SLOWPLACE ~ ME; 30522000
|
|
HEAD.SLOWPLACE ~ ME; 30523000
|
|
% SLOWER ~ 0; NOBODY IS SLOWER THAN ME 30524000
|
|
AROUND: MY [AUTHORITYLINKPLACE] ~ 0 & AUTHORITYLINKL 30525000
|
|
(FASTER, SLOWER, COUNT); 30526000
|
|
END; 30527000
|
|
PROCEDURE DELINKASTACK (WHOSE, HEAD); 30528000
|
|
VALUE WHOSE; 30529000
|
|
INTEGER WHOSE; COMMENT THE AUTHORITY TYPE STACK TO DELINK; 30530000
|
|
REAL HEAD ; COMMENT THE HEAD OF THE AUTHORITY TYPE STACK; 30531000
|
|
BEGIN COMMENT UNDO ALL THE GOOD WORK OF QUEUEMYSTACK; 30532000
|
|
INTEGER SLOWEST, 30533000
|
|
FASTEST, 30534000
|
|
SLOWER, 30535000
|
|
FASTER; 30536000
|
|
REAL LINK; 30537000
|
|
MONITOR DONMONITOR (HEAD 30537100
|
|
); 30537200
|
|
ARRAY WHO [*]; 30538000
|
|
LABEL AWAY; 30539000
|
|
DEFINE ALP = WHO [AUTHORITYLINKPLACE]#; 30540000
|
|
WHO ~ STACK [WHOSE, *]; 30541000
|
|
SLOWEST ~ HEAD.SLOWPLACE; 30542000
|
|
FASTEST ~ HEAD.FASTPLACE; 30543000
|
|
IF SLOWEST = FASTEST 30544000
|
|
THEN BEGIN COMMENT ONLY ONE ENTRY; 30545000
|
|
IF WHOSE!SLOWEST THEN EXIT; % CALLER GOOFED 30546000
|
|
HEAD ~ 0; 30547000
|
|
END 30548000
|
|
ELSE IF WHOSE=FASTEST 30549000
|
|
THEN BEGIN COMMENT SLOWER OF WHOSE IS FASTEST; 30550000
|
|
HEAD.FASTPLACE~SLOWER~WHO[AUTHORITYLINKPLACE]. 30551000
|
|
SLOWPLACE; 30552000
|
|
STACK [SLOWER, AUTHORITYLINKPLACE].FASTPLACE ~0;30553000
|
|
END 30554000
|
|
ELSE IF WHOSE = SLOWER 30555000
|
|
THEN BEGIN COMMENT FASTER OF WHOSE IS SLOWEST; 30556000
|
|
HEAD.SLOWPLACE ~ FASTER ~ ALP.FASTPLACE; 30557000
|
|
STACK [SLOWER, AUTHORITYLINKPLACE]. 30558000
|
|
SLOWPLACE ~ 0; 30559000
|
|
END 30560000
|
|
ELSE BEGIN 30561000
|
|
FASTER ~(LINK ~ ALP).FASTPLACE; 30562000
|
|
SLOWER ~ LINK.SLOWPLACE; 30563000
|
|
STACK[FASTER, AUTHORITYLINKPLACE]. 30564000
|
|
SLOWPLACE ~ SLOWER; 30565000
|
|
STACK[SLOWER, AUTHORITYLINKPLACE]. 30566000
|
|
FASTPLACE ~ FASTER 30567000
|
|
END; 30568000
|
|
ALP ~ 0; 30569000
|
|
END OF DELINKING A QUEUE; 30570000
|
|
SAVE INTEGER PROCEDURE GETAREA(SIZE); VALUE SIZE; INTEGER SIZE; 31000000
|
|
COMMENT GETAREA SEARCHES BLOCKOFAREASQUE FOR A BLOCK OF A GIVEN SIZE 31001000
|
|
AREA. IF BLOCK IS NOT IN THE QUEUE IT CALLS GETSPACE PROCEDURE31002000
|
|
AND BUILDS UP AREASTATUS WORD FOR THE OBTAINED BLOCK- IT THEN 31003000
|
|
MAKES ENTRY INTO THE QUEUE, IT RESETS BIT REPRESNTING THE 31004000
|
|
FIRST AREA OF THE BLOCK AND RETURNS BASE ADDRESS OF THE BLOCK.31005000
|
|
IF BLOCK IS IN QUEUE,IT FINDS BITNO REPRESENTING AVAILABLE 31006000
|
|
AREA, RESETS THAT BIT IN AREASTATUSBITS FIELD AND RETURNS THE 31007000
|
|
ADDRESS AS BASE ADDRESS OF BLOCK INDEXED BY (BITNO-1). 31008000
|
|
SIZE -SIZE OF AREA IN NO. OF WORDS; 31009000
|
|
BEGIN 31010000
|
|
DEFINE AREASIZEF=AREASIZEFF#; 31011000
|
|
REFERENCE BLOCKPOINTER; COMMENT CURRENT POINTER OF QUEUE; 31012000
|
|
ARRAY QENTRY =BLOCKPOINTER [*]; 31013000
|
|
REAL AREASTATUSWORD; COMMENT LOCAL FOR AREASTATUS ITEM; 31014000
|
|
INTEGER BITNO; COMMENT BIT NO. FOR AVAILABLE AREA; 31015000
|
|
INTEGER COREADDR, COMMENT GETSPACE ADDRESS; 31016000
|
|
TRACTER,% MAR USED TO SHUT OFF TRACE IN THIS PROCEDURE 31017000
|
|
COREAREASIZE; 31018000
|
|
LABEL TRYANOTHER,LOOP; 31019000
|
|
LABEL NOQUENTRY; 31020000
|
|
FIELD SETFIELD=MAXNOOFAREAS-2:MAXNOOFAREAS-1; 31021000
|
|
TRACTER~TRACE(0); 31022000
|
|
IF FIRSTBLOCK=NULL THEN GO NOQUENTRY; 31023000
|
|
BLOCKPOINTER~ FIRSTBLOCK; 31024000
|
|
LOOP: 31025000
|
|
AREASTATUSWORD~ AREASTATUS @ BLOCKPOINTER; 31026000
|
|
IF SIZE=AREASTATUSWORD.AREASIZEF THEN COMMENT FOUND BLOCK; 31027000
|
|
BEGIN 31028000
|
|
BITNO~ FIRSTONE(AREASTATUSWORD.AREASTATUSBITSF )-1; 31029000
|
|
IF BITNO!-1 THEN AREASTATUS@(BLOCKPOINTER)~ 31030000
|
|
RESET(AREASTATUS@BLOCKPOINTER,BITNO) 31031000
|
|
ELSE GO TRYANOTHER; 31032000
|
|
END ELSE 31033000
|
|
BEGIN 31034000
|
|
TRYANOTHER: 31035000
|
|
BLOCKPOINTER ~ NEXTBLOCK @ BLOCKPOINTER; 31036000
|
|
IF BLOCKPOINTER!NULL THEN GO LOOP 31037000
|
|
ELSE 31038000
|
|
BEGIN 31039000
|
|
NOQUENTRY: 31040000
|
|
AREASTATUSWORD ~ 0; 31041000
|
|
AREASTATUSWORD.SETFIELD ~ @77777777; 31042000
|
|
BITNO~MAXNOOFAREAS-1; 31043000
|
|
AREASTATUSWORD.AREASIZEF~ SIZE; 31044000
|
|
COREAREASIZE~SIZE | MAXNOOFAREAS + 1; 31045000
|
|
COREADDR~GETSPACE(COREAREASIZE,0,4,0); 31046000
|
|
AREASTATUSWORD.BASEADDRF~COREADDR + 1; 31047000
|
|
M [COREADDR] ~ 0; 31047100
|
|
BLOCKPOINTER ~ ALLOCATE(BLOCKOFAREASQUE); 31048000
|
|
INITIALIZETOZERO(QENTRY.ADDRESSF, 3); 31049000
|
|
AREASTATUS@(BLOCKPOINTER)~AREASTATUSWORD; 31050000
|
|
BLOCKOFAREASQUE ~ BLOCKPOINTER; 31051000
|
|
END; 31052000
|
|
END; 31053000
|
|
INITIALIZETOZERO(COREADDR ~ AREASTATUSWORD.BASEADDRF + 31054000
|
|
BITNO | SIZE, SIZE); 31055000
|
|
TRACE(TRACTER); 31055100
|
|
RETURN(COREADDR); 31056000
|
|
END GETAREA; 31058000
|
|
SAVE PROCEDURE FORGETAREA(SIZE,ADDRESS); VALUE SIZE,ADDRESS; 31059000
|
|
INTEGER SIZE,ADDRESS; 31060000
|
|
COMMENT FORGETAREA SEARCHES BLOCKOFAREASQUE FOR A BLOCK OF A GIVEN 31061000
|
|
SIZE AREA. IF NO BLOCK IS FOUND THEN THE SIZE SPECIFIED MUST 31062000
|
|
BE WRONG. WHEN THE BLOCK OF GIVEN SIZE IS FOUND IT CHECKS 31063000
|
|
WHETHER SPECIFIED ADDRESS FALLS WITHIN THE BLOCK RANGE. WHEN 31064000
|
|
THE RIGHT BLOCK IS FOUND,IT FINDS BITNO REPRESENTING AREA TO 31065000
|
|
BE FORGOTTEN. IT SETS THAT BIT NO IN AREASTATUS ITEM OF QUEUE.31066000
|
|
IF ALL THE AREAS WITHIN BLOCK ARE AVAILABLE IT CALLS 31067000
|
|
FORGETSPACE TO FORGET THE BLOCK.NOTE QUEUE IS SEARCHED FROM 31068000
|
|
THE END TO DEALLOCATE ADDITIONAL BLOCKS (OF GIVEN SIZE) AS 31069000
|
|
SOON AS POSSIBLE: 31070000
|
|
SIZE - SIZE OF AREA IN NO OF WORDS 31071000
|
|
ADDRESS- BASE ADDRESS OF THE AREA; 31072000
|
|
IF SIZE = 0 31073000
|
|
THEN FORGETSPACE (ADDRESS) ELSE 31074000
|
|
BEGIN 31075000
|
|
DEFINE AREASIZEF=AREASIZEFF#; 31076000
|
|
REFERENCE BLOCKPOINTER; COMMENT CURRENT POINTER OF QUEUE; 31077000
|
|
REAL AREASTATUSWORD; COMMENT LOCAL FOR AREA STATUS ITEM; 31078000
|
|
INTEGER BITNO; COMMENT BIT NO FOR AREA TO BE FORGOTTEN; 31079000
|
|
LABEL LOOP,QUIT; 31080000
|
|
BLOCKPOINTER ~ LASTBLOCK ; 31081000
|
|
LOOP: 31082000
|
|
AREASTATUSWORD~ AREASTATUS @ BLOCKPOINTER; 31083000
|
|
IF SIZE=AREASTATUSWORD.AREASIZEF THEN 31084000
|
|
BEGIN COMMENT BLOCK OF RIGHT SIZE; 31085000
|
|
IF BITNO~ADDRESS-AREASTATUSWORD.BASEADDRF>0 THEN 31086000
|
|
IF BITNO~BITNO DIV SIZE < MAXNOOFAREAS THEN 31087000
|
|
BEGIN COMMENT BLOCK OF RIGHT SIZE AND ADDRESS; 31088000
|
|
AREASTATUSWORD~ SET(AREASTATUSWORD,BITNO); 31089000
|
|
COMMENT COUNT NO. OF BITS ON (NO OF AVAILABLE 31090000
|
|
AREAS); 31091000
|
|
BITNO~ ONES(AREASTATUSWORD.AREASTATUSBITSF); 31092000
|
|
IF BITNO=MAXNOOFAREAS THEN 31093000
|
|
BEGIN 31094000
|
|
FORGETSPACE(AREASTATUSWORD.BASEADDRF-1); 31095000
|
|
DELINK(BLOCKOFAREASQUE,BLOCKPOINTER) 31096000
|
|
END ELSE 31097000
|
|
AREASTATUS @(BLOCKPOINTER)~AREASTATUSWORD; 31098000
|
|
GO QUIT; 31099000
|
|
END; 31100000
|
|
END; 31101000
|
|
BLOCKPOINTER~ PRVSBLOCK @ BLOCKPOINTER; 31102000
|
|
IF BLOCKPOINTER=NULL THEN 31103000
|
|
BEGIN 31104000
|
|
COMMENT BUILD A MESSAGE "WRONG SIZE OR ADDRESS FOR AREA"; 31105000
|
|
%SPOUT(MSGAREA,DISPLAYONCON);% MAR 31106000
|
|
END ELSE GO LOOP; 31107000
|
|
QUIT: 31108000
|
|
END FORGETAREA; 31109000
|
|
SAVE 1 PROCEDURE INITIALIZEARRAY(FIRSTARRAY, LASTARRAY, LENGTH); 32000000
|
|
VALUE LENGTH; 32001000
|
|
INTEGER LENGTH; 32002000
|
|
WORD ARRAY FIRSTARRAY,LASTARRAY [*]; 32003000
|
|
BEGIN COMMENT GET SPACE AND INITIALIZE ALL DESCRIPTORS BETWEEN32004000
|
|
FIRSTARRAY AND LASTARRAY (INCLUSIVE). (SEE COM- 32005000
|
|
MENT AT "UNIT" ARRAY DECLARATION) "LENGTH" IS 32006000
|
|
THE NUMBER OF WORDS GOTTEN FOR EACH ARRAY AND 32007000
|
|
THE LENGTH FIELD OF THE ARRAY DESCRIPTOR. ;32008000
|
|
INTEGER MOMF ~ NAME(FIRSTARRAY).ADRCPLF, 32009000
|
|
MOML ~ NAME(LASTARRAY).ADRCPLF, 32010000
|
|
T, 32011000
|
|
A; 32012000
|
|
MOMF ~ * + D0; 32013000
|
|
MOML ~ * + D0; 32014000
|
|
T ~ MOML - MOMF + 1; 32015000
|
|
LENGTH~*|(FIRSTARRAY.DBITF+1); 32015100
|
|
M[MOMF] ~ FIRSTARRAY & DATADESCRIPTOR 32016000
|
|
(,1,0,*,*,*,*,*,LENGTH, A ~ 32017000
|
|
GETSPACE (T | LENGTH, 0, 1, 0)); 32018000
|
|
INITIALIZETOZERO (A, T | LENGTH); 32019000
|
|
WHILE MOMF ~ * + 1 { MOML DO 32020000
|
|
M[MOMF] ~ 0 & DATADESCRIPTOR 32021000
|
|
(,1,0,*,*,*,*,*, LENGTH, A ~ A + LENGTH); 32022000
|
|
END INITIALIZE ARRAYS; 32023000
|
|
SAVE 1 PROCEDURE INITIALIZEQARRAY (QARRAYW, LENGTH); 32024000
|
|
VALUE LENGTH; 32025000
|
|
INTEGER LENGTH; 32026000
|
|
WORD ARRAY QARRAYW [*]; 32027000
|
|
BEGIN COMMENT GET "LENGTH" SPACE AND FILL IT WITH NULL DATA 32028000
|
|
DESCRIPTORS; 32029000
|
|
WORD DD; 32030000
|
|
WORD WT1 = QARRAYW; 32031000
|
|
INTEGER MOMQ ~ WT1.ADRCPLF, 32032000
|
|
A; 32033000
|
|
INTEGER I ~ LENGTH - 1; 32034000
|
|
M[MOMQ] ~ 0 & DATADESCRIPTOR 32035000
|
|
(,1,*,*,*,*,*,*, LENGTH, 32036000
|
|
A ~ GETSPACE (LENGTH, 0, 1, 0)); 32037000
|
|
DD ~ 0 & DATADESCRIPTOR (,1,1,*,*,*,*,*,*,*); 32038000
|
|
DO QARRAYW[I] ~ DD UNTIL I ~1 - 1 < 0; 32039000
|
|
END INITIALIZEQARRAY; 32040000
|
|
SAVE 1 PROCEDURE INITIALIZE (P1, P2); 32041000
|
|
VALUE P1; 32042000
|
|
INTEGER P1; 32043000
|
|
WORD P2; 32044000
|
|
BEGIN 32045000
|
|
DEFINE TIMEINCR = 32048000
|
|
1000 COMMENT THE TIME IN MICRO-SECONDS THAT 32049000
|
|
SHOULD BE ADEQUATE TO INITIALIZE A PROCES- 32050000
|
|
SORS STACK.; 32051000
|
|
/BASICCLOCKUNIT 32052000
|
|
| 0 COMMENT ************ CHECK-OUT; 32053000
|
|
| 8 #, COMMENT MAXIMUM NUMBER OF PROCESSORS.; 32054000
|
|
DD = DATADESCRIPTOR#, 32055000
|
|
MINDEX = TIMEOUT#, 32056000
|
|
MLENGTH = MAXADDR#,% 32057000
|
|
T = NEXTADDR #, 32058000
|
|
CODE = FIRSTADDR #, 32059000
|
|
OLDS = NEXTROW #, 32059100
|
|
STOPPIT = GLOBALSTOP#; 32060000
|
|
FIELD PROCIDBITS = (MYSELF-1):1, 32061000
|
|
MODULE = 19:6, 32062000
|
|
SDBITS = 9:10, 32063000
|
|
MOD2F = 0:1, 32064000
|
|
DIV2F = 47:47; 32065000
|
|
LAYOUT MSCW (35:16, 13:14); 32066000
|
|
DEFINE TYPEINT = TYPEINTERROGATE#, PATHINT = TYPEINT#; 32067000
|
|
DEFINE INITIALIZERARRAY (QARRAY, RARRAY, LENGTH) = 32068000
|
|
REPLACE POINTER (RARRAY) BY POINTER (QARRAY) 32069000
|
|
FOR LENGTH OVERWRITE;#; 32070000
|
|
DEFINE MOVESTACK (NEWF) = 32071000
|
|
BEGIN 32072000
|
|
D[30] ~ F; COMMENT D[30] IS TEMPORARY FOR WHERE WE 32073000
|
|
MOVE FROM; 32074000
|
|
F ~ NEWF ~ SHEETENTRYSIZE + 2; 32075000
|
|
COMMENT ALL PROCESSORS HAVE AN INITIAL S REG 32076000
|
|
SETTING OF 8192. WHEN INITIALIZE IS INVOKED, IT32077000
|
|
RUNS WITH A D[1] AND F OF 8193 AND THIS IS IM- 32078000
|
|
MEDIATELY CHANGED TO A LOCATION SOME PLACE IN 32079000
|
|
THE SECOND HALF OF MOD 0. THE EXACT LOCATION IS32080000
|
|
BASED ON THE PROCESSOR ID.; 32081000
|
|
D[1] ~ F; 32082000
|
|
S ~ S + F - D[30]; 32083000
|
|
M[F] ~ 0 & MARKSTACKCW (, 32084000
|
|
REAL (SNR ! 0), 1, *, *, 1, 32085000
|
|
IF SNR =0 THEN F ELSE SHEETENTRYSIZE +1); 32086000
|
|
REPLACE POINTER (M[F+1]) BY POINTER (M[D[30] + 1]) 32087000
|
|
FOR S - F OVERWRITE; 32088000
|
|
D[30] ~ 0; 32089000
|
|
END #; 32090000
|
|
DEFINE MISSINGMODS = 32091000
|
|
BEGIN COMMENT MISSINGMODS ALLOCATES MISSING MEMORY MODULES AS 32092000
|
|
NON-OVERLAYABLE AREAS AND PRESENT MODULES AS 32093000
|
|
OVERLAYABLE AREAS. WHEN MISSINGMODS IS INVOKED 32094000
|
|
THE SITUATION IS THIS: 32095000
|
|
1. THERE ARE "HOLES" IN MEMORY. I.E. THERE ARE32096000
|
|
ONE OR MORE INACTIVE MODULES SURROUNDED BY 32097000
|
|
ONE OR MORE ACTIVE MODULES. 32098000
|
|
2. ACTIVE MODULES INCLUDE 0 AND THE HIGHEST 32099000
|
|
AVAILABLE. 32100000
|
|
3. ZERO WORDS HAVE BEEN ALLOCATED AT THE HIGH-32101000
|
|
EST POSSIBLE MEMORY LOCATION. 32102000
|
|
4. MEMMODS ARRAY (INDEXED BY MODULE) HAS BEEN 32103000
|
|
INITIALIZED (1 IS ACTIVE MODULE). 32104000
|
|
5. THE REMAINDER OF THE HIGHEST MODULE IS A- 32105000
|
|
VAILABLE FOR ALLOCATION. WE WILL DO THIS 32106000
|
|
IN SUCH A WAY THAT THE ZERO WORD OF THE 32107000
|
|
MODULE IS AVAILABLE FOR SOME "Z" LINK. ;32108000
|
|
MINDEX ~ GETSPACE(16382-(LINKSIZE+1)|2,0,1,1).MODULE -1; 32109000
|
|
MLENGTH ~ 16384; 32110000
|
|
WHILE MINDEX } 1 DO 32111000
|
|
BEGIN 32112000
|
|
IF MEMMODS[MINDEX] = 0 32113000
|
|
THEN BEGIN COMMENT THE MOD IS MISSING; 32114000
|
|
IF MEMMODS[MINDEX -1] = 1 32115000
|
|
THEN BEGIN COMMENT BUT THE ONE BELOW IT IS 32116000
|
|
READY SO WE ALLOCATE THE MISSING 32117000
|
|
ONE AS NON-OVERLAYABLE.; 32118000
|
|
GETSPACE (MLENGTH, 0, 1, 0); 32119000
|
|
MLENGTH ~ 16364; 32120000
|
|
END OTHERWISE WE INCREASE THE AMOUNT WE 32121000
|
|
GET WHEN WE CAN 32122000
|
|
ELSE IF (MLENGTH ~ MLENGTH + 16364).MODULE > 7 32123000
|
|
THEN STOP COMMENT DONT EXCEDE GETSPACE MAX;32124000
|
|
END OTHERWISE ALLOCATE AS OVERLAYABLE SAVING FIRST 32125000
|
|
WORD OF MODULE FOR Z LINK 32126000
|
|
ELSE GETSPACE (16383 - LINKSIZE, 0, 1, 1); 32127000
|
|
MINDEX ~ MINDEX - 1; 32128000
|
|
END 32129000
|
|
END #; 32130000
|
|
DISALLOW; 32131000
|
|
CASE FIRSTONE(ABS(P1))-21+REAL(NOT INITSWITCH).MPXINDICATOR OF 32132000
|
|
BEGIN 32133000
|
|
CASE FIRSTONE (P1.SDBITS) - 1 OF 32134000
|
|
BEGIN 32135000
|
|
STOPPIT; 32136000
|
|
STOPPIT; 32137000
|
|
STOPPIT; 32138000
|
|
STOPPIT; 32139000
|
|
STOPPIT; 32140000
|
|
STOPPIT; 32141000
|
|
STOPPIT; 32142000
|
|
STOPPIT; 32143000
|
|
STOPPIT; 32144000
|
|
BEGIN 32145000
|
|
STOPPIT; 32145050
|
|
END IO FINISH; 32145100
|
|
; 32146000
|
|
; 32147000
|
|
; 32148000
|
|
; 32149000
|
|
; 32150000
|
|
; 32151000
|
|
END MPX INTERRUPTS CASE; 32153000
|
|
BEGIN COMMENT PROCESSOR TO PROCESSOR INTERRUPT; 32154000
|
|
MOVESTACK (PROCSTACKSIZE | MYSELF + F); 32155000
|
|
PROCMASK.PROCIDBITS ~ 1; COMMENT IDENTIFY MYSELF; 32156000
|
|
IF TIMEOUT = 0 32157000
|
|
THEN BEGIN COMMENT FIRST PROCESSOR SAYS HOW LONG32158000
|
|
IT SHOULD TAKE TO INITIALIZE 32159000
|
|
ALL PROCESSORS; 32160000
|
|
TIMEOUT ~ SCANIN (TIMEOFDAYWORD)+ TIMEINCR;32161000
|
|
INITSWITCH ~ TRUE; 32162000
|
|
END; 32163000
|
|
HEYOU; COMMENT ALL PROCESSORS HAVE BEEN IDLING OR 32164000
|
|
EXECUTING THE CODE IN THIS COMPOUND 32165000
|
|
STATEMENT.; 32166000
|
|
COMMENT ONLY ONE PROCESSOR CAN SUCCESSFULLY 32167000
|
|
COMPLETE THE TWO FOLLOWING STATEMENTS 32168000
|
|
AND IT IS THE ONE THAT COMPLETES THE 32169000
|
|
INITIALIZATION.; 32170000
|
|
DO UNTIL SCANIN (TIMEOFDAYWORD) > TIMEOUT; 32171000
|
|
BUZZCONTROL (SLAVEQUARTERS); 32172000
|
|
IF LOCK(SLAVEQUARTERS) 32173000
|
|
THEN BEGIN COMMENT GET MEMORY 32174000
|
|
UNDER CONTROL.; 32175000
|
|
MINDEX := INITIALIZEPCW := 0; 32176000
|
|
MCPINFO ~ MCPINFO & 32177000
|
|
NOTPRESENTARRAYDESCL(,*,3,0,MCPTOP := 32177040
|
|
M[2]); 32177050
|
|
COMMENT THE MCP LOADERS 32177100
|
|
WILL ALWAYS PLACE THIS 32178000
|
|
ADDRESS IN MEMORY[2] SO32179000
|
|
THAT WE WILL KNOW WHERE32180000
|
|
TO FIND THE MCP INFO 32181000
|
|
SEGMENTS; 32182000
|
|
SIMULATING := BOOLEAN(M[2]).BIT45 ; 32182100
|
|
M[2] := 0; 32182200
|
|
DO MINDEX ~ M[MINDEX].INUSELENGTH + MINDEX32183000
|
|
+ 1 UNTIL BOOLEAN(M[MINDEX].AVAILABLE);32184000
|
|
PREVADDR ~ MINDEX; 32185000
|
|
AVAILI ~ TEMPLINKS.ADDRESSF; 32186000
|
|
COMMENT FIX FIRST AVAILABLE LINK; 32187000
|
|
TEMPLINKS[0] ~ 0 & 32188000
|
|
AVAILA (,*,LINKSIZE,, PREVADDR); 32189000
|
|
TEMPLINKS [LINKSIZE] ~ 0 & 32190000
|
|
AVAILZ (,, LINKSIZE); 32191000
|
|
COMMENT FIX STOPPER; 32192000
|
|
STOPPER ~ LINKSIZE + 1; 32193000
|
|
TEMPLINKS [STOPPER] ~ 4"040000000001" & 32194000
|
|
AVAILA (,*, LINKSIZE,,*); 32195000
|
|
TEMPLINKS[STOPPER+1] ~ PREVADDR; 32196000
|
|
TEMPLINKS[STOPPER+LINKSIZE] ~ 32197000
|
|
0 & AVAILZ (,, LINKSIZE); 32198000
|
|
COMMENT UPDATE AVAILABLE AREA LINK; 32199000
|
|
STOPPER ~STOPPER +TEMPLINKS.ADDRESSF; 32200000
|
|
M[PREVADDR].LINK ~STOPPER; 32201000
|
|
M[PREVADDR+1] ~ AVAILI; 32202000
|
|
COMMENT SAVE INITIALIZATION CODE 32203000
|
|
ADDRESS FOR LATER FORGETING;32204000
|
|
SAVE1ADDRESS ~ PREVADDR - M[PREVADDR -1]. 32205000
|
|
INUSELENGTHZ + 2; 32206000
|
|
32207000
|
|
BACKALLOCATED ~ SAVE1ADDRESS - LINKSIZE; 32208000
|
|
MEMMODS ~ MEMMODS&DD 32209000
|
|
COMMENT IT SEEMS LIKE A REASONABLE PLACE;32210000
|
|
( ,1,0,*,*,*,*,*,*, 12000); 32211000
|
|
REPLACE POINTER(MEMMODS) BY 1 FOR 64 32212000
|
|
OVERWRITE; 32213000
|
|
COMMENT ASSUME ALL POSSIBLE MEMORY IS 32214000
|
|
PRESENT AND MARK ABSENT MODS IN INVALID 32215000
|
|
ADDRESS.; 32216000
|
|
MEMMAX ~ M.LENGTHF; 32217000
|
|
COMMENT LET INVALID ADDRESS WORK; 32218000
|
|
MINDEX ~ 0; 32219000
|
|
DO BEGIN 32220000
|
|
M[MINDEX := MINDEX + 16384] := 0; 32220500
|
|
IF BOOLEAN(MEMMODS[MINDEX.MODULE]) THEN 32220600
|
|
M[MINDEX+1] := 0; %CHECK INTERLACING 32220700
|
|
END UNTIL MINDEX = 1032192; 32221000
|
|
COREFACTOR ~ TRUE; COMMENT * * * * * * * * * * ; 32221050
|
|
AVAILABLECORE ~ MEMMAX - PREVADDR; 32221100
|
|
COMMENT FIND HIGHEST POSSIBLE ADDRESS; 32222000
|
|
MINDEX~MASKSEARCH(1,1,MEMMODS)|16384+16382;32223000
|
|
M.LENGTHF ~MINDEX + 1; 32224000
|
|
COMMENT WHEN THERE IS MAXIMUM MEMORY32225000
|
|
THE LAST WORD IS NOT INDEXABLE THROUGH32226000
|
|
M AND SO WE WASTE IT ALLCASES.; 32227000
|
|
M[PREVADDR].LENGTH ~ MINDEX - PREVADDR; 32228000
|
|
M[MINDEX] ~ 0 & AVAILZ (,,MINDEX-PREVADDR);32229000
|
|
COMMENT NOW ALL MEMORY ABOVE INITIALIZA- 32230000
|
|
TION AND INCLUDING MEMMAX LOOKS 32231000
|
|
AVAILABLE. THIS MAY NOT BE TRUE 32232000
|
|
BECAUSE OF MISSING MODS, BUT ALL 32233000
|
|
THE SPACE ROUTINES WILL FUNCTION,32234000
|
|
AND TO AVOID REPETITIVE CHECKS AS32235000
|
|
TO WHETHER WE ARE AT THE END OF 32236000
|
|
MEMORY WE WILL ALLOCATE 0 NON- 32237000
|
|
OVERLAYABLE WORDS AT THE END OF 32238000
|
|
MEMORY.; 32239000
|
|
GETSPACE (0, 0, 1, 0); 32240000
|
|
MEMMAX ~ MEMMAX -1; 32241000
|
|
IF MINDEX ! MEMMAX 32242000
|
|
THEN BEGIN COMMENT THERE ARE MISSING MODS.32243000
|
|
REGARDLESS OF THE STATUS OF OTHER32244000
|
|
MODS, 16375 WORDS CAN BE GOTTEN 32245000
|
|
IN THE FINAL MOD AND THE FIRST 32246000
|
|
WORD OF THE MOD WILL BE AVAILABLE32247000
|
|
FOR SOME "Z" LINK.; 32248000
|
|
MISSINGMODS; 32249000
|
|
END; 32250000
|
|
MINDEX ~ M.LENGTHF -1; 32251000
|
|
DO BEGIN 32252000
|
|
IF BOOLEAN(M[MINDEX].OLAY) 32253000
|
|
THEN FORGETSPACE(MINDEX +LINKSIZE32254000
|
|
-M[MINDEX].INUSELENGTHZ); 32255000
|
|
MINDEX ~ MINDEX 32256000
|
|
- M[MINDEX].INUSELENGTHZ -1;32257000
|
|
END 32258000
|
|
UNTIL MINDEX + LINKSIZE +1= SAVE1ADDRESS; 32259000
|
|
REPLACE POINTER(MEMMODS) BY 0 FOR 64 WORDS;32260000
|
|
T ~ D31; 32261000
|
|
MONITORMASK ~ T.MONMASKF; 32262000
|
|
D31 := MONITORVALUE := T.MONVALF; 32263000
|
|
IF SIMULATING 32265000
|
|
THEN BEGIN 32266000
|
|
MINDEX ~ NAME(MON1TOR).SDIF; 32267000
|
|
M[MINDEX] ~ M[NAME(SIM1TOR)]; 32268000
|
|
END ELSE 32269000
|
|
LOCK(MONITORLOCK); 32269100
|
|
IF MAXSTACKS ~ (MEMMAX.MODULE +1) | 32270000
|
|
STACKSPERMODULE > 1024 32271000
|
|
THEN MAXSTACKS ~ 1024; 32272000
|
|
STACK ~ 32273000
|
|
STACK & DD(,1,0,*,*,*,*,*, MAXSTACKS, 32274000
|
|
GETSPACE(MAXSTACKS, 0, 1, 0)) ; 32275000
|
|
INITIALIZEARRAY(REPLY,REPLY,MAXSTACKS); 32275100
|
|
MAXSTACKS ~ * -1; 32276000
|
|
COMMENT ******** SOMETHING WILL EVENTUALLY HAVE TO BE DONE 32277000
|
|
ABOUT THE FOLLOWING TWO STATEMENTS IN REGARDS 32278000
|
|
TO NON-SEOUENTIALLY NUMBERED PROCESSORS 8/16; 32279000
|
|
PROCSTACKSTARTW~ WORD(GETSPACE( 32280000
|
|
PROCSTACKSIZE|FIRSTONE(PROCMASK),0,1,0)); 32281000
|
|
STACKVECTOR [0] ~ 0 & DD(); 32282000
|
|
REPLACE POINTER (STACKVECTOR[1]) BY 32283000
|
|
POINTER (STACKVECTOR[0]) 32284000
|
|
FOR MAXSTACKS - 1 OVERWRITE; 32285000
|
|
STACKVECTOR [0] ~ STACKVECTOR [0] 32286000
|
|
&DD(,1,0,*,*,*,*,*, 1+ 32287000
|
|
M[0].INUSELENGTH, *); 32288000
|
|
PERIPHERALINVALIDADDRESS := TRUE; 32288050
|
|
MAXCHANNELS := 4"F"; 32288060
|
|
FOR CODE := 0 STEP 1 UNTIL 3 DO 32288100
|
|
BEGIN % MPX 32288150
|
|
OLDS := S; 32288200
|
|
SCANIN(0 & SCANINWORD(2, SET(0, CODE),32288250
|
|
1)); %MIGHT AS WELL READ R.D. 32288300
|
|
S := OLDS; % TO DELETE IN ADDR CRAP 32288350
|
|
END; 32288400
|
|
MULTIPLEXORMASK := BOOLEAN(2|MAXCHANNELS); 32288420
|
|
DCPSANDGCAS := 4"FFFFFFFFFF"; 32288440
|
|
FOR CODE := 4 STEP 1 UNTIL 19 DO 32288450
|
|
BEGIN % DCP 32288500
|
|
OLDS := S; 32288550
|
|
SCANOUT(0, 4"C0000" & SCANOUTWORD 32288600
|
|
(2, CODE - 4, 0)); % HALT DCP 32288650
|
|
S := OLDS; 32288700
|
|
END; 32288750
|
|
COMMENT DO THE GCA HERE---CODE GEQ 20; 32288800
|
|
UNLOCK (SLAVEQUARTERS); 32289000
|
|
32290000
|
|
COMMENT *** SOME QUEUE HEADS HAVE TO BE SMASHED AT INITIALISATION; 32292000
|
|
; 32293000
|
|
WORDREADYQHEAD ~ 0; 32294000
|
|
WORDSHEETQHEAD ~ 0; 32295000
|
|
WORDTERMINATEQHEAD ~ 0; 32296000
|
|
COMMENT *** END OF QUEUE HEAD SMASHING; 32297000
|
|
INITIALIZEARRAY(STACKINUSE, IRPARAMETERLOK, 32297100
|
|
MAXIRINDEXPLUS1); 32297200
|
|
INITIALIZEARRAY(PRIORITYLEVEL,PRIORITYLEVEL,PRIORITYRANGE+1); 32297300
|
|
32297400
|
|
COMMENT *** THE NUMBER OF INDEPENDENT RUNNER STACKS MAY BE A DEFINE OR32298000
|
|
IT MAY BE A SYSTEM PARAMETER, FOR THE MOMENT, IT IS AN 32299000
|
|
INITIALISED VARIABLE AS DEMONSTRATED BELOW; 32300000
|
|
INDEPENDENTRUNNERSTACKS ~ 2; 32301000
|
|
COMMENT STACKINUSE GIVES THE STACK NO OF EACH INDEPENDENT RUNNER 32302000
|
|
WHICH IS CURRENTLY RUNNING AND WHICH DOES NOT REQUIRE MORE32303000
|
|
THAN ONE STACK, IT MUST BE INITIALISED TO ZERO; 32304000
|
|
FILLARRAY(STACKINUSE,0,MAXIRINDEX); 32305000
|
|
COMMENT IRPRIORITIES GIVES PRIORITY OF EACH INDEPENDENT RUNNER, 32306000
|
|
THOSE RUNNERS ASSIGNED INDICATORS MUST HAVE PRIORITIES 32306200
|
|
ASSIGNED.OTHER RUNNERS WILL HAVE DEFAULT PRIORITIES 32306400
|
|
; 32307000
|
|
FILLARRAY(IRPRIORITIES,IRDEFAULTPRIORITY,MAXIRINDEX);32308000
|
|
IRPRIORITIES[CONTROLCARDINDICATOR] 32308200
|
|
~CONTROLCARDPRIORITY; 32308400
|
|
IRPRIORITIES[INITIATEINDICATOR]~INITIATEPRIORITY; 32308600
|
|
IRPRIORITIES[TERMINATEINDICATOR]~TERMINATEPRIORITY; 32308800
|
|
IRPRIORITIES[DIRCOMPLEMENTINDICATOR] := 32308900
|
|
DIRCOMPLEMENTPRIORITY; 32308950
|
|
COMMENT FOLLOWING ARE INITIALIZATIONS OF SOME CONTROL WORDS; 32309000
|
|
D2MSCW2~0&MARKSTACKWD(,*,1,*,READYENTRYSIZE-2,*,2,4);32310000
|
|
IRMSCW2~0&MARKSTACKWD(,*,1,*,FIXEDIRSIZE-2,*,2,4); 32311000
|
|
SHEETTOSCW~0&TOSCW(,0,0,0,0,SHEETENTRYSIZE+1,1,1,2); 32312000
|
|
D2MSCW1~0&MARKSTACKWD(,1,1,*,D0OFFSET,*,1, 32313000
|
|
READYENTRYSIZE-3); 32314000
|
|
IRMSCW1~0&MARKSTACKWD(,1,1,*,D0OFFSET,*,1,FIXEDIRSIZE32315000
|
|
-3); 32315100
|
|
D1MSCW~0&MARKSTACKWD(,1,1,*,D0OFFSET,*,1,D1INFO-1); 32316000
|
|
32317000
|
|
D2RCW1 ~ 0&RETURNCONTROLWORD(,*,*,*,*,*,*); 32318000
|
|
IRTOSCW~0&TOSCW(,,,,,FIXEDIRSIZE+4,1,2,2); 32319000
|
|
D2TOSCW~0&TOSCW(,,,,,READYENTRYSIZE+4,1,2,2); 32319100
|
|
D03 := HARDWAREINTERRUPTPCW; 32320000
|
|
END OF NON PROCESSOR INITIALIZATION; 32321000
|
|
SNR ~ MYSELF; 32322000
|
|
P1 ~ PROCSTACKSTART.ADDRESSF + (MYSELF-1)| 32323000
|
|
PROCSTACKSIZE; 32324000
|
|
MOVESTACK (P1); 32324100
|
|
INITIALIZETOZERO (P1, SHEETENTRYSIZE); 32324900
|
|
STACKVECTOR [MYSELF] ~ 32325000
|
|
0 & DD ( ,1,*,*,*,*,*,*, PROCSTACKSIZE, 32326000
|
|
F - SHEETENTRYSIZE - 2); 32327000
|
|
STACK [SNR, 0]~MYSELF; % PROCESSOR ID TO TOS 32328000
|
|
WORDSTACK [MYSELF, 1] ~ 0 & 32329000
|
|
MARKSTACKCW (,*,1, SNR, *,*,*); 32330000
|
|
BOSR ~ STACKVECTOR[SNR].ADDRESSF; 32331000
|
|
LOSR ~ BOSR + PROCSTACKSIZE - STACKOFLOWSIZE; 32332000
|
|
MORETHANONEPROCESSOR ~ (NUMBEROFPROCESSORS ~ 32333000
|
|
ONES(PROCMASK)) > 1; 32334000
|
|
PROCSTACKSTART.LENGTHF ~ PROCSTACKSTART.LENGTHF+1; 32335000
|
|
INITIALIZEARRAY(SHEETVECTOR,SHEETVECTOR, 32336000
|
|
IF STACKVECTOR.LENGTHF<511 32336100
|
|
THEN STACKVECTOR.LENGTHF|2 ELSE 1024); 32336200
|
|
COMMENT *** THERE IS NO JUSTIFICATION FOR THIS; 32336400
|
|
HOLDINITIALISE; 32337000
|
|
END PROCESSOR TO PROCESSOR INTERRUPT; 32338000
|
|
BEGIN COMMENT TIMER & STACK OVERFLOW; 32339000
|
|
STOPPIT 32340000
|
|
END; 32341000
|
|
BEGIN COMMENT SYLLABLE DEPENDENT - CLASS 2; 32342000
|
|
STOPPIT 32343000
|
|
END; 32344000
|
|
CASE FIRSTONE (P1.SDBITS) - 1 OF 32345000
|
|
BEGIN 32346000
|
|
STOPPIT; COMMENT MEMORY PROTECT; 32347000
|
|
STOPPIT; COMMENT INVALID OPERATOR; 32348000
|
|
STOPPIT; COMMENT DIVIDE BY ZERO; 32349000
|
|
STOPPIT; COMMENT EXPONENT OVERFLOW; 32350000
|
|
STOPPIT; COMMENT EXPONENT UNDEHFLOW; 32351000
|
|
STOPPIT; COMMENT INVALID INDEX; 32352000
|
|
STOPPIT; COMMENT INTEGER OVERFLOW; 32353000
|
|
STOPPIT; COMMENT BOTTOM OF STACK; 32354000
|
|
BEGIN COMMENT PRESENCE BIT - 32355000
|
|
AS LONG AS P2 POINTS TO A WELL FORMED DATA 32356000
|
|
DESCRIPTOR THAT DOES NOT REQUIRE I-O, WE SHOULD 32357000
|
|
BE ABLE TO SATISFY PB INTERRUPTS DURING INITIAL-32358000
|
|
IZATION. HOWEVER, IT SHOULD BE REMEMBERED 32359000
|
|
THAT MOST ALLOCATION DURING INITIALIZATION IS 32360000
|
|
NON-STANDARD. I.E. NON-OVERLAYABLE AND HIGH IN 32361000
|
|
MEMORY. THIS PRESENCE BIT WILL CAUSE THE SAME 32362000
|
|
TYPE OF ACTION. NOTE - OP NOT CONSIDERED .; 32363000
|
|
ALLOW; 32364000
|
|
M[P2.ADDRESSF] ~ M[P2.ADDRESSF] & DD 32365000
|
|
(*,1,0,*,*,*,*,*,*, GETSPACE( M[P2.ADDRESSF]. 32366000
|
|
LENGTHF , 0,1, P2.ADDRESSF)); 32367000
|
|
INITIALIZETOZERO(M[P2.ADDRESSF].ADDRESSF, 32368000
|
|
M[P2.ADDRESSF].LENGTHF); 32368100
|
|
IF P2.TAG ! 1 32369000
|
|
THEN P2~P2 & DD (*,1,1,*,*,*,*,*,*, 32370000
|
|
M[P2.ADDRESSF].ADDRESSF); 32370100
|
|
IF P1 < 0 32371000
|
|
THEN RETURN(P2); 32372000
|
|
32373000
|
|
END INITIALIZE PRESENCE BIT; 32374000
|
|
STOPPIT; COMMENT SEQUENCE ERROR; 32375000
|
|
END SYLLABLE DEPENDENT; 32376000
|
|
CASE FIRSTONE(P1.SDBITS) OF 32377000
|
|
BEGIN COMMENT ALARM INTERRUPTS; 32378000
|
|
STOPPIT; 32379000
|
|
STOPPIT; COMMENT OPERATOR LOOP; 32380000
|
|
STOPPIT; COMMENT MEMORY PARITY; 32381000
|
|
STOPPIT; COMMENT MPX PARITY; 32382000
|
|
IF PERIPHERALINVALIDADDRESS THEN 32383000
|
|
BEGIN COMMENT PERIPHERAL TYPE INVALID ADDRESS; 32383100
|
|
IF CODE < 4 THEN 32383200
|
|
MAXCHANNELS := RESET(MAXCHANNELS,CODE) ELSE 32383300
|
|
DCPSANDGCAS := RESET(DCPSANDGCAS, CODE - 4 | 32383400
|
|
REAL(CODE < 20)); 32383500
|
|
END ELSE 32383600
|
|
BEGIN COMMENT MEMORY TYPE INVALID ADDRESS; 32383700
|
|
MEMMODS[MINDEX.MODULE] ~ 0; 32384000
|
|
MEMMAX ~ MEMMAX - 16384; 32385000
|
|
M[F+1] ~ IF M[F+1].PSRF = 0 32386000
|
|
THEN M[F+1] & RETURNCONTROLWORD 32387000
|
|
(*,*,5,M[F+1].PIRF-1,*,*,*) 32388000
|
|
ELSE M[F+1] & RETURNCONTROLWORD 32389000
|
|
(*,*,M[F+1].PSRF-1,*,*,*,*); 32390000
|
|
M[F-1].INDEXF ~ 16383; 32391000
|
|
COMMENT SET BACK PIR & PSR SO THAT THE 32392000
|
|
INVOKING OPERATOR IS REPEATED AND32393000
|
|
THE STACK IS PROPERLY CUT BACK. 32394000
|
|
THE WORD AT 16383 IS AVAILABLE 32395000
|
|
AND UNUSED AT THIS TIME.; 32396000
|
|
END; 32397000
|
|
STOPPIT; COMMENT STACK UNDERFLOW; 32398000
|
|
STOPPIT; COMMENT INVALID OPERATOR; 32399000
|
|
END ALARM INTERRUPTS; 32400000
|
|
END MAJOR INTERRUPT CASE; 32401000
|
|
32402000
|
|
END INITIALIZE; 32403000
|
|
32404000
|
|
33000000
|
|
SAVE PROCEDURE HARDWAREINTERRUPT (P1,P2); VALUE P1,P2; 33001000
|
|
INTEGER P1; COMMENT IDENTIFIES TYPE OF INTERRUPT; 33002000
|
|
WORD P2; COMMENT USED BY PRESENCE BIT AND POSSIBLY OTHERS; 33003000
|
|
COMMENT FURTHER GLOBALS ARE 33004000
|
|
33005000
|
|
33006000
|
|
33007000
|
|
PROCEDURE MYFAULT ) NOTE THAT THESE NAMES 33008000
|
|
MYDIVIDEBYZERO ) ACCESS PCWS STUFFED IN 33009000
|
|
MYEXPONENTOVERFLOW ) KNOWN STACK LOCATIONS BY 33010000
|
|
MYEXPONENTUNDERFLOW ) COMPILES,LINKAGE LOADERS ETC. 33011000
|
|
MYINVALIDINDEX ) THEY ARE ASSOCIATED WITH E.G. 33012000
|
|
MYINTEGEROVERFLOW ) ALGOL FAULT STATEMENTS THUS 33013000
|
|
) PCWS SHOULD HAVE CONTROL BIT ON33014000
|
|
) AND ACCESSED STATEMENTS SHOULD 33015000
|
|
) NOT INVOKE SYLLABLE DEPENDENT 33016000
|
|
) INTERRUPTS 33017000
|
|
SIZE IS NUMBER OF WORDS REQUIRED, 33018000
|
|
THERE ARE POTENTIALLY 8 TYPES ONLY TWO ARE DISTINGUISHED SO 33019000
|
|
FAR(AND MUST BE GLOBALLY DEFINED): 33020000
|
|
OVLAYABLE 33021000
|
|
NONOVLAYABLE 33022000
|
|
GREATESTTYPE MAXIMUM VALUE OF TYPE FOR GETSPACE 33023000
|
|
MASSIN(DISKTYPE,DISKADDRESS,EVENT, SOME OTHER PARAMETERS) 33024000
|
|
DISKTYPE CODEDISK 33025000
|
|
OVERLAYDISK 33026000
|
|
EVENT IS SET ON COMPLETION 33027000
|
|
FIREUP TRANSFERS PROCESSES FROM EVENT QUEUE 33028000
|
|
TO READYQ 33029000
|
|
; 33030000
|
|
COMMENT THIS PROCEDURE HANDLES ALL INTERRUPTS 33031000
|
|
IT USES AS BIBLE :- "INTERRUPT HANDLING AND ACCIDENTAL ENTRY"33032000
|
|
, E.A. HAUK, JULY 25 1967 33033000
|
|
(1) NOTE THAT THE PROCEDURE MAY EITHER EXIT ON COMPLETION OR 33034000
|
|
CHANGE TO ANOTHER PROCESS(JOB). THUS ALL PROCESS INITIATION 33035000
|
|
AND RE-ACTIVATION MAY BE HANDLED IN THIS PROCEDURE IF SUCH A 33036000
|
|
COURSE PROVES DESIRABLE 33037000
|
|
(2) NOTE THAT A SINGLE PROCESSOR USER PAYS A PRICE BECAUSE OF 33038000
|
|
POTENTIAL MULTIPROCESSOR USERS. SOME ATTEMPT TO MINIMISE THIS 33039000
|
|
PRICE MAY BE WORTHWHILE. SOURCE EDITING AND THE USE OF DEFINES 33040000
|
|
MAY BE APPROPRIATE; 33041000
|
|
33042000
|
|
BEGIN COMMENT MCS 1; 33043000
|
|
REAL TRACTER ; 33044000
|
|
PROCEDURE NOTYETCODED (X); VALUE X; REAL X; FORWARD; 33045000
|
|
LAYOUT P1PARAMETER 33046000
|
|
( IOFFIELD = 0:1 % INT MASK FIELD FOR IOFINISH 33047000
|
|
, MPXSPECFIELD= 3:4 % SPECIFIES MPXA OR MPXB 33048000
|
|
, ALARMFIELD = 5:6 % ALARM TYPE 33049000
|
|
, IFFIELD = 7:4 % MPX INTERFACE 33050000
|
|
, INTFIELD = 9:10 % SD INTERRUPT TYPE 33051000
|
|
, MPXFIELD = 20:1 % MPX INTERRUPT 33052000
|
|
, SDFIELD = 24:1 % SYLLABLE DEP INT FLAG 33053000
|
|
, RTBITF = 46:1 % RETURN BIT 33054000
|
|
) ; 33055000
|
|
33056000
|
|
33057000
|
|
33058000
|
|
DEFINE INTERVALTIMERSPEC = @020000001# 33059000
|
|
, STACKOVERFLOWSPEC = @020000002# 33060000
|
|
, SYLLABLEDEPNDNT2SPEC= @040000000# 33061000
|
|
, ALARMSPEC = @200000001# 33062000
|
|
, PROCTOPROCSPEC = @010000000# 33063000
|
|
, SYLABLEDEPENDENT2 = SYLLABLEDEPNDNT2SPEC# 33064000
|
|
; 33065000
|
|
DEFINE LITERALFUNCTIONA = @ 743 # 33066000
|
|
, LITERALFUNCTIONB = @ 745 # 33067000
|
|
; 33068000
|
|
INTEGER MYSNR 33069000
|
|
, MYF 33070000
|
|
33071000
|
|
; 33072000
|
|
LABEL LOOKAROUND 33073000
|
|
, AGAIN 33074000
|
|
, FINI 33075000
|
|
; 33076000
|
|
BOOLEAN FIRST )"TRUE IF FIRST TIME AT LOOKAROUND "(33077000
|
|
RTBIT 33078000
|
|
; 33079000
|
|
MONITOR JACKMONITOR(P1); 33080000
|
|
WORD ACTUALCOPY = P2 33081000
|
|
; 33082000
|
|
FIELD BITONEF = 1:1 33082100
|
|
, BITTWOF = 2:1 33082200
|
|
; 33082300
|
|
COMMENT THE FOLLOWING LOCAL PROCEDURES HANDLE ALL INTERRUPTS OTHER 33083000
|
|
THAN INTERVAL TIMER, GCA AND IOFINISH, 33084000
|
|
; 33085000
|
|
SAVE PROCEDURE PROCTOPROC; 33086000
|
|
NOTYETCODED(PRTOPR); 33087000
|
|
SAVE PROCEDURE STACKOVERFLOW; 33088000
|
|
NOTYETCODED(STACKOVER); 33089000
|
|
SAVE PROCEDURE SYLLABLEDEPENDENT2; 33090000
|
|
KILLME(SYLABLEDEPENDENT2); 33091000
|
|
SAVE PROCEDURE ALARM; 33092000
|
|
NOTYETCODED(BLOWUP+P1.ALARMFIELD); 33093000
|
|
SAVE PROCEDURE MEMORYPROTECT; 33094000
|
|
NOTYETCODED(MEMPROTECT); 33095000
|
|
SAVE PROCEDURE INVALIDOPERATOR; 33096000
|
|
NOTYETCODED(INVALIDOP); 33097000
|
|
SAVE PROCEDURE SEQUENCEERROR; 33098000
|
|
NOTYETCODED(SEQERROR); 33099000
|
|
SAVE PROCEDURE MLL1; 33100000
|
|
NOTYETCODED(ML1); 33101000
|
|
SAVE PROCEDURE MLL2; 33102000
|
|
NOTYETCODED(ML2); 33103000
|
|
SAVE PROCEDURE MLL3; 33104000
|
|
NOTYETCODED(ML3); 33105000
|
|
SAVE PROCEDURE MLL4; 33106000
|
|
NOTYETCODED(ML4); 33107000
|
|
SAVE PROCEDURE EXTERNALMPX; 33108000
|
|
NOTYETCODED(EXTMPX); 33109000
|
|
SAVE PROCEDURE MPXUNASSIGNED(SPEC); VALUE SPEC; INTEGER SPEC; 33110000
|
|
NOTYETCODED(SPEC); 33111000
|
|
SAVE PROCEDURE BOTTOMOFSTACK; 33112000
|
|
NOTYETCODED(STACKBOTTOM); 33113000
|
|
SAVE PROCEDURE ARITHMETICFAULT(WHICH); VALUE WHICH; 33114000
|
|
INTEGER WHICH; COMMENT SPECIFIES INTERRUPT; 33115000
|
|
COMMENT HANDLES DIVIDE BY ZERO,EXPONENT OVERFLOW,EXPONENT UNDERFLOW, 33116000
|
|
INVALID INDEX AND INTEGER OVERFLOW 33117000
|
|
THE PROCEDURE ACCESSES "MYCOURSE" (A DEFINE OR 33118000
|
|
INTRINSIC ACCESSING A STACK LOCATION SET BY THE COMPILER. THE 33119000
|
|
LINKAGE LOADER OR SOMETHING) 33120000
|
|
MYCOURSE = UPTOYOU THE MCP DOES AS IT PLEASES 33121000
|
|
= FINISH THE MCP MUST D-ES ME 33122000
|
|
= CARRYON THE MCP IGNORES THIS INTRUPT33123000
|
|
= TELLME THE MCP SETS SOME FLAGS 33124000
|
|
= FAULTROUTINE ENTER GENERAL FAULT ROUTINE 33125000
|
|
= SELECT ACCESS PCW APPROPRIATE TO 33126000
|
|
INTERRUPT 33127000
|
|
THESE CHOICES COULD BE LIMITED. GIVING A MORE 33128000
|
|
UNIFORM APPROACH BUT USING MORE CORE STORAGE. THEY ALLOW ALGOL,33129000
|
|
COBOL ETC. TO REACT DIFFERENTLY TO FAULT CONDITIONS - DO WE 33130000
|
|
WANT THIS 33131000
|
|
ALL CHOICES EXCEPT THE LAST TWO INVOLVE RETURN TO THE33132000
|
|
INTERRUPT ROUTINE. HOWEVER BAD GO TOS ASSOCIATED WITH THE LAST 33133000
|
|
TWO CHOICES (A LIKELY OCCURRENCE)MAY PREVENT SUCH A RETURN. 33134000
|
|
HENCE THE BAD GO TO MECHANISM MUST CALL THE PROCEDURE 33135000
|
|
WHATDOIDO (AMONG OTHER THINGS) 33136000
|
|
NOTE THAT THE CONCEPT OF MASTER AND SLAVE PROCESSORS 33137000
|
|
AS DESCRIBED BY DAHM IS CONSIDERED AN UNNECESSARY COMPLICATION 33138000
|
|
IN THE HANDLING OF SYLLABLE DEPENDENT INTERRUPTS 33139000
|
|
; 33140000
|
|
BEGIN 33141000
|
|
INTEGER MYACTION 33142000
|
|
; 33143000
|
|
LABEL BUZZ,LOOKFORJOB 33144000
|
|
; 33145000
|
|
33146000
|
|
33147000
|
|
33148000
|
|
IF MYACTION ~ MYCOURSE=UPTOYOU OR MYACTION=FINISH THEN 33149000
|
|
KILLME(WHICH) 33150000
|
|
ELSE IF MYACTION =CARRYON THEN GO LOOKFORJOB 33151000
|
|
ELSE IF MYACTION =TELLME THEN BEGIN SETOVERFLOWFF; 33152000
|
|
GO LOOKFORJOB END 33153000
|
|
ELSE IF MYACTION =FAULTROUTINE THEN 33154000
|
|
MYFAULT(P2) 33155000
|
|
ELSE 33156000
|
|
CASE WHICH OF 33157000
|
|
BEGIN 33158000
|
|
MYDIVIDEBYZERO(P2); 33159000
|
|
MYEXPONENTOVERFLOW(P2); 33160000
|
|
MYEXPONENTUNDERFLOW(P2); 33161000
|
|
MYINVALIDINDEX(P2); 33162000
|
|
MYINTEGEROVERFLOW(P2); 33163000
|
|
END CASE EXPRESSION; 33164000
|
|
LOOKFORJOB: 33165000
|
|
END ARITHMETICFAULT; 33166000
|
|
SAVE WORD PROCEDURE PRESENCEBIT; 33167000
|
|
COMMENT 33168000
|
|
(1) THE PROCEDURE DOES NOT RUN AROUND MAKING ABSENT COPIES PRESENT 33169000
|
|
MAYBE IT SHOULD; 33170000
|
|
BEGIN COMMENT MCS 1; 33171000
|
|
LABEL TOSLEEP 33172000
|
|
,FIN 33173000
|
|
,LOOKFORPREEMPT 33174000
|
|
,MOMPRESENT 33175000
|
|
33176000
|
|
; 33177000
|
|
INTEGER 33178000
|
|
TI1,TI2,TI3, 33179000
|
|
IOCW, 33180000
|
|
KIND )"WHETHER P2 IS OPERAND,DD,SEGDESC OR IRW "(33181000
|
|
FIRSTLOC )"MULTIPLE DESCRIPTORS-LOCATION FIRST ARG "(33182000
|
|
LASTLOC 33183000
|
|
; 33184000
|
|
EVENT EVNN 33185000
|
|
; 33186000
|
|
33187000
|
|
33188000
|
|
33189000
|
|
WORD 33190000
|
|
MOM %HOLDS MOM (NOT COPY) 33191000
|
|
, MOMLOCATION %INDEX INTO M FOR MOM 33192000
|
|
, TW1 = TI2 33193000
|
|
; 33194000
|
|
33195000
|
|
33196000
|
|
33197000
|
|
BOOLEAN ALREADYPRESENT; 33198000
|
|
33199000
|
|
33200000
|
|
33201000
|
|
33202000
|
|
BOOLEAN NOCHANGE 33203000
|
|
, OLAY 33203100
|
|
; 33204000
|
|
ARRAY DISKADDRESSES[*] 33205000
|
|
, IOCBREFERENCE [IOCBSIZE] 33206000
|
|
; 33207000
|
|
REFERENCE IOCB = IOCBREFERENCE 33208000
|
|
; 33209000
|
|
DEFINE FIXRECORDDESC(X) = WORD(AREADESC @ X).ADDRESSF # 33210000
|
|
; 33211000
|
|
33212000
|
|
BUZZCONTROL(PBLOK); COMMENT *** BUZZ; 33213000
|
|
COMMENT*** AT PRESENT THIS LOCK IS REDUNDANT. HOWEVER WHEN GROSS LOCK 33214000
|
|
IS REMOVED, AN EVEN FINER LOCK MAY BE REQUIRED; 33215000
|
|
ALREADYPRESENT~FALSE; 33216000
|
|
RTBIT ~ BOOLEAN(P1.RTBITF); 33217000
|
|
NOCHANGE~FALSE; 33218000
|
|
IF (KIND ~ ACTUALCOPY.TAG) = SINGL 33219000
|
|
THEN BEGIN COMMENT MCS 2MULTIPLE DESCRIPTORS; 33220000
|
|
LASTLOC := MYF - REAL(ACTUALCOPY); 33221000
|
|
FIRSTLOC := MYF - 1; 33222000
|
|
UNLOCK(PBLOK); 33223000
|
|
33224000
|
|
FOR TI1 := FIRSTLOC STEP -1 UNTIL LASTLOC DO 33225000
|
|
BEGIN 33226000
|
|
IF (TW1 := P2 := M[TI1]).TAG = DOUBL THEN 33227000
|
|
BEGIN 33227100
|
|
LASTLOC := * - 1; 33227200
|
|
TI1 := * - 1; 33227300
|
|
COMMENT P2 DOESN"T COUNT DOUBLES AS 2 33227400
|
|
WORDS; 33227500
|
|
END ELSE 33227600
|
|
IF TW1.TAG = DATADESC THEN 33228000
|
|
IF NOT BOOLEAN(REAL(TW1).PBITF) THEN 33229000
|
|
M[TI1] ~ PRESENCEBIT; 33230000
|
|
33231000
|
|
END; 33232000
|
|
GO TO FIN; 33233000
|
|
END MCS 2 MULTIPLE DESCRIPTORS 33234000
|
|
ELSE 33235000
|
|
33236000
|
|
IF (REAL(MOM~M[MOMLOCATION~(IF KIND=IRW 33237000
|
|
THEN STACKVECTOR [ACTUALCOPY.STKNRF].ADDRESSF33238000
|
|
+ACTUALCOPY.DISPF 33239000
|
|
+ACTUALCOPY.SIRWDELTAF 33240000
|
|
ELSE ACTUALCOPY.ADDRESSF)] 33241000
|
|
).LOCKBITF=1 AND KIND=SEGDESC) 33242000
|
|
OR DESCRIPTORLOCK 33242100
|
|
THEN 33243000
|
|
COMMENT *** NOTE ABSOLUTE ADDRESSES, THIS IS A MESSY BUSINESS AND33244000
|
|
SHOULD BE CHANGED IF POSSIBLE. NOTE THAT THE SIRW 33245000
|
|
IS CHANGED INTO AN ABSOLUTE ADDRESS BECAUSE GETSPACE 33246000
|
|
EXPECTS ONE; 33247000
|
|
BEGIN COMMENT MCS 3; 33248000
|
|
UNLOCK(PBLOK); 33249000
|
|
WAIT(EVNT @ REFERENCE(IOCBREFERENCE ~ 33250000
|
|
IOCBREFERENCE&REFERENCED 33251000
|
|
(1,*,* 33251100
|
|
,TI3~IF KIND=SEGDESC 33251200
|
|
THEN MOM.ADDRESSF 33251300
|
|
ELSE MOM.ADDRESF 33251400
|
|
) 33251500
|
|
)); 33252000
|
|
TI2~WORD(AREADESC@IOCB).ADDRESSF+1; 33253000
|
|
33254000
|
|
COMMENT *** MAYBE THIS CAN BE FIXED LATER; 33255000
|
|
GO TOSLEEP; 33256000
|
|
END MCS 3 33257000
|
|
ELSE; 33258000
|
|
33259000
|
|
33260000
|
|
33261000
|
|
33262000
|
|
UNLOCK(PBLOK); 33263000
|
|
IF MOM.AITINDICATORF=1 AND KIND=DATADESC 33264000
|
|
THEN BEGIN M[MOMLOCATION]~MOM~DOPEVECTOR(MOM); 33265000
|
|
IF BOOLEAN(ACTUALCOPY.IBITF) THEN 33266000
|
|
ACTUALCOPY~ MOM &DATADESCRIPTOR 33267000
|
|
(*,*,1,1,*,*,*,*, 33268000
|
|
ACTUALCOPY.INDEXF,*) ELSE 33269000
|
|
ACTUALCOPY~MOM&DATADESCRIPTOR(*,*,1,*,*,*,*33270000
|
|
,*,*,*); 33271000
|
|
GO LOOKFORPREEMPT; 33272000
|
|
END; 33273000
|
|
IF MOM.PBITF= 1 33274000
|
|
THEN 33275000
|
|
BEGIN COMMENT MCS 4; 33276000
|
|
TI2~MOM.ADDRESSF; 33277000
|
|
ALREADYPRESENT ~ TRUE; 33278000
|
|
MOMPRESENT: IF KIND!IRW THEN PRESENCEBIT~ACTUALCOPY 33279000
|
|
~ACTUALCOPY&FIXDESC(1,*,TI2); 33280000
|
|
IF NOT ALREADYPRESENT 33281000
|
|
THEN 33282000
|
|
BEGIN COMMENT MCS 4A ; 33283000
|
|
MOM~MOM&FIXDESC(1,*,TI2); 33284000
|
|
IF KIND=SEGDESC 33285000
|
|
THEN MOM.LOCKBITF~0; 33286000
|
|
M [MOMLOCATION] ~ MOM; 33287000
|
|
TURNOVERLAYKEY(MOMLOCATION); 33288000
|
|
END MCS 4A; 33288100
|
|
IF NOCHANGE 33289000
|
|
THEN 33290000
|
|
BEGIN COMMENT MCS 4B; 33291000
|
|
IF NOT ALREADYPRESENT THEN 33294000
|
|
FORGETAREA(IOCBSIZE,TI333294100
|
|
); 33294200
|
|
UNLOCK(MULTIPLEREFERENCELOK);33295000
|
|
GO FIN; 33296000
|
|
END MCS 4B; 33297000
|
|
33298000
|
|
LOOKFORPREEMPT: % *** THERE WAS A CONDITIONAL CALL ON WHATDOIDO 33299000
|
|
END MCS 4 33300000
|
|
ELSE 33301000
|
|
BEGIN COMMENT MCS 5 ; 33302000
|
|
COMMENT ********** *************33303000
|
|
******************* *************33304000
|
|
DATA AND SEGMENT DESCRIPTORS ARE INTERPRETED AS FOLLOWS 33305000
|
|
***** DATA DESCRIPTORS ***** 33306000
|
|
INTERPRETATION 33307000
|
|
FIELD OLAYTYPEF 33308000
|
|
MCPF FILETYPEF AITINDICATORF ADDRESF 33309000
|
|
(MCPCODEF) 33310000
|
|
BITS 19:1 18:1 17:1 16:17 33311000
|
|
0 0 0 >1 NON-MCP READ IN OLAYABLE 33312000
|
|
FROM OLAY FILE 33313000
|
|
0 0 0 0 NON-MCP GET OLAYABLE 33314000
|
|
0 0 0 1 NON-MCP GET SAVE SPACE 33315000
|
|
0 0 1 * NON-MCP AIT REFERENCE 33316000
|
|
0 1 0 * NON-MCP READ ONLY 33317000
|
|
FROM CODE FILE 33318000
|
|
0 1 1 * NOT USED 33319000
|
|
1 0 0 >1 NOT USED 33320000
|
|
1 0 0 0 MCP GET OLAYABLE SPACE 33321000
|
|
1 0 0 1 MCP GET SAVE SPACE 33322000
|
|
1 0 1 * MCP.AIT REFERENCE 33323000
|
|
1 1 0 * MCP READ ONLY 33324000
|
|
FROM CODE FILE 33325000
|
|
1 1 1 * ADDRESS IS THAT OF IOCB 33326000
|
|
SOMEBODY ELSE IS READING 33326100
|
|
IN ARRAY.WAIT ON EVENT IN 33326200
|
|
IOCB. (NOTE THIS IS A 33326300
|
|
SPECIAL COMBINATION WHERE 33326400
|
|
MEANINGS OF INDIVIDUAL 33326500
|
|
BITS DO NOT APPLY). 33326600
|
|
*****SEGMENT DESCRIPTORS ***** 33327000
|
|
INTERPRETATION 33328000
|
|
FIELD DICTIONARYF LOCKBITF ADDRESSF 33329000
|
|
BITS 45:1 44:1 19:20 33330000
|
|
1 0 * DO DICTIONARY READ IN 33331000
|
|
OVERLAYABLE PROGRAM FROM 33332000
|
|
MCP CODE FILE 33333000
|
|
0 0 * D1 DICTIONARY.READ IN 33334000
|
|
OVERLAYABLE FROM PROGRAM 33335000
|
|
CODE FILE 33336000
|
|
0 1 * ) ADDRESS IS THAT OF IOCB 33337000
|
|
1 1 * ) SOMEBODY ELSE IS READING 33338000
|
|
IN PROGRAM. WAIT ON EVENT 33339000
|
|
IN IOCB 33340000
|
|
DD FORMAT TO BE DETERMINED NON OLAYABLE FROM OLAY FILE 33343000
|
|
DD FORMAT TO BE DETERMINED NON OLAYABLE FROM CODE FILE 33344000
|
|
SD >1 * 0 READ IN OVERLABLE PROGRAM 33345000
|
|
SD >1 * 1 READ NON OVERLAYABLE PROGRAM33346000
|
|
; 33347000
|
|
TI1~MOM.LENGTHF; 33348000
|
|
COMMENT *** MAYBE WE SHOULD CALL GETAREA SOMETIMES; 33349000
|
|
TI2 ~GETSPACE 33350000
|
|
( TI1 ~(IF KIND=SEGDESC 33351000
|
|
THEN TI1 33352000
|
|
ELSE IF MOM.SZF = 1 33353000
|
|
THEN TI1 | 2 33354000
|
|
ELSE IF TI3~ MOM.SZF= 0 33355000
|
|
THEN TI1 33356000
|
|
ELSE (TI1 ~ (IF TI3 = 4 THEN 33357000
|
|
(TI3~6) - 1 33358000
|
|
ELSE IF TI3 = 3 THEN 33359000
|
|
(TI3~8) - 1 33360000
|
|
ELSE (TI3~12) - 1)) 33361000
|
|
DIV TI3) 33362000
|
|
, MYSNR 33363000
|
|
,0&SPACETYPE (1,1,1, 33364000
|
|
REAL(NOT ( KIND = DATADESC AND REAL(MOM).ADDRESSF = 1))) 33365000
|
|
33366000
|
|
,MOMLOCATION 33367000
|
|
); 33368000
|
|
IF KIND = SEGDESC OR MOM.ADDRESF > 1 OR 33369000
|
|
MOM.DESCRIPTORLOCKF = 2 THEN 33369100
|
|
33370000
|
|
BEGIN COMMENT MCS 6; 33371000
|
|
IF(KIND=SEGDESC AND MOM.DICTIONARYF=1) OR 33372000
|
|
(KIND=DATADESC AND MOM.MCPCODEF=3) 33373000
|
|
THEN TI3 ~ MOM.ADDRESF+MCPDISKBASE 33374000
|
|
ELSE 33375000
|
|
BEGIN 33376000
|
|
DISKADDRESSES~WORDSTACK 33377000
|
|
[IF(OLAY~KIND=DATADESC AND MOM.FILETYPEF=0) 33377500
|
|
THEN MYSNR 33378000
|
|
ELSE WORDSTACK[MYSNR,PROCESSFAMILYLINKPLACE]. 33378500
|
|
FATHERF 33378502
|
|
, IF OLAY 33379000
|
|
THEN OLAYFILEDESCRIPTORPLACE 33379500
|
|
ELSE D1CODEFILEDESCPLACE 33380000
|
|
]; 33380800
|
|
33381000
|
|
TI3~DISKADDRESSES 33382000
|
|
[FIRSTROWINDEX + (TI3 := MOM.ADDRESF) 33383000
|
|
DIV(IF OLAY THEN OLAYROWLENTH ELSE CODEROWLENTH)33384000
|
|
] 33385000
|
|
+TI3 MOD(IF OLAY THEN OLAYROWLENTH ELSE CODEROWLENTH)33386000
|
|
; 33387000
|
|
33388000
|
|
END; 33389000
|
|
IOCW ~ @440 + REAL(KIND = SEGDESC); 33390000
|
|
RESET(EVNN); 33391000
|
|
DISKADDRESSES~DISKADDRESSES&ARRAYDESCL(3,TI1,TI2); 33392000
|
|
MOM~MOM&POINTTOIOCB(*, 33393000
|
|
WORD(DISKIO(DISKADDRESSES,-1,TI1,TI3,IOCW,EVNN))); 33394000
|
|
M[MOMLOCATION]~MOM 33394100
|
|
~IF KIND=SEGDESC THEN MOM&LOKMOM(1,*) 33394200
|
|
ELSE MOM&LOKMOM(*,7); 33394300
|
|
UNLOCK(PBLOK); 33396000
|
|
WAIT (EVNN); 33397000
|
|
TI3 ~ MOM.ADDRESSF; 33398000
|
|
33399000
|
|
TOSLEEP: NOCHANGE~ TRUE; 33400000
|
|
BUZZCONTROL(MULTIPLEREFERENCELOK); COMMENT *** BUZZ; 33401000
|
|
IF BOOLEAN (M[MOMLOCATION].PBITF) 33402000
|
|
THEN BEGIN 33403000
|
|
ALREADYPRESENT ~ TRUE; 33404000
|
|
END; 33405000
|
|
33406000
|
|
GO TO MOMPRESENT; 33407000
|
|
END MCS 6 33408000
|
|
ELSE BEGIN 33409000
|
|
MOM~MOM&FIXDESC(1,*,TI2); 33410000
|
|
INITIALIZETOZERO (TI2, TI1); 33411000
|
|
COMMENT *** OPTIMISE LATER; 33412000
|
|
GO TO MOMPRESENT; 33413000
|
|
END; 33414000
|
|
END MCS 5; 33415000
|
|
FIN: 33416000
|
|
RETURN(ACTUALCOPY); 33417000
|
|
END MCS 1 PRESENCEBIT; 33418000
|
|
PROCEDURE NOTYETCODED(SPEC); VALUE SPEC; 33419000
|
|
REAL SPEC; COMMENT SPECIFIES MSSING CODE; 33420000
|
|
BEGIN 33421000
|
|
COMMENT MUST IMSERT CODE TO PRINT OUT MESSAGE HERE; 33422000
|
|
KILLME(SPEC); 33423000
|
|
END NOTYETCODED; 33424000
|
|
%%%%% INTERRUPT PROCEDURE OUTER BLOCK CODE %%%% 33425000
|
|
%%%%% %%%% 33426000
|
|
%%%%% %%%% 33427000
|
|
TRACTER~TRACE(0); 33428000
|
|
IF SIMULATING THEN 33428990
|
|
MONITORVALUE~D[31]; 33429000
|
|
P1~P1; COMMENT ***** REDUNDANT- FOR MONITORING; 33430000
|
|
COMMENT 33431000
|
|
IF P1= INTERVALTIMERSPEC AND BUSY(GROSSLOK) 33432000
|
|
THEN GO FINI 33433000
|
|
ELSE IF LOCK(GROSSLOK) THEN KILLME(GROSSLOCK); 33434000
|
|
COMMENT *** ELSE BUZZ(GROSSLOK) LATER; 33435000
|
|
COMMENT GROSSLOK IS NOMINALLY SET AT ENTRY TO INTERRUPT 33436000
|
|
PROCEDURE AND DETERMINES THAT ONLY ONE INTERRUPT33437000
|
|
AT A TIME IS HANDLED. THIS MAY BE A TEMPORARY 33438000
|
|
MEASURE IN WHICH CASE A LOCK LESS POWERFUL THAN 33439000
|
|
GROSSLOK, WHICH PREVENTS OVERLAY ACTION, WILL BE33440000
|
|
USED 33441000
|
|
WHEN AN INTERRUPT GOES THROUGH THE LOCK, IT33442000
|
|
MAY NOT BE INTERRUPTED (FOR HARDWARE OR 33443000
|
|
SOFTWARE REASONS) BY ANYTHING EXCEPT INTERVAL 33444000
|
|
TIMER. HENCE INTERVAL TIMER MUST NOT BUZZ THE 33445000
|
|
LOCK IF IT HAS BEEN SET BY SOMEBODY ELSE- IN 33446000
|
|
THIS CIRCUMSTANCE THE INTERVAL TIMER INTERRUPT 33447000
|
|
IS LOST 33448000
|
|
; 33449000
|
|
DISABLEOVERLAY; 33450000
|
|
COMMENT THIS SHOULD 33451000
|
|
(1) MAKE THE STACK NON OVERLAYABLE 33452000
|
|
(2) MARK THE STACK APPROPRIATELY 33453000
|
|
AT PRESENT IT DOES NOTHING. NOTE THAT THIS HAS TO MESH IN WITH 33454000
|
|
GENERAL SCHEME FOR HANDLING ABSOLUTE ADDRESSES IN STACKS 33455000
|
|
; 33456000
|
|
MYF ~ F; 33457000
|
|
MYSNR~SNR; 33458000
|
|
COMMENT *** ABSOLUTE ADDRESS; 33459000
|
|
COMMENT * ** * * * * * * *; CASE P1.MPXFIELD | P1.IFFIELD OF 33460000
|
|
BEGIN COMMENT MCS 2; 33461000
|
|
COMMENT ALL NON MPX INTERRUPTS HERE; 33462000
|
|
CASE P1.SDFIELD|FIRSTONE(P1.INTFIELD) OF 33463000
|
|
BEGIN COMMENT MCS 3; 33464000
|
|
COMMENT ALL NON MPX,NON SYLLABLE DEPENDENT INTERRUPTS HERE; 33465000
|
|
IF P1 = PROCTOPROCSPEC THEN PROCTOPROC 33466000
|
|
ELSE IF P1=INTERVALTIMERSPEC THEN 33467000
|
|
BEGIN COMMENT MCS 3A; 33468000
|
|
IF (COUNTFORTIMERINTERRUPTEVENT~*+1) 33469000
|
|
= NUMBEROFPROCESSORS AND NOT 33470000
|
|
BUSY(READYQ) 33470100
|
|
THEN BEGIN COMMENT MCS 3B; 33471000
|
|
COUNTFORTIMERINTERRUPTEVENT 33472000
|
|
~0; 33473000
|
|
CAUSE (TIMERINTERRUPTEVENT);33474000
|
|
END MCS 3B; 33475000
|
|
END MCS 3A 33476000
|
|
ELSE IF P1=STACKOVERFLOWSPEC THEN STACKOVERFLOW 33477000
|
|
ELSE IF P1=SYLLABLEDEPNDNT2SPEC THEN 33478000
|
|
SYLLABLEDEPENDENT2 33479000
|
|
ELSE IF P1 } ALARMSPEC THEN ALARM 33480000
|
|
ELSE STOP; 33481000
|
|
MEMORYPROTECT; 33482000
|
|
INVALIDOPERATOR; 33483000
|
|
ARITHMETICFAULT(DZ); COMMENT DIVIDE BY ZERO; 33484000
|
|
ARITHMETICFAULT(EO); COMMENT EXPONENT OVERFLOW; 33485000
|
|
ARITHMETICFAULT(EU); COMMENT EXPONENT UNDERFLOW; 33486000
|
|
ARITHMETICFAULT(II); COMMENT INVALID INDEX; 33487000
|
|
ARITHMETICFAULT(IO); COMMENT INTEGER OVERFLOW; 33488000
|
|
BOTTOMOFSTACK; 33489000
|
|
BEGIN 33490000
|
|
PRESENCEBIT; 33491000
|
|
33492000
|
|
GO FINI; 33493000
|
|
END; 33494000
|
|
STOP; 33495000
|
|
WHATDOIDO; 33496000
|
|
GO FINI; 33497000
|
|
END MCS 3 SYLLABLE DEPENDENT INTERRUPTS; 33498000
|
|
MLL1; 33499000
|
|
MLL2; 33500000
|
|
MLL3; 33501000
|
|
MLL4; 33502000
|
|
EXTERNALMPX; 33503000
|
|
COMMENT FIRST MPX UNASSIGNED INTERRUPT HANDLED HERE.IN-LINE CODE USED; 33504000
|
|
NOTYETCODED(GCAINTERRUPT); 33505000
|
|
COMMENT OTHER MPX UNASSIGNED INTERRUPTS HANDLED HERE; 33506000
|
|
MPXUNASSIGNED(UA2); 33507000
|
|
MPXUNASSIGNED(UA3); 33508000
|
|
AGAIN: 33508100
|
|
IOFINISH(P1.MPXSPECFIELD); 33509000
|
|
COMMENT SKIP UNUSED BIT POSITIONS IN IFFIELD HERE; 33510000
|
|
;;;;; 33511000
|
|
COMMENT REST OF THIS PROCEDURE DEVOTED TO IOFINISH. NOTE THE FOLLOWING:33512000
|
|
(1) IOFINISH AND GCA INTERRUPTS ARE HANDLED BY CODE LOCAL33513000
|
|
TO INTERRUPT PROCEDURE . ALL OTHER INTERRUPTS 33514000
|
|
HANDLED BY PROCEDURE CALLS 33515000
|
|
(2) CALLED PROCEDURES ARE DECLARED LOCAL TO THE 33516000
|
|
INTERRUPT PROCEDURE 33517000
|
|
(3) THERE MAY BE DUPLICATION OF CODE IN ORDER TO 33518000
|
|
SPEED THE PROCESSING OF SOME INTERRUPTS 33519000
|
|
; 33520000
|
|
STOP; 33522000
|
|
END MCS CASE EXPRESSION; 33523000
|
|
IF MULTIPLEXORMASK.BITONEF 33524000
|
|
THEN IF (P1~SCANIN(LITERALFUNCTIONA))!1 33525000
|
|
THEN GO AGAIN; 33526000
|
|
IF MULTIPLEXORMASK.BITTWOF 33527000
|
|
THEN IF (P1~SCANIN(LITERALFUNCTIONB))!2 33528000
|
|
THEN GO AGAIN; 33529000
|
|
WHATDOIDO; 33529100
|
|
FINI: 33530000
|
|
UNLOCK(GROSSLOK); 33531000
|
|
ENABLEOVERLAY; 33532000
|
|
TRACE(TRACTER); 33534998
|
|
IF RTBIT THEN RETURN(ACTUALCOPY); 33535000
|
|
END MCS 1 HARDWAREINTERRUPT; 33537000
|
|
SAVE PROCEDURE WHATDOIDO; 33538000
|
|
COMMENT IF THERE IS SOMETHING OF HIGHER PRIORITY IN THE READYQ THEN 33539000
|
|
FIRE IT UP ELSE EXIT. SIMILAR TO WAIT AND HOLD 33540000
|
|
; 33541000
|
|
BEGIN 33542000
|
|
LABEL FINI 33543000
|
|
; 33544000
|
|
REAL MYSNR 33545000
|
|
, NEXTSTACKNO 33546000
|
|
; 33547000
|
|
MONITOR JACKMONITOR(MYSNR); 33548000
|
|
33549000
|
|
SETINTERVALTIMER; 33550000
|
|
MYSNR ~ SNR; 33551000
|
|
STACK[MYSNR,PRIORITYPLACE]~0;% *** TAKE OUT WHEN PRIORITY ALGORTHMS OK 33551100
|
|
IF LOCK(READYQ) THEN GO FINIS; % *** WITH NO INTERVAL TIMER 33552000
|
|
% *** PROBLEMS BUZZCONTROL 33552100
|
|
COMMENT ***** SHOULD THIS BE BUZZ; 33553000
|
|
IF NOTHINGTODO 33554000
|
|
THEN GO FINI 33555000
|
|
ELSE IF STACK[NEXTSTACKNO~NEXTSTACKINREADYQ,PRIORITYPLACE]33556000
|
|
}STACK[MYSNR,PRIORITYPLACE] 33557000
|
|
THEN BEGIN 33558000
|
|
INSERTINQ(READYQ,DUMMYREF,MYSNR); 33559000
|
|
MOVETONEXTINREADYQ; 33560000
|
|
END 33561000
|
|
ELSE ; 33562000
|
|
33563000
|
|
FINI: UNLOCK(READYQ); 33564000
|
|
FINIS: 33564100
|
|
END WHATDOIDO; 33565000
|
|
33566000
|
|
SAVE PROCEDURE EVENTHANDLER (THEEVENT,EVENTWORD1,WAITFLAG); 33567000
|
|
VALUE EVENTWORD1,WAITFLAG; 33568000
|
|
WORD THEEVENT %IRW OR INDEXED DD POINTING TO EVENT 33569000
|
|
, EVENTWORD1 %FIRST WORD OF EVENT 33570000
|
|
; 33571000
|
|
BOOLEAN WAITFLAG %TRUE IF WAIT, FALSE IF CAUSE 33572000
|
|
; 33573000
|
|
COMMENT 33574000
|
|
THE ESPOL INTRINSIC WAIT(WAITFLAG TRUE) OR CAUSE, LOCKS THE EVENT 33575000
|
|
AND PASSES TO THIS PROCEDURE: 33576000
|
|
AN IRW OR INDEXED DD POINTING TO THE EVENT 33577000
|
|
THE FIRST WORD OF THE EVENT (WITH A DOUBLE TAG) 33578000
|
|
A FLAG INDICATING WHETHER CAUSE OR WAIT IS REQUIRED 33579000
|
|
33580000
|
|
33581000
|
|
WAIT ACTION: 33582000
|
|
1) THE INTERVAL TIMER IS RESET 33583000
|
|
2) IF THE READYQ IS EMPTY, THE NOTHING TO DO LOOP IS 33584000
|
|
ENTERED. IN THE NOTHING TO DO LOOP: 33585000
|
|
A THE READYQ IS BUZZED 33586000
|
|
B IF READYQ NON EMPTY THEN GO TO 3 33587000
|
|
C IF EVENT HAS HAPPENED,UNLOCK READYQ,E GO TO 4 33588000
|
|
D OTHERWISE CALL STATUS AND GO TO A 33589000
|
|
3) IF THE READYQ IS NOT EMPTY 33590000
|
|
A PUT THIS PROCESS IN EVENT QUEUE 33591000
|
|
B UNLOCK EVENT (BY REPLACING FIRST WORD OF EVENT) 33592000
|
|
C UNLOCK READYQ 33593000
|
|
D MOVE TO NEW JOB 33594000
|
|
E ON RETURN PROCESS ANY OUTSTANDING SOFTWARE 33595000
|
|
INTERRUPTS 33596000
|
|
4) EXIT 33597000
|
|
CAUSE ACTION 33598000
|
|
1) MOVE WAITQ TO READYQ 33599000
|
|
2) CHECK SOFTWARE INTERRUPT COUNT IN FIRST WORD OF EVENT 33600000
|
|
IF ZERO GO TO OTHERWISE 33601000
|
|
3) FOR EACH STACK IN INTERRUPT QUEUE IN TURN 33602000
|
|
A BUZZ SOFTWAREINTERRUPTLOCK 33603000
|
|
B IS THE INTERRUPT ENABLED,IF NOT GO TO NEXT STACK33604000
|
|
C OTHERWISE ENTER INTERRUPT IN SOFTWAREINTERRUPTQ 33605000
|
|
D IF STACK ACTIVE THEN DO A HEYOU 33606000
|
|
E UNLOCK SOFTWARE INTERRUPT LOCK 33607000
|
|
4) UNLOCK AND SET THE EVENT 33608000
|
|
; 33609000
|
|
BEGIN 33610000
|
|
LABEL LOOKFORNEWPROCESS 33611000
|
|
, LOOKFORANOTHER 33612000
|
|
; 33613000
|
|
EVENT THISEVENT=THEEVENT 33614000
|
|
; 33615000
|
|
DEFINE NEXTINTERRUPTPCW = 33616000
|
|
STACK[(NEXTSNR~NEXTSTACK.STKNRF), 33617000
|
|
DISPPCW~NEXTSTACK.DISPF+NEXTSTACK.SIRWDELTAF]# 33618000
|
|
33619000
|
|
33620000
|
|
,UNLOCKEVENT=THEEVENT~EVENTWORD1&FIRSTEVENTWORD(,*,*,33621000
|
|
*,*,*,0)# 33622000
|
|
, PROCESSINHOLD = REFERENCE(WORD(NEXTSNR))# 33623000
|
|
, EVENTWAITQ= EVENTWORD1 # 33624000
|
|
; 33625000
|
|
WORD EVENTPOINTER=THEEVENT %PREVENTS PARAMETER ACTION 33626000
|
|
, NEXTSTACK 33627000
|
|
, INTERRUPTPOINTER 33628000
|
|
; 33629000
|
|
REAL INTERRUPTQCOUNT 33630000
|
|
, NEXTSNR 33631000
|
|
, DISPPCW = NEXTSTACK 33632000
|
|
, MYSNR 33633000
|
|
; 33634000
|
|
REFERENCE REFERENCEINTERRUPTPOINTER=INTERRUPTPOINTER 33635000
|
|
; 33636000
|
|
MONITOR JACKMONITOR(WAITFLAG); 33637000
|
|
INTEGER IDLETI, REALTI; 33638000
|
|
MONITOR DONMONITOR (REALTI, IDLETI); 33639000
|
|
MYSNR~SNR; 33640000
|
|
IF SIMULATING THEN BEGIN 33641100
|
|
WAITFLAG ~ *; 33641200
|
|
REALTI ~ REGISTERS[61]; 33642000
|
|
IDLETI ~ REGISTERS[62]; 33643000
|
|
END; 33643100
|
|
IF WAITFLAG 33644000
|
|
THEN 33645000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 133646000
|
|
% WAIT PROCESSING 33647000
|
|
SETINTERVALTIMER; 33649000
|
|
IF BOOLEAN(EVENTWORD1.HAPPENEDBITF) 33649100
|
|
THEN BEGIN UNLOCKEVENT;GO FINI;END; 33649200
|
|
LOOKFORNEWPROCESS: BUZZCONTROL(READYQ); 33650000
|
|
COMMENT ***** SHOULD THIS BE BUZZ; 33651000
|
|
IF NOTHINGTODO 33652000
|
|
THEN 33653000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 233654000
|
|
% READYQ EMPTY 33655000
|
|
UNLOCK(READYQ); 33655100
|
|
UNLOCKEVENT; 33656000
|
|
33657000
|
|
33658000
|
|
COMMENT *** 33659000
|
|
ALLOW; 33660000
|
|
COMMENT * * * * SIMULATOR ONLY; PAUSE; 33661000
|
|
DISALLOW; 33662000
|
|
IF HAPPENED(THISEVENT) 33663000
|
|
THEN 33664000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 333665000
|
|
% CLEAN UP AND GET OUT 33666000
|
|
UNLOCK(READYQ); 33667000
|
|
33668000
|
|
COMMENT THE EVENT IS UNLOCKED WITH FIRST 33669000
|
|
WORD RESTORED; 33670000
|
|
END %%%%%%%%%%%%%%% %%%MCS 333671000
|
|
ELSE LOOKFORSOMETHING; 33672000
|
|
END %%%%%%%%%%%%%%% %%%MCS 233682000
|
|
ELSE 33683000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 533684000
|
|
% SEND PROCESS TO SLEEP 33685000
|
|
WORDSTACK[MYSNR,EVENTWAITQLINK] 33686000
|
|
.FULLINDICATORF~1; 33687000
|
|
IF EVENTWORD1.WAITQHEADF=0 33688000
|
|
THEN 33689000
|
|
%%%%%%%%%%%%%%%%%%%% %%%%%%% 33690000
|
|
%FIRST IN QUEUE 33691000
|
|
EVENTWORD1.WAITQHEADF~MYSNR 33692000
|
|
ELSE 33693000
|
|
BEGIN%%%%%%%%%% %%%MCS5133694000
|
|
% SECOND AND SUBSEQUENT IN QUEUE 33695000
|
|
33696000
|
|
WORDSTACK[MYSNR,EVENTWAITQLINK].BACKWARDLINKF~EVENTWORD1.WAITQTAILF; 33697000
|
|
WORDSTACK[EVENTWORD1.WAITQTAILF,EVENTWAITQLINK].FORWARDLINKF~MYSNR; 33698000
|
|
33699000
|
|
33700000
|
|
33701000
|
|
END; %%%%%%%%%% %%%MCS5133702000
|
|
EVENTWORD1.WAITQTAILF~MYSNR; 33703000
|
|
UNLOCKEVENT; 33704000
|
|
MOVETONEXTINREADYQ; 33705000
|
|
COMMENT A READYQ ALGORITAM:DELINKS,UNLOCKS,MOVES; 33706000
|
|
COMMENT AT THIS POINT WE LOSE CONTROL SOME LOGGING 33707000
|
|
ACTION IS REQUIRED; 33708000
|
|
LOOKFORANOTHER: IFTHEREISASOFTWAREINTERRUPT 33709000
|
|
THEN 33710000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 633711000
|
|
HANDLETHESOFTWAREINTERRUPT; 33712000
|
|
GO LOOKFORANOTHER; 33713000
|
|
END %%%%%%%%%%%%%%% %%%MCS 633714000
|
|
END %%%%%%%%%%%%%%% %%%MCS 533715000
|
|
END %%%%%%%%%%%%%%% %%%MCS 133716000
|
|
ELSE 33717000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 733718000
|
|
% CAUSE PROCESSING 33719000
|
|
IF EVENTWORD1.WAITQHEADF!0 33720000
|
|
THEN 33721000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 833722000
|
|
BUZZCONTROL(READYQ); 33723000
|
|
INSERTINQUEUE(WAITI,EVENTWAITQ); 33724000
|
|
UNLOCK(READYQ); 33725000
|
|
END ; %%%%%%%%%% %%%MCS 833726000
|
|
IF INTERRUPTQCOUNT ~ EVENTWORD1.COUNTF!0 33727000
|
|
THEN 33728000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 933729000
|
|
NEXTSTACK~INTERRUPTPOINTER 33730000
|
|
~SECONDWORD(THISEVENT) ;33731000
|
|
DO 33732000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS9A33733000
|
|
BUZZ(SOFTWAREINTERRUPTLOCK); 33734000
|
|
IF BOOLEAN(NEXTINTERRUPTPCW). 33735000
|
|
ENABLEBITF 33736000
|
|
THEN 33737000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS1033738000
|
|
INTERRUPTPOINTER~INTERRUPTPOINTER&STUFFEDIRW(,,*,*,*); 33739000
|
|
INSERT(SOFTWAREINTERRUPTQ,REFERENCEINTERRUPTPOINTER); 33740000
|
|
IF WORDSTACK[NEXTSNR,0].TAG = SINGL 33741000
|
|
THEN HEYOU 33742000
|
|
ELSE IF STACK[NEXTSNR,READYQLINK].FULLINDICATORF=0 33743000
|
|
THEN 33744000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS5033745000
|
|
BUZZ(READYQ); 33746000
|
|
INSERTINQ(READYQ,DUMMYREF,MYSNR); 33747000
|
|
33748000
|
|
UNLOCK(READYQ); 33749000
|
|
END ;%%%%%%%%%%%%%%% %%%MCS5033750000
|
|
END ;%%%%%%%%%%%%%%% %%%MCS1033751000
|
|
NEXTSTACK~INTERRUPTPOINTER 33752000
|
|
~STACK[NEXTSNR,DISPPCW-1]; 33753000
|
|
UNLOCK(SOFTWAREINTERRUPTLOCK); 33754000
|
|
END %%%%%%%%%%%%%%% %%%MCS9A33755000
|
|
UNTIL INTERRUPTQCOUNT~INTERRUPTQCOUNT-1=0; 33756000
|
|
END ;%%%%%%%%%%%%%%% %%%MCS 933757000
|
|
THEEVENT~EVENTWORD1&FIRSTEVENTWORD(,*,0,0,*,1,0); 33758000
|
|
GO LOOKFORANOTHER; 33759000
|
|
END ;%%%%%%%%%%%%%%% %%%MCS 733760000
|
|
FINI: 33761000
|
|
END EVENTHANDLER; 33762000
|
|
SAVE PROCEDURE GAOLER(EVENTT, UNLOCK); 33762100
|
|
VALUE UNLOCK; 33762120
|
|
EVENT EVENTT; 33762140
|
|
BOOLEAN UNLOCK; 33762160
|
|
COMMENT THE GAOLER KEEPS THE KEYS TO THE INTERLOCKS; 33762180
|
|
BEGIN 33762200
|
|
LABEL LOCKUP; 33762220
|
|
IF UNLOCK THEN 33762240
|
|
BEGIN 33762260
|
|
FREE(EVENTT); 33762280
|
|
CAUSE(EVENTT); 33762300
|
|
END 33762320
|
|
ELSE 33762340
|
|
LOCKUP: IF FIX(EVENTT) THEN 33762360
|
|
BEGIN 33762400
|
|
WAIT(EVENTT); 33762420
|
|
GO LOCKUP; 33762440
|
|
END 33762460
|
|
ELSE 33762465
|
|
RESET(EVENTT); 33762470
|
|
END GAOLER; 33762480
|
|
SAVE WORD PROCEDURE SOFTWAREINTERRUPTDEC(THEEVENT,EVENTWORD1,EVENTWORD2,33763000
|
|
KLUDGE,PCWPOINTER); 33764000
|
|
VALUE EVENTWORD1,EVENTWORD2,PCWPOINTER,KLUDGE; 33765000
|
|
WORD THEEVENT, % IRW OR INDEXED DD POINTING TO 33766000
|
|
% INTERRUPT EVENT 33767000
|
|
EVENTWORD1, % FIRST WORD OF EVENT 33768000
|
|
EVENTWORD2, % ZERO USED TO FIX UP SECOND WORD OF 33769000
|
|
% EVENT AT FIRST ENTRY 33770000
|
|
PCWPOINTER % POINTER TO INTERRUPT PCW (SIRW) 33771000
|
|
,KLUDGE % HORRIBLE KLUDGE FOR COMPILER 33772000
|
|
; 33773000
|
|
COMMENT 33774000
|
|
THE ESPOL INTERRUPT DECLARATION PLACES ZERO IN THE FIRST WORD OF 33775000
|
|
INTERRUPT AND A PCW REFERENCING THE STATEMENT IN THE SECOND WORD. IT33776000
|
|
GENERATES A CALL ON THIS PROCEDURE. 33777000
|
|
THIS PROCEDURE LINKS THIS STACK INTO THE INTERRUPT QUEUE BEHIND33778000
|
|
THE EVENT AFTER FIRST CHECKING THAT THE STACK IS NOT ALREADY SO 33779000
|
|
LINKED (A RUN TIME ERROR IS NOTED IF THIS CHECK FAILS) 33780000
|
|
THE INTERRUPT QUEUE IS DERIVED AS FOLLOWS: 33781000
|
|
(1) THE EVENT DECLARATION HAS PRODUCED A DOUBLE-LENGTH REAL 33782000
|
|
(2) THE FIRST (ENCOUNTERED) INTERRUPT DECLARATION REFERENCING 33783000
|
|
THE EVENT CAUSES THE SECOND WORD OF THE EVENT TO POINT TO 33784000
|
|
THE INTERRUPT PCW.THE SECOND WORD OF THE EVENT IS NOW 33785000
|
|
ESSENTIALLY A STUFFED IRW EXCEPT FOR ITS TAG FIELD. 33786000
|
|
(3) THE SECOND AND SUBSEQUENT INTERRUPT DECLARATIONS CAUSE THE33787000
|
|
FIRST WORD OF INTERRUPT IN THE STACK AT THE END OF THE 33788000
|
|
INTERRUPT QUEUE TO BE CHANGED FROM ZERO TO A STUFFED IRW 33789000
|
|
THIS STUFFED IRW POINTS TO THE PCW OF THE NEW 33790000
|
|
INTERRUPT DECLARATION. 33791000
|
|
; 33792000
|
|
BEGIN 33793000
|
|
DOUBLE EVENTVALUE=EVENTWORD1 %TWO WORDS OF EVENT STARTING WITH33794000
|
|
%EVENTWORD1 33795000
|
|
, EVENTPLACE=THEEVENT %THEEVENT INVOKES OVRD.EVENTPLACE33796000
|
|
% INVOKES STOD.NOTE NO EVAL FOR 33797000
|
|
% EVENTPLACE, HOWEVER STOD CHASES33798000
|
|
% IRWS. 33799000
|
|
; 33800000
|
|
BOOLEAN FIRST % TRUE WHEN FIRST DECLARATION 33801000
|
|
; 33802000
|
|
INTEGER COUNT % NUMBER OF STACKS IN QUEUE (INC THIS ONE) 33803000
|
|
; 33804000
|
|
WORD NEXTSTACK % POINTS TO NEXT STACK IN QUEUE 33805000
|
|
; 33806000
|
|
REAL NEXTSTACKNO 33807000
|
|
, DISPSIRW 33808000
|
|
, MYSNR 33809000
|
|
; 33810000
|
|
DEFINE NEXTINTERRUPTSIRW = STACK 33811000
|
|
[NEXTSTACKNO 33812000
|
|
~NEXTSTACK.STKNRF,33813000
|
|
DISPSIRW~NEXTSTACK.DISPF-1 33814000
|
|
+ NEXTSTACK.SIRWDELTAF]# 33815000
|
|
; 33816000
|
|
MYSNR ~ SNR; 33817000
|
|
SOFTWAREINTERRUPTDEC~KLUDGE; 33818000
|
|
EVENTWORD1.COUNTF ~ COUNT ~ EVENTWORD1.COUNTF+1; 33819000
|
|
IF COUNT=1 33820000
|
|
THEN 33821000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 133822000
|
|
% FIRST DECLARATION 33823000
|
|
FIRST~TRUE; 33824000
|
|
COMMENT *** THIS CODE SLOPPY-OPTIMISE LATER; 33825000
|
|
END %%%%%%%%%%%%%%% %%%MCS 133826000
|
|
ELSE 33827000
|
|
33828000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 233829000
|
|
% SECOND AND SUBSEQUENT DECS. 33830000
|
|
NEXTSTACK~SECONDWORD(EVENTVALUE); 33831000
|
|
DO 33832000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 333833000
|
|
NEXTSTACK ~ NEXTINTERRUPTSIRW; 33834000
|
|
33835000
|
|
IF MYSNR=NEXTSTACKNO THEN KILLME(INTERRUPTDEC); 33836000
|
|
END %%%%%%%%%%%%%%% %%%MCS 333837000
|
|
UNTIL (COUNT~COUNT-1)=1; 33838000
|
|
STACK[NEXTSTACKNO,DISPSIRW-1] ~ PCWPOINTER; 33839000
|
|
END; %%%%%%%%%%%%%%% %%%MCS 233840000
|
|
%%%%%%%%%%%%%%% CLEAN UP 33841000
|
|
EVENTWORD1.EVENTLOCKBITF~0; 33842000
|
|
EVENTWORD1.TAG~DOUBL; 33843000
|
|
IF FIRST 33844000
|
|
THEN BEGIN 33845000
|
|
COMMENT *** (NO GOOD) EVENTWORD2~PCWPOINTER&STUFFEDIRW(DOUBL,*,*,*,*);33846000
|
|
PCWPOINTER.TAG~DOUBL;EVENTWORD2~PCWPOINTER; 33847000
|
|
THEEVENT~EVENTWORD1; 33848000
|
|
COMMENT THIS IS TERRIBLE,DOUBLE TAG SCREWS EVERYTHING; 33849000
|
|
EVENTPLACE~EVENTVALUE; 33850000
|
|
COMMENT *** OPTIMISE LATER; 33851000
|
|
END 33852000
|
|
ELSE THEEVENT ~ EVENTWORD1; % INVOKES OVRD 33853000
|
|
END SOFTWAREINTERRUPTDEC; 33854000
|
|
SAVE PROCEDURE HOLD; 33855000
|
|
COMMENT SENDS A PROCESS TO SLEEP. THE PROCESS WILL NOT WAKE UP UNTIL 33856000
|
|
A SOFTWARE INTERRUPT IS DIRECTED TO IT 33857000
|
|
IF THERE IS NOTHING IN THE READYQ, THE PROCESS ENTERS A 33858000
|
|
NOTHING TO DO LOOP (WITH INTERRUPTS ALLOWED). SHOULD A SOFTWARE33859000
|
|
INTERRUPTED BE DIRECTED AT IT IN THIS CONDITION, IT WILL BE 33860000
|
|
INTERRUPTED BY A HEYOU (HARDWARE) INTERRUPT 33861000
|
|
THE HEYOU INTERRUPT WILL TURN ON THE HEYOUINTERRUPT FIELD 33862000
|
|
TO INDICATE THE PROCESSING OF THE SOFTWARE INTERRUPT 33863000
|
|
33864000
|
|
PART OF THE NOTHING TO DO LOOP TESTS THE READYQLINK AND 33865000
|
|
THE PROCESS EXITS IF IT IS NON ZERO 33866000
|
|
; 33867000
|
|
BEGIN 33868000
|
|
REAL MYSNR 33869000
|
|
; 33870000
|
|
LABEL LOOKFORNEWPROCESS 33871000
|
|
,FINI 33872000
|
|
; 33873000
|
|
SETINTERVALTIMER; 33874000
|
|
MYSNR~SNR; 33875000
|
|
BUZZCONTROL(READYQ); % *** BUZZ 33876000
|
|
LOOKFORNEWPROCESS: 33877000
|
|
IF NOTHINGTODO 33878000
|
|
THEN IF WORDSTACK[MYSNR,LINKPLACE].HEYOUINTERRUPTF!0 33879000
|
|
THEN 33880000
|
|
BEGIN%%%%%%%%%%%%%%% %%%MCS 133881000
|
|
WORDSTACK[MYSNR,LINKPLACE].HEYOUINTERRUPTF~0; 33882000
|
|
UNLOCK(READYQ); 33883000
|
|
GO FINI; 33884000
|
|
END %%%%%%%%%%%%%%% %%%MCS 133885000
|
|
ELSE LOOKFORSOMETHING 33886000
|
|
ELSE MOVETONEXTONEINREADYQ; 33887000
|
|
FINI: 33888000
|
|
END HOLD; 33889000
|
|
SAVE PROCEDURE HOLDINITIALISE; 33890000
|
|
COMMENT THIS PROCEDURE IS ENTERED FROM INITIALISE AND PERFORMS THE 33891000
|
|
FOLLOWING FUNCTIONS: 33892000
|
|
A.FORGETS SPACE ASSOCIATED WITH INITIALISE 33893000
|
|
B.FIXES UP STACK SO THAT RUN WILL BE ENTERED WHEN IT IS 33894000
|
|
MOVED TO LATER ON (I.E. IT IS AN INDEPENDENTRUNNER STACK) 33895000
|
|
C.ENTERS A NOTHING-TO-DO LOOP 33896000
|
|
; 33897000
|
|
BEGIN 33898000
|
|
INTEGER I 33899000
|
|
, STACKNO 33899200
|
|
; 33900000
|
|
MONITOR JACKMONITOR(IRSTACKS) 33901000
|
|
; 33902000
|
|
REAL STAKADRES 33903000
|
|
, MYSNR 33904000
|
|
; 33905000
|
|
ARRAY MYSTACK[*]; 33906000
|
|
WORD ARRAY MYWORDSTACK = MYSTACK[*]; 33907000
|
|
33908000
|
|
LABEL FIXUPPROCESSOR 33909000
|
|
; 33910000
|
|
INTEGER HI % *** FOR MONITOR ONLY 33911000
|
|
; 33912000
|
|
MONITOR JACKMONITOR(HI) 33913000
|
|
; 33914000
|
|
HI~HI; % *** FOR MONITOR ONLY 33915000
|
|
MYSNR ~ SNR; 33916000
|
|
PIRSTACKS~IRSTACKS~SET(IRSTACKS,MYSNR); 33917000
|
|
WORDSTACK[MYSNR,PROCESSNATUREPLACE].DEDICATEDSTACKF ~ 1; 33918000
|
|
IF NOT LOCK(FIRSTLOK) 33919000
|
|
THEN BEGIN %%%MCS000010033920000
|
|
PERIPHERALINITIALIZE; 33921000
|
|
FORGETSPACE(SAVE1ADDRESS); 33922000
|
|
33922500
|
|
IF INDEPENDENTRUNNERSTACKS > NUMBEROFPROCESSORS 33923000
|
|
THEN 33924000
|
|
BEGIN %%%MCS000012533925000
|
|
COMMENT WE HAVE TO BUILD SOME MORE INDEPENDENT RUNNER STACKS; 33926000
|
|
DISABLEOVERLAY; 33927000
|
|
FOR I~NUMBEROFPROCESSORS+1 STEP 1 UNTIL INDEPENDENTRUNNERSTACKS DO 33928000
|
|
BEGIN %%%MCS000015033929000
|
|
IRSTACKS~SET(IRSTACKS,(STACKNO~GETINDEPENDENTRUNNERSTACK( 33930000
|
|
STAKADRES)));33931000
|
|
WORDSTACK[STACKNO,LINKPLACE ].DEDICATEDSTACKF ~ 1; 33932000
|
|
COMMENT *** 33933000
|
|
CHANGESPACE(STAKADRES); 33934000
|
|
END; %%%MCS000015033935000
|
|
ENABLEOVERLAY; 33936000
|
|
END %%%MCS000012533937000
|
|
ELSE INDEPENDENTRUNNERSTACKS~I~ 33938000
|
|
NUMBEROFPROCESSORS ; 33939000
|
|
PIRSTACKS~IRSTACKS~RESET(IRSTACKS,TERMINATESTACK~MYSNR); 33946000
|
|
NOTFIRSTWAIT~TRUE; COMMENT *** IS THIS A KLUDGE; 33947000
|
|
33948000
|
|
END; %%%MCS000010033949000
|
|
33950000
|
|
MYSTACK~STACK[MYSNR ,*]; 33951000
|
|
MYSTACK[COREPLACE]~IRCORE; 33952000
|
|
MYSTACK[PROCTIMEPLACE]~IRPROCTIME; 33953000
|
|
MYSTACK[IOTIMEPLACE]~IRIOTIME; 33954000
|
|
MYWORDSTACK[FIRSTPLACE]~IRTOSCW; 33954100
|
|
MYWORDSTACK[FIRSTMSCWPLACE]~IRMSCW1; 33955000
|
|
MYWORDSTACK[FIRSTRCWPLACE]~IRRCW1; 33956000
|
|
MYWORDSTACK[SECNDMSCWPLACE]~IRMSCW2&MARKSTACKWD(*,*,*,MYSNR 33957000
|
|
,*,*,*,*); 33958000
|
|
MYWORDSTACK[RETURNCONTROLWORDPLACE]~RUNRETURNCONTROLWORD; 33959000
|
|
LASTNOTAVAILABLEINVECTOR~(FIRSTAVAILABLEINVECTOR~FIRSTONE 33959020
|
|
(IRSTACKS))-1; 33959040
|
|
FORK(DIRECTORYCOMPLEMENT, SYSTEMDIRECTORY); 33959060
|
|
HOLD; 33959200
|
|
END HOLDINITIALISE; 33960000
|
|
SAVE 33960100
|
|
INTEGER PROCEDURE GETINDEPENDENTRUNNERSTACK(STAKADRES); 33961000
|
|
REAL STAKADRES 33962000
|
|
; 33963000
|
|
BEGIN 33964000
|
|
INTEGER NEWSTACK 33965000
|
|
; 33967000
|
|
INTEGER GIR ; % ***FOR MONITOR ONLY 33970000
|
|
MONITOR JACKMONITOR(GIR); 33971000
|
|
STAKADRES~GETSPACE ( INDEPENDENTRUNNERCORE 33973000
|
|
, 0 33974000
|
|
, 0&SPACETYPE(1,1,1,0) 33975000
|
|
, 0 33976000
|
|
) 33977000
|
|
; 33978000
|
|
GIR~STAKADRES; %*** FOR MONITOR ONLY 33979000
|
|
M[STAKADRES-LINKSIZE].INUSEID~NEWSTACK~ 33980000
|
|
GETINDEPENDENTRUNNERSTACK ~ 33981000
|
|
VECTORINSERT ( GETIRS 33982000
|
|
, DUMMYAREA & DATADESCRIPTOR 33983000
|
|
(*,1,0,0,0,0,0,0 33984000
|
|
,INDEPENDENTRUNNERCORE 33985000
|
|
,STAKADRES 33986000
|
|
) 33987000
|
|
) ; 33988000
|
|
M[STAKADRES-LINKSIZE+1].ADDRMOM ~ STACKVECTOR.ADDRESSF 33989000
|
|
+ NEWSTACK; 33990000
|
|
INITIALIZETOZERO(STAKADRES,INDEPENDENTRUNNERCORE); 33991000
|
|
LOADFIXEDIRSTACK(NEWSTACK); 33992000
|
|
UNLOCK(READYQ); 33993000
|
|
UNLOCK(VECTORLOK[1]); 33993100
|
|
END GETINDEPENDENTRUNNERSTACK; 33994000
|
|
33995000
|
|
SAVE PROCEDURE INDEPENDENTRUNNER(INDEX,PAR); 33996000
|
|
VALUE INDEX,PAR; 33997000
|
|
REAL INDEX; 33998000
|
|
WORD PAR; 33999000
|
|
BEGIN 34000000
|
|
INTEGER STACKNO 34001000
|
|
; 34002000
|
|
WORD ARRAY IRWORDSTACK [*]; 34002020
|
|
ARRAY IRSTACK=IRWORDSTACK[*] ; 34002040
|
|
BOOLEAN NEWSTACK 34002100
|
|
; 34002200
|
|
DEFINE MYSNR = SNR # 34002300
|
|
; 34002400
|
|
INTEGER IR; % ***FOR MONITOR ONLY 34003000
|
|
MONITOR JACKMONITOR(IR); 34004000
|
|
IR~INDEX; %*** FOR MONITOR ONLY 34005000
|
|
IR~PAR; %*** FOR MONITOR ONLY 34006000
|
|
BUZZCONTROL(INDEPENDENTRUNNERLOK); 34007000
|
|
IF INDEX=TERMINATEINDICATOR AND STACK[SNR,PROCESSNATUREPLACE] 34007200
|
|
.PROCESSHISTORYF =TERMINATEIR 34007400
|
|
THEN BEGIN %%%MCS000050034007600
|
|
UNLOCK(INDEPENDENTRUNNERLOK); 34007620
|
|
STACKINUSE[INDEX]~0 ; 34007700
|
|
IR~STACKINUSE[TERMINATEINDICATOR]; %*** FOR MONITOR ONLY 34007710
|
|
GO FINI; 34007800
|
|
END; %%%MCS000050034007900
|
|
BUZZCONTROL(IRPARAMETERLOK[INDEX]); 34007910
|
|
IF(NEWSTACK~(INDEX<ONEONLYINDEX OR((STACKNO~STACKINUSE[INDEX]) 34008000
|
|
=0))) 34009000
|
|
34010000
|
|
THEN 34011000
|
|
BEGIN %%%MCS000100034012000
|
|
COMMENT WE HAVE TO GET A NEW STACK; 34013000
|
|
UNLOCK(IRPARAMETERLOK[INDEX]); 34013100
|
|
IF INDEX=TERMINATEINDICATOR 34014000
|
|
THEN BEGIN %%%MCS000080034015000
|
|
STACKNO ~ TERMINATESTACK; 34015200
|
|
GO TO FIXEDSTACKS; 34015400
|
|
END %%%MCS000080034015600
|
|
ELSE 34016000
|
|
IF STACKNO~FIRSTONE(IRSTACKS)=0 34017000
|
|
THEN 34018000
|
|
34019000
|
|
COMMENT WE HAVE TO BUILD A NEW STACK; 34020000
|
|
BEGIN %%%MCS000200034021000
|
|
STACKNO~GETINDEPENDENTRUNNERSTACK(STACKNO);34022000
|
|
34023000
|
|
34024000
|
|
34025000
|
|
END %%%MCS000200034026000
|
|
ELSE 34027000
|
|
BEGIN %%%MCS000300034028000
|
|
IRSTACKS~RESET(IRSTACKS,STACKNO~STACKNO-1); 34029000
|
|
FIXEDSTACKS: REPLACE POINTER(STACK 34029200
|
|
[STACKNO,RETURNCONTROLWORDPLACE+1] 34029400
|
|
) BY 0 FOR INDEPENDENTRUNNERCORE 34029600
|
|
- RETURNCONTROLWORDPLACE -1 34029800
|
|
OVERWRITE; 34030000
|
|
END ; %%%MCS000300034030200
|
|
IRSTACK ~ STACKVECTOR[STACKNO]; 34031000
|
|
IRWORDSTACK[ FIRSTPLACE]~IRTOSCW; 34031200
|
|
IRWORDSTACK [IRPARAMETERPLACE]~PAR; 34031500
|
|
IRWORDSTACK [IRPCWPLACE]~0&NORMALIRW(,,IRPCWSTARTPLACE+INDEX); 34032000
|
|
PUTINJOBIDANDTIME(IRWORDSTACK ,STACKNO); 34032500
|
|
IRWORDSTACK [SECNDMSCWPLACE]~IRMSCW2&MARKSTACKWD(*,*,*,STACKNO,34033000
|
|
*,*,*,*); 34033500
|
|
IRWORDSTACK [RETURNCONTROLWORDPLACE]~ RUNRETURNCONTROLWORD; 34034000
|
|
IRSTACK [PRIORITYPLACE]~ IRPRIORITIES[INDEX]; 34034500
|
|
IRSTACK [PROCESSNATUREPLACE]~*&NATUREOFPROCESS(IF INDEX = 34035000
|
|
TERMINATEINDICATOR THEN TERMINATEIR ELSE INDEPENDENT, 34035500
|
|
INDEX);34035800
|
|
IRSTACK [STACKSIZEPLACE]~INDEPENDENTRUNNERCORE; 34036000
|
|
COMMENT *** WE SHOULD USE DIFFERENT STACK SIZES FOR DIFFERENT IR S; 34036200
|
|
END ELSE UNLOCK(IRPARAMETERLOK[INDEX]); %%%MCS000100034036500
|
|
IF INDEX } ONEONLYINDEX THEN 34037000
|
|
BEGIN %%%MCS000400034038000
|
|
BUZZCONTROL(IRPARAMETERLOK[INDEX]); 34039000
|
|
STACK[STACKNO,IRPARAMETERPLACE]~*+1; 34040000
|
|
UNLOCK(IRPARAMETERLOK[INDEX ]); 34041000
|
|
34042000
|
|
END ; %%%MCS000400034043000
|
|
STACKINUSE[INDEX ]~STACKNO; 34043100
|
|
IF INDEX = TERMINATEINDICATOR THEN 34043200
|
|
BEGIN %%%MCS000500034043300
|
|
BUZZCONTROL(IRPARAMETERLOK[TERMINATEINDICATOR]); 34043400
|
|
INSERTINQ(TERMINATEQ,DUMMYREF,MYSNR ); 34043500
|
|
UNLOCK(IRPARAMETERLOK[TERMINATEINDICATOR]); 34043600
|
|
END ; %%%MCS000500034043700
|
|
UNLOCK(INDEPENDENTRUNNERLOK); 34044000
|
|
BUZZCONTROL(READYQ); 34045200
|
|
IF NEWSTACK THEN 34046000
|
|
INSERTINQUEUE(OTHERREDY,STACKNO); 34047000
|
|
FINI: 34047200
|
|
UNLOCK(READYQ); 34048000
|
|
EXIT; 34048100
|
|
END INDEPENDENTRUNNER; 34049000
|
|
SAVE 34050000
|
|
PROCEDURE RUN (PARAMETER,PROCEEDURE); 34051000
|
|
VALUE PARAMETER 34052000
|
|
; 34053000
|
|
WORD PARAMETER 34054000
|
|
; 34055000
|
|
PROCEDURE PROCEEDURE 34056000
|
|
; 34057000
|
|
COMMENT INDEPENDENT RUNNER STACKS, INITIATE STACKS AND JOB (D2) STACKS 34058000
|
|
ALL EXIT TO RUN AFTER A MVST TAKES THEM OUT OF THE READYQ FOR 34058020
|
|
THE FIRST TIME 34058040
|
|
RUN DETERMINES (FROM "NATURE OF PROCESS" IN THE PROCESS 34058060
|
|
STACK) WHETHER INITIATE, AN INDEPENDENT RUNNER OR A NORMAL 34058080
|
|
STATE PROGRAM (WHICH MAY BE A TYPED OR UNTYPED PROCEDURE 34058100
|
|
REQUIRING OR NOT REQUIRING PARAMETERS) IS TO BE ENTERED 34058120
|
|
UPON RETURN TO RUN (AT EXIT OR RETURN FROM THE CALLED 34058140
|
|
PROCEDURE), RUN TAKES APPROPRIATE ACTION AS REQUIRED BY 34058160
|
|
COMPILERS, DIFFERENT INDEPENDENT RUNNERS ETC. AND THEN CALLS 34058180
|
|
TERMINATE 34058200
|
|
; 34059000
|
|
BEGIN 34059200
|
|
REAL PROCESSNATUR 34059300
|
|
, RESULT 34059400
|
|
, TEMPORARY = RESULT 34059500
|
|
, MYSNR 34059600
|
|
; 34060000
|
|
DEFINE COMPILER = PROCESSNATUR 34060200
|
|
.PROCESSHISTORYF!INDEPENDENT AND 34060220
|
|
(TEMPORARY~PROCESSNATUR.PROCESSCLASSF)34060240
|
|
}FIRSTCOMPILEROPTION AND 34060260
|
|
TEMPORARY{LASTCOMPILEROPTION# 34060400
|
|
, IFINDEPENDENTRUNNER 34060600
|
|
= IF (PROCESSNATUR~MYSTACK[PROCESSNATUREPLACE]) 34060800
|
|
.PROCESSHISTORYF=INDEPENDENT 34060802
|
|
OR PROCESSNATUR.PROCESSHISTORYF=TERMINATEIR34060805
|
|
OR PROCESSNATUR.INITIATESTACKF=1# 34060810
|
|
, SYNTAXTOG = PROCESSNATUR.PROCESSCLASSF= 34060820
|
|
COMPILENSYNTAXJOB# 34060830
|
|
; 34061000
|
|
ARRAY MYSTACK[*] 34061200
|
|
; 34062000
|
|
REAL PROCEDURE REALPROCEEDURE=PROCEEDURE;NULL; 34062010
|
|
INTEGER GALLOP ; % *** FOR MONITOR ONLY 34064740
|
|
MONITOR JACKMONITOR(GALLOP); 34064760
|
|
GALLOP~TRACE(0); 34064800
|
|
MYSTACK~STACKVECTOR[MYSNR~SNR]; 34065000
|
|
LOSR~MYSTACK[STACKSIZEPLACE]-STACKOFLOWSIZE; 34065200
|
|
IFINDEPENDENTRUNNER 34066000
|
|
THEN 34066020
|
|
BEGIN %%%MCS000100034066040
|
|
PROCEEDURE(PARAMETER); 34066200
|
|
END %%%MCS000100034066800
|
|
ELSE 34066900
|
|
BEGIN %%%MCS000150034067000
|
|
BOJMESSER(MYSNR); 34067200
|
|
IF COMPILER 34067400
|
|
THEN 34067600
|
|
BEGIN %%%MCS000200034067800
|
|
RESULT~REALPROCEEDURE(SYNTAXTOG);34068000
|
|
END %%%MCS000200034070600
|
|
ELSE 34070800
|
|
BEGIN %%%MCS000300034071000
|
|
COMMENT WE HAVE A PROGRAM WITH NO PARAMETERS; 34071200
|
|
PROCEEDURE; 34071400
|
|
END; %%%MCS000300034072800
|
|
EOJMESSER(MYSNR); 34073000
|
|
END; %%%MCS000150034074000
|
|
COMMENT *** 5 MARCH 1969, THE ABOVE CODE WILL HAVE TO BE EXPANDED TO 34074010
|
|
CATER FOR MORE EXTENSIVE TREATMENT OF COMPILERS AND PROGRAMS AS34074020
|
|
(TYPED OR UNTYPED) PROCEDURES. ALSO THE FOLLOWING TERMINATE 34074040
|
|
CODE MAY REQUIRE ALTERING 34074060
|
|
; 34074080
|
|
FORK(TERMINATE,0); 34075000
|
|
IF SIMULATING THEN 34075010
|
|
GALLOP~GALLOP; %*** FOR MONITOR ONLY 34075100
|
|
TRACE(GALLOP); 34075200
|
|
HOLD; 34076000
|
|
END RUN ; 34077000
|
|
SAVE PROCEDURE IRTEST(IND); INTEGER IND; 34077200
|
|
BEGIN 34078000
|
|
MONITOR JACKMONITOR(IND); 34079000
|
|
REAL MYSNR; 34080000
|
|
REAL OLDTIME; 34080100
|
|
MONITOR JACKMONITOR(MYSNR); 34081000
|
|
IND~IND; %*** FOR MONITOR ONLY 34082000
|
|
MYSNR~SNR; %*** FOR MONITOR ONLY 34083000
|
|
DO BEGIN 34083100
|
|
IF(OLDTIME~OLDTIME+1) MOD 10 = 0 THEN 34083200
|
|
FORK(STATUS,0); 34083300
|
|
WAIT(TIMERINTERRUPTEVENT); 34083400
|
|
END UNTIL FALSE; 34083500
|
|
HOLD; 34084000
|
|
END IRTEST; 34085000
|
|
SAVE 34085300
|
|
34085310
|
|
PROCEDURE LOADFIXEDIRSTACK(STACKNO); 34086000
|
|
VALUE STACKNO ; 34087000
|
|
INTEGER STACKNO 34088000
|
|
; 34089000
|
|
COMMENT PUTS THE FIRST (TOSCW),SECOND (SELF IDENTIFYING MSCW) WORDS 34090000
|
|
IN AN INDEPENDENT RUNNER STACK.PUTS THE RUN RETURN CONTROL 34091000
|
|
WORD AND THE PROCESS INFORMATION WHICH IS FIXED FOR ALL 34092000
|
|
INDEPENDENT RUNNERS I.E. CORE ESTIMATE,PROCESSOR TIME 34093000
|
|
ESTIMATE,I/O TIME ESTIMATE.PUTS IN SOME OTHER CONTROL WORDS 34094000
|
|
; 34095000
|
|
BEGIN 34096000
|
|
INTEGER LFI = STACKNO % *** FOR MONITOR ONLY 34097000
|
|
; 34098000
|
|
MONITOR JACKMONITOR(LFI) 34099000
|
|
; 34100000
|
|
ARRAY MYSTACK[*]; 34101000
|
|
WORD ARRAY MYWORDSTACK =MYSTACK[*] 34102000
|
|
; 34103000
|
|
LFI~LFI; % *** FOR MONITOR ONLY 34104000
|
|
MYSTACK~STACK[STACKNO,*]; 34105000
|
|
MYWORDSTACK[FIRSTPLACE]~IRTOSCW; 34106000
|
|
MYWORDSTACK[LINKPLACE]~0&MARKSTACKWD(,*,1,STACKNO,*,*,*,*); 34107000
|
|
34110100
|
|
MYWORDSTACK[FIRSTMSCWPLACE]~IRMSCW1; 34111000
|
|
MYWORDSTACK[FIRSTRCWPLACE]~IRRCW1; 34112000
|
|
EXIT; 34115100
|
|
END LOADFIXEDIRSTACK; 34116000
|
|
PROCEDURE CONTROLCARD (PARAMETER); 38000000
|
|
WORD PARAMETER; 38001000
|
|
BEGIN COMMENT CONTROL CARD PROCESSES THE EBCDIC RECORD AS 38002000
|
|
DESCRIBED BY THE AREA DESCRIPTOR OF THE IOCB AND38003000
|
|
READS ADDITIONAL RECORDS UNTIL A "LABEL", "DATA"38004000
|
|
OR "END" IS ENCOUNTERED. WHILE A CONTROL DECK 38005000
|
|
IS BEING PROCESSED, THE UNIT OF THE IOCB IS 38006000
|
|
ASSIGNED TO THE CONTROL CARD PROCEDURE. THE 38007000
|
|
FINAL OUTPUT OF CONTROLCARD IS ONE OR MORE SHEET38008000
|
|
ENTRIES OR AN ASSIGNMENT OF A LABEL TO A UNIT. 38009000
|
|
;38010000
|
|
REFERENCE IOCB =PARAMETER; 38011000
|
|
INTEGER UNITNO = PARAMETER; 38012000
|
|
VALUE ARRAY RESERVED ~ (0,0,0,0,0,0,0,0,0,0,0,0,0,0, 8"UNKNOWNID", 0 38013000
|
|
, 8"# " , 114800 % CLASS 148 38014000
|
|
, 8". " , 114600 % CLASS 146 38015000
|
|
, 8"~ " , 114100 % CLASS 141 38016000
|
|
, 8"- " , 114500 % CLASS 145 38017000
|
|
, 8"; " , 114300 % CLASS 143 38018000
|
|
, 8"/ " , 114700 % CLASS 147 38019000
|
|
, 8", " , 114200 % CLASS 142 38020000
|
|
,40"7F4040404040", 114400 % QUOTE MARK CLASS 144 38021000
|
|
,40"6F4040404040", 114100 % QUEST MARK CLASS 141 38022000
|
|
, 8"ALGOL " , 505202 % CLASS 52 CASE 2 38023000
|
|
, 8"ALPHA " , 513600 % CLASS 136 38024000
|
|
, 8"BACKUP" , 608900 % CLASS 89 38025000
|
|
, 8"CC " , 214000 % CLASS 140 38026000
|
|
, 8"CHANGE" , 600701 % CLASS 7 CASE 1 38027000
|
|
, 8"COBOL " , 506502 % CLASS 65 CASE 2 38028000
|
|
, 8"COMMON" , 603902 % CLASS 39 CASE 2 38029000
|
|
, 8"COMPILE" , 700301 % CLASS 3 CASE 1 38030000
|
|
, 8"CORE " , 404002 % CLASS 40 CASE 2 38031000
|
|
, 8"DATA " , 400801 % CLASS 8 CASE 1 38032000
|
|
, 8"DATAB " , 501401 % CLASS 14 CASE 1 38033000
|
|
, 8"DISK " , 407900 % CLASS 79 38034000
|
|
, 8"DISPLAY" , 708300 % CLASS 83 38035000
|
|
, 8"DUMP " , 400601 % CLASS 6 CASE 1 38036000
|
|
, 8"END " , 302401 % CLASS 24 CASE 1 38037000
|
|
, 8"ESPOL " , 505402 % CLASS 54 CASE 2 38038000
|
|
, 8"EXECUTE" , 700201 % CLASS 2 CASE 1 38039000
|
|
, 8"EXTERNAL" , 806600 % CLASS 66 38040000
|
|
, 8"FILE " , 403502 % CLASS 35 CASE 2 38041000
|
|
, 8"FORM " , 413700 % CLASS 137 38042000
|
|
, 8"FORTRAN" , 705302 % CLASS 53 CASE 2 38043000
|
|
, 8"FREE " , 401201 % CLASS 12 CASE 1 38044000
|
|
, 8"GO ", 206900 % CLASS 69 38045000
|
|
, 8"IO " , 203702 % CLASS 37 CASE 2 38046000
|
|
, 8"LIBRARY" , 706700 % CLASS 67 38047000
|
|
, 8"LOAD " , 400501 % CLASS 5 CASE 1 38048000
|
|
, 8"PAPER " , 508600 % CLASS 86 38049000
|
|
, 8"PRINT " , 508700 % CLASS 87 38050000
|
|
, 8"PRIORITY" , 803802 % CLASS 38 CASE 2 38051000
|
|
, 8"PROCESS" , 703602 % CLASS 36 CASE 2 38052000
|
|
, 8"PROTECT" , 711200 % CLASS 112 38053000
|
|
, 8"PUBLIC" , 601301 % CLASS 13 CASE 1 38054000
|
|
, 8"PUNCH " , 508500 % CLASS 85 38055000
|
|
, 8"RANDOM" , 612500 % CLASS 125 38056000
|
|
, 8"READER" , 608800 % CLASS 88 38057000
|
|
, 8"RELEASE" , 701101 % CLASS 11 CASE 1 38058000
|
|
, 8"REMOTE" , 608400 % CLASS 84 38059000
|
|
, 8"REMOVE" , 600401 % CLASS 4 CASE 1 38060000
|
|
, 8"RUN " , 300101 % CLASS 1 CASE 1 38061000
|
|
, 8"SAVE " , 411100 % CLASS 111 38062000
|
|
, 8"SERIAL" , 612300 % CLASS 123 38063000
|
|
, 8"SPECIAL" , 710000 % CLASS 100 38064000
|
|
, 8"STACK " , 504102 % CLASS 41 CASE 2 38065000
|
|
, 8"SYNTAX" , 606800 % CLASS 68 38066000
|
|
, 8"TAPE7 " , 508100 % CLASS 81 38067000
|
|
, 8"TAPE9 " , 508200 % CLASS 82 38068000
|
|
, 8"TAPE " , 408000 % CLASS 80 38069000
|
|
, 8"UNIT " , 413800 % CLASS 138 38070000
|
|
, 8"UNLABELED" , 913900 % CLASS 139 38071000
|
|
, 8"UPDATE" , 612400 % CLASS 124 38072000
|
|
, 8"USER " , 401001 % CLASS 10 CASE 1 38073000
|
|
, 8"USE " , 300901 % CLASS 9 CASE 1 38074000
|
|
); 38075000
|
|
DEFINE 38076000
|
|
RUNCLS = 1#, 38077000
|
|
EXECUTECLS = 2#, 38078000
|
|
COMPILECLS = 3#, 38079000
|
|
REMOVECLS = 4#, 38080000
|
|
LOADCLS = 5#, 38081000
|
|
DUMPCLS = 6#, 38082000
|
|
CHANGECLS = 7#, 38083000
|
|
DATACLS = 8#, 38084000
|
|
USECLS = 9#, 38085000
|
|
USERCLS = 10#, 38086000
|
|
RELEASECLS = 11#, 38087000
|
|
FREECLS = 12#, 38088000
|
|
PUBLICCLS = 13#, 38089000
|
|
DATABCLS =14#, 38090000
|
|
ENDCLS = 24#, 38091000
|
|
FILECLS = 35#, 38092000
|
|
PROCESSCLS = 36#, 38093000
|
|
IOCLS = 37#, 38094000
|
|
PRIORITYCLS = 38#, 38095000
|
|
COMMONCLS = 39#, 38096000
|
|
CORECLS = 40#, 38097000
|
|
STACKCLS = 41#, 38098000
|
|
ALGOLCLS = 52#, 38099000
|
|
FORTRANCLS = 53#, 38100000
|
|
ESPOLCLS = 54#, 38101000
|
|
COBOLCLS = 65#, 38102000
|
|
EXTERNALCLS = 66#, 38103000
|
|
LIBRARYCLS = 67#, 38104000
|
|
SYNTAXCLS = 68#, 38105000
|
|
GOCLS = 69#, 38106000
|
|
DISKCLS = 79#, 38107000
|
|
TAPECLS = 80#, 38108000
|
|
TAPE7CLS = 81#, 38109000
|
|
TAPE9CLS = 82#, 38110000
|
|
DISPLAYCLS = 83#, 38111000
|
|
REMOTECLS = 84#, 38112000
|
|
PUNCHCLS = 85#, 38113000
|
|
PAPERCLS = 86#, 38114000
|
|
PRINTCLS = 87#, 38115000
|
|
READERCLS = 88#, 38116000
|
|
BACKUPCLS = 89#, 38117000
|
|
SPECIALCLS = 100#, 38118000
|
|
SAVECLS = 111#, 38119000
|
|
PROTECTCLS = 112#, 38120000
|
|
SERIALCLS = 123#, 38121000
|
|
UPDATECLS = 124#, 38122000
|
|
RANDOMCLS = 125#, 38123000
|
|
ALPHACLS = 1346, 38124000
|
|
FORMCLS = 137#, 38125000
|
|
UNITCLS = 138#, 38126000
|
|
UNLABELEDCLS = 139#, 38127000
|
|
CCCLS = 140#, 38128000
|
|
QUESTIONCLS = 141#,% ~ 38129000
|
|
COMMACLS = 142#,% , 38130000
|
|
SEMICOLONCLS = 143#,% ; 38131000
|
|
QUOTECLS = 144#,% " 38132000
|
|
HYPHENCLS = 145#,% - 38133000
|
|
PERIODCLS = 146#,% . 38134000
|
|
SLASHCLS = 147#,% / 38135000
|
|
CROSSHATCHCLS = 148#,% # 38136000
|
|
UNKNOWNIDCLS = 0#; 38137000
|
|
INTEGER MYCOMMON; %%%%% 38138000
|
|
ARRAY SEGZERO [SIZE(SHEETQ)]; 38139000
|
|
COMMENT SEGMENT ZERO WILL BE READ INTO THIS ARRAY AND 38140000
|
|
THE SHEET WILL BE BUILT IN THE ARRAY AND A REF- 38141000
|
|
ERENCE TO THE ARRAY WILL BE ENTERED IN THE 38142000
|
|
SHEET.; 38143000
|
|
ARRAY SEGZEROSKELETON [SIZE(SHEETQ)]; 38144000
|
|
ARRAY SEGZEROTEMP [*] ; %%%%%% 38145000
|
|
COMMENT PRESERVE FOR LOOPING; 38146000
|
|
WORD SEGZEROWORD = SEGZEROSKELETON; 38147000
|
|
WORD ARRAY HEADERW [*]; COMMENT THE DISK HEADER RETURNED BY 38148000
|
|
DIRECTORYSEARCH BASED ON NAME POINTER;38149000
|
|
ARRAY SOURCEAREA [15], 38150000
|
|
COMMENT THE AREA DESCRIPTOR OF THE IOCB.; 38151000
|
|
ACCUMULATOR [13]; 38152000
|
|
COMMENT THE FIRST 14 WORDS OF THE RESERVED ARRAY. USED 38153000
|
|
AS A TEMPORARY HOLDING AREA FOR CONTROL CARD 38154000
|
|
SYNTACTICAL UNITS AND THE RESERVED SEARCH 38155000
|
|
ARGUMENT (AND STOPPER).; 38156000
|
|
REAL RESULT COMMENT AN I/O RESULT DESCRIPTOR; 38157000
|
|
, FILEID COMMENT WAITIO CALLS IT "USER"; 38158000
|
|
,ACTION COMMENT WAITIO CALLS IT " IOERRORMASK"; 38159000
|
|
,CONTROLWORD 38160000
|
|
; 38161000
|
|
INTEGER COUNT, COMMENT A UTILITY CHARACTER COUNTER.; 38162000
|
|
LIMIT, COMMENT THE CHARACTERS OF A RECORD THAT ARE38163000
|
|
TO BE SCANNED.; 38164000
|
|
WORDDIVCHARSIZE, COMMENT THE NUMBER OF CHARACTERS IN 38165000
|
|
A WORD.; 38166000
|
|
T, COMMENT TEMPORARY; 38167000
|
|
LABELTYPE, 38168000
|
|
ORIGINALLIMIT, COMMENT THE NUMBER OF CHARACTERS IN A 38169000
|
|
RECORD.; 38170000
|
|
RESERVECASE, 38171000
|
|
CLASS, 38172000
|
|
WORDCOUNT; COMMENT THE NUMBER OF WORDS REQUIRED TO 38173000
|
|
CONTAIN AN IDENTIFIER.; 38174000
|
|
WORD WORDMON; %%%%%%%%%%%%% 38175000
|
|
REFERENCE SOURCEREFERENCE = SOURCEAREA, 38176000
|
|
SUCCESSORSHEET, PREDECESSORSHEET; 38177000
|
|
COMMENT REFERENCES TO THE SHEET ENTRIES FOR THE 38178000
|
|
PROCESSES THAT ARE DIRECTLY RELATED TO THE 38179000
|
|
PROCESS REFERENCED BY SEGZERO.; 38180000
|
|
ARRAY SUCCESSOR = SUCCESSORSHEET [*], 38181000
|
|
PREDECESSOR = PREDECESSORSHEET [*]; 38182000
|
|
POINTER ACCUMPOINTER, COMMENT A POINTER TO THE ACCUMULATOR.; 38183000
|
|
SOURCE, COMMENT THE SOURCE AREA - MAY BE UPDATED.; 38184000
|
|
ORIGINALSOURCE, COMMENT SOURCE-MAY NOT BE UPDATED; 38185000
|
|
DESTINATION, COMMENT - DITTO FOR ACCUMULATOR.; 38186000
|
|
TSOURCE, COMMENT - USUALLY POINTS AT BEGINNING OF 38187000
|
|
LAST ENTITY SCANNED.; 38188000
|
|
NAMEPOINTER; COMMENT POINTS TO COMPLETE NAME 38189000
|
|
CHARACTER STRING.; 38190000
|
|
BOOLEAN SPECIAL, COMMENT TRUE WHILE A SPECIAL CHARACTER IS38191000
|
|
TO BE SCANNED.; 38192000
|
|
ALFA, COMMENT TRUE IF IDENTIFIER TYPE STUFF IS 38193000
|
|
BEING SCANNED.; 38194000
|
|
ENDOFRECORD, COMMENT TRUE IF LIMIT HAS BEEN REACHED 38195000
|
|
OR "." HAS BEEN SEEN.; 38196000
|
|
CONVERT, COMMENT WHEN TRUE THE SCANNER ATTEMPTS TO 38197000
|
|
LEAVE A CONVERTED INTEGER IN ACCUMULATOR[0].; 38198000
|
|
COMPILER, COMMENT TRUE WHEN "COMPILE" HAS BEE SEEN;38199000
|
|
EXECUTESHEET, COMMENT TRUE WHEN EXECUTE SHEET ENTRY 38200000
|
|
(IMPLICIT OR EXPLICIT) IS TO BE 38201000
|
|
ENTERED IN THE SHEET QUEUE.; 38202000
|
|
SHEETENTERED; COMMENT TRUE WHEN SEGZERO HAS BEEN 38203000
|
|
ENTERED IN THE SHEETQ.; 38204000
|
|
LABEL CCERROR, 38205000
|
|
NATURALDEATH, 38206000
|
|
NEWLIFE, 38207000
|
|
EXECUTE, 38208000
|
|
DATA, 38209000
|
|
SUICIDE; 38210000
|
|
DEFINE CONTROLCARDIO = 38211000
|
|
BEGIN 38212000
|
|
SOURCEAREA [0] ~ CONTROLWORD; 38213000
|
|
RESULT ~ WAITIO (SOURCEAREA, FILEID, ACTION); 38214000
|
|
LIMIT ~ORIGINALLIMIT; 38215000
|
|
SOURCE ~ ORIGINALSOURCE; 38216000
|
|
CONTROLCARDCHECK; 38217000
|
|
END #, 38218000
|
|
CONTROLCARDCHECK = 38219000
|
|
IF BOOLEAN (RESULT.RDNOTREADY) THEN GO SUICIDE; %STATUS VECTOR KLUDGE 38220000
|
|
COMMENT - WAIT ON MPX 38220100
|
|
IF NOT BOOLEAN (RESULT.RDCNTRLCARD) 38221000
|
|
THEN CONTROLCARDERROR (2); 38222000
|
|
#, 38223000
|
|
CONVERTEDINTEGER = 999#, 38224000
|
|
CHARSIZE = 8#, 38225000
|
|
QUOTE = 8 """#, 38226000
|
|
BLANK = 8 " "#, 38227000
|
|
A =8"A"#, 38228000
|
|
ZERO = 8"0"#, 38229000
|
|
DEBLANK (P) = 38230000
|
|
BEGIN 38231000
|
|
SCAN P:P FOR T:LIMIT WHILE = BLANK; 38232000
|
|
ENDOFRECORD ~ LIMIT ~ T =0; 38233000
|
|
END #, 38234000
|
|
BLANKIT (PTR, CHARS) = 38235000
|
|
REPLACE PTR BY BLANK FOR CHARS#, 38236000
|
|
CONTROLCARDERROR (WHICH) = 38237000
|
|
BEGIN 38238000
|
|
GO TO CCERROR; 38239000
|
|
END #, 38240000
|
|
LEQACTION = 0#, 38241000
|
|
CARDACTION =1#, 38242000
|
|
CODEACTION =2#, 38243000
|
|
NATUREOFPROCESS(A, V) = 38244000
|
|
A[PROCESSNATUREPLACE].PROCESSCLASSF ~ V #, 38245000
|
|
CURRENTTIME = TIMEOFDAY#, %%%%%%%%% 38246000
|
|
FIXEDFPBSIZE = 4#, 38247000
|
|
COMPARE (SOURCE, DESTINATION, COUNT) = 38248000
|
|
IF SOURCE = DESTINATION FOR COUNT 38249000
|
|
THEN TRUE ELSE FALSE#, 38250000
|
|
MOVE (SOURCE , DESTINATION , CONDITION) = 38251000
|
|
REPLACE DESTINATION BY SOURCE CONDITION #, 38252000
|
|
MOVEUPDATE (SOURCE , DESTINATION , COND) = 38253000
|
|
REPLACE DESTINATION:DESTINATION BY 38254000
|
|
SOURCE:SOURCE COND #, 38255000
|
|
RESERVEINFOWRD = 38256000
|
|
RESERVED [RESERVEI+((COUNT+WORDDIVCHARSIZE) DIV 38257000
|
|
WORDDIVCHARSIZE - 38258000
|
|
(IF COUNT MOD WORDDIVCHARSIZE=0 THEN 1 ELSE 0))]#38259000
|
|
, 38260000
|
|
RANGE (LOW, HIGH) = 38261000
|
|
(CLASS } LOW AND CLASS { HIGH)#, 38262000
|
|
COUNTDIV = 100000#, 38263000
|
|
CLASSDIV = 100#, 38264000
|
|
RESERVECOUNT = RESERVEINFOWRD DIV COUNTDIV#; 38265000
|
|
FIELD VECTOR = 7:3, 38266000
|
|
WHICHUNIT = (UNITNO MOD 32+1):1; 38267000
|
|
MONITOR DONMONITOR ( 38268000
|
|
SHEETENTERED, 38269000
|
|
RESULT, 38270000
|
|
CLASS); 38271000
|
|
SAVE INTEGER PROCEDURE SCANNER; 38272000
|
|
BEGIN 38273000
|
|
INTEGER RESERVEI 38274000
|
|
; 38275000
|
|
REAL DELIMIT 38276000
|
|
, MASK ~3"7777777777777777" 38277000
|
|
, RESERVEINFO 38278000
|
|
; 38279000
|
|
LABEL BACK 38280000
|
|
, AWAY 38281000
|
|
; 38282000
|
|
BOOLEAN FIRSTQUOTE 38283000
|
|
, FOUND 38284000
|
|
; 38285000
|
|
FIELD FIRSTCHAR = 47:CHARSIZE; 38286000
|
|
BACK: DESTINATION ~ ACCUMPOINTER; 38287000
|
|
MOVE (BLANK, DESTINATION, FOR WORDDIVCHARSIZE); 38288000
|
|
TSOURCE ~ SOURCE; 38289000
|
|
IF SPECIAL ~ SOURCE < A FOR 1 38290000
|
|
THEN MOVEUPDATE (SOURCE, DESTINATION, FOR 1) 38291000
|
|
ELSE IF ALFA ~ SOURCE < ZERO FOR 1 OR FIRSTQUOTE 38292000
|
|
THEN MOVEUPDATE (SOURCE, DESTINATION, 38293000
|
|
FOR COUNT:LIMIT UNTIL { QUOTE) 38294000
|
|
ELSE IF CONVERT 38295000
|
|
THEN BEGIN 38296000
|
|
SCAN SOURCE FOR COUNT:LIMIT UNTIL < QUOTE; 38297000
|
|
COUNT ~ LIMIT - COUNT; 38298000
|
|
LIMIT ~ LIMIT - COUNT; 38299000
|
|
ACCUMULATOR [0] ~ INTEGER (SOURCE, COUNT); 38300000
|
|
SOURCE ~ SOURCE + COUNT; 38301000
|
|
DEBLANK (SOURCE); 38302000
|
|
RETURN (CONVERTEDINTEGER); 38303000
|
|
END 38304000
|
|
ELSE MOVEUPDATE (SOURCE, DESTINATION, 38305000
|
|
FOR COUNT:LIMIT UNTIL { QUOTE); 38306000
|
|
COUNT ~ IF SPECIAL THEN 1 ELSE LIMIT - COUNT; 38307000
|
|
LIMIT ~ LIMIT - COUNT; 38308000
|
|
IF FIRSTQUOTE 38309000
|
|
THEN BEGIN 38310000
|
|
IF SOURCE ! QUOTE FOR 1 38311000
|
|
THEN BEGIN COMMENT FINISH THE STRING; 38312000
|
|
T ~ LIMIT - COUNT; 38313000
|
|
LIMIT ~ * - T; 38314000
|
|
MOVEUPDATE (SOURCE, DESTINATION, 38315000
|
|
FOR COUNT:LIMIT UNTIL = QUOTE); 38316000
|
|
COUNT ~ LIMIT - COUNT + T; 38317000
|
|
LIMIT ~ * - COUNT - 1; 38318000
|
|
END ELSE LIMIT ~ COUNT - 1; 38319000
|
|
SOURCE ~ SOURCE +1; 38320000
|
|
RESERVEI ~ 0; 38321000
|
|
END; 38322000
|
|
IF COUNT > 17 THEN COUNT ~ 17; % USASI 38323000
|
|
WORDCOUNT ~ (COUNT + WORDDIVCHARSIZE - 1) DIV WORDDIVCHARSIZE; 38324000
|
|
IF FIRSTQUOTE THEN GO AWAY; 38325000
|
|
RESERVEI ~ MASKSEARCH (RESERVED[0], MASK, RESERVED); 38326000
|
|
IF COUNT > WORDDIVCHARSIZE 38327000
|
|
THEN WHILE RESERVEI > 0 AND NOT FOUND 38328000
|
|
DO BEGIN 38329000
|
|
FOUND ~ COMPARE (ACCUMPOINTER+WORDDIVCHARSIZE, 38330000
|
|
POINTER(RESERVED[RESERVEI+1], CHARSIZE), 38331000
|
|
COUNT - WORDDIVCHARSIZE); 38332000
|
|
FOUND ~ FOUND AND COUNT = RESERVECOUNT; 38333000
|
|
IF NOT FOUND 38334000
|
|
THEN RESERVEI ~ MASKSEARCH (ACCUMULATOR[0], 38335000
|
|
MASK, 38336000
|
|
RESERVED & DATADESCRIPTOR 38337000
|
|
(,,,1,,,,,RESERVEI-1)); 38338000
|
|
END; 38339000
|
|
AWAY: DEBLANK (SOURCE); 38340000
|
|
RESERVEINFO ~ IF RESERVEI = 0 THEN 0 38341000
|
|
ELSE RESERVEINFOWRD MOD COUNTDIV; 38342000
|
|
CLASS ~ RESERVEINFO DIV CLASSDIV; 38343000
|
|
RESERVECASE ~ RESERVEINFO MOD CLASSDIV; 38344000
|
|
IF CLASS } CCCLS THEN 38345000
|
|
BEGIN 38346000
|
|
CASE CLASS - CCCLS OF 38347000
|
|
BEGIN 38348000
|
|
CLASS ~ QUESTIONCLS; % CC 38349000
|
|
; % QUESTION MARK 38350000
|
|
GO BACK; % , 38351000
|
|
CLASS ~ QUESTIONCLS; % ; 38352000
|
|
BEGIN % " 38353000
|
|
FIRSTQUOTE ~ TRUE; 38354000
|
|
GO BACK; 38355000
|
|
END; 38356000
|
|
BEGIN % - 38357000
|
|
CONTROLCARDIO; 38358000
|
|
DEBLANK (SOURCE); 38359000
|
|
GO BACK; 38360000
|
|
END; 38361000
|
|
ENDOFRECORD ~ TRUE; % . 38362000
|
|
; % / 38363000
|
|
; % # 38364000
|
|
END SPECIAL CHARACTER CASES; 38365000
|
|
END; 38366000
|
|
SCANNER ~ CLASS; 38367000
|
|
END SCANNER; 38368000
|
|
SAVE POINTER PROCEDURE NAMES (CALLER); 38369000
|
|
VALUE CALLER; 38370000
|
|
INTEGER CALLER; 38371000
|
|
BEGIN 38372000
|
|
REFERENCE THISNAME; 38373000
|
|
POINTER ANAME, ALLNAMEPTR, P; 38374000
|
|
ARRAY ONENAME, ALLNAMES, DUMMY [*]; 38375000
|
|
FIELD CHARS = 19:20; 38376000
|
|
LAYOUT WORDS (WRDCNT = 39:20); 38377000
|
|
LAYOUT IDSANDNAMES (47:8, 39:8); 38378000
|
|
FIELD COUNTF = 47:8; 38379000
|
|
INTEGER TOTALCHARS, COMMENT THE TOTAL CHARACTERS IN A NAM;38380000
|
|
TOTALNAMES, COMMENT THE NUMBER OF NAMES IN AN 38381000
|
|
IDENTIFIER (THE THING THAT UNIQUELY 38382000
|
|
IDENTIFIES A FILE); 38383000
|
|
TOTALIDENTIFIERS; COMMENT THE TOTAL NUMBER OF 38384000
|
|
IDENTIFIERS IN A SERIES (IDENTIFIERS 38385000
|
|
SEPARATED BY COMMAS); 38386000
|
|
LABEL SERIES; 38387000
|
|
TOTALCHARS ~ WORDDIVCHARSIZE + 3; % PROVIDE FOR INFO WORD, 38388000
|
|
% TOTAL IDENTIFIERS, NAMES AND 38389000
|
|
% STOPPER 38390000
|
|
IF LOCK (NAMEQUEUE) THEN BUZZ (NAMEQUEUE); 38391000
|
|
SERIES: TOTALIDENTIFIERS ~ * + 1; 38392000
|
|
DO BEGIN 38393000
|
|
SCANNER; 38394000
|
|
ONENAME ~ ONENAME & DATADESCRIPTOR 38395000
|
|
(,1,0,,,,,, WORDCOUNT+1, GETAREA (WORDCOUNT)); 38396000
|
|
ONENAME[0].COUNTF ~ COUNT; 38397000
|
|
TOTALNAMES ~ * + 1; 38398000
|
|
TOTALCHARS ~ * + COUNT + (IF CALLER =DATACLS 38399000
|
|
THEN 18 - COUNT ELSE 1); 38400000
|
|
ANAME ~ POINTER (ONENAME, CHARSIZE)+1; 38401000
|
|
MOVE (ACCUMPOINTER, ANAME, FOR COUNT); 38402000
|
|
THISNAME ~ ALLOCATE (NAMEQUEUE); 38403000
|
|
POINTERTONAME@(THISNAME) ~ANAME - 1; 38404000
|
|
CHARCOUNT @ (THISNAME) ~ COUNT +1 & WORDS(WORDCOUNT);38405000
|
|
NAMEQUEUE ~ THISNAME; 38406000
|
|
IF NOT ENDOFRECORD THEN SCANNER; 38407000
|
|
END 38408000
|
|
UNTIL CLASS !SLASHCLS; 38409000
|
|
IF CLASS = COMMACLS THEN GO SERIES; 38410000
|
|
ALLNAMES ~ ALLNAMES & DATADESCRIPTOR (,,0,,,,,, 38411000
|
|
(WORDDIVCHARSIZE - TOTALCHARS MOD WORDDIVCHARSIZE + 38412000
|
|
TOTALCHARS) DIV WORDDIVCHARSIZE, 1); 38413000
|
|
ANAME ~ POINTER (ALLNAMES, CHARSIZE); 38414000
|
|
ANAME ~ ANAME + WORDDIVCHARSIZE + 2; 38415000
|
|
WORDMON ~ WORD (ANAME); %%%%%% 38416000
|
|
WHILE THISNAME ~ FIRSTNAME ! NULL 38417000
|
|
DO BEGIN 38418000
|
|
T ~ CHARCOUNT @ (THISNAME).CHARS; 38419000
|
|
P ~ POINTERTONAME @(THISNAME); 38420000
|
|
MOVEUPDATE (P, ANAME, FOR T); 38421000
|
|
IF CALLER = DATACLS THEN ANAME ~ ANAME + (18 - T); 38422000
|
|
FORGETAREA (SIZE(NAMEQUEUE), 38423000
|
|
WORD (THISNAME).ADDRESSF); 38424000
|
|
FORGETAREA (CHARCOUNT @ (THISNAME).WRDCNT, 38425000
|
|
WORD (POINTERTONAME @ (THISNAME)).ADDRESSF); 38426000
|
|
DELINK (NAMEQUEUE, THISNAME); 38427000
|
|
END; 38428000
|
|
UNLOCK (NAMEQUEUE); 38429000
|
|
ALLNAMES [1] ~ * & IDSANDNAMES (TOTALIDENTIFIERS, TOTALNAMES); 38430000
|
|
ALLNAMES[0] ~ 0 & FIRSTPOINTERWORDL (*, ALLNAMES.LENGTHF, *, *,38431000
|
|
TOTALCHARS -6); 38432000
|
|
IF CALLER = DATACLS THEN RETURN (ALLNAMES); 38433000
|
|
RETURN( ANAME & STRINGDESCRIPTOR (,*,0,,*,*,*,TOTALCHARS,*)); 38434000
|
|
END OF NAMES; 38435000
|
|
SAVE INTEGER PROCEDURE GETANUMBER (AGAIN); 38436000
|
|
VALUE AGAIN; 38437000
|
|
BOOLEAN AGAIN; 38438000
|
|
BEGIN 38439000
|
|
SCANNER; COMMENT GET RID OF DELIMITER; 38440000
|
|
CONVERT ~ TRUE; 38441000
|
|
IF SCANNER !CONVERTEDINTEGER 38442000
|
|
THEN CONTROLCARDERROR (3) 38443000
|
|
ELSE GETANUMBER ~ ACCUMULATOR [0]; 38444000
|
|
IF AGAIN AND NOT ENDOFRECORD THEN SCANNER; 38445000
|
|
END GETANUMBER; 38446000
|
|
SAVE PROCEDURE QUEUEPARAMETERS(SEGZERO2); 38447000
|
|
ARRAY SEGZERO2[*]; 38448000
|
|
BEGIN COMMENT READ THE PARAMETER BLOCK THAT THE COMPILERS HAVE38449000
|
|
WRITTEN TO THE CODE FILE AND MAKE INDIVIDUAL 38450000
|
|
QUEUE ENTRIES FOR EACH OF THEM. IF THE BLOCK 38451000
|
|
DOES NOT EXIST, SET UP AN EMPTY QUEUE.; 38452000
|
|
ARRAY SEGZERO = SEGZERO2 [*,*]; 38453000
|
|
ARRAY PB, MYPB, HEADER [*]; 38454000
|
|
INTEGER L, A, I, T, PI, DA; 38455000
|
|
REAL X; 38456000
|
|
REFERENCE R, MYPBR = MYPB; 38457000
|
|
IF L ~ (PB ~ SEGZERO [FPBDESCPLACE,*]).LENGTHF > 1 38458000
|
|
THEN BEGIN COMMENT A COMPILE TIME PARAMETER BLOCK WAS 38459000
|
|
CREATED.; 38460000
|
|
MYPB ~ MYPB & ARRAYDESCL(0, L, 1); 38461000
|
|
HEADER ~ SEGZERO [CODEFILEDESCPLACE, *]; 38462000
|
|
BUZZ (PARAMETERQUEUE); 38463000
|
|
LASTPARAM ~ FIRSTPARAM ~ NULL; 38464000
|
|
PI ~ 1; 38465000
|
|
SEGZERO [FPBDESCPLACE, *].ADDRESSF ~ A ~ 38466000
|
|
MYPB.ADDRESSF; 38467000
|
|
DO BEGIN 38468000
|
|
A ~ A + (X ~ MYPB[PI]).INFOINDEXF; 38469000
|
|
R ~ ALLOCATE (PARAMETERQUEUE); 38470000
|
|
POINTERTOID @(R) ~ POINTER (MYPB[PI],8); 38471000
|
|
PARAMETERINFO@(R) ~ MYPBR& ARRAYDESCL 38472000
|
|
(3, X.INFOLENGTHF, A); 38473000
|
|
INITIALINSERT (PARAMETERQUEUE, R); 38474000
|
|
END 38475000
|
|
UNTIL PI ~ PI + X.TOTALINFOWORDSF ! PI; 38476000
|
|
COMMENT DITTO IS ZERO WHEN THE LAST 38477000
|
|
PARAMETER HAS BEEN PROCESSED.; 38478000
|
|
UPDATEWORDCOUNT (L, FIRSTPARAM ); 38479000
|
|
END 38480000
|
|
ELSE BEGIN 38481000
|
|
BUZZ (PARAMETERQUEUE); 38482000
|
|
FIRSTPARAM ~ LASTPARAM ~ NULL; 38483000
|
|
END; 38484000
|
|
READLOCK (FIRSTPARAM , SEGZERO[FIRSTPARAMETERPLACE, *]); 38485000
|
|
READLOCK (LASTPARAM , SEGZERO[LASTPARAMETERPLACE, *]); 38486000
|
|
UNLOCK (PARAMETERQUEUE); 38487000
|
|
EXIT; 38488000
|
|
END OF QUEUEPARAMETERS; 38489000
|
|
SAVE PROCEDURE EMPTYPARAMETERQ(SEGZERO2); 38490000
|
|
ARRAY SEGZERO2[*]; 38491000
|
|
BEGIN COMMENT EMPTY THE PARAMETER QUEUE. ALL PARAMETERS FOR 38492000
|
|
THIS RUN ARE NOW KNOWN AND THE INFORMATION FOR THEM 38493000
|
|
EXISTS AS INDIVIDUAL ENTRIES IN THE PARAMETER QUEUE. 38494000
|
|
THESE ENTRIES EXIST EITHER IN THE AREA DESCRIBED 38495000
|
|
BY THE ORIGINAL FPB DESCRIPTOR (AS SUPPLIED BY THE 38496000
|
|
COMPILER (AS SUPPLIED BY CONTROL CARD)) OR IN INDIV- 38497000
|
|
IDUAL AREAS THAT WERE OBTAINED AS INDIVIDUAL CONTROL 38498000
|
|
CARDS WERE PROCESSED. IT IS NOW TIME TO CONSOLIDATE 38499000
|
|
ALL ENTRIES INTO A SINGLE ENTRY AND PUT A NEW 38500000
|
|
DESCRIPTOR IN SEGMENT ZERO. WHEN THERE ARE ABSOLUTE-38501000
|
|
LY NO PARAMETERS, THE FPB DESCRIPTOR IS AN ABSENT 38502000
|
|
DESCRIPTOR WITH A LENGTH OF 1 WHICH WILL (AUTOMATIC- 38503000
|
|
ALLY) RETURN A ZERO WHEN THE ZEROTH WORD (WORD COUNT)38504000
|
|
IS ACCESSED.; 38505000
|
|
ARRAY SEGZERO =SEGZERO2 [*,*]; 38506000
|
|
ARRAY PB [1], PINFO [*]; 38507000
|
|
ARRAY PBW = PB [*]; 38508000
|
|
REFERENCE PINFOR = PINFO; 38509000
|
|
INTEGER PI, FWI, FWL; 38510000
|
|
POINTER PINFOP = PINFO; 38511000
|
|
REFERENCE RT, RTT; 38512000
|
|
REAL FW; 38513000
|
|
IF (RT ~ REFERENCE (SEGZERO [FIRSTPARAMETERPLACE, *]))! NULL 38514000
|
|
THEN BEGIN 38515000
|
|
FIRSTPARAM ~ RT; 38516000
|
|
LASTPARAM ~ REFERENCE(SEGZERO[LASTPARAMETERPLACE,*]);38517000
|
|
PB ~ PB & ARRAYDESCL (0, 38518000
|
|
(PI ~ REAL (POINTERTOID@(RT), 6).TOTALINFOWORDSF38519000
|
|
+1), 1); 38520000
|
|
PB[0] ~ PI; 38521000
|
|
PI ~ 1; 38522000
|
|
DO BEGIN 38523000
|
|
FW ~ REAL (POINTERTOID@(RT), 6); 38524000
|
|
PI ~ PI + FWI + FWL; 38525000
|
|
MOVE (PINFOP ~ POINTERTOID@(RT), 38526000
|
|
POINTER (PB[PI], CHARSIZE), 38527000
|
|
FOR FWI ~ FW.INFOINDEXF WORDS); 38528000
|
|
FORGETSPACE (PINFO.ADDRESSF); 38529000
|
|
PINFOR ~ PARAMETERINFO@(RT); 38530000
|
|
MOVE (POINTER(PINFO, CHARSIZE) 38531000
|
|
,POINTER(PB[PI+FWI], CHARSIZE), 38532000
|
|
FOR FWL ~ FW.INFOLENGTHF WORDS); 38533000
|
|
PB[PI].TOTALINFOWORDSF ~ FWI + FWL; 38534000
|
|
FORGETSPACE (PINFO.ADDRESSF); 38535000
|
|
RTT ~ NEXTPARAM@(RT); 38536000
|
|
DELINK (PARAMETERQUEUE, RT); 38537000
|
|
RT ~ RTT; 38538000
|
|
END 38539000
|
|
UNTIL RTT =NULL; 38540000
|
|
PB[PI].TOTALINFOWORDSF ~ 0; 38541000
|
|
FIRSTPARAM ~ LASTPARAM ~NULL; 38542000
|
|
IF SEGZERO[FPBDESCPLACE, *].LENGTHF > 1 38543000
|
|
THEN FORGETSPACE (SEGZERO [FPBDESCPLACE,*].ADDRESSF);38544000
|
|
COMMENT THIS IS THE PLACE TO WRITE PB TO MCP OLAY DISK, 38545000
|
|
FIX UP THE DESCRIPTOR ACCORDINGLY AND FORGET THE 38546000
|
|
SPACE USED BY PB. ALSO CHECK ON EXECUTABLE STATUS 38547000
|
|
OF SEGZERO BEING PROCESSED.; 38548000
|
|
END; 38549000
|
|
READLOCK (PBW,SEGZERO [FPBDESCPLACE, *]); 38550000
|
|
EXIT; 38551000
|
|
END EMPTYPARAMETERQ; 38552000
|
|
SAVE PROCEDURE FILECARD (SEGZERO, ACTION); 38553000
|
|
VALUE ACTION; 38554000
|
|
INTEGER ACTION; 38555000
|
|
ARRAY SEGZERO [*]; 38556000
|
|
BEGIN COMMENT PROCESS AND QUEUE FILE PARAMETER CARDS.; 38557000
|
|
REFERENCE THISFILE, TEMPR; 38558000
|
|
POINTER EXTERNALNAME, PT; 38559000
|
|
WORD EXTERNALNAMEW = EXTERNALNAME; 38560000
|
|
INTEGER T; 38561000
|
|
SAVE ARRAY FPB [1], 38562000
|
|
SCRATCH [1]; 38563000
|
|
REFERENCE FPBR = FPB; 38564000
|
|
WORD ARRAY SZ = SEGZERO[*], 38565000
|
|
SUCCESSOR = SUCCESSORSHEET [*,*]; 38566000
|
|
DEFINE FPPLACE = FIRSTPARAMETERPLACE #, 38567000
|
|
LPPLACE = LASTPARAMETERPLACE#, 38568000
|
|
REEDLOCK (LOCALP, GLOBALP, PLACE) = 38569000
|
|
LOCALP ~ GLOBALP; GLOBALP ~ REFERENCE (SZ[PLACE]); 38570000
|
|
SZ [PLACE] ~ WORD (LOCALP) #, 38571000
|
|
FPBSIZE (V) = 38572000
|
|
FPB ~ FPB & ARRAYDESCL (0, V + FIXEDFPBSIZE, 1)#, 38573000
|
|
SCRATCHSIZE (ARAY) = 38574000
|
|
SCRATCH ~ * & ARRAYDESCL(0,T~ARAY[0].INFOINDEXF,1)#; 38575000
|
|
IF COMPILEFORSYNTAX(SEGZERO[PROCESSNATUREPLACE]) THEN EXIT; 38576000
|
|
BUZZ (PARAMETERQUEUE); 38577000
|
|
REEDLOCK (TEMPR, FIRSTPARAM, FPPLACE); 38578000
|
|
REEDLOCK (TEMPR, LASTPARAM, LPPLACE); 38579000
|
|
THISFILE ~ ALLOCATE (PARAMETERQUEUE); 38580000
|
|
CASE ACTION OF 38581000
|
|
BEGIN 38582000
|
|
BEGIN % STANDARD LABEL EQUATION 38583000
|
|
POINTERTOID@(THISFILE) ~ PT ~ NAMES(FILECLS); 38584000
|
|
EXTERNALNAME ~ NAMES(FILECLS); 38585000
|
|
FPBSIZE (REAL (EXTERNALNAME, 6).INFOINDEXF); 38586000
|
|
WHILE CLASS ! QUESTIONCLS AND NOT ENDOFRECORD DO SCANNER; 38587000
|
|
COMMENT PRECEDING STATEMENT IS IN LIEU OF FULL LABEL 38588000
|
|
EQUATION PROCESSING.; 38589000
|
|
END; 38590000
|
|
BEGIN % COMPILE CARD FILE 38591000
|
|
SCRATCHSIZE (COMPILERCARDEXTERNAL); 38592000
|
|
MOVE (CURRENTTIME, POINTER(COMPILERCARDEXTERNAL[1], 38593000
|
|
CHARSIZE) +3, FOR 6); 38594000
|
|
MOVE (PT ~ POINTER(COMPILERCARDEXTERNAL, CHARSIZE), 38595000
|
|
POINTER (SCRATCH, CHARSIZE), FOR T WORDS); 38596000
|
|
MOMTOVECTOR (SCRATCH, UINFOW, FILEID.UNITNOF); 38597000
|
|
FPBSIZE (T); 38598000
|
|
MOVE (PT, POINTER (FPB[FIXEDFPBSIZE],CHARSIZE), 38599000
|
|
FOR T WORDS); 38600000
|
|
SCRATCHSIZE (COMPILERCARDFILE); 38601000
|
|
MOVE (POINTER(COMPILERCARDFILE, CHARSIZE), 38602000
|
|
POINTER (SCRATCH, CHARSIZE), FOR T WORDS); 38603000
|
|
POINTERTOID@(THISFILE) ~ PT ~ POINTER(SCRATCH, CHARSIZE); 38604000
|
|
END; 38605000
|
|
BEGIN % COMPILER CODE FILE 38606000
|
|
SCRATCHSIZE (COMPILERCODEFILE); 38607000
|
|
MOVE (POINTER(COMPILERCODEFILE, CHARSIZE), 38608000
|
|
POINTER(SCRATCH, CHARSIZE), FOR T WORDS); 38609000
|
|
POINTERTOID@(THISFILE) ~ PT ~ POINTER (SCRATCH, CHARSIZE);38610000
|
|
EXTERNALNAMEW~ WORD(SUCCESSOR[CODEFILENAMEDESCPLACE,*]); 38611000
|
|
FPBSIZE (REAL(EXTERNALNAME, 6).INFOINDEXF); 38612000
|
|
END; 38613000
|
|
END OF CASE; 38614000
|
|
IF ACTION ! CARDACTION 38615000
|
|
THEN MOVE (EXTERNALNAME, POINTER(FPB[FIXEDFPBSIZE], CHARSIZE), 38616000
|
|
FOR (REAL(EXTERNALNAME, 6).INFOINDEXF) WORDS); 38617000
|
|
IF ACTION = LEQACTION 38618000
|
|
THEN FORGETSPACE (EXTERNALNAME.ADDRESSF); 38619000
|
|
MOVE (REAL(PT, 6)& FIRSTPOINTERWORDL(*,*,*,FILETYPEP), PT, 38620000
|
|
FOR 1 WORDS); 38621000
|
|
PARAMETERINFO @(THISFILE) ~ FPBR; 38622000
|
|
PARAMETERQUEUE ~ THISFILE; 38623000
|
|
FIRSTPARAM ~ READLOCK(FIRSTPARAM ,SZ [FPPLACE]); 38624000
|
|
LASTPARAM ~ READLOCK (LASTPARAM , SZ [LPPLACE]); 38625000
|
|
UNLOCK (PARAMETERQUEUE); 38626000
|
|
EXIT; 38627000
|
|
END FILECARD; 38628000
|
|
SAVE PROCEDURE ENDGAME (SEGZERO); 38629000
|
|
ARRAY SEGZERO [*]; 38630000
|
|
BEGIN COMMENT DO ALL PROCESSING NORMALLY ASSOCIATED WITH THE 38631000
|
|
END OF A SCHEDULE DECK.; 38632000
|
|
REFERENCE PSR; 38633000
|
|
ARRAY PS = PSR[*]; 38634000
|
|
BOOLEAN PRIOR; 38635000
|
|
WORD ARRAY SEGZERW = SEGZERO [*]; 38636000
|
|
REFERENCE ARRAY SZR = SEGZERO [*]; 38637000
|
|
IF (PSR ~ PREVIOUSPROGRAM@(REFERENCE (SEGZERO)))! NULL 38638000
|
|
THEN BEGIN PRIOR ~ TRUE; ENDGAME (PS); END; 38639000
|
|
EMPTYPARAMETERQ(SEGZERO); 38640000
|
|
IF PRIOR THEN FIRSTPARAMETER@(PSR) ~ SZR[FPBDESCPLACE]; 38641000
|
|
SEGZERO [TIMEENTEREDPLACE] ~ TIMEOFDAY; 38642000
|
|
IF T ~ SEGZERO[PROCESSNATUREPLACE].PROCESSCLASSF ! 38643000
|
|
COMPILENSYNTAXOBJECT 38644000
|
|
THEN BEGIN 38645000
|
|
BUZZ (SHEETQ); 38646000
|
|
SHEETQ ~ REFERENCE(SEGZERO); 38647000
|
|
UNLOCK (SHEETQ); 38648000
|
|
SHEETENTERED ~ TRUE; 38649000
|
|
IF PRIOR 38650000
|
|
THEN READLOCK (SEGZERW[LINKPLACE].SELFIDENTF, 38651000
|
|
PS [NEXTPROGRAMPLACE]); 38652000
|
|
END 38653000
|
|
ELSE BEGIN 38654000
|
|
FORGETSPACE (SEGZERO.ADDRESSF); 38655000
|
|
END; 38656000
|
|
EXECUTESHEET ~ FALSE; 38657000
|
|
END ENDGAME; 38658000
|
|
SAVE PROCEDURE GETHEADER; 38659000
|
|
BEGIN COMMENT GETHEADER PRESUMES NAMEPOINTER HAS BEEN INITIAL-38660000
|
|
IZED TO POINT AT A NAME STRING. SEGMENT ZERO 38661000
|
|
WILL BE MADE PRESENT (BY PRESENCE BIT) AND 38662000
|
|
ENTRIES APPROPRIATE TO THE SHEETQ ARE MADE. 38663000
|
|
SEGZERO IS EVENTUALLY PLACED IN THE SHEETQ.; 38664000
|
|
WORD ARRAY NAMEPOINTERW = NAMEPOINTER [*]; 38665000
|
|
WORD ARRAY SEGZEROW = SEGZERO [*]; 38666000
|
|
REAL ARRAY HEADER =HEADERW [*]; 38667000
|
|
DEFINE 38668000
|
|
ARGUMENT = 0#, 38669000
|
|
LOCKER = FALSE #; 38670000
|
|
IF T ~ DIRECTORYSEARCH (NAMEPOINTER, ARGUMENT, LOCKER) < 0 38671000
|
|
THEN CONTROLCARDERROR (4) 38672000
|
|
ELSE HEADERW ~ DISKFILEHEADERS [T, *]; 38673000
|
|
T := @440; 38674000
|
|
DISKWAIT(SEGZERO, -1, SIZE(SHEETQ), FIRSTROWADDRESS(HEADER), 38675000
|
|
T); 38676000
|
|
SEGZEROW[FPBDESCPLACE].TAG ~ DATADESC; 38677000
|
|
QUEUEPARAMETERS (SEGZERO); 38678000
|
|
PREVIOUSPROGRAM@(REFERENCE(SEGZERO)) ~ NULL; 38679000
|
|
MOMTOVECTOR (NAMEPOINTERW, SEGZERO, CODEFILENAMEDESCPLACE); 38680000
|
|
MOMTOVECTOR (HEADERW, SEGZERO, CODEFILEDESCPLACE); 38681000
|
|
SEGZERO.CBITF ~ 1; 38682000
|
|
EXIT; 38683000
|
|
END OF GETTING HEADER; 38684000
|
|
COMMENT CONTROL CARD STARTS HERE; 38685000
|
|
WORDDIVCHARSIZE ~ 48 DIV CHARSIZE; 38686000
|
|
IF 5 = IOCB.TAG 38687000
|
|
THEN BEGIN COMMENT AN IOCB; 38688000
|
|
SOURCEREFERENCE ~ AREADESC @(IOCB); 38689000
|
|
RESULT ~ MISC @ (IOCB); 38690000
|
|
CONTROLCARDCHECK; 38691000
|
|
CONTROLWORD ~ SOURCEAREA [0]; 38692000
|
|
FILEID ~ USER @(IOCB); 38693000
|
|
END 38694000
|
|
ELSE BEGIN COMMENT A UNIT NUMBER; 38695000
|
|
CONTROLWORD ~ 30"044"; 38696000
|
|
FILEID ~ 0 & USERL (SNR, STACK[SNR, PRIORITYPLACE], 38697000
|
|
UNITNO); 38698000
|
|
ACTION ~ 3"1001"; % VALIDITY - WAIT FOR MPX ON CM 38698100
|
|
COMMENT * * * * 38698900
|
|
ACTION ~ 3"3001"; % CC OR CM AND VALIDITY 38699000
|
|
TRACE (23); 38700000
|
|
NEWLIFE: 38701000
|
|
SEGZERO ~ SEGZEROWORD; 38702000
|
|
CONTROLCARDIO; 38703000
|
|
ACTION ~ 3"3011"; % SIM KLUDGE 38704000
|
|
END; 38705000
|
|
LIMIT ~ ORIGINALLIMIT ~ RESULT.RDMEMADDR|WORDDIVCHARSIZE + 38707000
|
|
RESULT.RDCHRCNT - 1; 38708000
|
|
SOURCE ~ ORIGINALSOURCE ~ POINTER(SOURCEAREA, 38709000
|
|
CHARSIZE) + WORDDIVCHARSIZE; 38710000
|
|
RESULT ~ RESERVED [0]; 38711000
|
|
ACCUMULATOR ~ RESERVED & DATADESCRIPTOR 38712000
|
|
(,,,,,0,,,ACCUMULATOR.LENGTHF); 38713000
|
|
ACCUMPOINTER ~ POINTER(ACCUMULATOR, CHARSIZE); 38714000
|
|
SCANNER; 38715000
|
|
WHILE CLASS = QUESTIONCLS 38716000
|
|
DO BEGIN 38717000
|
|
SCANNER; 38718000
|
|
IF RANGE (ALGOLCLS, COBOLCLS) 38719000
|
|
THEN BEGIN COMMENT A COMPILER PARAMETER; 38720000
|
|
SCANNER; 38721000
|
|
SEGZERO ~ PREDECESSOR; 38722000
|
|
END; 38723000
|
|
CASE RESERVECASE OF 38724000
|
|
BEGIN 38725000
|
|
CONTROLCARDERROR(0); 38726000
|
|
BEGIN 38727000
|
|
IF CLASS > ENDCLS THEN CONTROLCARDERROR(1);38728000
|
|
IF EXECUTESHEET THEN ENDGAME(SEGZERO); 38729000
|
|
CASE CLASS - RUNCLS OF 38730000
|
|
BEGIN % FIRST CARD CASE 38731000
|
|
BEGIN % RUN 138732000
|
|
GO EXECUTE; 38733000
|
|
END; % RUN 138734000
|
|
EXECUTE: BEGIN 38735000
|
|
SHEETENTERED ~ FALSE; 38736000
|
|
NAMEPOINTER ~ NAMES(EXECUTECLS); 38737000
|
|
GETHEADER; 38738000
|
|
SUCCESSOR ~ SEGZERO; 38739000
|
|
NATUREOFPROCESS(SEGZERO,EXECUTEJOB); 38740000
|
|
EXECUTESHEET ~ TRUE; 38741000
|
|
END; % EXECUTE 238742000
|
|
BEGIN % COMPILE 338743000
|
|
COMPILER ~ TRUE; 38744000
|
|
NAMEPOINTER ~ NAMES (COMPILECLS); 38745000
|
|
MOMTOVECTOR (WORD(NAMEPOINTER),SEGZERO,CODEFILENAMEDESCPLACE); 38746000
|
|
SUCCESSORSHEET ~ REFERENCE (SEGZERO); 38747000
|
|
READLOCK(0&DATADESCRIPTOR (), SEGZERO[FPBDESCPLACE]); 38748000
|
|
SEGZERO ~ SEGZEROWORD; 38749000
|
|
WHILE NOT RANGE (ALGOLCLS, COBOLCLS) DO SCANNER; 38750000
|
|
SOURCE ~ TSOURCE; 38751000
|
|
NAMEPOINTER ~ NAMES (COMPILECLS); 38752000
|
|
GETHEADER; 38753000
|
|
NEXTPROGRAM@(REFERENCE(SEGZERO)) ~ SUCCESSORSHEET; 38754000
|
|
PREDECESSOR ~ SEGZERO; 38755000
|
|
PREVIOUSPROGRAM@(SUCCESSORSHEET) ~ PREDECESSORSHEET; 38756000
|
|
FILECARD (SEGZERO, CARDACTION); 38757000
|
|
WHILE NOT RANGE (LIBRARYCLS, DISKCLS -1) 38758000
|
|
DO IF CLASS ! QUESTIONCLS AND NOT ENDOFRECORD 38759000
|
|
THEN SCANNER 38760000
|
|
ELSE CLASS ~ GOCLS; 38761000
|
|
CASE CLASS - LIBRARYCLS OF 38762000
|
|
BEGIN 38763000
|
|
BEGIN % COMPILE FOR LIBRARY 38764000
|
|
NATUREOFPROCESS (SEGZERO, COMPILETOLIBRARYJOB); 38765000
|
|
DO UNTIL SCANNER = QUESTIONCLS OR ENDOFRECORD; 38766000
|
|
NATUREOFPROCESS (SUCCESSOR, IF ENDOFRECORD 38767000
|
|
THEN COMPILETOLIBRARYJOB ELSE LIBRARYNGOJOB); 38768000
|
|
FILECARD (SEGZERO, CODEACTION); 38769000
|
|
END; 38770000
|
|
BEGIN % COMPILE FOR SYNTAX 38771000
|
|
NATUREOFPROCESS (SEGZERO, COMPILENSYNTAXJOB); 38772000
|
|
NATUREOFPROCESS (SUCCESSOR, COMPILENSYNTAXOBJECT); 38773000
|
|
END; 38774000
|
|
BEGIN % COMPILE AND GO 38775000
|
|
NATUREOFPROCESS(SEGZERO, COMPILENGOJOB); 38776000
|
|
NATUREOFPROCESS(SUCCESSOR,GOJOB); 38777000
|
|
FILECARD (SEGZERO, CODEACTION); 38778000
|
|
CLASS ~ QUESTIONCLS; 38779000
|
|
END; 38780000
|
|
END; 38781000
|
|
FIRSTPARAMETER@(SUCCESSORSHEET)~LASTPARAMETER@(SUCCESSORSHEET)~38782000
|
|
NULL; 38783000
|
|
EXECUTESHEET ~ TRUE; 38784000
|
|
WHILE CLASS !QUESTIONCLS AND NOT ENDOFRECORD DO SCANNER; 38785000
|
|
END; % COMPILE 338786000
|
|
BEGIN % REMOVE 438787000
|
|
END; % REMOVE 438788000
|
|
BEGIN % LOAD 538789000
|
|
LIBMAIN(NAMES(LOADCLS)+6); 38789100
|
|
END; % LOAD 538790000
|
|
BEGIN % DUMP 638791000
|
|
END; % DUMP 638792000
|
|
BEGIN % CHANGE 738793000
|
|
END; % CHANGE 738794000
|
|
BEGIN % DATA 838795000
|
|
LABELTYPE ~ 4; %%%%%%%%%%%%%%%% 38796000
|
|
DATA: IF NOT ENDOFRECORD 38797000
|
|
THEN UINFOW [FILEID.UNITNOF] ~ WORD (NAMES(DATACLS)); 38798000
|
|
UINFOP [FILEID.UNITNOF, 0] ~ 0 & LEBCNTRL 38799000
|
|
(1,,,,,1,LABELTYPE); 38800000
|
|
GO SUICIDE; 38801000
|
|
END; % DATA 838802000
|
|
BEGIN % USE 938803000
|
|
END; % USE 938804000
|
|
BEGIN % USER 1038805000
|
|
END; % USER 1038806000
|
|
BEGIN % RELEASE 1138807000
|
|
END; % RELEASE 1138808000
|
|
BEGIN % FREE 1238809000
|
|
END; % FREE 1238810000
|
|
BEGIN % PUBLIC 1338811000
|
|
END; % PUBLIC 1338812000
|
|
BEGIN % DATAB 1438813000
|
|
LABELTYPE ~ 3; %%%%%%%%%%%% 38814000
|
|
GO DATA; 38815000
|
|
END; % DATAB 1438816000
|
|
BEGIN % UNUSED 1538817000
|
|
END; % UNUSED 1538818000
|
|
BEGIN % UNUSED 1638819000
|
|
END; % UNUSED 1638820000
|
|
BEGIN % UNUSED 1738821000
|
|
END; % UNUSED 1738822000
|
|
BEGIN % UNUSED 1838823000
|
|
END; % UNUSED 1838824000
|
|
BEGIN % UNUSED 1938825000
|
|
END; % UNUSED 1938826000
|
|
BEGIN % UNUSED 2038827000
|
|
END; % UNUSED 2038828000
|
|
BEGIN % UNUSED 2138829000
|
|
END; % UNUSED 2138830000
|
|
BEGIN % UNUSED 2238831000
|
|
END; % UNUSED 2238832000
|
|
BEGIN % UNUSED 2338833000
|
|
END; % UNUSED 2338834000
|
|
BEGIN % END 2438835000
|
|
END; % END 2438836000
|
|
END OF FIRST CARD CASE; 38837000
|
|
END; 38838000
|
|
CASE CLASS - FILECLS OF 38839000
|
|
BEGIN % PARAMETER CARD CASE 38840000
|
|
BEGIN % FILE 3538841000
|
|
FILECARD(SEGZERO, LEQACTION); 38842000
|
|
END; % FILE 3538843000
|
|
BEGIN % PROCESS 3638844000
|
|
END; % PROCESS 3638845000
|
|
BEGIN % IO 3738846000
|
|
MYCOMMON ~ 38847000
|
|
SEGZERO [IOTIMEPLACE ] ~ GETANUMBER(TRUE); 38848000
|
|
END; % IO 3738849000
|
|
BEGIN % PRIORITY 3838850000
|
|
SEGZERO [PRIORITYPLACE ] ~ GETANUMBER(TRUE); 38851000
|
|
END; % PRIORITY 3838852000
|
|
BEGIN % COMMON 3938853000
|
|
SEGZERO [COMMONVALUEPLACE ] ~ GETANUMBER(TRUE); 38854000
|
|
END; % COMMON 3938855000
|
|
BEGIN % CORE 4038856000
|
|
SEGZERO [COREPLACE ] ~ GETANUMBER(TRUE); 38857000
|
|
END; % CORE 4038858000
|
|
BEGIN % STACK 4138859000
|
|
SEGZERO [STACKSIZEPLACE ] ~ GETANUMBER(TRUE); 38860000
|
|
END; % STACK 4138861000
|
|
BEGIN % UNUSED 4238862000
|
|
END; % UNUSED 4238863000
|
|
BEGIN % UNUSED 4338864000
|
|
END; % UNUSED 4338865000
|
|
BEGIN % UNUSED 4438866000
|
|
END; % UNUSED 4438867000
|
|
BEGIN % UNUSED 4538868000
|
|
END; % UNUSED 4538869000
|
|
BEGIN % UNUSED 4638870000
|
|
END; % UNUSED 4638871000
|
|
BEGIN % UNUSED 4738872000
|
|
END; % UNUSED 4738873000
|
|
BEGIN % UNUSED 4838874000
|
|
END; % UNUSED 4838875000
|
|
BEGIN % UNUSED 4938876000
|
|
END; % UNUSED 4938877000
|
|
BEGIN % UNUSED 5038878000
|
|
END; % UNUSED 5038879000
|
|
BEGIN % UNUSED 5138880000
|
|
END; % UNUSED 5138881000
|
|
BEGIN % ALGOL 5238882000
|
|
END; % ALGOL 5238883000
|
|
BEGIN % FORTRAN 5338884000
|
|
END; % FORTRAN 5338885000
|
|
BEGIN % ESPOL 5438886000
|
|
END; % ESPOL 5438887000
|
|
BEGIN % UNUSED 5538888000
|
|
END; % UNUSED 5538889000
|
|
BEGIN % UNUSED 5638890000
|
|
END; % UNUSED 5638891000
|
|
BEGIN % UNUSED 5738892000
|
|
END; % UNUSED 5738893000
|
|
BEGIN % UNUSED 5838894000
|
|
END; % UNUSED 5838895000
|
|
BEGIN % UNUSED 5938896000
|
|
END; % UNUSED 5938897000
|
|
BEGIN % UNUSED 6038898000
|
|
END; % UNUSED 6038899000
|
|
BEGIN % UNUSED 6138900000
|
|
END; % UNUSED 6138901000
|
|
BEGIN % UNUSED 6238902000
|
|
END; % UNUSED 6238903000
|
|
BEGIN % UNUSED 6338904000
|
|
END; % UNUSED 6338905000
|
|
BEGIN % UNUSED 6438906000
|
|
END; % UNUSED 6438907000
|
|
BEGIN % COBOL 6538908000
|
|
END; % COBOL 6538909000
|
|
END; % PARAMETER CARD CASE 38910000
|
|
END RESERVED CASE; 38911000
|
|
IF ENDOFRECORD AND NOT SHEETENTERED 38912000
|
|
THEN BEGIN 38913000
|
|
CONTROLCARDIO; 38914000
|
|
SCANNER; 38915000
|
|
END; 38916000
|
|
SEGZERO ~ SUCCESSOR; 38917000
|
|
END OF QUESTION CLASS WHILE; 38918000
|
|
NATURALDEATH: 38919000
|
|
IF SCANIN (0 & USTATUSWORD (UNITNO.VECTOR,,,)).WHICHUNIT = 1 38920000
|
|
THEN GO NEWLIFE; 38921000
|
|
SUICIDE: 38922000
|
|
UNIT [FILEID.UNITNOF].UNITASSIGNED ~ 0; 38923000
|
|
EXIT; 38924000
|
|
38925000
|
|
CCERROR: 38926000
|
|
GLOBALSTOP; 38927000
|
|
END CONTROL CARD; 38928000
|
|
SAVE PROCEDURE INITIATEIO(AREADESC,UNITWORD,USERIDNO); 40000000
|
|
VALUE AREADESC,UNITWORD,USERIDNO; 40001000
|
|
REAL UNITWORD; 40002000
|
|
REFERENCE AREADESC; 40003000
|
|
INTEGER USERIDNO; FORWARD; 40004000
|
|
SAVE PROCEDURE STARTIO(U); VALUE U; INTEGER U; 40005000
|
|
COMMENT STARTIO FIRST CHECKS FOR CHANNEL IF THE UNIT IS IN AN USABLE 40006000
|
|
STATE.IF CHANNEL IS AVAILABLE, IT CALLS INITIATEIO, OTHERWISE 40007000
|
|
IT INSERTS ENTRY INTO WAITCHANNEL QUEUE. 40008000
|
|
U -LOGICAL UNIT NO.; 40009000
|
|
BEGIN 40010000
|
|
INTEGER N, COMMENT N STORES UNIT IN PROCESS OR BUSY BITS; 40011000
|
|
MPXINDEX; COMMENT MULTIPLEXOR NO. FOR WAITCHANNELQUE 40012000
|
|
INDEX; 40013000
|
|
REAL X, COMMENT X CONTAINS UNIT TABLE ENTRY; 40014000
|
|
UNITWORD; COMMENT RESULT OF INTERROGATE I/O PATH FOR 40015000
|
|
UNIT; 40016000
|
|
REFERENCE IOCB; COMMENT POINTER TO ENTRY OF I/O QUEUE; 40017000
|
|
X~ UNIT[U]; 40018000
|
|
IF X.UNITSTATUS=0 THEN COMMENT CHECKING CURRENT STATE OF UNIT;40019000
|
|
IF FIRSTIO[U]!NULL THEN COMMENT MORE I/O TO BE DONE FOR UNIT; 40020000
|
|
BEGIN 40021000
|
|
UNITWORD~SCANIN(0&IOPATHWORD(U,X.UNITMPXD,X.UNITMPXI)); 40022000
|
|
IF BOOLEAN(UNITWORD) THEN 40023000
|
|
BEGIN 40024000
|
|
IOCB ~FIRSTIO[U]; 40025000
|
|
INITIATEIO(AREADESC @IOCB,UNITWORD,USER @(IOCB).IDNO); 40026000
|
|
N~3; COMMENT SET UNIT IN PROCESS BITS; 40027000
|
|
END ELSE 40028000
|
|
BEGIN COMMENT ENTER IN WAITCHANNELQUE; 40029000
|
|
MPXINDEX~UNITWORD.MPXDESIGNATOR DIV 2; 40030000
|
|
WAITCHANNELQUE[MPXINDEX]~WAITCHANNELQUE(UNITWORD); 40031000
|
|
N~4; COMMENT SET UNIT WAITING FOR CHANNEL BIT; 40032000
|
|
END; 40033000
|
|
UNIT[U].UCHANWAITORBUSY~N; 40034000
|
|
END; 40035000
|
|
END STARTIO; 40036000
|
|
SAVE PROCEDURE INITIATEIO(AREADESC,UNITWORD,USERIDNO); 40037000
|
|
VALUE AREADESC,UNITWORD,USERIDNO; 40038000
|
|
REAL UNITWORD; 40039000
|
|
REFERENCE AREADESC; 40040000
|
|
INTEGER USERIDNO; 40041000
|
|
COMMENT INITIATEIO INITIATES I/O AND INITIALIZES I/O TIME FOR THE USER40042000
|
|
IT ALSO CHECKS FOR THE UNIT TYPE AND UPDATES THE TRANSACTION 40043000
|
|
COUNTER APPROPRIATELY 40044000
|
|
AREADESC - DESCRIPTOR POINTING TO THE I/O CONTROL WORD WHICH 40045000
|
|
PRECEEDS I/O AREA 40046000
|
|
THIS AREA MUST BE NON-OVERLAYABLE AT THIS POINT. 40046100
|
|
SEE DISKWAIT OR WAITIO FOR EXAMPLES OF HOW TO 40046200
|
|
GUARENTEE THIS. 40046300
|
|
UNITWORD - CONTROL WORD FOR THE UNIT ON WHICH I/O IS TO BE 40047000
|
|
INITIATED. 40048000
|
|
USERIDNO - USER IDENTIFICATION NO. FOR BOOK-KEEPING.; 40049000
|
|
BEGIN 40050000
|
|
REAL IOCW ; COMMENT LOCATION FOR I/O CONTROL WORD; 40052000
|
|
INTEGER U, COMMENT CONTAINS LOGICAL UNIT NO.; 40053000
|
|
TYPE; COMMENT CONTAINS UNIT TYPE; 40054000
|
|
WORD ARRAY IOAREA[*]; 40055000
|
|
IOAREA~WORD(AREADESC); 40056000
|
|
IOCW ~ TAGZOT(IOAREA[0]); 40057000
|
|
IIO(IOAREA,UNITWORD); 40060000
|
|
TYPE~UNIT[U~UNITWORD.UNITNO].UNITTYPE; 40062000
|
|
IOTIME[U] ~ * - SCANIN(TIMEOFDAYWORD); 40062100
|
|
IF BOOLEAN(IOCW.IOTESTBIT) THEN EXIT; 40063000
|
|
IF MAGTAPE(TYPE) THEN 40064000
|
|
IF BOOLEAN(IOCW.IOBACKWARD) THEN 40065000
|
|
BEGIN COMMENT IOMEMINHIBIT BIT IS USED TO CHECK WHETHER UNIT 40066000
|
|
IS REWINDING; 40067000
|
|
IF NOT BOOLEAN(IOCW.IOMEMINHIBIT) THEN 40068000
|
|
TRANSACTION[U]~*-1; 40069000
|
|
EXIT; 40070000
|
|
END; 40071000
|
|
TRANSACTION[ U ]~ * + 1; 40072000
|
|
EXIT; 40073000
|
|
END INITIATEIO; 40074000
|
|
SAVE PROCEDURE IOREQUEST(IOCB); 40075000
|
|
VALUE IOCB; 40076000
|
|
REFERENCE IOCB; 40077000
|
|
COMMENT IOREQUEST QUEUES UP I/O IN IOQUE IF THIS IS THE ONLY ENTRY 40078000
|
|
IN QUEUE IT CALLS STARTIO 40079000
|
|
IOCB - DESCRIPTOR POINTING TO THE ENTRY BLOCK FOR I/O QUEUE 40080000
|
|
6 WORDS IN A BLOCK; 40081000
|
|
BEGIN 40082000
|
|
INTEGER U; COMMENT U CONTAINS LOGICAL UNIT NO; 40083000
|
|
U~USER @(IOCB).UNITNOF; 40084000
|
|
IF UNIT[U].UNITTYPE=0 THEN 40084010
|
|
BEGIN % INVALID UNIT 40084020
|
|
MISC @(IOCB)~REAL(NOT FALSE); 40084030
|
|
USER @(IOCB).USERIOFINISH~1; 40084040
|
|
CAUSE(EVNT @ IOCB); 40084050
|
|
END ELSE 40084060
|
|
BEGIN % GO AHEAD 40084080
|
|
MISC @ (IOCB).RDEXCEPTION := 0; 40084100
|
|
IOQUE[U] ~ IOCB; 40085000
|
|
IF NEXT(IOQUE,U)=NULL THEN STARTIO(U); COMMENT ONLY ONE 40086000
|
|
ENTRY IN IOQUE; 40087000
|
|
END; 40087500
|
|
END IOREQUEST; 40088000
|
|
SAVE REAL PROCEDURE WAITIO(ARRA, USER, IOERRORMASK); 40089000
|
|
VALUE USER, IOERRORMASK; 40090000
|
|
ARRAY ARRA[*]; 40091000
|
|
REAL USER, IOERRORMASK; 40092000
|
|
COMMENT: WAITIO BUILDS AN IOCB AND CALLS IOREQUEST PASSING A LOCAL 40093000
|
|
EVENT ON WHICH IT WAITS. IF THERE ARE NO ERRORS OTHER 40094000
|
|
THAN THOSE ACCOUNTED FOR BY IOERRORMASK THEN WAITIO 40095000
|
|
RETURNS THE RESULT DESCRIPTOR. OTHERWISE IT CALLS 40096000
|
|
UNEXPECTEDIOERROR. 40097000
|
|
IOERRORMASK -ERROR MASK PROVIDED BY CALLER TO DO ITS OWN 40098000
|
|
ERROR-HANDLING 40099000
|
|
BUFFERLENGTH FIELD OF IOERRORMASK HAS A MASK 40100000
|
|
WHICH DETERMINES UNEXPECTED I/O ERROR. 40101000
|
|
USER -THIS IS THE USER WORD WHICH IS TO BE PUT IN THE IOCB. 40102000
|
|
IT MUST CONTAIN THE UNIT NUMBER IN THE UNIT FIELD. 40103000
|
|
ARRA -THIS IS AN UNINDEXED DATA DESCRIPTOR FOR THE IO AREA. 40104000
|
|
THE CALLER MUST HAVE STORED AN IOCW IN AREA[0]. ;40105000
|
|
BEGIN 40106000
|
|
REAL RD; 40107000
|
|
EVENT EVE; 40108000
|
|
REFERENCE ADAM; 40109000
|
|
WORD ARRAY AREA[*]; 40110000
|
|
INTEGER TRACTER;% USED TO SHUT OFF TRACE -- MAR 40112000
|
|
TRACTER~TRACE(0); 40113000
|
|
MAKEPRESENTANDSAVE(ARRA); %MAKE TEMPORARILY SAVE FOR I/O 40114000
|
|
AREA ~ ARRA & ARRAYDESCL(3, ARRA.LENGTHF - 1, *); 40116000
|
|
IOERRORMASK ~ REAL(NOT BOOLEAN(IOERRORMASK)); 40117000
|
|
ADAM ~ IOQUE(USER, -0, REFERENCE(AREA), EVE); 40118000
|
|
MISC@(ADAM).IOERRORMASKFIELD ~ IOERRORMASK; 40119000
|
|
IOREQUEST(ADAM); 40120000
|
|
WAIT(EVE); 40121000
|
|
IF BOOLEAN(WAITIO ~ RD ~ MISC@(ADAM)) THEN 40122000
|
|
IF REAL(BOOLEAN(RD.IOERRORMASKFIELD) AND 40123000
|
|
BOOLEAN(IOERRORMASK) AND 40124000
|
|
BOOLEAN(IOERRORMASK.BUFFERLENGTH)) !0 THEN 40125000
|
|
UNEXPIOERROR(ADAM,REAL(NOT BOOLEAN(IOERRORMASK. 40126000
|
|
IOERRORMASKFIELD))); 40127000
|
|
FORGETAREA(6,WORD(ADAM).ADDRESSF); 40128000
|
|
TURNOVERLAYKEY(ARRA.ADDRESSF);%RETURN TO PREVIOUS OLAY STATUS 40128100
|
|
TRACE(TRACTER); 40129000
|
|
RETURN(RD); 40129100
|
|
END WAITIO; 40130000
|
|
SAVE PROCEDURE NEWIO(MPXINDEX); VALUE MPXINDEX; 40131000
|
|
INTEGER MPXINDEX; 40132000
|
|
COMMENT NEWIO PICKS UP THE FIRST UNIT FOR GIVEN MPX WAITCHANNELQUE, 40133000
|
|
AND INTERROGATES FOR I/O PATH. IF PATH IS AVAILABLE IT PICKS 40134000
|
|
UP THE FIRST I/O FROM THE SPECIFIED UNIT I/O QUEUE. IT CALLS 40135000
|
|
INITIATEIO, DELINKS THE FIRST ENTRY FROM WAITCHANNELQUE AND 40136000
|
|
SETS UNIT BUSY BITS. 40137000
|
|
MPXINDEX -MULTIPLEXOR NO. FOR WAITCHANNELQUE INDEX; 40138000
|
|
BEGIN 40139000
|
|
INTEGER U; COMMENT U CONTAINS LOGICAL UNIT NO.; 40140000
|
|
REAL UNITWORD; COMMENT RESULT OF INTERROGATE I/O PATH FOR 40141000
|
|
UNIT; 40142000
|
|
REFERENCE IOCB; COMMENT POINTER TO ENTRY OF I/O QUEUE; 40143000
|
|
UNITWORD ~ SCANIN(UNTWORD @ FIRSTUNIT[MPXINDEX]); 40144000
|
|
IF BOOLEAN(UNITWORD) THEN 40145000
|
|
BEGIN 40146000
|
|
IOCB ~ FIRSTIO[U ~ UNITWORD.UNITNO]; 40147000
|
|
INITIATEIO(AREADESC @ IOCB ,UNITWORD,USER @(IOCB). IDNO); 40148000
|
|
COMMENT REMOVES ENTRY FROM TOP; 40149000
|
|
DELINK(WAITCHANNELQUE,FIRSTUNIT[MPXINDEX],MPXINDEX); 40150000
|
|
UNIT[U].UNITSTATUS ~3; COMMENT SETS UNIT BUSY BITS; 40151000
|
|
END; 40152000
|
|
END NEWIO; 40153000
|
|
SAVE PROCEDURE IOFINISH(MPXINDEX); VALUE MPXINDEX; INTEGER MPXINDEX;40154000
|
|
COMMENT IOFINISH READS A RESULT DESCRIPTOR FOR A SPECIFIED MULTIPLEXOR40155000
|
|
IT DOES ALL THE ERROR CHECKING. IF NO ERROR IS FOUND IT FIRES 40156000
|
|
UP NEW I/O WAITING FOR CHANNEL AND INSERTS I/O REQUEST FOR 40157000
|
|
THE UNIT ON WHICH I/O WAS FINISHED INTO A WAITCHANNELQUE. IF 40158000
|
|
NO UNIT IS WAITING FOR CHANNEL IT REMOVES FINISHED I/O ENTRY 40159000
|
|
FROM UNIT QUEUE AND IF QUEUE IS NOT EMPTY THEN CALLS STARTIO. 40160000
|
|
IF ERROR IS FOUND, IT SETS APPROPRIATE BITS IN THE UNIT TABLE.40161000
|
|
IF THERE IS A DISK ERROR, IT WILL TRY 10 TIMES TO RECOVER FROM40162000
|
|
THE ERROR. FOR OTHER ERRORS IT CALLS PROCESS IOERROR. IT KEEPS40163000
|
|
THE ERROR. FOR OTHER ERRORS IT CALLS PROCESS IOERR. IT KEEPS 40164000
|
|
TRACK OF I/O TIME AND FOR ERROR FREE OPERATION IT GIVES THE 40165000
|
|
WORD COUNT FOR READ OPERATION. 40166000
|
|
40167000
|
|
MPXINDEX -MULTIPLEXOR DESIGNATOR VALUE; 40168000
|
|
BEGIN 40169000
|
|
LABEL OK,NOWAIT,SETERRORBITS, RESETBUSYBITS,WRAPUP,DONEWIO, 40170000
|
|
UNITTYPETEST,EXIT; 40171000
|
|
INTEGER UNTTYPE, COMMENT UNIT TYPE; 40172000
|
|
U , COMMENT LOGICAL UNIT NO; 40173000
|
|
WORDCOUNT; COMMENT WORD COUNT FOR READ; 40174000
|
|
REAL CURRENTERROR, COMMENT ERROR FIELD OF CURRENT R. D.; 40175000
|
|
PASTERROR, COMMENT ERROR FIELD OF PAST R. D.; 40176000
|
|
UTABLEENTRY, COMMENT UNIT TABLE ENTRY; 40177000
|
|
RECDESC, COMMENT RECORD DESCRIPTOR SKELETON 40178000
|
|
IF NEGATIVE IT IS FOR MCP; 40179000
|
|
RD; COMMENT RESULT DESCRIPTOR; 40180000
|
|
WORD IOCW; COMMENT I/O CONTROL WORD; 40181000
|
|
REFERENCE IOCB; COMMENT TOP IOCB IN THE UNIT QUEUE; 40182000
|
|
BOOLEAN DELINKTOGGLE; % TRUE IF IOQUE ENTRY IS DELINKED 40183000
|
|
MONITOR RAJMONITOR(RD,IOCB); 40186000
|
|
DEFINE LINKINTOKEYINQ = 40187000
|
|
BEGIN 40188000
|
|
KEVNT @(IOCB) ~1; 40189000
|
|
BUZZCONTROL(KEYINQ); 40190000
|
|
KEYINQ~IOCB; 40191000
|
|
UNLOCK(KEYINQ);% TEMPORARY WHILE FORK MIGHT LOSE CONTROL 40192000
|
|
FORK(KEYIN,0); 40194000
|
|
END#,% 40194100
|
|
LINKINTOSPOUTQ=% 40195000
|
|
BEGIN% 40195100
|
|
BUZZCONTROL(SPOUTQ);% 40195200
|
|
SPOUTQ~IOCB;% 40195300
|
|
UNLOCK(SPOUTQ);% TEMPORARY 40195400
|
|
FORK(CONNSOUL,0);% 40195500
|
|
END#,% 40195590
|
|
ENDIOFDEF=0#;% 40195900
|
|
COMMENT READ THE RESULT DESCRIPTOR FOR A SPECIFIED MPX; 40196000
|
|
RD ~SCANIN(0&SCANINWORD(2,MPXINDEX,1)); 40197000
|
|
IF RD=0 THEN BEGIN GO EXIT; END; 40198000
|
|
MPXINDEX~FIRSTONE(MPXINDEX)-1; COMMENT TURNS MPXINDEX TO INDEX 40199000
|
|
FOR WAITCHANNELQUE; 40200000
|
|
U~ RD.RDUNITNO; 40201000
|
|
IOCB~FIRSTIO[U]; 40202000
|
|
UTABLEENTRY ~ UNIT[U]; 40203000
|
|
RECDESC~ MISC @ IOCB; 40204000
|
|
UNTTYPE~UTABLEENTRY.UNITTYPE; 40205000
|
|
IOCW~M[WORD(AREADESC @ IOCB)]; 40205200
|
|
IF MAGTAPE( UNTTYPE) AND NOT BOOLEAN(IOCW.IOTESTBIT) THEN 40205400
|
|
BEGIN % GET RID OF UNDESIRABLE BITS IN RD 40205450
|
|
IF RD.RDERROR=@2001 THEN % TURN OFF INCOMPLETE RECORD BIT 40205600
|
|
RD~REAL(BOOLEAN(RD) AND NOT BOOLEAN(@2001)); 40205800
|
|
IF BOOLEAN(RD.RDWLOOREOF) THEN 40205820
|
|
RD~REAL(BOOLEAN(RD)AND NOT BOOLEAN(4"C80")); 40205840
|
|
END; 40205860
|
|
IF BOOLEAN(CURRENTERROR := RD.RDERROR) OR 40206000
|
|
(PASTERROR~UTABLEENTRY.UNITERRORFIELD)!0 THEN 40207000
|
|
BEGIN COMMENT SOME KIND OF ERROR; 40208000
|
|
IF NOT BOOLEAN(USER@(IOCB).USERIOBIT) THEN COMMENT 40209000
|
|
MCP I/O OPERATION; 40210000
|
|
IF CURRENTERROR~ REAL(BOOLEAN(CURRENTERROR) AND 40211000
|
|
BOOLEAN(RECDESC .IOERRORMASKFIELD))=0 THEN 40212000
|
|
IF PASTERROR=0 THEN GO OK; COMMENT NO ERROR ON UNIT; 40213000
|
|
IF UTABLEENTRY.UNITTYPE !DISKFILE THEN GO SETERRORBITS; 40214000
|
|
COMMENT ERROR CHECKING FOR DISK UNIT; 40215000
|
|
IF CURRENTERROR=0 THEN COMMENT NO ERROR ON CURRENT R.D.; 40216000
|
|
IF NOT BOOLEAN(UTABLEENTRY.UNITRETRY) 40217000
|
|
THEN GO SETERRORBITS COMMENT IOERR WILL HANDLE IT; 40218000
|
|
ELSE BEGIN COMMENT ERROR ON MASS STORAGE RECOVERED; 40219000
|
|
PASTERROR~0; 40220000
|
|
UTABLEENTRY.UNITRETRY~0; 40220500
|
|
GO UNITTYPETEST; 40221000
|
|
END; 40222000
|
|
COMMENT ERROR ON CURRENT R.D.; 40223000
|
|
IF PASTERROR=0 THEN 40224000
|
|
BEGIN COMMENT ORIGINAL ERROR ON MASS STORAGE; 40225000
|
|
PASTERROR~1; 40226000
|
|
COMMENT TOTALUNITERROR~ * + 1; 40227000
|
|
UTABLEENTRY.UNITRETRY~1; 40228000
|
|
END ELSE 40229000
|
|
BEGIN COMMENT RECURRENT ERROR ON MASS STORAGE; 40230000
|
|
IF NOT BOOLEAN(UTABLEENTRY.UNITRETRY) THEN 40231000
|
|
GO SETERRORBITS; 40232000
|
|
IF (PASTERROR~* + 1)>10 THEN COMMENT THERE HAVE 40233000
|
|
BEEN 10 TRIES; 40234000
|
|
BEGIN 40235000
|
|
PASTERROR~0; 40236000
|
|
UTABLEENTRY.UNITRETRY ~0; 40237000
|
|
GO SETERRORBITS; 40238000
|
|
END; 40239000
|
|
END; 40240000
|
|
UTABLEENTRY.UNITERRORFIELD ~ PASTERROR; 40241000
|
|
UTABLEENTRY.UNITIOBUSY~0; 40242000
|
|
UNIT[U]~UTABLEENTRY; 40243000
|
|
STARTIO(U); 40244000
|
|
GO EXIT; 40245000
|
|
SETERRORBITS: 40246000
|
|
PASTERROR~ * + 1; 40247000
|
|
DELINKTOGGLE~TRUE; % PREVENTS DELINKING AT WRAPUP TIME 40248000
|
|
UTABLEENTRY.UNITERROR~1; 40249000
|
|
IF FIRSTUNIT[MPXINDEX]=NULL THEN 40251000
|
|
GO WRAPUP ELSE 40252000
|
|
GO DONEWIO; 40253000
|
|
END; 40254000
|
|
UNITTYPETEST: 40255000
|
|
COMMENT ****************** NEEDS PATCH FOR BUFFERED PRINTER; 40256000
|
|
OK: COMMENT CHECK WHETHER YOU CAN START NEW I/O ON SAME UNIT; 40257000
|
|
UTABLEENTRY.UNITIOBUSY~0; 40258000
|
|
UNIT[U]~UTABLEENTRY; 40259000
|
|
IF FIRSTUNIT[MPXINDEX]=NULL THEN 40260000
|
|
NOWAIT: COMMENT NO UNIT WAITING FOR CHANNEL; 40261000
|
|
BEGIN 40262000
|
|
DELINK(IOQUE,FIRSTIO[U],U); 40263000
|
|
DELINKTOGGLE~TRUE; 40264000
|
|
IF FIRSTIO[U]!NULL THEN 40265000
|
|
STARTIO(U) ELSE 40266000
|
|
RESETBUSYBITS: 40267000
|
|
UTABLEENTRY.UNITIOBUSY~0; 40268000
|
|
GO WRAPUP; 40269000
|
|
END; 40270000
|
|
DONEWIO: COMMENT DO NEW I/O FOR UNIT WAITING FOR CHANNEL; 40271000
|
|
NEWIO(MPXINDEX); 40272000
|
|
IF PASTERROR!0 THEN GO WRAPUP; 40273000
|
|
IF NEXT(IOQUE,U)=NULL THEN GO RESETBUSYBITS; 40274000
|
|
WAITCHANNELQUE[MPXINDEX]~ 40275000
|
|
WAITCHANNELQUE(0&IOPATHWORD(U,UTABLEENTRY.UNITMPXD, 40276000
|
|
UTABLEENTRY.UNITMPXI)); 40277000
|
|
UTABLEENTRY.UCHANWAIT~1; 40278000
|
|
WRAPUP: 40279000
|
|
COMMENT CLOCK THE OPERATION OFF 40280000
|
|
IOTIME[USER @ (IOCB).IDNO]~ * + SCANIN(TIMEOFDAYWORD); 40281000
|
|
IF CURRENTERROR=0 AND 40282000
|
|
(NOT DELINKTOGGLE) THEN DELINK(IOQUE,FIRSTIO[U],U); 40283000
|
|
UTABLEENTRY.UNITERRORFIELD~ PASTERROR; 40284000
|
|
USER @(IOCB).USERIOFINISH~1; 40284500
|
|
UNIT[U]~UTABLEENTRY; 40285000
|
|
IF BOOLEAN(IOCW.IOREADBIT) THEN COMMENT READ OPERATION; 40287000
|
|
BEGIN % COMPUTING NO OF WORDS READ 40288000
|
|
WORDCOUNT ~ABS(RD.RDMEMADDR- 40289000
|
|
((AREADESC@(IOCB)).ADDRESSF+1)); 40290000
|
|
IF ( UNTTYPE=MAGTAPE1 OR UNTTYPE=MAGTAPCLUSTER1) AND 40291000
|
|
NOT BOOLEAN(IOCW.IOBACKWARD) THEN 40292000
|
|
RD.RDCHRCNT~RD.RDCHRCNT-1; 40293000
|
|
RD.WORDCOUNTF~WORDCOUNT; 40299000
|
|
END; 40300000
|
|
IF CURRENTERROR!0 AND PASTERROR=1 THEN 40301000
|
|
BEGIN % ERROR FOR THE FIRST TIME FOR THIS I/O 40302000
|
|
USER@(IOCB).IOERRORRECOVERY~1; 40303000
|
|
FORK(IOERROR,RD); 40304000
|
|
GO EXIT; 40305000
|
|
END; 40309000
|
|
40310000
|
|
MISC @ ( IOCB ) ~ RD; 40311000
|
|
IF UNTTYPE=CONN THEN% 40312000
|
|
IF INPUT(IOCW) THEN LINKINTOKEYINQ% 40312100
|
|
ELSE IF (SEVNT@IOCB).TAG=1 THEN CAUSE(EVNT@IOCB)% 40312200
|
|
ELSE LINKINTOSPOUTQ% 40312300
|
|
ELSE% 40312400
|
|
CAUSE(EVNT @ IOCB); 40313000
|
|
EXIT: 40314000
|
|
END IOFINISH; 40315000
|
|
PROCEDURE STATUS (COUNT); INTEGER COUNT; % *** NOTE PARAMETER 40316000
|
|
COMMENT STATUS INTERROGATES ALL THE PERIPHERAL UNITS. IT COMPARES THE 40317000
|
|
NEWSTATUS WITH OLDSTATUS AND NOTES STATUS CHANGE CORRESPONDING40318000
|
|
TO EACH UNIT. IT CHECKS CURRENT STATE OF THE UNIT TO DETERMINE40319000
|
|
WHAT SHOULD BE DONE.IF A UNIT GOES NOT READY IT SETS 40320000
|
|
UNITNOTREADY IN UNIT TABLE. IF UNIT GOES READY IT RESETS 40321000
|
|
UNITNOTREADY. IF A UNIT WAS A USER AND THEN WENT READY, 40322000
|
|
IT CALLS STARTIO. 40323000
|
|
40324000
|
|
IF AN UNASSIGNED UNIT GOES READY, STATUS BRANCHES ON UNIT TYPE:40325000
|
|
RIATE ACTION ON THE RESULT. 40328000
|
|
FOR CARD READER IT CALLS INDEPENDENTRUNNER TO RUN CONTROLCARD 40329000
|
|
PROCESS AND MARKS UINFO TABLE APPROPRIATELY. 40330000
|
|
40331000
|
|
FOR TAPE, STATUS CALLS READALABEL; 40332000
|
|
BEGIN 40333000
|
|
REAL BITNO, % BIT # IN STATUS FIELD(32:32) 40334000
|
|
VECTORNO, % STATUS VECTOR # 40335000
|
|
U, % LOGICAL UNIT # 40336000
|
|
NRDLBLP, % # OF READALABEL PROCESSES 40337000
|
|
TEMP, % TEMPORARY 40337010
|
|
UNT; % UNIT TABLE ENTRY FOR UNIT[U] 40337020
|
|
40338000
|
|
BOOLEAN NEWSTATUS, % RESULT OF INTERROGATE 40339000
|
|
OLDSTATUS, % OLD STATUS OF CURRENT VECTOR 40340000
|
|
STATUSMASK, % TO MASK OUT UNITS ALREADY NOTED40341000
|
|
SAVESTATUS, % USED TO CONTROL READALABEL 40342000
|
|
BITWORD; % RELEVANT BIT # IN NEWSTATUS 40343000
|
|
LAYOUT BITSETL(BITNO:1~1); 40344000
|
|
LABEL FILENOTREADY,ENDOFREADY,SCRATCH,READALABEL2; 40350000
|
|
LABEL ENDOFUNIT,HR,PRG,UFU; 40351000
|
|
INTEGER STATEUS ; % *** FOR MONITOR ONLY 40352000
|
|
MONITOR JACKMONITOR(STATEUS); 40353000
|
|
MONITOR BOBMONITOR(NEWSTATUS,OLDSTATUS); 40353010
|
|
LABEL L;L:IF SIMULATING THEN BEGIN DISALLOW;SETINTERVALTIMER;PAUSE END; 40354000
|
|
STATEUS~STATEUS; % *** FOR MONITOR ONLY 40355000
|
|
40356000
|
|
VECTORNO~-1; 40357000
|
|
WHILE VECTORNO~VECTORNO+1{MAXVECTORNO 40358000
|
|
DO 40359000
|
|
BEGIN 40360000
|
|
OLDSTATUS~OLDSTATUSWORD[VECTORNO]; 40361000
|
|
% KLUDGE 40362000
|
|
OLDSTATUS~OLDSTATUS OR TRUE; 40363000
|
|
STATUSMASK~FALSE; 40364000
|
|
SAVESTATUS~BOOLEAN(REAL(NOT FALSE)); 40365000
|
|
WHILE REAL((NEWSTATUS~BOOLEAN(SCANIN(0& 40366000
|
|
USTATUSWORD(VECTORNO,,,)))OR STATUSMASK)AND SAVESTATUS) 40367000
|
|
! REAL(OLDSTATUS) 40368000
|
|
DO 40369000
|
|
BEGIN 40370000
|
|
U~VECTORNO|32+((BITNO~ 40371000
|
|
FIRSTONE(REAL(NEWSTATUS EQV NOT OLDSTATUS))-1)-1); 40372000
|
|
IF U>MAXUNIT THEN GO TO UFU; 40373000
|
|
WHILE BOOLEAN(UNT~READLOCK(1,UNIT[U])) DO; 40374000
|
|
40375000
|
|
BITWORD~FALSE&BITSETL(); 40376000
|
|
IF REAL(NEWSTATUS)<REAL(OLDSTATUS) THEN 40377000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%% UNIT NOT READY 40378000
|
|
OLDSTATUS~OLDSTATUS AND NOT BITWORD; 40379000
|
|
IF UNT.UNITTYPE=DISKFILE THEN 40380000
|
|
BEGIN 40381000
|
|
% CALL STEVE 40382000
|
|
END; 40383000
|
|
IF BOOLEAN(UNT.UNITASSIGNED)THEN 40384000
|
|
BEGIN % USER 40385000
|
|
IF NOT BOOLEAN(UNT.UINREWIND) THEN 40386000
|
|
IF NOT BOOLEAN(UNT.UNITNOTREADY)THEN 40387000
|
|
BEGIN 40388000
|
|
NOTREADYMSG(UNT);% 40389000
|
|
UNT.UNITNOTREADY~1; 40390000
|
|
END; 40391000
|
|
% CLOSED NO REWIND 40392000
|
|
END ELSE 40393000
|
|
% NO USER 40394000
|
|
BEGIN 40395000
|
|
UNT.ULOCKED~0; 40396000
|
|
FILENOTREADY: 40397000
|
|
UNT.UERRORSTATUSBITS~0; 40398000
|
|
UNT.UNITNOTREADY~1; 40399000
|
|
IF UINFOW[U].TAG!0 THEN 40400000
|
|
BEGIN 40401000
|
|
FORGETSPACE(UINFOW[U].ADDRESSF); 40402000
|
|
UINFOW[U]~0; 40403000
|
|
END; 40404000
|
|
END; 40405000
|
|
UNIT[U]~UNT; 40406000
|
|
STATUSMASK~STATUSMASK AND NOT BITWORD; 40407000
|
|
END ELSE 40408000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%% UNIT READY 40409000
|
|
OLDSTATUS~OLDSTATUS OR BITWORD; 40410000
|
|
UNT.UNITNOTREADY~0; 40411000
|
|
40412000
|
|
IF BOOLEAN(UNT.UNITASSIGNED) THEN 40413000
|
|
BEGIN % USER 40414000
|
|
STATUSMASK~STATUSMASK OR BITWORD; 40415000
|
|
40416000
|
|
UNT.UINREWIND~0; 40417000
|
|
UNIT[U]~UNT; 40418000
|
|
STARTIO(U); 40419000
|
|
GO TO ENDOFUNIT 40420000
|
|
END; 40421000
|
|
% UNIT NOT ASSIGNED 40422000
|
|
IF BOOLEAN(UNT.UINREWIND) THEN 40423000
|
|
IF BOOLEAN(UNT.ULOCKED) OR 40424000
|
|
BOOLEAN(UNT.USAVED) THEN 40425000
|
|
BEGIN 40426000
|
|
UNT.UINREWIND~0; 40427000
|
|
HR: 40428000
|
|
IF BOOLEAN(UNT.USAVED)THEN BITWORD~FALSE; 40429000
|
|
GO TO FILENOTREADY 40430000
|
|
END ELSE 40431000
|
|
IF BOOLEAN(UNT.UTOBEPURGED) THEN 40432000
|
|
BEGIN % PURGE THE FILE 40433000
|
|
UNT.UINREWIND~0; 40434000
|
|
PRG: 40435000
|
|
UNT.UTOBEPURGED~1; 40436000
|
|
WHILE BOOLEAN(TEMP~READLOCK(1,PRGT)) DO; 40437000
|
|
IF TEMP>0 THEN PRGT~TEMP+2 ELSE 40438000
|
|
BEGIN 40439000
|
|
PRGT~2; 40440000
|
|
FORK(PURGIT,U); 40441000
|
|
END; 40442000
|
|
END ELSE 40443000
|
|
BEGIN 40443010
|
|
UNT.UINREWIND~0; 40444000
|
|
IF BOOLEAN(UNT.ULABELLED) OR 40444010
|
|
BOOLEAN(UNT.USCRATCH)THEN GO ENDOFREADY;40444020
|
|
END; 40444030
|
|
IF BOOLEAN(UNT.USAVED) THEN GO TO ENDOFREADY; 40445000
|
|
IF BOOLEAN(UNT.ULOCKED)THEN GO FILENOTREADY; 40446000
|
|
IF BOOLEAN(UNT.UTOBEPURGED)THEN GO TO PRG; 40447000
|
|
STATUSMASK~STATUSMASK OR BITWORD; 40448000
|
|
CASE UNT.UNITTYPE OF 40449000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40450000
|
|
BEGIN % NO UNIT 040451000
|
|
UFU: 40452000
|
|
UFUMSG(UNT);% 40453000
|
|
OLDSTATUS~OLDSTATUS AND NOT BITWORD; 40454000
|
|
STATUSMASK~STATUSMASK AND NOT BITWORD; 40455000
|
|
UNT.UNITNOTREADY~0; 40456000
|
|
IF U{MAXUNIT THEN UNIT[U]~UNT; 40457000
|
|
END; 40458000
|
|
BEGIN % DISK FILE 140459000
|
|
% CALL STEVE 40460000
|
|
END; 40461000
|
|
BEGIN % SNGL LINE CNTL 240462000
|
|
% CALL MIKE -- UNIT WENT WRITE READY 40462100
|
|
END; 40468000
|
|
; % UNASSIGNED 340469000
|
|
BEGIN % PAPER TAPE RDR 440470000
|
|
UNT.ULABELLED~1; 40471000
|
|
END; 40472000
|
|
40473000
|
|
40474000
|
|
BEGIN % PAPER TAPE PCH 540475000
|
|
SCRATCH: 40476000
|
|
UNT.UERRORSTATUSBITS~0; 40477000
|
|
UNT.UNITSTATE~0; 40478000
|
|
UNT.USCRATCH~1; 40479000
|
|
IF UINFOW[U].TAG!0 THEN 40480000
|
|
BEGIN 40481000
|
|
FORGETSPACE(UINFOW[U].ADDRESSF); 40482000
|
|
UINFOW[U]~0; 40483000
|
|
END; 40484000
|
|
% CHECK FOR BACKUP MESAGE PENDING 40485000
|
|
END; 40486000
|
|
40487000
|
|
GO TO SCRATCH; % LINE PRINTER I 640488000
|
|
GO TO SCRATCH; % LINE PRNTER II 740489000
|
|
40490000
|
|
; % UNASSIGNED 840491000
|
|
BEGIN % CARD READER 940492000
|
|
UNT.UNITASSIGNED~1; 40493000
|
|
UNIT[U]~UNT; 40494000
|
|
STATUSMASK~STATUSMASK OR BITWORD; 40495000
|
|
FORK(CONTROLCARD,U); 40496000
|
|
40497000
|
|
40498000
|
|
END; 40499000
|
|
GO TO SCRATCH; % CARD PUNCH I 1040500000
|
|
GO TO SCRATCH; % CARD PUNCH II 1140501000
|
|
; % UNASSIGNED 1240502000
|
|
BEGIN % MAG TAPE I 1340503000
|
|
TEMP~1; 40504000
|
|
READALABEL2: 40505000
|
|
WHILE BOOLEAN(NRDLBLP~READLOCK(1,RDLBLP))DO;40506000
|
|
IF ONES(NRDLBLP)}MAXRDLBLP THEN 40507000
|
|
BEGIN 40508000
|
|
OLDSTATUS~OLDSTATUS AND NOT BITWORD; 40509000
|
|
SAVESTATUS~SAVESTATUS&BITSETL(0); 40510000
|
|
END ELSE 40511000
|
|
BEGIN 40512000
|
|
UNT.UERRORSTATUSBITS~0; 40513000
|
|
UNT.UNITSTATE~0; 40514000
|
|
UNT.UNITASSIGNED~1; 40515000
|
|
FORK(READALABEL,0&RDLBL(BITNO~FIRSTONE( 40516000
|
|
REAL(NOT BOOLEAN(NRDLBLP)).RF), 40517000
|
|
TEMP,U)); 40518000
|
|
NRDLBLP~*&BITSETL(); 40519000
|
|
END; 40520000
|
|
RDLBLP~NRDLBLP; 40521000
|
|
STATUSMASK~STATUSMASK OR BITWORD; 40522000
|
|
END; 40523000
|
|
BEGIN % MAG TAPE II 1440524000
|
|
TEMP~2; 40525000
|
|
GO TO READALABEL2 40526000
|
|
END; 40527000
|
|
BEGIN % MAG TAPE III 1540528000
|
|
TEMP~3; 40529000
|
|
GO TO READALABEL2 40530000
|
|
END; 40531000
|
|
;;;;; ;;;;; ;;; % UNASSIGNED 16-2840532000
|
|
BEGIN % CLUSTER I 2940533000
|
|
TEMP~1; 40534000
|
|
GO TO READALABEL2 40535000
|
|
END; 40536000
|
|
BEGIN % CLUSTER II 3040537000
|
|
TEMP~2; 40538000
|
|
GO TO READALABEL2 40539000
|
|
END; 40540000
|
|
BEGIN % CLUSTER III 3140541000
|
|
TEMP~3; 40542000
|
|
GO TO READALABEL2 40543000
|
|
END; 40544000
|
|
END; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40545000
|
|
40546000
|
|
ENDOFREADY: 40547000
|
|
END; %%%%%% READY 40548000
|
|
UNIT[U]~UNT; 40549000
|
|
ENDOFUNIT: 40549100
|
|
END; COMMENT END OF SINGLE UNIT HANDLING; 40550000
|
|
40551000
|
|
OLDSTATUSWORD[VECTORNO]~OLDSTATUS AND NOT TRUE; 40552000
|
|
END; COMMENT END OF VECTORNO LOOP; 40553000
|
|
40554000
|
|
IF SIMULATING THEN BEGIN GO TO L; 40555000
|
|
STACKINUSE[NAME(STATUS).ADRCPLF-IRPCWSTARTPLACE]~0 ; HOLD; 40556000
|
|
END; 40556500
|
|
END STATUS; 40557000
|
|
40558000
|
|
SAVE REFERENCE PROCEDURE DISKIO(CORE,INDEX,SIZE,DISK,MASK,DISKIOEVENT); 40559000
|
|
VALUE INDEX,SIZE,DISK,MASK; 40560000
|
|
INTEGER INDEX,SIZE,DISK,MASK; 40561000
|
|
ARRAY CORE[*]; 40562000
|
|
EVENT DISKIOEVENT; 40563000
|
|
COMMENT DISKIO CONVERTS SOFTWARE DISK ADDRESS INTO HARDWARE 40564000
|
|
DISK ADDRESS AND MAKES UP IOCW. IT MAKES UP AREADESC 40565000
|
|
AND INSERTS INTO IOCB. IT THEN CALLS IOREQUEST. 40566000
|
|
CORE -ARRAY DESCRIPTOR FOR CORE AREA. 40567000
|
|
THIS AREA MUST BE NON-OVERLAYABLE. SEE DISKWAIT FOR 40568000
|
|
AN EXAMPLE OF HOW TO GUARENTEE THIS. 40569000
|
|
INDEX -STARTING INDEX FOR CORE AREA DESCRIPTOR. 40570000
|
|
SIZE NO. OF WORDS TO TRANSFER. 40571000
|
|
NOTE: AREA MUST BE AT LEAST SIZE+1 WORDS LONG. 40572000
|
|
DISK -SOFTWARE DISK ADDRESS. 40573000
|
|
MASK MASK OF STANDARD I/O CONTROL WORD 40574000
|
|
(E.G. @440 READ , NO PROTECT, SINGLE TAG 40575000
|
|
@461 READ, MEMORY PROTECT, PROGRAM TAG) 40576000
|
|
DISKIOEVENT -EVENT TO BE CAUSED ON I/O COMPLETE; 40577000
|
|
BEGIN 40578000
|
|
WORD ARRAY AREA[*]; COMMENT WE BUILD THIS FOR IOCB; 40579000
|
|
REFERENCE IOCB; COMMENT POINTS TO IOCB; 40580000
|
|
REAL USER; COMMENT USER ITEM OF IOCB; 40581000
|
|
WORD ARRAY ARA = CORE[*]; COMMENT USED FOR PBIT; 40582000
|
|
USER := 0 & USERL(SNR,STACK[SNR,PRIORITYPLACE],DISK.EUNOF); 40583000
|
|
AREA~AREA & 40584000
|
|
ARRAYDESCL(3, SIZE, CORE.ADDRESS + INDEX); 40585000
|
|
AREA[0] ~ * & IOCWL(MASK, COMMENT PRESERVE THE TAG OF AREA[0];40586000
|
|
DECIMAL(DISK.ADDRESSF)); 40587000
|
|
IOREQUEST(IOCB~IOQUE(USER,-0,REFERENCE(AREA),DISKIOEVENT)); 40588000
|
|
RETURN(WORD(IOCB)); 40589000
|
|
END DISKIO; 40590000
|
|
SAVE PROCEDURE DISKWAIT(CORE,INDEX,SIZE,DISK,MASK); 40591000
|
|
VALUE INDEX,SIZE,DISK,MASK; 40592000
|
|
INTEGER INDEX,SIZE,DISK,MASK; 40593000
|
|
ARRAY CORE[*]; 40594000
|
|
COMMENT DISKWAIT CALLS PROCEDURE DISKIO WITH PASSED PARAMETERS AND 40595000
|
|
A LOCAL EVENT AND WAITS ON THE EVENT. 40596000
|
|
WAITS ON IT. 40597000
|
|
CORE -ARRAY DESCRIPTOR FOR CORE AREA. 40598000
|
|
INDEX -STARTING INDEX FOR CORE AREA DESCRIPTOR. 40599000
|
|
SIZE NO. OF WORDS TRANFER. 40600000
|
|
NOTE: AREA MUST BE AT LEAST SIZE+1 WORDS LONG. 40601000
|
|
DISK -SOFTWARE DISK ADDRESS 40602000
|
|
MASK MASK OF STANDARD I/O CONTROL WORD 40603000
|
|
@461 READ, MEMORY PROTECT, PROGRAM TAG) ; 40604000
|
|
BEGIN 40605000
|
|
REFERENCE IOCB; 40606000
|
|
EVENT DISKIOEVENT; 40607000
|
|
MAKEPRESENTANDSAVE(CORE); %MAKE TEMPORARILY SAVE FOR I/O 40608000
|
|
IOCB~ DISKIO(CORE,INDEX,SIZE,DISK,MASK,DISKIOEVENT); 40609000
|
|
WAIT(DISKIOEVENT); 40610000
|
|
TURNOVERLAYKEY(CORE.ADDRESSF);%RETURN TO PREVIOUS OLAY STATUS 40611000
|
|
END DISKWAIT; 40612000
|
|
PROCEDURE READALABEL(LINFO);VALUE LINFO;REAL LINFO; 40613000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40614000
|
|
% READALABEL READS VARIOUS MAGNETIC TAPE LABELS AND STUFFS %40615000
|
|
% THE INFORMATION THEY CONTAIN INTO THE LABEL TABLE. %40616000
|
|
% %40617000
|
|
% ALL RETRY ACTION IS ACCOMPLISHED THROUGH IOERROR. %40618000
|
|
% UNEXPECTED IOERROR IS ONLY CALLED FOR MEMORY ERRORS. %40619000
|
|
% A PARITY CONDITION CAUSES THE UNIT TO BE MARKED AS %40620000
|
|
% NOT-READY AND SAVED. %40621000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40622000
|
|
REAL T, % TEMP 40623000
|
|
TAPETYPE~LINFO.PTP, % TAPE TYPE: 1,2,3 40624000
|
|
U~LINFO.UNO, % UNIT # 40625000
|
|
DNSTY, % DENSITY 40626000
|
|
RSLT, % RESULT 40627000
|
|
UNT, % UNIT TABLE ENTRY 40628000
|
|
VECTORNO~U.DIV32F, % VECTOR # 40629000
|
|
BITNO~U.MOD32F+1, % BIT NUMBER IN STATUS VECTOR 40630000
|
|
DNSTYW~IF TAPETYPE=1 % DENSITY WORD 40631000
|
|
THEN 7 ELSE IF TAPETYPE=2 THEN 5 ELSE 8, 40632000
|
|
BITWORD, % UNIT POSITION IN STATUS WORD 40633000
|
|
N1, % NAME 1 40634000
|
|
N2, % NAME 2 40635000
|
|
PTPN, % PHYSICAL TAPE # 40636000
|
|
WRTRNG, % WRITE RING 40644000
|
|
LBLTP, % LABELTYPE 40645000
|
|
PRTY~1; % PARITY 40646000
|
|
BOOLEAN TPMRK, % TAPEMARK 40647000
|
|
OLDSTATUS; % OLD STATUS WORD 40648000
|
|
ARRAY LABELAREA[IF TAPETYPE=1 THEN 11 ELSE 15], 40649000
|
|
LABLOCK[*], 40649010
|
|
NAMES[6]; 40650000
|
|
LABEL WRAPUP,NOTREADY,RTRY,PARITYL,SCRATCH,READALABL,SCRATCHL, 40651000
|
|
ASCRATCH,BUSASI,USASIQ,CMN,RETRY,BCKSPC; 40652000
|
|
LAYOUT BITSETL(BITNO:1~1); 40653000
|
|
DEFINE NNL(S,E) = (IF TAPETYPE=1 THEN S ELSE E)#; 40653010
|
|
POINTER PVOL1,PNMS,PNMU; 40654000
|
|
MONITOR BOBMONITOR(RSLT,T); 40654010
|
|
BITWORD~0&BITSETL(); 40655000
|
|
LABELAREA[0].IOSTANDARDFIELD~TAPETEST; 40656000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,4"4F01") 40657000
|
|
).RDERROR)AND BOOLEAN(4"1B0FE"))!0 THEN GO TO NOTREADY; 40658000
|
|
% MASK, REWINDING, DENSITY, WLO, BOT 40658100
|
|
GETUNT; 40659000
|
|
UNT.UWRITERING~WRTRNG~RSLT.RDWLOOREOF+1; 40660000
|
|
UNIT[U]~UNT; 40661000
|
|
BITNO~DNSTY~(IF ONES(T~RSLT.RDDENSITY)!1THEN T ELSE REAL(T=2));40662000
|
|
% KLUDGE 40662010
|
|
RETRY: 40663000
|
|
LABELAREA[0]~0&IOCWL(TAPEREWIND,0); 40664000
|
|
PUTUNT(0,0,2,1); 40665000
|
|
GETOLDS; 40666000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,4"4101") 40667000
|
|
).RDERROR)AND BOOLEAN(4"1BEFE"))!0 THEN GO TO NOTREADY; 40668000
|
|
READALABL: 40669000
|
|
LABELAREA[0]~0&TAPEIOCWL(1,REAL(TAPETYPE=1AND BOOLEAN(PRTY+1)),40670000
|
|
REAL(TAPETYPE!1),DNSTY+4,PRTY); 40671000
|
|
DNSTYW~*&BITSETL(0); 40672000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 40673000
|
|
% ACCEPT ALL ERRORS EXCEPT MEMORY 40674000
|
|
IF RSLT.RD432!0 THEN 40675000
|
|
BEGIN 40676000
|
|
NOTREADY: 40677000
|
|
PUTUNT(1,1,0,0); 40678000
|
|
GETOLDS; 40679000
|
|
% UNIT FAILURE 40680000
|
|
% WRITE TROUBLE LOG 40681000
|
|
GO TO WRAPUP 40682000
|
|
END ELSE 40683000
|
|
IF TAPEPARITY THEN 40684000
|
|
BEGIN 40685000
|
|
IF TAPETYPE=3 THEN GO TO PARITYL; 40686000
|
|
IF NOT(BOOLEAN(PRTY~PRTY+1))THEN GO TO RETRY; 40687000
|
|
IF DNSTY!0 THEN 40688000
|
|
BEGIN 40689000
|
|
DNSTY~BITNO~FIRSTONE(DNSTYW)-1; 40690000
|
|
GO TO RETRY; 40691000
|
|
END; 40692000
|
|
PARITYL: 40693000
|
|
PARITYRWLMSG(U);% 40694000
|
|
PUTUNT(1,1,0,0); 40695000
|
|
GETOLDS; 40696000
|
|
END ELSE 40697000
|
|
IF REAL(BOOLEAN(RSLT.RDERROR)AND WERRORS)!0 THEN GO NOTREADY 40698000
|
|
ELSE 40699000
|
|
IF BOOLEAN(RSLT.RDBLANKTAPE) THEN 40700000
|
|
BEGIN % PROBLEMS AT 40701000
|
|
IF DNSTY=2 AND DNSTYW!0 THEN % 200 BPI 40702000
|
|
BEGIN 40703000
|
|
PRTY~1; 40704000
|
|
DNSTY~BITNO~FIRSTONE(DNSTYW)-1; 40705000
|
|
GO TO RETRY 40706000
|
|
END; 40707000
|
|
% IT IS A BLANK TAPE 40708000
|
|
% GET SERIAL NUMBER AND STICK IT IN PTPN 40709000
|
|
SCRATCH: 40710000
|
|
LABELAREA[0].IOSTANDARDFIELD~TAPEREWIND; 40711000
|
|
PUTUNT(0,0,2,1); 40712000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,4"4101") 40713000
|
|
).RDERROR)AND BOOLEAN(4"1BEFE"))!0 THEN GO TO NOTREADY; 40714000
|
|
IF TAPETYPE=1 THEN REPLACE POINTER(LABELAREA[1],6) BY 40715000
|
|
6"VOL1",PTPN FOR 6 DIGITS,6"0X0X0X0X"FOR 18,6"650", 40716000
|
|
% TRANSLATION NEEDED 40716010
|
|
6" "FOR 48,6"0" 40717000
|
|
ELSE REPLACE POINTER(LABELAREA[1],8) BY 40718000
|
|
8"VOL1",PTPN FOR 6,8"0X0X0X" FOR 18,8"650", 40719000
|
|
8" "FOR 48,8"0"; 40720000
|
|
LABELAREA[0]~0&IOCWDETAILL(,,REAL(TAPETYPE!1), 40721000
|
|
0&IOCWTAPEL(,1,,1,,)); 40722000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0)))THEN 40723000
|
|
GO TO NOTREADY; 40724000
|
|
LABELAREA[0]~0&IOCWTAPEL(REAL(SIMULATING)-2,,,1); % TAPE MARK 40725000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 40726000
|
|
GO TO NOTREADY; 40727000
|
|
SCRATCHL: 40728000
|
|
UINFOW[U]~PTPN; 40729000
|
|
LABELAREA[0].IOSTANDARDFIELD~TAPEREWIND; 40730000
|
|
PUTUNT(0,0,4,1); 40731000
|
|
GETOLDS; 40731010
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,4"4101") 40732000
|
|
).RDERROR)AND BOOLEAN(4"1BEFE"))!0 THEN GO TO NOTREADY; 40733000
|
|
GO TO WRAPUP 40734000
|
|
END ELSE 40735000
|
|
IF TPMRK AND TPMRK~BOOLEAN(RSLT.RDWLOOREOF) THEN GO TO PARITYL 40736000
|
|
ELSE GO TO READALABL; 40737000
|
|
IF BOOLEAN(RSLT.RDINCREC)THEN 40737010
|
|
IF RSLT.RDMEMADDR-LABELAREA.ADDRESSF>LABELAREA.LENGTHF THEN 40737020
|
|
T~(RSLT.RDMEMADDR-LABELAREA.ADDRESSF)+(IF RSLT.RDCHRCNT=0 THEN 40737030
|
|
0 ELSE 1); 40737040
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40738000
|
|
% IF GET TO HERE HAVE READ FIRST RECORD (IT MAY BE WRONG %40739000
|
|
% SIZE HOWEVER) %40740000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40741000
|
|
IF TAPETYPE!1 THEN 40742000
|
|
IF PVOL1~POINTER(LABELAREA[1],8)=8"VOL1"THEN % USASI LABEL 40743000
|
|
BUSASI: 40744000
|
|
IF REAL(USYSN,2)=(IF TAPETYPE=1 THEN 6"65" ELSE 8"65") THEN 40745000
|
|
IF REAL(ULSL,1)=(IF TAPETYPE=1 THEN 6"0"ELSE 8"0")THEN 40746000
|
|
IF REAL(USYST,1)=0 AND REAL(UMFID,6)IS(IF TAPETYPE=1 THEN 40747000
|
|
6"0X0X0X" ELSE 8"0X0X0X") THEN % SCRATCH 40747010
|
|
ASCRATCH: 40748000
|
|
IF BOOLEAN(WRTRNG)THEN GO TO SCRATCHL ELSE % WRITE RING 40749000
|
|
BEGIN 40750000
|
|
% SCRATCH TAPE, NO WRITE RING 40751000
|
|
PUTUNT(1,1,4,0); 40752000
|
|
GETOLDS; 40753000
|
|
GO TO WRAPUP; 40754000
|
|
END 40755000
|
|
ELSE GO TO USASIQ 40756000
|
|
ELSE % STANDARD 40757000
|
|
IF REAL(ULSL,1)!(IF TAPETYPE=1 THEN 6"1"ELSE 8"1") THEN 40757010
|
|
GO TO USASIQ ELSE % STANDARD 40757020
|
|
IF REAL(USYST,1)=0 THEN GO TO USASIQ ELSE % SCRATCH 40758000
|
|
IF REAL(USYST,1)=1 THEN 40759000
|
|
BEGIN % "USER" TAPE 40760000
|
|
IF TAPETYPE=1 THEN 40761000
|
|
BEGIN 40762000
|
|
REPLACE (PNMS~POINTER(NAMES,8))+1 BY UMFID FOR 17 40763000
|
|
WITH BCLTOEBC[*]; 40764000
|
|
SCAN PNMU:PNMS+1 FOR N1:17 WHILE!8" " 40765000
|
|
END ELSE 40766000
|
|
REPLACE PNMU:(PNMS~POINTER(NAMES,8))+1 BY UMFID FOR N1:17 40767000
|
|
WHILE!8" "; 40768000
|
|
REPLACE PNMS BY N1~17-N1 FOR 1 CORRECTLY; 40769000
|
|
IF REAL(UMFID,1)=(IF TAPETYPE=1 THEN 6"0"ELSE 4"00") THEN 40769010
|
|
BEGIN N1~0;PNMU~PNMS END; 40769020
|
|
PTPN~REAL(UVSN,6); 40770000
|
|
%%%%% READ HDR1 40771000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0) 40772000
|
|
).RDERROR)AND BOOLEAN(3"376776"))!0 THEN 40773000
|
|
IF RSLT.RD432!0 THEN GO TO NOTREADY ELSE 40774000
|
|
IF TAPEPARITY THEN GO TO PARITYL ELSE GO TO NOTREADY; 40775000
|
|
IF BOOLEAN(RSLT.RDWLOOREOF) THEN 40776000
|
|
BEGIN % TAPE MARK 40777000
|
|
BCKSPC: 40778000
|
|
LABELAREA[0]~0&IOCWSPACEL(,1,1); 40779000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 40780000
|
|
GO TO NOTREADY; 40781000
|
|
GO TO USASIQ; 40782000
|
|
END; 40783000
|
|
IF REAL(PHDR1,4)!(IF TAPETYPE=1 THEN 6"HDR1" ELSE 8"HDR1") OR 40784000
|
|
NOT(REAL(USYSL,6)IS(IF TAPETYPE=1 THEN 6" B6500" ELSE 40784010
|
|
8" B6500")) THEN GO TO BCKSPC; 40784020
|
|
IF TAPETYPE=1 THEN 40785000
|
|
BEGIN 40786000
|
|
REPLACE PNMU+1 BY UFID FOR 17 WITH BCLTOEBC[*]; 40787000
|
|
SCAN PNMU+1 FOR N2:17 WHILE!8" "; 40788000
|
|
END ELSE 40789000
|
|
REPLACE PNMU+1 BY UFID FOR N2:17 WHILE!8" "; 40790000
|
|
REPLACE PNMU BY N2~17-N2 FOR 1 CORRECTLY; 40791000
|
|
IF BOOLEAN(WRTRNG) THEN 40792000
|
|
IF INTEGER(UEDT,5){TODAYSDATE THEN GO TO SCRATCH ELSE% 40793000
|
|
IF RETTOG AND LBLTP!0 THEN% 40794000
|
|
BEGIN 40795000
|
|
RETMSG(UNT);% 407959904079600?
|
|
RETMSG(UNT);% 40796000
|
|
END; 40797000
|
|
LABLOCK~*&ARRAYDESCL(0,7+(N1+N2+9)DIV 6,0); 40800000
|
|
REPLACE PNMU~POINTER(LABLOCK[7],8) BY 1 FOR 1 CORRECTLY, 40802000
|
|
REAL(N1!0)+1 FOR 1 CORRECTLY,PNMS FOR N1+N2+2; 40803000
|
|
UINFOP[U,*]~WORD(LABLOCK); 40803010
|
|
LCNTRL~0&LEBCNTRL(5,3"30000",,1,,1,LBLTP,,UNT.UNITTYPE); 40804000
|
|
LGEN1~0&GENEALOGY1(INTEGER(UGNRTN,4),INTEGER(UVRSN,2), 40805000
|
|
1,INTEGER(URLNMBR,4)); 40806000
|
|
LGEN2~0&GENEALOGY2(,INTEGER(UCDT,5)); 40807000
|
|
LMISC~0&LMISCL(INTEGER(UBCNT,6),INTEGER(URCNT,7)); 40808000
|
|
%%%%% HDR2 40809000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0) 40810000
|
|
).RDERROR)AND BOOLEAN(3"376776"))!0 THEN 40810050
|
|
BEGIN 40811000
|
|
CMN: 40812000
|
|
FORGETSPACE(UINFOW[U].ADDRESSF); 40813000
|
|
IF RSLT.RD432!0 THEN GO TO NOTREADY ELSE 40815000
|
|
IF TAPEPARITY THEN GO TO PARITYL ELSE GO TO NOTREADY; 40816000
|
|
GO TO BCKSPC; % PREMATURE TPMRK 40816010
|
|
END; 40817000
|
|
IF REAL(PHDR2,4)!(IF TAPETYPE=1 THEN 6"HDR2" ELSE 8"HDR2") 40818000
|
|
THEN GO TO CMN; 40818010
|
|
LBLK1~0&BLOCKING1(RCRDFRMT,,,INTEGER(URL,5),INTEGER(UBL,5)); 40819000
|
|
LCNTRL.DENSITYL~DNSTY~REAL(UDNSTY,1)+4; 40820000
|
|
LCNTRL.LPARITY~PRTY~REAL(UPRTY,1); 40821000
|
|
LCNTRL.EXTFORML~REAL(UFORM,1); 40822000
|
|
LBLK2.MINRECSZL~INTEGER(UMRL,5); 40823000
|
|
LCNTRL.FPRTCTD~REAL(INTEGER(UOFS,2)!0); 40824000
|
|
PUTUNT(0,0,1,0); 40825000
|
|
END ELSE 40826000
|
|
IF REAL(USYST,1)=2 THEN % SYSTEM TAPE 40827000
|
|
BEGIN 40828000
|
|
IF NOT(REAL(UMFID,6)IS(IF TAPETYPE=1 THEN 6"SYSTEM" ELSE 40829000
|
|
8"SYSTEM")) THEN GO TO USASIQ; 40829010
|
|
LBLTP~7; 40830000
|
|
GO TO BUSASI 40831000
|
|
END ELSE 40832000
|
|
IF REAL(USYST,1)=3 THEN % BACKUP 40833000
|
|
BEGIN 40834000
|
|
IF NOT(REAL(UMFID,6)IS(IF TAPETYPE=1 THEN 6"BACKUP" ELSE 40835000
|
|
8"BACKUP")) THEN GO TO USASIQ; 40835010
|
|
LBLTP~6; 40836000
|
|
PBTONMSG(UNT);% 40837000
|
|
GO TO BUSASI 40838000
|
|
END ELSE 40839000
|
|
% LIBRARY TAPE 40839050
|
|
ELSE % NON B6500 40840000
|
|
IF REAL(ULSL,1)=(IF TAPETYPE=1 THEN 6"1" ELSE 8"1") THEN 40840100
|
|
BEGIN 40840120
|
|
PTPN~REAL(UVSN,6); 40840130
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0) 40840140
|
|
).RDERROR)AND BOOLEAN(3"376776"))!0 THEN 40840150
|
|
IF RSLT.RD432!0 THEN GO TO NOTREADY ELSE 40840160
|
|
IF TAPEPARITY THEN GO TO PARITYL ELSE GO TO NOTREADY; 40840170
|
|
IF BOOLEAN(RSLT.RDWLOOREOF)THEN GO TO BCKSPC; 40840180
|
|
IF REAL(PHDR1,4)!(IF TAPETYPE=1 THEN 6"HDR1"ELSE 8"HDR1") OR 40840190
|
|
NOT(REAL(USYSL,6)IS(IF TAPETYPE=1 THEN 6"BUR " ELSE 40840200
|
|
8"BUR ")) THEN GO TO BCKSPC; 40840210
|
|
%%%%% B3500 USASI LABEL 40840220
|
|
IF TAPETYPE=1 THEN 40840230
|
|
BEGIN 40840240
|
|
REPLACE (PNMS~POINTER(NAMES,8))+1 BY B35MFID FOR 6 40840250
|
|
WITH BCLTOEBC[*]; 40840260
|
|
SCAN PNMU:PNMS+1 FOR N1:6 WHILE!8" "; 40840270
|
|
IF REAL(PNMS+1,1)=8"0"THEN BEGIN N1~6;PNMU~PNMS END; 40840280
|
|
REPLACE PNMU+1 BY B35FID FOR 8 WITH BCLTOEBC[*]; 40840290
|
|
SCAN PNMU+1 FOR N2:8 WHILE!8" "; 40840300
|
|
END ELSE 40840310
|
|
BEGIN 40840320
|
|
REPLACE PNMU:(PNMS~POINTER(NAMES,8))+1 BY B35MFID FOR N1:6 40840330
|
|
WHILE ! 8" "; 40840340
|
|
IF REAL(PNMS+1,1)=8"0"THEN BEGIN N1~6;PNMU~PNMS END; 40840350
|
|
REPLACE PNMU+1 BY B35FID FOR N2:8 WHILE!8" "; 40840360
|
|
END;; 40840370
|
|
REPLACE PNMS BY N1~6-N1 FOR 1 CORRECTLY; 40840380
|
|
REPLACE PNMU BY N2~8-N2 FOR 1 CORRECTLY; 40840390
|
|
IF BOOLEAN(WRTRNG)THEN 40840400
|
|
IF INTEGER(UEDT,5){TODAYSDATE THEN GO TO SCRATCH ELSE 40840410
|
|
IF RETTOG THEN% 40840420
|
|
BEGIN 40840430
|
|
RETMSG(UNT);% 40840440
|
|
END; 40840450
|
|
LABLOCK~*&ARRAYDESCL(0,5+(N1+N2+9)DIV 6,0); 40840460
|
|
REPLACE PNMU~POINTER(LABLOCK[5],8) BY 1 FOR 1 CORRECTLY, 40840470
|
|
REAL(N1!0)+1 FOR 1 CORRECTLY,PNMS FOR N1+N2+2; 40840480
|
|
UINFOP[U,*]~WORD(LABLOCK); 40840490
|
|
LCNTRL~0&LEBCNTRL(5,,,1,DNSTY+4,1,4,,UNT.UNITTYPE); 40840500
|
|
% RECHECK 40840505
|
|
LGEN1~0&GENEALOGY1(INTEGER(UGNRTN,4),INTEGER(UVRSN,2), 40840510
|
|
1,INTEGER(URLNMBR,4)); 40840520
|
|
LGEN2~0&GENEALOGY2(,INTEGER(UCDT,5)); 40840530
|
|
LMISC~0&LMISCL(INTEGER(UBCNT,6),INTEGER(URCNT,7)); 40840540
|
|
END ELSE 40840550
|
|
ELSE 40841000
|
|
BEGIN % NON-USASI 40842000
|
|
USASIQ: 40843000
|
|
T~REAL(PVOL1,8); 40843010
|
|
PUTUNT(0,1,0,1); 40844000
|
|
GETOLDS; 40845000
|
|
LABELAREA[0]~0&IOCWL(TAPEREWIND,0); 40846000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,4"4101") 40847000
|
|
).RDERROR)AND BOOLEAN(4"1BEFE"))!0 THEN GO TO NOTREADY; 40848000
|
|
END 40849000
|
|
ELSE % TAPETYPE 1 40850000
|
|
IF PVOL1~POINTER(LABELAREA[1],6)=6"VOL1"THEN % USASI 40851000
|
|
GO TO BUSASI 40852000
|
|
ELSE % NON USASI 40853000
|
|
IF PVOL1=6" LABEL " THEN % B5500 LABEL 40854000
|
|
BEGIN 40855000
|
|
PTPN~REAL(LVSN,5); 40855010
|
|
IF LFID=6"FILE000"THEN LBLTP~11 ELSE 40856000
|
|
IF LMFID=6"X0X0X0X" OR LFID=6" X"THEN GO TO ASCRATCH ELSE 40856010
|
|
IF LMFID=6"PBTMCP "AND LFID=6"BACK-UP"THEN LBLTP~10; 40857000
|
|
IF BOOLEAN(WRTRNG) THEN 40858000
|
|
IF INTEGER(LEDT,5){TODAYSDATE AND LBLTP=0 THEN GO SCRATCH ELSE 40859000
|
|
IF RETTOG OR LBLTP!0 THEN% 40860000
|
|
BEGIN 40861000
|
|
RETMSG(UNT);% 40862000
|
|
END; 40863000
|
|
REPLACE (PNMS~POINTER(NAMES,8))+1 BY LMFID FOR 7 40864000
|
|
WITH BCLTOEBC[*]; 40865000
|
|
SCAN PNMU:PNMS+1 FOR N1:7 WHILE!8" "; 40866000
|
|
REPLACE PNMS BY N1~7-N1 FOR 1 CORRECTLY; 40867000
|
|
IF REAL(LMFID,7)=0 THEN BEGIN PNMU~PNMS;N1~0 END; 40867010
|
|
REPLACE PNMU+1 BY LFID FOR 7 WITH BCLTOEBC[*]; 40868000
|
|
SCAN PNMU+1 FOR N2:7 WHILE!8" "; 40869000
|
|
REPLACE PNMU BY N2~7-N2 FOR 1 CORRECTLY; 40870000
|
|
LABLOCK~*&ARRAYDESCL(0,5+(N1+N2+9)DIV 6,0); 40871000
|
|
REPLACE PNMU~POINTER(LABLOCK[5],8) BY 1 FOR 1 CORRECTLY, 40873000
|
|
REAL(N1!0)+1 FOR 1 CORRECTLY,PNMS FOR N1+N2+2; 40874000
|
|
UINFOP[U,*]~WORD(LABLOCK); 40874010
|
|
LCNTRL~0&LEBCNTRL(5,,PRTY,1,DNSTY+4,1,2,2,UNT.UNITTYPE); 40875000
|
|
% RECHECK 40875010
|
|
LGEN1~0&GENEALOGY1(INTEGER(LCYCLE,2),,1,INTEGER(LREEL,3)); 40876000
|
|
LGEN2~0&GENEALOGY2(,INTEGER(LCDT,5)); 40877000
|
|
LMISC~0&LMISCL(INTEGER(LBCNT,5),INTEGER(LRCNT,7)); 40878000
|
|
IF T!0 THEN 40878010
|
|
BEGIN % USERS PORTION 40878020
|
|
LMISC~SET(LMISC,46); 40878030
|
|
LMISC.BCNTL~T; 40878040
|
|
END; 40878050
|
|
PUTUNT(0,0,1,0); 40879000
|
|
END 40880000
|
|
ELSE GO TO USASIQ; 40881000
|
|
WRAPUP: 40882000
|
|
DIVORCEMOM(LABLOCK); 40882010
|
|
CAUSE(FINDINPUTEVENT); 40882015
|
|
WHILE BOOLEAN(T~READLOCK(1,RDLBLP)) DO; 40883000
|
|
BITNO~LINFO.PNO; 40884000
|
|
RDLBLP~T&BITSETL(0); 40885000
|
|
END READALABEL; 40886000
|
|
PROCEDURE PURGIT(U);VALUE U;REAL U; 40887000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40888000
|
|
% PURGIT PURGES TAPES. IT IS CALLED FROM KEYIN OR STATUS. %40889000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%40890000
|
|
REAL UNT, 40891000
|
|
T, 40892000
|
|
RSLT, 40893000
|
|
BITNO, 40894000
|
|
BITWORD, 40895000
|
|
VECTORNO, 40896000
|
|
PTPN; 40897000
|
|
LABEL STRT,NOTREADY,PARITYL,WRAPUP; 40898000
|
|
ARRAY LABELAREA[IF SCHANNEL THEN 11 ELSE 15]; 40899000
|
|
BOOLEAN OLDSTATUS; 40900000
|
|
LAYOUT BITSETL(BITNO:1~1); 40901000
|
|
STRT: 40902000
|
|
VECTORNO~U.DIV32F; 40903000
|
|
BITNO~U.MOD32F+1; 40904000
|
|
BITWORD~0&BITSETL(); 40905000
|
|
GETUNT; 40906000
|
|
UNT.UNITASSIGNED~1; 40907000
|
|
UNIT[U]~UNT; 40908000
|
|
IF PTPN~(IF BOOLEAN(UNT.ULABELLED)THEN LGEN2.SERIALN ELSE 40909000
|
|
UINFO[U])=0 THEN; 40910000
|
|
% MESSAGE FOR SERIAL NUMBER 40911000
|
|
LABELAREA[0]~0&IOCWL(TAPEREWIND,0); 40912000
|
|
PUTUNT(1,0,2,1); 40913000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 40914000
|
|
BEGIN 40915000
|
|
NOTREADY: 40916000
|
|
PUTUNT(1,1,0,0); 40917000
|
|
GETOLDS; 40918000
|
|
% UNIT FAILURE 40919000
|
|
% WRITE TROUBLE LOG 40920000
|
|
GO TO WRAPUP 40921000
|
|
END ELSE 40922000
|
|
IF SCHANNEL THEN REPLACE POINTER(LABELAREA[1],6) BY 40923000
|
|
6"VOL1",PTPN FOR 6 DIGITS,6"0X0X0X0X"FOR 18,6"650", 40924000
|
|
6" "FOR 48,6"0" 40925000
|
|
ELSE REPLACE POINTER(LABELAREA[1],8) BY 40926000
|
|
8"VOL1",PTPN FOR 6 DIGITS,8"0X0X0X"FOR 18,8"650", 40927000
|
|
8" "FOR 48,8"0"; 40928000
|
|
LABELAREA[0]~0&TAPEIOCWL(,,REAL(NCHANNEL),,1); 40929000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 40931000
|
|
IF RSLT.RD432!0 THEN GO TO NOTREADY ELSE 40932000
|
|
IF TAPEPARITY THEN 40933000
|
|
BEGIN 40934000
|
|
PARITYL: 40935000
|
|
PARITYRWLMSG(UNT);% 40936000
|
|
PUTUNT(1,1,0,0); 40937000
|
|
GETOLDS; 40938000
|
|
GO TO WRAPUP; 40939000
|
|
END ELSE 40940000
|
|
GO TO NOTREADY; 40941000
|
|
LABELAREA[0]~0&IOCWTAPEL(REAL(SIMULATING)-2,,,1); % TAPE MARK 40942000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 40943000
|
|
GO TO NOTREADY; 40944000
|
|
LABELAREA[0]~0&IOCWL(TAPEREWIND,0); 40945000
|
|
PUTUNT(1,0,4,1); 40946000
|
|
IF UINFOW[U].TAG!0 THEN FORGETSPACE(UINFOW[U].ADDRESSF); 40947000
|
|
UINFOW[U]~PTPN; 40948000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 40949000
|
|
GO TO NOTREADY; 40950000
|
|
WRAPUP: 40951000
|
|
WHILE BOOLEAN(T~READLOCK(1,PRGT)) DO; 40952000
|
|
IF PRGT~T-2>0 THEN 40953000
|
|
IF U~MASKSEARCH(@1400,@207067400,UNIT)}0 THEN GO TO STRT; 40954000
|
|
WHILE BOOLEAN(T~READLOCK(1,PRGT)) DO; 40955000
|
|
PRGT~0; 40956000
|
|
END PURGIT; 40957000
|
|
40958000
|
|
REAL PROCEDURE SPACEOF(IOCW);VALUE IOCW;REAL IOCW; 40959000
|
|
BEGIN 40960000
|
|
ARRAY LABELAREA[5]; 40961000
|
|
REAL RSLT, 40962000
|
|
U~IOCW.UNITNUM; 40963000
|
|
LABELAREA[0]~IOCW&IOCWL(TAPESPACE); 40964000
|
|
WHILE REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH, 40965000
|
|
ERAH(UNEXP,4"E81")).RDERROR)AND BOOLEAN(3"377776"))=0 DO; 40966000
|
|
SPACEOF~IF RSLT IS 4"E81"OR RSLT IS 4"201"THEN 0 ELSE RSLT; 40967000
|
|
END SPACEOF; 40968000
|
|
PROCEDURE CLOSERR(RSLT,U);VALUE RSLT,U;REAL RSLT,U; 40969000
|
|
BEGIN 40970000
|
|
BOOLEAN OLDSTATUS; 40971000
|
|
REAL 40972000
|
|
CLOSERROR, 40973000
|
|
VECTORNO~U.DIV32F, 40974000
|
|
BITWORD, 40975000
|
|
BITNO~U.MOD32F+1, 40976000
|
|
UNT; 40977000
|
|
LAYOUT BITSETL(BITNO:1~1); 40978000
|
|
MONITOR BOBMONITOR(CLOSERROR,U); 40979000
|
|
CLOSERROR~*; 40980000
|
|
U~*; 40981000
|
|
BITWORD~0&BITSETL(); 40982000
|
|
PUTUNT(1,1,0,0); 40983000
|
|
GETOLDS; 40984000
|
|
PARITYRWLMSG(U); 40985000
|
|
END CLOSERR; 40986000
|
|
PROCEDURE LIBMAIN(MFID);VALUE MFID;POINTER MFID; 40987000
|
|
BEGIN 40988000
|
|
ARRAY DHEADER[31], 40989000
|
|
TAPEBLOCK[905], 40990000
|
|
LEB[9]; 40991000
|
|
LABEL XIT; 40992000
|
|
REAL 40993000
|
|
UNT, 40994000
|
|
RSLT, 40995000
|
|
DISKADDRESS~DISKFILEHEADERS[0,10], 40996000
|
|
FRSLT, 40997000
|
|
FINDWORD, 40998000
|
|
IOCW, 40999000
|
|
U; 41000000
|
|
MONITOR BOBMONITOR(U,RSLT,DISKADDRESS); 41001000
|
|
LEBC.FXD~1; 41002000
|
|
REPLACE POINTER(LEB[5],8) BY 41003000
|
|
1 FOR 1 CORRECTLY, 41005000
|
|
2 FOR 1 CORRECTLY, 41006000
|
|
MFID+2 FOR REAL(MFID+2,1)+1, 41007000
|
|
7 FOR 1 CORRECTLY, 41008000
|
|
8"FILE000"; 41008100
|
|
U~17; 41009000
|
|
% KLUDGE 41009100
|
|
IF FRSLT~FINDWORD.REPVALF=OFV THEN GO TO XIT; 41010000
|
|
GETUNT; 41011000
|
|
UNIT[U]~UNT&UNITL(0,0,3,0); 41011100
|
|
IF NOT MAGTAPE(UNT.UNITTYPE)THEN IOTERMINATE; 41012000
|
|
IOCW~0&TAPEIOCWL(1,0,0,5,1); 41013000
|
|
IOCW.UNITNUM~U; 41013100
|
|
THRU 3 DO IF BOOLEAN(RSLT~SPACEOF(IOCW))THEN 41014000
|
|
BEGIN CLOSERR(RSLT,U); GO TO XIT END; 41015000
|
|
DHEADER[0]~IOCW; 41016000
|
|
IF BOOLEAN(RSLT~WAITIO(DHEADER,USAH,ERAH(UNEXP,4"401")))THEN 41017000
|
|
IF NOT(RSLT.RDERROR IS 4"401")THEN 41017010
|
|
BEGIN CLOSERR(RSLT,U);GO TO XIT END; 41018000
|
|
WHILE TRUE DO 41021000
|
|
BEGIN 41022000
|
|
TAPEBLOCK[0]~IOCW; 41023000
|
|
IF REAL(BOOLEAN((RSLT~WAITIO(TAPEBLOCK,USAH,ERAH(UNEXP,3"3001")41024000
|
|
)).RDERROR) AND BOOLEAN(3"374776"))!0 THEN 41025000
|
|
BEGIN CLOSERR(RSLT,U);GO XIT END; 41026000
|
|
IF BOOLEAN(RSLT.RDWLOOREOF)THEN GO TO XIT; 41027000
|
|
DISKWAIT( 41028000
|
|
TAPEBLOCK 41029000
|
|
,0 41030000
|
|
,FRSLT~IF BOOLEAN(RSLT.RDINCREC)THEN RSLT.WORDCOUNTF ELSE 41031000
|
|
900 41032000
|
|
, DISKADDRESS 41033000
|
|
,DISKWRITE 41034000
|
|
); 41035000
|
|
DISKADDRESS~*+FRSLT DIV 30; 41036000
|
|
END; 41037000
|
|
XIT: 41038000
|
|
GETUNT; 41038050
|
|
UNT.UNITASSIGNED~0; 41038100
|
|
UNIT[U]~UNT; 41038200
|
|
STOP; 41039000
|
|
END LIBMAIN; 41040000
|
|
% START OF KEYIN AND ASSOCIATED PROCEDURES 44000000
|
|
SAVE REAL PROCEDURE DELTA(P1,P2); VALUE P1,P2; WORD P1,P2; 44000100
|
|
BEGIN 44000110
|
|
REAL S; 44000120
|
|
DEFINE DEFAULT =8#; 44000125
|
|
IF S~P1.SZF=P2.SZF THEN 44000130
|
|
DELTA~(S~(IF S=0 THEN DEFAULT ELSE 48/(S|2))) 44000140
|
|
| (P2.INDEXSTF-P1.INDEXSTF)+P2.BYTEF-P1.BYTEF; 44000150
|
|
END DELTA; 44000160
|
|
SAVE PROCEDURE BILDCDEFID(FIDREF,P);VALUE FIDREF; REFERENCE FIDREF; 44000200
|
|
POINTER P;% 44000210
|
|
BEGIN 44000220
|
|
ARRAY CDEFIDAREA = FIDREF[*];% 44000230
|
|
INTEGER I~3, FIDS;% 44000240
|
|
POINTER T~P;% 44000250
|
|
DEFINE% 44000300
|
|
BILDCDEFIDPOINTER= FIDREF~*&STRINGDESCRIPTOR(*,,,*,,,EBCDIC, 44000310
|
|
,FIDREF.ADDRESSF+KFPSCRATCHWORDSZ)#, 44000312
|
|
NUMBEROFIDS = REAL(POINTER(CDEFIDAREA[1],*),1)#,% 44000320
|
|
NUMBEROFNAMES= REAL(POINTER(CDEFIDAREA[2],*),1)#,% 44000330
|
|
NUMBEROFCHRS = REAL(POINTER(CDEFIDAREA[I],*),1)#,% 44000340
|
|
ANAME=POINTER(CDEFIDAREA[I+1],*)FOR NUMBEROFCHRS, SLASH#, 44000350
|
|
ENDBCFDEF=0#;% 44000390
|
|
BILDCDEFIDPOINTER;% 44000400
|
|
IF FIDS~NUMBEROFIDS=1 THEN% 44000410
|
|
THRU NUMBEROFNAMES DO% 44000420
|
|
BEGIN% 44000430
|
|
REPLACE T:T BY ANAME;% 44000440
|
|
I~*+NUMBEROFCHRS+1;% 44000450
|
|
END ELSE% 44000460
|
|
REPLACE T:T BY FIDS FOR 3 DIGITS,8" FILE IDENTIFIERS. "; 44000470
|
|
P~T-1;% 44000480
|
|
END BILDCDEFID;% 44000490
|
|
PROCEDURE JOBMESSER(STKNO,POINTTOBUF); VALUE STKNO;% 44000500
|
|
INTEGER STKNO; POINTER POINTTOBUF;% 44000510
|
|
BEGIN% 44000520
|
|
POINTER P~POINTTOBUF;% 44000535
|
|
REFERENCE FIDREF;% 44000550
|
|
REAL X, Y;% 44000560
|
|
DEFINE% 44000600
|
|
COMPILER = 8"CMPLR "#,% 44000630
|
|
CORE= COLON, PERCENTAGE(X)#,% 44000640
|
|
PROCTIME= COLON, PERCENTAGE(Y)#,% 44000650
|
|
GETCORE= X~(STACK[STKNO,COREPLACE]/MEMMAX)|1000#,% 44000660
|
|
GETPROCTIME= Y~STACK[STKNO,PROCTIMEPLACE]/(TIMECORRFACT|60)#, 44000670
|
|
CFND= MYCODEFILENAME(STKNO)#,% 44000680
|
|
PRIORITY = AT, STACK[STKNO,PRIORITYPLACE] FOR 2 DIGITS#, 44000710
|
|
JOBIDENT = STKNO FOR 4 DIGITS, BLANK#,% 44000720
|
|
STATUS = BLANK FOR STATUSSZ#,% 44000730
|
|
ENDJOBMESSDEF=0#;% 44000790
|
|
FIDREF~CFND;% 44000800
|
|
REPLACE P:P BY HOME, JOBIDENT, COMPILER;% 44000850
|
|
BILDCDEFID(FIDREF,P);% 44000860
|
|
GETCORE;% 44000930
|
|
GETPROCTIME;% 44000940
|
|
REPLACE P:P BY PRIORITY, CORE, PROCTIME, STATUS, ETX;% 44000950
|
|
POINTTOBUF~P;% 44000980
|
|
END JOBMESSER;% 44000990
|
|
REAL PROCEDURE GETUNITNUM(UNITMNEM,UNITNUM);VALUE UNITMNEM,UNITNUM; 44001000
|
|
REAL UNITMNEM, UNITNUM; 44002000
|
|
BEGIN 44003000
|
|
REAL I; 44004000
|
|
LABEL XIT ;44005000
|
|
REAL Q; 44006000
|
|
Q ~ MNEMLIM | MNEMSZ; 44007000
|
|
IF ABS(UNITNUM)>MAXUNIT THEN ELSE 44008000
|
|
FOR I ~ 0 STEP MNEMSZ UNTIL Q DO 44009000
|
|
IF REAL(POINTER(MNEMONIC[I],*),MNEMSZ)=UNITMNEM THEN 44010000
|
|
IF UNIT[I~UNITBL[TI(I/MNEMSZ),UNITNUM]].UNITTYPECNTRF= 44011000
|
|
UNITNUM THEN 44012000
|
|
BEGIN 44013000
|
|
GETUNITNUM~I; 44014000
|
|
GO TO XIT; 44015000
|
|
END ELSE 44016000
|
|
I~Q; 44017000
|
|
GETUNITNUM~-UNITNUM; 44018000
|
|
XIT: 44019000
|
|
END GETUNITNUM; 44020000
|
|
PROCEDURE MIXUPDATE;% 44021000
|
|
BEGIN% 44022000
|
|
ARRAY TMPBUF[*];% 44023000
|
|
REFERENCE PREVLASTITEM,% 44023200
|
|
TMPENTRY~NULL;% 44023300
|
|
BOOLEAN BLANKPIC~MIXQHD=NULL;% 44023400
|
|
POINTER LINE;% 44023500
|
|
INTEGER I,% 44023700
|
|
LINENO;% 44023800
|
|
DEFINE% 44024000
|
|
44024001
|
|
ENDMIXUPDEF=0#;% 44024990
|
|
FOR I~0 STEP 1 UNTIL MAXSTACKS DO% 44026000
|
|
IF USINGSTACK(I) THEN% 44026100
|
|
IF D2STACKIS(I) THEN% 44026200
|
|
IF MCPNOTUSINGSTACK(I) THEN% 44026300
|
|
BEGIN% 44026400
|
|
TMPENTRY~JOBREF(I);% 44026500
|
|
LINE~POINTER((TMPBUF~LNBUF@TMPENTRY)[1],8);44026600
|
|
IF HAVENTSUSPENDED(I) THEN% 44026700
|
|
BEGIN% 44026800
|
|
JOBMESSER(LNID@TMPENTRY,LINE);% 44026900
|
|
END;% 44027000
|
|
LINENO~LINENO+1;% 44027100
|
|
LNDESC@(TMPENTRY)~CURRENTIMAGE(% 44027200
|
|
LINENO MOD MAXLNS,LINENO DIV MAXLNS); 44027300
|
|
INSERT(MIXQ(TMPENTRY));% 44027400
|
|
END% 44027800
|
|
ELSE% 44027900
|
|
ELSE BEGIN% 44028000
|
|
END;% 44028200
|
|
IF BLANKPIC THEN ELSE REARRANGE(MIXQ(PREVLASTITEM));% 44032000
|
|
END MIXUPDATE;% 44034000
|
|
PROCEDURE FILEMESS(IOCB,UNITNO);VALUE UNITNO;REAL UNITNO; 44035000
|
|
REFERENCE IOCB; 44036000
|
|
BEGIN 44037000
|
|
REAL U, UE, I;% 44038000
|
|
ARRAY UI[*]; WORD UINFOREF=UI;% 44038100
|
|
WORD FIDREF;% 44038200
|
|
ARRAY MSGAREA[*];REFERENCE MSGAREAREF=MSGAREA;% 44039000
|
|
POINTER SPAM;% 44040000
|
|
DEFINE% 44041000
|
|
LSTB= 44#,% LEAST SIGNIFICANT TEST BIT 44042000
|
|
UNOTREADY= U.UNITNOTREADY#,% 44043000
|
|
NOTREADY= 8" NOT READY"#,% 44044000
|
|
UINUSE= BOOLEAN(U.UNITASSIGNED)#,% 44045000
|
|
INUSE= 8"I"#,% 44046000
|
|
REELNO= UI[GENEALOGY1].REEL FOR 3 DIGITS#,% 44048000
|
|
GENEALOGY1= 1#,% 44048100
|
|
UNITLABELED= U.ULABELLED#,% 44049000
|
|
LABELED= 8" "#,% 44050000
|
|
UNITSCRATCH= U.USCRATCH#,% 44051000
|
|
SCRATCH= 8" SCRATCH"#,% 44052000
|
|
URWORLOCK= REAL(BOOLEAN(U.UINREWIND) OR BOOLEAN(U.ULOCKED))#, 44053000
|
|
RWORLOCK= 8"RW/L"#,% 44054000
|
|
MIX= SNR FOR 4 DIGITS#,% 44055000
|
|
ENDFILMESDEF=0#;% 44060000
|
|
MSGAREAREF~ KBUF @ IOCB; 44061000
|
|
U~UNIT[UNITNO]; 44062000
|
|
UINFOREF~UINFO[UNITNO];% 44065000
|
|
FIDREF~0&ARRAYDESCL(3,UINFOREF.LENGTHF-(I~((I~UI[0].FXD) 44065100
|
|
-ONES(I.OPTMASK)+KFPSCRATCHWORDSZ)),UINFOREF.ADDRESSF+1); 44065102
|
|
REPLACE SPAM:POINTTOMSGAREA BY HOME, 44066000
|
|
POINTER(MNEMONIC[(U.UNITTYPE)|MNEMSZ],*) FOR MNEMSZ, 44067000
|
|
UE.UNITTYPECNTRF FOR 3 DIGITS; 44068000
|
|
I~0&BITL(% 44069000
|
|
UNOTREADY, 44070000
|
|
URWORLOCK, 44071000
|
|
UNITSCRATCH, 44072000
|
|
UNITLABELED, 44073000
|
|
);% THIS TAKES UP SLACK FROM LSTB TO ZERO 44074000
|
|
CASE (IF I~FIRSTONE(I)-LSTB>0 THEN I ELSE 0) OF 44076000
|
|
BEGIN% CASES 44077000
|
|
;% TEST RESULTED IN ALL ZERO -- SHOULD NEVER HAPPEN 44078000
|
|
44079000
|
|
BEGIN% UNITLABELED 44085000
|
|
BILDCDEFID(FIDREF,SPAM);% 44086000
|
|
REPLACE SPAM:SPAM BY REELNO;% 44086100
|
|
IF UINUSE THEN REPLACE SPAM:SPAM BY MIX;% 44087000
|
|
END; 44088000
|
|
REPLACE SPAM:SPAM BY SCRATCH; 44089000
|
|
REPLACE SPAM:SPAM BY RWORLOCK; 44090000
|
|
REPLACE SPAM:SPAM BY NOTREADY; 44091000
|
|
END CASE; 44092000
|
|
REPLACE SPAM:SPAM BY ETX; 44093000
|
|
SPOUT(IOCB,DISPLAYONPER); 44094000
|
|
END FILEMESS; 44095000
|
|
PROCEDURE KEYIN(COUNT); REAL COUNT; 44096000
|
|
BEGIN 44097000
|
|
REFERENCE IOCB; 44098000
|
|
POINTER P; 44099000
|
|
INTEGER I,J,K,N; 44100000
|
|
INTEGER MSGSZ, 44101000
|
|
POPIN, DEATHS,% 44101100
|
|
ALIM, BLIM, 44102000
|
|
PRESZ, SUFSZ; 44103000
|
|
INTEGER PREFIX, SUFFIX; 44104000
|
|
ARRAY MSGAREA[*]; 44105000
|
|
WORD ARRAY BUFFO[*]; 44106000
|
|
EVENT REPEVNT; WORD REPEVNTWRD = REPEVNT; 44106100
|
|
REAL RSDS; 44107000
|
|
REAL CONNO; 44108000
|
|
INTEGER BITWORD, REPWRD; 44109000
|
|
BOOLEAN SPOED;% 44109100
|
|
REAL TMPTRAC; 44110000
|
|
REFERENCE MSGAREAREF=MSGAREA; 44111000
|
|
LAYOUT SCANL(TYPF=47:2,SYZF=39:FIRSTONE(LINESZ),CHRF=7:8); 44112000
|
|
LABEL IL,FM,UL,OU,FR,OHF,RM,TI,DS,ST,PR,XS,OK,ES,US,AX; 44113000
|
|
LABEL OL,RY,PG,PB,SV,RW,CL ;44114000
|
|
LABEL TF,LD,RN,RD,SF,SO,RO,TOH,TR,DR,WT,WD,WM,PI,EI,LE,TC ;44115000
|
|
LABEL QTOP, CAUZIT, CHECKB, ENDOFMSG, SPOUTIT, ANSREPLY;% 44115100
|
|
DEFINE 44116000
|
|
PIMSG=HOME,8"PI=",POINTER(PIE,8) FOR MAXMSGSZ,LINEERASE,ETX#, 44117000
|
|
EIMSG= BACKSPACE,BACKSPACE,8" EIO",LINEERASE,ETX#,% 44118000
|
|
CHECKUMNEM= I~GETUNITNUM(REAL(P,MNEMSZ), 44119000
|
|
INTEGER(P+MNEMSZ,SUFSZ-MNEMSZ))<0#, 44120000
|
|
CHCKANS= IF CHECKUMNEM THEN BEGIN INVKBD; GO TO ENDOFMSG;END; 44120100
|
|
REPWRD.REPINFOF~I;GO TO ANSREPLY#,% 44120102
|
|
SHIFTBUF=BUFFO~BUFFO&ARRAYDESCL(3,IOCB.LENGTHF-IOCBSIZE, 44121000
|
|
IOCB.ADDRESSF+IOCBSIZE); 44122000
|
|
KBUF @(IOCB)~REFERENCE(BUFFO)#, 44123000
|
|
POINTTOBUFFO= POINTER(BUFFO[1],BYTESZ)#, 44124000
|
|
PNSSZ= 7#,% NUMBER OF PREFIX NO SUFFIX 44125000
|
|
PSSZ= 9#,% PREFIX AND SUFFIX 44125010
|
|
NPSSZ= 17#,% SUFFIX NO PREFIX 44125020
|
|
NPNSSZ= 10#,% NO PREFIX NO SUFFIX 44125030
|
|
NPSORNSSZ= 2#,% SUFFIX OR NO SUFFIX 44125040
|
|
TPNS= 0#,% TOP OF PREFIX NO SUFFIX 44126000
|
|
TPS= BPNS+DICBSZ#,% PREFIX AND SUFFIX 44126010
|
|
TNPS= BPS+DICBSZ#,% SUFFIX NO PREFIX 44126020
|
|
TNPNS= BNPS-DICBSZ|NPSORNSSZ#,% NO PREFIX NO SUFFIX 44126030
|
|
BPNS= DICBSZ|(PNSSZ-1)#,% BOTTOM OF PREFIX NO SUFFIX 44127000
|
|
BPS= TPS+DICBSZ|(PSSZ-1)#,% PREFIX AND SUFFIX 44127010
|
|
BNPS= TNPS+DICBSZ|(NPSSZ-1)#,% SUFFIX NO PREFIX 44127020
|
|
BNPNS= TNPNS+DICBSZ|(NPNSSZ-1)#,% NO PREFIX NO SUFFIX 44127030
|
|
MINREPCDE= 6#, 44132100
|
|
MAXREPCDE= 16#,% 44132110
|
|
STKNUM= PREFIX#, 44132200
|
|
SETTIME= 44132300
|
|
COMMENT PREFIX~TIMEOFDAY-TIMEBASE WAIT FOR TOM 44132320
|
|
TIMEBASE~-1;% 44132330
|
|
SCANOUT(I~(K+J|60+I|3600)|TIMECORRFACT,TIMEOFDAYWORD); 44132340
|
|
COMMENT TIMEBASE~I-PREFIX **** WAIT FOR TOM ALSO; #, 44132360
|
|
SCNUNTEQ(DELIM,LIM)= SCAN P FOR N:LIM UNTIL = DELIM#, 44133000
|
|
NORPLYREQD= HAPPENED(REPEVNT) OR% 44133100
|
|
NOT BOOLEAN(REPLY[STKNUM].[I:1])#,% 44133110
|
|
ALF= 2#,% 44133300
|
|
SPC= 1#,% 44133310
|
|
NUM= 0#,% 44133320
|
|
ENDKEYINDEFINES=0#; 44134000
|
|
SAVE PROCEDURE INVKBD; 44135000
|
|
BEGIN 44136000
|
|
DEFINE 44137000
|
|
INVKBDM=8"INV KBD "#,% 44138000
|
|
D=0#; 44139000
|
|
SHIFTBUF; 44140000
|
|
REPLACE POINTTOBUFFO BY INVKBDM, 44141000
|
|
POINTTOMSGAREA FOR MSGSZ, 44142000
|
|
ETX; 44143000
|
|
SPOUT(IOCB,DISPLAYONKEYER); 44144000
|
|
SPOED~TRUE;% 44144100
|
|
EXIT;% 44144900
|
|
END INVKBD;% 44144990
|
|
SAVE REAL PROCEDURE SCANKY(PP,C); INTEGER C; POINTER PP;% 44145000
|
|
BEGIN% 44145010
|
|
REAL I;% 44145020
|
|
DOUBLE D;% 44145030
|
|
POINTER P~PP;% KLUDGE UNTIL POINTER UPDATE FIXED 44145040
|
|
DEFINE 44145050
|
|
ERROR= 0&SCANL(3)#,% 44145060
|
|
TYPEANDSIZE= 0&SCANL(ALF,C-I)#,% 44145070
|
|
TYPESIZEAND1CHR= REAL(P-I,1)&SCANL(SPC,I)#,% 44145080
|
|
SCNDEFEND=0#;% 44145090
|
|
IF C=0 THEN RETURN(0&SCANL(SPC,1,ETX));% 44145092
|
|
SCAN P:P FOR C:C WHILE=BLANK;% 44145095
|
|
SCAN P FOR I:C WHILE IN EBCDICNUMERIC;% 44145100
|
|
IF I<C THEN% 44145200
|
|
BEGIN% 44145210
|
|
SCAN P:P FOR I:C-(C~I)-1 WHILE = ZERO;% 44145220
|
|
IF I<12 THEN% 44145230
|
|
IF D~DOUBLE(P,I~I+1){MAXNO THEN% 44145240
|
|
BEGIN% 44145250
|
|
P~P+I; PP~P;% 44145260
|
|
RETURN(D);% 44145270
|
|
END;% 44145280
|
|
END% 44145290
|
|
ELSE BEGIN% 44145300
|
|
SCAN P FOR I:C WHILE IN EBCDICALPHABETIC;% 44145310
|
|
IF I<C THEN% 44145320
|
|
BEGIN% 44145330
|
|
PP~P;% 44145340
|
|
RETURN(TYPEANDSIZE);% 44145350
|
|
END% 44145390
|
|
ELSE BEGIN% 44145400
|
|
SCAN P FOR I:C WHILE IN EBCDICSPECIALS;% 44145410
|
|
IF I<C THEN% 44145420
|
|
BEGIN% 44145430
|
|
P~P+I~(C-(C~I));% 44145440
|
|
PP~P;% 44145450
|
|
RETURN(TYPESIZEAND1CHR);% 44145480
|
|
END;% 44145490
|
|
END;% 44145590
|
|
END;% 44145690
|
|
RETURN(ERROR);% 44145900
|
|
END SCANKY;% 44145950
|
|
MONITOR MIKEMONITOR(KEYINLK);KEYINLK~*+1; 44145990
|
|
TMPTRAC~TRACE(TMPTRAC); 44146000
|
|
BUZZCONTROL(KEYINQ); 44147000
|
|
POPIN~POPULATION(KEYINQ);% 44147100
|
|
QTOP: 44148000
|
|
IOCB~NEXTINP~FIRSTINP;% 44148100
|
|
WHILE COUNT>DEATHS DO 44149000
|
|
IF IOCB=NULL THEN% 44149100
|
|
BEGIN% 44149200
|
|
IF POPIN-DEATHS=POPULATION(KEYINQ) THEN% MAYBE *** 44149300
|
|
BEGIN% 44149400
|
|
COUNT~DEATHS~0;% 44149500
|
|
END 44149600
|
|
ELSE GO TO QTOP% 44149800
|
|
END ELSE% 44150000
|
|
BEGIN 44151000
|
|
CAUZIT: 44152000
|
|
DEATHS~*+1;% 44153200
|
|
IF BOOLEAN(RSDS~ MISC @ IOCB ) THEN 44154000
|
|
IF BOOLEAN(RSDS.RDTIMEOUT) THEN% HANDLE TIME-OUT 44155000
|
|
ELSE IF BOOLEAN(RSDS.RDCNTRLCARD) THEN% 44156000
|
|
BEGIN% 44156100
|
|
UNLOCK(KEYINQ);% 44156200
|
|
FORK(CONTROLCARD,IOCB);% 44156300
|
|
SPOED~TRUE;% 44156400
|
|
GO TO ENDOFMSG;% 44156500
|
|
END% 44156900
|
|
ELSE IF BOOLEAN(RSDS.RDOVERFLOW) THEN% 44157000
|
|
BEGIN% 44157100
|
|
END;% 44157900
|
|
DISPLAYONKEYER~RSDS.UNITNOF;% 44160000
|
|
UNLOCK(KEYINQ); 44161000
|
|
MSGAREAREF~KBUF @ IOCB; 44162000
|
|
P~POINTTOMSGAREA; 44163000
|
|
SCAN P:P FOR J:(BUFFS-1)|CHRS WHILE = 8" ";% 44164000
|
|
SCAN P FOR N:J UNTIL = ETX;% 44165000
|
|
IF MSGSZ~J-N=DICBSZ THEN% NO PREFIX AND NO SUFFIX 44166000
|
|
BEGIN 44167000
|
|
I~TNPNS; 44168000
|
|
BLIM~BNPNS; 44169000
|
|
PRESZ~SUFSZ~0; 44170000
|
|
GO TO CHECKB; 44171000
|
|
END 44172000
|
|
ELSE IF MSGSZ<DICBSZ THEN 44173000
|
|
BEGIN 44174000
|
|
INVKBD; 44175000
|
|
GO TO ENDOFMSG; 44176000
|
|
END; 44177000
|
|
ALIM~MAXDICA;% KLUDGE UNTIL WE SYNTAX CHECK DICA REQUESTS 44177900
|
|
FOR I~I STEP DICASZ UNTIL ALIM DO 44178000
|
|
IF P=POINTER(DICA[I],*) FOR DICASZ THEN 44179000
|
|
BEGIN 44180000
|
|
P~P+DICASZ; 44181000
|
|
CASE I/DICASZ OF 44182000
|
|
BEGIN% CASE 44183000
|
|
BEGIN 44184000
|
|
FOR I~0 STEP 1 UNTIL 9 DO CHANNELGUIDE[1]~SET(0,18);% KLUDGE ****** 44184100
|
|
MIXPRINT(MSGAREA);% 44185000
|
|
END; 44186000
|
|
;% SCH 44187000
|
|
;% JOB 44188000
|
|
;% FOR EXPANSION 44189000
|
|
BEGIN 44190000
|
|
%LABELPRINT 44191000
|
|
END; 44192000
|
|
;% PCD 44193000
|
|
;% ;% FOR EXPANSION 44194000
|
|
;% DIR 44195000
|
|
;% EXP 44196000
|
|
END CASE; 44197000
|
|
GO TO ENDOFMSG;% 44198000
|
|
END ; 44199000
|
|
SCAN P FOR J:MSGSZ WHILE IN EBCDICNUMERIC; 44200000
|
|
IF J=MSGSZ THEN% NO PREFIX, BUT MUST HAVE SUFFIX 44201000
|
|
BEGIN% MIGHT ALSO CHECK WHETHER SUFFIX IS ALPHA OR NUMERIC 44202000
|
|
PRESZ~0; 44203000
|
|
SUFSZ~MSGSZ-DICBSZ; 44204000
|
|
I~TNPS; 44205000
|
|
BLIM~BNPS; 44206000
|
|
END 44207000
|
|
ELSE IF J=0 THEN% A NUMBER ONLY 44208000
|
|
BEGIN 44209000
|
|
INVKBD; 44210000
|
|
GO TO ENDOFMSG; 44211000
|
|
END 44212000
|
|
ELSE BEGIN% HAS PREFIX, MAY OR MAY NOT HAVE SUFFIX 44213000
|
|
PREFIX~INTEGER(P,PRESZ~MSGSZ-J); 44214000
|
|
P~P+PRESZ; 44215000
|
|
IF I~ J-DICBSZ<0 THEN 44216000
|
|
BEGIN% A NUMBER FOLLOWED BY ANY ONE NON-NUMERIC CHARACTER 44217000
|
|
INVKBD; 44218000
|
|
GO TO ENDOFMSG; 44219000
|
|
END 44220000
|
|
ELSE IF I=0 THEN% PREFIX, BUT NO SUFFIX 44221000
|
|
BEGIN 44222000
|
|
I~TPNS; 44223000
|
|
BLIM~BPNS; 44224000
|
|
SUFSZ~0; 44225000
|
|
END 44226000
|
|
ELSE BEGIN% PREFIX AND SUFFIX -- MIGHT CHECK SUFFIX TYPE 44227000
|
|
SUFSZ~I; 44234000
|
|
I~TPS; 44235000
|
|
BLIM~BPS; 44236000
|
|
END; 44237000
|
|
END; 44238000
|
|
CHECKB: 44239000
|
|
FOR I~I STEP DICBSZ UNTIL BLIM DO 44240000
|
|
IF P=POINTER(DICB[I],*) FOR DICBSZ THEN 44241000
|
|
BEGIN 44242000
|
|
IF (I~I/DICBSZ)}MINREPCDE AND I{MAXREPCDE THEN 44242100
|
|
BEGIN REPEVNTWRD~WORDSTACK[STKNUM,REPLYEVENTPLACE];% TIL COMPILER FIXED 44242105
|
|
IF NORPLYREQD THEN 44242190
|
|
BEGIN 44242200
|
|
INVKBD; 44242210
|
|
GO TO ENDOFMSG; 44242220
|
|
END % 44242290
|
|
ELSE% 44242300
|
|
REPWRD~I;% 44242400
|
|
END;% UNTIL COMPILER FIXED 44242500
|
|
P~P+DICBSZ; 44243000
|
|
CASE I OF 44244000
|
|
BEGIN% CASE 44245000
|
|
TI: ; 44246000
|
|
ST: ; 44247000
|
|
XS: ; 44248000
|
|
ES: ; 44249000
|
|
DS: ; 44251000
|
|
RM: ; 44252000
|
|
OK: ; 44253000
|
|
IL: BEGIN% 44254000
|
|
CHCKANS;% 44254100
|
|
END;% 44254990
|
|
FM: BEGIN% 44255000
|
|
CHCKANS;% 44255100
|
|
END;% 44255990
|
|
UL: BEGIN% 44256000
|
|
CHCKANS;% 44256100
|
|
END; 44256990
|
|
OU: BEGIN% 44257000
|
|
I~MNEMLIM|MNEMSZ;% 44257100
|
|
FOR J~0 STEP MNEMSZ UNTIL I DO% 44257200
|
|
IF POINTER(MNEMONIC[J], *)= P FOR MNEMSZ THEN 44257300
|
|
BEGIN REPWRD.REPINFOF~J/MNEMSZ;GO ANSREPLY;END;44257400
|
|
INVKBD;% 44257500
|
|
GO TO ENDOFMSG;% 44257600
|
|
END;% 44257990
|
|
FR: ; 44258000
|
|
OHF: ; 44259000
|
|
US: BEGIN% 44259100
|
|
IF (I~SCANKY(P,SUFSZ)).TYPF=NUM THEN% 44259200
|
|
IF SUFSZ=0 OR I>MAXGENNO THEN% 44259300
|
|
ELSE IF (J~SCANKY(P,SUFSZ)).TYPF=SPC AND J.SZF=1 44259400
|
|
AND J.CHRF=COLON THEN% 44259410
|
|
IF (J~SCANKY(P,SUFSZ)).TYPF=NUM THEN% 44259500
|
|
IF J>MAXVERNO THEN% 44259600
|
|
ELSE BEGIN% 44259610
|
|
REPWRD~REPWRD&GENEALOGY1(I,J);% 44259620
|
|
GO TO ANSREPLY;% 44259630
|
|
END% 44259690
|
|
ELSE ELSE ELSE% 44259700
|
|
IF P=8"LATEST" FOR SUFSZ THEN GO TO ANSREPLY; 44259710
|
|
INVKBD;% 44259800
|
|
END;% 44259900
|
|
AX: ; 44260000
|
|
PR: ; 44261000
|
|
OL: BEGIN 44263000
|
|
IF CHECKUMNEM THEN INVKBD 44264000
|
|
ELSE FILEMESS(IOCB,I); 44265000
|
|
GO TO ENDOFMSG; 44266000
|
|
END; 44267000
|
|
RY: BEGIN 44268000
|
|
IF CHECKUMNEM THEN 44269000
|
|
BEGIN INVKBD; GO TO ENDOFMSG; END 44270000
|
|
ELSE UPDATEUNITBITSTABLE(OLDSTATUSWORD,I); 44271000
|
|
END; 44272000
|
|
PG: BEGIN% 44273000
|
|
IF CHECKUMNEM THEN BEGIN INVKBD;GO ENDOFMSG;END;44273100
|
|
PURGIT(I);% 44273200
|
|
END;% 44273900
|
|
PB: ; 44274000
|
|
SV: BEGIN% 44275000
|
|
IF CHECKUMNEM THEN BEGIN INVKBD;GO ENDOFMSG;END;44275100
|
|
UNIT[I].USAVED~1;% 44275200
|
|
END;% 44275990
|
|
RW: ; 44276000
|
|
CL: ; 44277000
|
|
TR: BEGIN% 44279000
|
|
K~SUFSZ;% 44279100
|
|
IF (I~SCANKY(P,SUFSZ)).TYPF=NUM THEN% 44279200
|
|
IF K=6 THEN% 44279300
|
|
BEGIN% 44279310
|
|
K~I MOD 100;% 44279320
|
|
I~I DIV 100;% 44279330
|
|
END;% 44279390
|
|
IF J~I MOD 100<60 AND I~I DIV 100<24 AND K<60 THEN 44279400
|
|
BEGIN% 44279410
|
|
SETTIME;% 44279420
|
|
GO TO WT;% 44279480
|
|
END;% 44279490
|
|
INVKBD;% 44279500
|
|
END;% 44279900
|
|
DR: BEGIN% 44280000
|
|
REPLACE P+SUFSZ BY P:P FOR SUFSZ;% 44280010
|
|
IF JULIT(P) THEN% 44280100
|
|
BEGIN% 44280200
|
|
DATIT(P);% 44280300
|
|
REPLACE POINTER(DATE[*],8) BY% 44280310
|
|
P UNTIL = ETX,NUL;% 44280320
|
|
TODAYSDATE~INTEGER(P+2,5);% 44280330
|
|
GO TO WD;% 44280390
|
|
END;% 44280400
|
|
INVKBD;% 44280490
|
|
END;% 44280500
|
|
RD: ; 44281000
|
|
SF: ; 44282000
|
|
SO: ; 44283000
|
|
RO: ; 44284000
|
|
TC: BEGIN 44285000
|
|
IF (I~SCANKY(P,SUFSZ)).TYPF=NUM THEN% 44286000
|
|
IF SUFSZ=0 THEN% 44286100
|
|
BEGIN% 44286200
|
|
TMPTRAC~I;% 44286300
|
|
GO TO ENDOFMSG;% 44286500
|
|
END ELSE% 44286900
|
|
IF (J~SCANKY(P,SUFSZ)).TYPF=SPC AND J.SYZF=1% 44287000
|
|
AND J.CHRF=COLON THEN% 44288000
|
|
IF (J~SCANKY(P,SUFSZ)).TYPF=NUM THEN% 44289000
|
|
IF (K~SCANKY(P,SUFSZ)).TYPF=SPC AND K.SYZF=1% 44290000
|
|
AND K.CHRF=EQUAAL THEN% 44291000
|
|
IF (K~SCANKY(P,SUFSZ)).TYPF=NUM THEN% 44292000
|
|
BEGIN% 44293000
|
|
SEGTRACE(I&SEGTRACEL(K,J));% 44294000
|
|
GO TO ENDOFMSG;% 44295000
|
|
END;% 44296000
|
|
INVKBD;% 44297000
|
|
END; 44306000
|
|
LD: ; 44308000
|
|
RN: ; 44309000
|
|
TOH: ; 44310000
|
|
TF: ; 44312000
|
|
WT: BEGIN% 44313000
|
|
CURRENTTIME;% 44313100
|
|
REPLACE POINTTOMSGAREA BY HOME,TIMEIS, 44313200
|
|
P:POINTER(TIME[*],8) FOR 2,COLON,% 44313300
|
|
P:P FOR 2,COLON,P FOR 2,LINEERASE,ETX; 44313400
|
|
GO TO SPOUTIT;% 44313500
|
|
END;% 44313900
|
|
WD: BEGIN% 44314000
|
|
REPLACE POINTTOMSGAREA BY HOME, DATEIS,% 44314100
|
|
POINTER(DATE,8)+JULDATESZ UNTIL = NUL,% 44314200
|
|
LINEERASE, ETX;% 44314300
|
|
GO TO SPOUTIT;% 44314400
|
|
END;% 44314990
|
|
WM: BEGIN 44315000
|
|
REPLACE P~POINTTOMSGAREA BY HOME, 44316000
|
|
POINTER(OUTPUTMESS[BEGMCPID],BYTESZ) UNTIL=NUL,ETX; 44317000
|
|
GO TO SPOUTIT; 44318000
|
|
END; 44319000
|
|
PI: BEGIN 44320000
|
|
SHIFTBUF; 44321000
|
|
REPLACE P~POINTTOBUFFO BY PIMSG; 44322000
|
|
GO TO SPOUTIT; 44323000
|
|
END; 44324000
|
|
EI: BEGIN 44325000
|
|
REPLACE P~POINTTOMSGAREA BY EIMSG; 44326000
|
|
GO TO SPOUTIT; 44327000
|
|
END; 44328000
|
|
LE: ; 44329000
|
|
END CASE; 44331000
|
|
GO TO ENDOFMSG;% 44331500
|
|
END;% 44332000
|
|
INVKBD;% 44332100
|
|
GO TO ENDOFMSG;% 44333000
|
|
SPOUTIT:% 44334000
|
|
SPOED~TRUE;% 44334100
|
|
SPOUT(IOCB,DISPLAYONKEYER);% 44334200
|
|
GO TO ENDOFMSG;% 44334300
|
|
ANSREPLY: 44335000
|
|
REPLY[STKNUM]~REPWRD;% 44335100
|
|
CAUSE(REPEVNT);% 44335200
|
|
ENDOFMSG:% 44336000
|
|
BUZZCONTROL(KEYINQ);% 44337000
|
|
NEXT(KEYINQ);% 44338000
|
|
DELINK(KEYINQ,IOCB);% 44339000
|
|
IF SPOED THEN SPOED~FALSE 44341000
|
|
ELSE BEGIN% 44341100
|
|
FORGETSPACE(WORD(IOCB).ADDRESSF);% 44343000
|
|
END;% 44344000
|
|
END;% 44345000
|
|
IF POPIN-DEATHS=POPULATION(KEYINQ) THEN 44346000
|
|
COUNT~0% 44346100
|
|
ELSE;% SOME THINGS WRONG 44347000
|
|
UNLOCK(KEYINQ);% 44347100
|
|
TRACE(TMPTRAC); 44348000
|
|
EXIT;% 44348990
|
|
END KEYIN; 44349000
|
|
SAVE 44350000
|
|
PROCEDURE SPOUT(IOCB,U);VALUE IOCB,U;REAL U;REFERENCE IOCB; 44351000
|
|
BEGIN 44352000
|
|
ARRAY MSGAREA[*];REFERENCE MSGAREAREF=MSGAREA; 44353000
|
|
REAL RSDS; 44354000
|
|
DEFINE 44357000
|
|
IMSPOSEDTOWAIT= BOOLEAN(U.SIGNBITF)#,% 44357100
|
|
ENDSPOUTDEFINES=0#; 44358000
|
|
IF IMSPOSEDTOWAIT THEN% 44359000
|
|
BEGIN 44360000
|
|
MSGAREAREF~IOCB; 44361000
|
|
MSGAREA[0]~WIOCW;% 44362000
|
|
RSDS~WAITIO(MSGAREA,WUSER(U),WERRMSK); 44363000
|
|
END 44364000
|
|
ELSE BEGIN 44365000
|
|
MSGAREAREF~ KBUF @ IOCB; 44366000
|
|
MSGAREA[0]~WIOCW;% 44367000
|
|
MISC @(IOCB)~0&MISCL(, REAL(NOT BOOLEAN(WERRMSK))); 44368000
|
|
USER@(IOCB)~WUSER(U);% 44369000
|
|
SEVNT@(IOCB)~1;% 44370000
|
|
IOREQUEST(IOCB); 44371000
|
|
EXIT;% 44373000
|
|
END; 44374000
|
|
IF BOOLEAN(RSDS) THEN 44375000
|
|
IF BOOLEAN(RSDS.RDTIMEOUT) THEN% HANDLE TIME-OUT 44376000
|
|
ELSE 44377000
|
|
IF BOOLEAN(RSDS.RDOVERFLOW) THEN% HANDLE OVERFLOW 44378000
|
|
ELSE 44379000
|
|
;% DO SOMETHING 44380000
|
|
FORGETSPACE(WORD(IOCB).ADDRESSF); 44382000
|
|
EXIT;% 44382990
|
|
END SPOUT; 44383000
|
|
SAVE PROCEDURE CONNQUEST(UNIT); VALUE UNIT; REAL UNIT; 44384000
|
|
BEGIN 44385000
|
|
WORD ARRAY MSGAREA[*]; 44386000
|
|
WORD ARRAY IOCB[*]; 44387000
|
|
REAL TMP; 44389000
|
|
IOCB~IOCB&ARRAYDESCL(3,TMP~MAXMSGSZ DIV CHRS+IOCBSIZE+JFACTOR, 44390000
|
|
GETSPACE(TMP,MCP,4,0)); 44391000
|
|
INITIALIZETOZERO(IOCB.ADDRESSF,TMP); 44392000
|
|
MSGAREA~MSGAREA&ARRAYDESCL(3,IOCB.LENGTHF-IOCBSIZE-INVKBDSZ, 44393000
|
|
IOCB.ADDRESSF+IOCBSIZE+INVKBDSZ); 44394000
|
|
IOCB[0]~RUSER(UNIT); 44395000
|
|
IOCB[1]~0&MISCL( ,REAL(NOT BOOLEAN(RERRMSK))); 44396000
|
|
IOCB[2]~MSGAREA; 44397000
|
|
IOCB[3]~0; 44398000
|
|
MSGAREA[0]~RIOCW;% 44399000
|
|
IOREQUEST(REFERENCE(IOCB)); 44400000
|
|
END CONNREQUEST; 44401000
|
|
SAVE 44419999
|
|
PROCEDURE MESSER(WHOWHICH,INFO); VALUE WHOWHICH, INFO;% 44420000
|
|
REAL WHOWHICH;WORD INFO; 44420100
|
|
BEGIN% 44420200
|
|
INTEGER W~WHOWHICH.WHOF,% 44420300
|
|
Z~WHOWHICH.WHATF, 44420305
|
|
X~WHOWHICH.WHICHF;% 44420310
|
|
POINTER P, Q;% 44420400
|
|
ARRAY MSGAREA[*];% 44420500
|
|
REFERENCE MSGAREAREF; 44420510
|
|
REAL RINFO=INFO;% 44420600
|
|
POINTER PINFO=INFO;% 44420700
|
|
INTEGER I;% 44420800
|
|
DEFINE% 44421000
|
|
MSG= Q UNTIL=NUL#,% 44421100
|
|
INVLD= 8"INVLD "#,% 44422000
|
|
ARG= 8" ARG"#,% 44422010
|
|
ERRR = 8" ERROR # "#, 44422020
|
|
ENDMESDEF=0#;% 44422900
|
|
Q~POINTER(OUTPUTMESS[OPMINDXR(W)],8);% 44423000
|
|
MSGAREA~*&ARRAYDESCL(3,I~LINESZ DIV CHRS+JFACTOR,GETAREA(I)); 44423010
|
|
P~POINTTOMSGAREA;% 44423050
|
|
THRU X DO BEGIN SCAN Q:Q UNTIL=NUL;Q~Q+1;END;% 44423100
|
|
CASE W OF% 44424000
|
|
BEGIN% CASES 44424010
|
|
BEGIN% FINDINPUT ACTION 44424100
|
|
CASE X OF% 44424200
|
|
BEGIN% 44424300
|
|
;% NO FIL USES POINTER TO LEB 44424400
|
|
;% NO FIL ON DISK SAME AS NO FIL 44424500
|
|
;% DUP FIL USES POINTER TO UNITS AND FIDS 44424600
|
|
;% ACCEPT USES BUFF WITH DATA-NAME 44424700
|
|
END;% FIND-INPUT CASES;% 44424800
|
|
END;% 44424900
|
|
BEGIN% FINDOUTPUT ACTION 44425000
|
|
END;% 44425500
|
|
BEGIN% MATH INTRINSIC ERRORS 44426000
|
|
REPLACE P:P BY INVLD,Q UNTIL=NUL,ARG,ETX;% 44426100
|
|
END;% 44426900
|
|
BEGIN% STATUS ACTION 44427000
|
|
CASE X OF% 44427100
|
|
BEGIN% 44427200
|
|
REPLACE P:P BY% 44427300
|
|
POINTER(MNEMONIC[RINFO.UNITTYPE|MNEMSZ],*) 44427320
|
|
FOR MNEMSZ,% 44427322
|
|
RINFO.UNITTYPECNTRF FOR 3 DIGITS,% 44427330
|
|
BLANK, MSG, ETX;% 44427350
|
|
;% UNIDENTIFIED FLYING UNIT 44427400
|
|
;% PARITY RW/L 44427500
|
|
;% UNIT RET FIDS USES POINTER TO UNIT AND FIDS 44427600
|
|
;% BACKUP ON UNIT USES UNIT NUMB. 44427700
|
|
END STATUS CASES; 44427800
|
|
END; 44427900
|
|
BEGIN % MCP ID 44428010
|
|
END; 44428110
|
|
BEGIN % I/O ERRORS 44428210
|
|
REPLACE P:P BY Q UNTIL=NUL,ERRR,Z FOR 2 DIGITS, 44428310
|
|
8" "; 44428410
|
|
W~REAL(PINFO+1,1); 44428510
|
|
PINFO~PINFO+2; 44428610
|
|
THRU W DO REPLACE P:P BY PINFO:PINFO+1 FOR 44428710
|
|
REAL(PINFO,1), 8"/"; 44428810
|
|
REPLACE P-1 BY ETX; 44428910
|
|
END; 44429110
|
|
BEGIN% STDIOERR -- BETTER CHECK RAJ RE SEQUENCE NOS. 44429200
|
|
END;% STDIOERR 44429900
|
|
BEGIN% MISC. MESS 44430000
|
|
CASE X OF% 44430100
|
|
BEGIN% 44430110
|
|
BEGIN% BOJ MESS 44430200
|
|
MSGAREAREF~*&ARRAYDESCL(3,PICQSZ,% 44430350
|
|
GETAREA(PICQSZ)); 44430352
|
|
LNID@(MSGAREAREF)~RINFO;% 44430400
|
|
LNBUF@(MSGAREAREF)~MSGAREA;% 44430500
|
|
INSERTINTO(MIXQ(MSGAREAREF));% 44430600
|
|
JOBMESSER(RINFO,P);% 44430700
|
|
REPLACE POINTTOMSGAREA+STATUSPOSIT BY MSG; 44430750
|
|
JOBREF(RINFO)~MSGAREAREF;% 44430800
|
|
PRINTMIXPIC(MSGAREA);% 44430850
|
|
WHOWHICH~NABS(WHOWHICH);% 44430900
|
|
END;% 44430990
|
|
BEGIN% EOJ MESS 44431000
|
|
MSGAREAREF~JOBREF(RINFO);% 44431100
|
|
P~POINTER((LNBUF@MSGAREAREF)[1],8);% 44431200
|
|
REPLACE P+STATUSPOSIT BY MSG;% 44431300
|
|
LNDESC@(MSGAREAREF)~*&LNDESCL(0);% 44431400
|
|
PRINTMIXPIC(MSGAREA);% 44431500
|
|
WHOWHICH~NABS(WHOWHICH);% 44431600
|
|
END;% 44431900
|
|
END;% MISC CASE 44432500
|
|
END;% MISC HANDLING 44432900
|
|
END CASES;% 44435000
|
|
IF WHOWHICH}0 THEN% 44436000
|
|
SPOUT(REFERENCE(MSGAREA),-DISPLAYONMIX);% 44436100
|
|
EXIT;% UNTIL DISKIO AND BILDAHDR ARE COMPLETE 44436190
|
|
BUZZCONTROL(LOGLOCK);% 44436200
|
|
LOGBUF[1+I~(LOGRECSZ|(REAL(BOOLEAN(LOGRECCNT~*+1) AND TRUE)))] 44436300
|
|
~WHOWHICH;% 44436310
|
|
REPLACE POINTER(LOGBUF[2+I],8) BY% 44436600
|
|
POINTTOMSGAREA FOR LOGRECSZ-1 WORDS;% 44436610
|
|
IF BOOLEAN(I) THEN% 44436700
|
|
BEGIN% 44436710
|
|
DISKWAIT (LOGBUF,% 44436730
|
|
0,% 44436740
|
|
SEGMENTSZ,% 44436750
|
|
ROWADDRESS(LOGBUF,(I~LOGRECCNT.DIV2F) DIV LOGROWSZ) 44436760
|
|
+I MOD LOGROWSZ,% 44436762
|
|
@40);% 44436770
|
|
END;% 44436800
|
|
UNLOCK(LOGLOCK);% 44436900
|
|
END MESSER;% 44439000
|
|
BOOLEAN PROCEDURE JULIT(P);POINTER P; 44451300
|
|
BEGIN 44451400
|
|
INTEGER I, J,% 44451500
|
|
M~INTEGER(P,2),% 44451600
|
|
D~INTEGER(P+3,2),% 44451700
|
|
Y~INTEGER(P+6,4),% 44451800
|
|
S~D;% 44451810
|
|
FOR I~1 STEP 1 UNTIL M DO% 44451900
|
|
BEGIN% 44451910
|
|
J~(IF I=1 THEN 31 ELSE IF I=2 THEN 28+REAL(LEAP(Y)) ELSE 44451920
|
|
30+REAL((BOOLEAN(I) AND I<8) OR (I>7 AND NOT BOOLEAN(I)))); 44451930
|
|
IF I<M THEN S~S+J% 44451940
|
|
ELSE IF D{J THEN% 44452000
|
|
BEGIN% 44452010
|
|
JULIT~TRUE;% 44452020
|
|
REPLACE P BY Y FOR 4 DIGITS, S FOR 3 DIGITS;% 44452030
|
|
END;% 44452090
|
|
END;% 44452100
|
|
END JULIT;% 44452190
|
|
PROCEDURE DATIT(P); POINTER P;% 44452200
|
|
BEGIN 44452300
|
|
INTEGER Y~INTEGER(P+STARTYEARPLACE,YEARSZ),% 44452400
|
|
DY~ABS(Y-BASEYEAR)-1,% 44452410
|
|
D~INTEGER(P+STARTDAYPLACE,DAYSZ),% 44452420
|
|
M, I, J;% 44452430
|
|
POINTER Q~P+JULDATESZ;% 44452500
|
|
DEFINE% 44452510
|
|
ALGOR= (I~(D+CORR+SHIFT)MOD 7)#,% 44452570
|
|
DYCORR= DY+(DY.DIV4F+DY DIV 400-DY DIV 100-DY DIV 4000)#, 44452575
|
|
CORR= 1+DYCORR#, 44452580
|
|
SHIFT= 4#, 44452585
|
|
DATDEFEND=0#;% 44452595
|
|
WHILE J<D DO% 44452600
|
|
BEGIN% 44452700
|
|
M~M+1;% 44452800
|
|
J~J+I~(IF M=1 THEN 31 ELSE IF M=2 THEN 28+REAL(LEAP(Y)) ELSE 44452900
|
|
30+REAL((BOOLEAN(M)AND M<8)OR(M>7 AND NOT BOOLEAN(M))));44452910
|
|
END;% 44453000
|
|
J~D-J+I;% 44453100
|
|
REPLACE Q BY% 44454600
|
|
CASE ALGOR OF (8"SUN ",8"MON ",8"TUES ",8"WEDNES", 44454610
|
|
8"THURS ",8"FRI ",8"SATUR ") FOR 6; 44454700
|
|
SCAN Q:Q WHILE IN EBCDICALPHABETIC;% 44454710
|
|
REPLACE Q:Q BY DAY,COMMA,BLANK,% 44454790
|
|
POINTER(MONTHS[(M-1)|2],8) UNTIL=NUL,BLANK,% 44454800
|
|
J FOR 2 DIGITS,COMMA,BLANK,Y FOR 4 DIGITS, ETX;% 44454810
|
|
END DATIT;% 44454900
|
|
REAL PROCEDURE CURRENTTIME; 44455000
|
|
BEGIN% 44455100
|
|
REAL H, M, S;% 44455200
|
|
DEFINE SECONDS= TIMEOFDAY/TIMECORRFACT#;% 44455300
|
|
S~ABS((M~(S~ABS((H~(S~SECONDS)DIV 3600)|3600-S))DIV 60)|60-S); 44455400
|
|
REPLACE POINTER(TIME[*],8) BY H FOR 2 DIGITS, M FOR 2 DIGITS, 44455500
|
|
S FOR 2 DIGITS;% 44455600
|
|
CURRENTTIME~S&TIMEL(H,M);% 44455700
|
|
END CURRENTTIME;% 44455900
|
|
PROCEDURE CONNSOUL(COUNT); REAL COUNT;% 44500000
|
|
BEGIN% 44500100
|
|
ARRAY CHNLCNTR[MAXPSUEDOCHANNELS];% 44500200
|
|
REFERENCE IOCB;% 44500300
|
|
REAL I,% 44500400
|
|
RSDS;% 44500500
|
|
BOOLEAN GOBACK;% 44500600
|
|
LABEL QTOP;% 44500700
|
|
DEFINE% 44501000
|
|
SATISFIEDCUSTOMERS= CHNLCNTR[I].SERF#,% 44501100
|
|
CUSTOMERSENTERED= CHNLCNTR[I].CUSTF#,% 44501200
|
|
ADDRESSOFCHNLBUFFER=CHNLCNTR[I].RATINGSAMPLEF% 44501300
|
|
-IOCBSIZE|CUSTOMERSENTERED#,% 44501302
|
|
CHNLID= 0#,% 44501400
|
|
CHNLLOCK= CHANNELLOCKS[I]#,% 44501500
|
|
ENDCSDEF=0#;% 44501990
|
|
QTOP: BUZZCONTROL(SPOUTQ); 44502000
|
|
IOCB~NEXTOUTP~FIRSTOUTP;% 44503000
|
|
WHILE IOCB!NULL DO% 44504000
|
|
BEGIN% 44505000
|
|
IF BOOLEAN(RSDS~MISC@IOCB) THEN% 44506000
|
|
BEGIN% 44507000
|
|
IF TIMEDOUT THEN% 44508000
|
|
BEGIN% 44509000
|
|
DELINK(SPOUTQ,IOCB);% 44510000
|
|
MISC@(IOCB)~WERRMSK;% 44511000
|
|
IOREQUEST(IOCB);% 44512000
|
|
END ELSE% UNEXPECTED I/O ERROR 44513000
|
|
END ELSE% 44514000
|
|
BEGIN% 44515000
|
|
IF CHNLCNTR[CHNLID]=0 THEN% 44516000
|
|
CHNLCNTR[CHNLID]~SEVNT@IOCB;% 44517000
|
|
CHNLCNTR[CHNLID].SERF~CHNLCNTR[CHNLID].SERF+1;% 44518000
|
|
END;% 44519000
|
|
GOBACK~FALSE;% 44520000
|
|
IOCB~NEXT(SPOUTQ);% 44521000
|
|
END;% 44522000
|
|
UNLOCK(SPOUTQ);% 44523000
|
|
IF GOBACK THEN% 44524000
|
|
BEGIN% 44525000
|
|
GOBACK~FALSE;% 44526000
|
|
PAUSE;% 44527000
|
|
GO TO QTOP;% 44528000
|
|
END;% 44529000
|
|
FOR I~0 STEP 1 UNTIL MAXPSUEDOCHANNELS DO% 44530000
|
|
IF SATISFIEDCUSTOMERS=CUSTOMERSENTERED THEN% 44531000
|
|
IF CUSTOMERSENTERED=0 THEN% 44532000
|
|
ELSE BEGIN% 44533000
|
|
FORGETSPACE(ADDRESSOFCHNLBUFFER);% 44535000
|
|
CHNLCNTR[I]~0;% 44535100
|
|
LIBERATE(CHNLLOCK);% 44536000
|
|
END% 44537000
|
|
ELSE GOBACK~TRUE;% 44538000
|
|
IF GOBACK THEN GO TO QTOP;% 44539000
|
|
END CONNSOUL;% 44540000
|
|
PROCEDURE CHANLOUT(CHNNO,MSGAREA);VALUE CHNNO;% 44550000
|
|
REAL CHNNO; ARRAY MSGAREA[*];% 44550100
|
|
BEGIN% 44550200
|
|
DEFINE% 44551000
|
|
CHNLDESC= CHANNELGUIDE[CHNNO]#,% 44551100
|
|
MODELNO = UNITBL[TI(CONN),J~VIEWER]#,% 44551200
|
|
SAMPLESHEET= CHNLDESC.RATINGSAMPLEF#,% 44551300
|
|
RATINGS= ONES(SURVEYSHEET)#,% 44551400
|
|
TURNOFFSET= RESET(SURVEYSHEET,J)#,% 44551500
|
|
VIEWER= FIRSTONE(SURVEYSHEET)#,% 44551600
|
|
ENDCHANTDEF=0#;% 44551990
|
|
WORD ARRAY IOCBS[*];% 44552000
|
|
REFERENCE IOCB;% 44552100
|
|
REAL SURVEYSHEET~SAMPLESHEET;% 44552200
|
|
INTEGER I,J,% 44552300
|
|
N~RATINGS;% 44552400
|
|
IOCBS~*&ARRAYDESCL(3,I~N|IOCBSIZE,I~GETSPACE(I,MCP,4,0));% 44553000
|
|
IOCBS[0]~0;% 44553010
|
|
IOCBS[1]~0&MISCL(,REAL(NOT BOOLEAN(WERRMSK)));% 44553100
|
|
IOCBS[3]~CHNLDESC&GYDEFORM((IOCBS[2]~MSGAREA).ADDRESSF,*,*,); 44553200
|
|
MSGAREA[0]~WIOCW;% 44553300
|
|
IOCB~*&ARRAYDESCL(3,IOCBSIZE,I-IOCBSIZE);% 44553400
|
|
IF N~N-1>0 THEN% 44553450
|
|
REPLACE POINTER(IOCBS[IOCBSIZE],8) BY POINTER(IOCBS,8) 44553500
|
|
FOR IOCBSIZE|N OVERWRITE;% 44553600
|
|
FOR I~0 STEP 1 UNTIL N DO% 44554000
|
|
BEGIN% 44554100
|
|
USER@(IOCB~*&ARRAYDESCL(,,IOCB.ADDRESSF+IOCBSIZE))% 44554200
|
|
~WUSER(MODELNO);% 44554210
|
|
IOREQUEST(IOCB);% 44554300
|
|
TURNOFFSET;% 44554400
|
|
END;% 44554900
|
|
EXIT;% 44559000
|
|
END CHANLOUT;% 44559900
|
|
PROCEDURE MIXPRINT(MSGAREA); ARRAY MSGAREA[*];% 44600000
|
|
BEGIN% 44601000
|
|
REFERENCE TMPEN;% 44602000
|
|
POINTER P~POINTTOMSGAREA,% 44603000
|
|
Q;% 44604000
|
|
REAL LD,% 44605000
|
|
LINENO;% 44606000
|
|
BOOLEAN SCREENFILLED;% 44607000
|
|
DEFINE% 44608000
|
|
NULLMIX= MIXQHD=NULL#,% 44609000
|
|
NULMIXMSG= 8"NULL MIX",LINEERASE#,% 44610000
|
|
SCREENABOUTTOOVERFLOW= SCREENFILLED~LINENO}MAXLNS#,% 44611000
|
|
FIRSTTIME= (LD~LNDESC@TMPEN).LNSTATF=2#,% 44612000
|
|
LASTTIME = LD.LNSTATF=1#,% 44613000
|
|
BOTTOMLINE= HOME,REVERSELF,8"MIX 1 OF ",MAXPGS FOR 2 DIGITS#, 44614000
|
|
ENDMXPTDEF=0#;% 44615000
|
|
REPLACE P:P BY HOME;% 44616000
|
|
PROCURE(MIXCHNLLK);% 44617000
|
|
IF NULLMIX THEN REPLACE P:P BY NULMIXMSG% 44618000
|
|
ELSE BEGIN% 44619000
|
|
DO% 44620000
|
|
BEGIN% 44621000
|
|
REPLACE P:P BY% 44622000
|
|
(Q~POINTER((LNBUF@TMPEN)[1],8))+1 UNTIL = ETX, 44622100
|
|
CARRETURN;% 44623000
|
|
IF FIRSTTIME THEN% 44624000
|
|
BEGIN% 44625000
|
|
REPLACE Q+STATUSPOSIT BY BLANK FOR STATUSSZ; 44626000
|
|
LNDESC@(TMPEN)~LD&LNDESCL(1,1);% 44627000
|
|
END% 44628000
|
|
ELSE IF LASTTIME THEN% 44629000
|
|
BEGIN% 44630000
|
|
REPLACE Q BY ETX FOR 2;% 44631000
|
|
LNDESC@(TMPEN)~LD&LNDESCL(0,0);% 44632000
|
|
END;% 44633000
|
|
LINENO~LINENO+1;% 44634000
|
|
IF SCREENFILLED THEN% 44635000
|
|
ELSE IF SCREENABOUTTOOVERFLOW THEN% 44636000
|
|
BEGIN% 44637000
|
|
REPLACE P:P BY BOTTOMLINE;% 44638000
|
|
TMPEN~PRELN@MIXQHD;% 44639000
|
|
END;% 44640000
|
|
END UNTIL TMPEN~NEXLN@(TMPEN)=MIXQHD;% 44641000
|
|
END;% 44642000
|
|
REPLACE P BY ETX;% 44643000
|
|
PRINTMIXPIC(MSGAREA);% 44644000
|
|
END MIXPRINT;% 44645000
|
|
SAVE PROCEDURE IOERROR(RD); REAL RD; 50000000
|
|
BEGIN 50001000
|
|
INTEGER U, COMMENT LOGICAL UNIT NO.; 50002000
|
|
UTYPE, COMMENT UNIT TYPE; 50003000
|
|
BITNO, COMMENT REMAINDER OF(U MOD 32); 50004000
|
|
VECTORNO; COMMENT VECTOR FOR UNIT; 50005000
|
|
REAL UTABLEENTRY, COMMENT CONTENTS OF UNIT TABLE ENTRY; 50006000
|
|
UERRORMASK , COMMENT ERROR MASK FOR I/O ERROR; 50007000
|
|
UERROR , COMMENT UNIT ERROR; 50008000
|
|
IOCW , COMMENT I/O CONTROL WORD; 50009000
|
|
ERRORSET , COMMENT RESULT DESCPIPTOR ERROR BIT NO; 50010000
|
|
INIOERROR , COMMENT FOR MONITORING; 50011000
|
|
UNITMASK ; COMMENT TO SET UP MASK FOR UNIT; 50012000
|
|
WORD ARRAY IOCBAREA[*]; 50012200
|
|
WORD OEVENTIRW; % FOR STORING ORIGINAL EVENT IRW 50012400
|
|
EVENT IOERROREVENT; % FOR DOING I/O IN IOERROR 50012600
|
|
REFERENCE IOCB=IOCBAREA; % POINTER TO FIRST I/O FOR UNIT 50013000
|
|
BOOLEAN SKIPTOG, COMMENT TOGGLE FOR IDENTIFYING DIFF. SOURCES 50014000
|
|
OF ENTRIES TO A LABEL; 50015000
|
|
MEMACCESSERRORTOG, % ON MEMORY ACCESS ERROR 50015500
|
|
BITWORD; COMMENT FOR SETTING BIT CORRESPONDING TO 50016000
|
|
UNIT NO.; 50017000
|
|
LABEL DISPLAYMSG,NOTREADY,KILLIT,MEMPARITY,SETERROR,FIXIOQUE,50018000
|
|
SETMEMPARITY,DISPLAYMSGANDTRY,TRYAGAIN,WRITELOCK,START,50019000
|
|
CARDREAD,ENDOFFILE,CLEARERROR,MSGWITHERRCOUNT,PRINTER, 50020000
|
|
INCOMPLETE,MPXMEMACCESS,CARDPUNCH,INVALIDADDR,LEAVE; 50021000
|
|
LABEL REWINDING,COMMONCODE,SETMEMPARITYERR,CHECKUSER; 50021500
|
|
LAYOUT BITSETL(BITNO:1~1); COMMENT LAYOUT FOR DYNAMIC 50022000
|
|
BIT SETTING; 50023000
|
|
DEFINE READCHECK=RDENDOFTAPE#, 50024000
|
|
EUBUSY=RDENDOFTAPE#, 50025000
|
|
OPUNOTREADY=RDOVERFLOW#, 50026000
|
|
UTIMEOUT=RDBLANKTAPE#, 50027000
|
|
READPARITY=RDWLOOREOF#, 50028000
|
|
INCOMPLETERECORD=RDCNTRLCARD#, 50029000
|
|
ENDOFPAGE=RDCRCCORRECT#, 50030000
|
|
PRINTCHECK=RDCNTRLCARD#, 50031000
|
|
PUNCHCHECK=RDCNTRLCARD#, 50032000
|
|
PRINTERBITTRANSFER=RDENDOFTAPE#; 50033000
|
|
MONITOR RAJMONITOR(IOCB,ERRORSET,INIOERROR,UERROR); 50033500
|
|
INIOERROR~1; 50033700
|
|
U~RD.RDUNITNO; 50034000
|
|
IOCB~FIRSTIO[U]; 50035000
|
|
UTABLEENTRY~UNIT[U]; 50036000
|
|
VECTORNO~U DIV 32; 50037000
|
|
BITNO~U-VECTORNO | 32; 50038000
|
|
BITWORD~FALSE & BITSETL( ); 50038500
|
|
UERRORMASK~IF BOOLEAN(USER@(IOCB).USERIOBIT) THEN @377777 50038600
|
|
ELSE MISC @(IOCB).IOERRORMASKFIELD; 50038700
|
|
UTYPE~UTABLEENTRY.UNITTYPE; 50038800
|
|
UERROR~REAL(BOOLEAN(RD.RDERROR) AND BOOLEAN(UERRORMASK)); 50038900
|
|
START: 50039000
|
|
IOCW~M[WORD(AREADESC @ IOCB)]; 50040000
|
|
UTABLEENTRY.UNITNOTREADY~0; 50041000
|
|
UTABLEENTRY.UNITERROR~0; 50042000
|
|
TRANSACTION[U]~*-1; 50043000
|
|
MEMACCESSERRORTOG~BOOLEAN(UERROR.RDMEMACCESS); 50053000
|
|
IF BOOLEAN(UERROR.RDBUSY) THEN 50054000
|
|
BEGIN COMMENT UNIT BUSY; 50055000
|
|
UNITMASK~ 4; 50056000
|
|
IF UTYPE!SPO THEN 50062000
|
|
BEGIN 50063000
|
|
COMMENT BUILD MESSAGE "UNIT BUSY"; 50064000
|
|
ERRORSET~2; 50064500
|
|
DISPLAYMSGANDTRY: 50065000
|
|
%SPOUT(MSGAREA,DISPLAYONPER);% MAR 50066000
|
|
END; 50067000
|
|
TRYAGAIN: 50068000
|
|
DO BEGIN 50069000
|
|
WAIT(TIMERINTERRUPTEVENT); 50070000
|
|
UNIT[U]~UTABLEENTRY; 50071000
|
|
OEVENTIRW~IOCBAREA[EVENTINDEX]; 50071500
|
|
STOREITEM(EVNT @ IOCB.IOERROREVENT); 50071700
|
|
STARTIO(U); 50072000
|
|
WAIT(IOERROREVENT); 50073000
|
|
RESET(IOERROREVENT); 50073500
|
|
MISC @(IOCB)~UERRORMASK; 50073600
|
|
IOCBAREA[EVENTINDEX]~OEVENTIRW; 50073700
|
|
IF UTABLEENTRY.UNITERRORFIELD }20 THEN 50074000
|
|
GO SETERROR; 50074500
|
|
END UNTIL REAL(BOOLEAN(RD~MISC @(IOCB)) AND 50075000
|
|
BOOLEAN(UNITMASK)) =0; 50076000
|
|
TRANSACTION[U]~ *+1; 50077000
|
|
IF (UERROR ~ REAL(BOOLEAN(RD.RDERROR) AND 50078000
|
|
BOOLEAN(UERRORMASK))) =0 THEN GO CLEARERROR; 50079000
|
|
GO START; 50080000
|
|
END; 50081000
|
|
IF BOOLEAN(UERROR.RDNOTREADY) THEN 50082000
|
|
BEGIN COMMENT UNIT NOT READY; 50083000
|
|
IF UTYPE=CARDREADER AND BOOLEAN(UERROR.READCHECK) THEN 50084000
|
|
GO CARDREAD; 50085000
|
|
IF UTYPE!SPO THEN 50086000
|
|
BEGIN 50087000
|
|
COMMENT BUILD MESSAGE "UNIT NOT READY"; 50088000
|
|
IF NOT BOOLEAN(UNIT[U].UNITNOTREADY) THEN 50088100
|
|
MESSER(0 & WHOCALLSL(STATMSGSEC,0),U); 50088200
|
|
ERRORSET~3; 50088500
|
|
END; 50089000
|
|
NOTREADY: 50090000
|
|
COMMENT MAKE OLDSTATUS OF THE UNIT NOT READY; 50091000
|
|
OLDSTATUSWORD[VECTORNO]~OLDSTATUSWORD[VECTORNO] AND 50093000
|
|
NOT BITWORD; 50094000
|
|
%SPOUT(MSGAREA,DISPLAYONPER);% MAR 50097000
|
|
UTABLEENTRY.UNITERRORFIELD~0; 50098000
|
|
UTABLEENTRY.UNITNOTREADY~1; 50099000
|
|
UNIT[U]~UTABLEENTRY; 50101000
|
|
GO TO KILLIT; 50104000
|
|
END; 50105000
|
|
IF REAL(BOOLEAN(UERROR) AND BOOLEAN(@157))=0 THEN 50106000
|
|
COMMENT DESCRIPTOR ERROR BIT ALSO GETS TURNED ON IF CONTROL BUSY 50106200
|
|
,MEM. ADDRESS OR MEM. PARITY ERROR OCCUR AT I/O INITIATE 50106400
|
|
TIME(BEFORE ACTUAL DATA TRANSFER OCCUR).HENCE ABOVE CHECK;50106600
|
|
BEGIN % DESCRIPTOR ERROR ONLY. EITHER WORD COUNT=0 FOR DATA 50106800
|
|
% TRANSFER REQUEST OR BAD IOCW RECEIVED BY CONTROL 50107000
|
|
COMMENT BUILD MESSAGE "DESCRIPTOR ERROR"; 50108000
|
|
MESSER(0 & WHOCALLSL(STDIOERRSEC,0),U); 50108100
|
|
ERRORSET~4; 50108500
|
|
SETERROR: 50109000
|
|
%SPOUT(MSGAREA,DISPLAYONPER);% MAR 50110000
|
|
GO COMMONCODE; 50112000
|
|
END; 50113000
|
|
IF BOOLEAN(UERROR.RDMEMADDRBIT) THEN 50114000
|
|
INVALIDADDR: 50115000
|
|
BEGIN COMMENT INVALID ADDRESS; 50116000
|
|
COMMENT BUILD MESSAGE "I/O INVALID ADDRESS"; 50117000
|
|
MESSER(0 & WHOCALLSL(STDIOERRSEC,1),U); 50117200
|
|
COMMENT ADD CODE TO CHECK WHETHER ERROR IS DUE TO MPX TROUBLE; 50117300
|
|
ERRORSET~5; 50117500
|
|
GO SETERROR; 50118000
|
|
END; 50119000
|
|
MEMPARITY: 50120000
|
|
IF BOOLEAN(UERROR.RDMEMPARITY) THEN 50121000
|
|
BEGIN 50122000
|
|
COMMENT BUILD MESSAGE "I/O MEMORY PARITY"; 50123000
|
|
MESSER(0 & WHOCALLSL(STDIOERRSEC,2),U); 50123100
|
|
ERRORSET~6; 50123500
|
|
GO SETERROR; 50124000
|
|
END; 50125000
|
|
IF BOOLEAN(UERROR.RDMEMPROTECT) THEN 50125100
|
|
BEGIN 50125200
|
|
COMMENT MEMORY PROTECT ERROR; 50125300
|
|
MESSER(0 & WHOCALLSL(STDIOERRSEC,3),U); 50125330
|
|
ERRORSET~16; 50125350
|
|
GO SETERROR; 50125400
|
|
END; 50125500
|
|
CASE UTYPE OF 50126000
|
|
BEGIN 50127000
|
|
; COMMENT NO UNIT; 50128000
|
|
BEGIN COMMENT DISK FILE; 50129000
|
|
IF BOOLEAN(UERROR.EUBUSY) THEN 50130000
|
|
BEGIN COMMENT DISK ELECTRONICS UNIT NOT READY; 50131000
|
|
UNITMASK~ @400; 50132000
|
|
COMMENT BUILD MESSAGE "EU NOT READY"; 50133000
|
|
ERRORSET~8; 50133500
|
|
GO DISPLAYMSGANDTRY; 50134000
|
|
END; 50135000
|
|
IF MEMACCESSERRORTOG THEN 50136000
|
|
IF BOOLEAN(UERROR.RDWLOOREOF) THEN 50137000
|
|
BEGIN COMMENT READ ERROR; 50138000
|
|
ERRORSET~ 4096 |7 +9; 50139000
|
|
GO SETERROR; 50140000
|
|
END ELSE 50144000
|
|
MPXMEMACCESS: 50145000
|
|
BEGIN % MEMORY ACCESS ERROR 50146000
|
|
ERRORSET~7; 50147000
|
|
GO CLEARERROR; 50148000
|
|
END; 50149000
|
|
IF BOOLEAN(UERROR.OPUNOTREADY) THEN 50150000
|
|
BEGIN % OPERATING UNIT NOT READY 50150200
|
|
COMMENT DURING TRANSFER STORAGE UNIT WAS CROSSED FROM 50150400
|
|
A READY S.U. TO A NOT READY S.U.; 50150600
|
|
ERRORSET~11; 50150800
|
|
GO SETERROR; 50150900
|
|
END; 50150950
|
|
IF BOOLEAN(UERROR.UTIMEOUT) THEN 50151000
|
|
BEGIN % TIME OUT 50152000
|
|
ERRORSET~15; 50153000
|
|
GO SETERROR; 50154000
|
|
END; 50155000
|
|
IF BOOLEAN(UERROR.RDWLOOREOF) THEN 50156000
|
|
WRITELOCK: 50157000
|
|
BEGIN 50158000
|
|
ERRORSET~9; 50159000
|
|
COMMENT BUILD MESSACE "WRITE-LOCK"; 50160000
|
|
GO SETERROR; 50161000
|
|
END; 50162000
|
|
END; 50163000
|
|
; COMMENT SPO; 50164000
|
|
; COMMENT DISPLAY; 50165000
|
|
COMMENT PAPER TAPE READER; 50166000
|
|
BEGIN 50167000
|
|
IF BOOLEAN(UERROR.RDENDOFTAPE) THEN 50168000
|
|
BEGIN % BEGINNING OR END OF TAPE 50168200
|
|
ERRORSET~8; 50168400
|
|
END ELSE 50168600
|
|
IF BOOLEAN(UERROR.INCOMPLETERECORD) THEN 50169000
|
|
BEGIN % INCOMPLETE RECORD 50170000
|
|
ERRORSET~10; 50171000
|
|
END; 50171500
|
|
IF MEMACCESSERRORTOG THEN 50172000
|
|
IF BOOLEAN(UERROR.READPARITY) THEN 50173000
|
|
BEGIN 50174000
|
|
ERRORSET~ 4096 |7 +9; 50175000
|
|
COMMENT *********** WRITE SPECIAL RETRY PROCEDURE; 50176000
|
|
END ELSE 50177000
|
|
GO MPXMEMACCESS; 50178000
|
|
BEGIN % MEMORY ACCESS ERROR 50178200
|
|
ERRORSET~7; 50178300
|
|
END; 50178400
|
|
DISPLAYMSG: 50179000
|
|
BEGIN 50180000
|
|
COMMENT BUILD MESSAGE "UNIT I/O ERROR"; 50181000
|
|
GO SETERROR; 50182000
|
|
END; 50183000
|
|
END; 50184000
|
|
COMMENT PAPER TAPE PUNCH; 50185000
|
|
BEGIN 50186000
|
|
IF BOOLEAN(UERROR.RDENDOFTAPE) THEN 50187000
|
|
BEGIN % PAPER TAPE RUNNING LOW 50187200
|
|
ERRORSET~8; 50187400
|
|
END ELSE 50187600
|
|
IF BOOLEAN(UERROR.INCOMPLETERECORD) THEN 50188000
|
|
BEGIN % INCOMPLETE RECORD 50189000
|
|
ERRORSET~10; 50190000
|
|
END; 50190200
|
|
GO COMMONCODE; 50190600
|
|
END; 50191000
|
|
GO PRINTER; COMMENT BUFFERED PRINTER; 50193000
|
|
PRINTER: 50195000
|
|
BEGIN 50196000
|
|
IF BOOLEAN(UERROR.ENDOFPAGE) THEN 50197000
|
|
BEGIN 50198000
|
|
COMMENT IGNORE END OF PAGE IF NO SPACE OR SKIP; 50199000
|
|
IF IOCW.IOUNITFIELD=0 THEN GO COMMONCODE; 50200000
|
|
M[WORD(AREADESC @ IOCB)]~ 0 & IOCWL(@200, 50201000
|
|
0 & IOCWPRINTERL(0,1)); 50202000
|
|
ERRORSET~12; 50202500
|
|
GO CLEARERROR; 50203000
|
|
END; 50204000
|
|
IF MEMACCESSERRORTOG THEN 50204500
|
|
IF BOOLEAN(UERROR.PRINTERBITTRANSFER) THEN 50205000
|
|
BEGIN 50205100
|
|
COMMENT BIT TRANSFER ERROR; 50205200
|
|
ERRORSET~4096 | 7 +8; 50205300
|
|
END ELSE 50205900
|
|
IF BOOLEAN(UERROR.PRINTCHECK) THEN 50206000
|
|
BEGIN 50207000
|
|
COMMENT BUILD MESSAGE "UNIT PRINT CHECK"; 50208000
|
|
MSGWITHERRCOUNT: % SPOUT(MSGAREA,DISPLAYONPER);% MAR 50209000
|
|
COMMENT TOTALUNITERROR~ * +1; 50210000
|
|
ERRORSET~4096 | 10; 50211000
|
|
GO COMMONCODE; 50212000
|
|
END; 50213000
|
|
END; 50217000
|
|
; COMMENT DUMMY; 50218000
|
|
BEGIN COMMENT CARD READER; 50219000
|
|
CARDREAD: 50220000
|
|
IF BOOLEAN(UERROR.READCHECK) THEN 50221000
|
|
BEGIN COMMENT READ CHECK ON CARD READER; 50222000
|
|
COMMENT BUILD MESSAGE "UNIT READ CHECK"; 50224000
|
|
MESSER(0 & WHOCALLSL(STDIOERRSEC,4),U); 50224500
|
|
ERRORSET~8; 50225000
|
|
END ELSE 50226000
|
|
IF MEMACCESSERRORTOG THEN 50227000
|
|
IF BOOLEAN(UERROR.READPARITY) THEN 50228000
|
|
BEGIN COMMENT VALIDITY ERROR; 50229000
|
|
COMMENT BUILD MESSAGE "INVALID CHARACTER IN COL"; 50230000
|
|
ERRORSET~ 4096|7 + 9; 50231000
|
|
END ELSE 50232000
|
|
BEGIN % MEMORY ACCESS ERROR- TREAT AS READ CHECK 50233000
|
|
ERRORSET~7; 50234000
|
|
END; 50235000
|
|
GO NOTREADY; 50236000
|
|
END; 50238000
|
|
GO CARDPUNCH; COMMENT CARD PUNCH I; 50240000
|
|
CARDPUNCH: 50242000
|
|
BEGIN COMMENT CARD PUNCH II; 50243000
|
|
IF BOOLEAN(UERROR.PUNCHCHECK) THEN 50244000
|
|
IF MEMACCESSERRORTOG THEN 50245000
|
|
BEGIN % PUNCH CHECK 50247000
|
|
ERRORSET~4096 |10 + 7; 50248000
|
|
GO MSGWITHERRCOUNT; 50249000
|
|
END ELSE 50250000
|
|
BEGIN % MEMORY ACCESS ERROR 50250200
|
|
ERRORSET~10; 50250400
|
|
GO CLEARERROR; 50250600
|
|
END; 50250800
|
|
END; 50251000
|
|
; COMMENT DUMMY; 50252000
|
|
BEGIN COMMENT MAGNETIC TAPE TRANSPORT; 50252010
|
|
IF MEMACCESSERRORTOG AND 50252020
|
|
BOOLEAN(UERROR.RDOVERFLOW) THEN 50252023
|
|
BEGIN % PARITY ERROR OR MEMORY ACCESS ERROR 50252025
|
|
ERRORSET~ 4096 |7 + 11; 50252030
|
|
COMMENT *********************************************** 50252035
|
|
TAPEPARITYRETRY(RD); 50252040
|
|
GO SETERROR; 50252045
|
|
END; 50252050
|
|
IF BOOLEAN(UERROR.RDNONPRESENT) THEN 50252060
|
|
BEGIN 50252070
|
|
COMMENT NON-PRESENT OPTIONS; 50252080
|
|
MESSER(0 & WHOCALLSL(STDIOERRSEC,0),U); 50252083
|
|
ERRORSET~13; 50252085
|
|
GO SETERROR; 50252090
|
|
END; 50252100
|
|
IF BOOLEAN(IOCW.IOREADBIT) THEN 50252180
|
|
BEGIN COMMENT ERROR ON READ OPERATION; 50252190
|
|
IF BOOLEAN(UERROR.RDENDOFTAPE) THEN 50252200
|
|
BEGIN 50252230
|
|
COMMENT BEGINNING OF TAPE OR END OF TAPE; 50252250
|
|
ERRORSET~8; 50252265
|
|
USER @(IOCB).USEREOFORTBIT~1; 50252267
|
|
END ELSE 50252270
|
|
IF BOOLEAN(UERROR.RDWLOOREOF) THEN 50252275
|
|
BEGIN % END OF FILE 50252280
|
|
ERRORSET~9; 50252290
|
|
USER @(IOCB).USEREOFORTBIT~1; 50252295
|
|
END ELSE 50252320
|
|
IF BOOLEAN(UERROR.INCOMPLETERECORD) THEN 50252360
|
|
BEGIN 50252370
|
|
COMMENT RECORD SHORTER THEN MEMORY ALLOCATED; 50252380
|
|
ERRORSET~10; 50252390
|
|
END ELSE 50252400
|
|
IF BOOLEAN(UERROR.RDOVERFLOW) THEN 50252410
|
|
BEGIN 50252420
|
|
COMMENT RECORD LONGER THEN MEMORY ALLOCATED; 50252430
|
|
ERRORSET~11; 50252440
|
|
END ELSE 50252450
|
|
IF BOOLEAN(UERROR.RDBLANKTAPE) THEN 50252530
|
|
BEGIN 50252540
|
|
COMMENT READ OR SPACED SIX FEET OF BLANK TAPE; 50252550
|
|
ERRORSET~15; 50252560
|
|
USER @(IOCB).USERSPECIALIO ~1; 50252580
|
|
END; 50252600
|
|
END ELSE 50252650
|
|
IF BOOLEAN(UERROR.RDWLOOREOF) THEN 50252700
|
|
BEGIN % NO WRITE RING ON UNIT 50252750
|
|
ERRORSET~9; 50252780
|
|
USER @(IOCB).USERSPECIALIO ~1; 50252784
|
|
MESSER(0 & WHOCALLSL(STDIOERRSEC,5),U); 50252786
|
|
END; 50252790
|
|
CHECKUSER: 50252800
|
|
GO SETERROR; 50252850
|
|
END; 50252900
|
|
END; 50253000
|
|
COMMONCODE: 50254000
|
|
MISC @(IOCB)~RD; 50255000
|
|
DELINK(IOQUE,FIRSTIO[U],U); 50259000
|
|
CAUSE(EVNT @(IOCB)); 50265000
|
|
CLEARERROR: 50266000
|
|
UTABLEENTRY.UERRORSTATUSBITS~0; 50267000
|
|
UNIT[U]~UTABLEENTRY; 50267500
|
|
STARTIO(U); 50268000
|
|
KILLIT: 50269000
|
|
USER @(IOCB).IOERRORRECOVERY~0; 50270000
|
|
SETMEMPARITYERR: 50271000
|
|
INCOMPLETE: 50272000
|
|
ENDOFFILE: 50273000
|
|
COMMENT 50274000
|
|
BREAKTOG~ BREAKTOG-1; 50275000
|
|
HOLD; 50275500
|
|
END IOERROR; 50276000
|
|
REAL PROCEDURE GETUSERDISK(SEGMENTS, ORIGINALSPEED); 52000000
|
|
VALUE SEGMENTS, ORIGINALSPEED; 52001000
|
|
REAL SEGMENTS, ORIGINALSPEED; 52002000
|
|
COMMENT FIND AN AREA OF DISK "SEGMENTS" LARGE, PREFERABLY ON AN 52003000
|
|
EU OF "SPEED" DISK. 52004000
|
|
IF "SPEED" IS NEGATIVE, ITS ABSOLUTE VALUE IS AN EU UNIT 52005000
|
|
NUMBER FROM WHICH THE REOUESTED SEGMENTS SHOULD BE 52006000
|
|
ASSIGNED; 52007000
|
|
BEGIN 52008000
|
|
LABEL FOUND, TRYAGAIN, SEARCH, GETNEXTSPEED, GOTIT; 52009000
|
|
REAL DISKUNIT, T, I, ORIGINALUNIT, INDEX, STOPPER, MAXINDEX, K, J, 52010000
|
|
SPEED := ORIGINALSPEED, T1; 52011000
|
|
BOOLEAN FAILED; 52012000
|
|
ARRAY ROW[*]; 52013000
|
|
LAYOUT DISKSEARCHL(UNITTYPE, DENSITYF); 52014000
|
|
REAL GETDISK; 52015000
|
|
MONITOR STEVEMONITOR(SEGMENTS,SPEED,DISKUNIT,STOPPER,GETDISK); 52016000
|
|
GETDISK:=*;SEGMENTS:=*;SPEED:=*;%FOR MONITOR 52017000
|
|
RETURN(MCPTOP+10);COMMENT TEMP FOR SIMULATION**************************;52018000
|
|
PROCURE(USERDISKLOCK); 52019000
|
|
IF SPEED < 0 THEN 52020000
|
|
ORIGINALSPEED := SPEED := UNIT[ORIGINALUNIT := DISKUNIT := 52021000
|
|
ABS(SPEED)].DENSITYF 52022000
|
|
ELSE 52023000
|
|
TRYAGAIN: 52024000
|
|
ORIGINALUNIT := DISKUNIT := NEXTEU[SPEED]; 52025000
|
|
SEARCH: 52026000
|
|
FOR I := MASKSEARCH(0&USERDISKHEADWORD(*,DISKUNIT,*), 52027000
|
|
0&USERDISKHEADWORD(*,4"FF",*), GETUSERDISKHEAD) 52028000
|
|
STEP -1 WHILE (T := GETUSERDISKHEAD[I]).EUNOF = DISKUNIT DO 52029000
|
|
IF T.ADDRESSF } SEGMENTS THEN GO FOUND; 52030000
|
|
FAILED := TRUE; 52031000
|
|
COMMENT THE FOLLOWING DOES NOT COMPILE... YET 52032000
|
|
IF DISKUNIT ! 0 THEN 52033000
|
|
IF DISKUNIT := MASKSEARCH(0&DISKSEARCHL(DISKFILE,SPEED),0& 52034000
|
|
DISKSEAHCHL(4"FF", 4"F"), UNIT[DISKUNIT-1]) > 0 THEN 52035000
|
|
IF DISKUNIT ! ORIGINALUNIT THEN 52036000
|
|
GO SEARCH 52037000
|
|
ELSE 52038000
|
|
GO GETNEXTSPEED; 52039000
|
|
IF DISKUNIT := MASKSEARCH(0&DISKSEARCHL(DISKFILE,SPEED),0& 52040000
|
|
DISKSEARCHL(4"FF", 4"F"), UNIT) > ORIGINALUNIT THEN 52041000
|
|
GO SEARCH; 52042000
|
|
GETNEXTSPEED: 52043000
|
|
IF SPEED := IF ORIGINALSPEED { 1 THEN (SPEED + 1) MOD 4 ELSE 52044000
|
|
CASE (SPEED + 4 | ORIGINALSPEED) - 8 OF ( 52045000
|
|
2,0,3,1, 52046000
|
|
3,0,1,2 52047000
|
|
) ! ORIGINALSPEED THEN 52048000
|
|
GO TRYAGAIN; 52049000
|
|
COMMENT WE HAVE TRIED.... OH HOW WE HAVE TRIED, BUT IT JUST 52050000
|
|
DID NOT WORK; 52051000
|
|
LIBERATE(USERDISKLOCK); 52052000
|
|
GETDISK:=ABS(REAL(NOT FALSE)); 52053000
|
|
RETURN(NOUSERDISK(SEGMENTS, SPEED)); 52054000
|
|
FOUND: 52055000
|
|
ROW := USERDISKLIST[INDEX := T.USERDISKINDEXF, *]; 52056000
|
|
STOPPER := 0&DISKADDRESSL(REAL(NOT BOOLEAN(DISKUNIT)), *); 52057000
|
|
FOR J := MAXINDEX := ROW.LENGTHF - 1 STEP - 1 WHILE 52058000
|
|
(T := ROW[J]) ! STOPPER DO 52059000
|
|
IF T.DISKAREASIZEF } SEGMENTS THEN 52060000
|
|
GO TO GOTIT; 52061000
|
|
COMMENT USER DISK FAILURE IF WE GET HERE; 52062000
|
|
GETDISK:=REAL(NOT FALSE); 52063000
|
|
HOLD; 52064000
|
|
GOTIT: 52065000
|
|
IF T.DISKAREASIZEF = SEGMENTS THEN 52066000
|
|
BEGIN 52067000
|
|
FOR K := J - 1 STEP -1 WHILE T1 := ROW[K] ! STOPPER DO 52068000
|
|
ROW[K+1] := T1; 52069000
|
|
ROW[K+1] := STOPPER; 52070000
|
|
IF J = MAXINDEX THEN 52071000
|
|
BEGIN COMMENT THE ROW IS EMPTY NOW; 52072000
|
|
END 52073000
|
|
END 52074000
|
|
ELSE 52075000
|
|
ROW[J] := (T.DISKADDRESSF + SEGMENTS) & DISKAREAWORDL( 52076000
|
|
T.DISKAREASIZEF - SEGMENTS, *); 52077000
|
|
IF J > 0 THEN 52078000
|
|
IF ROW[J-1] = STOPPER THEN 52079000
|
|
FORGETUSERDISKHEAD[MASKSEARCH(0&USERDISKHEADWORD(INDEX), 52080000
|
|
0&USERDISKHEADWORD(REAL(NOT FALSE)), 52081000
|
|
FORGETUSERDISKHEAD)].ADDRESSF := ROW[J+1]; 52082000
|
|
IF SEGMENTS = GETUSERDISKHEAD[I].ADDRESSF THEN 52083000
|
|
BEGIN 52084000
|
|
J := 0; 52085000
|
|
FOR K := MAXINDEX STEP -1 WHILE T1 := ROW[K] ! STOPPER DO 52086000
|
|
IF J < T1 := T1.DISKAREASIZEF THEN 52087000
|
|
J := T1; 52088000
|
|
GETUSERDISKHEAD[I].ADDRESSF := J; 52089000
|
|
END; 52090000
|
|
LIBERATE(USERDISKLOCK); 52091000
|
|
GETDISK:=T.DISKADDRESSF; 52092000
|
|
RETURN(T.DISKADDRESSF); 52093000
|
|
END GETUSERDISK; 52094000
|
|
PROCEDURE FORGETUSERDISK(DKADDR, SEGMENTS); 52095000
|
|
VALUE DKADDR, SEGMENTS; 52096000
|
|
REAL DKADDR, SEGMENTS; 52097000
|
|
COMMENT RETURN "SEGMENTS" STARTING AT "DKADDR"; 52098000
|
|
BEGIN 52099000
|
|
REAL I, J, K, L, N, T, INDEX, STOPPER, MAXINDEX, 52100000
|
|
RIGHTENDADDRESS ~ DKADDR + SEGMENTS, 52101000
|
|
DISKUNIT ~ DKADDR.EUNOF; 52102000
|
|
LABEL PUTITBACK, CLEANUP; 52103000
|
|
ARRAY ROW[*]; 52104000
|
|
BOOLEAN STOPPERINSERT, LEFTENDCHECK; 52105000
|
|
REAL FORGETDISK; 52106000
|
|
MONITOR STEVEMONITOR (INDEX,DISKUNIT,RIGHTENDADDRESS,DKADDR,FORGETDISK, 52107000
|
|
SEGMENTS, STOPPER); 52108000
|
|
FORGETDISK:=*;DKADDR:=*;RIGHTENDADDRESS:=*;DISKUNIT:=*;%FOR MONITOR 52109000
|
|
PROCURE(USERDISKLOCK); 52110000
|
|
STOPPER ~ 0&DISKADDRESSL(REAL(NOT BOOLEAN(DISKUNIT)), *); 52111000
|
|
FOR I ~ MASKSEARCH(0&DISKADDRESSL(DISKUNIT,*),0&DISKADDRESSL(4"FF", 52112000
|
|
*), FORGETUSERDISKHEAD) STEP - 1 WHILE (T ~ FORGETUSERDISKHEAD[I])52113000
|
|
.EUNOF ! DISKUNIT DO 52114000
|
|
IF T.DISKADDRESSF < DKADDR THEN GO PUTITBACK; 52115000
|
|
T ~ FORGETUSERDISKHEAD[I+1]; 52116000
|
|
PUTITBACK: 52117000
|
|
ROW ~ USERDISKLIST[INDEX ~ T.USERDISKINDEXF, *]; 52118000
|
|
FOR J ~ MAXINDEX ~ ROW.LENGTHF - 1 STEP - 1 WHILE T ~ ROW[J] ! 52119000
|
|
STOPPER DO 52120000
|
|
IF T.DISKADDRESSF = RIGHTENDADDRESS THEN 52121000
|
|
BEGIN 52122000
|
|
SEGMENTS ~ * + T ~ T.DISKAREASIZEF; 52123000
|
|
ROW[J] := STOPPER; 52124000
|
|
STOPPERINSERT ~ TRUE; 52125000
|
|
RIGHTENDADDRESS ~ * + T; 52126000
|
|
END ELSE 52127000
|
|
IF T.DISKADDRESSF + T.DISKAREASIZEF = DKADDR THEN 52128000
|
|
BEGIN 52129000
|
|
ROW[J].DISKAREASIZEF ~ SEGMENTS ~ T.DISKAREASIZEF + 52130000
|
|
SEGMENTS; 52131000
|
|
RIGHTENDADDRESS ~ (DKADDR ~ ROW[J].DISKADDRESSF) + 52132000
|
|
SEGMENTS; 52133000
|
|
GO TO CLEANUP; 52134000
|
|
END ELSE 52135000
|
|
IF T.DISKADDRESSF < DKADDR THEN 52136000
|
|
BEGIN 52137000
|
|
REPLACE POINTER(ROW[0],*) BY POINTER(ROW[1],*) FOR 52138000
|
|
I WORDS; 52139000
|
|
ROW[J] ~ DKADDR & DISKAREAWORDL(SEGMENTS, *); 52140000
|
|
GO TO CLEANUP; 52141000
|
|
END; 52142000
|
|
ROW[J] ~ DKADDR & DISKAREAWORDL(SEGMENTS, *); 52143000
|
|
LEFTENDCHECK ~ TRUE; 52144000
|
|
CLEANUP: 52145000
|
|
IF J = MAXINDEX AND I < FORGETUSERDISKHEAD.LENGTHF - 1 THEN 52146000
|
|
IF RIGHTENDADDRESS = FORGETUSERDISKHEAD[I+1]. 52147000
|
|
DISKADDRESSF THEN 52148000
|
|
BEGIN 52149000
|
|
ROW[J].DISKAREASIZEF ~ SEGMENTS + L ~ USERDISKLIST[ 52150000
|
|
K ~ FORGETUSERDISKHEAD[I+1].USERDISKINDEXF, T ~ 52151000
|
|
MASKSEARCH(STOPPER, REAL(NOT FALSE), 52152000
|
|
USERDISKLIST[I+1,*]) + 1].DISKAREASIZEF; 52153000
|
|
IF T = MAXINDEX THEN 52154000
|
|
BEGIN COMMENT THE ROW IS EMPTY NOW; 52155000
|
|
END 52156000
|
|
ELSE 52157000
|
|
BEGIN 52158000
|
|
USERDISKLIST[K,T] ~ STOPPER; 52159000
|
|
FORGETUSERDISKHEAD[I+1].DISKADDRESSF ~ 52160000
|
|
USERDISKLIST[K,T+1]; 52161000
|
|
IF GETUSERDISKHEAD[N ~ MASKSEARCH( 52162000
|
|
0&USERDISKHEADWORD(K,*),0&USERDISKHEADWORD( 52163000
|
|
REAL(NOT FALSE),*), GETUSERDISKHEAD)]. 52164000
|
|
ADDRESSF = L THEN 52165000
|
|
BEGIN 52166000
|
|
J := 0; 52167000
|
|
FOR T := MAXINDEX STEP -1 WHILE L := 52168000
|
|
USERDISKLIST[K,T] ! STOPPER DO 52169000
|
|
IF L := L.DISKAREASIZEF > J THEN 52170000
|
|
J := L; 52171000
|
|
GETUSERDISKHEAD[N].ADDRESSF := J; 52172000
|
|
END; 52173000
|
|
END; 52174000
|
|
IF LEFTENDCHECK AND I > 0 THEN 52175000
|
|
IF (T ~ FORGETUSERDISKHEAD[I-1]).EUNOF = DISKUNIT THEN 52176000
|
|
IF DKADDR = (L ~ USERDISKLIST[K ~ T.USERDISKINDEXF, 52177000
|
|
MAXINDEX]).DISKADDRESSF + L.DISKAREASIZEF THEN 52178000
|
|
BEGIN 52179000
|
|
USERDISKLIST[K,MAXINDEX].DISKAREASIZEF ~ L ~ 52180000
|
|
L.DISKAREASIZEF + SEGMENTS; 52181000
|
|
ROW[J] ~ STOPPER; 52182000
|
|
IF J = MAXINDEX THEN 52183000
|
|
BEGIN COMMENT THIS ROW IS EMPTY; 52184000
|
|
END; 52185000
|
|
IF GETUSERDISKHEAD[N ~ MASKSEARCH( 52186000
|
|
0&USERDISKHEADWORD(K,*),0&USERDISKHEADWORD( 52187000
|
|
REAL(NOT FALSE),*), GETUSERDISKHEAD)]. 52188000
|
|
ADDRESSF < L THEN 52189000
|
|
GETUSERDISKHEAD[N].ADDRESSF := L; 52190000
|
|
END; 52191000
|
|
END; 52192000
|
|
IF STOPPERINSERT THEN 52193000
|
|
BEGIN 52194000
|
|
FOR L ~ N ~ MAXINDEX STEP - 1 UNTIL 0 DO 52195000
|
|
IF ROW[L] ! STOPPER THEN 52196000
|
|
BEGIN 52197000
|
|
ROW[N] ~ ROW[L]; N ~ N - 1; 52198000
|
|
END; 52199000
|
|
REPLACE POINTER(ROW[0]) BY STOPPER FOR N WORDS; 52200000
|
|
END; 52201000
|
|
IF T ~ ROW[0] ! STOPPER THEN 52202000
|
|
BEGIN COMMENT FULL ROW; 52203000
|
|
IF N ~ MASKSEARCH(0, REAL(NOT FALSE), 52204000
|
|
USERDISKDOPEVECTOR) < 0 THEN 52205000
|
|
BEGIN COMMENT SPACE EXPANSION REQUIRED; 52206000
|
|
END; 52207000
|
|
USERDISKLIST[N,*] ~ DUMMYAREA&ARRAYDESCL(0,MAXINDEX+1,0); 52208000
|
|
REPLACE POINTER(USERDISKLIST[N,0]) BY STOPPER FOR L ~ 52209000
|
|
MAXINDEX DIV 2 WORDS, POINTER(ROW[0]) FOR L WORDS; 52210000
|
|
REPLACE POINTER(ROW[0]) BY STOPPER FOR L WORDS; 52211000
|
|
REPLACE POINTER(FORGETUSERDISKHEAD[0]) BY 52212000
|
|
POINTER(FORGETUSERDISKHEAD[1]) FOR I WORDS; 52213000
|
|
FORGETUSERDISKHEAD[I-1] ~ T & USERDISKHEADWORD(N,*); 52214000
|
|
T ~ 0; 52215000
|
|
FOR L ~ MAXINDEX - L STEP 1 UNTIL MAXINDEX DO 52216000
|
|
IF T < K ~ USERDISKLIST[N,L].DISKAREASIZEF THEN 52217000
|
|
T ~ K; 52218000
|
|
FOR L ~ MASKSEARCH(0&USERDISKHEADWORD(L,*), 52219000
|
|
0&USERDISKHEADWORD(REAL(NOT FALSE), *), 52220000
|
|
GETUSERDISKHEAD) STEP - 1 WHILE GETUSERDISKHEAD[L]. 52221000
|
|
EUNOF ! DISKUNIT DO; 52222000
|
|
REPLACE POINTER(GETUSERDISKHEAD[0]) BY 52223000
|
|
POINTER(GETUSERDISKHEAD[1]) FOR L WORDS; 52224000
|
|
GETUSERDISKHEAD[L] ~ T & USERDISKHEADWORD(N,DISKUNIT,*); 52225000
|
|
END; 52226000
|
|
FORGETUSERDISKHEAD[I] ~ ROW[L ~ MASKSEARCH(STOPPER, 52227000
|
|
REAL(NOT FALSE), ROW) + 1] & USERDISKHEADWORD(INDEX,*); 52228000
|
|
T ~ 0; 52229000
|
|
FOR L ~ L STEP 1 UNTIL MAXINDEX DO 52230000
|
|
IF T < K ~ ROW[L].DISKAREASIZEF THEN 52231000
|
|
T ~ K; 52232000
|
|
GETUSERDISKHEAD[MASKSEARCH(0&USERDISKHEADWORD(INDEX,*), 52233000
|
|
0&USERDISKHEADWORD(REAL(NOT FALSE),*), GETUSERDISKHEAD)] ~ 52234000
|
|
T; 52235000
|
|
LIBERATE(USERDISKLOCK); 52236000
|
|
EXIT; 52237000
|
|
FORGETDISK:=1; 52238000
|
|
END FORGETUSERDISK; 52239000
|
|
REAL PROCEDURE NOUSERDISK(SEGMENTS, SPEED); 52240000
|
|
VALUE SEGMENTS, SPEED; 52241000
|
|
REAL SEGMENTS, SPEED; 52242000
|
|
COMMENT THIS PROCEDURE MANAGES TO OBTAIN THE DISK REQUIRED BY 52243000
|
|
CAUSING FILES TO BE UNLOADED TO BACKUP; 52244000
|
|
BEGIN 52245000
|
|
REAL DISKPUNT;%FOR MONITOR ONLY 52246000
|
|
MONITOR STEVEMONITOR(DISKPUNT); 52247000
|
|
DISKPUNT :=1;%FOR MONITOR ONLY 52248000
|
|
HOLD; 52249000
|
|
END; 52250000
|
|
PROCEDURE RELEASEHEADER(HEADER, CODE); 55000000
|
|
VALUE HEADER, CODE; 55001000
|
|
WORD HEADER; 55002000
|
|
REAL CODE; 55002500
|
|
COMMENT A CALL ON THIS PROCEDURE WILL RELEASE THE CALLER"S USE OF 55003000
|
|
A DISK FILE HEADER. DEPENDING ON THE VALUES OF CODE, AND 55004000
|
|
VARIOUS BITS IN THE HEADER ITSELF, OTHER WONDEROUS THINGS WILL 55005000
|
|
HAPPEN. 55006000
|
|
; 55007000
|
|
BEGIN 55008000
|
|
REAL COUNT, T, INDEX = HEADER; 55009000
|
|
ARRAY HDR[*]; 55010000
|
|
REAL RELHDR; 55011000
|
|
MONITOR STEVEMONITOR(HEADER, CODE, COUNT, RELHDR); 55012000
|
|
RELHDR:=*;CODE:=*;INDEX:=*;%MONITOR 55013000
|
|
COMMENT SOME PEOPLE PASS ME A DESCRIPTOR, SO I MUST FIND THE 55013100
|
|
ACTUAL INDEX; 55013150
|
|
IF HEADER.TAG ! SINGL THEN 55013200
|
|
IF HEADER := MASKSEARCH(HEADER, 4"80FFFFFFFFFF" & 55013250
|
|
SETTAG(DATADESC), DISKFILEHEADERSDOPEVECTOR) 55013300
|
|
< 0 THEN 55013350
|
|
STOP; COMMENT THE CALLER BLEW IT; 55013500
|
|
EXIT;%DON"T SCREW UP ANYTHING DIRECTORYSEARCH DIDN"T DO 55013600
|
|
HDR := DISKFILEHEADERS[INDEX, *]; 55014000
|
|
PROCURE(HEADERLOCK); 55015000
|
|
IF HEADERUPDATED(HDR) OR COUNT := OPENCOUNT(HDR) - 1 = 0 THEN 55016000
|
|
BEGIN 55017000
|
|
T := READLOCK(IF COUNT = 0 THEN 0 ELSE INDEX, HDR[0]); 55018000
|
|
DISKWAIT(HDR, -1, HEADERSIZE(HDR), M[HDR.ADDRESSF - 1]. 55019000
|
|
DISKADDRESSF, @40); 55020000
|
|
HDR[6] := T; 55021000
|
|
END DISK COPY UPDATING; 55022000
|
|
IF COUNT ! 0 THEN 55023000
|
|
BEGIN 55024000
|
|
OPENCOUNT(HDR) := COUNT; 55025000
|
|
END 55026000
|
|
ELSE IF INDEX ! 0 THEN 55027000
|
|
BEGIN 55028000
|
|
DISKFILEHEADERS[INDEX, *] := HDR & ARRAYDESCL(0,0,0); 55029000
|
|
FORGETSPACE(HDR.ADDRESSF); 55030000
|
|
END; 55031000
|
|
LIBERATE(HEADERLOCK); 55032000
|
|
RELHDR:=1; 55033000
|
|
EXIT; 55034000
|
|
END RELEASEHEADER; 55035000
|
|
REAL PROCEDURE SCRAMBLEINX(P, MODULUS); 55036000
|
|
VALUE P, MODULUS; 55037000
|
|
POINTER P; 55038000
|
|
REAL MODULUS; 55039000
|
|
BEGIN 55040000
|
|
REAL S, I, J; 55041000
|
|
J~ (J~ REAL(P, 1))-(I~ J MOD 4); 55042000
|
|
IF I>0 THEN S~ REAL(P, I); 55043000
|
|
IF J>0 THEN 55044000
|
|
FOR I~ I+1 BY 4 UNTIL J DO 55045000
|
|
S~ S+REAL(P+I, 4); 55046000
|
|
RETURN(S MOD MODULUS); 55047000
|
|
END CALCULATE SCRAMBLE INDEX; 55048000
|
|
REAL PROCEDURE SUBDIRECTORYSEARCH(HDR, NMP); 55049000
|
|
VALUE NMP; 55050000
|
|
ARRAY HDR[*]; 55051000
|
|
POINTER NMP; 55052000
|
|
COMMENT THIS IS THE GUTS OF THE SEARCH MECHANISM OF 55053000
|
|
DIRECTORYSEARCH. 55054000
|
|
HDR IS A CORE AREA CONTAINING A DIRECTORY HEADER AND AN I/O 55055000
|
|
BUFFER AREA. 55056000
|
|
NMP IS A POINTER TO THE NAME WHICH IS HOPED TO EXIST AT THIS 55057000
|
|
LEVEL IN THE DIRECTORY. IT IS IN THE FORM 55058000
|
|
"NXX...X" 55059000
|
|
WHERE N IS THE NUMBER OF CHARACTERS IN THE NAME. 55060000
|
|
THE NAME SOUGHT IS FOUND, SUBDIRECTORYSEARCH RETURNS THE 55061000
|
|
INDEX INTO HDR OF THE DIRECTORY ENTRY ASSOCIATED WITH THAT 55062000
|
|
NAME. OTHERWISE, IT RETURNS A NEGATIVE NUMBER, WHICH 55063000
|
|
MAY HAVE SIGNIFICANCE AT A LATER DATE. 55064000
|
|
; 55065000
|
|
BEGIN 55066000
|
|
LAYOUT LEFTJUSTIFY(8|(6-I):8|I), FIRSTCHR(47:8); 55067000
|
|
REAL I, J, MODX, INDEX, NOMEN, CHRS; 55068000
|
|
REAL RWSZ := ROWSIZE(HDR); 55069000
|
|
ARRAY TNAME[3]; 55070000
|
|
LABEL RESTART, OUT; 55071000
|
|
DEFINE WHATSTHEADDRESS(RECORDNO) = 55072000
|
|
HDR[FIRSTROWINDEX + (MODX ~ RECORDNO | 55073000
|
|
SEGMENTSPERDIRECTORYBITE) DIV RWSZ] + MODX MOD RWSZ # 55074000
|
|
; 55075000
|
|
REAL SUBSRCH; 55076000
|
|
MONITOR STEVEMONITOR(MODEX,SUBSRCH,INDEX,NOMEN); 55077000
|
|
MONITOR STEVEMONITOR(SUBDIRECTORYSEARCH); 55078000
|
|
SUBSRCH:=*; 55079000
|
|
IF J := NMP.SZF ! EBCDIC THEN 55080000
|
|
BEGIN 55081000
|
|
I := 6; 55082000
|
|
CHRS := REAL(NMP,1); 55083000
|
|
IF J = BCL THEN 55084000
|
|
REPLACE POINTER(TNAME,8) + 1 BY NMP + 1 FOR CHRS WITH 55085000
|
|
BCLTOEBC 55086000
|
|
ELSE 55087000
|
|
REPLACE POINTER(TNAME,8) + 1 BY NMP + 1 FOR CHRS WITH 55088000
|
|
HEXTOEBC; 55089000
|
|
TNAME[0] := * & FIRSTCHR(CHRS); 55090000
|
|
END; 55091000
|
|
INDEX := (HEADERSIZE(HDR) + 29) DIV 30 - 1; 55092000
|
|
NOMEN := 0&LEFTJUSTIFY(REAL(NMP, I ~ MIN(CHRS ~ REAL(NMP,1)+1,6))); 55093000
|
|
IF MODX := SCRAMBLEMOD(HDR) > 1 THEN 55094000
|
|
MODX := SCRAMBLEINX(NMP, MODX); 55095000
|
|
IF MODX ! HDR[INDEX + 3] THEN 55096000
|
|
DISKWAIT(HDR, INDEX-1, DIRECTORYBITE, 55097000
|
|
WHATSTHEADDRESS(MODX), @440); 55098000
|
|
RESTART: 55099000
|
|
FOR I := INDEX+4 STEP 5 WHILE NOT BOOLEAN(HDR[I]) DO 55100000
|
|
IF NOMEN IS HDR[I+2] THEN 55101000
|
|
IF NMP = POINTER(HDR[I+2], 8) FOR CHRS THEN 55102000
|
|
BEGIN 55103000
|
|
SUBDIRECTORYSEARCH := I; 55104000
|
|
GO OUT; 55105000
|
|
END; 55106000
|
|
IF HDR[I] = 3 THEN 55107000
|
|
BEGIN 55108000
|
|
DISKWAIT(HDR, INDEX-1, DIRECTORYBITE, WHATSTHEADDRESS( 55109000
|
|
HDR[INDEX]), @440); 55110000
|
|
GO RESTART; 55111000
|
|
END; 55112000
|
|
SUBDIRECTORYSEARCH := -1; 55113000
|
|
OUT: 55114000
|
|
SUBSRCH:=1; 55115000
|
|
END SUBDIRECTORYSEARCH; 55116000
|
|
REAL PROCEDURE DIRECTORYSEARCH(NMP, CODE, LOCKIT); 55117000
|
|
VALUE NMP, CODE, LOCKIT; 55118000
|
|
POINTER NMP; 55119000
|
|
REAL CODE; 55120000
|
|
BOOLEAN LOCKIT; 55121000
|
|
COMMENT DIRECTORYSEARCH WILL ATTEMPT TO FIND THE FILE WHOSE 55122000
|
|
STANDARDFORM NAME IS POINTED TO BY NMP. THE FORM OF THIS NAME 55123000
|
|
IS: 55124000
|
|
NMXXX...XXMXX...XX... 55125000
|
|
WHERE N IS THE NUMBER OF NAMES AND M IS THE CHARACTER COUNT 55126000
|
|
FOR A NAME. 55127000
|
|
IF SUCCESSFUL IN FINDING THE FILE, DIRECTORYSEARCH WILL SET 55128000
|
|
UP THE FILE HEADER AS A ROW IN "DISKFILEHEADERS" AND RETURN 55129000
|
|
THE ROW INDEX OF THIS HEADER. 55130000
|
|
IF UN-SUCCESSFUL, A NEGATIVE NUMBER WILL BE RETURNED. THE 55131000
|
|
DCODE1 FIELD OF THIS NUMBER WILL CONTAIN THE NUMBER OF THE 55132000
|
|
NAME ON WHICH THE SEARCH FAILED, THE ADDRESS FIELD WILL CONTAIN55133000
|
|
A CODE INDICATING THE REASON THE SEARCH FAILED (I.E. NO FILE, 55134000
|
|
NON-DIRECTORY FOUND WHEN DIRECTORY REQUIRED, SECURITY BLOCK). 55135000
|
|
; 55136000
|
|
BEGIN 55137000
|
|
REAL DEPTH := REAL(NMP, 1); 55138000
|
|
REAL I, J, SIZE, DKADDR; 55139000
|
|
LABEL THEEND; 55140000
|
|
BOOLEAN FILE, ALREADYTHERE; 55141000
|
|
ARRAY HDR[*]; 55142000
|
|
DEFINE 55143000
|
|
EVENTT = HEADEREVENTS[INDEX] #, 55144000
|
|
HDRINFO = HDR[J] #, 55145000
|
|
NOBODYTHERE = - NOSUCHFILE #, 55146000
|
|
UNMOGLICH = - NOTAVALIDFILENAME #, 55147000
|
|
WRONGEN = - FILEWITHWRONGGENEOLOGY #; 55148000
|
|
REAL DIRSRCH; 55149000
|
|
MONITOR STEVEMONITOR (CODE,LOCKIT,DIRSRCH,SIZE,DEPTH,DKADDR); 55150000
|
|
MONITOR STEVEMONITOR (DIRECTORYSEARCH); 55151000
|
|
DIRSRCH:=*;DEPTH:=*; 55152000
|
|
PROCURE(DIRECTORYLOCK); 55154000
|
|
HDR := SYSTEMDIRECTORY; 55155000
|
|
NMP := NMP + 1; 55156000
|
|
GO TO THEEND; % * KLUDGE FOR SIMULATING * 55156010
|
|
FOR I := 0 STEP 1 UNTIL DEPTH DO 55157000
|
|
BEGIN 55158000
|
|
IF J := SUBDIRECTORYSEARCH(HDR, NMP) < 0 THEN 55159000
|
|
BEGIN 55160000
|
|
DIRECTORYSEARCH := NOBODYTHERE & DIRECTORYSEARCHCODES(I); 55161000
|
|
GO TO THEEND; 55162000
|
|
END; 55163000
|
|
IF HDRINFO.FILEKINDF ! DIRECTORY AND I ! DEPTH THEN 55164000
|
|
BEGIN 55165000
|
|
DIRECTORYSEARCH := UNMOGLICH & DIRECTORYSEARCHCODES(I); 55166000
|
|
GO TO THEEND; 55167000
|
|
END; 55168000
|
|
DKADDR := HDR[J+1]; 55169000
|
|
IF I = 0 OR HDR.LENGTHF < SIZE := (HDRINFO.HEADERSIZEF + 29) 55170000
|
|
DIV 30 + DIRECTORYBITE OR FILE := HDRINFO.FILEKINDF > 55171000
|
|
DIRECTORY THEN 55172000
|
|
BEGIN 55173000
|
|
IF I ! 0 THEN 55174000
|
|
FORGETSPACE(HDR.ADDRESSF); 55175000
|
|
HDR := HDR & ARRAYDESCL(0, IF FILE THEN SIZE := HDRINFO. 55176000
|
|
HEADERSIZEF ELSE SIZE, 1); 55177000
|
|
END; 55178000
|
|
IF ALREADYTHERE := J := HDR[0] ! 0 THEN 55179000
|
|
DISKWAIT(HDR, -1, SIZE, DKADDR, @440); 55180000
|
|
BEGIN 55181000
|
|
END; 55182000
|
|
END; 55183000
|
|
IF NOT ALREADYTHERE THEN 55184000
|
|
M[HDR.ADDRESSF - 1] := DKADDR & SETTAG(MEMLINK); 55185000
|
|
THEEND: 55186000
|
|
LIBERATE(DIRECTORYLOCK); 55187000
|
|
DIRSRCH:=1; 55188000
|
|
END DIRECTORYSEARCH; 55189000
|
|
SAVE 1 PROCEDURE PERIPHERALINITIALIZE; 59000000
|
|
BEGIN 59001000
|
|
COMMENT THIS PROCEDURE EVENTUALLY WILL RE BUILD THE DIRECTORY, 59002000
|
|
BUILD THE ESPDISK AND USERDISK MAPS, ETC. IT WILL ALSO CONTAIN59003000
|
|
THE DCP INITIALIZATION CODE (WHATEVER THAT IS). RIGHT NOW ALL 59004000
|
|
IT DOES IS BUILD THE PERIPHERAL TABLES, REWIND TAPES AND WRITE 59005000
|
|
HALT LOAD MESSAGES ON THE SUPERVISORY CONSOLES THAT HAPPEN TO 59006000
|
|
BE IN RECEIVE MODE; 59007000
|
|
SAVE ARRAY TUNITS, IOAREA, DISKS [256]; 59008000
|
|
REAL I, UNID, MAXU, TOTALEU, T1, J, UMPXD, FIRSTREADY, T, 59011000
|
|
DIRECTORYHEADERSIZE := 30, %THE ":= 30" IS TEMPORARY 59011100
|
|
DISKUSERW = MAXU, SWITCHES = UMPXD; 59012000
|
|
POINTER TP; 59013000
|
|
ARRAY SLCDESC[*]; 59014000
|
|
WORD WIPEOUTPCW = PERIPHERALINITIALIZE; 59015000
|
|
DEFINE TYPEINT = TYPEINTERROGATE #, 59016000
|
|
PATHINT = TYPEINTERROGATE #, 59017000
|
|
TYPECNTR = TUNITS #; 59018000
|
|
DEFINE INITIALIZERARRAY(QARRAY, RARRAY, LENGTH) = 59019000
|
|
REPLACE POINTER(RARRAY) BY POINTER(QARRAY) 59020000
|
|
FOR LENGTH OVERWRITE #; 59021000
|
|
DEFINE STATE (I) = BOOLEAN(SCANIN(0 & USTATUSWORD(I.DIV32F, 59021100
|
|
,*,*))).[I.MOD32F+1:1] #; 59021200
|
|
DEFINE UNITREALLYOUTTHERE= UNID>0#;% 59021300
|
|
FIELD DUNITF = DIAGNOSTICUNIT.MOD32F:1, 59022000
|
|
BITF = I.MOD32F:1; 59023000
|
|
PROCEDURE DISKMAPPER; 59024000
|
|
BEGIN 59025000
|
|
SAVE ARRAY LLLARRAY[LLLROWS, LLLCHUNK]; 59026000
|
|
WORD ARRAY DOPEVECTOR1 = DISKFILEHEADERS [*], 59026100
|
|
DOPEVECTOR2 = USERDISKLIST [*]; 59026200
|
|
COMMENT THESE ARE USED TO CREATE THE DOPE 59026300
|
|
VECTORS FOR THE GLOBAL TWO DIMENSIONAL ARRAYS TO59026400
|
|
WHICH THEIR ADDRESSES ARE EQUATED. 59026500
|
|
; 59026600
|
|
ARRAY SWITCHPOINTS[*]; 59026700
|
|
BOOLEAN READY; 59027000
|
|
MONITOR STEVEMONITOR( SWITCHES,UNID,T1,READY,NEXTADDR); 59027100
|
|
SAVE %SO THE MONITOR DOESNT MAKE IT A SEGMENT 59027990
|
|
BOOLEAN PROCEDURE TESTSWITCH(USERW, SWITCH); 59028000
|
|
VALUE USERW, SWITCH; 59029000
|
|
REAL USERW, SWITCH; 59030000
|
|
BEGIN 59031000
|
|
BOOLEAN NTRDY; MONITOR STEVEMONITOR (NTRDY); 59031100
|
|
IOAREA[0] := SET(DECIMAL(SWITCH), 38); % TEST S. U. 59032000
|
|
IF NOT SIMULATING THEN IOAREA[0]~*&IOCWL(@440,*);%KLUDGE FOR DFC 1 & 2 59032010
|
|
NTRDY := %FOR MONITOR ONLY 59032990
|
|
TESTSWITCH ~ BOOLEAN(WAITIO(IOAREA, USERW, REAL(NOT FALSE)59033000
|
|
).RDNOTREADY); 59034000
|
|
END; 59035000
|
|
DEFINE CHECKFOROVERFLOW = 59036000
|
|
IF NEXTADDR ~ * + 2 } MAXADDR THEN 59037000
|
|
BEGIN 59038000
|
|
LLLARRAY[NEXTROW ~ * + 1, 0] ~ 0; 59039000
|
|
MAXADDR ~ (NEXTADDR ~ LLLARRAY[NEXTROW, *].ADDRESSF) 59040000
|
|
+ LLLCHUNK; 59041000
|
|
END 59042000
|
|
#; 59043000
|
|
DOPEVECTOR1 := DOPEVECTOR1 & ARRAYDESCL(0, 59074100
|
|
HEADERSTOSTARTWITH, 0); 59074150
|
|
DOPEVECTOR2 := DOPEVECTOR2 & ARRAYDESCL(0, 59074200
|
|
TOTALEU | EUFACTOR, 0); 59074250
|
|
INITIALIZEARRAY(SYSTEMDIRECTORY, SYSTEMDIRECTORY, 59074300
|
|
DIRECTORYHEADERSIZE + DIRECTORYBITE); 59074320
|
|
DOPEVECTOR1[0] := SYSTEMDIRECTORY & ARRAYDESCL(,*,*); 59074340
|
|
COMMENT NOTE THE TWO NAMES FOR THE SAME AREA; 59074360
|
|
M[DOPEVECTOR1.ADDRESSF + DOPEVECTOR1.LENGTHF]. 59074380
|
|
SPACEOLAYLOCK := 0; %MAKE IT SAVE AT HIGH MEMORY END 59074390
|
|
DOPEVECTOR1[1] := 0 & DATADESCRIPTOR(,*); 59074400
|
|
REPLACE POINTER(DOPEVECTOR1[2],*) BY 59074420
|
|
POINTER(DOPEVECTOR1[1],*) FOR HEADERSTOSTARTWITH 59074450
|
|
- 2 OVERWRITE; 59074480
|
|
DOPEVECTOR2[0] := 0 & DATADESCRIPTOR(,*,*,*,*,*,*,*, 59074500
|
|
USERDISKLISTROWSIZE, 1); 59074520
|
|
REPLACE POINTER(DOPEVECTOR2[1],*) BY 59074550
|
|
POINTER(DOPEVECTOR2[0],*) FOR TOTALEU | EUFACTOR 59074580
|
|
- 1 OVERWRITE; 59074600
|
|
M[DOPEVECTOR2.ADDRESSF + DOPEVECTOR2.LENGTHF]. 59074640
|
|
SPACEOLAYLOCK := 0; %MAKE IT SAVE AT HIGH MEMORY END 59074680
|
|
GETUSERDISKHEAD := FORGETUSERDISKHEAD := 59074700
|
|
GETUSERDISKHEAD & ARRAYDESCL(0,TOTALEU|EUFACTOR,1); 59074800
|
|
COMMENT KLUDGE IT UP FOR DIRECTORY SEARCHERS; 59074900
|
|
DISKFILEHEADERS[0,10]:=IF SIMULATING THEN 0&DISKADDRESSL(DISKB,*) ELSE 59074950
|
|
1250 & DISKADDRESSL(MCPDISKUNITNO,*); 59074960
|
|
TOTALEU ~ * - 1; 59076000
|
|
MAXADDR ~ NEXTROW ~ -1; 59077000
|
|
LASTADDR := IOAREA.ADDRESSF; %FOR THE FIRST STORE 59077100
|
|
FOR J ~ 0 STEP 1 UNTIL TOTALEU DO 59078000
|
|
BEGIN 59079000
|
|
IOAREA[0] := SET(0, 38); %TEST DISK TYPE 59080000
|
|
SWITCHES := (SWITCHPOINTS := 59080050
|
|
CASE T1 := WAITIO(IOAREA, DISKUSERW := 0 & 59080100
|
|
USERL(*,,UNID := DISKS[J], ), REAL(NOT FALSE))59080200
|
|
.RDDISKFILETYPEF OF ( 59080300
|
|
DISKFILE1C5, 59080400
|
|
IF SIMULATING THEN DISKFILESIM ELSE 59080500
|
|
DISKFILE1AX, 59080600
|
|
DISKFILE1C3, 59080700
|
|
DISKFILE1C4 59080800
|
|
)).LENGTHF - 1; 59080900
|
|
UNIT[UNID].DENSITYF := T1; 59080950
|
|
READY := FALSE; 59080960
|
|
FOR I := 0 STEP 4 UNTIL SWITCHES DO 59081000
|
|
IF TESTSWITCH(DISKUSERW, SWITCHPOINTS[I]) THEN 59082000
|
|
IF READY THEN 59083000
|
|
BEGIN 59084000
|
|
CHECKFOROVERFLOW; 59085000
|
|
T1 := %FOR MONITORING 59085010
|
|
M[NEXTADDR] ~ 0 & FIRSTMAPWORD( 59086000
|
|
UNID, SWITCHPOINTS[FIRSTREADY], *); 59087000
|
|
T1 := %FOR MONITORING 59087010
|
|
M[NEXTADDR+1] ~ SWITCHPOINTS[I] - 59088000
|
|
SWITCHPOINTS[FIRSTREADY]; 59089000
|
|
M[LASTADDR].ADDRESSF := 59090000
|
|
LASTADDR := NEXTADDR; 59091000
|
|
READY ~ FALSE; 59093000
|
|
END 59094000
|
|
ELSE 59095000
|
|
ELSE 59096000
|
|
IF NOT READY THEN 59097000
|
|
BEGIN 59098000
|
|
READY ~ TRUE; 59099000
|
|
FIRSTREADY ~ I; 59100000
|
|
END; 59101000
|
|
END; 59102000
|
|
CHECKFOROVERFLOW; 59103000
|
|
FIRSTADDR := LLLARRAY[0,*].ADDRESSF; 59104000
|
|
M[NEXTADDR] ~ 0 & FIRSTMAPWORDPRIME(REAL(NOT FALSE), *); 59105000
|
|
IF FIRSTADDR = NEXTADDR THEN EXIT; % BECAUSE SOMETHING SCREWED UP 59105100
|
|
M[LASTADDR].ADDRESSF ~ NEXTADDR; 59106000
|
|
DISKMAPARRAY := LLLARRAY; 59106100
|
|
GIVEBACKDISK(MCPDISKBASE, MCPINFO.ADDRESF + 59107000
|
|
(MCPINFOSIZE DIV 30)); 59108000
|
|
EXIT; 59108100
|
|
END DISKMAPPER; 59109000
|
|
MCPARRAYINFOT[0]~1; 59600000
|
|
WIPEOUTPCW := NEXTADDR := 0; 59601000
|
|
FOR I ~ 0 STEP 1 UNTIL 255 DO 59603000
|
|
IF UNID ~ SCANIN(0&TYPEINT(I,,*,*)) ! 0 THEN 59604000
|
|
BEGIN 59605000
|
|
MAXU ~ I; 59606000
|
|
TUNITS[I] := 0 & UNITINITIALIZE(UNID, (T := 59607000
|
|
SCANIN(0 & PATHINT(I,*,*,*))).MPXDESIGNATOR59608000
|
|
, T); 59609000
|
|
END; 59620000
|
|
MAXUNIT ~ MAXU; 59621000
|
|
INITIALIZEARRAY(OLDSTATUSWORD, OLDSTATUSWORD, 1 + 59622000
|
|
MAXVECTORNO := ((MAXU := * + 1) + 30).DIV32F - 1); 59623000
|
|
INITIALIZEARRAY(UNIT,TRANSACTION,MAXU); 59624000
|
|
MAXCHANNELS ~ FIRSTONE(MAXCHANNELS); 59625000
|
|
INITIALIZEQARRAY(FIRSTIO, MAXU); 59626000
|
|
INITIALIZEQARRAY(FIRSTUNIT, MAXCHANNELS); 59627000
|
|
INITIALIZERARRAY(FIRSTIO, LASTIO, MAXU); 59628000
|
|
INITIALIZEARRAY(LASTUNIT,LASTUNIT,MAXCHANNELS); 59629000
|
|
INITIALIZERARRAY(FIRSTUNIT, LASTUNIT, MAXCHANNELS); 59630000
|
|
COMMENT ALL UNITS ARE LEFT MARKED NOT READY SO THAT 59631000
|
|
STATUS WILL REACT TO THEM AND TAKE THE PROPER ACTION;59632000
|
|
REPLACE POINTER(UNIT[0]) BY POINTER(TUNITS[0]) 59633000
|
|
FOR MAXU WORDS; 59634000
|
|
INITIALIZEARRAY(TYPEINDX, TYPEINDX, (MAXUNITTYPE+1) DIV 6 59635000
|
|
+ 1); 59636000
|
|
INITIALIZEARRAY(MNEMTOUNIT, MNEMTOUNIT, MAXUNIT 59637000
|
|
DIV 6 + 1); 59638000
|
|
COMMENT MARK FILE IDS NOT READY; 59639000
|
|
REPLACE POINTER(TYPECNTR) BY 0 FOR MAXU WORDS; 59643000
|
|
FOR I := 0 STEP 1 UNTIL MAXUNIT DO 59644000
|
|
BEGIN 59645000
|
|
IF UNID := UNIT[I].UNITTYPE = DISKFILE THEN 59651000
|
|
BEGIN 59652000
|
|
IF STATE[I] THEN 59652100
|
|
BEGIN 59652400
|
|
DISKS[TOTALEU] ~ I; 59653000
|
|
IF TOTALEU ~ * + 1 = 1 THEN 59654000
|
|
MCPDISKBASE ~ 0 & DISKADDRESSL(I, *); 59655000
|
|
IF TOTALEU = 2 THEN DISKB ~ I; %KLUDGE FOR KLUDGED DIRECTORYSEARCH 59655100
|
|
END 59655200
|
|
ELSE UNIT[I] := UNID := 0 %NOT REALLY A DISK 59655300
|
|
END 59657000
|
|
ELSE 59658000
|
|
IF UNID = SPO THEN 59659000
|
|
BEGIN 59660000
|
|
IOAREA[0] := SET(0, 38); %TEST 59661000
|
|
IF WAITIO(IOAREA, 0&USERL(*,,I,*), REAL(NOT 59662000
|
|
FALSE)).CONSOLEIDF = 0 THEN 59662100
|
|
UNIT[I] := UNID := 0 %NO DISPLAY ATTACHED 59662200
|
|
END 59664000
|
|
ELSE 59665000
|
|
IF MAGTAPE(UNID) THEN 59666000
|
|
BEGIN 59668000
|
|
IOAREA[0]~0&IOCWL(TAPEREWIND,0); 59669000
|
|
WAITIO(IOAREA,0&USERL(*,,I,*),REAL(NOT FALSE)); 59671000
|
|
UNIT[I]~*&UNITL(1,,,1); 59671100
|
|
END; 59676000
|
|
IF UNITREALLYOUTTHERE THEN% 59676100
|
|
BEGIN% 59676200
|
|
UNIT[I].UNITTYPECNTRF~TYPECNTR[UNID]~*+1;% 59676300
|
|
IF MINUNIT<0 THEN MINUNIT~I;% 59676400
|
|
END;% 59676500
|
|
END; 59677000
|
|
INITIALIZEARRAY(LOGHDR,LOGHDR,LOGHDRSZ);% 59678000
|
|
INITIALIZEARRAY(LOGBUF,LOGBUF,SEGMENTSZ+1);% 59678100
|
|
INITIALIZEARRAY(CHANNELLOCKS,CHANNELLOCKS,% 59679000
|
|
MAXPSUEDOCHANNELS); 59679002
|
|
INITIALIZEARRAY(CHANNELGUIDE,CHANNELGUIDE,% 59679100
|
|
MAXPSUEDOCHANNELS); 59679102
|
|
INITIALIZEQARRAY(PICQ, MAXPSUEDOCHANNELS);% 59679200
|
|
INITIALIZEARRAY(SCREEN,SCREEN,NOOFSCREENSRQD); 59680000
|
|
T ~ NAME(TYPEINDX).ADDRESSF; 59681000
|
|
FOR I~ NAME(DICA).ADDRESSF STEP 1 UNTIL T DO 59682000
|
|
M[I] ~ M[1] & STRINGDESCRIPTOR(*, *, *, *, *, *, 59683000
|
|
EBCDIC,M[I].LENGTHF | CHRS, *); 59684000
|
|
FOR I := 1 STEP 1 UNTIL MAXUNITTYPE DO 59686000
|
|
REPLACE POINTER(TYPEINDX[I+1], *) BY 0 & BINEL( 59687000
|
|
TYPECNTR[I]+REAL(POINTER(TYPEINDX[I],*),1)) FOR 1; 59688000
|
|
FOR I := 0 STEP 1 UNTIL MAXUNIT DO 59689000
|
|
IF T ~ UNIT[I].UNITTYPE > 0 THEN 59690000
|
|
REPLACE POINTER(MNEMTOUNIT[TI(T) + 59691000
|
|
UNIT[I].UNITTYPECNTRF-1],*)BY 0&BINEL(I)FOR 1;59692000
|
|
% ***** NEED THE FOLLOWING KLUDGE UNTIL WE DYNAMICALLY SET SCREENS 59692200
|
|
SCREEN[0]~UNITBL[TI(CONN),1];% 59692201
|
|
INITIALIZERARRAY(SCREEN[0],SCREEN[1],NOOFSCREENSRQD-1);% 59692202
|
|
59693000
|
|
DIAGNOSTICUNIT ~ MASKSEARCH(0&UNITINITIALIZE( 59694000
|
|
DIAGNOSTICUNITTYPE),0&UNITINITIALIZE(4"FF"),UNIT); 59695000
|
|
DIAGNOSTICARRAY[0] := 0&USERL(*,,DIAGNOSTICUNIT,*); 59699100
|
|
DIAGNOSTICARRAY[1] := -0; 59699200
|
|
DIAGNOSTICARRAY[2] := MONITER := MONITER&ARRAYDESCL(3, 59699300
|
|
DIAGNOSTICARRAY.LENGTHF - IOCBSIZE, 59699400
|
|
DIAGNOSTICARRAY.ADDRESSF + IOCBSIZE); 59699500
|
|
DIAGNOSTICARRAY[2].LENGTHF := MONITER.LENGTHF - 1; 59699550
|
|
STOREITEM(EVNT @ REFERENCE(DIAGNOSTICARRAY), 59699600
|
|
MONITORFINISH); 59699700
|
|
IOAREA[0] := SET(0 & IOCWL(@300, *), 32); 59699720
|
|
IF NOT SIMULATING THEN BEGIN 59699735
|
|
WAITIO(IOAREA, 0 & USERL(*,,DIAGNOSTICUNIT,*), 59699740
|
|
REAL(NOT FALSE)); 59699760
|
|
MONITORVALUE := MCPINFO[10].MONVALF; 59700000
|
|
MONITORMASK := MCPINFO[10].MONMASKF; 59700100
|
|
STOP(3"721127",3"700007"); %SEE IF MONITOR IS RIGHT 59700105
|
|
END IF NOT SIMULATING; 59700110
|
|
UBITSTABLESIZE := (MAXUNIT + 47) DIV 48; 59700200
|
|
MCPDISKUNITNO := MCPDISKBASE.EUNOF; 59700300
|
|
UNLOCK(MONITORLOCK); % IT IS OK TO MONITOR NOW 59700400
|
|
REPLACE TP:POINTER(IOAREA[1], 8) BY CLEARSCREEN, 59701000
|
|
POINTER(OUTPUTMESS[BEGMCPID], 8) UNTIL = NUL, 59702000
|
|
HOME LINEFEED, FORMATTEDDATEPOINTER UNTIL = NUL, 59703000
|
|
NUL FOR 5; 59703100
|
|
IOAREA[0] ~ 0 & IOCWL(@40, *); 59704000
|
|
SLCDESC := IOAREA & ARRAYDESCL(3, TP.INDEXSTF, *); 59704200
|
|
FOR I ~ 0 STEP 1 UNTIL MAXUNIT DO 59705000
|
|
IF UNIT[I].UNITTYPE = SPO THEN 59706000
|
|
WAITIO(SLCDESC,0&USERL(*,,I,*),REAL(NOT 59707000
|
|
FALSE)); 59707010
|
|
FOR I := MAXCHANNELS STEP -1 UNTIL 1 DO 59707100
|
|
IF MULTIPLEXORMASK.[I:1] THEN 59707150
|
|
SCANOUT(0, SET(1 & SCANOUTWORD(4,*,*), I)); 59707200
|
|
PROCURE(DIRECTORYLOCK); 59710000
|
|
PROCURE(USERDISKLOCK); 59711000
|
|
DISKMAPPER; 59713000
|
|
END PERIPHERALINITIALIZE; 59799900
|
|
BOOLEAN PROCEDURE GIVEBACKDISK(DISKADDRESS, SIZE); 59800000
|
|
VALUE DISKADDRESS, SIZE; 59801000
|
|
REAL DISKADDRESS, SIZE; 59802000
|
|
BEGIN 59803000
|
|
REAL T, T1; 59804000
|
|
DEFINE LLLARRAY = DISKMAPARRAY#; 59805000
|
|
DEFINE CHECKFOROVERFLOW = 59806000
|
|
IF NEXTADDR ~ * + 2 } MAXADDR THEN 59807000
|
|
BEGIN 59808000
|
|
LLLARRAY[NEXTROW ~ * + 1, 0] ~ 0; 59809000
|
|
MAXADDR ~ (NEXTADDR ~ LLLARRAY[NEXTROW, *].ADDRESSF) 59810000
|
|
+ LLLCHUNK; 59811000
|
|
END 59812000
|
|
#; 59813000
|
|
REAL GBD;MONITOR STEVEMONITOR(GBD,T,T1,NEXTADDR); GBD := 0; 59813010
|
|
IF (T ~ M[LASTADDR ~ LISTLOOKUP(DISKADDRESS, MEMORY, 59814000
|
|
FIRSTADDR)]).MAPADDRESSF + T1 ~ M[LASTADDR + 1] < 59815000
|
|
DISKADDRESS + SIZE THEN 59816000
|
|
RETURN(1); COMMENT WE ARE GIVING BACK DISK WHICH 59817000
|
|
WE DO NOT HAVE; 59818000
|
|
IF T1 = SIZE THEN 59819000
|
|
T1:= %FOR MONITORING 59819010
|
|
M[LASTADDR + 1] ~ 0 COMMENT IF MEMORY EVER IS A 59820000
|
|
PROBLEM, HERE IS WHERE SOME 59821000
|
|
GETS WASTED; 59822000
|
|
ELSE 59823000
|
|
IF T.MAPADDRESSF + T1 = DISKADDRESS + SIZE THEN 59824000
|
|
T1:= %FOR MONITORING 59824010
|
|
M[LASTADDR + 1] ~ T1 - SIZE 59825000
|
|
ELSE IF T.MAPADDRESSF = DISKADDRESS THEN 59826000
|
|
BEGIN 59827000
|
|
M[LASTADDR].MAPADDRESSF ~ DISKADDRESS + SIZE; 59828000
|
|
T:=M[LASTADDR];T1:=%FOR MONITORING 59828010
|
|
M[LASTADDR+1] ~T1 - SIZE; 59829000
|
|
END 59830000
|
|
ELSE BEGIN 59831000
|
|
T1:= %FOR MONITORING 59831010
|
|
M[LASTADDR+1] ~ DISKADDRESS - T.MAPADDRESSF; 59832000
|
|
CHECKFOROVERFLOW; 59833000
|
|
M[LASTADDR].ADDRESSF ~ NEXTADDR; 59834000
|
|
T := %FOR MONITORING 59834010
|
|
M[NEXTADDR] ~ T & FIRSTMAPWORDPRIME(DISKADDRESS 59835000
|
|
+ SIZE, *); 59836000
|
|
T1:= %FOR MONITORING 59836010
|
|
M[NEXTADDR+1] ~ (T.MAPADDRESSF + T1) - 59837000
|
|
DISKADDRESS - SIZE; 59838000
|
|
END; 59839000
|
|
GBD:=1; %FOR MONITORING 59839010
|
|
END GIVE BACK DISK SPACE SOMEONE OWNS; 59840000
|
|
PROCEDURE DIRECTORYCOMPLEMENT(DIRECTRY); 59842000
|
|
ARRAY DIRECTRY[*]; 59843000
|
|
COMMENT THIS PROCEDURE CHASES THROUGH A DIRECTORY, AND ALL THAT 59844000
|
|
DWELL THEREIN, AND TAKES ALL DISK SPACE CLAIMED FROM THE 59845000
|
|
AVAILABLE DISK TABLE. 59846000
|
|
IT ALSO RESOLVES ANY FUNNY STUFF IN THE HEADER. 59847000
|
|
; 59848000
|
|
BEGIN 59849000
|
|
ARRAY HDR[200]; 59850000
|
|
REAL I, J, T, T1, K, SIZE, INDEX, LIMIT, 59851000
|
|
WHOAMI := DIRECTRY[0]; 59852000
|
|
LABEL BACK; 59853000
|
|
DEFINE BUZZREPORTBACK = 59857000
|
|
WHILE BOOLEAN(K ~ READLOCK(1, DIRECTORYCOMPLEMENTREPORTBACK)) 59858000
|
|
DO #; 59859000
|
|
REAL DISKCOMP; 59859100
|
|
MONITOR STEVEMONITOR(INDEX,DISKCOMP, T, LIMIT,SIZE, T1,WHOAMI); 59859200
|
|
DISKCOMP:=*; WHOAMI:=*; 59859300
|
|
INDEX := (HEADERSIZE(DIRECTRY) + 29) DIV 30; 59860000
|
|
GO ENDIT; % TEMPORARILY 59860100
|
|
BACK: 59861000
|
|
FOR I := INDEX + 4 STEP 5 WHILE NOT BOOLEAN(T := DIRECTRY[I]) DO 59862000
|
|
BEGIN 59863000
|
|
DISKWAIT(HDR, -1, IF T.FILEKINDF > DIRECTORY THEN (T1 := 59864000
|
|
(T.HEADERSIZEF + 29) DIV 30) + DIRECTORYBITE ELSE T1 := 59865000
|
|
T.HEADERSIZEF, J := DIRECTRY[I+1], @440); 59866000
|
|
COMMENT CONSISTANCY CHECKING AND HEADER DIDILING GO HERE; 59867000
|
|
PROCURE(DISKRETURNLOCK); 59868000
|
|
GIVEBACKDISK(J, T1 DIV 30); 59869000
|
|
SIZE := ROWSIZE(HDR); 59870000
|
|
LIMIT := NUMBEROFROWS(HDR) - CRUNCHED(HDR) + FIRSTROWINDEX - 1;59871000
|
|
FOR J := FIRSTROWINDEX STEP 1 UNTIL LIMIT DO 59872000
|
|
IF T1 := HDR[J] ! 0 THEN 59873000
|
|
GIVEBACKDISK(T1, SIZE); 59874000
|
|
IF BOOLEAN(CRUNCHED(HDR)) THEN 59875000
|
|
BEGIN 59876000
|
|
END; 59877000
|
|
LIBERATE(DISKRETURNLOCK); 59878000
|
|
IF T.FILEKINDF { DIRECTORY THEN 59879000
|
|
IF WHOAMI < 0 THEN 59880000
|
|
BEGIN COMMENT I AM THE CONTROLING PROCESS; 59881000
|
|
BUZZREPORTBACK; 59882000
|
|
DIRECTORYCOMPLEMENTREPORTBACK := 59884000
|
|
RESET(K, T1 := FIRSTONE(K + 1) - 1); 59885000
|
|
IF HDR[0] := T1 > 0 THEN 59886000
|
|
FORK(DIRECTORYCOMPLEMENT, HDR) 59887000
|
|
ELSE 59888000
|
|
DIRECTORYCOMPLEMENT(HDR); 59889000
|
|
END 59890000
|
|
ELSE 59891000
|
|
DIRECTORYCOMPLEMENT(HDR); 59892000
|
|
END; 59893000
|
|
IF T > 0 THEN 59894000
|
|
BEGIN 59895000
|
|
DISKWAIT(DIRECTRY, INDEX-1, DIRECTORYBITE, 59896000
|
|
DIRECTRY[FIRSTROWINDEX + (K := DIRECTRY[INDEX] | 59897000
|
|
SEGMENTSPERDIRECTORYBITE) DIV T := ROWSIZE(DIRECTRY)] + 59898000
|
|
K MOD T, @440); 59899000
|
|
GO BACK; 59900000
|
|
END; 59901000
|
|
IF WHOAMI > 0 THEN 59902000
|
|
BEGIN 59903000
|
|
BUZZREPORTBACK; 59904000
|
|
DIRECTORYCOMPLEMENTREPORTBACK := SET(K, WHOAMI); 59905000
|
|
END; 59906000
|
|
IF WHOAMI < 0 THEN 59906100
|
|
IF DIRECTRY.ADDRESSF = SYSTEMDIRECTORY.ADDRESSF THEN 59906150
|
|
BEGIN 59906200
|
|
ENDIT: COMMENT SQUASH LINKED LISTS INTO USER DISK TABLES; 59907000
|
|
LIBERATE(USERDISKLOCK); 59908000
|
|
LIBERATE(DIRECTORYLOCK); 59909000
|
|
FORGETDOPEVECTORS(DISKMAPARRAY); 59910000
|
|
FORGETSPACE(DISKMAPARRAY.ADDRESSF); 59910100
|
|
END; 59911000
|
|
DISKCOMP := 1; 59912000
|
|
END DIRECTORYCOMPLEMENT; 59929000
|
|
SAVE PROCEDURE UPDATEUNITBITSTABLE(TABLENAME, U); 60000000
|
|
VALUE U; 60001000
|
|
INTEGER U; 60002000
|
|
BOOLEAN ARRAY TABLENAME[*]; 60003000
|
|
COMMENT FOR A GIVEN TABLE (OLDSTATUSWORD,STATUSMASKWORD,ETC) AND UNIT 60004000
|
|
NO, THE PROCEDURE FINDS THE RIGHT INDEX IN THE TABLE AND 60005000
|
|
SETS (OR RESETS FOR NEGATIVE UNIT NO) BIT CORRESPONDING TO 60006000
|
|
UNIT NO. 60007000
|
|
NOTE EACH WORD HAS ONLY 32 BIT POSITIONS. 60008000
|
|
TABLENAME - -ARRAY NAME FOR A GIVEN TABLE. 60009000
|
|
U -LOGICAL UNIT NO; 60010000
|
|
BEGIN 60011000
|
|
FIELD UBITNOF = ABS(U) MOD 32:1; 60012000
|
|
TABLENAME[ABS(U) DIV 32].UBITNOF ~ NOT BOOLEAN(U.SIGNBITF); 60013000
|
|
END UPDATEUNITBITSTABLE; 60019000
|
|
PROCEDURE ARRAYDEC(NOOFDIMS,NOOFARRAYS,TYPE); 65000000
|
|
VALUE NOOFDIMS,NOOFARRAYS,TYPE; 65001000
|
|
INTEGER NOOFDIMS,NOOFARRAYS,TYPE; 65002000
|
|
COMMENT ENTERS DIMENSION INFORMATION FOR EACH ARRAY INTO ARRAYINFOT. 65003000
|
|
A SPECIAL DESCRIPTOR IS MADE FOR EACH ARRAY(SEE SARRAYDESCL 65004000
|
|
LAYOUT) .AITINDICATOR BIT IS TURNED ON SO THAT PRESENCEBIT 65005000
|
|
COULD TAKE SPECIAL ACTION. IN 65006000
|
|
CASE ARRAYINFOT GETS FULL INVALID INDEX INTERRUPT WILL OCCUR 65007000
|
|
AND THEN ARRAYINFOT WILL BE EXTENDED. NOTE THAT VARIABLE NO OF65008000
|
|
PARAMETERS ARE PASSED. 65009000
|
|
NOOFDIMS - WHAT IT SAYS. 65010000
|
|
NOOFARRAYS- NO OF ARRAYS IN A SINGLE LIST HAVING SAME DIMENSIONS.65011000
|
|
E.G. A,B,C[2,3,4] 65012000
|
|
TYPE - CODE SPECIFYING DIFFERENT KINDS OF ARRAY 65013000
|
|
IF TYPE IS NEGATIVE THEN ARRAY IS FOR MCP 65014000
|
|
; 65015000
|
|
BEGIN 65016000
|
|
WORD ARRAY ARRAYLIST[*]; COMMENT DESC POINTING TO LIST OF 65017000
|
|
ARRAYS IN STACK; 65018000
|
|
ARRAY ARRAYINFOT[*], COMMENT ARRAY INFORMATION TABLE; 65019000
|
|
DIMINFO[*]; COMMENT DESC POINTING TO WHERE 65020000
|
|
DIMENSION INFORMATION STARTS IN STACK;65021000
|
|
REAL DIMINFOSIZE, % NO OF DIMENSIONS 65022000
|
|
INDEX, 65023000
|
|
FREG, COMMENT F REG SETTING; 65023100
|
|
ARRAYINFOTI; COMMENT LAST USED INDEX OF ARRAYINFOT;65024000
|
|
WORD MSCW; COMMENT MARK STACK CONTROL WORD; 65025000
|
|
LABEL CUTSTACK,QUIT; 65026000
|
|
BOOLEAN LOBOUNDTOG; COMMENT TRUE IF LOWER BOUND IS PASSED;65027000
|
|
COMMENT LOCK THE STACK & WAKE UP DESCRIPTORS FOR ARRAYLIST AND DIMINFO;65028000
|
|
COMMENT SET LOBOUNDTOG IF LOWER BOUND IS PASSED FOR OWN ARRAY; 65029000
|
|
FREG~F; 65029100
|
|
DIMINFOSIZE~ ( 1 + REAL(LOBOUNDTOG)) | NOOFDIMS; 65029200
|
|
ARRAYINFOT~IF BOOLEAN(TYPE.SIGNBITF) THEN MCPARRAYINFOT 65030000
|
|
ELSE WORDSTACK[SNR,AITDESCRIPTORPLACE]; 65031000
|
|
IF DATADESC ! ARRAYINFOT.TAG THEN 65031100
|
|
BEGIN 65031300
|
|
ARRAYINFOT~ARRAYINFOT & 65031350
|
|
DATADESCRIPTOR(,,,,,,,,AITSIZE,0); 65031400
|
|
ARRAYINFOT[0]~1; 65031500
|
|
WORDSTACK[SNR,AITDESCRIPTORPLACE] ~ARRAYINFOT & 65031600
|
|
ARRAYDESCL(2, ,); 65031700
|
|
END; 65031800
|
|
IF ((ARRAYINFOTI~ARRAYINFOT[0]) + DIMINFOSIZE) } 65031900
|
|
(INDEX~WORD(ARRAYINFOT).LENGTHF) THEN 65032000
|
|
BEGIN % EXTEND AIT TABLE 65032100
|
|
INDEX~INDEX + AITSIZE; 65032200
|
|
MSCW~ARRAYINFOTI + DIMINFOSIZE; 65032250
|
|
DIMINFO~DIMINFO & DATADESCRIPTOR(,,,,,,,, INDEX ,0); 65032300
|
|
FOR INDEX~0 STEP 1 UNTIL ARRAYINFOTI DO 65032500
|
|
DIMINFO[INDEX]~ARRAYINFOT[INDEX]; 65032600
|
|
FORGETSPACE(WORD(ARRAYINFOT).ADDRESS); 65032700
|
|
IF BOOLEAN(TYPE.SIGNBITF) THEN 65032800
|
|
MCPARRAYINFOT~DIMINFO ELSE 65032900
|
|
WORDSTACK[SNR,AITDESCRIPTORPLACE]~DIMINFO & 65032920
|
|
ARRAYDESCL(2, ,); 65032930
|
|
ARRAYINFOT~DIMINFO; 65032940
|
|
END; 65032960
|
|
INDEX~FREG-DIMINFOSIZE-REAL(NOOFDIMS=1); 65033000
|
|
DIMINFO~DIMINFO & ARRAYDESCL(,DIMINFOSIZE,INDEX); 65034000
|
|
ARRAYLIST~ARRAYLIST & ARRAYDESCL(,NOOFARRAYS,INDEX-NOOFARRAYS);65035000
|
|
DIMINFOSIZE~DIMINFOSIZE-1; 65036000
|
|
IF (INDEX~DIMINFO[DIMINFOSIZE]) {0 THEN 65038000
|
|
BEGIN 65039000
|
|
COMMENT BUILD MESSAGE "DEC-ERROR- ARRAY DIMENSION= " ;65040000
|
|
GO QUIT; 65041000
|
|
END; 65042000
|
|
IF NOOFDIMS=1 AND INDEX{256 THEN 65043000
|
|
BEGIN COMMENT ARRAY NOT TO BE SEGMENTED; 65044000
|
|
ARRAYLIST[0]~0 & DATADESCRIPTOR(,,,,,,,TYPE.DOUBLEBIT, 65045000
|
|
INDEX,TYPE.LSAVEBIT); 65046000
|
|
GO CUTSTACK; 65047000
|
|
END; 65048000
|
|
ARRAYLIST[0]~ARRAYLIST[0] & SARRAYDESCL(,DIMINFO[0],TYPE. 65049000
|
|
SIGNBITF,,1,ARRAYINFOTI,ABS(TYPE)); 65050000
|
|
IF NOOFDIMS=1 THEN 65051000
|
|
BEGIN 65052000
|
|
ARRAYLIST[0].SBITF~1; 65053000
|
|
INDEX~DIMINFO[0]; 65054000
|
|
DIMINFO[0]~INDEX DIV 256; 65055000
|
|
ARRAYINFOT[ARRAYINFOTI]~INDEX~INDEX MOD 256; 65056000
|
|
DIMINFO[0]~ * + REAL(INDEX>0); 65057000
|
|
ARRAYINFOTI~ARRAYINFOTI +1; 65058000
|
|
ARRAYLIST[0].LENGTHF~DIMINFO[0]; 65059000
|
|
GO CUTSTACK; 65060000
|
|
END; 65061000
|
|
FOR INDEX~1 STEP 1 UNTIL DIMINFOSIZE DO 65062000
|
|
BEGIN 65063000
|
|
ARRAYINFOT[ARRAYINFOTI]~DIMINFO[INDEX]; 65064000
|
|
ARRAYINFOTI~ARRAYINFOTI + 1; 65065000
|
|
END; 65066000
|
|
CUTSTACK: 65067000
|
|
IF NOOFDIMS=1 THEN DIMINFOSIZE~ DIMINFOSIZE + 1; 65067500
|
|
ARRAYINFOT[ARRAYINFOTI- 1].SIGNBITF~1; 65068000
|
|
ARRAYINFOT[0] ~ ARRAYINFOTI; 65069000
|
|
NOOFARRAYS~NOOFARRAYS-1; 65070000
|
|
IF NOOFARRAYS>0 THEN 65071000
|
|
FOR INDEX~1 STEP 1 UNTIL NOOFARRAYS DO 65072000
|
|
ARRAYLIST[INDEX] ~ ARRAYLIST[0]; 65073000
|
|
COMMENT CUTTING BACK STACK; 65073200
|
|
DIMINFOSIZE~DIMINFOSIZE+1; 65074000
|
|
MSCW~M[FREG]; 65075000
|
|
INDEX~MSCW.DFF; 65076000
|
|
M[FREG].DFF~DIMINFOSIZE; 65077000
|
|
MSCW.DFF~INDEX-DIMINFOSIZE; 65078000
|
|
M[INDEX~FREG-DIMINFOSIZE]~MSCW; 65079000
|
|
M[INDEX+1]~M[FREG+1]; 65080000
|
|
M[FREG+1]~DUMMYFORCUTTINGSTACKPCW & SETTAG(RCW); 65081000
|
|
COMMENT UNLOCK STACK; 65082000
|
|
QUIT: EXIT; 65083000
|
|
END ARRAYDEC; 65084000
|
|
SAVE 65085000
|
|
WORD PROCEDURE DOPEVECTOR(MOMDESC); 65086000
|
|
VALUE MOMDESC; WORD MOMDESC; 65087000
|
|
COMMENT 65088000
|
|
BUILDS UP DOPE VECTOR TABLE AT PRESENCE TIME. OBTAINS DIMENSION65089000
|
|
SIZE FROM ARRAY INFORMATION TABLE(ARRAYINF0T) AND GETS SPACE 65090000
|
|
FOR IT. IF NEXT ENTRY IN ARRAYINFOT IS NOT THE LAST DIMENSION, 65091000
|
|
IT BUILDS UP SPECIAL ARRAY DESCRIPTORS(SEE SARRAYDESCL LAYOUT) 65092000
|
|
OTHERWISE 65093000
|
|
IT BUILDS UP NORMAL DATA DESCRIPTORS WITW LAST DIMENSION IN THE65094000
|
|
LENGTH FIELD. SUBSEQUENTLY REGULAR PRESENCE BIT ACTION WILL 65095000
|
|
OCCUR TO BRING IN THE RIGHT ROW. ADDRESS OF DOPEVECTABLE IS 65096000
|
|
RETURNED. 65097000
|
|
MOMDESC - ORIGINAL MOM DESCRIPTOR 65098000
|
|
; 65099000
|
|
BEGIN 65100000
|
|
REAL DOPEVECTADDR; COMMENT ADDRESS POINTS DOPEVECTABLE; 65101000
|
|
INTEGER AITINDEX, COMMENT POINTS TO AIT LOCATION WHICH HAS 65102000
|
|
DIMENSION INFORMATION; 65103000
|
|
I, COMMENT INDEX FOR DOPE VECTOR TABLE; 65104000
|
|
LASTDOPEVECSIZE, COMMENT SIZE OF LAST SEG. OF 65105000
|
|
SEGMENTED ARRAY; 65106000
|
|
TYPE=AITINDEX, COMMENT ARRAY TYPE CODE; 65107000
|
|
DOPEVECTSIZE; COMMENT DOPE VECTOR TABLE SIZE; 65108000
|
|
ARRAY AIT[*]; COMMENT ARRAY IMFORMATION TABLE; 65109000
|
|
WORD ARRAY DOPEVECTABLE[*]; COMMENT ARRAY FOR CREATING DOPE 65110000
|
|
VECTOR TABLE; 65111000
|
|
WORD DOPEVECT=DOPEVECTABLE; 65112000
|
|
AITINDEX~MOMDESC.AITINDEXF; 65113000
|
|
AIT~IF BOOLEAN(MOMDESC.MCPARRAYBIT) THEN 65114000
|
|
MCPARRAYINFOT ELSE WORDSTACK[SNR,AITDESCRIPTORPLACE]; 65115000
|
|
DOPEVECTSIZE~MOMDESC.LENGTHF; 65116000
|
|
DOPEVECTADDR~GETSPACE(DOPEVECTSIZE,SNR,4,0); 65117000
|
|
DOPEVECTABLE~DOPEVECTABLE & ARRAYDESCL(,DOPEVECTSIZE, 65118000
|
|
DOPEVECTADDR); 65119000
|
|
IF (I+AIT[AITINDEX]) <0 THEN 65120000
|
|
BEGIN 65121000
|
|
IF BOOLEAN(MOMDESC.SBITF) THEN 65122000
|
|
BEGIN 65123000
|
|
LASTDOPEVECSIZE~ABS(I); 65124000
|
|
DOPEVECT.SBITF~1; 65125000
|
|
I~256; 65126000
|
|
END; 65127000
|
|
TYPE~MOMDESC.ARRAYTYPEF; 65128000
|
|
DOPEVECTABLE[0]~0 & DATADESCRIPTOR(,,,,,,,TYPE.DOUBLEBIT, 65129000
|
|
I,TYPE.LSAVEBIT); 65130000
|
|
END ELSE 65131000
|
|
DOPEVECTABLE[0]~MOMDESC & SARRAYDESCL(,I,,,,AITINDEX+1,); 65132000
|
|
DOPEVECTSIZE~DOPEVECTSIZE-1; 65133000
|
|
FOR I~ 1 STEP 1 UNTIL DOPEVECTSIZE 65134000
|
|
DO 65135000
|
|
DOPEVECTABLE[I] ~ DOPEVECTABLE[0]; 65136000
|
|
IF LASTDOPEVECSIZE>0 THEN 65137000
|
|
DOPEVECTABLE[DOPEVECTSIZE].LENGTHF~LASTDOPEVECSIZE; 65138000
|
|
RETURN(WORD(DOPEVECT)); 65139000
|
|
END DOPEVECTOR; 65140000
|
|
SAVE PROCEDURE BLOCKEXIT; 65174000
|
|
COMMENT BLOCKEXIT IS CALLED JUST PRIOR TO EXITING A BLOCK. BLOCKEXIT 65175000
|
|
FORGETS SPACE GOTTEN FOR THE BLOCK; 65176000
|
|
BEGIN 65177000
|
|
REAL LIMIT, COMMENT STACK SEARCH LIMIT; 65180000
|
|
ADDR, COMMENT ADDRESS FOR GETSPACE; 65181000
|
|
I; 65182000
|
|
WORD STK; COMMENT FOR ACCESSING MSCW; 65183000
|
|
LABEL QUIT; 65184000
|
|
REAL BLKEXIT,DISP,STKBASE; %FOR MONITORING ONLY 65184100
|
|
MONITOR STEVEMONITOR(BLKEXIT,DISP); 65184200
|
|
REAL TRACTER;TRACTER~TRACE(0);% TURNS OFF TRACE 65184300
|
|
COMMENT LOCK STACK; 65185000
|
|
STKBASE ~ %FOR MONITOR CALCULATIONS 65186000
|
|
STK ~ (LIMIT ~ F - 1) - M[F].DFF + 3; 65187000
|
|
BLKEXIT ~ LIMIT - STKBASE + 1; %MONITOR 65188000
|
|
FOR I~STK STEP 1 UNTIL LIMIT DO 65190000
|
|
BEGIN 65191000
|
|
STK~M[I]; 65192000
|
|
IF STK.TAG=6 THEN GO QUIT; 65193000
|
|
IF STK.TAG=DATADESC AND STK.PCBITSF=2 THEN 65194000
|
|
BEGIN COMMENT DATA DESCRIPTOR WITH ONLY P BIT ON; 65195000
|
|
IF M[ADDR~STK.ADDRESS].TAG=DATADESC THEN 65196000
|
|
65197000
|
|
FORGETDOPEVECTORS(STK); 65198000
|
|
FORGETSPACE(ADDR); 65199000
|
|
DISP ~ I - STKBASE + 2; %7ONITOR THE DISPLACEMENT FROM LL 65199100
|
|
END; 65200000
|
|
END; 65201000
|
|
QUIT: 65202000
|
|
COMMENT UNLOCK STACK; 65203000
|
|
TRACE(TRACTER);% RESTORES TRACE 65203900
|
|
END BLOCKEXIT; 65204000
|
|
PROCEDURE FORGETDOPEVECTORS(DD); WORD ARRAY DD[*]; 65205000
|
|
COMMENT FORGETDOPEVECTORS WILL MAKE RECURSIVE CALLS ON ITSELF UNTIL 65206000
|
|
THE WHOLE CHAIN OF DOPE VECTORS ARE FORGOTTEN 65207000
|
|
DD -DATA DESCRIPTOR FOR DOPE VECTOR TABLE; 65208000
|
|
BEGIN 65209000
|
|
INTEGER I, COMMENT INDEX FOR LOOP; 65210000
|
|
ADDR, COMMENT DESCRIPTOR ADDRESS; 65211000
|
|
LENGTH; COMMENT LENGTH OF TABLE; 65212000
|
|
WORD DDV; COMMENT CONTENT OF DD LOCATION; 65213000
|
|
65214000
|
|
LENGTH ~ DD.LENGTHF - 1; 65215000
|
|
FOR I~0 STEP 1 UNTIL LENGTH DO 65216000
|
|
BEGIN 65217000
|
|
DDV ~ DD[I]; DDV.CBITF ~ 1; 65218000
|
|
IF BOOLEAN(DDV.PBITF) THEN 65219000
|
|
IF M[ADDR~DDV.ADDRESS].TAG=DATADESC THEN 65220000
|
|
BEGIN 65221000
|
|
FORGETDOPEVECTORS(DDV); 65222000
|
|
FORGETSPACE(ADDR); 65223000
|
|
END ELSE 65224000
|
|
FORGETSPACE(ADDR); 65225000
|
|
END; 65226000
|
|
END FORGETDOPEVECTORS; 65227000
|
|
PROCEDURE GOTOSOLVER(SIRW); VALUE SIRW; REAL SIRW; 65228000
|
|
COMMENT SOLVES BADGOTO PROBLEM; 65229000
|
|
BEGIN 65230000
|
|
INTEGER FREG, COMMENT F REG. SETTING; 65231000
|
|
FINALF, COMMENT FINAL F VALUE; 65232000
|
|
LIMIT, COMMENT LIMIT FOR SEARCHING STACK; 65233000
|
|
DISP, COMMENT TOTAL DISPLACEMENT; 65233500
|
|
ADDR, COMMENT ADDRESS FOR FORGETSPACE; 65234000
|
|
I; COMMENT INDEX; 65235000
|
|
BOOLEAN BADLABELFOUNDTOG; 65235500
|
|
WORD STK, COMMENT CONTENTS OF STACK LOCATION; 65236000
|
|
MSCW; COMMENT CURRENT MKST WORD; 65237000
|
|
LABEL SEARCHAGAIN,LOOPEND,SKIPFORGETPART; 65238000
|
|
IF SIRW=0 THEN EXIT; COMMENT USE TERMINATE WHEN AVAILABLE; 65238999
|
|
65239000
|
|
FINALF ~ STACKVECTOR[SIRW.STKNRF].ADDRESS + SIRW.DISPF ; 65240000
|
|
COMMENT LOCK STACK; 65241000
|
|
FREG ~F; 65242000
|
|
SEARCHAGAIN: 65243000
|
|
LIMIT~FREG-1; 65244000
|
|
MSCW~M[FREG]; 65244500
|
|
ADDR~MSCW.DFF; COMMENT TEMP STORAGE OF DISPLACEMENT; 65244700
|
|
IF (FREG~FREG-ADDR) {FINALF THEN BADLABELFOUNDTOG~TRUE ; 65245000
|
|
I~FREG+2; 65248000
|
|
DISP~DISP+ADDR; 65248500
|
|
FOR I~I STEP 1 UNTIL LIMIT DO 65249000
|
|
BEGIN 65250000
|
|
STK ~ M[I]; 65251000
|
|
IF STK.TAG=6 THEN IF BADLABELFOUNDTOG THEN GO LOOPEND 65252000
|
|
ELSE GO SEARCHAGAIN 65252100
|
|
ELSE 65252200
|
|
IF BADLABELFOUNDTOG THEN GO SKIPFORGETPART ELSE 65252300
|
|
IF STK.TAG=DATADESC AND STK.PCBITSF=2 THEN 65253000
|
|
BEGIN COMMENT DATA DESCRIPTOR WITH P BIT ON; 65254000
|
|
IF M[ADDR ~STK.ADDRESS].TAG=DATADESC THEN 65255000
|
|
FORGETDOPEVECTORS(STK); 65256000
|
|
FORGETSPACE(ADDR); 65257000
|
|
END; 65258000
|
|
SKIPFORGETPART: 65259000
|
|
END; 65260000
|
|
GO SEARCHAGAIN; 65261000
|
|
LOOPEND: 65262000
|
|
I~I+1; 65263000
|
|
STK~M[FINALF+SIRW.SIRWDELTAF]; COMMENT PCW FOR LABEL; 65264000
|
|
ADDR~I-FREG; 65265000
|
|
DISP~DISP-ADDR; 65265500
|
|
FREG~F; 65266000
|
|
MSCW~M[FREG]; 65267000
|
|
MSCW.DFF~ADDR; 65268000
|
|
M[I]~MSCW; 65269000
|
|
M[I+1]~ STK & SETTAG(RCW); 65270000
|
|
MSCW.DFF~DISP; 65270100
|
|
M[FREG]~MSCW; 65270200
|
|
M[FREG+1]~DUMMYFORCUTTINGSTACKPCW & SETTAG(RCW); 65270300
|
|
COMMENT UNLOCK STACK; 65271000
|
|
END GOTOSOLVER; 65272000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70000000
|
|
% I/O INTRINSICS %70001000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70002000
|
|
SAVE EVENT ARRAY IOEVENT[192]; 70003000
|
|
SAVE ARRAY IOEVENTS[5]; 70004000
|
|
EVENT IOEVNT; 70005000
|
|
PROCEDURE WAITON(IOCB);REFERENCE IOCB; 70006000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70007000
|
|
% WAITON IS DESIGNED TO "SAVE" EVENTS, UTILIZING JUST ONE %70008000
|
|
% PER FILE ... THERE ARE TIMING PROBLEMS %70009000
|
|
% ONE BUFFER AND DIRECT-ACCESS %70010000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70011000
|
|
LABEL HR; 70012000
|
|
HR: 70013000
|
|
WAIT(EVNT@IOCB); 70014000
|
|
IF IOPENDING THEN 70015000
|
|
BEGIN 70016000
|
|
RESET(EVNT@IOCB); 70017000
|
|
STOP; %%%%% 70018000
|
|
IF IOPENDING THEN GO TO HR; 70019000
|
|
END; 70020000
|
|
IOCOMPLET~0; 70020100
|
|
END WAITON; 70021000
|
|
INTEGER PROCEDURE EVENTNUMBER; 70022000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70023000
|
|
% EVENTNUMBER PROCURES AN EVENT FOR A FILE %70024000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70025000
|
|
EVENT EVNT; 70026000
|
|
LABEL STRT,XIT; 70027000
|
|
LAYOUT IOEVENTSL((I-1):1~1); 70028000
|
|
REAL I,T; 70029000
|
|
STRT: 70030000
|
|
WHILE BOOLEAN(READLOCK(1,IOEVENTS[4])) DO WAIT(IOEVNT); 70031000
|
|
RESET(IOEVNT); 70032000
|
|
T~-1; 70033000
|
|
WHILE T~T+1<4 DO 70034000
|
|
IF I~FIRSTONE(REAL(NOT BOOLEAN(IOEVENTS[I])))!0 THEN GO XIT; 70035000
|
|
READLOCK(0,IOEVENTS[4]); 70036000
|
|
CAUSE(IOEVNT); 70037000
|
|
% SLEEP(1,EVNT); 70038000
|
|
RESET(EVNT); 70039000
|
|
GO TO STRT; 70040000
|
|
XIT: 70041000
|
|
IOEVENTS[T]~*&IOEVENTSL(); 70042000
|
|
READLOCK(0,IOEVENTS[4]); 70043000
|
|
CAUSE(IOEVNT); 70044000
|
|
RESET(IOEVENT[EVENTNUMBER~(I-1)+T|48]) 70045000
|
|
END EVENTNUMBER; 70046000
|
|
PROCEDURE FORGETEVENT(NMBR);VALUE NMBR;REAL NMBR; 70047000
|
|
BEGIN 70048000
|
|
LAYOUT IOEVENTSL(I:1~0); 70049000
|
|
REAL I~NMBR MOD 48; 70050000
|
|
WHILE BOOLEAN(READLOCK(1,IOEVENTS[4])) DO WAIT(IOEVNT); 70051000
|
|
RESET(IOEVNT); 70052000
|
|
RESET(IOEVENT[NMBR]); 70053000
|
|
IOEVENTS[NMBR DIV 48]~*&IOEVENTSL(); 70054000
|
|
READLOCK(0,IOEVENTS[4]); 70055000
|
|
CAUSE(IOEVNT); 70056000
|
|
END FORGET EVENT; 70057000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70058000
|
|
WORD PROCEDURE SETUPTANK(NAREAS,AR,ASIZE,BCKWRD,SKLTN,FEVENT,UNMBR);70059000
|
|
VALUE AR,ASIZE,BCKWRD,SKLTN,UNMBR; 70060000
|
|
REAL NAREAS,AR,ASIZE,BCKWRD,SKLTN,UNMBR; 70061000
|
|
EVENT FEVENT; 70062000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70063000
|
|
% SETS UP BUFFERS AND LINKS THEM TOGETHER %70064000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70065000
|
|
FIELD CBIT=1:1; 70066000
|
|
BOOLEAN CNTGS~BOOLEAN(BCKWRD.CBIT); 70067000
|
|
LABEL OUT; 70068000
|
|
REAL I,T~NAREAS,P~AR-1; 70069000
|
|
REAL FRST,CRLC,LSTLC; 70070000
|
|
PROCEDURE BUILDIOAREA(ADDRESS);VALUE ADDRESS;INTEGER ADDRESS; 70071000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70072000
|
|
% BUILDS IOAREA: IOCB + LINKS + BUFFER %70073000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70074000
|
|
ARRAY IOAREA[*]; 70075000
|
|
LAYOUT USERL(18:1~1,UNITNOF); 70075100
|
|
WORD ARRAY IOAREAWA=IOAREA[*]; 70076000
|
|
IOAREA~IOAREA&ARRAYDESCL(,ASIZE,ADDRESS); 70077000
|
|
REPLACE POINTER(IOAREA) BY 0 FOR ASIZE OVERWRITE; 70078000
|
|
IOAREA[0]~0&USERL(,UNMBR); 70079000
|
|
STOREITEM(EVNT@REFERENCE(IOAREA),FEVENT); 70080000
|
|
IOAREAWA[2]~IOAREA~IOAREA& 70081000
|
|
ARRAYDESCL(,ASIZE-IOTANKSZ,IOAREA.ADDRESSF+IOTANKSZ-1); 70082000
|
|
IOAREA[0]~SKLTN; 70083000
|
|
DIVORCEMOM(IOAREA); 70084000
|
|
END BUILDIOAREA; 70085000
|
|
IF CNTGS THEN I~REQSPACE(ASIZE|NAREAS); 70086000
|
|
BUILDIOAREA(FRST~CRLC~LSTLC~(IF CNTGS THEN I ELSE 70087000
|
|
REQSPACE(ASIZE))); 70088000
|
|
WHILE T~T-1>0 DO 70089000
|
|
BEGIN 70090000
|
|
IF CNTGS THEN I~I~ASIZE ELSE 70091000
|
|
IF T>P THEN 70092000
|
|
IF I~OPTSPACE(ASIZE)<0 THEN 70093000
|
|
BEGIN NAREAS~NAREAS-1;GO TO OUT END ELSE 70094000
|
|
ELSE I~REQSPACE(ASIZE); 70095000
|
|
BUILDIOAREA(I); 70096000
|
|
M[LSTLC+IOAL].FL~CRLC~I; 70097000
|
|
IF BOOLEAN(BCKWRD) THEN M[I+IOAL].BL~LSTLC; 70098000
|
|
LSTLC~CRLC; 70099000
|
|
OUT: 70100000
|
|
END; 70101000
|
|
IF NAREAS>1 THEN 70102000
|
|
BEGIN 70103000
|
|
M[LSTLC+IOAL].FL~FRST; 70104000
|
|
IF BOOLEAN(BCKWRD) THEN M[FRST+IOAL].BL~LSTLC; 70105000
|
|
END; 70106000
|
|
SETUPTANK~IOEVENTS&ARRAYDESCL(,ASIZE,FRST); 70107000
|
|
END SETUPTANK; 70108000
|
|
PROCEDURE ATTRIBUTEHANDLER=(0,42)(FIB,TYPE,ARGH); 70109000
|
|
VALUE TYPE,ARGH; 70110000
|
|
REAL TYPE,ARGH; 70111000
|
|
ARRAY FIB[*]; 70112000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70113000
|
|
% ATTRIBUTEHANDLER CHANGES VARIOUS FILE ATTRIBUTES %70114000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70115000
|
|
ARRAY IOAREA,LEB,NULEB[*],NLEB[31]; 70116000
|
|
POINTER PTEMP,PBGN; 70116010
|
|
FIELD PTYPE=30:6,TYPEF=TYPE:1; 70117000
|
|
FIELD INTNAME=43:1; 70118000
|
|
LAYOUT 70119000
|
|
BLCKNG(RCRDTYPE,SIZEMODE,SIZEOFF,SIZESZ), 70120000
|
|
ENDL(0:1); 70121000
|
|
POINTER NAMES=ARGH,PLEB,PNLB; 70122000
|
|
BOOLEAN MSG; 70123000
|
|
REAL 70124000
|
|
T, 70125000
|
|
U, 70126000
|
|
I, 70127000
|
|
FIB0, 70128000
|
|
MSK ~4"FFFFFFFFFFF", 70129000
|
|
BTYPES~4"F776", 70130000
|
|
PTYPES~4"9540", 70131000
|
|
CARE~4"FFFFFFFFFFF"; 70132000
|
|
WORD ARRAY FIBW=FIB[*]; 70133000
|
|
IOAREA~IOADESC; 70134000
|
|
FIB0~FIBSIZE; 70135000
|
|
FIBUZZ; 70136000
|
|
IF BOOLEAN(CARE.TYPEF) THEN 70137000
|
|
IF BOOLEAN(MSK.TYPEF)EQV ALREADYOPEN THEN 70138000
|
|
BEGIN TRACE(18);TRACE(21); END; 70138100
|
|
%IF NOT LABELEQTD THEN GETFPB(FIB); 70139000
|
|
LEB~LBLEQTN&DATADESCRIPTOR(); 70140000
|
|
MAKEPRESENTANDSAVE(LEB); 70140100
|
|
LBLEQTN~LEB; 70140200
|
|
CASE TYPE OF 70143000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70144000
|
|
BEGIN % FILE.TITLE 070145000
|
|
PLEB~NAMES; 70145010
|
|
PNLB~(PTEMP~(PBGN~POINTER(NLEB,8))+3)+1; 70145020
|
|
REPLACE PBGN+1 BY 1 FOR 1 CORRECTLY; 70145030
|
|
WHILE TRUE DO 70145040
|
|
BEGIN 70145050
|
|
REPLACE PNLB:PNLB BY PLEB:PLEB WHILE IN EBCDICALPHANUMERIC; 70145060
|
|
REPLACE PBGN+2 BY REAL(PBGN+2,1)+1 FOR 1 CORRECTLY; 70145070
|
|
REPLACE PTEMP BY DELTA(PTEMP+1,PNLB) FOR 1 CORRECTLY; 70145080
|
|
IF PLEB=8"/" THEN 70145090
|
|
BEGIN 70145100
|
|
PLEB~PLEB+1; 70145110
|
|
PNLB~(PTEMP~PNLB)+1; 70145120
|
|
END ELSE 70145130
|
|
BEGIN 70145140
|
|
REPLACE PBGN BY DELTA(PBGN,PNLB)FOR 1 CORRECTLY; 70145150
|
|
GO OUT; 70145160
|
|
END; 70145170
|
|
END; 70145180
|
|
OUT: 70145190
|
|
IF ((I~REAL(PBGN,1))+5)DIV 6>(REAL(PLEB~POINTER(LEB[U~( 70146000
|
|
(T~LEB[0]).FXD+ONES(T.OPTMASK))],8),1)+5)DIV 6 THEN 70147000
|
|
BEGIN 70148000
|
|
NULEB~*&ARRAYDESCL(0,U+((I+5)DIV 6),0); 70149000
|
|
REPLACE POINTER(NULEB,8) BY PLEB FOR U WORDS,PBGN FOR I; 70150000
|
|
MAKEPRESENTANDSAVE(NULEB); 70151000
|
|
LBLEQTN~NULEB; 70151100
|
|
DIVORCEMOM(NULEB); 70152000
|
|
FORGETSPACE(LEB.ADDRESSF); 70153000
|
|
END ELSE 70154000
|
|
BEGIN 70155000
|
|
REPLACE POINTER(LEB[U],8) BY PBGN FOR I; 70156000
|
|
LBLEQTN~LEB 70157000
|
|
END; 70158000
|
|
END; 70158050
|
|
BEGIN % FILE.REEL 170159000
|
|
MSG~(ARGH>9999 OR ARGH<0); 70160000
|
|
GEN1~*&GENEALOGY1(*,*,1,ARGH); 70161000
|
|
END; 70162000
|
|
BEGIN % FILE.DATE 270163000
|
|
MSG~(ARGH<0 OR ARGH DIV 1000>99); 70164000
|
|
GEN2.CRTNDATE~ARGH; 70165000
|
|
END; 70166000
|
|
BEGIN % FILE.CYCLE 370167000
|
|
MSG~(ARGH>9999 OR ARGH<0); 70168000
|
|
GEN1.CYCLE~ARGH; 70169000
|
|
END; 70170000
|
|
BEGIN % FILE.VERSION 470171000
|
|
MSG~(ARGH>99 OR ARGH<0); 70172000
|
|
GEN1.GENVERSN~ARGH; 70173000
|
|
END; 70174000
|
|
BEGIN % FILE.SAVEFACTOR 570175000
|
|
MSG~(ARGH>999 OR ARGH<0); 70176000
|
|
GEN2.SAVFACTOR~ARGH; 70177000
|
|
END; 70178000
|
|
BEGIN % FILE.DENSITY 670179000
|
|
MSG~ARGH>3 OR ARGH<0; 70180000
|
|
LEBC~*&LEBCNTRL(*,*,*,1,ARGH); 70182000
|
|
END; 70183000
|
|
BEGIN % FILE.PARITY 770184000
|
|
MSG~(ARGH>1 OR ARGH<0); 70185000
|
|
LEBC.LPARITY~ARGH; 70186000
|
|
END; 70187000
|
|
BEGIN % FILE.KIND 870188000
|
|
T~TYPE; 70189000
|
|
TYPE~ARGH.MOD32F; 70190000
|
|
MSG~(BOOLEAN(PTYPES.TYPEF)OR BOOLEAN(BTYPES.TYPEF)OR 70191000
|
|
ARGH.DIV32F>7 OR ARGH<0); 70192000
|
|
LEBC.PTYPEL~ARGH; 70193000
|
|
TYPE~T; 70194000
|
|
END; 70195000
|
|
BEGIN % FILE.LABELTYPE 970196000
|
|
MSG~(ARGH>2 OR ARGH<0); 70197000
|
|
LEBC.LABELTYPEL~ARGH; 70198000
|
|
LEBC.LABELTYPES~1; 70199000
|
|
END; 70200000
|
|
BEGIN % FILE.EXTMODE 1070201000
|
|
MSG~ARGH>4 OR ARGH<0; 70202000
|
|
LEBC.EXTFORML~ARGH; 70203000
|
|
END; 70204000
|
|
BEGIN % FILE.OPTIONAL 1170205000
|
|
MSG~(ARGH>1 OR ARGH<0); 70206000
|
|
LEBC.OPTIONALF~ARGH; 70207000
|
|
END; 70208000
|
|
BEGIN % FILE.PROTECTION 1270209000
|
|
MSG~(ARGH>2 OR ARGH<0); 70210000
|
|
LEBC.FPRTCTD~ARGH; 70211000
|
|
END; 70212000
|
|
BEGIN % FILE.FILETYPE 1370213000
|
|
MSG~ARGH>5 OR ARGH<0; 70214000
|
|
BLK1.FILETYPEL~T; 70218000
|
|
END; 70219000
|
|
BEGIN % FILE.BLOCKSIZE 1470220000
|
|
MSG~(ARGH<0 OR ARGH>65535); 70221000
|
|
BLK1.BLOCKSZL~ARGH; 70222000
|
|
END; 70223000
|
|
BEGIN % FILE.MAXRECSIZE 1570224000
|
|
MSG~(ARGH<0 OR ARGH>65535); 70225000
|
|
BLK1.MAXRECSZL~ARGH; 70226000
|
|
END; 70227000
|
|
BEGIN % FILE.MINRECSIZE 1670228000
|
|
BLK2.MINRECSZL~ARGH; 70229000
|
|
MSG~(ARGH<0 OR ARGH>65535); 70230000
|
|
END; 70231000
|
|
BEGIN % FILE.AREASIZE 1770232000
|
|
MSG~ARGH<0 OR ARGH>65535; 70233000
|
|
DSKS.AREASIZE~ARGH; 70234000
|
|
END; 70235000
|
|
BEGIN % FILE.AREAS 1870236000
|
|
MSG~ARGH<0 OR ARGH>1023; 70237000
|
|
DSKS.NUMAREAS~ARGH; 70238000
|
|
END; 70239000
|
|
BEGIN % FILE.ACCESS 1970240000
|
|
MSG~ARGH<0 OR ARGH>2; 70241000
|
|
DSKS.ACCSSTYPEF~ARGH; 70242000
|
|
END; 70243000
|
|
BEGIN % FILE.MYUSE 2070244000
|
|
MSG~ARGH<0 OR ARGH>3; 70245000
|
|
DSKS.MYUSEF~ARGH; 70246000
|
|
END; 70247000
|
|
BEGIN % FILE.OTHERUSE 2170247100
|
|
MSG~ARGH<0 OR ARGH>3; 70247200
|
|
DSKS.OTHERUSEF~ARGH; 70247300
|
|
END; 70247400
|
|
BEGIN % FILE.FLEXIBLE 2270248000
|
|
MSG~ARGH<0 OR ARGH>1; 70249000
|
|
DSKS.FLEXIBLEF~ARGH; 70250000
|
|
END; 70251000
|
|
BEGIN % FILE.PACKED 2370252000
|
|
MSG~ARGH<0 OR ARGH>1; 70253000
|
|
DSKS.PACKEDF~ARGH; 70254000
|
|
END; 70255000
|
|
BEGIN % FILE.SPEED 2470256100
|
|
MSG~ARGH>2 OR ARGH<0; 70256110
|
|
DSKS.SPEEDF~ARGH; 70256120
|
|
END; 70256130
|
|
BEGIN % FILE.BUFFERED 2570256140
|
|
MSG~ARGH>1 OR ARGH<0; 70256150
|
|
BFFRD~ARGH; 70256160
|
|
END; 70256170
|
|
BEGIN % FILE.BUFFERS 2670256180
|
|
MSG~ARGH>63 OR ARGH<0; 70256190
|
|
BUFFREQ~ARGH; 70256200
|
|
END; 70256210
|
|
BEGIN % FILE.DIRECTION 2770256220
|
|
MSG~ARGH>1 OR ARGH<0; 70256230
|
|
DSKS.DIRECTIONF~ARGH; 70256240
|
|
END; 70256250
|
|
BEGIN % FILE.ERRECOVERY 2870256260
|
|
MSG~ARGH>1 OR ARGH<0; 70256270
|
|
FILESTATUS.ERRLEVEL~ARGH; 70256280
|
|
END; 70256290
|
|
BEGIN % FILE.INTMODE 2970256300
|
|
MSG~ARGH>4 OR ARGH<0; 70256310
|
|
INTERNALMODE~ARGH; 70256320
|
|
END; 70256330
|
|
BEGIN % FILE.OPEN 3070256340
|
|
MSG~BOOLEAN(ARGH)EQV ALREADYOPEN; 70256350
|
|
IF BOOLEAN(ARGH)THEN OPEN(FIB,0) ELSE 70256360
|
|
% CLOSE(FIB,0) 70256370
|
|
; 70256380
|
|
END; 70256390
|
|
BEGIN % FILE.PRESENT 3170256400
|
|
OPEN(FIB,3); 70256410
|
|
% RETURN 70256420
|
|
MSG~TRUE; 70256430
|
|
END; 70256440
|
|
BEGIN % FILE.SIZEMODE 3270256450
|
|
MSG~ARGH>4 OR ARGH<0; 70256460
|
|
RECORDMODE~ARGH; 70256470
|
|
END; 70256480
|
|
BEGIN % FILE.SIZEOFFSET 3370256490
|
|
MSG~ARGH>65535 OR ARGH<0; 70256500
|
|
RECORDOFF~ARGH; 70256510
|
|
END; 70256520
|
|
BEGIN % FILE.SIZE2 3470256530
|
|
MSG~ARGH>65535 OR ARGH<0; 70256540
|
|
RECORDSZ~ARGH; 70256550
|
|
END; 70256560
|
|
MSG~TRUE; % FILE.STATE 3570256570
|
|
MSG~TRUE; % FILE.EOF 3670256580
|
|
MSG~TRUE; % FILE.PARITYERR 3770256590
|
|
MSG~TRUE; % FILE.SIZERR 3870256600
|
|
MSG~TRUE; % FILE.LOCKOUT 3970256610
|
|
MSG~TRUE; % FILE.NULINPUT 4070256620
|
|
MSG~TRUE; % FILE.BREAK 4170256630
|
|
BEGIN % FILE.STATUS 4270256640
|
|
OPEN(FIB,STATUSV); 70256650
|
|
% RETURN 70256660
|
|
MSG~TRUE; 70256670
|
|
END; 70256680
|
|
BEGIN % FILE.WRAPAROUND 4370256690
|
|
MSG~ARGH>1 OR ARGH<0; 70256700
|
|
WRAPAROUND~1; 70256710
|
|
END; 70256720
|
|
END; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70257000
|
|
IF MSG THEN IOERRMESSL(1,TYPE,POINTER(LEB[(T+LEBC).FXD+ 70258000
|
|
ONES(T.OPTMASK)],8)); 70259000
|
|
DIVORCEMOM(IOAREA); 70260000
|
|
DIVORCEMOM(LEB); 70261000
|
|
TURNOVERLAYKEY(LBLEQTN.ADDRESSF); 70261100
|
|
UNLOCKFIB; 70262000
|
|
END ATTRIBUTEHANDLER; 70263000
|
|
REAL PROCEDURE ATTRIBUTEGRABBER=(0,41)(FIB,TYPE,ARGH); 70263100
|
|
VALUE TYPE; 70263110
|
|
ARRAY FIB[*]; 70263120
|
|
REAL TYPE; 70263130
|
|
WORD ARGH; 70263140
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70263150
|
|
% ATTRIBUTEGRABBER GRABS FILE ATTRIBUTES ... SERIOUSLY %70263160
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70263170
|
|
ARRAY IOAREA,LEB[*]; 70263180
|
|
BOOLEAN MSG; 70263190
|
|
FIELD TYPEF=TYPE:1; 70263200
|
|
POINTER NAMES=ARGH,PLEB,PNLB; 70263210
|
|
REAL 70263220
|
|
FIB0, 70263230
|
|
U, 70263240
|
|
T, 70263250
|
|
CARE ~4"FFFFFFFFFFF", 70263260
|
|
MSK ~4"FFFFFFFFFFF"; 70263270
|
|
WORD ARRAY FIBW=FIB[*]; 70263280
|
|
FIBUZZ; 70263290
|
|
FIB0~FIBSIZE; 70263300
|
|
IOAREA~IOADESC; 70263310
|
|
IF BOOLEAN(CARE.TYPEF) THEN 70263320
|
|
IF BOOLEAN(MSK.TYPEF)EQV NOTOPEN THEN 70263330
|
|
BEGIN TRACE(18);TRACE(21) END; 70263340
|
|
% IF NOT LABELEQTD THEN GETFPB(FIB); 70263350
|
|
LEB~LBLEQTN&DATADESCRIPTOR(); 70263360
|
|
MAKEPRESENTANDSAVE(LEB); 70263370
|
|
LBLEQTN~LEB; 70263380
|
|
CASE TYPE OF 70263390
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70263400
|
|
BEGIN % FILE.TITLE 070263410
|
|
PNLB~NAMES; 70263420
|
|
THRU REAL((PLEB~POINTER(LEB[U~((T~LEB[0]).FXD+ONES(T.OPTMASK))]70263430
|
|
,8)+3)-1,1)DO 70263440
|
|
REPLACE PNLB:PNLB BY PLEB:PLEB+1 FOR REAL(PLEB,1),8"/"; 70263450
|
|
REPLACE PNLB-1 BY 8"." 70263460
|
|
END; 70263470
|
|
RETURN(GEN1.REEL); % FILE.REEL 170263480
|
|
RETURN(GEN2.CRTNDATE); % FILE.DATE 270263490
|
|
RETURN(GEN1.CYCLE); % FILE.CYCLE 370263500
|
|
RETURN(GEN1.GENVERSN); % FILE.VERSION 470263510
|
|
RETURN(GEN2.SAVFACTOR); % FILE.SAVEFACTOR 570263520
|
|
RETURN(LEBC.DENSITYL); % FILE.DENSITY 670263530
|
|
RETURN(LEBC.LPARITY); % FILE.PARITY 770263540
|
|
RETURN(LEBC.PTYPEL); % FILE.KIND 870263550
|
|
RETURN(LABELTYPE); % FILE.LABELTYPE 970263560
|
|
RETURN(LEBC.EXTFORML); % FILE.EXTMODE 1070263570
|
|
RETURN(LEBC.OPTIONALF); % FILE.OPTIONAL 1170263580
|
|
RETURN(LEBC.FPRTCTD); % FILE.PROTECTION 1270263590
|
|
RETURN(BLK1.FILETYPEL); % FILE.FILETYPE 1370263600
|
|
RETURN(BLK1.BLOCKSZL); % FILE.BLOCKSIZE 1470263610
|
|
RETURN(BLK1.MAXRECSZL); % FILE.MAXRECSIZE 1570263620
|
|
RETURN(BLK2.MINRECSZL); % FILE.MINRECSIZE 1670263630
|
|
RETURN(DSKS.AREASIZE); % FILE.AREASIZE 1770263640
|
|
RETURN(DSKS.NUMAREAS); % FILE.NUMAREAS 1870263650
|
|
RETURN(DSKS.ACCSSTYPEF); % FILE.ACCESS 1970263660
|
|
RETURN(DSKS.MYUSEF); % FILE.MYUSE 2070263670
|
|
RETURN(DSKS.OTHERUSEF); % FILE.OTHERUSEF 2170263680
|
|
RETURN(DSKS.FLEXIBLEF); % FILE.FLEXIBLE 2270263690
|
|
RETURN(DSKS.PACKEDF); % FILE.PACKED 2370263700
|
|
RETURN(DSKS.SPEEDF); % FILE.SPEED 2470263710
|
|
RETURN(BFFRD); % FILE.BUFFERED 2570263720
|
|
RETURN(NUMBEROFBUFFERS); % FILE.BUFFERS 2670263730
|
|
RETURN(DIRECTION); % FILE.DIRECTION 2770263740
|
|
RETURN(FILESTATUS.ERRLEVEL); % FILE.ERRECOVERY 2870263750
|
|
RETURN(INTERNALMODE); % FILE.INTMODE 2970263760
|
|
RETURN(REAL(ALREADYOPEN)); % FILE.OPEN 3070263770
|
|
BEGIN % FILE.PRESENT 3170263780
|
|
OPEN(FIB,3); 70263790
|
|
% RETURN 70263800
|
|
MSG~TRUE; 70263810
|
|
END; 70263820
|
|
RETURN(RECORDMODE); % FILE.SIZEMODE 3270263830
|
|
RETURN(RECORDOFF); % FILE.SIZEOFFSET 3370263840
|
|
RETURN(RECORDSZ); % FILE.SIZE2 3470263850
|
|
RETURN(FIRSTONE(FILESTATUS.STATEF)); % FILE.STATE 3570263860
|
|
RETURN(ENDOV); % FILE.EOF 3670263870
|
|
RETURN(FILESTATUS.PARITYB); % FILE.PARITYERR 3770263880
|
|
RETURN(FILESTATUS.DATAERRORB); % FILE.SIZERR 3870263890
|
|
RETURN(FILESTATUS.LOCKOUTB); % FILE.LOCKOUT 3970263900
|
|
RETURN(FILESTATUS.NOINPUTB); % FILE.NULINPUT 4070263910
|
|
RETURN(FILESTATUS.BREAKB); % FILE.BREAK 4170263920
|
|
BEGIN % FILE.STATUS 4270263930
|
|
OPEN(FIB,STATUSV); 70263940
|
|
% RETURN 70263950
|
|
MSG~TRUE; 70263960
|
|
END; 70263970
|
|
RETURN(WRAPAROUND); % FILE.WRAPAROUND 4370263980
|
|
END; 70263990
|
|
IF MSG THEN IOERRMESSL(2,TYPE,POINTER(LEB[(T~LEBC).FXD+ 70264000
|
|
ONES(T.OPTMASK)],8)); 70264010
|
|
DIVORCEMOM(IOAREA); 70264020
|
|
DIVORCEMOM(LEB); 70264030
|
|
TURNOVERLAYKEY(LBLEQTN.ADDRESSF); 70264040
|
|
UNLOCKFIB; 70264050
|
|
END ATTRIBUTE GRABBER; 70264060
|
|
WORD PROCEDURE MAKEFIB=(0,26)(BUFFERS,LOGICALUNITTYPE,NAMES); 70264070
|
|
VALUE BUFFERS,LOGICALUNITTYPE; 70264080
|
|
REAL BUFFERS,LOGICALUNITTYPE; 70264090
|
|
POINTER NAMES; 70264100
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70264110
|
|
% BUILD AN FIB FOR SIMPLE I/O %70264120
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70264130
|
|
ARRAY 70264140
|
|
FIB[10+REAL(LOGICALUNITTYPE=DISKFILE)], 70264150
|
|
LEB[5+((REAL(NAMES,1)+5)DIV 6)]; 70264160
|
|
LAYOUT 70264170
|
|
FIBSZL(FIBFXD~9,39-DISKHDRF:1,39-SORTWORDF:1~1) 70264180
|
|
, RECORDSTATSL(MTBUF~1,SIO~1) 70264190
|
|
, FILESTATSL(EOFACTION~1,PARACTION~1) 70264200
|
|
, LEBCL(FXD~5,FPRTCTD~1,LPARITY~1) 70264210
|
|
, DISKSPCL(DRCTRYF~1,FLEXIBLEF~1,SPEEDF,NUMAREAS~20) 70264220
|
|
; 70264230
|
|
REAL FIB0; 70264240
|
|
WORD ARRAY FIBW=FIB[*]; 70264250
|
|
FIB0~FIBSIZE~0&FIBSZL(,REAL(LOGICALUNITTYPE=DISKFILE),); 70264260
|
|
RECORDSTATUS~0&RECORDSTATSL(,); 70264270
|
|
FILESTATUS~0&FILESTATSL(,); 70264280
|
|
BUFFREQ~BUFFERS; 70264290
|
|
SORTWORD~SNR; 70264300
|
|
LEBC~LOGICALUNITTYPE&LEBCL(,,); 70264310
|
|
DSKS~0&DISKSPCL(,,,); 70264320
|
|
REPLACE POINTER(LEB[5],8) BY NAMES FOR REAL(NAMES,1); 70264330
|
|
LBLEQTN~LEB; 70264340
|
|
MAKEFIB~FIB; 70264350
|
|
DIVORCEMOM(FIB); 70264360
|
|
DIVORCEMOM(LEB); 70264370
|
|
END MAKEFIB; 70264371
|
|
REAL PROCEDURE WRITEALABEL=(0,48)(LEB,U,LBLS,VSN,TYPE,BCNT,RCNT); 70266000
|
|
VALUE U,LBLS,VSN,TYPE,BCNT,RCNT; 70266100
|
|
REAL U,LBLS,VSN,TYPE,BCNT,RCNT; 70266200
|
|
ARRAY LEB[*]; 70267000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70268000
|
|
% THIS PROCEDURE BUILDS THE USASI FILE HEADERS. THE FORMATS %70269000
|
|
% ARE: %70270000
|
|
% %70271000
|
|
% # CHARS NAME %70272000
|
|
% %70273000
|
|
% VOLUME HEADER LABEL %70274000
|
|
% %70275000
|
|
% 4 "VOL1" %70276000
|
|
% 6 VOLUME SERIAL NUMBER %70277000
|
|
% 1 ACCESSIBILITY %70278000
|
|
% 17 FILE SET ID (MULTIPLE FILE ID) %70279000
|
|
% 2 "65" %70280000
|
|
% 1 TAPE TYPE %70281000
|
|
% 6 RFE %70282000
|
|
% 14 OWNER %70283000
|
|
% 28 RFE %70284000
|
|
% 1 LABEL STANDARD LEVEL (1) %70285000
|
|
% %70286000
|
|
% FIRST FILE HEADER %70287000
|
|
% %70288000
|
|
% 4 "HDR1" %70289000
|
|
% 17 FILE IDENTIFIER %70290000
|
|
% 6 SET IDENTIFIER (FIRST 6 CHARACTERS OF %70291000
|
|
% FILE SET ID) %70292000
|
|
% 4 FILE SECTION NUMBER (RELATIVE REEL NUMBER) %70293000
|
|
% 4 FILE SEQUENCE NUMBER (WITHIN SET) %70294000
|
|
% 4 GENERATION NUMBER %70295000
|
|
% 2 GENERATION VERSION %70296000
|
|
% 6 CREATION DATE (BYYDDD) %70297000
|
|
% 6 EXPIRATION DATE (BYYDDD) %70298000
|
|
% 1 ACCESSIBILITY %70299000
|
|
% 6 BLOCK COUNT %70300000
|
|
% 7 RECORD COUNT %70301000
|
|
% 6 " B6500" %70302000
|
|
% 7 RFE %70303000
|
|
% %70304000
|
|
% SECOND FILE HEADER %70305000
|
|
% %70306000
|
|
% 4 "HDR2" %70307000
|
|
% 1 RECORD FORMAT %70308000
|
|
% STANDARD: %70309000
|
|
% F = FIXED LENGTH %70310000
|
|
% D = VARIABLE IN DECIMAL IN FIRST 4 %70311000
|
|
% CHARACTERS %70312000
|
|
% V = VARIABLE IN BINARY IN FIRST 4 %70313000
|
|
% CHARACTERS %70314000
|
|
% U = UNDEFINED %70315000
|
|
% EXTENSIONS: %70316000
|
|
% I - INTERNAL %70317000
|
|
% L = LINKS %70318000
|
|
% Z = FORTRAN FUNNY %70319000
|
|
% 5 BLOCK LENGTH IN EXTERNAL FORM (MAXIMUM) %70320000
|
|
% 5 RECORDLENGTH IN EXTERNAL FORM (MAXIMUM) %70321000
|
|
% 1 DENSITY %70322000
|
|
% 0 = 200 %70323000
|
|
% 1 = 556 %70324000
|
|
% 2 = 800 %70325000
|
|
% 3 = 1600 %70326000
|
|
% 1 VOLUME SWITCH (0 IF FIRST VOLUME OF A FILE) %70327000
|
|
% 1 PARITY %70328000
|
|
% 0 = ALPHA (EVEN) %70329000
|
|
% 1 = BINARY (ODD) %70330000
|
|
% 1 EXTERNAL FORM: %70331000
|
|
% 0 - UNSPECIFIED (WORDS) %70332000
|
|
% 1 - EBCDIC %70333000
|
|
% 2 - BCL %70334000
|
|
% 3 - ASCII %70335000
|
|
% 1 PROTECTION %70336000
|
|
% 5 MINIMUM RECORD LENGTH %70337000
|
|
% 25 TBS %70338000
|
|
% 2 OFFSET TO DATA (6 IF PROTECTED) %70339000
|
|
% 28 RFE %70340000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70341000
|
|
% %70342000
|
|
% FIRST END-OF-FILE LABEL %70343000
|
|
% %70344000
|
|
% SAME AS FIRST FILE HEADER EXCEPT FOR FIRST 4 %70345000
|
|
% CHARACTERS "EOF1" %70346000
|
|
% %70347000
|
|
% SECOND END-OF-FILE LABEL %70348000
|
|
% %70349000
|
|
% SAME AS SECOND FILE HEADER EXCEPT FOR FIRST 4 %70350000
|
|
% CHARACTERS "EOF2" %70351000
|
|
% %70352000
|
|
% END-OF-VOLUME LABEL %70353000
|
|
% %70354000
|
|
% SAME AS FIRST END-OF-FILE LABEL EXCEPT FOR FIRST 4 %70355000
|
|
% CHARACTERS "EOV1" %70356000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70357000
|
|
REAL T, 70358000
|
|
EOT, 70359000
|
|
I, 70360000
|
|
N, 70361000
|
|
TAPETYPE~IF UNIT[U].UNITTYPE=13OR UNIT[U].UNITTYPE=29 70362000
|
|
THEN 1 ELSE 0, 70363000
|
|
RSLT, 70364000
|
|
X, 70365000
|
|
Z; 70366000
|
|
LABEL XIT,WRAPUP; 70367000
|
|
ARRAY LABELAREA[IF TAPETYPE=1 THEN 11 ELSE 15], 70368000
|
|
NAMES[IF TAPETYPE=1 THEN 5 ELSE 7]; 70369000
|
|
POINTER PLEB~POINTER(LEB), 70370000
|
|
PNMS, 70371000
|
|
PLABELAREA, 70372000
|
|
PLBL~POINTER(LEB[(T~LEBC).FXD+ONES(T.OPTMASK)],8)+2; 70373000
|
|
FIELD USASIL=5:1,ENDL=1:1,VLML=0:1; 70374000
|
|
FIELD INTNAME=44:1; 70375000
|
|
DEFINE NNL(S,E) =(IF TAPETYPE=1THEN S ELSE E)#; 70376000
|
|
IF TAPETYPE=1 THEN PLABELAREA~POINTER(LABELAREA[1],6) ELSE 70377000
|
|
PLABELAREA~POINTER(LABELAREA[1],8); 70378000
|
|
N~REAL(PLBL-1,1); 70379000
|
|
WHILE N~N-1>2 DO PLBL~PLBL+1+REAL(PLBL,1); 70380000
|
|
IF TAPETYPE=1 THEN REPLACE PNMS~POINTER(NAMES,6)BY 70381000
|
|
PLBL FOR (X~REAL(PLBL,1))+1+(IF N=0THEN 0ELSE 70382000
|
|
REAL(PLBL+1+X,1)+1) 70383000
|
|
WITH EBCTOBCL[*] 70384000
|
|
ELSE REPLACE PNMS~POINTER(NAMES,8)BY PLBL FOR 70385000
|
|
(X~REAL(PLBL,1)) +1+(IF N=0THEN 0ELSE 70386000
|
|
REAL(PLBL+1+X,1)+1); 70387000
|
|
IF BOOLEAN(LBLS.USASIL)THEN 70388000
|
|
BEGIN 70389000
|
|
IF MAGTAPE(U)THEN 70390000
|
|
LABELAREA[0]~0&TAPEIOCWL(0,REAL(TAPETYPE=1 AND 70391000
|
|
BOOLEAN(T.LPARITY+1)),REAL(TAPETYPE!1),T.DENSITYL, 70392000
|
|
T.LPARITY) 70393000
|
|
ELSE 70394000
|
|
LABELAREA[0]~0&PRINTIOCWL(,1,REAL(T.EXTFORML=1),0,1); 70395000
|
|
IF BOOLEAN(LBLS.VLML)AND NOT BOOLEAN(LBLS.ENDL) THEN 70396000
|
|
BEGIN 70397000
|
|
REPLACE PLABELAREA BY 70398000
|
|
NNL(6"VOL1",8"VOL1") FOR 4 CORRECTLY, 70399000
|
|
VSN FOR 6 CORRECTLY, % SERIAL # 70400000
|
|
% TRANSLATION 70401000
|
|
NNL(6" ",8" ") FOR 1 CORRECTLY, 70402000
|
|
PNMS+1 FOR REAL(PNMS,1), 70403000
|
|
NNL(6" ",8" ")FOR 17-REAL(PNMS,1), 70404000
|
|
NNL(6"65",8"65") FOR 2 CORRECTLY, 70405000
|
|
TYPE FOR 1 CORRECTLY, 70406000
|
|
NNL(6" ",8" ")FOR 48, 70407000
|
|
NNL(6"1",8"1") FOR 1 CORRECTLY; 70408000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0) 70409000
|
|
).RDERROR)AND BOOLEAN(3"377376"))!0 THEN 70410000
|
|
BEGIN WRITEALABEL~RSLT;GO TO XIT END; 70411000
|
|
EOT~RSLT.RDENDOFTAPE; 70412000
|
|
IF N=1 THEN REPLACE PLABELAREA+11 BY 0 FOR 17; 70413000
|
|
END; 70414000
|
|
REPLACE PLABELAREA BY 70415000
|
|
(IF BOOLEAN(LBLS.ENDL)THEN 70416000
|
|
IF BOOLEAN(LBLS.VLML)THEN 70417000
|
|
NNL(6"EOV1",8"EOV1") ELSE 70418000
|
|
NNL(6"EOF1",8"EOF1") 70419000
|
|
ELSE NNL(6"HDR1",8"HDR1")) FOR 4 CORRECTLY, 70420000
|
|
PNMS+(X~IF N=1 THEN REAL(PNMS,1)ELSE 0)+1 FOR 70421000
|
|
REAL(PNMS+X,1), % FILE ID 70422000
|
|
NNL(6" ",8" ")FOR 17-REAL(PNMS+X,1), 70423000
|
|
IF N=1 THEN 0 ELSE REAL(PNMS+1,MIN(6,REAL(PNMS+1,1))) 70424000
|
|
FOR 6 CORRECTLY, % SET ID 70425000
|
|
NNL(6" ",8" ")FOR IF N=1THEN 6ELSE 70426000
|
|
6-REAL(PNMS,1), 70427000
|
|
GEN1.REEL FOR 4 DIGITS, % SECTION # 70428000
|
|
1 FOR 4 DIGITS, % SEQUENCE # 70429000
|
|
GEN1.CYCLE FOR 4 DIGITS, % GENERATION # 70430000
|
|
GEN1.GENVERSN FOR 2 DIGITS, % VERSION # 70431000
|
|
NNL(6" ",8" ") FOR 1 CORRECTLY, 70432000
|
|
(Z~IF(X~GEN2).CRTNDATE=0THEN TODAYSDATE ELSE X.CRTNDATE) 70433000
|
|
FOR 5 DIGITS, 70434000
|
|
NNL(6" ",8" ") FOR 1 CORRECTLY, 70435000
|
|
((X~Z MOD 100+X.SAVFACTOR+3649)MOD 365 % EXPIRATION DATE 70436000
|
|
+(X DIV 365+Z DIV 100-10)|1000+1)FOR 5 DIGITS, 70437000
|
|
NNL(6" ",8" ") FOR 1 CORRECTLY, 70438000
|
|
BCNT FOR 6 DIGITS, % BLOCK COUNT 70439000
|
|
RCNT FOR 7 DIGITS, % RECORD COUNT 70440000
|
|
NNL(6" B6500",8" B6500")FOR 6 CORRECTLY, 70441000
|
|
NNL(6" ",8" ")FOR 7 CORRECTLY; 70442000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0) 70443000
|
|
).RDERROR)AND BOOLEAN(3"377376"))!0 THEN 70444000
|
|
BEGIN WRITEALABEL~RSLT;GO TO XIT END; 70445000
|
|
EOT~RSLT.RDENDOFTAPE; 70446000
|
|
IF BOOLEAN(LBLS.ENDL)AND BOOLEAN(LBLS.VLML)THEN GO TO XIT; 70447000
|
|
%%%%% HDR2 70448000
|
|
X~U; 70449000
|
|
U~T.FXD+T.INTNAME; 70450000
|
|
REPLACE PLABELAREA BY 70451000
|
|
(IF BOOLEAN(LBLS.ENDL)THEN NNL(6"EOF2",8"EOF2")ELSE 70452000
|
|
NNL(6"HDR2",8"HDR2"))FOR 4 CORRECTLY, 70453000
|
|
NNL(CASE (Z~BLK1).FILETYPEL OF 70454000
|
|
(6"F",6"D",6"V",6"U",6"I",6"L",6"Z"), 70455000
|
|
CASE Z OF(8"F",8"D",8"V",8"U",8"I",8"L",8"Z")) 70456000
|
|
FOR 1 CORRECTLY, 70457000
|
|
Z.BLOCKSZL FOR 5 DIGITS, % BLOCK.LENGTH 70458000
|
|
Z.MAXRECSZL FOR 5 DIGITS, % RECORD LENGTH 70459000
|
|
(IF T.DENSITYL=0 THEN 2ELSE IF T.DENSITYL=2THEN 0 ELSE 70460000
|
|
T.DENSITYL)FOR 1 CORRECTLY, % DENSITY 70461000
|
|
REAL(GEN1.REEL!1)FOR 1 CORRECTLY, % SENTINEL 70462000
|
|
T.LPARITY FOR 1 CORRECTLY, % PARITY 70463000
|
|
T.EXTFORML FOR 1 CORRECTLY, % EXTERNAL FORM 70464000
|
|
T.FPRTCTD FOR 1 CORRECTLY, % PROTECTION 70465000
|
|
BLK2.MINRECSZL FOR 5 DIGITS, % MIN RECORD SIZE 70466000
|
|
NNL(6" ",8" ")FOR 25, 70467000
|
|
(IF BOOLEAN(T.FPRTCTD)THEN NNL(8,6)ELSE 0) 70468000
|
|
FOR 2 CORRECTLY, % BUFFER OFFSET 70469000
|
|
NNL(6" ",8" ")FOR 28; 70470000
|
|
U~X; 70471000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0) 70472000
|
|
).RDERROR)AND BOOLEAN(3"377376"))!0 THEN 70473000
|
|
BEGIN WRITEALABEL~RSLT;GO TO XIT END; 70474000
|
|
EOT~RSLT.RDENDOFTAPE; 70475000
|
|
END ELSE 70476000
|
|
; 70477000
|
|
WRAPUP: 70478000
|
|
WRITEALABEL~EOT; 70479000
|
|
XIT: 70480000
|
|
END WRITEALABEL; 70481000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70482000
|
|
PROCEDURE OPEN(FIB,TYPEV); 70483000
|
|
VALUE TYPEV; 70484000
|
|
ARRAY FIB[*]; 70485000
|
|
REAL TYPEV; 70486000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70487000
|
|
% OPEN MAKES A SOWS EAR OUT OF A SILK PURSE %70488000
|
|
% TYPEV = %70489000
|
|
% 0 - NORMAL OPEN %70490000
|
|
% 1 - REEL SWITCH %70491000
|
|
% 2 - SEARCH (FILE.STATUS) %70492000
|
|
% 3 - ASSIGN IF AVAILABLE (FILE.PRESENT) %70493000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70494000
|
|
WORD LBLSW=FIB,TEMPW,LBLDSCW; %70495000
|
|
ARRAY DHEADER,IOAREA,LABELAREA,LEB[*]; %70496000
|
|
ARRAY LBLDSC=LBLDSCW[*]; 70497000
|
|
DEFINE OUTPUTL=INPUTL#; 70498000
|
|
DEFINE SEARCHV = 2#; 70499000
|
|
DEFINE SKLTN = IOINFO#; 70500000
|
|
FIELD DISKF=47:1; 70501000
|
|
LABEL HR,OUT,CLOSET,TAPEL,CMN,XIT; 70502000
|
|
LABEL SETUP; 70503000
|
|
LABEL RETRYL; 70504000
|
|
LAYOUT 70505000
|
|
BTL(1:1,0:1), 70506000
|
|
INPUTL(IOREADBIT~1,IOTRANSLATE,IOFRAMESIZE,IOMEMPROTECT~1,70507000
|
|
IOBACKWARD); % FORMAT INPUT IOCW 70508000
|
|
POINTER PNMS,PLBL; 70509000
|
|
POINTER PC; 70510000
|
|
REAL 70511000
|
|
FIB0, 70512000
|
|
FRSLT, 70513000
|
|
T, 70514000
|
|
U, 70515000
|
|
UNT, 70516000
|
|
UTYPE, 70517000
|
|
LBLSZ, 70518000
|
|
P, 70519000
|
|
TUSZ, 70520000
|
|
FINDWORD, 70521000
|
|
TAPETYPE, 70522000
|
|
RSLT; 70523000
|
|
EVENT EVNT; 70524000
|
|
REFERENCE IOCB; 70525000
|
|
WORD IOCBW=IOCB; 70525100
|
|
WORD ARRAY FIBW=FIB[*]; 70526000
|
|
VALUE ARRAY CARDCODES ~ ( 70527000
|
|
% A-I 70528000
|
|
3"0000440042004100", 3"4040402040104004", 70529000
|
|
3"3002400100000000", 0, 70530000
|
|
% "-"-R 70531000
|
|
3"2000240022002100", 3"2040202020102004", 70532000
|
|
3"2002200100000000", 0, 70533000
|
|
% S-Z 70534000
|
|
3"0000000012001100", 3"1040102010101004", 70535000
|
|
3"1002100100000000", 0, 70536000
|
|
% 0-9 70537000
|
|
3"1000040002000100", 3"0040002000100004", 70538000
|
|
3"0002000100000000", 0 ); 70539000
|
|
MONITOR BOBMONITOR(FINDWORD,RSLT,U,UTYPE); 70540000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70541000
|
|
PROCEDURE WRITEUSERSLABELS(MASK);VALUE MASK;REAL MASK; 70542000
|
|
BEGIN 70543000
|
|
WORD LBLDSCW; 70544000
|
|
ARRAY LBLDSC=LBLDSCW[*]; 70545000
|
|
REAL 70546000
|
|
P, 70547000
|
|
LABELNO; 70548000
|
|
LBLDSCW~LBLSW; 70549000
|
|
LBLDSCW.SIRWDELTAF~LBLSW.SIRWDELTAF+1; 70550000
|
|
TEMPW~LBLSW; 70551000
|
|
LBLSW~LBLDSCW; 70552000
|
|
LBLDSC~FIB; 70553000
|
|
MAKEPRESENTANDSAVE(LBLDSC); 70554000
|
|
LBLSW~TEMPW; 70555000
|
|
P~((LBLDSC.LENGTHF+CASE(P~LBLDSC.SZF)OF(0,0,11,7,5)) 70556000
|
|
DIV CASE P OF (1,.5,12,8,6))DIV NUMLABELS; 70557000
|
|
LABELAREA~*&ARRAYDESCL(,P,M[LBLDSC.ADDRESSF].ADDRESSF); 70558000
|
|
% BEFORE USE ROUTINES 70559000
|
|
THRU NUMLABELS DO 70560000
|
|
BEGIN 70561000
|
|
LABELAREA[0]~SKLTN; 70562000
|
|
IF INTERNALMODE=3THEN REPLACE POINTER(LABELAREA[1],6)BY 6"UHL",70563000
|
|
LABELNO~LABELNO+1 FOR 1 CORRECTLY 70564000
|
|
ELSE 70565000
|
|
REPLACE POINTER(LABELAREA[1],8)BY 8"UHL", 70566000
|
|
LABELNO+LABELNO+1 FOR 1 CORRECTLY; 70567000
|
|
LABELAREA~*&ARRAYDESCL(,P-1,*); 70568000
|
|
IOREQUEST(IOCB~IOQUE(USAH,-@377777,REFERENCE(LABELAREA),EVNT));70569000
|
|
WAIT(EVNT); 70570000
|
|
RESET(EVNT); 70571000
|
|
IF REAL(BOOLEAN(RSLT~REAL(BOOLEAN((MISC@IOCB).RDERROR)OR 70572000
|
|
BOOLEAN(RSLT)))AND BOOLEAN(MASK))!0 THEN 70573000
|
|
BEGIN 70574000
|
|
TRACE(18); 70575000
|
|
TRACE(0); 70576000
|
|
PUTUNT(1,1,0,0); 70577000
|
|
GO TO RETRYL; 70578000
|
|
END; 70579000
|
|
FORGETAREA(6,WORD(IOCB).ADDRESSF); 70580000
|
|
LABELAREA~*&ARRAYDESCL(,P,LABELAREA.ADDRESSF+P-1); 70581000
|
|
END; 70582000
|
|
% USE ROUTINES 70583000
|
|
DIVORCEMOM(LABELAREA); 70584000
|
|
TURNOVERLAYKEY(LBLDSC.ADDRESSF); 70585000
|
|
DIVORCEMOM(LBLDSC); 70586000
|
|
END WRITEUSERSLABELS; 70587000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%70588000
|
|
IF ALREADYOPEN THEN %%%%%%%%%%%%%%%%%%%%%%%%% ALREADY OPEN% 70589000
|
|
TRACE(21) 70590000
|
|
ELSE 70591000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CLOSED APPROP. 70592000
|
|
BEGIN 70593000
|
|
% GET FPB 70594000
|
|
LEB~LBLEQTN&DATADESCRIPTOR(); 70595000
|
|
MAKEPRESENTANDSAVE(LEB); 70596000
|
|
LBLEQTN~LEB; 70597000
|
|
RETRYL: 70598000
|
|
IF TYPEV=REGOPEN THEN 70599000
|
|
IF INOUTPART{INV THEN 70600000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% INPUT 70601000
|
|
OPNINPUT~1; 70602000
|
|
U~(FINDWORD~FINDINPUT(LEB,0)).REPINFOF; 70603000
|
|
%%%% FIND INPUT HAS TO CHECK LABEL TYPE 70604000
|
|
IF FINDWORD<0 THEN IF TYPEV!SEARCHV THEN TRACE(21)ELSE GO XIT; 70605000
|
|
IF FRSLT~(FINDWORD.REPVALF)=OFV THEN 70606000
|
|
BEGIN % OPTIONAL 70607000
|
|
IF BOOLEAN(NOPTIONAL)THEN TRACE(21); 70608000
|
|
RECORDSTATUS.EXCEPTION~1; 70609000
|
|
ENDOV~1; 70610000
|
|
FILESTATUS.OPT~1; 70611000
|
|
GO TO XIT 70612000
|
|
END ELSE 70613000
|
|
IF FRSLT=FRV THEN 70614000
|
|
BEGIN % FINAL REEL 70615000
|
|
RECORDSTATUS.EXCEPTION~1; 70616000
|
|
ENDOV~1; 70617000
|
|
GO TO XIT 70618000
|
|
END ELSE 70619000
|
|
BEGIN %********************************************************%70620000
|
|
FIB0~FIBSIZE; 70621000
|
|
PNMS~POINTER(LEB[LEBC.FXD+ONES(LEBC.OPTMASK)],8); 70622000
|
|
OPENTIME~*-SCANIN(TIMEOFDAYWORD); 70623000
|
|
% FILE OPEN MESSAGE 70624000
|
|
% HOUSEKEEPING Q 70625000
|
|
IF BOOLEAN(FINDWORD.DISKF)THEN 70626000
|
|
BEGIN %***************************************% DISK FILE 170627000
|
|
SKLTNSTNDRD~DISKREAD; 70628000
|
|
DISKCOMMONL: 70629000
|
|
DHEADER~DISKHEADER~DISKFILEHEADERS[U,*]; 70630000
|
|
IF DHEADER[1].LOGICALMODEF=BCL AND INTERNALMODE>BCL THEN 70631000
|
|
IOERRMESSL(0,1,PNMS); % TRANSLATION PROB70632000
|
|
IF DHEADER[2].RCRDTYPE!RECORDTYPE THEN IOERRMESSL(0,4,PNMS); 70633000
|
|
% USERS LABELS 70634000
|
|
IF REVERSED THEN IF RECORDTYPE>2THEN IOERRMESSL(0,5,PNMS); 70635000
|
|
% COMPATIBILITY 70636000
|
|
UNITYP~DISKFILE; 70637000
|
|
UNITNUMBER~U; 70638000
|
|
GO TO BUFFERSL; 70639000
|
|
END; 70640000
|
|
GETUNT; 70641000
|
|
IF UTYPE~(UNT.UNITTYPE)=CARDREADER THEN 70642000
|
|
BEGIN %***************************************% CARD READER 70643000
|
|
SKLTNSTNDRD~0&INPUTL(,REAL(LCNTRL.EXTFORML=BCL), 70644000
|
|
REAL(INTERNALMODE!BCL)); 70645000
|
|
IF LCNTRL.EXTFORML=BCL AND INTERNALMODE>BCL THEN % TRANS PROB 70646000
|
|
IOERRMESSL(0,1,PNMS); 70647000
|
|
% BLOCKSIZE CHECK Q 70648000
|
|
UNT.UNITASSIGNED~1; 70649000
|
|
UNIT[U]~UNT; 70650000
|
|
UNITYP~UTYPE; 70651000
|
|
UNITNUMBER~U; 70652000
|
|
% USERS LABELS 70653000
|
|
IF REVERSED THEN IOERRMESSL(0,5,PNMS); 70654000
|
|
UINFOW[U]~LBLSW; 70655000
|
|
END ELSE 70656000
|
|
IF MAGTAPE(UTYPE)THEN 70657000
|
|
IF FRSLT=0 THEN % NO SPECIAL MSG 70658000
|
|
BEGIN %***************************************% MAGNETIC TAPE 70659000
|
|
SETUP: 70660000
|
|
TAPETYPE~IF UTYPE=13 OR UTYPE=29 THEN 1 ELSE 2; 70661000
|
|
SKLTN~0&TAPEIOCWL(1, 70662000
|
|
T~REAL(TAPETYPE=1 AND LCNTRL.LPARITY=0),% TRANSLATE 70663000
|
|
IF TAPETYPE=1THEN REAL(INTERNALMODE!BCL AND T=1)ELSE 1, 70664000
|
|
% FRAMESIZE 70665000
|
|
LCNTRL.DENSITYL, % DENSITY 70666000
|
|
LCNTRL.LPARITY); % PARITY 70667000
|
|
UNITYP~UTYPE; 70668000
|
|
UNITNUMBER~U; 70669000
|
|
IF RECORDTYPE>1 THEN IOERRMESSL(0,2,PNMS); % BAD RECORD TYPE 70670000
|
|
% IF BOOLEAN((UNT~UNIT[U]).ULABELLED)THEN USERFIB~WORD(NAME(FIB))70671000
|
|
% ELSE UINFOW[U]~WORD(NAME(FIB)); 70672000
|
|
UNT.UNITASSIGNED~1; 70673000
|
|
UNIT[U]~UNT; 70674000
|
|
IF LCNTRL.EXTFORML=BCL AND INTERNALMODE>BCL THEN % TRANS PROB 70675000
|
|
IOERRMESSL(0,1,PNMS); 70676000
|
|
IF REVERSED THEN IF RECORDTYPE>2THEN IOERRMESSL(0,5,PNMS); 70677000
|
|
IF RECORDTYPE=7 THEN 70678000
|
|
BEGIN % DEPENDENT SPEC 70679000
|
|
IF LCNTRL.LABELTYPEL!0 THEN IOERRMESSL(0,3,PNMS); 70680000
|
|
RECORDTYPE~LBLK1.FILETYPEL; 70681000
|
|
BLOCKSZ~LBLK1.BLOCKSZL; 70682000
|
|
MAXRECSZ~LBLK1.MAXRECSZL; 70683000
|
|
MINRECSZ~LBLK2.MINRECSZL; 70684000
|
|
END; 70685000
|
|
IF LCNTRL.LABELTYPEL=0 THEN 70686000
|
|
BEGIN % B6500 USASI LBL 70687000
|
|
IF LBLK1.FILETYPEL!RECORDTYPE THEN IOERRMESSL(0,4,PNMS); 70688000
|
|
% BLOCK SIZE 70689000
|
|
% RECORD SIZE 70690000
|
|
END ELSE 70691000
|
|
IF LCNTRL.LABELTYPEL=1 THEN % B5500 LABEL 70692000
|
|
BEGIN 70693000
|
|
% RECORD TYPE 70694000
|
|
END ELSE 70695000
|
|
IF LCNTRL.LABELTYPEL=2 THEN 70696000
|
|
BEGIN 70697000
|
|
END ELSE 70698000
|
|
; 70699000
|
|
% MEMORY DUMP 70700000
|
|
IF NUMLABELS!0 THEN % USERS LABELS 70701000
|
|
IF LCNTRL.LABELTYPEL=0 THEN % B6500 USASI 70702000
|
|
BEGIN 70703000
|
|
LBLDSCW~LBLSW; 70704000
|
|
LBLDSCW.SIRWDELTAF~LBLSW.SIRWDELTAF+1; 70705000
|
|
TEMPW~LBLSW; 70706000
|
|
LBLSW~LBLDSCW; 70707000
|
|
LBLDSC~FIB; 70708000
|
|
LBLSW~TEMPW; 70709000
|
|
MAKEPRESENTANDSAVE(LBLDSC); 70710000
|
|
P~((LBLDSC.LENGTHF+CASE (P~LBLDSC.SZF)OF(0,0,11,7,5)) 70711000
|
|
DIV CASE P OF(1,.5,12,8,6))DIV NUMLABELS; 70712000
|
|
LABELAREA~*&ARRAYDESCL(,P,M[LBLDSC.ADDRESSF].ADDRESSF); 70713000
|
|
THRU NUMLABELS DO 70714000
|
|
BEGIN 70715000
|
|
LABELAREA[0]~SKLTN; 70716000
|
|
LABELAREA~*&ARRAYDESCL(,P-1,*); 70717000
|
|
IOREQUEST(IOCB~IOQUE(USAH,-@377777,REFERENCE(LABELAREA),EVNT));70718000
|
|
WAIT(EVNT); 70719000
|
|
RESET(EVNT); 70720000
|
|
IF REAL(BOOLEAN(RSLT~(MISC@IOCB).RDERROR)AND 70721000
|
|
BOOLEAN(3"376776"))!0 THEN 70722000
|
|
BEGIN 70723000
|
|
CLOSET: 70724000
|
|
TRACE(18); 70725000
|
|
TRACE(0); 70726000
|
|
GO TO OUT; 70727000
|
|
END; 70728000
|
|
FORGETAREA(6,WORD(IOCB).ADDRESSF); 70729000
|
|
IF BOOLEAN(RSLT.RDWLOOREOF)THEN GO OUT; 70730000
|
|
LABELAREA~*&ARRAYDESCL(,P,LABELAREA.ADDRESSF+P); 70731000
|
|
END; 70732000
|
|
LABELAREA~*&ARRAYDESCL(,P,M[LBLDSC.ADDRESSF].ADDRESSF); 70733000
|
|
HR: 70734000
|
|
LABELAREA[0]~*&IOCWL(TAPESPACE,*); 70735000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,3"1001") 70736000
|
|
).RDERROR)AND BOOLEAN(3"376776"))!0 THEN GO TO CLOSET; 70737000
|
|
IF RSLT.RDWLOOREOF=0 THEN GO TO CLOSET; 70738000
|
|
LABELAREA[0]~SKLTN; 70739000
|
|
OUT: 70740000
|
|
DIVORCEMOM(LABELAREA); 70741000
|
|
TURNOVERLAYKEY(LBLDSC.ADDRESSF); 70742000
|
|
DIVORCEMOM(LEB); 70743000
|
|
TURNOVERLAYKEY(LBLEQTN.ADDRESSF); 70744000
|
|
GO TO INXITL; 70745000
|
|
END ELSE 70746000
|
|
IF LCNTRL.LABELTYPEL=2 THEN 70747000
|
|
BEGIN % B5500 70748000
|
|
IF LMISC<0THEN % USERS LABEL 70749000
|
|
BEGIN 70750000
|
|
LABELAREA~*&ARRAYDESCL(0,16,0); 70751000
|
|
LABELAREA[0]~*&IOCWSPACEL(,1,1); % BACK SPACE 70752000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 70753000
|
|
GO TO CLOSET; 70754000
|
|
FORGETSPACE(LABELAREA.ADDRESSF); 70755000
|
|
LABELAREA~*&ARRAYDESCL(0,LMISC.BCNTL,0); 70756000
|
|
LABELAREA[0]~SKLTN; 70757000
|
|
IF BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0))) THEN 70758000
|
|
GO TO CLOSET; 70759000
|
|
IF INTERNALMODE=3 THEN PLBL~POINTER(LABELAREA[8],6) ELSE 70760000
|
|
PLBL~POINTER(LABELAREA[10],8)+4; 70761000
|
|
LBLDSCW.SIRWDELTAF~LBLSW.SIRWDELTAF+1; 70762000
|
|
P~LMISC.BCNTL DIV (LBLSZ~IF INTERNALMODE=3 THEN 8 ELSE 6); 70763000
|
|
T~0; 70764000
|
|
TUSZ~0; 70765000
|
|
WHILE T~T+1{NUMLABELS AND P!0 DO 70766000
|
|
BEGIN 70767000
|
|
REPLACE POINTER(LBLDSC,*)+(TUSZ+LBLSZ)BY PLBL:PLBL FOR P:P 70768000
|
|
WHILE!4"FF"; 70769000
|
|
TUSZ~TUSZ+LBLSZ|11; 70770000
|
|
END; 70771000
|
|
GO TO HR 70772000
|
|
END; 70773000
|
|
END; 70774000
|
|
LABELAREA~*&ARRAYDESCL(0,2,0); 70775000
|
|
GO TO HR; 70776000
|
|
END ELSE 70777000
|
|
IF FRSLT=ILV THEN % "IL" MESSAGE 70778000
|
|
BEGIN % IGNORE LABEL 70779000
|
|
CMN: 70780000
|
|
IF BOOLEAN(UNT.ULABELLED)THEN GO TO SETUP; 70781000
|
|
SKLTN~0&TAPEIOCWL(1,0,REAL(TAPETYPE!1),0,1); 70782000
|
|
LABELTYPE~1; 70783000
|
|
% USERS LABELS 70784000
|
|
END ELSE 70785000
|
|
IF FRSLT=ULV THEN GO TO CMN % "UL" MESSAGE 70786000
|
|
ELSE TRACE(21) 70787000
|
|
ELSE 70788000
|
|
IF UTYPE=PAPERTAPERDR THEN 70789000
|
|
BEGIN %***************************************% PAPER TAPE 70790000
|
|
IF LEBC.EXTFORML=SINGLE THEN LEBC.EXTFORML~INTERNALMODE; 70791000
|
|
SKLTN~0&PPRTIOCWL(1,REAL(LEBC.EXTFORML=BCL), 70792000
|
|
REAL(INTERNALMODE!BCL), 70793000
|
|
IF LEBC.EXTFORML=BCL THEN 1 ELSE 70794000
|
|
IF LEBC.EXTFORML=5 THEN 0 ELSE 2); 70795000
|
|
IF REVERSED THEN IOERRMESSL(0,5,PNMS); 70796000
|
|
% USERS LABELS 70797000
|
|
UNITYP~UTYPE; 70798000
|
|
UNITNUMBER~U; 70799000
|
|
END ELSE 70800000
|
|
TRACE(21); 70801000
|
|
INXITL: 70802000
|
|
% IF USERS THEN GETUSERS(ABFI); 70803000
|
|
END; 70804000
|
|
END ELSE 70805000
|
|
IF INOUTPART=OUTV THEN 70806000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OUTPUT 70807000
|
|
OPNOUTPUT~1; 70808000
|
|
%%%%%% NEW DISK FILE 70809000
|
|
IF LEBC.PTYPEL=1 AND DSKS.AREASIZE!0 THEN GO TO DISKL; 70810000
|
|
% U~(FINDWORD~FINDOUTPUT(LBLEQTN,0)).LENGTHF; 70811000
|
|
IF BOOLEAN(FINDWORD.DISKF) THEN 70812000
|
|
%***************************************% DISK 70813000
|
|
IF FINDWORD.REPVALF=OUV THEN 70814000
|
|
BEGIN % NEW OUTPUT FILE 70815000
|
|
%%%%%% GENERAL OUDK 70816000
|
|
DISKL: 70817000
|
|
IF DSKS.NUMAREAS=0 THEN DSKS.NUMAREAS~20; 70818000
|
|
IF DSKS.AREASIZE=0 THEN DSKS.AREASIZE~1000; 70819000
|
|
SKLTNSTNDRD~DISKWRITE; 70820000
|
|
UNITYP~UTYPE~DISKFILE; 70821000
|
|
% BUILDAHEADER 70822000
|
|
DHEADER[1]~LEBC.EXTFORML&HEADERINFOONE( 70823000
|
|
1 % UPDATE 70824000
|
|
, 1 % OPEN COUNT 70825000
|
|
, 1 % FILE KIND 70826000
|
|
, 30 % HEADER SIZE 70827000
|
|
); 70828000
|
|
DHEADER[2]~FILEACCESS&HEADERINFOTWO( 70829000
|
|
DSKS.PACKEDF % PACKED 70830000
|
|
, LEBC.FPRTCTD 70831000
|
|
, DSKS.DRCTRYF 70832000
|
|
, RECORDTYPE % RECORD TYPE 70833000
|
|
); 70834000
|
|
DHEADER[3]~TANKDATA2; 70835000
|
|
DHEADER[5]~(IF BOOLEAN(DSKS.PACKEDF)THEN 70836000
|
|
((MAXRECSZ|DSKS.AREASIZE+ 70837000
|
|
CASE INTERNALMODE OF(0,0,11,7,5,5))DIV 70838000
|
|
CASE INTERNALMODE OF(1,.5,12,8,6,6)+29)DIV 30 70839000
|
|
ELSE 70840000
|
|
((BLOCKSZ+CASE INTERNALMODE OF (0,0,11,7,5,5))DIV 70841000
|
|
CASE INTERNALMODE OF(1,.5,12,8,6,6)+29)DIV 30 70842000
|
|
|(DSKS.AREASIZE DIV (BLOCKSZ DIV MAXRECSZ)) 70843000
|
|
)&ROWINFO(DSKS.NUMAREAS); 70844000
|
|
DHEADER[6]~1&NAMEQUALIFICATIONINFO(GEN2.SAVFACTOR,TODAYSDATE); 70845000
|
|
DHEADER[7]~TODAYSDATE; 70846000
|
|
% ENTERUSERFILE(LEB,DHEADER); 70847000
|
|
% USERS LABELS 70848000
|
|
GO TO BUFFERSL; 70849000
|
|
END ELSE 70850000
|
|
BEGIN % OLD OUTPUT FILE 70851000
|
|
SKLTNSTNDRD~DISKWRITE; 70852000
|
|
GO TO DISKCOMMONL; 70853000
|
|
END; 70854000
|
|
IF REVERSED THEN IOERRMESSL(0,6,PNMS); 70855000
|
|
GETUNT; 70856000
|
|
UNT.UNITASSIGNED~1; 70857000
|
|
IF UTYPE~UNT.UNITTYPE=CARDPUNCH1 OR UTYPE=CARDPUNCH2 THEN 70858000
|
|
BEGIN %***************************************% CARD PUNCH 70859000
|
|
IF LEBC.EXTFORML=SINGLE THEN LEBC.EXTFORML~INTERNALMODE; 70860000
|
|
IF INTERNALMODE=BCL AND LEBC.EXTFORML>BCL THEN % TRANS PROB 70861000
|
|
IOERRMESSL(0,1,PNMS); 70862000
|
|
SKLTNSTNDRD~0&OUTPUTL(0,REAL(LEBC.EXTFORML=BCL), 70863000
|
|
REAL(INTERNALMODE!BCL)); 70864000
|
|
UNITYP~UTYPE; 70865000
|
|
UNITNUMBER~U; 70866000
|
|
IF USASILABEL THEN 70867000
|
|
BEGIN 70868000
|
|
IF BOOLEAN(WRITEALABEL(LBLEQTN,U,33,0,1,BLOCKCOUNT,RECORDCOUNT)70869000
|
|
)THEN 70870000
|
|
BEGIN 70871000
|
|
% IRRECOVERABLE PUNCH CHECK 70872000
|
|
PNCHCKL: 70873000
|
|
UNIT[U]~UNT; 70874000
|
|
% MESSAGE Q 70875000
|
|
PUTUNT(1,1,0,0); 70876000
|
|
GO TO RETRYL; 70877000
|
|
END; 70878000
|
|
UNT.ULABELLED~0; 70879000
|
|
END ELSE 70880000
|
|
IF NOT UNLABELLED THEN 70881000
|
|
BEGIN 70882000
|
|
LABELAREA~*&ARRAYDESCL(0,IF INTERNALMODE=3THEN 11 ELSE 15,0); 70883000
|
|
LABELAREA[0]~0; 70884000
|
|
IF LEBC.EXTFORML!BCL THEN 70885000
|
|
REPLACE PLBL:PLBL~POINTER(LABELAREA[1],6) BY 70886000
|
|
6"70",6"00", 70887000
|
|
6"||M090M0",6"00" 70888000
|
|
ELSE 70889000
|
|
REPLACE PLBL:PLBL~POINTER(LABELAREA[1],6) BY 70890000
|
|
6"70",6"00", 70891000
|
|
6"||M090M0K0",6"00"; 70892000
|
|
PC~POINTER(CARDCODES,6); 70893000
|
|
THRU REAL(PNMS~PNMS+2,1) DO 70894000
|
|
REPLACE PLBL:PLBL BY PC+2|REAL(PNMS~PNMS+1,1).MOD64F 70895000
|
|
FOR 2; 70896000
|
|
IF BOOLEAN(WAITIO(LABELAREA,USAH,ERAH(UNEXP,0)))THEN 70897000
|
|
GO TO PNCHCKL; 70898000
|
|
FORGETSPACE(LABELAREA.ADDRESSF); 70899000
|
|
UNT.ULABELLED~1; 70900000
|
|
END ELSE 70901000
|
|
UNT.ULABELLED~0; 70902000
|
|
UNIT[U]~UNT; 70903000
|
|
IF NUMLABELS!0 THEN WRITEUSERSLABELS(REAL(NOT FALSE)); 70904000
|
|
END CARD PUNCH ELSE 70905000
|
|
IF MAGTAPE(UTYPE) THEN 70906000
|
|
BEGIN %***************************************% MAGNETIC TAPE 70907000
|
|
TAPETYPE~IF UTYPE=13 OR UTYPE=29 THEN 1 ELSE 70908000
|
|
IF UTYPE=14 OR UTYPE=30 THEN 2 ELSE 3; 70909000
|
|
SKLTN~0&TAPEIOCWL(, 70910000
|
|
T~REAL(TAPETYPE=1 AND NOT BOOLEAN(LEBC.LPARITY)), 70911000
|
|
IF TAPETYPE=1THEN REAL(INTERNALMODE=EBCDIC AND BOOLEAN(T))70912000
|
|
ELSE 1, 70913000
|
|
% LEB DENSITY MAINTAINED CORRECTLY (+4) 70914000
|
|
LEBC.DENSITYL, 70915000
|
|
LEBC.LPARITY); 70916000
|
|
UNITYP~UTYPE; 70917000
|
|
UNITNUMBER~U; 70918000
|
|
% IF BOOLEAN(UNT.ULABELLED)THEN USERFIB~WORD(NAME(FIB)) 70919000
|
|
% ELSE UINFOW[U]~WORD(NAME(FIB)); 70920000
|
|
IF USASILABEL THEN 70921000
|
|
BEGIN 70922000
|
|
IF BOOLEAN(WRITEALABEL(LBLEQTN,U,33,UINFO[U],1,BLOCKCOUNT, 70923000
|
|
RECORDCOUNT)) THEN 70924000
|
|
BEGIN 70925000
|
|
PERR: 70926000
|
|
% MESSAGE 70927000
|
|
UNIT[U]~UNT; 70928000
|
|
PUTUNT(1,1,0,0); 70929000
|
|
GO TO RETRYL; 70930000
|
|
END; 70931000
|
|
UNT.ULABELLED~1; 70932000
|
|
END ELSE 70933000
|
|
UNT.ULABELLED~0; 70934000
|
|
IF NUMLABELS!0 THEN 70935000
|
|
BEGIN 70936000
|
|
WRITEUSERSLABELS(3"377376"); 70937000
|
|
LABELAREA~*&ARRAYDESCL(0,1,0); 70938000
|
|
% TAPE MARK 70939000
|
|
LABELAREA[0]~SET(SKLTN,35-REAL(SIMULATING)); % TAPE MARK 70940000
|
|
IF REAL(BOOLEAN(RSLT~WAITIO(LABELAREA,USAH,ERAH(UNEXP,0) 70941000
|
|
).RDERROR)AND BOOLEAN(3"377376"))!0 THEN 70942000
|
|
GO TO PERR; 70943000
|
|
END; 70944000
|
|
UNIT[U]~UNT; 70945000
|
|
END TAPE ELSE 70946000
|
|
IF PRNTR(UTYPE)THEN 70947000
|
|
BEGIN %***************************************% PRINTER 70948000
|
|
% ONLY SET UP FOR BCL PRINTER 70949000
|
|
IF LEBC.EXTFORML=SINGLE THEN LEBC.EXTFORML~INTERNALMODE; 70950000
|
|
SKLTN~0&OUTPUTL(0,1,REAL(INTERNALMODE!BCL)); 70951000
|
|
UNITYP~UTYPE; 70952000
|
|
UNITNUMBER~U; 70953000
|
|
IF NOT UNLABELLED THEN 70954000
|
|
BEGIN 70955000
|
|
LABELAREA[0]~0&IOCWL(@200,0&IOCWPRINTERL(1)); 70956000
|
|
IF BOOLEAN(WAITIO(LABELAREA,USAH,ERAH(UNEXP,0)))THEN 70957000
|
|
BEGIN 70958000
|
|
PRINTERRL: 70959000
|
|
% MESSAGE 70960000
|
|
UNIT[U]~UNT; 70961000
|
|
PUTUNT(1,1,0,0); 70962000
|
|
GO TO RETRYL; 70963000
|
|
END; 70964000
|
|
LBLDSC[0]~SKLTN&IOCWPRINTERL(0,2); 70965000
|
|
IF BOOLEAN(WRITEALABEL(LBLEQTN,1,33,0,1,BLOCKCOUNT, 70966000
|
|
RECORDCOUNT)) THEN 70967000
|
|
GO TO PRINTERRL; 70968000
|
|
IF BOOLEAN(WAITIO(LBLDSC,USAH,ERAH(UNEXP,0)))THEN 70969000
|
|
GO TO PRINTERRL; 70970000
|
|
END; 70971000
|
|
CARRIAGECONTROL~1; 70972000
|
|
UNIT[U]~UNT; 70973000
|
|
END PRINTER ELSE 70974000
|
|
IF UTYPE=PAPERTAPEPNCH THEN 70975000
|
|
BEGIN %***************************************% PAPER TAPE PUNCH70976000
|
|
IF LEBC.EXTFORML=SINGLE THEN LEBC.EXTFORML~INTERNALMODE; 70977000
|
|
SKLTN~0&PPRTIOCWL(0,REAL(LEBC.EXTFORML=BCL), 70978000
|
|
REAL(INTERNALMODE!BCL), 70979000
|
|
IF LEBC.EXTFORML=BCL THEN 1 ELSE 70980000
|
|
IF LEBC.EXTFORML=5 THEN 0 ELSE 2); 70981000
|
|
UNITYP~UTYPE; 70982000
|
|
UNITNUMBER~U; 70983000
|
|
UNIT[U]~UNT; 70984000
|
|
% PUNCH LEADER 70985000
|
|
% 15 FEET OF LEADER (MINIMUM 4 FEET - PER BURROUGHS SPECS)70986000
|
|
% 10 CHARACTERS PER INCH 70987000
|
|
LABELAREA~*&ARRAYDESCL(0,2,0); 70988000
|
|
LABELAREA[0]~SET(SKLTN,43); 70989000
|
|
LABELAREA~*&ARRAYDESCL(2,1800 DIV 70990000
|
|
(IF LEBC.EXTFORML!BCL THEN 6 ELSE 8),*); 70991000
|
|
IF BOOLEAN(WAITIO(LABELAREA,USAH,ERAH(UNEXP,0)))THEN 70992000
|
|
BEGIN 70993000
|
|
% MESSAGE 70994000
|
|
PUTUNT(1,1,0,0); 70995000
|
|
GO TO RETRYL; 70996000
|
|
END; 70997000
|
|
LABELAREA~*&ARRAYDESCL(0,2,*); 70998000
|
|
FORGETSPACE(LABELAREA.ADDRESSF); 70999000
|
|
END ELSE 71000000
|
|
TRACE(21); 71001000
|
|
END ELSE 71002000
|
|
TRACE(21); 71003000
|
|
END; 71004000
|
|
BUFFERSL: 71005000
|
|
IF NUMBEROFBUFFERS=0 THEN 71006000
|
|
BEGIN % SET UP IOAREAS 71007000
|
|
% ALTERNATE AREA 71008000
|
|
IF BLOCKSZ=0 THEN BLOCKSZ~(MAXRECSZ+ 71009000
|
|
CASE INTERNALMODE OF (0,0,11,7,5,5))DIV 71010000
|
|
WORDSTO; 71011000
|
|
% CONVERT CHARS TO WORDS 71012000
|
|
FILEVENT~EVENTNUMBER; 71013000
|
|
FRSLT~REAL((U~BUFFREQ)|(RSLT~IOTANKSZ+BLOCKSZ+ 71014000
|
|
(IF RECORDTYPE!0 AND OPENINPUT THEN MAXRECSZ-MINRECSZ 71015000
|
|
ELSE 0)){MAGICNUMBER); 71016000
|
|
IOADESC~SETUPTANK(U,2,RSLT, 71017000
|
|
0&BTL(FRSLT,REAL((UNITYP=DISKFILE OR PRNTR(UNITYP)) AND 71018000
|
|
NUMBEROFBUFFERS!1)), 71019000
|
|
IOINFO&IOINFOL(*),IOEVENT[FILEVENT],UNITNUMBER); 71020000
|
|
NUMBEROFBUFFERS~RSLT~U; 71021000
|
|
BFFRD~REAL(U>1); 71022000
|
|
END; 71023000
|
|
IF CRRGCNTRL AND BUFFERED AND PRNTR(UNITYP) THEN 71024000
|
|
BEGIN 71025000
|
|
IOAREA~IOADESC; 71026000
|
|
IOAREA~*&ARRAYDESCL(,*,IOAREA[IOAL].BL); 71027000
|
|
BFRACTN~1 71028000
|
|
END; 71029000
|
|
IF OPENINPUT THEN 71030000
|
|
BEGIN 71031000
|
|
IOAREA~IOADESC; 71032000
|
|
IOCB~REFERENCE(IOAREA); 71033000
|
|
THRU NUMBEROFBUFFERS DO 71034000
|
|
BEGIN 71035000
|
|
IOREQUEST(IOCB); 71036000
|
|
IOCB~REFERENCE(IOAREA~*&ARRAYDESCL(,*,IOAREA[IOAL].FL)); 71037000
|
|
END; 71038000
|
|
IF NOT ARRAYROW THEN WAITON(IOCB); 71039000
|
|
BFFRXHSTD~1; 71039100
|
|
IF NOT ARRAYROW THEN 71039200
|
|
BEGIN 71039300
|
|
LBLDSCW~LBLSW; 71040000
|
|
LBLDSCW.SIRWDELTAF~LBLSW.SIRWDELTAF-1; 71041000
|
|
TEMPW~LBLSW; 71042000
|
|
LBLSW~LBLDSCW; 71043000
|
|
FIB~*&STRINGDESCRIPTOR(,1,,,,,EBCDIC,MAXRECSZ, 71044000
|
|
IOAREA.ADDRESSF+IOTANKSZ); 71045000
|
|
LBLSW~TEMPW; 71046000
|
|
END; 71046100
|
|
END; 71047000
|
|
% BREAK OUT 71048000
|
|
XIT: 71049000
|
|
IOCBW~0; 71049100
|
|
DIVORCEMOM(IOAREA); 71050000
|
|
DIVORCEMOM(LBLDSC); 71051000
|
|
END OPEN; 71052000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71053000
|
|
INTEGER PROCEDURE CALCRECSZ(BUFDESC,FIB);ARRAY BUFDESC,FIB[*]; 71054000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71055000
|
|
% USED WITH RECORDTYPES D,V, AND I %71056000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71057000
|
|
ARRAY DUMMYA[*]; 71058000
|
|
POINTER BUFDESCP=BUFDESC; 71059000
|
|
WORD ARRAY FIBW=FIB[*]; 71060000
|
|
IF WORDORIENTED THEN 71061000
|
|
BEGIN 71062000
|
|
IF REVERSED THEN 71063000
|
|
BEGIN 71064000
|
|
DUMMYA~*&ARRAYDESCL( 71065000
|
|
,MAXRECSZ 71066000
|
|
,REAL(WORD(AREADESC@REFERENCE(IOADESC))).ADDRESSF+1+ 71067000
|
|
BLOCKSZ-MISC@REFERENCE(IOADESC).WORDCOUNTF 71068000
|
|
); 71069000
|
|
WHILE DUMMYA.ADDRESSF<BUFDESC.ADDRESSF DO 71070000
|
|
DUMMYA.ADDRESSF~DUMMYA.ADDRESSF+ 71071000
|
|
(CALCRECSZ~CALCRECSZ(DUMMYA,FIB)); 71072000
|
|
END ELSE 71073000
|
|
CALCRECSZ~ 71074000
|
|
IF FORMATD THEN INTEGER(POINTER(BUFDESC,*),4) 71075000
|
|
ELSE 71076000
|
|
IF FORMATV THEN REAL(IF INTERNALMODE=BCL THEN 71077000
|
|
POINTER(BUFDESC,6) ELSE POINTER(BUFDESC,8),2) ELSE 71078000
|
|
IF FORMATI THEN 71079000
|
|
IF RECORDMODE<DOUBL THEN BUFDESC[RECORDOFF] ELSE 71080000
|
|
(INTEGER(POINTER(BUFDESC,*)+RECORDOFF, 71081000
|
|
RECORDSZ)+WORDSTORND)DIV WORDSTO 71082000
|
|
ELSE 0; 71083000
|
|
END ELSE 71084000
|
|
BEGIN % CHARACTER ORIENTED 71085000
|
|
% SIZE MUST BE IN INTMODES 71086000
|
|
% NO REVERSE CHARACTER ORIENTED RECORDS ON FIRST RELEASE 71087000
|
|
CALCRECSZ~ 71088000
|
|
IF FORMATD THEN INTEGER(BUFDESCP,4) ELSE 71089000
|
|
IF FORMATV THEN REAL(BUFDESCP,2) ELSE 71090000
|
|
IF FORMATI THEN 71091000
|
|
IF RECORDMODE<DOUBL THEN 71092000
|
|
REAL(BUFDESCP+WORDSTO|RECORDOFF,WORDSTO) ELSE 71093000
|
|
INTEGER(BUFDESCP+WORDSTO|RECORDOFF,RECORDSZ) 71094000
|
|
ELSE 0; 71095000
|
|
END; 71096000
|
|
DIVORCEMOM(DUMMYA); 71097000
|
|
END CALCRECSZ; 71098000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71099000
|
|
PROCEDURE SETUPRECPTR(LENGTH,ADDRESS,RECPTR,FIB); 71100000
|
|
VALUE LENGTH,ADDRESS; 71101000
|
|
REAL LENGTH,ADDRESS; 71102000
|
|
ARRAY RECPTR[*]; 71103000
|
|
ARRAY FIB[*]; 71104000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71105000
|
|
% SEVERAL IMPORTANT FUNCTIONS: %71106000
|
|
% 1 - FIXES BUFDESC %71107000
|
|
% 2 - RETURNS POINTER TO BUFFER %71108000
|
|
% 3 - MAINTAINS WORDSLEFT %71109000
|
|
% 4 - MAINTAINS BUFFEREXHAUSTED %71110000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71111000
|
|
ARRAY DUMMYA[*]; 71112000
|
|
POINTER BUFDESCP=ADDRESS; 71113000
|
|
POINTER RCPTR=RECPTR; 71114000
|
|
REAL FIB0; 71115000
|
|
WORD ARRAY FIBW=FIB[*]; 71116000
|
|
FIB0~FIBSIZE; 71117000
|
|
IF OPENINPUT THEN 71118000
|
|
BEGIN 71119000
|
|
IF WORDORIENTED THEN 71120000
|
|
BUFDESC~ 71121000
|
|
DUMMYA&ARRAYDESCL( 71122000
|
|
,LENGTH 71123000
|
|
,IF REVERSED THEN ADDRESS-LENGTH ELSE 71124000
|
|
ADDRESS+REAL(FLINKED) 71125000
|
|
) 71126000
|
|
ELSE 71127000
|
|
BUFDESCP~ 71128000
|
|
BUFDESCP+(IF REVERSED THEN -LENGTH ELSE REAL(FLINKED)71129000
|
|
|WORDSTO) 71130000
|
|
; 71131000
|
|
IF BLOCKEDFUNNY THEN 71132000
|
|
IF WORDORIENTED THEN 71133000
|
|
REPLACE POINTER(ALTDESC,*)BY BUFDESCP 71134000
|
|
FOR LENGTH WORDS 71135000
|
|
ELSE 71136000
|
|
REPLACE POINTER(ALTDESC,*)BY BUFDESCP 71137000
|
|
FOR LENGTH; 71138000
|
|
IF WORDORIENTED THEN 71139000
|
|
IF POINTEREQD THEN 71140000
|
|
RCPTR~ 71141000
|
|
IF BLOCKEDFUNNY THEN 71142000
|
|
POINTER(ALTDESC,*) 71143000
|
|
ELSE POINTER(BUFDESC,*) 71144000
|
|
ELSE 71145000
|
|
RECPTR~*&ARRAYDESCL( 71146000
|
|
3 71147000
|
|
,LENGTH|WORDSTO 71148000
|
|
,IF BLOCKEDFUNNY THEN ALTDESC.ADDRESSF 71149000
|
|
ELSE ADDRESS 71150000
|
|
) 71151000
|
|
ELSE 71152000
|
|
IF POINTEREQD THEN 71153000
|
|
RCPTR~BUFDESCP 71154000
|
|
ELSE 71155000
|
|
RECPTR~*&ARRAYDESCL( 71156000
|
|
3 71157000
|
|
,LENGTH|WORDSTO 71158000
|
|
,ADDRESS 71159000
|
|
); 71160000
|
|
BFFRXHSTD~REAL(UNITSLEFT~*-LENGTH{REAL(FLINKED)); 71161000
|
|
END ELSE 71162000
|
|
BEGIN 71163000
|
|
IF BLOCKEDFUNNY THEN 71164000
|
|
IF WORDORIENTED THEN 71165000
|
|
REPLACE BUFDESCP BY POINTER(ALTDESC,*) 71166000
|
|
FOR LENGTH WORDS 71167000
|
|
ELSE 71168000
|
|
REPLACE BUFDESCP BY POINTER(ALTDESC,*) 71169000
|
|
FOR LENGTH; 71170000
|
|
IF WORDORIENTED THEN 71171000
|
|
BUFDESC~ 71172000
|
|
DUMMYA&ARRAYDESCL( 71173000
|
|
,LENGTH 71174000
|
|
,ADDRESS 71175000
|
|
) 71176000
|
|
ELSE 71177000
|
|
BUFDESCP~ 71178000
|
|
BUFDESCP+LENGTH 71179000
|
|
; 71180000
|
|
IF FIXEDL THEN BFFRXHSTD~REAL(UNITSLEFT~*-LENGTH{0); 71181000
|
|
IF WORDORIENTED THEN 71182000
|
|
IF POINTEREQD THEN 71183000
|
|
RCPTR~ 71184000
|
|
IF BLOCKEDFUNNY THEN 71185000
|
|
POINTER(ALTDESC,*) 71186000
|
|
ELSE POINTER(BUFDESC,*) 71187000
|
|
ELSE 71188000
|
|
RECPTR~*&ARRAYDESCL( 71189000
|
|
3 71190000
|
|
,LENGTH|WORDSTO 71191000
|
|
,ADDRESS 71192000
|
|
) 71193000
|
|
ELSE 71194000
|
|
IF POINTEREQD THEN 71195000
|
|
RCPTR~BUFDESCP 71196000
|
|
ELSE 71197000
|
|
RECPTR~*&ARRAYDESCL( 71198000
|
|
3 71199000
|
|
,LENGTH|WORDSTO 71200000
|
|
,ADDRESS 71201000
|
|
); 71202000
|
|
END; 71203000
|
|
DIVORCEMOM(DUMMYA); 71204000
|
|
END SETUPRECPTR; 71205000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71206000
|
|
PROCEDURE RELEASE(FIB,UNITFEATURE,RECPTR,TYPE); 71207000
|
|
VALUE TYPE; 71208000
|
|
REAL UNITFEATURE,TYPE; 71209000
|
|
ARRAY FIB[*]; 71210000
|
|
WORD RECPTR; 71211000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71212000
|
|
% RELEASE HANDLES PHYSICAL I/O. IT CALLS IOREQUEST, %71213000
|
|
% ROTATES BUFFERS ... %71214000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71215000
|
|
ARRAY DUMMYA,IOAREA[*]; 71216000
|
|
BOOLEAN LARGESPACE; 71217000
|
|
DEFINE 71218000
|
|
MAYBEWAIT = IF NOT BOOLEAN(TYPE)THEN WAITON(IOCB)#, 71219000
|
|
CARCON=UNITFEATURE#; 71220000
|
|
FIELD STACKERF=32:1; 71221000
|
|
LABEL CMN,CMNR,EOFL,HR,OUTL,PARL,THR,WHR,XIT; 71222000
|
|
POINTER PALT, DUMMYAP=DUMMYA; 71223000
|
|
REAL 71224000
|
|
NUMLINES, 71225000
|
|
TEMPBLOCKSZ, 71226000
|
|
T; 71227000
|
|
REFERENCE IOCB; 71228000
|
|
WORD IOCBW=IOCB; 71229000
|
|
WORD TW=T; 71230000
|
|
WORD ARRAY FIBW=FIB[*],IOAREAWA=IOAREA[*]; 71231000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71232000
|
|
% NOTE: CARD PUNCH I IS NOT INTENDED FOR USE WITH THE %71233000
|
|
% B6500 AND WILL GET THE SAME ERROR RECOVERY ACTION %71234000
|
|
% AS CARD PUNCH %71235000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71236000
|
|
IOCB~REFERENCE(IOAREA~IOADESC); 71237000
|
|
IF DISC THEN 71238000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DISK FILE 71239000
|
|
END ELSE 71240000
|
|
IF PNCH(UNITYP)THEN IOAREA[IOCWP].STACKERF~UNITFEATURE ELSE 71241000
|
|
IF PRNTR(UNITYP)THEN 71242000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PRINTER 71243000
|
|
IF BUFFERED THEN IOCB~REFERENCE(LASTBUFFER); 71244000
|
|
IF BEFORE AND BUFFERED THEN 71245000
|
|
BEGIN 71246000
|
|
IF NOT BEFOREACTION THEN 71247000
|
|
BEGIN % LAST WAS AFTER 71248000
|
|
IOAREA[IOCWP]~0&IOCWL(SKLTNSTNDRD,0); 71249000
|
|
IOREQUEST(IOCB); 71250000
|
|
END; 71251000
|
|
IOCB~REFERENCE(IOAREA~IOADESC); 71252000
|
|
BFRACTN~0; 71253000
|
|
END; 71254000
|
|
IF CHANNELSKIP THEN 71255000
|
|
BEGIN 71256000
|
|
HR: 71257000
|
|
IOAREA[IOCWP]~0&IOCWL( 71258000
|
|
IF BUFFERED THEN 71259000
|
|
IF BEFOREACTION THEN PRINTSPACE ELSE SKLTNSTNDRD 71260000
|
|
ELSE IF BEFORE THEN SKLTNSTNDRD ELSE PRINTSPACE, 71261000
|
|
0&IOCWPRINTERL( 71262000
|
|
IF CHANNELSKIP AND BEFORE THEN CHANNELNO ELSE 0, 71263000
|
|
IF NOT CHANNELSKIP THEN 71264000
|
|
IF LARGESPACE THEN NOLINES MOD 2 ELSE NOLINES 71265000
|
|
ELSE 0)); 71266000
|
|
IF BEFORE AND BUFFERED THEN BFRACTN~1; 71267000
|
|
DUMMYA~IOAREAWA[2]; 71268000
|
|
IOAREAWA[2]~REFERENCE(DUMMYA& 71269000
|
|
ARRAYDESCL(,DUMMYA.LENGTHF-UNITSLEFT,*)); 71270000
|
|
% WORRY ABOUT WRAP-AROUND 71271000
|
|
IOREQUEST(IOCB); 71272000
|
|
IF BEFORE AND NOT CHANNELSKIP THEN GO TO WHR; 71273000
|
|
THR: 71274000
|
|
IF AFTER THEN 71275000
|
|
IF BUFFERED THEN 71276000
|
|
BEGIN 71277000
|
|
NEXTBUFFER; 71278000
|
|
BFRACTN~0; 71279000
|
|
ROTATEBUFFERS; 71280000
|
|
END ELSE 71281000
|
|
BEGIN 71282000
|
|
WAITON(IOCB); 71283000
|
|
IOAREA[IOCWP]~0&IOCWL(SKLTNSTNDRD,0); 71284000
|
|
IOREQUEST(IOCB); 71285000
|
|
END ELSE 71286000
|
|
ROTATEBUFFERS; 71287000
|
|
GO TO OUTL; 71288000
|
|
END ELSE 71289000
|
|
BEGIN % SOME TYPE SPACE 71290000
|
|
IF LARGESPACE~NOLINES>2 THEN NUMLINES~NOLINES DIV 2; 71291000
|
|
IF AFTER THEN 71292000
|
|
BEGIN 71293000
|
|
WHR: 71294000
|
|
IF LARGESPACE THEN 71295000
|
|
WHILE NUMLINES~NUMLINES-1}0 DO 71296000
|
|
BEGIN 71297000
|
|
WAITON(IOCB); 71298000
|
|
IOAREA[IOCWP]~0&IOCWL(PRINTSPACE,0&IOCWPRINTERL(0,2)); 71299000
|
|
IOREQUEST(IOCB); 71300000
|
|
ROTATEBUFFERS; 71301000
|
|
END; 71302000
|
|
IF BEFORE THEN GO TO THR ELSE WAITON(IOCB); 71303000
|
|
END; 71304000
|
|
GO TO HR 71305000
|
|
END 71306000
|
|
END ELSE 71307000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TAPE-LIKE 71308000
|
|
IF OPENINPUT THEN 71309000
|
|
BEGIN 71310000
|
|
IOREQUEST(IOCB); 71311000
|
|
ROTATEBUFFERS; 71312000
|
|
IF BOOLEAN(TYPE)THEN GO TO XIT ELSE WAITON(IOCB); 71313000
|
|
CMN: 71314000
|
|
IF NOMORE THEN GO TO EOFL; 71315000
|
|
UNITSLEFT~IF UNITYP=CARDREADER THEN BLOCKSZ ELSE 71316000
|
|
MISC@(IOCB).WORDCOUNTF|WORDSTO+MISC@(IOCB).RDCHRCNT; 71317000
|
|
CMNR: 71318000
|
|
IF NOT FORMATU THEN 71319000
|
|
BEGIN 71320000
|
|
IF WORDORIENTED THEN 71321000
|
|
DUMMYA~*&ARRAYDESCL( 71322000
|
|
,MAXRECSZ 71323000
|
|
,REAL(WORD(AREADESC@IOCB)).ADDRESSF+ 71324000
|
|
(IF REVERSED THEN BLOCKSZ+REAL(NOT FLINKED) 71325000
|
|
ELSE 1) 71326000
|
|
) 71327000
|
|
ELSE 71328000
|
|
DUMMYA~*& 71329000
|
|
INDEXEDSTRINGDESCRIPTOR(,1,1,,,,INTERNALMODE,,1, 71330000
|
|
REAL(WORD(AREADESC@IOCB)).ADDRESSF); 71331000
|
|
% PROTECTED 71332000
|
|
IF WORDORIENTED THEN T~DUMMYA.ADDRESSF ELSE TW~DUMMYAP; 71333000
|
|
SETUPRECPTR ( 71334000
|
|
RCRDSZ(DUMMYA,DUMMYAP) 71335000
|
|
, T 71336000
|
|
, RECPTR 71337000
|
|
, FIB 71338000
|
|
); 71339000
|
|
% FIXUP LATER FOR REVERSE 71340000
|
|
END; 71341000
|
|
END 71342000
|
|
ELSE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% OUTPUT 71343000
|
|
% ASSUMES SIZE HAS BEEN CHECKED ... 71344000
|
|
BEGIN 71345000
|
|
DUMMYA~IOAREAWA[2]; 71346000
|
|
STOREITEM(AREADESC@IOCB, 71347000
|
|
REFERENCE(DUMMYA&ARRAYDESCL(, 71348000
|
|
DUMMYA.LENGTHF-UNITSLEFT DIV WORDSTO,*))); 71349000
|
|
% WORRY ABOUT WRAP-AROUND ... 71350000
|
|
%%%%% FIX AREA DESCRIPTOR 71351000
|
|
IOREQUEST(IOCB); 71352000
|
|
ROTATEBUFFERS; 71353000
|
|
OUTL: 71354000
|
|
%%%%% FIX AREA DESCRIPTOR 71355000
|
|
IOAREAWA[2]~DUMMYA~*& 71356000
|
|
ARRAYDESCL(,BLOCKSZ,IOAREA.ADDRESSF+IOTANKSZ-1); 71357000
|
|
IF BOOLEAN(TYPE)THEN GO TO XIT ELSE WAITON(IOCB); 71358000
|
|
IF PARITYERROR THEN GO TO PARL; 71359000
|
|
IF NOMORE THEN GO TO EOFL; 71360000
|
|
% BLOCKSZ IN WORDS 71361000
|
|
UNITSLEFT~BLOCKSZ|WORDSTO; 71362000
|
|
IF CHARECORD THEN DUMMYA~*& 71363000
|
|
INDEXEDSTRINGDESCRIPTOR(,1,1,,,,INTERNALMODE,,1); 71364000
|
|
IF WORDORIENTED THEN T~DUMMYA.ADDRESSF+1 ELSE TW~DUMMYAP; 71365000
|
|
SETUPRECPTR ( 71366000
|
|
MAXRECSZ 71367000
|
|
, T 71368000
|
|
, RECPTR 71369000
|
|
, FIB 71370000
|
|
); 71371000
|
|
END; 71372000
|
|
END; 71373000
|
|
GO TO XIT; 71374000
|
|
PARL: 71375000
|
|
% CHECK FOR DESCRIPTOR ERROR 71376000
|
|
PARITYERR~1; 71377000
|
|
RECORDSTATUS.EXCEPTION~1; 71378000
|
|
GO TO XIT; 71379000
|
|
EOFL: 71380000
|
|
ENDOV~1; 71381000
|
|
RECORDSTATUS.EXCEPTION~1; 71382000
|
|
GO TO XIT; 71383000
|
|
XIT: 71384000
|
|
IOCBW~0; 71385000
|
|
DIVORCEMOM(DUMMYA); 71386000
|
|
DIVORCEMOM(IOAREA); 71387000
|
|
END RELEASE; 71388000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71389000
|
|
PROCEDURE LOGICALRECORD=(0,30)(FIB,UNITFEATURE,RECSIZE,RECPTR, 71390000
|
|
EOFL,PARL,DATAL,PFOC); 71391000
|
|
VALUE PFOC; 71392000
|
|
ARRAY FIB[*]; 71393000
|
|
REAL PFOC,UNITFEATURE,RECSIZE; 71394000
|
|
WORD RECPTR,EOFL,PARL,DATAL; 71395000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71396000
|
|
% LOGICALRECORD IS THE GUTS OF THE I/O INTRINSICS. IT %71397000
|
|
% CONTROLS THE VARIOUS ACTIVITIES. %71398000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71399000
|
|
ARRAY DUMMYA,IOAREA[*]; 71400000
|
|
ARRAY ARRAYD=RECPTR[*]; 71401000
|
|
BOOLEAN BOOT,DOARETN; 71402000
|
|
LABEL HR,CMN,XIT,OWT; 71403000
|
|
LABEL ARRAYROWL,LEOF,LPAR; 71404000
|
|
LAYOUT PFCL(ORF=3:4,EQVF=5:2); 71405000
|
|
POINTER BUFDESCP,DUMMYAP=DUMMYA; 71406000
|
|
REAL 71407000
|
|
PFC, 71408000
|
|
FIB0, 71409000
|
|
EOFR=EOFL, 71410000
|
|
PARR=PARL, 71411000
|
|
T; 71412000
|
|
REFERENCE IOCB; 71413000
|
|
WORD TW=T; 71414000
|
|
WORD IOCBW=IOCB; 71415000
|
|
WORD ARRAY FIBW=FIB[*],IOAREAWA=IOAREA[*]; 71416000
|
|
PROCEDURE CHECKRECORDSIZE; 71417000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71418000
|
|
% HANDLES CERTAIN TYPES OF VARIABLE LENGTH RECORDS %71419000
|
|
% INPUT: TYPE U %71420000
|
|
% OUTPUT: TYPES D, V, I, U, L %71421000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71422000
|
|
ARRAY DUMMYA[*]; 71423000
|
|
BOOLEAN SCND; 71424000
|
|
LABEL HR; 71425000
|
|
POINTER BUFDESCP,DUMMYAP=DUMMYA; 71426000
|
|
REAL I,T,P; 71427000
|
|
WORD IW=I; 71428000
|
|
DUMMYA~BUFDESC; 71429000
|
|
BUFDESCP~POINTER(DUMMYA,*); 71430000
|
|
IF BUFFEREXHAUSTED THEN RELEASE(FIB,UNITFEATURE,RECPTR,0); 71431000
|
|
% RECHECK 71432000
|
|
DUMMYA~IF BLOCKEDFUNNY THEN ALTDESC ELSE BUFDESC; 71433000
|
|
T~IF FORMATD OR FORMATV OR FORMATI THEN CALCRECSZ(DUMMYA,FIB) 71434000
|
|
ELSE RECSIZE; 71435000
|
|
IF T>MAXRECSZ OR T<MINRECSZ AND MINRECSZ!0 OR T=0 THEN 71436000
|
|
BEGIN TRACE(18);TRACE(21) END; 71437000
|
|
IF OPENOUTPUT THEN 71438000
|
|
BEGIN 71439000
|
|
IF T>UNITSLEFT THEN 71440000
|
|
BEGIN 71441000
|
|
HR: 71442000
|
|
IF FLINKED THEN 71443000
|
|
BEGIN % MAKE LINKS 71444000
|
|
M[I~REAL(WORD(AREADESC@REFERENCE(IOADESC))).ADDRESSF+1]~ 71445000
|
|
REAL(M[I])+ADD1TOBIT32; 71446000
|
|
IF WORDORIENTED THEN 71447000
|
|
M[BUFDESC.ADDRESSF+BUFDESC.LENGTHF]~ 71448000
|
|
0&IOLINKL(M[I].NUMRECSLNK,BUFDESC.LENGTHF) 71449000
|
|
ELSE 71450000
|
|
REPLACE BUFDESCP+(P~REAL(BUFDESCP,WORDSTO).FRWRDLNK)BY 71451000
|
|
0&IOLINKL(M[I].NUMRECSLNK,P); 71452000
|
|
END; 71453000
|
|
RELEASE(FIB,UNITFEATURE,RECPTR,0); 71454000
|
|
IF NOT BLOCKEDFUNNY AND NOT SCND THEN 71455000
|
|
IF WORDORIENTED THEN 71456000
|
|
REPLACE BUFDESCP BY POINTER(DUMMYA,*) 71457000
|
|
FOR T WORDS 71458000
|
|
ELSE 71459000
|
|
REPLACE BUFDESCP:BUFDESCP BY DUMMYAP FOR T; 71460000
|
|
END; 71461000
|
|
IF SCND~(WORDSLEFT~*-T<MINRECSZ AND MINRECSZ!0 OR WORDSLEFT{0) 71462000
|
|
THEN GO TO HR; 71463000
|
|
IF FLINKED THEN 71464000
|
|
IF WORDORIENTED THEN 71465000
|
|
BEGIN % FIX LINKS 71466000
|
|
M[BUFDESC.ADDRESSF-1]~T&IOLINKL(0,*); 71467000
|
|
M[BUFDESC.ADDRESSF+T].BCKWRDLNK~T; 71468000
|
|
M[I~REAL(WORD(AREADESC@REFERENCE(IOADESC))).ADDRESSF+1]~ 71469000
|
|
REAL(M[I])+ADD1TOBIT32; 71470000
|
|
END ELSE 71471000
|
|
BEGIN 71472000
|
|
REPLACE BUFDESCP-WORDSTO BY T&IOLINKL(0,*); 71473000
|
|
REPLACE BUFDESCP+T BY 0&IOLINKL(0,T); 71474000
|
|
M[I~REAL(WORD(AREADESC@REFERENCE(IOADESC))).ADDRESSF+1]~ 71475000
|
|
REAL(M[I])+ADD1TOBIT32; 71476000
|
|
END; 71477000
|
|
END 71478000
|
|
ELSE 71479000
|
|
IF T>WORDSLEFT THEN BEGIN TRACE(18);TRACE(21) END 71480000
|
|
ELSE 71481000
|
|
BFFRXHSTD~REAL(WORDSLEFT~*-T{0); 71482000
|
|
IF WORDORIENTED THEN 71483000
|
|
I~BUFDESC.ADDRESSF+(IF OPENINPUT THEN IF REVERSED THEN -T 71484000
|
|
ELSE BUFDESC.LENGTHF ELSE T) 71485000
|
|
ELSE 71486000
|
|
IW~BUFDESCP+(IF OPENINPUT THEN IF REVERSED THEN -T 71487000
|
|
ELSE LASTLENGTH ELSE T); 71488000
|
|
SETUPRECPTR ( 71489000
|
|
IF OPENOUTPUT THEN MAXRECSZ ELSE T 71490000
|
|
, I 71491000
|
|
, RECPTR 71492000
|
|
, FIB 71493000
|
|
); 71494000
|
|
LASTLENGTH~T; 71495000
|
|
DIVORCEMOM(DUMMYA); 71496000
|
|
END CHECKRECORDSIZE; 71497000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71498000
|
|
IOAREA~IOADESC; 71499000
|
|
FIB0~FIBSIZE; 71500000
|
|
FIBUZZ; 71501000
|
|
PFC~0&PFCL(REAL(BOOLEAN(RECORDSTATUS)OR BOOLEAN(PFOC)).ORF, 71502000
|
|
REAL(BOOLEAN(RECORDSTATUS)EQV NOT BOOLEAN(PFOC)).EQVF); 71503000
|
|
WHILE TRUE DO 71504000
|
|
CASE FIRSTONE(PFC) OF 71505000
|
|
BEGIN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71506000
|
|
GO TO HR; % OBTAIN 071507000
|
|
BEGIN %**********************************% I/O REQUIRED 171508000
|
|
IF FILEMTBUF THEN 71509000
|
|
IF PFOCMTBUF THEN 71510000
|
|
IF ARRAYROW THEN 71511000
|
|
IF FORMATTER THEN 71512000
|
|
BEGIN % PRE-RELEASE 71513000
|
|
RELEASE(FIB,UNITFEATURE,RECPTR,1); 71514000
|
|
BLOCKCOUNT~*+1; 71515000
|
|
GO TO XIT 71516000
|
|
END ELSE 71517000
|
|
BEGIN 71518000
|
|
IOCB~REFERENCE(IOAREA); 71519000
|
|
WAITON(IOCB); 71520000
|
|
IF NOMORE THEN GO TO LEOF; 71521000
|
|
IF PARITYERROR THEN GO TO LPAR; 71522000
|
|
UNITSLEFT~ 71523000
|
|
IF OPENINPUT THEN 71524000
|
|
IF UNITYP=CARDREADER THEN BLOCKSZ 71525000
|
|
ELSE MISC@(IOCB).WORDCOUNTF 71526000
|
|
ELSE BLOCKSZ; 71527000
|
|
BUFDESC~DUMMYA&ARRAYDESCL( 71528000
|
|
,MAXRECSZ 71529000
|
|
,REAL(WORD(AREADESC@IOCB)).ADDRESSF+ 71530000
|
|
(IF REVERSED THEN BLOCKSZ + 71531000
|
|
REAL(NOT FLINKED) ELSE 1)); 71532000
|
|
IF CHARECORD THEN 71533000
|
|
BEGIN 71534000
|
|
DUMMYA~BUFDESC; 71535000
|
|
BUFDESC~DUMMYA~*&INDEXEDSTRINGDESCRIPTOR( 71536000
|
|
,1,1,1,,,INTERNALMODE,0); 71537000
|
|
END; 71538000
|
|
ARRAYROWL: 71539000
|
|
T~MIN(RECSIZE,ARRAYD.LENGTHF); 71540000
|
|
IF CHARECORD THEN T~T|WORDSTO; 71541000
|
|
T~MIN(T,WORDSLEFT); 71542000
|
|
T~MIN(T,MAXRECSZ); 71543000
|
|
DUMMYA~BUFDESC; 71544000
|
|
BUFDESCP~POINTER(DUMMYA,*); 71545000
|
|
IF OPENINPUT THEN 71546000
|
|
IF WORDORIENTED THEN 71547000
|
|
REPLACE POINTER(ARRAYD,*) BY 71548000
|
|
BUFDESCP FOR T WORDS 71549000
|
|
ELSE 71550000
|
|
REPLACE POINTER(ARRAYD,*) BY 71551000
|
|
BUFDESCP FOR T 71552000
|
|
ELSE 71553000
|
|
IF WORDORIENTED THEN 71554000
|
|
REPLACE BUFDESCP BY 71555000
|
|
POINTER(ARRAYD,*) FOR T WORDS 71556000
|
|
ELSE 71557000
|
|
REPLACE BUFDESCP BY 71558000
|
|
POINTER(ARRAYD,*) FOR T; 71559000
|
|
RECORDCOUNT~*+1; 71560000
|
|
BFFRXHSTD~REAL(WORDSLEFT~*-MAXRECSZ{0); 71561000
|
|
IF BUFFEREXHAUSTED THEN 71562000
|
|
BEGIN 71563000
|
|
RELEASE(FIB,UNITFEATURE,RECPTR,1); 71564000
|
|
BLOCKCOUNT~*+1; 71565000
|
|
END ELSE 71566000
|
|
BEGIN 71567000
|
|
IF WORDORIENTED THEN 71568000
|
|
DUMMYA~*&ARRAYDESCL( 71569000
|
|
,RCRDSZ(BUFDESC,DUMMYAP) 71570000
|
|
,BUFDESC.ADDRESSF+(IF REVERSED THEN 71571000
|
|
-REAL(FLINKED)ELSE BUFDESC.LENGTHF) 71572000
|
|
) 71573000
|
|
ELSE 71574000
|
|
BEGIN 71575000
|
|
DUMMYA~BUFDESC; 71576000
|
|
DUMMYAP~DUMMYAP+RCRDSZ(DUMMYA,DUMMYAP) 71577000
|
|
END; 71578000
|
|
IF WORDORIENTED THEN T~DUMMYA.ADDRESSF 71579000
|
|
ELSE TW~DUMMYAP; 71580000
|
|
SETUPRECPTR( 71581000
|
|
RCRDSZ(DUMMYA,DUMMYAP) 71582000
|
|
,T 71583000
|
|
,DUMMYA 71584000
|
|
% KLUDGE 71585000
|
|
,FIB 71586000
|
|
); 71587000
|
|
END; 71588000
|
|
GO TO XIT 71589000
|
|
END 71590000
|
|
ELSE 71591000
|
|
BEGIN 71592000
|
|
IF OPENOUTPUT AND BLOCKED THEN 71593000
|
|
BEGIN 71594000
|
|
CMN: 71595000
|
|
IF RECORDTYPE=0 THEN WORDSLEFT~*+MAXRECSZ;71596000
|
|
RELEASE(FIB,UNITFEATURE,RECPTR,0); 71597000
|
|
GO TO XIT 71598000
|
|
END ELSE 71599000
|
|
TRACE(21); 71600000
|
|
END 71601000
|
|
ELSE 71602000
|
|
BEGIN 71603000
|
|
RELEASE(FIB,UNITFEATURE,RECPTR,0); 71604000
|
|
GO TO XIT 71605000
|
|
END 71606000
|
|
ELSE 71607000
|
|
IF FORMATTER THEN GO TO XIT 71608000
|
|
ELSE 71609000
|
|
IF ARRAYROW THEN GO TO ARRAYROWL 71610000
|
|
ELSE 71611000
|
|
IF OPENOUTPUT AND BLOCKED THEN GO TO CMN ELSE TRACE(21) 71612000
|
|
END; 71613000
|
|
BEGIN %**********************************% UNIT FEATURE 271614000
|
|
CASE UNITYP OF 71615000
|
|
BEGIN 71616000
|
|
IOTERMINATE; % 0 BACKUP (Q) 71617000
|
|
IOTERMINATE; % 1 DISK 71618000
|
|
IOTERMINATE; % 2 DISPLAY 71619000
|
|
IOTERMINATE; % 3 REMOTE 71620000
|
|
; % 4 PTR 71621000
|
|
; % 5 PTP 71622000
|
|
BEGIN % 6 PRINTER 71623000
|
|
PRINTERL: 71624000
|
|
IF BOOLEAN(PFOC.UFEAT) THEN 71625000
|
|
BEGIN 71626000
|
|
% CHECK DISK CASE 71627000
|
|
% CHECK [NO] CASE 71628000
|
|
END ELSE 71629000
|
|
UNITFEATURE~1; 71630000
|
|
END; 71631000
|
|
GO TO PRINTERL; % 7 PRINTER 71632000
|
|
; % 8 71633000
|
|
; % 9 READER 71634000
|
|
; % 10 71635000
|
|
BEGIN % 11 PUNCH 71636000
|
|
% CHECK DISK CASE 71637000
|
|
END; 71638000
|
|
; % 12 71639000
|
|
; % 13 71640000
|
|
; % 14 71641000
|
|
; % 15 71642000
|
|
;;;;;;;;;;;;;;;;; % 16-31 71643000
|
|
END; 71644000
|
|
PFC.UFEAT~0; 71645000
|
|
END; 71646000
|
|
BEGIN %**********************************% RECORD SZ REQD 371647000
|
|
IF PFOCRCSZ THEN % FORMATTER 71648000
|
|
IF PFOCMTBUF THEN % PRE-RELEASE 71649000
|
|
PFC.DRCDSIZE~0 71650000
|
|
ELSE 71651000
|
|
IF FILEMTBUF THEN 71652000
|
|
BEGIN % LAST WAS PRE-RELEASE 71653000
|
|
IOCB~REFERENCE(IOAREA); 71654000
|
|
WAITON(IOCB); 71655000
|
|
IF NOMORE THEN GO TO LEOF; 71656000
|
|
IF PARITYERROR THEN GO TO LPAR; 71657000
|
|
UNITSLEFT~ 71658000
|
|
IF OPENINPUT THEN 71659000
|
|
IF UNITYP=CARDREADER THEN BLOCKSZ ELSE 71660000
|
|
MISC@(IOCB).WORDCOUNTF|WORDSTO+ 71661000
|
|
MISC@(IOCB).RDCHRCNT 71662000
|
|
ELSE BLOCKSZ; 71663000
|
|
BUFDESC~DUMMYA&ARRAYDESCL( 71664000
|
|
,MAXRECSZ 71665000
|
|
,REAL(WORD(AREADESC@IOCB)).ADDRESSF+1 71666000
|
|
); 71667000
|
|
IF WORDORIENTED THEN T~BUFDESC.ADDRESSF ELSE 71668000
|
|
BEGIN 71669000
|
|
DUMMYA~BUFDESC; 71670000
|
|
TW~DUMMYA~*&INDEXEDSTRINGDESCRIPTOR(,1,1,1,,, 71671000
|
|
INTERNALMODE,,0); 71672000
|
|
END; 71673000
|
|
SETUPRECPTR( 71674000
|
|
RECSIZE~RCRDSZ(BUFDESC,DUMMYAP) 71675000
|
|
,T 71676000
|
|
,RECPTR 71677000
|
|
,FIB 71678000
|
|
); 71679000
|
|
END ELSE 71680000
|
|
BEGIN % NORMAL 71681000
|
|
IF WORDORIENTED THEN 71682000
|
|
DUMMYA~*&ARRAYDESCL( 71683000
|
|
,RCRDSZ(BUFDESC,DUMMYAP) 71684000
|
|
,BUFDESC.ADDRESSF+(IF REVERSED THEN 71685000
|
|
-REAL(FLINKED)ELSE BUFDESC.LENGTHF) 71686000
|
|
) 71687000
|
|
ELSE 71688000
|
|
BEGIN 71689000
|
|
DUMMYA~BUFDESC; 71690000
|
|
DUMMYAP~DUMMYAP+RCRDSZ(DUMMYA,DUMMYAP) 71691000
|
|
END; 71692000
|
|
IF WORDORIENTED THEN T~DUMMYA.ADDRESSF ELSE 71693000
|
|
TW~DUMMYAP; 71694000
|
|
SETUPRECPTR( 71695000
|
|
RECSIZE~RCRDSZ(DUMMYA,DUMMYAP) 71696000
|
|
,T 71697000
|
|
,RECPTR 71698000
|
|
,FIB 71699000
|
|
); 71700000
|
|
PFC.DRCDSIZE~0 71701000
|
|
END 71702000
|
|
ELSE 71703000
|
|
IF FILEDRCDSIZE THEN 71704000
|
|
BEGIN 71705000
|
|
CHECKRECORDSIZE; 71706000
|
|
PFC.DRCDSIZE~0 71707000
|
|
END ELSE 71708000
|
|
BEGIN TRACE(18);TRACE(21); END; 71709000
|
|
END; 71710000
|
|
BEGIN %**********************************% EXCEPTION 471711000
|
|
IF ENDOF THEN 71712000
|
|
BEGIN 71713000
|
|
LEOF: 71714000
|
|
IF ENDOFTAKEN THEN IOTERMINATE; 71715000
|
|
ATAKEN~1; 71716000
|
|
IF OPENINPUT THEN 71717000
|
|
IF ENDOFACTION=0 THEN 71718000
|
|
IF EOFR!0 THEN GOTOSOLVER(EOFL) ELSE 71719000
|
|
ELSE 71720000
|
|
IF DOARETN~ENDOFACTION=2 THEN 71721000
|
|
ELSE 71722000
|
|
IOTERMINATE 71723000
|
|
ELSE 71724000
|
|
% CLOSE ACTION 71725000
|
|
IOTERMINATE 71726000
|
|
END ELSE 71727000
|
|
IF BOOLEAN(PARITYERR) THEN 71728000
|
|
BEGIN 71729000
|
|
LPAR: 71730000
|
|
IF PARITYACTION=0 AND NOT ACTIONTAKEN THEN 71731000
|
|
IF PARR!0 THEN GOTOSOLVER(PARL); 71732000
|
|
IOTERMINATE; 71733000
|
|
END ELSE 71734000
|
|
IOTERMINATE; 71735000
|
|
PFC.EXCEPTION~0; 71736000
|
|
END; 71737000
|
|
BEGIN %**********************************% OPEN OUTPUT 571738000
|
|
IF IMPLICITOPEN AND 71739000
|
|
(NOTOPEN OR OPENINPUT AND NOT REVERSED) THEN 71740000
|
|
BEGIN 71741000
|
|
% IF BOOT~OPENINPUT THEN CLOSE(FIB,HERE); 71742000
|
|
OPEN(FIB,0); 71743000
|
|
IOAREA~IOADESC; 71744000
|
|
% SEEK(FIB,IF BOOT THEN RECORDCOUNT ELSE 71745000
|
|
% IF REVERSED THEN MAXNO ELSE 0); 71746000
|
|
PFC.OPNOUT~0 71747000
|
|
END 71748000
|
|
ELSE 71749000
|
|
TRACE(21) 71750000
|
|
END; 71751000
|
|
BEGIN %**********************************% OPEN INPUT 671752000
|
|
IF IMPLICITOPEN AND NOTOPEN AND NOT BOOLEAN(PFC.OPNOUT) 71753000
|
|
THEN BEGIN 71754000
|
|
OPEN(FIB,0); 71755000
|
|
IOAREA~IOADESC; 71756000
|
|
% SEEK(FIB,IF REVERSED THEN MAXNO ELSE 0); 71757000
|
|
PFC.OPNIN~0 71758000
|
|
END 71759000
|
|
ELSE 71760000
|
|
TRACE(21) 71761000
|
|
END; 71762000
|
|
END; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71763000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71764000
|
|
% BY THE TIME REACH HERE HAVE DISPOSED OF ALL THE MESSY STUFF %71765000
|
|
% AND ARE LEFT WITH ONLY %71766000
|
|
% INPUT: TYPES F,D,V,L %71767000
|
|
% OUTPUT: TYPE F %71768000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71769000
|
|
HR: 71770000
|
|
IF WORDORIENTED THEN 71771000
|
|
DUMMYA~*&ARRAYDESCL( 71772000
|
|
,RCRDSZ(BUFDESC,DUMMYAP) 71773000
|
|
,BUFDESC.ADDRESSF+(IF REVERSED THEN -REAL(FLINKED) 71774000
|
|
ELSE BUFDESC.LENGTHF) 71775000
|
|
) 71776000
|
|
ELSE 71777000
|
|
BEGIN 71778000
|
|
DUMMYA~BUFDESC; 71779000
|
|
DUMMYAP~DUMMYAP+RCRDSZ(DUMMYA,DUMMYAP) 71780000
|
|
END; 71781000
|
|
% FORMAT U 71782000
|
|
IF WORDORIENTED THEN T~DUMMYA.ADDRESSF ELSE TW~DUMMYAP; 71783000
|
|
SETUPRECPTR ( 71784000
|
|
RCRDSZ(DUMMYA,DUMMYAP) 71785000
|
|
, T 71786000
|
|
, RECPTR 71787000
|
|
, FIB 71788000
|
|
); 71789000
|
|
XIT: 71790000
|
|
DIVORCEMOM(DUMMYA); 71791000
|
|
DIVORCEMOM(IOAREA); 71792000
|
|
IOCBW~0; 71793000
|
|
IF ENDOFACTION=2 THEN RETURN(REAL(DOARETN)); 71794000
|
|
UNLOCKFIB; 71795000
|
|
END OBTAIN; 71796000
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%71797000
|
|
SAVE 80000000
|
|
INTEGER PROCEDURE VECTORINSERT(PATH,ENTRY); 80001000
|
|
VALUE PATH 80002000
|
|
, ENTRY 80003000
|
|
; 80004000
|
|
REAL PATH 80005000
|
|
; 80006000
|
|
WORD ENTRY 80007000
|
|
; 80008000
|
|
COMMENT THE INSERT ALGORITHS OF THE READYQ AND SHEET CONSIST OF CALLS 80009000
|
|
UPON THIS PROCEDURE (AND NOTHING ELSE) OTHER PARTS OF THE 80010000
|
|
MCP-E.G. INDEPENDENTRUNNER-CALL THIS PROCEDURE TO LINK 80011000
|
|
STACKS INTO STACKVECTOR 80012000
|
|
PATH = REDY CALL FROM READYQ 80013000
|
|
=SHEETI CALL FROM SHEETQ 80014000
|
|
= GETIRS GETINDEPENDENTRUNNERSTACK 80015000
|
|
= OTHER CALL FROM ELSEWWERE 80016000
|
|
ENTRY ENTRY PARAMETER OF THE INSERT ALGORITHM 80017000
|
|
THE APPROPRIATE (SHEET OR READY) LOCK IS BUZZED AND THEN THE 80018000
|
|
VECTOR IS SEARCHED FOR AN EMPTY ELEMENT 80019000
|
|
VECTOR SIZE (EXCEPT WHERE ,IN THE CASE OF THE STACK VECTOR,80021000
|
|
THE NUMBER OF ENTRIES EXCEEDS 1024 IN WHICH CASE A RUN-TIME 80022000
|
|
ERROR IS NOTED). THIS IS DONE BY GETTING EXTRA SPACE AND MOVING80023000
|
|
THE VECTOR OVER. VECTOR SIZE MAY THUS BE INCREASED IN MODULES 80024000
|
|
OF SIZE "VECTORMODULE" CORE LOCATIONS 80025000
|
|
[NOTE : THE NOTHING TO DO LOOPS IN THE WAIT AND HOLD 80026000
|
|
PROCEDURES CHECK THAT (SIZE OF VECTOR)-(INDEX OF HIGHEST IN-USE80027000
|
|
ELEMENT) { "ALLOWABLE SLACK". IF THIS IS NOT THE CASE, SPACE 80028000
|
|
IS GOTTEN EQUAL TO "SIZE OF VECTOR" -"VECTOR MODULE" AND THE 80029000
|
|
VECTOR IS MOVED ACCROSS . THIS INFORMATION HAS NOTHING TO DO 80030000
|
|
WITH THIS PROCEDURE BUT IT SEEMS APPROPRIATE TO PUT IT IN HERE]80031000
|
|
THE ENTRY DESCRIPTOR IS MOVED INTO THE ACQUIRED VECTOR 80032000
|
|
ELEMENT, THE VECTOR IS UNLOCKED THE (READY OR SHEET) QUEUE IS 80033000
|
|
BUZZED AND THE PROCEDURE - "INSERTINQUEUE" , WHICH INSERTS THE 80034000
|
|
NEWLY ACQUIRED ELEMENT INTO THE QUEUE, IS CALLED. 80035000
|
|
; 80036000
|
|
BEGIN 80037000
|
|
REAL INDEX 80038000
|
|
, VECTORSIZE 80039000
|
|
, MYSNR 80040000
|
|
, NEXTINVECTOR 80043100
|
|
, LASTINVECTOR 80043200
|
|
; 80044000
|
|
WORD ARRAY OLDVECTORDESCRIPTOR[*] 80045000
|
|
; 80046000
|
|
BOOLEAN READYINDICATOR 80047000
|
|
, COMPLETESEARCH 80048000
|
|
; 80049000
|
|
REFERENCE NEWENTRY=ENTRY 80050000
|
|
; 80051000
|
|
FIELD FULLWORD = 47:48 80052000
|
|
; 80053000
|
|
LABEL OUT 80054000
|
|
, SCAN0 80054100
|
|
, SCAN1 80054200
|
|
; 80055000
|
|
INTEGER VI=PATH; % ***FOR MONITOR ONLY 80056000
|
|
MONITOR JACKMONITOR(VI); 80057000
|
|
VI~VI; %*** FOR MONITOR ONLY 80058000
|
|
MYSNR~SNR; 80059000
|
|
READYINDICATOR ~ PATH ! SHEETI; 80060000
|
|
80061000
|
|
OLDVECTORDESCRIPTOR ~ IF READYINDICATOR 80062000
|
|
THEN STACKVECTOR 80063000
|
|
ELSE SHEETVECTOR; 80064000
|
|
NEXTINVECTOR~IF READYINDICATOR 80064100
|
|
THEN NEXTINREADYVECTOR ELSE NEXTINSHEETVECTOR; 80064200
|
|
SCAN1: LASTINVECTOR~VECTORSIZE~OLDVECTORDESCRIPTOR.LENGTHF-1; 80064300
|
|
BUZZCONTROL(VECTORLOK[REAL(READYINDICATOR)]); 80064400
|
|
SCAN0: NEXTINVECTOR~IF (COMPLETESEARCH~NEXTINVECTOR=0) 80065000
|
|
THEN IF PATH=GETIRS OR PATH = SHEETI 80066000
|
|
THEN 1 80066200
|
|
ELSE FIRSTAVAILABLEINVECTOR 80067000
|
|
ELSE NEXTINVECTOR; 80068000
|
|
FOR INDEX~NEXTINVECTOR STEP 1 UNTIL LASTINVECTOR DO 80069000
|
|
IF OLDVECTORDESCRIPTOR[INDEX].FULLWORD=0 THEN GO OUT ; 80070000
|
|
COMMENT WE CAN NOT FIND STACK OR PSEUDO STACK IN THIS PASS; 80071000
|
|
IF INDEX=VECTORSIZE 80072000
|
|
THEN IF NOT COMPLETESEARCH 80073000
|
|
THEN BEGIN %%%MCS000010080074000
|
|
LASTINVECTOR~NEXTINVECTOR-1; 80075000
|
|
NEXTINVECTOR~0; 80076000
|
|
GO SCAN0; 80077000
|
|
END; %%%MCS0000010080078000
|
|
COMMENT WE CAN NOT GET A STACK OR A PSEUDO STACK SO WE HAVE TO SLEEP; 80079000
|
|
UNLOCK(VECTORLOK[REAL(READYINDICATOR)]); 80079100
|
|
WAIT (HOLEINVECTOR[REAL(READYINDICATOR)]) ; 80080000
|
|
NEXTINVECTOR~0; 80081000
|
|
GO SCAN1; 80082000
|
|
OUT: MOMTOVECTOR(WORD(NEWENTRY),OLDVECTORDESCRIPTOR, 80095000
|
|
VECTORINSERT ~ INDEX); 80096000
|
|
NEXTINVECTOR~IF INDEX=VECTORSIZE THEN 0 ELSE INDEX+1; 80097000
|
|
IF PATH!GETIRS THEN 80097200
|
|
IF READYINDICATOR 80098000
|
|
THEN NEXTINREADYVECTOR~NEXTINVECTOR 80098200
|
|
ELSE NEXTINSHEETVECTOR~NEXTINVECTOR; 80098400
|
|
IF(PATH!OTHER AND PATH!GETIRS) 80099000
|
|
THEN INSERTINQUEUE(PATH,INDEX); 80100000
|
|
IF PATH !GETIRS THEN UNLOCK(VECTORLOK[REAL(READYINDICATOR 80101000
|
|
)]); 80101200
|
|
VI~INDEX; 80102000
|
|
RETURN(INDEX); 80102100
|
|
END VECTORINSERT; 80103000
|
|
SAVE 80104000
|
|
PROCEDURE INSERTINQUEUE (PATH,STACKINDICATOR); 80105000
|
|
VALUE PATH 80106000
|
|
, STACKINDICATOR 80107000
|
|
; 80108000
|
|
REAL PATH 80109000
|
|
, STACKINDICATOR 80110000
|
|
; 80111000
|
|
COMMENT THE ACTION TAKEN BY THIS PROCEDURE DEPENDS UPON THE VALUE OF 80112000
|
|
PATH: 80113000
|
|
=REDY,SHEET INSERT THE STACK(REDY ) OR PSEUDO-STACK 80114000
|
|
(SHEET ) INTO THE READYQ OR SHEETQ 80115000
|
|
A.INSERTION IN THE READYQ IS AT THE LOW PRIORITY 80116000
|
|
END 80117000
|
|
B.INSERTION IN THE SHEETQ IS ACCORDING TO DECLARED80118000
|
|
PRIORITY. 80119000
|
|
WAITI MOVE THE STACKS IN THE WAITQ ASSOCIATED WITH 80120000
|
|
THE EVENT PARAMETER INTO THE LOW PRIORITY END 80121000
|
|
OF THE READYQ 80122000
|
|
OTHERREDY INSERTION INTO THE READYQ AT THE HIGH PRIORITY 80123000
|
|
END 80124000
|
|
TERMINATEI INSERTION INTO THE TERMINATEQ AT LOW PRIORITY 80124100
|
|
END 80124200
|
|
; 80125000
|
|
BEGIN 80126000
|
|
REAL PRIORITY 80127000
|
|
, NEXTENTRY 80128000
|
|
, HEAD = NEXTENTRY 80128100
|
|
, TI1 80129000
|
|
, COUNT 80130000
|
|
, CORESIZE 80131000
|
|
; 80132000
|
|
DEFINE LINK = LINKPLACE # 80133000
|
|
; 80134000
|
|
INTEGER IQ=PATH; % ***FOR MONITOR ONLY 80135000
|
|
IF PATH ! SHEET 80139000
|
|
THEN 80140000
|
|
BEGIN %%%MCS000000580141000
|
|
IF (HEAD~(IF PATH=TERMINATEI THEN TERMINATEQHEAD ELSE READYQHEAD))=080142000
|
|
THEN IF PATH = WAITI 80143000
|
|
THEN HEAD.DYNAMICLINKSF~STACKINDICATOR 80144000
|
|
ELSE BEGIN %%%MCS000001080145000
|
|
HEAD.FIRSTREADYF~STACKINDICATOR; 80146000
|
|
HEAD.LASTREADYF~STACKINDICATOR; 80147000
|
|
END %%%MCS000001080148000
|
|
ELSE IF PATH = OTHERREDY 80149000
|
|
THEN BEGIN %%%MCS000002080150000
|
|
WORDSTACK[HEAD.FIRSTREADYF,LINKPLACE] 80151000
|
|
.BACKWARDLINKF ~ STACKINDICATOR; 80152000
|
|
WORDSTACK[STACKINDICATOR,LINKPLACE ].FORWARDLINKF80153000
|
|
~ HEAD.FIRSTREADYF; 80154000
|
|
HEAD.FIRSTREADYF~STACKINDICATOR; 80155000
|
|
END %%%MCS000002080156000
|
|
ELSE BEGIN %%%MCS000003080157000
|
|
WORDSTACK[HEAD.LASTREADYF,LINKPLACE] 80158000
|
|
.FORWARDLINKF 80159000
|
|
~IF PATH = WAITI 80160000
|
|
THEN STACKINDICATOR.WAITQHEADF 80161000
|
|
ELSE STACKINDICATOR; 80162000
|
|
WORDSTACK[IF PATH=WAITI THEN STACKINDICATOR 80163000
|
|
.WAITQHEADF 80164000
|
|
ELSE STACKINDICATOR 80165000
|
|
,LINKPLACE].BACKWARDLINKF~ HEAD 80166000
|
|
.LASTREADYF; 80167000
|
|
HEAD.LASTREADYF~IF PATH=WAITI 80168000
|
|
THEN STACKINDICATOR.WAITQTAILF 80169000
|
|
ELSE STACKINDICATOR; 80170000
|
|
END; %%%MCS000003080171000
|
|
IF PATH=TERMINATEI THEN TERMINATEQHEAD~HEAD ELSE READYQHEAD~HEAD; 80171100
|
|
END %%%MCS000000580172000
|
|
ELSE 80173000
|
|
BEGIN %%%MCS000004080174000
|
|
IF PRIORITYLEVEL[PRIORITY~SHEETREALS[STACKINDICATOR, 80175000
|
|
PRIORITYPLACE]] = 0 80176000
|
|
THEN BEGIN %%%MCS000005080177000
|
|
COMMENT NO PREVIOUS ENTRIES AT THIS PRIORITY LEVEL; 80178000
|
|
PRIORITYLEVEL[PRIORITY].FIRSTATLEVEL 80179000
|
|
~ STACKINDICATOR; 80180000
|
|
PRIORITYLEVEL[PRIORITY].LASTATLEVEL 80181000
|
|
~ STACKINDICATOR ; 80182000
|
|
SHEETARRAY[STACKINDICATOR,LINKPLACE]. 80183000
|
|
DYNAMICLINKSF ~ 0; 80184000
|
|
80184100
|
|
END %%%MCS000005080185000
|
|
ELSE 80186000
|
|
IF (CORESIZE~SHEETREALS[STACKINDICATOR,COREPLACE]) 80187000
|
|
< SHEETREALS[PRIORITYLEVEL[PRIORITY] 80188000
|
|
.FIRSTATLEVEL,COREPLACE] 80189000
|
|
THEN 80190000
|
|
BEGIN %%%MCS000006080191000
|
|
COMMENT CORESIZE LESS THAN FOR FIRST ENTRY; 80192000
|
|
SHEETARRAY[PRIORITYLEVEL[PRIORITY] 80193000
|
|
.FIRSTATLEVEL ,LINK].BACKWARDLINKSF 80194000
|
|
~STACKINDICATOR; 80195000
|
|
SHEETARRAY[STACKINDICATOR,LINK] 80196000
|
|
.FORWARDLINKSF~PRIORITYLEVEL 80197000
|
|
[PRIORITY].FIRSTATLEVEL ; 80198000
|
|
PRIORITYLEVEL[PRIORITY].FIRSTATLEVEL 80199000
|
|
~STACKINDICATOR; 80200000
|
|
END %%%MCS000006080201000
|
|
ELSE 80202000
|
|
IF CORESIZE>SHEETREALS[PRIORITYLEVEL[PRIORITY].LASTATLEVEL,COREPLACE] 80203000
|
|
THEN BEGIN %%%MCS000007080204000
|
|
COMMENT IT MUST GO AT END; 80205000
|
|
SHEETARRAY[PRIORITYLEVEL[PRIORITY].LASTATLEVEL,LINK]. 80206000
|
|
FORWARDLINKSF~STACKINDICATOR; 80207000
|
|
SHEETARRAY[STACKINDICATOR,LINK].BACKWARDLINKSF~PRIORITYLEVEL 80208000
|
|
[PRIORITY].LASTATLEVEL; 80209000
|
|
PRIORITYLEVEL[PRIORITY].LASTATLEVEL ~ STACKINDICATOR; 80210000
|
|
END %%%MCS000007080211000
|
|
ELSE 80212000
|
|
BEGIN %%%MCS000008080213000
|
|
COUNT ~ PRIORITYLEVEL[PRIORITY].COUNTATLEVEL; 80214000
|
|
NEXTENTRY~SHEETARRAY[PRIORITYLEVEL[PRIORITY].FIRSTATLEVEL 80215000
|
|
,LINK].FORWARDLINKSF; 80216000
|
|
DO 80217000
|
|
IF CORESIZE<SHEETREALS[NEXTENTRY,COREPLACE] 80218000
|
|
THEN BEGIN %%%MCS000009080219000
|
|
SHEETARRAY[STACKINDICATOR,LINK] ~ * & LINKWORD(NEXTENTRY,*,TI1 ~ 80220000
|
|
SHEETARRAY[NEXTENTRY,LINK].BACKWARDLINKSF); 80221000
|
|
SHEETARRAY[TI1,LINK].FORWARDLINKSF ~ STACKINDICATOR; 80222000
|
|
SHEETARRAY[NEXTENTRY,LINK].BACKWARDLINKSF ~ STACKINDICATOR; 80223000
|
|
END %%%MCS000009080224000
|
|
ELSE NEXTENTRY ~ SHEETREALS [NEXTENTRY, 80225000
|
|
LINK].FORWARDLINKSF 80226000
|
|
UNTIL(COUNT ~ COUNT -1) = 0 ; 80227000
|
|
END; %%%MCS000008080228000
|
|
SHEETARRAY[STACKINDICATOR,LINK]~*&MARKSTACKCW(,*,*, 80229000
|
|
STACKINDICATOR,*,*,*); 80229100
|
|
PRIORITYLEVEL[PRIORITY].COUNTATLEVEL~PRIORITYLEVEL[PRIORITY] 80229200
|
|
.COUNTATLEVEL+1; 80229400
|
|
IF PRIORITY ! 0 THEN SHEETQHEAD ~ SHEETQHEAD + 1; 80229500
|
|
END ; %%%MCS000004080230000
|
|
END INSERTINQUEUE ; 80231000
|
|
SAVE 80232000
|
|
PROCEDURE STACKQREARRANGE(READYINDICATOR); 80233000
|
|
VALUE READYINDICATOR ; 80234000
|
|
BOOLEAN READYINDICATOR; 80235000
|
|
COMMENT THIS PROCEDURE IS CALLED TO REARRANGE EITHER THE READYQ 80236000
|
|
(READYINDICATOR IS TRUE) OR THE SHEETQ AS FOLLOWS : 80237000
|
|
A THE READYQ IS REARRANGED ACCORDING TO THE PRIORITY 80238000
|
|
FUNCTION DESCRIBED IN "DYNAMIC PRIORITY EVALUATION IN THE 80239000
|
|
SELECTION OF PROCESSES" BY J.G. CLEARY 80240000
|
|
B THE SHEETQ IS REARRANGED ACCORDING TO THE TIME THAT THE 80241000
|
|
VARIOUS ENTRIES HAVE BEEN IN THE OUEUE AND ACCORDING TO 80242000
|
|
THE TARGET TIME (IF ANY). HOWEVER, WITHIN ANY GIVEN 80243000
|
|
PRIORITY LEVEL, THE ENTRIES REMAIN ORDERED STRICTLY 80244000
|
|
ACCORDING TO CORE REQUIREMENTS 80245000
|
|
; 80246000
|
|
BEGIN 80247000
|
|
INTEGER SR; % *** FOR MONITOR ONLY 80248000
|
|
MONITOR JACKMONITOR(SR); 80249000
|
|
IF SIMULATING THEN 80249500
|
|
SR~SR; % *** FOR MONITOR ONLY 80250000
|
|
END STACKQREARRANGE ; 80251000
|
|
SAVE % *** FOR PRESENCE BIT 80252000
|
|
PROCEDURE NEXTPROCESS; 80253000
|
|
COMMENT THIS PROCEDURE IS CALLED BY THE MOVETONEXTINREADYQ ALGORITHM .IT80254000
|
|
RE-ARRANGES THE READYQ AND/OR BRINGS IN ENTRIES FROM THE SHEETQ 80255000
|
|
(IF REQUIRED) AND THEN INITIATES (MOVES STACK TO) THE HIGHEST 80256000
|
|
PRIORITY PROCESS IN THE QUEUE 80257000
|
|
; 80258000
|
|
BEGIN 80259000
|
|
OWN REAL PREVIOUSCLOCK 80260000
|
|
, STACKNO 80261000
|
|
; 80262000
|
|
INTEGER NP; % ***FOR MONITOR ONLY 80263000
|
|
MONITOR JACKMONITOR(NP); 80264000
|
|
BUZZCONTROL(SHEETQ); 80269000
|
|
IF NOT EMPTY(SHEETQ) 80269500
|
|
THEN SELECTION 80270000
|
|
ELSE UNLOCK(SHEETQ); 80270100
|
|
IF -PREVIOUSCLOCK+(PREVIOUSCLOCK~SCANIN(TIMEOFDAYWORD)) 80271000
|
|
> REARRANGETIME OR MUSTREARRANGE 80272000
|
|
THEN STACKQREARRANGE(READYINDICATOR); 80273000
|
|
STACKQREMOVE(REDY,STACKNO~READYQHED.FIRSTREADYF); 80275000
|
|
UNLOCK(READYQ); 80276000
|
|
NP ~ STACKNO; 80276500
|
|
SETINTERVALTIMER; % *** KLUDGE TO GIVR ME SOME TIME 80277000
|
|
MOVESTACK(STACKNO); 80278000
|
|
80279000
|
|
END NEXTPROCESS; 80280000
|
|
SAVE 80281000
|
|
PROCEDURE STACKQREMOVE (PATH,STACKINDICATOR); 80282000
|
|
VALUE PATH 80283000
|
|
, STACKINDICATOR 80284000
|
|
; 80285000
|
|
REAL PATH 80286000
|
|
; 80287000
|
|
INTEGER STACKINDICATOR 80288000
|
|
; 80289000
|
|
COMMENT USED FOR REMOVING ENTRIES FROM READYQ,SHEETQ AND TERMINATEQ 80290000
|
|
; 80291000
|
|
BEGIN 80292000
|
|
REAL FORWARDLINK 80293000
|
|
, BACKWARDLINK 80294000
|
|
, HEAD 80295000
|
|
, PRIORITY 80295100
|
|
; 80296000
|
|
REAL LINK 80297000
|
|
; 80298000
|
|
WORD ARRAY VECTORDESCRIPTOR[*,* ] 80299000
|
|
; 80300000
|
|
INTEGER SR=PATH; % *** FOR MONITOR ONLY 80301000
|
|
COMMENT PULL IF SIMULATING 80301500
|
|
MONITOR JACKMONITOR(LINK,FORWARDLINK,BACKWARDLINK,READYQHED);80302000
|
|
COMMENT PULL IF SIMULATING 80302500
|
|
MONITOR JACKMONITOR(SR); 80303000
|
|
SR~SR; %*** FOR MONITOR ONLY 80304000
|
|
VECTORDESCRIPTOR~IF PATH=SHEETI THEN SHEETARRAY ELSE 80305000
|
|
STACKVECTOR; 80306000
|
|
FORWARDLINK~(LINK~VECTORDESCRIPTOR[STACKINDICATOR,LINKPLACE] 80307000
|
|
.FULLWORD).FORWARDLINKF; 80308000
|
|
BACKWARDLINK~LINK.BACKWARDLINKF; 80309000
|
|
HEAD~IF PATH=REDY 80310000
|
|
THEN READYQHEAD 80310500
|
|
ELSE IF PATH=TERMINATEI 80311000
|
|
THEN TERMINATEQHEAD 80311500
|
|
ELSE PRIORITYLEVEL[SHEETARRAY[STACKINDICATOR , 80312000
|
|
PRIORITYPLACE]]; 80313000
|
|
IF BACKWARDLINK = 0 80314000
|
|
THEN HEAD.FIRSTREADYF~FORWARDLINK; 80315000
|
|
IF FORWARDLINK=0 80316000
|
|
THEN HEAD.LASTREADYF~BACKWARDLINK; 80317000
|
|
IF PATH = REDY 80318000
|
|
THEN READYQHED~ HEAD 80319000
|
|
ELSE IF PATH=TERMINATEI 80319200
|
|
THEN TERMINATEQHEAD ~ HEAD 80319400
|
|
ELSE BEGIN 80320000
|
|
PRIORITYLEVEL[PRIORITY~SHEETARRAY[STACKINDICATOR,80320100
|
|
PRIORITYPLACE]]~HEAD&LEVELFORMAT(*,*, 80321000
|
|
HEAD.COUNTATLEVEL-1); 80321010
|
|
IF PRIORITY!0 THEN SHEETQHEAD~SHEETQHEAD-1; 80321100
|
|
END ; 80321200
|
|
IF BACKWARDLINK!0 80322000
|
|
THEN VECTORDESCRIPTOR[BACKWARDLINK,LINKPLACE] 80323000
|
|
.FORWARDLINKF~FORWARDLINK; 80324000
|
|
IF FORWARDLINK!0 80325000
|
|
THEN VECTORDESCRIPTOR[FORWARDLINK,LINKPLACE] 80326000
|
|
.BACKWARDLINKF~BACKWARDLINK;80327000
|
|
VECTORDESCRIPTOR[LINK.SELFIDENTF,LINKPLACE].STATUSINDICATORF~0;80328000
|
|
EXIT; 80328100
|
|
END STACKQREMOVE; 80329000
|
|
SAVE 80330000
|
|
INTEGER PROCEDURE NEXTINSCHEDULE; 80331000
|
|
COMMENT THE SHEETQ ALGORITHM NEXTINDEX CONSISTS OF A CALL ON THIS 80332000
|
|
PROCEDURE (AND NOTHING ELSE). 80333000
|
|
WITHIN THE SHEETQ THEHE ARE A NUMBER OF LEVELS OF PRIORITY80334000
|
|
(THE PRIORITIES RANGING FROM 0 TO "PRIORITYRANGE"- A SYSTEM 80335000
|
|
PARAMETER). AT EACH LEVEL, THE ENTRIES ARE ARRANGED ACCORDING 80336000
|
|
TO CORE SPACE REQUIREMENT. THUS IT IS SUFFICIENT TO LOOK ONLY 80337000
|
|
AT THE ENTRIES AT THE HEAD OF EACH PRIORITY LEVEL 80338000
|
|
; 80339000
|
|
BEGIN 80340000
|
|
INTEGER TI1 80341000
|
|
, INDEX 80342000
|
|
; 80343000
|
|
DEFINE ENOUGHCORE = SHEETREALS[INDEX,COREPLACE]}AVAILABLECORE # 80344000
|
|
; 80345000
|
|
LABEL OUT 80346000
|
|
; 80347000
|
|
INTEGER NS; % ***FOR MONITOR ONLY 80348000
|
|
MONITOR JACKMONITOR(NS); 80349000
|
|
NS~NS; %*** FOR MONITOR ONLY 80350000
|
|
FOR TI1~PRIORITYRANGE STEP - 1 UNTIL 1 DO 80351000
|
|
IF (INDEX~PRIORITYLEVEL[TI1].FIRSTATLEVEL) ! 0 80352000
|
|
80353000
|
|
THEN BEGIN %%%MCS000010080354000
|
|
NEXTINSCHEDULE ~ INDEX ; 80355000
|
|
GO OUT ; 80356000
|
|
END; %%%MCS000010080357000
|
|
NEXTINSCHEDULE ~ -1; 80358000
|
|
OUT:END NEXTINSCHEDULE ; 80359000
|
|
SAVE 80360000
|
|
PROCEDURE INITIATE (DUMMY); 80361000
|
|
REAL DUMMY 80362000
|
|
; 80363000
|
|
COMMENT WHEN A JOB IS MOVED FROM THE SHEETQ,IT IS FIRST REPRESENTED IN 80364000
|
|
THE READYQ BY AN INDEPENDENT RUNNER STACK WITH INITIATE AS THE 80365000
|
|
PROCEDURE PARAMETER TO RUN. THE PARAMETER DUMMY IS NOT USED. 80366000
|
|
INITIATE DOES THE FOLLOWING: 80367000
|
|
A. CHECKS FOR A NEW D1 STACK. IF THE DISTACKNO IN THE FILE 80368000
|
|
HEADER(POINTED AT BY THE CODEFILEDESCRIPTOR) IS NON ZERO 80369000
|
|
THEN THE ASSOCIATED D1 STACK IS TO BE LINKED TO THIS 80370000
|
|
PROCESS(I.E. WE HAVE THE RE-ENTRANT PROGRAM CASE). 80371000
|
|
OTHERWISE A NEW D1 STACK IS CREATED. 80372000
|
|
B. CREATES THE D2 STACK AND LINKS IT IN TO THE D1 STACK 80373000
|
|
C. LINKS THE INITIATE STACK INTO THE TERMINATEQ 80374000
|
|
D. MOVES STACK TO THE NEWLY CREATED D2 STACK 80375000
|
|
; 80376000
|
|
BEGIN 80377000
|
|
REAL D1STACK 80378000
|
|
, D2STACK 80379000
|
|
, TI1 80380000
|
|
, TI2 80381000
|
|
, ADDRESS 80382000
|
|
, D1STACKSIZE = TI1 80383000
|
|
, MYSNR 80384000
|
|
, D2STACKSIZE = TI1 80385000
|
|
; 80386000
|
|
ARRAY FILEHEADER [*] 80387000
|
|
; 80388000
|
|
DEFINE D1SPECIFIERPLACE = D1DESCRIPTORPLACE # ; 80389000
|
|
DEFINE TOPMSCWPLACE = SECNDMSCWPLACE # 80389100
|
|
, TOPRCWPLACE = RETURNCONTROLWORDPLACE # 80389200
|
|
, PCWPLACE = IRPCWPLACE # 80389220
|
|
; 80389300
|
|
WORD ARRAY MYSTACKDESCRIPTOR[*] 80390000
|
|
, D1STACKDESCRIPTOR[*] 80391000
|
|
, D2STACKDESCRIPTOR = D1STACKDESCRIPTOR[*] 80392000
|
|
; 80393000
|
|
DEFINE FIXEDD1 = D1MSCWPLACE # 80394000
|
|
, D1FIXED = D1INFO # 80395000
|
|
, PROCESSD1 = STACK[MYSNR,D1SPECIFIERPLACE].LENGTHF#80396000
|
|
, PLACED1INFO = DISKWAIT (STACKVECTOR[D1STACK] 80397000
|
|
,D1RCWPLACE 80398000
|
|
,PROCESSD1 80399000
|
|
, 80400000
|
|
FIRSTROWADDRESS(FILEHEADER)+STACK[MYSNR,D1SPECIFIERPLACE].ADDRESSF 80401000
|
|
, 4 "122" 80402000
|
|
) # 80403000
|
|
, FIXEDD2 = 150 # 80404000
|
|
, PROCESSD2 = STACK[MYSNR,D2DESCRIPTORPLACE ] # 80405000
|
|
80406000
|
|
80407000
|
|
80408000
|
|
, MOVEINSHEETENTRIES=REPLACE POINTER(D2STACKDESCRIPTOR)80409000
|
|
BY POINTER(MYSTACKDESCRIPTOR) FOR 80410000
|
|
SHEETENTRYSIZE+2 OVERWRITE # 80411000
|
|
80412000
|
|
80413000
|
|
, PUTIND2ZEROES = 80414000
|
|
D2STACKDESCRIPTOR[TRPLACE] ~ 0; 80415000
|
|
D2STACKDESCRIPTOR[TWPLACE] ~ 0; 80416000
|
|
D2STACKDESCRIPTOR[TPPLACE] ~ 0; 80417000
|
|
REPLACE POINTER(D2STACKDESCRIPTOR 80418000
|
|
[D2DESCRIPTORPLACE]) BY 0 FOR (RETURNCONTROLWORDPLACE+1 80419000
|
|
-D2DESCRIPTORPLACE) OVERWRITE 80419010
|
|
# 80420000
|
|
, FIXTOPOFD2= 80421000
|
|
D2STACKDESCRIPTOR[FIRSTMSCWPLACE]~D2MSCW1; 80422000
|
|
80423000
|
|
D2STACKDESCRIPTOR[FIRSTRCWPLACE]~ D2RCW1; 80424000
|
|
COMMENT THE FOLLOWING TWO STATEMEMTS PUT THE D2 MSCW AND80425000
|
|
RCW IN THE STACK. 80426000
|
|
THE RCW AT THE TOP OF THE STACK IS THE PCW 80427000
|
|
FOR THE OUTER BLOCK CODE. WHEN THE PROCESS (I.E.80428000
|
|
D2 STACK) WAKES UP, IT WILL IMMEDIATELY EXIT AND80429000
|
|
THUS,VIA THE RCW, WILL START EXECUTING OUTER 80430000
|
|
BLOCK CODE. FROM THIS POINT ON,COMPILER GENERAT-80431000
|
|
ED CODE IS EXECUTED ; 80432000
|
|
D2STACKDESCRIPTOR[PCWPLACE]~WORDSTACK[D1STACK, 80432200
|
|
FIRSTPCWPLACE]; 80432400
|
|
D2STACKDESCRIPTOR[TOPMSCWPLACE]~D2MSCW2& 80433000
|
|
MARKSTACKCW(*,*,*,D2STACK,*,*,*); 80434000
|
|
D2STACKDESCRIPTOR[TOPRCWPLACE] 80435000
|
|
~ RUNRETURNCONTROLWORD 80436000
|
|
80437000
|
|
# 80438000
|
|
, TERMINATEMYSELF = 80439000
|
|
FORK(TERMINATE,0); 80440000
|
|
# 80441000
|
|
, STARTUPJOB= MOVESTACK(D2STACK) # 80442000
|
|
; 80443000
|
|
LABEL D1L,D2L; 80443100
|
|
DEFINE FINDSTACKSLOT(X,Y) = 80444000
|
|
Y: TI2~LASTNOTAVAILABLEINVECTOR; 80445000
|
|
BUZZCONTROL(VECTORLOK[1]); 80445200
|
|
DO UNTIL (TI2~TI2+1)=MAXSTACKS+1 OR STACKVECTOR[X~TI2] 80446000
|
|
.FULLWORD=0; 80447000
|
|
IF X=MAXSTACKS+1 THEN 80448000
|
|
BEGIN UNLOCK(VECTORLOK[1]); 80448200
|
|
WAIT(HOLEINVECTOR[1]); 80448400
|
|
GO TO Y; 80448600
|
|
END 80448800
|
|
# 80449000
|
|
; 80450000
|
|
BOOLEAN FIRSTD1STACK 80450100
|
|
; 80450200
|
|
INTEGER II; % ***FOR MONITOR ONLY 80451000
|
|
MONITOR JACKMONITOR(II); 80452000
|
|
II~II; %*** FOR MONITOR ONLY 80453000
|
|
BUZZ(PROCESSCHANGELOCK); 80454000
|
|
DISABLEOVERLAY; 80455000
|
|
MYSTACKDESCRIPTOR ~ STACKVECTOR[MYSNR~SNR]; 80456000
|
|
FILEHEADER ~ MYSTACKDESCRIPTOR[CODEFILEDESCPLACE]; 80457000
|
|
IF(FIRSTD1STACK~(D1STACK~D1STACKNUMBER(FILEHEADER))=0) 80458000
|
|
THEN 80459000
|
|
COMMENT WE HAVE TO BUILD A NEW D1 STACK; 80460000
|
|
BEGIN %%%MCS000010080461000
|
|
FINDSTACKSLOT(D1STACK,D1L); 80462000
|
|
ADDRESS~ GETSPACE (D1STACKSIZE~FIXEDD1+PROCESSD1 80463000
|
|
,0 80464000
|
|
,0&SPACETYPE(1,1,1,0) 80465000
|
|
,STACKVECTOR.ADDRESSF+D1STACK 80466000
|
|
) ; 80467000
|
|
D1STACKDESCRIPTOR~STACKVECTOR[D1STACK] 80468000
|
|
~*&DATADESCRIPTOR(*,1,0,0,0,0,0,0,D1STACKSIZE, 80469000
|
|
ADDRESS); 80470000
|
|
UNLOCK (VECTORLOK[1]); 80470200
|
|
D1STACKDESCRIPTOR[FIRSTPLACE] ~ D1TOSCW; 80471000
|
|
D1STACKDESCRIPTOR[LINKPLACE] 80472000
|
|
~0&MARKSTACKWD(,*,*,D1STACK,*,*,*,*); 80473000
|
|
D1STACKDESCRIPTOR[SEGDICTIDENTPLACE] ~ 80474000
|
|
MYSTACKDESCRIPTOR[PROCESSNATUREPLACE]; 80475000
|
|
D1STACKDESCRIPTOR[PROCESSNATUREPLACE].PROCESSHISTORYF80476000
|
|
~AD1STACK; 80477000
|
|
D1STACKDESCRIPTOR[D1CODEFILEDESCPLACE] ~ FILEHEADER; 80478000
|
|
D1STACKDESCRIPTOR[D1CODEFILENAMEDESCPLACE] ~ 80479000
|
|
MYSTACKDESCRIPTOR[CODEFILENAMEDESCPLACE]; 80480000
|
|
D1STACKDESCRIPTOR[USERCOUNTNLINKAGEPLACE] 80481000
|
|
~0;80482000
|
|
80483000
|
|
DISKWAIT(STACKVECTOR[D1STACK] 80483100
|
|
, D1MSCWPLACE-1 80483200
|
|
,PROCESSD1 80483300
|
|
, 80483400
|
|
FIRSTROWADDRESS(FILEHEADER)+STACK[MYSNR,D1SPECIFIERPLACE].ADDRESSF 80483500
|
|
, @442 80483600
|
|
); 80483700
|
|
D1STACKDESCRIPTOR[D1MSCWPLACE]~D1MSCW; 80483800
|
|
D1STACKDESCRIPTOR[D1RCWPLACE] ~ D1RCW; 80484000
|
|
D1STACKDESCRIPTOR[FIRSTPCWPLACE]~MYSTACKDESCRIPTOR 80485000
|
|
[FIRSTXPLACE]&STUFFEDIRW(,,D1STACK,D1MSCWPLACE);80485100
|
|
80485200
|
|
COMMENT THE D1 STACK HAS BEEN SET UP. WE MUST NOW MODIFY THE 80486000
|
|
FILE HEADER TO TAKE NOTE OF THE NEW D1 STACK. 80487000
|
|
; 80488000
|
|
D1STACKNUMBER(FILEHEADER) := D1STACK; 80489000
|
|
END ; %%%MCS0000100 80490000
|
|
COMMENT WE NOW HAVE TO GET A D2STACK; 80491000
|
|
FINDSTACKSLOT(D2STACK,D2L); 80492000
|
|
ADDRESS ~ GETSPACE (D2STACKSIZE~MYSTACKDESCRIPTOR 80493000
|
|
[STACKSIZEPLACE] 80493200
|
|
,D1STACK 80494000
|
|
,0&SPACETYPE(1,1,1,0) 80495000
|
|
,STACKVECTOR.ADDRESSF + D2STACK 80496000
|
|
) ; 80497000
|
|
D2STACKDESCRIPTOR~STACKVECTOR[D2STACK] 80498000
|
|
~*&DATADESCRIPTOR(*,1,0,0,0,0,0,0,D2STACKSIZE,ADDRESS); 80499000
|
|
UNLOCK(VECTORLOK[1]); 80499200
|
|
MOVEINSHEETENTRIES; 80500000
|
|
D2STACKDESCRIPTOR[FIRSTPLACE] ~ D2TOSCW; 80501000
|
|
D2STACKDESCRIPTOR[LINKPLACE].SELFIDENTF~D2STACK; 80501100
|
|
D2STACKDESCRIPTOR[PROCESSNATUREPLACE].INITIATESTACKF~0; 80501200
|
|
COMMENT*** MUST PUT IN REST OF PROCESS STACK HERE . MUST THEN LINK 80502000
|
|
INTO D1 STACK, PUT IN MSCW AND RCW, PUT INDEPENDENTRUNNER IN 80503000
|
|
TERMINATE QUEUE AND MOVE STACK 80504000
|
|
; 80505000
|
|
PUTINJOBIDANDTIME(D2STACKDESCRIPTOR,D2STACK); 80506000
|
|
PUTIND2ZEROES; 80507000
|
|
D2STACKDESCRIPTOR[CURRENTPRIORITYPLACE]~D2STACKDESCRIPTOR 80508000
|
|
[PRIORITYPLACE]; 80509000
|
|
D2STACKDESCRIPTOR[PROCESSFAMILYLINKPLACE].FATHERF~D1STACK; 80509100
|
|
COMMENT *** HOW DOES OLAYFILEDESC GET SET UP 80510000
|
|
D2STACKDESCRIPTOR[OLAYFILEDESCRIPTORPLACE] ~ OLAYFILEDESC; 80511000
|
|
FIXTOPOFD2; 80512000
|
|
TERMINATEMYSELF; 80513000
|
|
TI2~STACK[D1STACK,USERCOUNTNLINKAGEPLACE]; 80513100
|
|
STACK[D1STACK,USERCOUNTNLINKAGEPLACE]~TI2&USERLINK(*,TI2. 80513200
|
|
ACTIVEUSERSF+1,IF FIRSTD1STACK THEN D2STACK ELSE TI2. 80513300
|
|
FIRSTD2VALUE); 80513500
|
|
COMMENT *** AT PRESENT LATENTUSERSF IS NOT USED FOR ANYTHING; 80513600
|
|
UNLOCK(PROCESSCHANGELOCK); 80514000
|
|
STARTUPJOB; 80515000
|
|
80515100
|
|
ENABLEOVERLAY; 80516000
|
|
EXIT; 80516100
|
|
END INITIATE; 80517000
|
|
SAVE 80518000
|
|
PROCEDURE SELECTION; 80519000
|
|
COMMENT THIS ALGORITHM (ALSO CALLED SELECTION) IS INVOKED BY A SEARCH 80520000
|
|
OF THE READYQ WHEN A NEW JOB IS REQUIRED.THE FOLLOWING OCCURS: 80521000
|
|
A. THE SHEETQ IS SEARCHED UNTIL THE HIGHEST PRIORITY ENTRY 80522000
|
|
HAVING A SUITABLE CORE REQUIREMENT IS ENCOUNTERED. 80523000
|
|
B. THE SPACE FOR THE ENTRY IS MADE NON-OVERLAYABLE 80524000
|
|
C. THE PSEUDO STACK IS MODIFIED SO THAT WHEN IT RUNS,AS A 80525000
|
|
TRUE STACK, IT WILL EXIT TO RUN WHICH WILL CALL ON 80526000
|
|
INITIATE TO SET UP THE NEW JOB 80527000
|
|
D. VECTORINSERT IS CALLED TO CHANGE THE PSEUDO-STACK INTO A 80528000
|
|
REAL STACK BY LINKING IT INTO THE STACK VECTOR 80529000
|
|
E. IF APPROPRIATE, STEPS A TO D ARE REPEATED, THUS MORE THAN 80530000
|
|
ONE ENTRY MAY BE MOVED FROM THE SHEETQ TO THE READYQ 80531000
|
|
; 80532000
|
|
BEGIN 80533000
|
|
LABEL AGAIN 80534000
|
|
; 80535000
|
|
REFERENCE SHEETENTRY 80545000
|
|
; 80546000
|
|
INTEGER INDEX 80547000
|
|
, TI1 80548000
|
|
; 80549000
|
|
WORD ARRAY STACKDESCRIPTOR=SHEETENTRY [*] 80550000
|
|
; 80551000
|
|
SAVE WORD ARRAY STACKENTRY [INDEPENDENTRUNNERCORE]; 80551100
|
|
INTEGER SL; % ***FOR MONITOR ONLY 80552000
|
|
MONITOR JACKMONITOR(SL); 80553000
|
|
SL~SL; %*** FOR MONITOR ONLY 80554000
|
|
AGAIN: 80555000
|
|
80555200
|
|
IF (INDEX~NEXTINDEX(SHEETQ))<0 THEN GO FINI; 80555300
|
|
SHEETENTRY ~ SHEETVECTOR [INDEX]; 80556000
|
|
80556100
|
|
80556200
|
|
STACKQREMOVE(SHEET,INDEX); 80560000
|
|
SHEETVECTOR[INDEX].FULLWORD~0; 80560200
|
|
CAUSE(HOLEINVECTOR[SHEET]); 80560300
|
|
RESET(HOLEINVECTOR[SHEET]); 80560320
|
|
UNLOCK(SHEETQ); 80560400
|
|
STACKENTRY [0] ~ *; 80560500
|
|
INDEX ~ VECTORINSERT (REDY, STACKENTRY); 80561000
|
|
REPLACE POINTER (STACKENTRY) 80561100
|
|
BY POINTER (STACKDESCRIPTOR) 80561200
|
|
FOR STACKDESCRIPTOR.LENGTHF OVERWRITE; 80561300
|
|
LOADFIXEDIRSTACK (INDEX); 80561400
|
|
FORGETSPACE (STACKDESCRIPTOR.ADDRESSF); 80561450
|
|
WORDSTACK[INDEX,IRPCWPLACE]~ NAME(INITIATE); 80561500
|
|
WORDSTACK[INDEX,PROCESSNATUREPLACE].INITIATESTACKF~1; 80561600
|
|
WORDSTACK[INDEX,SECNDMSCWPLACE]~IRMSCW2& 80563000
|
|
MARKSTACKWD(*,*,*,INDEX,*,*,*,*); 80563100
|
|
WORDSTACK[INDEX,RETURNCONTROLWORDPLACE]~ 80563200
|
|
RUNRETURNCONTROLWORD; 80563300
|
|
IF COREFACTOR THEN GO AGAIN; 80564000
|
|
80565000
|
|
FINI: 80566000
|
|
EXIT; 80566100
|
|
80566200
|
|
END SELECTION; 80567000
|
|
SAVE PROCEDURE TERMINATE (PARAMETER); 80600000
|
|
REAL PARAMETER 80601000
|
|
; 80602000
|
|
COMMENT ALL PROGRAMS AND INDEPENDENT RUNNERS EXIT OR RETURN TO RUN 80603000
|
|
WHERE THEIR STACKS ARE LINKED INTO THE TERMINATEQ. RUN THEN 80604000
|
|
FORKS TO TERMINATE AND GOES INTO HOLD 80605000
|
|
TERMINATE RETURNS STACK SPACE AND STACK NUMBERS. DEDICATED 80606000
|
|
STACKS ARE RECOGNISED AND THE BIT ARRAY "IRSTACKS" IS MODIFIED 80607000
|
|
AS REQUIRED.FOR INDEPENDENT RUNNERS THE ARRAY "STACKINUSE" IS 80608000
|
|
MODIFIED WHEN NECESSARY. 80609000
|
|
NOTE THAT RUN ATTEMPTS TO TERMINATE TERMINATE BY FORKING 80610000
|
|
TO TERMINATE. HOWEVER INDEPENDENTRUNNER RECOGNISES THIS 80611000
|
|
INFINITELY RECURSIVE SITUATION AND TAKES SPECIAL ACTION 80612000
|
|
NOTE *** MARCH 20. EVENTUALLY WE WILL HAVE TO FORGET SPACE FOR80612100
|
|
THINGS LIKE AIT AND OAT DESCRIPTORS IN D2 STACKS AND 80612200
|
|
FILE HEADERS AND NAME DESCRIPTORS IN D1 STACKS 80612300
|
|
NOTE *** MARCH 20 .WHEN FORGETTING SPACE,NO ALLOWANCE IS MADE 80612400
|
|
FOR ABSENT DESCRIPTORS 80612500
|
|
; 80613000
|
|
BEGIN 80614000
|
|
LABEL AGAIN 80615000
|
|
, FINI 80616000
|
|
; 80617000
|
|
ARRAY FINISHEDSTACK [*] 80618000
|
|
; 80619000
|
|
WORD ARRAY FINISHEDWORDSTACK = FINISHEDSTACK[*] 80619200
|
|
, D1STACK = FINISHEDSTACK[*] 80619300
|
|
; 80619400
|
|
REAL STACKNO 80620000
|
|
, TEMPORARY 80620200
|
|
,COUNT 80620400
|
|
; 80621000
|
|
WORD WORDTEMPORARY 80621100
|
|
; 80621200
|
|
BOOLEAN DEDICATEDSTACK 80622000
|
|
, IRFINISH 80622100
|
|
; 80623000
|
|
DEFINE INSERTINLOGQ(X) = FORGETSPACE (FINISHEDSTACK 80624000
|
|
.ADDRESSF) # 80625000
|
|
, MAKEENTRYINLOG(X) = ; # 80626000
|
|
; 80627000
|
|
INTEGER TR; % *** FOR MONITOR ONLY 80627100
|
|
MONITOR JACKMONITOR(TR); % *** FOR MONITOR ONLY 80627200
|
|
TR~TR; % *** FOR MONITOR ONLY 80627300
|
|
AGAIN: BUZZCONTROL(IRPARAMETERLOK[TERMINATEINDICATOR]); 80628000
|
|
IF EMPTY(TERMINATEQ) 80629000
|
|
THEN BEGIN %%%MCS000050080629100
|
|
UNLOCK(IRPARAMETERLOK[TERMINATEINDICATOR]); 80629200
|
|
GO FINI; 80629300
|
|
END ; %%%MCS000050080629400
|
|
FINISHEDSTACK~ STACKVECTOR[STACKNO~NEXTINTERMINATEQ]; 80630000
|
|
REMOVE(TERMINATEQ ,STACKNO); 80631000
|
|
REPEAT: IF FINISHEDWORDSTACK[FIRSTPLACE].TAG!TOS THEN GO REPEAT;% *** 80631200
|
|
UNLOCK(IRPARAMETERLOK[TERMINATEINDICATOR]); 80631400
|
|
IF(IRFINISH~((TEMPORARY~FINISHEDSTACK[PROCESSNATUREPLACE]). 80632000
|
|
PROCESSHISTORYF=INDEPENDENT OR BOOLEAN(TEMPORARY. 80633000
|
|
INITIATESTACKF))) 80634000
|
|
THEN BEGIN %%%MCS000100080636000
|
|
COMMENT WE ARE TERMINATING AN INDEPENDENT RUNNER; 80637000
|
|
COMMENT *** MAYBE SOME OF THIS CODE SHOULD BE IN RUN.MARCH 1969; 80637100
|
|
BUZZCONTROL(INDEPENDENTRUNNERLOK); 80638000
|
|
IF NOT BOOLEAN(TEMPORARY.INITIATESTACKF) THEN 80638100
|
|
IF(TEMPORARY~TEMPORARY.PROCESSCLASSF)} 80639000
|
|
ONEONLYINDEX THEN STACKINUSE[TEMPORARY]~0; 80640000
|
|
IF (DEDICATEDSTACK~BOOLEAN(FINISHEDWORDSTACK[ 80641000
|
|
LINKPLACE].DEDICATEDSTACKF))80642000
|
|
THEN IRSTACKS~RESET(IRSTACKS, 80643000
|
|
STACKNO); 80644000
|
|
UNLOCK(INDEPENDENTRUNNERLOK); 80645000
|
|
END ; %%%MCS000100080646000
|
|
IF NOT DEDICATEDSTACK 80647000
|
|
THEN BEGIN %%%MCS000200080648000
|
|
BUZZCONTROL(VECTORLOK [REDY]); 80649000
|
|
INSERTINLOGQ(FINISHEDSTACK); 80650000
|
|
STACKVECTOR[STACKNO].FULLWORD ~ 0; 80651000
|
|
IF NOT IRFINISH 80651010
|
|
THEN BEGIN %%%MCS000220080651020
|
|
BUZZCONTROL(PROCESSCHANGELOCK); 80651100
|
|
D1STACK~STACKVECTOR 80651150
|
|
[STACKNO~FINISHEDSTACK 80651200
|
|
[PROCESSFAMILYLINKPLACE].FATHERF]; 80651250
|
|
IF(TEMPORARY~D1STACK[USERCOUNTNLINKAGEPLACE] 80651300
|
|
.ACTIVEUSERSF-1)=0 80651350
|
|
THEN 80651400
|
|
BEGIN %%%MCS000250080651450
|
|
COMMENT WE HAVE TO GET RID OF AD1 STACK; 80651500
|
|
FOR COUNT~D1RCWPLACE+1 STEP 1 UNTIL 80651550
|
|
D1STACK.LENGTHF-1 DO 80651600
|
|
BEGIN %%%MCS002800080651610
|
|
WORDTEMPORARY~D1STACK[COUNT]; 80651620
|
|
IF WORDTEMPORARY.TAG 80651650
|
|
=SEGDESC OR WORDTEMPORARY 80651700
|
|
.TAG=DATADESC80651720
|
|
THEN FORGETSPACE(WORDTEMPORARY 80651740
|
|
.ADDRESSF); 80651760
|
|
END ; %%%MCS002800080651765
|
|
COMMENT *** MAYBE WE SHOULD USE MASKED SEARCH FOR EQUAL; 80651770
|
|
FORGETSPACE(D1STACK.ADDRESSF); 80651775
|
|
STACKVECTOR[STACKNO].FULLWORD~0; 80651780
|
|
END %%%MCS000250080651800
|
|
ELSE D1STACK[USERCOUNTNLINKAGEPLACE]. 80651820
|
|
ACTIVEUSERSF~TEMPORARY;80651840
|
|
UNLOCK(PROCESSCHANGELOCK); 80651860
|
|
END; %%%MCS000220080651880
|
|
COMMENT *** 9 MAY INDEXING DOUBLE DOES NOT WORK ON MACHINE 80651990
|
|
CAUSE(HOLEINVECTOR[REDY]); 80652000
|
|
COMMENT *** INDEXING DOUBLE DOES NOT WORK ON MACHINE 80652010
|
|
RESET(HOLEINVECTOR[REDY]); 80652100
|
|
UNLOCK (VECTORLOK[REDY]); 80653000
|
|
END %%%MCS000200080654000
|
|
ELSE MAKEENTRYINLOG(STACKNO); 80655000
|
|
GO AGAIN ; 80656000
|
|
FINI: 80656500
|
|
EXIT; 80656600
|
|
END TERMINATE; 80657000
|
|
REAL PROCEDURE FINDINPUT(LEB,CODE); VALUE CODE; INTEGER CODE; 81000000
|
|
ARRAY LEB[*]; 81001000
|
|
BEGIN 81002000
|
|
REAL 81003000
|
|
STKNO, % STACK NO 81004000
|
|
U, % UNIT NO OR FILE HEADER INDEX 81005000
|
|
I, % INDEX 81006000
|
|
UTYPE, % UNIT TYPE 81007000
|
|
UTYPECODE, % QUALIFERS FOR UNIT TYPE 81008000
|
|
FILEGENNO, % FILE GENERATION NUMBER 81009000
|
|
FILEVERNO, % FILE VERSION NO 81010000
|
|
COUNT, % NO OF UNITS FOUND WITH MATCHING FILE81011000
|
|
BITNOPOS, % FOR SPECIFYING BIT NO POSITION 81012000
|
|
UTYPEMAXUNIT, % MAX UNIT NO FOR A GIVEN UNIT TYPE 81013000
|
|
MULTITYPECOUNTER, % COUNT FOR SIMILAR UNIT TYPE 81014000
|
|
UTYPESEQ, % THE SEQUENCE OF UNIT TYPES TO BE 81015000
|
|
% SEARCHED 81016000
|
|
UTABLEENTRY, % UNIT TABLE ENTRY 81017000
|
|
FILELEBZERO, % LEB[0] 81018000
|
|
FILELEBONE, % LEB[1] 81019000
|
|
UFILELEBZERO, % UINFOP[U,0] 81020000
|
|
FILENAME, % FIRST 5 CHRS OF FILENAMEPOINTER 81021000
|
|
UFILENAME, % FIRST 5 CHRS OF UFILENAMEPOINTER 81022000
|
|
FILECHRS, % NO OF CHRS IN FILE NAME STRING 81023000
|
|
UFILECHRS, % NO OF CHRS IN UNIT FILE NAME STRING 81024000
|
|
T1, % USED FOR SCRATCH 81025000
|
|
T2=FILELEBONE, % USED FOR SCRATCH 81026000
|
|
USAVE, % SAVED UNIT NO OF LATEST VERSION IF 81027000
|
|
% MATCH IS FOUND FOR FILE NAMES 81028000
|
|
UFILEGENNO, % LATEST GEN NO OF USAVE 81029000
|
|
UFILEVERNO; % LATEST VER NO OF USAVE 81030000
|
|
LAYOUT UTYPESEQL(47:6,41:6,35:6,29:6,23:6,17:6,11:6,5:6); 81032000
|
|
BOOLEAN ANYTYPETOG, % ANY UNIT TYPE 81033000
|
|
MULTIFILETOG, % IF ON ,SEARCH FOR MULTI FILE TAPES 81034000
|
|
SEARCHTOG; % ON IF SEARCH IS SUCCESSFUL 81035000
|
|
EVENT MYEVENT, 81035500
|
|
SOFTWARETIMEREVENT; 81036000
|
|
WORD ARRAY DUPFILEUNITS[*]; % TABLE CONTAINING SET BIT 81037000
|
|
% POSITION FOR UNIT HAVING FILE 81038000
|
|
FIELD UTYPEF=BITNOPOS:6; 81039000
|
|
LABEL 81040000
|
|
SPINDONOTHINGPROCESS, 81041000
|
|
NOFILE,FILEFOUND,START,TRYAGAIN,QUIT; 81042000
|
|
POINTER FILENAMEPOINTER, % POINTS TO FIRST CHR OF FILE 81043000
|
|
% NAME STRING IN LEB 81044000
|
|
UFILENAMEPOINTER; % POINTS TO FIRST CHR OF FILE 81045000
|
|
% NAME STRING IN UINFO 81046000
|
|
BOOLEAN PROCEDURE SEARCH; 81047000
|
|
COMMENT SEARCHES FILE ON A GIVEN UNIT TYPE(IF SPECIFIED) 81048000
|
|
OR SEARCHES ALL POSSIBLE UNIT TYPES; 81049000
|
|
BEGIN 81050000
|
|
LABEL STARTUTYPESEQAGAIN,FINDAGAIN,SIMILARTYPE,ENDOFLOOP, 81051000
|
|
QUITSEARCH,SINGLENAMEMATCH,SKIPDO, 81051500
|
|
UPDATECOUNT; 81052000
|
|
STARTUTYPESEQAGAIN: 81053000
|
|
IF UTYPESEQ!0 THEN 81054000
|
|
BEGIN % UNIT TYPE NOT SPECIFIED 81055000
|
|
BITNOPOS ~53; 81056000
|
|
ANYTYPETOG ~ TRUE; 81057000
|
|
FINDAGAIN: 81058000
|
|
BITNOPOS ~ * -6; 81059000
|
|
IF (UTYPE ~ UTYPESEQ.UTYPEF) =0 THEN 81060000
|
|
GO ENDOFLOOP; 81061000
|
|
UTYPECODE~UTYPE; 81062000
|
|
END; 81063000
|
|
IF UTYPE=DISKFILE THEN 81064000
|
|
BEGIN % DISK FILE 81065000
|
|
IF FILENAME.BYTE2F=1 THEN USAVE~-1 ELSE 81066000
|
|
USAVE~DIRECTORYSEARCH(FILENAMEPOINTER,LEBONE & 81068000
|
|
GENEALOGY1(,,,CODE),FALSE); 81069000
|
|
IF USAVE>0 THEN 81070000
|
|
BEGIN 81071000
|
|
T1~USAVE; 81071400
|
|
IF CODE=SEARCHONLY THEN GO QUIT; 81071700
|
|
COUNT~* + 1; 81072000
|
|
USAVE.REPINFOF~MCPDISKUNITNO; 81073000
|
|
END ELSE 81074000
|
|
IF USAVE.DCODE3=FILEWITHWRONGGENEALOGY THEN 81074200
|
|
BEGIN 81074400
|
|
UFILEGENNO~USAVE.DCODE1; 81074600
|
|
UFILEVERNO~USAVE.DCODE2; 81074800
|
|
END; 81074900
|
|
IF ANYTYPETOG THEN 81075000
|
|
IF USAVE>0 THEN 81076000
|
|
PUTINBITSTABLE(DUPFILEUNITS,MCPDISKUNITNO) 81077000
|
|
ELSE GO FINDAGAIN ELSE GO QUITSEARCH; 81078000
|
|
END; 81081000
|
|
IF MAGTAPE(UTYPE) THEN 81082000
|
|
IF UTYPE=MAGTAPE2 THEN MULTITYPECOUNTER ~ 4 81083000
|
|
ELSE MULTITYPECOUNTER ~ 2 ; 81084000
|
|
COMMENT NOW FIND MAXIMUM UNIT NO FOR A GIVEN UNIT TYPE; 81085000
|
|
SIMILARTYPE: 81086000
|
|
UTYPEMAXUNIT ~UNITBL(TI(UTYPE + 1) -1, 1); 81089000
|
|
IF UNIT[UNITBL((I~TI(UTYPE)),1)].UNITTYPE!UTYPE THEN 81090000
|
|
GO SKIPDO ELSE I~*-1; 81090500
|
|
DO 81091000
|
|
BEGIN 81092000
|
|
U ~ UNITBL( (I~I+1),1); 81093000
|
|
IF (NOT BOOLEAN((UTABLEENTRY~UNIT[U]).USAVED) 81094000
|
|
AND BOOLEAN(UTABLEENTRY.ULABELLED)) THEN 81095000
|
|
BEGIN % MATCH FILE NAME WITH ONES ON EACH U 81096000
|
|
UFILELEBZERO ~ LCNTRL; % UINFOP[U,0] 81097000
|
|
UFILENAMEPOINTER ~POINTER(UINFOP[U, 81098000
|
|
(UFILELEBZERO.FXD + ONES( 81099000
|
|
UFILELEBZERO.OPTMASK))],8)+1; 81100000
|
|
UFILENAME ~REAL(UFILENAMEPOINTER,5); 81101000
|
|
UFILECHRS ~ UFILENAME.BYTE3F+2; 81102000
|
|
IF NOT (BOOLEAN(UTABLEENTRY.UNITASSIGNED) 81103000
|
|
AND MULTIFILETOG) THEN 81104000
|
|
BEGIN % SINGLE FILE ON UNIT 81105000
|
|
IF FILENAME.BYTE2F=1 THEN 81105200
|
|
IF FILECHRS=UFILECHRS THEN 81105400
|
|
IF FILENAMEPOINTER=UFILENAMEPOINTER FOR 81105600
|
|
FILECHRS THEN GO SINGLENAMEMATCH; 81105800
|
|
IF FILENAME IS UFILENAME THEN 81106000
|
|
IF FILECHRS=UFILECHRS THEN 81107000
|
|
IF (FILECHRS~FILECHRS + REAL( 81108000
|
|
FILENAMEPOINTER+FILECHRS,1)+1)= 81109000
|
|
(UFILECHRS~UFILECHRS + REAL( 81110000
|
|
UFILENAMEPOINTER+UFILECHRS,1)+1) THEN 81111000
|
|
IF FILENAMEPOINTER=UFILENAMEPOINTER FOR 81112000
|
|
FILECHRS THEN 81113000
|
|
BEGIN % FILE NAMES MATCH 81114000
|
|
SINGLENAMEMATCH: 81114500
|
|
T1 ~(T2 ~LGEN1).CYCLE; 81115000
|
|
T2 ~ T2.GENVERSN; 81116000
|
|
IF FILEGENNO=0 OR FILEGENNO=T1 THEN 81117000
|
|
IF FILEVERNO=0 OR FILEVERNO=T2 THEN 81118000
|
|
BEGIN % PERFECT MATCH 81119000
|
|
UPDATECOUNT: 81120000
|
|
IF COUNT=0 THEN USAVE.REPINFOF~U;81120300
|
|
IF CODE=SEARCHONLY THEN GO QUIT; 81120700
|
|
COUNT ~ * +1; 81121000
|
|
PUTINBITSTABLE(DUPFILEUNITS,U); 81122000
|
|
END ELSE 81123000
|
|
IF T1>UFILEGENNO THEN 81124000
|
|
BEGIN % LATEST GENERATION 81125000
|
|
USAVE ~U; 81126000
|
|
UFILEGENNO ~T1; 81127000
|
|
UFILEVERNO ~T2; 81128000
|
|
END ELSE 81129000
|
|
IF T1=UFILEGENNO AND 81130000
|
|
T2>UFILEVERNO THEN 81131000
|
|
BEGIN % LATEST VERSION OF A GEN 81132000
|
|
USAVE ~U; 81133000
|
|
UFILEVERNO ~T2; 81134000
|
|
END; 81135000
|
|
END; 81136000
|
|
END ELSE 81136500
|
|
IF MULTIFILETOG AND MAGTAPE(UTYPE) THEN 81137000
|
|
BEGIN % CHECK MULTIPLE FILES ON TAPE 81138000
|
|
IF FILENAME.BYTE2F}2 THEN 81139000
|
|
FILECHRS~FILENAME.BYTE3F; 81140000
|
|
IF (FILENAMEPOINTER + 2) = 81141000
|
|
(UFILENAMEPOINTER +2) FOR FILECHRS 81142000
|
|
THEN GO UPDATECOUNT; 81143000
|
|
END; 81144000
|
|
END; 81145000
|
|
END UNTIL U=UTYPEMAXUNIT; 81146000
|
|
SKIPDO: 81147000
|
|
IF COUNT=0 THEN GO ENDOFLOOP; %KLUDGE FOR STEEVE 81147500
|
|
IF MULTITYPECOUNTER>1 THEN 81148000
|
|
BEGIN 81149000
|
|
MULTITYPECOUNTER ~ * - 1; 81150000
|
|
IF (MULTITYPECOUNTER MOD 2)=0 THEN 81151000
|
|
UTYPE~UTYPECODE+1+REAL(MULTITYPECOUNTER>2) ELSE 81152000
|
|
UTYPE~UTYPECODE + 16+REAL(MULTITYPECOUNTER>2);81153000
|
|
GO SIMILARTYPE; 81154000
|
|
END ELSE 81155000
|
|
IF ANYTYPETOG THEN GO FINDAGAIN; 81156000
|
|
ENDOFLOOP: 81157000
|
|
UTYPE ~UTYPECODE; 81158000
|
|
IF COUNT=0 AND (ANYTYPETOG OR MAGTAPE(UTYPE)) 81159000
|
|
AND NOT MULTIFILETOG THEN 81160000
|
|
BEGIN % CHECK FOR MULTI FILE REEL 81161000
|
|
MULTIFILETOG ~TRUE; 81162000
|
|
GO STARTUTYPESEQAGAIN; 81163000
|
|
END; 81164000
|
|
IF COUNT=1 THEN U~(T1~USAVE).REPINFOF; 81165000
|
|
QUITSEARCH: 81165500
|
|
SEARCH ~SEARCHTOG ~(COUNT>0); 81166000
|
|
END SEARCH; 81167000
|
|
BOOLEAN PROCEDURE RESEARCH; 81168000
|
|
COMMENT CALLS SEARCH AND RETURNS TRUE VALUE IF SEARCH IS 81169000
|
|
SUCCESSFUL. IT RESETS DUPFILEUNITS TABLE; 81170000
|
|
BEGIN 81171000
|
|
SEARCH; 81172000
|
|
REPLACE POINTER(DUPFILEUNITS) BY 0 81173000
|
|
FOR UBITSTABLESIZE OVERWRITE; 81174000
|
|
COUNT ~ 0; 81175000
|
|
RESEARCH ~ SEARCHTOG; 81176000
|
|
END RESEARCH; 81177000
|
|
INTERRUPT I1: ON SOFTWARETIMEREVENT, 81178000
|
|
IF RESEARCH THEN 81179000
|
|
BEGIN 81180000
|
|
DISABLE (I1); 81181000
|
|
GO FILEFOUND; 81182000
|
|
END ELSE 81183000
|
|
GO TRYAGAIN; 81184000
|
|
INTERRUPT I2: ON MYEVENT, 81186000
|
|
BEGIN 81187000
|
|
DISABLE(I1,I2); 81188000
|
|
IF (T2~(T1~REPLY[STKNO]).REPVALF)=DSV THEN 81189000
|
|
IF STACK[STKNO,PROCESSIDPLACE]="LIBMAIN" 81190000
|
|
THEN 81191000
|
|
BEGIN 81192000
|
|
T1.SIGNBITF~1; 81193000
|
|
GO QUIT; 81194000
|
|
END ELSE GO SPINDONOTHINGPROCESS;81195000
|
|
RESET(MYEVENT); 81195300
|
|
REPLY[STKNO]~0; 81195500
|
|
IF T2=OKV THEN GO START; 81195700
|
|
END; 81196000
|
|
T1~UBITSTABLESIZE + 1; 81197000
|
|
DUPFILEUNITS ~DUPFILEUNITS & ARRAYDESCL(,GETAREA(T1)); 81198000
|
|
FILELEBZERO~LEBZERO; 81199000
|
|
FILELEBONE~LEBONE; 81200000
|
|
FILEGENNO~ FILELEBONE.CYCLE; 81201000
|
|
FILEVERNO~FILELEBONE.GENVERSN; 81202000
|
|
FILENAMEPOINTER~POINTER(LEB[FILELEBZERO.FXD + 81203000
|
|
ONES(FILELEBZERO.OPTMASK)],8) +1;81204000
|
|
DUPFILEUNITS[UBITSTABLESIZE]~FILENAMEPOINTER-1;% 81204500
|
|
FILENAME~REAL(FILENAMEPOINTER,5); % 5 IS USED TO SAVE MEM ACC 81205000
|
|
FILECHRS~FILENAME.BYTE3F+2; 81206000
|
|
STKNO~SNR; 81207000
|
|
STOREITEM(REPLYEVENT @ REFERENCE(STACKVECTOR[STKNO]),MYEVENT); 81207500
|
|
UTYPECODE~FILELEBZERO.PTYPEL; 81208000
|
|
IF (UTYPE~UTYPECODE.PTYPEF)=0 THEN 81209000
|
|
IF (UTYPECODE~UTYPECODE.PTYPECODEF)=3 THEN 81210000
|
|
UTYPESEQ~0 & UTYPESEQL(MAGTAPE1,MAGTAPE2) ELSE 81211000
|
|
IF UTYPECODE=0 THEN 81212000
|
|
UTYPESEQ~0 & UTYPESEQL(DISKFILE,MAGTAPE1,MAGTAPE2, 81213000
|
|
CARDREADER) ELSE 81214000
|
|
UTYPESEQ~0 & UTYPESEQL(MAGTAPE1,MAGTAPE2, 81215000
|
|
CARDREADER) ELSE 81216000
|
|
UTYPECODE~UTYPE; % SAVES ORIGINAL UNIT TYPE 81217000
|
|
START: 81218000
|
|
IF NOT SEARCH THEN 81219000
|
|
IF UFILEGENNO=0 THEN 81219500
|
|
BEGIN 81220000
|
|
COMMENT FILEMESS("#NO FIL" FIB); 81221000
|
|
REPLY[STKNO]~ILREP + ULREP + DSREP + OKREP 81222000
|
|
+FRREP | REAL(FILELEBZERO.LABELTYPEL=1) 81223000
|
|
+ OFREP | REAL(BOOLEAN(FILELEBZERO.OPTIONALF)); 81224000
|
|
MESSER(0,DUPFILEUNITS); 81225000
|
|
ENABLE(I1,I2); 81226000
|
|
TRYAGAIN: 81229000
|
|
COMMENT 81230000
|
|
SLEEP(SEC1 ,SOFTWARETIMEREVENT); 81231000
|
|
ENABLE(I1); 81232000
|
|
HOLD; 81233000
|
|
FILEFOUND: 81234000
|
|
IF SEARCHTOG THEN SEARCHTOG~SEARCH ELSE 81235000
|
|
IF T2=ILV OR T2=ULV THEN U~T1.REPINFOF; 81236000
|
|
END ELSE 81237000
|
|
BEGIN % GENEALOGY DONOT MATCH 81237200
|
|
REPLY[STKNO]~DSREP + OKREP + USREP; 81237400
|
|
DUPFILEUNITS[0]~0 & GENEALOGY1(UFILEGENNO,UFILEVERNO,,); 81238000
|
|
MESSER(1,DUPFILEUNITS); 81238300
|
|
ENABLE(I2); 81238700
|
|
HOLD; 81238800
|
|
IF T2=USV THEN 81239000
|
|
BEGIN 81239500
|
|
T1~DUPFILEUNITS[0]; 81240000
|
|
IF T1.CYCLE!UFILEGENNO THEN UFILEGENNO~T1.CYCLE ELSE 81240500
|
|
IF T1.GENVERSN!UFILEVERNO THEN UFILEVERNO~T1.GENVERSN; 81241000
|
|
FILELEBONE~LEBONE & GENEALOGY1(UFILEGENNO,UFILEVERNO,,); 81241500
|
|
FILEGENNO~UFILEGENNO; 81241550
|
|
FILEVERNO~UFILEVERNO; 81242000
|
|
UFILEGENNO~UFILEVERNO~0; 81243000
|
|
GO START; 81244000
|
|
END; 81245000
|
|
END; 81246000
|
|
IF COUNT>1 THEN 81247000
|
|
BEGIN % DUP FILE 81248000
|
|
REPLY[STKNO]~DSREP + OKREP +ILREP; 81249000
|
|
MESSER(2,DUPFILEUNITS); 81250000
|
|
ENABLE(I2); 81251000
|
|
HOLD; 81252000
|
|
IF T2=ILV THEN 81253000
|
|
BEGIN 81254000
|
|
U~T1.REPINFOF; 81255000
|
|
IF UNIT[U].UNITTYPE=DISKFILE THEN T1~USAVE; 81256000
|
|
END; 81263000
|
|
END; % END OF DUP FILE 81264000
|
|
UNIT[U].UNITASSIGNED~1; 81265000
|
|
QUIT: 81266000
|
|
SPINDONOTHINGPROCESS: 81267000
|
|
FINDINPUT~T1; 81268000
|
|
END FINDINPUT; 81269000
|
|
REAL PROCEDURE FINDOUTPUT(LEB,CODE); VALUE CODE; INTEGER CODE; 81270000
|
|
ARRAY LEB[*]; 81271000
|
|
BEGIN 81272000
|
|
REAL 81273000
|
|
STKNO, % STACK NO 81274000
|
|
I, 81275000
|
|
UTYPEMAXUNIT, 81276000
|
|
SAVETYPE, 81277000
|
|
U, 81278000
|
|
UTABLEENTRY, 81279000
|
|
UTYPE, 81280000
|
|
UTYPECODE, 81281000
|
|
MULTITYPECOUNTER, 81282000
|
|
FILECHRS, 81283000
|
|
FILENAME, 81284000
|
|
UFILENAME, 81285000
|
|
FILELEBZERO, % LEB[0] 81286000
|
|
UFILELEBZERO, 81287000
|
|
T; 81288000
|
|
EVENT MYEVENT, % LOCAL EVENT 81289000
|
|
SOFTWARETIMEREVENT; 81290000
|
|
DEFINE TYFILE =0 #, 81291000
|
|
TYBDFILE=1#, 81292000
|
|
TYBTFILE=2#, 81293000
|
|
TYBDBTFILE=3#, 81294000
|
|
BDFILE=4 #, 81295000
|
|
BTFILE=5 #, 81296000
|
|
BDBTFILE=6 #; 81297000
|
|
BOOLEAN BTOPTIONTOG, 81298000
|
|
UTYPETOG, 81299000
|
|
MAGTAPETOG, 81300000
|
|
BACKUPTOG, 81301000
|
|
BTTOG; 81302000
|
|
POINTER FILENAMEPOINTER, 81303000
|
|
UFILENAMEPOINTER; 81304000
|
|
LABEL START,TRYAGAIN,UNITFOUND,PROCEND, 81305000
|
|
SPINDONOTHINGPROCESS, 81306000
|
|
CLAIMMT,CHECKFORMS; 81307000
|
|
BOOLEAN PROCEDURE SEARCHUTYPE(TYPE,OPCODE); 81308000
|
|
VALUE TYPE,OPCODE; 81309000
|
|
REAL TYPE,OPCODE; 81310000
|
|
BEGIN 81311000
|
|
LABEL SIMILARTYPE,SKIPDO,QUIT; 81312000
|
|
IF MAGTAPE(TYPE) THEN 81313000
|
|
BEGIN 81314000
|
|
SAVETYPE~TYPE; 81315000
|
|
MAGTAPETOG~TRUE; 81316000
|
|
IF TYPE=MAGTAPE2 THEN MULTITYPECOUNTER ~4 81317000
|
|
ELSE MULTITYPECOUNTER~ 2; 81318000
|
|
END; 81319000
|
|
IF OPCODE=1 THEN 81320000
|
|
BEGIN % MAKE UP NAME POINTER FOR A GIVEN TYPE BACK-UP 81321000
|
|
FILENAME ~REAL(FILENAMEPOINTER,5); 81322000
|
|
FILECHRS ~ FILENAME.BYTE3F +2; 81323000
|
|
BTOPTIONTOG ~ TRUE; 81324000
|
|
END; 81325000
|
|
SIMILARTYPE: 81326000
|
|
UTYPEMAXUNIT ~UNITBL(TI(TYPE +1) -1,1); 81327000
|
|
IF UNIT[UNITBL((I~ TI( TYPE)),1)].UNITTYPE! TYPE THEN 81328000
|
|
GO SKIPDO ELSE I ~ * - 1; 81329000
|
|
DO 81330000
|
|
BEGIN 81331000
|
|
U~UNITBL((I ~I+1),1); 81332000
|
|
IF NOT BOOLEAN((UTABLEENTRY ~ UNIT[U]).USAVED) THEN 81333000
|
|
IF NOT MAGTAPETOG THEN 81334000
|
|
IF NOT BOOLEAN(UTABLEENTRY.UNITASSIGNED) THEN 81335000
|
|
UTYPETOG ~ TRUE ELSE 81336000
|
|
ELSE 81337000
|
|
IF BOOLEAN(UTABLEENTRY.UWRITERING) THEN 81338000
|
|
IF BTOPTIONTOG THEN 81339000
|
|
BEGIN 81340000
|
|
IF NOT(BOOLEAN(UTABLEENTRY.ULABELLED) AND 81341000
|
|
BOOLEAN(UTABLEENTRY.UNITASSIGNED)) THEN 81342000
|
|
BEGIN % CHECK FOR MULTIPLE BACK-UP FILES 81343000
|
|
UFILELEBZERO ~LCNTRL; % UINFOP[U,0] 81344000
|
|
UFILENAMEPOINTER ~POINTER(UINFOP[U, 81345000
|
|
(UFILELEBZERO.FXD + ONES( 81346000
|
|
UFILELEBZERO.OPTMASK))],8) + 1; 81347000
|
|
UFILENAME ~REAL(UFILENAMEPOINTER,5); 81348000
|
|
IF FILENAME=UFILENAME THEN 81349000
|
|
IF (FILENAMEPOINTER +2) = 81350000
|
|
(UFILENAMEPOINTER+2) FOR FILECHRS THEN 81351000
|
|
BEGIN 81352000
|
|
% BACK-UP TAPE MATCH FOR A GIVEN TYPE 81353000
|
|
END; 81354000
|
|
END; 81355000
|
|
END ELSE 81356000
|
|
IF NOT BOOLEAN(UTABLEENTRY.USCRATCH) THEN 81357000
|
|
UTYPETOG ~TRUE; 81358000
|
|
END UNTIL U=UTYPEMAXUNIT OR UTYPETOG; 81359000
|
|
SKIPDO: 81360000
|
|
IF NOT UTYPETOG AND MULTITYPECOUNTER > 1 THEN 81361000
|
|
BEGIN 81362000
|
|
MULTITYPECOUNTER ~ * -1; 81363000
|
|
IF (MULTITYPECOUNTER MOD 2) = 0 THEN 81364000
|
|
TYPE ~SAVETYPE+1+REAL(MULTITYPECOUNTER>2) ELSE 81365000
|
|
TYPE ~SAVETYPE +16+REAL(MULTITYPECOUNTER>2); 81366000
|
|
GO SIMILARTYPE; 81367000
|
|
END; 81368000
|
|
IF NOT UTYPETOG AND BTOPTIONTOG THEN 81369000
|
|
BEGIN % GO BACK TO FIND A SCRATCH UNIT 81370000
|
|
TYPE ~ SAVETYPE; 81371000
|
|
BTOPTIONTOG ~FALSE; 81372000
|
|
GO SIMILARTYPE; 81373000
|
|
END; 81374000
|
|
IF UTYPETOG THEN 81375000
|
|
BEGIN 81376000
|
|
T.REPINFOF ~U; 81377000
|
|
IF OPCODE !0 THEN 81378000
|
|
BEGIN 81379000
|
|
UTYPETOG ~FALSE; 81380000
|
|
BTTOG ~TRUE; 81381000
|
|
END; 81382000
|
|
OPCODE ~NABS(OPCODE) 81383000
|
|
END; 81384000
|
|
QUIT: 81385000
|
|
SEARCHUTYPE ~BOOLEAN(OPCODE.SIGNBITF); 81386000
|
|
END SEARCHUTYPE; 81387000
|
|
INTERRUPT I1: ON SOFTWARETIMEREVENT, 81388000
|
|
BEGIN 81389000
|
|
DISABLE(I1); 81390000
|
|
IF UTYPECODE{TYBDBTFILE THEN 81391000
|
|
IF SEARCHUTYPE(UTYPE,0)THEN GO UNITFOUND; 81392000
|
|
IF BACKUPTOG THEN 81393000
|
|
IF SEARCHUTYPE(MAGTAPE1,1) THEN 81394000
|
|
GO UNITFOUND ELSE GO TRYAGAIN; 81395000
|
|
END; 81396000
|
|
INTERRUPT I2: ON MYEVENT, 81397000
|
|
BEGIN 81398000
|
|
DISABLE(I1,I2); 81399000
|
|
IF (I~REPLY[STKNO]).REPVALF=DSV THEN 81400000
|
|
IF STACK[STKNO,PROCESSIDPLACE]="LIBMAIN" 81401000
|
|
THEN 81402000
|
|
BEGIN 81403000
|
|
T.SIGNBITF~1; 81404000
|
|
GO PROCEND; 81405000
|
|
END ELSE GO SPINDONOTHINGPROCESS; 81406000
|
|
RESET(MYEVENT); 81407000
|
|
REPLY[STKNO]~0; 81408000
|
|
UTYPE ~(UTYPECODE ~T.REPINFOF).PTYPEF; 81409000
|
|
UTYPECODE ~UTYPECODE.PTYPECODEF; 81410000
|
|
END; 81411000
|
|
FILELEBZERO ~ LEBZERO; 81412000
|
|
STKNO ~ SNR; 81413000
|
|
UTYPECODE ~ FILELEBZERO.PTYPEL; 81414000
|
|
UTYPE ~ UTYPECODE.PTYPEF; 81415000
|
|
UTYPECODE ~ UTYPECODE.PTYPECODEF; 81416000
|
|
STOREITEM(REPLYEVENT @ REFERENCE(STACKVECTOR[STKNO]),MYEVENT); 81417000
|
|
START: 81418000
|
|
IF UTYPE!0 THEN 81419000
|
|
BEGIN 81420000
|
|
IF UTYPE>DISKFILE THEN 81421000
|
|
BEGIN % DISK FILE 81422000
|
|
END ELSE 81423000
|
|
IF UTYPECODE { TYBDBTFILE THEN 81424000
|
|
BEGIN % ONE OF THE OPTIONS IS AN ACTUAL UNIT TYPE 81425000
|
|
IF SEARCHUTYPE(UTYPE,0) THEN 81426000
|
|
IF UTYPE=BUFFPRINTER THEN GO CHECKFORMS 81427000
|
|
ELSE 81428000
|
|
IF MAGTAPE(UTYPE) THEN GO CLAIMMT; 81429000
|
|
END ELSE 81430000
|
|
IF UTYPECODE=TYBTFILE OR UTYPECODE=TYBDBTFILE OR 81431000
|
|
UTYPECODE=BTFILE OR UTYPECODE=BDBTFILE THEN 81432000
|
|
BEGIN % BACK-UP TAPE IS ONE OF THE OPTIONS 81433000
|
|
BACKUPTOG~TRUE; 81434000
|
|
IF SEARCHUTYPE(UTYPE,1) THEN 81435000
|
|
IF NOT BOOLEAN(UTABLEENTRY.USCRATCH) THEN 81436000
|
|
CLAIMMT: 81437000
|
|
BEGIN 81438000
|
|
% CLAIM UNIT AND WRITE LABEL 81439000
|
|
% GIVE MESSAGE "NEW PBT ON" 81440000
|
|
GO PROCEND; 81441000
|
|
END; 81442000
|
|
END; 81443000
|
|
IF UTYPECODE=TYBDFILE OR UTYPECODE=TYBDBTFILE OR 81444000
|
|
UTYPECODE=BDFILE OR UTYPECODE=BDBTFILE THEN 81445000
|
|
BEGIN % BACK-UP DISK IS ONE OF THE OPTIONS 81446000
|
|
% GET NEXT FILE FOR BACK-UP DISK 81447000
|
|
% BUILD A DISK HEADER 81448000
|
|
END; 81449000
|
|
IF NOT(UTYPETOG OR BTTOG) THEN 81450000
|
|
BEGIN % FILE REQUIRED MESSAGE 81451000
|
|
REPLY[STKNO] ~ DSREP + OUREP; 81452000
|
|
ENABLE(I2); 81453000
|
|
TRYAGAIN: 81454000
|
|
% TIMER SLEEP MECHANISM 81455000
|
|
ENABLE(I1); 81456000
|
|
HOLD; 81457000
|
|
UNITFOUND: 81458000
|
|
IF NOT(UTYPETOG OR BTTOG) THEN GO START; 81459000
|
|
IF BTTOG AND NOT BOOLEAN(UTABLEENTRY.USCRATCH) THEN 81460000
|
|
GO CLAIMMT; 81461000
|
|
CHECKFORMS: 81462000
|
|
% IF PRINTER CHECK FORMS HERE 81463000
|
|
END; 81464000
|
|
END ELSE 81465000
|
|
IF UTYPECODE=2 THEN 81466000
|
|
BEGIN % DESIGNATED FILE 81467000
|
|
END ELSE T.SIGNBITF ~ 1; 81468000
|
|
SPINDONOTHINGPROCESS: 81469000
|
|
PROCEND: 81470000
|
|
FINDOUTPUT ~T; 81471000
|
|
END FINDOUTPUT; 81472000
|
|
SAVE WORD PROCEDURE MON1TOR(A,V); VALUE A,V; REAL A; WORD V; 99000000
|
|
BEGIN 99003000
|
|
LAYOUT FIRSTCHR(47:6), SIGNATURE(46:1); 99004000
|
|
OWN PICTURE FILL(6P M*E(3)R9); 99004100
|
|
POINTER MPTR, FPTR; 99005000
|
|
REAL C, FREG, BOS; 99006000
|
|
WORD RCWD; 99006800
|
|
IF LOCK(MONITORLOCK) THEN STOP; 99007000
|
|
REPLACE MPTR ~ POINTER(MONITER[2],6) BY 6" " FOR 14 WORDS; 99008000
|
|
MONITER[1] ~ A & FIRSTCHR(6" "); 99009000
|
|
REPLACE MPTR:MPTR BY 6" ", V.TAG FOR 1 CORRECTLY, 6" "; 99010000
|
|
MONITER[0] := TAGZOT(V); 99011000
|
|
REPLACE MPTR:MPTR BY POINTER(MONITER,4) FOR 12 WITH HEXTOBCL,6" ";99012000
|
|
FREG ~ F; 99013000
|
|
BOS ~ BOSR + 2; 99014000
|
|
C ~ 7; 99015000
|
|
WHILE C ~ * - 1 } 0 AND FREG ~ * - M[FREG].DFF > BOS DO 99016000
|
|
IF BOOLEAN(M[FREG]).EBITF THEN 99016100
|
|
BEGIN 99016200
|
|
REPLACE MPTR:FPTR:=MPTR BY (RCWD:=M[FREG+1]).REALSDIF FOR 5 99017000
|
|
DIGITS, 6":", RCWD.PIRF FOR 4 DIGITS, 6" "; 99018000
|
|
XSIGN(0 & SIGNATURE(RCWD.D0D1SEGBIT)); 99018100
|
|
REPLACE FPTR BY FPTR+1 WITH FILL; 99018150
|
|
END; 99018200
|
|
MONITER[0] := DIAGNOSTICIOCW; 99019000
|
|
RESET(MONITORFINISH); 99020000
|
|
IOREQUEST(REFERENCE(DIAGNOSTICARRAY)); 99020100
|
|
WAIT(MONITORFINISH); 99020200
|
|
UNLOCK(MONITORLOCK); 99021000
|
|
RETURN(V); 99022000
|
|
END MONITOR; 99023000
|
|
DEFINE CHECKMASK (WHOSE) = 99054000
|
|
NOT BOOLEAN (MONITORLOCK) AND ((REAL(BOOLEAN(MONITORVALUE) AND 99055000
|
|
BOOLEAN (WHOSE) AND BOOLEAN (MONITORMASK))! 0) OR 99055500
|
|
BOOLEAN (MONITORVALUE)) 99056000
|
|
#; 99057000
|
|
SAVE 99057900
|
|
WORD PROCEDURE DONMONITOR(A, V); VALUE A, V; REAL A; WORD V; 99058000
|
|
DONMONITOR ~ IF CHECKMASK(DONBIT) THEN MON1TOR(A, V) ELSE V; 99059000
|
|
SAVE 99060000
|
|
WORD PROCEDURE JACKMONITOR (A, V); VALUE A, V; REAL A; WORD V; 99061000
|
|
JACKMONITOR ~ IF CHECKMASK(JACKBIT) THEN MON1TOR(A, V) ELSE V; 99062000
|
|
SAVE 99062900
|
|
WORD PROCEDURE RAJMONITOR (A, V); VALUE A, V; REAL A; WORD V; 99063000
|
|
RAJMONITOR ~ IF CHECKMASK( RAJBIT) THEN MON1TOR(A, V) ELSE V; 99064000
|
|
SAVE 99064900
|
|
WORD PROCEDURE BOBMONITOR (A, V); VALUE A, V; REAL A; WORD V; 99065000
|
|
BOBMONITOR ~ IF CHECKMASK( BOBBIT) THEN MON1TOR(A, V) ELSE V; 99066000
|
|
SAVE 99066900
|
|
WORD PROCEDURE STEVEMONITOR(A,V); VALUE A,V; REAL A; WORD V; 99067000
|
|
STEVEMONITOR ~ IF CHECKMASK(STEVEBIT) THEN MON1TOR(A,V) ELSE V;99068000
|
|
SAVE 99069000
|
|
WORD PROCEDURE MIKEMONITOR(A,V); VALUE A,V; REAL A; WORD V; 99070000
|
|
MIKEMONITOR~IF CHECKMASK(MIKEBIT) THEN MON1TOR(A,V) ELSE V; 99071000
|
|
SAVE PROCEDURE MEMDUMP(I,J); VALUE I,J; REAL I,J; %ZEROES OK 99100000
|
|
BEGIN 99101000
|
|
REAL 99102000
|
|
UNIT=(0,2), ADRS=(0,6), IOAD=(0,7); 99103000
|
|
ARRAY BFR = (0,5) [*]; 99104000
|
|
BOOLEAN MISSING = (0,8); 99105000
|
|
FIELD ADRF =19:20, SEVEN48 =7:8,SEVEN44 =7:4, RDUNITF =24:8,99106000
|
|
BIT46 =46: 1, FIVE46 =5:6,BIT20 =20:1, MOD32=4:5, 99107000
|
|
PSRF =35: 3, PIRF =32:13,SDIF =13:14, 99108000
|
|
FORTY7444=47:44, THREE44 =3:4, FORTY746 = 47:6, 99109000
|
|
ROT24 = 23:48, ROT42 = 5:48; 99110000
|
|
LAYOUT LOW14(13:14), INDXL (39:20), TAGL (TAG), 99111000
|
|
SIXTEEN48L(16:8), THIRTY1416(31:16),LL (18:5); 99112000
|
|
DEFINE DIDIT = BOOLEAN(UNIT.BIT46)#, 99113000
|
|
NT = TAGS.FIVE46#, B6T = TAGS.FORTY746#, 99114000
|
|
DONE = BOOLEAN(ADRS.BIT20)#, 99115000
|
|
ACTR = CTRS.FORTY7444#, 99116000
|
|
FCTR = CTRS.THREE44#, B=BFR#, 99117000
|
|
PATH(U)= SCANIN(0 & SIXTEEN48L(U ~ U.SEVEN48))#, 99118000
|
|
KIND(U)= SCANIN(192 & SIXTEEN48L(U))#, 99119000
|
|
TILT = STOP(4"93C838E049E4", 4"038038E491C0") #, 99120000
|
|
FIVE = 3#, 99121000
|
|
STATUS(I) = BOOLEAN(SCANIN(32 &(I)[11:7:FIVE])) #, 99122000
|
|
DUMMY = REAL#, 99123000
|
|
INITIATE = SCANOUT #; 99124000
|
|
SAVE PROCEDURE DUMPIT(U,IPCW,SD,BF); VALUE U,IPCW,SD,BF; 99125000
|
|
REAL U; 99126000
|
|
WORD IPCW,SD,BF; 99127000
|
|
BEGIN 99128000
|
|
REAL NEXT = (0,9), TAGS =(0,10), CTRS = (0,11),LAD=(0,12);99129000
|
|
POINTER P4 = (0,13), P6 = (0,14); 99130000
|
|
DUMMY ADR , ADESC ~ BFR.ADRF & INDXL(15), 99131000
|
|
MISSNG~-0, NEXXT, TGS, CNTRS, LASTADRS; 99132000
|
|
POINTER PTR4 ~ POINTER(BFR[16],4), 99133000
|
|
PTR6 ~ POINTER(BFR[1],6); 99134000
|
|
REAL SR := 2 + REGISTERS[52], SREG = (0,15); 99135000
|
|
WORD SVDESCR := M[NAME(BFR[1])], WUNIT = UNIT, SVDESC = (0,16);99135100
|
|
LABEL START, GETAWORD, PAST, ENDADRS, PRINT, FIRST, 99136000
|
|
LOOP, ADDRESS, MISS, AROUND; 99137000
|
|
COMMENT RECORD THE S-REGISTER FOR POSTERITY. CALLER HAS 99138000
|
|
PUT IT IN BFR[16], WHERE P4 POINTS; 99139000
|
|
REPLACE P6:P6 BY (6"*** S = ") FOR 1 OVERWRITE; 99140000
|
|
REPLACE P6 BY (6" ")FOR 14 OVERWRITE; 99141000
|
|
GO TO ADDRESS; 99142000
|
|
START: % START A LINE 99143000
|
|
IF MISSING.BIT46 THEN BEGIN MISSING~FALSE; GO PRINT END; 99144000
|
|
BFR[16] ~ ADRS; 99145000
|
|
AROUND: % CLEAR THE BUFFER, ETC. 99146000
|
|
REPLACE P6 ~ POINTER(BFR[1],6) BY 6" " FOR 15 WORDS; 99147000
|
|
CTRS ~ 0; 99148000
|
|
REPLACE P6:P6 BY P4 + 7 FOR 5 WITH BFR[17]; 99149000
|
|
GETAWORD: % GET ANOTHER WORD--IF IT IS THERE. 99150000
|
|
LAD ~ ADRS; 99151000
|
|
IF MISSING THEN GO TO MISS; 99152000
|
|
IF NOT MISSING ~ DONE THEN 99153000
|
|
BEGIN 99154000
|
|
NEXT ~ M[ADRS] & TAGL(0); REGISTERS[52] ~ SREG; 99155000
|
|
NT ~ M[ADRS].TAG; 99156000
|
|
END; 99157000
|
|
IF CTRS ~ CTRS + 16 } 32 THEN % ACTR ~ ACTR + 1 > 1 99158000
|
|
IF MISSING THEN GO PAST ELSE 99159000
|
|
BEGIN 99160000
|
|
IF B[16] IS NEXT THEN 99161000
|
|
IF B6T = NT THEN GO TO LOOP; 99162000
|
|
PAST: 99163000
|
|
IF CTRS } 111 THEN GO TO ENDADRS; % ACTR > 7 99164000
|
|
REPLACE P6:P6 BY P6-16 FOR CTRS - 33;%(ACTR-2)|16 99165000
|
|
CTRS ~ACTR; % FCTR ~ ACTR; ACTR ~ 0 99166000
|
|
IF MISSING THEN GO PRINT; 99167000
|
|
GO TO FIRST; 99168000
|
|
END; 99169000
|
|
IF CTRS = 16 THEN % FIRST WORD OF LINE 99170000
|
|
IF NOT MISSING THEN GO TO FIRST ELSE 99171000
|
|
BEGIN 99172000
|
|
LAD := ADRS; 99172100
|
|
MISS: MISSING ~ FALSE; 99173000
|
|
REPLACE P6 + 12 BY 6"MISSING." FOR 8; 99174000
|
|
ENDADRS: 99175000
|
|
B[16] ~ LAD - 1; 99176000
|
|
REPLACE P6:P6 BY 6" THRU .." FOR 6; 99177000
|
|
ADDRESS: 99178000
|
|
REPLACE P6 BY P4 + 7 FOR 5 WITH BFR[17]; 99179000
|
|
PRINT: 99180000
|
|
WHILE NOT BOOLEAN(TAGS ~ PATH(UNIT)) DO ALLOW; 99181000
|
|
DISALLOW; 99182000
|
|
INITIATE(IOAD,TAGS); DO PAUSE UNTIL DIDIT; 99183000
|
|
IF MISSING THEN BEGIN B[16] ~ LAD; GO AROUND END; 99184000
|
|
IF DONE THEN BEGIN WUNIT := SVDESC; EXIT END; 99185000
|
|
GO START; 99186000
|
|
END; 99187000
|
|
IF MISSING THEN GO PRINT; 99188000
|
|
CTRS ~ FCTR; % ACTR ~ 0 99189000
|
|
FIRST: 99190000
|
|
BFR[16] ~ NEXT; 99191000
|
|
REPLACE P6 + 1 BY TAGS ~ TAGS.ROT42 FOR 1; 99192000
|
|
REPLACE P6 + 3 BY P4 FOR 6 WITH B[17]; 99193000
|
|
REPLACE P6:P6+10 BY P4+6 FOR 6 WITH B[17]; 99194000
|
|
CTRS ~ CTRS + 1; 99195000
|
|
LOOP: ADRS ~ ADRS + 1; 99196000
|
|
IF FCTR { 7 THEN GO GETAWORD; 99197000
|
|
GO PRINT; 99198000
|
|
END DUMPIT; 99199000
|
|
SAVE PROCEDURE SPACEATER; % THIS BECOMES THE BUFFER:21 WORDS. 99200000
|
|
BEGIN DOUBLE I; I ~ 1@@20 * I * 13END; 99201000
|
|
SAVE PROCEDURE DUMPINT; % THE INTERRUPT PROCEDURE. 99202000
|
|
BEGIN 99203000
|
|
REAL P1=(1,2), P2=(1,3), PW=(0,10), S1~FIRSTONE(P1), 99204000
|
|
I =(1,4); WORD WP2 = P2; 99205000
|
|
LABEL STOPP, DID, INIT; 99206000
|
|
WORD RCW = (1,1); 99207000
|
|
LAYOUT PIRL(32:13), PSRL(PSRF); 99208000
|
|
FIELD NOTREADY = 3:1; 99209000
|
|
BOOLEAN RD = I; 99210000
|
|
IF I = 26 THEN % ALARUM 99211000
|
|
IF FIRSTONE(P1.ADRF) ! 4 THEN GO STOPP ELSE % INV ADDR 99212000
|
|
BEGIN 99213000
|
|
MISSING ~ TRUE; 99214000
|
|
WP2 ~ SET(SET(REGISTERS[38]-1,47),45) & TAGL(5); 99215000
|
|
P2 ~ ADRS ~ ADRS & LOW14(0) + 16384; 99216000
|
|
RCW ~ IF I ~ RCW.PSRF < 2 THEN 99217000
|
|
SET(RCW & PIRL(RCW.PIRF - 1), 35) ELSE 99218000
|
|
RCW & PSRL(I - 2); 99219000
|
|
END INV ADDR ELSE 99220000
|
|
IF I ! 23 THEN 99221000
|
|
IF I ! 21 THEN BEGIN STOPP: TILT; GO STOPP END ELSE 99222000
|
|
IF (I ~ SCANIN(P2 - 4"1A0")).RDUNITF = UNIT THEN 99223000
|
|
IF RD THEN 99224000
|
|
IF RD.NOTREADY THEN GO INIT ELSE 99225000
|
|
IF BOOLEAN (BFR[0] ~ M[IOAD].ROT24) THEN 99226000
|
|
INIT: INITIATE(IOAD, PW) ELSE 99227000
|
|
GO DID ELSE 99228000
|
|
DID: 99229000
|
|
UNIT ~ -UNIT; % DIDIT ~ TRUE 99230000
|
|
END; 99231000
|
|
WORD SPCW = SPACEATER, IPCW = DUMPINT, DPCW= DUMPIT, 99232000
|
|
SVDESC = (0,2), 99232100
|
|
SD ~ M[SPCW.SDIF& TAGL(1)], 99233000
|
|
STUFF ~ SET(SPCW.PIRF + 1 + SD.ADRF,47) & TAGL(5) 99234000
|
|
& INDXL(24); 99235000
|
|
WORD ARRAY A = STUFF [*]; 99236000
|
|
LABEL BACK; 99237000
|
|
BACK: 99238000
|
|
I ~(I + 1).SEVEN48; 99239000
|
|
IF SET(KIND(I),0) ! 7 THEN GO BACK; 99240000
|
|
IF NOT STATUS[ I ].[I.MOD32 + 1:1] THEN GO BACK; 99241000
|
|
A[0]~SET(SET(SET(SET(129,18),32),43),45); 99242000
|
|
A[1] := SVDESC; 99242100
|
|
A[16] ~ SET(SET(SET(SET(A[17] ~ SET(4"203",16),26),18),10),2); 99243000
|
|
A[19] ~ 4"1112" & THIRTY1416(4"0809"); 99244000
|
|
A[20] ~ 4"1516" & THIRTY1416(4"1314"); 99245000
|
|
A[16] ~ REGISTERS[38] - 1; 99246000
|
|
DPCW := DPCW & LL(0) & LOW14(4); 99247000
|
|
DUMPIT(I,IPCW& LL(1) & LOW14(4),SD,STUFF); 99248000
|
|
EXIT;% IN ORDER NOT TO CALL BLOCKEXIT 99249000
|
|
END MEMDUMP; 99250000
|
|
D03 := INITIALIZEPCW; 99970000
|
|
INITIALIZE(@4000011,PROCSTACKSTARTW); 99980000
|
|
END. 99999998
|
|
99999999140821PK
|