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

⟦759e2ace9⟧

    Length: 97432 (0x17c98)
    Notes: pts_type(SC)
    Names: »DRDC15.SC«

Derivation

└─⟦a16d9b08d⟧ Bits:30009712 Philips computer tape "TOSS11"
    └─⟦this⟧ »UPD4/DRDC15.SC« 
└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
    └─⟦this⟧ »TOSSWORK/DRDC15.SC« 

PTS(SC)

	IDENT	DRDC15	REL 11.0 81-09-09 870105041100

			=17, RETURN CODE AT CONNECT
			=16, DLOBUF DESTROYED AT CONNECT 
			=15, NO NEED TO RES 1 WORD BEFORE DATA 
			=14, LOSS OF DRIVER RECEIVE BUFFER 
			REL 11.0 81-05-21
			=13, ERRONEOUS DISCARD DWT HANDLING
			=12, SUB-ADDR IN CW2 AT RECEIVE REQ COMPL
			REL 11.0 81-05-12
			=11, PROCEDURE TIMER PROBLEM 
			=10, EOT ON SPECIFIC POLL
			=9, REMAINING TIME IN ECBCW1 
			REL 11.0 81-04-12
			=8, ODD USER BUFFER ADDRESS
			=7, BINARY STORE PROBLEM 
			REL 11.0 81-04-07
			=6, ERROR IN POLL TIMER HANDLING 
			=5, WRONG STATISTIC HANDLING 
			REL 11.0 81-03-27
			=4, ERROR IN POWER UP
			=3, DELETE INSTRUCTIONS NOT USED 
			=2, CHANGES IN STATUS HANLING
			=1, ERROR IN OPEN/CLOSE REQUESTS 
			REL 11.0 81-01-26
* 
* 
********************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRDC15: DRIVER DATA COMMUNICATION 
*           BSC MULTIPOINT LINE PROCEDURE 
*           OR SIEMENS MSV1 
* 
* 
* 
* 
* 
****************************************************
	EJECT
* 
* 
*	ENTRY POINTS
* 
	ENTRY	DC15AD	ADDRESS BLOCK TERMINAL REQUESTS 
	ENTRY	IH1501	INPUT INTERRUPT 
	ENTRY	IH1502	OUTPUT INTERRUPT
	ENTRY	DC15ON	POWER ON ROUTINE
	ENTRY	DW1500	DUMMY DWT 
* 
	EJECT
* 
* 
*	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	DWT ADDRESS 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTOR	DWT ORDER
	EXTRN	DWTECB	DWT ECB 
	EXTRN	DWTOPT	OPTION CODE 
	EXTRN	DWTUEC	USER ECB IF MMU 
	EXTRN	DWTMEC	MMU ECB 
	EXTRN	ECBFC	FILE CODE
	EXTRN	ECBBA	BUFFER ADDRESS 
	EXTRN	ECBRL	REQUESTED LENGTH 
	EXTRN	ECBEL	EFFECTIVE LENGTH 
	EXTRN	ECBCW1	CONTROL WORD 1
	EXTRN	ECBCW2	CONTROL WORD 2
	EXTRN	GETSSA 
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	TEBCDIC	ASCII TO EBCDIC TABLE
	EXTRN	TASCII	EBCDIC TO ASCII TABLE 
	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
	EXTRN	DC:MIN	MOVE DATA TO USER BUFFER
	EXTRN	DC:MOT	MOVE DATA FROM USER BUFFER
	EXTRN	DISEND	COMPLETE REQUEST AND DISPATCH 
	EXTRN	PFPOST	WAIT FOR POWER UP IF SET
	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
******************************************************* 
* 
*	PARAMETERS FOR CONDITIONAL ASSEMBLY 
* 
* 
X:A	EQU	1000	RECEIVE BUFFER LENGTH
RBUFL	EQU	X:A 
X:B	EQU	0	IF 1 INTERRUPT LOGGING
LOGG	EQU	X:B
X:C	EQU	600	POLL TIMEOUT VALUE
TIMPOL	EQU	X:C
X:D	EQU	0	STATUS AND RVI HANDLING IF=1
STARVI	EQU	X:D
X:E	EQU	0	READ COMMAND HANDLING IF=1
RCOM	EQU	X:E
X:F	EQU	254	TRANSMIT BLOCK LENGTH 
TBLEN	EQU	X:F 
X:G	EQU	0	CODE , 0=ASCII , 1=EBCDIC 
CODE	EQU	X:G
X:H	EQU	0	IF 1 SPECIFIC POLL HANDLING 
SPECP	EQU	X:H 
X:I	EQU	0	IF = 1 LINE SPEED SET TO HIGH 
			IF = 0  LINE SPEED IS SET TO LOW 
SPEED	EQU	X:I 
X:J	EQU	0	IF 1 SIEMENS MSV1 PROCEDURE 
MSV1	EQU	X:J
X:K	EQU	2	NUMBER OF RECEIVE BUFFERS (2-5) 
RBUFNR	EQU	X:K
X:L	EQU	0	IF = 1  PTS 6805 ADAPTION	SALCUZ
P6805	EQU	X:L 
X:M	EQU	/02 
	IFT	P6805=0
LCUIN	EQU	X:M	DEVICE ADDRESS OF RECEIVER
	XIF
	IFT	P6805=1
LCUIN	EQU	/0A	DEVICE ADDRESS OF RECEIVER
	XIF
	IFT	P6805=0		SALCUZ
LCUUT	EQU	LCUIN+/10	DEVICE ADDRESS OF TRANSMITTER	SALCUZ
	XIF			SALCUZ 
	IFT	P6805=1
LCUUT	EQU	LCUIN+/01	DEVICE ADDRESS OF TRANSMITTER	SALCUZ
	XIF			SALCUZ 
X:N	EQU	0 
IBMCHR	EQU	X:N	IF 1 IBM CHARACTER HANDLING
X:O	EQU	0	IF 1 MESSAGE PASSING TO DC TASK 
MESPAS	EQU	X:O
X:P	EQU	0	IBM-3270 EMULATION PACKAGE, IF NOT = 0
EM3270	EQU	X:P
X:Q	EQU	0 
TPMODE	EQU	X:Q	IF = 1 TRANSPARANT MODE
X:R	EQU	0 
STTSTS	EQU	X:R	IF = 1 STATISTICS INCLUDED 
X:S	EQU	500 
TBUFL	EQU	X:S	MMU BUFFER LENGTH 
BINTRM	EQU	0	IF 1 BINARY TRANSMISSION 
DMRK	EQU	0	SPECIAL CONDITION FOR DENMARK
NOWACK	EQU	0	WHEN WORKING WITH A MAIN-FRAME THAT
			DOESN'T ACCEPT WACK RESPONSE TO A SELECT 
			SEQUENCE, NOWACK SHOULD BE SET TO "ONE". 
				=2

REMTIM	EQU	0		=9
			IF = 1 THE REMAINING TIME UNTIL TIMEOUT	=9 
			IS DELIVERED IN ECBCW1 AT COMPLETION 	=9 
			OF SEND AND RECEIVE REQUESTS	=9
* 
	IFT	SPEED=1
LSPEED	EQU	/0200
	XIF
	IFT	SPEED=0
LSPEED	EQU	0
	XIF
	EJECT
* 
* 
***************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
***************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU 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	1
* 
DEVIND	EQU	0	DEVICE INDEX DATA COMMUNICATION
BUFLEN	EQU	TBUFL+TBUFL	MMU BUFFER SIZE
* 
	EJECT
* 
**************************************
* 
*	DCDEFS  COMMON DEFS FOR DC DRIVERS/PACKAGES 
*	
**************************************
	 
*************************************** 
* 
*	TABLE AND PACKET LAYOUTS
* 
*************************************** 
	 
	 
	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         / 
*	    ................... 
* 
	EJECT
* 
********************************************************* 
* 
*	D W T  D I S P L A C E M E N T S
* 
********************************************************* 
* 
DWTTQ	EQU	/0E	TERMINAL QUEUE
	IFT	MMUPAG=0 
DWTDRD	EQU	DWTTQ+2	START OF DRIVER DEPENDENT AREA 
	XIF
	IFT	MMUPAG=1 
DWTDRD	EQU	DWTTQ+6	START OF DRIVER 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 
DWTCUR	EQU	DWTDRD+26	CURSOR ADDRESS 
DWTBUF	EQU	DWTDRD+28	DEVICE BUFFER ADDRESS
DWTSTA	EQU	DWTDRD+30	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         / 
*	    ................... 
* 
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 
DTEDWT	EQU	DTEDRD+14	CHAIN LINK  DWT
DTEDDT	EQU	DTEDRD+16	CHAIN LINK  DISCARD DWT
*	STATITICS BUFFER
STWSID	EQU	DTEDRD+18	RESERVED FOR SYMBOLIC ID 
STWCST	EQU	DTEDRD+20	COUNTER STATUS INDEX 
STWMIX	EQU	DTEDRD+22	MAX COUNTER INDEX
STWCTA	EQU	DTEDRD+24	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	PROCEDURE TIME OUTS
CSSXC3	EQU	/1A	NBR OF TIMES POLL TIMEOUT HAS OCCURED
	 
	 
	EJECT
*	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	/4343	RESET STATISTICS AFTER READ	=5
	EJECT
* 
**********************************************************
* 
*	S O F T W A R E  R E T U R N  C O D E S 
* 
**********************************************************
* 
*---------------------------------------------------------------------- 
R:REQ	EQU	/8000	REQUEST ERROR 
R:ABRT	EQU	/4000	REQUEST ABORTED
R:2	EQU	/2000 
R:3	EQU	/1000 
*---------------------------------------------------------------------
R:4	EQU	/0800 
R:5	EQU	/0400 
R:6	EQU	/0200 
R:DATA	EQU	/0100	DATA AVAILABLE (QUEUED)
*---------------------------------------------------------------------
R:8	EQU	/0080 
R:TIME	EQU	/0040	TIME OUT 
R:10	EQU	/0020
R:SEQ	EQU	/0010	SEQUENCE ERROR
*---------------------------------------------------------------------
R:LGTH	EQU	/0008	ILLEGAL LENGTH 
R:13	EQU	/0004
R:LOGC	EQU	/0002	LOGICAL CONNECTION ERROR 
R:PHYC	EQU	/0001	PHYSICAL CONNECTION ERROR
*---------------------------------------------------------------------- 
* 
	EJECT
* 
********************************************************
* 
*	H A R D W A R E  R E T U R N  C O D E S 
* 
*********************************************************=
* 
*---------------------------------------------------------------------- 
H:0	EQU	/8000 
H:1	EQU	/4000 
H:2	EQU	/2000 
H:3	EQU	/1000 
*---------------------------------------------------------------------- 
H:4	EQU	/0800 
H:5	EQU	/0400 
H:6	EQU	/0200 
H:7	EQU	/0100 
*---------------------------------------------------------------------- 
H:8	EQU	/0080 
H:9	EQU	/0040 
H:CARR	EQU	/0020	CARRIER OFF
H:11	EQU	/0010
*-------------------------------------------------------------------- 
H:12	EQU	/0008
H:PARI	EQU	/0004	PARITY ERROR 
H:THRU	EQU	/0002	THROUGHPUT ERROR 
H:NOOP	EQU	/0001	NOT OPERABLE 
*---------------------------------------------------------------------- 
	EJECT			 
**********************************************************
* 
*	LINE CONTROL CHAR EQU:S		 
*				 
**********************************************************
* 
SF	EQU	X'1D'	START FIELD CHARACTER
SYN	EQU	/16 
STX	EQU	/02 
ETX	EQU	/03 
ETB	EQU	/17 
ITB	EQU	/1F 
SOH	EQU	/01 
ENQ	EQU	/05 
DLE	EQU	/10 
EOT	EQU	/04 
NAK	EQU	/15 
ESC	EQU	/1B 
SBA	EQU	/11 
GP	EQU	/22
RDBCOM	EQU	/32
RDMCOM	EQU	/36
	EJECT
	IFT	CODE=0 
PAR	EQU	/80 
RVI	EQU	/3C 
ACK0	EQU	/30
ACK1	EQU	/31
DC1	EQU	/11 
	IFT	MSV1=0 
WACK	EQU	/3B
	XIF
	IFT	CODE=0 
	IFT	MSV1=1 
WACK	EQU	/BF	=WABT - SIEMENS MSV1 PROCEDURE 
	XIF
	IFT	CODE=1 
PAR	EQU	/00 
WACK	EQU	/2C
RVI	EQU	/40 
ACK0	EQU	/18
ACK1	EQU	/2F
SYNEBC	EQU	/32
ENQEBC	EQU	/2D
ETBEBC	EQU	/26
	XIF
	IFT	P6805=0
ENQPAR	EQU	ENQ+PAR
RVIPAR	EQU	RVI+PAR
ACKPAR	EQU	ACK0+PAR 
	XIF
	IFT	P6805=1
ENQPAR	EQU	ENQ
RVIPAR	EQU	RVI
ACKPAR	EQU	ACK0 
	XIF
	EJECT
* 
* 
*	3270 SENSE/STATUS INFORMATION 
* 
* 
	IFF	STARVI=0 
SSTAB	EQU	*	S/S 0 : NO STATUS,DB,DE,DB+DE 
* 
* 
	DATA	/4248 
	DATA	/4242 
* 
NOIR	EQU	/20	S/S 1 : NO INTERVENTION REQUIRED 
IR	EQU	/26	S/S 1 : INTERVENTION REQUIRED
	XIF
* 
* 
*	TIMER VALUES
* 
* 
TIMPRO	EQU	30	PROCEDURE TIMER 3 SEC 
* 
* 
	EJECT
************************************************************* 
* 
*	LINE CONTROL UNIT FUNCTION CONTROL EQU:S
* 
************************************************************* 
* 
	IFT	CODE=0 
SYNC	EQU	/16
	XIF
	IFT	CODE=1 
SYNC	EQU	/32
	XIF
	IFT	P6805=0
CBCARR	EQU	/100+LSPEED
	XIF
	IFT	P6805=1
CBSTOP	EQU	/00
	IFT	CODE=0 
PARITY	EQU	/0C
	XIF
	IFT	P6805=1
	IFT	CODE=1 
