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