DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

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

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦6b3761c5d⟧

    Length: 97262 (0x17bee)
    Notes: pts_type(SC)
    Names: »DRDC22.SC«

Derivation

└─⟦13e5fd45a⟧ Bits:30009699 Philips computer tape "600507"
    └─⟦this⟧ »TOSSWORK/DRDC22.SC« 
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
    └─⟦this⟧ »TOSSWORK/DRDC22.SC« 

PTS(SC)

	IDENT DRDC22	REL 11.0 81-01-26 870105041100

********************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
* 
*   DRDC22 : UNISCOPE 100 SYNCHRONOUS PROTOCOL
*                ON PTS 6800
* 
* 
********************************************* 
* 
* 
	EJECT
* 
* 
*	ENTRY POINTS
* 
* 
	ENTRY	DC22AD	ADDRESS BLOCK TERMINAL REQUESTS 
	ENTRY	IH2201	INPUT INTERRUPT 
	ENTRY	IH2202	OUTPUT INTERRUPT
	ENTRY	DC22ON	POWER ON ROUTINE
* 
* 
*	EXTERNAL REFERENCES 
* 
* 
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	SAVE8	SAVE A1-A8 ON A15 STACK
	EXTRN	TENDIO	COMPLETE I/O EVENT
	EXTRN	SETIME	SET TIMER 
	EXTRN	DWTCHP	TERMINAL ADDRESS
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTOR	DWT ORDER
	EXTRN	DWTECB	DWT ECB 
	EXTRN	DC:MIN	MOVE DATA TO USER BUFFER
	EXTRN	DC:MOT	MOVE DATA FROM USER BUFFER
	EXTRN	DISEND	COMPLETE REQUEST AND DISPATCH 
	EXTRN	INTSAV	LAST INTERRUPT ADDRESS
	EXTRN	PFPOST	WAIT FOR POWER UP IF SET
	EXTRN	DCSRED	READ STATISTICS ENTRY POINT 
	EXTRN	DCSRLL	RESET ALL STATISTICS BUFFERS ENTRY POINT
	EXTRN	DCSUPS	UPDATE STATISTICS ENTRY POINT IN DCSTAT 
	EXTRN	GETDNA	VALIDATE AND CONVERT SYMBOLIC DTE ADDR
	EXTRN	GETSNA	VALIDATE AND CONVERT SYMBOLIC SUB ADDR
	EJECT		
**********************************************************************
* 
*	REGISTER USAGE:	
* 
*	A1	WORK (RETURN CODE) 
*	A2	WORK 
*	A3	WORK (BUFFER LENGTH) 
*	A4	WORK (BUFFER POINTER)
*	A5	DRIVER STACK POINTER 
*	A6	DWT ADDRESS
*	A7	ORDER CODE, DTETAB ADDRESS 
*	A8	ECB ADDRESS
* 
************************************************************************
	EJECT
****************************************************************
* 
*	CONDITIONAL ASSEMBLY
* 
*************************************************************** 
*				 
*	A PROGRAM VERSION USING TOSS PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1 
* 
MMUPAG	EQU	0
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0 
* 
CPU852	EQU	0
* 
* 
*	RECEIVE BUFFER LENGTH 
* 
X:A	EQU	128	RECEIVE BUFFER LENGTH 
RBUFL	EQU	X:A 
* 
* 
*	NUMBER OF RECEIVE BUFFERS 
* 
X:B	EQU	4 
RBUFNR	EQU	X:B	NUMBER RECEIVE BUFFER
* 
*	INTERRUPT LOGGING 
*	0 = NO LOGGING
*	1 = LOGGING 
* 
X:C	EQU	0 
LOGG	EQU	X:C
* 
*	POLL TIMEOUT VALUE IN NO OF 100 MS
* 
X:D	EQU	600 
TIMPOL	EQU	X:D	POLL TIME-OUT
* 
*	SUPPRESS NULL CHARACTERS
*	0 = NO SUPPRESS 
*	1 = SUPPRESS
* 
X:E	EQU	1	SUPPRESS NULL 
NULTST	EQU	X:E
* 
*	UNIT TYPE 
*	0 = UNIT TYPE 6834
*	1 = UNIT TYPE 6857/SALCUZ 
* 
X:F	EQU	0		 
SALCUZ	EQU	X:F
* 
*	INPUT DEVICE ADDRESS
* 
	IFT	SALCUZ=0		 
X:G	EQU	/02	INPUT DEV ADDR	 
DCDEVI	EQU	X:G	INPUT ADDR	
DCDEVO	EQU	DCDEVI+/10	OUTPUT ADDR	
	XIF			 
	IFT	SALCUZ=1 
X:G	EQU	/0A	INPUT DEV ADDR	 
DCDEVI	EQU	/0A	INPUT ADDR	
DCDEVO	EQU	DCDEVI+1	OUTPUT ADDR	
	XIF			 
*	AUXILIARY DEVICE HANDLING 
*	0 = NO AUXILIARY
*	1 = AUXILIARY 
* 
X:H	EQU	0 
AUX	EQU	X:H	AUXILIARY DEVICE HANDLING 
* 
*	UNISCOPE 100/200 EMULATION
*	0 = NO EMULATION
*	1 = EMULATION 
X:I	EQU	0 
EMU100	EQU	X:I
* 
*	STATISTICS
*	0 = NO STATISTICS 
*	1 = STATISTICS
* 
X:J	EQU	0	STATISTICS
STAT	EQU	X:J
* 
*	MMU BUFFER LENGTH 
* 
X:K	EQU	1000		
TBUFL	EQU	X:K	MMU BUFFER LENGTH	
* 
	EJECT
* 
* BUFFER SUPERVISION TIMER
* 
BUFTIM	EQU	0
TIMBUF	EQU	1800	TIMEOUT 180 S ON BUFF SUPERVISION 
* 
* 
* 
DEVIND	EQU	0	DEVICE INDEX DATA COMMUNICATION
BUFLEN	EQU	TBUFL+TBUFL
* 
* 
*	INTERNAL SPECIAL CONDITIONAL PARAMS 
* 
BFBUSY	EQU	0	BUFFER BUSY HANDLING 
			=0 STANDARD =1 AUX-TYPE
SBS	EQU	0	SPARBANKEN STOCKHOLM	 
			=0 NO SBS CODE =1 SBS CODE 
	IFT	SBS=1
	EJECT			 
****************************************************	 
*				 
*         SPECIAL WHEN SBS = 1		
*				 
*         -  ONLY SID 50 AND 51 ACCEPTED	 
*				 
*         -  RECEIVE TEXT:		
*            THE 7TH CHAR AFTER STX ID USED AS TERMINAL ID	 
*					
*         -  TRANSMIT TEXT:		 
*            SID 51 IS USED		 
*				 
*         -  SPECIFIC POLL IS HANDLED AS A GENERAL POLL	
*            EXEPT IN BUSY SITUATIONS		 
*				 
***********************************************************	
	XIF			 
	EJECT
**************************************************************************
**************************************************************************
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**	D R D C 2 2  -  U N I S C O P E  1 0 0 / 2 0 0   D R I V E R	**
**				**
**				**
**	D A T A   D E F I N I T I O N S   E Q U A T E S	** 
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**************************************************************************
**************************************************************************
	EJECT
* 
**************************************
* 
*	DCDEFS  COMMON DEFS FOR DC DRIVERS/PACKAGES 
*	
**************************************
	 
*************************************** 
* 
*	TABLE AND PACKET LAYOUTS
* 
*************************************** 
	 
	 
* 
*	ECB, EVENT CONTROL BLOCK
* 
ECBFC	EQU	0	FILE CODE WORD
ECBBA	EQU	2	BUFFER ADDRESS
ECBRL	EQU	4	REQUESTED LENGTH IN BYTES 
ECBEL	EQU	6	EFFECTIVE LENGTH IN BYTES 
ECBRC	EQU	8	RETURN CODE 
ECBCW	EQU	10	CONTROL WORD 
ECBCW1	EQU	ECBCW	CONTROL WORD 1 
ECBCW2	EQU	12	CONTROL WORD 2
	 
	 
* 
* 
	EJECT
* 
*	DWT, DEVICE WORK TABLE
* 
* 
*	    ................... 
*	  0 .  DWTCHP         . 
*	    ................... 
*	  2 .  DWTST          . 
*	    ................... 
*	  4 .  DWTECB         . 
*	    ................... 
*	  6 . DWTOPT . DWTOR  . 
*	    ................... 
*	  8 .  DWTADR         . 
*	    ................... 
*	 10 .  DWTTAB         . 
*	    ................... 
*	 12 .  DWTWAT         . 
*	    ................... 
*	 14 .  DWTTQ          . 
*	    ................... 
*	(16).  DWTUEC         .   IF   MMUPAG 
*	    ................... 
*	(18).  DWTMEC         .   IF   MMUPAG 
*	    ................... 
* DWTDRD	 +2 .  DWTSTB         .
*            ...................
*	 +4 .  DWTCHD         . 
*	    ................... 
*	 +6 .  DWTCHN         . 
*	    ................... 
*	 +8 .  DWTLAD         . 
*	    ................... 
*	+10 .  DWTRAD         . 
*	    ................... 
*	+12 .  DWTDR1/SUB     . 
*	    ................... 
*	+14 .  DWTRCL         . 
*	    ................... 
*	+16 .  DWTRTV         . 
*	    ................... 
*	+18 .  DWTRTP         . 
*	    ................... 
*	+20 .  DWTOPE         . 
*	    ................... 
*	+22 .  DWTOPN         . 
*	    ................... 
*	+24 .  DWTIPC         . 
*	    ................... 
*	+26 .  DWTIPT         . 
*	    ................... 
*	+28 .                 . 
*	    /  DRIVER DEPEND  / 
*	    /                 / 
*	    /                 / 
*	    ................... 
*	    .  STATISTIC      .   IF STAT   AND DWTSTB /=0
*	    /  BUFFER         / 
*	    ................... 
* 
DWTTQ	EQU	14
DWTUEC	EQU	DWTTQ+2
DWTMEC	EQU	DWTUEC+2 

	IFT	MMUPAG=0 
DWTDRD	EQU	DWTTQ+2	START OF DC DEPENDENT AREA 
	XIF
	IFT	MMUPAG=1 
DWTDRD	EQU	DWTMEC+2	START OF DC DEPENDENT AREA
	XIF
DWTSTB	EQU	DWTDRD	OFFSET REL START DWT TO STATISTIC BUFF IF ANY 
DWTCHD	EQU	DWTDRD+2	CONFIG CHAIN LINK HEAD DWT
DWTCHN	EQU	DWTDRD+4	CONFIG CHAIN LINK NEXT DWT
DWTLAD	EQU	DWTDRD+6	LOCAL SYMBOLIC DTE ADDRESS
DWTRAD	EQU	DWTDRD+8	REMOTE SYMBOLIC DTE ADDRESS 
DWTDR1	EQU	DWTDRD+10	DRIVER DEP WORD 1
DWTSUB	EQU	DWTDR1	SYMBOLIC SUBADDRESS 
DWTRCL	EQU	DWTDRD+12	REQUEST CONTROL WORD 
DWTRTV	EQU	DWTDRD+14	REQUEST TIMER VALUE
DWTRTP	EQU	DWTDRD+16	REQUEST TIMER POINTER
DWTOPE	EQU	DWTDRD+18	O/P DATA Q EXPEDITED/STATUS LINK NXT DWT 
DWTOPN	EQU	DWTDRD+20	O/P DATA Q NORMAL LINK NXT DWT 
DWTIPC	EQU	DWTDRD+22	I/P DATA Q LINK TO BUFFER
DWTIPT	EQU	DWTDRD+24	I/P DATA TIMER POINTER 
DWTDID	EQU	DWTDRD+26	LAST AI DEVICE FOR THIS TERMINAL 
DWTPRT	EQU	DWTDRD+28	PRINT MODE INDICATOR 
DWTLST	EQU	DWTDRD+30	DEVICE LIST (8)
DWTSTA	EQU	DWTDRD+46	DWT STATUS 
	EJECT
* 
*	DTE, DTE CONTROL TABLE
* 
* 
*	    ................... 
*	  0 .  DTECHP         . 
*	    ................... 
*	  2 .  DTEST          . 
*	    ................... 
*	  4 .  DTEECB         . 
*	    ................... 
*	  6 . DTEOPT . DTEOR  . 
*	    ................... 
*	  8 .  DTEADR         . 
*	    ................... 
*	 10 .  DTETAB         . 
*	    ................... 
*	 12 .  DTEWAT         . 
*	    ................... 
*	 14 .  DTETQ          . 
*	    ................... 
*	(16).  DTEUEC         .   IF   MMUPAG 
*	    ................... 
*	(18).  DTEMEC         .   IF   MMUPAG 
*	    ................... 
* DTEDRD	 +2 .  DTESTB         .
*            ...................
*	 +4 .  DTECHD         . 
*	    ................... 
*	 +6 .  DTECHN         . 
*	    ................... 
*	 +8 .  DTELAD         . 
*	    ................... 
*	+10 .                 . 
*	    /  DRIVER DEPEND  / 
*	    /                 / 
*	    /                 / 
*	    ................... 
*	    .  STATISTIC      .   IF STAT   AND DTESTB /=0
*	    /  BUFFER         / 
*	    ................... 
* 
DTECHP	EQU	0	DTE ADDRESS
DTETQ	EQU	14
DTEUEC	EQU	DTETQ+2
DTEMEC	EQU	DTEUEC+2 

	IFT	MMUPAG=0 
DTEDRD	EQU	DTETQ+2	START OF DC DEPENDENT AREA 
	XIF
	IFT	MMUPAG=1 
DTEDRD	EQU	DTEMEC+2	START OF DC DEPENDENT AREA
	XIF
DTESTB	EQU	DTEDRD	OFFSET REL START DTE TO STATISTIC BUFF IF ANY 
DTECHD	EQU	DTEDRD+2	CONFIG CHAIN LINK HEAD DTE
DTECHN	EQU	DTEDRD+4	CONFIG CHAIN LINK NEXT DTE
DTELAD	EQU	DTEDRD+6	LOCAL SYMBOLIC DTE ADDRESS
*	DRIVER DEPENDENT
DTEPLS	EQU	DTEDRD+8	PHYSICAL LINK STATUS
DTEDLS	EQU	DTEDRD+10	DATA LINK STATUS 
DTESTA	EQU	DTEDRD+12	DTE STATUS 
DTEWRQ	EQU	DTEDRD+14	WRITE REQUEST QUEUE
*	STATITICS BUFFER
STWSID	EQU	DTEDRD+18	RESERVED FOR SYMBOLIC ID 
STWCST	EQU	DTEDRD+20	COUNTER STATUS INDEX 
STWMIX	EQU	DTEDRD+26	MAX COUNTER INDEX
STWCTA	EQU	DTEDRD+28	COUNTERS 
	EJECT
* 
*	COUNTER INDECES - PARAMETER-1 EQUATES 
* 
*	REQUEST LEVEL COUNTERS: 
* 
CSRCON	EQU	/01	CONNECTIONS ESTABLISHED
CSRCBY	EQU	/02	CONNECTION NOT ESTABLISHED - BUSY
CSRMSR	EQU	/03	MESSAGES RECEIVED
CSRCHR	EQU	/C5	CHARACTERS RECEIVED
CSRMST	EQU	/06	MESSAGES TRANSMITTED 
CSRCHT	EQU	/C8	CHARACTERS TRANSMITTED 
CSRTOP	EQU	/09	TIMEOUT
CSRABT	EQU	/0A	ABORTED
CSRERR	EQU	/0B	ERROR
CSRTRE	EQU	/0C	TRANSMISSION ERROR 
CSRXC1	EQU	/0D	PROTOCOL DEPENDENT 
* 
*	LINK LEVEL COUNTERS 
	 
