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

⟦81bc2b223⟧

    Length: 66490 (0x103ba)
    Notes: pts_type(SC)
    Names: »DRDC15.SC«

Derivation

└─⟦71472ef1e⟧ Bits:30009661 Philips computer tape "600103"
    └─⟦this⟧ »BDKMON/DRDC15.SC« 

PTS(SC)

	IDENT DRDC15 	REL 8.3 82-12-16 DK 870105040830 

			DK5, FIXED READ MODIFIED MESSAGE 
			      FOR KOMMUNEDATA
			CORRECTION OF SSTAT. 
			DK4, SKIP CHAR 06 (USM=2F) 
			DK3, STRIPPED STATUS HANDLING
			DK2, EXTENDED DWT/ONLY STATUS LP 
			DK1, SEND CLEAR TO READ MODIF
			=4, ASCII-MODE FOR SALCUZ
			REL 8.3 79-07-19 
			=3, ACK IN CONVERSATIONAL MODE 
			REL 8.3 79-07-19 
			=2, INCOMPLETE POLL SEQUENCE 
			REL 8.3 79-06-25 
			=1, RETRANSMISSION ON ENQ RESPONSE 
			    ENQ EMBEDDED IN RECEIVED MESSAGE 
			REL 8.2 78-09-15 
			IBM-3270 EMULATION 
			REL 8.1 78-08-25 
			MESSAGE QUEUING ON TERMINALS 
			REL 8.1 78-06-21 
			PTS 6805 ADAPTION
			MSV1. UNDEFINED ADDRESS
			REL 8.1 78-06-16 
			TRANSFER PARAM WHEN POLL ON
			REL 8.1 78-05-18 
			BINARY TRANSMISSION
			REL 8.1 78-04-21 

********************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRDC15: DRIVER DATA COMMUNICATION 
*           BSC MULTIPOINT LINE PROCEDURE 
*           OR SIEMENS MSV1 
* 
* 
* 
* 
* 
****************************************************
	EJECT
* 
* 
*	ENTRY POINTS
* 
* 
	ENTRY	DC15AD	ADDRESS BLOCK TERMINAL REQUESTS 
	ENTRY	IH1501	INPUT INTERRUPT 
	ENTRY	IH1502	OUTPUT INTERRUPT
	ENTRY	DC15ON	POWER ON ROUTINE
	ENTRY	DW1500	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	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	TEBCDIC	ASCII TO EBCDIC TABLE
	EXTRN	TASCII	EBCDIC TO ASCII TABLE 
	EJECT
