top - download
⟦1fbad8054⟧ Wang Wps File
Length: 102203 (0x18f3b)
Types: Wang Wps File
Notes: CPS/SDS/050
Names: »4595A «
Derivation
└─⟦ea7a1ecf3⟧ Bits:30006190 8" Wang WCS floppy, CR 0437A
└─ ⟦this⟧ »4595A «
WangText
2…06…1…0b…1…02…0…08…0…0f…0 /…0a…/…01….…08….…0c….…00…. -…08…-…0b…-…00…-
,…09…,…00…,
+…09…+…0d…+…86…1
…02…
…02… …02…
…02…CPS/SDS/050
…02…851220…02……02…
CAMPS LITSYNC
FIRMWARE
DETAILED DESIGN
SPECIFICATION…02……02…CAMPS
7.23 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲H̲O̲S̲T̲ ̲A̲C̲K̲
F̲U̲N̲C̲T̲I̲O̲N̲
This Procedure sends ACK blocks for reception blocks
which the host has acknowledged as receiving. It handles
both LCB and data.
E̲N̲T̲R̲Y̲
Called by HIF ̲COMMAND
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
HOST ̲ACK(CHANNO,INDEX):
/*CHECK IF HOST IS ACKNOWLEDGING LCB*/
IF BUFFER(INDEX).Pl .EQ. LCB ̲LDU(CHANNO) THEN
/*FORMAT ACKL*/
FRAME = ACKL ̲ADDR(CHANNO);
FRAME.C1 = ACKL ̲SIZE ̲L;
FRAME.C2 = ACKL ̲SIZE ̲M;
FRAME.TYPE = ACKL;
FRAME.BID = LCB ̲SEQ(CHANNO);
SET XSTATE7 ̲HEADER(CHANNO);
/* SET RECEIVER TO ACCEPT NEXT LCB */
R ̲L ̲ STATE(CHANNO) = ACCEPT;
/* RETURN EMPTY CONTROL BLOCK TO HOST */
PUSH(INDEX, CHANNO, HOST ̲EMPTIES);
CLEAR(INDEX);
LCB ̲LDU(CHANNO) = NULL;
RETURN;
ELSE
/* DATA SEGMENT */
/* VERIFY CORRECT LDU */
IF BUFFER(INDEX).P1 = LDU ̲DATA ̲1(CHANNO) THEN
/* FORMAT BLOCK */
PTR = ACK ̲ADDR(CHANNO).ACK ̲IN;
FRAME = ACK ̲BASE+(ACK ̲ADDR(CHANNO).ACK ̲INxFRAME
̲SISE);
FRAME.C1 = ACK ̲SIZE#L;
FRAME.C2 = ACK ̲SIZE ̲M;
FRAME.TYPE = ACK;
ACK ̲CIRCLE(PTR) = EOS ̲1(CHANNO);
FRAME.BID = EOS ̲1(CHANNO);
/* UPDATE INTERNAL POINTERS */
LAST ̲ACKED(CHANNO) = EOS ̲1(CHANNO);
EOS ̲1(CHANNO) = EOS ̲2(CHANNO);
EOS ̲2(CHANNO) = NULL;
EOS ̲1COMPLETION = EOS ̲2 ̲COMPLETION
EOS2 ̲COMPLETION = FALSE;
INCREMENT ACK ̲ADDR(CHANNO).ACK ̲IN MOD ACK ̲TAB ̲LEN;
LDU ̲DATA ̲1(CHANNO) = LDU ̲DATA ̲2(CHANNO);
LDU ̲DATA ̲2(CHANNO) = NULL;
PUSH(CHANNO,INDEX,DISCARD ̲CTRL);
RETURN;
ELSE
CALL STATE ̲ERROR(CHANNO,INDEX,LDU ̲ERR);
RETURN;
END /* HOST ̲ACK */
7.24 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲I̲N̲I̲T̲ ̲H̲O̲S̲T̲ ̲B̲U̲F̲F̲E̲R̲S̲
F̲U̲N̲C̲T̲I̲O̲N̲
To initialize the buffers associated with 2 LTU channels.
E̲N̲T̲R̲Y̲
Called at startup of system.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
INIT ̲HOST ̲BUFFERS
initialize buffers for STKEMP
initialize buffers for HSTEMP
initialize buffers for HRXSTK
initialize buffers for STKTXE
initialize buffers for STKRXE
RETURN
7.25 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲I̲N̲I̲T̲ ̲H̲O̲S̲T̲I̲F̲
F̲U̲N̲C̲T̲I̲O̲N̲
Initialize Host interface area
Called at startup of system.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
INIT ̲HOSTIF:
For all channels do
IF ̲TS1:=ENABLED;
IF ̲TS2:=DISABLED
IF ̲RS1:=ENABLED;
IF ̲RS2:=DISABLED;
/* END FOR */
7.26 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲I̲N̲I̲T̲I̲A̲T̲E̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲
F̲U̲N̲C̲T̲I̲O̲N̲
Called by XMITER to initiate transmission
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
INITTX:
TXBUF ̲PT:= buffer pointer
TXBUF ̲CNT:= buffer count
convert 16 bit count into 14 bit in C1,C2
enable SI0 transmitter
enable TX interrupt
CALL TXINT ̲1
RETURN;
7.27 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲L̲E̲V̲E̲L̲1̲ ̲C̲L̲O̲S̲E̲
F̲U̲N̲C̲T̲I̲O̲N̲
To disable level 1.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
LEVEL1 ̲CLOSE(CHANNO):
adjust clock selection reflecting the close
L1 ̲STAT:= SYN8;
LO ̲STAT:= 4;
reset DTR;
reset RTS;
RSYN:= IDLE;
RETURN;
7.28 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲L̲1̲H̲A̲N̲D̲L̲
F̲U̲N̲C̲T̲I̲O̲N̲
This task supports the remote tare DTE handshake handling.
It is scheduled periodically and goes through a sequence
of states.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
L1HANDL:
update DSR status
JP (RSYN)/*go to current state */
Idle state:
RE ̲O:
RETURN;
Begin link setup procedure, set 108 ON
RE ̲1:
set 108 ON (DTR)
L1CNT:=5; /*retry count */
L1STAT:=SYN1;
RSYN:=RE ̲2;
RETURN;
Wait for 107 or 109 to turn ON
RE ̲2:
IF DSR is UP then
set RTS ON
L1STAT:= SYN3;
RSYN:= RE ̲3;
L1CNT:= 3;
ELSE
DEC(L1CNT);
IF L1CNT=0 then RSYN:=RE ̲6;
IF DCD is not set then
L1STAT:= SYN7;
RSYN:= RE ̲4;
L1CNT:= 5;
send MANUAL SYNC report
END /*DCD not SET */
END /*DSR not UP */
Waiting for DCD to turn ON
RE ̲3:
IF DCD is ON then
L1CNT.= 5;
RSYN:= RE ̲4
ELSE
/*DCD is DOWN */
DEC(L1CNT);
IF L1CNT = 0 then RSYN:=RE ̲6
END /*DCD is DOWN */
Waiting for CTS to turn ON
RE ̲4:
IF CTS is UP then
L1STAT:= SYN4;
RSYN:= RE ̲5;
SCHED(L1HANDL,CHANNO,LEV1TO);
ELSE
/*CTS is not UP */
DEC(L1CNT);
IF L1CNT=0 then RSYN:=RE ̲6;
END /*CTS is not UP */
Link is UP - monitor handshake interface signals.
RE ̲5:
IF not all signals UP then
RSYN:= RE ̲2;
L1STAT:= SYN 2;
END /* not all signals UP */
SCHED(L1HANDL, CHANNO, LEV1TO);
Try link setup again
RE ̲6:
L1STAT:= SYN5;
turn DTR and RTS OFF
DEC(SYNRET);
IF SYNRET=0 then
/*link fails to come UP */
SYNRET:= MAXSYN;
RSYN:= RE ̲0;
L1STAT:= SYN8;
CALL CLEANUP
send fatal error report
ELSE
RSYN:= RE ̲1;
END
7.29 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲M̲O̲N̲I̲T̲O̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲
Handles all scheduling functions for both channels
of the LTU.
E̲N̲T̲R̲Y̲
This procedure is executed upon a return from any of
the LTU processes. It determines the next process to
be executed and jumps to it.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
Monitor: update the scheduling table
attempt to schedule foreground processes
attempt to schedule background processes
JUMP to MONITOR
/* MONITOR */
END; /* MONITOR */
Entry point at LTU startup
START:
initialize stackpointer
CALL INHARD
CALL INITHB
CALL INIT ̲IF ̲AREA
JP MONITOR
7.30 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲M̲O̲V̲E̲ ̲D̲A̲T̲A̲
F̲U̲N̲C̲T̲I̲O̲N̲
To mode data from a host segment buffer to an LTU block
buffer, the following global variables apply:
DATA ̲SRC(CHANNO) - indicates the location of data
within the segment buffer;
DATA ̲DEST(CHANNO) - indicates the location of data
within the block buffer;
T ̲BYTECOUNT(CHANNO)- indicates bytes left to be moved
P ̲INDEX(CHANNO) - number of words to be moved
This procedure moves a maximum of MAX ̲BLOCK bytes before
existing to allow other procedures to execute. On exit
this procedure either reschedules itself or schedules
STORE ̲SEC ̲BUFFER.
E̲n̲t̲r̲y - called by SOTRE ̲SEC ̲BUFFER.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
MOVE ̲DATA(CHANNO):
/* DETERMINE IF ENTIRE BLOCK HAS BEEN TRANSFERRED */
IF P ̲INDEX(CHANNO) .NE. ZERO THEN
FOR COUNT = 0 TO MIN(MOVE ̲MAX,P ̲INDEX(CHANNO));
DATA ̲DEST(CHANNO) = DATA ̲SRC(CHANNO);
INCREMENT DATA ̲DEST(CHANNO);
INCREMENT DATA ̲SRC(CHANNO);
DECREMENT T ̲BYTECOUNT(CHANNO);
END
SCHEDULE (MOVE ̲DATA,CHANNO);
RETURN;
ELSE
SCHEDULE (MOVE ̲SEC ̲BUFFER,CHANNO);
RETURN;
END; /* MOVE ̲DATA */
7.31 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲M̲O̲V̲E̲ ̲R̲X̲ ̲D̲A̲T̲A̲
F̲U̲N̲C̲T̲I̲O̲N̲
To move data from a receiver buffer identified as the
source to the gather area.
Insert pointer into the pending table.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
MOVE ̲RX ̲DATA(INDEXS,CHANNO):
update pending table entry
LOOP:
find free GATHER bit
move data
IF not finished then
GOTO LOOP
END /*LOOP*/
update:
EOS ̲1, EOA ̲2, EOS ̲1I, EOS ̲2I, EOS ̲1C, EOS ̲"C
INC(EOSCNT)
END /*MOVE ̲RX ̲DATA*/
7.32 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲O̲P̲E̲N̲ ̲C̲O̲M̲P̲L̲E̲T̲E̲
F̲U̲N̲C̲T̲I̲O̲N̲
Sends status block to host showing that OPEN ̲EDC COMMAND
has been executed and the line is up.
E̲N̲T̲R̲Y̲
Called by RX ̲DISPATCH.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
OPEN ̲COMPLETE(CHANNO):
TEMP = POP(STACK ̲OF ̲EMPTIES ̲RX,CHANNO);
BUFFER(TEMP).TYPE = SIGNLE ̲LDU ̲STATUS;
BUFFER(TEMP).CODE = CHANNEL ̲STATUS;
BUFFER(TEMP).LDU#ID = OPEN ̲LDU(CHANNO);
OPEN ̲LDU(CHANNO) = NULL;
BUFFER(TEMP).COMMAND = OEPN ̲EDC;
BUFFER(TEMP). P1 = 0;
PUSH(INDEX,STATUS ̲RETURN,CHANNO);
LTU ̲ST:= RUNNING;
RETURN
END; /* OPEN ̲COMPLETE */
7.33 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲O̲P̲E̲N̲ ̲E̲D̲C̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure may be called by the host to initiate
LEVEL 1 and EDC protocol or it may be called by the
host after LEVEL 1 has been initialized by manual sync,
to initialize only the EDC protocol. If LEV1 ̲STATE
= SYN6 then both levels must be initialized. If LEV1
̲STATE = SYN4 then only the EDC is to be initialized.
This procedure exists after setting all state tables
and scheduling the XMITTER. The XMITTER will attempt
to send SETB. A response to the OPEN ̲EDC command will
be sent to the host when one of the following occurs:
1) ACK is received for SETB and a SETB has already
been received;
2) SETB is received and ACK has previously been received
in response to SETB;
3) Error status results from LEV1 synchronization
(RE ̲SYNCHRONIZER);
4) Close command is received from host;
5) ACKTO expires the maximum number of times;
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
OPEN ̲EDC(CHANNO):
LTU ̲STATE(CHANNO) = OPENING;
TSTATE(CHANNO) = TSTATE1;
/* SCHEDULE SETB BLOCK */
FRAME = SETB ̲ADDR(CHANNO);
FRAME.C1 = SETB ̲SIZE ̲L;
FRAME.C2 = SETB ̲SIZE ̲M;
FRAME.BID = ZERO;
FRAME.TYPE = SETB;
/*SCHEDULE RR BLOCK */
FRAME = RR ̲ADDR(CHANNO);
FRAME.C1 = RR ̲SIZE ̲L;
FRAME.C2 = RR ̲SIZE ̲M
FRAME.BID = ZERO
FRAME.TYPE = RR;
ACK ̲ONE(CHANNO) = NULL;
NEXT ̲ACK(CHANNO) = ONE;
CLEAR RCOUNT(CHANNO);
OPEN ̲LDU(CHANNO) = BUFFER(INDEX).LDU ̲ID;
NEXT ̲EXPECTED(CHANNO) = NULL ̲1;
SET XSTATE8 ̲HEADER(CHANNO);
SET XSTATE7 ̲HEADER(CHANNO);
SET ̲XMIT ̲PRIORITY(XSTATE8);
SCHEDULE(ACKTO,CHANNO,ACKTO ̲DELTA);
LEV1 ̲STATE(CHANNO) = SYN0;
CALL RE ̲SYNCHRONIZER(CHANNO);
CALL HIF ̲COMMAND ̲RETURN(CHANNO,INDEX);
END; /* OPEN ̲EDC */
7.34 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲P̲O̲P̲L̲
F̲U̲N̲C̲T̲I̲O̲N̲
Remove item from stack.
7.35 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲P̲U̲S̲H̲L̲
F̲U̲N̲C̲T̲I̲O̲N̲
Insert item on stack.
7.36 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲P̲O̲P̲S̲
F̲U̲N̲C̲T̲I̲O̲N̲
Remove item from queue.
7.37 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲P̲U̲S̲H̲S̲
F̲U̲N̲C̲T̲I̲O̲N̲
Insert item in queue.
7.38 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲Q̲U̲E̲U̲E̲ ̲A̲C̲K̲
F̲U̲N̲C̲T̲I̲O̲N̲
To format an ACK block for transmission. The bid is
identical to the last ACK transmitted.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
QUEUE ̲ACK(CHANNO):
PTR = ACK ̲ADDR(CHANNO).ACK ̲IN;
FRAME = ACK ̲BASE+(ACK ̲ADDR(CHANNO),ACK ̲IN*FRAME ̲SIZE);
FRAME.C1 = ACK ̲SIZE ̲L;
FRAME.C2 = ACK ̲SIZE ̲M;
FRAME.TYPE = ACK;
FRAME.BID = LAST ̲ACKED(CHANNO);
ACK ̲CIRCLE(PTR) = LAST ̲ACKED(CHANNO);
INCREMENT ACK ̲ADDR(CHANNO).ACK ̲IN MOD ACK ̲TAB ̲LEN;
RETURN;
END; /* QUEUE ̲ACK */
7.39 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲Q̲U̲E̲U̲E̲ ̲L̲C̲B̲
F̲U̲N̲C̲T̲I̲O̲N̲
To format an LCB block for transmission by the XMITTER.
E̲N̲T̲R̲Y̲
Called by HIF ̲TX ̲IN
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
QUEUE ̲LCB(CHANNO,INDEX):
LCB ̲INDEX(CHANNO) = INDEX;
SET LCB ̲IN ̲PROGRESS(CHANNO) = TRUE;
CLEAR LCOUNT(CHANNO);
/* PLACE LCB LENGTH IN XMITTER TABLE */
LCB ̲ADDR(CHANNO).ADDR = BUFFER(INDEX).ADDRESS;
LCB ̲ADDR(CHANNO).LEN = BUFFER(INDEX).BYTECOUNT;
/* INITIALIZE FRAME HEADER */
BUFFER(INDEX).C1 = BUFFER(INDEX).BYTECOUNT1;
BUFFER(INDEX).C2 = BUFFER(INDEX).BYTECOUNT2;
BUFFER(INDEX).TYPE = LCB;
BUFFER(INDEX).BID = LCB#BID(CHANNO);
SCHEDULE(ACKLTO,CHANNO);
SET XSTATE2 ̲HEADER(CHANNO);
CALL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE2);
RETURN;
END; /*QUEUE ̲LCB */
7.40 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲Q̲U̲E̲U̲E̲ ̲N̲A̲K̲
F̲U̲N̲C̲T̲I̲O̲N̲
To queue NAK blocks to the XMITTER.
E̲N̲T̲R̲Y̲
Called by RX ̲DISPATCH.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
QUEUE ̲NAK(BID,CHANNO):
SET NAK ̲AVAIL(CHANNO);
INDEX = NAK ̲ADDR(CHANNO).NAK ̲IN;
INCREMENT NAK ̲ADDR(CHANNO).NAK ̲IN MODULO NAK ̲TABLE#LEN;
IF BID = (NEXT ̲EXPECTED(CHANNO)+1) MOD O ̲T ̲E THEN
/* SEND NAKI */
BUFFER(INDEX).BID = BID;
BUFFER(INDEX).TYPE = TYPE ̲1;
BUFFER(INDEX).LEN = FOUR;
ELSE
/* SEND NAKIJ */
NAK ̲CIRCLE(CHANNO,INDEX) = TYPE ̲2;
BUFFER(INDEX).BID1 = NEXT ̲EXPECTED(CHANNO);
BUFFER(INDEX).TYPE = TYPE ̲2;
BUFFER(INDEX).LEN = FIVE;
CALL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE5);
RETURN;
END; /* QUEUE ̲NAK */
7.41 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲Q̲U̲E̲U̲E̲ ̲N̲A̲K̲F̲
F̲U̲N̲C̲T̲I̲O̲N̲
To queue NAKF block to XMITTER, and set internal flags.
E̲N̲T̲R̲Y̲
Called by RX ̲DISPATCHER.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
QUEUE ̲NAKF(CHANNO,BID):
SET NAK ̲AVAIL(CHANNO);
INDEX = NAK ̲ADDR(CHANNO).NAK ̲IN;
NAK ̲CIRCLE(CHANNO,INDEX) = TYPE3,
NEXT ̲EXPECTED(CHANNO) = LAST ̲GOOD(CHANNO);
R ̲STATE(CHANNO) = NAKF;
BUFFER(INDEX).BID = BID;
BUFFER(INDEX).TYPE = TYPE ̲3;
BUFFER(INDEX).LEN = FOUR;
SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE5);
END; /* QUEUE ̲NAKF */
7.42 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲Q̲U̲E̲U̲E̲ ̲S̲T̲A̲T̲U̲S̲
F̲U̲N̲C̲T̲I̲O̲N̲
To format a status buffer for return to the host.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
If ERROR ̲CODE = 0 then a TXCANCEL is reported else
an asynchroneous report.
QUEUE ̲STATUS(CHANNO,LDU,ERROR ̲CODE):
TEMP = POP(CHANNO,STACK ̲OF ̲EMPTIES ̲RX);
BUFFER(TEMP).TYPE = SINGLE ̲LDU ̲STATUS;
IF ERROR ̲CODE.NE.0 THEN
BUFFER(TEMP).CODE = ASUNCHRONEOUS ̲REPORT;
BUFFER(TEMP).COMMAND = STAT;
BUFFER(TEMP).LDU ̲ID = NULL;
BUFFER(TEMP)P1 = ERROR ̲CODE;
ELSE
BUFFER(TEMP).CODE = TRANSMISSION ̲STATUS;
BUFFER(TEMP).COMMAND = TX ̲CANCELLED;
BUFFER(TEMP).LDU ̲ID = LDU;
PUSH(TEMP,CHANNO,STATUS ̲RETURN);
END; /* QUEUE ̲STATUS */
7.43 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲E̲D̲E̲F̲I̲N̲E̲ ̲P̲A̲R̲A̲M̲E̲T̲E̲R̲S̲
F̲U̲N̲C̲T̲I̲O̲N̲
To modify internal parameters used by the protocol,
and to validate these parameters.
E̲N̲T̲R̲Y̲
Called by HIF ̲COMMAND.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
REDEFINE ̲ PARAMETERS (CHANNO, INDEX):
/*VERIFY AND STORE BLOCKSIZE*/
DO CASE OF CONTROL(INDEX).Pl)
ZERO: CLOCK ̲SIZE = 32 ̲BYTES;
CONTINUE;
ONE: BLOCK ̲SIZE = 64 ̲BYTES;
CONTINUE
TWO: BLOCK ̲SIZE = 128 ̲BYTES;
CONTINUE;
THREE: BLOCK ̲SIZE = 256 ̲BYTES;
CONTINUE;
FOUR: BLOCK ̲SIZE = 512 ̲BYTES;
CONTINUE;
DEFAULT:CALL RED ̲ERROR(CHANNO,INDEX,R8):
RETURN;
/* STORE ACK TOMEOUT AND ACKL TIMEOUT */
ACKTO ̲DELTA = CONTROL(INDEX).P2
ACKLTO ̲DELTA = CONTROL(INDEX).P3
/* VERIFY AND STORE BLOCK RETRY COUNT */
IF (CONTROL(INDEX.P5.GT.BLOCK ̲RETRY ̲MAX.OR.(CONTROL
(INDEX).P5.LT.BLOCK ̲RETRY ̲MIN) THEN
CALL RED ̲ERROR(CHANNO,INDEX,R9);
RETURN;
ELSE NCOUNT ̲MAX = CONTROL(INDEX).P5;
/*VERIFY AND STORE LCB RETRY COUNT */
IF (CONTROL(INDEX).P6.GT.LCB ̲RETRY ̲MAX) .OR. (CONTROL(INDEX).P6.LT.LCB
̲RETRY ̲MIN) THEN
CALL RED ̲ERROR/CHANNO,INDEX,R10);
RETURN;
ELSE LCOUNT ̲MAX = CONTROL(INDEX).P6;
/*VERIFY AND STORE RR RETRY COUNT*/
IF (CONTROL(INDEX).P7.GT.RR ̲RETRY ̲MAX) .OR. (CONTROL(INDEX).P7.LT.RR
̲RETRY ̲MIN) THEN
CALL RED ̲ERROR(CHANNO;INDEX;R11);
RETURN;
ELSE
RCOUNT ̲MAC = CONTROL(INDEX).P7;
/*RED ̲ERROR WILL RETURN HOST BUFFER*/
CALL RED ̲ERROR(CHANNO;INDEX;R0);
END; /*REDEFINE ̲PARAMETERS*/
7.44 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲E̲D̲ ̲E̲R̲R̲O̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure formats a status buffer to be returned
to the host; also if an error is found in the new parameters
for the EDC protocol.
E̲N̲T̲R̲Y̲
Called by REDEFINE ̲PARAMETERS
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
RED ̲ERROR(CHANNO,INDEX,CODE):
/*ALLOCATE STATUS BUFFER */
TEMP = POP(CHANNO,STACK ̲OF ̲EMPTIES ̲RX);
BUFFER(TEMP).TYPE = SINGLE ̲LDU ̲STATUS;
BUFFER(TEMP).CODE = CHANNEL ̲STATUS;
BUFFER(TEMP).P1 = CODE;
PUSH(TEMP,CHANNO,STATUS ̲RETURN);
CLEAR(INDEX);
/*RETURN HOST BUFFER */
PUSH(INDEX,CHANNO,HOST ̲EMPTIES);
RETURN;
END; /* RED ̲ERROR */
7.45 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲E̲S̲Y̲N̲C̲H̲R̲O̲N̲I̲Z̲E̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure supports the level 1 protocol either
local or remote Tare.
The procedure is called by OPEN ̲EDC to open the Tare
channel, by CTS shift to handle a manual SYNS, or by
DCD shift to handle DCD lost condition.
RE ̲SYN:
IF L1STAT .NE. SYN8 THEN
SYNRET:= MAXSYN;
IF IF ̲STAT = LOCAL THEN
L0STAT:= 2;
set DTR
set RTS
L0STAT:= 3;
L1STAT:= SYN4;
ELSE
/* remote Tare */
RSYN:= 1;
SCHED(L1HANDL,CHANNO);
RETURN;
7.46 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲E̲L̲E̲A̲S̲E̲ ̲B̲U̲F̲F̲E̲R̲(̲C̲H̲A̲N̲N̲O̲)̲
I̲n̲p̲u̲t̲
CHANNO.
F̲U̲N̲C̲T̲I̲O̲N̲
This function frees buffers which have been queued
to the XMITTER. In other words it performs output completion
for buffers which have been queued for transmission.
A buffer is released by resetting the "outstanding"
flag associated with the buffer. This indicates to
the sending procedure that the XMITTER has released
control of the buffer.
Outstanding flags are determined by the type of the
buffer. The buffer type is reflected in the XSTATE
associated with the buffer and is stored in the variable
CURRENT ̲TRANSMISSION(CHANNO). Any information needed
to release the buffer is stored in the tables associated
with XSTATE such as XSTATE ̲HEADER and XSTATE ̲ADDR.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
RELEASE ̲BUFFER: XMIT ̲IN ̲PROGRESS = RESET;
DO CASE OF (CURRENT ̲TRANSMISSION(CHANNO))
XSTATE8: RESET XSTATE8 ̲HEADER(CHANNO);
RETURN,
XSTATE7: RESET XSTATE7 ̲HEADER(CHANNO);
RETURN;
XSTATE6: RESET XSTATE6 ̲HEADER(CHANNO);
RETURN;
XSTATE5: DISABLE INTERRUPTS;
INCREMENT NAK ̲CIRCLE(CHANNO).NAK ̲OUT MODULO
NAK ̲TAB ̲LEN;
IF finished then
RESET XSTATE5 ̲HEADER(CHANNO);
ENBALE INTERRUPTS;
RETURN;
XSTATE4: DISABLE INTERRUPTS;
INCREMENT ACK ̲CIRCLE(CHANNO).ACK ̲OUT
MODULO ACK ̲TAB ̲LEN;
IF finished then
RESET XSTATE4 ̲HEADER(CHANNO)
ENABLE INTERRUPTS;
RETURN;
XSTATE3: TEMP = RETRAN ̲ADDR(CHANNO).RETRAN ̲OUT;
INCREMENT RETRAN ̲ADDR(CHANNO).RETRAN ̲OUT
MODULO RETRAN ̲CIRCLE.LEN;
IF RETRAN ̲ADDR(CHANNO).RETRAN ̲OUT .EQ.
RETRAN ̲ADDR(CHANNO).RETRAN ̲IN THEN
RESET XSTATE3 ̲HEADER(CHANNO);
TEMP2=RETRANCIRCLE(CHANNO,TEMP).TRAN ̲CIRCLE
̲OFFSET;
RESET TRAN ̲CIRCLE(CHANNO).OUTSTANDING
(TEMP2);
RETURN;
XSTATE2: TEMP=TRAN ̲ADDR(CHANNO).TRAN ̲OUT;
INCREMENT TRAN ̲ADDR(CHANNO).TRAN ̲OUT MODULO
XMIT ̲CIRCLE ̲LEN;
IF TRAN ̲ADDR(CHANNO).TRAN ̲OUT .EQ;
TRAN ̲ADDR(CHANNO).TRAN ̲IN THEN
RESET XSTATE2 ̲HEADER(CHANNO);
TEMP2=XMIT ̲CIRCLE(CHANNO,TEMP).TRAN ̲CIRCLE
̲OFFSET;
IF TEMP2 .NE.NULL THEN
RESET TRAN ̲CIRCLE(CHANNO).OUTSTANDING
(TEMP2);
RETURN;
7.47 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲E̲M̲O̲V̲E̲ ̲E̲L̲E̲M̲E̲N̲T̲
F̲U̲N̲C̲T̲I̲O̲N̲
Removes an item from a queue
7.48 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲E̲ ̲Q̲U̲E̲U̲E̲ ̲L̲C̲B̲(̲C̲H̲A̲N̲N̲O̲)̲
F̲U̲N̲C̲T̲I̲O̲N̲
To initialize an LCB Block for transmission by XMITTER.
E̲N̲T̲R̲Y̲
Called by ACKLTO.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
RE ̲QUEUE ̲LCB(CHANNO):
RETRAN ̲CIRCLE(CHANNO,RETRAN ̲IN).ADDR=BUFFER(INCEX).ADDR;
RETRAN ̲CIRCLE(CHANNO,RETRAN ̲IN).LEN=BUFFER(INDEX).
BYTECOUNT;
RETRAN ̲CIRCLE(CHANNO,RETRAN ̲IN).OFFSET = NULL;
INCREMENT RETRAN ̲IN(CHANNO) MOD RETRAN ̲CIRCLE ̲LEN;
INCREMENT LCOUNT(CHANNO);
SCHEDULE(ACKLTO,CHANNO);
SET XSTATE3 ̲HEADER(CHANNO);
/* UPDATE STATISTICS */
INCREMENT TX ̲R ̲L ̲COUNT(CHANNO);
CALL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE3);
RETURN;
END; /* RE ̲QUEUE ̲LCB */
7.49 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲E̲P̲O̲R̲T̲ ̲P̲R̲O̲T̲O̲C̲O̲L̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure returns to the host the state of the
LEVEL1 and EDC protocol.
E̲N̲T̲R̲Y̲
Called by HIF ̲COMMAND.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
REPORT ̲PROTOCOL(CHANNO,INDEX):
POP(STACK ̲OF ̲EMPTIES ̲RX,INDEX,CHANNO);
BUFFER(INDEX).TYPE=SINGLE ̲LTU ̲STATUS;
BUFFER(INDEX).CODE=CHANNEL ̲STATUS;
BUFFER(INDEX).P2=LEV1 ̲STATE(CHANNO);
DO CASE OF (LTU ̲STATE(CHANNO))
DISABLED: EDC ̲STATE = 0DISABLED;
END; /* CASE 1 */
ENABLED: EDC ̲STATE = 1CLOSED;
END; /* CASE 2 */
INITIALIZED: IF LEV1 ̲STATE .EQ. SYN4 THEN
EDC ̲STATE = 2 ̲LEVEL ̲ONE ̲ENABLED;
ELSE
EDC ̲STATE = 3 ̲RECEIVER ̲STARTUP;
END; /* CASE 3 */
OPENING: EDC ̲STATE = OPENING;
BUFFER(INDEX).P1 = TSTATE;
END; /* CASE 4 */
RUNNING: EDC ̲STATE = RUNNING;
END; /* CASE 5 */
ERROR: EDC ̲STATE =7 ̲EDC ̲CLOSE ̲ERROR;
END /* CASE 6 */
CLOSE: EDC ̲STATE = 8 ̲CLOSE;
END; /* CASE 7 */
BUFFER(INDEX).P3 =EDC ̲STATE;
PUSH(INDEX,CHANNO,STATUS ̲RETURN);
CLEAR(INDEX); PUSH(HSTEMP,INDEX,CHANNO);
RETURN
END;
7.50 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲R̲X̲ ̲D̲I̲S̲P̲A̲T̲C̲H̲E̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure dispatches received buffers which have
been placed in the INPUT ̲QUEUE. All buffers in the
INPUT&QUEUE have no parity error in the length, type
or bid. The CRC may or may not be correct. This status
is indicated in the field CRC ̲STATUS in the BUFFER
̲HEADER.
NOTE: BID = BUFFER(INDEX). BID:
NEXT ̲EXPECTED = NEXT ̲EXPECTED(CHANNO);
LAST ̲ACKED = LAST ̲ACTED(CHANNO).
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
RX ̲DISPATCH(CHANNO):
IF INPUT ̲QUEUE(CHANNO) .NE. EMPTY THEN
REMOVE BUFFER INDEX FROM INPUT ̲QUEUE(CHANNO);
IF CRC ̲STATUS .EQ. ERROR THEN
IF BUFFER(INDEX). TYPE .EQ. (D.OR.EOS.OR.EOM) THEN
IF EOS ̲COUNT(CHANNO) .LT. TWO
/* NOT MAXIMUM SEGMENTS */
IF BUFFER(INDEX).BID .EQ. NEXT ̲EXPECTED(CHANNO)
THEN QUEUE ̲NAK(BID,CHANNO):
PUSH (INDEX,STACK ̲OF ̲EMPTIES ̲RX);
RETURN;
ELSE /* VERIFY THAT BID IS RETRANSMITTED */
IF (NEXT ̲EXPECTED-BID) MOD 128 .LT.
(NEXT&EXPECTED)(CHANNO)-LAST ̲ACKED) MOD 128
THEN CALL SERVICE ̲INVALID ̲RETRANSMISSIONS
(CHANNO,INDEX);
RETURN:
ELSE /* OUT OF RANGE, IGNORE */
PUSH(INDEX,STACK ̲OF ̲EMPTIES ̲RX,CHANNO);
ELSE /* MAXIMUM SEGMENTS */
IF (NEXT ̲EXPECTED(CHANNO)-BID) MOD O ̲T ̲E .LT.
(NEXT ̲EXPECTED(CHANNO)-LAST ̲ACKED)(CHANNO)
MOD O ̲T ̲E THEN
CALL SERVICE ̲INVALID ̲RETRANS MISSIONS
(CHANNO,INDEX);
RETURN;
ELSE
PUSH(INDEX,CHANNO,STACK ̲OF ̲EMPTIES ̲RX);
RETURN;
ELSE /* NO CRC ERROR */
*/ HANDLE BUFFER TYPE = DATA,LCB,SETF,RR,LCB,ACK,
NAK,ACKL */
DO CASE OF (BUFFER(INDEX).TYPE)
D̲A̲T̲A̲:̲
/* HANDLE DATA BUFFER */
DO CASE OF R ̲STATE(CHANNO));
/* R ̲STATE=NAKF, RECEIVER HAS SENT NAKF, EXPECTS
TO SEE NEXT ̲EXPECTED */
N̲A̲K̲F̲:̲ IF BUFFER (INDEX).BID .EQ. NEXT ̲EXPECTED
(CHANNO) THEN
CALL SERVICE ̲NEXT ̲EXPECTED(CHANNO,INDEX);
RETURN;
ELSE
PUSH (INDEX,STACK ̲OF ̲EMPTIES ̲RX);
RETURN;
END; /* CASE OF NAKF */
/* R ̲STATE=MAX ̲SEGMENTS, TWO SEGMENTS HAVE BEEN RECEIVED,
IN PART, OR TOTALLY */
MAX ̲SEGMENTS: IF (NEXT ̲EXPECTED(CHANNO)-BID) MOD O
̲T ̲E .LT. NEXT ̲EXPECTED(CHANNO)-LAST
̲ACKED)
(CHANNO) MOD O ̲T ̲E THEN
/* RETRANSMISSION */
SERVICE ̲RETRANSMISSIONS(INDEX,CHANNO);
RETURN;
ELSE
/* NOT RETRY,THEREFORE, DO NOT ACCEPT
*/
PUSH(INDEX,STACK ̲OF ̲EMPTIES ̲RX,CHANNO);
RETURN;
END; /*MAX ̲SEGMENTS */
/* R ̲STATE = READY TO RECEIVE */
READY ̲TO ̲RECEIVE(INDEX,CHANNO):
IF BID = NEXT ̲EXPECTED(CHANNO) THEN
SERVICE ̲NEXT ̲EXPECTED(INDEX,CHANNO);
RETURN;
ELSE
/* CHECK IF RETRANSMISSION */
IF (NEXT ̲EXPECTED(CHANNO)-BID) MOD O ̲T ̲E .LT.
(NEXT ̲EXPECTED(CHANNO)-LAST ̲ACKED) MOD O ̲T ̲E
THEN SERVICE ̲RETRANSMISSION(INDEX,CHANNO);
RETURN;
ELSE /* SOME BLOCKS ARE MISSING */
IF EOS ̲COUNT(CHANNO) .GT. ZERO THEN
/*WITH ONE SEGMENT RECEIVED, BID MUST BE WITHIN
16*/
IF (BID-NEXT ̲EXPECTED(CHANNO)) MOD O ̲T ̲E .LT. SIXTEEN
THEN
/* BID IS WITHIN ONE SEGMENT */
IF(BID-NEXT ̲EXPECTED(CHANNO) MOD O ̲T ̲E .LT. FOUR
THEN
TEMP=(BID-BID ̲BASE(CHANNO)) MOD THREE ̲TWO
QUEUE ̲NAK(CHANNO,BID);
INCREMENT NEXT ̲EXPECTED (CHANNO) MOD O ̲T ̲E
LAST ̲GOOD(CHANNO) = BID;
PENDING ̲TABLE(CHANNO, TEMP)=INDEX;
NEXT ̲EXPECTED(CHANNO)=(BID+1)MODULO O ̲T ̲E
IF BUFFER(INDEX) .TYPE .EQ. (EOS.OR.EOM) THEN
INCREMENT EOS ̲COUNT(CHANNO);
SET EOS ̲2(CHANNO)=BID;
SET EOS ̲2 ̲INDEX(CHANNO) = INDEX;
RSSTATE(CHANNO) = MAX ̲SEGMENTS;
RETURN;
ELSE /* INVALID BLOCK */
QUEUE ̲NAKF(CHANNO,LAST ̲GOOD(CHANNO));
RETURN;
ELSE /* OUT OF RANGE */
PUSH(INDEX,STACK ̲OF ̲EMPTIES ̲RX,CHANNO);
RETURN;
ELSE /* WITH NO SEGMENT RECEIVED, BID MUST BE WITHIN
32*/
IF (BID-NEXT ̲EXPECTED)MOD O ̲T ̲E .LT. THREE ̲TWO
/* IN RANGE, NO SEGMENTS */
IF (BID-NEXT ̲EXPECTED)MOD O ̲T ̲E .LT. FOUR THEN
TEMP=(BID-BID ̲BASE) MOD THREE ̲TWO
QUEUE ̲NAK(CHANNO;BID);
LAST ̲GOOD(CHANNO)=BID;
NEXT ̲EXPECTED=(BID+1)MODULO O ̲T ̲E
IF BUFFER(INDEX). TYPE .EQ. (EOS.OR.EOM)
THEN
INCREMENT EOS ̲COUNT(CHANNO);
SET EOS ̲1INDEX(CHANNO)=INDEX;
SET EOS ̲1(CHANNO) = BID
RETURN;
ELSE /* INVALID BLOCK */
QUEUE ̲NAKF(CHANNO,LAST ̲GOOD(CHANNO));
RETURN;
ELSE /* OUT OF RANGE, IGNORE */
PUSH(INDEX,STACK ̲OF ̲EMPTIES ̲RX);
RETURN;
END; /* CASE OF R ̲STATE = READY TO RECEIVE */
END; /* CASE OF DATA */
/* BLOCK TYPE = LCB */
LCB: /* ONE LCB AT A TIME. R ̲L ̲STATE SHOWS CURRENT
POSITION */
IF R ̲L ̲STATE(CHANNO) .EQ. ACCEPT THEN
IF BUFFER(INDEX). BID .NE. LCB ̲SEQ ̲RX(CHANNO) THEN
R ̲L ̲STATE(CHANNO) = BUSY;
LCB ̲SEQ ̲RX(CHANNO) = BUFFER(INDEX).BID;
LCB ̲INDEX ̲RX(CHANNO) = INDEX;
RETURN;
ELSE
/* RETRANSMIT ACKL */
FRAME = ACKL ̲ADDR(CHANNO);
FRAME.C1 = ACKL ̲SIZE ̲L;
FRAME.C2 = ACKL ̲SIZE ̲M;
FRAME.TYPE = ACKL;
FRAME.BID = LCB ̲SEQ(CHANNO);
SET XSTATE7 ̲HEADER(CHANNO);
PUSH(INDEX,STACK ̲OF ̲EMPTIES ̲RX,CHANNO);
RETURN;
ELSE /* IGNORE */
PUSH(INDEX,STACK ̲OF ̲EMPTIES ̲RX);
RETURN;
END; /* CASE OF LCB */
/* BLOCK TYPE = RR */
RR(J): IF NAK ̲AVAIL
/* SEND NAK */
SET XSTATE4 ̲HEADER(CHANNO)
CLEAR NAK ̲AVAIL;
SET ̲XMIT ̲PRIORITY(XSTATE5,CHANNO);
ELSE
QUEUE ̲ACK (LAST ̲ACKNOWLEDGED, CHANNO);
SET ̲XMIT ̲PRIORITY (XSTATE4,CHANNO);
/* VERIFY RR */
IF J .GT. NEXT ̲EXPECTED THEN
QUEUE ̲NAKF(CHANNO,LAST ̲GOOD(CHANNO));
SET ̲XMIT ̲PRIORITY(XSTATES5.CHANNO);
/* INCREMENT STATISTICS COUNT */
INCREMENT RX ̲RR ̲COUNT;
PUSH (INDEX,STACK ̲OF ̲EMPTIES ̲RX);
END; /* RR */
/* CASE OF SETF */
SETB(J):
/* IF NEXT ̲EXPECTED = NULL ̲2 THEN A SETB HAS BEEN
TRANSMITTED BY MY TRANSMITTER AND AN ACK RECEIVED.
THIS MEANS THAT THE TRANSMITTER IS UP AND OPEN
̲EDC IS WAITING FOR THE RECEIVER TO BE INSTALLED
VIA SETF. HERE IT IS. */
IF TSTATE = TSTATE2 THEN
IF NEXT ̲EXPECTED = NULL ̲2 THEN
CANCEL (CHANNO, ACKTO);
IF ACKTOS .EQ. PENDING THEN
CALL OPEN ̲COMPLETE(CHANNO);
TSTATE(CHANNO) = TSTATE3;
ENDIF;
ELSE /* NOT PART OF OPEN ̲EDC, MUST INFORM HOST */
INDEX2 = POP(STACK ̲OF ̲EMPTIES,CHANNO);
CALL QUEUE ̲STATUS(INCOMING ̲RESET,CHANNO);
ENDIF;
CLEAR PENDING ̲TABLE(CHANNO);
RSTATE(CHANNO) = READY ̲TO ̲RECEIVE;
CLEAR XSTATE5 ̲HEADER(CHANNO);
NAK ̲ADDR(CHANNO).NAK=ZERO;
NAK ̲ADDR(CHANNO). NAK#OUT = ZERO;
CLEAR NAK ̲AVAIL(CHANNO);
ACK ̲ADDR(CHANNO).ACK ̲IN=ZERO;
ACK ̲ADDR(CHANNO).ACK ̲OUT = ZERO;
CLEAR XSTATE4 ̲HEADER(CHANNO);
EOS ̲1(CHANNO) = NULL;
EOS ̲2(CHANNO) = NULL;
EOS ̲1C:=NULL;
EOS ̲2C:=NULL;
LDU1OCC:=FALSE;
LDU2OCC:=FALSE;
EOSCNT:=0;
REXOUT:=0;
REXIN:=0;
ACKONE:=NULL;
ACKTWO:=NULL;
NXTBID:=0;
BASE ̲BID(CHANNO) = J+1;
LAST ̲ACKED(CHANNO) = J;
NEXT ̲EXPECTED(CHANNO) = J+1;
RETURN;
END; /* CASE OF SETB */
/* TRANSMITTER PORTION OF RX DISPATCH */
/* BLOCK TYPE = ACK */
ACK: CASE OF (TSTATE(CHANNO))
TSTATE0: CALL DISCARD(INDEX,CHANNO);
TSTATE1: CALL DISCARD(INDEX,CHANNO);
TSTATE2: IF ACK(INDEX).BID = ACK ̲ONE(CHANNO) THEN
/* INITIATION IN PROGRESS */
/* IF THE RECEIVER IS UP */
IF NEXT ̲EXPECTED(CHANNO) .NE. (NULL ̲1 OR NULL ̲2)
THEN
CANCEL (ACKTO, CHANNO);
TSTATE(CHANNO) = TSTATE3;
CALL OPEN ̲COMPLETE(CHANNO);
CALL DISCARD (INDEX, CHANNO);
RETURN;
ELSE /* RECEIVER NOT UP YET */
DISABLE INTERRUPTS;
NEXT ̲EXPECTED(CHANNO) = NULL ̲2;
ENABLE INTERRUPTS;
CALL DISCARD(INDEX);
RETURN;
TSTATE3: /*CHANNEL IS RUNNING */
TSTATE4: IF ACK(INDEX).BID=ACK ̲TWO(CHANNO)THEN
LAST ̲ACKED=ACK ̲2 ̲INDEX(CHANNO);
TXCLACK:=ACK ̲TWO MOD TXCLEN;
ACK ̲ONE(CHANNO) = NULL;
ACK ̲TWO(CHANNO) = NULL;
TSTATE(CHANNO) = TSTATE3;
ELSE IF ACK(INDEX).BID=ACK ̲ONE(CHANNO)THEN
LAST ̲ACKED=ACK ̲1 ̲INDEX(CHANNO);
TXCLACK:=ACK ̲ONE MOD TXCLEN;
ACK ̲ONE(CHANNO) = ACK ̲TWO(CHANNO)
ACK ̲TWO(CHANNO) = NULL;
TSTATE(CHANNO) = TSTATE3;
CLEAR RCOUNT (CHANNO);
DISCARD(INDEX,CHANNO);
CANCEL (ACKTO,CHANNO);
TSTATE5: IF ACK(INDEX).BID = LAST ̲ACKED(CHANNO)THEN
IF ACK ̲TWO(CHANNO) .EQ.NULL THEN
TSTATE(CHANNO) = TSTATE3;
ELSE
TSTATE(CHANNO) = TSTATE4;
CLEAR RCOUNT (CHANNO);
DISCARD(INDEX,CHANNO);
IF ACKTOS(CHANNO) .EQ. PENDING THEN
CANCEL (ACKTO,CHANNO);
RETURN;
ELSE
GO TO CASE OF TSTATE4;
TSTATE6: CALL DISCARD(INDEX,CHANNO);
RETURN;
/* BLOCK TYPE = NAKI, NAKIJ, NAKF */
NAK ̲ FAMILY: IF ACKTOS(CHANNO) .EQ. PENDING THEN
CANCEL (ACKTO,CHANNO);
IF TSTATE(CHANNO) .EQ; TSTATE5 THEN
TSTATE(CHANNO) = TSTATE6;
CALL CLEANUP (CHANNO,NAK ̲1);
RETURN
ELSE
CLEAR RCOUNT(CHANNO);
CASE OF (NAK ̲TYPE)
NAKF: TRANS ̲INDEX ̲1=(NAK.BID1-TX ̲BID ̲BASE(CHANNO))
MOD THREE ̲TWO;
TRANS ̲INDEX ̲2=(NAK.BID.2-TX ̲BID ̲BASE(CHANNO))
MOD THREE ̲TWO;
GO TO NAK ̲PROC;
NAKIJ: TRAN ̲INDEX ̲1=(NAK.BID1-TX ̲BID ̲BASE(CHANNO)
MOD THREE ̲TWO;
TRAN ̲INDEX ̲2=(NAK.BID2-TX ̲BID ̲BASE(CHANNO)
MOD THREE ̲TWO;
GO TO NAK ̲PROC;
NAKI: TRAN ̲INDEX ̲1=(NAK.BID1-TX ̲BID ̲BASE(CHANNO))
MOD THREE ̲TWO;
TRAN ̲INDEX ̲2=TRAN ̲INDEX ̲1
NAK ̲PROC: IF TRAN ̲INDEX ̲1 .GE. LAST ̲ACKED(CHANNO) MOD
TRAN ̲CIRCLE ̲LEN .AND. TRAN ̲INDEX ̲2 .LT.
TRAN ̲NEXT(CHANNO) MOD TRAN ̲ CIRCLE ̲LEN
THEN
FOR TEMP ̲INDEX=TRAN ̲INDEX ̲1 TO TRAN ̲INDEX
̲2 IF TRAN ̲CIRCLE (TEMP ̲INDEX).NCOUNT .LT.
NCOUNT ̲MAX(CHANNO) THEN
INCREMENT TX ̲R ̲M ̲COUNT(CHANNO);
INDEX=TRAN ̲CIRCLE(TEMP ̲INDEX).INDEX;
RETRAN ̲CIRCLE(CHANNO;RETRAN ̲IN.) .LEN =
BUFFER ̲HEADER (INDEX).BYTECOUNT;
RETRAN ̲CIRCLE(CHANNO;RETRAN ̲IN).ADDR=
BUFFER ̲HEADER(INDEX).ADDR;
RETRAN ̲CIRCLE(CHANNO;RETRAN ̲IN).OFFSET =
TEMP ̲INDEX;
INCREMENT RETRAN ̲ADDR(CHANNO).RETRAN ̲IN MOD
RETRAN ̲CIRCLE ̲LEN;
INCREMENT TRAN ̲CIRCLE(TEMP ̲INDEX).NCOUNT;
ELSE
TSTATE(CHANNO) = TSTATE6;
CALL CLEANUP(CHANNO,NAK ̲2);
RETURN;
END; /* FOR STATEMENT */
SET XSTATE ̲HEADER(CHANNO);
SET ̲XMIT ̲PRIORITY(XSTATE3);
RETURN;
ELSE /* NAK OUT OF RANGE */
TSTATE(CHANNO) = TSTATE6;
CALL CLEANUP(CHANNO,NAK ̲3);
RETURN;
RETURN;
/* BLOCK TYPE = ACKL */
ACKL: IF BUFFER(INDEX).BID = LCB ̲BID THEN
/* VALID ACKL */
INCREMENT LCB ̲BID MOD THREE ̲TWO;
CLEAR LCB ̲IN ̲PROGRESS(CHANNO);
CANCEL(CHANNO,ACKLTO);
/* UPDATE CHANNEL STATISTICS */
INCREMENT TX ̲L ̲COUNT(CHANNO);
/* STATUS WILL BE RETURNED TO HOST BY HIF ̲TX ̲OUT */
ELSE /* INVALID ACKL, IGNORE */
PUSH (INDEX,STACK ̲OF ̲EMPTIES ̲RX,CHANNO);
RETURN;
END; /* ACKL */
END; /* RX ̲DISPATCHER */
7.51 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲C̲H̲E̲D̲U̲L̲E̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure updates the monitor table used for scheduling.
The process ENABLE FLAG is set and if a TIMED WAIT
is involved that variable is set. The processes ACKTO
and ACKLTO use the EDC time out period for their TIMED
WAIT.
E̲N̲T̲R̲Y̲
Called from any task for the purpose of scheduling
another.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
SCHEDULE (PROCESS ̲ID,CHANNO,TIME ̲INTERVAL):
SET SCHEDULING ̲TABLE(PROCESS ̲ID,CHANNO).ENABLE;
SCHEDULING ̲TABLE(PROCESS ̲ID,CHANNO).TIME ̲WAIT=
TIME ̲INTERVAL;
RETURN;
END; /* SCHEDULE */
PROCEDURE PERSCH
F̲U̲N̲C̲T̲I̲O̲N̲
Update scheduling table with delay for tasks that are
going to be scheduled periodically.
PROCEDURE CANCEL
F̲U̲N̲C̲T̲I̲O̲N̲
Cancels a task by updating appropriate entry in scheduling
table.
7.52 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲E̲G̲M̲E̲N̲T̲ ̲P̲R̲O̲C̲E̲S̲S̲O̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲
To scan the PENDING ̲TABLE for complete segments which
have been received and may be transferred to the host.
This procedure will set EOS ̲1 ̲COMPLETED if the first
segment is found. It sets EOS ̲2 ̲COMPLETED if a second
segment is found. EOS ̲COUNT contains a count of the
segments which have been received but not deblocked.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲:̲
SEGMENT ̲PROCESSOR(CHANNO):
IF EOS ̲COUNT(CHANNO) .GT. ZERO THEN
FOR INDEX = COMPLETION ̲PTR(CHANNO) TO EOS ̲1 ̲INDEX
(CHANNO)
IF PENDING ̲TABLE(INDEX) .EQ. ZERO THEN
RETURN;
END; /* FOR STATEMENT */
POP(CURLDU,LDU);
POP(HRXSTK,INDEX);
Move data from GATHER to receive buffer
EOS ̲1:=EOS ̲2;
EOS ̲2:=NULL;
PUSHL(HOSTRQ,INDEX);
RETURN
END; /*SEGMENT ̲PROCESSOR*/
7.53 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲E̲R̲V̲I̲C̲E̲ ̲I̲N̲V̲A̲L̲I̲D̲ ̲R̲E̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲S̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure handles a buffer which arrived out of
sequence and was presumably retransmitted; but cannot
be accepted becuase of CRC error or other problem.
E̲N̲T̲R̲Y̲
Called from RX ̲DISPATCHER.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
SERVICE ̲INVALID ̲RETRANSMISSIONS(INDEX,CHANNO):
/* CALCULATE ENTRY IN PENDING ̲TABLE(CHANNO) */
TEMP=(BID-BID ̲BASE(CHANNO)) MOD THREE ̲TWO;
IF PENDING ̲TABLE(CHANNO,TEMP) .EQ.EMPTY THEN
/* MISSING BLOCK HAS BEEN RECEIVED IN ERROR */
CALL QUEUE ̲NAK(BID,CHANNO);
PUSH(INDEX,CHANNO,STACK ̲OF ̲EMPTIES ̲RX);
RETURN;
ELSE /* DUPLICATE BLOCK */
PUSH(INDEX,CHANNO,STACK ̲OF ̲EMPTIES ̲RX);
RETURN;
END; /* SERVICE ̲INVALID ̲RETRANSMISSIONS */
7.54 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲E̲R̲V̲I̲C̲E̲ ̲N̲E̲X̲T̲ ̲E̲X̲P̲E̲C̲T̲E̲D̲
F̲U̲N̲C̲T̲I̲O̲N̲
To store in the pending table the buffer index of an
incoming block with a bid matching NEXT ̲EXPECTED.
E̲N̲T̲R̲Y̲
Called from RX ̲DISPATCHER.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
SERVICE ̲NEXT ̲EXPECTED(CHANNO,INDEX):
CALL HRXDTA.
7.55 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲E̲R̲V̲I̲C̲E̲ ̲R̲E̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲S̲
F̲U̲N̲C̲T̲I̲O̲N̲
To store a retransmitted block in the pending table.
E̲N̲T̲R̲Y̲
Called from RX ̲DISPATCHER.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
SERVICE ̲RETRANSMISSIONS(INDEX,CHANNO):
/* CALCULATE ENTRY IN THE PENDING TABLE */
TEMP = (BID-BID ̲BASE(CHANNO)) MOD THREE ̲TWO;
IF PENDING ̲TABLE(CHANNO,TEMP) EQ EMPTY THEN
CALL HRXDTA.
RETURN;
END; /* SERVICE ̲RETRANSMISSIONS */
7.56 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲E̲T̲ ̲X̲M̲I̲T̲ ̲P̲R̲I̲O̲R̲I̲T̲Y̲
E̲N̲T̲R̲Y̲
Called from any procedure.
E̲N̲T̲R̲Y̲ ̲P̲a̲r̲a̲m̲e̲t̲e̲r̲s̲
PRIO - The priority level to which the XMITTER state,
XSTATE, is to be set.
Mandatory - indicates that XSTATE will be set to PRIO
in all cases.
F̲U̲N̲C̲T̲I̲O̲N̲
The XMITTER procedure begins transmission with the
highest priority frame available for transmission as
indicated by XSTATE. To set this variable and thus
raise the priority of the XMITTER, this procedure must
be called.
This procedure compares the value of PRIO to XSTATE.
If PRIO is higher, it raises the value of XSTATE to
PRIO. Additionally if XSTATE = 1 then the XMITTER was
idle so this routine schedules the XMITTER. The calling
procedure should have placed the frame to be sent in
the appropriate queue before calling this procedure.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
SET ̲XMIT ̲PRIORITY(CHANNO,PRIO,MANDATORY);
IF MANDATORY .EQ. TRUE THEN
DISABLE INTERRUPTS;
XSTATE = PRIO;
ENABLE INTERRUPTS;
ELSE
IF XSTATE .NE. 1 THEN
IF XSTATE .LT.PRIO THEN
DISABLE INTERRUPTS;
XSTATE=PRIO
ENABLE INTERRUPTS
ELSE
XSTATE = PRIO;
SCHEDULE(XMITTER,CHANNO);
RETURN;
END; /* SET ̲XMIT ̲PRIORITY */
7.57 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲P̲E̲C̲ ̲I̲N̲T̲
F̲U̲N̲C̲T̲I̲O̲N̲
Special receive interrupt handling.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
SPRX0(1):
save registers
CALL SPECR ̲O
restore registers
RETURN;
Special SIO interrupt service routine SPECR ̲O:
reset latched error condition
IF parity error THEN
IF parity error in header THEN
discard current block
ELSE
patch current data character with SUB character
ELSE
IF receiver overrun THEN
discard current block;
RETURN
END/* SPECR ̲O */
7.58 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲T̲O̲R̲E̲ ̲P̲R̲I̲M̲A̲R̲Y̲ ̲B̲U̲F̲F̲E̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲
To place a buffer belonging to the host in TRAN ̲CIRCLE.
If the BLOCK ̲SIZE is less than 512 then the variable
BUFFER ̲EXHAUSTED is set FALSE if BYTECOUNT GT BLOCK
̲SIZE else BUFFER ̲EXHAUSTED is set TRUE. BUFFER ̲EXHAUSTED
is a flag used to signal that more blocks need to be
transmitted to cover the segment.
E̲N̲T̲R̲Y̲
Called by HIF ̲TX ̲IN.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
STORE ̲PRIMARY ̲BUFFER(INDEX,CHANNO):
/* STORE BUFFER INDEX IN TRAN ̲CIRCLE TABLE */
TRAN ̲CIRCLE(CHANNO,HOST ̲IN(CHANNO)).INDEX = INDEX;
/* ZERO RETRANSMISSION COUNT */
TRAN ̲CIRCLE(CHANNO,HOST ̲IN(CHANNO)).NCOUNT = ZERO;
/* CLEAR OUTSTANDING I/O FLAG */
TRAN ̲CIRCLE(CHANNO,HOST ̲IN(CHANNO)).OUTSTANDING =
ZERO;
/* UPDATE TRAN ̲CIRCLE POINTER */
INCREMENT HOST ̲IN(CHANNO) MOD TRAN ̲CIRCLE ̲LEN;
IF BUFFER(INDEX).BYTECOUNT .LT. BLOCK ̲SIZE(CHANNO)
THEN
BUFFER ̲EXHAUSTED(CHANNO) = TRUE;
BUFFER(INDEX).TYPE = EOS;
ELSE
BUFFER(INDEX).BYTECOUNT = BLOCK ̲SIZE(CHANNO);
BUFFER ̲EXHAUSTED(CHANNO) = FALSE;
INCREMENT HIF ̲TX ̲BLOCK(CHANNO);
BUFFER(INDEX).TYPE = DATA;
T ̲BYTECOUNT = BUFFER(INDEX).BYTECOUNT-BLOCK ̲SIZE(CHANNO)
RETURN;
END; /* STORE ̲PRIMARY ̲BUFFER */
7.59 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲S̲T̲O̲R̲E̲ ̲S̲E̲C̲ ̲B̲U̲F̲F̲E̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure continues the blocking function by moving
a block of data from the host segment buffer to an
LTU buffer. The varibale HIF ̲TX ̲BLOCK indicates which
block is to be transferred. If the data in the segment
is exhausted then the flag BUFFER ̲EXHAUSTED is set
true. This flags HIF ̲TX ̲IN to continue.
If a buffer cannot be allocated HIF ̲TX ̲IN is scheduled.
All exits from this procedure are by scheduling HIF
̲TX ̲IN.
Data is moved by calling MOVE ̲DATA. That procedure
will continue until the data is moved. It will exit
to this procedure. It will also reschedule itself so
as to allow other procedures to run.
This procedure files all LTU buffers in TRAN ̲CIRCLE,
sets owner to LTU and flags the last block of a segment
in the header.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
STORE ̲SEC ̲BUFFER(CHANNO):
/* DETERMINE IF MOVE ̲DATA HAS FILLED A BUFFER */
IF MOVE ̲IN ̲PROGRESS(CHANNO) THEN
CLEAR MOVE ̲IN ̲PROGRESS(CHANNO);
/* PLACE FILLED BUFFER INDEX IN TRAN ̲CIRCLE */
TRAN ̲CIRCLE(CHANNO,HOST ̲IN(CHANNO)).INDEX = T ̲INDEX;
/* ZERO RETRY COUNT */
TRAN ̲CIRCLE(CHANNO,HOST ̲IN(CHANNO)),NCOUNT = ZERO;
/* CLEAR OUTSTANDING FLAG */
TRAN ̲CIRCLE(CHANNO,HOST ̲IN(CHANNO)).OUTSTANDING=ZERO;
/* UPDATE TRAN ̲CIRCLE POINTERS */
INCREMENT HOST ̲IN(CHANNO) MOD TRAN ̲CIRCLE ̲LEN;
/* UPDATE BLOCK POINTER */
INCREMENT HOST ̲TX ̲BLOCK(CHANNO);
/* DETERMINE IF LAST BLOCK OF SEGMENT */
IF BUFFER ̲EXHAUSTED(CHANNO) .EQ. TRUE THEN
BUFFER(TX ̲INDEX).TYPE = EOS;
CLEAR HIF ̲TX ̲IN ̲PROGRESS(CHANNO);
SCHEDULE(HOST ̲TX ̲IN,CHANNO);
RETURN;
/* PREPARE TO MOVE NEXT BLOCK */
MOVE ̲IN ̲PROGRESS(CHANNO) = TRUE;
/* ALLOCATE LTU BUFFER */
T ̲INDEX = POP(STACK ̲OF ̲EMPTIES,CHANNO)
IF STACK .EQ. EMPTY THEN
SCHEDULE(HIF ̲TX ̲IN,CHANNO);
RETURN;
ELSE
P ̲INDEX(CHANNO) = MIN(T ̲BYTECOUNT(CHANNO),BLOCK
̲SIZE(CHANNO));
IF P ̲INDEX(CHANNO) .LT. BLOCKSIZE(CHANNO) THEN
BUFFER ̲EXHAUSTED(CHANNO) .EQ. TRUE;
BUFFER(T ̲INDEX).TYPE = EOS;
ELSE
BUFFER(T ̲INDEX).TYPE = DATA;
DATA ̲DEST(CHANNO) = BUFFER(T ̲INDEX).DATA;
DATA ̲SRC(CHANNO) = BUFFER(INDEX).DATA+(HIF ̲TX
̲BLOCK(CHANNO)*
BLOCKSIZE(CHANNO));
CALL MOVE ̲DATA(CHANNO);
RETURN;
END; /* STORE ̲SEC ̲BUFFER */
7.60 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲T̲R̲A̲N̲S̲M̲I̲T̲T̲E̲R̲(̲C̲H̲A̲N̲N̲O̲)̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure attempts to begin transmission for a
particular channel. The actual transmission of the
block is handled by XMITTER. This procedure formats
the block and places it in the XMITTER queue.
Blocks to be transmitted were placed in TRAN ̲CIRCLE
by HIF ̲TX ̲IN. Transmitter determines the current state
of transmission and posts blocks until two segments
are outstanding. Control is returned to the scheduler
between blocks so as not to interfere with interrupt
service procedures.
TRANSMITTER)CHANNO):
DO CASE OF (TSTATE(CHANNO)):
TSTATE0: RETURN;
TSTATE1: RETURN;
TSTATE2: RETURN;
TSTATE3:
/* IF NO BUFFERS TO TRANSMIT, SET ACKTO */
IF TRAN ̲CIRCLE(CHANNO).HOST ̲IN .EQ. TRAN ̲CIRCLE(CHANNO).
NEXT ̲TRAN THEN
IF ACKTO(CHANNO) .NE. PENDING THEN
SCHEDULE(ACKTO,CHANNO);
RETURN;
ELSE /* TRANSMIT A BLOCK */
/* CANCEL ACKTO IF RUNNING */
IF ACKTOS(CHANNO) .EQ. PENDING THEN
CANCEL (ACKTO,CHANNO);
INDEX = TX ̲NEXT;
DETERMINE BUFFER ADDRESS FROM INDEX;
/* FORMAT BLOCK */
BUFFER(INDEX).C1 = BUFFER(INDEX).BYTECOUNT1;
BUFFER(INDEX).C2 = BUFFER(INDEX).BYTECOUNT2;
/* INITIALIZE XMITTER */
INC(NXT ̲BID)MOD MODBID;
BUFFER(INDEX).BID = NEXT ̲BID(CHANNO);
XMIT ̲CIRCLE(CHANNO,TRAN ̲IN).OFFSET = NEXT ̲TRAN(CHANNO);
INCREMENT TRAN ̲IN MODULO XMIT ̲CIRCLE ̲LEN,
SET XSTATE2 ̲HEADER(CHANNO);
IF BUFFER(INDEX).SEG ̲TYPE .EQ. (EOS.OR,EOM) THEN
IF ACK ̲ONE(CHANNO) .NE. NULL THEN
ACK ̲TWO(CHANNO) = BUFFER(INDEX).BID;
ACK ̲2INDEX(CHANNO) = NEXT ̲TRAN(CHANNO);
SET ̲XMIT ̲PRIORITY(XSTATE2);
INCREMENT NEXT ̲TRAN(CHANNO) MODULO TRAN ̲CIRCLE
̲LEN;
TSTATE = TSTATE4;
RETURN;
ELSE
ACK ̲ONE(CHANNO) = BUFFER(INDEX),BID;
ACK ̲1 ̲INDEN:=NEXT ̲TRAN;
TSTATE = TSTATE3;
SET ̲XMIT ̲PRIORITY(XSTATE2);
INCREMENT NEXT ̲TRAN(CHANNO) MODULO TRAN ̲CIRCLE
̲LEN;
RETURN;
END; /* STATE3 */
TSTATE4: IF ACKTO(CHANNO) .EQ. PENDING THEN
SCHEDULE(ACKTO),CHANNO);
RETURN
END; /* TSTATE4 */
TSTATE5: RETURN;
TSTATE6: RETURN;
END; /* TRANSMITTER */
7.61 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲T̲X̲ ̲C̲A̲N̲C̲E̲L̲
F̲U̲N̲C̲T̲I̲O̲N̲
This procedure scans the TRAN ̲CIRCLE table for an LDU
which matches that cancelled by the host. Only those
LDU's which have not yet been transmitted may be cancelled.
If a match is found all buffers associated with that
LDU are released, and a status of cancelled is returned
to the host. If no match is found the request is ignored.
E̲N̲T̲R̲Y̲
Called from HIF ̲COMMAND with entry parameters equal
to channel No. and the index of the host command buffer.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
TX ̲CANCEL(CHANNO;H ̲INDEX):
/* CHECK UNTRANSMITTED BUFFERS */
FOR STEP = NEXT ̲TRAN(CHANNO) TO HOST ̲IN(CHANNO)
INDEX = TRAN ̲CIRCLE(CHANNO,STEP).INDEX;
/* TO SEE IF THE LDU'S MATCH /*
IF BUFFER(INDEX).T ̲SEG ̲NO .EQ. BUFFER(H ̲INDEX).P1 THEN
/* RELEASE HOST BUFFER */
P ̲STEP = STEP;
CLEAR(INDEX);
PUSH(INDEX,CHANNO,HOST ̲EMPTIES);
/* RELEASE ANY LTU BUFFERS ASSOCIATED WITH THE LDU
*/
WHILE BUFFER(INDEX).OWNER .NE. HOST
INCREMENT P ̲STEP MOD TRAN ̲CIRCLE ̲LEN;
INDEX = TRAN ̲CIRCLE(CHANNO,P ̲STEP).INDEX;
PUSH(INDEX,CHANNO,STACK ̲OF ̲EMPTIES);
END: /* WHILE STATEMENT */
DELTA = 0;
/* REARRANGE TRAN ̲CIRCLE TO REMOVE THE GAP */
FOR TSTEP = STEP TO P ̲STEP
IF TRAN ̲CIRCLE(CHANNO;P ̲STEP+DELTA).INDEX .NE.
NULL
THEN
TRAN:CIRCLE(CHANNO,TSTEP.INDEX=
TRAN ̲CIRCLE(CHANNO,P ̲STEP+DELTA).INDEX;
INCREMENT DELTA MOD TRAN ̲CIRCLE ̲LEN;
ELSE
CLEAR(H ̲INDEX);
CALL TX ̲STATUS(BUFFER(H ̲INDEX).P1,CHANNO);
PUSH (H ̲INDEX,CHANNO,HOST ̲EMPTIES);
RETURN;
END; /* FOR STATEMENT */
END; /* FOR STATEMENT */
/* NN MATCH SO RETURN HOST COMMAND */
PUSH(H ̲INDEC,CHANNO,HOST ̲EMPTIES);
RETURN;
END; /* TX ̲CANCEL */
7.62 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲T̲X̲ ̲E̲R̲R̲O̲R̲
F̲U̲N̲C̲T̲I̲O̲N̲:̲
To return an error status to the host for illegal transmission
buffers. A status buffer is allocated formatted and
returned to the host. The incoming transmission buffer
is returned empty to the host.
E̲N̲T̲R̲Y̲
Called by HIF ̲TX ̲IN.
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
TX ̲ERROR(CHANNO,TNDEC,ERR ̲CODE);
INDEX = POP(STACK ̲OF ̲EMPTIES ̲RX,CHANNO);
/* FORMAT STATUS BUFFER TO RETURN TO HOST */
BUFFER(INDEX).TYPE = SINGLE#LDU ̲STATUS;
BUFFER(INDEX).COMMAND = TRANSMISSION ̲STATUS;
BUFFER(INDEX).P1 = ERR ̲CODE;
BUFFER(INDEX).LDU ̲ID = BUFFER(TNDEC).LDU ̲ID;
PUSH(INDEX,CHANNO,STATUS ̲RETURN);
CLEAR(TNDEC);
PUSH(TNDEC,CHANNO,HOST ̲EMPTIES);
RETURN;
END; /* TX ̲ERROR */
7.63 P̲R̲O̲C̲E̲D̲U̲R̲E̲ ̲X̲M̲I̲T̲T̲E̲R̲
D̲E̲S̲C̲R̲I̲P̲T̲I̲O̲N̲
The Xmitter procedure performs the physical transmission
of blocks. These blocks are posted for transmission
by other procedures.
For each of the eight levels or states of transmission
associated with the Xmitter there exists a bit map
or circular buffer which contains information as to
which buffers have been posted for transmission at
this level. The first word of each such table is labelled
as XSTATEn ̲HEADER where n denotes the particular state
(8.GE.n.GE.1). XSTATE1 is the idle state, and there
is no table associated with it.
The XSTATES are prioritized with XSTATE8 being the
highest. The XSTATES are associated with the type of
block that is to be transmitted. The XSTATES are assigned
as follows:
XSTATE8 - SETB blocks are to be transmitted
XSTATE7 - RR response request blocks are to be transmitted
XSTATE6 - ACKL acknowledge LCB blocks are to be
transmitted
XSTATE5 - NAK non-acknowledgement blocks to to be
transmitted
XSTATE4 - ACK acknowledgment blocks are to be transmitted
XSTATE3 - RE-transmission blocks are to be transmitted
XSTATE2 - Transmission data blocks are to be transmitted
XSTATE1 - IDLE
Blocks for transmission may be posted by either receiver
or transmitter procedures. Each XSTATE table is accessed
by only one procedure so no contention exists (for
either input or output). The tables are sufficiently
large so that the inputting and outputting procedures
do not contend for table access and table overrun cannot
occur.
The current XSTATE is indicated by the variable XSTATE.
This variable is set by the procedure SET ̲XMIT ̲PRIORITY.
Procedures which wish to have blocks transmitted, place
the block in the appropriate XSTATE table and then
call SET ̲XMIT ̲PRIORITY with the XSTATE of the block
which they have just posted.
If the priority of the newly posted block is higher
than the current value of XSTATE, then SET ̲XMIT ̲PRIORITY
will increase the value of XSTATE to the level of the
newly posted block.
The XMITTER will begin or attempt to begin all new
transmissions at the level indicated by XSTATE. If
no blocks remain to be transmitted at that level then
XMITTER will lower the value of XSTATE until a posted
block is found or XSTATE = IDLE.
There exists an XSTATE variable for each channel. The
documentation indicates this by referring to XSTATE8(CHANNO).
Following is a pictorial description of the tables
associated with each XSTATE. In addition to XSTATEn
̲HEADER other tables are shown which contain buffer
information and are used by those procedures involved
in transmission.
All tables are shown with possible expansion to 4 channels.
CHANNEL 1
CHANNEL 2
XSTATE
XSTATE8 - SETB
XSTATE8 ̲HEADER: 1
2
The header consists of a channel BYTE MAP. If the BYTE
is TRUE a block has been posted. SETB blocks are fixed
in memory, 1 block per channel.
XSTATE7 - RR
XSTATE7 ̲HEADER: 1
2
The header consists of a channel BYTE MAP. If the BYTE
is TRUE a block has been posted. RR blocks are fixed
in memory, one block per channel.
XSTATE6 - ACKL
XSTATE6 ̲HEADER: 1
2
The header consists of a channel BYTE MAP. If the BYTE
is TRUE a block has been posted. ACKL blocks are fixed
in memory, 1 block per channel.
XSTATE5 - NAK
XSTATE5 ̲HEADER: 1
2
The header consists of a channel BYTE MAP. If the BYTE
is TRUE a block has been posted to that channel. Associated
with each channel is a circular array. With each circular
array is associated two pointers NAK ̲IN and NAK ̲OUT.
These indicate the next block to be assigned (NAK ̲IN)
and the next block to be released (NAK ̲OUT). The blocks
are fixed in memory and the address of each may be
determined as an offset from NAK ̲BASE. The index of
each block is fixed and is identical to the entry index
in the NAK ̲CIRCLE table. The NAK ̲CIRCLE contains the
type of the NAK posted. The type determine the length.
XMITTER will not transmit NAK blocks unless the corresponding
channel bit is set. This will be done when RR is received.
CH 1 NAK ̲IN index into
CH 2 NAK ̲CIRCLE(INPUT)
CH 1 NAK ̲OUT index into
CH 2 NAK ̲CIRCLE(OUTPUT)
In this documentation channel 1 is referred to as
NAK ̲ADDR(1).
NAK ̲IN and NAK ̲ADDR(1). NAK ̲OUT. Similarly channel
2 is
NAK ̲ADDR(2).NAK ̲IN and NAK ̲ADDR(2).NAK ̲OUT.
1 TYPE 1 TYPE
2 2
3 NAK ̲OUT 3 NAK ̲IN
4 4
5 5
6 6
NAK ̲IN
NAK ̲OUT
n n
CHANNEL 1 CHANNEL 2
n = NAK ̲TAB ̲LEN
TYPE = 1-NAKF, 2-NAKI, 3-NAKIJ
NAK ̲IN and NAK ̲OUT are INCREMENTED MODULO n.
In this documentation CHANNEL 1 is referred to as NAK
̲CIRCLE(1,INDEX) and CHANNEL 2 as NAK ̲CIRCLE(2,INDEX).
NAK BUFFER ADDRESSES are composed as
NAK ̲BASE+(NAK ̲IN*5) or NAK ̲BASE+(NAK ̲OUT*5)
XSTATE4 - ACK
XSTATE4 ̲HEADER: 1
2
The header consists of a channel BYTE MAP. If the BYTE
is TRUE a block has been posted to that channel. Associated
with each channel is a circular array. With each circular
array is associated two pointers ACK ̲IN and ACK ̲OUT.
These indicate the next block to be assigned (ACK ̲IN)
and the next block to be released (ACK ̲OUT).
The blocks are fixed in memory and the address of each
may be determined as an offset from ACK ̲BASE. The index
of each block is fixed and is identical to the entry
index in the ACK ̲CIRCLE table. The ACK ̲CIRCLE contains
the sequence number last acknowledged.
CH 1 ACK ̲IN index into
CH 2 ACK ̲CIRCLE (INPUT)
CH 1 ACK ̲OUT index into
CH 2 ACK ̲CIRCLE(OUTPUT)
In this documentation channel 1 is referred to as ACK
̲ADDR(1).ACK ̲IN and ACK ̲ADDR(1). ACK ̲OUT. Similarly
channel 2 is ACK ̲ADDR(2).ACK ̲IN and ACK ̲ADDR(2).ACK
̲OUT.
1 SEG NO 1
2 ACK ̲OUT 2
3 3
4
5
n-1 ACK ̲IN n-1
n n
CHANNEL 1 CHANNEL 2
ACK ̲CIRCLE
n = ACK ̲TAB ̲LEN
SEQ NO = 1 - 128 (BID)
ACK ̲IN and ACK ̲OUT are incremented MODULO ACK ̲TAB
̲LEN
In this documentation Channel 1 is referred to as ACK
̲CIRCLE(1,INDEX) and Channel 2 as ACK ̲CIRCLE(2,INDEX).
XSTATE3 - Retransmission Blocks.
XSTATE3 ̲HEADER: 1
2
The header consists of a channel BYTE MAP. If the BYTE
is TRUE a block has been posted to that channel. Associated
with each channel is a circular array. With each circular
array is associated two pointers RETRAN ̲IN and RETRAN
̲OUT.
These indicate the next block to be assigned (RETRAN
̲IN) and the next block to be released (RETRAN ̲OUT).
The data entries in RETRAN ̲CIRCLE contain the information
necessary to release blocks after transmission and
to initiate transmission.
In this documentation channel 1 is referred to as RETRAN
̲ADDR(1). RETRAN ̲IN and RETRAN ̲ADDR(1).RETRAN ̲OUT. Similarly
channel 2 is referred to as RETRAN ̲ADDR(2).RETRAN ̲IN
and RETRAN ̲ADDR(2).RETRAN ̲OUT.
CH 1 RETRAN ̲IN index into
CH 2 RETRAN ̲TABLE(INPUT)
CH 1 RETRAN ̲OUT index into
CH 2 RETRAN ̲TABLE(OUTPUT)
1
2
3
4 RETRAN ̲OUT
5
W-2 RETRAN ̲IN
W-1
W
CH1 or CH2
RETRAN ̲TABLE
W=length of RETRAN ̲TABLE
The table contains indices into TRANSMIT ̲CIRCLE
XSTATE2 -TRANSMISSION DATA BLOCKS
XSTATE2 ̲HEADER: 1
2
The header consists of a channel BYTE MAP. If the BYTE
is TRUE a block has been posted to that channel. Associated
with that channel is a circular array XMIT ̲CIRCLE.
With each circular array is associated two pointers
TRAN ̲IN and TRAN ̲OUT.
These indicate the next block to be assigned and the
next block to be released, respectively. The data entries
in XMIT ̲CIRCLE contain information necessary to initiate
transmission and to release the block when transmission
has completed.
CH 1 XMT ̲IN index into
CH 2 XMITER ̲TABLE (INPUT)
CH 1 XMT ̲OUT index into
CH 2 XMITER ̲TABLE(OUTPUT)
1
2 XMT ̲OUT
3
W-1 XMT ̲IN
W
CH1 or CH 2
XMITER ̲TABLE
W = length of XMITER ̲TABLE
The table contains indices of the buffers to be transmitted.
E̲N̲T̲R̲Y̲
This procedure is scheduled by SET.XMIT ̲PRIORITY if
XMITTER were previously in IDLE state, i.e. XSTATE1
or by the SIO transmission complete interrupt.
E̲N̲T̲R̲Y̲ ̲P̲o̲i̲n̲t̲s̲
- XMITTER via the scheduler,
- XMIT ̲2 via TX interrupt handler.
F̲U̲N̲C̲T̲I̲O̲N̲
The XMITTER handles all external transmissions. It
handles two channels. For each channel, XMITTER maintains
eight levels or priority. The lowest level XSTATE1
is the IDLE level. With each level is associated a
BIT MAP or CIRCULAR LIST which contains information
as to the buffer to be transmitted.
The XMITTER stores the current XSTATE in CURRENT ̲TRANSMISSION
when it begins transmission. XMITTER will attempt to
begin transmission for all inactive channels.
XMITTER:
/* SCHEDULER ENTRY POINT */
IF LEV1 ̲STATE .EQ. SYN4 THEN
FOR EACH CHANNEL
XMIT ̲2:
IF XMIT ̲IN ̲PROGRESS(CHANNO) .EQ.IDLE THEN
CALL RELEASE ̲BUFFER(CHANNO);
IF XMIT ̲IN ̲PROGRESS(CHANNO) .EQ.RESET THEN
DO CASE OF (XSTATE(CHANNO))
XSTATE8: /* HANDLE SETB */
IF XSTATE8 ̲HEADER(CHANNO) .NE. ZERO THEN
SET CURRENT ̲TRANSMISSION(CHANNO) = XSTATE8;
CALL INITIATE ̲TRANSMISSION(CHANNO,SETB ̲ADDR(CHANNO),
SETB
̲LEN;
RETURN
ELSE
CALL SETXMIT ̲PRIORITY(CHANNO,XSTATE7,MANDATORY);
END /* XSTATE8 */
XSTATE7: /* HANDLE RR */
IF XSTATE7 ̲HEADER(CHANNO) .NE. ZERO THEN
SET CURRENT ̲TRANSMISSION(CHANNO) = XSTATE7;
CALL INITIATE ̲TRANSMISSION(CHANNO,RR ̲ADDR(CHANNO),
RR ̲LEN);
RETURN
ELSE
CALL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE6,MANDATORY);
END /* XSTATE7 */
XSTATE6: /* HANDLE ACKL */
IF XSTATE6 ̲HEADER(CHANNO) .NE. ZERO THEN
SET CURRENT ̲TRANSMISSION(CHANNO) = XSTATE6;
CALL INITIATE ̲TRANSMISSION(CHANNO,ACKL ̲ADDR(CHANNO),
ACK
̲LEN;
RETURN;
ELSE
CALL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE5,MANDATORY);
END / * XSTATE6 */
XSTATE5: /* HANDLE NAK */
IF XSTATE5 ̲HEADER(CHANNO) .NE. ZERO THEN
SET CURRENT ̲TRANSMISSION = XSTATE5;
TEMP = NAK ̲ADDR(CHANNO).NAK ̲OUT;
CALL INITIATE ̲TRANSMISSION(CHANNO,NAK ̲BASE+
TEMP*5,NAK ̲CIRCLE(TEMP)+4);
RETURN;
ELSE
CALL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE4,MANDATORY);
END; /* XSTATE5 */
XSTATE4: /* HANDLE ACK */
IF XSTATE4 ̲HEADER(CHANNO) .NE. ZERO THEN
SET CURRENT ̲TRANSMISSION = XSTATE4
TEMP = ACK ̲ADDR(CHANNO).ACK ̲OUT;
CALL INITIATE ̲TRANSMISSION(CHANNO,ACK ̲BASE+TEMP*4,
ACK ̲LEN);
RETURN;
ELSE
CAL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE3,MANDATORY);
END; /* XSTATE4 */
XSTATE3: /* HANDLE RE-TRANSMISSION BLOCKS */
IF XSTATE3 ̲HEADER(CHANNO) .NE. ZERO THEN
SET CURRENT ̲TRANSMISSION = XSTATE3;
TEMP = RETRAN ̲ADDR(CHANNO).RETRAN ̲OUT;
CALL INITIATE ̲TRANSMISSION(CHANNO,RETRAN ̲CIRCLE(TEMP).
ADDR,RETRAN ̲CIRCLE(TEMP).LEN);
RETURN;
ELSE
CALL SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE2,MANDATORY);
END; /* XSTATE3 */
XSTATE2: /* HANDLE INITIAL TRANSMISSION */
IF XSTATE2 ̲HEADER(CHANNO) .NE. ZERO THEN
SET CURRENT ̲TRANSMISSION = XSTATE2;
TEMP = TRAN ̲ADDR(CHANNO).TRAN ̲OUT;
CALL INITIATE ̲TRANSMISSION(CHANNO,XMIT ̲CIRCLE(TEMP).
ADDR,XMIT ̲CIRCLE(TEMP).LEN);
RETURN;
ELSE
SET ̲XMIT ̲PRIORITY(CHANNO,XSTATE1,MANDATORY);
END; /* XSTATE2 */
XSTATE1: /* IDLE */
RETURN
ELSE
SCHEDULE XMITTER(CHANNO,XDELTA);
RETURN;
END; /* XMITTER */
7.64 P̲R̲O̲G̲R̲A̲M̲ ̲D̲E̲F̲I̲N̲I̲T̲I̲O̲N̲S̲
CANCELLED ̲LDU FIFO queue used to store LDU's
which have been cancelled by
the HOST.
CURRENT ̲LDU FIFO queue used to store LDU
received from the HOST.
CUR ̲LDU Pointer to CURREN ̲LDU
EOS ̲COMPLETION ̲COUNT Number of segments completely
received.
EOS ̲COUNT Number of EOS blocks detected.
EOS ̲1 ̲INDEX Index of first EOS block received.
EOS ̲2 ̲INDEX Index of second EOS block received.
HIF ̲TX ̲BLOCK Current transmission block
within a segment.
HOST ̲EMPTIES Stack used to store empty transmission
blocks which are to be returned
to the HOST.
INDEX ̲1 Index of first block to be
re-transmitted
INDEX ̲2 Index of second block to be
re-transmitted.
STACK ̲OF ̲EMPTIES Stack used to store empty LTU
transmission blocks.
STACK ̲OF ̲EMPTIES ̲RX Stack used to store empty LTU
buffers used for reception
of data or to give status to
the HOST.
STATUS ̲RETURN FIFO queue used to store status
blocks which are to be returned
to the HOST
8̲ ̲ ̲T̲E̲S̲T̲I̲N̲G̲
Testing will be divided into three phases: Phase I,
Phase II, and Phase III. Phase I will consist of protocol
verification, Phase II will consist of testing against
a NICS-TARE configuration, and Phase III will consist
of CR80D (NICS-TARE Handler) interface verification
and acceptance testing.
Phase I consists of fifty tests designed to verify
that the protocol is functioning. The tests will be
run in an LTU using a Z-80 In-Circuit Emulator to initialize
the shared data areas and other data areas. A small
HOST Emulation routine will execute in the LTU to emulate
release of buffers and host acknowledgements.
Phase I testing will take place in Thousand Oaks with
a final demonstration given in Denmark.
Phase III will consist of interfacing an LTU to a CR80D
running the NICS-TARE Handler. Data will be looped
back from channel A to channel B. CR A/S will be responsible
for the test programs necessary to stimulate the NICS-TARE
Handler. The test programs should transmit and receive
messages and compare transmitted data with received
data. A datascope will be used to verify the link protocol.
Phase III testing will take place in Denmark.
Phase II will consist of running the test protocol
against an existing NICS-TARE configuration.
8.1 P̲H̲A̲S̲E̲ ̲1̲
T̲e̲s̲t̲ ̲1̲.̲ ̲S̲E̲T̲B̲ ̲P̲R̲O̲C̲E̲S̲S̲I̲N̲G̲
Purpose: 1) Verify that SETB is properly transmitted
when HOST request is entered in HOST
interface area.
2) Verify Receiver's response to SETB.
Test De- LTU will have been placed in opened state.
scription: HOST Emulation routine will place OPEN
̲EDC command in HOST interface area.
Results: 1) Transmitter should send SETB and RR
2) Receiver should respond with ACK
3) All transmitter and receiver variables
should reflect that the line is up
and ready for transmission.
T̲e̲s̲t̲ ̲2̲.̲ ̲D̲A̲T̲A̲ ̲B̲L̲O̲C̲K̲ ̲P̲R̲O̲C̲E̲S̲S̲I̲N̲G̲
Purpose: 1) Verify that data block is transmitted
2) Verify receiver's response
Test De- HOST Emulation routine will place data
buffer
scription: address in HOST interface area.
Results: 1) Transmitter should send properly framed
data block.
2) Receiver should accept data block
3) All transmitter and receiver tables
should reflect that a data block was
sent and received.
T̲e̲s̲t̲ ̲3̲.̲ ̲D̲A̲T̲A̲ ̲B̲L̲O̲C̲K̲ ̲A̲C̲K̲N̲O̲W̲L̲E̲D̲G̲E̲
Purpose: 1) Verify that Receiver responds to data
block with ACK
2) Verify that Transmitter accepts ACK
Test De- HOST Emulation routine will place input
scription: enabled in HOST interface area. Emulation
routine will scan interface area for received
data and respond with acknowledgement command.
Results: 1) Receiver will send back ACK
2) Transmitter will accept ACK and release
buffer to HOST.
T̲e̲s̲t̲ ̲4̲.̲ ̲A̲C̲K̲T̲O̲
Purpose: 1) Verify that transmitter sets ACKTO
2) Verify that ACKTO routine is functioning
3) Verify that RR is transmitted
4) Verify that Receiver responds with
ACK.
Test De- HOST Emulation routine will place data
buffer
scription: address in HOST interface area. After ACKTO
the HOST Emulation routine will respond
with acknowledge command.
Results: 1) The Transmitter will send data block
2) ACKTO will expire
3) Transmitter will send RR
4) Receiver will respond with ACK
T̲e̲s̲t̲ ̲5̲.̲ ̲N̲O̲ ̲R̲E̲C̲E̲I̲V̲E̲R̲ ̲R̲E̲S̲P̲O̲N̲S̲E̲
Purpose: 1) Verify ACKTO
2) Verify that Transmitter correctly handles
multiple ACKTO
3) Verify that Transmitter responds to
HOST with line status.
Test De- HOST Emulation routine will place data
scription: buffer address in HOST interface area (TX).
Results: 1) Transmitter will send data block
2) ACKTO will expire 4 times
3) Transmitter will send RR four times
4) Transmitter will close down the line
with fatal error and report condition
to the HOST.
T̲e̲s̲t̲ ̲6̲.̲ ̲L̲I̲N̲E̲ ̲R̲E̲-̲E̲S̲T̲A̲B̲L̲I̲S̲H̲M̲E̲N̲T̲
Purpose: 1) Verify that Transmitter can re-establish
link after failure
Test De- HOST Emulation routine will place data
buffer
scription: address in HOST interface area (TX), scan
for status showing line status to be "down"
and respond with command to OPEN ̲EDC.
Results: 1) Transmitter will send segment block
2) ACKTO will expire 4 times
3) Transmitter will close down the line
and report status to HOST
4) HOST will request SETB
5) Transmitter will send SETB, RR
6) Receiver will respond with ACK
7) All receive buffers will be released.
T̲e̲s̲t̲ ̲7̲.̲ ̲B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲-̲ ̲S̲I̲N̲G̲L̲E̲
Purpose: Verify Transmitter's ability to re-transmit
a single data block
Test De- Transmitter will increment the block sequence
scription: number placed in the BID. This will cause
the receiver to believe that a block is
missing. HOST Emulator will accept all
received blocks.
Results: 1) Transmitter will send SETB (J)
2) Transmitter will send segment data
block with BID = J+2
3) Transmitter will send RR (J+2)
4) Receiver will respond with NAK (J+1)
5) Transmitter will send segment data
block with BID = J+1
6) Receiver will respond with ACK (J+1),
ACK (J=2)
T̲e̲s̲t̲ ̲8̲.̲ ̲B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲-̲ ̲T̲W̲O̲
Purpose: Verify Transmitter's ability to re-transmit
two consecutive data blocks.
Test De- Transmitter will increment the block sequence
scription: number placed in the BID by 2. This will
cause the Receiver to believe that two
blocks are missing. The HOST Emulator will
accept all received blocks.
Results: 1) Transmitter will send SETB (J)
2) Transmitter will send segment data
block with BID = J+3
3) Transmitter will send RR (J+3)
4) Receiver will respond with NAK (J+1
, J+2)
5) Transmitter will send data blocks (not
EOS) with sequence numbers = J+1, J+2
6) Receiver will respond with ACK (J+3)
T̲e̲s̲t̲ ̲9̲.̲ ̲B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲-̲ ̲T̲H̲R̲E̲E̲
Purpose: Verify Transmitter's ability to re-transmit
three consecutive data blocks, and Receiver's
ability to format NAK.
Test De- Transmitter will increment sequence number
scription: placed in the BID by 3. This will cause
the Receiver to believe that three blocks
are missing. The HOST Emulator will accept
all received blocks.
Results: 1) Transmitter will send SETB (J)
2) Transmitter will send data segment
block with BID = J+4
3) Transmitter will send RR (J+4)
4) Receiver will respond with NAK (J+1,
J+3)
5) Transmitter will send data blocks (not
EOS) with BID = J+1, BID = J+2, and
BID = J+3.
6) Receiver will respond with ACK (J+4).
T̲e̲s̲t̲ ̲1̲0̲.̲ ̲B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲-̲ ̲F̲O̲U̲R̲
Purpose: Verify Transmitter's ability to re-transmit
four consecutive data blocks, and Receiver's
ability to format NAK.
Test De- Transmitter will increment sequence number
scription: placed in the BID by 4. This will cause
the Receiver to believe that four blocks
are missing. The HOST Emulator will accept
all received blocks.
Results: 1) Transmitter will send SETB (J)
2) Transmitter will send data segment
block with BID = J+5
3) Transmitter will send RR (J+5)
4) Receiver will respond with NAK (J+1,
J+4)
5) Transmitter will send data blocks (not
EOS) with BID = J+1, BID = J+3, BID
= J+4
6) Receiver will respond with ACK (J+5)
T̲e̲s̲t̲ ̲1̲1̲.̲ ̲B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲-̲ ̲N̲A̲K̲F̲
Purpose: 1) Verify Transmitter's ability to retransmit
five data blocks
2) Verify that Receiver sends NAKF.
Test De- Transmitter will increment sequence number
scription: placed in BID by 5. This will cause the
Receiver to believe that five blocks are
missing. HOST Emulator will acknowledge
all received blocks.
Results: 1) Transmitter will send SETB (J)
2) Transmitter will send data segment
block with BID = J+6
3) Transmitter will send RR (J+6)
4) Receiver will respond with NAKF (J+1)
5) Transmitter will send data blocks (not
EOS) with BID = J+1, BID = J+2, BID
= J+3, BID = J+4, BID = J+5, BID =
J+6
6) Receiver will respond with ACK (J+6)
Test 12. B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲-̲ ̲D̲A̲T̲A̲ ̲V̲E̲R̲I̲F̲I̲C̲A̲T̲I̲O̲N̲
Purpose: Verify that receiver correctly constructs
message with missing blocks
Test De- Transmitter will send one segment, then
the
scription: first block of the next segment and skip
two blocks, sending the next (with EOS).
Results: 1) Transmitter will send segment data
block, BID = J
2) Receiver will respond with ACK (J)
3) Transmitter will send data block, BID
= J+1
4) Transmitter will send segment data
block, BID = J+4
5) Transmitter will send RR (J+4)
6) Receiver will send NAK (J+2, J+3)
7) Transmitter will send data blocks with
BID = J+2, BID = J+3
8) Receiver will respond with ACK (J+4)
9) Received message will be verified to
be complete.
Test 13. B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲-̲ ̲A̲L̲T̲E̲R̲N̲A̲T̲E̲ ̲B̲L̲O̲C̲K̲S̲:̲
̲S̲I̲N̲G̲L̲E̲
Purpose: Exercise transmitter and receiver for block
re-transmission
Test De- Transmitter will transmit data blocks with
scription: alternating sequential BID's, i.e. J, J+2,
J+4, J+6, ending with EOS. HOST Emulator
will accept all received blocks.
Results: 1) Transmitter will send data blocks with
BID = J, J+2, J+4 and EOS block with
BID = J+6
2) Transmitter will send RR (J+6)
3) Receiver will respond with NAK (J+1),
NAK (J+3) NAK (J+5)
4) Transmitter will send data blocks with
BID = J+1, BID = J+3 and BID = J+5.
5) Receiver will respond with ACR (J+6).
T̲e̲s̲t̲ ̲1̲4̲.̲ ̲B̲L̲O̲C̲K̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲-̲ ̲A̲L̲T̲E̲R̲N̲A̲T̲E̲ ̲B̲L̲O̲C̲K̲S̲:̲
̲D̲O̲U̲B̲L̲E̲
Purpose: Exercise transmitter and receiver for multiple
block re-transmission.
Test De-
scription: Transmitter will transmit data blocks with
two missing for each block sent. HOST Emulator
will accept all blocks received.
Results: 1) Transmitter will send data blocks with
two blocks missing for each block sent,
i.e. BID = J, BID = J+3, BID = J+6
2) Transmitter will send RR (J+6)
3 Receiver will respond with NAK (J+1,
J+2), NAK (J+4, J+5)
4) Transmitter will send BID = J+1, BID
= J+2, BID = J+4, BID = J+5
5) Receiver will respond with ACK (J+6)
T̲e̲s̲t̲ ̲1̲5̲.̲ ̲B̲L̲O̲C̲K̲ ̲O̲U̲T̲ ̲O̲F̲ ̲R̲A̲N̲G̲E̲ ̲-̲ ̲N̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲ ̲O̲U̲T̲S̲T̲A̲N̲D̲I̲N̲G̲
Purpose: Verify that Receiver recognizes that a
block with BID greater than last acknowledged
+ 32 is out of range
Test De-
scription: Transmitter will send an out of range block,
with no data segments outstending, i.e.
which have not been acknowledged.
Results: 1) Transmitter will send SETB (J)
2) Transmitter will send data block with
BID = J+32
3) Receiver will ignore the data block
4) Transmitter will send RR (J+32)
5) Receiver will send NAKF (J+1)
T̲e̲s̲t̲ ̲1̲6̲.̲ ̲B̲L̲O̲C̲K̲ ̲O̲U̲T̲ ̲O̲F̲ ̲R̲A̲N̲G̲E̲ ̲-̲ ̲O̲N̲E̲ ̲S̲E̲G̲M̲E̲N̲T̲ ̲O̲U̲T̲S̲T̲A̲N̲D̲I̲N̲G̲
Purpose: Verify that Receiver recognizes that a
block with BID greater than last received
EOS + 16 is out of range.
Test De-
scription: Transmitter will send an EOS block followed
by a block which is out of range.
Results: 1) Transmitter will send SETB (J)
2) Transmitter will send EOS block, BID
= J+1
3) Transmitter will send data block with
BID = J+18
4) Transmitter will send RR (J+18)
5) Receiver will send NAKF (J+2)
T̲e̲s̲t̲ ̲1̲7̲.̲ ̲B̲L̲O̲C̲K̲ ̲O̲U̲T̲ ̲O̲F̲ ̲R̲A̲N̲G̲E̲ ̲-̲ ̲T̲W̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲ ̲O̲U̲T̲S̲T̲A̲N̲D̲I̲N̲G̲
Purpose: Verify that Receiver recognizes that a
block with BID greater than last received
EOS is out of range.
Test De-
scription: Transmitter will send two EOS block followed
by a block which is out of range i.e. any
block.
Results: 1) Transmitter will send EOS with BID
= J
2) Transmitter will send EOS with BID
= J+1
3) Transmitter will send data block with
BID = J+2
4) Transmitter will send RR (J+2)
5) Receiver will send NAKF (J+2)
T̲e̲s̲t̲ ̲1̲8̲.̲ ̲T̲R̲A̲N̲S̲M̲I̲T̲T̲E̲R̲ ̲W̲I̲L̲L̲ ̲S̲E̲N̲D̲ ̲A̲ ̲M̲A̲X̲I̲M̲U̲M̲ ̲O̲F̲ ̲T̲W̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲
Purpose: Verify that Transmitter sends at most two
outstanding or unacknowledged segments.
Test De-
scription Receiver will not respond, but Transmitter's
table contains at least three segments
of data. Each segment will contain 4 blocks.
Results: 1) Transmitter will transmit 8 blocks
including 2 EOS
2) Transmitter will send RR (J+8)
3) Receiver will respond with ACK (J)
T̲e̲s̲t̲ ̲1̲9̲.̲C̲O̲N̲T̲I̲N̲U̲O̲U̲S̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲W̲I̲T̲H̲ ̲O̲N̲E̲ ̲B̲L̲O̲C̲K̲ ̲O̲U̲T̲S̲T̲A̲N̲D̲I̲N̲G̲
Purpose: To verify that the transmitter can sustain
transmission if at most one data block
at a time remains outstanding.
Test De-
scription: Transmit table will be filled with buffers
to send. HOST Emulator acknowledges received
blocks in such a manner that at no time
will two blocks remain outstanding.
Results: Data flow will remain continuous with each
transmitted block acknowledged while the
next one is being transmitted.
T̲e̲s̲t̲ ̲2̲0̲.̲ ̲C̲E̲S̲S̲A̲T̲I̲O̲N̲ ̲O̲F̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲W̲H̲I̲L̲E̲ ̲R̲R̲ ̲I̲N̲ ̲P̲R̲O̲G̲R̲E̲S̲S̲
Prupose: To verify that the Transmitter does not
send data blocks following an RR block
until ACK is received to RR.
Test De-
scription: Transmitter will send an RR block and the
transmit table will be filled with data
buffers to be sent.
Results: The transmitter will send no data blocks
until an ACK is received from the receiver.
When this occurs transmission will be continuous.
T̲e̲s̲t̲ ̲2̲1̲.̲ ̲R̲E̲S̲U̲M̲P̲T̲I̲O̲N̲ ̲O̲F̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲W̲H̲E̲N̲ ̲D̲A̲T̲A̲ ̲A̲V̲A̲I̲L̲A̲B̲L̲E̲
F̲R̲O̲M̲ ̲H̲O̲S̲T̲
Purpose: To verify that the transmitter will immediately
resume transmission after an idle state
caused by lack of available transmission
data.
Test De-
scription: The HOST Emulator will make a transmission
block available, wait until transmission
has been completed (but not acknowledged)
and then make another block available.
Results: 1) Transmitter will send a block
2) Transmitter will send another block
3) Transmitter will send RR for both blocks
T̲e̲s̲t̲ ̲2̲2̲.̲ ̲I̲D̲L̲E̲ ̲T̲I̲M̲E̲ ̲H̲A̲N̲D̲S̲H̲A̲K̲I̲N̲G̲
Purpose: To verify that the transmitter and receiver
exchange protocol blocks when no data is
queued for transmission.
Test De-
scription: The HOST Emulator will request that the
link be established.
Results: 1) The Trnasmitter will periodically send
RR (J) blocks.
2) The Receiver will respond with ACK
(J) blocks.
T̲e̲s̲t̲ ̲2̲3̲ ̲E̲O̲M̲ ̲R̲E̲C̲E̲P̲T̲I̲O̲N̲
Purpose: To verify EOM block handling.
Test De-
scription: The Transmitter will send an EOM data block.
The HOST Emulator will acknowledge all
blocks received.
Results: 1) The Transmitter will send an EOM block
with BID = J.
2) The Receiver will respond with ACK
(J).
T̲e̲s̲t̲ ̲2̲4̲.̲ ̲V̲A̲R̲Y̲I̲N̲G̲ ̲B̲L̲O̲C̲K̲S̲I̲Z̲E̲
Purpose: To verify that the transmitter can handle
varying blocksize.
Test De-
scription: The HOST Emulator will request data blocks
of differing block size.
Results: Transmission will continue without interruption.
Block size will wary according to command.
T̲e̲s̲t̲ ̲2̲5̲.̲ ̲D̲U̲A̲L̲ ̲C̲H̲A̲N̲N̲E̲L̲
Purpose: To verify that LTU can sustain two channels
simultaneously.
Test De-
scription: The HOST Emulator will request that two
lines be established and will queue data
blocks for each.
T̲e̲s̲t̲ ̲2̲6̲.̲ ̲L̲C̲B̲ ̲P̲R̲O̲C̲E̲S̲S̲I̲N̲G̲
Purpose: To verify that proper processing of line
control blocks occurs.
Test De-
scription: HOST Emulation routine will post a LCB
to be transmitted.
Results: 1) The Transmitter will send the LCB.
2) The Receiver will respond with ACKL.
T̲e̲s̲t̲ ̲2̲7̲.̲ ̲L̲C̲B̲ ̲P̲R̲O̲C̲E̲S̲S̲I̲N̲G̲ ̲-̲ ̲H̲O̲S̲T̲ ̲E̲R̲R̲O̲R̲
Purpose: To verify that LTU will handle only one
LCB at a time.
Test De-
scription: HOST Emulation routine will post an LCB
for transmission. Before transmission complete
for the LCB occurs the HOST Emulator will
post another LCB for transmission.
Results: 1) The Transmitter will send the first
LCB
2) The transmitter will return the second
LCB to the HOST with error status set.
3) THE Receiver will send ACKL.
T̲e̲s̲t̲ ̲2̲8̲.̲ ̲L̲C̲B̲ ̲R̲P̲O̲C̲E̲S̲S̲I̲N̲G̲ ̲-̲ ̲T̲X̲ ̲E̲R̲R̲O̲R̲
Purpose: Verify that the Receiver will accept only
one LCB at a time.
Test De-
scription: The Transmitter will send two line control
blocks with different sequence numbers.
The HOST Emulator will accept the first
LCB.
Results: 1) The Transmitter will send two LCB's
with different sequence numbers.
2) The Receiver will accept the first
and post LCB to HOST.
3) The Receiver will ignore the second
LCB.
4) The HOST will accept the LCB.
5) The Receiver will respond with ACKL
for the first LCB.
T̲e̲s̲t̲ ̲2̲9̲.̲ ̲L̲C̲B̲ ̲P̲R̲O̲C̲E̲S̲S̲I̲N̲G̲ ̲-̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲/̲T̲E̲R̲M̲I̲N̲A̲T̲I̲O̲N̲
Purpose: To verify that the Transmitter will re-transmit
an unacknowledged LCB when the ACKLTO expires,
for a maximum of 4 tries.
Test De-
scription: The HOST Emulator will post an LCB for
transmission. The HOST Emulator will not
acknowledge the received LCB.
Results: 1) The Transmitter will send the LCB.
2) ACKLTO will expire.
3) The Transmitter will send the LCB.
4) The scenario will repeat 4 times.
5) The Transmitter will return a transmission
completed with error status to the
HOST.
T̲e̲s̲t̲ ̲3̲0̲.̲ ̲L̲C̲B̲ ̲P̲R̲O̲C̲E̲S̲S̲I̲N̲G̲ ̲-̲ ̲R̲E̲-̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲/̲A̲C̲C̲E̲P̲T̲A̲N̲C̲E̲
Purpose: To verify that the Transmitter will re-transmit
an unacknowledged LCB when ACKLTO expires.
Test De-
scription: The HOST Emulator will post an LCB for
transmission. The HOST Emulator will acknowledge
the received LCB after ACKLTO expires.
Results: 1) The Transmitter will send for LCB
2) ACKLTO will expire
3) The Transmitter will re-transmit the
LCB
4) The Receiver will respond with ACKL
5) The Transmitter will return the LCB
buffer with good status to the HOST.
T̲e̲s̲t̲ ̲3̲1̲.̲ ̲M̲O̲D̲E̲M̲ ̲S̲Y̲N̲C̲H̲R̲O̲N̲I̲Z̲A̲T̲I̲O̲N̲ ̲(̲R̲E̲M̲O̲T̲E̲)̲
Purpose: To verify that modem/crypto processing
is correct for the remote mode.
Test De-
scription: The HOST Emulator will request link establishment.
Necessary reponse pulses will be applied
to the SIO to emulate modem/crypto.
Results: The correct pattern of synchronizing signals
will be observed using an oscilliscope.
T̲e̲s̲t̲ ̲3̲2̲.̲ ̲M̲O̲D̲E̲M̲ ̲R̲E̲S̲Y̲N̲C̲H̲R̲O̲N̲I̲Z̲A̲T̲I̲O̲N̲ ̲(̲R̲E̲M̲O̲T̲E̲)̲
Purpose: To verify that the modem resynchronization
process is executed correctly when 109
signal is lost.
Test De-
scription The 109 signal will be re-set.
Results: The LTU will clear the link and begin the
modem/crypto re-synchronization procedure.
T̲e̲s̲t̲.̲ ̲3̲3̲ ̲L̲I̲N̲E̲ ̲S̲Y̲N̲C̲H̲R̲O̲N̲I̲Z̲A̲T̲I̲O̲N̲ ̲-̲ ̲L̲O̲C̲A̲L̲ ̲M̲O̲D̲E̲
Purpose: To verify that line establishment is correct
for local mode.
Test De-
scription The HOST Emulator will request link establishment.
Necessary pulses will be applied to SIO
to emulate TARE.
Results: The correct pattern of synchronizing signals
will be observed using an oscilliscope.
T̲e̲s̲t̲ ̲3̲4̲.̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲E̲R̲R̲O̲R̲ ̲-̲ ̲B̲A̲D̲ ̲C̲R̲C̲
Pupose: To verify that Receiver can detect CRC
error and NAK the block.
Test De-
scription: An incorrect length will be placed in the
block header causing the Receiver to calculate
bad CRC. BID = Next expected.
Results: 1) Transmitter will send data block with
invalid length.
2) Receiver will send NAK.
3) Transmitter will send data block with
valid length.
4) Receiver will send ACK.
T̲e̲s̲t̲ ̲3̲5̲.̲ ̲C̲R̲C̲ ̲E̲R̲R̲O̲R̲ ̲-̲ ̲N̲O̲T̲ ̲N̲E̲X̲T̲ ̲B̲L̲O̲C̲K̲ ̲E̲X̲P̲E̲C̲T̲E̲D̲
Purpose: To verify that the Receiver can detect
bad CRC and will ignore the block if BID
does not equal next expected.
Test De-
scription: The Transmitter will send SETB followed
by block with a BID = J+2 and invalid CRC.
The invalid length will cause the Receiver
to detect a CRC error.
Resutls: 1) Transmitter sends SETB (J).
2) Transmitter sends RR (J).
3) Receiver sends ACK (J).
4) Transmitter sends segment data block,
BID = J+2 (Invalid length).
5) Receiver sees CRC error and ignores
the block.
6) ACKTO expires.
7) Transmitter sends RR (J+2).
8) Receiver sends NAKF (J+1).
T̲e̲s̲t̲ ̲3̲6̲.̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲E̲R̲R̲O̲R̲ ̲-̲ ̲D̲U̲P̲L̲I̲C̲A̲T̲E̲ ̲B̲L̲O̲C̲K̲S̲ ̲-̲ ̲E̲O̲S̲
Purpose: To verify that Receiver will ignore the
duplicata EOS block.
Test De-
scription: Transmitter will send two segment blocks.
Results: The Receiver will ACK the first and ignore
the second.
T̲e̲s̲t̲ ̲3̲7̲.̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲E̲R̲R̲O̲R̲ ̲-̲ ̲D̲U̲P̲L̲I̲C̲A̲T̲A̲ ̲B̲L̲O̲C̲K̲S̲ ̲-̲ ̲D̲A̲T̲A̲
B̲L̲O̲C̲K̲S̲
Purpose: To verify that Receiver will ignore the
duplicata block, but accept all valid blocks.
Test De- The Transmitter will send one block twice
and
scription: then send valid data blocks culminating
with EOS block.
Results: 1) The Transmitter will send blocks with
BID = J, BID = J, BID = J+1, BID =
J+2, and EOS block with BID = J+3.
2) Receiver will respond with ACK (J+3).
3) Correct message will be returned to
HOST.
T̲e̲s̲t̲ ̲3̲8̲.̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲E̲R̲R̲O̲R̲ ̲-̲ ̲P̲A̲R̲I̲T̲Y̲ ̲E̲R̲R̲O̲R̲ ̲I̲N̲ ̲B̲I̲D̲
Purpose: To verify that the Receiver will ignore
a block with parity error in BID field.
Test De-
scription Transmitter will send out segment block
with even parity BID. Later the Transmitter
will send the block with odd parity BID.
Results: 1) Transmitter will send data segment
block with even parity BID.
2) Receiver will ignore the data block.
3) Transmitter will send RR (J+1).
4) Receiver will respond with NAKF (J).
5) Transmtitter will re-transmit data
segment block with odd parity BID.
6) Receiver will respond with ACK (J+1).
T̲e̲s̲t̲ ̲3̲9̲.̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲E̲R̲R̲O̲R̲ ̲-̲ ̲P̲A̲R̲I̲T̲Y̲ ̲E̲R̲R̲O̲R̲ ̲I̲N̲ ̲C̲H̲A̲R̲A̲C̲T̲E̲R̲
C̲O̲U̲N̲T̲
Purpose: To verify that Receiver will ignore a block
with parity error in CC field.
Test De- Transmitter will send out segment data
block
scription: with even parity Character Count, later,
the Transmitter will resend the block with
odd parity CC.
Results: 1) Transmitter will send data segment
block with even parity CC.
2) Receiver will ignore data block.
3) Transmitter will send RR (J+1).
4) Receiver will respond with NAKF (J).
5) Transmitter will re-transmit data segment
block with odd parity CC.
6) Receiver will respond with ACK (J+1).
T̲e̲s̲t̲ ̲4̲0̲.̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲E̲R̲R̲O̲R̲ ̲-̲ ̲P̲A̲R̲I̲T̲Y̲ ̲E̲R̲R̲O̲R̲ ̲I̲N̲ ̲T̲Y̲P̲E̲
Purpose: To verify that Receiver will ignore a block
with parity error in TYPE field.
Test De-
scription: Transmitter will send out segment data
block with even parity TYPE. Later, the
Transmitter will resend the block with
odd parity TYPE.
Results: 1) Transmitter will send data segment
block with even parity TYPE.
2) Receiver will ignore data block.
3) Transmitter will send RR (J+1).
4) Receiver will respond with NAKF (J).
5) Transmitter will re-transmit data segment
block with odd parity TYPE.
6) Receiver will respond with ACK (J+1).
T̲e̲s̲t̲ ̲4̲1̲.̲ ̲L̲O̲S̲T̲ ̲N̲A̲K̲
Purpose: To verify that Transmitter recovers form
the situation in which a NAK is lost.
Test De-
scription: The Receiver will ignore the first block
and not post NAK.
Results: 1) Transmitter will send data block, BID
= J.
2) Receiver will ignore the block and
not post NAK.
3) Transmitter will send RR (J).
4) Receiver will not respond.
5) Transmitter will send RR (J)
6) Receiver will respond with NAKF (J).
7) Transmitter will resend data block.
8) Receiver will respond with ACK (J).
T̲e̲s̲t̲ ̲4̲2̲.̲ ̲L̲O̲S̲T̲ ̲A̲C̲K̲
Purpose: To verify that Transmitter can recover
after ACK is lost.
Test De-
scription: The Receiver will not post ACK for first
valid data block received.
Results: 1) Transmitter will send valid data block
(EOS).
2) Receiver will accept block but not
post ACK in return.
3) Trnasmitter will send RR.
4) Receiver will respond with ACK.
T̲e̲s̲t̲ ̲4̲3̲.̲ ̲L̲O̲S̲T̲ ̲R̲R̲
Purpose: To verify that Transmitter can recover
after RR is lost.
Test De-
scription: The Receiver will ignore the first RR received.
Results: 1) Transmitter will send SETB.
2) Transmitter will send RR.
3) Receiver will ignore RR.
4) ACKTO will expire.
5) Transmitter will send RR.
6) Receiver will respond with ACK
T̲e̲s̲t̲ ̲4̲4̲.̲ ̲S̲E̲T̲B̲ ̲W̲I̲T̲H̲ ̲T̲R̲A̲N̲S̲M̲I̲S̲S̲I̲O̲N̲ ̲I̲N̲ ̲P̲R̲O̲G̲R̲E̲S̲S̲
Purpose: To verify that Receiver and Transmitter
can properly handle SETB when transmission
is in progress:
Test De
scription: The HOST Emulator will post 4 data
blocks for transmission: Then it will
post a SETB. CLOSE followed by OPEN
command.
Results: 1) The Transmitter will send the 4 data
blocks.
2) The Transmitter will send the SETB
block and RR block.
3) The 4 outstanding blocks will be returned
to the HOST with a status of cancelled.
4) The Receiver will release all filled
data buffers and respond with ACK.
T̲e̲s̲t̲ ̲4̲5̲.̲ ̲R̲E̲C̲E̲I̲V̲E̲R̲ ̲D̲O̲W̲N̲
Purpose: To verify that Transmitter downs the line
if the Receiver fails to respond.
Test De-
scription: The Receiver will cease to function in
mid-stream.
Results: 1) The Transmitter will send out EOS.
2) Receiver will respond with ACK.
3) Transmitter will send out 4 data blocks
and EOS.
4) The Receiver will cease to respond.
5) The Transmitter will send RR.
6) No response.
7) The Transmitter will send 4 RR's and
then return a line down status to HOST.
The 4 outstanding line blocks will
be returned to the HOST with an error
status:
T̲e̲s̲t̲ ̲4̲6̲.̲ ̲S̲I̲X̲T̲E̲E̲N̲ ̲B̲L̲O̲C̲K̲S̲ ̲P̲E̲R̲ ̲S̲E̲G̲M̲E̲N̲T̲ ̲-̲ ̲T̲W̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲
Purpose: To verify that both Transmitter and Receiver
can handle sixteen blocks per segment (32
bytes/block).
Test De-
scription: The HOST Emulator will post 15 data blocks
and 1 EOS to the Transmitter. Then the
HOST Emulator will repeat the process.
This constitutes two segments:
Results: 1) The Transmitter will send all 16 blocks.
2) The Receiver will respond with ACK.
3) The Transmitter will release the buffers
to the HOST with a status of success.
4) The Receiver will release the message
segment to the HOST with status of
success.
5) Steps 1 through 4 will be repeated.
T̲e̲s̲t̲ ̲4̲7̲.̲ ̲E̲I̲G̲H̲T̲ ̲B̲L̲O̲C̲K̲S̲ ̲P̲E̲R̲ ̲S̲E̲G̲M̲E̲N̲T̲ ̲-̲ ̲T̲W̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲
Purpose: To verify that both Transmitter and Receiver
can handle eight blocks per segment (64
bytes/block).
Test De-
scription: The HOST Emulator will post 7 data blocks
and 1 EOS to the transmitter: Then the
HOST Emulator will repeat the process.
This constitutes two segments.
Results: 1) The Transmitter will send 8 data blocks.
2) The Receiver will respond with ACK.
3) The Transmitter will release the buffer
to the HOST with a status of success.
4) The Receiver will release the message
segment to the HOST with a status of
success.
5) Steps 1 Through 4 will be repeated.
T̲e̲s̲t̲ ̲4̲8̲.̲ ̲F̲O̲U̲R̲ ̲B̲L̲O̲C̲K̲S̲ ̲P̲E̲R̲ ̲S̲E̲G̲M̲E̲N̲T̲ ̲-̲ ̲T̲W̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲
Purpose: To verify that both Transmitter and Receiver
can handle four blocks per segment (128
bytes/block).
Test De-
scription: The HOST Emulator will post 3 data blocks
and 1 EOS to the Transmitter. Then the
HOST Emulator will repeat the process.
This constitutes two segments.
Results: 1) Transmitter will send 4 data blocks.
2) Receiver will respond with ACK.
3) Transmitter will release the 4 data
buffers to the HOST with a status of
success.
4) Receiver will release message segment
to HOST with status of success.
5) Steps 1 through 4 will be repeated.
T̲e̲s̲t̲ ̲4̲9̲.̲ ̲T̲W̲O̲ ̲B̲L̲O̲C̲K̲S̲ ̲P̲E̲R̲ ̲S̲E̲G̲M̲E̲N̲T̲ ̲-̲ ̲T̲W̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲
Purpose: To verify that both Transmitter and Receiver
can handle two blocks per segment (256
bytes/block).
Test De-
scription: The HOST Emulator will post a data block
followed by an EOS block. Then the HOST
Emulator will repeat the process. This
constitutes two data segments.
Results: 1) Transmitter will send two data blocks.
2) Receiver will respond with ACK.
3) Transmitter will release the 4 data
buffers to the HOST with a status of
success.
4) The Receiver will release the message
segment to the HOST with a status of
success.
5) Steps 1 through 4 will be repeated.
T̲e̲s̲t̲ ̲5̲0̲.̲ ̲O̲N̲E̲ ̲B̲L̲O̲C̲K̲ ̲P̲E̲R̲ ̲S̲E̲G̲M̲E̲N̲T̲ ̲-̲ ̲T̲W̲O̲ ̲S̲E̲G̲M̲E̲N̲T̲S̲
Purpose: To verify that both Transmitter and Receiver
can handle one block per segment (512 bytes/block).
Test De-
scription: The HOST Emulator will post two EOS blocks
to the Transmitter.
Results: 1) Transmitter will send two data blocks.
2) Receiver will send two ACK's.
3) Transmitter will release two data buffers
to HOST with status of success.
4) Receiver will release two message segments
to the HOST with status of success.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲A̲1̲
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
0
I̲N̲D̲E̲X̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
O̲W̲N̲E̲R̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 1 BUFFER (INDEX) .OWNER
T̲E̲M̲P̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 2
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 3
4
B̲Y̲T̲E̲C̲O̲U̲N̲T̲ ̲ ̲ ̲ 5 BUFFER (INDEX) .BYTECOUNT
ADDRESS OF 6
D̲A̲T̲A̲ ̲B̲U̲F̲F̲E̲R̲ ̲ 7 BUFFER (INDEX) .ADDR
T̲ ̲T̲Y̲P̲E̲ ̲ ̲ ̲ ̲ ̲ ̲ 8 BUFFER (INDEX) .T ̲TYPE (TEMP STORAGE)
T̲ ̲S̲E̲Q̲ ̲N̲O̲ ̲ ̲ ̲ ̲ 9 BUFFER (INDEX) .T ̲SEQ ̲NO (TEMP STORAGE)
T̲#̲S̲E̲G̲ ̲T̲Y̲P̲E̲ ̲ ̲ 10 BUFFER (INDEX) .T ̲SEG ̲TYPE (TEMP STORAGE)
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 11
C̲1̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 12 BUFFER (INDEX) .C1
C̲O̲D̲E̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 13 BUFFER (INDEX) .CODE
DATA- L̲D̲U̲-̲I̲D̲ ̲ ̲ ̲ ̲ ̲ ̲ 14 BUFFER (INDEX) LDU-ID
BUFFER
B̲I̲D̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 15 BUFFER (INDEX) .BID
16 BUFFER (INDEX) .DATA
DATA
SEGMENT
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ 517
All Buffers are identified by a Buffer index (BYTE0).
Fields within the Buffer are referenced in the documentation
as shown above. All HOST references are to buffer address.
Most LTU references are to buffer index.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲A̲2̲,̲ ̲H̲O̲S̲T̲ ̲C̲O̲M̲M̲A̲N̲D̲S̲
1. INPUT REQUEST An input request signals
to the LTU that the handler
is ready to receive an LDU
of data.
2. CANCEL INPUT REQUEST Cancel specified input requests
of data if pending.
3. CANCEL OUTPUT If a data buffer is still
queued for the protocol and
transmission has not yet
been started a cancel shall
be as if the data buffer
was never queued.
4. REPORT STATUS HOST commands used for controlling
the protocol.
1) ENABLE
2) OPEN EDC
3) CLOSE EDC
4) REDEFINE EDC PARAMETERS
5) COLLECT STATISTICS
6) PROTOCOL STATUS + LEVEL 1 STATUS (EDC STATE)
7) ACKNOWLEDGE
5. OPEN CHANNEL Used to enable the CR80-LTU
interface.
6. CLOSE CHANNEL Used to disable the CR80-LTU
interface.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲A̲3̲
Setup Parameters Specified by the HOST in ENABLE Command
H̲O̲S̲T̲ ̲P̲a̲r̲a̲m̲e̲t̲e̲r̲: L̲T̲U̲ ̲V̲a̲r̲i̲a̲b̲l̲e̲
1. Definition REMOTE/LOCAL TARE IF ̲STATE
2. Baudrate BAUD ̲RATE
3. LEVEL 1 Timeout (remote TARE) LEVEL#1
̲STO
4. Retry Count LEVEL 1 (Remote TARE) SYN ̲RETRY
̲MAX
5. Block Size BLOCK ̲SIZE
6. ACKTO Timeout in Steps of 100 ms ACKTO ̲DELTA
7. ACKLTO Timeout in Steps of 100 ms ACKLTO ̲DELTA
8. MAX N Count NCOUNT ̲MAX
9. MSX L Count LCONT ̲MAX
10. MAX R Count RCOUNT ̲MAX
A̲P̲P̲E̲N̲D̲I̲X̲ ̲A̲4̲,̲ ̲B̲U̲F̲F̲E̲R̲ ̲U̲T̲I̲L̲I̲Z̲A̲T̲I̲O̲N̲
Each channel has its own buffers allocated to it. The
buffers are further divided into transmit and receive.
The HOST I/F area is formatted as follows:
Bytes 2-3 TX.OUT: Empty buffers returned to the
HOST for the purpose of being
used as command or data transmission
buffers.
Bytes 6-7 TX-.IN: Command and data transmission
buffers filled by the HOST.
Bytes 10-11 RX.OUT: Data reception and status buffers
filled by the LTU.
Bytes 14-15 RX.IN: Empty data reception and status
buffer returned by the HOST.
The HOST must return all buffers received in TX.OUT
to TX.IN, and all buffers received in RX.OUT to RX.IN.
The LTU will initially furnish the HOST with 3 empty
buffers via TX.OUT. Thereafter all transmission and
command buffers will be returned as empty.
The LTU will allocate status buffers and data reception
buffers from its internal pool. Those must be returned
by the HOST as empty.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲A̲5̲
Variables used in statistics collection
TX ̲M ̲COUNT Number of successfully transmitted
message blocks
TX ̲L ̲COUNT Number of successfully transmitted
LCB'S
RX ̲M ̲COUNT Number of received message blocks
RX ̲L ̲COUNT Number of received LCB'S
TX ̲R ̲RR ̲COUNT Number of transmitted RR blocks
RX ̲RR ̲COUNT Number of correctly received RR
blocks
SYN ̲RETRY ̲COUNT Number of SYNC retries on LEVEL
1 (REMOTE TARE)
A̲P̲P̲E̲N̲D̲I̲X̲ ̲B̲1̲
INTERNAL TABLES
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲ ̲
TRAN ̲CIRCLE ̲LEN
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ LAST ̲ACKED
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲ ̲
INDEX ENTRY
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ NEXT ̲TRAN
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲ ̲
TRAN ̲CIRCLE
TRAN ̲BID ̲BASE
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲ ̲
TABLE POINTERS
DIAGRAM OF TRANSMITTER TABLES
A̲P̲P̲E̲N̲D̲I̲X̲ ̲B̲1̲
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
CHANNEL 1
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
CHANNEL 2
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
LAST ̲ACKED
ACK ̲ONE CHANNEL 1
A̲C̲K̲ ̲T̲W̲O̲ ̲ ̲ ̲ ̲ ̲ ̲
LAST ̲ACKED
ACK ̲ONE CHANNEL 2
A̲C̲K̲ ̲T̲W̲O̲ ̲ ̲ ̲ ̲ ̲ ̲
T̲R̲A̲N̲ ̲B̲I̲D̲ ̲B̲A̲S̲E̲ CH 1
T̲R̲A̲N̲ ̲B̲I̲D̲ ̲B̲A̲S̲E̲ CH 2
LAST ̲ACKED Contains BID of FRAME, which was last
acknowledged.
ACK ̲ONE Contains the BID of an END OF SEGMENT
or END OF MESSAGE block which requires
acknowledgement.
ACK ̲TWO Contains the BID of an END OF SEGMENT
or END OF message block which requires
acknowledgement.
TRAN ̲BID ̲BASE Contains BID of first entry in TRAN
̲CIRCLE.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲B̲2̲
DATA FRAME FORMAT: FORMAT 1
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
S S B C
Y Y C C T I VARIABLE DATA FIELD R
N N 1 2 D C
1̲ ̲2̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
C1, C2 = FRAME LENGTH
T = DATA TYPE = D,EOS,EOM
BID = SEQUENCE NUMBER MODULO 128
CRC = 16 BIT POLYNOMINAL x16 + x12 + x + 1 (INCLUDES
SYN1, SYN2)
FORMAT 2: ACK (J), ACKL (J), NAK (J), RR (J), SETB
(J)
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
S S B C
Y Y C C T I R
N N 1 2 D C
1̲ ̲2̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
T = FRAME TYPE = ACK,ACKL,NAK,RR,SETB
FORMAT 3: NAK (i,j)
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
S S B B C
Y Y C C T I I R
N N 1 2 D D C
1̲ ̲2̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲1̲ ̲2̲ ̲ ̲ ̲ ̲ ̲ ̲
BID 1 = i
BID 2 = j
FORMAT 4: LCB (J)
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
S S B C
Y Y C C T I DATA R
N N 1 2 D C
1̲ ̲2̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
DATA: MAX. 32 CHARACTERS
A̲P̲P̲E̲N̲D̲I̲X̲ ̲B̲3̲
PENDING ̲TABLE ENTRY CH 1 or CH 2
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲G̲O̲T̲I̲T̲ ̲ ̲ = TRUE, if a packet i received
̲P̲T̲Y̲P̲E̲ ̲ ̲ = packet type (EOS,EOM,DATA)
̲L̲E̲N̲1̲ ̲ ̲ ̲ length received so far
̲L̲E̲N̲2̲ ̲ ̲ ̲ =
̲ ̲1̲ ̲ ̲ ̲ ̲ ̲
̲ ̲2̲ ̲ ̲ ̲ ̲ ̲
= offset into GATHER of
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ relevant 32 byte piece
̲1̲6̲ ̲ ̲ ̲ ̲ ̲
Each entry in PENDING ̲TABLE corresponds to a BID.
To cope with MXSEGS unacknowledged segments of minimum
blocksize and maximum segment length, the number of
entries should be:
(B ̲MAX/B ̲MIN) * MXSEGS
A̲P̲P̲E̲N̲D̲I̲X̲ ̲C̲1̲
DIAGRAM OF LTU STATES
DISABLED OPEN ̲CHANNEL
CLOSE ̲CHANNEL
CLOSE
CHANNEL
CLOSE ̲ ENABLED
CHANNEL
ENABLE
CLOSE INITIA-
LISED
CLOSE ̲EDC/FAILURE
OPEN
̲EDC
OPENING
ERROR CLOSE ̲EDC
level 1
or EDC RUNNING LEVEL 1 ̲STATE =
SYN4
TSTATE = TSTATE3
DISABLED - LTU is passive; I/F area disabled
ENABLED - LTU has received open channel command
but no EDC PARAMETERS; I/F area enabled:
LEVEL 1 disabled
INITIALIZED - LTU has received EDC PARAMETERS; LEVEL
1 enabled
OPENING* - OPEN ̲EDC COMMAND has been received
RUNNING - LEVEL 1 is functioning and EDC has opened
FULL-DUPLEX CHANNEL
ERROR* - LEVEL 1 OR EDC FATAL ERROR
CLOSE* - Either a FATAL ERROR has occured or
a close EDC COMMAND has been received
* TRANSITION STATES
A̲P̲P̲E̲N̲D̲I̲X̲ ̲C̲1̲
RUNNING LTU ̲STATE ENABLED INITIALIZED
DISABLED
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲
INPUT ̲REQUEST OPEN ̲CHANNEL CLOSE ̲CHANNEL CLOSE ̲CHANNEL
CANCEL ̲INPUT ̲
REQUEST ENABLE OPEN ̲EDC
VALID
HOST CANCEL ̲OUTPUT
COMMANDS
CLOSE ̲EDC
REDEFINE ̲EDC
STATISTICS
PROTOCOL ̲STATUS
ACKNOWLEDGE
TRANS REQ.
CLOSE ̲CHANNEL
̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲ ̲
̲ ̲ ̲ ̲ ̲
LTU STATE MATRIX OF VALID HOST COMMANDS
DIAGRAM SHOWING WHICH HOST COMMANDS WILL BE
ACCEPTED BY THE LTU DEPENDING UPON LTU
STATE FOR THAT CHANNEL.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲C̲2̲
A̲P̲P̲E̲N̲D̲I̲X̲ ̲C̲2̲
LEV1 STATES
SYN0: OPEN ̲EDC COMMAND HAS BEEN RECEIVED
SYN1: 107 OFF
SYN2: 107 ON
SYN3: TEMPORARY STATE TO CHECK 106 & 109
SYN4: NORMAL RUNNING STATE
SYN5: ERROR STATE
SYN6: ENABLED STATE
SYN7: MANUAL SYNC
SYN8: CIR 107 ON
SYN9: DISABLED
A̲P̲P̲E̲N̲D̲I̲X̲ ̲C̲3̲
TRANSMITTER STATE TRANSITIONS
TSTATE0: TRANSMITTERR has been initialized with
EDC PARAMETERS. Line is down
TSTATE1: OPEN ̲EDC COMMAND has been received from
HOST
TSTATE2: SETB BLOCK has been transmitted. LTU is
awaiting ACK
TSTATE3: Line is up. Less than two SEGMENTS have
been transmitted
TSTATE4: Line is up. Two SEGMENTS have been transmitted
TSTATE5: RR has been transmitted. LTU is awaiting
response
TSTATE6: Cleanup is in PROGRESS. This could be caused
by LEVEL1 ERROR, FATAL EDC ERROR OR CLOSE
̲EDC COMMAND from HOST.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲C̲4̲
DIAGRAM OF RECEIVER STATE, R ̲STATE
READY ̲TO ̲RECIEVE - RECEIVER has buffer space and is
not in error condition. If EOS ̲1
.NE. ZERO then one SEGMENT has been
received.
NAKF: An IN-RANGE but not acceptable BID
was received. A NAKF has been sent.
Now the next expected BID must be
seen before new BID will be accepted.
Old BIDS (re-transmission will be
accepted).
MAX ̲SEG: Two SEGMENTS have been received
but not acknowledged. Only re-transmission
will be accepted.
ALL R ̲STATES ARE SUB-STATES OF LTU ̲STATE = RUNNING.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲C̲5̲
DIAGRAM OF RECEIVER LCB STATE, R ̲L ̲STATE
LCB'S will only be accepted if R ̲L ̲STATE .EQ. accept
and the SEQ. number of the LCB does not match that
of the last LCB received.
BUSY indicates that the RECEIVER has received one LCB.
PENDING indicates that the LCB has been transferred
to the HOST and the LTU is waiting for an ACKNOWLEDGE
STATUS BLOCK from the HOST.
Variables associated with LCB processing are:
1) LDU ̲LCB = LDU of BLOCK transferred to the
HOST
2) LCB ̲INDEX = BUFFER INDEX of received LCB
3) LCB ̲SEQ = SEQUENCE NUMBER of LCB received.
used in acknowledgement.
R ̲L ̲STATE is SUBSTATE of LTU ̲STATE RUNNING.
A̲P̲P̲E̲N̲D̲I̲X̲ ̲D̲
1̲ ̲ ̲M̲o̲n̲i̲t̲o̲r̲ ̲D̲a̲t̲a̲s̲t̲r̲u̲c̲t̲u̲r̲e̲
Placed in PHYCONS:
1. Schedule table (SCH ̲TAB):
One byte for each TASK. If bit 7 is SET then the
TASK is cancelled. Else the byte indicate the time
(in TICKS) the TASK may wait before it will be
activated.
2. TASK Jump Table:
Contain "Jumps" to entrypoints to each TASK.
3. Delay Table (DEL ̲TAB):
One byte for each TASK (2 channels). The byte contain
the periode by which the TASK shall be activated.
Zero means that the TASK not shall be activated
periodic.
2̲ ̲ ̲I̲d̲e̲n̲t̲i̲f̲i̲c̲a̲t̲i̲o̲n̲ ̲o̲f̲ ̲D̲a̲t̲a̲m̲o̲d̲u̲l̲e̲s̲
AAAC ̲DAT LCLZ ̲DAT S ̲DAT
ACAZ ̲DAT M ̲DAT TATX ̲DAT
B ̲DAT N ̲DAT TXTZ ̲DAT
C ̲DAT OP ̲DAT TZTZ ̲DAT
DE ̲DAT PHYCONS XAXM ̲DAT
G ̲DAT RARL ̲DAT XMXZ ̲DAT
HI ̲DAT RRRZ ̲DAT
LALC ̲DAT STACK
Finally there are some data in:
HIFCANCEL
HIFTXOUT
TXCANCEL
3̲ ̲ ̲M̲o̲d̲u̲l̲e̲s̲ ̲C̲o̲n̲t̲a̲i̲n̲i̲n̲g̲ ̲C̲R̲8̲0̲ ̲I̲n̲t̲e̲r̲f̲a̲s̲e̲ ̲P̲r̲o̲g̲r̲a̲m̲s̲
HIFRXIN HIFTXRTN
HIFRXOUT STORSBUF
HIFTXIN
4̲ ̲ ̲C̲o̲n̲t̲r̲o̲l̲ ̲I̲n̲t̲e̲r̲c̲h̲a̲n̲g̲e̲ ̲B̲e̲t̲w̲e̲e̲n̲ ̲M̲o̲d̲u̲l̲e̲s̲
a) T̲r̲a̲n̲s̲m̲i̲s̲s̲i̲o̲n̲ ̲o̲f̲ ̲a̲ ̲S̲e̲g̲m̲e̲n̲t̲
b) R̲e̲c̲e̲i̲v̲i̲n̲g̲ ̲a̲ ̲S̲e̲g̲m̲e̲n̲t̲
c) T̲r̲a̲n̲s̲m̲i̲s̲s̲i̲o̲n̲ ̲o̲f̲ ̲A̲c̲k̲n̲o̲w̲l̲e̲d̲g̲e̲
d) R̲e̲c̲e̲i̲v̲i̲n̲g̲ ̲o̲f̲ ̲A̲c̲k̲n̲o̲w̲l̲e̲d̲g̲e̲
A̲P̲P̲E̲N̲D̲I̲X̲ ̲E̲
D̲a̲t̲a̲ ̲D̲e̲s̲c̲r̲i̲p̲t̲i̲o̲n̲
ACK's between ACKOUT and ACKIN are those which are
queued but not yet frame.
NAKBAS, NAKCIR, NAKIN and NAKOUT correspond directly
to ACKBAS, ACKCIR, ACKIN and ACKOUT, except that NAKCIR
contains the size of the relevant NAK frame.
For a description of PNDTBL and GATHER, refer Appendix
B3.
RRASSR contains RR frames (1 for each channel).
SETB-A contains SETB frames (1 for each channel).
"entry" contains index of transmission buffer.
TXCOUT points to next buffer to be released.
TXCLACK points to next buffer requiring ACK.
TXNEXT points to next buffer to be transmitted.
TXCIN points to next place for insertion of transmission
buffer.
HIFTXOUT has work to do as long as TXCOUT LT TXCLACK.
TRANS has work to do as long as TXNEXT LT TXCIN.
NCOUNT corresponds directly to TXCIR and contains the
number of times that entry has been transmitted.
XMTTBL, XMTIN and XMTOUT work exactly as TXCIR, TXCIN
and TXNEXT.
Q̲u̲e̲u̲e̲s̲ ̲(̲F̲I̲F̲O̲ ̲s̲t̲a̲c̲k̲s̲)̲
a) CANLDU = LDU's cancelled by HOST
b) CURLDU = LDU's corresponding to input requests
issued by HOST.
c) HOSTRQ = queue for returning segments to HOST.
d) INQUE = queue for incoming data frames.
S̲t̲a̲c̲k̲s̲,̲ ̲P̲o̲o̲l̲s̲ ̲(̲F̲I̲L̲O̲)̲
General layout:
a) HRXSTK = pool of receive buffers
b) HSTEMP = stack of transmission buffers going to
be returned to HOST.
c) STKEMP = pool of receive buffer for sending fatal
error reports (HRXSTK may be empty).
d) STKRXE = pool of LTU receive buffers (for receiving
frames from line).
e) STKTXE = pool of LTU transmission buffers.
f) STSRET = stack for returning status to HOST.