CSSRBL	EQU	/10	SYNCH DATA BLOCKS RECEIVED 
CSSRBY	EQU	/11	  "   DATA BLOCKS REJECTED BUFFER BUSY 
CSSRBO	EQU	/12	  "   DATA BLOCKS REJECTED BUFFER OVERFLOW 
CSSRAB	EQU	/13	  "   DATA BLOCKS REJECTED ABORTED 
CSSRPE	EQU	/14	  "   DATA BLOCKS REJECTED PARITY ERROR
CSSTBL	EQU	/15	  "   DATA BLOCKS TRANSMITTED
CSSTRT	EQU	/16	  "   DATA BLOCKS RETRANSMITTED
CSSTAB	EQU	/17	  "   DATA BLOCKS ABORTED
CSSXC1	EQU	/18	NBR OF REPLY REQUESTS TRANSMITTED
CSSXC2	EQU	/19	NBR OF DATA BLOCKS WITH INCORRECT HEADER 
CSSXC3	EQU	/1A	NBR OF TIMES POLL TIMEOUT HAS OCCURED
	 
	 
*	DTE/DCE LEVEL COUNTERS
	 
CSCDTE	EQU	/28	DTE NOT OPERABLE 
CSCDIT	EQU	/29	I/P THROUGHPUT ERROR 
CSCDOT	EQU	/2A	O/P THROUGHPUT ERROR 
CSCDCE	EQU	/2B	DCE NOT OPERABLE 
CSCXC1	EQU	/2C	CONTROL UNIT DEPENDENT 
CSCXC2	EQU	/2D	    "
CSCXC3	EQU	/2E	    "
	EJECT
* 
* 
*	REQUEST HANDLING
* 
* 
*	ORDER CODE (A7) 
* 
OPEN	EQU	/21	OPEN 
CLOSE	EQU	/22	CLOSE 
CONPAS	EQU	/27	CONNECT PASSIVE
DISCO	EQU	/2F	DISCONNECT
RECEIVE	EQU	/02	RECEIVE 
SEND	EQU	/06	SEND 
RSTAT	EQU	/00	READ STATUS 
SSTAT	EQU	/38	SET STATUS
STATIS	EQU	/2D	READ/RESET STATISTICS
STIMOT	EQU	/39	SET TIMEOUT VALUE
* 
*	OPTIONS:
* 
TYPRR	EQU	/43	RESET STATISTICS AFTER READ 
* 
*	RETURN CODE EQUATES (A1)
* 
RCREQ	EQU	/8000	REQUEST ERROR 
RCABRT	EQU	/4000	REQUEST ABORTED
RCBELL	EQU	/0400	BELL MESSAGE 
RCTIME	EQU	/0040	TIMEOUT
RCSEQ	EQU	/0010	SEQUENCE ERROR
RCLGTH	EQU	/0008	ILLEGAL LENGTH 
RCLOGC	EQU	/0002	LOGICAL CONNECTION ERROR 
RCPHYC	EQU	/0001	PHYSICAL CONNECTION ERROR
* 
* 
* 
	EJECT			 
**********************************************************
* 
*	LINE CONTROL CHAR EQU:S		 
*				 
**********************************************************
* 
SYN	EQU	/16 
SOH	EQU	/01 
STX	EQU	/02 
ETX	EQU	/03 
SID	EQU	/50 
DID	EQU	/70 
GRID	EQU	/20
DLE	EQU	/10 
ACK1	EQU	/31
WABT	EQU	/3F
DC2	EQU	/12 
CHDSL	EQU	/72 
	IFT	SALCUZ=0		 
PAD	EQU	/FF	PAD CHAR	 
	XIF			 
	IFT	SALCUZ=1 
PAD	EQU	/7F		 
	XIF			 
* 
BIT0	EQU	/8000	STATUS AI
NBIT0	EQU	/7FFF	STATUS AI 
	EJECT
************************************************************* 
* 
*	LINE CONTROL UNIT FUNCTION CONTROL EQU:S
* 
************************************************************* 
* 
	IFT	SALCUZ=1 
CBBREK	EQU	/80	CIO START BREAK	 
CBECHO	EQU	/10	          ECHO	
CBNPAR	EQU	/0	          NO CHAR PARITY	 
CBEPAR	EQU	/4	          EVEN CHAR PARITY	 
CBOPAR	EQU	/C	          ODD CHAR PARITY	
* 
CBSTOP	EQU	/0	CIO STOP INPUT/OUTPUT	
* 
CBDISC	EQU	/1	CIO DISCONNECT MODEM FROM LINE	 
	XIF			 
	IFF	SALCUZ=1 
CBCARR	EQU	/100	CARRIER ON	 
	XIF			 
* 
* 
	IFT	SALCUZ=1 
PARITY	EQU	CBOPAR	ODD PARITY FOR ASCII	 
	XIF			 
	EJECT
*************************************************** 
* 
*	LINE CONTROL UNIT SST STATUS BITS 
* 
*************************************************** 
* 
SBNOOP	EQU	/1	SST STATUS MODEM NOT OPERABLE	
SBTHRU	EQU	/02	           THROUGHPUT ERROR	 
	IFT	SALCUZ=1 
SBPARI	EQU	/04	           CHAR PARITY ERROR	
	XIF			 
SBCARR	EQU	/20	           CARRIER OFF	
SBCALL	EQU	/40	           INCOMING CALL	
* 
	IFT	SALCUZ=1 
SBERR	EQU	/27	SBNOOP,SBTHRU,SBPARI,SBCARR	
	XIF			 
	IFF	SALCUZ=1 
SBERR	EQU	/23	SBNOOP,SBTHRU,SBCARR	 
	XIF
	EJECT
**************************************************************************
**************************************************************************
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**	D R D C 2 2  -  U N I S C O P E  1 0 0 / 2 0 0   D R I V E R	**
**				**
**				**
**	A P P L I C A T I O N   R E Q U E S T   H A N D L I N G	** 
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**************************************************************************
**************************************************************************
	EJECT
* 
*	DRIVER ADDRESS BLOCK
* 
	DATA	BUFLEN	MMU BUFFER SIZE
	DATA	DEVIND	DEVICE INDEX 
DC22AD	DATA	DCACT	ADDRESS BLOCK 
	DATA	ABORT	ABORT ROUTINE ADDRESS 
	DATA	DCRBUF	RECEIVE BUFFER ANCHOR
	DATA	6	HEADER LENGTH	
* 
	RES	15	SUBROUTINE STACK FOR INTERRUPTS 
STB	RES	1 
	EJECT
**********************************************************************
**********************************************************************
* 
* 
*	REQUEST HANDLER/APPLICATION INTERFACE 
* 
* 
**********************************************************************
**********************************************************************
* 
*	ACTIVATION FROM TERMINAL TASKS
* 
DCACT	EQU	* 
	LDK	A1,0	PRESET RETURN CODE
	LDR	A2,A7	ORDER CODE AS PARAMETER
	LDKL	A7,DTETAB	DTE TAB ADDR
	LD	A8,DWTECB,A6	ECB ADDRESS
	ANK	A2,/FF	STRIP OFF OPTION BITS 
	CF	A15,LOOKUP	BRANCH ON CODES, TABLE ADDRESS TO STACK
	DATA	TREQX,RTREQ	LAST ENTRY; ERROR ADDRESS 
	DATA	RECEIVE,RQRECE	RECEIVE REQUEST
	DATA	SEND,RQSEND	SEND REQUEST
	DATA	OPEN,RQOPEN	OPEN REQUEST
	DATA	CLOSE,RQCLOS	CLOSE REQUEST
	DATA	CONPAS,RQCON	CONNECT PASSIVE REQUEST
	DATA	DISCO,RQDIS	DISCONNECT REQUEST
	DATA	RSTAT,RQRSTS	READ STATUS REQUEST
	DATA	SSTAT,RQSST	SET STATUS REQUEST
	DATA	STIMOT,RQTIME	SET REQUEST TIMEOUT 
TREQX	DATA	STATIS,RQSTAT	READ/RESET STATISTICS REQUEST
	EJECT

************************************************************
* 
*    ABORT ROUTINE
* 
************************

ABORT	LD	A1,DWTRTP,A6	TIMER POINTER 
	RF(Z)	AB:10	NO TIMER RUNNING 
	CM*	DWTRTP,A6	KILL TIMER 
	CM	DWTRTP,A6 

AB:10	LD	A2,DWTOR,A6	ORDER CODE 
	ANK	A2,/7F	REMOVE OPTIONS
	SUK	A2,6	IS IT A SEND REQUEST
	RF(NZ)	AB:RTN	NO 
AB:20	EQU	* 

	CF	A15,REMOVW	REMOVE DWT FROM WRITE QUEUE
	LD	A2,FDWTUT	WRITING DWT ADDRESS 
	CWR	A2,A6
	RF(NE)	AB:RTN	NOT THIS DWT 
	CM	FDWTUT	RESET SENDING DWT
	CM	XACK	RESET ACK EXPECTED 

AB:RTN	EQU	*
	ABL	RTABRT	COMPLETE WITH RC = ABORTED
	EJECT
* 
* 
*	OPEN REQUEST
* 
*	ACTIVATION PARAMETERS:
*		SYMBOLIC DTE-ADDRESS (ECBCW2)
* 
*	FUNCTIONS:
*		1. CHECK IF ALREADY OPEN & IF SO SAME DTE-ADDRESS
*		2. CONVERT & VERIFY DTE ADDRESS
*		3. CONNECT MODEM 
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
* 
RQOPEN	EQU	*
	LD	A2,DTESTA,A7	GET DTE STATUS 
	ADR	A2,A2	WORD ALIGNED INDEX VALUE 
	ABI	RQOPTB,A2	BRANCH ON INDEX IN TABLE 
RQOPTB	DATA	RQOP20	CLOSED/INACTIVE
	DATA	RQOP15	OPEN IN PROGRESS 
	DATA	RQOP10	OPEN 
	DATA	RQOP15	CLOSE IN PROGRESS
RQOP10	EQU	*
	LD	A2,ECBCW2,A8	GET SYMBOLIC DTE-ADDRESS 
	CW	A2,DTELAD,A7	SAME AS THE ONE WHO OPENED ? 
	RF(E)	RQOP85	YES - OK
RQOP15	EQU	*
	ABL	RTSEQ	RETURN: SEQUENCE ERROR 
* 
RQOP20	EQU	*
	IM	DTESTA,A7	SET OPEN IN PROGRESS
	LD	A1,ECBCW2,A8	GET SYMBOLIC DTE ADDRESS 
	ST	A1,DTELAD,A7	SAVE SYMBOLIC DTE ADDRESS
	LDKL	A2,DTECHP+1	POINTER TO CHP IN DTETAB
	ADR	A2,A7	ADDR TO RID IN DTE TAB 
	CF	A15,GETDNA	CONVERT AND VALIDATE DTE ADDR
	LDR	A1,A1	SET CONDITION REGISTER 
	RF(NN)	RQOP80	OK 
	CM	DTELAD,A7	RESET DTE ADDRESS 
	CM	DTESTA,A7	SET STATUS CLOSET 
	ABL	RTREQ	RETURN: REQUEST ERROR
* 
RQOP80	EQU	*
	IM	DTESTA,A7	SET OPEN STATUS 
RQOP85	EQU	*
	LD	A2,DTEPLS,A7	PHYSICAL CONNECTION ERROR ?
	ABL(NZ)	RTOK	NO
	ABL	RTPHYC	RETURN: PHYSICAL CONNECTION ERROR 
	EJECT
* 
*	CLOSE REQUEST 
* 
*	ACTIVATION PARAMETERS:
*		OPTION	/00 = UNCONDITIONAL 
*			/80 = CONDITIONAL 
*	FUNCTIONS:
*		1. IF CONDITIONAL, CHECK IF ANY LOGICAL CONNECTIONS (DWTS) ARE ACTIVE
*		   ACTIVE. 
*		2. IF UNCONDITIONAL, DISCONNECT ALL DWT:S
*		3. DISCONNECT MODEM
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
* 
RQCLOS	EQU	*
	LD	A2,ECBCW2,A8	GET SYMBOLIC DTE - ADDR
	RF(Z)	RQCL20	ZERO, UNCONDITIONAL CLOSE 
	CW	A2,DTELAD,A7	CORRECT DTE ?
	RF(E)	RQCL30	YES 
	ABL	RTREQ	RETURN: REQUEST ERROR
RQCL20	EQU	*
	LD	A2,DTECHN,A7	ANY DWT CONNECTED ?
	RF(NZ)	RQCL30	YES
	ABL	RTSEQ	RETURN: SEQUENCE ERROR 
RQCL30	EQU	*
	LD	A2,DTESTA,A7	GET DTE STATUS 
	RF(NZ)	RQCL50	NOT CLOSED 
	ABL	RTOK	RETURN: OK
RQCL50	EQU	*
	CWK	A2,2	DTE OPENED ?
	ABL(NE)	RTSEQ	RETURN: SEQUENCE ERROR 
	LDR	A8,A6	A8 =DWT ADDR REQUESTING DWT
	LD	A6,DTECHN,A7	ANY DWT CONNECTED
	RF(Z)	RQCL90	NO
	LD	A2,DWTOR,A6	UNCONDITIONAL CLOSE ? 
	ABL(N)	RTSEQ	RETURN: SEQUENCE ERROR
	LDK	A2,3	
	ST	A2,DTESTA,A7	DTE STATUS = CLOSE IN PROGRESS 
RQCL60	EQU	*
	LD	A2,DWTCHN,A6	GET NEXT DWT IN CHAIN
	ST	A2,DTECHN,A7	REMOVE DWT FROM CONNECTED CHAIN
	CF	A15,RELBUF	RELEASE ALL BUFFERS QUEUED ON DWT
	CM	DWTSTA,A6	SET DWT STATUS = DISCONNECTED 
	CWR	A8,A6	REQUESTING DWT ? 
	RF(E)	RQCL80	YES 
	LDKL	A1,RCSEQ	RC: SEQUENCE ERROR 
	CF	A15,TENDIO	COMPLETE REQUEST 
RQCL80	EQU	*
	LD	A6,DTECHN,A7	ANY MORE DWT TO DISCONNECT 
	RB(NZ)	RQCL60	YES
RQCL90	EQU	*
	LDK	A2,3	
	ST	A2,DTESTA,A7	DTE STATUS = CLOSE IN PROGRESS 
	CM	DTESTA,A7	DTE STATUS = CLOSED 
	CM	DTECHP,A7	CLEAR NETWORK ADDR
	LDR	A6,A8	REQUESTING DWT 
	LD	A8,DWTECB,A6	RESTORE ECB ADDR 
	ABL	RTOK	RETURN: OK
	EJECT
