DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC3600/RC7000

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC3600/RC7000

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦651c353fe⟧ TextFile

    Length: 40960 (0xa000)
    Types: TextFile
    Notes: RCSL-43-GL-, RCSL-43-GL-7022, RCSL-43-GL-7023, RCSL-43-GL-7024
    Names: »S299«

Derivation

└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image
    └─ ⟦this⟧ »/S299« 

TextFile

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