!THE INITIALISE TASK "INIT"   - FOR EMAS 2980.
!E.R.T.E. MK.6 VERSION  -  VIA DUP11S

!   W.S.C.   27TH JULY 1976
!   J.C.A.   31ST JAN 1978
!   G.J.B.   19TH SEPT 1978
!   J.C.A.   27TH SEPT 1978
!   B.G.   25.JAN.80


!   ???   LAST UPDATE 21:12:78   - FILE INIT70

! THIS VERSION IS FOR USE WITH ICL VME/B


!THE TASK RUNS IN SYSTEM SLOT 29

!SET STACK TO 140   STREAMS=0   PRIORITY=1

%CONTROL K'101011'
%BEGIN

%OWNSTRING(19) ERTE1='E.R.T.E. mk. 6.1   '
%OWNSTRING(16) TARGETNOW='* to IBM 3270 PROTOCOL
%OWNSTRING(16) VERSION='   BG 10.JUNE.80'

%SYSTEMROUTINESPEC ALARM(%INTEGER TICKS)
%PERMROUTINESPEC SVC(%INTEGER EP,P1,P2)
%SYSTEMROUTINESPEC LINKIN(%INTEGER SER)
%RECORDFORMAT PF(%BYTEINTEGER SERVICE,REPLY,%INTEGER A1,%C
  %BYTEINTEGERARRAYNAME A2,%INTEGER A3)
%OWNRECORD (PF) P

        %RECORDFORMAT P2F(%BYTEINTEGER SER, REPLY, LINE, %C
          LINE TYPE, %INTEGER AD, %BYTEINTEGER RX INT, TXINT)

        %OWNRECORD (P2F) P2
        %OWNRECORD (P2F) %NAME P3

%OWNINTEGER TSKCT,TSK SER,TASKS,I,TASK ID
%CONSTBYTEINTEGERNAME ID=K'160030'
%CONSTBYTEINTEGERNAME FSYS = K'160055'
%CONSTBYTEINTEGERNAME TT NO = K'160061'
%CONSTBYTEINTEGERARRAY TIME(0:5)='T','I','M','E','O',NL
%OWNBYTEINTEGERARRAY TASK(0:11)=%C
  'T','S','K','1',' ','T','K','P','A','R','1',NL
%OWNBYTEINTEGERARRAY CU32(0:11)=%C
'C','U','3','2','2', 'Y',' ','/','.','L','P',NL
%CONSTBYTEINTEGERARRAY LOGT(0:4)= %C
'L','O','G','Y',NL

%CONSTBYTEINTEGERARRAY PROT(0:10)=%C
'I','B','M','1','Y',' ','/','.','T','T',NL
%CONSTBYTEINTEGERARRAY CPUT(0:5)=%C
   'C','P','U','T','Y',NL
%ROUTINESPEC CALL LOADER(%BYTEINTEGERARRAYNAME S)
%CONSTINTEGER LOAD SER=5;  !LOAD SERVICE NUMBER
%CONSTINTEGER TIME SER=28;  !STIMULATOR TIME SERVICE NUMBER
%CONSTINTEGER CU32 SER=27;  !CU32 SERVICE NUMBER
!%CONSTINTEGER LINKIN=13;  !LINKIN SVC NUMBER
%CONSTINTEGER SYSLOT=29;  !SYSTEM SLOT NUMBER FOR INIT
%CONSTBYTEINTEGERNAME INT=K'160060'
%CONSTINTEGER PAUSE TICKS=100;          !2 SECONDS

!NETWORK INFO TO BE SENT TO CU32
!CONTAINS:
!   ERTE ADDRESS,
!   TARGET ADDRESS,
!   TARGET NAME LENGTH,
!   TARGET NAME MESSAGE;



!****************************************************************
!****************************************************************


%ROUTINE FATAL

   PRINTSTRING('Fatal Error number')
   WRITE(P_A1,0);SPACES(5)
   PRINTSTRING('Task number')
   WRITE(P_REPLY,0)
   NEWLINE

%END

!*****************************************************************
!*****************************************************************

NEWLINE
   PRINTSTRING(ERTE1)
   PRINTSTRING(TARGETNOW)
   PRINTSTRING(VERSION)
   NEWLINES(2)