PARITY	EQU	/00
	XIF
	EJECT
*************************************************** 
* 
*	LINE CONTROL UNIT SST STATUS BITS 
* 
*************************************************** 
* 
	IFT	P6805=0
H:ERR	EQU	/23	H:NOOP+H:THRU+H:CARR
	XIF
	IFT	P6805=1
H:ERR	EQU	/27	H:NOOP+H:THRU+H:CARR+H:PARI 
	XIF
	EJECT			 
****************************************************************
* 
*	DRIVER ADDRESS BLOCK
* 
*************************************************************** 
* 
	DATA	BUFLEN	MMU BUFFER SIZE
	DATA	DEVIND	DEVICE INDEX 
DC15AD	DATA	DCACT	ACTIVATION ADDRESS
	DATA	ABORT	ABORT ROUTINE 
	DATA	DCRBUF	REC. BUFFER ANCHOR 
	DATA	6	HEADER LENGTH 
* 
	RES	15	SUBROUTINE STACK FOR INTERRUPTS 
STB	RES	1 
	EJECT

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

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

AB:10	LD	A2,DWTOR,A6	ORDER CODE 
	ANK	A2,/7F 
	SUK	A2,6 
	RF(NE)	AB:RTN
	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	REST SENDING DWT 
	CM	XACK	RESET ACK EXPECTED 

AB:RTN	EQU	*
	ABL	RTABRT 
	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
	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
* 
* 
*	OPEN REQUEST
* 
*	ACTIVATION PARAMETERS:
*		SYMBOLIC DTE-ADDRESS (ECBCW2)
* 
*	FUNCTIONS:
*		1. CHECK IF ALREADY OPEN & IF SO SAME DTE-ADDRESS
*		2. CONVERT & VERIFY DTE ADDRESS
* 
RQOPEN	EQU	*
	LD	A1,ECBCW2,A8	GET SYMBOLIC DTE-ADDRESS 
	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	*
	CW	A1,DTELAD,A7	SAME AS THE ONE WHO OPENED ? 
	RF(E)	RQOP90	YES - OK
RQOP15	EQU	*
	ABL	RTSEQ	RETURN: SEQUENCE ERROR 
* 
RQOP20	EQU	*
	IM	DTESTA,A7	SET OPEN IN PROGRESS
	ST	A1,DTELAD,A7	SAVE SYMBOLIC DTE ADDRESS
	LDR	A2,A7	ADDR TO SELECT AND POLL IN DTE TAB 
	CF	A15,GETDNA	CONVERT AND VALIDATE DTE ADDR
	LDR	A1,A1
	RF(NN)	RQOP80	OK 
	CM	DTELAD,A7	CLEAR DTE ADDR
	CM	DTESTA,A7	CLEAR DTE STATUS
	ABL	RTREQ	RETURN: REQUEST ERROR
* 
RQOP80	EQU	*
	IFT	CODE=1 
	LDR*	A2,A7	DTE ADDRESS IN EBCDIC 
	LDR	A1,A2
	ANK	A2,/FF 
	RF(Z)	RQOP30	ONLY ONE BYTE 
	LC	A2,TASCII,A2	CONVERT INTO ASCII 
	SLL	A2,8 
RQOP30	EQU	*
	ECR	A1,A1
	ANK	A1,/FF 
	LC	A2,TASCII,A1
	STR	A2,A7	SAVE ASCII VALUE IN DTETAB 
	XIF
				=1
	ABL	DTE:ON	CONNECT MODEM 
RQOP90	EQU	*
	LD	A2,DTEPLS,A7	PHYSICAL CONNECTION ?
	ABL(NZ)	RTOK	YES RETURN OK 
	ABL	RTPHYC	RETURN PHYSICAL CONNECTION
	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
* 
RQCLOS	EQU	*
	LD	A5,DWTOR,A6	GET OPTION AND ORDER
	LD	A2,ECBCW2,A8	GET SYMBOLIC DTE - ADDR
	RF(Z)	RQCL20 
	CW	A2,DTELAD,A7	CORRECT DTE ?
	ABL(NE)	RTREQ	RETURN: REQUEST ERROR
RQCL20	EQU	*
	LD	A2,DTESTA,A7	GET DTE STATUS 
	ABL(Z)	RTOK	RETURN : OK
	SUK	A2,2	DTE OPENED ?
	ABL(NZ)	RTSEQ	RETURN: SEQUENCE ERROR 
	IM	DTESTA,A7	CLOSE IN PROGRESS 
	LDR	A8,A6	SAVE REQUESTING DWT-ADDR 
* 
RQCL40	EQU	*
	IFT	MESPAS=1 
	LD	A6,DTEDDT,A7	GET DISCARD DWT ADDR 
	RF(Z)	RQCL50 
	LDR	A5,A5	CONDITIONAL CLOSE ?
	RF(N)	RQCL95	YES ! 
	LD	A2,DWTCHN,A6	GET POINTER TO NEXT DWT
	ST	A2,DTEDDT,A7	DISCARD DWT ADDR REMOVED 
	RF	RQCL60
RQCL50	EQU	*
	XIF
	LD	A6,DTEDWT,A7	GET DWT ADDR 
	RF(Z)	RQCL90	NO DWT IN QUEUE 
	LDR	A5,A5	CONDITIONAL CLOSE ?
	RF(N)	RQCL95	YES ! 
	LD	A2,DWTCHN,A6	GET POINTER TO NEXT DWT IN CHAIN 
	ST	A2,DTEDWT,A7	DWT FIRST IN QUEUE REMOVED 
	IFT	MESPAS=1 
RQCL60	EQU	*
	XIF
	CF	A15,RELBUF	REMOVE BUFFERS QUEUED ON DWT 
	CM	DWTSTA,A6	CLEAR DWT-STATUS
	LDK	A1,0	PRESET RETURN CODE
	CWR	A8,A6	REQUESTING DWT ? 
	RF(E)	RQCL80	YES-COMPLETE REQUEST
	LD	A2,DWTST,A6	A PENDING REQUEST ? 
	RB(N)	RQCL40	NO TAKE NEXT DWT
	LDK	A1,R:SEQ	COMPLETE REQUEST WITH SEQUENCE ERROR
RQCL80	EQU	*
	CF	A15,TENDIO	COMPLETE THE REQUEST 
	RB	RQCL40	TAKE NEXT ON QUEUE 
RQCL90	EQU	*
				=1
	LDR	A6,A8	GET REQUESTING DWT ADDR
	LD	A8,DWTECB,A6	RESTORE ECB ADDRESS
				=1
	RF(Z)	RQCL92	REQUEST ALREADY COMPLETED	=1
	LDK	A1,0	RC=0	=1 
	CF	A15,TENDIO	COMPLETE CLOSE REQUEST	=1
RQCL92	EQU	*		=1
	IFT	P6805=0		=1
	LDKL	A5,STB		=1
	CF	A5,CHALTI	HALT I/P DEVICE	=1
	CF	A5,CHALTO	HALT O/P DEVICE	=1
	LDK	A2,0		=1 
	CIO	A2,1,LCUIN	DISCONNECT MODEM	=1 
	XIF			=1 
	IFT	P6805=1		=1
	LDK	A2,1	DISCONNECT ORDER	=1 
	CIO	A2,0,LCUIN	DISCONNECT MODEM	=1 
	XIF			=1 
	CMR	A7	REMOVE NETWORK ADDRESS	=1 
	CM	DTESTA,A7	CLEAR STATUS	=1 
	LD	A1,DCTPGP	POLL TIMER RUNNING ?	=6 
	RF(Z)	RQCL94	NO	=6 
	CM*	DCTPGP	KILL TIMER	=6 
	CM	DCTPGP	CLEAR POINTER	=6 
RQCL94	EQU	*		=6
	CM	DTEDLS,A7	INDICATE DATA LINK DOWN	=6
	ABL	TDISP		=1
RQCL95	EQU	*
	LDK	A2,2 
	ST	A2,DTESTA,A7	SET DTE OPEN AGAIN 
	LDR	A6,A8	RESTORE DWT ADDRESS
	ABL	RTSEQ	SEQUENCE ERROR 
	EJECT
* 
*	CONNECT PASSIVE REQUEST 
* 
*	ACTIVATION PARAMETERS:
*		- SYMBOLIC SUBADDRESS (RIGHTMOST 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 
* 
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)	RTOK	ALREADY CONNECTED	=17
	IFT	MESPAS=1		=13
	LDK	A2,/40	OPTION CODE	=13 
	CC	A2,DWTOPT,A6	DISCARD DWT ?	=13
	RF(NE)	RQCN10	NO	=13 
	CM	DWTCHP,A6	INDICATE DISCARD DWT	=13
	LD	A1,DTEDDT,A7	POINTER TO DISCARD DWT	=13 
	RF(NZ)	RQCN50	MORE THAN ONE DISC. DWT ?	=13
	ST	A6,DTEDDT,A7	SAVE POINTER TO TO DISCARD DWT	=13 
	RF	RQCN60		=13 
RQCN10	EQU	*		=13 
	XIF			=13
	IFF	MMUPAG=0 
	LDKL	A4,SUBBUF	MMU BUFFER ADDRESS	=16
	ST	A4,ECBBA,A8	TO ECB
	CF	A15,DC:MOT	MOVE DATA TO MMU BUFFER
	XIF
	LD	A4,ECBBA,A8	GET ECB-BUFFER ADDRESS
	IFT	MSV1=1 
	LDK	A2,0	RESET A2
	LCR	A2,A4	GET SELECT SUB-ADDRESS 
	SC	A2,DWTSUB,A6	SAVE IT IN THE DWT 
	LD	A1,ECBCW2,A8	GET SYMBOLIC DTE-ADDRESS 
	CF	A15,GETSNA	VALIDATE AND TRANSLATE THE SUB-ADDR
	LDR	A1,A1	IS IT OK ? 
	RF(NN)	RQCN20	YES
	CM	DWTSUB,A7	CLEAR SUB-ADDRESS 
	ABL	RTREQ	RETURN REQUEST ERROR 
RQCN20	EQU	*
	IFT	CODE=1 
	LC	A1,TASCII,A1	CONVERT FROM EBCDIC TO ASCII 
	XIF
	IFT	MSV1=1 
	SC	A1,DWTCHP,A6	SAVE NETWORK ADDRESS 
	XIF
	LC	A2,1,A4	GET SYMBOLIC ADDRESS	=8 
	SC	A2,DWTSUB+1,A6	SAVE IT IN THE DWT 
	LD	A1,ECBCW2,A8	GET SYMBOLIC DTE ADDRESS 
	ST	A1,DWTLAD,A6	SAVE IT IN THE DWT 
	CF	A15,GETSNA	VALIDATE AND TRANSLATE THE SUB-ADDRESS 
	LDR	A1,A1	IS IT OK ? 
	RF(NN)	RQCN30	YES
	CM	DWTSUB,A6	CLEAR SUB-ADDRESS 
	CM	DWTLAD,A6	CLEAR DTE ADDRESS 
	ABL	RTREQ	RETURN REQUEST ERROR 
RQCN30	EQU	*
	IFT	CODE=1 
	LC	A1,TASCII,A1	CONVERT FROM EBCDIC TO ASCII 
	XIF
	SC	A1,DWTCHP+1,A6	SAVE NETWORK ADDRESS 
	IFT	EM3270=1 
	ST	A1,ECBCW2,A8
	XIF
* 
* 
*		LINK DWT TO CONFIGURATION CHAIN
* 
				=13 
RQCN40	EQU	*
	LD	A1,DTEDWT,A7	GET POINTER TO DWT QUEUE 
	RF(NZ)	RQCN50	YES
	ST	A6,DTEDWT,A7	SAVE POINTER TO DWT QUEUE
	RF	RQCN60
RQCN50	EQU	*
	LDR	A2,A1	MOV ADDR TO A2 
	LD	A1,DWTCHN,A2	POINTER TO NEXT DWT
	RB(NZ)	RQCN50	KEEP ON UNTIL LAST IN CHAIN
	ST	A6,DWTCHN,A2	ADD NEW DWT TO CHAIN 
RQCN60	EQU	*
	CM	DWTCHN,A6	END OF CHAIN MARKER 
	ST	A7,DWTCHD,A6	BACKWARD LINK TO ANCHOR
	LDK	A2,2	
	ST	A2,DWTSTA,A6	SET STATUS: CONNECTED
	LDKL	A2,/8000
	ST	A2,DWTRTV,A6	STORE NO TIMING
				=13 
	IFT	STARVI=1 
	LD	A1,DWTCHP,A6	DISCARD DWT ?	=13
	RF(Z)	RQCN65	YES, DO NOT SEND DE	=13 
	LDK	A1,4	STORE DEVICE
	ORS	A1,DWTST,A6	END IN THE DWT 
	CF	A15,INSSQ	INSERT DWT IN STATUS QUEUE
RQCN65	EQU	*		=13 
	XIF
* 
*	START POLL TIMER
* 
	LD	A2,DCTPGP	POLL TIMER POINTER
	RF(NZ)	RQCN70	TIMER ALREADY STARTED	=6 
	CF	A15,SPOTIM
RQCN70	EQU	*
	ABL	RQOP90 
	EJECT
* 
*	DISCONNECT REQUEST
* 
*	ACTIVATION PARAMETERS:
*		DWT-ADDRESS (A6) 
* 
*	FUNCTIONS:
*		1. CHECK IF IN CONNECTED STATE 
*		2. REMOVE DWT-ADDRESS FROM CONFIGURATION CHAIN 
*		3. SET DWT STATUS DISCONNECTED 
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
* 
RQDIS	EQU	* 
	LD	A2,DWTSTA,A6	DWT STATUS = DISCONNECTED ?
	ABL(Z)	RTOK	YES, RETURN: OK
	LD	A3,DTEDWT,A7	FIRST DWT ADDR TO A3 
	RF(Z)	RQDI20	END OF CHAIN
	CWR	A3,A6	OUR DWT ?
	RF(NE)	RQDI10	NO 
	CF	A15,RELBUF	RELEASE QUEUED BUFFERS 
	LD	A3,DWTCHN,A6	YES-TAKE POINTER TO NEXT DWT 
	CM	DWTSTA,A6	SET DWT FREE
	ST	A3,DTEDWT,A7	STORE DWT-ADDR IN DTETAB 
	RB	RQCN70
