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

⟦8fc0a772d⟧

    Length: 55882 (0xda4a)
    Notes: pts_type(SC)
    Names: »DRDC.SC«

Derivation

└─⟦18bf30ff4⟧ Bits:30009692 Philips computer tape "600409"
    └─⟦this⟧ »BDKMON/DRDC.SC« 
└─⟦71472ef1e⟧ Bits:30009661 Philips computer tape "600103"
    └─⟦this⟧ »BDKMON/DRDC.SC« 

PTS(SC)

	IDENT DRDC19	BORN 77-12-27 

* 
********************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRDC19: DRIVER DATA COMMUNICATION 
*           BSC MULTIPOINT PRICEDURE
*           ON I/O-PROCESSOR
* 
* 
* 
********************************************
* 
*   NOTE !
*   INTERRUPT VECTOR IHSLCU ON LEVEL 46 
* 
	EJECT

* 
*	STATUS CODES
* 
*	BIT 
*	0-7: 0
*	8:   HARDWARE ERROR 
*	9:   RING INDICATOR 
*	10:  END OF CARRIER 
*	11:  0
*	12:  0
*	13:  PARITY ERROR 
*	14:  THROUGHPUT ERROR 
*	15:  NOT OPERABLE 
* 
	EJECT
* 
* 
*	ENTRY POINTS
* 
* 
	ENTRY	DCADDC	ADDRESS BLOCK DC TASK REQUESTS
	ENTRY	DCAD	ADDRESS BLOCK TERMINAL REQUESTS 
	ENTRY	IHSLCU	INPUT INTERRUPT 
	ENTRY	DRDCON	POWER ON ROUTINE
	ENTRY	DCFC	FILE CODE FOR DCTASK
	ENTRY	DWDC00	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	DCTAB	DC CONFIGURATION TABLE 
	EXTRN	SETIME	SET TIMER 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTOR	DWT ORDER
	EXTRN	DWTECB	DWT ECB 
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	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 
* 
DWTTP	EQU	/10	TIMER POINTER ORDER PROCESS 
DWTWQ	EQU	/12	WRITE/GET BUFFER QUEUE
* 
* 
*	PARAMETERS FOR CONDITIONAL ASSEMBLY 
* 
* 
X:A	EQU	175 
RBUFL	EQU	X:A 
X:B	EQU	0	TRANSMIT BUFFER LENGTH
TBUFL	EQU	X:B 
X:C	EQU	/60	DCTASK FILE CODE
DCFC	EQU	X:C
X:E	EQU	20	POLL TIMEOUT VALUE 
TIMPOL	EQU	X:E
X:H	EQU	350	TRANSMIT BLOCK LENGTH 
TBLEN	EQU	X:H 

* 
*	OPTIONS NOT AVAILABLE 
* 
LOGG	EQU	0
STAT	EQU	0
RCOM	EQU	0
CODE	EQU	0
BDKSP	EQU	1	SPECIAL BSC FOR BANKDATA
	EJECT
* 
* 
*	REQUEST HANDLING
* 
* 
* 
*	PARAMETERS
* 
*	A7=ORDER
* 
*	/02: READ 
*	/06: WRITE
*	/08: EXCHANGE 
*	/22: RELEASE READ BUFFER
*	/31: GET WRITE BUFFER 
*	/37: TRANSFER PARAMETERS
*	/38: SET STATUS 
* 
* 
*	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
	IFF	TBUFL=0
DCGWQ	DATA	0	GET BUFFER REQUEST QUEUE 
	XIF
DCTPGP	DATA	0	TIMER POINTER GENERAL POLL
DCADDC	DATA	DCACTD	ADDRESS BLOCK DC TASK
DCAD	DATA	DCACT	ADDRESS BLOCK 
	RES	15	SUBROUTINE STACK FOR INTERRUPTS 
STB	RES	1 
	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,/08-/06 
	RF(Z)	DCEX	EXCHANGE
	SUK	A7,/22-/08 
	RF(Z)	DCRR	RELEASE READ BUFFER 
	SUK	A7,/37-/22 
	RF(Z)	DCTP	TRANSFER PARAMETERS 
	SUK	A7,/38-/37 
	IFF	STAT=0 
	RF(Z)	DCSS	SET STATUS
	XIF
	IFF	TBUFL=0
	ADK	A7,/38-/31 
	RF(Z)	DCGW	GET WRITE BUFFER
	XIF
	RF	DCA100
	EJECT
* 
* 
*	ACTIVATION FROM DCTASK
* 
* 
DCACTD	EQU	*
	SUK	A7,/02 
	RF(E)	DCRDDC	READ
	SUK	A7,/22-/02 
	RF(E)	DCRR	RELEASE READ BUFFER 
	SUK	A7,/37-/22 
	RF(E)	DCTP	TRANSFER PARAMETERS 
DCA100	EQU	*	REQUEST ERROR
	ABL	DISIOE	INVALID ORDER 
* 
* 
*	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 
* 
* 
	IFF	CODE=1 
DCTP	LD	A2,ECBCW,A8	GET PARAMETER 
	XIF
	IFT	CODE=1 
DCTP	LC	A2,ECBCW,A8	GET TCS IF ANY
	ANK	A2,/FF 
	RF(Z)	DCTP10 
	LC	A2,TASCII,A2	TRANSLATE TO ASCII 
	SLL	A2,8 
DCTP10	EQU	*
	LC	A3,ECBCW+1,A8	GET TCP OR DV 
	ANK	A3,/FF 
	LC	A2,TASCII,A3	TRANSLATE TO ASCII 
	XIF
	STR	A2,A6	SAVE IN FIRST WORD OF DWT
ENDIO	EQU	* 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RB	DCRTN 
	EJECT
* 
* 
*	WRITE 
* 
* 
*	COMPLETE WHEN:
*	  SUCCESFUL TRANSMISSION
*	  TIME OUT
* 
* 
DCWR	EQU	*
	CF	A15,TIMEWR	SET TIMER
	CF	A15,INSWQ 	QUEUE REQUEST
	RB	DCRTN 
* 
* 
* 
*	READ
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE RECEIVED
*	  TIME OUT
* 
* 
DCRD	EQU	*
	CF	A15,TIMERE	CHECK/SET TIMER
	RB	DCRTN 
	EJECT
* 
* 
*	GET WRITE BUFFER
* 
* 
	IFF	TBUFL=0
*	COMPLETE WHEN:
*	  BUFFER BEEN ALOCATED
*	  TIME OUT
* 
* 
DCGW	EQU	*
	CF	A15,GTBUF	GET TRANSMIT BUFFER 
	LDR	A4,A4
	RF(Z)	DCGW10	NO FREE BUFFER
	ST	A4,ECBBA,A8 
	LDKL	A1,TBUFL+TBUFL
	ST	A1,ECBEL,A8	STORE BUFFER LENGTH 
	LDK	A1,0 
	RB	ENDIO	COMPLETE REQUEST
DCGW10	EQU	*
	CF	A15,TIMERE	START TIMER
	CF	A15,INSGWQ	QUEUE REQUEST
	RB	DCRTN 
	XIF
	EJECT
* 
* 
*	RELEASE READ BUFFER 
* 
* 
DCRR	LD	A4,ECBBA,A8 
	SUK	A4,6 
	CF	A15,RRBUF 
