!*************************** !* SIN010 * !* DATE: 14.JUN.82 * !* SUPERVISOR INITIALISER * !* SUPERVISOR RELEASE 10 * !*************************** %CONTROL K'100001'; ! MUL+TRUSTED %PERMROUTINESPEC SVC %PERMINTEGERMAPSPEC INTEGER(%INTEGER X); ! USED IN INIT %RECORDFORMAT DUMMY(%INTEGER X) %CONSTRECORD (DUMMY) %NAME NULL=0 %CONSTINTEGER TASK LOW LIMIT=30 %CONSTINTEGER TASK USER LIMIT = 35 %CONSTINTEGER TASK LIMIT=75 %CONSTINTEGER FREE CELLS=80 %CONSTINTEGER NO OF SERVICES=50 %CONSTINTEGER FRAG NO=15 %CONSTINTEGER PSECT LENGTH=52 %CONSTINTEGER SVC LIMIT=23 %CONSTINTEGER INT LIMIT=-90 %CONSTINTEGER K SEG LIMIT=125 %CONSTINTEGERNAME MAX CORE PT = K'40'; ! ACTUAL LOC'N OF PTR %CONSTINTEGER HIGHEST PRIORITY = 3 %CONSTINTEGER TTID=30; ! TASK LO LIMIT %CONSTINTEGER DKID=31; ! " " " +1 %CONSTINTEGER DIRID=32; ! " " " +2 %CONSTINTEGER LOADID=33; ! " " " +2 %CONSTINTEGER CLI=34; ! " " " +3 %CONSTINTEGER MOTHER=35; ! " " " +4 %CONSTINTEGERNAME PS=K'177776'; ! STATUS WORD %CONSTINTEGERNAME STACK LIMIT=K'177774' %RECORDFORMAT EF(%RECORD (EF) %NAME LINK, %INTEGER ID, A1) %RECORDFORMAT QF(%RECORD (EF) %NAME E) %RECORDFORMAT TF(%RECORD (TF) %NAME LINK, %INTEGER ID, T) %RECORDFORMAT KSEGF(%INTEGER USE, DADD, PAR, PDR) %RECORDFORMAT KSEGLF(%RECORD (KSEGLF) %NAME L, %INTEGER B, C, D) %RECORDFORMAT UREGSF(%INTEGER R0, R1, R2, R3, R4, R5, PC, %C PS, SP) %RECORDFORMAT SEGF(%INTEGER PAR, PDR, %RECORD (KSEGF) %NAME KSL, %C %INTEGER USE) %RECORDFORMAT PSECTF(%RECORD (QF)%NAME E,%BYTEINTEGER ID, STATE, %C %BYTEINTEGERARRAY NAME(0:3), %C %BYTEINTEGER PRIO, %RECORD (QF) POFFQ, %C %RECORD (UREGSF) URS, %INTEGER TRAPV, %C %RECORD (SEGF) %ARRAY SEG(0:8)) %RECORDFORMAT PSTF(%RECORD (PSECTF) %NAME P) %RECORDFORMAT PF(%BYTEINTEGER SERVICE, REPLY, %C %INTEGER A1, A2, A3) %RECORDFORMAT P2F(%INTEGER D, A1, A2, A3) %RECORDFORMAT MAINPF(%RECORD (MAINPF) %NAME L, %RECORD (P2F) P) %RECORDFORMAT STOREF(%INTEGER LEN, BLOCK NO) %RECORDFORMAT ADDRFN(%RECORD (ADDRFN) %NAME PSECTA, LAST32, COREA, %C %INTEGER CORE) %CONSTRECORD (ADDRFN) %NAME ADDS=K'130' %RECORDFORMAT D1F(%INTEGER X) %RECORDFORMAT D2F(%RECORD (QF) %NAME X) %EXTERNALRECORD (KSEGLF) %NAMESPEC FREE SEGL %EXTERNALRECORD (QF) %ARRAYSPEC CPUQ(0:HIGHEST PRIORITY) !* %EXTERNALRECORD (PSTF) %ARRAYSPEC PSECTA(TASK LOW LIMIT:TASK LIMIT) %EXTERNALRECORD (TF) %ARRAYSPEC ONTMQ(TASK LOW LIMIT:TASK LIMIT) %EXTERNALRECORD (MAINPF) %ARRAYSPEC PARAMS(0:FREE CELLS) %EXTERNALRECORD (STOREF) %ARRAYSPEC STORE(0:FRAG NO) %EXTERNALRECORD (KSEGLF) %ARRAYSPEC KSEGL(1:K SEG LIMIT) ! %EXTERNALRECORD (P2F) %ARRAYSPEC LAST THIRTY2(0:15) %EXTERNALBYTEINTEGERARRAYSPEC SER MAP(INT LIMIT:NO OF SERVICES) %EXTERNALROUTINE INITIALISE %ROUTINESPEC PNT(%INTEGER I) %ROUTINESPEC FILL SEG(%RECORD (SEGF) %NAME SEG, %C %RECORD (KSEGF) %NAME KS, %INTEGER PAR, PDR) !* %ROUTINESPEC PUSH(%RECORD (QF) %NAME Q, %RECORD (EF) %NAME E) !*********************************************** !* SUPERVISOR STATES * !*********************************************** %CONSTINTEGER IDLE ST=-1 %CONSTINTEGER TASK ST=0 !********************************************** !* TASK STATES * !********************************************** %CONSTINTEGER T WAIT=1 %CONSTINTEGER T POFF=2 %CONSTBYTEINTEGER T CPUQ=8 %CONSTBYTEINTEGER T RUN=16 %CONSTBYTEINTEGER T SUSP=K'200' !************************************************ !* STATIC CORE LOCATIONS * !************************************************ %CONSTINTEGERNAME INT VALUE=K'40' %CONSTINTEGERNAME ALARM F=K'44' %CONSTINTEGERNAME PSECT AREA=K'50' %CONSTINTEGERNAME FAULT TYPE=K'52' %CONSTRECORD (PSTF) %NAME LAST PSECT = K'54' %CONSTINTEGERNAME EXTRA INT INFO = K'56' !************************************************* %OWNINTEGERARRAY PRESET(0:311)= %C 0(2),M'TT',M'00',1,0,0(6),K'20012',K'140000',K'120200',0,0(36), 0(2),M'ID',M'CS',3,0,0(6),K'20012',K'140000',K'120200',0,0(36), 0(2),M'ID',M'TR',3,0,0(6),K'20012',K'140000',K'120200',0,0(36), 0(2),M'OL',M'DA',1,0,0(6),K'20010',K'140000',K'120300',0,0(36), 0(2),M'LC',M' I',1,0,0(6),K'20010',K'140000',K'120200',0,0(36), 0(2),M'OM',M'HT',3,0,0(6),K'20010',K'140000',K'120200',0,0(36) !*************************************************** %RECORD (PSECTF) %NAME PSECT %RECORD (KSEGF) %NAME KS1 %EXTERNALRECORD(QF) %NAMESPEC FREE PARAM %CONSTINTEGERNAME FTRAP = 4, F FLAG = K'60110' %CONSTINTEGERNAME FP = K'120000' %INTEGER SFTP %ROUTINE PUSH(%RECORD (QF) %NAME Q, %RECORD (EF) %NAME E) %IF Q_E==NULL %THEN E_LINK==E %ELSESTART E_LINK==Q_E_LINK Q_E_LINK==E %FINISH Q_E==E %END %RECORDFORMAT SF(%INTEGERARRAY SEG(0:7)) %CONSTRECORD (SF) %NAME K PAR=K'172340' %CONSTRECORD (SF) %NAME K PDR=K'172300' %CONSTRECORD (SF) %NAME U PAR=K'177640' %CONSTRECORD (SF) %NAME U PDR=K'177600' %CONSTINTEGERNAME SR0=K'177572' %CONSTINTEGERNAME SR2=K'177576' %CONSTINTEGERNAME CLOCK V=K'177546' %RECORDFORMAT DEDLOC F(%INTEGERARRAY D(0:4)) %CONSTRECORD (DEDLOCF) %NAME DEDLOC=K'60000' %RECORDFORMAT SAVEAF(%INTEGERARRAY A(0:20)) %CONSTRECORD (SAVEAF) %NAME S60120 = K'060120' %CONSTRECORD (SAVEAF) %NAME S400 = K'000400' %INTEGER I, PT, BASE, TOP CORE, ID, TOP, PERM, PERML, STK, TC %INTEGER KST, STKL, CHAR, IOSEG, MAX CORE %RECORDFORMAT D1F(%INTEGERNAME X) %RECORDFORMAT D2F(%RECORD (QF) %NAME X) %RECORD (D1F) %NAME D1 %RECORD (D2F) D2 MAX CORE = MAX CORE PT; ! PICK UP AMOUNT OF CORE %CYCLE I=0, 1, 7 K PAR_SEG(I)=I<<7; K PDR_SEG(I)=K'77406' %REPEAT K PAR_SEG(7)=K'7600'; ! MAP TO HARDWARE VECTORS SR0=1; ! GET IT GOING PS=K'340'; ! ENSUE UNINTERRUPTABLE CLOCKV=K'100' !! STACK LIMIT=K'400' D1==D2 KST=2 ALARM F=0 %FOR I=TASK LOW LIMIT, 1, TASK LIMIT %CYCLE ONTMQ(I)_ID=I %REPEAT ID=TASK LOW LIMIT PERM=DEDLOC_D(3)>>6; ! PICKUP ADDR OF PERM TOP=DEDLOC_D(5)>>6 PERML=((TOP-PERM-1)<<8)&K'177400'!2; ! READ ONLY TOP CORE=DEDLOC_D(0); TC=TOP CORE %CYCLE I=K'100000', 2, K'137336' INTEGER(I)=0 %REPEAT PSECT AREA=TOP CORE TOP CORE=TOP CORE+(TASK LIMIT-TASK USER LIMIT)*PSECT LENGTH*2 I=5 %CYCLE %EXITIF DEDLOC_D(I)=TC D1_X==PRESET(PT) PSECTA(ID)_P==D2_X PSECT==D2_X PSECT_ID=ID PT=PT+PSECT LENGTH BASE=DEDLOC_D(I)>>6 STK=DEDLOC_D(I+1)>>6 TOP=DEDLOC_D(I+2)>>6 FILL SEG(PSECT_SEG(2), KSEGL(KST), BASE, (STK-BASE-1)<<8!6) KST = KST+1; ! FILL IN CODE ADDRESS FILL SEG(PSECT_SEG(6), KSEGL(KST), STK, (TOP-STK-1)<<8!6) KST = KST+1; ! FILL IN STACK AREA PSECT_SEG(7)_PAR=K'7600' PSECT_SEG(7)_PDR=K'77406' SER MAP(ID)=ID PSECT_SEG(1)_PAR=PERM; PSECT_SEG(1)_PDR=PERML PSECT_SEG(1)_KSL==KSEGL(1) PSECT_URS_R1=K'140000'; ! VIRT ADD OF TOP OF STK PSECT_URS_SP=K'140000'+(TOP-STK)<<6 %IF LOADID <=ID<=MOTHER %START %IF ID=LOADID %THEN IOSEG=K'1400' %AND CHAR=X'0A41' %ELSEC IOSEG=K'200' %AND CHAR=X'000A' FILL SEG(PSECT_SEG(7), KSEGL(KST), %C TOP CORE>>6, (IOSEG-K'100')<<2!6); ! FILL IN I/O SEG TOP CORE=TOP CORE+IOSEG; KST=KST+1 PSECT_URS_R2=2; ! INDICATE LOADER TO PERM PSECT_URS_R4 = X'0100'; ! AND USE MAIN TT INTEGER(STK<<6+K'10')=CHAR; ! A,NL PSECT_URS_R0=K'140010'; ! POINTS TO ABOVE %FINISH !! ROUTINE SCHEDULR PUT IN LINE PSECT_STATE=(PSECT_STATE&T SUSP)!T CPUQ PUSH(CPUQ(PSECT_PRIO), PSECT) !! END OF ROPUTINE SCHEDULE I=I+2; ID=ID+1 %REPEAT !! THE NEXT SECTION DETERMINS THE TOP OF STORE SFTP = FTRAP; ! REMEMBER THE ADDRESS ERROR TRAP ADDR FTRAP = K'60100'; ! SET IT TO INTERRUPT TO 060100 F FLAG = 1; I=K'1000'; ! F FLAG IS ADDRESS FAULT FLAG %CYCLE KPAR_SEG(5) = I %IF FP # 0 %THEN PT = 0; ! ACCESS IT (1 WORD INSTR) %EXIT %IF F FLAG = 0; ! TRAPPED OUT I = I+K'200'; ! NEXT 4K %REPEAT MAX CORE = I ADDS_CORE = I FTRAP = SFTP; ! RESTORE ADDRESS ERROR TRAP I=TOP CORE>>6 STORE(0)_BLOCK NO=I STORE(0)_LEN=MAX CORE-I ADDS_PSECTA==PSECTA(TASK LOW LIMIT) ! ADDS_LAST32==LAST THIRTY2(0) ADDS_COREA==STORE(0) PARAMS(I)_L==PARAMS(I+1) %FOR I=0, 1, FREE CELLS-1 FREE PARAM==PARAMS(0) %CYCLE I=KST, 1, K SEG LIMIT-1 KSEGL(I)=0 KSEGL(I)_L==KSEGL(I+1) %REPEAT FREE SEGL==KSEGL(KST) KS1==KSEGL(1) KS1_PAR=PERM; KS1_PDR=PERML KS1_USE = 100 K PDR_SEG(I)=0 %FOR I=4, 1, 6 PNT(13); PNT(NL) PNT('D'); PNT('E'); PNT('I'); PNT('M'); PNT('O'); PNT('S') PNT(' '); PNT('V'); PNT('S'); PNT('N'); PNT(' ') PNT('9'); PNT(13); PNT(NL); PNT(NL) S400 = S60120; ! COPY AREA OF STORE FROM 60120 TO 400 %ROUTINE PNT(%INTEGER I) %CONSTINTEGERNAME TTS = K'177564' %CONSTINTEGERNAME TTD = K'177566' TTD = I %WHILE TTS&K'200' = 0 %CYCLE; %REPEAT %END %ROUTINE FILL SEG(%RECORD (SEGF) %NAME SEG, %RECORD (KSEGF) %NAME KS, %C %INTEGER PAR, PDR) SEG_PAR=PAR; SEG_PDR=PDR; SEG_KSL==KS KS_USE=1 KS_PAR=PAR; KS_PDR=PDR KS_DADD=0 %END %END %ENDOFFILE