* 
* 
* 
* 
*   STANDARD INTERFACE PART FOR DATA COMMUNICATION
* 
* 
* 
* 
*	DWT CONTENTS
* 
*	DWTCHP	TERMINAL ADDRESS AS GIVEN AT PARAMETER TRANSFER (BIT #08-#15)
* 
*	DWT DISPLACEMENTS 
* 
DWTTP	EQU	/10	TIMER POINTER ORDER PROCESS 
DWTWQ	EQU	/12	WRITE/GET BUFFER QUEUE
DWTSQ	EQU	/14	STATUS QUEUE
DWTRQ	EQU	/16	RECEIVE QUEUE 
DWTBUF	EQU	/18	DEVICE BUFFER ADDRESS
DWTCUR	EQU	/1A	CURSOR ADDRESS 
DWTINF	EQU	/1C	DEVICE INFORMATION,0=VDU,1=LP	DK2
* 
*	ECB DISPLACEMENTS 
* 
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
******************************************************* 
* 
*	PARAMETERS FOR CONDITIONAL ASSEMBLY 
* 
* 
X:A	EQU	1150	RECEIVE BUFFER LENGTH
RBUFL	EQU	X:A 
X:B	EQU	0	TRANSMIT BUFFER LENGTH
TBUFL	EQU	X:B 
X:C	EQU	/60	DCTASK FILE CODE
DC15FC	EQU	/60
X:D	EQU	0	IF 1 INTERRUPT LOGGING
LOGG	EQU	X:D
X:E	EQU	600	POLL TIMEOUT VALUE
TIMPOL	EQU	X:E
X:F	EQU	1	STATUS AND RVI HANDLING IF=0
STAT	EQU	X:F
X:G	EQU	1	READ COMMAND HANDLING IF=1
RCOM	EQU	X:G
X:H	EQU	254	TRANSMIT BLOCK LENGTH 
TBLEN	EQU	X:H 
X:I	EQU	1	CODE , 0=ASCII , 1=EBCDIC 
CODE	EQU	X:I
X:J	EQU	0	IF 1 SPECIFIC POLL HANDLING 
SPECP	EQU	X:J 
X:K	EQU	1	IF = 1  LINE SPEED SET TO HIGH
			IF = 0  LINE SPEED IS SET TO LOW 
SPEED	EQU	X:K 
X:L	EQU	0	IF 1 SIEMENS MSV1 PROCEDURE 
MSV1	EQU	X:L
X:M	EQU	2	NUMBER OF RECEIVE BUFFERS (2-5) 
RBUFNR	EQU	X:M
X:N	EQU	0	IF = 1  PTS 6815 ADAPTION	SALCUZ
P6805	EQU	X:N 
X:O	EQU	/0A 
	IFT	P6805=0
LCUIN	EQU	X:O	DEVICE ADDRESS OF RECEIVER
	XIF
	IFT	P6805=1
LCUIN	EQU	/0A	DEVICE ADDRESS OF RECEIVER
	XIF
X:P	EQU	0 
IBMCHR	EQU	X:P	IF 1 IBM CHARACTER HANDLING
X:Q	EQU	1	IF 1 MESSAGE PASSING TO DC TASK 
MESPAS	EQU	X:Q
X:R	EQU	0	IBM-3270 EMULATION PACKAGE, IF NOT = 0
EM3270	EQU	X:R
SSTAT	EQU	1		DK3
			IF 0, ONLY RVI HANDLING (SPECIAL)
			IF 1, STRIPPED STATUS HANDLING (LP)	DK3
BINTRM	EQU	0	IF 1 BINARY TRANSMISSION 
TSTREQ	EQU	0	IF 1 TEST REQUEST HANDLING 
DMRK	EQU	0	SPECIAL CONDITION FOR DENMARK
NOWACK	EQU	0	WHEN WORKING WITH A MAIN-FRAME THAT
			DOESN'T ACCEPT WACK RESPONSE TO A SELECT 
			SEQUENCE, NOWACK SHOULD BE SET TO "ONE". 
			ONLY WORKING IF STAT IS SET TO "ONE".
	IFT	P6805=0		SALCUZ
LCUUT	EQU	LCUIN+/10	DEVICE ADDRESS OF TRANSMITTER	SALCUZ
	XIF			SALCUZ 
	IFT	P6805=1
LCUUT	EQU	LCUIN+/01	DEVICE ADDRESS OF TRANSMITTER	SALCUZ
	XIF			SALCUZ 
	EJECT
* 
*	REQUEST HANDLING
* 
* 
* 
*	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
DC15DC	DATA	DCACTD	ADDRESS BLOCK DC TASK
DC15AD	DATA	DCACT	ADDRESS BLOCK 
	RES	15	SUBROUTINE STACK FOR INTERRUPTS 
STB	RES	1 
	RES	1	AND FOR TRANSFER PARAM 
STB2	RES	1

	IFT	SPEED=1
LSPEED	EQU	/0200
	XIF
	IFT	SPEED=0
LSPEED	EQU	0
	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,/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

	IFT	RCOM=1 
	LDKL	A3,RMRPLY	FIXED MESSAGE-RD MOD	DK5
	ST	A3,DWTBUF,A6
	XIF
	CWK	A6,DW1500	DCTASK DWT ??? 
	RF(E)	DCTP30	YES!!!  SHOULD NOT 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
	EJECT


DCTP20	EQU	*
	IFT	EM3270=0 
	LDKL	A5,STB2	LOAD STACK BASE 
	CF	A5,FINTER	DWT ALREADY IN DC:TAB ??? 
	LDR	A3,A3
	RF(NZ)	DCTP30	YES!!! 
	XIF
	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
	IFF	SSTAT=0		DK3 
	IFT	STAT=1 
	LDK	A1,4	DEVICE END
	ORS	A1,DWTST,A6
	CF	A15,INSSQ	INSERT IN STATUS QUEUE
	XIF
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	SSTAT=1		DK3 
	LD	A2,DWTINF,A6	GET DWT INFO	DK3 
	ANK	A2,1	GET LP-BIT	DK3
	RF(NZ)	SIMEX0	IF LP	DK3
	XIF			DK3
	CF	A15,TIMEWR	SET TIMER
	CF	A15,INSWQ 	QUEUE REQUEST
	RB	DCRTN 
* 
* 
* 
*	READ
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE RECEIVED
*	  TIME OUT
* 
* 
DCRD	EQU	*
	LD	A8,DWTECB,A6	GET ECB
	LD	A3,DWTRQ,A6	AND RECEIVE MESSAGE QUEUE 
	RF(Z)	DCRD10	NOTHING IN QUEUE

	LDR*	A2,A3	TAKE THE FIRST IN QUEUE 
	ST	A2,DWTRQ,A6 
	ADK	A3,6 
	ST	A3,ECBBA,A8 
	LD	A4,-4,A3	AND EFFECTIVE LENGTH 
	ST	A4,ECBEL,A8 
	LDK	A1,0 
	CF	A15,TENDIO
	RB	DCRTN 

DCRD10	CF	A15,TIMERE	START 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
	IFT	SSTAT=1		DK3 
*	SIMULATE EXCHANGE REQUEST AND 
*	RETURN ERROR INDICATION...
*	SEND STATUS DEVICE END IF 
*	REQIRED...............
* 
SIMEX0	EQU	*		DK3 
	LD	A1,DWTST,A6	SEE IF WACK HAS BEEN SENT 
	ANK	A1,9		DK3
	RF(Z)	SIMEX1	NO	DK3
	CF	A15,INSSQ	INSERT DWT IN STATUS QUEUE	DK3
	LDK	A1,4	SET DEVICE END. 
SIMEX1	EQU	*		DK3 
	ST	A1,DWTST,A6	SET STATUS IN DWT	DK3 
	LDK	A1,/40	SET RET. CODE = REPLY ERROR	DK3 
	CF	A15,TENDIO	COMPLETE THE REQUEST	DK3 
	ABL	TDISP	GO TO THE DISPATCHER	DK3 
	XIF			DK3
	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 
	CWK	A4,TBUF1 
	RB(E)	RBUF	DRIVER BUFFER 
	CWK	A4,TBUF2 
	RB(E)	RBUF	DRIVER BUFFER 
	RB	GBUF10	APPLICATION BUFFER 
	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	EQU	* 
	IFT	SSTAT=1		DK3 
	LD	A2,DWTINF,A6	GET DWT INFO	DK3 
	ANK	A2,1	GET LP-BIT	DK3
	RB(Z)	GBUF10	NOT LP	DK3
	XIF			DK3
	IFF	STAT=0		DK3
	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	* 
	IFT	MESPAS=1 
	LDKL	A2,DW1500	QUEUE ON DC-TASK DWT
	XIF
	IFT	MESPAS=0 
	LDR	A2,A6	QUEUE ON TERMINAL DWT
	XIF
	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 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,DW1500 
	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,DWTRQ,A6	A3=ADDR TO READ QUEUE 
	RF(Z)	CKM200	NO READ IN QUEUE
	LDR*	A2,A3	A2=ADDR TO NEXT READ BUFFER 
	ST	A2,DWTRQ,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 
	LD	A4,-2,A3
	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
* 
* 
*	TIMER VALUES
* 
* 
TIMSEL   EQU      3 
TIMPRO	EQU	90	PROCEDURE TIMER 9 SEC 
* 
* 
*	CHARACTER EQUATES 
* 
SF	EQU	X'1D'	START FIELD CHARACTER
SYN	EQU	/16 
STX	EQU	/02 
ETX	EQU	/03 
ETB	EQU	/17 
ITB	EQU	/1F 
SOH	EQU	/01 
ENQ	EQU	/05 
DLE	EQU	/10 
EOT	EQU	/04 
NAK	EQU	/15 
ESC	EQU	/1B 
SBA	EQU	/11 
GP	EQU	/22
RDBCOM	EQU	/32
RDMCOM	EQU	/36
SKIP	EQU	06	USM, SKIP CHAR	DK4
	IFT	CODE=0 
PAR	EQU	/80 
RVI	EQU	/3C 
ACK0	EQU	/30
ACK1	EQU	/31
DC1	EQU	/11 
	IFT	MSV1=0 
WACK	EQU	/3B
	XIF
	IFT	CODE=0 
	IFT	MSV1=1 
WACK	EQU	/BF	=WABT - SIEMENS MSV1 PROCEDURE 
	XIF
	IFT	CODE=1 
PAR	EQU	/00 
WACK	EQU	/2C
RVI	EQU	/5C 
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
XRB	DATA	0	READ BUFFER SWITCH 
CACK	DATA	0	ACK COUNTER 
SYNSW	DATA	0	0=SKIP SYNS, 1=DON'T SKIP
* 
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	0	CONTROL SEQUENCE SAVE AREA
* 
* 
*	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
*	FIXED MESSAGE FOR READ MODIFIED VSPC
RMRPLY	EQU	*	 
	DATA	/2041,/1120,/4108 
	DATA	/2011,/2044 
	EJECT
* 
* 
*	BASIC RECEIVE MODE
* 
*	ENTERED EVERY TIME A MESSAGE
*	IS EXPECTED FROM THE MASTER SIDE
* 
* 
	IFT	P6805=1		SALCUZ
BRMHLT	CF	A5,HALTIN	HALT RECEIVER	SALCUZ
	XIF			SALCUZ 
BRM	EQU	* 
	LDKL	A5,STB	LOAD STACKBASE 
	IFT	P6805=0		SALCUZ
	CF	A5,HALTIN	HALT RECEIVER AND UPDATE STATUS 
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	CF	A15,CKMESS	CHECK IF STATUS CHANGE	SALCUZ
	XIF			SALCUZ 
BRM010	EQU	*
	IFT	CODE+P6805=0		SALCUZ 
	LDKL	A2,/100+LSPEED+SYN	SPECIFY SYN PATTERN
	XIF			SALCUZ 
	IFT	P6805=0		SALCUZ
	IFT	CODE=1 
	LDKL	A2,/100+LSPEED+SYNEBC	SPECIFY SYN PATTERN 
	XIF			SALCUZ 
	IFT	P6805=0		SALCUZ
	CIO	A2,1,LCUIN	START RECEIVER
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	IFF	CODE=1		SALCUZ 
	LDK	A2,/0C		SALCUZ 
	CIO	A2,1,LCUIN	START RECEIVER	SALCUZ 
	LDK	A2,SYN		SALCUZ 
	OTR	A2,1,LCUIN	SPECIFY SYNC CHARACTER	SALCUZ 
	RB(NA)	BRMHLT		SALCUZ
	XIF			SALCUZ 
	IFT	CODE+P6805=2		SALCUZ 
	LDK	A2,0		SALCUZ 
	CIO	A2,1,LCUIN	START RECEIVER	SALCUZ 
	LDK	A2,SYNEBC		SALCUZ
	OTR	A2,1,LCUIN	SPECIFY SYNC CHARACTER	SALCUZ 
	RB(NA)	BRMHLT		SALCUZ
	XIF			SALCUZ 
BRM100	EQU	*
	CF	A5,READP	READ ONE CHARACTER 
	RF(NZ)	BRM150	PARITY ERROR 
	LDR	A1,A2
	SUK	A1,STX 
	RF(Z)	BRM300	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 
	IFT	MSV1=0 
	LDR	A8,A2
	CF	A5,READP	READ ONE CHARACTER 
	RF(NZ)	BRM150	PARITY ERROR 
	CWR	A2,A8
	RF(NE)	BRM150	INVALID ADDRESSING 
	XIF
	LDK	A3,0 
	CC	A2,DW1500+1 
	RF(E)	BRM110	POLLING 
	LDK	A3,2 
	CC	A2,DW1500 
	RF(NE)	BRM150	NOT THIS TCU 
BRM110	EQU	*
	CF	A5,READP	READ 1:ST STA
	RF(NZ)	BRM150	PARITY ERROR 
	LDR	A8,A2
	IFT	MSV1=0 
	CF	A5,READP	READ 2:ND STA
	RF(NZ)	BRM150	PARITY ERROR 
	CWR	A2,A8
	RF(NE)	BRM150	INVALID ADDRESS SEQUENCE 
	XIF
	CF	A5,READ	READ ONE CHARACTER
	IFT	P6805=0		SALCUZ
	SUK	A2,ENQ+PAR 
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	SUK	A2,ENQ		SALCUZ 
	XIF			SALCUZ 
	RF(NZ)	BRM150	NOT ENQ
	IFT	P6805=0		SALCUZ
	CF	A5,READ	READ LAST CHARACTER 

*	TRAILING PAD CAN BE CHECKED 

	CIO	A1,0,LCUIN	HALT INPUT
	SST	A1,LCUIN 
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	CF	A5,HALTIN	HALT INPUT	SALCUZ 
	RB(NZ)	BRM010	PARITY ERROR	SALCUZ		SALCUZ
	XIF			SALCUZ 
	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
	IFT	MSV1=1 
	CF	A5,FINTEP	CHECK IF STA PRESENT (POLL ADDRESS) 
	XIF
	IFT	MSV1=0 
	CF	A5,FINTER	CHECK IF STA PRESENT
	XIF
	IFF	EM3270=0 
	CF	A5,FINT10	CONTINUE SEARCHING IN DC:TAB
	XIF
	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
	IFT	MSV1=0		 
	LDKL	A6,DW1500	SELECT TO DCTASK
BRM130	EQU	*
	ABL	SELECT 
	XIF			 
	IFT	MSV1=1		 
	ABL	BRM	INVALID ADDRESS
	XIF			 
* 
*   WAIT FOR MARK HOLD TO RESYNCHRONIZE 
* 
BRM150	EQU	*
	ANK	A2,/7F 
	SUK	A2,/7F 
	RB(Z)	BRM	RESYNCHRONIZE
	CF	A5,READ	READ ANOTHER CHARACTER
	RB	BRM150
	EJECT
* 
* 
*	EOT HAS BEEN RECEIVED 
* 
* 
BRM200	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	IFT	RCOM=1 
	CM	XRB	RESET READ BUFFER 
	XIF
	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
* 
* 
*	STX HAS BEEN RECEIVED 
* 
* 
BRM300	EQU	*
	CF	A5,HPTIM
	LD	A1,XSEL 
	RF(Z)	BRM315	NOT SELECTED
	LD	A1,DCRBUF 
*********************CHAINED COMMAND
	RB(Z)	BRM150	NO BUFFER AVAILABLE 
********************* 
BRM305	EQU	*
	CF	A5,RDMESS	READ MESSAGE
	SUK	A7,1 
	RF(NZ)	BRM320	MESSAGE OK 
BRM310	EQU	*
	CM	XSTA	INDICATE 'INVALID MESSAGE' 
BRM312	EQU	*
	CF	A5,TRNAK	SEND NAK 
	ABL	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 
	ABL(Z)	BRM150	NO ONE WRITING. RESYNCHRONIZE
	LDR*	A2,A6	GET STA 
	XIF
	IFF	EM3270=0 
	CF	A5,FINTER	GET RECEIVING DWT 
	LDR	A6,A3	DWT-ADDRESS
	LDR*	A2,A6	STA 
	XIF
	IFT	RCOM=1 
	CF	A5,PRREC	PREPARE FOR TEXT RECEPTION 
	LDK	A1,0	SET RC=0
	CF	A5,CWRITE	COMPLETE WRITE REQUEST
	CM	CACK	PRESET ACK-1	=3
	RB	BRM305	READ THE MESSAGE 
	XIF
BRM316	CF	A5,READ	READ ONE CHARACTER
	IFF	P6805=1		=4
	SUK	A2,ENQ+PAR 
	XIF			=4 
	IFT	P6805=1		=4
	SUK	A2,ENQ	ENQ ??	=4 
	XIF			=4 
	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)	RDBUF	READ MODIFIED RECEIVED 
	SUK	A1,RDMCOM-RDBCOM 
	RF(Z)	RDMOD	READ BUFFER RECEIVED 
	XIF
