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