DCRR10	EQU	*
	LDK	A1,0 
	CF	A15,TENDIO	COMPLETE RRBUF REQUEST 
	RB	DCRTN 
	EJECT
* 
* 
*	EXCHANGE
* 
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE PASSED TO TERMINAL
*	  TIME OUT
* 
DCEX	EQU	*
	RB	DCWR	SAME INITIALIZATION AS WRITE 
* 
* 
*	SET STATUS
* 
* 
	IFF	STAT=0 
DCSS	EQU	*
	LD	A1,ECBCW,A8	GET STATUS INFORMATION
	ANK	A1,3	MASK DB,IR
	RF(Z)	DCSS20	DEVICE END
DCSS10	EQU	*
	ST	A1,DWTST,A6 
	RB	DCRR10	COMPLETE REQUEST 
DCSS20	EQU	*
	LD	A1,DWTST,A6 
	ANK	A1,9 
	RB(Z)	DCSS10	WACK HAS NOT BEEN SENT
DCSS30	EQU	*
	CF	A15,INSSQ	INSERT DWT IN STATUS QUEUE
	LDK	A1,4	SET DE
	RB	DCSS10
	XIF
	EJECT
* 
* 
* 
*	TIMER HANDLING PART 
* 
* 
* 
*	READ TIMER=TIMERR 
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,ECBCW,A8	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
	IFF	TBUFL=0
	CF	A15,REMOVG	REMOVE FROM QUEUE
	XIF
TOUTR1	EQU	*
	LDK	A1,/40	INDICATE TIME OUT 
	LD	A2,DWTOR,A6	CHECK IF EXCHANGE ORDER 
	SUK	A2,8 
	RF(NZ)	TOUTR2	NOT EXCHANGE 
	ORK	A1,2	RETURN CODE /42 AT EXCHANGE TIME OUT
TOUTR2	RB	ENDIO	COMPLETE REQUEST
* 
*	WRITE TIMER=TIMWR 
* 
TIMEWR	LDR	A1,A6
	LD	A2,ECBCW,A8	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
	EJECT
* 
*	TIMEOUT WRITE TIMER 
* 
TOUTWR	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6
	LD	A1,DWTOR,A6	GET ORDER 
	SUK	A1,6 
	RF(Z)	TOUT10	WRITE 
	SUK	A1,2 
	RB(NZ)	TOUTR1	ORDER IS NOT EXCHANGE
TOUT10	LD	A2,DWTECB,A6
	LD	A4,ECBBA,A2	FETCH BUFFER
	IFF	TBUFL=0
	CF	A15,RTBUF	RELEASE TRANSMITBUFFER
	CF	A15,CKGBQ	CHECK GET BUFFER QUEUE
	XIF
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
* 
*	THIS INSTRUCTION DOES NOT BELONG
*	TO THE STANDARD INTERFACE 
* 
	CM	XACK	INDICATE 'ACK NOT EXPECTED'
	LD	A2,FDWTUT 
	CWR	A2,A6
	RB(NE)	TOUTR1	THIS DWT NOT WRITING 
	CM	FDWTUT
* 
* 
	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	*
	RF	GBUF10
	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
* 
* 
*	GET TRANSMIT BUFFER 
* 
	IFF	TBUFL=0
*	CALLING SEQUENCE: CF A15,GTBUF
*	A4=0 IF NO BUFFER IS FREE 
*	ELSE A4 CONTAINS BUFFER ADDRESS 
*	A2 AND A3 ARE DESTROYED 
* 
* 
GTBUF	LDKL	A2,DCTBUF	TRANSMIT BUFFERS 
	RB	GBUF
	EJECT
* 
* 
*	CHECK GET BUFFER QUEUE
* 
* 
CKGBQ	EQU	* 
	LDR	A7,A6	SAVE A6
	LD	A6,DCGWQ	GET QUEUE ANCHOR 
	RF(Z)	CKG110	NO ONE ON QUEUE 
	SUK	A6,DWTWQ 
	LD	A2,DWTST,A6 
	RF(N)	CKG100	NO REQUEST
	LD	A2,DWTOR,A6 
	SUK	A2,/31 
	RF(NZ)	CKG100	NO GET BUFFER REQUEST
	CF	A15,GTBUF	GET TRANSMIT BUFFER 
	LDR	A4,A4
	RF(Z)	CKG110	NO BUFFER FREE
	LD	A3,DWTECB,A6
	ST	A4,ECBBA,A3	STORE BUFFER ADDRESS
	LDKL	A1,TBUFL+TBUFL
	ST	A1,ECBEL,A3	STORE BUFFER LENGTH 
	CF	A15,CTIME	STOP REQUEST TIMING 
	ST	A2,ECBCW,A3	STORE REMAINING TIME
	LDK	A1,0 
	CF	A15,TENDIO	COMPLETE REQUEST 
CKG100	EQU	*
	CF	A15,REMOVG	REMOVE FROM QUEUE
CKG110	LDR	A6,A7	RESTORE A6 
	RB	GBUF10	RETURN 
	XIF
	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 
* 
* 
*	RELEASE TRANSMIT BUFFER 
* 
	IFF	TBUFL=0
*	A4 CONTAINS BUFFER ADDRESS
*	CALLING SEQUENCE: CF A15,RTBUF
*	A2 AND A3 ARE DESTROYED 
* 
* 
RTBUF	LDKL	A2,DCTBUF	TRANSMIT BUFFERS 
	RB	RBUF
	XIF
	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 
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 GET WRITE BUFFER QUEUE
* 
	IFF	TBUFL=0
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSGWQ	LDKL	A2,DCGWQ	GET QUEUE ANCHOR 
	RB	INSWQ1
* 
* 
*	REMOVE DWT FROM GET WRITE BUFFER QUEUE
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVG	LDKL	A2,DCGWQ	GET QUEUE ANCHOR 
	RB	REM05 
	XIF
	EJECT
* 
* 
*	INSERT DWT IN STATUS QUEUE
* 
	IFF	STAT=0 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSSQ	LDKL	A2,DCSTQ	GET QUEUE ANCHOR
	LDK	A4,DWTSQ 
	RB	INSWQ2
* 
* 
*	REMOVE DWT FROM STATUS QUEUE
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVS	LDKL	A2,DCSTQ	GET QUEUE ANCHOR 
	LDK	A4,DWTSQ 
	RB	REM06 
	XIF
	EJECT
* 
* 
*	QUEUE ALLOCATED RECEIVE BUFFER
* 
*	A4=BUFFER ADDR
*	A2,A3 DESTROYED 
* 
QRBUF	EQU	* 
	LDKL	A2,DWDC00+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,DWDC00 
	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
	ST	A3,ECBBA,A8	SAVE THIS ADDR IN ECB 
	LD	A4,-4,A3
	ST	A4,ECBEL,A8	STORE NUMBERS OF CHARACTERS 
	LC	A4,-2,A3
	ANK	A4,/FF 
	ST	A4,ECBCW,A8	STORE LINE DEVICE ADDRESS 
	LDK	A1,0	PARAMETER=OK
CKM100	CF	A15,TENDIO	COMPLETE READ GENERAL REQUEST
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 
	RB	CKM100
	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