BRM325	EQU	*
	SUK	A7,1 
	RF(Z)	BRM340	MESSAGE ENDED BY ETB
	CM	FBAX
	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,DW1500
	RF(E)	BRM330	MESSAGE IS MENT FOR DCTASK
*				DK3
* CHECK START PRINTER BIT IS MOVED TO HERE FROM BELOW	DK3 
* 
* 
*	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
	IFT	SSTAT=1		DK3 
	LD	A3,DWTINF,A6	GET INFO	DK3 
	ANK	A3,1	GET LP-BIT	DK3
	RF(Z)	BRM328	NOT LP	DK3
	LDR	A3,A2	MOVE A2 TO A3	DK3
	ANK	A3,8	CHECK FOR START PRINTER BIT	DK3 
	RF(Z)	BRM329	NOT START PRINTER BIT	DK3 
	LD	A3,DWTST,A6	GET STATUS	DK3
	ORK	A3,/A	SET WACK INDICATION	DK3
	ST	A3,DWTST,A6	RESTORE STATUS	DK3
	RF	BRM329	DONT RESET BIT IF LP	DK3 
BRM328	EQU	*		DK3 
	ANK	A2,/F7	RESET START PRINTER BIT	DK3 
	LC	A2,TASCII,A2	CONVERT BACK	DK3 
	SC	A2,+2,A4	RESTORE CHAR IN BUFFER	DK3 