RQDI10	EQU	*
	LDR	A5,A3	A5 CONTAINES PREVIOUS DWT-ADDR 
	LD	A3,DWTCHN,A5	A3 CONTAINES ADDR TO NEXT DWT ON CHAIN 
	RF(Z)	RQDI20	END OF CHAIN
	CWR	A3,A6	OUR DWT ?
	RB(NE)	RQDI10	NO TAKE NEXT IN CHAIN
	CF	A15,RELBUF	RELEASE QUEUED BUFFERS 
	LD	A3,DWTCHN,A6	YES-TAKE POINTER TO NEXT DWT 
	ST	A3,DWTCHN,A5	AND STORE IT IN PREVIOUS DWT 
	CM	DWTSTA,A6	SET DWT FREE
	RB	RQCN70
RQDI20	EQU	*
	IFT	MESPAS=1 
	LD	A3,DTEDDT,A7	TAKE THE DISCARD DWT ADDR
	CWR	A3,A6	OUR DWT ?
	RF(NE)	RQDI30	SEQUENCE ERROR 
	CF	A15,RELBUF	RELEASE BUFFERS QUEUED 
	CM	DTEDDT,A7 
	CM	DWTSTA,A6	SET DWT FREE
	RB	RQCN70
RQDI30	EQU	*
	XIF
	ABL	RTSEQ	SEQUENCE ERROR 
	EJECT
* 
* 
*	READ STATUS REQUEST 
* 
*	ACTIVATION PARAMETERS:
*		DWT - ADDRESS (A6) 
* 
*	FUNCTIONS:
*		1. TRANSFER LOGICAL CONNECTION STATUS TO APPLICATION 
* 
*	COMPLETION PARAMETERS:
*		LOGICAL CONNECTION STATUS (ECBCW1) 
* 
*	0       3 4       7 8      11 12      15
*	........................................
*	.  DWT   .  DTE    .  DATA   .  PHYS   .
*	.  STATE .  STATE  .  LINK   .  LINK   .
*	.        .         .  STATUS .  STATUS .
*	........................................
* 
RQRSTS	EQU	*
	IFT	EM3270=1 
	LD	A2,ECBCW1,A8	GET OPTION CODE
	RF(NZ)	RQRS10	TEST IF ANY MESSAGE
	XIF
	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
	IFT	EM3270=1 
* 
* 
*		ANY MESSAGE ORDER (ONLY IF EM3270 = 1) 
* 
RQRS10	EQU	*
	LD	A2,DTESTA,A7	GET DTE STATUS 
	SUK	A2,2	OPEN ?
	ABL(NZ)	RTSEQ	NO,SEQUENCE ERROR
	LD	A2,DWTSTA,A6	GET DWT STATUS 
	SUK	A2,2	CONNECTED ? 
	ABL(NZ)	RTSEQ	NO,SEQUENCE ERROR
	LD	A4,DWTIPC,A6	ANY QUEUED MESSAGE ON THIS DWT ? 
	ABL(NZ)	RTOK	YES COMPLETE THE REQUEST
	ABL TDISP	TO DISPATCHER
	XIF
	EJECT