* 
*	CONNECT PASSIVE REQUEST 
* 
*	ACTIVATION PARAMETERS:
*		- SYMBOLIC SUBADDRESS (LEFTMOST BYTE IN ECBBA-BFR) 
*		- DEVICE ADDRESSES IN ECBBA-BFR
*		- LENGTH OF BUFFER (ECBRL) 
*		- SYMBOLIC DTE-ADDRESS (ECBCW2)
* 
*	FUNCTIONS:
*		1. VERIFY DTE-ADDRESS AS PER OPEN REQUEST
*		2. VERIFY & CONVERT SUBTERMINAL ADDRESS
*		3. VERIFY AND STORE DEVICE ADDRESSES 
*		4. LINK CALLING DWT TO QUEUE 
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
* 
RQCON	EQU	* 
	LD	A2,DTELAD,A7	SYMBOLIC DTE-ADDR
	CW	A2,ECBCW2,A8	CORRECT DTE ?
	ABL(NE)	RTREQ	NO, RETURN: REQUEST ERROR
	LD	A2,DTESTA,A7	GET DTE STATUS 
	SUK	A2,2	OPEN ?
	ABL(NZ)	RTSEQ	NO, RETURN: SEQUENCE ERROR 
	LD	A2,DWTSTA,A6	GET DWT STATUS 
	SUK	A2,2	ALREADY CONNECTED ? 
	ABL(Z)	RTSEQ	YES, RETURN: SEQUENCE ERROR 
	IFF	MMUPAG=0 
	LDKL	A4,MMUBUF	MMU BUFFER ADDRESS
	ST	A4,ECBBA,A8	TO ECB
	CF	A15,DC:MOT	MOVE DATA TO MMU BUFFER
	XIF
	LD	A4,ECBBA,A8	ECB BUFFER ADDR 
	LDK	A2,0	RESET A2
	LCR	A2,A4	GET SUB-ADDRESS
	ST	A2,DWTSUB,A6	SAVE SUB-ADDR
	LD	A1,ECBCW2,A8	GET SYMBOLIC DTE ADDR
	ST	A1,DWTLAD,A6	SAVE SYMBOLIC DTE ADDRESS
	CF	A15,GETSNA	VALIDATE AND CONVERT SUB ADDR
	LDR	A1,A1	SET CONDITION REGISTER 
	RF(NN)	RQCN20	SUB ADDR OK
	CM	DWTLAD,A6	CLEAR SYM DTE ADDR
	CM	DWTSUB,A6	CLEAR SUB ADDR
	ABL	RTREQ	RETURN: REQUEST ERROR
RQCN20	EQU	*
	ST	A1,DWTCHP,A6	SAVE NETWORK ADDR (CHP)
	IFT	AUX=1
	LD	A3,ECBRL,A8	BUFFER LENGTH 
	CWK	A3,9	MORE THAN 9 ADDRESSES ? 
	ABL(G)	RTREQ	YES, RETURN: REQUEST ERROR
	SUK	A3,1	ONLY SUB-ADDRESS
	RF(Z)	RQCN80	YES, NO DID:S 
	LDKL	A1,DWTLST	DEVICE LIST POINTER 
	ADR	A1,A6	DEVICE LIST ADDR 
	ADK	A4,1	BUFER ADDRESS 
	LDK	A2,0 
RQCN30	EQU	*
	LCR	A2,A4	GET DID FROM USER BUFFER 
	CWK	A2,/73	LESS THAN FIRST DID 
	RF(L)	RQCN40	YES 
	CWK	A2,/7A	GREATER THAN LAST DID 
	RF(NG)	RQCN50	NO 
RQCN40	EQU	*
	ABL	RTREQ	RETURN: REQUEST ERROR
RQCN50	EQU	*
	STR	A2,A1	STORE DID IN DEVICE LIST 
	SUK	A3,1	ANY MORE ?
	RF(Z)	RQCN80	NO
	ADK	A4,1	BUFFER ADDR 
	ADK	A1,2	DEVICE LIST ADDR
	RB	RQCN30	GET NEXT DID 
	XIF
RQCN80	EQU	*
	CF	A15,DCLINK	LINK DWT TO CHAIN
	LDK	A2,2	
	ST	A2,DWTSTA,A6	SET STATUS: CONNECTED
	ABL	RTOK	RETURN: OK
	EJECT
* 
*	DISCONNECT REQUEST
* 
*	ACTIVATION PARAMETERS:
*		DWT-ADDRESS (A6) 
* 
*	FUNCTIONS:
*		1. CHECK IF IN CONNECTED STATE 
*		2. DROP DWT-ADDRESS FROM CONFIGURATION CHAIN 
*		3. RELEASE BUFFERS QUEUED
*		4. SET DWT STATUS DISCONNECTED 
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
* 
RQDIS	EQU	* 
	LD	A2,DWTSTA,A6	DWT STATUS = DISCONNECTED ?
	ABL(Z)	RTOK	YES, RETURN: OK
	CF	A15,DCREMV	REMOVE DWT FROM CONNECTED CHAIN
	CF	A15,RELBUF	RELEASE BUFFERS QUEUED ON DWT
	CM	DWTSTA,A6	SET DWT STATUS = DISCONNECTED 
	ABL	RTOK	RETURN: OK
	EJECT
* 
*	READ STATUS REQUEST 
* 
* 
*	ACTIVATION PARAMETERS:
*		DWT - ADDRESS (A6) 
* 
*	FUNCTIONS:
*		1. TRANSFER LOGICAL CONNECTION STATUS TO APPLICATION 
* 
*	COMPLETION PARAMETERS:
*		LOGICAL CONNECTION STATUS (ECBCW1) 
*		RETURN CODE (A1) 
* 
*	0       3 4       7 8      11 12      15
*	........................................
*	.  DWT   .  DTE    .  DATA   .  PHYS   .
*	.  STATE .  STATE  .  LINK   .  LINK   .
*	.        .         .  STATUS .  STATUS .
*	........................................
* 
RQRSTS	EQU	*
	LD	A2,DWTSTA,A6	DWT STATUS 
	SLL	A2,4	BITS 0-3
	AD	A2,DTESTA,A7	DTE STATUS 
	SLL	A2,4	BITS 4-7
	AD	A2,DTEDLS,A7	DATA LINK STATUS 
	SLL	A2,4	BITS 8-11 
	AD	A2,DTEPLS,A7	PHYSICAL LINK STATUS (BITS 12 - 15)
	ST	A2,ECBCW1,A8	STATUS TO ECB CONTROL WORD 1 
	ABL	RTOK	RETURN: OK
	EJECT
* 
*	SET STATUS REQUEST
* 
* 
*	ACTIVATION PARAMETERS 
*		DWT ADDRESS (A6) 
* 
*	FUNCTIONS:
*		SET A DEVEICE (DID) NOT OPERABLE (ONLY IF AUX=1) 
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
RQSST	EQU	* 
	IFT	AUX=1
	LDKL	A3,DWTLST	POINTER TO DEVICE LIST IN DWT 
	ADR	A3,A6	ADDR TO DEVICE LIST
	LDK	A4,8	DEVICE COUNTER
RQSS10	EQU	*
	LDR*	A2,A3	GET DID FROM DEVICE LIST
	ABL(Z)	RTREQ	NOT FOUND, RETURN: REQUEST ERROR
	CW	A2,ECBCW1,A8	COMPARE DID
	RF(E)	RQSS20	FOUND 
	SUK	A4,1	END OF DEVICE LIST ?
	ABL(Z)	RTREQ	YES, RETURN: REQUEST ERROR
	ADK	A3,2	DEVICE LIST ADDR
	RB	RQSS10	TRY NEXT DID 
RQSS20	EQU	*
	ORKL	A2,BIT0	SET DEVICE NOT OPERABLE 
	STR	A2,A3	BACK TO DEVICE LIST
	ABL	RTOK	RETURN: OK
	XIF
	IFF	AUX=1
	ABL	RTREQ	REQUEST: REQUEST ERROR 
	XIF
	EJECT
* 
*	READ/RESET STATISTICS REQUEST 
* 
*	ACTIVATION PARAMETERS:
*		TYPE = BITS 0-7 OF ECBCW1
*		ECB-ADDRESS (A8) 
*		DWT-ADDRESS OF LOW-LEVEL DWT (A6)
* 
*	FUNCTIONS:
*		1. READ STATISTICS TO USER AREA
*		2. RESET ALL STATISTICS BUFFERS
* 
*	COMPLETION PARAMETERS:
*		NUMBER OF BYTES TRANSFERRED (ECBEL)
*		RETURN CODE (A1) 
* 
RQSTAT	EQU	*
	IFT	STAT=0 
	ABL	RTREQ	COMPLETE REQUEST RC=REQUEST ERROR
	XIF
	IFF	STAT=0 
	CF	A15,DCSRED	READ STATISTICS
	LDR	A1,A1	OK?
	ABL(NZ)	RTREQ	NO, RETURN: REQUEST ERROR
* 
RQST30	EQU	*
	LD	A1,ECBCW1,A8	GET TYPE 
	SRL	A1,8	TYPE FIELD TO LEFT BYTE 
	CWK	A1,TYPRR	CORRECT TYPE? 
	RF(NE)	RQST40
	CF	A15,DCSRLL	RESET ALL STATISTICS BUFFERS 
	LDR	A1,A1	LUCKY AGAIN? 
	ABL(NZ)	RTREQ	NO, RETURN: REQUEST ERROR
RQST40	EQU	*
	ABL	RTOK	RETURN: OK
	XIF
	EJECT
* 
*	SET REQUEST TIMEOUT 
* 
*	ACTIVATION PARAMETERS:
*		ECBCW1 >= 0 : ACTIVATE TIMING CONTROL
*		              TIMEOUT VALUE IN MULTIPLES OF 100 MS;
*		              0 = IMMEDIATE TIMEOUT. 
*		       < 0:   DE-ACTIVATE TIMING CONTROL 
* 
*	FUNCTIONS:
*		STORE VALUE DIRECTLY IN CALLER'S DWT 
* 
*	COMPLETION PARAMETERS:
*		DWTRTV = TIMEOUT VALUE = ECBCW1
*		RETURN CODE (A1) 
* 
RQTIME	EQU	*
	LD	A2,ECBCW1,A8	GET TIMEOUT VALUE FROM ECB 
	ST	A2,DWTRTV,A6	STORE IN DWT 
	ABL	RTOK	RETURN: OK
	EJECT
* 
*	SEND REQUEST
* 
*	ACTIVATION PARAMETERS:
*		BUFFER ADDRESS (ECBBA) 
*		BUFFER LENGTH (ECBRL)
*		ECB CONTROL WORD 1 
*	
*	OPTIONS:
*		/80 = PROGRAM FUNCTION KEY 
*		/81 = THRU 
* 
*	FUNCTIONS:
*		1. VERIFY THAT LOGICAL & PHYSICAL CONNECTIONS EXIST. 
*		2. VERIFY BUFFER SIZE IF MMU 
*		3. HANDLING OF PF KEYS 
*		4. HANDLING OF THRU
*		5. QUEUE REQUESTING DWT
*		6. COMPLETE WHEN ACK'D OR TIMEOUT. 
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
* 
RQSEND	EQU	*
	LD	A2,DWTSTA,A6	GET DWT STATUS 
	SUK	A2,2	CONNECTED ? 
	ABL(NZ)	RTSEQ	NO, RETURN: SEQUENCE ERROR 
	LD	A2,DTEPLS,A7	PHYSICAL CONNECTION ACTICE ? 
	ABL(Z)	RTPHYC	NO, RETURN: PHYSICAL CONNECTION ERROR
	LD	A2,DTEDLS,A7	LOGICAL CONNECTION ACTIVE ?
	ABL(Z)	RTLOGC	NO, RETURN: LOGICAL CONNECTION ERROR 
	LD	A2,DWTOR,A6	GET ORDER CODE
	RF(NN)	RQSE30	NO OPTION, NORMAL SEND 
	SRL	A2,8	RIGHT JUSTIFIE OPTION 
	SUK	A2,/80	PROGRAM FUNCTION ?
	RF(Z)	RQSE20	YES 
	IFT	AUX=1
	SUK	A2,/81-/80	THRU ?
	ABL(NZ)	RTREQ	NO, RETURN: REQUEST ERROR
	LD	A1,DWTST,A6	GET STATUS
	ANKL	A1,BUSYFL	IS DEVICE BUSY ?
	ABL(Z)	RTOK	NO, RETURN: OK 
	LDK	A1,/FE	
	ANS	A1,DWTST,A6	SET DEVICE READY 
	LDKL	A2,DCSTQ	GET THRU QUEUE ANCHOR
	CF	A15,INSWQ1	INSERT DWT IN THRU QUEUE 
	CM	ECBRL,A8	CLEAR REQUESTED LENGTH 
	RF	RQSE40
	XIF
RQSE20	EQU	*
	CM	ECBRL,A8	CLEAR REQUESTED LENGTH 
RQSE30	EQU	*
	IFT	MMUPAG=1 
	LD	A2,ECBRL,A8	REQUESTED LENGTH
	CWK	A2,BUFLEN	ILLEGAL LENGTH ? 
	ABL(G)	RTLGTH	YES, RETURN: ILLEGAL BUFFER LENGTH 
	XIF
	CF	A15,TIMEWR	START TIMER
	CF	A15,INSWQ	QUEUE SEND REQUEST
RQSE40	EQU	*
	ABL	TDISP
* 
	EJECT
* 
* 
*	COMPLETION OF SEND REQUEST
* 
*	A1 CONTAINS RETURN CODE 
* 
* 
RQSE50	EQU	*
	LD	A2,XACK	IS ACK EXPECTED ? 
	RF(Z)	RQSE90	NO
	CM	XACK	NO ACK EXPECTED
	LD	A6,FDWTUT	ANY SEND GOING ON ? 
	RF(Z)	RQSE90	NO
	LD	A2,DWTST,A6	ANY REQUEST FOR THIS DWT ?
	RF(N)	RQSE80	NO
	LD	A2,DWTOR,A6	GET ORDER CODE
	ANK	A2,/FF	REMOVE OPTIONS
	SUK	A2,SEND	IS IT A SEND ORDER ? 
	RF(NZ)	RQSE80	NO 
	CF	A5,CTIME	STOP TIMER 
	CF	A15,TENDIO	COMPLETE REQUEST 
	LD	A2,DCSTQ	THRU IN QUEUE
	RF(Z)	RQSE60	NO
	LDKL	A2,DCSTQ	ADDR TO THRU ANCHOR
	CF	A15,REM05	REMOVE DWT FROM THRU QUEUE
	RF	RQSE80
RQSE60	EQU	*
	CF	A15,REMOVW	REMOVE DWT FROM SEND QUEUE 
RQSE80	EQU	*
	CM	FDWTUT	INDICATE, NO SEND GOING ON 
RQSE90	EQU	*
	RTN	A5	RETURN TO PROTOCOL HANDLER
	EJECT
* 
*	RECEIVE REQUEST 
* 
*	ACTIVATION PARAMETERS:
*		BUFFER ADDRESS (ECBBA) 
* 
*	FUNCTIONS:
*		1. VERIFY THAT LOGICAL & PHYSICAL CONNECTIONS EXIST. 
*		2. TRANSFER TO THE APPLICATION ANY MESSAGE QUEUED FOR THE DWT, 
*		3. COMPLETE WHEN TRANSFER PERFORMED OR NO MESSAGE RECEIVED 
*		   WITHIN TIMEOUT PERIOD.
* 
*	COMPLETION PARAMETERS:
*		ACTUAL LENGTH OF RECEIVED MESSAGE (ECBEL)
*		RETURN CODE (A1) 
* 
RQRECE	EQU	*
	LD	A2,DWTSTA,A6	GET DWT STATUS 
	SUK	A2,2	CONNECTED ? 
	ABL(NZ)	RTSEQ	NO, RETURN: SEQUENCE ERROR 
	LD	A2,DTEPLS,A7	PHYSICAL CONNECTION ACTIVE ? 
	ABL(Z)	RTPHYC	NO, RETURN: PHYSICAL CONNECTION ERROR
	LD	A2,DTEDLS,A7	LOGICAL CONNECTION ACTIVE ?
	ABL(Z)	RTLOGC	NO, RETURN: LOGICAL CONNECTION ERROR 
	LD	A4,DWTIPC,A6	ANY BUFFER ON QUEUE ?
	RF(NZ)	RQRE10	YES
	CF	A15,TIMERE	START TIMER
	RF	RQRE40	GO TO DISPATCHER 