BRM329	EQU	*		DK3 
	XIF			DK3
	IFT	STAT=1		DK3
	IFF	SSTAT=1		DK3 
	ANK	A2,8 
	RF	BRM328
	RF(Z)	BRM328 
	LD	A2,DWTST,A6	GET STATUS
	ORK	A2,/A
	ST	A2,DWTST,A6 
BRM328	EQU	*
	XIF
*  END OF CHECK START PRINTER BIT		DK3
	LD	A2,DWTST,A6	GET STATUS
	RF(N)	BRM330	NO REQUEST
	LDK	A2,2 
	CW	A2,DWTOR,A6 
	RF(NE)	BRM330	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 START PRINTER BIT IS MOVED UPWARDS	DK3 
* 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RF	BRM345
	EJECT
BRM330	EQU	*
	SUK	A4,6	GET BUFFER BASE 
	CF	A5,QRBUF	QUEUE BUFFER FOR DCTASK
	CF	A15,CKMESS	COMPLETE DCTASK READ IF ANY
BRM340	EQU	*
	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
	EJECT
* 
* 
*	READ MODIFIED OR READ BUFFER RECEIVED 
* 
* 
	IFF	RCOM=0 
RDBUF	EQU	*	READ BUFFER COMMAND 
RDMOD	EQU	* 
	CM	XSEL	RESET SELECT EXPECTED
	LD	A6,FDWTIN	DWT-ADDRESS FOR ADDRESSED TERMINAL
	LD	A4,DWTBUF,A6	BUFFER ADDRESS 
	SUK	A4,2	SDJUST BUFFER ADDRESS 
	LDKL	A3,12	REQUESTED LENGTH	DK5
	IM	XRB	SET READ BUFFER SWITCH	DK1
	CM	FDWTUT
	LDK	A1,1 
	XRS	A1,CACK		DK1 
	ABL	POL127 
	XIF
* 
* 
*	ENQ HAS BEEN RECEIVED 
* 
* 
BRM400	EQU	*
	CF	A5,HPTIM	STOP PROCEDURE TIMER 
	LD	A1,XACK 
	RF(NZ)	BRM510	TEXT RETRANSMISSION	=1 
	OR	A1,XSEL 
	RF(Z)	BRM410	IN CONTROL STATE
	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(NZ)	BRM510	ACK EXPECTED 
	OR	A1,XSEL 
	RB(Z)	BRM410	IN CONTROL STATE
	RF	BRM636
BRM510	EQU	*
	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 
	IFF	P6805=1		=4
	CWK	A2,ACK0+PAR
	XIF			=4 
	IFT	P6805=1		=4
	CWK	A2,ACK0		=4
	XIF			=4 
	RF(NE)	BRM620
* 
*	ACK , 0 RECEIVED
* 
	LD	A1,CACK	GET ACKCOUNTER
	RF(Z)	BRM630	ACK,0 EXPECTED
BRM610	EQU	*
	CF	A5,TRENQ	SEND ENQ 
	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	*
	CF	A5,TREOT	SEND EOT 
	IFT	RCOM=1 

	CM	XRB	RESET READ BUFFER 
	XIF
	RB	BRM410
BRM640	EQU	*
	LDK	A1,1 
	XRS	A1,CACK	INCREMENT ACK COUNTER
	ABL	POL130 
BRM650	EQU	*
	IFF	P6805=1		=4
	CWK	A2,RVI+PAR 
	XIF			=4 
	IFT	P6805=1		=4
	CWK	A2,RVI		=4 
	XIF			=4 
	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	*
	LD	A1,XACK		=2 
	RF(NZ)	POL010	ERROR. ACK EXPECTED	=2 
	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	*
	IFT	STAT+NOWACK=1
	ANK	A3,8 
	RF(NZ)	SEL115	BUSY 
	XIF
	IFT	STAT+NOWACK=2
	ANK	A3,8 
	RF(Z)	SEL111	DEVICE NOT BUSY 
	CF	A5,TRWACK	TRANSMIT WACK 
	ABL	BRM
SEL111	EQU	*
	XIF
	LD	A1,DCRBUF 
	RF(NZ)	SEL120	BUFFER AVAILABLE 
SEL115	EQU	*
	IFF	STAT+NOWACK=2
	CF	A5,TRWACK	SEND WACK 
	XIF
	RB	SEL100
SEL120	EQU	*
	CF	A5,PRREC	PREPARE FOR TEXT RECEPTION 
	CF	A5,TRACK	SEND ACK,0 
	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
	ST	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	* 
	LD	A1,XACK		=2 
	RF(Z)	POL020	ACK NOT EXPECTED	=2 
POL010	CF	A5,TRENQ	SEND ENQ	=2
	CF	A5,SPTIM	START PROCEDURE TIMER	=2 
	ABL	BRM	WAIT FOR RESPONSE	=2 
POL020	EQU	*		=2
	CF	A5,CPTIM	CHECK POLL TIMER 
	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
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+SPECP=0 
	LD	A1,XACK		=2 
	RB(NZ)	POL010	ACK EXPECTED	=2
	LDR	A7,A6	SAVE A6
	CF	A5,CPTIM	CHECK POLLTIMER
	LDR	A6,A7	RESTORE A6 
	IFT	STAT=1 
	LD	A1,DWTST,A6	GET STATUS
	ANK	A1,7 
	RB(NZ)	POL050	PENDING STATUS 
	XIF
	IFF	STAT+SPECP=0 
	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
	XIF
	RB	POL115	SEND EOT 
	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 CONTAINS : 
