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

⟦18ba98770⟧

    Length: 39616 (0x9ac0)
    Notes: pts_type(SC)
    Names: »DRDC13.SC«

Derivation

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

PTS(SC)

	IDENT DRDC13 	REL 11.0 81-01-26 870105041100 

			=3, ABORT ROUTINE FOR REL 11.0 
			PRR 10.0 80-02-15
			=2, DC:MIN HEADER LENGTH 
			REL 10.1 79-12-07
			=1, OLLES POWER UP 
			REL 10.1 79-10-26
* 
********************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
* 
*   DRDC13  :  VIP7700  FOR  BPPOAA 
* 
*      PROC : SYNCHRONOUS,HALF-DUPLEX,8-BIT ASCII 
**           SIMULATION OF SINGLE ADDRESS TRIBUTARY STATION 
*           TT ADDRESS  ALWAYS 60 HERE (NOT SIGNIFI.) 
*            SERVICE  FRAME  USED : ACK NAK,BSY 
* 
* 
* 
********************************************* 
* 
* 
	EJECT
* 
* 
*	ENTRY POINTS
* 
* 
	ENTRY	DC13AD	ADDRESS BLOCK TERMINAL REQUESTS 
	ENTRY	IH1301	INPUT INTERRUPT 
	ENTRY	IH1302	OUTPUT INTERRUPT
	ENTRY	DC13ON	POWER ON ROUTINE
	ENTRY	DW1300	DWT FOR DCTASK
* 
* 
*	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	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUEST LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE READ LENGTH
	EXTRN	ECBCW	ECB CONTROL WORD 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	DC:MIN	MOVE DATA TO USER BUFFER
	EXTRN	DC:MOT	MOVE DATA FROM USER BUFFER
	EXTRN	DISEND	COMPLETE REQUEST AND DISPATCH 
	EXTRN	SETTIM	START TIMER 
	EXTRN	PFPOST	WAIT FOR POWER UP IF SET
	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
* 
	EJECT
********************
* 
*  PARAMETERS FOR CONDITIONAL ASSEMBLY
* 
********************
* 
	 
X:A	EQU	270 
RBUFL	EQU	270	RECEIVE BUFFER LENGTH 
X:B	EQU	/60 
DCFC	EQU	/60	DC TASK FILE CODE
X:C	EQU	1 
LOGG	EQU	1	INTERRUPT LOGGING
X:D	EQU	2 
RBUFNR	EQU	3	NUMBER OF RECEIVE BUFFERS(2-4) 
X:E	EQU	45
TIMPOL	EQU	045	POLL TIMEOUT VALUE 
X:F	EQU	0 
P6805	EQU	00	 
X:G	EQU	/02 
	IFT	P6805=0
CHLCIN	EQU	02 
	XIF
	IFT	P6805=1
CHLCIN	EQU	/0A	DEVICE ADDRESS OF RECEIVER 
	XIF
X:H	EQU	500 
TBUFL	EQU	300	MMU BUFFER LENGTH 
* 
	IFT	P6805=0
CHLCUT	EQU	CHLCIN+/10	DEVICE ADDRESS OF TRANSMITTER 
	XIF
	IFT	P6805=1
CHLCUT	EQU	CHLCIN+/01	DEVICE ADDRESS OF TRANSMITTER 
	XIF
	EJECT
********************
* 
*  CONDITIONAL ASSEMBLY 
* 
********************
MMUPAG	EQU	0	0=NO TOSS MMU-PAGING 
* 
* 
CPU852	EQU	1	0=EXTENDED INSTRUCTION SET 
* 
* 
DEVIND	EQU	-2	DEVICE INDEX DATA COMMUNICATION 
* 
* 
BUFLEN	EQU	TBUFL+TBUFL	MMU BUFFER SIZE
	EJECT
********************************************
* 
*  USE OF STATUS WORD BIT PATTERN 
*  WITHIN DRDC13
* 
********************************************
SWBT00	EQU	/8000	REQUEST ERROR
SWBT02	EQU	/2000	STATUS CHANGE DC-TASK
SWBT09	EQU	/0040	TIMEOUT ERROR DC-TASK
SWBT10	EQU	/0020	CARRIER OFF
SWBT15	EQU	/0001	MODEM NOT READY
SWBT0:12	EQU	/8008	REQUEST ERROR & ILLEGAL LENGTH 
SWBT2:09	EQU	/2040	TIMEOUT ON READ OR WRITE REQUEST 
	EJECT
********************************************
* 
*  DWTREQ IS AN INTERNAL VARIABLE USED
*  AS A REQUEST VECTOR AND MAY HAVE 
*  THE FOLLOWING VALUES.
* 
********************************************
*  DWTREQ = /8100 MEANS AN EXPECTED ACK ON A PREVIOUS MESSAGE 
*  DWTREQ = /0100   "   AN OUTSTANDING WRITE
*  DWTREQ = /0003   "   A BSY TO BE SENT
*  DWTREQ = /0002   "   A NAK TO BE SENT
*  DWTREQ = /0001   "   AN ACK TO BE SENT 
********************************************
	EJECT
********************
* 
*  DWT DISPLACEMENTS
* 
********************
DWTDRD	EQU	/10
* 
* 
	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
DWTSQ	EQU	START+/04	STATUS QUEUE
DWTRQ	EQU	START+/06	RECEIVE QUEUE 
DWTTIM	EQU	START+/08	REQUEST TIMER VALUE
DWTREQ	EQU	START+/0A	REQUEST VECTOR 
DWTTRY	EQU	START+/0C	RETRY-COUNTER
* 
* 
*	REQUEST HANDLING
* 
* 
* 
*	PARAMETERS
* 
*	A7=ORDER
* 
*	/02: READ 
*	/06: WRITE
*	/37: TRANSFER PARAMETERS
*	/39: SET REQUEST TIMEOUT VALUE
* 
	EJECT
