! !THE TIME TASK ! !W.S.C. 27TH JULY 1976 ! !V006 ! !LAST UPDATED 12TH MAY 1977 09:40 ! !THIS TASK IS THE TIMING MECHANISM FOR THE STIMULATOR.IT GETS !A CLOCK MESSAGE EVERY CTICS CLOCK TICKS AND MAINTAINS A LIST OF !TASK REQUESTS FOR STIMULI.THESE ARE PASSED TO IT BY A PON !WITH P_A1 THE NUMBER OF TICKS AND P_A3 A PARAMETER TO BE !PASSED BACK TO THE CALLING TASK. !IF P_A1<0 THIS IS TAKEN AS A REQUEST FOR A TIME STAMP !IT SENDS BACK MINS IN P_A1,10TH SECS IN P_A2 AND LEAVES P_A3 !AS IT WAS. ! !THIS TASK RUNS IN SLOT 28 ! !SET STACK TO 140,STREAMS=0 ! %BEGIN %SYSTEMROUTINESPEC ALARM(%INTEGER TICKS) %PERMROUTINESPEC SVC(%INTEGER EP,P1,P2) %RECORDFORMAT PF(%BYTEINTEGER SERVICE,REPLY,%INTEGER %C A1,A2,A3) %OWNRECORD(PF) P %OWNINTEGER I,TENS,SECS,MINS %RECORDFORMAT TIK(%INTEGER TICKS,TID,PARA3) %CONSTINTEGER ARSIZE=32; !SIZE OF RECORD ARRAY %CONSTINTEGER INIT SER=29; !INITIALISE SERVICE %CONSTINTEGER SYSLOT=28; !SYSTEM SLOT FOR TIME %CONSTINTEGER LINKIN=13; !LINKIN SVC NUMBER %CONSTINTEGER CTICS=5; !NUMBER OF TICKS BETWEEN KICKS %OWNINTEGER I1=1; !FOR CYCLIC ARRAY SEARCH %OWNRECORD(TIK)%ARRAY TOCKS(1:ARSIZE) %ROUTINE KICK(%INTEGER X) ! !TO KICK A TASK ! P_SERVICE=TOCKS(X)_TID P_REPLY=SYSLOT P_A3=TOCKS(X)_PARA3 PON(P) TOCKS(X)_TICKS=0; !CLEAR TABLE ENTRY %END SVC(LINKIN,SYSLOT,0) !SVC(18,2,0); ! SET PRIORITY TO 2 %CYCLE I=1,1,ARSIZE TOCKS(I)_TICKS=0 %REPEAT TENS=0 SECS=0;MINS=0 !ASK FOR CLOCK STIMULUS ALARM(CTICS) %CYCLE P_SERVICE=0 POFF(P) !MESSAGE ARRIVES !IF P_REPLY=0 THEN IT IS THE CLOCK %IF P_REPLY=0 %THEN %START ! !CLOCK TICK-EXAMINE TICKS COUNT IN RECORD ARRAY TOCKS ! ALARM(CTICS) TENS=TENS+1 %IF TENS=(50//CTICS) %START SECS=SECS+1;TENS=0 %IF SECS=60 %START SECS=0;MINS=MINS+1 %FINISH %FINISH %IF TENS=0 %OR TENS=5 %START %CYCLE I=1,1,ARSIZE %IF TOCKS(I)_TICKS#0 %START TOCKS(I)_TICKS=TOCKS(I)_TICKS-(CTICS*5) %IF TOCKS(I)_TICKS<=0 %THEN KICK(I) %FINISH %REPEAT %FINISH %FINISH %ELSE %START ! !NOT A CLOCK TICK - MUST BE A REQUEST FOR SERVICE !FROM A TASK.FIND A FREE SLOT IN TABLE ! %IF P_A1<0 %START ! !REQUEST FOR TIME STAMP ! P_SERVICE=P_REPLY P_REPLY=SYSLOT P_A1=(MINS*60)+SECS P_A2=TENS PON(P) ->OUT %FINISH %CYCLE I=1,1,ARSIZE %IF TOCKS(I1)_TICKS=0 %THEN %START TOCKS(I1)_TICKS=P_A1 TOCKS(I1)_TID=P_REPLY TOCKS(I1)_PARA3=P_A3 %IF P_A1