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