******   CHARACTERS EQUATES 
*        SPECIAL PROC. VIP700 
* 
SOH      EQU      /01 
SYN      EQU      /16 
STX      EQU      /02 
ETX      EQU      /03 
EOT      EQU      /04 
SP       EQU      /20 
KC       EQU      /43 
KNUL     EQU      /00 
ACK      EQU      /06 
NAK      EQU      /15 
PADP	EQU	/FF
PAD	EQU	/7F 
ACKSP	EQU	/0620	ACK+SPACE 
NAKSP	EQU	/1520	NAK 
BSYSP	EQU	/6F20	BUSY
NULSP	EQU	/8020	NUL 
	EJECT
* 
* 
******   PROC. AREAS AND CONSTANTS
* 
* 
TERID	RES	1	TERMINAL ID 
HEADER   DATA     0           CODE-F1  FOR HEADER 
DCONOF   DATA     0           LINE STATUS 1=OK,0=OFF,2=RESTART
DCSTOL	DATA	0	OLD DC EQUIPMENT STATUS 
DCSTCU	DATA	0	CURRENT STATUS
DCTPGP	DATA	0	TIMER POINTER GENERAL POLL
DCLCI	DATA	0	DC UNIT INPUT STATUS 
CURDWT	RES	1	CURRENT DWT
SVRDL	RES	1	SAVE READ LENGTH AREA 
WPOLL	DATA	0	OH !!      MY    POLL  !!
         RES      20          USER STACK
STB      RES      1 
	EJECT
* 
* 
*		LINE CONTROL UNIT  FUNCTION CONTROL
* 
	IFT	P6805=0
CBCARR	EQU	/100+SYN 
	XIF
	IFT	P6805=1	SALCUZ 
CBSTOP	EQU	/00
CBPARI	EQU	/0C
	XIF
* 
* 
*		LINE CONTROL UNIT SST STATUS BITS
* 
SBNOOP	EQU	/01
SBTHRU	EQU	/02
SBCARR	EQU	/20
	IFT	P6805=0
SBERR	EQU	/23	SBNOOP+SBTHRU+SBCARR
	XIF
	IFT	P6805=1	SALCUZ 
SBPARI	EQU	/04
SBERR	EQU	/27	SBNOOP+SBTHRU+SBCARR+SBPARI 
	XIF
	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,/39-/37 
	ABL(Z)	REQTIM	SET REQUEST TIMER
	RF	DCA100
* 
**********
* 
*  ACTIVATION FROM DCTASK 
* 
**********
* 
DCACTD	EQU	*
	SUR	A1,A1	PRESET RETURN CODE 
	SUK	A7,/02 
	RF(E)	DCRDDC	READ
	SUK	A7,/37-/02 
	RF(E)	DCTP	TRANSFER PARAMETERS 
DCA100	ABL	DISIOE	INVALID ORDER 
	EJECT
**********
* 
*  DC TASK ADDRESS BLOCK
* 
**********
* 
	DATA	0	INDICATES NO MMU BUFFER 
	DATA	DEVIND	DEVICE INDEX 
DC13DC	DATA	DCACTD	ACTIVATION ADDRESS 
	DATA	ABORT	ABORT ROUTINE ADDRESS 
	DATA	DCRBUF	RECEIVE BUFFER ANCHOR
	DATA	6	HEADER LENGTH	=2
* 
* 
**********
* 
*  DRIVER ADDRESS BLOCK 
* 
**********
* 
	DATA	BUFLEN	MMU BUFFER SIZE
	DATA	DEVIND	DEVICE INDEX 
DC13AD	DATA	DCACT	ACTIVATION ADDRESS
	DATA	ABORT	ABORT ROUTINE 
	DATA	DCRBUF	RECEIVE BUFFER ANCHOR
	DATA	6	HEADER LENGTH	=2
	EJECT
**********
* 
*  READ FROM DC TASK
*  REQUEST FROM DC TASK 
*  COMPLETE WHEN: 
*  -STATUS CHANGE ON DC EQUIPMENT 
*  -SPONTANEOUS MESSAGE RECEPTION 
* 
**********
* 
DCRDDC	EQU	*
	CF	A15,CKMESS	CHECK IF MESSAGE RECEIVED
* 
* 
* 
DCRTN	EQU	* 
	ABL	TDISP	TO DISPATCHER
	EJECT
* 
* 
*	TRANSFER PARAMETERS 
* 
* 
*	        FROM TERMINALS: TRANSFER TERMINAL ADDRESSES 
* 
* 
DCTP	LD	A2,ECBCW,A8	GET PARAMETER 
	STR	A2,A6	SAVE IN FIRST WORD OF DWT
	CWK	A6,DW1300	DCTASK DWT ? 
	RF(E)	DCTP40	YES!SHOULD'NT BE IN DC:TAB
	LD	A1,DC:IN	 GET DC:TAB INPUT POINTER
	CWK	A1,DC:END	TABLE ALREADY FULL ??
	ABL(E)	DISIOE	YES!! REQUEST ERROR
	LD	A4,DCTAB	GET DC:TAB ADDRESS 
	AD*	A4,DCTAB	LAST TABLE ENTRY
DCTP20	SUK	A4,2	ADDRESS TO NEXT ENTRY 
	CW	A4,DCTAB	ALL ENTRIES CHECKED ?? 
	RF(E)	DCTP30	YES!! DWT NOT IN TABLE
	CWR*	A6,A4	IN TABLE ?
	RF(E)	DCTP40	YES !!
	RB	DCTP20	CHECK NEXT ENTRY 
DCTP30	EQU	*
	STR	A6,A1	INSERT DWT IN DC:TAB 
	LDK	A1,2 
	ADS	A1,DC:IN	UPDATE DC:TAB IN POINTER
	ADS	A1,DC:TAB	INCREMENT DC:TAB LENGTH
DCTP40	EQU	*
	LDK	A1,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	YES!! 
	XIF
	CF	A15,TIMEWR	SET TIMER
	LDKL	A2,/0100
	ORS	A2,DWTREQ,A6	INDICATE WRITE REQUEST OUTSTANDING
	CM	DWTTRY,A6	CLEAR RETRY-COUNTER 
	RB	DCRTN 
	EJECT
