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

⟦a75835439⟧

    Length: 62076 (0xf27c)
    Notes: pts_type(SC)
    Names: »DRDC22.SC«

Derivation

└─⟦110b7ed5e⟧ Bits:30009664 Philips computer tape "600106"
    └─⟦this⟧ »TOSSWORK/DRDC22.SC« 

PTS(SC)

	IDENT DRDC22 	REL 9.2 80-01-03  870105040920 
			=1, TIMEOUT RETRANSMIT ERROR 
			    SYSGEN 6805
			REL 9.1 79-05-23 

********************************************* 
* 
*   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
	ENTRY	DW2200	DWT FOR DC TASK 
* 
* 
*	EXTERNAL REFERENCES 
* 
* 
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	SAVE8	SAVE A1-A8 ON A15 STACK
	EXTRN	TENDIO	COMPLETE I/O EVENT
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	SETIME	SET TIMER 
	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
	EJECT
****************************************************************
* 
*	CONDITIONAL ASSEMBLY
* 
*************************************************************** 
* 
X:A	EQU	128	RECEIVE BUFFER LENGTH 
RBUFL	EQU	X:A 
X:B	EQU	/60	DCTASK FILE CODE
DCFC	EQU	/60
X:C	EQU	1	IF 1 INTERRUPT LOGGING
LOGG	EQU	X:C
X:D	EQU	600 
TIMPOL	EQU	X:D	POLL TIME-OUT
X:E	EQU	4 
RBUFNR	EQU	X:E	NUMBER RECEIVE BUFFER
X:F	EQU	1	SUPPRESS NULL 
NULTST	EQU	X:F
X:G	EQU	0		 
SALCUZ	EQU	X:G	IF =0 DC UNIT TYPE 6834	 
			IF =1 DC UNIT TYPE 6857/SALCUZ	
			DC DEVICE ADDRESS	 
	IFT	SALCUZ=0		 
X:H	EQU	/02	INPUT DEV ADDR	 
DCDEVI	EQU	X:H	INPUT ADDR	
DCDEVO	EQU	DCDEVI+/10	OUTPUT ADDR	
	XIF			 
	IFT	SALCUZ=1		 
X:H	EQU	/0A	INPUT DEV ADDR	 
DCDEVI	EQU	/0A	INPUT ADDR	=1
DCDEVO	EQU	DCDEVI+1	OUTPUT ADDR	
	XIF			 
				
X:I	EQU	1000		
TBUFL	EQU	X:I	MMU BUFFER LENGTH	
*				 
*	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	1
* 
* BUFFER SUPERVISION TIMER
* 
BUFTIM	EQU	0
* 
* 
* 
DEVIND	EQU	-2	DEVICE INDEX DATA COMMUNICATION 
BUFLEN	EQU	TBUFL+TBUFL
	EJECT
****************************************
* 
*  USE OF STATUS WORD BIT-PATTERN 
*  WITHIN DRDC22
* 
****************************************
SWBT00	EQU	/8000	REQUEST ERROR
SWBT02	EQU	/2000	STATUS CHANGE DC-TASK
SWBT05	EQU	/0400	BEL MESSAGE
SWBT09	EQU	/0040	TIMEOUT / POLL TIMEOUT DC-TASK 
SWBT10	EQU	/0020	CARRIER OFF DC-TASK
SWBT14	EQU	/0002	THROUGHPUT ERROR DC-TASK 
SWBT15	EQU	/0001	MODEM NOT READY DC-TASK
	EJECT