RQRE10	EQU	*
	IFT	EMU100=1 
	LD	A2,DWTOR,A6	GET ORDER CODE
	SRL	A2,8	ISOLATE OPTIONS 
	SUK	A2,/81	ANY MESSAGE REQUEST 
	RF(NZ)	RQRE20	NO 
	LD	A2,2,A4	GET BUFFER LENGTH 
	ST	A2,ECBEL,A8	TO ECB
	ABL	RTOK	RETURN: OK
	XIF
RQRE20	EQU	*
	LDR*	A2,A4	GET NEXT BUFFER IN QUEUE
	ST	A2,DWTIPC,A6 	STORE AS FIRST IN QUEUE 
	RF(NZ)	RQRE30	MORE BUFFERS IN QUEUE
	CF	A15,SBTIME	STOP BUFFER SUPERVISIOR TIMER
RQRE30	EQU	*
	ADK	A4,6	ADJUST BUFFER ADDRESS 
	CF	A15,RQRE60	COMPLETE RECEIVE REQUEST 
RQRE40	EQU	*
	ABL	TDISP	GO TO DISPATCHER 
	EJECT
* 
*	COMPLETION OF RECEIVE REQUEST 
* 
RQRE50	EQU	*
	LD	A6,FDWTIN	GET INPUT DWT 
	ST	A6,DWTTXT	SAVE IT 
	LD	A2,DWTST,A6	ANY REQUEST ON
	RF(N)	RQRE80	NO, QUEUE BUFFER
	LD	A2,DWTOR,A6	GET ORDER CODE
	ANK	A2,/FF	REMOVE OPTIONS
	SUK	A2,RECEIVE	RECEIVE ORDER ? 
	RF(NZ)	RQRE80	NO, QUEUE BUFFER 
	LD	A8,DWTECB,A6	ECB ADDR 
	CF	A5,CTIME	STOP TIMER 
	ST	A2,ECBCW,A8	STORE REMANING TIME 
RQRE60	EQU	*
	LDK	A1,0	COMPLETE REQUEST WITH RC=0
	LD	A3,-4,A4	GET BUFFER LENGTH
	ST	A3,ECBEL,A8	TO ECB EFFECTIVE LENGTH 
	LD	A2,DWTOR,A6	GET ORDER CODE
	SRL	A2,8	ISOLATE OPTION
	IFT	EMU100=1 
	CWK	A2,/81	ANY MESSAGE REQUEST ? 
	RF(NE)	RQRE65	NO 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RF	RQRE80	QUEUE BUFFER 
	XIF
RQRE65	EQU	*
	CWK	A2,/80	RECEIVE ADDRESSED ? 
	RF(NE)	RQRE70	NO 
	LD	A2,-2,A4	GET SID+DID
	ST	A2,ECBCW2,A8	TO ECB CONTROL WORD 2
RQRE70	EQU	*
	LDR	A3,A3	LENGTH ZERO ?
	RF(Z)	RQRE75	YES, BELL MESSAGE 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER, COMPLETE REQUEST 
	RF	RQRE90
RQRE75	EQU	*
	SUK	A4,6	ADJUST ADDR 
	CF	A15,RRBUF	RELEASE RECEIVE BUFFER
	LDKL	A1,RCBELL	BELL IN RETURN CODE 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RF	RQRE90	RETURN 
* 
*	NO RECEIVE REQUEST ON, QUEUE BUFFER 
* 
RQRE80	EQU	*
	SUK	A4,6	BASE OF BUFFER
	LDK	A2,DWTIPC	POINTER TO BUFFER QUEUE ANCHOR 
	ADR	A2,A6	ADDR TO BUFFER QUEUE ANCHOR
	CF	A5,QR100	QUEUE BUFFER 
	IFT	BUFTIM=1 
	LD	A1,DWTIPC,A6	BUFFER QUEUE ANCHOR
	LDR*	A2,A1	GET FIRST IN QUEUE
	RF(NZ)	RQRE90	TIMER ALREADY STARTED
	LDR	A1,A6	DWT ADDR 
	CF	A15,SETIME	START BUFFER SUPERVISOR TIMER
	DATA	RQRETO,TIMBUF 
	ST	A4,DWTIPT,A6	TIMER POINTER
	XIF
RQRE90	EQU	*
	RTN	A15	RETURN TO CALLER 
	IFT	BUFTIM=1 
* 
*	BUFFER TIMEOUT
* 
RQRETO	EQU	*
	LDR	A6,A1	DWT ADDR 
	CF	A15,RELBUF	RELEASE BUFFERS QUEUE ON DWT 
	ABL	TDISP	RETURN TO DISPATCHER 
	XIF
	EJECT
* 
*	COMPLETE APPLICATION REQUEST
* 
RTREQ	EQU	* 
	LDKL	A1,RCREQ	RC = REQUEST ERROR 
	RF	RQRTN 
RTABRT	EQU	*
	LDKL	A1,RCABRT	RC = ABORTED
	RF	RQRTN 
RTBELL	EQU	*
	LDKL	A1,RCBELL	RC = BELL MESSAGE 
	RF	RQRTN 
RTTIME	EQU	*
	LDKL	A1,RCTIME	RC = TIME OUT 
	RF	RQRTN 
RTSEQ	EQU	* 
	LDKL	A1,RCSEQ	RC = SEQUENCE ERROR
	RF	RQRTN 
RTLGTH	EQU	*
	LDKL	A1,RCLGTH	RC = ILLEGAL LENGTH 
	RF	RQRTN 
RTLOGC	EQU	*
	LDKL	A1,RCLOGC	RC = LOGICAL CONNECTION ERROR 
	RF	RQRTN 
RTPHYC	EQU	*
	LDKL	A1,RCPHYC	RC = PHYSICAL CONNECTION ERROR
	RF	RQRTN 
RTOK	EQU	*
	LDK	A1,0	RC = OK 
RQRTN	EQU	* 
	CF	A15,TENDIO	COMPLETE REQUEST 
	ABL	TDISP	GO TO DISPATCHER 
	EJECT
**************************************************************************
**************************************************************************
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**	D R D C 2 2  -  U N I S C O P E  1 0 0 / 2 0 0   D R I V E R	**
**				**
**				**
**	S U B R O U T I N E S		**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**************************************************************************
**************************************************************************
	EJECT
* 
* 
* 
*	TIMER HANDLING PART 
* 
* 
* 
*	RECEICE TIMER=TIMERR
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,DWTRTV,A6	GET TIMEOUT VALUE
	RF(N)	TIME10	NO TIMING 
	RF(Z)	TOUTR2	TIMER=0 => IMMEDIATE TIMEOUT
	ST	A2,TIMERR 
	CF	A15,SETIME
	DATA	TOUTRE
TIMERR	DATA	0 
	ST	A4,DWTRTP,A6	STORE TIMER POINTER
TIME10	EQU	*
	RF	GBUF10	RETURN 
* 
*	TIMEOUT READ TIMER
* 
TOUTRE	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTRTP,A6 
TOUTR1	EQU	*
	ABL	RTTIME	COMPLETE REQUEST RC=TIMEOUT 
TOUTR2	EQU	*
	ADKL	A15,4	RESET STACK POINTER 
	ABL	RTTIME	RETURN: TIMEOUT 
	EJECT
* 
*	SEND TIMER=TIMWR
* 
TIMEWR	LDR	A1,A6
	LD	A2,DWTRTV,A6	GET TIMEOUT VALUE
	RB(N)	TIME10	NO TIMING 
	RB(Z)	TOUTR2	TIMER=0 => IMMEDIATE TIMEOUT
	ST	A2,TIMWR
	CF	A15,SETIME
	DATA	TOUTWR
TIMWR	DATA	0
	ST	A4,DWTRTP,A6
	RB	TIME10
* 
*	TIMEOUT WRITE TIMER 
* 
TOUTWR	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTRTP,A6 
	LD	A1,DWTOR,A6	GET ORDER 
	SUK	A1,SEND
	RB(NZ)	TOUTR1	NOT SEND 
	LD	A2,DWTECB,A6	GET DWT
	CW	A6,FDWTUT	SAME AS PRESENT DWT	
	RF(NE)	TOUTW1	NO,REMOVE AND TENDIO 
	CM	XACK	YES,CLEAR WAIT FOR ACK AND GO ON PROCESSING
	CM	FDWTUT	NO WRITE GOING ON
TOUTW1	EQU	*
	LD	A4,ECBBA,A2	GET ECB 
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
	ABL	RTTIME	COMPLETE REQUEST RC=TIMEOUT 
	EJECT
* 
* 
*	STOP REQUEST TIMING 
* 
*	REMAINING TIME IS RETURNED IN A2
* 
* 
CTIME	EQU	* 
	LD	A2,DWTRTP,A6	GET TIMER POINTER
	RF(Z)	CTIM10	NOT RUNNING 
	LDR*	A2,A2 
	NGR	A2,A2	GET REMAINING TIME 
	CM*	DWTRTP,A6	STOP TIMER 
	CM	DWTRTP,A6 
CTIM10	EQU	*
	RTN	A5 
	EJECT
* 
*	STOP BUFFER SUPERVISIOR TIMER 
* 
*	A6 = DWT ADDR 
*	A2 = DESTROYED
SBTIME	EQU	*
	LD	A2,DWTIPT,A6	GET TIMER POINTER
	RF(Z)	SBTI10	NOT RUNNING 
	CM*	DWTIPT,A6	STOP TIMER 
	CM	DWTIPT,A6 
SBTI10	EQU	*
	RTN	A15
	EJECT
* 
*	FIND DWT CONTAINING SUBTERMINAL ADDRESS AS GIVEN IN A2
* 
*	CALLING SEQUENCE: CF A5,FINTER
*	A2=SUBTERMINAL ADDRESS
*	A4 DESTROYED
*	A3:  NOT =  0   =  DWT FOUND
*	         =  0   =  DWT NOT FOUND
*	         = -1   =  GENERAL SID
* 
FINTER	EQU	*
* 
* SEARCH IF GENERAL SID 
* 
	LDR	A1,A2
	SUK	A1,SID 
	RF(NZ)	FINT05	SPECIFIC 
	LDKL	A3,-1	INIT GENERAL SID
	RTN	A5 
* 
FINT05	EQU	*
	LDK	A3,0	DEFAULT VALUE, NOT FOUND
	LD	A4,DTECHN,A7	ADDR TO FIRST IN CHAIN 
	RF(Z)	FINT20	CHAIN EMPTY 
FINT10	EQU	*
	CW	A2,DWTCHP,A4	CHECK CHP
	RF(E)	FINT15	DWT WITH CORRESPONDING SID FOUND
	LD	A4,DWTCHN,A4	NEXT DWT 
	RF(Z)	FINT20	END OF CHAIN, NOT FOUND 
	RB	FINT10	TRY NEXT 
FINT15	EQU	*
	LDR	A3,A4	DWT ADDR 
FINT20	RTN	A5 
	EJECT
* 
*	GET RECEIVE BUFFER
* 
*	CALLING SEQUENCE: CF A15,GRBUF
*	A4=0 IF NO BUFFER IS FREE 
*	ELSE A4 CONTAINS BUFFER ADDRESS 
*	A2 AND A3 ARE DESTROYED 
* 
* 
GRBUF	LDKL	A2,DCRBUF	RECEIVE BUFFERS
GBUF	INH
	LDR*	A4,A2 
	RF(Z)	GBUF10	NO BUFFER FREE
	LDR*	A3,A4	REMOVE BUFFER FROM FREE CHAIN 
	STR	A3,A2
GBUF10	ADKL	A15,4	ADJUST STACK POINTER
	ABR*	A15	RETURN TO CALLER
	EJECT
* 
* 
*	RELEASE RECEIVE BUFFER
* 
*	A4 CONTAINS BUFFER ADDRESS
*	CALLING SEQUENCE: CF A15,RRBUF
*	A2 AND A3 ARE DESTROYED 
* 
* 
RRBUF	LDKL	A2,DCRBUF	RECEIVE BUFFERS
RBUF	INH
RBUF10	EQU	*
	LDR*	A3,A2 
	RF(Z)	RBUF20 
	LDR	A2,A3
	RB	RBUF10
RBUF20	EQU	*
	STR	A4,A2
	CMR	A4 
	RB	GBUF10	RETURN TO CALLER 
	EJECT
* 
*	RELEASE ALL RECEIVE BUFFERS QUEUE ON DWT
* 
*	A6 - DWT ADDR 
*	A1 AND A4 ARE DESTROYED 
*	CALLING SEQUENCE: CF    A15,RELBUF
* 
* 
RELBUF	EQU	*
	CF	A15,SBTIME	STOP BUFFER TIMER
	LD	A4,DWTIPC,A6	FIRST IN BUFFER QUEUE
	RF(Z)	RLBU20	QUEUE EMPTY 
RLBU10	EQU	*
	LDR*	A1,A4	NEXT IN BUFFER QUEUE
	CF	A15,RRBUF	RELEASE BUFFER
	LDR	A4,A1	ANY MORE TO RELEASE
	RB(NZ)	RLBU10	YES
RLBU20	EQU	*
	CM	DWTIPC,A6	RESET BUFFER POINTER
	RB	GBUF10
	EJECT
* 
* 
*	INSERT DWT IN WRITE REQUEST QUEUE 
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSWQ	LDKL	A2,DCWRQ	GET QUEUE ANCHOR
INSWQ1	LDK	A4,DWTOPN
INSWQ2	LDR*	A3,A2 
	RF(Z)	INSWQ3	END OF QUEUE FOUND
	LDR	A2,A3
	RB	INSWQ2
INSWQ3	ADR	A4,A6
	STR	A4,A2	INSERT IN QUEUE
	CMR	A4	INDICATE END OF QUEUE 
	RB	GBUF10	RETURN 
* 
* 
*	REMOVE DWT FROM WRITE REQUEST QUEUE 
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVW	LDKL	A2,DCWRQ	GET QUEUE ANCHOR 
REM05	LDK	A4,DWTOPN	GET DWT-LINK TO BE REMOVED
	ADR	A4,A6	 
REM10	LDR*	A3,A2
	RB(Z)	GBUF10	NOT ON QUEUE: RETURN
	CWR	A3,A4
	RF(E)	REM15
	LDR	A2,A3	GET NEXT 
	RB	REM10 
REM15	LDR*	A3,A4	REMOVE 
	STR	A3,A2
	RB	GBUF10	RETURN 
	EJECT
* 
* 
*	QUEUE ALLOCATED RECEIVE BUFFER
* 
*	A4=BUFFER ADDR
*	A2,A3 DESTROYED 
* 
QR100	EQU	* 
	LDR*	A3,A2 
	RF(Z)	QR200	END OF QUEUE FOUND 
	LDR	A2,A3
	RB	QR100 
QR200	STR	A4,A2	INSERT INTO QUEUE 
	CMR	A4	INDICATE END OF QUEUE 
	RTN	A5 
	EJECT
* 
*	LOOKUP - LOOK UP KEY IN TABLE & BRANCH ON ADDRESS 
* 
*	CALL: 
*		CF     A15,LOOKUP          TABLE ADDRESS TO STACK
*		DATA   LAST,ADDRE          LAST ENTRY; ERROR ADDRESS 
*		DATA   KEY1,ADDR1          KEY (A2); ADDRESS FOR BRANCH
*		 "       "    "
*	LAST	DATA   KEYN,ADDRN
* 
*	ENTRY: A2 = KEY VALUE 
*	EXIT: A3 & A4 DESTROYED 
* 
LOOKUP	EQU	*
	LDR	A1,A15	STACK ADDR
	ADK	A1,4	TABLE ADDRESS 
	LDR*	A3,A1	GET CONTENTS = TABLE ADDRESS
	LDR*	A4,A3	GET LAST LEGAL ADDRESS
