|
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 - download
Length: 40960 (0xa000) Types: TextFile Notes: RCSL-43-GL-, RCSL-43-GL-7022, RCSL-43-GL-7023, RCSL-43-GL-7024 Names: »S2993«
└─⟦a59f0a452⟧ Bits:30000472 DOMUS disk image └─⟦this⟧
! 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 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»