* 
* 
* 
* 
*   STANDARD INTERFACE PART FOR DATA COMMUNICATION
* 
* 
* 
* 
*	DWT CONTENTS
* 
*	DWTCHP	TERMINAL ADDRESS AS GIVEN AT PARAMETER TRANSFER (BIT #08-#15)
*	DWTST	BIT #00:     NO REQUEST 
*	DWTTP	TIMERPOINTER, ORDER PROCESS 
*	DWTWQ	WRITE/GET BUFFER QUEUE
* 
* 
*	ECB PARAMETERS
* 
* 
ECBBA	EQU	2	BUFFER ADDRESS
ECBRL	EQU	4	REQUESTED LENGTH
ECBEL	EQU	6	EFFECTIVE LENGTH
ECBRC	EQU	8	RETURN CODE 
ECBCW	EQU	10	CONTROL WORD 
	EJECT
* 
*	DWT DISPLACEMENTS 
* 
DWTDRD	EQU	/10	START OF DRIVER DEFINED PART 
* 
	IFT	MMUPAG=0 
START	EQU	DWTDRD
	XIF
	IFT	MMUPAG=1 
START	EQU	DWTDRD+4
	XIF
DWTTP	EQU	START+/00	TIMER POINTER ORDER PROCESS 
DWTWQ	EQU	START+/02	WRITE/GET BUFFER QUEUE
DWTBQ	EQU	START+/04	BUFFER QUEUE ANCHOR 
DWTBTP	EQU	START+/06	TIMER FOR BUFFER QUEUE 
AIDID	EQU	START+/08	LAST AI FOR THIS DWT
SPRT1	EQU	START+/0A	PRINT MODE INDICATOR
DWTTIM	EQU	START+/0C	REQ TIMER VALUE
DIDLST	EQU	START+/0E	DEVICES PRESENT
	EJECT
* 
* 
*	REQUEST HANDLING
* 
* 
* 
*	PARAMETERS
* 
*	A7=ORDER
* 
*	/02: READ 
*	/06: WRITE
*	/37: TRANSFER PARAMETERS
*        /38: SET STATUS
*	/39:SET REQUEST TIMER VALUE 
* 
	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	
	EJECT
* 
*	DC TASK ADDRESS 
* 
	DATA	0	INDICATES NO MMU BLOCKS 
	DATA	DEVIND	DEVICE INDEX 
DC22DC	DATA	DCACTD	ADDRESS BLOCK DC TASK
	DATA	ABORT	ABORT ROUTINE ADDRESS 
	DATA	DCRBUF	RECEIVE BUFFER ANCHOR
* 
*	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
* 
	RES	15	SUBROUTINE STACK FOR INTERRUPTS 
STB	RES	1 
* 
BIT0	EQU	/8000	STATUS AI
NBIT0	EQU	/7FFF	STATUS AI 
	EJECT
* 
* 
*	ACTIVATION FROM TERMINAL TASKS
* 
DCACT	EQU	* 
	LDK	A1,0	PRESET RETURN CODE
	SUK	A7,/02 
	RF(Z)	DCRD	READ SPECIFIC 
	SUK	A7,/06-/02 
	RF(Z)	DCWR 
	SUK	A7,/37-/06 
	RF(Z)	DCTP	TRANSFER PARAMETERS 
	SUK	A7,/38-/37 
	ABL(Z)	DCSST	SET STATUS
	SUK	A7,/39-/38 
	ABL(Z)	REQTIM	SET REQUEST TIMER VALUE
	RF	DCA100
	EJECT
* 
* 
*	ACTIVATION FROM DCTASK
* 
* 
DCACTD	EQU	*
	SUK	A7,/02 
	RF(E)	DCRDDC	READ
	SUK	A7,/37-/02 
	RF(E)	DCTP	TRANSFER PARAMETERS 
DCA100	EQU	*	REQUEST ERROR
	ABL	DISIOE	INVALID ORDER 
	EJECT
* 
* 
*	READ FROM DCTASK
* 
* 
*	REQUEST FROM DC-TASK
*	COMPLETE WHEN:
*	  STATUS CHANGE ON DC EQUIPMENT 
*	  SPONTANOUS MESSAGE RECEPTION
* 
DCRDDC	EQU	*
	CF	A15,CKMESS	CHECK IF MESSAGE RECEIVED
DCRTN	EQU	* 
	ABL	TDISP	GO TO DISPATCHER 
	EJECT
* 
* 
*	TRANSFER PARAMETERS 
* 
* 
*	REQUEST FROM DC-TASK: TRANSFER TERMINAL COMPUTER ADDRESS
*	        FROM TERMINALS: TRANSFER TERMINAL ADDRESSES 
* 
* 
DCTP	LD	A2,ECBCW,A8	GET PARAMETER 
	CWK	A6,DW2200	DC-TASK ?
	RF(E)	DCTP20	YES 
	LDR	A1,A2
	SUK	A1,/70	SPECIFIC DID ?
	RF(L)	DCTP20	NO
	LDK	A3,DIDLST	GET DEVICE LIST
	ADR	A3,A6
DCTP05	EQU	*
	LDR*	A1,A3 
	RF(Z)	DCTP10	FREE POSITION ? 
	ADK	A3,2	NO
	RB	DCTP05
DCTP10	EQU	*
	STR	A2,A3	STORE DID IN LIST
	LDK	A1,0 
	RF	ENDIO 
DCTP20	EQU	*
	STR	A2,A6	SAVE IN FIRST WORD OF DWT
	EJECT
* 
*   HERE TO INTRODUCE DWT IN DC-TAB 
*      IF DC-TASK NOT CONCERNED 
* 
	CWK	A6,DW2200	DC-TASK ?
	RF(E)	ENDIO	YES
			CHECK IF DWT IN DC:TAB 
	LD	A1,DCTAB	START OF DC:TAB
	AD*	A1,DCTAB	NEXT FREE ENTRY 
DCTP23	EQU	*
	SUK	A1,2	BACKWARDS 
	CW	A1,DCTAB	AT START ? 
	RF(E)	DCTP25	NOT FOUND 
	CWR*	A6,A1	DWT?
	RF(E)	DCTP30	YES EXIT
	RB	DCTP23	CHECK NEXT ENTRY BACWARDS
DCTP25	EQU	*	FIND FREE SLOT 
	LD	A1,DC:IN	GET DC-TAB INPUT POINTER 
	CWK	A1,DC:END	TABLE ALREADY FULL ? 
	ABL(E)	DISIOE	YES REQUEST ERROR
	STR	A6,A1	INSERT DWT IN DC-TAB 
	LDK	A1,2 
	ADS	A1,DC:IN	UPDATE DC-TAB INPUT POINTER 
	ADS	A1,DC:TAB	INCREMENT DC-TAB LENGTH
DCTP30	EQU	*
	SUR	A1,A1	RETURN CODE = 0
ENDIO	EQU	* 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RB	DCRTN 
	EJECT
* 
* 
*	WRITE 
* 
* 
*	COMPLETE WHEN:
*	  SUCCESFUL TRANSMISSION
*	  TIME OUT
* 
* 
DCWR	EQU	*
	IFT	MMUPAG=1 
	LD	A1,ECBRL,A8	REQUESTED LENGTH
	CWK	A1,BUFLEN	ILLEGAL LENGTH?
	RF(G)	IL:LEN	ILLEGAL LENGTH
	XIF
	CF	A15,TIMEWR	SET TIMER
	CF	A15,INSWQ 	QUEUE REQUEST
	RB	DCRTN 
* 
	EJECT
* 
* 
*	READ
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE RECEIVED
*        MESSAGE IN QUEUE 
*	  TIME OUT
* 
* 
DCRD	EQU	*
	LD	A1,DWTBQ,A6	CHECK BUFFER QUEUE
	RF(NZ)	DCRD10	NOT EMPTY
	CF	A15,TIMERE	CHECK/SET TIMER
	RB	DCRTN 
* 
* BUFFER WAITING IN QUEUE 
* 
DCRD10	EQU	*
	LDR*	A2,A1	GET NEXT ONE
	ST	A2,DWTBQ,A6	STORE AS FIRST IN QUEUE 
	ADK	A1,6	ADJUST ADDRESS
	LD	A4,-4,A1	GET LENGTH 
	ST	A4,ECBEL,A8	STORE IN ECB
	RF(NZ)	DCRD11
* 
* BEL URGENCY ALARM 
* 
	SUK	A1,6 
	LDR	A4,A1	RESTORE BUFFER ADDRESS 
	CF	A15,RRBUF	RELEASE IT
	LDKL	A1,/400	BEL INRETURN CODE 
	CF	A15,TENDIO
	RF	DCRD12
DCRD11	EQU	*
	LDR	A4,A1	RECEIVE BUFFER ADDRESS 
	LDK	A1,0	RESET RETURN CODE 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
DCRD12	EQU	*
	LD	A1,DWTBQ,A6 
	RB(NZ)	DCRTN 
	LD	A1,DWTBTP,A6	QUEUE EMPTY,STOP TIMING
	RB(Z)	DCRTN
	CM*	DWTBTP,A6
	CM	DWTBTP,A6 
	RB	DCRTN	DISPATCHER
***** 
* 
*	ILLEGAL APPLICATION BUFFER SIZE 
* 
******
IL:LEN	EQU	*
	LDKL	A1,/8008	REQUEST ERROR + ILLEGAL LENGTH 
	ABL	DISEND 
	EJECT
* 
* 
*   SET STATUS
*   COMPLETE WHEN:
*       STATUS SET: DEVICE OPERATIONAL OR NOT 
*                  TERMINAL READY 
* 
*     BIT1 IN CW:TRANSFER FUNCTION CODE 
* 
DCSST	EQU	* 
	LD	A8,DWTECB,A6
	LD	A1,ECBCW,A8	GET STATUS
	LDR	A2,A1
	ANKL	A2,/FF00	FUNCTION CODE ?
	CWK	A2,/4000 
	RF(E)	DCSST4	YES 
	LDR	A1,A1
	RF(NZ)	DCSST1	BUSY 
	RF(Z)	DCSST0	OK
DCSSTX	EQU	*
	ABL	DISIOE 
DCSST0	EQU	*
	LD	A1,DWTST,A6 
	ANKL	A1,BUSYFL 
	RF(Z)	DCSSTU	STATUS ALREADY SET
	LDK	A1,/FE 
	ANS	A1,DWTST,A6	SET DEVICE READY 
	LDKL	A2,DCSTQ	GET THRU QUEUE ANCHOR
	CF	A15,INSWQ1	INSERT DWT IN QUEUE
	LDK	A2,6 
	ST	A2,DWTOR,A6	REPLACE ORDER 
	CM	ECBRL,A8
	ABL	DCRTN	DISPATCHER 
DCSST1	EQU	*
	LD	A1,ECBCW,A8 
	ANKL	A1,NBIT0	IGNORE STATUS BIT
	LDK	A3,DIDLST
	ADR	A3,A6
DCSST2	EQU	*
	LDR*	A2,A3	GET AI
	RB(Z)	DCSSTX	END OF LIST 
	ANKL	A2,NBIT0
	CWR	A1,A2	COMPARE AI 
	RF(E)	DCSST3	OK,AI FOUND 
	ADK	A3,2 
	RB	DCSST2	GO ON SEARCHING
DCSST3	EQU	*
	LD	A1,ECBCW,A8 
	STR	A1,A3	SET DEVICE STATUS
DCSSTU	EQU	*
	LDK	A1,0 
	CF	A15,TENDIO
	ABL	DCRTN
* 
* FUNCTION KEY
* 
DCSST4	EQU	*
	CM	ECBRL,A8	CLEAR REQUESTED LENGTH 
	LDK	A2,6 
	ST	A2,DWTOR,A6	REPLACE ORDER 
	RB	DCWR
	EJECT
* 
*	SET REQUEST TIMER VALUE 
* 
REQTIM	EQU	*
	LD	A2,ECBCW,A8	TIMEOUT VALUE 
	ST	A2,DWTTIM,A6	SAVE TIMEOUT VALUE IN DWT
	ABL	DCTP30 
	EJECT
* 
* 
* 
*	TIMER HANDLING PART 
* 
* 
* 
*	READ TIMER=TIMERR 
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET TIMEOUT VALUE
	RF(Z)	TIME10	NO TIMING 
	ST	A2,TIMERR 
	CF	A15,SETIME
	DATA	TOUTRE
TIMERR	DATA	0 
	ST	A4,DWTTP,A6	STORE TIMER POINTER 
TIME10	EQU	*
	RF	GBUF10	RETURN 
* 
*	TIMEOUT READ TIMER
* 
TOUTRE	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6
TOUTR1	EQU	*
	LDK	A1,/40	INDICATE TIME OUT 
 	ABL	ENDIO	COMPLETE REQUEST
* 
*	WRITE TIMER=TIMWR 
* 
TIMEWR	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET TIMEOUT VALUE
	RB(Z)	TIME10	NO TIMING 
	ST	A2,TIMWR
	CF	A15,SETIME
	DATA	TOUTWR
TIMWR	DATA	0
	ST	A4,DWTTP,A6 
	RB	TIME10
* 
*	TIMEOUT WRITE TIMER 
* 
TOUTWR	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6
	LD	A1,DWTOR,A6	GET ORDER 
	SUK	A1,6 
	RB(NZ)	TOUTR1	NOT WRITE
	LD	A2,DWTECB,A6	GET DWT
	CW	A6,FDWTUT	SAME AS PRESENT DWT	=1
	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
	RB	TOUTR1
	EJECT
* 
* 
*	STOP REQUEST TIMING 
* 
*	REMAINING TIME IS RETURNED IN A2
* 
* 
CTIME	EQU	* 
	LD	A2,DWTTP,A6	GET TIMER POINTER 
	RF(Z)	CTIM10	NOT RUNNING 
	LDR*	A2,A2 
	NGR	A2,A2	GET REMAINING TIME 
	CM*	DWTTP,A6	STOP TIMER
	CM	DWTTP,A6
CTIM10	EQU	*
	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
* 
* 
*	INSERT DWT IN WRITE REQUEST QUEUE 
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSWQ	LDKL	A2,DCWRQ	GET QUEUE ANCHOR
INSWQ1	LDK	A4,DWTWQ 
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,DWTWQ	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 
* 
QRBUF	EQU	* 
	LDKL	A2,DW2200+DWTWQ	BEGINNING OF RECEIVE QUEUE
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
* 
* 
*	CHECK IF UNEXPECTED MESSAGE OR STATUS CHANGE
* 
*	REGISTERS A1,A2,A3,A4,A6 AND A8 ARE DESTROYED 
* 
CKMESS	LDKL	A6,DW2200 
	LD	A1,DWTST,A6 
	RF(N)	CKM110	NO REQUEST
	LDK	A1,2	READ REQUEST ?
	CW	A1,DWTOR,A6 
	RF(NE)	CKM110	NO 
	LD	A8,DWTECB,A6	ECB ADDR TO A8 
	LD	A3,DWTWQ,A6	A3=ADDR TO READ QUEUE 
	RF(Z)	CKM200	NO READ IN QUEUE
	LDR*	A2,A3	A2=ADDR TO NEXT READ BUFFER 
	ST	A2,DWTWQ,A6	STORE THIS ADDR INTO QUEUE
	ADK	A3,6	MOVE POINTER TO TEXT
	LD	A4,-4,A3
	ST	A4,ECBEL,A8	STORE NUMBERS OF CHARACTERS 
	LD	A4,-2,A3
	ST	A4,ECBCW,A8	STORE LINE DEVICE ADDRESS 
	LDR	A4,A3	RECEIVE BUFFER ADDRESS 
	LDK	A1,0	RESET RETURN CODE 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
CKM110	ADKL	A15,4	ADJUST STACK POINTER
	ABR*	A15	RETURN
CKM200	LD	A1,DCSTCU	NO MESSAGE RECEIVED,CHECK STATUS
	OR	A1,DCONOF	TAKE CARE OF POLL TIME OUT
	CW	A1,DCSTOL 
	ST	A1,DCSTOL 
	RB(E)	CKM110	NO CHANGE OF STATUS 
	ORKL	A1,/2000	INDICATE STATUS CHANGE 
	CF	A15,TENDIO	COMPLETE READ GENERAL REQUEST
	RB	CKM110
	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
* 
* ABORT ROUTINE 
* 
ABORT	LD	A1,DWTTP,A6	TIMER POINTER
	RF(Z)	AB:10	NO TIMER RUNNING 
	CM*	DWTTP,A6	KILL TIMER
	CM	DWTTP,A6
AB:10	LD	A1,DWTOR,A6	ORDER
	SUK	A1,2 
	RF(Z)	AB:RTN	READ REQUEST NA ACTION
	SUK	A1,4 
	RF(NZ)	AB:RTN	NO ACTION IF NO READ/WRITE 
	CF	A15,REMOVW
	LD	A2,FDWTUT	WRITING DWT ADDRESS 
	CWR	A2,A6
	RF(NE)	AB:RTN	NOT THIS DWT 
	CM	XACK	RESET ACK EXPECTED 
	CM	FDWTUT	RESET WRITING DWT
AB:RTN	EQU	*
	IFT	CPU852=1 
	ADKL	A15,4 
	ABR*	A15 
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
	EJECT
**********************************************************
* 
*	TIMING CONTROL EQU:S		
* 
**********************************************************
* 
TIMBUF	EQU	1800	180 S 
*				 
	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			 
	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
* 
* 
*	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 
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
	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	/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	SPECIFIC POLL WITHOUT ACK
	DATA	SPA	SPECIFIC 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
* 
* 
*	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	LDK	A7,0	CLEAR BCC 
	CF	A5,READP	READ RID=TC
	ABL(NZ)	BRM900	PARITY ERROR
	CW	A2,DW2200	CHECK IF THIS TC
	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)	BRM900	PARITY ERROR
	ST	A2,FSID	SAVE SUBTERMINAL ADDRESS
	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)	BRM900	PARITY ERROR
	ST	A2,FDID	SAVE DID
	CM	HEADER	CLEAR HEADER CONTENTS
	CM	HEADER+2
	LDK	A3,0	RESET CHARACTER COUNTER 