* 
LOOK50	EQU	*	LOOP ENTRY 
	ADK	A3,4	GET NEXT TABLE ENTRY ADDRESS
	CWR	A3,A4	PAST THE END?
	RF(G)	LOOK90	YES = NOT FOUND 
	CWR*	A2,A3	KEY = VALUE IN TABLE? 
	RB(NE)	LOOK50	NO - CHECK NEXT ENTRY
	RF	LOOK95	BRANCH TO TABLE ADDRESS
*		KEY NOT FOUND
LOOK90	EQU	*
	LDR*	A3,A1	GET TABLE ADDRESS AGAIN 
LOOK95	EQU	*
	ADKL	A15,4	RESET STACK 
	ABI	2,A3	BRANCH TO TABLE ADDRESS 
	EJECT
**********************************************************************
* 
*	DCLINK  -  LINK DWT ADDRESS TO CONFIGURATION CHAIN
* 
*	ENTRY: A6 = DWT-ADDRESS 
* 
*	EXIT:  DCDWA = A(FIRST DWT IN CHAIN)
*	       DWTCHD = A(DTE)
*	       A2, A3 DESTROYED 
* 
**********************************************************************
* 
DCLINK	EQU	*
	LDR	A3,A7	DTE TAB ADDR 
DCLK20	EQU	*
	LDR	A2,A3	PREVIOUS POINTER 
	LD	A3,DWTCHN,A2	GET POINTER TO NEXT IN CHAIN 
	RB(NZ)	DCLK20	KEEP ON UNTIL LAST IN CURRENT CHAIN
	ST	A6,DWTCHN,A2	ADD NEW DWT TO CHAIN 
	CM	DWTCHN,A6	END OF CHAIN MARKER 
* 
DCLK50	EQU	*
	ST	A7,DWTCHD,A6	* BACKWARD LINK  TO ANCHOR 
	ADKL	A15,4	
	ABR*	A15	RETURN
	EJECT
**********************************************************************
* 
*	DCREMV  -  REMOVE DWT-ADDRESS FROM CONFIGURATION CHAIN
* 
*	ENTRY:  A6 = DWT-ADDRESS TO BE REMOVED
* 
*	EXIT:   CC = 0   = CHAIN NOW EMPTY; ANCHOR = 0
*	             POS = DWT FOUND & REMOVED
*	             NEG = DWT NOT FOUND OR CHAIN EMPTY ON ENTRY
*	        A2 & A3 DESTROYED 
* 
**********************************************************************
* 
DCREMV	EQU	*
	LDR	A3,A7	DTE TAB ADDR 
DCRM20	EQU	*
	LDR	A2,A3	PREVIOUS DWT-POINTER 
	LD	A3,DWTCHN,A2	GET DWT OF NEXT (OR 1ST) ENTRY IN CHAIN
	RF(NZ)	DCRM30	NOT AT END 
	SUK	A3,1	AT END & NOT FOUND; SET FOR CC = NEGATIVE 
	RF	DCRM80	RETURN 
* 
DCRM30	EQU	*
	CWR	A3,A6	IS THIS OUR DWT? 
	RB(NE)	DCRM20	NO - LOOK AT NEXT
	LD	A3,DWTCHN,A6	GET LINK TO NEXT IN DWT TO BE REMOVED
	ST	A3,DWTCHN,A2	MOVE IT TO THE PREVIOUS ONE
	LDK	A3,0	SET FOR CC = 0
	LD	A2,DTECHN,A7	GET ANCHOR 
	RF(Z)	DCRM80	LAST DWT NOW REMOVED
	ADK	A3,1	SET CC = POS. 
* 
DCRM80	EQU	*
	ADKL	A15,4	UPDATE STACK
	LDR	A3,A3	SET PROPER CC
	ABR*	A15	RETURN
	EJECT
* 
* 
*	STORE REGISTER A3-A8
*	CALLING SEQUENSE: CF A15,STREG
* 
*	RESTORE 
*	CALLING SEQUENCE: CF A15,LDREG
* 
* 
STREG	ST	A3,LCA3
	ST	A4,LCA4 
	ST	A5,LCA5 
	ST	A6,LCA6 
	ST	A7,LCA7 
	ST	A8,LCA8 
	RF	RTNA15	RETURN 
	EJECT
LDREG	LDKL	A3,0 
LCA3	EQU	*-2
	LDKL	A4,0
LCA4	EQU	*-2
	LDKL	A5,0
LCA5	EQU	*-2
	LDKL	A6,0
LCA6	EQU	*-2
	LDKL	A7,0
LCA7	EQU	*-2
	LDKL	A8,0
LCA8	EQU	*-2
RTNA15	EQU	*
	ADKL	A15,4 
	ABR*	A15 
	EJECT
* 
*	POLL TIME OUT 
* 
PTOUT	LDKL	A5,STB	LOAD A5 STACK BASE
	LDKL	A7,DTETAB	DTE TAB ADDR
	CM	DTEDLS,A7	DATA LINK DOWN
	IFT	STAT=1 
	LDK	A1,CSSXC3	POLL TIMEOUT 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	CF	A15,SPOTIM
	ABL	TDISP
* 
*	RESTART POLL TIMER WHEN POLL HAS BEEN RECEIVED
* 
CPTIM	EQU	* 
	LDK	A2,1 
	ST	A2,DTEDLS,A7	DATA LINK UP 
	LDKL	A2,-TIMPOL
	ST*	A2,DCTPGP	RESTART TIMER
	RTN	A5 
* 
*  START POLL TIMER 
* 
SPOTIM	EQU	*
	CF	A15,SETIME
	DATA	PTOUT,TIMPOL
	ST	A4,DCTPGP 
	ADKL	A15,4 
	ABR*	A15 
	EJECT
**************************************************************************
**************************************************************************
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**	D R D C 2 2  -  U N I S C O P E  1 0 0 / 2 0 0   D R I V E R	**
**				**
**				**
**		P R O T O C O L   H A N D L I N G	**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**************************************************************************
**************************************************************************
	EJECT
* 
* 
*	RECEIVE A FRAME AND DECODE IT 
* 
* 
BRM	EQU	* 
	LDKL	A5,STB	LOAD STACK BASE FOR A5 
	CF	A5,CSYNCI	START I/P WITH SYNC DEF	
BRM100	CF	A5,READ	READ CHARACTER
	SUK	A2,SOH 
	RF(E)	BRM200	SOH 
	SUK	A2,PAD-SOH	PAD ?	
	RB(NE)	BRM100	NOT /FF
	CF	A5,READ	READ CHARACTER
	CWK	A2,PAD	PAD ?	
	RB(NE)	BRM100	NOT ANOTHER /FF
	ABL	BRM910	HALT INPUT AND RESYNCHRONIZE
* 
*	SOH RECEIVED
* 
BRM200	LDKL	A8,0	CLEAR BCC
	CF	A5,READP	READ RID=TC
	ABL(NZ)	BRM920	PARITY ERROR
	CW	A2,DTECHP,A7	CHECK IF THIS CHP
	RF(E)	BRM201 
	CWK	A2,GRID	GENERAL RID ?
	ABL(NE)	BRM900	NOT THIS TC: RESYNCHRONIZE
BRM201	EQU	*
	CF	A5,READP	READ SID=SUBTERMINAL ADDRESS 
	ABL(NZ)	BRM920	PARITY ERROR
	ST	A2,FSID	SAVE SUBTERMINAL ADDRESS
	IFT	SBS=1
	CWK	A2,SID	GENERAL SID ?	
	RF(E)	BRM210	YES, OK	
	CWK	A2,/51	SID 51 ?	 
	RF(E)	BRM210	YES, OK	
	ABL	BRM900	INVALID SID	
	XIF			 
	CF	A5,FINTER	FIND SUBTERMINAL ADDRESS
	CWK	A3,-1	GENERAL SID ?
	RF(E)	BRM205	YES,DONT INIT DWT INPUT 
	ST	A3,FDWTIN	AND STORE IT
BRM205	EQU	*
	SUK	A2,SID 
	RF(Z)	BRM210	GENERAL SID 
	LDR	A3,A3
	ABL(Z)	BRM900	SID UNKNOWN
BRM210	EQU	*
	CF	A5,READP
	ABL(NZ)	BRM920	PARITY ERROR
	ST	A2,FDID	SAVE DID
	IFT	AUX=0		
	CWK	A2,DID	GENERAL DID ?	
	ABL(NE)	BRM900	NO, NOT ACCEPTED	 
	XIF			 
	CM	HEADER	CLEAR HEADER CONTENTS
	CM	HEADER+2
	LDK	A3,0	RESET CHARACTER COUNTER 
BRM220	CF	A5,READP	READ CHARACTER 
	ABL(NZ)	BRM920	PARITY ERROR
	CWK	A2,STX 
	RF(E)	BRM300	STX: TEXT FRAME 
	CWK	A2,ETX 
	RF(E)	BRM250	ETX: ANALYZE HEADER 
	CWK	A3,4 
	ABL(G)	BRM930	HEADER OVEABLLOW 
	SC	A2,HEADER,A3	STORE CHARACTER
	ADK	A3,1	INCREMENT POINTER 
	RB	BRM220
BRM250	CF	A5,READP	READ BCC 
	ABL(NZ)	BRM910	PARITY ERROR
	ANKL	A8,/7F	MASK BCC PARITY BIT
	ABL(NZ)	BRM910	BCC ERROR 
	CF	A5,CHALTI	HALT INPUT
	EJECT
* 
* 
*	ANALYZE CONTROL SEQUENCE
* 
* 
	LD	A1,HEADER	GET HEADER
	LD	A2,HEADER+2 
	LDK	A3,0	FIND HEADER TYPE
	LDKL	A4,STRING 
BRM260	CWR*	A1,A4 
	RF(NE)	BRM270
	CW	A2,2,A4 
	ABI(E)	FRAME,A3	TYPE FOUND: BRANCH TO HANDLER
BRM270	ADK	A3,2 
	ADK	A4,4	INCREMENT STRING POINTER
	CWK	A4,STRINE
	RB(NE)	BRM260	TRY NEXT 
	IFT	STAT=1 
	LDK	A1,CSSXC2	INCORRECT HEADER 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	RB	BRM	INVALID HEADER
	EJECT
* 
* 
*	RECEIVE TEXT
* 
* 
BRM300	EQU	*		
	IFT	SBS=1
	CM	SBSTID	RESET INDEX FOR TERMINAL ID	 
	RF(Z)	BRM305		 
	XIF			 
	LD	A6,FDWTIN	GET DWT ADDR	 
	RF(Z)	BRM900	INVALID SUBTERMINAL ADDRESS 
BRM305	EQU	*		
	LD	A4,DCRBUF 
	ABL(Z)	BRM940	NO BUFFER AVAILABLE
	LD	A1,WPOLL
	RF(NZ)	BRM900	MUST BE A POLL 
	LD	A1,DWTST,A6 
	ANK	A1,BUSYFL
	RF(NZ)	BRM900	DONT ACCEPT TEXT IF BUSY 
	ADK	A4,6	RESERVE 3 WORDS AT BEGIN
	LDK	A3,0	RESET BUFFER INDEX
BRM310	CF	A5,READP	READ CHARACTER 
	RF(NZ)	BRM920	PARITY ERROR 
	IFT	AUX=1
	CWK	A2,DC2	PRINT COMMAND ? 
	RF(E)	BRM315	YES 
	XIF			 
	CWK	A2,ETX 
	RF(E)	BRM350	ETX RECEIVED
	CWK	A2,SYN 
	RF(NE)	BRM320	NOT SYN, NOT TO BE SKIPPED 
	XRR	A8,A2	ADJUST BCC 
	RB	BRM310
	EJECT
	IFT	AUX=1
* 
*  PRINT COMMAND DETECTED 
* 
BRM315	EQU	*
	IM	SPRINT	INIT PRINT FLAG FOR FOLLOWING POLL 
	LDK	A1,BUSYFL
	ORS	A1,DWTST,A6	SET BUSY SUB-TRMNL 
* 
*  TAKE CARE OF FAST SELECTION
* 
	LD	A1,FDID 
	SUK	A1,DID 
	RF(Z)	BRM318 
	LD	A1,FDID 
	ST	A1,DWTDID,A6	INIT AI DEVICE 
BRM318	EQU	*
	XIF			 
* 
*  STORE INCOMMING CHARACTER IN BUFFER
* 
BRM320	EQU	*
	IFT	NULTST=1 
	CWK	A2,0	NULL ?
	RB(E)	BRM310	YES,SUPPRESS IT 
	XIF
	CWK	A3,RBUFL+RBUFL 
	RF(G)	BRM950	BUFFER OVERFLOW 
	IFT	SBS=1
	IM	SBSTID	INCREMENT INDEX	 
	LD	A1,SBSTID		 
	CWK	A1,SBSSTA	ON POSITION 7 ?	 
	RF(NE)	BRM330	NO	
	ST	A3,SBSA3	SAVE A3	 
	ST	A4,SBSA4	SAVE A4	 
	CF	A5,FINT05	FIND SUBTERMINAL ADDRESS	 
	LDR	A3,A3	IS A3 ZERO	
	RF(Z)	BRM900	YES, TERMINAL NOT FOUND	
	ST	A3,FDWTIN	SAVE DWT ADDR	
	LD	A3,SBSA3	RESTORE A3	
	LD	A4,SBSA4	RESTORE A4	
	LD	A6,FDWTIN	DWT ADDR TO A6	 
BRM330	EQU	*		
	XIF			 
	LDR	A1,A4
	ADR	A1,A3	COMPUTE BUFFER ADDRESS 
	SCR	A2,A1	STORE CHARACTER
	ADK	A3,1	INCREMENT INDEX 
	RB	BRM310
	EJECT
* 
*	ETX DETECTED
* 
BRM350	EQU	*
 	CF	A5,READP	READ BCC
	IFT	SALCUZ=0		 
	RF(NZ)	BRM910	PARITY ERROR 
	XIF			 
	ANKL	A8,/7F	MASK BCC PARITY BIT
	RF(NZ)	BRM960	BCC ERROR
	IFT	SALCUZ=1 
	CF	A5,CHALTI	STOP I/P TO CHECK CHAR PAR	 
	ANK	A2,SBPARI	CHAR PARITY ERROR ?	 
	RF(NZ)	BRM970	YES	 
	XIF			 
	IFT	STAT=1 
	LDK	A1,CSSRBL	DATA BLOCKS RECEIVED 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	IM	WPOLL	SET WAIT FOR POLL 
	ST	A3,-4,A4	STORE LENGTH 
	LDK	A2,DID	GENERAL DID 
	LD	A3,SPRINT	PRIN ASKED (DC2) ?
	RF(Z)	BRM358	NO
	LD	A2,DWTDID,A6	YES, GET SELECTED DID
BRM358	EQU	*
	SC	A2,-1,A4	STORE DID IN BUFFER
	LD	A2,FSID	SID 
	SC	A2,-2,A4	STORE SID IN BUFFER
	CF	A5,CHALTI	HALT INPUT
	CF	A15,GRBUF	ALLOCATE RECEIVE BUFFER 
	IFT	AUX=1
	LD	A1,SPRINT 
	RF(NZ)	BRM370	SET WABT 
	XIF			 
	IM	TACK	ACK TO BE SENT 
BRM360	EQU	*
	ADK	A4,6	ADJUST BUFFER POINTER 
	RF	TEXT	PROCESS TEXT 
	IFT	AUX=1
* 
*  PRINT COMMAND, SET TRANSMIT WABT		 
* 
BRM370	EQU	*
	IM	TWABT 
	RB	BRM360
	XIF			 
	EJECT
* 
* 
*	ERROR: WAIT FOR TWO /FF CONSECUTIVE 
* 
* 
BRM800	EQU	*
	LDKL	A5,STB
	CF	A5,CSYNCI	START I/P WITH SYNC DEF	