* 
* 
*	READ
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE RECEIVED
*	  TIME OUT
* 
* 
DCRD	EQU	*
	LD	A8,DWTECB,A6	GET ECB
	LD	A4,DWTRQ,A6	AND RECEIVE MESSAGE QUEUE 
	RF(Z)	DCRD20	NOTHING IN QUEUE
	LDR*	A2,A4	TAKE THE FIRST IN QUEUE 
	ST	A2,DWTRQ,A6 
	LDK	A1,0	RESET RETURN CODE 
	ADK	A4,6 
	LD	A3,-4,A4	EFFECTIVE LENGTH 
	ST	A3,ECBEL,A8 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
	RB	DCRTN 
DCRD10	EQU	*
	LDK	A1,0 
	CF	A15,TENDIO
	RB	DCRTN 
DCRD20	CF	A15,TIMERE	START TIMER
	RB	DCRTN 
	EJECT
********************
* 
*  SET REQUEST TIMEOUT VALUE
* 
********************
* 
REQTIM	EQU	*
	LD	A2,ECBCW,A8	TIMEOUT VALUE 
	ST	A2,DWTTIM,A6	SAVE IT IN DWT 
	RB	DCRD10	TENDIO AND DISPATCH
* 
* 
	IFT	MMUPAG=1 
IL:LEN	LDKL	A1,/8008	REQUEST ERROR + ILLEGAL LENGTH 
	ABL	DISEND	COMPLETE REQUEST
	XIF
* 
* 
	EJECT
********************
* 
*  TIMER HANDLING PART
* 
********************
* 
*  READ TIMER = TIMERR
* 
********************
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET REQUEST TIME 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 TO CALLER 
* 
********************
* 
*  TIMEOUT READ TIMER 
* 
********************
* 
TOUTRE	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6	CLEAR TIMER POINTER
TOUTR1	EQU	*
	LDK	A1,/40	INDICATE TIMEOUT ERROR
	CM	DWTREQ,A6	CLEAR REQUEST VECTOR
TOUTR2	RB	ENDIO	COMPLETE REQUEST
	EJECT
* 
********************
* 
*  WRITE TIMER = TIMWR
* 
********************
* 
TIMEWR	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET REQUEST 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	GET DWT
	CM	DWTTP,A6
	RB	TOUTR1
	EJECT
* 
* 
*	STOP REQUEST TIMING 
* 
*	REMAINING TIME IS RETURNED IN A2
* 
* 
CTIME	EQU	* 
	INH
	LD	A2,DWTTP,A6	GET TIMER POINTER 
	RF(Z)	CTIM10	NOT RUNNING 
	LDR*	A2,A2	GET REMAINING TIME
	NGR	A2,A2
	CM*	DWTTP,A6 
	CM	DWTTP,A6
CTIM10	EQU	*
	ENB
	RTN	A5 
	EJECT
********************
* 
*  GET RECEIVE BUFFER 
* 
*  CALLING SEQUENCE: CF A15,GRBUF 
* 
*  A4 = 0 IF NO AVAILABLE BUFFER
*  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 FREE BUFFER
	LDR*	A3,A4	REMOVE BUFFER FROM FREE CHAIN 
	STR	A3,A2
GBUF10	ADKL	A15,4	ADJUST STACK POINTER
	ABR*	A15	RETURN TO CALLER
	EJECT
********************
* 
*  QUEUE ALLOCATED RECEIVE BUFFER 
* 
*  A4 = BUFFER ADDRESS
*  A2,A3 ARE DESTROYED
* 
********************
* 
QRBUF	EQU	* 
	LDR	A2,A6	QUEUE ON TERMINAL DWT
	ADK	A2,DWTRQ	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 OF QUEUE 
	RTN	A5 
	EJECT
********************
* 
*  CHECK IF UNEXPECTED MESSAGE OR STATUS REQUEST CHANGE 
*  REGISTERS A1 - A4,A6,A8 ARE DESTROYED
* 
********************
* 
CKMESS	LDKL	A6,DW1300 
	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 ADDRESS TO A8
	LD	A3,DWTRQ,A6	A3 = ADDRESS TO READ QUEUE
	RF(Z)	CKM200	NO READ IN QUEUE
	LDR*	A2,A3	A2 = ADDRESS TO NEXT READ BUFFER
	ST	A2,DWTRQ,A6	STORE THIS ADDRESS ON QUEUE 
	ADK	A3,6	MOVE POINTER TO TEXT
	ST	A3,ECBBA,A8	SAVE THIS ADDRESS IN ECB
	LD	A4,-4,A3
	ST	A4,ECBEL,A8	STORE NUMBER OF CHARACTERS
	LD	A4,-2,A3
	ST	A4,ECBCW,A8	STORE LINE DEVICE ADDRESS 
	LDR	A4,A3
	LDK	A1,0	RESET RETURN CODE 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
CKM110	RB	GBUF10	RETURN 
CKM200	LD	A1,DCSTCU	NO MESSAGE RECEIVED,CHECK STATUS
	OR	A1,DCONOF	TAKE CARE OF POLL TIMEOUT 
	CW	A1,DCSTOL 
	ST	A1,DCSTOL 
	RB(E)	CKM110	NO CHANGE OF STATUS 
	ORKL	A1,/2000	INDICATE STATUS CHANGE 
	CF	A15,TENDIO	COMPLETE READ REQUEST
	RB	CKM110
	EJECT
********************
* 
*  ABORT ROUTINE
* 
********************
* 
ABORT	LD	A2,DWTTP,A6	TIMER POINTER	=3 
	RF(Z)	AB:10	NO TIMER RUNNING 
	CM*	DWTTP,A6	KILL TIMER
	CM	DWTTP,A6
AB:10	LD	A2,DWTOR,A6	ORDER CODE	=3
	SUK	A2,2	.	=3
	RF(Z)	AB:RTN	READ REQUEST. NO ACTION 
	SUK	A2,4	.	=3
	RF(NZ)	AB:RTN	NO ACTION IF NOT READ/WRITE
AB:RTN	EQU	*
	ABL	DISEND	COMPLETE REQUEST	=3 
	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 
* 
* 
* 
LDREG	EQU	* 
	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