BRM220	CF	A5,READP	READ CHARACTER 
	ABL(NZ)	BRM900	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)	BRM900	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
	ANK	A7,/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 
	RB	BRM	INVALID HEADER
	EJECT
* 
* 
*	RECEIVE TEXT
* 
* 
BRM300	LD	A6,FDWTIN 
	RF(Z)	BRM900	INVALID SUBTERMINAL ADDRESS 
	LD	A4,DCRBUF 
	RF(Z)	BRM900	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)	BRM900	PARITY ERROR 
	CWK	A2,DC2	PRINT COMMAND ? 
	RF(E)	BRM315	YES 
	CWK	A2,ETX 
	RF(E)	BRM350	ETX RECEIVED
	CWK	A2,SYN 
	RF(NE)	BRM320	NOT SYN, NOT TO BE SKIPPED 
	XRR	A7,A2	ADJUST BCC 
	RB	BRM310
	EJECT
* 
*  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,AIDID,A6	INIT AI DEVICE
BRM318	EQU	*
* 
*  STORE INCOMMING CHARACTER IN BUFFER
*       DC2 WILL BE TAKEN 
* 
BRM320	EQU	*
	IFT	NULTST=1 
	CWK	A2,0	NULL ?
	RB(E)	BRM310	YES,SUPPRESS IT 
	XIF
	CWK	A3,RBUFL+RBUFL 
	RF(G)	BRM900	BUFFER OVERFLOW 
	LDR	A1,A4
	ADR	A1,A3	COMPUTE BUFFER ADDRESS 
	SCR	A2,A1	STORE CHARACTER
	ADK	A3,1	INCREMENT INDEX 
	RB	BRM310
	EJECT