*	0 : IF CORRECT ETX BLOCK RECEIVED 
*	1 : IF LRC OR PARITY ERROR , BUFFER OVERFLOW
*	2 : IF CORRECT ETB BLOCK RECEIVED 
* 
RDMESS	EQU	*
	LD	A4,DCRBUF	GET BUFFER ADDRESS
	ADK	A4,6	RESERVE HEADER
	LDK	A3,0 
	LD	A1,XSTA 
	RF(NZ)	RDM050	LAST INPUT WAS OK
	LD	A1,FBLST	COMPUTE NEW INDEX
	SUR	A1,A4
	ST	A1,FBAX 
RDM050	EQU	*
	AD	A4,FBAX	ADD BUFFER INDEX
	ST	A4,FBLST	REMEMBER START OF BLOCK
RDM075	EQU	*
	CM	XSTA
	LDK	A7,0	RESET LRC 

	IFT	IBMCHR=1 
	LD	A1,FBAX 
	RF(NZ)	RDM100	NOT FIRST BLOCK
	CF	A5,READP
	RF(NZ)	RDM120	PARITY ERROR 
	CWK	A2,ESC 
	RF(NE)	RDM110
	CF	A5,READP	SKIP NEXT TWO CHARACTERS 
	CF	A5,READP
	XIF
RDM100	EQU	*
	CF	A5,READP	READ ONE CHARACTER 
	RF(NZ)	RDM120	PARITY ERROR 
RDM110	EQU	*
	CWK	A2,ETX 
	RF(E)	RDM130	ETX RECEIVED
	CWK	A2,ETB 
	RF(E)	RDM160	ETB RECEIVED
	CWK	A2,ITB 
	RF(E)	RDM170	ITB RECEIVED
	CWK	A2,ENQ 
	RF(E)	RDM120	SKIP IF ENQ IN TEXT	=1
	CWK	A2,/FF 
	RF(E)	RDM140	MARK HOLD RECEIVED

	CWK	A2,SKIP	CHECK IF SKIP CHAR (USM)	DK4 
	RB(E)	RDM100	SKIP CHAR	DK4 
	IFT	CODE=0 
	IFT	BINTRM=1 

	LDR	A1,A2
	SUK	A1,DC1+3 
	RF(P)	RDM115	NOT DC1-DC3 
	ADK	A1,3 
	RF(N)	RDM115	NOT DC1-DC3 
	SLL	A1,6 
	LDR	A8,A1
	CF	A5,READP	8-BIT CHAR GET NEXT PART 
	RF(NZ)	RDM120	PARITY ERROR 
	SUK	A2,/20	ASSEMBLE TO ONE CHARACTER 
	ORR	A2,A8
RDM115	EQU	*
	XIF

	SCR	A2,A4	STORE CHARACTER
	ADK	A4,1	INCREMENT POINTER 
	IM	FBAX	INCREMENT BUFFER INDEX 
	LD	A1,FBAX 
	CWK	A1,RBUFL+RBUFL 
	RB(NG)	RDM100	NOT OVERFLOW 
* 
*	BUFFER OVERFLOW 
* 
	RF	RDM140	ABORT INPUT
RDM120	EQU	*
	LDK	A3,1	INDICATE INVALID MESSAGE
	SUK	A2,/7F 
	RF(Z)	RDM150	MARK HOLD RECEIVED
	RB	RDM100
* 
*	ETX RECEIVED
* 
RDM130	EQU	*
	LD	A1,DCRBUF	GET BUFFER ADDRESS
	LD	A2,FBAX	GET BUFFER INDEX
	ST	A2,+2,A1	STORE EFFECTIVE LENGTH IN HEADER 
	IFF	CODE=1 
	CF	A5,RDLRC
	RF(Z)	RDM150	LRC WAS OK
	XIF
	IFT	CODE=1 
	CF	A5,RDCRC	READ CRC AND CHECK IT
	RF(E)	RDM150	CRC WAS OK
	XIF
RDM140	EQU	*
	LDK	A3,1	INDICATE INVALID MESSAGE
RDM150	EQU	*
	LDR	A7,A3	SAVE RESULT REGISTER 
	CF	A5,HALTIN	HALT INPUT
	IFT	P6805=1
	ORR	A7,A1	PARITY ERROR	SALCUZ
	XIF			SALCUZ 
	RTN	A5 
* 
*	ETB RECEIVED
* 
RDM160	EQU	*
	LDR	A3,A3
	RB(NZ)	RDM130	ALREADY INVALID
	LDK	A3,2	INDICATE CORRECT ETB
	RB	RDM130
* 
*	ITB RECEIVED
* 
RDM170	EQU	*
	IFF	CODE=1 
	CF	A5,RDLRC
	RB(NZ)	RDM120	LRC WAS NOT OK 
	XIF
	IFT	CODE=1 
	CF	A5,RDCRC	READ CRC AND CHECK IT
	RB(NE)	RDM120	CRC WAS NOT OK 
	XIF
	RB	RDM100
	EJECT
* 
*	TRANSMIT ACK 0 OR 1 
* 
TRACK	LDK	A2,1
	LDK	A3,ACK1	PRELOAD ACK1 
	XRS	A2,CACK	INCREMENT ACK COUNTER
	RF(NZ)	TRDLE 
	LDK	A3,ACK0	LOAD ACK0
	RF	TRDLE 
* 
*	TRANSMIT WACK 
* 
TRWACK	LDK	A3,WACK	LOAD WACK
	RF	TRDLE 
* 
*	TRANSMIT RVI
* 
	IFF	STAT=0 
TRRVI	LDK	A3,RVI	LOAD RVI 
	XIF
* 
*	TRANSMIT DLE
* 
TRDLE	LDK	A2,DLE	LOAD DLE 
	SC	A2,RESEND	PUT INSAVE AREA 
	SC	A3,RESEND+1	
	RF	TRREP 
	EJECT
* 
*	TRANSMIT NAK
* 
TRNAK	LDK	A3,NAK	LOAD NAK 
	RF	TREN10
* 
*	TRANSMIT EOT
* 
TREOT	LDK	A3,EOT	LOAD EOT 
	RF	TREN10
* 
*	TRANSMIT ENQ
* 
TRENQ	LDK	A3,ENQ	LOAD ENQ 
* 
TREN10	SC	A3,RESEND	PUT IN SAVE AREA
	LDK	A2,/FF 
	SC	A2,RESEND+1 
TRREP	CF	A5,TRSYNC	START OUTPUT 
	LC	A2,RESEND	GET FIRST CHARACTER 
	CF	A5,WRITEP	SEND IT 
	LC	A2,RESEND+1	GET NEXT CHARACTER
	CF	A5,WRITEP	SEND IT 
TRRE10	LDK	A2,/FF 
	CF	A5,WRIT05	SEND PAD
	LDK	A2,/FF 
	CF	A5,WRIT05 
	LDK	A2,0		SALCUZ 
	CIO	A2,0,LCUUT	STOP TRANSMITTER
	IFT	P6805=1		SALCUZ
	CF	A5,READ	WAIT FOR END	SALCUZ 
	XIF			SALCUZ 
	SST	A2,LCUUT	PERFORM SST AT ONCE 
	IFF	LOGG=0 
	CF	A5,LOGSST	LOG TRANSMITTER STATUS
	XIF
	RTN	A5 
	EJECT
