|
|
DataMuseum.dkPresents historical artifacts from the history of: RegneCentralen RC3600/RC7000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RegneCentralen RC3600/RC7000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 40960 (0xa000)
Types: TextFile
Notes: RCSL-43-GL-, RCSL-43-GL-7022, RCSL-43-GL-7023, RCSL-43-GL-7024
Names: »S299«
└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image
└─⟦this⟧ »/S299«
! RCSL: 43-GL7023
AUTHOR: FVN
EDITED: 78.05.15
PROGRAM RC36-00299.03
IBM 2780 COMMUNICATION MODULE.
KEYWORDS: MUSIL, DRIVER, IBM 2780 LINEPROCEDURE, LISTING.
ABSTRACT: IBM 2780 COMMUNICATION MODULE, USING SYNCRON
COMMUNICATION CONTROLLER, 3680, OR SYNCRON MUL-
TIPLEXER, 3681.
SPECIAL DRIVER INTERFACE TO APPLICATION PROGRAMS.
DATA HANDLED IN V OR VB FORMATS.
TRANSMISSION CODE: EBCDIC.
RCSL:43-GL7022: ASCII SOURCE TAPE.
RCSL:43-GL7024: BIN. REL. OBJECT TAPE. PROCESS NAME: 2780P.
!
«ff»
! RC36-00299 PAGE 01
TITLE: 2780P
VERSION: 00299, OCTOBER 6. 1976.
ABSTRACT: IBM 2780 COMMUNICATION MODULE, USING SYNCRON
COMMUNICATION CONTROLLER, 3680, OR SYNCRON MUL-
TIPLEXER, 3681.
SPECIAL DRIVER INTERFACE TO APPLICATION PROGRAMS.
DATA HANDLED IN V OR VB FORMATS.
TRANSMISSION CODE: EBCDIC.
ENVIRONMENTS: SIZE: 7100 BYTES INCLUDING TWO 842 BYTES LINE-
BUFFERS.
NAMES: SCD32/SCD34/SMX0/SMX1/ ... /SMX9,
CMON, MUSIL INTERPRETER.
CODEPROCEDURES:
NAME: RCSL 43-GL:
INITSCDPROG 1251
RETURNANSWER 1218
WAITMESSAGE 1227
REGRETDELAY 1214
CDELAY 1200
INITCOROUT 1209
WAIT 1224
SIGNAL 1221
COEND 1206
COBEGIN 1203
PASS 1212
NEXTSHARE 1840
SPECIAL REQUIREMENTS:
MUSIL COROUTINE CODE COMPILER.
MUSIL COROUTINE MONITOR, CM000 OR LATER VERSIONS.
MUSIL INTERPRETER: INT05, OR LATER VERSIONS.
BASIC CONFIGURATIONS: BTP05, BTM05, BTC03, BTF02,
BTM804 OR LATER VERSIONS.
COMMUNICATION DRIVERS: SCD03, SCD04, SCD03-SCD13,
SCD04-SCD14, SMD02-SX001, SMD02-SMX00, SMD02-SMX01,
... , SMD02-SMX09.
!
«ff»
! RC36-00299 PAGE 02
IBM 2780 WORKSTATION COMMUNICATION MODULE
-----------------------------------------
GENERAL DESCRIPTION
-------------------
THE DRIVER MODULE CONFORMS TO THE IBM 2780 BINARY SYNCRONOUS
COMMUNICATION AS SUPPORTED BY THE IBM BTAM AND RTAM ACCESS ME-
THODS.
DATA IS HANDLED IN TWO STREAMS, STREAM 1 FOR INPUT DATA AND
STREAM 2 FOR OUTPUT DATA. THE TWO DATA STREAMS CANNOT RUN SIMUL-
TANEOUSLY AND CANNOT BE HANDLED INDEPENDENTLY.
DATA IS ALWAYS HANDLED IN V OR VB FORMATS.
THE R_DS ARE BLOCKED ON THE LINE AS IN THE SHARE OF THE
APPLICATION MODULE.
MAXIMUM BLOCKSIZE ON THE LINE IS 400 CHARACTERS, INCLUDING STX'S,
IUS'S, EM'S AND ETB/ETX'S.
CONTROL OPERATION
-----------------
THE NORMAL RESERVATION BIT (BIT13) IS CALLED CONNECTION, AND
THE NORMAL POSITION BIT (BIT 10) IS CALLED RESERVATION.
BIT NO NAME USE
13 CONNECTION NOT USED YET.
10 RESERVATION THE ACTION DEPENDS UPON THE CONTENTS OF SPE-
CIAL2 AND SPECIAL3.
SPECIAL2 SELECTS CHANNEL- AND STREAM-NUMBER:
SPECIAL2 = CHANNELNO*4 + STREAMNO.
STREAMNO IS USED FOR CONTROL OF RESERVATION.
THE POSSIBLE STREAMNOS ARE:
0: STATUS INPUT STREAM, NOT USED YET.
1: DATA INPUT STREAM.
2: DATA OUTPUT STREAM.
CHANNELNO IS USED FOR SELECTION OF LINE DRIVERS.
THE POSSIBLE CHANNELNOS AND THE CORRESPONDING
DRIVER NAMES ARE:
0: SCD32
1: SCD34
32: SMX0
33: SMX1
. .
. .
41: SMX9
SPECIAL3 <> 0 MEANS RESERVATION OF STREAM, CON-
NECTION OF LINE, IF NOT CONNECTED, AND ACTIVA-
TION OF LINE-COMMUNICATION.
SPECIAL3 = 0 MEANS SUSPENSION OF STREAM, AND
ITS RESERVATION WILL BE CANCELLED.
9 DISCONNECTION SUSPENSION AND DERESERVATION OF ALL STREAMS,
DISC (DLE-EOT) IS SENT, THE LINE IS DISCON-
NECTED AND THE LINEDRIVER IS RELEASED.
«ff»
RC36-00299 PAGE 03
TRANSPUT OPERATION
------------------
TRANSPUT OPERATIONS HAVE THE FORMAT
CHANNELNO * 1024 + STREAMNO * 256 + OP + MODE
THE ALLOWED VALUES, AND THEIR MEANINGS:
CHANNELNO: NOT USED YET.
STREAMNO: IS USED FOR CONTROL OF RESERVATION.
SAME MEANING AS STREAMNO IN RESERVATION MESSAGE.
OP: 1: INPUT OPERATION.
3: OUTPUT OPERATION.
MODE: THE MODE BITS, BIT(8:13) HAVE DIFFERENT MEANINGS
FOR INPUT AND OUTPUT OPERATIONS.
TRANSPUT OPERATIONS WILL NOT BE ACCEPTED, UNLESS THE SELECTED STREAM
IS ACTIVE AND NOT RESERVED BY OTHER PROCESSES.
NOTE: IF STREAM IS SUSPENDED AFTER ERRORS, TRANSPUT MESSAGES WILL
BE REJECTED WITH STATUS = ILLEGAL UNTIL THE STREAM IS ACTIVATED AGAIN
BY A RESERVATION MESSAGE.
DATA INPUT OPERATION
--------------------
OP+MODE:
1 DATA FROM THE LINE IS DELIVERED IN VB FORMAT.
BOTH TRANSPARENT AND NONTRANSPARENT DATA ARE ACCEPTED.
EVENTUAL END-MEDIUM CHARACTERS IN RECEIVED RECORDS ARE
NOT REMOVED, AND THE RECORDS WILL NOT BE LENGTHENED WITH
BLANKS.
DATA OUTPUT OPERATION
---------------------
BY OUTPUT, DATA SHALL BE IN V OR VB FORMAT.
IF TRANSPARENT MODE IS SPECIFIED ALL CHARACTER-CODES CAN BE TRANS-
MITTED. IN NONTRANSPARENT MODE DATA MAY NOT CONTAIN THE COMMUNICATION
CONTROL CHARACTERS.
TRAILING BLANKS WILL NOT BE SKIPPED.
OP+MODE:
3 NONTRANSPARENT MODE.
BLOCK TERMINATOR = ETB.
7 TRANSPARENT MODE.
BLOCK TERMINATOR = ETB.
11 NONTRANSPARENT MODE.
BLOCK TERMINATOR = ETX (LAST BLOCK).
15 TRANSPARENT MODE.
BLOCK TERMINATOR = ETX (LAST BLOCK).
«ff»
RC36-00299 PAGE 04
STATUS
------
1B0 LOGICAL DISCONNECTED. (E.G. DATASET NOT READY, RETRIES
EXHAUSTED). - THE STREAM IS SUSPENDED.
1B1 NOT READY. - THE STREAM IS STILL ACTIVE.
USED BY INPUT AT NO BID RECEIVED.
USED WHEN NO ANSWER OR CONTENTION ON BID (OUTPUT).
INTENDED FOR ADDITIONAL USE IN FUTURE AT:
WACK RECEIVED (OUTPUT).
TTD RECEIVED (INPUT).
ERROR ON LINE - TRYING TO REESTABLISH COMMUNICATION.
1B3 RVI RECEIVED (OUTPUT). - THE STREAM IS STILL ACTIVE.
1B6 ILLEGAL. - THE STREAM IS SUSPENDED.
EXAMPLES OF USE: STREAM RESERVED, STREAM SUSPENDED, OTHER
STREAMS ACTIVE, COMMUNICATION DRIVER RESERVED.
1B7 END OF FILE. ETX RECEIVED (INPUT).
1B8 BLOCK LENGTH ERROR. ILLEGAL LENGTH OF BLOCK RECEIVED FROM
LINE, OR ILLEGAL LENGTH OF BLOCK DELIVERED FROM APPLICA-
TION PROGRAM.
1B11 EOT RECEIVED. - THE STREAM IS SUSPENDED.
COMMUNICATION ABORTED FROM OTHER SITE.
BIT COMBINATIONS:
1B7+1B11
END OF FILE AND END OF TRANSMISSION. - THE STREAM IS SUSPENDED.
ETX - EOT RECEIVED. (INPUT)
1B0+1B11 OR 1B0+1B7+1B11
DISC (DLE-EOT) RECEIVED. THE STREAM IS SUSPENDED.
THE OTHER SITE HAS SIGNALLED THAT THE LINE WILL BE DISCON-
NECTED.
!
«ff»
! RC36-00299 PAGE 05
REVISIONS:
NEW VERSION DATE PAGE AUTHOR CHANGE
175.00 75.07.09 FVN FIRST VERSION.
175.01 75.XX.XX FVN ERROR IN CODEPROCEDURE CORRECTED.
175.02 75.10.03 HKA HANDLING OF EOT AS LASTCHAR.
TIMEOUT CONSTANTS TO ALLOW
600 BPS TRANSMISSION.
TRANSPARENCY IMPLEMENTED.
175.03 75.11.20 FVN SCD PROG CORRECTIONS FOR
TRANSPARENCY. EOT RECOVERY.
275.00 76.03.22 HKA INTERFACE TO APPLICATION PRO-
GRAMS. CONTROLC AND TRANSPUTC
INCLUDED IN MESSAGEC. SELEC-
TION OF CHANNEL.
XXX.00 76.03.25 HKA CHANGES FROM 3780 TO 2780
MODULE.
281.00 76.04.22 HKA MAXBYTES, DATAOFFSET, DSIZE,
SCDHEAD.
299.00 76.10.06 HKA MAXBYTES, DATAOFFSET, DSIZE,
SCDHEAD: CHANGES TO STD. MODULE
HANDLING OF DISC MESSAGES.
HANDLING OF ETX.
299.01 77.01.10 FVN NO EOT IN WAIT BID STATE.
ONLY NAK RESPONSE ON PARITY ERROR.
299.02 77.06.21 FVN NOT READY RETURNED IN CASE OF CON-
TENTION OR NO ANSWER TO BID.
299.03 78.05.15 FVN LOSS OF MESSAGEBUFFERS PREVENTED.
CONTENTION RETRYCOUNT = BID
RETRYCOUNT.
!
«ff»
! RC36-00299 PAGE XX !
CONST
! EBCDIC TRANSMISSION CHARACTERS !
SOH= 1, STX= 2, ETX= 3,
DLE= 16, ! IGS= 29, IRS= 30, !
IUS= 31, ETB= 38, ESC= 39,
ENQ= 45, SYN= 50, EOT= 55,
NAK= 61, MAXC= 63,
! DLE TRAILERS !
ACK0= 112, ! HEX 70 !
ACK1= 97, ! 61 / !
ACKSUM= 209, ! ACK0+ACK1 !
WACK= 107, ! 6B , !
RVI= 124, ! 7C @ !
DISC= 196, ! C4 D !
! INTERNAL DATA-CONTROL-FIELDS !
BLKEND= 255,
! REPLACING FIRST BYTE OF LENGTH-FIELD AFTER LAST !
! RECORD IN SCDOUTPROG. !
! DEFAULT CCW !
SP1A= 97, ! HEX 61 / !
! BLOCKTYPE STATUS BIT !
ETEQ= 3, ! EOT,ENQ !
EBEX= 4, ! ETB,ETX !
RWNACK= 5, ! RVI, WACK, NAK, ACK !
BLKSYNTAX= 7, ! SYNTAX ERROR !
! SCD PROGRAM !
SCDHEAD = #
0 0 ! TIMING !
3 ! CHAR LENGTH = 8 BIT !
50 ! SYN !
0 ! PARITY = NO !
63 ! SUBSTITUTE = MAXC !
5 ! CHECK = CRC16 !
0 ! RESERVED FOR FUTURE USE !
1 172 ! DATAOFFSET = 428 !
0 10 ! CONTROLOFFSET = 10 !
30 120 ! TIMEOUT 0,1 INPUT: !
10 10 ! TIMEOUT 2,3 !
120 0 ! TIMEOUT 4,5 OUTPUT: !
10 0 ! TIMEOUT 6,7 !
0 0 ! INPUT PROGRAM ADDRESS !
0 0 ! OUTPUT PROGRAM ADDRESS !
#,
«ff»
! RC36-00299 PAGE XX !
SCDINPROG = #
2 ! .INPUT GET !
14 16 17 ! IFEQ DLE GOTO DLEBLK !
4 ! PUT !
14 2 95 ! IFEQ STX GOTO NTBLK !
14 45 36 ! IFEQ ENQ GOTO ETEQBL !
14 61 26 ! IFEQ NAK GOTO RSPBLK !
14 55 30 ! IFEQ EOT GOTO ETEQBL !
18 7 ! .SYNTAX SETSTA BLKSYNTAX !
0 ! TRMBLK !
2 ! .DLEBLK GET !
14 2 26 ! IFEQ STX GOTO TRBLK !
14 112 13 ! IFEQ ACK0 GOTO RSPBLK !
14 97 10 ! IFEQ ACK1 GOTO RSPBLK !
14 124 7 ! IFEQ RVI GOTO RSPBLK !
14 55 8 ! IFEQ EOT GOTO DISCBLK !
17 107 21 ! IFNEQ WACK GOTO SYNTAX !
4 ! .RSPBLK PUT !
18 5 ! SETSTA RWNACK !
0 ! TRMBLK !
6 16 ! .DISCBLK LOAD DLE !
4 ! .PETEQ PUT !
18 3 ! .ETEQBL SETSTA ETEQ !
0 ! TRMBLK !
4 ! .TRBLK PUT !
28 ! ZEROBC !
36 2 ! SETLFS 2 !
12 43 ! GOTO TRBREC !
30 ! .TRABC ACUMBC !
4 ! .TRPUT PUT !
2 ! .TRGET GET !
17 16 5 ! IFNEQ DLE GOTO TRABC !
2 ! GET !
15 50 7 ! IFEQ SYN GOTO TRGET !
30 ! ACUMBC !
14 38 81 ! IFEQ ETB GOTO ENDBLK !
14 3 78 ! IFEQ ETX GOTO ENDBLK !
15 45 29 ! IFEQ ENQ GOTO PETEQ !
15 55 32 ! IFEQ EOT GOTO PETEQ !
17 31 24 ! IFNEQ IUS GOTO TRPUT !
26 ! .TRIUS TRMSTR !
32 ! COMPBC !
28 ! ZEROBC !
2 ! .TRIUSYN GET !
15 50 3 ! IFEQ SYN GOTO TRIUSYN !
17 16 73 ! IFNEQ DLE GOTO SYNTAX !
30 ! ACUMBC !
2 ! GET !
17 2 78 ! IFNEQ STX GOTO SYNTAX !
30 ! ACUMBC !
24 ! .TRBREC BEGSTR !
13 42 ! GOTO TRGET !
255 255 ! DUMMY STATEMENT !
«ff»
! RC36-00299 PAGE XX !
28 ! .NTBLK ZEROBC !
36 2 ! SETLFS 2 !
24 ! BEGSTR !
12 3 ! GOTO NTGET !
30 ! .NTABC ACUMBC !
4 ! .NTPUT PUT !
2 ! .NTGET GET !
43 55 5 ! .NTCCC IFGT MAXCC GOTO NTABC !
15 50 6 ! IFEQ SYN GOTO NTGET !
30 ! ACUMBC !
14 31 15 ! IFEQ IUS GOTO NTEREC !
14 38 26 ! IFEQ ETB GOTO ENDBLK !
14 3 23 ! IFEQ ETX GOTO ENDBLK !
15 55 84 ! IFEQ EOT GOTO PETEQ !
15 45 87 ! IFEQ ENQ GOTO PETEQ !
13 25 ! GOTO NTPUT !
26 ! .NTEREC TRMSTR !
32 ! COMPBC !
28 ! ZEROBC !
2 ! .NTIUSYN GET !
15 50 3 ! IFEQ SYN GOTO NTIUSYN !
24 ! BEGSTR !
17 2 34 ! IFNEQ STX GOTO NTCCC !
30 ! ACUMBC !
13 38 ! GOTO NTGET !
26 ! .ENDBLK TRMSTR !
4 ! PUT !
32 ! COMPBC !
18 4 ! SETSTA EBEX !
0 ! TRMBLK !
! .END SIZE: 155 !
#,
«ff»
! RC36-00299 PAGE XX !
SCDOUTPROG = #
6 50 ! .OUTPUT LOAD SYN !
4 ! PUT !
4 ! PUT !
4 ! PUT !
4 ! PUT !
2 ! GET !
8 ! SAVE !
14 112 32 ! IFEQ ACK0 GOTO ARESP !
14 97 29 ! IFEQ ACK1 GOTO ARESP !
14 107 26 ! IFEQ WACK GOTO ARESP !
14 196 20 ! IFEQ DISC GOTO DISCBLK !
4 ! PUT !
14 2 80 ! IFEQ STX GOTO NTOUT !
14 16 22 ! IFEQ DLE GOTO TROUT !
14 61 9 ! IFEQ NAK GOTO OEBLK !
14 45 6 ! IFEQ ENQ GOTO OEBLK !
14 55 3 ! IFEQ EOT GOTO OEBLK !
18 7 ! .OSYNT SETSTA BLKSYNTAX !
0 ! .OEBLK TRMBLK !
6 55 ! .DISCBLK LOAD EOT !
8 ! SAVE !
6 16 ! .ARESP LOAD DLE !
4 ! PUT !
10 ! UNSAVE !
4 ! PUT !
0 ! TRMBLK !
6 2 ! .TROUT LOAD STX !
4 ! PUT !
28 ! ZEROBC !
36 2 ! SETLFS 2 !
2 ! GET !
14 255 80 ! IFEQ BLKEND GOTO OEBEX !
24 ! .TRREC BEGSTR !
2 ! .OTCHAR GET !
30 ! ACUMBC !
4 ! PUT !
14 16 36 ! IFEQ DLE GOTO DLEPUT !
23 7 ! .OTDEC DECJNZ OTCHAR !
2 ! GET !
14 255 25 ! IFEQ BLKEND GOTO OTTBLK !
24 ! BEGSTR !
6 16 ! LOAD DLE !
4 ! PUT !
6 31 ! LOAD IUS !
30 ! ACUMBC !
4 ! PUT !
32 ! COMPBC !
28 ! ZEROBC !
6 50 ! LOAD SYN !
4 ! PUT !
4 ! PUT !
6 16 ! LOAD DLE !
30 ! ACUMBC !
4 ! PUT !
6 2 ! LOAD STX !
30 ! ACUMBC !
4 ! PUT !
13 35 ! GOTO OTCHAR !
6 16 ! .OTTBLK LOAD DLE !
4 ! PUT !
12 38 ! GOTO OEBEX !
4 ! .DLEPUT PUT !
13 37 ! GOTO OTDEC !
«ff»
! RC36-00299 PAGE XX !
28 ! .NTOUT ZEROBC !
36 2 ! SETLFS 2 !
2 ! GET !
14 255 28 ! IFEQ BLKEND GOTO OEBEX !
24 ! .NTREC BEGSTR !
2 ! .ONCHAR GET !
30 ! ACUMBC !
4 ! PUT !
23 4 ! DECJNZ ONCHAR !
2 ! GET !
14 255 18 ! IFEQ BLKEND GOTO OEBEX !
24 ! BEGSTR !
6 31 ! LOAD IUS !
30 ! ACUMBC !
4 ! PUT !
32 ! COMPBC !
28 ! ZEROBC !
6 50 ! LOAD SYN !
4 ! PUT !
4 ! PUT !
6 2 ! LOAD STX !
30 ! ACUMBC !
4 ! PUT !
13 25 ! GOTO ONCHAR !
2 ! .OEBEX GET !
4 ! PUT !
15 45 103 ! IFEQ ENQ GOTO OEBLK !
14 38 4 ! IFEQ ETB GOTO OEB !
17 3 111 ! IFNEQ ETX GOTO OSYNT !
30 ! .OEB ACUMBC !
32 ! COMPBC !
0 ! TRMBLK !
! .END SIZE: 151 !
#,
«ff»
! RC36-00299 PAGE XX !
! TRANSMISSION CONSTANTS !
CSIZE=30,
CONTROLOFFSET=10,
MAXBYTES=404, ! MAX OUTPUT LENGTH, STX, L.FIELD(2), BLKEND, INCLUDED !
DATAOFFSET=428, ! 400 DLES, 10SYNS, 4DLE-STX, 8BCCS, PAD AND SAFE(1) !
DSIZE=842, ! CONTROLOFFSET + MAXBYTES + DATAOFFSET !
RESPTIME=20,
INTIME=8'000000,
OUTTIME=8'002000,
BLOCKTIME=8'000000,
SHORTTIME=8'001000,
REPLIMIT=75,
BIDLIMIT=3,
! BLOCK TYPES !
ETBETX=8'4000,
EOTENQ=8'10000,
WNACKR=8'2000,
! LINE STATES !
DISCONNECTED= -1,
NEUTRAL= 0,
WAITBID= 1,
RECEIVE= 2,
WACKSENT= 3,
BIDSENT= 4,
TRANSMIT= 5,
TTDSENT= 6,
«ff»
! RC36-00299 PAGE XX !
! BOOLEANS !
TRUE=1,
FALSE=0,
! OPERATIONS !
TRANSPUTOP= 8'000001,
INPUTOP= 8'000001,
OUTPUTOP= 8'000003,
CONTROLOP= 8'000000,
TIMEOUTOP= 8'000002,
CONNECTOP= 8'000004,
SETNEUTRALOP= 8'000020,
DISCOP= 8'000100,
! MODES !
INPUT= 1,
OUTPUT= 3,
REPOUT= 7,
LASTDATA= 8'000010,
TRPDATA= 8'000004,
COFF= 8'010000,
DOFF= 8'000000,
COUTPUT= 8'013003, ! OUTPUT + COFF + OUTTIME + SHORTTIME !
CINPUT= 8'010001, ! INPUT + COFF + INTIME + BLOCKTIME !
DOUTPUT= 8'002003, ! OUTPUT + DOFF + OUTTIME + BLOCKTIME !
DINPUT= 8'010001, ! INPUT + COFF + INTIME + BLOCKTIME !
REPDOUT= 8'002007, ! REPOUT + DOFF + OUTTIME + BLOCKTIME !
! TEXTS !
ERRTXT= "<10>ERROR NO ",
SCDNAMES= "SCD32<0>SCD34<0>",
SMX0= "SMX0<0><0>",
«ff»
! RC36-00299 PAGE XX !
! COROUTINE CONSTANTS !
NEUTRALSEM= "<0><1>",
OPENSEM= "<0><3>",
COKIND= 8'100002, ! BLOCKED, COROUTINE !
TESTOUT= 8'077400,
PRIORITY= 8'100000,
! STATUS ANSWERS !
REJECTSTATUS= "<2'00000010><0><0><0>",
ZEROSTATUS= "<0><0><0><0>",
NOTPSTATUS= "<0><2'00000001><0><0>",
! LINE DRIVER STATUS CONSTANTS !
LINENOTREADY= 2'1000000000000000,
LINERESERVED= 2'0000001000000100,
LINETIMEOUT= 2'0000000000000010,
! COMMUNICATION MODULE STATUS CONSTANTS !
CLEANBITS= 2'1110001111110010,
EOF= 2'0000000100000000,
EOFEOT= 2'0000000100010000,
EOFDISC= 2'1000000100010000,
BLKLENGTHERROR= 2'0000000010000000,
ABORT= 2'0000000000010000,
DISCSTATUS= 2'1000000000010000,
REVERSEINTRPT= 2'0001000000000000,
LOGICALDISC= 2'1000000000000000,
NOTREADY= 2'0100000000000000,
ILLEGAL= 2'0000001000000000,
HARDBITS= 2'1000001000010000,
SOFTBITS= 2'0100000100000000,
! OPERATION BITS !
CONNECT= 8'000004,
RESERVATION= 8'000040,
DISCONNECT= 8'000100;
«ff»
! RC36-00299 PAGE XX !
TYPE
TESTRECORD = STRING(32);
SEMAPHORE = STRING(2);
SHAREDBUF = RECORD
REQUEST: SEMAPHORE;
COMPLETION: SEMAPHORE;
MUTEX: SEMAPHORE;
SHARED: STRING(8);
OPERATION: INTEGER FROM 7;
STATUS: INTEGER FROM 7;
STATUSC: STRING(4) FROM 7;
COUNT: INTEGER FROM 9;
ADDRESS: INTEGER FROM 11;
RESERVE: INTEGER FROM 13
END;
COROUTINE = STRING(16);
DESCRIPTERWORD=
RECORD
DW: STRING(4);
LENGTH: INTEGER FROM 1;
SEGMENTCODE:INTEGER FROM 3
END;
«ff»
! RC36-00299 PAGE XX !
VAR
TESTR: TESTRECORD;
MESSAGEC, TIMERC, LINEC: COROUTINE;
MESSAGE, LINE, TIMER: SHAREDBUF;
BDW, RDW: DESCRIPTORWORD;
BLKTERMINATOR: STRING(1);
SENDER, BUF, STREAM, CHANNEL, RESERVER, REJECT, ACTIVESTREAM: INTEGER;
CNTRLOUTP, BLOCKTYPE, REPCOUNT: INTEGER;
TCOUNT, TADDRESS, BLKTERM, REQSENT, RECORDL: INTEGER;
OP, OPCOMPLETED: INTEGER;
LINESTATUS, ERRORCODE, ENQCOUNT: INTEGER;
OPTXT: STRING(6);
LINESTATE, TIMEOUT, WAITTIME: INTEGER;
CHAR, LASTCHAR, LENGTH, RESPSTATE, LASTSENT, DLENGTH: INTEGER;
STARTSHARE, SLENGTH, SCOUNT: INTEGER;
HEADER, HEADERPOINT: INTEGER;
SHAREADDR, NXTSHAREREC, TOPSHARE: INTEGER; ! LINE SHARE POINTERS !
RDWADDR, NXTRDWADDR, RECORDADDR, TOPBUF: INTEGER; ! APPL. BUF. POINTERS !
BSCCONTROL: FILE
"SCD32",COKIND,2,CSIZE,UB;
GIVEUP BSCCERROR, 8'177777;
CONV SCDHEAD
OF STRING(1);
BSCDATA: FILE
"SCD32",COKIND,2,DSIZE,UB;
GIVEUP BSCDERROR, 8'177777
OF STRING(1);
ABSCORE: FILE
"TTY",1,1,1,U
OF STRING(1);
«ff»
! RC36-00299 PAGE XX !
PROCEDURE NEXTSHARE(FILE Z);
! Z.ZUSED:= Z.ZUSED.NEXT !
CODEBODY;
PROCEDURE PASS;
CODEBODY;
PROCEDURE COBEGIN(VAR COROUT: COROUTINE;
CONST IDENT: INTEGER);
CODEBODY;
PROCEDURE COEND(VAR COROUT: COROUTINE);
CODEBODY;
PROCEDURE SIGNAL(VAR SEM: SEMAPHORE);
CODEBODY;
PROCEDURE WAIT(VAR SEM: SEMAPHORE);
CODEBODY;
PROCEDURE INITCOROUT(VAR WORK: TESTRECORD);
CODEBODY;
PROCEDURE CDELAY(VAR TIME: INTEGER);
CODEBODY;
PROCEDURE REGRETDELAY(VAR COROUT: COROUTINE);
CODEBODY;
PROCEDURE WAITMESSAGE(VAR MESSAGE: STRING(8);
VAR SENDER: INTEGER;
VAR BUF: INTEGER);
CODEBODY;
PROCEDURE RETURNANSWER(VAR ANSWER: STRING(8);
VAR BUF: INTEGER);
CODEBODY;
PROCEDURE INITSCDPROG(FILE SCDZONE;
VAR INPROG: STRING(1);
VAR OUTPROG: STRING(1));
CODEBODY;
«ff»
PROCEDURE INITBSC; ! RC36-00299 PAGE XX !
BEGIN
WAITTRANSFER(BSCCONTROL);
BSCCONTROL.ZMODE:= OUTPUT;
BSCCONTROL.ZREM:= CSIZE;
PUTREC(BSCCONTROL,CONTROLOFFSET);
END;
PROCEDURE SENDBSC;
BEGIN
INITBSC;
OUTCHAR(BSCCONTROL,LASTSENT);
IF LINESTATE=RECEIVE THEN GOTO 520;
GOTO 510;
END;
PROCEDURE SENDENQ;
BEGIN
LASTSENT:= ENQ;
SENDBSC;
END;
PROCEDURE SENDACK;
BEGIN
LASTSENT:= RESPSTATE;
SENDBSC;
END;
PROCEDURE SENDNAK;
BEGIN
LASTSENT:= NAK;
SENDBSC;
END;
PROCEDURE SENDWACK;
BEGIN
LASTSENT:= WACK;
SENDBSC;
END;
PROCEDURE SENDTTD;
BEGIN
INITBSC;
OUTCHAR(BSCCONTROL,STX); OUTCHAR(BSCCONTROL,BLKEND);
OUTCHAR(BSCCONTROL,ENQ);
GOTO 510;
END;
PROCEDURE CALLREPLY;
BEGIN
INITBSC;
OUTCHAR(BSCCONTROL,ENQ);
TRANSFER(BSCCONTROL,CSIZE-BSCCONTROL.ZREM,COUTPUT);
LASTSENT:= ENQ;
NEXTSHARE(BSCCONTROL); WAITTRANSFER(BSCCONTROL);
TRANSFER(BSCCONTROL,CSIZE,CINPUT);
GOTO 5325;
END;
«ff»
! RC36-00299 PAGE XX !
PROCEDURE WAITCONTROLZONE;
BEGIN
BSCCONTROL.ZMODE:= INPUT;
WAITZONE(BSCCONTROL);
END;
PROCEDURE OUTEOTDISC;
BEGIN
WAITCONTROLZONE;
INITBSC;
OUTCHAR(BSCCONTROL,LASTSENT);
TRANSFER(BSCCONTROL,CSIZE-BSCCONTROL.ZREM,COUTPUT);
NEXTSHARE(BSCCONTROL);
WAITCONTROLZONE;
END;
PROCEDURE SENDEOT;
BEGIN
LASTSENT:= EOT;
OUTEOTDISC;
END;
PROCEDURE SENDDISC;
BEGIN
LASTSENT:= DISC;
OUTEOTDISC;
END;
«ff»
! RC36-00299 PAGE XX !
PROCEDURE RELEASEOPERATION;
BEGIN
OPCOMPLETED:= TRUE;
SIGNAL(LINE.MUTEX);
SIGNAL(LINE.COMPLETION);
END;
PROCEDURE GETOPERATION;
BEGIN
IF OPCOMPLETED <> TRUE THEN GOTO 9;
0: WAIT(LINE.REQUEST);
OPCOMPLETED:= FALSE;
REPCOUNT:= 0;
IF LINE.OPERATION=CONTROLOP THEN
BEGIN ! PERFORM CONTROL FUNCTION !
REGRETDELAY(TIMERC);
IF LINE.COUNT=INPUTOP THEN
BEGIN ! PREPARE TO RECEIVE !
LINESTATE:= WAITBID;
BSCDATA.ZMODE:= INPUT;
RELEASEOPERATION;
GOTO 511;
END;
IF LINE.COUNT=OUTPUTOP THEN
BEGIN ! PREPARE TO TRANSMIT !
LINESTATE:= BIDSENT;
TIMEOUT:= SHORTTIME;
BSCDATA.ZMODE:= OUTPUT;
RELEASEOPERATION;
SENDENQ;
END;
IF LINE.COUNT=SETNEUTRALOP THEN
BEGIN ! RETURN TO NEUTRAL !
IF LINESTATE > WAITBID THEN SENDEOT;
LINESTATE:= NEUTRAL;
GOTO 509;
END;
IF LINE.COUNT=CONNECTOP THEN GOTO 508;
IF LINE.COUNT=DISCOP THEN GOTO 507;
IF LINE.COUNT=TIMEOUTOP THEN
BEGIN ! RESPONSE TIMEOUT !
OPCOMPLETED:= TRUE;
SIGNAL(LINE.MUTEX);
IF LINESTATE=RECEIVE THEN
BEGIN ! OBTAIN RECEIVE DELAY !
LINESTATE:= WACKSENT;
SENDWACK;
END;
IF LINESTATE=WACKSENT THEN SENDWACK;
IF LINESTATE=TRANSMIT THEN
BEGIN ! INTRODUCE TRANSMISSION DELAY !
LINESTATE:= TTDSENT;
SENDTTD;
END;
IF LINESTATE=TTDSENT THEN SENDTTD;
GOTO 0; ! IGNORE TIMEOUT !
END;
END;
9:
REGRETDELAY(TIMERC);
PASS;
END;
«ff»
! RC36-00299 PAGE XX !
PROCEDURE SETNEUTRAL;
BEGIN
LINESTATE:= NEUTRAL;
GOTO 505;
END;
PROCEDURE SETDISCONNECTED;
BEGIN
IF LINESTATE > NEUTRAL THEN SENDEOT;
SENDDISC;
BSCCONTROL.ZREM:= BSCCONTROL.ZSHAREL;
CLOSE(BSCCONTROL,TRUE);
LINESTATE:= DISCONNECTED;
RELEASEOPERATION;
GOTO 505;
END;
PROCEDURE CHECKRETRIES;
BEGIN
REPCOUNT:= REPCOUNT + 1;
IF REPCOUNT=REPLIMIT THEN
BEGIN
GETOPERATION;
LINESTATUS:= LOGICALDISC;
RELEASEOPERATION;
SETNEUTRAL;
END;
END;
PROCEDURE CHECKDLEEOT;
BEGIN
IF BLOCKTYPE = EOTENQ THEN
BEGIN
IF CHAR <> EOT THEN IF CHAR <> DLE THEN GOTO 19;
GETOPERATION;
IF CHAR = DLE THEN LINESTATUS:= DISCSTATUS
ELSE LINESTATUS:= ABORT;
RELEASEOPERATION;
SETNEUTRAL;
END;
19:
END;
PROCEDURE INITLINE;
BEGIN
BSCCONTROL.ZMODE:= OUTPUT;
BSCCONTROL.ZREM:= CSIZE;
CLOSE(BSCCONTROL,0);
OPEN(BSCCONTROL,OUTPUT);
END;
PROCEDURE CHECKSUSPENDERRORS;
BEGIN
IF ERRORCODE AND LINERESERVED <> 0 THEN
BEGIN
GETOPERATION;
LINESTATUS:= ILLEGAL;
LINESTATE:= DISCONNECTED;
RELEASEOPERATION;
GOTO 505;
END;
IF ERRORCODE AND LINENOTREADY <> 0 THEN
BEGIN
GETOPERATION;
LINESTATUS:= LOGICALDISC;
RELEASEOPERATION;
SETNEUTRAL;
END;
END;
«ff»
! RC36-00299 PAGE XX !
PROCEDURE SWAPACK;
BEGIN
RESPSTATE:= ACKSUM - RESPSTATE;
END;
PROCEDURE OUTERROR;
BEGIN
OPMESS(ERRTXT); BINDEC(ERRORCODE,OPTXT);
OPMESS(OPTXT);
END;
PROCEDURE CHECKBIDRETRY;
BEGIN
REPCOUNT:= REPCOUNT+1;
IF REPCOUNT=BIDLIMIT THEN
BEGIN
GETOPERATION;
LINESTATUS:= NOTREADY;
RELEASEOPERATION;
SETNEUTRAL;
END;
END;
«ff»
PROCEDURE BSCCERROR;
BEGIN
IF BSCCONTROL.ZMODE=INPUT THEN
BEGIN
BLOCKTYPE:= BSCCONTROL.Z0 AND 8'016000;
IF BLOCKTYPE=BSCCONTROL.Z0 THEN GOTO 90;
IF BSCCONTROL.Z0 = LINETIMEOUT THEN
BEGIN
IF LINESTATE=WAITBID THEN
BEGIN
GETOPERATION;
LINESTATUS:= NOTREADY;
RELEASEOPERATION;
GETOPERATION;
INITLINE;
GOTO 511; ! REPEAT INPUT OPERATION !
END;
IF LINESTATE=BIDSENT THEN
BEGIN
CHECKBIDRETRY;
GOTO 80;
END;
END;
ERRORCODE:= BSCCONTROL.Z0;
CHECKSUSPENDERRORS;
CHECKRETRIES;
80: INITLINE;
IF LINESTATE=BIDSENT THEN SENDENQ; ! BID FOR THE LINE !
IF LINESTATE=TRANSMIT THEN CALLREPLY; ! CALL FOR REPLY !
IF LINESTATE=TTDSENT THEN SENDENQ;
GOTO 511; ! AWAIT BID / CALL FOR REPLY !
END;
ERRORCODE:= BSCCONTROL.Z0;
WAITCONTROLZONE;
CHECKSUSPENDERRORS;
OUTERROR;
90:
END;
PROCEDURE BSCDERROR;
BEGIN
IF BSCDATA.ZMODE=INPUT THEN
BEGIN
BLOCKTYPE:= BSCDATA.Z0 AND 8'016000;
IF BLOCKTYPE=BSCDATA.Z0 THEN GOTO 90;
ERRORCODE:= BSCDATA.Z0;
CHECKSUSPENDERRORS;
INITLINE;
IF LASTCHAR=ETX THEN
BEGIN
SENDEOT;
GOTO 527; ! ASSUME EOT RECEIVED !
END;
IF BSCDATA.Z0 AND 8'40 <> 0 THEN SENDNAK;
! NO RESPONSE - WAIT FOR ENQ !
NEXTSHARE(BSCCONTROL);
GOTO 522;
END;
ERRORCODE:= BSCDATA.Z0;
CHECKSUSPENDERRORS;
OUTERROR;
90:
END;
«ff»
! RC36-00299 PAGE XX !
PROCEDURE ACTIVATETIMER;
BEGIN
TIMER.COUNT:= RESPTIME;
SIGNAL(TIMER.REQUEST);
PASS;
END;
PROCEDURE SUSPENDIFHARDBITS; ! CALLED FROM MESSAGEC !
BEGIN
IF MESSAGE.STATUS AND HARDBITS <> 0 THEN
BEGIN
ACTIVESTREAM:= 0;
MESSAGE.COUNT:= 0;
GOTO 180;
END;
END;
PROCEDURE CONTROLLINE; ! CALLED FROM MESSAGEC !
BEGIN
WAIT(LINE.MUTEX);
LINE.OPERATION:= CONTROLOP;
LINE.COUNT:= OP;
SIGNAL(LINE.REQUEST);
WAIT(LINE.COMPLETION);
MESSAGE.STATUS:= LINESTATUS;
SUSPENDIFHARDBITS;
! MESSAGE.STATUSC:= ZEROSTATUS; !
END;
PROCEDURE DATAREQUEST; ! CALLED FROM MESSAGEC !
BEGIN
REQSENT:= TRUE;
NEXTSHARE(BSCDATA);
WAIT(LINE.MUTEX);
LINE.OPERATION:= TRANSPUTOP;
LINE.COUNT:= SLENGTH;
LINE.RESERVE:= BLKTERM;
SIGNAL(LINE.REQUEST);
PASS;
END;
PROCEDURE WAITCOMPLETION; ! CALLED FROM MESSAGEC !
BEGIN
WAIT(LINE.COMPLETION);
REQSENT:= FALSE;
MESSAGE.STATUS:= LINESTATUS;
IF MESSAGE.STATUS <> 0 THEN
BEGIN
SUSPENDIFHARDBITS;
IF MESSAGE.STATUS AND SOFTBITS <> 0 THEN
BEGIN ! NOTREADY OR EOF (ETX RECEIVED) !
MESSAGE.COUNT:= 0;
GOTO 180;
END;
END;
END;
«ff»
! RC36-00299 PAGE XX !
PROCEDURE INITSHARE; ! CALLED FROM MESSAGEC !
BEGIN
WAITTRANSFER(BSCDATA);
STARTSHARE:= BSCDATA.ZTOP;
SHAREADDR:= STARTSHARE + DATAOFFSET;
HEADERPOINT:= SHAREADDR;
SHAREADDR:= SHAREADDR + 1;
SCOUNT:= MAXBYTES;
END;
«ff»
! RC36-00299 PAGE XX !
BEGIN
! COROUTINE INITIALIZATION !
INITCOROUT(TESTR);
! MESSAGE.REQUEST:= NEUTRALSEM; !
! MESSAGE.COMPLETION:= NEUTRALSEM; !
! MESSAGE.MUTEX:= OPENSEM; !
LINE.REQUEST:= NEUTRALSEM;
LINE.COMPLETION:= NEUTRALSEM;
LINE.MUTEX:= OPENSEM;
TIMER.REQUEST:= NEUTRALSEM;
! TIMER.COMPLETION:= NEUTRALSEM; !
! TIMER.MUTEX:= OPENSEM !
! SCD INITIALIZATION !
INITSCDPROG(BSCCONTROL,SCDINPROG,SCDOUTPROG);
LINESTATE:= DISCONNECTED;
! MESSAGE INITIALIZATION !
OPCOMPLETED:= TRUE;
RESERVER:= 0;
REJECT:= FALSE;
ACTIVESTREAM:= 0;
! INITIALIZATION OF GLOBAL VALUES !
ABSCORE.ZFIRST:= 0;
BDW.SEGMENTCODE:= 0;
RDW.SEGMENTCODE:= 0;
«ff»
! RC36-00299 PAGE XX !
! MESSAGEHANDLING COROUTINE !
100:
COBEGIN(MESSAGEC,TESTOUT+10); GOTO 400;
101:WAITMESSAGE(MESSAGE.SHARED,SENDER,BUF);
IF SENDER <> RESERVER THEN IF RESERVER <> 0 THEN
BEGIN ! REJECT OPERATION !
110: MESSAGE.STATUSC:= REJECTSTATUS;
GOTO 190; ! RETURN ANSWER !
END;
IF MESSAGE.OPERATION AND 1 = 0 THEN GOTO 200; ! CONTROLMESSAGE !
! TRANSPUT MESSAGE !
STREAM:= MESSAGE.OPERATION SHIFT (-8) EXTRACT 2;
IF REJECT<>FALSE THEN IF STREAM<>0 THEN
BEGIN ! RETURN WITHOUT PROCESSING !
120: MESSAGE.STATUSC:= NOTPSTATUS;
GOTO 190;
END;
IF MESSAGE.COUNT = 0 THEN
BEGIN ! RETURN ZEROSTATUS !
130: MESSAGE.STATUSC:= ZEROSTATUS;
GOTO 190;
END;
IF STREAM <> 0 THEN
BEGIN
IF STREAM <> ACTIVESTREAM THEN GOTO 110;
! ELSE ACCEPT TRANSPUT MESSAGE !
TCOUNT:= MESSAGE.COUNT;
TADDRESS:= MESSAGE.ADDRESS;
RDWADDR:= TADDRESS + 4;
TOPBUF:= TADDRESS + TCOUNT;
IF STREAM = INPUT THEN GOTO 300;
! ELSE: OUTPUT MESSAGE !
GOTO 320;
END;
! ELSE: STATUS INFORMATION REQUEST !
MESSAGE.STATUSC:= ZEROSTATUS;
180:! FIXED RETURNPOINT FROM CONTROL AND TRANSPUT HANDLING ROUTINES !
REJECT:= MESSAGE.STATUS AND CLEANBITS;
190:RETURNANSWER(MESSAGE.SHARED,BUF);
GOTO 101;
«ff»
! RC36-00299 PAGE XX !
200: ! CONTROL-MESSAGE HANDLING ROUTINE !
IF MESSAGE.OPERATION AND RESERVATION <> 0 THEN
BEGIN ! SET OR CANCEL RESERVATION !
STREAM:= MESSAGE.ADDRESS EXTRACT 2;
IF STREAM<>0 THEN
BEGIN
IF RESERVER = 0 THEN
BEGIN ! NO RESERVED STREAM !
IF MESSAGE.RESERVE <> 0 THEN
BEGIN ! ACCEPT RESERVATION !
IF LINESTATE = DISCONNECTED THEN
BEGIN ! SELECT AND CONNECT LINE !
CHANNEL:= MESSAGE.ADDRESS SHIFT (-2) EXTRACT 6;
IF CHANNEL < 32 THEN ! SELECT SCD DRIVER !
MOVE(SCDNAMES,CHANNEL*6,BSCCONTROL.ZNAME,0,6)
ELSE BEGIN ! SELECT SMX DRIVER !
BSCCONTROL.ZNAME:= SMX0;
INSERT(CHANNEL+16,BSCCONTROL.ZNAME,3);
END;
BSCDATA.ZNAME:= BSCCONTROL.ZNAME;
OP:= CONNECTOP;
CONTROLLINE;
END;
RESERVER:= SENDER;
IF STREAM = 1 THEN
BEGIN
OP:= INPUTOP;
END ELSE
BEGIN
OP:= OUTPUTOP;
BSCDATA.ZMODE:= 0;
INITSHARE;
END;
CONTROLLINE;
REQSENT:= FALSE;
ACTIVESTREAM:= STREAM;
END;
GOTO 290; ! RETURN ZEROANSWER !
END;
IF MESSAGE.RESERVE = 0 THEN
BEGIN ! ACCEPT CANCEL !
OP:= SETNEUTRALOP;
250: IF REQSENT = TRUE THEN WAITCOMPLETION;
CONTROLLINE;
ACTIVESTREAM:= 0;
RESERVER:= 0;
END;
GOTO 290;
END;
END;
IF MESSAGE.OPERATION AND DISCONNECT <> 0 THEN
BEGIN ! DISCONNECT !
IF LINESTATE<>DISCONNECTED THEN
BEGIN ! DISCONECT THE LINE !
OP:= DISCOP;
GOTO 250;
END;
END;
290:MESSAGE.STATUSC:= ZEROSTATUS;
GOTO 180;
«ff»
! RC36-00299 PAGE XX !
300: ! INPUT-MESSAGE HANDLING ROUTINE !
IF REQSENT = FALSE THEN DATAREQUEST;
WAITCOMPLETION;
SHAREADDR:= BSCDATA.ZTOP + 1; ! SKIP STX !
TOPSHARE:= SHAREADDR + BSCDATA.ZREM - 2; ! AND SKIP ETB/ETX !
DATAREQUEST;
! SHARE => BUF !
RDWADDR:= TADDRESS + 4; ! ROOM FOR BDW !
WHILE TOPSHARE - SHAREADDR > 0 DO
BEGIN
MOVE(ABSCORE^,SHAREADDR,RDW,0,2);
SHAREADDR:= SHAREADDR + 2;
RECORDADDR:= RDWADDR + 4;
NXTRDWADDR:= RECORDADDR + RDW.LENGTH;
IF NXTRDWADDR - TOPBUF > 0 THEN
BEGIN ! BUF OVERRUN !
314: MESSAGE.STATUS:= BLKLENGTHERROR;
TCOUNT:= 0;
GOTO 316;
END;
MOVE(ABSCORE^,SHAREADDR,ABSCORE^,RECORDADDR,RDW.LENGTH);
SHAREADDR:= SHAREADDR + RDW.LENGTH;
RDW.LENGTH:= RDW.LENGTH + 4;
MOVE(RDW,0,ABSCORE^,RDWADDR,4);
RDWADDR:= NXTRDWADDR;
END;
TCOUNT:= NXTRDWADDR - TADDRESS;
! RETURN FULL BUFFER !
316: BDW.LENGTH:= TCOUNT;
MOVE(BDW,0,ABSCORE^,TADDRESS,4);
317: MESSAGE.COUNT:= BDW.LENGTH;
GOTO 180;
«ff»
! RC36-00299 PAGE XX !
320: ! OUTPUT-MESSAGE HANDLING ROUTINE !
BLKTERM:= ETB;
IF MESSAGE.OPERATION AND LASTDATA <> 0 THEN BLKTERM:= ETX;
HEADER:= STX;
IF MESSAGE.OPERATION AND TRPDATA <> 0 THEN HEADER:= DLE;
MESSAGE.STATUS:= 0;
! BUF => SHARE !
RDWADDR:= TADDRESS + 4; ! SKIP BDW !
TOPSHARE:= SHAREADDR + SCOUNT; ! SCOUNT = MAXBYTES !
WHILE TOPBUF - RDWADDR > 0 DO
BEGIN
MOVE(ABSCORE^,RDWADDR,RDW,0,2);
RECORDADDR:= RDWADDR + 4;
RDW.LENGTH:= RDW.LENGTH - 4;
NXTSHAREREC:= SHAREADDR + RDW.LENGTH + 2;
IF NXTSHAREREC - TOPSHARE > 0 THEN
BEGIN ! SHARE OVERRUN !
MESSAGE.STATUS:= BLKLENGTHERROR;
GOTO 180;
END;
MOVE(RDW,0,ABSCORE^,SHAREADDR,2);
MOVE(ABSCORE^,RECORDADDR,ABSCORE^,SHAREADDR+2,RDW.LENGTH);
SHAREADDR:= NXTSHAREREC;
RDWADDR:= RECORDADDR + RDW.LENGTH;
END;
INSERT(BLKEND,ABSCORE^,SHAREADDR);
INSERT(BLKTERM,ABSCORE^,SHAREADDR+1);
INSERT(HEADER,ABSCORE^,HEADERPOINT);
SLENGTH:= SHAREADDR - STARTSHARE + 2;
IF REQSENT = FALSE THEN
NEXTSHARE(BSCDATA) ELSE
WAITCOMPLETION;
INITSHARE;
DATAREQUEST;
IF BLKTERM = ETX THEN WAITCOMPLETION;
IF LINESTATE=BIDSENT THEN
BEGIN
WAITCOMPLETION;
NEXTSHARE(BSCDATA);
END;
GOTO 180; ! RETURN STATUS !
COEND(MESSAGEC);
«ff»
! RC36-00299 PAGE XX !
! TIMER COROUTINE !
400:
COBEGIN(TIMERC,PRIORITY+TESTOUT+40); GOTO 500;
WAIT(TIMER.REQUEST);
WAITTIME:= TIMER.COUNT;
CDELAY(WAITTIME);
IF WAITTIME <> 0 THEN
BEGIN ! TIMEOUT !
WAIT(LINE.MUTEX);
LINE.OPERATION:= CONTROLOP;
LINE.COUNT:= TIMEOUTOP;
SIGNAL(LINE.REQUEST);
END;
COEND(TIMERC);
«ff»
! RC36-00299 PAGE XX !
! LINE COROUTINE !
500:
COBEGIN(LINEC,TESTOUT+50); GOTO 599;
505: TIMEOUT:= BLOCKTIME;
GETOPERATION;
GOTO 505;
507: ! DISCONNECT LINE !
LINESTATUS:= 0;
SETDISCONNECTED;
508: ! CONNECT LINE !
LINESTATE:= NEUTRAL;
OPEN(BSCCONTROL,OUTPUT);
509: LINESTATUS:= 0;
RELEASEOPERATION;
GOTO 505;
«ff»
! RC36-00299 PAGE XX !
! HANDLING OF CONTROL SEQUENCES !
510: TRANSFER(BSCCONTROL,CSIZE-BSCCONTROL.ZREM,COUTPUT);
CNTRLOUTP:= TRUE;
GOTO 512;
511: CNTRLOUTP:= FALSE;
512: TRANSFER(BSCCONTROL,CSIZE,CINPUT+TIMEOUT); ! BLOCKTIME = 0 !
IF CNTRLOUTP=TRUE THEN
BEGIN
BSCCONTROL.ZMODE:= OUTPUT;
WAITTRANSFER(BSCCONTROL);
END;
NEXTSHARE(BSCCONTROL);
BSCCONTROL.ZMODE:= INPUT;
WAITTRANSFER(BSCCONTROL);
INCHAR(BSCCONTROL,CHAR);
IF LINESTATE=WACKSENT THEN
BEGIN
IF CHAR=ENQ THEN
BEGIN
ACTIVATETIMER;
GETOPERATION;
LINESTATE:= RECEIVE;
IF LINESTATUS = EOF THEN GOTO 523;
GOTO 525; ! SEND CORRECT RESPONSE !
END;
CHECKDLEEOT;
! ILLEGAL RESPONSE !
GOTO 511; ! AWAIT CALL FOR REPLY !
END;
«ff»
! RC36-00299 PAGE XX !
IF LINESTATE=TTDSENT THEN
BEGIN
IF CHAR=NAK THEN
BEGIN
ENQCOUNT:= 0;
ACTIVATETIMER;
GETOPERATION;
LINESTATE:= TRANSMIT;
GOTO 535; ! SEND WAITING DATA !
END;
IF CHAR=RESPSTATE THEN
BEGIN
IF ENQCOUNT=0 THEN
BEGIN
ENQCOUNT:= 1;
SENDENQ;
END;
SENDTTD;
END;
GOTO 515; ! EOT, DLE-EOT OR ILLEGAL RESPONSE !
END;
IF LINESTATE=BIDSENT THEN
BEGIN
IF CHAR=ACK0 THEN
BEGIN
TIMEOUT:= BLOCKTIME;
RESPSTATE:= ACK0;
LINESTATE:= TRANSMIT;
GOTO 534; ! WAIT FOR DATA !
END;
IF CHAR=ENQ THEN
BEGIN
REPCOUNT:= REPCOUNT+1;
IF REPCOUNT<BIDLIMIT THEN SENDENQ;
GETOPERATION;
LINESTATUS:= NOTREADY;
RELEASEOPERATION;
SETNEUTRAL;
END;
515: CHECKDLEEOT;
CHECKRETRIES;
SENDENQ; ! ILLEGAL RESPONSE - CALL FOR REPLY !
END;
IF LINESTATE=WAITBID THEN
BEGIN
IF CHAR=ENQ THEN
BEGIN
RESPSTATE:= ACK0;
LINESTATE:= RECEIVE;
LASTCHAR:=0;
GOTO 524; ! WAIT FOR BUFFER !
END;
IF CHAR = EOT THEN GOTO 511; ! IGNORE EOT - WAIT BID !
CHECKDLEEOT; ! IF DISC REC. - GO NEUTRAL !
SENDEOT; ! ON ILLEGAL RESPONSE !
GOTO 511;
END;
«ff»
! RC36-00299 PAGE XX !
! LINESTATE=RECEIVE !
520: TRANSFER(BSCCONTROL,CSIZE-BSCCONTROL.ZREM,COUTPUT);
522: TRANSFER(BSCDATA,DSIZE,DINPUT);
NEXTSHARE(BSCCONTROL);
BSCCONTROL.ZMODE:= OUTPUT;
WAITTRANSFER(BSCCONTROL);
NEXTSHARE(BSCDATA);
WAITTRANSFER(BSCDATA);
IF BLOCKTYPE=ETBETX THEN
BEGIN
SWAPACK;
IF LASTCHAR = ETX THEN
BEGIN
LINESTATUS:= EOF;
RELEASEOPERATION;
ACTIVATETIMER;
GETOPERATION;
END;
523: MOVE(ABSCORE^,BSCDATA.ZTOP+BSCDATA.ZREM-1,BLKTERMINATOR,0,1);
LASTCHAR:= BYTE BLKTERMINATOR;
LINESTATUS:= 0;
RELEASEOPERATION;
524: ACTIVATETIMER;
GETOPERATION;
525: SENDACK;
END;
IF BLOCKTYPE=EOTENQ THEN
BEGIN
INCHAR(BSCDATA,CHAR);
IF CHAR=ENQ THEN
BEGIN ! CALL FOR REPLY - REPEAT LAST RESPONSE !
SENDACK;
END;
IF CHAR = EOT THEN IF LASTCHAR = 0 THEN
BEGIN ! IGNORE EOT AND RETURN TO WAIT-FOR-BID !
LINESTATE:= WAITBID;
GOTO 511;
END;
IF LASTCHAR = ETX THEN
BEGIN
IF CHAR = EOT THEN
BEGIN
527: LINESTATUS:= EOFEOT;
END ELSE
IF CHAR = DLE THEN LINESTATUS:= EOFDISC ELSE GOTO 528;
RELEASEOPERATION;
SETNEUTRAL;
END;
CHECKDLEEOT;
END;
! ILLEGAL BLOCK, ENQ-ABORT OR TTD !
528: SENDNAK;
«ff»
! RC36-00299 PAGE XX !
! LINESTATE = TRANSMIT !
530: TRANSFER(BSCDATA,DLENGTH,DOUTPUT);
LASTSENT:= HEADER;
532: TRANSFER(BSCCONTROL,CSIZE,CINPUT);
NEXTSHARE(BSCDATA);
WAITTRANSFER(BSCDATA);
! LENGTH:= BSCDATA.ZREM; BTMD1 ***** !
LENGTH:= BSCDATA.ZFIRST - BSCDATA.ZTOP; ! BTM05 ***** !
5325: NEXTSHARE(BSCCONTROL);
BSCCONTROL.ZMODE:= INPUT;
WAITTRANSFER(BSCCONTROL);
INCHAR(BSCCONTROL,CHAR);
IF BLOCKTYPE=WNACKR THEN
BEGIN
IF CHAR=RESPSTATE THEN
BEGIN ! CORRECT ACK RECEIVED !
LINESTATUS:= 0;
533: RELEASEOPERATION;
534: ACTIVATETIMER;
GETOPERATION;
535: LASTCHAR:= LINE.RESERVE;
DLENGTH:= LINE.COUNT;
SWAPACK;
GOTO 530; ! SEND DATA BLOCK !
END;
IF CHAR=NAK THEN
▶0b◀ BEGIN ! RETRANSMIT DATA BLOCK !
536: TRANSFER(BSCDATA,LENGTH,REPDOUT);
GOTO 532;
END;
IF CHAR=RVI THEN
BEGIN ! REVERSE INTERRUPT REQUEST !
LINESTATUS:= REVERSEINTRPT;
GOTO 533; ! RESPONSE OK !
END;
IF CHAR=WACK THEN
BEGIN
CALLREPLY; ! SEND ENQUIRY !
END;
! WRONG ACK !
IF LASTSENT=ENQ THEN GOTO 536; ! BLOCK LOST - RETRANSMIT !
CALLREPLY; ! CALL FOR REPLY !
END;
CHECKDLEEOT;
! ILLEGAL RESPONSE !
CALLREPLY;
599:
COEND(LINEC);
! END OF IBM 2780 LINEPROCEDURE DRIVER !
END;
«ff»
«ff»
«nul»