* 
* ETX DETECTED,STORE DID IN MESSAGE 
* 
BRM350	EQU	*
	LDK	A2,DID 
	LD	A1,SPRINT	PRINT ASKED ? 
	RF(Z)	BRM355	NO
	LD	A2,AIDID,A6	YES,GET SELECTED DEVICE 
BRM355	EQU	*
	LC	A1,HEADER 
	CWK	A1,/07	BEL ? 
	RF(E)	BRM356	YES,MESSAGE NUL 
	CWK	A3,RBUFL+RBUFL 
	RF(G)	BRM900	BUFFER OVERFLOW 
	LDR	A1,A4
	ADR	A1,A3	BUFFER ADDRESS 
	SCR	A2,A1	STORE CHARACTER
	ADK	A3,1	UPDATE LENGTH 
* 
BRM356	EQU	*
 	CF	A5,READP	READ BCC
	IFT	SALCUZ=0		 
	RF(NZ)	BRM910	PARITY ERROR 
	XIF			 
	ANK	A7,/7F	MASK BCC PARITY BIT 
	RF(NZ)	BRM910	BCC ERROR
	IFT	SALCUZ=1		 
	CF	A5,CHALTI	STOP I/P TO CHECK CHAR PAR	 
	ANK	A2,SBPARI	CHAR PARITY ERROR ?	 
	RF(NZ)	BRM915	YES	 
	XIF			 
	IM	WPOLL	SET WAIT FOR POLL 
	ST	A3,-4,A4	STORE LENGTH 
	LD*	A2,FDWTIN	GET SUBTERMINAL ADDRESS
	ST	A2,-2,A4	AND STORE IN BUFFER
	CF	A5,CHALTI	HALT INPUT
	CF	A15,GRBUF	ALLOCATE RECEIVE BUFFER 
	LD	A1,DCRBUF	BUFFER SHORTAGE ? 
	RF(Z)	BRM370	YES 
	LD	A1,SPRINT 
	RF(NZ)	BRM370	SET WABT 
	IM	TACK	ACK TO BE SENT 