BRM900	CF	A5,READ 
	LD	A1,DCSTCU	ANY STATUS FROM CONTROL UNIT ?
	RF(NZ)	BRM910	YES HALT AND RESYNC
	SUK	A2,PAD	PAD ?	
	RB(NZ)	BRM900	NOT /FF
BRM910	CF	A5,CHALTI	HALT INPUT AND RESYNCHRONIZE
BRM915	EQU	*		
	ABL	BRM
* 
*	PARITY ERROR
* 
BRM920	EQU	*
	IFT	STAT=1 
	LDK	A1,CSSRPE	PARITY ERROR 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	RB	BRM900
* 
*	INCORRECT HEADER
* 
BRM930	EQU	*
	IFT	STAT=1 
	LDK	A1,CSSXC2	INCORRECT HEADER 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	RB	BRM900
* 
*	BUFFER BUSY 
* 
BRM940	EQU	*
	IFT	STAT=1 
	LDK	A1,CSSRBY	BUFFER BUSY
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	RB	BRM900
* 
*	BUFFER OVERFLOW 
* 
BRM950	EQU	*
	IFT	STAT=1 
	LDK	A1,CSSRBO	BUFFER OVERFLOW
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	RB	BRM900
* 
*	BCC ERROR 
* 
BRM960	EQU	*
	IFT	STAT=1	
	LDK	A1,CSSRPE	PARITY ERROR 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	RB	BRM910
* 
*	CHAR PARITY ERROR 
* 
BRM970	EQU	*
	IFT	STAT=1 
	LDK	A1,CSSRPE	PARITY ERROR 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	RB	BRM915
	EJECT
* 
* 
*	TEXT RECEIVED 
* 
* 
TEXT	EQU	*
	LD	A2,FSID 
	ST	A2,DCSTRX	SAVE SID TEXT 
	CF	A15,RQRE50	COMPLETE RECEIVE REQUEST 
TEX205	EQU	*
	IFT	AUX=1
	LD	A1,FDID 
	SUK	A1,DID 
	RF(Z)	TEX206 
* 
* FORCE SELECT ANSWER 
*       IF DC2,FORCE WABT 
* 
	LD	A1,SPRINT 
	RF(NZ)	TEX206	PRINT WITH FAST SELECTION
	IM	SREADY	FORCE SELECT ANSWER
	LD	A1,FDID 
	ST	A1,DIDREA 
TEX206	EQU	*
	XIF			 
	ABL	BRM
	EJECT
* 
* 
*	STATUS POLL: GENERAL AND SPECIFIC 
* 
* 
SP	EQU	*
	CM	WPOLL	CLEAR WAIT FOR POLL 
	LD	A2,XACK	STATUS POLL WITHOUT ACK 
	RF(Z)	SPA200	ACK NOT EXPECTED
	CF	A5,TRRPRQ	SEND REPLY REQUEST
SP100	ABL	BRM 
SPA	EQU	*	STATUS POLL WITH ACK
	CM	WPOLL	CLEAR WAIT FOR POLL 
	LDK	A1,0	RETURN CODE = 0 
	CF	A5,RQSE50	CHECK IF WRITE REQUEST IS TO BE COMPLETED 
SPA200	EQU	*
	CF	A5,CPTIM	RESET POLL TIMER 
	IFF	AUX+BFBUSY=0 
	LD	A2,DCRBUF	CHECK IF BUSY	
	RF(Z)	SPA800	BUSY, NO RECEIVE BUFFER	
	LD	A2,XBUSY	WAS PREVIOUS BUSY	 
	RF(NZ)	SPA850	YES, SEND THRU	
	XIF
SPA300	EQU	*
	IFT	SBS=0		
	LD	A2,FSID	GET SID 
	SUK	A2,SID	GENERAL SID ? 
	RF(NZ)	SPA350	NO,SPECIFIC CHECK IT 
	XIF			 
	EJECT
* 
* SEND TRAFFIC ON GENERAL STATUS POLL IF REQUIRED 
* 
	IFT	AUX=1
	LD	A1,SREADY 
	RF(Z)	SPA301 
	CF	A5,SETREA 
	ABL	TPA400	SELECT DEVICE 
SPA301	EQU	*
	LD	A1,SPRINT 
	RF(Z)	SPA302 
	CF	A5,FRWABT	PRINT MODE
SPA302	EQU	*
	LD	A6,DCSTQ
	ABL(NZ)	TPA305	SEND THRU 
	XIF			 
SPA305	EQU	*
	LD	A6,DCWRQ	GET QUEUE ANCHOR 
	RF(Z)	SPA500	NO TRAFFIC
	SUK	A6,DWTOPN	GET DWT ADDRESS
SPA330	EQU	*
	LDR*	A2,A6	GET SUBTERMINAL 
	ST	A2,FSID	STORE SID 
	LDK	A2,DID 
	ST	A2,FDID	RESTORE DID 
	CF	A5,TRTRAF	SEND TRAFFIC
	RB	SP100 
* 
	EJECT
*  SPECIFIC STATUS POLL 
* 
SPA350	EQU	*
	LD	A6,FDWTIN	RESTORE DWT	
	IFT	AUX=1
	LD	A1,SREADY 
	RF(NZ)	SPA700	SELECT DEVICE
	LD	A1,SPRINT 
	RF(NZ)	SPA600	PRINT STATEMENT
	LD	A1,DWTPRT,A6	PRINT IN PROGRESS ?
	RF(NZ)	TPA201	YES
SPA360	EQU	*
	LD	A1,FDID 
	SUK	A1,DID	SELECTION OR DESELECTION ?
	ABL(NZ)	TPA400	YES 
	XIF			 
	LD	A1,DWTST,A6	GET STATUS
	RF(N)	SPA500	NO ORDER ON 
	LD	A1,DWTOR,A6	GET ORDER 
	ANK	A1,/FF	REMOVE OPTIONS
	SUK	A1,/06	WRITE ? 
	RF(NZ)	SPA500	NO,NO TRAFFIC
	RB	SPA330	TRAFFIC FOR THIS DWT 
SPA500	CF	A5,TRNOTR	SEND NO TRAFFIC 
	RB	SP100 
	IFT	AUX=1
SPA600	EQU	*
	LD	A1,DWTTXT 
	CW	A1,FDWTIN 
	ABL(NE)	BRM	MUST BE FOR THE SAME TERMINAL
	CF	A5,FRWABT	SET WABT
	RB	SPA360
* 
SPA700	EQU	*
	LD	A1,DWTTXT 
	CW	A1,FDWTIN 
	ABL(NE)	BRM
	CF	A5,SETREA 
	ABL	TPA400 
	XIF			 
	IFF	AUX+BFBUSY=0 
	EJECT			 
*				 
*   RECEIVE BUFFER NOT AVAIABLE, SEND BUSY	 
SPA800	EQU	*		
	CM	TACK	NO ACK TO BE SENT	 
	LD	A2,XBUSY	WAS PREVIOUS BUSY	 
	RF(Z)	SPA810	NO	 
	LD	A2,FSID	GET SID	
	CWK	A2,SID	IS IT A GENERAL POLL	 
	RF(E)	SPA820	YES, SEND NO TRAFFIC	 
SPA810	EQU	*		
	IM	TWABT	INDICATE WABT TO BE SENT	 
SPA820	EQU	*		
	CF	A5,TRNOTR	TRANSMIT WABT OR NO TRAFFIC	
	CM	TWABT		 
	IM	XBUSY	INDICATE PREVIOUS BUSY	 
	ABL	SP100	RETURN	
*				 
*   NOT BUSY ANY MORE, SEND THRU		
*				 
SPA850	EQU	*		
	CM	XBUSY	INDICATE NOT BUSY	
	CF	A5,TRTHRU	TRANSMIT THRU	
	ABL	SP100	RETURN	
	XIF
	EJECT
* 
* 
*	TRAFFIC POLL
* 
* 
TP	EQU	*	TRAFFIC POLL WITHOUT ACK 
	IFT	SBS=1
	CM	TPAX	CLEAR TR.POLL+ACK INDICATOR	 
	XIF			 
	CM	WPOLL	CLEAR WAIT FOR POLL 
	LD	A2,XACK 
	RF(Z)	TPA200	NO ACK EXPECTED 
	CF	A5,TRRPRQ	SEND REPLY REQUEST
	ABL	SP100
TPA	EQU	*	TRAFFIC POLL WITH ACK 
	CM	WPOLL	CLEAR WAIT FOR POLL 
	LDK	A1,0	RETURN CODE = 0 
	CF	A5,RQSE50	CHECK IF WRITE IS TO BE COMPLETED 
	IFT	SBS=1
	IM	TPAX	SET TR.POLL+ACK INDICATOR	 
	XIF			 
TPA200	EQU	*
	CF	A5,CPTIM	RESET POLL TIMER 
	IFF	AUX+BFBUSY=0 
	LD	A2,DCRBUF	CHECK IF BUSY	
	RB(Z)	SPA800	BUSY	 
	LD	A2,XBUSY	WAS PREVIOUS BUSY 	
	RB(NZ)	SPA850	YES SEND THRU	 
	XIF
	IFT	SBS=0		
* 
*  CHECK IF SPECIFIC OR GENERAL SID 
* 
	LD	A2,FSID	GET SID 
	SUK	A2,SID	GENERAL SID ? 
	RF(Z)	TPA300	YES 
	XIF			 
	IFT	SBS=1
	RF	TPA300	TREAT AS GENERAL POLL	 
	XIF			 
* 
*  HERE ON SPECIFIC SID 
* 
	LD	A6,FDWTIN	GET DWT-ADDR	 
	IFT	AUX=1
*  TEST SPECIFIC DID		
	LD	A1,FDID	GET DID 
	SUK	A1,DID	GENERAL DID ? 
	ABL(NZ)	TPA400	NO,SELECT AI DEVICE 
	EJECT
* 
*  SPECIFIC TRAFFIC POLL
*           TEST IF PRINT MODE
* 
	LD	A1,SREADY 
	RF(NZ)	TPA207	SELECT DEVICE
	LD	A1,SPRINT 
	RF(NZ)	TPA206	PRINT STATEMENT
	LD	A1,DWTPRT,A6
	RF(Z)	TPA203	NO PRINT MODE 
TPA201	EQU	*
	LD	A1,DWTDID,A6
	ST	A1,FDID	INIT AI DEVICE ADDRESS
	LD	A1,DWTST,A6 
	ANK	A1,BUSYFL
	RF(Z)	TPA306	NOT BUSY
	IM	TWABT 
	CF	A5,TRNOTR 
	ABL	SP100	RETURN AFTER TRANSMIT BUSY 
TPA203	EQU	*
	XIF			 
	LD	A1,DWTST,A6	GET STATUS
	RB(N)	SPA500	NO ORDER ON 
	LD	A1,DWTOR,A6	GET ORDER 
	ANK	A1,/FF	REMOVE OPTIONS
	SUK	A1,/06	WRITE ORDER ? 
	RB(NZ)	SPA500	NOTHING TO SEND,NO TRAFFIC 
	EJECT
* 
*  SEND TEXT ON SPECIFIC TRAFFIC POLL 
* 
TPA205	EQU	*
	IFT	SBS=1
	LDK	A2,/51	SBS SID	
	ST	A2,FSID		 
	XIF			 
	ST	A6,FDWTUT	WRITING DWT 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	ST	A8,FECB 
	IFF	MMUPAG=0 
	LDKL	A4,MMUBUF	GET BUFFER ADDRESS
	ST	A4,ECBBA,A8 
	CF	A15,DC:MOT	MOVE DATA TO OUTPUT BUFFER 
	XIF
	IFT	STAT=1 
	LDK	A1,CSSTBL	DATA BLOCKS TRANSMITTED
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	LD	A2,ECBBA,A8	GET BUFFER ADDRESS
	ADK	A2,2	DUMMY WORD
	ST	A2,FECBBA 
	LD	A2,ECBRL,A8	GET REQUESTED LENGTH
	RF(Z)	TPA210	PROCESS KEY 
	SUK	A2,2	RESTORE CORRECT LENGTH
	ST	A2,FECBRL 
	CM	NAKCNT	CLEAR NAK COUNTER
	CF	A5,TRTEXT	TRANSMIT TEXT 
	IM	XACK	ACK EXPECTED 
	ABL	SP100
	IFT	AUX=1
TPA206	EQU	*
	LD	A1,DWTTXT 
	CW	A1,FDWTIN 
	ABL(NE)	BRM	MUST BE FOR THE SAME TERMINAL
	CF	A5,FRWABT	SET WABT
	RB	TPA203
TPA207	EQU	*
	LD	A1,DWTTXT 
	CW	A1,FDWTIN 
	ABL(NE)	BRM
	CF	A5,SETREA 
	RF	TPA400
	XIF			 
TPA210	EQU	*
	LD	A1,ECBCW,A8	GET FUNCTION CODE 
	ANKL	A1,/FF
	SC	A1,DCSTR9	INIT TRANSFER FIELD 
	CF	A5,TRSFCN	TRANSFER FUNCTION KEY 
	ABL	SP100
	EJECT
* 
*  GENERAL TRAFFIC POLL DETECTED
* 
TPA300	EQU	*
	IFT	AUX=1
* 
* TEST IF PRINT SEQUENCE INITIATED
* 
	LD	A1,SREADY 
	RF(Z)	TPA301 
	CF	A5,SETREA 
	ABL	TPA400 
TPA301	EQU	*
	LD	A1,SPRINT 
	RF(Z)	TPA302 
	CF	A5,FRWABT	INIT WABT 
TPA302	EQU	*
	LD	A6,DCSTQ
	RF(Z)	TPA315	NO PENDING THRU 
TPA305	EQU	*
	SUK	A6,DWTOPN
	LD	A1,DWTDID,A6	GET DID
	ST	A1,FDID 
	LDR*	A1,A6 
	ST	A1,FSID 
TPA306	EQU	*
	ST	A6,FDWTUT	INIT OUTPUT DWT 
	CF	A5,TRTHRU	SEND THRU 
	CM	DWTPRT,A6 
	ABL	SP100
TPA315	EQU	*
	XIF			 
	IFT	SBS=1
	LD	A6,TPAX	WAS PREVIOUS TR.POLL + ACK ?	 
	ABL(NZ)	SPA500	YES, SEND NO TRAFFIC	 
	XIF			 
	LD	A6,DCWRQ	GET QUEUE ANCHOR 
	ABL(Z)	SPA500	NO TRAFFIC 
	SUK	A6,DWTOPN	GET DWT ADDRESS
	LDR*	A2,A6	INIT SID
	ST	A2,FSID 
	LDK	A2,DID 
	ST	A2,FDID	RESTORE GENERAL DID 
	RB	TPA205	SEND FIRST TEXT IN QUEUE 
	IFT	AUX=1
	EJECT
* 
*  FORCE WABT ANSWER(WITH SPECIFIC DID) 
*       ON POLL FOLLOWING TEXT+DC2 (PRINT)
* 
FRWABT	EQU	*
	LD	A6,FDWTIN	RESTORE LAST DWT
	CM	SPRINT	RESTORE PRINT FLAG 
	LD	A1,DWTDID,A6	GET SPECIFIC DID 
	ST	A1,FDID	STORE IT TO BE SEND 
	IM	DWTPRT,A6	INIT WABT-THRU INDICATOR
	RTN	A5 
* 
*  INIT DEVICE (SID,DID)
* 
SETREA	EQU	*
	LD	A1,DIDREA 
	ST	A1,FDID 
	LD	A1,DCSTRX 
	ST	A1,FSID 
	RTN	A5 
	EJECT