* 
* 
*		BASIC RECEIVE MODE 
* 
BRM	EQU	* 
	LDKL	A5,STB	LOAD STACKBASE TO A5 
	CF	A5,CSYNCI	START INPUT WITH SYN.DEF. 
* 
* 
*		LOOK FOR SOH OR TWO CONSECUTIVE PAD:S
* 
BRM100	EQU	*
	CF	A5,READ	READ A CHARACTER
* 
BRM110	EQU	*
	SUK	A2,SOH	IS IT START OF HEADER ? 
	RF(E)	BRM200	YES 
	SUK	A2,PADP-SOH	IS IT A PAD ?
	RB(NE)	BRM100	NO 
	CF	A5,READ	READ A CHARACTER
	SUK	A2,PADP	IS IT THE SECOND PAD ? 
	RB(NE)	BRM100	NO 
	EJECT
* 
* 
*		HALT INPUT CHECK IF THERE IS A POLL
* 
BRM150	EQU	*
	CF	A5,CHALTI	HALT INPUT
	LD	A2,WPOLL	IS THERE A POLL ?
	RB(Z)	BRM	NO  RESYNCHRONIZE
	ABL	POLL	YES 
* 
* 
*		CHECK STATUS FROM THE CONTROL UNIT 
* 
BRM160	EQU	*
	CF	A5,READ	READ A CHARACTER
	LD	A1,DCSTCU	CHECK OLD STATUS
	RB(NZ)	BRM150	STATUS CHANGED HALT INPUT
	RB	BRM110
* 
* 
*		THROUGHPUT ERROR 
* 
BRM170	EQU	*
	LDKL	A5,STB	LOAD STACKBASE TO A5 
	CF	A5,CSYNCI	START INPUT AGAIN 
	RB	BRM160	CHECK STATUS 
	EJECT
* 
* 
*		SOH RECEIVED 
* 
BRM200	EQU	*
	LDK	A7,0	CLEAR BCC 
	CF	A5,READP	READ A CHARACTER 
	RB(NZ)	BRM160	PARITY ERROR 
	CWK	A2,EOT	A QUIESCENT FRAME ? 
	RB(Z)	BRM150	YES HALT INPUT
* 
* 
*		FIND DWT, VERIFY HEADER, CHECK POLL OR SELECT
* 
	ST	A2,TERID	STORE CURRENT ID 
	ANK	A2,/1F	MASK THE POLL AND SELECT BITS 
	CF	A5,FINTER	FIND DWT
	LDR	A3,A3	IS THERE A DWT ? 
	RB(Z)	BRM160	NO
	ST	A3,CURDWT	STORE CURRENT DWT 
	LD	A3,TERID	LOAD ID
	LDK	A2,/1F 
	ANS	A2,TERID	MASK THE POLL AND SELECT BITS 
	CF	A5,VERHAD	VERIFY HEADER FRAME 
	ANK	A7,PAD	MASK BCC
	RB(NZ)	BRM160	BCC ERROR
	ANK	A3,/20	A POLL OR A SELECT ?
	RF(Z)	SELECT	A SELECT
	EJECT
* 
* 
*		POLL RECEIVED
* 
	IM	WPOLL	INDICATE POLL 
	CF	A5,CPTIM	RESTART POLLTIMER
	RB	BRM100	LOOK FOR TWO PADS
* 
* 
*		SELECT RECEIVED
* 
SELECT	EQU	*
	CF	A5,READP	READ A CHARACTER 
	CWK	A2,SYN	A SYN CHARACTER ? 
	RB(E)	SELECT	SKIP IT 
	CWK	A2,SOH	AN SOH ?
	RB(NE)	BRM160	NO 
	LDK	A7,0	RESET BCC-COUNTER 
	LD	A6,CURDWT	GET WORKING DWT 
	CF	A5,READP	IGNORE THE ADDRESS 
	RB(NZ)	BRM160	PARITY ERROR 
	SUK	A2,EOT	A SELECT MESSAGE ONLY ? 
	RB(E)	BRM150	YES HALT INPUT AND RESYNC.
	EJECT
* 
* 
*		A TEXT, AN ACK OR AN ACK WITH TEXT ? 
* 
	CF	A5,READP	READ A CHARACTER 
	CWK	A2,KNUL	A TEXT ? 
	RF(E)	SELTXT	YES 
	CWK	A2,ACK	AN ACK ?
	RB(NE)	BRM160	NO  THE SAME FOR NAK 
* 
* 
*		ACK OR ACK WITH TEXT 
* 
	CF	A5,READP	READ A CHARACTER 
	RB(NZ)	BRM160	PARITY ERROR 
	CWK	A2,STX	AN STX ?
	RB(NE)	BRM160	NO 
	CF	A5,READP	READ A CHARACTER 
	CWK	A2,ETX	AN ETX ?
	RF(NE)	SELACT	NO  AN ACK WITH TEXT 
	EJECT
* 
* 
*		AN ACK 
* 
	CF	A5,READP	GET BCC
	ANK	A7,PAD	MASK BCC
	RB(NZ)	BRM160	BCC ERROR
	LD	A2,DWTREQ,A6	GET REQUEST VECTOR 
	RB(NN)	BRM160	NO EXPECTED ACK
	CM	DWTREQ,A6	CLEAR THE REQUEST VECTOR
	CM	DWTTRY,A6	CLEAR THE RETRY-COUNTER 
	LD	A2,DWTOR,A6	GET THE ORDER 
	SUK	A2,/06	A WRITE ORDER ? 
	RB(NE)	BRM160	NO 
	LDK	A1,0	RETURN CODE 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RB	BRM160
* 
* 
*		AN ACK WITH TEXT 
* 
SELACT	EQU	*
	CM	DWTREQ,A6	CLEAR REQUEST VECTOR
	CM	DWTTRY,A6	CLEAR THE RETRY-COUNTER 
	LD	A2,DWTOR,A6	GET THE ORDER 
	SUK	A2,/06	A WRITE ORDER ? 
	RF(NZ)	SELT10	NO 
	LDK	A1,0	RETURN CODE 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RF	SELT10
	EJECT