* 
* 
* 	CHANNEL UNIT PARAMETERS
* 
* 
SLCU	EQU	/0A
* 
* 
*	TIMER VALUES
* 
* 
TIMPRO	EQU	2	PROCEDURE TIMER 200 MS 
	EJECT
* 
* 
*	CHARACTER EQUATES 
* 
* 
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
	IFT	CODE=0 
PAR	EQU	/80 
WACK	EQU	/3B
RVI	EQU	/3C 
ACK0	EQU	/30
ACK1	EQU	/31
	XIF
	IFT	CODE=1 
PAR	EQU	/00 
WACK	EQU	/2C
RVI	EQU	/40 
ACK0	EQU	/18
ACK1	EQU	/2F
SYNEBC	EQU	/32
	XIF
	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
XENB	DATA	0	DRIVER IN ENABLE MODE 
XPWF	DATA	0	POWER FAIL OCCURED
CACK	DATA	0	ACK COUNTER 
	IFT	BDKSP=1		**********
LSEL	DATA	0	LAST COR.REC.MESS.
	XIF			******** 
* 
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 
RESEND	DATA	/1616,/1616,0,/FFFF	CONTROL SEQUENCE SAVE AREA
DWTSQ	EQU	/14	DWT STATUS QUEUE
DWTBA	EQU	/16 
DWTRL	EQU	/18 
* 
* 
*	3270 SENSE/STATUS INFORMATION 
* 
* 
	IFF	STAT=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
	EJECT
* 
* 
*	BASIC RECEIVE MODE
* 
*	ENTERED EVERY TIME A MESSAGE
*	IS EXPECTED FROM THE MASTER SIDE
* 
* 
BRM	EQU	* 
	LDKL	A5,STB	LOAD STACKBASE 
	CM	RBCNT	CLEAR BUFFER

BRM100	EQU	*
	LD	A1,XSEL 
	RF(NZ)	BRM300	SELECTED 

	CF	A5,READP	READ ONE CHARACTER 
	RB(NZ)	BRM	PARITY ERROR

BRM101	LDR	A1,A2
	SUK	A1,STX 
	RF(Z)	BRM315	STX RECEIVED
	SUK	A1,EOT-STX 
	RF(Z)	BRM200	EOT RECEIVED
	SUK	A1,ENQ-EOT 
	ABL(Z)	BRM400	ENQ RECEIVED 
	SUK	A1,DLE-ENQ 
	ABL(Z)	BRM600	DLE RECEIVED 
	SUK	A1,NAK-DLE 
	ABL(Z)	BRM500	NAK RECEIVED 
	LD	A1,XSEL 
	RF(NZ)	BRM300	SELECTED 
	LDR	A8,A2
	CF	A5,READP	READ ONE CHARACTER 
	RB(NZ)	BRM	PARITY ERROR
	CWR	A2,A8
	RB(NE)	BRM	INVALID ADDRESSING
	LDK	A3,0 
	CC	A2,DWDC00+1 
	RF(E)	BRM110	POLLING 
	LDK	A3,2 
	CC	A2,DWDC00 
	RB(NE)	BRM	NOT THIS TCU
BRM110	EQU	*
	CF	A5,READP	READ 1:ST STA
	RB(NZ)	BRM	PARITY ERROR
	LDR	A8,A2
	CF	A5,READP	READ 2:ND STA
	RB(NZ)	BRM	PARITY ERROR
	CWR	A2,A8
	RB(NE)	BRM	INVALID ADDRESS SEQUENCE
	CF	A5,READ	READ ONE CHARACTER
	SUK	A2,ENQ+PAR 
	RB(NZ)	BRM	NOT ENQ 
	LDK	A1,1 
	ST	A1,CACK	LOAD ACK COUNTER
	LDR	A2,A8
	SUK	A3,2 
	RF(Z)	BRM120	SELECTING 
	CWK	A8,GP
	ABL(E)	GPOLL	GENERAL POLL
	CF	A5,FINTER	CHECK IF STA PRESENT
	LDR	A6,A3	LOAD DWT TO A6 
	ABL(NZ)	SPOLL	SPECIFIC POLL
	RB	BRM	INVALID POLL
BRM120	EQU	*
	CF	A5,FINTER	CHECK IF STA PRESENT
	LDR	A6,A3	LOAD DWT TO A6 
	RF(NZ)	BRM130	STA FOUND
	LDKL	A6,DWDC00	SELECT TO DCTASK
BRM130	EQU	*
	ABL	SELECT 
	EJECT
* 
* 
*	EOT HAS BEEN RECEIVED 
* 
* 
BRM200	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	LD	A1,XACK 
	RF(Z)	BRM220	ACK IS NOT EXPECTED 
	LD	A6,FDWTUT	GET WRITING DWT 
	RF(Z)	BRM210	NO ONE WRITING
	LDK	A1,2	SET RC=2
	CF	A5,CWRITE	COMPLETE WRITE REQUEST
BRM210	EQU	*
	CM	XACK	RESET 'ACK EXPECTED' 
BRM220	EQU	*
	CM	XSEL	RESET 'SELECTED' 
	RB	BRM 
	EJECT
* 
* 
*	TEXT IS EXPECTED
* 
* 
BRM300	EQU	*
	CF	A5,HPTIM
	IFT	BDKSP=1		**********
	LD	A1,DCRBUF	ANY BUFFER FREE ? 
	RF(NZ)	BRM305	BUFFER AVAILABLE 
	CF	A5,DUMRD	DUMMY READ 
	ABL	BRM
BRM305	EQU	*
	XIF			********** 
	CF	A5,RDMESS	READ MESSAGE
	SUK	A7,1 
	RF(NZ)	BRM320	MESSAGE OK 
	LD	A2,INITCH	CHECK INIT CHARACTER
	CWK	A2,STX 
	RF(E)	BRM310	STX OK

	LD	A2,TERMCH	NOT STX, GET TERM CHAR
	RB	BRM101

BRM310	EQU	*
	CM	XSTA	INDICATE 'INVALID MESSAGE' 
BRM312	EQU	*
	CF	A5,TRNAK	SEND NAK 
	IFT	BDKSP=1		**********
	CM	LSEL	IND.MESS NOT OK
	XIF			********** 
	RB	BRM 
BRM315	EQU	*
	IFT	RCOM=1 
	LD	A1,XACK 
	RF(Z)	BRM316	ACK IS NOT EXPECTED 
	LD	A1,DCRBUF 
	RF(Z)	BRM316	NO BUFFER AVAILABLE 
	LD	A6,FDWTUT	GET WRITING DWT 
	LDR*	A2,A6	GET STA 
	CF	A5,PRREC	PREPARE FOR TEXT RECEPTION 
	LDK	A1,0	SET RC=0
	CF	A5,CWRITE	COMPLETE WRITE REQUEST
	LDK	A1,1 
	XRS	A1,CACK	INCREASE ACK COUNTER 
	RB	BRM305	READ THE MESSAGE 
	XIF
BRM316	CF	A5,READ	READ ONE CHARACTER
	SUK	A2,ENQ+PAR 
	RB(Z)	BRM312	FORWARD ABORT SEQUENCE
	RB	BRM220
