!********************
!*  COMMS           *
!*  TT BUFFER       *
!* 21:OCT:77  15.13 *
!********************

CONTROL  K'101011';                    ! 'SYSTEM' PROGRAM (FAST
                                       ! ROUTINE ENTRY/EXIT)
SYSTEMROUTINESPEC  LINKIN(INTEGER  SER)
SYSTEMROUTINESPEC  MAPHWR(INTEGER  SEG)


BEGIN 

     RECORDFORMAT  PF(BYTEINTEGER  SER, REPLY, INTEGER  A, B, C)
     RECORDFORMAT  P2F(BYTEINTEGER  SER, REPLY, INTEGER  A, C 
       BYTEINTEGERNAME  B, INTEGER  C)

     CONSTBYTEINTEGERNAME  ID = K'160030'
     CONSTINTEGER  TT HANDLER = 1
     CONSTINTEGER  T3SER = 21

     CONSTINTEGER  EOT = 4
     RECORD  (PF)P
     RECORD  (P2F) NAME  P2

     CONSTINTEGER  MYSEG = 5, MYSEGA = K'120000'

     OWNINTEGER  ON, OFF, UP TO, TT STATE
     INTEGER  I, SEG, REPLY, LEN, N, TEMP

     RECORDFORMAT  BUFF(BYTEINTEGERARRAYNAME  B)
     RECORDFORMAT  BUXF(INTEGER  ARRAY PT)
     RECORD  (BUFF)BUF
     RECORD  (BUXF) NAME  BUX

     CONSTINTEGER  END = 511
     OWNBYTEINTEGERARRAY  HOLD(0:END)


     BUX == BUF;  P2 == P
     LINKIN(T3SER)
     CYCLE 
        P_SER = 0
        POFF(P)
        REPLY = P_REPLY
        CONTINUEIF  P_REPLY = 0;       ! UNWANTED INTERRUPT
        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 
        SEG = P_B >> 13
        MAP VIRT(REPLY, SEG, MYSEG)
        BUX_ARRAYPT = MYSEGA+(P_B&K'17777')
        LEN = P_C
        IF  (ON+1)&END # OFF START 
        CYCLE  I = 0, 1, LEN-1
           HOLD(ON) = BUF_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 
        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