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