BRM320	EQU	*
	IM	XSTA	INDICATE MESSAGE OK
	LD	A4,DCRBUF	GET BUFFER ADDRESS
	ADK	A4,6 
	CW	A4,FBLST
	RF(NE)	BRM325	NOT FIRST BLOCK
	IFF	RCOM=0 
	LDK	A1,ESC 
	CCR	A1,A4
	RB(NE)	BRM310	ESC NOT FOUND
	ADK	A4,1 
	LCR	A1,A4	GET COMMAND CODE 
	SUK	A4,1 
	SUK	A1,RDBCOM
	RF(Z)	BRM350	READ MODIFIED RECEIVED
	SUK	A1,RDMCOM-RDBCOM 
	RF(Z)	BRM350	READ BUFFER RECEIVED
	XIF
BRM325	EQU	*
	SUK	A7,1 
	RF(Z)	BRM340	MESSAGE ENDED BY ETB
	CM	XSEL
	CF	A15,GRBUF	ALLOCATE RECEIVE BUFFER 
	ADK	A4,6 
	LD	A6,FDWTIN	GET INPUT DWT 
* 
*	PREPARE FOR CHAINED COMMAND 
* 
	IFT	RCOM=1 
	LDR*	A2,A6 
	LC	A2,TEBCDIC,A2 
	LD	A1,DCRBUF 
	RF(Z)	BRM326 
	ST	A2,+4,A1
	XIF
BRM326	EQU	*
	CWK	A6,DWDC00
	RF(E)	BRM330	MESSAGE IS MENT FOR DCTASK
	LD	A2,DWTST,A6	GET STATUS
	RF(N)	BRM329	NO REQUEST
	LDK	A2,2 
	CW	A2,DWTOR,A6 
	RF(NE)	BRM329	NO READ REQUEST
BRM327	EQU	*
	LDK	A1,0	SET RC=0
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	ST	A4,ECBBA,A8	STORE BUFFER ADDRESS
	LD	A3,-4,A4	GET LENGTH 
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
	CF	A15,CTIME	STOP REQUEST TIMING 
	ST	A2,ECBCW,A8	STORE REMAINING TIME
	EJECT
* 
* 
*	CHECK IF START PRINTER BIT SET IN CCC/WCC 
* 
* 
	IFT	STAT=1 
	LC	A2,+2,A4	GET WCC/CCC
	ANK	A2,/FF 
	LC	A2,TEBCDI,A2	TRANSLATE
	ANK	A2,8 
	RF(Z)	BRM328 
	LD	A2,DWTST,A6	GET STATUS
	ORK	A2,/A
	ST	A2,DWTST,A6 
BRM328	EQU	*
	XIF
	CF	A15,TENDIO	COMPLETE REQUEST 
	RF	BRM345
BRM329	EQU	*
	LDR*	A2,A6	GET CURRENT STA 
	LDR	A7,A4	SAVE A4
	CF	A5,FINTER	SEARCH IF ANY OTHER TASK ON READ
	LDR	A4,A7	RESTORE A4 
	LDR	A6,A3	GET DWT
	RF(Z)	BRM330	NOT FOUND 
	LD	A2,DWTST,A6 
	RF(N)	BRM330	NO REQUEST
	LDK	A2,2 
	CW	A2,DWTOR,A6 
	RB(E)	BRM327	ANOTHER READ TASK FOUND 
	EJECT
BRM330	EQU	*
	IFT	BDKSP=1		*********** 
	ST	A6,LSEL	IND.LAST DEV.REC.CORRECT MESS.; 
	XIF			+**********
	SUK	A4,6	GET BUFFER BASE 
	CF	A5,QRBUF	QUEUE BUFFER FOR DCTASK
	CF	A15,CKMESS	COMPLETE DCTASK READ IF ANY
BRM340	EQU	*
* 
*	DELAY ACK FOR 3270 INTERNAL PROCESSING
* 
	IFT	STAT=1 
	CF	A15,SETIME
	DATA	BRM341,2
	ABL	TDISP
BRM341	EQU	*
	LDKL	A5,STB
	XIF
	CF	A5,TRACK	SEND ACK 0/1 
	ABL	BRM
BRM345	EQU	*
	IFT	STAT=1 
	LD	A1,DWTST,A6 
	ANK	A1,8 
	RB(Z)	BRM340	ACK SHOULD BE SENT
	CF	A5,TRWACK	SEND WACK 
	RF	BRM410
	XIF
	IFF	STAT=1 
	RB	BRM340
	XIF
	IFT	BDKSP=1		**********
	EJECT
*	
*	
*	DUMMY READ NO REC.BUF AT TIME SELECTION 
*	OR MESSAGE ALREADY RECIEVED 
* 
DUMRD	EQU	* 
	CF	A5,READ 
	RTN	A5 
	XIF			********** 
	EJECT
* 
* 
*	READ MODIFIED OR READ BUFFER RECEIVED 
* 
* 
	IFF	RCOM=0 
BRM350	EQU	*
	CM	XSEL	RESET 'SELECTED' 
	LD	A6,FDWTIN	GET DWT FOR ADDRESSED TERMINAL
	LD	A4,DWTBA,A6	GET LAST WRITE BUFFER ADDRESS 
	LD	A3,DWTRL,A6	GET LAST REQUESTED LENGTH 
	CM	FDWTUT
	LDK	A1,1 
	XRS	A1,CACK	INCREMENT ACK COUNTER
	ABL	POL127 
	XIF
* 
* 
*	ENQ HAS BEEN RECEIVED 
* 
* 
BRM400	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	CF	A5,TRREP	REPEAT LAST CONTROL SEQUENCE 
BRM410	EQU	*
	ABL	BRM
	EJECT
* 
* 
*	NAK HAS BEEN RECEIVED 
* 
* 
BRM500	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	LD	A1,XACK 
	RF(Z)	BRM636	ACK NOT EXPECTED
	LD	A6,FDWTUT	GET WRITING DWT 
	IFF	STAT=0 
	LD	A1,XSTA 
	ABL(NZ)	POL050	STATUS HAS BEEN TRANSMITTED 
	XIF
	LD	A1,FBLST	GET START POINT FOR LAST BLOCK 
	SU	A1,FECBBA	COMPUTE BUFFER INDEX
	ST	A1,FBAX 
	ABL	POL130 
* 
* 
*	DLE HAS BEEN RECEIVED 
* 
* 
BRM600	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	LD	A1,XACK 
	RB(Z)	BRM410	ACK NOT EXPECTED
	CF	A5,READ	READ SECOND CHARACTER 
	CWK	A2,ACK0+PAR
	RF(NE)	BRM620
* 
*	ACK , 0 RECEIVED
* 
	LD	A1,CACK	GET ACKCOUNTER
	RF(Z)	BRM630	ACK,0 EXPECTED
BRM610	EQU	*
	IFF	BDKSP=1		********* 
	CF	A5,TRENQ	SEND ENQ 
	XIF			******** 
	CF	A5,SPTIM	START PROCEDURE TIMER
	RB	BRM410
BRM620	EQU	*
	CWK	A2,ACK1
	RF(NE)	BRM650
* 
*	ACK , 1 RECEIVED
* 
	LD	A1,CACK	GET ACK COUNTER 
	RB(Z)	BRM610	ACK,1 NOT EXPECTED
BRM630	EQU	*
	LD	A1,XETX 
	RF(Z)	BRM640	ETX NOT SENT
	EJECT
* 
*	ACK HAS BEEN RECEIVED TO AN ETX BLOCK 
* 
	LDK	A1,0	SET RC=0
