! PROGRAMMABLE CLOCK PROGRAM ! DATE: 5.MAR.81 %CONTROL K'100001' %PERMROUTINESPEC SVC(%INTEGER EP, R0, R1) %PERMINTEGERMAPSPEC INTEGER %PERMBYTEINTEGERMAPSPEC BYTEINTEGER %PERMINTEGERFNSPEC ADDR %PERMINTEGERFNSPEC ACC %BEGIN %SYSTEMROUTINESPEC MAPHWR(%INTEGER SEG) %SYSTEMROUTINESPEC LINKIN(%INTEGER NO) %CONSTBYTEINTEGERNAME INT = K'160060' %RECORDFORMAT CLOCKF(%INTEGER STATUS, DATA) %CONSTRECORD (CLOCKF) %NAME CLOCK = K'112540'; ! IN SEG 4 %RECORDFORMAT PF(%BYTEINTEGER SER, REPLY, %INTEGER A, B, C) %RECORD (PF) P %INTEGER I,J,K,N, SUM, MAXI, SUMN %OWNINTEGER REPF %INTEGERARRAY TASKS(0:150) %ROUTINE PRINT NAME(%INTEGER TASK) %CONSTINTEGER MAP PSECT = 16; ! SUPERVISOR CALL TO MAP TO PSECT %RECORDFORMAT PSECTF(%BYTEINTEGER X, Y, ID, STATE, %BYTEINTEGERARRAY %C NAME(0:3), %BYTEINTEGER PRIO, %INTEGER POFFQ, %C %INTEGERARRAY R(0:8), %C %INTEGER TRPV, %RECORD (SEGF) %ARRAY SEG(0:7)) ! NB: R(0-8) ARE R0, R1, R2, R3, R4, R5, PC, PS, SP %RECORD (PSECTF) %NAME P %RECORDFORMAT D1F(%INTEGER X) %RECORDFORMAT D3F(%RECORD (PSECTF) %NAME P) %RECORD (D1F)D1 %RECORD (D3F) %NAME D3 %INTEGER PST, I D3 == D1 SVC(MAP PSECT, TASK, 5) PST = ACC D1_X = PST P == D3_P PRINTSYMBOL(P_NAME(I)) %FOR I = 0, 1, 3 %END MAP HWR(4) LINKIN(-10) CLOCK_DATA = 23210; ! INT EVERY 2.321 SECS CLOCK_STATUS = K'113'; ! COUNT DOWN, REPEATED, 10KHZ, RUN, INT %CYCLE P_SER = 0; POFF(P) %IF P_SER&X'80' # 0 %START I = P_C&X'FF'; ! TASK ID TASKS(I) = TASKS(I)+1 N = N+1 %IF REPF # 0 %AND N = 375 %THEN INT = '?' %UNLESS 0<=I<=150 %START PRINTSTRING("FUNNY TASK:"); WRITE(I, 1); NEWLINE %FINISH %FINISH %IF INT = 'S' %THEN CLOCK_STATUS = 0 %AND %STOP %IF INT = '?' %START WRITE(N, 1); NEWLINE SUM = 0; MAXI = 0 %CYCLE I = 30, 1, 75 J = TASKS(I) SUM = SUM+J %IF J > TASKS(MAXI) %THEN MAXI = I %IF J < 0 %THEN MAXI = I %REPEAT SUMN = SUM-TASKS(MAXI); ! ASSUMED TO BE IDLE %CYCLE I = 0, 1, 75 %IF TASKS(I) # 0 %START PRINT NAME(I) WRITE(TASKS(I), 5) WRITE(TASKS(I)*100)//SUM, 5); PRINTSYMBOL('%') WRITE((TASKS(I)*100)//SUMN, 5); PRINTSTRING("% ") %FINISH %REPEAT INT = 0 %FINISH %IF INT = 'R' %START REPF = REPF!!1 INT = 0; N = 0 %FINISH %IF INT = 'C' %OR REPF # 0 %START TASKS(I) = 0 %FOR I = 0, 1, 75 INT = 0 %FINISH %REPEAT %ENDOFPROGRAM