BRM360	EQU	*
	ADK	A4,6	ADJUST BUFFER POINTER 
	RF	TEXT	PROCESS TEXT 
* 
* LACK OF BUFFER,SET TRANSMIT WABT
* 
BRM370	EQU	*
	IM	TWABT 
	RB	BRM360
	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
	EJECT
* 
* 
*	TEXT RECEIVED 
* 
* 
TEXT	EQU	*
	LD	A2,FSID 
	ST	A2,DCSTRX	SAVE SID TEXT 
	LD	A6,FDWTIN	GET INPUT DWT 
	ST	A6,DWTTXT 
	LD	A2,DWTST,A6	GET STATUS
	RF(N)	TEX200	NO REQUEST
	LDK	A2,2 
	CW	A2,DWTOR,A6 
	RF(NE)	TEX200	NO READ REQUEST
	LDK	A1,0	COMPLETE READ REQUEST WITH RC=0 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	LD	A3,-4,A4	GET LENGTH 
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
	RF(NZ)	TEX100
	LDKL	A1,/400	BEL IN RETURN CODE
TEX100	EQU	*
	CF	A5,CTIME	STOP TIMER 
	ST	A2,ECBCW,A8	STORE REMAINING TIME
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
	RF	TEX205
TEX200	SUK	A4,6	BASE OF BUFFER
	LDK	A2,DWTBQ	GET PROPER QUEUE
	ADR	A2,A6
	CF	A5,QR100
	LD	A1,DWTBQ,A6 
	IFT	BUFTIM=1 
	LDR*	A2,A1	FIRST IN QUEUE
	RF(NZ)	TEX205
	LDR	A1,A6
	CF	A15,SETIME	START BUF SUPERVISOR TIMER 
	DATA	TEX210,TIMBUF 
	ST	A4,DWTBTP,A6
	XIF