BRM635	EQU	*
	IFF	STAT=0 
	LD	A2,XSTA 
	RF(NZ)	BRM670	STATUS HAS BEEN TRANSMITTED
	XIF
	CF	A5,CWRITE	COMPLETE WRITE REQUEST
BRM636	EQU	*
	IFF	BDKSP=1		*********** 
	CF	A5,TREOT	SEND EOT 
	XIF			********** 
	RB	BRM410
BRM640	EQU	*
	LDK	A1,1 
	XRS	A1,CACK	INCREMENT ACK COUNTER
	ABL	POL130 
BRM650	EQU	*
	CWK	A2,RVI+PAR 
	RB(NE)	BRM610	INVALID DLE SEQUENCE 
	CM	XACK	RESET 'EXPECTING ACK'
	LD	A1,XETX 
	RF(NZ)	BRM660	ETX HAS BEEN SENT
	LDK	A1,2	SET RC=2
	RB	BRM635
BRM660	EQU	*
	LDK	A1,0	SET RC=0
	RB	BRM635
	IFF	STAT=0 
	EJECT
* 
* 
*	STATUS HAS BEEN TRANSMITTED 
* 
* 
BRM670	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)	BRM636	NOT DE
	LDKL	A1,/8000
	ANS	A1,DWTST,A6	CLEAR STATUS 
	RB	BRM636
	XIF
	EJECT
* 
* 
*	SELECT HAS BEEN RECEIVED
* 
* 
SELECT	EQU	*
	IFT	BDKSP=1		*********** 
	CW	A6,LSEL	MESS.REC.EARLIER ?
	RF(NE)	SEL110	NO 
	CF	A5,DUMRD
	CF	A5,TRACK
	RF	SEL100
	XIF			*********
	IFF	STAT=0 
	LD	A1,DWTST,A6	GET STATUS
	LDR	A3,A1
	ANK	A1,1 
	RF(Z)	SEL110	NO PENDING STATUS 
	CF	A5,TRRVI	SEND RVI 
	XIF
	IFF	STAT=1 
	RF	SEL110
	XIF
SEL100	EQU	*
	ABL	BRM
SEL110	EQU	*
	IFF	STAT=0 
	ANK	A3,8 
	RF(NZ)	SEL115	BUSY 
	XIF
	LD	A1,DCRBUF 
	RF(NZ)	SEL120	BUFFER AVAILABLE 
SEL115	EQU	*
	IFF	BDKSP=1		**********
	CF	A5,TRWACK	SEND WACK 
	XIF			********** 
	RB	SEL100
SEL120	EQU	*
	CF	A5,PRREC	PREPARE FOR TEXT RECEPTION 
	IFF	BDKSP=1		**********
	CF	A5,TRACK	SEND ACK,0 
	XIF			********** 
	IFT	BDKSP=1		*********** 
	LDK	A2,1 
	XRS	A2,CACK
	XIF			********** 
	RB	SEL100
	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
	SC	A2,+4,A1	SAVE STA IN BUFFER 
	IM	XSTA
	ST	A6,FDWTIN	STORE INPUT DWT 
	RTN	A5 
	EJECT
* 
* 
*	GENERAL POLL HAS BEEN RECEIVED
* 
* 
GPOLL	EQU	* 
	CF	A5,CPTIM	CHECK POLL TIMER 
	IFT	BDKSP=1		**********
	CM	LSEL	IND.DEV.FREE FOR NEW SEL.
	XIF			*********
	IFF	STAT=0 
	LD	A6,DCSTQ	 
	RF(Z)	POL110	NO STATUS TO BE SENT
	SUK	A6,DWTSQ	GET DWT ADDRESS 
POL050	EQU	*
	CF	A5,TRSTA	SEND STATUS
	CF	A5,SPTIM	START PROCEDURE TIMER
	IM	XACK	SET 'ACK EXPECTED' 
	XIF
	IFF	STAT=1 
	RF	POL110
	XIF
POL100	EQU	*
	ABL	BRM
POL110	EQU	*
	LD	A6,DCWRQ
	RF(NZ)	POL120	WRITE ON QUEUE 
POL115	EQU	*
	CF	A5,TREOT	SEND EOT 
	RB	POL100
POL120	EQU	*
	SUK	A6,DWTWQ	GET DWT ADDRESS 
POL125	EQU	*
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	RF(NZ)	POL126
	CF	A15,REMOVW
	RB	POL115
POL126	EQU	*
	ST	A8,FECB	SAVE ECB ADDRESS
	ST	A6,FDWTUT	SAVE A6 
	LD	A4,ECBBA,A8	GET BUFFER ADDRESS
	LD	A3,ECBRL,A8	GET LENGTH
	IFT	RCOM=1 
	ST	A4,DWTBA,A6	REMEMBER BUFFER ADDRESS 
	ST	A3,DWTRL,A6	REMEMBER LENGTH 
	XIF
POL127	EQU	*
	ST	A4,FECBBA	SAVE BUFFER ADDRESS 
	SUK	A3,2	SKIP FIRST WORD OF BUFFER 
	ST	A3,FECBRL	SAVE LENGTH 
	CM	FBAX	RESET BUFFER INDEX 
POL130	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	POL100
	EJECT
* 
* 
*	SPECIFIC POLL HAS BEEN RECEIVED 
* 
* 
SPOLL	EQU	* 
	IFF	STAT=0 
	LDR	A7,A6	SAVE A6
	CF	A5,CPTIM	CHECK POLLTIMER
	LDR	A6,A7	RESTORE A6 
	LD	A1,DWTST,A6	GET STATUS
	ANK	A1,7 
	RB(NZ)	POL050	PENDING STATUS 
	LD	A1,DWTST,A6 
	RB(N)	POL115	NO REQUEST
	LD	A1,DWTOR,A6	GET ORDER 
	SUK	A1,6 
	RB(Z)	POL125	WRITE REQUEST 
	SUK	A1,2 
	RB(Z)	POL125	EXCHANGE REQUEST
	RB	POL115
	XIF
	IFF	STAT=1 
	RB	POL115
	XIF
	EJECT
* 
* 
*	CHECK IF THERE IS A WRITE 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 
	SUK	A2,6 
	RF(Z)	CWR100	WRITE REQUEST 
	SUK	A2,2 
	RF(NZ)	CWR900	NOT EXCHANGE 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	CWR150
CWR100	LD	A8,FECB	GET ECB ADDRESS 
	CF	A15,CTIME	STOP TIMING 
	LDR	A8,A8
	RF(Z)	CWR150 
	ST	A2,ECBCW,A8 
	CF	A15,TENDIO	COMPLETE REQUEST 
CWR150	EQU	*
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
CWR200	EQU	*
	IFF	TBUFL=0
	LD	A4,FECBBA	GET BUFFER ADDRESS
	CF	A15,RTBUF	RELEASE TRANSMIT BUFFER 
	CF	A15,CKGBQ	CHECK GET BUFFER QUEUE
	XIF
CWR900	EQU	*
	CM	XACK	RESET 'ACK EXPECTED' 
	CM	FDWTUT
	RTN	A5 
	EJECT