* 
* 
*	TRANSMIT ONE TEXT BLOCK 
* 
* 
TRTEXT	EQU	*
	CF	A5,TRSYNC	START OUTPUT
	IFT	TSTREQ=1 
* 
* 
*	TEST REQUEST HANDLING 
* 
* 
	LD	A4,FBAX 
	RF(NZ)	TRT050	NOT START OF MESSAGE 

	LD	A1,XRB	READ BUFFER COMMAND IN PROCESS ??? 
	RF(NZ)	TRT050	YES !! 

	LD	A4,FECBBA 
	LC	A3,+2,A4	GET AID CHARACTER
	SUK	A3,/30 
	RF(NZ)	TRT050	NOT TEST REQUEST 
	LDK	A2,SOH 
	CF	A5,WRITE	SEND SOH 
	LDK	A7,0	RESET BCC 
	LDK	A2,'%' 
	CF	A5,WRITE	SEND % 
	LDK	A2,'/' 
	CF	A5,WRITE	SEND / 
	LDK	A2,STX 
	CF	A5,WRITE	SEND STX 
	ST	A4,FBLST	REMEMBER START OF BLOCK
	ADK	A4,5	SKIP AID + CURSOR ADDRESS 
	LDK	A3,5	ADJUST LENGTH 
	LDK	A2,3 
	ST	A2,FBAX 
	RF	TRT100
TRT050	EQU	*
* 
* 
* 
	XIF
	LDK	A2,STX 
	CF	A5,WRITE	SEND STX 
	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,DW1500+1	GET TCA 
	CF	A5,WRITEP	SEND TCA
	LDR*	A2,A6	GET STA 
	CF	A5,WRITEP	SEND STA
	IFT	IBMCHR=1 
	IFF	RCOM=1 
	LDK	A2,/27	SEND ENTER AS AID 
	CF	A5,WRITEP 
	LDK	A2,/20	AND CURSOR ADDRESS
	CF	A5,WRITEP 
	LDK	A2,/20 
	CF	A5,WRITEP 
	XIF
	IFT	RCOM=1 

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

			******************** 
	LDK	A2,X'2D'	NO AID GENERATED	DK5
	CF	A5,WRITEP	SEND CLEAR	DK1
	RF	TRT100
TRT070	EQU	*
	XIF

	LDK	A3,2 
TRT100	EQU	*
	LCR	A2,A4	GET ONE CHARACTER
	ADK	A4,1	INCREMENT POINTER 
	ANK	A2,/7F 
	IFT	RCOM=1 
	LD	A1,XRB	READ BUFFER COMMAND ???
	RF	TRT105	SKIP TEST ON ATTRIBUTE	DK5 

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

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

TRT101	EQU	*

	LDK	A2,SF
	CF	A5,WRITEP	SEND START FIELD

	LC	A2,-1,A4	GET ATTRIBUTE CHARACTER
	ANK	A2,X'7F' 
	LDR	A1,A2	CONVERT TO IBM ATTRIBUTE 
	ANK	A1,1 
	ANK	A2,/1E	MASK
	SLL	A2,1 
	ORR	A2,A1	IBM ATTRIBUTE COMPOSED 
	ORK	A2,/40	BIT ALWAYS SET ONE
	LC	A2,TASCII,A2
	CWK	A2,/18	CHECK SPECIAL ATTRIBUT
	RF(NE)	TRT104
	LDK	A2,/30 
TRT104	EQU	*
	CF	A5,WRITEP	SEND ATTRIBUTE
	ADK	A3,1 
	RF	TRT110
TRT105	EQU	*
	XIF
	EJECT
	CWK	A2,/07 
	RF(L)	TRT110	ILLEGAL CODE : SKIP IT
	CF	A5,WRITEP	SEND CHARACTER
TRT110	EQU	*
	IM	FBAX	INCREMENT BUFFER INDEX 
	LD	A1,FECBRL	GET REQUESTED LENGTH
	CW	A1,FBAX 
	RF(NG)	TRT130	END OF MESSAGE 
	ADK	A3,1	INCREMENT CHARACTER COUNTER 
	CWK	A3,TBLEN 
	RB(L)	TRT100	NOT FULL BLOCK
	IFT	RCOM=1 
	LDK	A1,SBA	CHECK IF SBA AT END OF BLOCK
	CC	A1,-2,A4
	RF(E)	TRT115	YES 
	CC	A1,-1,A4
	RF(NE)	TRT116	NO SEND ETB
	LCR	A2,A4	GET FIRST BYTE AFTER SBA 
	ADK	A4,1	INREMENT POINTER
	CF	A5,WRITEP	SEND IT 
	IM	FBAX	INCREMENT INDEX
TRT115	LCR	A2,A4	GET SECOND BYTE AFTER SBA
	CF	A5,WRITEP	SEND IT 
	IM	FBAX	INCREMENT INDEX
	XIF
TRT116	EQU	*
	LDK	A2,ETB	LOAD ETB
TRT120	EQU	*
	CF	A5,WRITEP	SEND IT 
	IFF	CODE=1 
	LDR	A2,A7	GET LRC
	CF	A5,WRITEP	SEND LRC
	XIF
	IFT	CODE=1 
	LDR	A8,A7	SAVE CURRENT CRC 
	LDR	A2,A7
	ANK	A2,/FF 
	CF	A5,WRIT05	SEND CRC BYTE 1 
	ECR	A2,A8
	ANK	A2,/FF 
	CF	A5,WRIT05	SEND CRC BYTE 2 
	XIF
	ABL	TRRE10	HALT OUTPUT 
TRT130	EQU	*
	IM	XETX	INDICATE 'ETX SENT'
TRT140	EQU	*
	LDK	A2,ETX	LOAD ETX
	RB	TRT120	SEND ETX AND LRC 
	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,DW1500+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
* 
* 
*	TRANSMIT SYNC SEQUENCE
* 
* 
TRSYNC	EQU	*
	LDK	A2,0		SALCUZ 
	CIO	A2,0,LCUIN	HALT INPUT IF NOT DONE
	SST	A2,LCUIN	PERFORM SST 
	IFT	P6805=0		SALCUZ
	CIO	A2,1,LCUUT	START TRANSMITTER 
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	IFT	CODE=1		SALCUZ 
	LDK	A2,0		SALCUZ 
	CIO	A2,1,LCUUT	START TRANSMITTER	SALCUZ
	RF(A)	TRS010		SALCUZ 
	SST	A1,LCUUT		SALCUZ 
	RF(A)	TRS005		SALCUZ 
	ABL	BRM		SALCUZ