TEX205	EQU	*
	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	*
	ABL	BRM
	IFT	BUFTIM=1 
* 
*  TIME-OUT ENTRY 
* 
TEX210	EQU	*
	LDR	A6,A1	GET DWT
	CM	DWTBTP,A6 
	LD	A1,DWTBQ,A6	GET ANCHOR
	RF(Z)	TEX250 
	CM	DWTBQ,A6	CLEAR QUEUE ANCHOR 
	LDKL	A2,DW2200+DWTWQ	DC TASK QUEUE ANCHOR
TEX220	EQU	*
	LDR*	A3,A2 
	RF(Z)	TEX230	END OF QUEUE
	LDR	A2,A3
	RB	TEX220
TEX230	EQU	*
	STR	A1,A2	INSERT QUEUE IN DC 
	CF	A15,CKMESS	COMPLETE DC
TEX250	EQU	*
	ABL	TDISP
	XIF
	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,CWRITE	CHECK IF WRITE REQUEST IS TO BE COMPLETED 
SPA200	EQU	*
	CF	A5,CPTIM	RESET POLL TIMER 
SPA300	EQU	*
	LD	A2,FSID	GET SID 
	SUK	A2,SID	GENERAL SID ? 
	RF(NZ)	SPA350	NO,SPECIFIC CHECK IT 
	EJECT
* 
* SEND TRAFFIC ON GENERAL STATUS POLL IF REQUIRED 
* 
	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 
SPA305	EQU	*
	LD	A6,DCWRQ	GET QUEUE ANCHOR 
	RF(Z)	SPA500	NO TRAFFIC
	SUK	A6,DWTWQ	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	A1,SREADY 
	RF(NZ)	SPA700	SELECT DEVICE
	LD	A1,SPRINT 
	RF(NZ)	SPA600	PRINT STATEMENT
	LD	A6,FDWTIN	RESTORE DWT 
	LD	A1,SPRT1,A6	PRINT IN PROGRESS ? 
	RF(NZ)	TPA201	YES
SPA360	EQU	*
	LD	A1,FDID 
	SUK	A1,DID	SELECTION OR DESELECTION ?
	ABL(NZ)	TPA400	YES 
	LD	A1,DWTST,A6	GET STATUS
	RF(N)	SPA500	NO ORDER ON 
	LD	A1,DWTOR,A6	GET ORDER 
	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 
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 
	EJECT
