!************************
!* COMMS *
!* TT BUFFER *
!* DATE: 09.JAN.80 *
!* IMP77 VSN:24.OCT.80 *
!* time prefix added *
!* 13/12/83 *
!************************
!
!prep option:
!k : time option for kent
CONSTSTRING (7) VSN = "VSN01C"
CONTROL K'100401' ;!JB
#if k
externalroutinespec alarm(integer ticks)
#fi
EXTERNALROUTINESPEC MAP VIRT(INTEGER SER,SEG1,SEG2) ;!JB
EXTERNALROUTINESPEC LINKIN(INTEGER SER) ;!JB
EXTERNALROUTINESPEC MAPHWR(INTEGER SEG);!JB
BEGIN
RECORDFORMAT PF(BYTEINTEGER SER, REPLY, INTEGER A, B, C)
RECORDFORMAT P2F(BYTEINTEGER SER, REPLY, INTEGER A, C
BYTEINTEGERNAME B, INTEGER C)
EXTERNALROUTINESPEC POFF(RECORD (PF)NAME P) ;!JB
EXTERNALROUTINESPEC PON(RECORD (PF)NAME P) ;!JB
CONSTBYTEINTEGERNAME ID == K'160030' ;!JB
CONSTINTEGER TT HANDLER = 1
CONSTINTEGER T3SER = 21
CONSTBYTEINTEGERNAME INT == K'160060' ;!JB
CONSTINTEGER EOT = 4
RECORD (PF)P
RECORD (P2F) NAME P2
CONSTINTEGER MYSEG = 5, MYSEGA = K'120000'
OWNINTEGER ON, OFF, UP TO, TT STATE, QUIET
INTEGER I, SEG, REPLY, LEN, N, TEMP
RECORDFORMAT BUFF(BYTEINTEGERARRAYNAME B)
RECORDFORMAT BUXF(INTEGER ARRAY PT)
RECORD (BUFF)BUF
RECORD (BUXF) NAME BUX
#if k
ownbyteintegerarray time(0:5)='*','*',':','*','*',' '
owninteger mincount=-1; !undefined
owninteger hrcount
#fi
CONSTINTEGER END = 1023
OWNBYTEINTEGERARRAY HOLD(0:END)
#if k
routine setup time(integer h,m)
time(0)=h//10+'0'
time(1)=h-h//10*10+'0'
time(3)=m//10+'0'
time(4)=m-m//10*10+'0'
end
routine settime
hrcount=p_b//60
mincount=p_b-60*hrcount
setup time(hrcount, mincount)
end
#fi
routine put(byteintegerarrayname b, integer len)
integer TEMP,I
IF (ON+1)&END # OFF AND QUIET=0 START
FOR I = 0, 1, len-1 CYCLE ;!JB
HOLD(ON) = b(I)
TEMP = ON
ON = (ON+1)&END
IF (ON+1)&END = OFF START
HOLD((ON-2)&END) = '@'; HOLD(TEMP) =NL
EXIT
FINISH
REPEAT
FINISH
end
#if k
alarm(50*60); !every minute
#fi
BUX == BUF; P2 == P
LINKIN(T3SER)
CYCLE
P_SER = 0
POFF(P)
REPLY = P_REPLY
IF INT # 0 START
IF INT = 'Q' THEN QUIET = 1 ELSE QUIET = 0
FINISH
if P_REPLY=0 start ; !clock int
#if k
if mincount>=0 start ; !time valid
mincount=mincount+1;
if mincount>=60 start
mincount=0
hrcount=hrcount+1
if hrcount>=24 then hrcount=0
finish
setup time(hrcount, mincount)
finish
ALARM(50*60)
#fi
CONTINUE
finish
IF P_SER = ID START ; ! TT REPLY
TT STATE = 0
OFF = (UP TO)&END
IF ON # OFF START
DO OUT: IF OFF > ON THEN UP TO = END+1 ELSE UP TO = ON
! ONLY TO END OF CIRC BUFF
P_SER = TT HANDLER; P_REPLY = ID
P_A = 1; P2_B == HOLD(OFF); P_C = UP TO-OFF
TT STATE = 1
PON(P)
FINISH
CONTINUE
FINISH
#if k
!see if a call to set the time
if P_A=-1 then settime and continue
#fi
SEG = P_B >> 13
MAP VIRT(REPLY, SEG, MYSEG)
BUX_ARRAYPT = MYSEGA+(P_B&K'17777')
LEN = P_C
#if k
put(time, 6)
#fi
put(BUF_B, LEN)
MAP VIRT(0, -1, MY SEG)
P_SER = REPLY; P_REPLY = T3SER
P_A = 0
PON(P)
IF TTSTATE = 0 THEN -> DO OUT
REPEAT
ENDOFPROGRAM