* 
*  SELECT AI DEVICE 
* 
TPA400	EQU	*
* 
* TEST IF DID IS VALID
* 
	CF	A5,DESEL	EXAMINE EVENTUAL DESELECTION 
	CM	SREADY	CLEAR READY TO SEND
	LD	A6,FDWTIN	GET DWT 
	LD	A1,DWTST,A6	TERMINAL BUSY ? 
	ANKL	A1,BUSYFL 
	ABL(NZ)	BRM	YES,DONT ACCEPT ANY SELECT 
	LD	A1,FDID	GET RECEIVED DID
	LDK	A3,DWTLST	GET DEVICE LIST
	ADR	A3,A6
TPA403	EQU	*
	LDR*	A2,A3	GET DID IN LIST 
	ABL(Z)	BRM	END OF LIST 
	ANKL	A2,NBIT0	IGNORE STATUS
	CWR	A1,A2	OK ? 
	RF(E)	TPA405	YES,DID RECOGNIZED
	ADK	A3,2 
	RB	TPA403
	EJECT
* 
* DID OK,FETCH APPROPRIATE DEVICE STATUS
* 
TPA405	EQU	*
	ST	A1,DWTDID,A6	SAVE AI ADDRESS
	LDR*	A2,A3	GET AI STATUS 
	ANKL	A2,BIT0	AI OPERABLE ? 
	RF(NZ)	TPA500	NO 
* 
*  DEVICE READY 
* 
	CF	A5,TREADY 
	ABL	SP100
* 
*  DEVICE NOT OPERABLE
* 
TPA500	EQU	*
	CF	A5,TRNOP
	ABL	SP100
	EJECT
* 
*  DESELECT DEVICE IF REQUIRED
*      RECOVERY DID=/72 
*    RELEASE TERMINAL BY RESETTING STATUS BUSY
* 
DESEL	EQU	* 
	LD	A1,FDID 
	CWK	A1,CHDSL	DESELECTION ? 
	RF(E)	DESEL1 
	RTN	A5	NO
DESEL1	EQU	*	DESELECTION,RESTORE TERMINAL 
	CM	DWTPRT,A6	RESET WABT-THRU INDICATOR 
	LDK	A1,/FE 
	ANS	A1,DWTST,A6	RESET TERMINAL BUSY
	CF	A5,TRNOP	SEND NO TRAFFIC
	RTN	A5 
	XIF			 
	EJECT
* 
* 
*	RETRANSMIT REQUEST
* 
* 
RT	EQU	*
	LD	A1,XACK 
	RF(Z)	RT110	SEND NO TRAFFIC IF ACK NOT EXP	
	LD	A1,ZRECOV+4 
	CW	A1,FSID 
	ABL(NE)	BRM	NOT PROPER SID 
	LD	A6,FDWTUT 
	RF(Z)	RT150	NO TEXT TO RETRANSMIT
	LD	A8,DWTECB,A6	RESTORE ECB ADDRESS
	LD	A1,ECBRL,A8	THRU,FKEY ? 
	RF(Z)	RT150	YES
	IM	NAKCNT	COUNT NAK:S
	LD	A2,NAKCNT 
	SUK	A2,4 
	RF(Z)	RT100	4 NAK:S RECEIVED 
	IM	TSTENQ
	CF	A5,TRTEXT	RETRANSMIT TEXT 
	IFT	STAT=1 
	LDK	A1,CSSTRT	DATA BLOCKS RETRANSMITTED
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	ABL	SP100
RT100	LDK	A1,2	4 NAK:S: THROUGHPUT ERROR
	CF	A5,RQSE50	COMPLETE WRITE REQUEST IF ANY 
	ABL	SP100
RT110	EQU	*		 
	CF	A5,TRNOTR	SEND NO TRAFFIC	
	ABL	SP100		
	EJECT
* 
*  HERE RECOVERY ON LAST MESSAGE
*       TEXT EXCLUDED 
* 
RT150	EQU	* 
	IM	TSTENQ
	CFI	A5,LSEND	RETURN TO LAST STATUS 
	IFT	STAT=1 
	LDK	A1,CSSTRT	DATA BLOCKS RETRANSMITTED
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	ABL	BRM
	EJECT
* 
* 
*	TRANSMIT PROCEDURE RESPONSES
* 
* 
TRACK	EQU	* 
	LDKL	A4,DCSTR1	NO TRAFFIC WITH ACK 
	IM	XACK
	LDKL	A1,TRACK
	ST	A1,LSEND
	RF	TRCTRL
* 
* ACK NOT RECEIVED SEND ENQ 
* 
TRRPRQ	EQU	*
	IFT	STAT=1 
	LDK	A1,CSSXC1	REPLY REQUESTS TRANSMITTED 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	CF	A5,TRSYNC 
	LDK	A2,SOH 
	CF	A5,WRITE
	LDKL	A8,0	BCC
	LD	A2,DTECHP,A7	CHP
	CF	A5,WRITEP 
	LD	A2,ZRECOV+4 
	CF	A5,WRITEP	LAST SID
	LD	A2,ZRECOV+6	LAST DID
	CF	A5,WRITEP	DID 
	LDKL	A4,DCSTR4	ENQ 
	RF	TRC100
* 
TRTRAF	EQU	*
	LDKL	A4,DCSTR3	TRAFFIC 
	IM	XACK
	LDKL	A1,TRTRAF 
	ST	A1,LSEND
	RF	TRCTRL
	EJECT
* 
* SEND NO TRAFFIC 
* IF ACK OR WABT HAVE TO BE INCLUDED
*  TAKE CARE ABOUT SID,DID
* 
* 
TRNOTR	EQU	*
	LD	A1,DCSTRX	RESTORE SID TO BE ACKNOWLEDGED
	ST	A1,FSID 
	LD	A1,TACK	TRANSMIT ACK ?
	RF(Z)	TRNOT1	NO
	RB	TRACK	YES 
TRNOT1	EQU	*
	LD	A1,TWABT	TRANSMIT WABT ?
	RF(Z)	TRNOT2	NO
	RB	TRACK	YES 
TRNOT2	EQU	*
	LDKL	A4,DCSTR5 
	CF	A5,TRSYNC 
	LDKL	A8,0	BCC
	RF	TRC100
	EJECT
* 
* 
*   DEVICE HANDLING 
* 
	IFT	AUX=1
TREADY	EQU	*
	LDKL	A4,DCSTR6 
	IM	XACK
	LDKL	A1,TREADY 
	ST	A1,LSEND
	RF	TRCTRL
	XIF			 
TRTHRU	EQU	*
	LDKL	A4,DCSTR7 
	IM	XACK
	LDKL	A1,TRTHRU 
	ST	A1,LSEND
	RF	TRCTRL
	IFT	AUX=1
TRNOP	EQU	* 
	LDKL	A4,DCSTR8 
	IM	XACK
	LDKL	A1,TRNOP
	ST	A1,LSEND
	RF	TRCTRL
	XIF			 
TRSFCN	EQU	*
	LDKL	A4,DCSTR9 
	IM	XACK
	LDKL	A1,TRSFCN 
	ST	A1,LSEND
	RF	TRCTRL
	EJECT
* 
TRCTRL	EQU	*
* 
*  HERE TO TEST ON RETRANSMISSION CASE OR NOT 
*       IF YES RESTORE PREVIOUS HEADER
* 
	LD	A1,TSTENQ 
	RF(NZ)	RETRAX	RETRANSMISSION 
	CF	A5,TRHEAD 
TRC100	LCR	A2,A4	GET CHARACTER
	ADK	A4,1	INCREMENT POINTER 
	ANK	A2,/7F 
	RF(Z)	TRC200	END OF STRING 
	CF	A5,WRITEP	WRITE CHARACTER 
	RB	TRC100
TRC200	LDK	A2,ETX 
	CF	A5,WRITEP	SEND ETX
	LDR	A2,A8
	CF	A5,WRITEP	SEND BCC
	LDK	A3,3 
TRC210	EQU	*
	LDK	A2,PAD	PAD CHAR	 
	CF	A5,WRITE	SEND PAD 
	SUK	A3,1 
	RB(NZ)	TRC210
	CF	A5,CHALTO	STOP O/P	 
	RTN	A5 
* 
*  RESTORE LAST PARAMETERS: 
*    RID SID DID (DLE 1 OR DLE ?) 
* 
RETRAX	EQU	*
	CM	TSTENQ
	LC	A3,ZRECOV 
	ST	A3,COUNT	INIT PARAMETERS COUNT
	LDK	A3,/FF 
	ANS	A3,ZRECOV	DESTROY FIRST CHARACTER COUNTER
	CF	A5,TRSYNC 
	LD	A2,ZRECOV 
	CF	A5,WRITE	SEND SOH 
	LDK	A3,2	INIT INDEX COUNTING 
	LDKL	A8,0	BCC
LOOP	EQU	*
	LD	A2,ZRECOV,A3
	CF	A5,WRITEP	SEND CHARACTER
	ADK	A3,2	COUNTER IN PROGRESS 
	CC	A3,COUNT+1	END OF SAVE AREA ? 
	RB(NE)	LOOP	NO,GO ON WRITING 
	LD	A1,COUNT
	SC	A1,ZRECOV	RESTORE COUNTER 
	LD	A1,FDWTUT	RECOGNIZE RETURN
	RB(Z)	TRC100	STATUS
	LD	A2,DWTECB,A1	RESTORE ECB ADDRESS
	LD	A1,ECBRL,A2	THRU OR FKEY ?
	RB(Z)	TRC100	YES 
	RF	TRT010	TEXT RECOVERY
	EJECT
* 
* 
*  TRANSMIT HEADER :
*                  SOH RID SID DID
*        DLE 1 (ACK),DLE ? (WABT=ACK+BUSY) IF REQUIRED
*  SAVE IT FOR RECOVERY PURPOSES
* 
* 
TRHEAD	EQU	*
	CF	A5,TRSYNC	TRANSMIT SYNC 
	LDK	A2,SOH 
	LDK	A3,0	INIT INDEX
	ST	A2,ZRECOV,A3
	CF	A5,WRITE	SEND SOH 
	ADK	A3,2 
	LDKL	A8,0	BCC
	LD	A2,DTECHP,A7	CHP
	ST	A2,ZRECOV,A3
	CF	A5,WRITEP	SEND RID
	ADK	A3,2 
	LD	A2,FSID 
	ST	A2,ZRECOV,A3
	CF	A5,WRITEP	SEND SID
	ADK	A3,2 
	LD 	A2,FDID
	ST	A2,ZRECOV,A3	SEND DID 
	CF	A5,WRITEP 
	ADK	A3,2 
* 
* HERE TO TEST IF ACK OR WABT HAVE TO BE INCLUDED IN HEADER 
* 
	LD	A1,TACK	TRANSMIT ACK ?
	RF(Z)	HEAD10	NO,TEST TRANSMIT WABT 
	CM	TACK
	LDK	A2,DLE 
	ST	A2,ZRECOV,A3
	CF	A5,WRITEP	SEND DLE
	ADK	A3,2 
	LDK	A2,ACK1
	ST	A2,ZRECOV,A3
	CF	A5,WRITEP	SEND 1
	ADK	A3,2 
	RF	HEAD20	RETURN 
HEAD10	EQU	*
	LD	A1,TWABT
	RF(Z)	HEAD20	NO PENDING WABT 
* 
	CM	TWABT	NO REJECT TRANSMIT WABT 
	LDK	A2,DLE 
	ST	A2,ZRECOV,A3
	CF	A5,WRITEP	SEND DLE
	ADK	A3,2 
	LDK	A2,WABT
	ST	A2,ZRECOV,A3
	CF	A5,WRITEP	SEND WABT 
	ADK	A3,2 
HEAD20	EQU	*
	SC	A3,ZRECOV	SAVE PARAMETERS COUNTER IN FIRST POSITION 
	RTN	A5 
	EJECT
* 
* 
*  TEST IF TRANSMIT OR RETRANSMIT TEXT
*     INCLUDE PENDING ACK,PENDING WABT EVENTUALLY 
* 
TRTEXT	EQU	*
	LD	A1,TSTENQ 
	RB(NZ)	RETRAX	RETRANSMISSION 
	EJECT
* 
*	TRANSMIT TEXT 
* 
* 
	CF	A5,TRHEAD 
TRT010	EQU	*
	LDK	A2,STX 
	CF	A5,WRITEP	SEND STX
	LD	A3,FECBRL	GET REQUESTED LENGTH
	LD	A4,FECBBA	AND BUFFER ADDRESS
TRT100	LCR	A2,A4	GET CHARACTER
	ADK	A4,1	INCREMENT POINTER 
	CF	A5,WRITEP	SEND CHARACTER
TRT120	EQU	*
	SUK	A3,1 
	RB(NZ)	TRT100	NEXT CHARACTER 
	ABL	TRC200	ALL TRANSMITTED. SEND ETX AND BCC 
	EJECT
* 
* 
*	TRANSMIT SYNC SEQUENCE
* 
* 
TRSYNC	EQU	*		
	CF	A5,CSYNCO	START O/P WITH SYNC DEF	
	CF	A5,READ WAIT FOR OUTPUT INTERRUPT 
	LDK	A3,4	4 SYNS
TRS100	LDK	A2,SYN 
	CF	A5,WRITE	SEND SYN 
	SUK	A3,1 
	RB(NZ)	TRS100
	RTN	A5 
	EJECT
**************************************************************************
**************************************************************************
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**	D R D C 2 2  -  U N I S C O P E  1 0 0 / 2 0 0   D R I V E R	**
**				**
**				**
**	H A R D W A R E   I N T E R F A C E   H A N D L I N G	** 
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**************************************************************************
**************************************************************************
	EJECT			 
*				 
*				 
*	CINIT : INITIALIZE LINE CONTROL UNIT INFO	
*				 
CINIT	EQU	*		 
	CM	DCLCI	CLEAR I/P ACTIVE IND	 
	ADKL	A15,4	INCREMENT STACK POINTER	
	ABR*	A15	RETURN TO CALLER	 
	EJECT
* 
*	CSYNCI : SEND SYNC PATTERN FOR INPUT DATA	
* 
* 
CSYNCI	EQU	*		
	LD	A2,PFPOST 
	RF(NZ)	CSYN:I	WAIT FOR POWER UP
	CF	A5,CHALTI	STOP I/P
	ST	A5,DCLCI	SET I/P ACTIVE FLAG	 
	ADK	A5,4	ADD RETURN OFFSET FOR ABR 
	IFT	SALCUZ=1 
	LDK	A2,PARITY	CHAR PARITY FUNCTION FOR LC	 
	CIO	A2,1,DCDEVI	STARTY I/O	
	LDK	A2,SYN	SYNC PATTERN	 
	OTR	A2,1,DCDEVI	SEND I/P SYNC PATTERN TO LC	 
	XIF			 
	IFF	SALCUZ=1 
	LDKL	A2,CBCARR+SYN	SYNC PATTERN	 
	CIO	A2,1,DCDEVI	SEND I/P SYNC PATTERN TO LC	 
	XIF	 
CSYN:I	EQU	*
	ABR*	A5	RETURN TO CALLER WITH CR SET	
*				 
*				 
*	CSYNCO : START TRANSMITTER WITH SYNC DEF	 
*				 
CSYNCO	EQU	*		
	LD	A2,PFPOST 
	RF(NZ)	CSYN:O	WAIT FOR POWER UP
	IFT	SALCUZ=1 
	LDK	A2,PARITY	CHAR PARITY TYPE CHECK BY CU	
	CIO	A2,1,DCDEVO	CIO START	 
	RF(A)	CSYNC2	ACCEPTED ->	
	SST	A2,DCDEVO	TRY TO READ STATUS THEN	 
	RF(A)	CSYNC1	ACCEPTED ->	
	ABL	BRM	NOT ACCEPTED TIMEOUT REQUEST	