* 
* 
*	TRAFFIC POLL
* 
* 
TP	EQU	*	TRAFFIC POLL WITHOUT ACK 
	CM	WPOLL	CLEAR WAIT FOR POLL 
	LD	A2,XACK 
	RF(Z)	TPA200	NO ACK EXPECTED 
	CF	A5,TRRPRQ	SEND REPLY REQUEST
	RB	SP100 
TPA	EQU	*	TRAFFIC POLL WITH ACK 
	CM	WPOLL	CLEAR WAIT FOR POLL 
	LDK	A1,0	RETURN CODE = 0 
	CF	A5,CWRITE	CHECK IF WRITE IS TO BE COMPLETED 
TPA200	EQU	*
	CF	A5,CPTIM	RESET POLL TIMER 
* 
*  CHECK IF SPECIFIC OR GENERAL SID 
* 
	LD	A2,FSID	GET SID 
	SUK	A2,SID	GENERAL SID ? 
	RF(Z)	TPA300	YES 
* 
*  HERE ON SPECIFIC SID,TEST IF 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	A6,FDWTIN	GET DWT 
	LD	A1,SPRT1,A6 
	RF(Z)	TPA203	NO PRINT MODE 
TPA201	EQU	*
	LD	A1,AIDID,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	*
	LD	A1,DWTST,A6	GET STATUS
	RB(N)	SPA500	NO ORDER ON 
	LD	A1,DWTOR,A6	GET ORDER 
	SUK	A1,/06	WRITE ORDER ? 
	RB(NZ)	SPA500	NOTHING TO SEND,NO TRAFFIC 
	EJECT
* 
*  SEND TEXT ON SPECIFIC TRAFFIC POLL 
* 
TPA205	EQU	*
	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
	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
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
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	*
* 
* 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,DWTWQ 
	LD	A1,AIDID,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	SPRT1,A6
	ABL	SP100
TPA315	EQU	*
	LD	A6,DCWRQ	GET QUEUE ANCHOR 
	ABL(Z)	SPA500	NO TRAFFIC 
	SUK	A6,DWTWQ	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 
	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,AIDID,A6	GET SPECIFIC DID
	ST	A1,FDID	STORE IT TO BE SEND 
	IM	SPRT1,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,DIDLST	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,AIDID,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	SPRT1,A6	RESET WABT-THRU INDICATOR
	LDK	A1,/FE 
	ANS	A1,DWTST,A6	RESET TERMINAL BUSY
	CF	A5,TRNOP	SEND NO TRAFFIC
	RTN	A5 
	EJECT
* 
* 
*	RETRANSMIT REQUEST
* 
* 
RT	EQU	*
	LD	A1,XACK 
	ABL(Z)	BRM	IGNORE NACK IF NOT ACK EXPECTED 
	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 
	ABL	SP100
RT100	LDK	A1,2	4 NAK:S: THROUGHPUT ERROR
	CF	A5,CWRITE	COMPLETE WRITE REQUEST IF ANY 
	ABL	SP100
	EJECT
* 
*  HERE RECOVERY ON LAST MESSAGE
*       TEXT EXCLUDED 
* 
RT150	EQU	* 
	IM	TSTENQ
	CFI	A5,LSEND	RETURN TO LAST STATUS 
	ABL	BRM
	EJECT
* 
* 
*	CHECK IF THERE IS A WRITE REQUEST TO BE COMPLETED 
* 
*	A1 CONTAINS RETURN CODE 
* 
* 
CWRITE	LD	A2,XACK 
	RF(Z)	CWR900	NOTHING SENT YET
	CM	XACK	NO ACK EXPECTED
	LD	A6,FDWTUT 
	RF(Z)	CWR900	NO WRITE GOING ON 
	LD	A2,DWTST,A6 
	RF(N)	CWR250	NO REQUEST
	LD	A2,DWTOR,A6	GET ORDER 
	SUK	A2,6 
	RF(Z)	CWR100	WRITE REQUEST 
	LDR	A1,A1
	RF(NZ)	CWR100	TRANSMISSION ERROR, RC NOT ZERO
	LDK	A2,2	TRANMISSION OK
	ST	A2,DWTOR,A6	INDICATE READ ORDER 
	RF	CWR200
CWR100	CF	A5,CTIME	******UD 19 08 76 *******
	CF	A15,TENDIO	COMPLETE REQUEST 
	LD	A2,DCSTQ	THRU IN QUEUE
	RF(Z)	CWR101	NO
	LDKL	A2,DCSTQ	INIT QUEUE ANCHOR
	CF	A15,REM05 
	RF	CWR250
CWR101	EQU	*
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
CWR200	EQU	*
CWR250	CM	FDWTUT	NO WRITE GOING ON
CWR900	EQU	*
	RTN	A5 
	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	*
	CF	A5,TRSYNC 
	LDK	A2,SOH 
	CF	A5,WRITE
	LDK	A7,0	BCC 
	LD	A2,DW2200	RID 
	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 
	LDK	A7,0	BCC 
	RF	TRC100
	EJECT
* 
* 
*   DEVICE HANDLING 
* 
TREADY	EQU	*
	LDKL	A4,DCSTR6 
	IM	XACK
	LDKL	A1,TREADY 
	ST	A1,LSEND
	RF	TRCTRL