* 
* 
*	READ ONE TEXT BLOCK 
* 
*	ON EXIT A3 **AND A7** 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,5	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
RDM100	EQU	*
	LDKL	A1,RBUFL+RBUFL
	SU	A1,FBAX	CALC MAX LENGTH 
	CWK	A1,4 
	RF(L)	RDM140	BUFFER OVERFLOW 

	CF	A5,READM	READ MESSAGE 
	LC*	A7,FBLST	GET INIT CHARACTER
	ANK	A7,/7F 
	ST	A7,INITCH	AND STORE 
	LC	A7,-1,A4	GET TERM CHARACTER 
	ANK	A7,/7F 
	ST	A7,TERMCH	AND STORE 

	LDR	A2,A2
	RF(NZ)	RDM140	PARITY ERROR 

	SUK	A1,3	UPDATE INDEX
	ADS	A1,FBAX
	ADK	A1,2 


	LD	A2,LASTCH	RESTORE PREVIOUS LAST CHAR
	SC*	A2,FBLST 

	LC	A2,-3,A4	SAVE LAST CHAR 
	ST	A2,LASTCH 

	LC	A2,-2,A4	GET CHAR BEFORE LRC
	ANK	A2,/7F 

	LDK	A7,STX	CHECK INIT CHAR 
	CW	A7,INITCH 
	RF(NE)	RDM140	NOT STX
	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)	RDM140	ENQ IN TEXT RECEIVED

	RF	RDM140	SOMETHING BAD

* 
*	ETX RECEIVED
* 
RDM130	EQU	*
	LD	A7,DCRBUF	GET BUFFER ADDRESS
	LD	A2,FBAX	GET BUFFER INDEX
	ST	A2,+2,A7	STORE EFFECTIVE LENGTH IN HEADER 

	CF	A5,CKLRC	CHECK LRC
	RF(Z)	RDM150	LRC WAS OK

RDM140	EQU	*
	LDK	A3,1	INDICATE INVALID MESSAGE
RDM150	EQU	*
	LDR	A7,A3	SAVE RESULT REGISTER 
	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	*

	CF	A5,CKLRC	CHECK LRC
	RB(Z)	RDM100	LRC WAS OK
	LDK	A3,1 
	RB	RDM100
	EJECT

* 
*	CHECK LRC 
* 

CKLRC	LD	A2,FBLST 
	ADK	A2,1 
	LDK	A7,0 
	LDK	A4,0 
	ADK	A5,4 
	IM	XENB
	ENB
CKLRC1	LCR	A4,A2
	XRR	A7,A4
	ADK	A2,1 
	SUK	A1,1 
	RB(NZ)	CKLRC1
	ANK	A7,/7F 
	INH
	CM	XENB
	LD	A1,XPWF	CHECK IF POWER FAIL OCCURED 
	RF(NZ)	CKLRC2
	LDR	A7,A7
	ABR*	A5
CKLRC2	EQU	*

	CM	XPWF	POWER FAIL IN ENABLE 
	CM	XSEL
	CM	XSTA
	ABL	BRM
	EJECT


* 
*	SOME INTERESTING CHARACTERS 
* 

INITCH	DATA	0	INITIATING CHAR 
LASTCH	DATA	0	LAST TEXT CHAR
TERMCH	DATA	0	TERMINATING CHAR (NORM LRC) 
	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	STAT=0 
TRRVI	LDK	A3,RVI	LOAD RVI 
	XIF
* 
*	TRANSMIT DLE
* 
TRDLE	LDK	A2,DLE	LOAD DLE 
	SC	A2,RESEND+4	PUT INSAVE AREA 
	SC	A3,RESEND+5	
	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+4	PUT IN SAVE AREA
	LDK	A2,/FF 
	SC	A2,RESEND+5 

TRREP	LDK	A1,8
	LDKL	A4,RESEND 
	CF	A5,WRITEM 
	RTN	A5 
	EJECT
* 
* 
*	TRANSMIT ONE TEXT BLOCK 
* 
* 
TRTEXT	EQU	*

	LDK	A2,0 
	LDK	A7,0	RESET LRC 
	LD	A4,FECBBA	GET BUFFER ADDRESS
	AD	A4,FBAX	ADD BUFFER INDEX
	ST	A4,FBLST	REMEMBER START OF BLOCK
	ADK	A4,2	SKIP FIRST WORD OF BUFFER 
	LDK	A3,0	RESET CHARACTER COUNTER 
	LD	A1,FBAX	GET BUFFER INDEX
	RF(NZ)	TRT100	NOT FIRST BLOCK
	LC	A2,DWDC00+1	GET TCA 
	SC	A2,XMTBUF+5 
	XRR	A7,A2
	LDR*	A2,A6	GET STA 
	SC	A2,XMTBUF+6 
	XRR	A7,A2
	LDK	A3,2 

TRT100	LD	A1,FECBRL	CHECK LENGTH
	SU	A1,FBAX 
	ADR	A1,A3
	CWK	A1,TBLEN 
	RF(NG)	TRT110	SMALL ENOUGH 

	LDKL	A1,TBLEN	MUST BE BLOCKED
	RF	TRT120

TRT110	IM	XETX	INDICATE ETX SENT

TRT120	ST	A1,XMTLEN 
	SUR	A1,A3
	ADS	A1,FBAX
	ADKL	A3,XMTBUF+5 

TRT130	IM	XENB
	ENB
	LCR	A2,A4	MOVE MESSAGE BLOCK 
	XRR	A7,A2
	SCR	A2,A3
	ADK	A3,1 
	ADK	A4,1 
	SUK	A1,1 
	RB(NZ)	TRT130
	INH
	CM	XENB
	LD	A1,XPWF	CHECK IF POWER FAIL OCCURED 
	RF(Z)	TRT135	NO

	CM	XPWF	POWER FAIL IN ENABLE 
	ABL	BRM

TRT135	LDK	A2,ETX 
	LD	A1,XETX 
	RF(NZ)	TRT140	ETX BLOCK
	LDK	A2,ETB	ETB BLOCK 

TRT140	XRR	A7,A2
	SCR	A2,A3	STORE ETB/ETX
	SC	A7,1,A3	AND LRC 
	LDK	A2,/FF 
	SC	A2,2,A3	AND PAD 
	SC	A2,3,A3 

	LD	A1,XMTLEN 
	ADK	A1,9 

	LDKL	A4,XMTBUF 

	CF	A5,WRITEM	WRITE MESSAGE 
	RTN	A5 


XMTLEN	DATA	0 
XMTBUF	DATA	/1616,/1616,/0200 
	RES	TBLEN	TOO MANY BYTES 
	EJECT
* 
* 
*	TRANSMIT STATUS MESSAGE 
* 
* 
	IFF	STAT=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 
	LDK	A7,0	REST LRC
	LDK	A2,'%' 
	CF	A5,WRITEP	SEND '%'
	LDK	A2,'R' 
	CF	A5,WRITEP	SEND 'R'
	LDK	A2,STX 
	CF	A5,WRITE	SEND STX 
	LC	A2,DWDC00+1 
	CF	A5,WRITEP	SEND TCA
	LDR*	A2,A6 
	CF	A5,WRITEP	SEND STA
	LD	A1,DWTST,A6	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,A6	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

* 
*	READP   READ CHARACTER AND CHECK PARITY 
* 
*	EXIT
*	A1:  DESTR
*	A2:  CHARACTER
*	CR:  Z=OK, NZ= PARITY ERR 
* 