CSYNC1	EQU	*		
	LDK	A2,PARITY	RETRY CIO	 
	CIO	A2,1,DCDEVO	DO IT	 
CSYNC2	EQU	*		
	LDK	A2,SYN	SYNC PATTERN	 
	OTR	A2,1,DCDEVO	DEFINE SYNC	 
	XIF			 
	IFF	SALCUZ=1 
	CIO	A2,1,DCDEVO	START TRANSMITTER	 
	XIF			 
CSYN:O	EQU	*
	RTN	A5		 
	EJECT			 
*				 
*	CHALTI : HALT INPUT CHANNEL		 
*				 
*				 
CHALTI	EQU	*		
	IFT	SALCUZ=1 
	LDK	A2,CBSTOP	STOP FUNCTION BIT	 
	XIF			 
	CIO	A2,0,DCDEVI	HALT I/P 
	CM	DCLCI	CLEAR I/P ACTIVE IND	 
	SST	A2,DCDEVI	READ STATUS	 
	IFF	LOGG=0		 
	CF	A5,LOGSST	LOGG I/P SST	 
	XIF			 
	ADK	A5,4	INCR STACK POINTE	
	ABR*	A5	RETURN TO CALLER	
*				 
*				 
*	CHALTO : HALT O/P CHANNNEL		
*				 
CHALTO	EQU	*		
	IFT	SALCUZ=1 
	LDK	A2,CBSTOP	STOP FUNCTION	 
	CIO	A2,0,DCDEVO	STOP CU	 
	CF	A5,READ	WAIT FOR INTERRUPT	 
	XIF			 
	IFF	SALCUZ=1 
	CIO	A2,0,DCDEVO	HALT CU	 
	XIF			 
	ADK	A5,4	INCREMENT STACK POINTER	
	SST	A2,DCDEVO	GET STATUS	
	ABR*	A5	RETURN TO CALLER	
	EJECT
* 
* 
*   RECEIVER INTERRUPT
* 
* 
IH2201	EQU	*
	ST	P,INTSAV	SAVE INTERRUPT ROUTINE ADDRESS 
	IFT	CPU852=1 
	CF	A15,SAVE8 
	XIF
	IFF	CPU852=1 
	MSR	8,A15
	XIF
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	INR	A2,0,DCDEVI	READ CHAR	 
	RF(NA)	IHIN20	NOT ACCEPTED,CHECK STATUS
	IFF	LOGG=0 
	CF	A5,LOGIN	LOG RECEIVED CHARACTER 
	XIF
	XRR	A8,A2	CALCULATE BCC
	LDR	A1,A2	MOVE CHAR TO FORM FLAG	
	ORKL	A1,/FF00	SET FLAG FOR CARRIER ON	 
	ST	A1,DCLCI	SET I/P CARR FLAG	 
	CM	DCSTCU	CLEAR SST SAVE 
	LDK	A1,1 
	ST	A1,DTEPLS,A7	CU OPERABLE
IHIN10	RTN	A5 
IHIN20	CF	A5,SST	PERFORM SST
	ABL	BRM
* 
* 
*   TRANSMITTER INTERRUPT 
* 
* 
IH2202	EQU	*
	ST	P,INTSAV	SAVE INTERRUPT ROUTINE ADDRESS 
	IFT	CPU852=1 
	CF	A15,SAVE8 
	XIF
	IFF	CPU852=1 
	MSR	8,A15
	XIF
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	RB	IHIN10
	EJECT
* 
* 
*	SST INSTRUCTION AND STATUS CHECK
* 
*   CHLC STATUS : BIT 10=CARRIER OFF
*                BIT 14=THROUGHPUT ERROR
*	CONTROL UNIT STATUS: SEE EQU:S ABOVE	 
* 
SST	EQU	*		 
	SST	A2,DCDEVI	READ STATUS	 
	LDR	A3,A2	MOVE STATUS	 
	IFF	LOGG=0 
	CF	A5,LOGSST	LOG SST INFORMATION 
	XIF
	ANK	A2,SBERR	ERROR BIT SET ?	
	RF(NZ)	SST050	YES	 
	IFT	SALCUZ=0		 
	LD	A2,DCLCI	I/P STATUS ?	
	RF(Z)	EXDISP	I/P NOT ACTIVE IGNORE 	 
	RF(N)	SST100	I/P ACTIVE WITH DATA	 
	LDKL	A2,CBCARR+SYN	CARRIER ON RESYNC	
	CIO	A2,1,DCDEVI	START I/P AGAIN	 
	RF	EXDISP	RETURN TO DISP	
	XIF			 
	IFT	SALCUZ=1 
	RF	SST100			 
	XIF			 
SST050	EQU	*		
	CM	DTEPLS,A7	CU NOT OPERABLE 
	ANK	A2,SBCARR	CARRIER OFF	 
	RF(Z)	SST052	NO	 
	LD	A2,DCLCI	I/P STATUS	
	RF(Z)	EXDISP	NOT ACTIVE IGNORE CARRIER OFF	
	RF	SST100	EXIT		 
SST052	EQU	*		
	LDR	A2,A3	MOVE STATUS	 
	ANK	A2,SBTHRU	THROUGHPUT ERROR ?	
	RF(Z)	SST100	NO	 
	IFT	STAT=1 
	LDK	A1,CSCDIT	THROUGHPUT ERROR 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	ABL	BRM800	THROUGHPUT ERROR
SST100	EQU	*
	LDR	A2,A3
	ANK	A2,1	NOT OPERABLE ?
	RF(Z)	SST200	NO
	IFT	STAT=1 
	LDK	A1,CSCDTE	NOT OPERABLE 
	CF	A15,DCSUPS	UPDATE STATISTICS
	XIF
	CF	A15,STREG	SAVE REGISTERS
	CF	A15,SETIME	DELAY 1 SEC
	DATA	SST150,10 
	ABL	TDISP	DISPATCH 
SST150	EQU	*
	CF	A15,LDREG	LOAD REGISTERS
SST200	EQU	*
	ST	A1,DCSTCU 
	RTN	A5 
	EJECT
* 
* 
*	WRITE FROM OR READ ONE CHARACTER TO A2
* 
* 
WRITE	EQU	* 
	OTR	A2,0,DCDEVO	SEND CHAR	 
	RF(A)	WRIT10 
	RF	READ	THROUGPUT ERROR
WRIT10	XRR	A8,A2	ACCUMULATE BCC 
	IFF	LOGG=0 
	CF	A5,LOGOUT	LOG OUTPUT CHARACTER
	XIF
* 
READ	CF	A15,STREG 
EXDISP	EQU	*		
	ABL	TDISP
	EJECT
* 
* 
***	WRITEP
* 
*   WRITE A2 WITH PARITY
* 
* 
WRITEP	EQU	*
	IFT	SALCUZ=0		 
	ANK	A2,/FF 
	ECR	A1,A2
	ORK	A2,/80 
WRI100	SLL	A1,1 
	RB(P)	WRI100 
	RB(Z)	WRITE	WRITE
	XRK	A2,/80 
	RB	WRI100
	XIF			 
	IFT	SALCUZ=1 
	RB	WRITE	WRITE CHAR	 
	XIF			 
* 
* 
* 
***	READP 
* 
*   READ CHARACTER TO A2 AND CHECK PARITY 
* 
* 
READP	CF	A5,READ
	IFT	SALCUZ=0		 
	ECR	A1,A2
RE100	SLL	A1,1
	RF(Z)	RE110
	RB(NN)	RE100 
	XRK	A2,/80 
	RB	RE100 
RE110	LDR	A1,A2 
	ANK	A2,/7F 
	XIF			 
	IFT	SALCUZ=1 
	LDK	A1,/80		 
	XIF			 
	ADK	A5,4 
	ANK	A1,/80 
	XRK	A1,/80 
	ABR*	A5
* 
* 
	EJECT
* 
* 
*	POWER ON FUNCTIONS
* 
* 
DC22ON	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8 
	XIF
	IFF	CPU852=1 
	MSR	8,A15
	XIF
	LDKL	A7,DTETAB	DTE TAB ADDRESS 
	CF	A15,CINIT	INIT LINE CONTROL UNIT INFO	
	LD	A2,DCTPGP	GET POLL TIMER POINTER
	RF(NZ)	DRDC20	ALREADY STARTED
	CF	A15,SPOTIM	START POLL TIMER 
DRDC20	ABL	BRM
	EJECT
**************************************************************************
**************************************************************************
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**	D R D C 2 2  -  U N I S C O P E  1 0 0 / 2 0 0   D R I V E R	**
**				**
**				**
**	W O R K   A R E A S		**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**				**
**************************************************************************
**************************************************************************
* 
* 
*	DC RECEIVE BUFFER POOL
* 
* 
RLINK	EQU	RBUFL+RBUFL+8 
DCRBUF	EQU	*	POINTER TO FIRST FREE BUFFER 
	DATA	*+2 
	IFT	RBUFNR=14
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=13
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=12
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=11
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=10
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=9 
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=8 
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=7 
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=6 
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=5 
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=4 
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	IFT	RBUFNR=3 
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	0 
	RES	RBUFL+3
	EJECT
* 
*   MMU WORK BUFFER 
* 
	IFF	MMUPAG=0 
MMUBUF	RES	TBUFL+1	MMU WORK BUFFER
	XIF
	EJECT
* 
* 
*	INTERRUPT LOGGING ROUTINE 
* 
* 
	IFF	LOGG=0 
LOGSST	ST	A2,SAVE2
	ORKL	A2,/F000
	RF	LOG10 
LOGOUT	ST	A2,SAVE2
	ORKL	A2,/0F00
	RF	LOG10 
LOGIN	CWK	A2,/FF
	RF(E)	LOGE10 
	ST	A2,SAVE2
LOG10	ST	A3,SAVE3 
	LD	A3,LOGPNT 
	STR	A2,A3
	ADK	A3,2 
	CWK	A3,LOGEND
	RF(L)	LOGEXI 
	LDKL	A3,LOGSTA 
LOGEXI	ST	A3,LOGPNT 
	LD	A2,SAVE2
	LD	A3,SAVE3
LOGE10	RTN	A5 
	EJECT
* 
* 
LOGPNT	DATA	LOGSTA
LOGSTA	EQU	*
	RES	1000 
LOGEND	EQU	*-4
SAVE2	DATA	0
SAVE3	DATA	0
	XIF
* 
* 
* 
	EJECT
* 
*	DTETAB
* 
*	FIXED PART
DTETAB	EQU	*
	DATA	0,0,0,0,0,0 
	DATA	0,0 
	IFT	MMUPAG=1 
	DATA	0,0 
	XIF
	DATA	DTSTAT-DTETAB 
	DATA	0,0,0 
*	DRIVER DEPENDENT PART 
	DATA	0,0,0,0 
*	STATISTICAL BUFFER
DTSTAT	EQU	*
	DATA	0	SYMBOLIC ID 
	DATA	0	COUNTER STATUS INDEX
	DATA	CSCXC3	MAX COUNTER INDEX
	DATA	0,0	COUNTERS
	DATA	0,0,0,0,0,0 
	DATA	0,0,0,0,0,0	 *
	DATA	0,0,0,0,0,0	  * 
	DATA	0,0,0,0,0,0	   *  COUNTER AREA
	DATA	0,0,0,0,0,0	  * 
	DATA	0,0,0,0,0,0	 *
	DATA	0,0,0,0,0,0	* 
	DATA	0	* 
* 
	EJECT
* 
* 
*	PROCEDURE WORK AREAS
* 
* 
FDWTIN	DATA	0	CURRENT DWT FOR RECECEION 
FDWTUT	DATA	0	CURRENT DWT FOR TRANSMISSION
XACK	DATA	0	ACK EXPECTED
TACK	DATA	0	ACK TO BE TRANSMITTED 
WPOLL	DATA	0	WAIT FOR POLL
TWABT	DATA	0	WABT TO BE TRANSMITTED 
XBUSY	DATA	0	BUSY ANSWER ON PREVIOUS POLL	
HEADER	DATA	0,0	HEADER STORAGE AREA 
* 
FECB	DATA	0	WRITING ECB 
FECBBA	DATA	0	WRITING BUFFER ADDRESS
FECBRL	DATA	0	WRITING BUFFER LENGTH 
FSID	DATA	0	RESPONDING SID
FDID	DATA	0	RESPONDING DID
NAKCNT	DATA	0	NAK COUNTER 
* 
TSTENQ	DATA	0	RECOVERY FLAG 
COUNT	DATA	0	CHARACTERS TO BE SAVED 
* 
ZRECOV	DATA	0,0,0,0,0,0	SAVE TRANSMIT HEADER
LSEND	DATA	0	LAST TRANSMIT ADDRESS
* 
BUSYFL	EQU	1	BUSY FLAG (BIT 15 IN DWT)
* 
SPRINT	DATA	0	PRINT STATEMENT 
DWTTXT	DATA	0	LAST DWT FOR TEXT 
SREADY	DATA	0	SELECTION+TEXT
DIDREA	DATA	0	SELECTED DID
	IFT	SBS=1
SBSSTA	EQU	7	POSITION OF TERMINAL ID	 
SBSTID	DATA	0	INDEX TO FOUND TERMINAL ID	 
SBSA3	DATA	0	SAVE AREA A3	
SBSA4	DATA	0	SAVE AREA A4	
TPAX	DATA	0	1 IF TR.POLL+ACK RECEIVED	
	XIF			 
* 
	EJECT
* 
* 
STRING	EQU	*	FRAME STRINGS
	DATA	0,0	TRAFFIC POLL WITHOUT ACK
	DATA	/1031,0	TRAFFIC POLL WITH ACK 
	DATA	/0500,0	STATUS POLL WITHOUT ACK 
	DATA	/1031,/0500	STATUS POLL WITH ACK
	DATA	/0510,/3100	STATUS POLL WITH ACK	 
	DATA	/1015,0	RETRANSMIT REQUEST
STRINE	EQU	*	END OF STRINGS 
* 
* 
FRAME	EQU	*	BRANCH TABLE FOR FRAMES 
	DATA	TP	TRAFFIC POLL WITHOUT ACK 
	DATA	TPA	TRAFFIC POLL WITH ACK 
	DATA	SP	STATUS POLL WITHOUT ACK
	DATA	SPA	STATUS POLL WITH ACK
	DATA	SPA	STATUS POLL WITH ACK	 
	DATA	RT	RETRANSMIT REQUEST 
	EJECT
* 
* OUTPUT SOFTWARE MESSAGES
* 
* 
DCSTR1	DATA	0	WORK AREA FOR NO TRAFFIC+ACK
DCSTRX	DATA	0	SAVE LAST SID TEXT
DCSTR3	DATA	/1030,0	TRAFFIC 
DCSTR4	DATA	/1005,0	REPLY REQUEST 
DCSTR5	DATA	/0404,0	NO TRAFFIC
DCSTR6	DATA	/103E,0	DEVICE READY
DCSTR7	DATA	/103B,0	THRU
DCSTR8	DATA	/103D,0	DEVICE NOT OPERABLE 
DCSTR9	DATA	0	REQUEST PROCESSOR MESSAGE 
	EJECT
* 
* 
*	CONSTANTS AND WORK AREAS
* 
* 
DCONOF	DATA	0	ON- / OFFLINESWITCH 
DCSTOL	DATA	0	OLD DC EQUIPMENT STATUS 
DCSTCU	DATA	0	CURRENT STATUS
DCWRQ	DATA	0	WRITE REQUEST QUEUE
DCSTQ	DATA	0	THRU REQUEST QUEUE 
DCTPGP	DATA	0	TIMER POINTER GENERAL POLL
DCLCI	DATA	0	DC UNIT I/P STATUS	
	END

Full view