TRTHRU	EQU	*
	LDKL	A4,DCSTR7 
	IM	XACK
	LDKL	A1,TRTHRU 
	ST	A1,LSEND
	RF	TRCTRL
TRNOP	EQU	* 
	LDKL	A4,DCSTR8 
	IM	XACK
	LDKL	A1,TRNOP
	ST	A1,LSEND
	RF	TRCTRL
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,A7
	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 
	LDK	A7,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	A8,DWTECB,A1	RESTORE ECB ADDRESS
	LD	A1,ECBRL,A8	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 
	LDK	A7,0	BCC 
	LD	A2,DW2200 
	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			 
*				 
*				 
*	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	*		
	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	 
	ABR*	A5	RETURN TO CALLER WITH CR SET	
*				 
*				 
*	CSYNCO : START TRANSMITTER WITH SYNC DEF	 
*				 
CSYNCO	EQU	*		
	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			 
	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	A7,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 
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	A1,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	*		
	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,A1	MOVE STATUS	 
	ANK	A2,SBTHRU	THROUGHPUT ERROR ?	
	RF(Z)	SST100	NO	 
	ABL	BRM800	THROUGHPUT ERROR
SST100	EQU	*
	ST	A1,DCSTCU 
	CF	A15,CKMESS	CHECK IF STATUS CHANGE 
	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	A7,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
* 
*	FIND DWT CONTAINING SUBTERMINAL ADDRESS AS GIVEN IN A2
* 
*	CALLING SEQUENCE: CF A5,FINTER
*	A2=SUBTERMINAL ADDRESS
*	A4 DESTROYED
*	A3#0: DWT TO FOUND TERMINAL 
* 
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	*
	LD	A4,DCTAB	GET ADDRESS TO DC:TAB
	AD*	A4,DCTAB	ADDRESS TO END OF DC:TAB
FINT10	SUK	A4,2 
	LDK	A3,0	DEFAULT VALUE 
	CW	A4,DCTAB	END OF TABLE 
	RF(E)	FINT20	SUBTERMINAL NOT FOUND 
	LDR*	A3,A4	LOAD DWT ADDRESS
	CWR*	A2,A3	COMPARE SUBTERMINAL ADDRESS 
	RB(NE)	FINT10	TAKE NEXT TERMINAL 
FINT20	RTN	A5 
	EJECT
* 
* 
*	POWER ON FUNCTIONS
* 
* 
DC22ON	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8 
	XIF
	IFF	CPU852=1 
	MSR	8,A15
	XIF
	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
* 
*	POLL TIME OUT 
* 
PTOUT	LDKL	A5,STB	LOAD A5 STACK BASE
	LDK	A2,/40 
	ST	A2,DCONOF	INDICATE POLL TIME OUT
	CF	A15,CKMESS
	CF	A15,SPOTIM
	ABL	TDISP
* 
*	RESTART POLL TIMER WHEN POLL HAS BEEN RECEIVED
* 
CPTIM	CM	DCONOF	INDICATE POLLING
	LDKL	A2,-TIMPOL
	ST*	A2,DCTPGP	RESTART TIMER
	CF	A15,CKMESS	CHECK IF STATUS CHANGE 
	RTN	A5 
* 
*  START POLL TIMER 
* 
SPOTIM	EQU	*
	CF	A15,SETIME
	DATA	PTOUT,TIMPOL
	ST	A4,DCTPGP 
	ADKL	A15,4 
	ABR*	A15 
	EJECT
* 
* 
*	DEVICE WORK TABLE FOR DCTASK
* 
* 
DW2200	EQU	*	TABLE ENTRY
	DATA	0	CU LINE ADDRESS 
	DATA	/8000	STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	DC22DC	POINTER TO AADRESS BLOCK 
	DATA	0	TTAB ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TASK QUEUE
	IFT	MMUPAG=1 
	DATA	0	USER ECB ADDRE4SS 
	DATA	DC:ECB	MMU ECB ADDRESS
	XIF
	DATA	0	TIMER POINTER 
	DATA	0	WRITE QUEUE OR BUFFER QUEUE 
	DATA	0	BUF QUEUE ANCHOR
	DATA	0	TIMER FOR BUFFER QUEING 
	DATA	0	REQUEST TIMEOUT VALUE 
	IFT	MMUPAG=1 
DC:ECB	EQU	*
	DATA	0,0,0,0,0,0 
	XIF
	EJECT
* 
* 
*	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	2200 
LOGEND	EQU	*-4
SAVE2	DATA	0
SAVE3	DATA	0
	XIF
* 
* 
* 
	EJECT
* 
**** DC-TAB AREA
* 
* 
DC:IN	DATA	DC:TAB+2	INSERT POINTER
DCTAB	DATA	DC:TAB	ENTRY POINT 
DC:TAB	DATA	2	DC TAB'S VARIABLE LENGTH
	DATA	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
DC:END	EQU	*	END OF TABLE 
	END

Full view