* 
* 
*		A TEXT 
* 
SELTXT	EQU	*
	CF	A5,READP	DON`'T TAKE ANY NOTICE OF
	RF(NZ)	SELT90	THE NEXT TWO CHARACTERS
	CF	A5,READP	FC1 AND FC2 EXEPT FOR
	RF(NZ)	SELT90	PARITY ERRORS
	CF	A5,READP	READ A CHARACTER 
	SUK	A2,STX	AN STX ?
	RF(NE)	SELT90	NO 
* 
* 
*		GET BUFFER 
* 
SELT10	EQU	*
	LD	A4,DCRBUF	GET BUFFER CHAIN POINTER
	RF(NZ)	SELT20	YES
	LDK	A3,3	NO BUFFER AVAILABLE  SEND BUSY
	RF	SELT60
* 
* 
*		STORE THE TEXT 
* 
SELT20	EQU	*
	ADK	A4,6	ADJUST BUFFER POINTER 
	LD	A2,TERID	TERMINAL ID FIRST IN BUFFER
	LDK	A3,0	INITIATE LENGTH ACCUMULATOR 
	RF	SELT35	STORE ID 
	EJECT
* 
* 
*		READ, CHECK AND STORE THE RECEIVED CHARACTERS
* 
SELT30	EQU	*
	CF	A5,READP	READ A CHARACTER 
	RF(NZ)	SELT50	PARITY ERROR 
	CWK	A2,ETX	END OF TEXT ? 
	RF(E)	SELT40	YES READ BCC
	CWK	A2,/5A	ILLEGAL CHARACTER ? 
	RB(G)	SELT30	SKIP IT 
	CWK	A2,/20	SPACE ? 
	RB(L)	SELT30	SKIP IT 
	CWK	A3,/10E	BUFFER OVERFLOW ?
	RF(G)	SELT50	SEND NAK
SELT35	EQU	*
	LDR	A1,A4	GET BUFFER 
	ADR	A1,A3	GET BUFFER POINTER ADDRESS 
	SCR	A2,A1	STORE THE CHARACTER
	ADK	A3,1	INCREMENT BUFFER-POINTER
	RB	SELT30	GET NEXT CHARACTER 
	EJECT
* 
* 
*		READ AND CHECK BCC MOVE DATA TO USER BUFFER
* 
SELT40	EQU	*
	CF	A5,READP	READ BCC 
	RF(NZ)	SELT50	PARITY ERROR SEND NAK
	ANK	A7,PAD	MASK BCC
	RF(NZ)	SELT50	BCC ERROR
	ST	A3,SVRDL	SAVE READ LENGTH 
	CF	A15,GRBUF	GET A BUFFER
	ADK	A4,6	ADJUST BUFFER-POINTER 
	LD	A2,DWTST,A6	GET STATUS
	RF(N)	SELT70	NEGATIVE ORDER
	LDK	A2,/02	LOAD READ ORDER 
	CW	A2,DWTOR,A6	A READ ORDER ?
	RF(NE)	SELT70	NO 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	LD	A3,SVRDL	GET READ LENGTH
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
	LDK	A3,1	AN ACK TO BE SENT 
	ST	A3,DWTREQ,A6	RESTORE REQUEST VECTOR 
	CF	A5,CTIME	STOP TIMER 
	LDK	A1,0	REST RETURN CODE
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
	RF	SELT90
	EJECT
* 
* 
*		NAK OR BUSY TO BE SENT 
* 
SELT50	EQU	*
	LDK	A3,2	NAK TO BE SENT
SELT60	EQU	*
	ST	A3,DWTREQ,A6	RESTORE THE REQUEST VECTOR 
	RF	SELT90
* 
* 
*		QUEUE BUFFER FOR DC-TASK 
* 
SELT70	EQU	*
	LD	A3,SVRDL	GET READ LENGTH
	ST	A3,-4,A4	STORE READ LENGTH
	SUK	A4,6	GET BUFFER BASE 
	CF	A5,QRBUF	QUEUE BUFFER FOR DC-TASK 
SELT90	EQU	*
	ABL	BRM160	HALT IMPUT
	EJECT
* 
* 
*		WHAT'S TO BE SENT ?
* 
POLL	EQU	*
	CM	WPOLL	CLEAR POLL INDICATION 
	LD	A6,CURDWT	GET CURRENT DWT 
	LD	A3,DWTREQ,A6	GET THE REQUEST VECTOR 
	RF(Z)	TRNOTC	SEND NO TRAFFIC 
	LDR	A4,A3
	ANK	A4,/07	ANY OF ACK, NAK OR BUSY ? 
	RF(Z)	TRTEXT	NO  BUT IT COULD BE A TEXT
	LDKL	A2,ACKSP	LOAD ACK+SPACE 
	SUK	A4,1 
	RF(Z)	TRTSTA	YES SEND ACK
	LDKL	A2,NAKSP	LOAD NAK+SPACE 
	SUK	A4,1	
	RF(Z)	TRTSTA	YES SEND NAK
	LDKL	A2,BSYSP	LOAD BUSY+SPACE
	EJECT
* 
* 
*		SEND ACK, NAK OR BUSY
* 
TRTSTA	EQU	*
	ST	A2,HEADER	STORE THE CODE
	CF	A5,TRHEAD	SEND HEADER 
	CF	A5,TRETX	SEND ETX + BCC 
	LDKL	A3,/FF00
	ANS	A3,DWTREQ,A6 
	RF	TREOT	SEND EOT AND HALT OUTPUT
* 
* 
*		SEND TEXT OR NO TRAFFIC
* 
TRTEXT	EQU	*
	ANKL	A3,/100	AN OUTSTANDING WRITE ?
	RF(Z)	TRNOTC	NO  SEND NO TRAFFIC 
	LD	A2,DWTTRY,A6	GET THE RETRY-COUNTER
	CWK	A2,4	IS IT 4 ? 
	RF(NE)	TRT100	NO  SEND TEXT
	CF	A5,CTIME	STOP REQUEST TIMING
	CM	DWTREQ,A6	CLEAR THE REQUEST VECTOR
	CM	DWTTRY,A6	CLEAR THE RETRY-COUNTER 
	LDK	A1,/40	TIMEOUT ERROR 
	CF	A15,TENDIO	COMPLETE REQUEST 
* 
* 
*		SEND NO TRAFFIC
* 
TRNOTC	EQU	*
	CF	A5,TRSYNC	START TRANSMITTER 
	LDK	A2,SOH	LOAD AN SOH 
	CF	A5,WRITE	SEND IT
	RF	TREOT	SEND EOT AND HALT OUTPUT
	EJECT
* 
* 
*		SEND TEXT
* 
TRT100	EQU	*
	LDKL	A2,NULSP	LOAD NUL + SPACE 
	ST	A2,HEADER	STORE THE CODE
	CF	A5,TRHEAD	SEND HEADER + STX 
	LD	A2,DWTECB,A6	GET ECB
	LD	A3,ECBRL,A2	GET LENGTH
	RF(Z)	TRT900	NUL LENGTH  ERROR 
	IFF	MMUPAG=0 
	LDKL	A4,MMUBUF	MMU WORK BUFFER 
	ST	A4,ECBBA,A2 
	CF	A15,DC:MOT	MOVE DATA FROM USER BUFFER 
	XIF
	LD	A4,ECBBA,A2	GET BUFFER ADDRESS
	ADK	A4,2	ADJUST BUFFER-POINTER 
	SUK	A3,2	ADJUST LENGTH 
TRT200	EQU	*
	LCR	A2,A4	GET CHARACTER
	ADK	A4,1	INCREMENT POINTER 
	ANK	A2,PAD	MASK THE CHARACTER
	CWK	A2,/07	ILLEGAL CODE ?
	RF(L)	TRT300	YES SKIP IT 
	CF	A5,WRITEP	SEND THE CHARACTER
TRT300	EQU	*
	SUK	A3,1	MORE TO SEND ?
	RB(NZ)	TRT200	YES
	CF	A5,TRETX	YES  SEND ETX AND BCC
	LDKL	A3,/8100	LOAD ACK IS EXPECTED 
	ST	A3,DWTREQ,A6	STORRE IT
	IM	DWTTRY,A6	INCREMENT RETRY-COUNTER 
	RF	TREOT	SEND EOT AND HALT OUTPUT
	EJECT
* 
* 
*		REQUEST ERROR
* 
TRT900	EQU	*
	CF	A5,CTIME	CLEAR TIMEOUT REQUEST IF ANY 
	CM	DWTREQ,A6	CLEAR THE REQUEST VECTOR
	LDKL	A1,/8000	LOAD REQUEST ERROR 
	CF	A15,TENDIO	COMPLETE REQUSET 
* 
* 
*		SEND EOT AND HALT OUTPUT 
* 
TREOT	EQU	* 
	LDK	A2,EOT	LOAD EOT
	CF	A5,WRITE	SEND IT
	LDK	A2,PAD	LOAD PAD
	CF	A5,WRITE	SEND IT
	LDK	A2,PAD	LOAD PAD
	CF	A5,WRITE	SEND IT
	CF	A5,CHALTO	HALT OUTPUT 
	ABL	BRM
	EJECT
* 
* 
*		SUBROUTINES THAT ARE USED
* 
* 
*		VERHAD * VERIFY HEADER FRAME IN POLL OR SELECT 
* 
VERHAD	EQU	*
	CF	A5,READP	READ A CHARACTER 
	XRK	A2,KNUL	THE NUL CHARACTER ?
	RF(NZ)	VERH10	NO 
	CF	A5,READP	READ A CHARACTER 
	XRK	A2,STX	THE STX CHARACTER ? 
	RF(NZ)	VERH10	NO 
	CF	A5,READP	READ A CHARACTER 
	XRK	A2,ETX	THE ETX CHARACTER ? 
	RF(NZ)	VERH10	NO 
	CF	A5,READP	READ BCC 
VERH10	EQU	*
	RTN	A5 
	EJECT
* 
* 
*		TRHEAD * START OUTPUT AND TRANSMIT HEADER
* 
TRHEAD	EQU	*
	CF	A5,TRSYNC	START OUTPUT
	LDK	A2,SOH	LOAD THE SOH
	CF	A5,WRITE	SEND IT
	LDK	A7,0	RESET BCC COUNTER 
	LDK	A2,/60	LOAD ADRT 
	CF	A5,WRITEP	SEND IT 
	LDK	A2,0	RESET A2
	LC	A2,HEADER	LOAD THE CODE 
	CF	A5,WRITEP	SEND IT 
	LDK	A2,0	RESET A2
	LC	A2,HEADER+1	LOAD FC1
	CF	A5,WRITEP	SEND IT 
	LDK	A2,SP	LOAD SPACE 
	CF	A5,WRITEP	SEND IT 
	LDK	A2,STX	LOAD THE STX
	CF	A5,WRITEP	SEND IT 
	RTN	A5	RETURN
	EJECT
* 
* 
*		TRSYNC * START TRANSMITTER AND SEN 4 SYNS
* 
TRSYNC	EQU	*
	CF	A5,CSYNCO	START TRANSMITTER 
	CF	A5,READ	WAIT FOR INTERRUPT
	LDK	A3,4 
TRS100	EQU	*
	LDK	A2,SYN	LOAD A SYN
	CF	A5,WRITE	SEND IT
	SUK	A3,1 
	RB(NZ)	TRS100
	RTN	A5	RETURN
* 
* 
*		TRETX * SEND ETX AND BCC 
* 
TRETX	EQU	* 
	LDK	A2,ETX	LOAD THE ETX
	CF	A5,WRITEP	SEND IT 
	LDR	A2,A7	LOAD THE BCC 
	CF	A5,WRITEP	SEND IT 
	RTN	A5	RETURN
	EJECT
* 
* 
*		CSYNCI * STOP INPUT  SEND SYN-PATTERN FOR INPUT
* 
CSYNCI	EQU	*
	LD	A2,PFPOST 
	RF(NZ)	CSYN:I	WAIT FOR POWER UP
	CF	A5,CHALTI	HALT INPUT
	ST	A5,DCLCI	SET INPUT ACRIVE FLAG
	IFT	P6805=1	SALCUZ 
	LDK	A2,CBPARI	LOAD PARITY CHECK FOR LC 
	CIO	A2,1,CHLCIN	START RECEIVER 
	LDK	A2,SYN	LOAD SYN
	OTR	A2,1,CHLCIN	SEND SYN-PATTERN 
	XIF
	IFT	P6805=0
	LDKL	A2,CBCARR	LOAD SYN-PATTERN
	CIO	A2,1,CHLCIN	START RECEIVER WITH SYN-PATTERN
	XIF
CSYN:I	EQU	*
	RTN	A5	RETURN
* 
* 
*		CHALTI * HALT INPUT
* 
CHALTI	EQU	*
	IFT	P6805=1	SALCUZ 
	LDK	A2,CBSTOP	LOAD STOP FUNCTION BIT 
	XIF
	CIO	A2,0,CHLCIN	HALT RECEIVER
	CM	DCLCI	CLEAR INPUT ACTIVE FLAG 
	SST	A2,CHLCIN	READ STATUS
	IFF	LOGG=0 
	CF	A5,LOGSST	LOG INPUT STATUS
	XIF
	RTN	A5	RETURN
	EJECT
* 
* 
*		CSYNCO * START TRANSMITTER 
* 
CSYNCO	EQU	*
	LD	A2,PFPOST 
	RF(NZ)	CSYN:O	WAIT FOR POWER UP
	IFT	P6805=1	SALCUZ 
	LDK	A2,CBPARI	LOAD PARITY CHECK FOR CU 
	XIF
	CIO	A2,1,CHLCUT	START TRANSMITTER
	IFT	P6805=1	SALCUZ 
	RF(A)	CSYNC1	ACCEPTED
	SST	A2,CHLCUT	READ STATUS
	ABL	BRM	NOT ACCEPTED TIMEOUT 
CSYNC1	EQU	*
	LDK	A2,SYN	LOAD SYN-PATTERN
	OTR	A2,1,CHLCUT	SEND IT
	XIF
CSYN:O	EQU	*
	RTN	A5	RETURN
* 
* 
*		CHALTO * HALT OUTPUT 
* 
CHALTO	EQU	*
	IFT	P6805=1	SALCUZ 
	LDK	A2,CBSTOP	LOAD STOP FUNCTION 
	XIF
	CIO	A2,0,CHLCUT	HALT RECEIVER
	IFT	P6805=1	SALCUZ 
	CF	A5,READ	WAIT FOR INTERRUPT
	XIF
	SST	A2,CHLCUT	READ STATUS
	RTN	A5	RETURN
	EJECT
* 
* 
*   RECEIVER INTERRUPT
* 
* 
IH1301	CF	A15,SAVE8	SAVE A1 - A8
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	INR	A2,0,CHLCIN	READ CHAR
	RF(NA)	IHIN20	NOT ACCEPTED,CHECK STATUS
	IFF	LOGG=0 
	CF	A5,LOGIN	LOG RECEIVED CHARACTER 
	XIF
	LDR	A1,A2
	ORKL	A1,/FF00	SET FLAG FOR CARRIER ON
	ST	A1,DCLCI	STORE INPUT ACTIVE FLAG
	CM	DCSTCU	CLEAR SST SAVE 
IHIN10	RTN	A5 
IHIN20	CF	A5,SST	PERFORM SST
	ABL	BRM
* 
* 
*   TRANSMITTER INTERRUPT 
* 
* 
IH1302	CF	A15,SAVE8	SAVE A1 - A8
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	RB	IHIN10
	EJECT
* 
* 
*		SST * ANALYZE STATUS FROM LCU
* 
SST	EQU	* 
	SST	A2,CHLCIN	READ STATUS
	LDR	A1,A2
	IFT	LOGG=1 
	CF	A5,LOGSST	LOG SST INFORMATION 
	XIF
	ANK	A2,SBERR	ANY ERROR BIT SET ? 
	RF(NZ)	SST050	YES THERE IS 
	IFT	P6805=1	SALCUZ 
	RF	SST225
	XIF
	IFT	P6805=0
	LD	A2,DCLCI	LOAD INPUT STATUS
	RF(N)	SST225	INPUT ACTIVE WITH DATA
	RF(Z)	SST125	INPUT NOT ACTIVE
	LDKL	A2,CBCARR	LOAD SYN-PATTERN
	CIO	A2,1,CHLCIN	START INPUT AGAIN
	RF	SST125	TO DISPATCHER
	XIF
	EJECT
SST050	EQU	*
	ANK	A2,SBCARR	CARRIER OFF ?
	RF(Z)	SST075	NO
	LD	A2,DCLCI	LOAD INPUT STATUS
	RF(Z)	SST125	NOT ACTIVE  IGNORE CARRIER OFF
	RF	SST100
SST075	EQU	*
	LDR	A2,A1
	ANK	A2,SBTHRU	THROUGHPUT ERROR ? 
	ABL(NZ)	BRM170	YES 
SST100	EQU	*
	LDR	A2,A1
	ANK	A2,SBNOOP	NOT OPERABLE 
	RF(Z)	SST200	NO
	CF	A15,STREG	SAVE REGISTERS
	CF	A15,SETIME	DELAY 1SEC 
	DATA	SST150,10 
SST125	EQU	*
	ABL	TDISP	TO DISPATCHER
SST150	EQU	*
	CF	A15,LDREG	LOAD REGISTER 
SST200	EQU	*
	LDR	A2,A1
	ANK	A2,SBCARR	CARRIER OFF ?
	RF(Z)	SST225	NO
	XRK	A1,SBCARR	CARRIER OFF
	RF(Z)	SST250	YES 
SST225	EQU	*
	ST	A1,DCSTCU	STORE CURRENT STATUS
	CF	A15,CKMESS	STATUS CHANGE ?
SST250	EQU	*
	RTN	A5	RETURN
	EJECT
* 
* 
*		WRITEP * CALCULATE PARITY FOR A2 
* 
WRITEP	EQU	*
	ECR	A1,A2
	ORK	A2,/80 
WRIT10	EQU	*
	SLL	A1,1 
	RB(P)	WRIT10 
	RF(Z)	WRIT20 
	XRK	A2,/80 
	RB	WRIT10
WRIT20	EQU	*
	XRR	A7,A2	ACCUMULATE BCC 
* 
* 
*		WRITE * WRITE A2 
* 
WRITE	EQU	* 
	OTR	A2,0,CHLCUT	SEND THE CHARACTER IN A2 
	RF(NA)	READ	NOT ACCEPTED 
	IFF	LOGG=0 
	CF	A5,LOGOUT	LOG OUTPUT CHARACTER
	XIF
* 
* 
*		READ * WAIT FOR INTERRUPT
* 
READ	EQU	*
	CF	A15,STREG	SAVE THE REGISTERS
	ABL	TDISP	TO DISPATCHER
	EJECT
* 
* 
* 
***	READP 
* 
*   READ CHARACTER TO A2 AND CHECK PARITY 
* 
* 
READP	CF	A5,READ
	CWK	A2,SYN 
	RB(E)	READP	SKIP SYN-CHARACTERS
	IFT	P6805=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	P6805=1	SALCUZ 
	LDK	A1,/80 
	XIF
	ADKL	A5,4
	ANK	A1,/80 
	XRR	A7,A2	ACCUMULATE BCC 
	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	*
	LD	A4,DCTAB
	AD*	A4,DCTAB	ADDRESS TO END OF DCTAB 
FINT10	SUK	A4,2 
	LDK	A3,0	DEFAULT VALUE 
	CWK	A4,DCTAB	END OF DC:TAB 
	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
* 
* 
DC13ON	CF	A15,SAVE8	SAVE A1 - A8
	LDKL	A5,STB	INIT STACK 
	CF	A5,CLREQ	CLEAR REQUEST PENDING
	CM	DCLCI	CLEAR INPUT ACTIVE FLAG 
DRDC20	ABL	BRM
* 
* 
*******   CLREQ  :  CLEAR  PENDING  REQUEST  AT 
*                    POWER  ON,BY KILLING REQ. VECTOR 
* 

CLREQ	EQU	* 
	LD	A4,DCTAB
	AD*	A4,DCTAB	END OF TABLE
CLRQ10	SUK	A4,2	MAKE POINTER FOR DWTAD
	CWK	A4,DCTAB 
	RF(E)	CLRQ20	YES 
	LDR*	A6,A4 
	LD	A2,DWTST,A6 
	RB(N)	CLRQ10 
	CM	DWTREQ,A6 
	CF	A5,CTIME
	LDKL	A1,/2040
	CF	A15,TENDIO
	RB	CLRQ10
	LD	A2,DCTPGP 
	RF(NZ)	CLRQ20
	CF	A15,SPOTIM	START POLL TIMER 
CLRQ20	RTN	A5 
	EJECT
**********
* 
*  RESART POLL TIMER WHEN POLL HAS BEEN RECEIVED
* 
**********
* 
CPTIM	EQU	* 
	LD	A1,DCONOF	POLL TIME OUT ? 
	ANK	A1,/40 
	RF(Z)	CPTIM1	NO
	AN	A1,DCSTOL	OLD STATUS POLL TIMEOUT ? 
	RF(Z)	CPTIM2	NO
CPTIM1	EQU	*
	CM	DCONOF	INDICATE POLL
CPTIM2	EQU	*
	LDKL	A2,-TIMPOL
	ST*	A2,DCTPGP	RESTART TIMER
	CF	A15,CKMESS	CHECK IF STATUS CHANGE 
	RTN	A5 
* 
**********
* 
*  START POLL TIMER 
* 
**********
* 
SPOTIM	CF	A15,SETTIM	START TIMER
	DATA	PTOUT,TIMPOL
	ST	A4,DCTPGP	STORE TIMER POINTER 
	ADKL	A15,4 
	ABR*	A15 
	EJECT
* 
**********
* 
*  POLL TIMEOUT 
* 
**********
* 
PTOUT	LDKL	A5,STB	LOAD AS STACK BASE
	LDK	A2,/40 
	ST	A2,DCONOF	INDICATE POLL TIMEOUT 
	CF	A15,CKMESS	CHECK IF STATUS CHANGE 
	CF	A15,SPOTIM	START POLL TIMER 
	ABL	TDISP
	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
* 
* 
* 
********************
* 
*  DC 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
	XIF
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	0	END OF CHAIN
	RES	RBUFL+3
	IFF	MMUPAG=0 
* 
MMUBUF	RES	TBUFL+1	MMU WORK AREA
	XIF
	EJECT
* 
**********
* 
*  DEVICE WORK TASK 
*  FOR DC-TASK
* 
**********
* 
DW1300	EQU	*	TABLE ENTRY
	DATA	0	CU LINE ADDRESS 
	DATA	/8000	STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	DC13DC	POINTER TO ADDRESS BLOCK 
	DATA	0	TTAB ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TASK QUEUE
	IFT	MMUPAG=1 
	DATA	0	USER ECB ADDRESS
	DATA	DC:ECB	MMU ECB ADDRESS
	XIF
	DATA	0	TIMER POINTER 
	DATA	0	WRITE QUEUE 
	DATA	0	STATUS QUEUE(NOT USED BY DCTASK)
	DATA	0	RECEIVE MESSAGE QUEUE 
	DATA	0	REQUEST TIMEOUT VALUE 
	DATA	0	REQUEST VECTOR
	DATA	0	RETRY COUNTER 
	IFT	MMUPAG=1 
DC:ECB	EQU	*	MMU ECB
	DATA	0,0,0,0,0,0 
	XIF
	EJECT
* 
* 
DC:IN	DATA	DC:TAB+2 
* 
DCTAB	DATA	DC:TAB 
* 
DC:TAB	DATA	2	LENGTH OF DC:TAB
	DATA	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
* 
DC:END	EQU	*
* 
* 
	END

Full view