TRS005	CIO	A2,1,LCUUT		SALCUZ 
TRS010	EQU	*		SALCUZ
	LDK	A2,SYNEBC		SALCUZ
	OTR	A2,1,LCUUT	SPECIFY SYNC CHARACTER	SALCUZ 
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	IFT	CODE=0		SALCUZ 
	LDK	A2,/0C		SALCUZ 
	CIO	A2,1,LCUUT		SALCUZ 
	RF(A)	TRS010		SALCUZ 
	SST	A1,LCUUT		SALCUZ 
	RF(A)	TRS005		SALCUZ 
	ABL	BRM		SALCUZ
TRS005	CIO	A2,1,LCUUT		SALCUZ 
TRS010	EQU	*
	LDK	A2,SYN		SALCUZ 
	OTR	A2,1,LCUUT	SPECIFY SYNC CHARACTER	SALCUZ 
	XIF			SALCUZ 
	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
* 
* 
*   RECEIVER INTERRUPT
* 
* 
IH1501	EQU	*
	ST	P,INTSAV
	CF	A15,SAVE8	SAVE A1-A8
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	INR	A2,0,LCUIN	READ CHAR 
	RF(NA)	IHIN20	NOT ACCEPTED,CHECK STATUS
	IFF	LOGG=0 
	CF	A5,LOGIN	LOG RECEIVED CHARACTER 
	XIF
	IFF	CODE=1 
	C2	SYNSW 
	RF(NZ)	IHLCI2
	CWK	A2,SYN	SKIP SYNS 
	RF(E)	READ 
IHLCI2	XRR	A7,A2	CALCULATE LRC
	XIF
	IFT	CODE=1 
	C2	SYNSW 
	RF(NZ)	IHLCI1	DO NOT SKIP SYNCS IN BCC FRAME 
	CWK	A2,SYNEBC
	RF(E)	READ	SKIP EBCDIC SYN 
IHLCI1	EQU	*
	CF	A5,CRCCAL	CALCULATE CRC 
	LC	A2,TASCII,A2	TRANSLATE TO ASCII 
	XIF
IHIN10	RTN	A5 
	IFT	P6805=0		SALCUZ
IHIN20	CF	A5,SST	PERFORM SST
	ABL	BRM
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
IHIN20	RF	SST	PERFORM SST	SALCUZ
	XIF			SALCUZ 
	EJECT
* 
* 
*   TRANSMITTER INTERRUPT 
* 
* 
IH1502	EQU	*
	ST	P,INTSAV
	CF	A15,SAVE8	SAVE A1 - A8
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	RB	IHIN10
	EJECT
* 
* 
*	SST INSTRUCTION AND STATUS CHECK
* 
*   LCU STATUS : BIT 10=CARRIER OFF 
*		BIT 13=PARITY ERROR (6805 ONLY)	SALCUZ 
*                BIT 14=THROUGHPUT ERROR
*                BIT 15=MODEM NOT READY 
* 
SST	SST	A1,LCUIN
	IFT	P6805=1		SALCUZ
	RF(NA)	SST200	ALREADY INACTIVE	SALCUZ		SALCUZ
	XIF			SALCUZ 
	LDR	A2,A1
	IFF	LOGG=0 
	CF	A5,LOGSST	LOG SST INFORMATION 
	XIF
	IFT	P6805=0		SALCUZ
	ANK	A2,2 
	RF(Z)	SST100 
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	ANK	A2,6		SALCUZ 
	RF(Z)	SST100		SALCUZ 
	ANK	A2,2		SALCUZ 
	RF(NZ)	SST050	THROUGH PUT	SALCUZ 
	LDK	A1,1	SET PARITY ERROR	SALCUZ 
	RF	SSTRET		SALCUZ
	XIF			SALCUZ 
SST050	EQU	*		SALCUZ
	CM	XSTA	TROUHHPUT ERROR
	LDKL	A5,STB
	ABL	BRM010 
SST100	EQU	*
	ST	A1,DCSTCU 
	IFT	P6805=0		SALCUZ
	CF	A15,CKMESS	CHECK IF STATUS CHANGE 
	RTN	A5 
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	ANK	A1,/21		SALCUZ 
	RF(Z)	SST200	LSALCUZ 
	CF	A15,SETIME	LINE ERROR, WAIT 0.2 SECONDS	SALCUZ
	DATA	BRM	RESTART	SALCUZ
	DATA	2	WAIT TIME	SALCUZ
	RF	READ		SALCUZ
* 
SST200	LDK	A1,0		SALCUZ 
SSTRET	ADK	A5,4		SALCUZ 
	LDR	A1,A1	SET CR	SALCUZ
	ABR*	A5	RETURN	SALCUZ
	XIF			SALCUZ 
* 
* 
*	HALT INPUT
* 
* 
HALTIN	LDK	A1,0		SALCUZ 
	CIO	A1,0,LCUIN 
	IFT	P6805=0		SALCUZ
	RB	SST	PERFORM SST INSTRUCTION AND STATUS CHECK
	XIF			SALCUZ 
	IFT	P6805=1		SALCUZ
	RF	READ	WAIT FOR SST INTERRUPT	SALCUZ
	XIF			SALCUZ 
	EJECT
* 
* 
*	WRITE FROM OR READ ONE CHARACTER TO A2
* 
* 
WRITE	EQU	* 
	IFT	CODE=1 
	ANK	A2,/FF 
	CWK	A2,/FF 
	RF(E)	WRIT05	NO TRANSLATION OF TRAILING PAD
	LC	A2,TEBCDIC,A2	TRANSLATE TO EBCDIC 
	XIF
WRIT05	EQU	*
	OTR	A2,0,LCUUT	SEND CHARACTER
	RF(A)	WRIT10 
	RF	READ	THROUGHPUT ERROR 
	IFF	CODE=1 
WRIT10	XRR	A7,A2	ACCUMULATE BCC 
	XIF
	IFT	CODE=1 
WRIT10	CF	A5,CRCCAL	CALCULATE CRC 
	XIF
	IFF	LOGG=0 
	CF	A5,LOGOUT	LOG OUTPUT CHARACTER
	XIF
* 
READ	CF	A15,STREG 
	ABL	TDISP
	EJECT
* 
* 
***	WRITEP
* 
*   WRITE A2 WITH PARITY
* 
* 
	IFT	CODE+P6805=0		SALCUZ 
WRITEP	ANK	A2,/FF 
	ECR	A1,A2
	ORK	A2,/80 
WRI100	SLL	A1,1 
	RB(P)	WRI100 
	RB(Z)	WRITE	WRITE
	XRK	A2,/80 
	RB	WRI100
	XIF
	IFF	CODE+P6805=0		SALCUZ 
WRITEP	RB	WRITE 
	XIF
* 
* 
* 
***	READP 
* 
*   READ CHARACTER TO A2 AND CHECK PARITY 
* 
* 
READP	CF	A5,READ
	IFT	CODE+P6805=0		SALCUZ 
	ECR	A1,A2
RE100	SLL	A1,1
	RF(Z)	RE110
	RB(NN)	RE100 
	XRK	A2,/80 
	RB	RE100 