* 
*	SET STATUS REQUEST
* 
* 
*	ACTIVATION PARAMETERS 
*		DWT ADDRESS (A6) 
* 
*	FUNCTIONS:
*		SET DEVICE STATUS (ONLY IF STARVI = 1) 
* 
*		DE DEVICE END : X`'00' 
* 
*		IR INTERVENTION REQUIRED : X'01' 
* 
*		DB DEVICE BUSY :X'10'
* 
*	COMPLETION PARAMETERS:
*		RETURN CODE (A1) 
* 
RQSST	EQU	* 
	IFT	STARVI=0 
	ABL	RTREQ	SET STATUS NOT INCLUDED
	XIF
	IFT	STARVI=1 
	LD	A1,ECBCW1,A8	GET DEVICE STATUS
	ANK	A1,3	MASK DB,IR
	RF(NZ)	RQST90	NOT DE 
	LD	A1,DWTST,A6	GET DEVICE STATUS 
	ANK	A1,/B	WACK SENT, DB OR IR ?	=2 
	RF(Z)	RQST90	NO	=2 
	CF	A15,INSSQ	INSERT DWT IN STATUS QUEUE
	LDK	A1,4	SET DE
RQST90	EQU	*
	ST	A1,DWTST,A6	SAVE STATUS 
	ABL	RTOK	RETYURN : OK
	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	STTSTS=0 
	ABL	RTREQ	RC : REQUEST ERROR NO STATISTICS INCLUDED
	XIF
	IFF	STTSTS=0 
	CF	A15,DCSRED	READ STATISTICS
	LDR	A1,A1	OK?
	ABL(NZ)	RTREQ	NO, RETURN: REQUEST ERROR
	LD	A1,ECBCW1,A8	GET TYPE 
	SRL	A1,8	TYPE FIELD TO LEFT BYTE 
	CCK	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 TIMEOUT VALUE 
* 
*	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
* 
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)
*		SUBTERMINAL ADDRESS (DWT)
*		ECB CONTROL WORD 1 
*	
*	FUNCTIONS:
*		1. VERIFY THAT LOGICAL & PHYSICAL CONNECTIONS EXIST. 
*		2. VERIFY BUFFER SIZE IF MMU 
*		3. QUEUE REQUESTING DWT
*		4. COMPLETE WHEN ACK'D OR TIMEOUT. 
* 
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 
	LC	A2,DWTOPT,A6	GET OPTION 
	ANK	A2,/FF 
	RF(Z)	RQSE10	THERE IS NO OPTION
	SUK	A2,/20	WHICH OPTION ?
	ABL(NZ)	RTREQ	WRONG OPTION :REQUEST ERROR
	CF	A15,RELBUF	RELEASE BUFFERS QUEUED 
RQSE10	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
	ABL	TDISP
* 
	EJECT
* 
*	RECEIVE REQUEST 
* 
*	ACTIVATION PARAMETERS:
*		BUFFER ADDRESS (ECBBA) 
*		REQUESTED BUFFER LENGTH IN CHARS. (ECBRL)
*		SUBTERMINAL ADDRESS (DWT)
* 
*	FUNCTIONS:
*		1. VERIFY THAT LOGICAL & PHYSICAL CONNECTIONS EXIST. 
*		2. TRANSFER TO THE APPLICATION ANY MESSAGE QUEUED FOR THE DWT, 
*		3. COMPLETE WHEN MESSAGE RECEIVED 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	A4,DWTIPC,A6	ANY BUFFER ON QUEUE ?
	RF(NZ)	RQRE10	YES
	LD	A2,DTEDLS,A7	LOGICAL CONNECTION ACTIVE ?
	ABL(Z)	RTLOGC	NO, RETURN: LOGICAL CONNECTION ERROR 
	CF	A15,TIMERE	START TIMER
	RF	RQRE40	GO TO DISPATCHER 
RQRE10	EQU	*
	LD	A3,2,A4	EFFECTIVE LENGTH
	ST	A3,ECBEL,A8 
	LD	A1,DWTLAD,A6	SYMBOLIC DTE-ADDRESS 
	LD	A2,4,A4	NETWORK SUB-ADDRESS 
	CF	A15,GETSSA	GET SYMBOLIC SUB-ADDRESS 
	ST	A1,ECBCW2,A8	AND SAVE IT IN ECB 
	IFT	REMTIM=1		=9 
	LD	A1,DWTRTV,A6	GET REQUESTED TIMEOUT VALUE	=9 
	ST	A1,ECBCW1,A8	STORE IN CONTROL WORD 1	=9 
	XIF			=9 
	LDK	A1,0	RC : ACCEPTED AND COMPLETED 
	LDR*	A2,A4	GET NEXT BUFFER IN QUEUE
	RF(Z)	RQRE20	NO MORE BUFFERS IN QUEUE
	ORKL	A1,R:DATA	RC: AND MORE DATA AVAILABLE 
RQRE20	EQU	*
	ST	A2,DWTIPC,A6 	STORE AS FIRST IN QUEUE 
	ADK	A4,6 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
RQRE40	EQU	*
	ABL	TDISP	GO TO DISPATCHER 
	EJECT
* 
* 
*		COMPLETE APPLICATION REQUEST 
* 
RTREQ	EQU	* 
	LDKL	A1,R:REQ	RC = REQUEST ERROR 
	RF	RQRTN 
RTABRT	EQU	*
	LDKL	A1,R:ABRT	RC = ABORTED
	RF	RQRTN 
RTTIME	EQU	*
	LDK	A1,R:TIME	RC = TIME OUT
	RF	RQRTN 
RTSEQ	EQU	* 
	LDK	A1,R:SEQ	RC = SEQUENCE ERROR 
	RF	RQRTN 
RTLGTH	EQU	*
	LDK	A1,R:LGTH	RC = ILLEGAL LENGTH
	RF	RQRTN 
RTLOGC	EQU	*
	LDK	A1,R:LOGC	RC = LOGICAL CONNECTION ERROR
	RF	RQRTN 
RTPHYC	EQU	*
	LDK	A1,R:PHYC	RC = PHYSICAL CONNECTION ERROR 
	RF	RQRTN 
RTOK	EQU	*
	LDK	A1,0	RC = OK 
RQRTN	EQU	* 
	ABL	DISEND	COMPLETE REQUEST AND GO TO DISPATCHER 
	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*	A3,A15	POINT TO NEXT INSTRUCTION ADDRESS IN STACK 
	LDR*	A3,A15	GET CONTENTS = TABLE ADDRESS 
	LDR*	A4,A3	GET LAST LEGAL ADDRESS
	LD	A1,2,A3	ERROR 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
	ABI	2,A3	BRANCH TO TABLE ADDRESS 
*		KEY NOT FOUND
LOOK90	EQU	*
	LDR	P,A1	GO TO ERROR ADDRESS 
	EJECT
* 
* 
* 
*	REQUEST TIMER HANDLING PART 
* 
* 
* 
*	RECEIVE TIMER=TIMERR
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,DWTRTV,A6	GET TIMEOUT VALUE
	RF(N)	TIMRTN	NO TIMING 
	RF(Z)	ITOUTR	TIMER=0 => IMMEDIATE TIMEOUT
	ST	A2,TIMERR 
	CF	A15,SETIME
	DATA	TOUTRE
TIMERR	DATA	0 
	ST	A4,DWTRTP,A6	STORE TIMER POINTER
TIMRTN	EQU	*
	ABL	RTNA15 
* 
*	TIMEOUT READ TIMER
* 
ITOUTR	EQU	*
	ADKL	A15,4 
	RF	TIMOUT
TOUTRE	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTRTP,A6 
	RF	TIMOUT	COMPLETE REQUEST RC=TIMEOUT
* 
* 
*		 RETURN FROM TIMER HANDLING
* 
	EJECT
* 
*	SEND TIMER=TIMWR
* 
TIMEWR	LDR	A1,A6
	LD	A2,DWTRTV,A6	GET TIMEOUT VALUE
	RB(N)	TIMRTN	NO TIMING 
	RB(Z)	ITOUTR	TIMER=0 => IMMEDIATE TIMEOUT
	ST	A2,TIMWR
	CF	A15,SETIME
	DATA	TOUTWR
TIMWR	DATA	0
	ST	A4,DWTRTP,A6
	RB	TIMRTN
* 
*	TIMEOUT WRITE TIMER 
* 
TOUTWR	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTRTP,A6 
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
* 
* 
*	THIS INSTRUCTION DOES NOT BELONG
*	TO THE STANDARD INTERFACE 
	LD	A2,FDWTUT 
	CWR	A2,A6
	RF(NE)	TIMOUT	THIS DWT IS NOT WRITING
	CM	XACK	INDICATE 'ACK NOT EXPECTED'
	CM	FDWTUT
TIMOUT	EQU	*
	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 
	IFT	REMTIM=1		=9 
	LDR*	A2,A2		=9 
	NGR	A2,A2	GET REMAINING TIME	=9
	XIF			=9 
	CM*	DWTRTP,A6	KILL TIMER	=9
	CM	DWTRTP,A6 
				=3
CTIM10	EQU	*
	ABL	RTNA15 
	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
	INH
	LDR*	A4,A2 
	RF(Z)	GBUF10	NO BUFFER FREE
	LDR*	A3,A4	REMOVE BUFFER FROM FREE CHAIN 
	STR	A3,A2
GBUF10	EQU	*
	ABL	RTNA15 
	EJECT
* 
* 
*	RELEASE RECEIVE BUFFER
* 
*	A4 CONTAINS BUFFER ADDRESS
*	CALLING SEQUENCE: CF A15,RRBUF
*	A2 AND A3 ARE DESTROYED 
* 
* 
RRBUF	LDKL	A2,DCRBUF	RECEIVE BUFFERS
	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 QUEUED ON A DWT 
* 
*	A6 - DWT ADDR 
*	A1 AND A4 ARE DESTROYED 
*	CALLING SEQUENCE: CF    A15,RELBUF
* 
* 
RELBUF	EQU	*
	LDK	A1,DWTIPC	SET BUFFER QUEUE DISP. 
	ADR	A1,A6
RLBU10	EQU	*
	LDR*	A4,A1	NEXT IN BUFFER QUEUE
	RB(Z)	GBUF10 
	LDR*	A2,A4	REMOVE FROM QUEUE 
	STR	A2,A1	.
	CF	A15,RRBUF	RELEASE BUFFER
	RB	RLBU10
	EJECT
* 
* 
*	INSERT DWT IN SEND REQUEST QUEUE
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSWQ	LDKL	A2,DCWRQ	GET QUEUE ANCHOR
	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 
	EJECT
* 
* 
*	REMOVE DWT FROM SEND REQUEST QUEUE
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVW	LDKL	A2,DCWRQ	GET QUEUE ANCHOR 
	LDK	A4,DWTOPN	GET DWT-LINK TO BE REMOVED 
REM06	EQU	* 
	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
* 
* 
*	INSERT DWT IN STATUS QUEUE
* 
	IFF	STARVI=0 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSSQ	LDKL	A2,DCSTQ	GET QUEUE ANCHOR
	LDK	A4,DWTOPE
	RB	INSWQ2
* 
* 
*	REMOVE DWT FROM STATUS QUEUE
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVS	LDKL	A2,DCSTQ	GET QUEUE ANCHOR 
	LDK	A4,DWTOPE
	RB	REM06 
	XIF
	EJECT
* 
* 
*	QUEUE ALLOCATED RECEIVE BUFFER
* 
*	A4=BUFFER ADDR
*	A2,A3 DESTROYED 
* 
QRBUF	EQU	* 
	SUK	A4,6 
	LDK	A2,DWTIPC	SET BUFFER QUEUE DISP. 
	ADR	A2,A6
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
* 
* 
*	STORE REGISTER A3-A8
*	CALLING SEQUENSE: CF A15,STREG
* 
STREG	ST	A3,LCA3
	ST	A4,LCA4 
	ST	A5,LCA5 
	ST	A6,LCA6 
	ST	A7,LCA7 
	ST	A8,LCA8 
	RF	RTNA15	RETURN 
* 
* 
*	RESTORE 
*	CALLING SEQUENCE: CF A15,LDREG
* 
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
* 
* 
*		RETURN VIA REGISTER 15 
* 
RTNA15	EQU	*
	ADKL	A15,4 
	ABR*	A15 
	EJECT
* 
*	POLL TIME OUT 
* 
PTOUT	LDKL	A5,STB	LOAD A5 STACK BASE
	LDR	A6,A1	RELOAD DWT ADDRESS 
	LDKL	A7,DTETAB 
	CM	DTEDLS,A7 
	IFT	STTSTS=1 
* 
* 
*		COUNT POLL TIME OUT
* 
	LDK	A1,CSSXC3
	CF	A15,DCSUPS
	XIF
	CF	A15,SPOTIM	START POLL TIMER 
	ABL	TDISP
* 
*	RESTART POLL TIMER WHEN POLL HAS BEEN RECEIVED
* 
CPTIM	EQU	* 
	LDK	A2,1	INDICATE
	ST	A2,DTEDLS,A7	DATA LINK UP 
	LDKL	A2,-TIMPOL
	ST*	A2,DCTPGP	RESTART TIMER
	RTN	A5 
* 
*	START POLL TIMER
* 
SPOTIM	EQU	*
	LDR	A1,A6	LOAD DWT ADDRESS AS PARAMETER
	CF	A15,SETIME	START TIMER
	DATA	PTOUT,TIMPOL
	ST	A4,DCTPGP	STORE TIMER POINTER 
	RB	RTNA15	RETURN 
	EJECT
* 
*	START PROCEDURE TIMER 
* 
SPTIM	EQU	* 
	LDR	A1,A6	LOAD DWT AS PARAMETER
	CF	A15,SETIME
	DATA	PRTOUT,TIMPRO 
	ST	A4,DCTPP	SAVE TIMER POINTER 
	RTN	A5 
* 
*	PROCEDURE TIMEOUT 
* 
PRTOUT	CM	DCTPP 
	LDR	A6,A1	RELOAD A6
	LDKL	A5,STB	LOAD STACK BASE
	LDKL	A7,DTETAB 
	IFT	STTSTS=1 
* 
* 
*		COUNT PROCEDURE TIME OUT 
* 
	LDK	A1,CSSXC2
	CF	A15,DCSUPS
	XIF
	CF	A5,CHALTI	HALT INPUT IF OPEN	SALCUZ 
	LD	A1,XACK 
	RF(Z)	PRT10	ACK NOT EXPECTED 
	CF	A5,TRENQ	SEND ENQ 
	CF	A5,SPTIM	START PROCEDURE TIMER
PRT10	ABL	BRM 
	EJECT
* 
*	STOP PROCEDURE TIMER
* 
HPTIM	LD	A1,DCTPP	GET TIMER POINTER 
	RF(Z)	HPT10	NOT RUNNING
	CMR	A1	STOP TIMER
	CM	DCTPP 
HPT10	RTN	A5

* 
* 
*   WAIT 1 SEC. FOR MODEM CONNECTION
* 

DTE:ON	LDR	A1,A6	DWT ADDRESS
	CF	A15,SETIME	WAIT 1 SEC.
	DATA	DTE:10,10 
				=1
	LDKL	A5,STB		=1
	CF	A5,CSYNCI	CONNECT MODEM	=1
	CF	A5,CHALTI	NO INTERRUPTS ALLOWED	=1
	ABL	TDISP	=1 


* 
* 
*   MODEM-CONNECT TIMEOUT 
* 

DTE:10	LDR	A6,A1	DWT ADDRESS
	LDKL	A7,DTETAB 
	IM	DTESTA,A7	SET OPEN STATUS	=1
	LDKL	A5,STB		=1
	CF	A5,CSYNCI	PUT CU IN ACTIVE MODE	=1
	CF	A5,CHALTI	HALT I/P DEVICE TO GET MODEM STATUS	=1
	IM	DTEPLS,A7	PRESET PHYSICAL STATUS = OK	=1
	ANK	A2,1	MODEM OK ?	=1 
	RF(Z)	DTE:20	YES	=1
	CM	DTEPLS,A7	INDICATE PHYSICAL ERROR	=1
DTE:20	EQU	*		=1
	LDR	A1,A2	SET RETURN CODE	=1 
	CF	A15,TENDIO	COMPLETE THE REQUEST	=1
	CF	A15,SPOTIM	START POLL TIMER	=6
	ABL	BRM	START I/P	=1 
	EJECT
	IFT	MESPAS=1 
* 
* 
*		GET DWT ADDRESS
* 
MESDWT	EQU	*
	CWR	A6,A7	IS IT DTETAB-ADDRESS ? 
	RF(E)	MES200	YES 
	LD	A2,DTEDDT,A7	GET ADDR TO DDT
	CWR	A6,A2	IS IT DDT-ADDR 
	RF(E)	MES200	YES 
	LD	A2,DWTST,A6	ANY REQUEST ? 
	RF(N)	MESD50	NO
	LD	A2,DWTOR,A6	ANY MESSAGE ORDER ? 
	ANK	A2,/FF 
	RF(Z)	MES200	YES 
	SUK	A2,RECEIVE	A RECEIVE ORDER ? 
	RF(Z)	MES200	YES 
MESD50	EQU	*
	LD	A2,DTEDDT,A7	IS THERE A DDT CONNECTED ? 
	RF(Z)	MES100	NO
	LDR	A6,A2	GET DDT-ADDR 
	RF	MES200
MES100	EQU	*
	LDR	A6,A7	GET DTETAB-ADDR
MES200	EQU	*
	ABL	RTNA15	RETURN VIA A15
	XIF
	EJECT
* 
* 
*	BASIC RECEIVE MODE
* 
*	ENTERED EVERY TIME A MESSAGE
*	IS EXPECTED FROM THE MASTER SIDE
* 
* 
BRM	EQU	* 
	LDKL	A5,STB	LOAD STACKBASE 
	CM	SYNSW	CLEAR SYN-SWITCH
	CM	TPM	CLEAR TRANSPARENT TEXT
	CF	A5,CSYNCI	START INPUT WITH SYNC DEF 
* 
* 
* 
	CF	A5,READP	READ CHARACTER 
	RF(NZ)	BRM120	PARITY ERROR 
* 
* 
*		CHECK IF IT IS A CONTROL CHARACTER 
* 
	LDR	A1,A2
	CF	A15,LOOKUP	BRANCH ON CODES, TABLE ADDRESS TO STACK
	DATA	BRM100,BRM200	LAST ENTRY,POLL OR SELECT SEQUENCE
	DATA	STX,STX100	STX RECEIVED 
	DATA	EOT,EOT100	EOT RECEIVED 
	DATA	ENQ,ENQ100	ENQ RECEIVED 
	DATA	DLE,DLE100	DLE RECEIVED 
BRM100	DATA	NAK,NAK100	NAK RECEIVED 
	EJECT
* 
* 
*		THROUGHPUT ERROR 
* 
BRM110	EQU	*
	CM	XSTA	INDICATE "INVALID MESSAGE" 
	LDKL	A5,STB	LOAD STACKBASE TO A5 
	CF	A5,CSYNCI	START INPUT WITH SYNC DEF 
* 
* 
*		WAIT FOR MARK HOLD TO RESYNC.
* 
BRM120	EQU	*
	CF	A5,READ	READ CHARACTER
	LD	A1,DCSTCU	ANY STATUS FROM CONTROL UNIT ?
	RF(NZ)	BRM130	YES
	ANK	A2,/7F 
	SUK	A2,/7F 
	RB(NZ)	BRM120	NO 
BRM130	EQU	*
	CF	A5,CHALTI	HALT INPUT
	RB	BRM 
	EJECT
* 
* 
*		CHECK IF IT IS A POLL OR A SELECT SEQUENCE 
* 
BRM200	EQU	*
	IFT	MSV1=0 
	LDR	A4,A2
	CF	A5,READP	READ CHARACTER 
	CWR	A2,A4
	RB(NE)	BRM120	INVALID SEQUENCE 
	XIF
	LDK	A3,0 
	CC	A2,1,A7	IS IT A POLL ?
	RF(E)	BRM210	POLLING 
	LDK	A3,2 
	CCR	A2,A7	IS IT A SELECT ? 
	RB(NE)	BRM120	INVALID SEQUENCE 
BRM210	EQU	*
	CF	A5,READP	READ 1:ST STA
	RB(NZ)	BRM	PARITY ERROR
	LDR	A4,A2
	IFT	MSV1=0 
	CF	A5,READP	READ 2:ND STA
	CWR	A2,A4
	RB(NE)	BRM120	INVALID SEQUENCE 
	XIF
	CF	A5,READP	READ ENQ 
	SUK	A2,ENQ 
	RB(NE)	BRM120	INVALID SEQUENCE 
* 
* 
*		YES SEQUENCE OK - HALT INPUT 
* 
	CF	A5,CHALTI 
	EJECT
* 
* 
*		CHECK IF IT IS A SELECT OR A POLL ADDRESS
* 
	LDK	A1,1 
	ST	A1,CACK	LOAD ACK-COUNTER
	LDR	A2,A4
	SUK	A3,2 
	RF(Z)	SELECT	SELECTING 
* 
* 
*		POLLING
* 
	CWK	A4,GP
	RF(E)	GPOLL	GENERAL POLL 
	CF	A5,FINTEP	CHECK IF STA PRESENT (POLL ADDRESS) 
				=10 
* 
	EJECT
* 
* 
*	SPECIFIC POLL HAS BEEN RECEIVED 
* 
* 
	IFF	STARVI+SPECP=0 
	LD	A1,XACK	
	RF(NZ)	POL100	ACK EXPECTED 
	LDR	A6,A3	LOAD DWT ADDRESS IN A6	=10 
	RF(Z)	POL150	REQ. DEV. NOT CONNECTED, SEND EOT	=10 
	CF	A5,CPTIM	CHECK POLLTIMER
	IFT	STARVI=1 
	LD	A1,DWTST,A6	GET STATUS
	ANK	A1,7 
	RF(NZ)	POL120	PENDING STATUS 
	XIF
	IFF	STARVI+SPECP=0 
	LD	A1,DWTST,A6 
	RF(N)	POL150	NO REQUEST
	LD	A1,DWTOR,A6	GET ORDER 
	ANK	A1,/FF	MASK AWAY OPTION PART 
	SUK	A1,6 
	RF(Z)	POL170	WRITE REQUEST 
	XIF
	RF	POL150	SEND EOT 
	EJECT
* 
* 
*	GENERAL POLL HAS BEEN RECEIVED
* 
* 
GPOLL	EQU	* 
	LD	A1,XACK	
	RF(Z)	POL110	ACK NOT EXPECTED
				=11 
POL100	EQU	*
	CF	A5,HPTIM	KILL PROCEDURE TIMER	=11 
	CF	A5,TRENQ	SEND ENQ 
	CF	A5,SPTIM	START PROCEDURE TIMER
	ABL	BRM	WAIT FOR RESPONSE
POL110	EQU	*	 
	CF	A5,CPTIM	CHECK POLL TIMER 
	IFF	STARVI=0 
	LD	A6,DCSTQ	 
	RF(Z)	POL140	NO STATUS TO BE SENT
	SUK	A6,DWTOPE	GET DWT ADDRESS
POL120	EQU	*
	CF	A5,TRSTA	SEND STATUS
	CF	A5,SPTIM	START PROCEDURE TIMER
	IM	XACK	SET 'ACK EXPECTED' 
	XIF
	IFF	STARVI=1 
	RF	POL140
	XIF
POL130	EQU	*
	ABL	BRM
POL140	EQU	*
	LD	A6,DCWRQ
	RF(NZ)	POL160	WRITE ON QUEUE 
POL150	EQU	*
	CF	A5,TREOT	SEND EOT 
	RB	POL130
POL160	EQU	*
	SUK	A6,DWTOPN	GET DWT ADDRESS
POL170	EQU	*
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RF(NZ)	POL180
	CF	A15,REMOVW
	RB	POL150
POL180	EQU	*
	ST	A8,FECB	SAVE ECB ADDRESS
	ST	A6,FDWTUT	SAVE A6 
	IFF	MMUPAG=0 
	LDKL	A4,MMUBUF	MMU WORK BUFFER 
	ST	A4,ECBBA,A8 
	CF	A15,DC:MOT	MOVE DATA FROM USER BUFFER 
	XIF
	LD	A4,ECBBA,A8	GET BUFFER ADDRESS
	LD	A3,ECBRL,A8	GET LENGTH
POL190	EQU	*
	ST	A4,FECBBA	SAVE BUFFER ADDRESS 
			.	=15
	ST	A3,FECBRL	SAVE LENGTH 
	CM	FBAX	RESET BUFFER INDEX 
POL200	EQU	*
	CM	XETX	RESET 'ETX SENT' 
	CM	XSTA
	CF	A5,TRTEXT	SEND ONE BLOCK
	CF	A5,SPTIM	START PROCEDURE TIMER
	IM	XACK	SET 'ACK EXPECTED' 
	RB	POL130
	EJECT
* 
* 
*		SELECT HAS BEEN RECEIVED 
* 
SELECT	EQU	*
	CF	A5,FINTES 
	LDR	A6,A3	GET DWT-ADDR 
	RF(NZ)	SEL100
	IFT	MESPAS=1 
	LD	A6,DTEDDT,A7	GET DDT-ADDR 
	RF(NZ)	SEL100
	XIF
	LDKL	A6,DTETAB	DTETAB ADRR 
SEL100	EQU	*
	LD	A1,XACK	
	RB(NZ)	POL100	ERROR. ACK EXPECTED
	IFF	STARVI=0 
	LD	A1,DWTST,A6	GET STATUS
	LDR	A3,A1
	ANK	A1,1 
	RF(Z)	SEL120	NO PENDING STATUS 
	CF	A5,TRRVI	SEND RVI 
	XIF
	IFF	STARVI=1 
	RF	SEL120
	XIF
SEL110	EQU	*
	ABL	BRM
SEL120	EQU	*
				=2
	IFT	STARVI=1		=2 
	ANK	A3,/A	WACK SENT OR DB ?	=2 
	RF(NZ)	SEL140	YES	=2 
	XIF
				=2
	LD	A1,DCRBUF 
	RF(NZ)	SEL150	BUFFER AVAILABLE 
	IFT	STTSTS=1 
	LDK	A1,CSSRBY	BUFFER NOT AVAILABLE 
	CF	A15,DCSUPS	INCREMENT COUNTER
	XIF
SEL140	EQU	*
				=2
	IFF	NOWACK=1		=2 
	CF	A5,TRWACK	SEND WACK 
	XIF
	RB	SEL110
SEL150	EQU	*
	CF	A5,PRREC	PREPARE FOR TEXT RECEPTION 
	ADK	A1,6 
	ST	A1,FBLST
	CF	A5,TRACK	SEND ACK,0 
	RB	SEL110
	EJECT
* 
* 
*	EOT HAS BEEN RECEIVED 
* 
* 
EOT100	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	IFT	RCOM=1 
	CM	XRB	RESET READ BUFFER 
	XIF
	LD	A1,XACK 
	RF(Z)	EOT120	ACK IS NOT EXPECTED 
	LD	A6,FDWTUT	GET WRITING DWT 
	RF(Z)	EOT110	NO ONE WRITING
	LDK	A1,2	SET RC=2
	CF	A5,CWRITE	COMPLETE WRITE REQUEST
EOT110	EQU	*
	CM	XACK	RESET 'ACK EXPECTED' 
EOT120	EQU	*
	CM	XSEL	RESET 'SELECTED' 
	ABL	BRM
	EJECT
* 
* 
*	STX HAS BEEN RECEIVED 
* 
* 
STX100	EQU	*
	CF	A5,HPTIM
	IFT	TPMODE=1 
	ABL	BRM120	INVALID SEQENCE 
STX110	EQU	*
	XIF
	LD	A1,XSEL 
	RF(Z)	STX150	NOT SELECTED
	LD	A1,DCRBUF 
	IFF	STTSTS=1 
	ABL(Z)	BRM120	NO BUFFER AVAILABLE
	XIF
	IFT	STTSTS=1 
	RF(NZ)	STX120
* 
*	NO BUFFER AVAILABLE 
* 
	LDK	A1,CSSRBY
	CF	A15,DCSUPS	INCREMENT COUNTER
	ABL	BRM120 
	XIF
STX120	EQU	*
	CF	A5,RDMESS	READ MESSAGE
	IFT	STTSTS=1 
* 
* 
*		COUNT MESSAGES RECEIVED
* 
	LDK	A1,CSSRBL
	CF	A15,DCSUPS
	XIF
	SUK	A3,1 
	RF(NZ)	STX170	MESSAGE OK 
STX130	EQU	*
	CM	XSTA	INDICATE 'INVALID MESSAGE' 
STX140	EQU	*
	CF	A5,TRNAK	SEND NAK 
	ABL	BRM
STX150	EQU	*
	IFT	RCOM=1 
	LD	A1,XACK 
	RF(Z)	STX160	ACK IS NOT EXPECTED 
	LD	A1,DCRBUF 
	RF(Z)	STX160	NO BUFFER AVAILABLE 
	LD	A6,FDWTUT	GET WRITING DWT 
	ABL(Z)	BRM120	NO ONE WRITING. RESYNCHRONIZE
	LDR*	A2,A6	GET STA 
	CF	A5,PRREC	PREPARE FOR TEXT RECEPTION 
	LDK	A1,0	SET RC=0
	CF	A5,CWRITE	COMPLETE WRITE REQUEST
	CM	CACK	PRESET ACK-1 
	RB	STX120	READ THE MESSAGE 
	XIF
STX160	CF	A5,READ	READ ONE CHARACTER
	CWK	A2,ENQPAR	IS IT ENQ ?
	RB(Z)	STX140	FORWARD ABORT SEQUENCE
	RB	EOT120
STX170	EQU	*
	IM	XSTA	INDICATE MESSAGE OK
	LD	A4,DCRBUF	GET BUFFER ADDRESS
	ADK	A4,6 
	CW	A4,FBLST
	RF(NE)	STX180	NOT FIRST BLOCK
	IFF	RCOM=0 
	LDK	A1,ESC 
	CCR	A1,A4
	RB(NE)	STX130	ESC NOT FOUND
	LC	A1,1,A4	GET COMMAND CODE
	SUK	A1,RDBCOM
	RF(Z)	RDBUF	READ MODIFIED RECEIVED 
	SUK	A1,RDMCOM-RDBCOM 
	RF(Z)	RDMOD	READ BUFFER RECEIVED 
	XIF
STX180	EQU	*
	SUK	A3,1 
	RF(Z)	STX280	SEND ACK
	LD	A6,FDWTIN	GET INPUT DWT 
	IFT	MESPAS=1 
	CF	A15,MESDWT
	XIF
	CWR	A7,A6	IS IT DTETAB ? 
	RF(E)	STX280	SEND ACK
	LD	A2,DWTSTA,A6	.	=14
	RF(Z)	STX280	TERMINAL DISCONNECTED	=14 
	CM	FBAX
	CF	A15,GRBUF	ALLOCATE RECEIVE BUFFER 
	ADK	A4,6 
	IFT	RCOM=1 
	LDR*	A2,A6	GET ADDRESS 
	LC	A2,TEBCDIC,A2	TRANSLATE IT TO EBCDIC
	LD	A1,DCRBUF	IS THERE A BUFFER 
	RF(Z)	STX200	NO
	ST	A2,+4,A1	STORE THE ADDR 
STX200	EQU	*
	XIF
	LD	A2,DWTST,A6	ANY REQUEST ? 
	RF(N)	STX220	NO
	LD	A2,DWTOR,A6	GET ORDER 
	IFT	EM3270=1 
	RF(Z)	STX210	ANY MESSAGE ORDER ? 
	XIF
	CWK	A2,RECEIVE	A RECEIVE ? 
	RF(NE)	STX220	NO 
STX210	EQU	*
				=12 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	LD	A3,-4,A4	GET LENGTH 
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
	LD	A1,DWTLAD,A6	SYMBOLIC DTE ADDRESS	=12 
	LD	A2,-2,A4	NETWORK SUB-ADDRESS	=12
	CF	A15,GETSSA	GET SYMBOLIC SUB ADDRESS	=12 
	ST	A1,ECBCW2,A8	AND SAVE IT IN ECB	=12 
	LDK	A1,0	RESET RETURN CODE	=12 
	CF	A15,CTIME	STOP REQUEST TIMING 
	IFT	REMTIM=1		=9 
	ST	A2,ECBCW1,A8	STORE REMAINING TIME 
	XIF			=9 
STX220	EQU	*
	IFT	STARVI=1 
	LC	A2,+2,A4	GET WCC/CCC
	ANK	A2,/FF 
	LC	A2,TEBCDIC,A2 
	ANK	A2,8 
	RF(Z)	STX230 
	LD	A2,DWTST,A6 
	ORK	A2,/A
	ST	A2,DWTST,A6 
STX230	EQU	*
	XIF
	LD	A2,DWTST,A6	ANY REQUEST ? 
	RF(NN)	STX240	YES
	CF	A5,QRBUF	QUEUE BUFFER 
	RF	STX270
STX240	EQU	*
	LD	A2,DWTOR,A6	GET ORDER 
	CWK	A2,RECEIVE	RECEIVE ORDER ? 
	RF(NE)	STX260	NO 
				=12 
	LDK	A1,0	RESET RETURN CODE 
	LD	A2,DWTIPC,A6	ANY QUEUED MESSAGES ?
	RF(Z)	STX250	NO
	ORKL	A1,R:DATA	YES 
STX250	EQU	*
	CF	A15,DC:MIN	MOVE TO USER BUFFER
	RF	STX270
STX260	EQU	*
	CF	A5,QRBUF	QUEUE BUFFER 
	IFT	EM3270=1 
	LD	A2,DWTOR,A6	GET ORDER 
	RF(NZ)	STX270	NOT ANY MESSAGE ORDER
	CF	A15,TENDIO	COMPLETE REQUEST 
	XIF
STX270	EQU	*
	IFT	STARVI=1 
	LD	A1,DWTST,A6	GET STATUS
	ANK	A1,8	MASK A1 
	RF(Z)	STX280 
	CF	A5,TRWACK	SEN WACK
	RF	STX290
	XIF
STX280	EQU	*
	CF	A5,TRACK	SEND ACK 
STX290	EQU	*
	ABL	BRM
	EJECT
* 
* 
*	READ MODIFIED OR READ BUFFER RECEIVED 
* 
* 
	IFF	RCOM=0 
RDBUF	EQU	*	READ BUFFER COMMAND 
RDMOD	EQU	* 
	CM	XSEL	RESET SELECT EXPECTED
	LD	A6,FDWTIN	DWT-ADDRESS FOR ADDRESSED TERMINAL
	LD	A4,DWTBUF,A6	BUFFER ADDRESS 
	SUK	A4,2	SDJUST BUFFER ADDRESS 
	LDKL	A3,1922	REQUESTED LENGTH
	IM	XRB	SET READ BUFFER SWITCH
	CM	FDWTUT
	LDK	A1,1 
	XRS	A1,CACK	INCREMENT ACK COUNTER
	ABL	POL190 
	XIF
	EJECT
* 
* 
*	ENQ HAS BEEN RECEIVED 
* 
* 
ENQ100	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	LD	A1,XACK 
	RF(NZ)	NAK110	RETRANSMISSION OF MESSAGE
	OR	A1,XSEL 
	RF(Z)	ENQ110	IN CONTROL STATE
	CF	A5,TRREP	REPEAT LAST CONTROL SEQUENCE 
ENQ110	EQU	*
	ABL	BRM
	EJECT
* 
* 
*	NAK HAS BEEN RECEIVED 
* 
* 
NAK100	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	LD	A1,XACK 
	RF(NZ)	NAK110	ACK EXPECTED 
	OR	A1,XSEL 
	RB(Z)	ENQ110	IN CONTROL STATE
	RF	DLE160
NAK110	EQU	*
	LD	A6,FDWTUT	GET WRITING DWT 
	IFF	STARVI=0 
	LD	A1,XSTA 
	ABL(NZ)	POL120	STATUS HAS BEEN TRANSMITTED 
	XIF
	LD	A1,FBLST	GET START POINT FOR LAST BLOCK 
	SU	A1,FECBBA	COMPUTE BUFFER INDEX
	ST	A1,FBAX 
	IFT	STTSTS=1 
* 
* 
*		COUNT MESSAGES RETRANSMITTED 
* 
	LDK	A1,CSSTRT
	CF	A15,DCSUPS
	XIF
	ABL	POL200 
	EJECT
* 
* 
*	DLE HAS BEEN RECEIVED 
* 
* 
DLE100	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	LD	A1,XACK 
	RF(NZ)	DLE110
	IFT	TPMODE=1 
	CF	A5,READ 
	CWK	A2,STX 
	ABL(Z)	STX110	YES - TRANSPARENT TEXT 
	XIF
	RB	ENQ110
DLE110	EQU	*
	CF	A5,READ	READ SECOND CHARACTER 
	CWK	A2,ACKPAR	IS IT ACK 0 ?
	RF(NE)	DLE130
* 
*	ACK , 0 RECEIVED
* 
	LD	A1,CACK	GET ACKCOUNTER
	RF(Z)	DLE140	ACK,0 EXPECTED
DLE120	EQU	*
	CF	A5,TRENQ	SEND ENQ 
	CF	A5,SPTIM	START PROCEDURE TIMER
	RB	ENQ110
DLE130	EQU	*
	CWK	A2,ACK1
	RF(NE)	DLE180
* 
*	ACK , 1 RECEIVED
* 
	LD	A1,CACK	GET ACK COUNTER 
	RB(Z)	DLE120	ACK,1 NOT EXPECTED
DLE140	EQU	*
	LD	A1,XETX 
	RF(Z)	DLE170	ETX NOT SENT
	EJECT
* 
*	ACK HAS BEEN RECEIVED TO AN ETX BLOCK 
* 
	LDK	A1,0	SET RC=0
DLE150	EQU	*
	IFF	STARVI=0 
	LD	A2,XSTA 
	RF(NZ)	DLE200	STATUS HAS BEEN TRANSMITTED
	XIF
	CF	A5,CWRITE	COMPLETE WRITE REQUEST
DLE160	EQU	*
	CF	A5,TREOT	SEND EOT 
	IFT	RCOM=1 
	CM	XRB	RESET READ BUFFER 
	XIF
	RB	ENQ110
DLE170	EQU	*
	LDK	A1,1 
	XRS	A1,CACK	INCREMENT ACK COUNTER
	ABL	POL200 
DLE180	EQU	*
	CWK	A2,RVIPAR	IS IT RVI ?
	RB(NE)	DLE120	INVALID DLE SEQUENCE 
	CM	XACK	RESET 'EXPECTING ACK'
	LD	A1,XETX 
	RF(NZ)	DLE190	ETX HAS BEEN SENT
	LDK	A1,2	SET RC=2
	RB	DLE150
DLE190	EQU	*
	LDK	A1,0	SET RC=0
	RB	DLE150
	EJECT
	IFF	STARVI=0 
* 
* 
*	STATUS HAS BEEN TRANSMITTED 
* 
* 
DLE200	EQU	*
	LD	A6,FDWTUT	GET DWT ADDRESS 
	CF	A15,REMOVS	REMOVE FROM STATUS QUEUE 
	CM	XSTA	CLEAR 'STATUS SENT'
	CM	XACK	CLEAR 'ACK EXPECTED' 
	LD	A1,DWTST,A6	GET STATUS
	ANK	A1,4 
	RB(Z)	DLE160	NOT DE
	LDKL	A1,/8000
	ANS	A1,DWTST,A6	CLEAR STATUS 
	RB	DLE160
	XIF
	EJECT
* 
*	FIND DWT CONTAINING SUBTERMINAL ADDRESS AS GIVEN IN A2
* 
*	CALLING SEQUENCE: CF A5,FINTER(S) 
*	A2=SUBTERMINAL ADDRESS
*	A4 DESTROYED
*	A3#0: DWT TO FOUND TERMINAL 
* 
* NOTE:	FOR SIEMENS MSV1 - SEPARATE SELECT AND POLL ADDRESSES 
*	ENTRY:	FINTES - CHECK SELECT ADDRESS
*		FINTEP - CHECK SPECIFIC POLL ADDRESS 
* 
* 
* 
FINTES	EQU	*
	IFT	MSV1=1 
	LDK	A4,0 
	RF	FINT05
	XIF
FINTEP	EQU	*
	LDK	A4,1	RIGTH BYTE
FINT05	EQU	*
	LD	A3,DTEDWT,A7	GET FIRST DWT
FINT10	EQU	*
	RF(Z)	FINT20	END QUEUE 
	ADR	A3,A4
	CCR	A2,A3	THIS SUB-ADDRESS ? 
	RF(E)	FINT20	YES 
	SUR	A3,A4
	LD	A3,DWTCHN,A3	GET NEXT DWT 
	RB	FINT10
FINT20	EQU	*
	ANKL	A3,/FFFE
	RTN	A5 
	EJECT
* 
* 
*	PREPARE FOR TEXT RECEPTION
* 
* 
PRREC	EQU	* 
	IM	XSEL	SET 'SELECTED' 
	CM	FBAX	RESET BUFFER INDEX 
	IFT	CODE=1 
	LC	A2,TEBCDIC,A2	TRANSLATE STA TO EBCDIC 
	XIF
	ST	A2,+4,A1	SAVE STA IN BUFFER 
	IM	XSTA
	ST	A6,FDWTIN	STORE INPUT DWT 
	RTN	A5 
	EJECT
* 
* 
*	CHECK IF THERE IS A SEND REQUEST TO BE COMPLETED
* 
*	A1 CONTAINS RETURN CODE 
* 
* 
CWRITE	LD	A6,FDWTUT 
	RF(Z)	CWR900	NO WRITE GOING ON 
	LD	A2,DWTST,A6 
	RF(N)	CWR900	NO REQUEST
	LD	A2,DWTOR,A6	GET ORDER 
	ANK	A2,/FF	MASK AWAY OPTION PART 
	SUK	A2,6 
	RF(NZ)	CWR900	NOT SEND REQUEST 
	LD	A2,DWTIPC,A6	ANY RECEIVED BUFFERS ON QUEU ? 
	RF(Z)	CWR110	NO
	ORKL	A1,R:DATA	ACCEPTED AND DATA AVAILABLE 
CWR110	EQU	*
	LD	A8,DWTECB,A6
	CF	A15,CTIME	STOP TIMER
	IFT	REMTIM=1		=9 
	ST	A2,ECBCW1,A8
	XIF			=9 
	CF	A15,TENDIO	COMPLETE REQUEST 
CWR150	EQU	*
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
CWR900	EQU	*
	CM	XACK	RESET 'ACK EXPECTED' 
	CM	FDWTUT
	RTN	A5 
	EJECT
* 
* 
*	READ ONE TEXT BLOCK 
* 
*	ON EXIT A3 CONTAINS : 
*	0 : IF CORRECT ETX BLOCK RECEIVED 
*	1 : IF LRC OR PARITY ERROR , BUFFER OVERFLOW
*	2 : IF CORRECT ETB BLOCK RECEIVED 
* 
RDMESS	EQU	*
	LD	A4,DCRBUF	GET BUFFER ADDRESS
	ADK	A4,6	RESERVE HEADER
	LDK	A3,0 
	LD	A1,XSTA 
	RF(NZ)	RDM050	LAST INPUT WAS OK
	LD	A1,FBLST	COMPUTE NEW INDEX
	SUR	A1,A4
	ST	A1,FBAX 
RDM050	EQU	*
	AD	A4,FBAX	ADD BUFFER INDEX
	ST	A4,FBLST	REMEMBER START OF BLOCK
	CM	XSTA
	SUR	A8,A8	RESET LRC

	IFT	IBMCHR=1 
	IFF	TPMODE=1 
	LD	A1,FBAX 
	RF(NZ)	RDM100	NOT FIRST BLOCK
	CF	A5,READP
	RF(NZ)	RDM120	PARITY ERROR 
	CWK	A2,ESC 
	RF(NE)	RDM110
	CF	A5,READP	SKIP NEXT TWO CHARACTERS 
	CF	A5,READP
	XIF
	IFF	TPMODE=1 
RDM100	EQU	*
	CF	A5,READP	READ ONE CHARACTER 
	RF(NZ)	RDM120	PARITY ERROR 
RDM110	EQU	*
	XIF
	IFT	TPMODE=1 
	IM	TPM	INDICATE TRANSPARENT TEXT 
RDM100	CF	A5,READ 
	CWK	A2,DLE	CHECK IF DLE
	RF(NE)	RDM112	NO 
	CF	A5,READ	SKIP DLE AND READ NEXT CHARACTER
	CWK	A2,SYNEBC	CHECK IF SYN 
	RB(E)	RDM100	SKIP SYN
	CF	A5,CRCCAL	CALCULATE CRC 
	CWK	A2,DLE	CHECK IF 2:ND DLE 
	RF(E)	RDM115	YES - STORE DLE AS DATA 
	CWK	A2,ETX	CHECK IF ETX
	RF(E)	RDM130	YES 
	CWK	A2,ETBEBC	CHECK IF ETB 
	RF(E)	RDM160	YES 
	CWK	A2,ITB	CHECK IF ITB
	RF(E)	RDM175	YES 
	CWK	A2,ENQEBC	CHECK IF ENQ 
	RF(E)	RDM140	YES SEND NAK
* 
* 
*	GET END OF BLOCK
* 
RDM105	EQU	*
	CF	A5,READ 
	CWK	A2,DLE 
	RB(NE)	RDM105
	CF	A5,READ 
	CWK	A2,ETX 
	RF(E)	RDM110	YES - END OF BLOCK
	CWK	A2,ETBEBC
	RB(NE)	RDM105	NOT END OF BLOCK 
RDM110	EQU	*
	CM	TPM	OUT OF TRANSPARENT TEXT 
	CF	A5,RDCRC
	RF	RDM140	INDICATE INVALID MESSAGE 
RDM112	CF	A5,CRCCAL	CALCULATE CRC 
	XIF
	IFF	TPMODE=1 
	CWK	A2,ETX 
	RF(E)	RDM130	ETX RECEIVED
	CWK	A2,ETB 
	RF(E)	RDM160	ETB RECEIVED
	CWK	A2,ITB 
	RF(E)	RDM170	ITB RECEIVED
	CWK	A2,ENQ 
	RF(E)	RDM120	SKIP IF ENQ EMBEDDED IN MESSAGE 
	CWK	A2,/FF 
	RF(E)	RDM140	MARK HOLD RECEIVED
	IFT	CODE=0 
	IFT	BINTRM=1 
	LDR	A1,A2
	SUK	A1,DC1+3 
	RF(P)	RDM115	NOT DC1-DC3 
	ADK	A1,3 
	RF(N)	RDM115	NOT DC1-DC3 
	SLL	A1,6 
	SCR	A1,A4		=7
	CF	A5,READP	8-BIT CHAR GET NEXT PART 
	RF(NZ)	RDM120	PARITY ERROR 
	LCR	A1,A4		=7
	SUK	A2,/20	ASSEMBLE TO ONE CHARACTER 
	ORR	A2,A1		=7
	XIF
RDM115	EQU	*
	ADK	A3,0	ERROR DETECTED EARLIER ?
	RB(NZ)	RDM100	YES !!!
	SCR	A2,A4	STORE CHARACTER
	ADK	A4,1	INCREMENT POINTER 
	IM	FBAX	INCREMENT BUFFER INDEX 
	LD	A1,FBAX 
	CWK	A1,RBUFL+RBUFL 
	RB(NG)	RDM100	NOT OVERFLOW 
* 
*	BUFFER OVERFLOW 
* 
	LDK	A3,1	INDICATE BUFFER OVERFLOW
	IFT	STTSTS=1 
	LDK	A1,CSSRBO	BUFFER OVERFLOW
	CF	A15,DCSUPS	INCREMENT COUNTER
	XIF
	RB	RDM100
* 
*	PARITY ERROR DETECTED 
* 
RDM120	EQU	*
	IFT	STTSTS=1 
	LDK	A1,CSSRPE
	CF	A15,DCSUPS	INCREMENT COUNTER
	XIF
	LDK	A3,1	INDICATE INVALID MESSAGE
	SUK	A2,/7F 
	RF(Z)	RDM150	MARK HOLD RECEIVED
	RB	RDM100
* 
*	ETX RECEIVED
* 
RDM130	EQU	*
	LD	A1,DCRBUF	GET BUFFER ADDRESS
	LD	A2,FBAX	GET BUFFER INDEX
	ST	A2,+2,A1	STORE EFFECTIVE LENGTH IN HEADER 
	IFF	CODE=1 
	CF	A5,RDLRC
	RF(Z)	RDM150	LRC WAS OK
	XIF
	IFT	CODE=1 
	CF	A5,RDCRC	READ CRC AND CHECK IT
	RF(E)	RDM150	CRC WAS OK
	XIF
RDM140	EQU	*
	LDK	A3,1	INDICATE INVALID MESSAGE
RDM150	EQU	*
	CF	A5,CHALTI	HALT INPUT
	IFT	P6805=1
	IFT	CODE=0 
	ANK	A2,H:PARI
	RF(Z)	RDM155 
	LDK	A3,1	PARITY ERROR
RDM155	EQU	*
	XIF
	IFT	TPMODE=1 
	CWK	A3,1	ERROR DETECTED EARLIER ?
	RF(NE)	RDM158	NO 
	CM	TPM	OUT OF TRANSPARENT TEXT 
RDM158	EQU	*
	XIF
	RTN	A5 
* 
*	ETB RECEIVED
* 
RDM160	EQU	*
	LDR	A3,A3
	RB(NZ)	RDM130	ALREADY INVALID
	LDK	A3,2	INDICATE CORRECT ETB
	RB	RDM130
* 
*	ITB RECEIVED
* 
RDM170	EQU	*
	IFF	CODE=1 
	CF	A5,RDLRC
	RB(NZ)	RDM120	LRC WAS NOT OK 
	XIF
	IFT	CODE=1 
	CF	A5,RDCRC	READ CRC AND CHECK IT
	RB(NE)	RDM120	CRC WAS NOT OK 
	IFT	TPMODE=1 
RDM175	CM	TPM	OUT OF TRANSPARENT TEXT 
	CF	A5,RDCRC	READ AND CHECK CRC 
	IM	TPM 
	RB(NE)	RDM105	CRC WAS NOT OK 
RDM180	CF	A5,READ 
	CWK	A2,SYNEBC
	RB(E)	RDM180	SKIP SYN
	CWK	A2,DLE 
	RB(NE)	RDM105	ILLEGAL CHARACTER
	CF	A5,READ 
	CWK	A2,STX 
	RB(NE)	RDM105	ILLEGAL CHARACTER
	XIF
	RB	RDM100
	EJECT
* 
*	TRANSMIT ACK 0 OR 1 
* 
TRACK	LDK	A2,1
	LDK	A3,ACK1	PRELOAD ACK1 
	XRS	A2,CACK	INCREMENT ACK COUNTER
	RF(NZ)	TRDLE 
	LDK	A3,ACK0	LOAD ACK0
	RF	TRDLE 
* 
*	TRANSMIT WACK 
* 
TRWACK	LDK	A3,WACK	LOAD WACK
	RF	TRDLE 
* 
*	TRANSMIT RVI
* 
	IFF	STARVI=0 
TRRVI	LDK	A3,RVI	LOAD RVI 
	XIF
* 
*	TRANSMIT DLE
* 
TRDLE	LDK	A2,DLE	LOAD DLE 
	SC	A2,RESEND	PUT INSAVE AREA 
	SC	A3,RESEND+1	
	RF	TRREP 
	EJECT
* 
*	TRANSMIT NAK
* 
TRNAK	LDK	A3,NAK	LOAD NAK 
	RF	TREN10
* 
*	TRANSMIT EOT
* 
TREOT	LDK	A3,EOT	LOAD EOT 
	RF	TREN10
* 
*	TRANSMIT ENQ
* 
TRENQ	LDK	A3,ENQ	LOAD ENQ 
* 
TREN10	SC	A3,RESEND	PUT IN SAVE AREA
	LDK	A2,/FF 
	SC	A2,RESEND+1 
TRREP	CF	A5,TRSYNC	START OUTPUT 
	LC	A2,RESEND	GET FIRST CHARACTER 
	CF	A5,WRITEP	SEND IT 
	LC	A2,RESEND+1	GET NEXT CHARACTER
	CF	A5,WRITEP	SEND IT 
TRRE10	LDK	A2,/FF 
	CF	A5,WRIT05	SEND PAD
	LDK	A2,/FF 
	CF	A5,WRIT05 
	CF	A5,CHALTO	HALT OUTPUT 
	IFF	LOGG=0 
	CF	A5,LOGSST	LOG TRANSMITTER STATUS
	XIF
	RTN	A5 
	EJECT
* 
* 
*	TRANSMIT ONE TEXT BLOCK 
* 
* 
TRTEXT	EQU	*
	CF	A5,TRSYNC	START OUTPUT
	IFF	TPMODE=0 
	LDK	A2,DLE 
	CF	A5,WRIDLE	SEND DLE
	XIF
	LDK	A2,STX 
	CF	A5,WRITE	SEND STX 
	SUR	A8,A8	RESET LRC
	LD	A4,FECBBA	GET BUFFER ADDRESS
	AD	A4,FBAX	ADD BUFFER INDEX
	ST	A4,FBLST	REMEMBER START OF BLOCK
			.	=15
	LDK	A3,0	RESET CHARACTER COUNTER 
	LD	A1,FBAX	GET BUFFER INDEX
	RF(NZ)	TRT100	NOT FIRST BLOCK
	LDR*	A2,A7	NETWORK POLL ADDR 
	CF	A5,WRITEP	SEND TCA
	LD	A2,FDWTUT	GET DWT-ADDRESS 
	LDR*	A2,A2	GET NETWORK SUB-ADDRESS 
	CF	A5,WRITEP	SEND STA
	IFT	IBMCHR=1 
	IFF	RCOM=1 
	LDK	A2,/27	SEND ENTER AS AID 
	CF	A5,WRITEP 
	LDK	A2,/20	AND CURSOR ADDRESS
	CF	A5,WRITEP 
	LDK	A2,/20 
	CF	A5,WRITEP 
	XIF
	IFT	RCOM=1 

	LD	A1,XRB	READ BUFFER COMMAND ???
	RF(Z)	TRT070	NO!!

			******************** 
	LDK	A2,X'2D'	AID FOR DISPLAY 
	CF	A5,WRITEP	SEND AID

	LD*	A3,DWTCUR,A6	CURSOR ADDRESS
	CF	A5,LINCOL	SEND LINE AND COLUMN NUMBER 
	LDK	A3,5	SET BLOCK COUNT 
	RF	TRT100
TRT070	EQU	*
	XIF

	LDK	A3,2 
TRT100	EQU	*
	IFT	TPMODE=1 
	IM	TPM	TRANSPARENT TEXT
	XIF
	LCR	A2,A4	GET ONE CHARACTER
	ADK	A4,1	INCREMENT POINTER 
	ANK	A2,/7F 
	IFT	RCOM=1 
	LD	A1,XRB	READ BUFFER COMMAND ???
	RF(Z)	TRT105	NO!!

************************************************************
* 
*   CHECK IF ATTRIBUTE CHARACTER OR NULL
* 
*********************************************** 

	CWK	A2,X'20'	ATTRIBUTE CHARACTER 
	RF(L)	TRT101	YES!!!
	XIF
	IFT	DMRK=1 
	CWK	A2,/7E	LINE FEED ? 
	RF(NE)	TRT102	NO,GO TO TRT102
	LDK	A2,/0A 
TRT102	EQU	*
	CWK	A2,/7D	END OF MESSAGE ?
	RF(NE)	TRT103	NO,GO TO TRT103
	LDK	A2,/19 
TRT103	EQU	*
	CWK	A2,X'7F'	NULL ?? 
	RF(NE)	TRT105
	SUK	A2,1 
	XIF
	IFT	RCOM=1 
	RF	TRT105

TRT101	EQU	*

	LDK	A2,SF
	CF	A5,WRITEP	SEND START FIELD

	LC	A2,-1,A4	GET ATTRIBUTE CHARACTER
	ANK	A2,X'7F' 
	LDR	A1,A2	CONVERT TO IBM ATTRIBUTE 
	ANK	A1,1 
	ANK	A2,/1E	MASK
	SLL	A2,1 
	ORR	A2,A1	IBM ATTRIBUTE COMPOSED 
	ORK	A2,/40	BIT ALWAYS SET ONE
	LC	A2,TASCII,A2
	CWK	A2,/18	CHECK SPECIAL ATTRIBUT
	RF(NE)	TRT104
	LDK	A2,/30 
TRT104	EQU	*
	CF	A5,WRITEP	SEND ATTRIBUTE
	ADK	A3,1 
	RF	TRT110
TRT105	EQU	*
	XIF
	EJECT
	IFF	TPMODE=1 
	CWK	A2,/07 
	RF(L)	TRT110	ILLEGAL CODE : SKIP IT
	XIF
	CF	A5,WRITEP	SEND CHARACTER
TRT110	EQU	*
	IM	FBAX	INCREMENT BUFFER INDEX 
	LD	A1,FECBRL	GET REQUESTED LENGTH
	CW	A1,FBAX 
	RF(NG)	TRT130	END OF MESSAGE 
	ADK	A3,1	INCREMENT CHARACTER COUNTER 
	CWK	A3,TBLEN 
	IFT	TPMODE=1 
	RB(L)	TRT105	NOT FULL BLOCK
	XIF
	RB(L)	TRT100	NOT FULL BLOCK
	IFT	RCOM=1 
	LDK	A1,SBA	CHECK IF SBA AT END OF BLOCK
	CC	A1,-2,A4
	RF(E)	TRT115	YES 
	CC	A1,-1,A4
	RF(NE)	TRT116	NO SEND ETB
	LCR	A2,A4	GET FIRST BYTE AFTER SBA 
	ADK	A4,1	INREMENT POINTER
	CF	A5,WRITEP	SEND IT 
	IM	FBAX	INCREMENT INDEX
TRT115	LCR	A2,A4	GET SECOND BYTE AFTER SBA
	CF	A5,WRITEP	SEND IT 
	IM	FBAX	INCREMENT INDEX
	XIF
TRT116	EQU	*
	IFT	TPMODE=1 
	LDK	A2,DLE 
	CF	A5,WRIDLE	SEND AN EXTRA DLE 
	XIF
	LDK	A2,ETB	LOAD ETB
TRT120	EQU	*
	IFT	TPMODE=1 
	CM	TPM 
	XIF
	CF	A5,WRITEP	SEND IT 
	IFF	CODE=1 
	LDR	A2,A8	GET LRC
	CF	A5,WRITEP	SEND LRC
	XIF
	IFT	CODE=1 
	LDR	A2,A6
	ANK	A2,/FF 
	CF	A5,WRIT05	SEND CRC BYTE 1 
	ECR	A2,A6
	ANK	A2,/FF 
	CF	A5,WRIT05	SEND CRC BYTE 2 
	XIF
	IFT	STTSTS=1 
* 
* 
*		COUNT MESSAGES TRANSMITTED 
* 
	LDK	A1,CSSTBL
	CF	A15,DCSUPS
	XIF
	ABL	TRRE10	HALT OUTPUT 
TRT130	EQU	*
	IM	XETX	INDICATE 'ETX SENT'
	IFT	TPMODE=1 
	LDK	A2,DLE 
	CF	A5,WRIDLE	SEND AN EXTRA DLE 
	XIF
	LDK	A2,ETX	LOAD ETX
	RB	TRT120	SEND ETX AND LRC 
	EJECT
* 
* 
*	TRANSMIT STATUS MESSAGE 
* 
* 
	IFF	STARVI=0 
TRSTA	EQU	* 
	IM	XSTA	INDICATE 'STATUS SENT' 
	ST	A6,FDWTUT	SAVE A6 
	CF	A5,TRSYNC	START OUTPUT
	LDK	A2,SOH 
	CF	A5,WRITE	SEND SOH 
	SUR	A8,A8	RESET LRC
	LDK	A2,'%' 
	CF	A5,WRITEP	SEND '%'
	LDK	A2,'R' 
	CF	A5,WRITEP	SEND 'R'
	LDK	A2,STX 
	CF	A5,WRITE	SEND STX 
	LDR*	A2,A7 
	CF	A5,WRITEP	SEND TCA
	LD	A4,FDWTUT	GET DWT-ADDRESS 
	LDR*	A2,A4	GET NETWORK SUB-ADDRESS 
	CF	A5,WRITEP	SEND STA
	LD	A1,DWTST,A4	GET STATUS
	ANK	A1,/06	MASK FOR S/S 0
	SRL	A1,1 
	LC	A2,SSTAB,A1	GET STATUS BYTE 
	CF	A5,WRITEP	SEND S/S 0
	LDK	A2,NOIR	PRELOAD S/S 1
	LD	A1,DWTST,A4	GET STATUS
	ANK	A1,5 
	RF(Z)	TRST10	NOT 'IR'
	ANK	A1,4 
	RF(NZ)	TRST10	NO IR IF DE
	LDK	A2,IR
TRST10	EQU	*
	CF	A5,WRITEP	SEND S/S 1
	RB	TRT130	SEND ETX AND LRC 
	XIF
	EJECT
* 
* 
*		TRSYNC : TRANSMIT SYNC SEQUENCE
* 
TRSYNC	EQU	*
	CF	A5,CHALTI	HALT INPUT IF NOT DONE
	CF	A5,CSYNCO	START OUTPUT WITH SYNC DEF
	CF	A5,READ	WAIT FOR OUTPUT INTERRUPT 
* 
* 
*		SEND 4 SYN-CHARACTERS
* 
	LDK	A3,4 
TRS100	EQU	*
	LDK	A2,SYN 
	CF	A5,WRITE	SEND CHARACTER 
	SUK	A3,1 
	RB(NZ)	TRS100
	RTN	A5	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 INPUT
	ST	A5,DCLCI	SET INPUT ACTIVE FLAG
	IFT	P6805=1
	LDK	A2,PARITY	CHAR PARITY FUNCTION FOR LC
	CIO	A2,1,LCUIN	START I/O 
	LDK	A2,SYNC	SYNC PATTERN 
	OTR	A2,1,LCUIN	SEND INPUT SYNC-PATTERN TO LC 
	XIF
	IFT	P6805=0
	LDKL	A2,CBCARR+SYNC	DEF SYNC-PATTERN 
	CIO	A2,1,LCUIN	SEND INPUT SYNC-PATTERN TO LC 
				=1
	XIF
CSYN:I	EQU	*
	RTN	A5	RETURN TO CALLER
* 
* 
*		CHALTI : HALT INPUT CHANNEL
* 
CHALTI	EQU	*
	IFT	P6805=1
	LDK	A2,CBSTOP	STOP FUNCTION BIT
	XIF
	CIO	A2,0,LCUIN	HALT INPUT
	CM	DCLCI	CLEAR INPUT ACTIVE FLAG 
	SST	A2,LCUIN	READ STATUS 
	RF(A)	CHALTR	SST ACCEPTED	=1 
	LDK	A2,1	INSTRUCTION NOT ACCEPTED, SET MODEM ERR.	=1 
CHALTR	EQU	*		=1
	IFF	LOGG=0 
	CF	A5,LOGSST	LOGG INPUT STATUS 
	XIF
	RTN	A5	RETURN TO CALLER
	EJECT
* 
* 
*		CSYNCO : START TRANSMITTER WITH SYNC DEF 
* 
CSYNCO	EQU	*
	LD	A2,PFPOST 
	RF(NZ)	CSYN:O	WAIT FOR POWER UP
	IFT	P6805=1
	LDK	A2,PARITY	CHAR PARITY CHECK BY CU
	CIO	A2,1,LCUUT	CIO START 
	RF(A)	CSYNC1	ACCEPTED
	SST	A2,LCUUT	TRY TO READ STATUS
	ABL	BRM	NOT ACCEPTED TIMEOUT REQUEST 
CSYNC1	EQU	*
	LDK	A2,SYNC	DEF SYNC PATTERN 
	OTR	A2,1,LCUUT	SEND SYNC PATTERN 
	XIF
	IFT	P6805=0
	CIO	A2,1,LCUUT	START TRANSMITTER 
	XIF
CSYN:O	EQU	*
	RTN	A5	RETURN TO CALLER
* 
* 
*		CHALTO : HALT OUTPUT CHANNEL 
* 
CHALTO	EQU	*
	IFT	P6805=1
	LDK	A2,CBSTOP	STOP FUNCTION
	XIF
	CIO	A2,0,LCUUT	HALT OUTPUT 
	IFT	P6805=1
	LDK	A2,1	PRESET STATUS = MODEM ERROR	=1
	RF(NA)	CHLT00	INSTRUCTION NOT ACCEPTED	=1
	CF	A5,READ	WAIT FOR INTERRUPT
	XIF
	SST	A2,LCUUT	GET STATUS
CHLT00	EQU	*
	IFT	STTSTS=1 
	ANK	A2,H:NOOP+H:THRU 
	RF(Z)	CHLTO2 
	LDK	A1,CSCDCE	DCE NOT OPERABLE 
	ANK	A2,H:NOOP
	RF(NZ)	CHLTO1	YES
	LDK	A1,CSCDOT	OUTPUT THROUGHPUT ERROR
CHLTO1	EQU	*
	CF	A15,DCSUPS	INCREMENT COUNTER
CHLTO2	EQU	*
	XIF
	RTN	A5	RETURN TO CALLER
	EJECT
* 
* 
*   RECEIVER INTERRUPT
* 
* 
IH1501	EQU	*
	ST	P,INTSAV
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8
	XIF

	IFF	CPU852=1 
	MSR	8,A15	SAVE A1-A8 
	XIF
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	INR	A2,0,LCUIN	READ CHAR 
	RF(NA)	IHIN20	NOT ACCEPTED,CHECK STATUS
	IFF	LOGG=0 
	CF	A5,LOGIN	LOG RECEIVED CHARACTER 
	XIF
	IFT	TPMODE=1 
	C2	TPM 
	RF(NZ)	IHLC10	DO NOT SKIP SYNC IN TRANSPARENT TEXT 
	XIF
	C2	SYNSW 
	RF(NZ)	IHLC05	DO NOT SKIP SYNS IN BCC FRAME
	CWK	A2,SYNC
	RF(E)	READ 
IHLC05	EQU	*
	IFT	CODE=0 
	XRR	A8,A2	CALCULATE LRC
	XIF
	IFT	CODE=1 
	CF	A5,CRCCAL	CALCULATE CRC 
	LC	A2,TASCII,A2	TRANSLATE TO ASCII 
	XIF
IHLC10	EQU	*
	LDR	A1,A2
	ORKL	A1,/FF00	SET FLAG FOR CARRIER ON
	ST	A1,DCLCI	SET INPUT ACTIV FLAG 
	CM	DCSTCU	CLEAR SST SAVE 
	LDK	A1,1 
	ST A1,DTEPLS,A7	CU OPERABLE
	RTN	A5	RETURN TO CALLER
IHIN20	EQU	*
	CF	A5,SST	PERFORM SST
	ABL	BRM
	EJECT
* 
* 
*   TRANSMITTER INTERRUPT 
* 
* 
IH1502	EQU	*
	ST	P,INTSAV
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8
	XIF

	IFF	CPU852=1 
	MSR	8,A15	SAVE A1-A8 
	XIF
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	RTN	A5 
	EJECT
* 
* 
*	SST INSTRUCTION AND STATUS CHECK
* 
*   LCU STATUS : BIT 10=CARRIER OFF 
*		BIT 13=PARITY ERROR (6805 ONLY)	SALCUZ 
*                BIT 14=THROUGHPUT ERROR
*                BIT 15=MODEM NOT READY 
* 
SST	EQU	* 
	SST	A2,LCUIN	GET STATUS
	LDR	A1,A2
	IFT	LOGG=1 
	CF	A5,LOGSST	LOGG SST INFORMATION
	XIF
	ANK	A2,H:ERR	ERROR BIT SET 
	RF(NZ)	SST050	YES
	IFT	P6805=0
	LD	A2,DCLCI	INPUT STATUS 
	RF(Z)	SST125	INPUT NOT ACTIVE  IGNORE
	RF(N)	SST100	INPUT ACTIVE WITH DATA
	LDKL	A2,CBCARR+SYNC	DEF SYNC PATTERN 
	CIO	A2,1,LCUIN	START INPUT AGAIN 
	RF	SST125	RETURN TO DISPATCHER 
	XIF
	IFT	P6805=1
	RF	SST100
	XIF
SST050	EQU	*
	CM	DTEPLS,A7	CLEAR PHYS. LINK STATUS 
	ANK	A2,H:CARR	CARRIR OFF 
	RF(Z)	SST075	NO
	LD	A2,DCLCI	INPUT STATUS 
	RF(Z)	SST125	NOT ACTIVE IGNORE CARRIER OFF 
	RF	SST100	ACTIVE 
SST075	EQU	*
	LDR	A2,A1
	ANK	A2,H:THRU	THROUGHPUT ERROR 
	RF(Z)	SST100	NO
	IFT	STTSTS=1 
* 
* 
*		COUNT INPUT THROUGHPUT ERROR 
* 
	LDK	A1,CSCDIT
	CF	A15,DCSUPS
	XIF
	ABL	BRM110 
* 
SST100	EQU	*
	LDR	A2,A1
	ANK	A2,H:NOOP	NOT OPERABLE 
	RF(Z)	SST200 
	IFT	STTSTS=1 
* 
* 
*		COUNT DCE NOT OPERABLE 
* 
	LDK	A1,CSCDCE
	CF	A15,DCSUPS
	XIF
	CF	A15,STREG	SAVE REGISTERS
	CF	A15,SETIME	DELAY 1 SEC
	DATA	SST150,10 
SST125	EQU	*
	ABL	TDISP	RETURN TO DISPATCHER 
* 
SST150	EQU	*
	CF	A15,LDREG	LOAD REGISTERS
SST200	EQU	*
	LDR	A2,A1
	ANK	A2,H:CARR	CHECK STATUS IF CARRIER OFF
	RF(Z)	SST225	NO
	XRK	A1,H:CARR	CHECK STATUS IF ONLY CARRIER OFF 
	RF(Z)	SST250	YES 
SST225	EQU	*
	ST	A1,DCSTCU	STORE STATUS AS CURRENT STATUS
SST250	EQU	*
	RTN	A5	RETURN TO CALLER
	EJECT
* 
* 
*	WRITE FROM OR READ ONE CHARACTER TO A2
* 
* 
WRITE	EQU	* 
	IFT	CODE=1 
	C2	TPM 
	RF(Z)	WRIT02	NOT TRANSPARENT MODE
	CWK	A2,DLE	CHECK IF DLE
	RF(NZ)	WRIT05	NO 
	CF	A5,WRIDLE	SEND EXTRA DLE
	LDK	A2,DLE 
	RF	WRIT05
WRIT02	EQU	*
	ANK	A2,/FF 
	CWK	A2,/FF 
	RF(E)	WRIT05	NO TRANSLATION OF TRAILING PAD
	LC	A2,TEBCDIC,A2	TRANSLATE TO EBCDIC 
	XIF
WRIT05	EQU	*
	OTR	A2,0,LCUUT	SEND CHARACTER
	RF(A)	WRIT10 
	IFF	CODE=1 
WRIT10	XRR	A8,A2	ACCUMULATE BCC 
	XIF
	IFT	CODE=1 
WRIT10	CF	A5,CRCCAL	CALCULATE CRC 
	XIF
WRIT15	EQU	*
	IFF	LOGG=0 
	CF	A5,LOGOUT	LOG OUTPUT CHARACTER
	XIF
* 
READ	CF	A15,STREG 
	ABL	TDISP
* 
* 
*		THESE INSTRUCTIONS ARE ONLY USED TO SEND AN EXTRA DLE
*		WHEN TRANSPARENT MODE IS CONFIGURED
* 
WRIDLE	EQU	*
	OTR	A2,0,LCUUT	SEND CHARACTER
	RB(A)	WRIT15	ACCEPTED
	RB	READ	OUTPUT THROUGHPUT ERROR
	EJECT
* 
* 
***	WRITEP
* 
*   WRITE A2 WITH PARITY
* 
* 
	IFT	CODE+P6805=0		SALCUZ 
WRITEP	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
	IFF	CODE+P6805=0		SALCUZ 
WRITEP	RB	WRITE 
	XIF
* 
* 
* 
***	READP 
* 
*   READ CHARACTER TO A2 AND CHECK PARITY 
* 
* 
READP	CF	A5,READ
	IFT	CODE+P6805=0		SALCUZ 
	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
	IFF	CODE+P6805=0		SALCUZ 
	LDK	A1,/80 
	XIF
	ADK	A5,4 
	ANK	A1,/80 
	XRK	A1,/80 
	ABR*	A5
* 
* 
	EJECT
* 
* 
*	POWER ON FUNCTIONS
* 
* 
DC15ON	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8
	XIF

	IFF	CPU852=1 
	MSR	8,A15	SAVE A1-A8 
	XIF
	LDKL	A7,DTETAB	DTETAB ADDRESS
	IFT	STARVI=1 
	LDK	A5,4	SET DEVICE END
	LD	A6,DTEDWT,A7	GET FIRST DWT ADDR 
DC1510	EQU	*
	RF(Z)	DC1520	END OF CHAIN
	ORS	A5,DWTST,A6	STORE DEVICE END 
	CF	A15,INSSQ	INSERT DWT IN STAUS QUEUE 
	LD	A6,DWTCHN,A6	GET NEXT DWT IN CHAIN
	RB	DC1510
DC1520	EQU	*
				=4
				=13 
	XIF
	LD	A2,DTESTA,A7	DTE STATUS 
	SUK	A2,2 
	ABL(NZ)	TDISP	OPEN NOT EXECUTED
	CM	DCLCI	INIT LINE CONTROL UNIT INFO 
	LD	A2,DCTPGP	GET POLL TIMER POINTER
	RF(NZ)	DC1540	ALREADY STARTED
	CF	A15,SPOTIM	START POLL TIMER 
DC1540	EQU	*
	ABL	BRM
	EJECT
	IFT	CODE=1 
* 
* 
*	CALCULATION OF CRC
* 
*	A2 = CHARACTER
*	A8 = ACCUMULATED CRC
* 
* 
CRCCAL	EQU	*
	ST	A1,CRCSAV+2 
	ST	A2,CRCSAV+6 
	ST	A3,CRCSAV+10
	ST	A4,CRCSAV+14
	LDK	A1,8 
	LDR	A4,A8	GET OLD CRC
CRC100	LDR	A3,A4
	SRL	A4,1 
	XRR	A3,A2
	SRL	A2,1 
	ANK	A3,1 
	RF(Z)	CRC110 
	XRKL	A4,/A001
CRC110	SUK	A1,1 
	RB(NZ)	CRC100
	LDR	A8,A4	SAVE NEW CRC 
CRCSAV	EQU	*
	LDKL	A1,0
	LDKL	A2,0
	LDKL	A3,0
	LDKL	A4,0
	RTN	A5 
	EJECT
* 
* 
*	READ CRC CHARACTERS AND CHECK THEM
*	CR = (E) IF CRC WAS OK
* 
* 
RDCRC	EQU	* 
	STR	A8,A5	SAVE CURRENT CRC 
	SUK	A5,2	ADJUST STACK POINTER
	IM	SYNSW	DO NOT SKIP SYNCS NOW 
	CF	A5,READ	READ BYTE 1 
	LD	A4,CRCSAV+6	SAVE IT 
	CF	A5,READ	READ BYTE 2 
	CM	SYNSW	SYNCS CAN BE SKIPPED AGAIN
	LD	A2,CRCSAV+6	SAVE IT 
	SLL	A2,8 
	XRR	A2,A4
	ADK	A5,6 
	CW	A2,-4,A5
	ABR*	A5
	XIF
	IFT	CODE=0 
* 
*   RDLRC      READ LRC CHARACTER 
*              CR=0 IF LRC OK 
* 
RDLRC	IM	SYNSW
	CF	A5,READP
	ADK	A5,4 
	LDR	A1,A1
	RF(NZ)	LRCEND
	ANKL	A8,/007F
LRCEND	EQU	*
	CM	SYNSW 
	ABR*	A5

	XIF
	EJECT
****************************************
* 
*		DRIVER WORK AREAS
* 
****************************************
* 
* 
*	DC RECEIVE BUFFER POOL
* 
RLINK	EQU	RBUFL+RBUFL+8 
* 
DCRBUF	EQU	*
	DATA	*+2	FREE BUFFER ANCHOR
	IFF	RBUFNR=2 
	DATA	*+RLINK 
	RES	RBUFL+3
	IFF	RBUFNR=3 
	DATA	*+RLINK 
	RES	RBUFL+3
	IFF	RBUFNR=4 
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	0	END OF CHAIN
	RES	RBUFL+3

	IFF	MMUPAG=0 
MMUBUF	RES	TBUFL+1	MMU WORK BUFFER
SUBBUF	RES	3	MMU BUFFER FOR CONNECT REQUEST	=16 
	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	300
LOGEND	EQU	*-4
SAVE2	DATA	0
SAVE3	DATA	0
	XIF
* 
* 
* 
	IFT	RCOM=1 
	EJECT
******************************************************* 
* 
*     L I N C O L 
* 
*     CONVERT CURSOR ADDRESS TO LINE AND COLUMN NUMBER
* 
**********************************************************

LINCOL	EQU	*
	LDR	A2,A3	COPY CURSOR ADDRESS
	SRL	A2,6 
	ANK	A2,X'3F'	
	LC	A2,LICO:T,A2	ASCII LINE NUMBER
	CF	A5,WRITEP	SEND LINE NUMBER

	LDR	A2,A3
	ANK	A2,X'3F' 
	LC	A2,LICO:T,A2	ASCII COLUMN NUMBER
	CF	A5,WRITEP	SEND COLUMN NUMBER
	RTN	A5	RETURN
* 
* 
* 
	EJECT


LICO:T	EQU	*
	DATA	/2041,/4243,/4445,/4647	/00-/07 
	DATA	/4849,/5B2E,/3C28,/2B21	/08-/0F 
	DATA	/264A,/4B4C,/4D4E,/4F50	/10-/17 
	DATA	/5152,/5D24,/2A29,/3B5E	/18-/1F 
	DATA	/2D2F,/5354,/5556,/5758	/20-/27 
	DATA	/595A,/7C2C,/255F,/3E3F	/28-/2F 
	DATA	/3031,/3233,/3435,/3637	/30-37
	DATA	/3839,/3A23,/4027,/3D22	/38-3F
	XIF
	EJECT
* 
*	DTETAB
* 
*	FIXED PART
* 
DW1500	EQU	*
DTETAB	DATA	0,0 
	DATA	0,0,0,0,0,0 
	IFT	MMUPAG=1 
	DATA	0,0 
	XIF
*	DRIVER DEPENDENT PART 
	DATA	DTESBU-DTETAB	START OF STATISTIC BUFFER 
	DATA	0,0,0,0,0,0 
	DATA	0,0,0,0,0,0	 *
DTESBU	EQU	*
	DATA	0	SYMBOLIC ID 
	DATA	0	COUNTER STATUS WORD 
	DATA	/20	MAX NUMBER OF COUNTERS
	RES	/20	STATISTIC BUFFER 
	EJECT
* 
* 
*	PROCEDURE WORK AREAS
* 
* 
FDWTIN	RES	1	CURRENT DWT FOR RECEPTION
FDWTUT	RES	1	CURRENT DWT FOR TRANSMISSION 
XACK	DATA	0	ACK EXPECTED
XSEL	DATA	0	SELECTED
XETX	DATA	0	ETX SENT
XSTA	DATA	0	STATUS SENT / MESSAGE INPUT RESULT
XRB	DATA	0	READ BUFFER SWITCH 
CACK	DATA	0	ACK COUNTER 
SYNSW	DATA	0	0=SKIP SYNS, 1=DON'T SKIP
TPM	DATA	0	IF =1 TRANSPARENT TEXT 
* 
FECB	RES	1	WRITING ECB
FECBBA	RES	1	WRITING BUFFER ADDRESS 
FECBRL	RES	1	WRITING BUFFER LENGTH
FBAX	DATA	0	BUFFER INDEX
FBLST	DATA	0	START OF LAST TRANSMITTED BLOCK
DCSTQ	DATA	0	STATUS QUEUE ANCHOR
DCTPP	DATA	0	POINTER FOR PROCEDURE TIMING 
DCWRQ	DATA	0	WRITE REQUEST QUEUE
RESEND	DATA	0	CONTROL SEQUENCE SAVE AREA
* 
	EJECT
* 
* 
*	CONSTANTS AND WORK AREAS
* 
* 
DCSTCU	DATA	0	CURRENT STATUS
DCTPGP	DATA	0	TIMER POINTER GENERAL POLL
DCLCI	DATA	0	DC UNIT INPUT STATUS 
	END

Full view