LINKIN(SYSLOT)
P3 == P
SVC(18,1,0);         !SET PRIORITY TO 1
! PROMPT('CU32 unit : ')
! READSYMBOL(I)
! CU32(6)=I
! SKIPSYMBOL
!
!LOAD TIME TASK
!
CALL LOADER(TIME)
PRINTSTRING('TIME loaded')
NEWLINE

      CALL LOADER(LOGT)
      PRINTSTRING("LOG loaded
")



        CALL LOADER(CU32)
        PRINTSTRING("CU32 loaded
")

        CALL LOADER(PROT)
        PRINTSTRING("IBM0 loaded
")
        P2_SER = TASK ID; P2_REPLY = ID
        P2_LINE = 0; P2_LINE TYPE = 0; ! LINE 0, TYPE = DU11
        P2_AD = K'760010'&K'077777';  ! DUP11 ADDRESS IN SEG 0
        P2_RX INT = -31; P2_TX INT = -32
        PON(P2)

        NEWLINE
!CALL LOADER(CPUT)
!PRINTSTRING('CPUT loaded')
!NEWLINE


!   READ IN NUMBER OF SCRIPT TASKS

PRINT STRING('Number of tasks : ');   PROMPT('')
READ(TASKS)
!
!LOAD ALL SCRIPT TASKS
!
%IF TASKS=0 %THEN ->WAIT
TSK SER=26
%CYCLE I=1,1,TASKS
TASK(3) = I+'0';      ! CHANGE NAME OF SCRIPT TASK
CALL LOADER(TASK)
PRINTSTRING('Script task')
WRITE(I,1)
PRINTSTRING(' started')
!
!WAIT FOR TASK TO RESPOND
!
WAIT FOR IT:
P_SERVICE=0
POFF(P)
%IF P_A3#-111 %START
   NEWLINE
   PRINTSTRING('Unexpected message')
   TASKS=P_REPLY
   WRITE(TASKS,5)
   WRITE(P_A1,5)
   WRITE(P3_AD, 5)
   WRITE(P_A3,5)
   NEWLINE
  -> WAIT FOR IT
%FINISH
PRINTSTRING(' with')
WRITE(P_A1,0)
PRINTSTRING(' scripts')
NEWLINE
%IF P_A1<0 %THEN FATAL
%REPEAT
TSKCT=0

!   PAUSE FOR A WHILE

PAUSE:
   P_SERVICE=TIMESER
   P_REPLY=ID
   P_A1=PAUSE TICKS
   P_A3=0
   PON(P)

!   WAIT FOR MESSAGES

WAIT:P_SERVICE=0
POFF(P)
   %IF P_REPLY=TIMESER %THEN %START
      %IF INT='A' %THEN TSKCT=TASKS*2 %AND ->HALT
      ->PAUSE
   %FINISH
%IF P_A1<0 %START
    FATAL
  %FINISH %ELSE %START
  PRINTSTRING('Task no.')
  WRITE(P_REPLY,0)
  PRINTSTRING(' terminated')
  NEWLINE
  %FINISH
TSKCT=TSKCT+1
HALT:   INT='G'
%IF TSKCT=TASKS*2 %START
  !N.B. 2 MESSAGES FROM stopped TASK.
  !STOP TIME,CU32 AND SELF
  P_SERVICE=CU32 SER
  P_REPLY=SYSLOT
  PON(P)
P_SERVICE=0;   POFF(P);   !WAIT FOR CU32 AND NSIZ TO STOP
P_SERVICE=0;   POFF(P)
  PRINTSTRING('CU32 stopped');NEWLINE
  P_SERVICE=TIME SER
  P_REPLY=SYSLOT
   P_A3=40
  PON(P)
  P_SERVICE=0
  POFF(P)
  PRINTSTRING('TIME stopped');NEWLINE
  PRINTSTRING('INIT stopped');NEWLINE
  %STOP
  %FINISH
->WAIT

%ROUTINE CALL LOADER(%BYTEINTEGERARRAYNAME S)
      P_SERVICE=LOAD SER;P_REPLY=ID
      P_A1=1!FSYS<<8;P_A3=4!TT NO<<8;P_A2==S
      PONOFF(P)
      %IF P_A1 = 0 %START
         PRINTSTRING("file does not exist
")
         %STOP
      %FINISH
      TASK ID = P_A1;        ! PICK UP THE TASKS ID
%END
%ENDOFPROGRAM
  P_REPLY=SYSLOT