READP	CF	A5,READ
READP1	ANK	A2,/7F 
	ADKL	A5,4
	LD	A1,SLCUST 
	ABR*	A5
	EJECT

* 
*	READ  READ CHARACTER
* 
*	EXIT
*	A1:  DESTR
*	A2:  CHARACTER
* 

READ	LD	A1,RBCNT
	RF(Z)	READ10 

	LC*	A2,RBPNT 
	ANK	A2,/FF 
	IM	RBPNT 
	SUK	A1,1 
	ST	A1,RBCNT
	RTN	A5 

READ10	LDK	A1,100 
	ST	A4,A4SAV+2
	LDKL	A4,RECBUF 
	ST	A4,RBPNT
	CF	A5,READM
	CWK	A1,100 
	RB(E)	READ10 
	ST	A1,RBCNT
A4SAV	LDKL	A4,0 
	RB	READ

RBCNT	DATA	0
RBPNT	DATA	0
RECBUF	RES	50 
	EJECT

* 
*	READM   READ MESSAGE
* 
*	ENTRY 
*	A1:  MAX LENGTH 
*	A4:  BUFFER ADDRESS 
* 
*	EXIT
*	A1:  EFFECTIVE LENGTH 
*	A2:  STATUS 
*	A4:  ADDRESS AFTER MESSAGE
*	CR:  Z=OK, NZ= PARITY ERR, BUFF OVFLO 
* 

READM	WER	A1,SLCU+SLCU
	WER	A4,SLCU+SLCU+1 

	LDK	A1,/8D 
	CF	A5,STARTR 

	RER	A2,SLCU+SLCU+1 
	LDR	A1,A2
	SUR	A1,A4
	RF(NZ)	*+4 
	RF	HERROR	BAD HARDWARE 
	LDR	A4,A2
	ADKL	A5,4
	LD	A2,SLCUST 
	ABR*	A5
	EJECT

* 
*	STARTR   START RECIEVER 
* 
*	ENTRY 
*	A1:  START CODE 
* 
*	EXIT
*	A1,A2: DESTR
* 

STARTR	CF	A15,STREG 
	CIO	A1,1,SLCU
	RF(A)	STAR10 
	SST	A2,SLCU
	RF(A)	*+4
	RF	HERROR	BAD HARDWARE 
	CIO	A1,1,SLCU
	RF(A)	*+4
	RF	HERROR	BAD HARDWARE 
STAR10	LDK	A1,SYN 
	OTR	A1,1,SLCU
	RF(A)	*+4
	RF	HERROR	BAD HARDWARE 
	ABL	TDISP
	EJECT

* 
*	WRITEM   WRITE MESSAGE
* 
*	ENTRY 
*	A1:LENGTH 
*	A2:  BUFFER ADDRESS 
* 
*	EXIT
*	A1,A2:  DESTR 
* 

WRITEM	ORKL	A1,/4000
	WER	A1,SLCU+SLCU 
	WER	A4,SLCU+SLCU+1 
	LDK	A1,/0C 
	CF	A15,STREG 
	CIO	A1,1,SLCU
	RF(A)	WRITEX 
	SST	A2,SLCU
	RF(A)	*+4
	RF	HERROR	BAD HARDWARE 
	CIO	A1,1,SLCU
	RF(A)	*+4
	RF	HERROR	BAD HARDWARE 
WRITEX	ABL	TDISP
	EJECT

* 
*	SLCU INTERRUPT HANDLER
* 

IHSLCU	ST	P,INTSAV
	CF	A15,SAVE8 
	CF	A15,LDREG 
	SST	A1,SLCU
	RF(A)	*+4
	RF	HERROR	BAD HARDWARE 
	ST	A1,SLCUST 
	ST	A1,DCSTCU 
	ANK	A1,/FB 
	RF(NZ)	IHERR	SOMETHING BAD 
	RTN	A5 

IHERR	CF	A15,CKMESS	CHECK IF STATUS CHANGE
	ABL	BRM

SLCUST	DATA	0	LAST STATUS 
	EJECT

* 
*	HARDWARE ERROR RETURN CODE = /0081
* 

HERROR	LDK	A1,1	DISCONNECT
	CIO	A1,0,SLCU

	LDK	A1,/81 
	CF	A15,CKMESS	IND HARD ERR, NOT OPERABLE 

	CF	A15,SETIME	WAIT 0,5 SECONDS 
	DATA	HERR10,5
	ABL	TDISP

HERR10	ABL	BRM
	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	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
* 
* 
DRDCON	CF	A15,SAVE8	SAVE A1 - A8
	IFT	STAT=1 
	LDK	A5,4	SET DEVICE END
	LD	A1,DCTAB
	AD*	A1,DCTAB	GET ADDRESS TO END OF TABLE 
DRDC05	SUK	A1,2 
	CW	A1,DCTAB
	RF(E)	DRDC06	END OF TABLE
	LDR*	A6,A1	GET DWT ADDRESS 
	ORS	A5,DWTST,A6	STORE DEVICE END FOR DEVICE
	CF	A15,INSSQ	INSERT IN STATUS QUEUE
	RB	DRDC05
DRDC06	EQU	*
	XIF
	LD	A2,DCTPGP	GET POLL TIMER POINTER
	RF(NZ)	DRDC20	ALREADY STARTED
DRDC10	CF	A15,SPOTIM	START POLL TIMER 
DRDC20	LD	A1,XENB	WAS DRIVER IN ENABLE MODE 
	ABL(Z)	BRM	NO
	IM	XPWF	YES INDICATE POWER FAIL
	ABL	TDISP
	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	CHECK IF STATUS CHANGE 
	CF	A15,SPOTIM	START POLL TIMER 
	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	CF	A15,SETIME	START TIMER
	DATA	PTOUT,TIMPOL
	ST	A4,DCTPGP	STORE TIMER POINTER 
	ADKL	A15,4 
	ABR*	A15 
	EJECT
* 
*	START PROCEDURE TIMER 
* 
SPTIM	EQU	* 
	IFF	BDKSP=1		*********** 
	LDR	A1,A6	LOAD DWT AS PARAMETER
	CF	A15,SETIME
	DATA	PRTOUT,TIMPRO 
	ST	A4,DCTPP	SAVE TIMER POINTER 
	XIF			***********
	RTN	A5 
* 
*	PROCEDURE TIMEOUT 
* 
PRTOUT	CM	DCTPP 
	LDR	A6,A1	RELOAD A6
	LDKL	A5,STB	LOAD STACK BASE
	LD	A1,XACK 
	RF(Z)	PRT10	ACK NOT EXPECTED 
	LDK	A1,0 
	CIO	A1,0,SLCU
	SST	A1,SLCU
	RF(A)	*+4
	RB	HERROR	BAD HARDWARE 
	IFF	BDKSP=1		*********** 
	CF	A5,TRENQ	SEND ENQ 
	XIF			********** 
	CF	A5,SPTIM	START PROCEDURE TIMER
	ABL	BRM

PRT10	RB	HERROR	BAD HARDWARE
	EJECT
* 
*	STOP PROCEDURE TIMER
* 
HPTIM	LD	A1,DCTPP	GET TIMER POINTER 
	RF(Z)	HPT10	NOT RUNNING
	CM*	DCTPP	STOP TIMER 
	CM	DCTPP 