RE110	LDR	A1,A2 
	ANK	A2,/7F 
	XIF
	IFF	CODE+P6805=0		SALCUZ 
	LDK	A1,/80 
	XIF
	ADK	A5,4 
	ANK	A1,/80 
	XRK	A1,/80 
	ABR*	A5
* 
* 
	EJECT
* 
*	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 
* 
* NOTE:	FOR SIEMENS MSV1 - SEPARATE SELECT AND POLL ADDRESSES 
*	ENTRY:	FINTER - CHECK SELECT ADDRESS
*		FINTEP - CHECK SPECIFIC POLL ADDRESS 
* 
RBYTE	DATA	0	IF 1 COMPARE WITH RIGTH BYTE 
* 
* 
FINTEP	EQU	*
	IFT	MSV1=0 
FINTER	EQU	*
	XIF
	IM	RBYTE 
	IFT	MSV1=1 
FINTER	EQU	*
	XIF
	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
	IFT	MSV1=1 
	AD	A3,RBYTE	CHOOSE ADDRESS TYPE
	CCR	A2,A3	COMPARE SUBTERMINAL ADDRESS
	XIF
	IFT	MSV1=0 
	CC	A2,1,A3	COMPARE TO SUBTERMINAL ADDRESS
	XIF
	RB(NE)	FINT10	TAKE NEXT TERMINAL 
FINT20	CM	RBYTE 
	ANKL	A3,/FFFE
	RTN	A5 
	EJECT
* 
* 
*	POWER ON FUNCTIONS
* 
* 
DC15ON	CF	A15,SAVE8	SAVE A1 - A8
	IFT	SSTAT=1		DK3 
	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	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	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	* 
	LDR	A1,A6	LOAD DWT AS PARAMETER
	CF	A15,SETIME
	DATA	PRTOUT,TIMPRO 
	ST	A4,DCTPP	SAVE TIMER POINTER 
	RTN	A5 
* 
*	PROCEDURE TIMEOUT 
* 
PRTOUT	CM	DCTPP 
	LDR	A6,A1	RELOAD A6
	LDKL	A5,STB	LOAD STACK BASE
	CF	A5,HALTIN	HALT INPUT IF OPEN	SALCUZ 
	LD	A1,XACK 
	RF(Z)	PRT10	ACK NOT EXPECTED 
	CF	A5,TRENQ	SEND ENQ 
	CF	A5,SPTIM	START PROCEDURE TIMER
PRT10	ABL	BRM 
	EJECT
* 
*	STOP PROCEDURE TIMER
* 
HPTIM	LD	A1,DCTPP	GET TIMER POINTER 
	RF(Z)	HPT10	NOT RUNNING
	CM*	DCTPP	STOP TIMER 
	CM	DCTPP 
HPT10	RTN	A5
	EJECT
	IFT	CODE=1 
* 
* 
*	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
	XIF
	IFT	CODE=0 
* 
*   RDLRC      READ LRC CHARACTER 
*              CR=0 IF LRC OK 
* 
RDLRC	IM	SYNSW
	CF	A5,READP
	ADK	A5,4 
	LDR	A1,A1
	RF(NZ)	LRCEND
	ANK	A7,/7F 
LRCEND	EQU	*
	CM	SYNSW 
	ABR*	A5

	XIF
	EJECT
* 
* 
*	DEVICE WORK TABLE FOR DCTASK
* 
* 
DW1500	EQU	*	TABLE ENTRY
	DATA	0	CU LINE ADDRESS 
	DATA	/8000	STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	DC15DC	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 
	DATA	0	STATUS QUEUE (NOT USED BY DC-TASK)
	DATA	0	RECEIVE MESSAGE QUEUE 
	DATA	0	SIMULATED DEVICE BUFFER ADDRESS 
	DATA	0	CURSOR ADDRESS
	DATA	0	DEVICE INFO	DK2 
	EJECT
* 
* 
*	DC RECEIVE BUFFER POOL
* 
RLINK	EQU	RBUFL+RBUFL+8 
* 
DCRBUF	EQU	*
	DATA	*+2	FREE BUFFER ANCHOR
	IFF	RBUFNR=2 
	DATA	*+RLINK 
	RES	RBUFL+3
	IFF	RBUFNR=3 
	DATA	*+RLINK 
	RES	RBUFL+3
	IFF	RBUFNR=4 
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	0	END OF CHAIN
	RES	RBUFL+3
* 
* 
*	DC TRANSMIT BUFFER POOL 
* 
* 
DCTBUF	EQU	*
* 
* 
	IFF	TBUFL=0
	DATA	TBUF1	POINTER TO FIRST FREE BUFFER
TBUF1	DATA	TBUF2	POINTER TO NEXT FREE BUFFER
	RES	TBUFL	BUFFER AREA 1
TBUF2	DATA	0	END OF CHAIN 
	RES	TBUFL	BUFFER AREA 2
	XIF
* 
	EJECT
* 
* 
*	INTERRUPT LOGGING ROUTINE 
* 
* 
	IFF	LOGG=0 
LOGSST	ST	A2,SAVE2
	ORKL	A2,/F000
	RF	LOG10 
LOGOUT	ST	A2,SAVE2
	ORKL	A2,/0F00
	RF	LOG10 
LOGIN	CWK	A2,/FF
	RF(E)	LOGE10 
	ST	A2,SAVE2
LOG10	ST	A3,SAVE3 
	LD	A3,LOGPNT 
	STR	A2,A3
	ADK	A3,2 
	CWK	A3,LOGEND
	RF(L)	LOGEXI 
	LDKL	A3,LOGSTA 
LOGEXI	ST	A3,LOGPNT 
	LD	A2,SAVE2
	LD	A3,SAVE3
LOGE10	RTN	A5 
	EJECT
* 
* 
LOGPNT	DATA	LOGSTA
LOGSTA	EQU	*
	RES	300
LOGEND	EQU	*-4
SAVE2	DATA	0
SAVE3	DATA	0
	XIF
* 
* 
* 
	IFT	RCOM=1 
	EJECT
******************************************************* 
* 
*     L I N C O L 
* 
*     CONVERT CURSOR ADDRESS TO LINE AND COLUMN NUMBER
* 
**********************************************************

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

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


LICO:T	EQU	*
	DATA	/2041,/4243,/4445,/4647	/00-/07 
	DATA	/4849,/232E,/3C28,/2B21	/08-/0F 
	DATA	/264A,/4B4C,/4D4E,/4F50	/10-/17 
	DATA	/5152,/245D,/2A29,/3B5E	/18-/1F 
	DATA	/2D2F,/5354,/5556,/5758	/20-/27 
	DATA	/595A,/402C,/255F,/3E3F	/28-/2F 
	DATA	/3031,/3233,/3435,/3637	/30-37
	DATA	/3839,/3A5B,/5C27,/3D22	/38-3F
	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 
	DATA	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
DC:END	EQU	*
* 
* 
	END

Full view