!*************************** !* 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