HPT10	RTN	A5
	IFT	CODE=1 
	EJECT
* 
* 
*	CALCULATION OF CRC
* 
*	A2 = CHARACTER
*	A7 = ACCUMULATED CRC
* 
* 
CRCCAL	EQU	*
	ST	A1,CRCSAV 
	ST	A2,CRCSAV+2 
	ST	A3,CRCSAV+4 
	LDK	A1,8 
CRC100	LDR	A3,A7
	SRL	A7,1 
	XRR	A3,A2
	SRL	A2,1 
	ANK	A3,1 
	RF(Z)	CRC110 
	XRKL	A7,/A001
CRC110	SUK	A1,1 
	RB(NZ)	CRC100
	LD	A1,CRCSAV 
	LD	A2,CRCSAV+2 
	LD	A3,CRCSAV+4 
	RTN	A5 
CRCSAV	RES	3
	EJECT
* 
* 
*	READ CRC CHARACTERS AND CHECK THEM
*	CR = (E) IF CRC WAS OK
* 
* 
RDCRC	LDR	A6,A7	SAVE CURRENT CRC
	IM	SYNSW	DO NOT SKIP SYNCS NOW 
	CF	A5,READ	READ BYTE 1 
	LD	A8,CRCSAV+2	SAVE IT 
	CF	A5,READ	READ BYTE 2 
	CM	SYNSW	SYNCS CAN BE SKIPPED AGAIN
	LD	A2,CRCSAV+2	SAVE IT 
	SLL	A2,8 
	XRR	A2,A8
	ADK	A5,4 
	CWR	A2,A6	COMPARE RECEIVED WITH COMPUTED 
	ABR*	A5
* 
SYNSW	DATA	0	0= SKIP SYNC CHARACTERS
*			1= DO NOT SKIP SYNC CHARS, BECAUSE IT BELONGS TO BCC
	EJECT
* 
* 
*	TABLE FOR CONVERSION OF EBCDIC CODE TO ASCII
* 
* 
TASCII	EQU	*
	DATA	/7F01,/0203,/0009,/0000	00-07 
	DATA	/0000,/0000,/0C00,/0000	08-0F 
	DATA	/1011,/1213,/000A,/0000	10-17 
	DATA	/0019,/0000,/1C1D,/1E1F	18-1F 
	DATA	/0000,/0000,/0000,/171B	20-27 
	DATA	/0000,/0000,/0005,/0000	28-2F 
	DATA	/0000,/1600,/0000,/0004	30-37 
	DATA	/0000,/0000,/1415,/001A	38-3F 
	DATA	/2041,/4243,/4445,/4647	40-47 
	DATA	/4849,/5B2E,/3C28,/2B21	48-4F 
	DATA	/264A,/4B4C,/4D4E,/4F50	50-57 
	DATA	/5152,/5D24,/2A29,/3B5E	58-5F 
	DATA	/2D2F,/5354,/5556,/5758	60-67 
	DATA	/595A,/7C2C,/255F,/3E3F	68-6F 
	DATA	/1831,/3233,/3435,/3637	70-77 
	DATA	/3839,/3A23,/4027,/3D22	78-7F 
	DATA	/2061,/6263,/6465,/6667	80-87 
	DATA	/6869,/5B2E,/3C28,/2B21	88-8F 
	DATA	/266A,/6B6C,/6D6E,/6F70	90-97 
	DATA	/7172,/5D24,/2A29,/3B5E	98-9F 
	DATA	/2D2F,/7374,/7576,/7778	A0-A7 
	DATA	/797A,/7C2C,/255F,/3E3F	A8-AF 
	DATA	/3031,/3233,/3435,/3637	B0-B7 
	DATA	/3839,/3A23,/4027,/3D22	B8-BF 
	DATA	/2041,/4243,/4445,/4647	C0-C7 
	DATA	/4849,/5B2E,/3C28,/2B21	C8-CF 
	DATA	/264A,/4B4C,/4D4E,/4F50	D0-D7 
	DATA	/5152,/5D24,/2A29,/3B5E	D8-DF 
	DATA	/2D2F,/5354,/5556,/5758	E0-E7 
	DATA	/595A,/7C2C,/255F,/3E3F	E8-EF 
	DATA	/3031,/3233,/3435,/3637	F0-F7 
	DATA	/3839,/3A23,/4027,/3DFF	F8-FF 
	XIF
	EJECT
	IFF	CODE+RCOM=0
* 
* 
*	TABLE FOR CONVERSION OF ASCII CODE TO EBCDIC
* 
* 
TEBCDIC	EQU	* 
	DATA	/0001,/0203,/372D,/0000	00-07 
	DATA	/0005,/1500,/0C00,/0000	08-0F 
	DATA	/1011,/1213,/3C3D,/3226	10-17 
	DATA	/7019,/3F27,/1C1D,/1E1F	18-1F 
	DATA	/404F,/7F7B,/5B6C,/507D	20-27 
	DATA	/4D5D,/5C4E,/6B60,/4B61	28-2F 
	DATA	/F0F1,/F2F3,/F4F5,/F6F7	30-37 
	DATA	/F8F9,/7A5E,/4C7E,/6E6F	38-3F 
	DATA	/7CC1,/C2C3,/C4C5,/C6C7	40-47 
	DATA	/C8C9,/D1D2,/D3D4,/D5D6	48-4F 
	DATA	/D7D8,/D9E2,/E3E4,/E5E6	50-57 
	DATA	/E7E8,/E94A,/005A,/5F6D	58-5F 
	DATA	/0081,/8283,/8485,/8687	60-67 
	DATA	/8889,/9192,/9394,/9596	68-6F 
	DATA	/9798,/99A2,/A3A4,/A5A6	70-77 
	DATA	/A7A8,/A91C,/6A00,/0000	78-7F 
	XIF
	EJECT
* 
* 
*	DEVICE WORK TABLE FOR DCTASK
* 
* 
DWDC00	EQU	*	TABLE ENTRY
	DATA	0	CU LINE ADDRESS 
	DATA	/8000	STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	DCADDC	POINTER TO ADDRESS BLOCK 
	DATA	0	TTAB ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TASK QUEUE
	DATA	0	TIMER POINTER 
	DATA	0	WRITE QUEUE OR BUFFER QUEUE 
	EJECT
* 
* 
*	DC RECEIVE BUFFER POOL
* 
* 
DCRBUF	EQU	*
	DATA	BUF1	POINTER TO FIRST FREE BUFFER 
BUF1	DATA	BUF2	POINTER TO NEXT FREE BUFFER
	RES	RBUFL+3	BUFFER AREA 1
BUF2	DATA	0	END OF CHAIN
	RES	RBUFL+3	BUFFER AREA 2
* 
* 
*	DC TRANSMIT BUFFER POOL 
* 
* 
DCTBUF	EQU	*
* 
* 
	IFF	TBUFL=0
	DATA	BUF3	POINTER TO FIRST FREE BUFFER 
BUF3	DATA	BUF4	POINTER TO NEXT FREE BUFFER
	RES	TBUFL	BUFFER AREA 3
BUF4	DATA	0	END OF CHAIN
	RES	TBUFL	BUFFER AREA 4
	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
* 
* 
* 
	END

Full view