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

⟦b484e0dfc⟧

    Length: 155052 (0x25dac)
    Notes: pts_type(SC)
    Names: »DRPL01.SC«

Derivation

└─⟦928b1fd3e⟧ Bits:30009671 Philips computer tape "600131"
    └─⟦this⟧ »IMPROVE/DRPL01.SC« 

PTS(SC)

	IDENT DRPL01 	REL 11.1 82-08-19 870105041110 

			=17,BLOCKING IMPROVED
			REL 11.1 82-08-13
			=16,CHANGED BLOCKING OF OUTPUT 
			REL 11.1 82-07-08
			=15,COMPARE ADDR. CORR.
			REL 11.1 82-02-12
			=14,SET CR CORR. 
			REL 11.0 81-10-20
			=13,ADAPTED FOR PTS8000
			REL 11.0 81-10-14
			=12,DIAGNOSTIC FOR RWSI
			REL 11.0 81-08-27
			=11,CH. OF PARAMETERS
			REL 11.0 81-08-10
			=10,CORR. OF RWSI
			REL 11.0 81-08-10
			=9,CORR. OF INTERRUPT ENTRY
			REL 11.0 81-06-24
			=8,OPEN LINE PARAM. CHANGED
			REL 11.0 81-06-23
			=7,CORR. OF CWT-DISPL. 
			REL 11.0 81-06-11
			=6,LENGTH OF LONG BUFFERS CHANGED
			REL 11.0 81-05-27
			=5,CORR. OF RWSI-CWT:S , 
			OPEN LINE PROC. & COND. ASS. 
			REL 11.0 81-05-22
			=4,CORR. OF CWT-DISPL. 
			REL 11.0 81-05-20
			=3,CORR. OF TIMER NAME 
			REL 11.0 81-04-29
			=2,CORR. OF OPEN LINE PROCEDURE
			REL 11.0 81-04-21
			GENERAL UPDATE FOR RWSI
			REL 11.0 81-01-26
			=1,OPEN LINE PARAM. AREA EXPANDED
			PRR 11.0 80-11-19
	EJECT
* 
* 
* 
* 
************************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   DRPL01  =  DRIVER PROCESSOR FOR LINE CONTROL, 
*               LOCAL & REMOTE CONNECTIONS
* 
* 
* 
************************************************************
* 
* 
*   THIS PROGRAM HANDLES I/O OPERATIONS ON THE
*   PROCESSOR FOR LINE CONTROL (PLC). IT IS 
*   CALLED FROM THE TERMINAL DEVICE DRIVERS.
* 
*   INPUT AND OUTPUT OF CHARACTERS FROM/TO THE
*   TERMINAL DEVICE DRIVERS ARE MADE ON CHARACTER 
*   BASIS. BLOCKING AND DEBLOCKING OF CHARACTERS
*   IN DATA PACKETS ARE HANDLED BY THIS DRIVER. 
* 
	EJECT
* 
*   THE PROGRAM IS DIVIDED INTO A NUMBER OF SECTIONS. 
*   SECTIONS CONTAINING PROGRAM CODE ARE DIVIDED
*   INTO ROUTINES. THE ROUTINES ARE LISTED AT 
*   BEGINNING OF EACH SECTION. THE SECTIONS, IN 
*   ORDER OF APPEARANCE IN LIST, ARE: 
* 
*	NAME	   FUNCTION
* 
*	ENTRIES	   DECLARE ENTRY POINTS 
*	EXTERNALS   DECLARE EXTERNAL REFERENCES 
*	CONDITION   SET CONDITIONAL ASSEMBLY PARAMETERS 
*	CONSTANTS   SET CONSTANT VALUES 
*	DATA	   DATA AREAS
* 
*	REQUEST	   DEVICE DRIVER REQUEST ROUTINES 
*	INTERRUPT   INTERRUPT ENTRIES 
*	RECOVERY	   SYSTEM START, POWER FAIL AND RECOVERY 
*	DISPATCH	   LOCAL PLC DISPATCHER
*	ROUTINE	   COMMON SERVICE ROUTINES
*	SUBROUTIN   COMMON SERVICE SUBROUTINES
*	TBUFF	   BUFFER HANDLING SUBROUTINES
* 
	EJECT
* 
*********** 
* ENTRIES * 
*********** 
* 
*    I/O REQUESTS 
* 
	ENTRY	PLCHRI	CHARACTER INPUT 
	ENTRY	PLSTBL	DEFINE START OF OUTPUT BLOCK
	ENTRY	PLCHRO	CHARACTER OUTPUT
	ENTRY	PLENBL	DEFINE END OF OUTPUT BLOCK
	ENTRY	PLDISP	LOCAL DISPATCHER
	ENTRY	PRCHRI	CHR INP REMOTE	 
	ENTRY	PRSTBL	START OUTP BLOCK, REMOTE	 
	ENTRY	PRCHRO	CHR OUTP. REMOTE	 
	ENTRY	PRENBL	END OUTP BLOCK, REMOTE	 
	ENTRY	PRDISP	LOCAL DSIP. REMOTE	 
	ENTRY	PLTEST	TEST COMMANDS 
	ENTRY	CWTPLC	CWT TABLE 
	ENTRY	GETDWT	GET DWT SUBROUTINE
	ENTRY	PLCLOG	LOGG POINTER	=11
	ENTRY	TIMACT	INACTIVITY TIMER	=11
	ENTRY	POLRTL	POLL FREQ. & NO OF RETRANSM	=11 
	ENTRY	POLRTR	POLL FR. & NO OF RETR.	=11
	EJECT
* 
* 
*    INTERRUPTS 
* 
	ENTRY	IHPL01	PLC NUMBER 1
	ENTRY	IHPL02	PLC NUMBER 2
	ENTRY	IHPL03	PLC NUMBER 3
	ENTRY	IHPL04	PLC NUMBER 4
* 
	ENTRY	IHPR01	PLC NUMBER 5,REMOTE 
	ENTRY	IHPR02	           6,REMOTE 
	ENTRY	IHPR03	           7,REMOTE 
	ENTRY	IHPR04	           8,REMOTE 
* 
*    RECOVERY AT TC POWER UP
* 
	ENTRY	PLON	RECOVER ALL DEFINED PLC:S 
* 
	EJECT
* 
************* 
* EXTERNALS * 
************* 
* 
*    TOSS MONITOR 
* 
*      ROUTINES 
	EXTRN	TDISP	TOSS DISPATCHER
	EXTRN	QMJOB	QUEUE MONITOR JOB
	EXTRN	MEXIT	EXIT FROM MONITOR JOB
	EXTRN	GETBLK	GET MONITOR BLOCK 
	EXTRN	FREBLK	RETURN MONITOR BLOCK
	EXTRN	SAVE8	PUSH A1-A8 ON A15 STACK
	EXTRN	SETIME	SET TIMER 
*      DATA WORDS 
	EXTRN	PFPOST	POWER FAIL FLAG 
	EXTRN	INTSAV	LATEST INTERRUPT SAVE AREA
* 
* 
*    DRND01 SERVICE ROUTINES
* 
	EXTRN	NDSAV8	SAVE A3-A5, A7-A8 IN DWT
	EXTRN	NDGET8	GET A3-A5, A7-A8 FROM DWT 
	EXTRN	NDREWS	CALL RECOVERY FOR ALL DEV ON WS 
	EXTRN	NDREDW	CALL RECOVERY FOR DWT 
	EXTRN	NDGEDN	GET HIGEST DWT NUMBER ON WS 
	EXTRN	NDGEDW	GET DWT ADDRESS 
* 
	EJECT
* 
*    DRND01 ROUTINES FOR RETURN TO DEVICE DRIVER
* 
	EXTRN	NDREPO	POP, OK & RETURN
	EXTRN	NDRETO	OK & RETURN 
	EXTRN	NDREP	POP & RETURN 
	EXTRN	NDRET	RETURN 
* 
* 
*    DWT DISPLACEMENTS
* 
	EXTRN	DWTCHP	CHANNEL PARAMETERS
	EXTRN	DWTST	STATUS FLAGS 
	EXTRN	DWTOR	ORDER (RIGHT BYTE) 
	EXTRN	DWTADR	DRIVER ADDRESS BLOCK ADDRESS
	EXTRN	DWTOTQ	QUEUE LINK
	EXTRN	DWTCP2	SECOND CHANNEL PARAMETER WORD 
	EXTRN	DWTLD1	PLC INPUT/OUTPUT BUFFER ADDR
	EXTRN	DWTLD2	PLC FLOW CONTROL COUNTERS 
	EXTRN	DWTTBU	PLC TEST COMMANDS BUFFER ADDR 
	EXTRN	DWTTLN	PLC TEST COMMANDS BUFFER LENGTH 
	EXTRN	DWTTCW	PLC TEST COMMANDS SPECIAL PARAM 
	EXTRN	DWTWAT	WAIT/ACT INDICATOR	=16
* 
	EJECT
* 
*    WORK STATION TABLES
* 
	EXTRN	INTPL1	PLC 1 
	EXTRN	INTPL2	PLC 2 
	EXTRN	INTPL3	PLC 3 
	EXTRN	INTPL4	PLC 4 
* 
	EXTRN	INTPR1	REMOTE
	EXTRN	INTPR2	REMOTE
	EXTRN	INTPR3	REMOTE
	EXTRN	INTPR4	REMOTE
* 
*    MISCELLANEOUS
* 
	EXTRN	INTADR	INTERRUPT ADDR IN DRIVER ADDR BLOCK 
* 
	EJECT
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
* 
*	PLCNRL DEFINES NUMBER OF LOCAL PLC:S ACTUALLY CONNECTED (0-4) 
* 
X:A	EQU	1 
PLCNRL	EQU	X:A
* 
*	PLCNRR DEFINES THE NUMBER OF REMOTE PLC:S ACTUALLY CONN. (0-4)
* 
X:B	EQU	0 
PLCNRR	EQU	X:B
* 
* 
	EJECT
* 
************* 
* CONSTANTS * 
************* 
* 
*    SYSTEM PARAMETER DEFINITION
* 
*	LEVEL 3 FLOW CONTROL WINDOW SIZE (1-7)
WINDOW	EQU	2
* 
*	MAXIMAL NUMBER OF WORK STATIONS PER PLC (1-32)
MAXWS	EQU	32
* 
*	DELAY BEFORE EXECUTING "TEST CU" AT RESTART. (IN 100 MS)
STADLY	EQU	100	10 SECONDS 
* 
*	LENGTH OF USER PART OF SHORT OUTPUT BUFFER IN WORDS (1-128) 
SOBUFU	EQU	3
* 
*	LENGTH OF USER PART OF GENERAL READ BUFFER IN WORDS (1-128) 
GRBUFU	EQU	70 
* 
*        INACTIVITY TIMER (MINUTES) 
TIMACT	EQU	3	U	=8 
* 
*	POLLING FREQUENCY (L BYTE) & NUMBER OF RETRANSMISSIONS (R BYTE)	=11 
POLRTL	EQU	/1805	LOCAL	=11
POLRTR	EQU	/0D05	REMOTE	=11 
* 
*	IF PLCTST IS 1 THE PLC DIAGNOSTIC COMMANDS ARE HANDLED
*	BY THIS DRIVER. 
* 
PLCTST	EQU	0
* 
* 
*	A TEST VERSION OF THE DRIVER IS OBTAINED BY SETTING UTTEST><0 
*	IF UTTEST=1 THE TEST CODE IS INCLUDUD BUT TRAP IS NOT USED
*	IF UTTEST=2 THE TEST CODE IS INCLUDED AND TRAP IS USED
* 
UTTEST	EQU	0
* 
* 
*	LOBUFN IS THE NUMBER OF LONG OUTPUT BUFFERS USED
*	FOR EACH PLC (1-32) 
* 
LOBUFN	EQU	3
* 
* 
*	LOBUFU IS THE LENGTH OF THE USER PART OF A LONG 
*	OUTPUT BUFFER IN WORDS (1-128)
* 
LOBUFU	EQU	128	U	=6,=16 
* 
	EJECT
* 
*    HARDWARE INTERRUPT LEVELS
*	THESE LEVELS MUST CORRESPOND TO INTERRUPT 
*	VECTOR IN SYSTAB
* 
INTLV0	EQU	26	PLC NUMBER 1
INTLV1	EQU	27	PLC NUMBER 2
INTLV2	EQU	24	PLC NUMBER 3
INTLV3	EQU	25	PLC NUMBER 4
INTRV0	EQU	18	PLC NUMBER 5, REMOTE
INTRV1	EQU	19	           6, REMOTE
INTRV2	EQU	20	           7, REMOTE
INTRV3	EQU	21	           8, REMOTE
* 
*    CHANNEL UNIT DEVICE ADDRESSES
* 
PLCDA0	EQU	/06	PLC 1
PLCDA1	EQU	/07	PLC 2
PLCDA2	EQU	/26	PLC 3
PLCDA3	EQU	/27	PLC 4
PLCDA4	EQU	/3A	PLC 5
PLCDA5	EQU	/3B	PLC 6
PLCDA6	EQU	/2A	PLC 7
PLCDA7	EQU	/2B	PLC 8
* 
	EJECT
* 
*    BUFFER AREA PARAMETER DEFINITION 
* 
HEADLW	EQU	4	BUFFER HEADER LENGTH (WORDS) 
FLOWLW	EQU	2	FLOW CONTROL FIELD LENGTH (WORDS)
SYSTLW	EQU	HEADLW+FLOWLW	SYSTEM PART OF BUFFER
* 
*      LONG OUTPUT BUFFERS
LOBUF1	EQU	SYSTLW+LOBUFU	LENGTH OF ONE BUFFER (WORDS) 
LOBUF2	EQU	LOBUF1+LOBUF1	2 BUFFERS
LOBUF3	EQU	LOBUF2+LOBUF1
LOBUF4	EQU	LOBUF3+LOBUF1
LOBUF5	EQU	LOBUF4+LOBUF1
LOBUF6	EQU	LOBUF5+LOBUF1
LOBUF7	EQU	LOBUF6+LOBUF1	.	=17
LOBUF8	EQU	LOBUF7+LOBUF1	.	=17
LOBUF9	EQU	LOBUF8+LOBUF1	.	=17
LOBU10	EQU	LOBUF9+LOBUF1	.	=17
LOBU11	EQU	LOBU10+LOBUF1	.	=17
LOBU12	EQU	LOBU11+LOBUF1	.	=17
LOBU13	EQU	LOBU12+LOBUF1	.	=17
LOBU14	EQU	LOBU13+LOBUF1	.	=17
LOBU15	EQU	LOBU14+LOBUF1	.	=17
LOBU16	EQU	LOBU15+LOBUF1	.	=17
LOBU17	EQU	LOBU16+LOBUF1	.	=17
LOBU18	EQU	LOBU17+LOBUF1	,	=17
LOBU19	EQU	LOBU18+LOBUF1	.	=17
LOBU20	EQU	LOBU19+LOBUF1	.	=17
LOBU21	EQU	LOBU20+LOBUF1	.	=17
LOBU22	EQU	LOBU21+LOBUF1	.	=17
LOBU23	EQU	LOBU22+LOBUF1	.	=17
LOBU24	EQU	LOBU23+LOBUF1	.	=17
LOBU25	EQU	LOBU24+LOBUF1	.	=17
LOBU26	EQU	LOBU25+LOBUF1	.	=17
LOBU27	EQU	LOBU26+LOBUF1	.	=17
LOBU28	EQU	LOBU27+LOBUF1	.	=17
LOBU29	EQU	LOBU28+LOBUF1	.	=17
LOBU30	EQU	LOBU29+LOBUF1	.	=17
LOBU31	EQU	LOBU30+LOBUF1	.	=17
LOBU32	EQU	LOBU31+LOBUF1	.	=17
	IFT	LOBUFN=1 
LOBUFS	EQU	LOBUF1	LENGTH OF BUFFER AREA (WORDS) 
	XIF
	IFT	LOBUFN=2 
LOBUFS	EQU	LOBUF2	LENGTH OF BUFFER AREA (WORDS) 
	XIF
	IFT	LOBUFN=3 
LOBUFS	EQU	LOBUF3	LENGTH OF BUFFER AREA (WORDS) 
	XIF
	IFT	LOBUFN=4 
LOBUFS	EQU	LOBUF4	LENGTH OF BUFFER AREA (WORDS) 
	XIF
	IFT	LOBUFN=5 
LOBUFS	EQU	LOBUF5	LENGTH OF BUFFER AREA (WORDS) 
	XIF
	IFT	LOBUFN=6 
LOBUFS	EQU	LOBUF6	LENGTH OF BUFFER AREA (WORDS) 
	XIF
	IFT	LOBUFN=7	.	=17 
LOBUFS	EQU	LOBUF7	.	=17 
	XIF
	IFT	LOBUFN=8	.	=17 
LOBUFS	EQU	LOBUF8	.	=17 
	XIF
	IFT	LOBUFN=9	.	=17 
LOBUFS	EQU	LOBUF9	.	=17 
	XIF
	IFT	LOBUFN=10	.	=17
LOBUFS	EQU	LOBU10	.	=17 
	XIF
	IFT	LOBUFN=11	.	=17
LOBUFS	EQU	LOBU11	.	=17 
	XIF
	IFT	LOBUFN=12	.	=17
LOBUFS	EQU	LOBU12	.	=17 
	XIF
	IFT	LOBUFN=13	.	=17
LOBUFS	EQU	LOBU13	.	=17 
	XIF
	IFT	LOBUFN=14	.	=17
LOBUFS	EQU	LOBU14	.	=17 
	XIF
	IFT	LOBUFN=15	.	=17
LOBUFS	EQU	LOBU15	.	=17 
	XIF
	IFT	LOBUFN=16	.	=17
LOBUFS	EQU	LOBU16	.	=17 
	XIF
	IFT	LOBUFN=17	.	=17
LOBUFS	EQU	LOBU17	.	=17 
	XIF
	IFT	LOBUFN=18	.	=17
LOBUFS	EQU	LOBU18	.	=17 
	XIF
	IFT	LOBUFN=19	.	=17
LOBUFS	EQU	LOBU19	.	=17 
	XIF
	IFT	LOBUFN=20	.	=17
LOBUFS	EQU	LOBU20	.	=17 
	XIF
	IFT	LOBUFN=21	.	=17
LOBUFS	EQU	LOBU21	.	=17 
	XIF
	IFT	LOBUFN=22	.	=17
LOBUFS	EQU	LOBU22	.	=17 
	XIF
	IFT	LOBUFN=23	.17
LOBUFS	EQU	LOBU23	.	=17 
	XIF
	IFT	LOBUFN=24	.	=17
LOBUFS	EQU	LOBU24	.	=17 
	XIF
	IFT	LOBUFN=25	.	=17
LOBUFS	EQU	LOBU25	.	=17 
	XIF
	IFT	LOBUFN=26	.	=17
LOBUFS	EQU	LOBU26	.	=17 
	XIF
	IFT	LOBUFN=27	.	=17
LOBUFS	EQU	LOBU27	.	=17 
	XIF
	IFT	LOBUFN=28	.	=17
LOBUFS	EQU	LOBU28	.	=17 
	XIF
	IFT	LOBUFN=29	.	=17
LOBUFS	EQU	LOBU29	.	=17 
	XIF
	IFT	LOBUFN=30	.	=17
LOBUFS	EQU	LOBU30	.	=17 
	XIF
	IFT	LOBUFN=31	.	=17
LOBUFS	EQU	LOBU31	.	=17 
	XIF
	IFT	LOBUFN=32	.	=17
LOBUFS	EQU	LOBU32	.	=17 
	XIF
* 
	EJECT
* 
*      SHORT OUTPUT BUFFERS 
SOBUF1	EQU	SYSTLW+SOBUFU	LENGTH OF ONE BUFFER (WORDS) 
SOBUF2	EQU	SOBUF1+SOBUF1	2 BUFFERS
SOBUF4	EQU	SOBUF2+SOBUF2
SOBUF8	EQU	SOBUF4+SOBUF4
SOBUFS	EQU	SOBUF8	LENGTH OF BUFFER AREA (WORDS) 
* 
*      GENERAL READ BUFFERS 
GRBUF1	EQU	SYSTLW+GRBUFU	LENGTH OF ONE BUFFER (WORDS) 
GRBUF2	EQU	GRBUF1+GRBUF1
GRBUFS	EQU	GRBUF2	LENGTH OF BUFFER AREA (WORDS) 
* 
*      LENGTHS OF USER PART OF BUFFERS (BYTES)
SOBUFL	EQU	SOBUFU+SOBUFU	SHORT OUTPUT BUFFERS 
LOBUFL	EQU	LOBUFU+LOBUFU	LONG OUTPUT BUFFERS
GRBUFL	EQU	GRBUFU+GRBUFU	GENERAL READ BUFFERS 
* 
	EJECT
* 
*    CONTROLLER COMMAND RECORD (CCR) LAYOUT 
* 
CCRDLS	EQU	0	DATA LINK STATION INDEX
CCRCMD	EQU	1	COMMAND CODE 
CCRSU1	EQU	2	SUBCOMMAND BYTE 1
CCRSU2	EQU	3	SUBCOMMAND BYTE 2
CCRSUB	EQU	2	SUBCOMMAND WORD
CCRSTA	EQU	4	STATUS WORD
CCRIDB	EQU	7	IDENTITY, BYTE FIELD 
CCRIDW	EQU	8	IDENTITY, WORD FIELD 
CCRLEN	EQU	10	BUFFER LENGTH (BYTES) 
CCRC1B	EQU	12	DATA CHAINING CTRL & MSB BUFFER ADDR
CCRBUF	EQU	14	BUFFER ADDRESS
* 
* 
*    BUFFER LAYOUT
* 
*      HEADER LENGTH
BUFHLN	EQU	HEADLW+HEADLW	LENGTH (BYTES) 
*      HEADER LAYOUT
BUFLNK	EQU	-8	FREE LIST LINK
BUFDWT	EQU	-6	DWT ADDRESS 
BUFLEN	EQU	-4	LENGTH OF TEXT IN BUFFER
BUFBIX	EQU	-2	BYTE INDEX
*      X25 CONTROL FIELD LAYOUT 
X25LGN	EQU	0	LOGICAL CHANNEL GROUP NUMBER 
X25LCN	EQU	1	LOGICAL CHANNEL NUMBER 
X25FLW	EQU	2	FLOW CONTROL INFORMATION 
X25DAT	EQU	3	START OF USER DATA 
* 
	EJECT
* 
*    PLC COMMAND CODES
* 
CMDTC	EQU	/80	TEST CHANNEL UNIT 
CMDOP	EQU	/86	OPEN LINE 
CMDOD	EQU	/85	OPEN DLS
CMDPS	EQU	/84	GET LINE STATISTICS 
CMDDS	EQU	/83	GET DLS STATISTICS
CMDRM	EQU	/87	READ LOCAL MEMORY 
CMDSW	EQU	/40	STANDARD WRITE
CMDFW	EQU	/41	FAST WRITE
CMDGR	EQU	/20	GENERAL READ
* 
* 
*    APPLICATION TEST COMMAND CODES 
* 
ORDPS	EQU	1	GET LINE STATISTICS 
ORDDS	EQU	2	GER DLS STATISTICS
ORDRM	EQU	3	READ LOCAL MEMORY 
* 
* 
*    MESSAGE TYPES
* 
TYERR	EQU	0	ILLEGAL TYPE OR ERROR 
TYNFLO	EQU	2	DATA PACKET WITH NO FLOW CONTROL 
TYSTAT	EQU	4	DEVICE STATUS MESSAGE
TYDATA	EQU	6	NORMAL DATA PACKET 
TYRR	EQU	8	RECIEVE READY PACKET 
TYRES	EQU	10	RESET PACKET 
TYRESC	EQU	12	RESET CONFIRMATION PACKET 
* 
	EJECT
* 
*    DWT STATUS FLAGS (DWTST) 
* 
DWFBSY	EQU	/8000	DEVICE NOT BUSY
DWFECH	EQU	/2000	ECHO MODE
DWFINP	EQU	/0020	INPUT REQUESTED
DWFRES	EQU	/0008	RESET SEQUENCE ACTIVE
DWFAK3	EQU	/0004	WAITING FOR LEVEL 3 ACK
DWFPLC	EQU	DWFRES+DWFAK3	PLC FLAGS
DWFTY1	EQU	/0002	USE ONLY TYPE 1 DATA PACKETS 
DWFSAC	EQU	/0001	WAIT FOR LEVEL 3 ACK 
* 
* 
*    PLC STATUS FLAGS (CCRSTA)
* 
STANOC	EQU	/0001	NO CONNECTION
STALIR	EQU	/0004	LINK RESET 
STADNO	EQU	/1000	DCE NOT OPERABLE 
STAE1	EQU	STANOC+STALIR	DUMMY 
STAERR	EQU	STAE1+STADNO	ERROR IN COMMUNICATION
* 
STAREQ	EQU	/8000	REQUEST ERROR
STANOB	EQU	/0800	NO BUFFERS FOR CCR 
STAPOL	EQU	/0100	POLLING STOPPED
STACOM	EQU	/0080	COMMUNICATION REESTABLISHED
STASEQ	EQU	/0010	SEQUENCE ERROR 
STAILL	EQU	/0008	ILLEGAL LENGTH 
STALER	EQU	/0002	LINK ERROR 
* 
	EJECT
* 
*    WORK STATION STATUS FLAGS
* 
WSFERR	EQU	/01	COMMUNICATION ERROR
* 
* 
*    MASKS FOR CHANNEL PARAMETERS 
* 
MASKPL	EQU	/0F	PLC NUMBER (0-3 USED)
MASKWS	EQU	/3F	WORK STATION NUMBER (1-32 USED)
MASKLC	EQU	/3F	LOGICAL CHANNEL (0-7 USED) 
* 
* 
*    RETURN CODES 
* 
*      AT REQUEST RETURN
NOTOPR	EQU	/0001	NOT OPERABLE 
LINERR	EQU	/0004	LINK ERROR 
PLSERR	EQU	/0001	SOFTWARE ERROR 
*      AT RECOVERY ENTRY
RETCP	EQU	/0001	TC POWER UP 
RESECP	EQU	/0002	SECONDARY POWER UP 
RELINE	EQU	/0004	LINK ERROR 
* 
* 
*    MISCELLANEOUS
* 
PLCERR	EQU	/F1	SOP ERROR CODE AT TRAP 
CIDINT	EQU	8	OFFSET TO INTERRUPT DESCRIPTOR 
MAXFR	EQU	4	MAX OUTSTANDING FRAMES ON LEVEL 2 
CHABLO	EQU	/80	FLAG CHANGED BLOCKING	=16
* 
	EJECT
* 
**************
* DATA AREAS *
**************
* 
*    CWT ADDRESS TABLE
* 
CWTPLC	EQU	*
TABCWT	EQU	*
	IFF	PLCNRL=0 
	DATA	PL0CWT	CWT FOR PLC NR 1 
	IFF	PLCNRL=1 
	DATA	PL1CWT	CWT FOR PLC NR 2 
	IFF	PLCNRL=2 
	DATA	PL2CWT	CWT FOR PLC NR 3 
	IFF	PLCNRL=3 
	DATA	PL3CWT	CWT FOR PLC NR 4 
	XIF
* 
	IFF	PLCNRL=4 
	DATA	0	PLC NR 4 NOT CONNECTED
	IFF	PLCNRL=3 
	DATA	0	PLC NR 3 NOT CONNECTED
	IFF	PLCNRL=2 
	DATA	0	PLC NR 2 NOT CONNECTED
	IFF	PLCNRL=1		=5 
	DATA	0	PLC NR 1 NOT CONNECTED	=5 
	XIF
* 
	IFF	PLCNRR=0 
	DATA	PR1CWT	CWT FOR PLC NR. 5, REM.
	IFF	PLCNRR=1 
	DATA	PR2CWT	CWT FOR PLC NR. 6, REM.
	IFF	PLCNRR=2 
	DATA	PR3CWT	CWT FOR PLC NR. 7, REM.
	IFF	PLCNRR=3 
	DATA	PR4CWT	CWT FOR PLC NR. 8, REM.
	XIF
* 
	IFF	PLCNRR=4 
	DATA	0	PLC NR 8 NOT CONNECTED
	IFF	PLCNRR=3 
	DATA	0	PLC NR 7 NOT CONNECTED
	IFF	PLCNRR=2 
	DATA	0	PLC NR 6 NOT CONNECTED
	IFF	PLCNRR=1 
	DATA	0	PLC NR 5 NOT CONNECTED
	XIF
* 
	EJECT
* 
* 
OPARR1	EQU	*
	IFF	PLCNRR=0	U	=5
	DATA	OPNR10	LINE 0 
	DATA	OPNR11	LINE 1 
	DATA	OPNR12	LINE 2 
	DATA	OPNR13	LINE 3 
	XIF
OPARR2	EQU	*
	IFF	PLCNRR=0	U	=5
	IFF	PLCNRR=1	U	=5
	DATA	OPNR20	LINE 0 
	DATA	OPNR21	LINE 1 
	DATA	OPNR22	LINE 2 
	DATA	OPNR23	LINE 3 
	XIF
OPARR3	EQU	*
	IFF	PLCNRR=0	U	=5
	IFF	PLCNRR=1	U	=5
	IFF	PLCNRR=2	U	=5
	DATA	OPNR30	LINE 0 
	DATA	OPNR31	LINE 1 
	DATA	OPNR32	LINE 2 
	DATA	OPNR33	LINE 3 
	XIF
OPARR4	EQU	*
	IFF	PLCNRR=0	U	=5
	IFF	PLCNRR=1	U	=5
	IFF	PLCNRR=2	U	=5
	IFF	PLCNRR=3	U	=5
	DATA	OPNR40	LINE 0 
	DATA	OPNR41	LINE 1 
	DATA	OPNR42	LINE 2 
	DATA	OPNR43	LINE 3 
	XIF
* 
OPARL1	EQU	*	U	=5 
	DATA	OPNL10	LOCAL PLC 1	=5 
OPARL2	EQU	*	U	=5 
	DATA	OPNL20	LOCAL PLC 2	=5 
OPARL3	EQU	*	U	=5 
	DATA	OPNL30	LOCAL PLC 3	=5 
OPARL4	EQU	*	U	=5 
	DATA	OPNL40	LOCAL PLC 4	=5 
	EJECT
* 
*	OPEN LINE PARAMETER AREAS, LOCAL
* 
*   STANDARD AREAS :
*	PRIMARY STATION 
*	FULL DUPLEX 
*	96000 BITS/SEC
*	NO NRZI ENCODING
*	POLLING 24HZ	U	=8 
*	5 RETRANSMISSIONS 
*	3 MIN. TIME OUT 
* 
* 
OPNL40	EQU	*	LOCAL PLC 4, LINE 0
	IFF	PLCNRL=0 
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	IFF	PLCNRL=3 
	DATA	/0101,/A000,POLRTL,TIMACT,/0120,0	=8,=11
	XIF
OPNL30	EQU	*	LOCAL PLC 3, LINE 0
	IFF	PLCNRL=0 
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	DATA	/0101,/A000,POLRTL,TIMACT,/0120,0	=8,=11
	XIF
OPNL20	EQU	*	LOCAL PLC 2, LINE 0
	IFF	PLCNRL=0 
	IFF	PLCNRL=1 
	DATA	/0101,/A000,POLRTL,TIMACT,/0120,0	=8,=11
	XIF
OPNL10	EQU	*	LOCAL PLC 1, LINE 0
	IFF	PLCNRL=0 
	DATA	/0101,/A000,POLRTL,TIMACT,/0120,0	=8,=11
	XIF
* 
*	END OF LOCAL LINE PARAMETER AREAS 
* 
	EJECT
* 
*	OPEN LINE PARAMETER AREAS, REMOTE 
* 
*   STANDARD AREAS :
*	PRIMARY STATION 
*	FULL DUPLEX 
*	2400 BITS/SEC 
*	NO NRZI ENCODING
*	POLLING 13HZ
*	5 RETRANSMISSIONS 
*	5 MIN. TIME OUT 
* 
* 
*	REMOTE PLC 4
OPNR40	EQU	*	LINE 0 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFF	PLCNRR=3 
	DATA	/0103,/0400,POLRTR,TIMACT,/0108,0	=11 
	XIF
OPNR41	EQU	*	LINE 1 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFF	PLCNRR=3 
	DATA	/0103,/0400,POLRTR,TIMACT,/0908,0	=11 
	XIF
OPNR42	EQU	*	LINE 2 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFF	PLCNRR=3 
	DATA	/0103,/0400,POLRTR,TIMACT,/1108,0	=10,=11 
	XIF
OPNR43	EQU	*	LINE 3 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFF	PLCNRR=3 
	DATA	/0103,/0400,POLRTR,TIMACT,/1908,0	=10,=11 
	XIF
*	REMOTE PLC 3
OPNR30	EQU	*	LINE 0 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	DATA	/0103,/0400,POLRTR,TIMACT,/0108,0	=11 
	XIF
OPNR31	EQU	*	LINE 1 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	DATA	/0103,/0400,POLRTR,TIMACT,/0908,0	=11 
	XIF
OPNR32	EQU	*	LINE 2 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	DATA	/0103,/0400,POLRTR,TIMACT,/1108,0	=10,=11 
	XIF
OPNR33	EQU	*	LINE 3 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	DATA	/0103,/0400,POLRTR,TIMACT,/1908,0	=10,=11 
	XIF
* 
*	REMOTE PLC 2
OPNR20	EQU	*	LINE 0 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	DATA	/0103,/0400,POLRTR,TIMACT,/0108,0	=11 
	XIF
OPNR21	EQU	*	LINE 1 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	DATA	/0103,/0400,POLRTR,TIMACT,/0908,0	=11 
	XIF
OPNR22	EQU	*	LINE 2 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	DATA	/0103,/0400,POLRTR,TIMACT,/1108,0	=10,=11 
	XIF
OPNR23	EQU	*	LINE 3 
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	DATA	/0103,/0400,POLRTR,TIMACT,/1908,0	=10,=11 
	XIF
* 
*	REMOTE PLC 1
OPNR10	EQU	*	LINE 0 
	IFF	PLCNRR=0 
	DATA	/0103,/0400,POLRTR,TIMACT,/0108,0	=11 
	XIF
OPNR11	EQU	*	LINE 1 
	IFF	PLCNRR=0 
	DATA	/0103,/0400,POLRTR,TIMACT,/0908,0	=11 
	XIF
OPNR12	EQU	*	LINE 2 
	IFF	PLCNRR=0 
	DATA	/0103,/0400,POLRTR,TIMACT,/1108,0	=10,=11 
	XIF
OPNR13	EQU	*	LINE 3 
	IFF	PLCNRR=0 
	DATA	/0103,/0400,POLRTR,TIMACT,/1908,0	=10,=11 
	XIF
*	END OF REMOTE LINE PARAMETER AREAS
* 
* 
PLCPFP	DATA	0	PLC LOCAL POWER FAIL FLAG 
* 
	IFF	UTTEST=0	TEST VERSION OF DRIVER
* 
	EJECT
* 
UTTST	DATA	UTTEST	1 = TRAP NOT USED 
* 
* 
*    QUEUE STATISTICS COUNTERS
*	EACH COUNTER HAS ONE WORD / PLC 
* 
STATAR	EQU	*
WIQSTA	RES	8	WINDOW QUEUE 
SBQSTA	RES	8	SHORT BUFFERS QUEUE
LBQSTA	RES	8	LONG BUFFERS QUEUE 
CCQSTA	RES	8	CCA QUEUE
STATLN	EQU	*-STATAR	TABLE LENGTH
* 
	XIF
	EJECT
* 
* 
*   CWT DISPLACEMENTS 
* 
CWTOPR	EQU	/00	CU OPERABLE
CWTCCB	EQU	/02	CCA BUSY	
CWTGR	EQU	/04	GENERAL READ ALLOWED	 
CWTPNR	EQU	/06	CU NUMBER (0-7)
CWTABW	EQU	/08	WS TO ABORT
CWTPLS	EQU	/0A	LATEST PLC RCA STATUS
CWTLNO	EQU	/0C	LINE NO INDICATOR
CWTPAR	EQU	/0E	INDEX TO PARAMETER AREA	 
CWTOPP	EQU	/10	OPEN LINE PARAMETER AREA ADDRESS	=2
CWTINT	EQU	/12	WS TABLE ADDRESS	
CWTBUF	EQU	/14	INP. BUFFER ADDRESS	 
CWTSBQ	EQU	/16	QUEUE FOR SHORT OUTP. BUFFERS	 
CWTLBQ	EQU	/18	QUEUE FOR LONG OUTP. BUFFERS	
CWTCCQ	EQU	/1A	QUEUE FOR CCA FREE	
CWTMBQ	EQU	/1C	QUEUE OF ALLOCATED MON. BLOCKS	
CWTTPR	EQU	/1E	TIMER POINTER	 
CWTCIO	EQU	/20	CIO START INSTR.	
CWTST3	EQU	/22	SST INSTR.	
CWTCSD	EQU	/24	CTRL UNIT START DESCRIPTOR	
CWTCID	EQU	/2A	CTRL UNIT INTERF. DESCR.	
CWTCCA	EQU	/34	COMMAND CTRL AREA	 
CWTRCA	EQU	/44	RESPONSE CTRL AREA	
CWTPBS	EQU	/54	POOLBL. SHORT OUTP. BUFFERS	 
CWTPBL	EQU	/5E	POOLBL. LONG OUTP. BUFFERS	=2
CWTPBG	EQU	/68	POOLBL. GENERAL READ BUFFERS	
CWTWSS	EQU	/72	WS STATUS	 
CWTSOB	EQU	MAXWS+MAXWS+/74	SH. OUTP. BUFFERS	=4 
CWTLB1	EQU	CWTSOB+SOBUFS	U	=7 
CWTLOB	EQU	CWTLB1+SOBUFS	LONG OUTP. BUFFERS	=7
CWTGR1	EQU	CWTLOB+LOBUFS	U	=7 
CWTGRB	EQU	CWTGR1+LOBUFS	GEN. READ BUFFERS	=7 
	EJECT
* 
	IFF	PLCNRL=0		 
*    CWT FOR PLC NUMBER 1 
* 
PL0CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	0	PLC NUMBER (0-3)
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR 
	DATA	0	INDEX PARAMETER AREA
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARL1	OPEN LINE PARAMETER AREA ADDR
	DATA	INTPL1	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA0	START I/O OPERATION
	SST	A3,PLCDA0	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL0CWT+CWTCID	CID ADDRESS 
	DATA	INTLV0	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL0CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL0CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS 
	DATA	'SO',0	ID & FLAGS 
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
* 
* 
	XIF
	IFF	PLCNRL=1 
* 
	EJECT
* 
*    CWT FOR PLC NUMBER 2 
* 
PL1CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	1	PLC NUMBER (0-3)
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR 
	DATA	0	INDEX TO PARAMETER AREA 
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARL2	OPEN LINE PARAMETER AREA ADDR
	DATA	INTPL2	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA1	START I/O OPERATION
	SST	A3,PLCDA1	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL1CWT+CWTCID	CID ADDRESS 
	DATA	INTLV1	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL1CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL1CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS (5 WORDS / BLOCK) 
	DATA	'SO',0	ID = "SHORT OUTPUT" & FLAGS
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0	ID = "LONG OUTPUT" 
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0	ID = "GENERAL READ"
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
* 
* 
	IFF	PLCNRL=2 
* 
	EJECT
* 
*    CWT FOR PLC NUMBER 3 
* 
PL2CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	2	PLC NUMBER (0-3)
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR 
	DATA	0	INDEX TO PARAMETER AREA 
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARL3	OPEN LINE PARAMETER AREA ADDR
	DATA	INTPL3	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA2	START I/O OPERATION
	SST	A3,PLCDA2	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL2CWT+CWTCID	CID ADDRESS 
	DATA	INTLV2	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL2CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL2CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS (5 WORDS / BLOCK) 
	DATA	'SO',0	ID = "SHORT OUTPUT" & FLAGS
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0	ID = "LONG OUTPUT" 
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0	ID = "GENERAL READ"
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
* 
* 
	IFF	PLCNRL=3 
* 
	EJECT
* 
*    CWT FOR PLC NUMBER 4 
* 
PL3CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	3	PLC NUMBER (0-3)
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR 
	DATA	0	INDEX TO PARAMETER AREA 
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARL4	OPEN LINE PARAMETER AREA ADDR
	DATA	INTPL4	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA3	START I/O OPERATION
	SST	A3,PLCDA3	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL3CWT+CWTCID	CID ADDRESS 
	DATA	INTLV3	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL3CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PL3CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS (5 WORDS / BLOCK) 
	DATA	'SO',0	ID = "SHORT OUTPUT" & FLAGS
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0	ID = "LONG OUTPUT" 
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0	ID = "GENERAL READ"
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
	XIF
* 
	EJECT
	IFF	PLCNRR=0 
* 
*    CWT FOR PLC NUMBER 5 REMOTE
* 
PR1CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	4	PLC NUMBER (4-7)	=5 
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR 
	DATA	0	INDEX TO PARAMETER AREAS
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARR1	OPEN LINE PARAMETER AREA ADDRESSES 
	DATA	INTPR1	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA4	START I/O OPERATION
	SST	A3,PLCDA4	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR1CWT+CWTCID	CID ADDRESS 
	DATA	INTRV0	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR1CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR1CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS (5 WORDS / BLOCK) 
	DATA	'SO',0	ID = "SHORT OUTPUT" & FLAGS
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0	ID = "LONG OUTPUT" 
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0	ID = "GENERAL READ"
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
* 
* 
	EJECT
	IFF	PLCNRR=1 
* 
*    CWT FOR PLC NUMBER 6 REMOTE
* 
PR2CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	5	PLC NUMBER (4-7)	=5 
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR	=5
	DATA	0	INDEX TO PARAMETER AREAS	=5 
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARR2	OPEN LINE PARAMETER AREA ADDRESSES 
	DATA	INTPR2	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA5	START I/O OPERATION
	SST	A3,PLCDA5	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR2CWT+CWTCID	CID ADDRESS 
	DATA	INTRV1	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR2CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR2CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS (5 WORDS / BLOCK) 
	DATA	'SO',0	ID = "SHORT OUTPUT" & FLAGS
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0	ID = "LONG OUTPUT" 
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0	ID = "GENERAL READ"
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
* 
* 
	EJECT
	IFF	PLCNRR=2 
* 
*    CWT FOR PLC NUMBER 7 REMOTE
* 
PR3CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	6	PLC NUMBER (4-7)	=5 
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR 
	DATA	0	INDEX TO PARAMETER AREAS
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARR3	OPEN LINE PARAMETER AREA ADDRESSES 
	DATA	INTPR3	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA6	START I/O OPERATION
	SST	A3,PLCDA6	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR3CWT+CWTCID	CID ADDRESS 
	DATA	INTRV2	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR3CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR3CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS (5 WORDS / BLOCK) 
	DATA	'SO',0	ID = "SHORT OUTPUT" & FLAGS
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0	ID = "LONG OUTPUT" 
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0	ID = "GENERAL READ"
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
* 
* 
	EJECT
	IFF	PLCNRR=3 
* 
*    CWT FOR PLC NUMBER 8 REMOTE
* 
PR4CWT	EQU	*
* 
*      FLAGS
	RES	1	PLC OPERABLE FLAG
	DATA	0	CCA BUSY FLAG (0=FREE)
	DATA	1	GENERAL READ ALLOWED (0=ALLOWED)
* 
*      DATA WORDS 
	DATA	7	PLC NUMBER (4-7)	=5 
	DATA	0	WORK STATION TO ABORT (0=NO ABORT)
	DATA	0	LATEST PLC RCA STATUS 
	DATA	0	LINE NO INDICATOR 
	DATA	0	INDEX TO PARAMETER AREAS
* 
*      POINTERS AND QUEUE HEADS 
	DATA	OPARR4	OPEN LINE PARAMETER AREA ADDRESSES 
	DATA	INTPR4	WORK STATION TABLE ADDRESS 
	DATA	0	INPUT BUFFER ADDRESS
	DATA	0	QUEUE FOR SHORT OUTPUT BUFFER 
	DATA	0	QUEUE FOR LONG OUTPUT BUFFER
	DATA	0	QUEUE FOR CCA FREE
	DATA	0	QUEUE OF ALLOCATED MONITOR BLOCKS 
	DATA	0	TIMER POINTER FOR RESTART DELAY 
* 
*      INSTRUCTIONS 
	CIO	A3,1,PLCDA7	START I/O OPERATION
	SST	A3,PLCDA7	RELEASE RCA AND RESET INTERRUPT
* 
*      PLC CONTROL AREAS
*	CONTROL UNIT START DESCRIPTOR (3 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR4CWT+CWTCID	CID ADDRESS 
	DATA	INTRV3	INTERRUPT LEVEL
*	CONTROL UNIT INTERFACE DESCRIPTOR (5 WORDS) 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR4CWT+CWTCCA	CCA ADDRESS 
	DATA	0	DUMMY & MSB ADDRESS 
	DATA	PR4CWT+CWTRCA	RCA ADDRESS 
	DATA	0	INTERRUPT SPECIFICATION 
	RES	8	COMMAND CONTROL AREA 
	RES	8	RESPONSE CONTROL AREA
* 
*      POOLBLOCKS (5 WORDS / BLOCK) 
	DATA	'SO',0	ID = "SHORT OUTPUT" & FLAGS
	DATA	0,SOBUF1+SOBUF1	QUEUE HEAD & BUFFER LENGTH
	DATA	SOBUFS+SOBUFS	AREA LENGTH 
	DATA	'LO',0	ID = "LONG OUTPUT" 
	DATA	0,LOBUF1+LOBUF1 
	DATA	LOBUFS+LOBUFS 
	DATA	'GR',0	ID = "GENERAL READ"
	DATA	0,GRBUF1+GRBUF1 
	DATA	GRBUFS+GRBUFS 
* 
*      WORK STATION STATUS WORDS. 1 WORD / WS 
	RES	MAXWS+1	L BYTE = STATUS. R BYTE = FLAGS. 
* 
*      BUFFER AREAS 
	RES	SOBUFS	SHORT OUTPUT BUFFERS
	RES	LOBUFS	LONG OUTPUT BUFFERS 
	RES	GRBUFS	GENERAL READ BUFFERS
* 
* 
	XIF
	EJECT
* 
*    I/O COMPLETION DISPATCH TABLE
* 
*	THE MOST FREQUENTLY USED ROUTINES ARE PLACED
*	AT THE END OF THE TABLE, AS IT IS SCANNED 
*	FROM THE END. 
* 
CMDTAB	EQU	*
	DATA	CMDTC	COMMAND CODE "TEST CHANNEL UNIT"
	DATA	COMPTC	START OF "TEST CU" COMPLETION ROUTINE
	DATA	0	ALLOWED STATUS FOR "TEST CU" COMMAND
CMDTB1	EQU	*-CMDTAB	LENGTH OF ONE ENTRY 
	DATA	CMDOP	OPEN LINE 
	DATA	COMPOP
	DATA	0 
	DATA	CMDOD	OPEN DLS
	DATA	COMPOD
	DATA	STADNO+STANOC 
	IFT	PLCTST=1 
	DATA	CMDPS	GET LINE STATISTICS 
	DATA	COMPPS
STAE2	EQU	STAREQ+STAILL	DUMMY 
STAE3	EQU	STASEQ+STANOB	DUMMY 
	DATA	STAE2+STAE3 
	DATA	CMDDS	GET DLS STATISTICS
	DATA	COMPDS
	DATA	STAE2+STAE3 
	DATA	CMDRM	READ LOCAL MEMORY 
	DATA	COMPRM
	DATA	STAE2 
* 
	EJECT
* 
	XIF
	DATA	CMDSW	STANDARD WRITE
	DATA	COMPSW
	DATA	STAERR
	DATA	CMDFW	FAST WRITE
	DATA	COMPFW
	DATA	STAERR
	DATA	CMDGR	GENERAL READ
	DATA	COMPGR
	DATA	0 
CMDTBL	EQU	*-CMDTAB	TABLE LENGTH
* 
	EJECT
* 
*    READ COMPLETION DISPATCH TABLE 
* 
*	THIS TABLE IS INDEXED BY THE "MESSAGE TYPE" 
*	CONSTANTS DEFINED ABOVE.
REAROU	EQU	*
	DATA	GRERR1	ERROR ROUTINE
	DATA	GRERR1	DATA PACKET NO FLOW C. (NOT IMPLEM.) 
	DATA	GRSTAT	DEVICE STATUS DATA PACKET
	DATA	GRDATA	NORMAL DATA PACKET 
	DATA	GRRR	RECIEVE READY PACKET 
	DATA	GRRES	RESET PACKET
	DATA	GRERR1	RESET CONFIRM. PACKET (NOT IMPLEM.)
* 
* 
*    WRITE COMPLETION DISPATCH TABLE
* 
*	THIS TABLE IS INDEXED BY THE "MESSAGE TYPE" 
*	CONSTANTS DEFINED ABOVE.
WRIROU	EQU	*
	DATA	WRERR	ERROR ROUTINE 
	DATA	WRNFLO	DATA PACKET WITHOUT FLOW CONTROL 
	DATA	WRERR	DEVICE STATUS DATA (NOT RELEVANT) 
	DATA	WRDATA	NORMAL DATA PACKET 
	DATA	WRRR	RECIEVE READY PACKET 
	DATA	WRERR	RESET PACKET (NOT IMPLEMENTED)
	DATA	WRRESC	RESET CONFIRMATION PACKET
* 
	EJECT
* 
********************
* REQUEST ROUTINES *
********************
* 
*   THIS SECTION CONTAINS REQUEST HANDLING ROUTINES.
*   THE REQUEST ROUTINES ARE CALLED FROM TERMINAL 
*   DEVICE DRIVERS. THIS IS NORMALLY DONE THROUGH 
*   THE TERMINAL NETWORK DISTRIBUTOR DRIVER (DRND01). 
*   THE DISTRIBUTOR DRIVER WILL SWITCH CALL TO
*   CONNECTED LINE DRIVER. RETURN IS MADE DIRECTLY
*   FROM THIS DRIVER TO TERMINAL DEVICE DRIVER. 
*   A CALL WILL NORMALLY RESULT IN A WAIT FOR SOME
*   I/O ACTION AND DISPATCHING. THIS MEANS, THAT AT 
*   TIME OF CALL THE DEVICE DRIVER MAY NOT HAVE ANY 
*   DATA ON THE A15 STACK.
* 
*   ROUTINES IN ORDER OF APPEARANCE IN CODE:
* 
*	NAME	FUNCTION 
* 
*	PLCHRI	INPUT OF ONE CHARACTER 
*	PLSTBL	DEFINE START OF OUTPUT BLOCK 
*	PLCHRO	OUTPUT OF ONE CHARACTER
*	PLENBL	DEFINE END OF OUTPUT BLOCK 
*	PLTEST	PERFORM PLC TEST FUNCTION
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLCHRI
* 
* FUNCTION: 
*	THIS ROUTINE FETCHES ONE CHARACTER FROM THE 
*	INPUT BUFFER. IF NO BUFFER HAS ARRIVED, "INPUT
*	REQUESTED" FLAG IN DWT IS SET, AND CALLING
*	PROCESS IS SUSPENDED UNTIL A BUFFER ARRIVES.
* 
* CALL: 
*	ABI	INPTAB,A1 
*	CF	A5,PLCHRI
* 
* INPUT:
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	AT RETURN TO DEVICE DRIVER
*	A1  =	BITS 0-14  CHANGED
*		BIT 15  1 IF MORE CHAR IN BUFFER 
*	A2  =	BITS 0-7  ZERO
*		BITS 8-15  CHARACTER 
*	INTERR.	ENABLED 
* 
************************************************************
* 
PLCHRI	EQU	*
PRCHRI	EQU	*
	STR	A4,A15	PUSH A4 
	LD	A4,DWTLD1,A6	INPUT TEXT WAITING?
	RF(Z)	CI100	NO, WAIT FOR TEXT
* 
	EJECT
* 
	CF	A15,PLGECH	GET CHARACTER FROM BUFFER
	LDR	A1,A1	CHECK RETURN STATUS
	RF(N)	CI100	BUFFER EMPTY, WAIT FOR NEXT
	LDR*	A4,A15	POP A4 
	RF	CI110	RETURN TO DEVICE DRIVER 
* 
* 
CI100	EQU	* 
	LDR*	A4,A15	POP A4 
	LDK	A2,DWFINP	FLAG "INPUT REQUESTED" 
	ORS	A2,DWTST,A6	SET INPUT REQUESTED IN DWT 
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 IN DWT 
	ABL	PLDISP	LOCAL DISPATCHER
* 
* 
*    ENTRY IS MADE HERE WHEN A NEW BUFFER HAS ARRIVED 
*      REGISTERS ON ENTRY:
*	A1  =	NR OF CHARACTERS LEFT IN BUFFER 
*	A2  =	BITS 0-7  ZERO
*		BITS 8-15  CHARACTER 
*	A4  =	BUFFER ADDRESS
*	A6  =	DWT ADDRESS 
* 
INPRST	EQU	*
	LDKL	A3,/FFFF-DWFINP	MASK FOR INPUT REQUESTED
	ANS	A3,DWTST,A6	RESET FLAG 
	ST	A4,DWTLD1,A6	LINK BUFFER TO DWT 
* 
	CF	A15,NDGET8	GET A3-A5, A7-A8 FROM DWT
* 
	EJECT
* 
CI110	EQU	* 
*    RETURN TO DEVICE DRIVER
	LDR	A1,A1	ANY CHAR LEFT IN BUFFER? 
	RF(Z)	CI120	NO, CONTINUE 
	LDK	A1,1	INDICATE MORE CHARACTERS
	RF	CI130 
* 
CI120	EQU	* 
	CM	DWTLD1,A6	UNLINK BUFFER 
CI130	EQU	* 
	ENB
	RTN	A5 
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLSTBL
* 
* FUNCTION: 
*	THIS ROUTINE DEFINES START OF AN OUTPUT BLOCK.
*	IT ALLOCATES AN OUTPUT BUFFER, AND LINKS IT 
*	TO THE DWT. 
* 
* CALL: 
*	ABI	STBTAB,A1 
*	CF	A5,PLSTBL
* 
* INPUT:
*	A2  =	MAXIMAL LENGTH OF TEXT IN BLOCK (BYTES) 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	AT RETURN TO DEVICE DRIVER
*	A1  =	RETURN CODE 
*		0 IF OK
*		NOT 0 IF ERROR 
*	A2  =	DEVICE STATUS (IF RELEVANT, IE A1=0)
*	CR  =	CONTENTS OF A1
*	INTERR.	ENABLED 
* 
************************************************************
* 
PLSTBL	EQU	*
PRSTBL	EQU	*
	ENB
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 IN DWT 
	CF	A15,GETCWT	A5 := CWT ADDRESS
* 
	EJECT
* 
SB050	EQU	*	.	=16 
	LD	A1,DWTLD1,A6	BUFFER ALREADY ALLOCATED?
	ABL(NZ)	NDREPO	YES, SET OK & RETURN
	CF	A15,GETLCS	A1 := STATUS & INH 
	RF(NZ)	SBERR2	ERROR, RETURN
	LD	A3,DWTCHP,A6	CHANNEL PARAMETERS	=16 
	ANK	A3,CHABLO	CHANGED BLOCKING?	=16
	RF(Z)	SB070	NO	=16 
	LDKL	A2,LOBUFL	LOAD MAX BLOCK LENGTH	=16 
SB070	EQU	*	.	=16 
* 
*    CHECK LEVEL 3 WINDOW 
	LDR	A3,A2	SAVE MAX BLOCK LENGTH
	LD	A1,DWTST,A6	DWT STATUS
	ANKL	A1,DWFECH+DWFTY1	ECHO OR ONLY TYPE 1? 
	RF(NZ)	SB090	YES, DON'T CHECK WINDOW 
	CF	A15,GETOFR	A2 := NR OF OUTSTANDING FRAMES 
	LDR	A2,A2	ANY FRAMES OUTSTANDING?
	RF(Z)	SB090	NO, CONTINUE 
	LD	A1,DWTST,A6	DWT STATUS
	ANK	A1,DWFSAC	ALWAYS WAIT FOR LEVEL 3 ACK? 
	RF(NZ)	SBERR	YES, NO FRAMES MAY BE OUT. ERROR
	SUK	A2,WINDOW	WINDOW FULL? 
	RF(N)	SB090	NO, CONTINUE 
*	DWT WILL HAVE TO WAIT UNTIL WINDOW IS OPEN
	ST	A3,DWTLD1,A6	SAVE REQUESTED BUFFER LENGTH 
	LDK	A1,DWFAK3	FLAG "WAITING FOR LEVEL 3 ACK" 
	ORS	A1,DWTST,A6	SET FLAG IN DWT STATUS 
	IFF	UTTEST=0	QUEUE STATISTICS
	LD	A1,CWTPNR,A5	PLC NUMBER 
	SLA	A1,1	MAKE INDEX
	IM	WIQSTA,A1	INCREMENT QUEUE STATISTICS COUNTER
	XIF
	ABL	PLDSP2	LOCAL DISPATCHER
* 
* 
*    ENTRY IS MADE HERE WHEN WINDOW IS OPEN AGAIN 
*     (AFTER A LEVEL 3 ACK) 
*      REGISTER CONTENTS ON ENTRY:
*	A1  =	RETURN CODE 
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
WINRST	EQU	*
	LD	A3,DWTLD1,A6	RESTORE REQUESTED BUFFER LENGTH
	CM	DWTLD1,A6 
	LDR	A1,A1	RETURN CODE
	RF(NZ)	SBERR2	ERROR, RETURN TO DEVICE DRIVER 
* 
* 
SB090	EQU	* 
	LDR	A7,A5
	CWK	A3,SOBUFL	SHORT BUFFER ENOUGH? 
	RF(G)	SB100	NO, TAKE LONG BUFFER 
* 
*    ALLOCATE SHORT OUTPUT BUFFER 
	ADK	A7,CWTPBS	POOLBLOCK FOR SHORT BUFFERS
	CF	A15,PLGTBU	ALLOCATE BUFFER
	RF(NZ)	SB120	COMMON PART FOR SHORT/LONG
	LDK	A7,CWTSBQ	NO BUFFER LEFT. SET QUEUE HEAD 
	IFF	UTTEST=0	QUEUE STATISTICS
	LD	A1,CWTPNR,A5	PLC NUMBER 
	SLA	A1,1	MAKE INDEX
	IM	SBQSTA,A1	INCREMENT QUEUE STATISTICS COUNTER
	XIF
	RF	SB110	COMMON PART FOR NO BUFFER 
* 
SB100	EQU	* 
	CWK	A3,LOBUFL	LONG BUFFER ENOUGH?
	RF(G)	SBERR	NO, ERROR
*    ALLOCATE LONG OUTPUT BUFFER
	ADK	A7,CWTPBL	POOLBLOCK FOR LONG BUFFERS 
	CF	A15,PLGTBU	ALLOCATE BUFFER
	RF(NZ)	SB120	COMMON PART FOR SHORT/LONG
	LDK	A7,CWTLBQ	NO BUFFER LEFT. SET QUEUE HEAD 
	IFF	UTTEST=0	QUEUE STATISTICS
	LD	A1,CWTPNR,A5	PLC NUMBER 
	SLA	A1,1	MAKE INDEX
	IM	LBQSTA,A1	INCREMENT QUEUE STATISTICS COUNTER
	XIF
* 
SB110	EQU	* 
*    NO BUFFER WAS AVAILABLE. PUT REQUEST IN QUEUE. 
	ADR	A7,A5	A7 := QUEUE HEAD ADDRESS 
	LDR	A4,A6	DWT ADDRESS
	ADKL	A4,DWTOTQ	QUEUE LINK ADDRESS
	CF	A15,LNKLST	PUT LAST IN QUEUE
	ABL	PLDSP2	LOCAL DISPATCHER
* 
* 
*    ENTRY IS MADE HERE WHEN A BUFFER IS FREE 
*    REGISTERS ON ENTRY:
*	A1  =	RETURN CODE 
*	A4  =	BUFFER ADDRESS (IF A1=0)
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
BUFRST	EQU	*
	LDR	A1,A1	RETURN CODE
	RF(NZ)	SBERR2	RETURN IF ERROR
SB120	EQU	* 
	LDK	A2,X25DAT	LENGTH OF X25 HEADER 
	ST	A2,BUFBIX,A4	BYTE INDEX := START OF DATA
	ST	A4,DWTLD1,A6	SAVE BUFFER ADDRESS IN DWT 
* 
	ABL	NDREPO	RETURN TO DEVICE DRIVER 
*			 RETURN CODE := OK
* 
* 
SBERR	EQU	* 
	LDK	A1,PLSERR	RET CODE := SW ERROR 
SBERR2	EQU	*
	LDK	A2,0	RESET DEVICE STATUS 
	ABL	NDREP	RETURN TO DEVICE DRIVER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLCHRO
* 
* FUNCTION: 
*	THIS ROUTINE WRITES ONE CHARACTER TO OUTPUT BUFFER. 
* 
* CALL: 
*	ABI	OUPTAB,A1 
*	CF	A5,PLCHRO
* 
* INPUT:
*	A2  =	BITS 0-7  IRRELEVANT
*		BITS 8-15  CHARACTER 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	AT RETURN TO DEVICE DRIVER
*	A1  =	RETURN CODE 
*		0 IF OK
*		NOT 0 IF ERROR 
*	A2  =	DEVICE STATUS (IF RELEVANT, IE A1=0)
*	CR  =	CONTENTS OF A1
*	INTERR.	ENABLED 
* 
************************************************************
* 
PLCHRO	EQU	*
PRCHRO	EQU	*
	ENB
* 
	EJECT
* 
	STR	A4,A15	PUSH A4 
	LD	A4,DWTLD1,A6	BUFFER ADDRESS 
	RF(Z)	COERR2	ERROR IF NO BUFFER
	CF	A15,PLPUCH	PUT CHARACTER IN BUFFER
	LDR	A1,A1	CHECK RETURN CODE
	RF(NZ)	COERR1	ERROR IF BUFFER FULL 
	LD	A2,BUFBIX,A4	BUFFER INDEX	=16 
* 
	LDR*	A4,A15	POP A4 
*	RETURN DIRECTLY INSTEAD OF THROUGH NDRETO TO GET
*	FASTER PROCESSING.
	CWK	A2,LOBUFL+3	BUFFER FULL?	=16 
	RF(NE)	OP100	NO	=16
	LD	A2,DWTCHP,A6	CHANNEL PARAMETER	=16
	ANK	A2,CHABLO	CHANGED BLOCKING?	=16
	RF(NZ)	EB050	YES SEND BUFFER	=16 
OP100	EQU	*	.	=16 
	ENB
	ADK	A5,4	ADJUST STACK
	LDR	A2,A1	DEVICE STATUS & RET CODE := OK 
	ABR*	A5	RETURN TO DEVICE DRIVER
* 
* 
COERR1	EQU	*
	CF	A15,PLRLBU	RELEASE BUFFER 
	CM	DWTLD1,A6	INDICATE NO BUFFER
COERR2	EQU	*
	LDR*	A4,A15	POP A4 
	LDK	A1,PLSERR	RET CODE := SW ERROR 
	ABL	NDRET	RETURN TO DEVICE DRIVER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLENBL
* 
* FUNCTION: 
*	THIS ROUTINE DEFINES END OF OUTPUT BLOCK. 
*	IT SENDS THE BLOCK TO PLC AND WAITS FOR 
*	ACKNOWLEDGE.
* 
* CALL: 
*	ABI	ENBTAB,A1 
*	CF	A5,PLENBL
* 
* INPUT:
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	AT RETURN TO DEVICE DRIVER
*	A1  =	RETURN CODE 
*		0 IF OK
*		NOT 0 IF ERROR 
*	A2  =	DEVICE STATUS (IF RELEVANT, IE A1=0)
*	CR  =	CONTENTS OF A1
*	INTERR.	ENABLED 
* 
************************************************************
* 
PLENBL	EQU	*
PRENBL	EQU	*
	LDK	A1,0	SET RETURN CODE OK	=16
	LD	A2,DWTWAT,A6	GET WAIT/ACT INDICATOR	=16 
	SUK	A2,1	.	=16 
	RF(Z)	EB040	.	=16
	LDKL	A2,/FFFF-CHABLO	RESET CHANGED BLOCKING	=16
	ANS	A2,DWTCHP,A6	.	=16 
EB040	EQU	*	.	=16 
	LD	A2,DWTCHP,A6	CHANNEL PARAMETER	=16
	ANK	A2,CHABLO	CHANGED BLOCKING	=16 
	RB(NZ)	OP100	YES, RETURN	=16 
EB050	EQU	*	.	=16 
	ENB
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 IN DWT 
	CF	A15,GETCWT	A5 := CWT ADDRESS
* 
	EJECT
* 
	LDK	A1,PLSERR	SET RET CODE JUST IN CASE
	LD	A2,DWTLD1,A6	BUFFER ADDRESS 
	ABL(Z)	NDREPO	ERROR IF NO BUFFER. RETURN	=16 
	CF	A15,GETLCS	A1 := STATUS & INH 
	RF(NZ)	EBERR1	RETURN IF ERROR
* 
	LDR	A3,A6	DWT ADDRESS
	ADKL	A3,DWTOTQ	QUEUE POINTER 
	CF	A15,PLCCCS	RESERVE CCA
	CM	DWTOTQ,A6	RESET QUEUE ELEMENT POINTER 
	LDR	A1,A1	RETURN CODE
	RF(NZ)	EBERR1	RETURN IF ERROR
* 
*    WRITE PARAMETERS IN CCA AND X25 HEADER 
	ENB
	LD	A4,DWTLD1,A6	BUFFER ADDRESS 
	ST	A4,CWTCCA+CCRBUF,A5	TO CCA
	CM	CWTCCA+CCRC1B,A5	RESET DATA CHAINING & MSB OF ADDR
	LDK	A3,CMDFW	ASSUME FAST WRITE 
	LD	A2,DWTST,A6	DEVICE STATUS 
	LDR	A7,A2	SAVE 
	ANKL	A7,DWFECH	ECHO OUTPUT?
	RF(NZ)	EB090	YES, USE TYPE 1 
	LDK	A3,CMDSW	NOT ECHO, USE STANDARD WRITE
	ANK	A2,DWFTY1	ONLY TYPE 1 ALLOWED? 
	RF(Z)	EB100	NO, USE TYPE 2 
* 
	EJECT
* 
EB090	EQU	* 
*      NO FLOW CONTROL
	CF	A15,WRADR1	WRITE LINE ADDRESS. NO FLOW C
	LDK	A2,TYNFLO	MESSAGE TYPE := NO FLOW CONTROL
	RF	EB110	CONTINUE
* 
EB100	EQU	* 
*      FLOW CONTROL 
	CF	A15,WRADR2	WRITE LINE ADDRESS. FLOW CTRL
	CF	A15,FWOPSR	FETCH AND UPDATE FLOW CONTROL
	SC	A2,X25FLW,A4	P(R) & P(S) TO PACKET
	LDK	A2,TYDATA	MESSAGE TYPE := NORMAL DATA
* 
EB110	EQU	* 
	SC	A2,CWTCCA+CCRIDB,A5	MESSAGE TYPE TO CCA 
	SC	A3,CWTCCA+CCRCMD,A5	COMMAND TO CCA
	ST	A6,CWTCCA+CCRIDW,A5	DWT ADDRESS TO CCA
	LD	A3,BUFBIX,A4	BYTE INDEX 
	ST	A3,CWTCCA+CCRLEN,A5	BUFFER LENGTH TO CCA
* 
	CF	A15,GETLCS	A1 := STATUS & INH 
	RF(NZ)	EBERR2	RETURN IF ERROR
	CF	A15,PLCCIO	EXECUTE CIO START
	RF(NZ)	EBERR1	HANDLE ERROR 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
*    ENTRY TO ACKRST IS MADE WHEN I/O OPERATION 
*    IS COMPLETED.
*      REGISTER CONTENTS ON ENTRY:
*	A1  =	RETURN CODE 
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
*	A7  =	MESSAGE TYPE
* 
ACKRST	EQU	*
	LDK	A2,0	RESET DEVICE STATUS 
	LDR	A1,A1	ANY ERROR? 
	RF(NZ)	EB130	YES, RETURN 
* 
	LD	A3,DWTST,A6	DWT STATUS
	LDR	A4,A3
	ANK	A4,DWFRES	RESET PACKET RECIEVED? 
	RF(Z)	EB120	NO 
	LDK	A1,LINERR	YES. RET CODE := LINK RESET
	RF	EB130	RETURN
* 
EB120	EQU	* 
	CWK	A7,TYNFLO	PACKET WITH NO FLOW CONTROL? 
	RF(E)	EB130	YES, RETURN
	ANK	A3,DWFSAC	WAIT FOR LEVEL 3 ACK?
	RF(Z)	EB130	NO, RETURN 
* 
	LDK	A3,DWFAK3	FLAG "WAITING FOR LEVEL 3 ACK" 
	ORS	A3,DWTST,A6	SET FLAG IN DWT STATUS 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
*    ENTRY IS MADE HERE WHEN ACK ON LEVEL 3 HAVE BEEN RECIEVED
*      REGISTER CONTENTS ON ENTRY:
*	A1  =	RETURN CODE 
*	A2  =	DEVICE STATUS (IF RELEVANT, IE A1=0)
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
AK3RST	EQU	*
* 
EB130	EQU	* 
* 
	LD	A2,DWTCHP,A6	CHANNEL PARAMETER	=16
	ANK	A2,CHABLO	CHANGED BLOCKING?	=16
	ABL(NZ)	SB050	YES, START NEW BLOCK	=16 
	ABL	NDREP	RETURN TO DEVICE DRIVER
* 
* 
* 
EBERR2	EQU	*
	CM	CWTCCB,A5	SET CCA FREE
EBERR1	EQU	*
	LD	A4,DWTLD1,A6	OUTPUT BUFFER ADDRESS
	CF	A15,PLRLBU	RELEASE BUFFER 
	CM	DWTLD1,A6	INDICATE NO BUFFER
	CM	DWTLD2,A6	RESET FLOW CONTROL
	ABL	NDREP	RETURN TO DEVICE DRIVER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLTEST
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES TEST COMMANDS FOR PLC. 
*	THE TEST COMMANDS ARE GENERATED BY A TEST 
*	COMMAND "DRIVER" WITH AN INTERFACE SIMILAR TO 
*	THAT OF THE NORMAL TERMINAL DEVICE DRIVERS. 
*	CALL IS MADE DIRECTLY TO THE PLC DRIVER, AND
*	NOT THROUGH THE TERMINAL NETWORK DISTRIBUTOR, 
*	AS THIS FUNCTION IS NOT AVAILABLE FOR OTHER 
*	LINE DRIVERS. 
* 
* CALL: 
*	CF	A5,PLTEST
* 
* INPUT:
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	AT RETURN TO DEVICE DRIVER
*	A1  =	RETURN CODE 
*		0 IF OK
*		NOT 0 IF ERROR 
*	A2  =	CHANGED 
*	CR  =	CONTENTS OF A1
*	INTERR.	ENABLED 
* 
************************************************************
* 
	EJECT
* 
PLTEST	EQU	*
	IFT	PLCTST=1 
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 IN DWT 
	CF	A15,GETCWT	A5 := CWT ADDRESS
	CF	A15,PLCCCA	RESERVE CCA
* 
	ENB
	ST	A6,CWTCCA+CCRIDW,A5	DWT ADDRESS TO CCA
	CM	CWTCCA+CCRC1B,A5	DATA CHAINING & MSB OF BUFFER ADDR 
	LD	A4,DWTTBU,A6	USER REQUEST BUFFER ADDRESS
	ST	A4,CWTCCA+CCRBUF,A5	TO CCA
	LD	A2,DWTTLN,A6	USER REQUEST BUFFER LENGTH 
	ST	A2,CWTCCA+CCRLEN,A5	LENGTH TO CCA 
	LD	A3,DWTTCW,A6	USER REQUEST CONTROL WORD
* 
*    DETERMINE TYPE OF TEST ORDER 
	LC	A1,DWTOR+1,A6	USER REQUEST ORDER CODE 
	ANK	A1,/3F	CLEAN 
	CWK	A1,ORDPS	GET LINE STATISTICS?
	RF(E)	TE100	YES, HANDLE
	CWK	A1,ORDDS	GET DLS STATISTICS? 
	RF(E)	TE110	YES, HANDLE
	CWK	A1,ORDRM	READ LOCAL MEMORY?
	RF(NE)	TEERR2	NO, COMMAND NOT DEFINED. ERROR 
* 
*    READ LOCAL MEMORY
	ST	A3,CWTCCA+CCRSUB,A5	PLC MEMORY ADDRESS TO CCA 
	LDK	A3,CMDRM	PLC COMMAND READ LOCAL MEMORY 
	RF	TE120	TO COMMON PART
* 
TE100	EQU	* 
*    GET LINE STATISTICS
	SC	A3,CWTCCA+CCRSU1,A5	STORE LINE NUMBER (0-3)	=12 
	LDK	A3,CMDPS	PLC COMMAND GET LINE STATISTICS 
	RF	TE120	TO COMMON PART
* 
TE110	EQU	* 
*    GET DLS STATISTICS 
	LC	A3,DWTCP2,A6	CHANNEL PARAMETER
	ANK	A3,MASKWS	CLEAN WS NUMBER
	SLL	A3,8	TO LEFT BYTE
	ADK	A3,CMDDS	PLC COMMAND GET DLS STATISTICS
* 
TE120	EQU	* 
	ST	A3,CWTCCA+CCRDLS,A5	DLS INDEX & COMMAND TO CCA
* 
	CF	A15,PLCCIO	EXECUTE CIO START
	RF(NZ)	TEERR1	ERROR. HANDLE
	ABL	PLDSP2	LOCAL DISPATCER. WAIT 
* 
* 
*    ENTRY IS MADE TO TSTRST WHEN COMMAND IS COMPLETED. 
*      REGISTER CONTENTS ON ENTRY:
*	A1  =	RETURN CODE 
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
TSTRST	EQU	*
	ABL	NDREP	RETURN TO DEVICE DRIVER
* 
* 
TEERR2	EQU	*
	CM	CWTCCB,A5	INDICATE CCA FREE 
	LDK	A1,PLSERR	RET CODE := SW ERROR 
TEERR1	EQU	*
	ABL	NDREP	RETURN TO DEVICE DRIVER
	XIF
* 
	EJECT
* 
**********************
* INTERRUPT ROUTINES *
**********************
* 
*   THIS SECTION CONTAINS INTERRUPT HANDLING ROUTINES.
*   IT IS ENTERED IMMEDIATELY AT A RELEASE, 
*   ATTENTION OR I/O COMPLETION INTERRUPT.
*   ALL ROUTINES ARE EXECUTED 
*   ON INTERRUPT PRIORITY. AFTER PROCESSING, EXIT IS
*   MADE EITHER TO SOME ROUTINE WAITING FOR THE INTERRUPT,
*   TO THE LOCAL PLC DISPATCHER OR TO TOSS DISPATCHER.
*   ON EXIT, A15 STACK CONTAINS INTERRUPT RETURN AND
*   A1-A8.
* 
* 
*   ROUTINES IN ORDER OF APPEARANCE IN CODE:
* 
*	NAME	FUNCTION 
* 
*	IHPL	INTERRUPT ENTRY
*	PLIHR	HANDLE RELEASE INTERRUPT
*	PLIHA	HANDLE ATTENTION INTERRUPT
*	PLIHC	HANDLE I/O COMPLETION INTERRUPT 
*	COMPSTA	HANDLE COMPLETION OF START COMMANDS 
*		 (TEST CU, OPEN LINE, OPEN DLS)
*	COMPTEST	HANDLE COMPLETION OF TEST COMMANDS 
*		 (PLC STATISTICS, DLS STAT., READ LOCAL MEMORY)
*	COMPWRI	HANDLE COMPLETION OF WRITE COMMANDS 
*	COMPGR	HANDLE COMPLETION OF GENERAL READ COMMANDS 
*	GRERR	HANDLE ERRORS AT GENERAL READ 
*	GRSACK	HANDLE STATUS AND RR MESSAGE FROM DEVICE 
*	GRDATA	HANDLE DATA INPUT FROM DEVICE
*	GRRES	HANDLE RESET MESSAGE FROM SECONDARY 
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	IHPL
* 
* FUNCTION: 
*	THIS ROUTINE CONTAINS INTERRUPT ENTRIES FOR 
*	ALL PLC:S INCLUDED. IT SAVES A1-A8, SETS CWT
*	ADDRESS AND EXITS TO RELEASE OR I/O COMPLETION
*	INTERRUPT HANDLER.
* 
* CALL: 
*	HARDWARE INTERRUPT
* 
* INPUT:
*	A15 =	SYSTEM STACK POINTER
*	INTERR.	INHIBITED 
*	MODE	SYSTEM 
* 
* OUTPUT: 
*	A5  =	CWT ADDRESS 
* 
************************************************************
* 
IHPL01	EQU	*
	IFF PLCNRL=0	U	=5
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
	IFF	PLCNRL=0	U	=5
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
* 
	IFF	PLCNRL=0	U	=5
	LDKL	A5,PL0CWT	CWT ADDRESS, PLC 0
	RF	IHPL	COMMON PART, ALL PLC:S 
	XIF
* 
	EJECT
* 
IHPL02	EQU	*
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
* 
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
* 
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	LDKL	A5,PL1CWT	CWT ADDRESS, PLC 1
	RF	IHPL	COMMON PART, ALL PLC:S 
	XIF
* 
IHPL03	EQU	*
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
* 
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
* 
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	LDKL	A5,PL2CWT	CWT ADDRESS, PLC 2
	RF	IHPL	COMMON PART, ALL PLC:S 
	XIF
* 
IHPL04	EQU	*
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	IFF	PLCNRL=3 
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
* 
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	IFF	PLCNRL=3 
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
* 
	IFF	PLCNRL=0	U	=5
	IFF	PLCNRL=1 
	IFF	PLCNRL=2 
	IFF	PLCNRL=3 
	LDKL	A5,PL3CWT	CWT ADDRESS, PLC 3
	RF	IHPL	COMMON PART, ALL PLC:S 
	XIF
* 
IHPR01	EQU	*
	IFF	PLCNRR=0 
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
	IFF	PLCNRR=0 
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
	IFF	PLCNRR=0 
	LDKL	A5,PR1CWT	CWTADDRESS PLC 1 REMOTE 
	RF	IHPL	COMMON PART ALL CWT:S
	XIF
IHPR02	EQU	*
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	LDKL	A5,PR2CWT	CWTADDRESS PLC 2 REMOTE 
	RF	IHPL	COMMON PART ALL CWT:S
	XIF
IHPR03	EQU	*
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	LDKL	A5,PR3CWT	CWTADDRESS PLC 3 REMOTE 
	RF	IHPL	COMMON PART ALL PLC:S
	XIF
IHPR04	EQU	*
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFF	PLCNRR=3 
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2 
	IFF	PLCNRR=3 
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
	IFF	PLCNRR=0 
	IFF	PLCNRR=1 
	IFF	PLCNRR=2	U	=9
	IFF	PLCNRR=3	U	=9
	LDKL	A5,PR4CWT	CWTADDRESS PLC 4 REMOTE 
	RF	IHPL	COMMON PART ALL CWT:S
	XIF
	EJECT
* 
IHPL	EQU	*
	ST	P,INTSAV	SAVE LATEST INTERRUPT
	LDK	A1,0	RESET HIGH BYTE 
	LC	A1,CWTCID+CIDINT,A5	INTERRUPT SOURCE
	CWK	A1,/40	RELEASE?
	RF(E)	PLIHR	YES, HANDLE
	CWK	A1,/20	I/O COMPLETION? 
	RF(E)	PLIHC	YES, HANDLE
	CWK	A1,/80	ATTENTION?
	RF(E)	PLIHA	YES, HANDLE
* 
	CF	A15,PLCNOP	ILLEGAL CODE, SET NOT OPERABLE 
	ABL	TDISP	EXIT 
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLIHR 
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES RELEASE INTERRUPTS.
*	IT RESETS THE INTERRUPT, AND IF ANOTHER 
*	PROCESS IS WAITING FOR THE CCA, RETURN
*	IS MADE TO CCA ALLOCATION ROUTINE.
* 
* CALL: 
*	RF	PLIHR
* 
* INPUT:
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	IF PROCESS WAITING
*	A4  =	BLOCK ADDRESS OF WAITING PROCESS
*	A5  =	CWT ADDRESS 
* 
************************************************************
* 
PLIHR	EQU	* 
	EX	CWTST3,A5	RESET INTERRUPT 
	LD	A4,CWTCCQ,A5	PROCESS WAITING FOR CCA? 
	ABL(NZ)	CCARST	YES, ACTIVATE PROCESS 
	CM	CWTCCB,A5	NO, SET CCA FREE
	ABL	TDISP	EXIT 
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLIHA 
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES ATTENTION INTERRUPTS. IF 
*	ERROR, IT SETS AN ERROR CODE AND STARTS ABORT 
*	OF ALL CALLS. IF COMMUNICATION REESTABLISHED, 
*	IT STARTS RECOVERY. 
* 
* CALL: 
*	RF	PLIHA
* 
* INPUT:
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	A5  =	CWT ADDRESS 
*	A6  =	WS NUMBER 
* 
************************************************************
* 
PLIHA	EQU	* 
	LD	A1,CWTRCA+CCRSTA,A5	PLC STATUS
	ST	A1,CWTPLS,A5	SAVE FOR TESTING 
	IFF	UTTEST=0 
	CF	A15,LOGATT	LOG RCA
	XIF
	LC	A6,CWTRCA+CCRDLS,A5	WS NUMBER 
	ANK	A6,MASKWS	CLEAN
	EX	CWTST3,A5	RELEASE RCA 
* 
	EJECT
* 
	LDKL	A2,/FFFF-STACOM-STAERR
*			 MASK FOR ALLOWED ERRORS
	ANR	A2,A1	FATAL ERROR? 
	RF(Z)	IA100	NO, CONTINUE 
	CF	A15,PLCNOP	SET PLC NOT OPERABLE 
	ABL	TDISP	EXIT 
* 
IA100	EQU	* 
	LDR	A2,A1	STATUS 
	ANK	A2,STACOM	COMMUNICATION REESTABLISHED? 
	ABL(NZ)	PLREWS	YES, START RECOVERY OF WS 
* 
	LDR	A2,A6	WS NUMBER
	CF	A15,STAHAN	HANDLE ERROR STATUS
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLIHC 
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES I/O COMPLETION INTERRUPTS. 
*	IT CHECKS WHICH COMMAND THAT HAS BEEN COMPLETED,
*	AND EXITS TO CORRESPONDING COMMAND HANDLER. 
* 
* CALL: 
*	RF	PLIHC
* 
* INPUT:
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	PLC STATUS
*	A2  =	FATAL PLC STATUS
*	A5  =	CWT ADDRESS 
*	A6  =	USER PARAMETER
* 
************************************************************
* 
PLIHC	EQU	* 
	LD	A1,CWTRCA+CCRSTA,A5	PLC STATUS
	ST	A1,CWTPLS,A5	SAVE FOR TESTING 
	IFF	UTTEST=0 
	CF	A15,LOGIOC	LOG CCR
	XIF
	ANKL	A1,/FFFF-STAPOL-STALER
*			 RESET POLL STOP & LINK ERROR 
	LD	A6,CWTRCA+CCRIDW,A5	USER PARAMETER (DWT, DLS OR ...)
	LC	A2,CWTRCA+CCRCMD,A5	COMMAND 
* 
	EJECT
* 
	LDK	A3,CMDTBL	COMMAND TABLE LENGTH 
IC100	EQU	* 
*    SCAN TABLE TO FIND MATCHING COMMAND
	SUK	A3,CMDTB1	DECREMENT INDEX
	RF(N)	IC120	END OF TABLE. ERROR
	CC	A2,CMDTAB+1,A3	COMMAND FOUND? 
	RB(NE)	IC100	NO, CONTINUE
* 
	C1	A2,CMDTAB+4,A3	MASK FOR ALLOWED ERRORS
	ANR	A2,A1	FATAL ERROR? 
	RF(Z)	IC110	NO, CONTINUE 
	CF	A15,PLCNOP	SET PLC NOT OPERABLE 
IC110	EQU	* 
	ABI	CMDTAB+2,A3	CALL COMMAND HANDLING ROUTINE
* 
IC120	EQU	* 
	EX	CWTST3,A5	RELEASE RCA 
	CF	A15,PLCNOP	SET PLC NOT OPERABLE 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	COMPSTA 
* 
* FUNCTION: 
*	THESE ROUTINES HANDLE COMPLETION OF TEST CU,
*	OPEN LINE AND OPEN DLS COMMANDS.
*	THEY CHECK THE RETURN CODE AND EXIT TO THE
*	ROUTINE THAT MADE THE I/O CALL. 
* 
* CALL: 
*	ABI	CMDROU,A3 
* 
* INPUT:
*	A1  =	PLC STATUS
*	A2  =	FATAL PLC STATUS
*	A5  =	CWT ADDRESS 
*	A6  =	PARAMETER (IF RELEVANT) 
* 
* OUTPUT: 
*	A1  =	PLC STATUS
*	A2  =	FATAL PLC STATUS
*	A5  =	CWT ADDRESS 
*	A6  =	DLS INDEX (IF EXIT TO ODLRST) 
* 
************************************************************
* 
COMPTC	EQU	*
	EX	CWTST3,A5	RELEASE RCA 
	ABL	TCURST	RETURN TO ROUTINE MAKING I/O CALL 
* 
	EJECT
* 
* 
*    OPEN LINE, COMPLETION
* 
COMPOP	EQU	*
	EX	CWTST3,A5	RELEASE RCA 
	ABL	OPLRST	RETURN TO ROUTINE MAKING I/O CALL 
* 
* 
*    OPEN DLS, COMPLETION 
* 
COMPOD	EQU	*
	EX	CWTST3,A5	RELEASE RCA 
	LDR	A2,A2	FATAL STATUS?
	RF(NZ)	CD100	YES, SKIP STATUS CHECK
* 
	LDR	A2,A6	WS NUMBER
	CF	A15,STAHAN	HANDLE PLC STATUS
	LDK	A2,0	CLEAR FATAL STATUS FLAGS
* 
CD100	EQU	* 
	ABL	ODLRST	RETURN TO ROUTINE MAKING I/O CALL 
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	COMPTEST
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES COMPLETION OF GET LINE 
*	STATISTICS, GET DLS STATISTICS AND READ LOCAL 
*	MEMORY COMMANDS.
*	IT CHECKS THE PLC STATUS, SETS EFFECTIVE
*	LENGTH IN DWT AND EXITS TO THE ROUTINE THAT 
*	MADE THE I/O CALL.
* 
* CALL: 
*	ABI	CMDROU,A3 
* 
* INPUT:
*	A1  =	PLC STATUS
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	RETURN CODE 
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
************************************************************
* 
	IFT	PLCTST=1 
COMPPS	EQU	*
COMPDS	EQU	*
COMPRM	EQU	*
* 
	EJECT
* 
	LDR	A1,A1	PLC STATUS 
	RF(NZ)	TS100	ERROR. HANDLE 
* 
	LD	A2,CWTRCA+CCRLEN,A5	EFFECTIVE LENGTH
	ST	A2,DWTTLN,A6	TO DWT 
	RF	TS110	EXIT. A1 = 0
* 
TS100	EQU	* 
	LDK	A1,NOTOPR	RETURN CODE := NOT OPERABLE
	CM	DWTTLN,A6	EFFECTIVE LENGTH := 0 
* 
TS110	EQU	* 
	EX	CWTST3,A5	RELEASE RCA 
	ABL	TSTRST	RETURN TO ROUTINE MAKING I/O CALL 
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	COMPWRI 
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES COMPLETION OF STANDARD 
*	WRITE AND FAST WRITE. 
*	IT CHECKS THE PLC STATUS AND RELEASES THE OUTPUT
*	BUFFER, IF ANY WAS ALLOCATED. IF THE OUTPUT 
*	OPERATION IS FINISHED, IT THEN EXITS TO THE 
*	ROUTINE THAT MADE THE I/O CALL. 
* 
* CALL: 
*	ABI	CMDROU,A3 
* 
* INPUT:
*	A1  =	PLC STATUS
*	A2  =	FATAL PLC STATUS
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	WHEN RETURN TO ROUTINE MAKING OUTPUT CALL 
*	A1  =	RETURN CODE 
*	A2  =	BITS 0-7 ZERO 
*		BITS 8-15 DEVICE STATUS
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
************************************************************
* 
	EJECT
* 
COMPSW	EQU	*
COMPFW	EQU	*
	LDR	A2,A2	FATAL PLC STATUS?
	RF(NZ)	WRERR1	YES, HANDLE
* 
	LC	A2,DWTCP2,A6	CHANEL PARAMETER 
	ANK	A2,MASKWS	CLEAN WS NUMBER
	CF	A15,STAHAN	HANDLE PLC STATUS
	LC	A7,CWTRCA+CCRIDB,A5	TYPE OF WRITE COMMAND 
	ANK	A7,/FF	CLEAN 
	LD	A4,CWTRCA+CCRBUF,A5	BUFFER ADDRESS
	EX	CWTST3,A5	RELEASE RCA 
	ABI	WRIROU,A7	CALL CORRESPONDING ROUTINE 
* 
* 
*    IRRECOVERABLE ERROR
* 
WRERR1	EQU	*
	EX	CWTST3,A5	RELEASE RCA 
WRERR	EQU	* 
	ABL	PLDSP2	EXIT
* 
* 
*    COMPLETION OF DATA MESSAGE OUTPUT
* 
WRNFLO	EQU	*
WRDATA	EQU	*
	CF	A15,PLRLBU	RELEASE OUTPUT BUFFER
	CM	DWTLD1,A6	INDICATE NO BUFFER
	ABL	ACKRST	RETURN TO REQUEST HANDLER 
* 
* 
*    COMPLETION OF RECIEVE READY MESSAGE OUTPUT 
* 
WRRR	EQU	*
	SUK	A4,2	START OF MONITOR BLOCK
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTMBQ	MONITOR BLOCK QUEUE HEAD 
	CF	A15,LNKOUT	REMOVE FROM QUEUE
	CF	A15,FREBLK	RETURN BLOCK 
* 
	ABL	PLDSP2	EXIT
* 
* 
*    COMPLETION OF RESET CONFIRMATION MESSAGE OUTPUT
* 
WRRESC	EQU	*
	SUK	A4,2	START OF MONITOR BLOCK
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTMBQ	MONITOR BLOCK QUEUE HEAD 
	CF	A15,LNKOUT	REMOVE FROM QUEUE
	CF	A15,FREBLK	RETURN BLOCK 
* 
	LDKL	A2,/FFFF-DWFRES	MASK FOR RESET FLAG 
	ANS	A2,DWTST,A6	CLEAR "RESET" FLAG 
	LDK	A4,RELINE	RECOVERY CAUSE := LINK RESET 
	CF	A15,NDREDW	CALL RECOVERY FOR DWT
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	COMPGR
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES COMPLETION OF GENERAL
*	READ COMMANDS.
*	IT CHECKS TYPE OF MESSAGE AND CALLS 
*	CORRESPONDING ROUTINE.
* 
* CALL: 
*	ABI	CMDROU,A3 
* 
* INPUT:
*	A1  =	PLC STATUS
*	A2  =	FATAL PLC STATUS
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	PLC STATUS
*	A4  =	BUFFER ADDRESS
*	A5  =	CWT ADDRESS 
*	A6  =	DLS INDEX 
*	A7  =	DEVICE ADDRESS (IF RELEVANT)
* 
************************************************************
* 
COMPGR	EQU	*
	LDR	A2,A2	FATAL STATUS?
	RF(NZ)	GRERR2	YES, EXIT
* 
	EJECT
* 
	CF	A15,INTYPE	A3 := TYPE OF MESSAGE
	LD	A4,CWTRCA+CCRBUF,A5	BUFFER ADDRESS
	LC	A6,CWTRCA+CCRDLS,A5	DLS INDEX 
	ANK	A6,MASKWS	CLEAN
	LC	A7,X25LCN,A4	DEVICE ADDRESS 
	ANK	A7,MASKLC	CLEAN
* 
	ABI	REAROU,A3	ROUTINE FOR THIS MESSAGE TYPE
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GRERR 
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES ILLEGAL INPUT MESSAGES.
*	GRERR1 RETURNS BUFFER 
* 
* CALL: 
*	ABI	REAROU,A3 
*	RB	GRERR1 
*	RF	GRERR2 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS (IF GRERR1)
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
GRERR1	EQU	*
	CF	A15,PLRLBU	RELEASE GENERAL READ BUFFER
* 
GRERR2	EQU	*
	EX	CWTST3,A5	RELEASE RCA 
* 
	ABL	PLDSP2	EXIT
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GRSACK
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES STATUS AND RECIEVE READY 
*	MESSAGES FROM A DEVICE. 
*	IT RELEASES THE BUFFER AND RETURNS TO ROUTINE 
*	MAKING I/O CALL.
* 
* CALL: 
*	ABI	REAROU,A3 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
*	A5  =	CWT ADDRESS 
*	A6  =	DLS INDEX 
*	A7  =	DEVICE ADDRESS
* 
* OUTPUT: 
*	A1  =	RETURN CODE 
*		=0 IF OK 
*		><0 IF ERROR 
*	A2  =	BITS 0-7  ZERO
*		BITS 8-15  DEVICE STATUS 
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
************************************************************
* 
	EJECT
* 
GRSTAT	EQU	*
	CF	A15,GETDWT	A6 := DWT ADDRESS
	RB(Z)	GRERR1	NO DWT DEFINED
	CF	A15,FWIPSR	UPDATE FLOW CONTROL COUNTERS 
	LC	A2,X25DAT,A4	DEVICE STATUS BYTE 
	ANK	A2,/FF	CLEAN 
	RF	SR100	COMMON PART 
* 
* 
GRRR	EQU	*
	CF	A15,GETDWT	A6 := DWT ADDRESS
	RB(Z)	GRERR1	NO DWT DEFINED
	CF	A15,FWIPR	UPDATE FLOW CONTROL COUNTERS
	LDK	A2,0	RESET DEVICE STATUS BYTE
* 
* 
SR100	EQU	* 
*    COMMON PART FOR DEVICE STATUS AND RECIEVE READY MESSAGES 
	EX	CWTST3,A5	RELEASE RCA 
	CF	A15,PLRLBU	RELEASE GENERAL READ BUFFER
	LD	A3,DWTST,A6	DWT STATUS
	LDR	A4,A3
	ANK	A4,DWFAK3	ANYONE WAITING FOR THIS MESSAGE? 
	ABL(Z)	PLDSP2	NO, DISPATCH 
* 
	XRS	A4,DWTST,A6	RESET WAIT FLAG
	LDK	A1,0	RETURN CODE := OK 
	ANK	A3,DWFSAC	ALWAYS WAIT FOR LEVEL 3 ACK? 
	ABL(NZ)	AK3RST	YES, RETURN WITH ACK 3
	ABL	WINRST	NO, RETURN TO WINDOW QUEUE
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GRDATA
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES DATA INPUT MESSAGES. 
*	IT LINKS THE BUFFER TO THE CWT. 
* 
* CALL: 
*	ABI	REAROU,A3 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
*	A5  =	CWT ADDRESS 
*	A6  =	DLS INDEX 
*	A7  =	DEVICE ADDRESS
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
GRDATA	EQU	*
	CF	A15,GETDWT	A6 := DWT ADDRESS
	RB(Z)	GRERR1	NO DWT DEFINED
* 
	CF	A15,FWIPSR	UPDATE FLOW CONTROL COUNTERS 
	ST	A4,CWTBUF,A5	SAVE INPUT DATA BUFFER ADDRESS 
	ST	A6,BUFDWT,A4	SAVE DWT ADDRESS IN BUFFER 
	LD	A2,CWTRCA+CCRLEN,A5	EFFECTIVE LENGTH
	ST	A2,BUFLEN,A4	SAVE IN BUFFER 
	LDK	A2,X25DAT	START OF USER DATA 
	ST	A2,BUFBIX,A4	TO BYTE INDEX
* 
	EJECT
* 
	EX	CWTST3,A5	RELEASE RCA 
	ABL	PLDSP2	EXIT
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GRRES 
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES RESET MESSAGES FROM THE
*	SECONDARY.
*	IT RESETS THE FLOW CONTROL COUNTERS IN THE DWT, 
*	AND SETS A RESET PACKET FLAG IN THE DWT. THEN A 
*	RESET CONFIRMATION MESSAGE IS SENT. IF THE
*	PROCESS IS WAITING FOR LEVEL 3 ACK OR IN A BUFFER 
*	QUEUE IT IS ABORTED.
* 
* CALL: 
*	ABI	REAROU,A3 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
*	A5  =	CWT ADDRESS 
*	A6  =	DLS INDEX 
*	A7  =	DEVICE ADDRESS
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
GRRES	EQU	* 
	CF	A15,GETDWT	A6 := DWT ADDRESS
	RB(Z)	GRERR1	NO DWT DEFINED
* 
	EJECT
* 
	EX	CWTST3,A5	RELEASE RCA 
	CF	A15,PLRLBU	RELEASE GENERAL READ BUFFER
	CM	DWTLD2,A6	RESET FLOW CONTROL COUNTERS 
* 
	LD	A2,DWTST,A6	DWT STATUS
	ANK	A2,DWFRES	RESET ALREADY RECIEVED?
	ABL(NZ)	PLDSP2	YES, EXIT 
	LDK	A2,DWFRES
	ORS	A2,DWTST,A6	INDICATE RESET RECIEVED
* 
	CF	A15,PLCCCA	RESERVE PLC CCA
	ENB
* 
	CF	A15,GETBLK	GET OUTPUT BUFFER
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTMBQ	MONITOR BLOCK QUEUE HEAD 
	CF	A15,LNKFST	PUT BLOCK IN QUEUE (FOR RECOVERY)
	ADK	A4,2	SKIP QUEUE LINK 
	ST	A4,CWTCCA+CCRBUF,A5	BUFFER ADDR TO CCA
	CM	CWTCCA+CCRC1B,A5	RESET DATA CHAINING & MSB OF ADDR
	CF	A15,WRADR2	WRITE ADDRESS IN CCA (TYPE 2)
	LDK	A2,CMDSW	COMMAND CODE "STANDARD WRITE" 
	SC	A2,CWTCCA+CCRCMD,A5	TO CCA
	LDK	A2,/1F	MESSAGE TYPE FLAGS
	SC	A2,X25FLW,A4	TO OUTPUT BUFFER 
	LDK	A2,TYRESC	TYPE "RESET CONFIRMATION"
	SC	A2,CWTCCA+CCRIDB,A5	TO CCA, COMMAND ID
	ST	A6,CWTCCA+CCRIDW,A5	DWT ADDRESS TO CCA, COMMAND ID
	LDK	A2,X25DAT	LENGTH OF SYSTEM PART
	ST	A2,CWTCCA+CCRLEN,A5	TO CCA LENGTH 
* 
	EJECT
* 
	LD	A2,DWTST,A6	DWT STATUS
	ANK	A2,DWFRES	RESET STILL WANTED?
	RF(Z)	REERR1	NO, EXIT
	CF	A15,GETWSS	A1 := STATUS & INH 
	RF(NZ)	REERR1	EXIT IF ERROR
	CF	A15,PLCCIO	EXECUTE CIO START
	RF(NZ)	REERR2	EXIT IF ERROR
* 
	LDK	A1,LINERR	RET CODE := LINK ERROR 
	LD	A2,DWTST,A6	DWT STATUS
	LDR	A3,A2
	ANK	A2,DWFAK3	WAITING FOR LEVEL 3 ACK? 
	RF(Z)	RE100	NO, CONTINUE 
	XRS	A2,DWTST,A6	RESET ACK3 FLAG
	ANK	A3,DWFSAC	ALWAYS WAIT FOR LEVEL 3 ACK? 
	ABL(NZ)	AK3RST	YES, RETURN WITH ACK 3
	ABL	WINRST	NO, RETURN TO WINDOW QUEUE
* 
RE100	EQU	* 
	CF	A15,OUTBUQ	REMOVE DWT FROM BUFFER QUEUE 
	LDR	A2,A2	FOUND? 
	ABL(NZ)	BUFRST	YES, RETURN WITH ERROR CODE 
* 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
* 
REERR1	EQU	*
	CM	CWTCCB,A5	SET CCA FREE
REERR2	EQU	*
*      ERROR. RETURN MONITOR BLOCK IMMEDIATELY
	SUK	A4,2	START ADDRESS OF MONITOR BLOCK
	CF	A15,LNKOUT	REMOVE FROM QUEUE. A7 ALREADY SET
	CF	A15,FREBLK	RETURN MONITOR BLOCK 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
********************* 
* RECOVERY ROUTINES * 
********************* 
* 
*   THESE ROUTINES ARE USED AT SYSTEM START OR TC POWER 
*   UP. IN CASE OF POWER UP, THEY FIRST REMOVE ALL RUNNING
*   OUTPUT OPERATIONS. AFTER THAT, THE PLC IS STARTED,
*   AND LAST RECOVERY ROUTINES IN DEVICE DRIVERS ARE
*   CALLED FOR ALL DWT:S. 
*   THE SECTION ALSO CONTAINS ROUTINES FOR RECOVERY 
*   OF I/O ERRORS.
* 
* 
*   ROUTINES IN ORDER OF APPEARANCE IN CODE:
* 
*	NAME	FUNCTION 
* 
*	PLON	CALL RECOVERY ONCE FOR EACH PLC CHANNEL UNIT 
*	PLSTRT	START PLC AND CALL DEVICE RECOVERY 
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLON
* 
* FUNCTION: 
*	THIS ROUTINE WILL ACTIVATE A MONITOR JOB
*	FOR THE PLC RECOVERY, IF THE JOB NOT ALREADY
*	IS PENDING. 
*	THE MONITOR JOB WILL CALL THE RECOVERY ROUTINE ONCE 
*	FOR EACH PLC DEFINED. 
* 
* CALL: 
*	CF	A15,PLON 
* 
* INPUT:
*	- 
* 
* OUTPUT: 
*      AT ENTRY TO PLSTRT:
*	A5  =	CWT ADDRESS 
* 
************************************************************
* 
PLON	EQU	*
	LD	A1,PLCPFP	POWER UP PENDING? 
	RF(NZ)	PO100	YES, EXIT 
	IM	PLCPFP	INDICATE POWER UP STARTED
* 
	LDKL	A2,PO110	START ADDRESS
	CF	A15,QMJOB	ACTIVATE MONITOR JOB
* 
PO100	EQU	* 
	RTN	A15
* 
	EJECT
* 
PO110	EQU	* 
	CM	PLCPFP	NO LONGER PENDING
* 
* 
	IFF	UTTEST=0	QUEUE STATISTICS
*    RESET QUEUE STATISTICS COUNTERS
	LDK	A1,STATLN	TABLE LENGTH 
PO113	EQU	* 
	SUK	A1,2	NEXT WORD 
	RF(N)	PO116	READY WHEN ALL DONE
	CM	STATAR,A1	RESET COUNTER 
	RB	PO113	NEXT WORD 
PO116	EQU	* 
	XIF
* 
	LDK	A1,16	(MAX NUMBER OF PLC:S) * 2
PO120	EQU	* 
*    THIS LOOP IS EXECUTED ONCE FOR EACH PLC
	SUK	A1,2	NEXT PLC
	RF(N)	PO130	EXIT IF ALL DONE 
	LD	A5,TABCWT,A1	CWT ADDRESS
	RB(Z)	PO120	TAKE NEXT IF NOT DEFINED 
	CF	A15,PLSTRT	START ONE PLC
	RB	PO120	NEXT PLC
* 
PO130	EQU	* 
	ABL	MEXIT	MONITOR JOB EXIT 
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLSTRT
* 
* FUNCTION: 
*	THIS ROUTINE FIRST CLEARS ALL WORK AREAS AND
*	DWT:S, AND SETS THE DWT:S BUSY. IT THEN STARTS
*	THE PLC, AND CALLS RECOVERY ROUTINES IN ALL 
*	DEVICE DRIVERS. 
* 
* CALL: 
*	CF	A15,PLSTRT 
* 
* INPUT:
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
PLSTRT	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	PUSH A1-A8
	XIF
	IFF	CPU852=1 
	MSR	8,A15	PUSH A1-A8 
	XIF
* 
	ENB
	IM	CWTGR,A5	INDICATE GENERAL READ NOT ALLOWED
	CM	CWTABW,A5	STOP ABORT OF WS
	CM	CWTSBQ,A5	RESET SHORT BUFFER QUEUE
	CM	CWTLBQ,A5	RESET LONG BUFFER QUEUE 
* 
	EJECT
* 
ST100	EQU	* 
*    RETURN MONITOR BLOCKS USED AS BUFFERS
	LDR	A7,A5
	ADK	A7,CWTMBQ	MONITOR BLOCK QUEUE HEAD 
	LDR*	A4,A7	FIRST BLOCK 
	RF(Z)	ST105	CONTINUE IF NO LEFT
	CF	A15,LNKOUT	REMOVE FROM QUEUE
	CF	A15,FREBLK	RETURN BLOCK 
	RB	ST100	TAKE NEXT 
ST105	EQU	* 
*    RETURN MONITOR BLOCKS FROM CCA QUEUE 
	LDR	A7,A5
	ADK	A7,CWTCCQ	CCA QUEUE HEAD 
	LDR*	A4,A7	FIRST BLOCK 
	RF(Z)	ST110	CONTINUE IF NO LEFT
	CF	A15,LNKOUT	REMOVE FROM QUEUE
	CF	A15,FREBLK	RETURN BLOCK 
	RB	ST105	TAKE NEXT 
* 
ST110	EQU	* 
*    INITIATE BUFFER AREAS
	LDR	A4,A5	CWT ADDRESS
	ADKL	A4,CWTSOB	AREA FOR SHORT OUTPUT BUFFERS 
	LDR	A7,A5
	ADK	A7,CWTPBS	POOLBLOCK, SHORT OUTPUT BUFFERS
	CF	A15,INIBUF	INITIATE BUFFER AREA 
	LDR	A4,A5	CWT ADDRESS
	ADKL	A4,CWTLOB	AREA FOR LONG OUTPUT BUFFERS
	LDR	A7,A5
	ADK	A7,CWTPBL	POOLBLOCK, LONG OUTPUT BUFFERS 
	CF	A15,INIBUF	INITIATE BUFFER AREA 
	LDR	A4,A5	CWT ADDRESS
	ADKL	A4,CWTGRB	AREA FOR GENERAL READ BUFFERS 
	LDR	A7,A5
	ADK	A7,CWTPBG	POOLBLOCK, GENERAL READ BUFFERS
	CF	A15,INIBUF	INITIATE BUFFER AREA 
* 
*    RESET ALL DWT:S AND WORK STATION STATUS
	LDK	A3,MAXWS+1	NUMBER OF WORK STATIONS + 1 
ST120	EQU	* 
	SUK	A3,1	NEXT WORK STATION 
	RF(N)	ST150	END IF NO MORE LEFT
	LDR	A2,A3	WORK STATION NUMBER
	SLA	A2,1	MAKE INDEX
	ADR	A2,A5	ADD CWT ADDRESS
	ADK	A2,CWTWSS	WORK STATION STATUS WORD 
	CMR	A2	CLEAR STATUS
	LDK	A1,NOTOPR
	SCR	A1,A2	WS := NOT OPERABLE 
	LD*	A1,CWTINT,A5	WORK STATION TABLE ADDRESS
	LDR	A6,A3	WORK STATION NUMBER
	CF	A15,NDGEDN	A7 := HIGEST DWT NUMBER ON WS
	ADK	A7,1 
ST130	EQU	* 
	SUK	A7,1	NEXT DWT
	RF(N)	ST140	NEXT WS IF NO DWT LEFT 
	LDR	A6,A3	WS NUMBER
	CF	A15,GETDWT	A6 := DWT ADDRESS
	RB(Z)	ST130	NOT DEFINED
	CM	DWTLD2,A6	RESET FLOW CONTROL
	LDKL	A2,/FFFF-DWFBSY-DWFPLC
*			 MASK FOR BUSY AND PLC FLAGS
	ANS	A2,DWTST,A6	RESET FLAGS
	CM	DWTLD1,A6	RELEASE BUFFER, IF ANY
	CM	DWTOTQ,A6	REMOVE DWT FROM QUEUE, IF ANY 
	RB	ST130	NEXT DWT
ST140	EQU	* 
	RB	ST120	NEXT WORK STATION 
* 
ST150	EQU	* 
*    DELAY UNTIL PLC IS READY FOR START 
	LD	A4,CWTTPR,A5	TIMER ALREADY STARTED? 
	RF(Z)	ST152	NO, START TIMER
	LDKL	A1,-STADLY-1	DELAY TIME 
	STR	A1,A4	RESTART TIMER
	RF	ST154	EXIT
* 
ST152	EQU	* 
	LDR	A1,A5	SAVE CWT ADDRESS 
	CF	A15,SETIME	START TIMER
	DATA	ST156,STADLY	RESTART ADDRESS & DELAY TIME 
	ST	A4,CWTTPR,A5	SAVE TIMER POINTER 
ST154	EQU	* 
	ABL	TDISP	WAIT UNTIL TIMER EXPIRES 
* 
ST156	EQU	* 
	LDR	A5,A1	RESTORE CWT ADDRESS
	CM	CWTTPR,A5	INDICATE NO TIMER RUNNING 
* 
*    START "TEST CHANNEL UNIT" OPERATION
	IM	CWTCCB,A5	SET CCA BUSY
	CM	CWTOPR,A5	SET PLC OPERABLE
	LDK	A2,CMDTC	COMMAND CODE TEST CU
	ST	A2,CWTCCA+CCRDLS,A5	COMMAND AND DLS INDEX TO CCA
	CM	CWTCCA+CCRC1B,A5	RESET DATA CHAINING
	LDR	A3,A5	CWT ADDRESS
	ADK	A3,CWTCSD	CONTROL UNIT START DESCRIPTOR ADDR 
	INH
	CF	A15,PLCCIO	CIO START
	RF(NZ)	STERR2	EXIT IF ERROR
	IM	CWTOPR,A5	SET NOT OPERABLE UNTIL TEST CU READY
	ABL	TDISP	WAIT FOR COMPLETION
* 
* 
*    ENTRY IS MADE HERE WHEN TEST CU IS COMPLETED.
*      REGISTER CONTENTS ON ENTRY:
*	A1  =	PLC STATUS
*	A5  =	CWT ADDRESS 
* 
TCURST	EQU	*
	LDR	A1,A1	OPERATION OK?
	RF(NZ)	STERR2	NO, EXIT 
* 
*    PERFORM "OPEN LINE" OPERATION
			U	=5 
	LDK	A2,0	INITIATE LINE COUNTER 
	ST	A2,CWTLNO,A5
ST157	EQU	* 
	CF	A15,PLCCCA	RESERVE CCA
* 
	LD	A2,CWTLNO,A5	GET LINE NO
	SC	A2,CWTCCA+CCRSU1,A5	SET UP LINE IN CCA	=5 
	SLL	A2,1	MAKE OPEN LINE PARA-
	ST	A2,CWTPAR,A5	METER AREA 
ST158	EQU	* 
	LD	A2,CWTOPP,A5	MAKE ADDRESS TO
	AD	A2,CWTPAR,A5	OPEN LINE PARAMETER AREA 
	LDR*	A2,A2	U	=5
	ST	A2,CWTCCA+CCRBUF,A5	SET UP IN CCA 
	LDK	A2,CMDOP	COMMAND OPEN LINE 
	ST	A2,CWTCCA+CCRDLS,A5	COMMAND AND DLS INDEX TO CCA
	CM	CWTCCA+CCRC1B,A5	RESET DATA CHAINING & MSB OF ADDR
	LDK	A2,12	PARAMETER AREA LENGTH	=1 
	ST	A2,CWTCCA+CCRLEN,A5	TO CCA
* 
	CM	CWTOPR,A5	SET PLC OPERABLE
	CF	A15,PLCCIO	CIO START
	RF(NZ)	STERR2	EXIT IF ERROR
	ABL	PLDSP2	LOCAL DISPATCHER
* 
* 
*    ENTRY TO OPLRST WILL BE MADE WHEN THE OPEN LINE
*    OPERATION IS COMPLETED.
*      REGISTER CONTENTS ON ENTRY:
*	A1  =	PLC STATUS
*	A5  =	CWT ADDRESS 
* 
OPLRST	EQU	*
	LDR	A1,A1	OPERATION OK?
	RF(NZ)	STERR2	NO, EXIT 
* 
	LD	A2,CWTPNR,A5	GET PLC NR 
	SUK	A2,3	CHECK IF LOCAL
	RF(NP)	ST159	YES 
	IM	CWTLNO,A5	INCREMENT LINE NUMBER 
	LD	A2,CWTLNO,A5	GET LINE NO
	SUK	A2,4	ALL LINES OPENED ?
	RB(NZ)	ST157	NO, TAKE NEXT 
	CM	CWTLNO,A5 
ST159	EQU	* 
* 
	CM	CWTGR,A5	INDICATE GENERAL READ ALLOWED
* 
*    PERFORM OPEN DATA LINK FOR ALL CONNECTED SECONDARIES 
* 
	LDK	A6,MAXWS+1	(MAX NR OF DLS) + 1 
ST160	EQU	* 
	SUK	A6,1	NEXT WORK STATION (DLS) 
	RF(N)	ST180	EXIT IF ALL DONE 
	LD*	A1,CWTINT,A5	WORK STATION TABLE
	CF	A15,NDGEDN	A7 := HIGEST DWT NUMBER ON WS
	LDR	A7,A7	ANY DWT:S? 
	RB(N)	ST160	NO, TAKE NEXT WS 
* 
	CF	A15,PLCCCA	RESERVE CCA
	LDR	A3,A6	WORK STATION NUMBER
	SLA	A3,1	MAKE INDEX
	ADR	A3,A5	ADD CWT ADDRESS
	CM	CWTWSS,A3	CLEAR WS STATUS 
	SC	A6,CWTCCA+CCRDLS,A5	DLS INDEX (WS NUMBER) TO CCA
	ST	A6,CWTCCA+CCRIDW,A5	SAVE DLS INDEX
	LDK	A2,CMDOD	COMMAND OPEN DLS
	SC	A2,CWTCCA+CCRCMD,A5	TO CCA
	LDK	A2,MAXFR	MAX OUTSTANDING FRAMES
	SC	A2,CWTCCA+CCRSU1,A5	TO SUBCOMMAND 1 
	CM	CWTCCA+CCRC1B,A5	RESET DATA CHAINING
	CF	A15,PLCCIO	CIO START
	RF(NZ)	STERR2	EXIT IF ERROR
	ABL	PLDSP2	EXIT. WAIT FOR COMPLETION 
* 
* 
*    ENTRY TO ODLRST IS MADE WHEN OPERATION IS COMPLETED. 
*      REGISTER CONTENTS ON ENTRY:
*	A2  =	FATAL PLC STATUS
*	A5  =	CWT ADDRESS 
*	A6  =	WORK STATION NUMBER (DLS INDEX) 
* 
ODLRST	EQU	*
	LDR	A2,A2	FATAL ERROR? 
	RF(NZ)	STERR2	YES, EXIT
	LD*	A3,CWTINT,A5	WORK STATION TABLE ADDRESS
	LDK	A4,RETCP	FLAG "TC POWER UP"
	CF	A15,NDREWS	RECOVERY OF ALL DWT:S ON WS
	RB	ST160	TAKE NEXT WORK STATION
* 
* 
ST180	EQU	* 
*    ALL DATA LINKS ARE STARTED. EXIT.
	ABL	PLDSP2	LOCAL DISPATCHER
* 
* 
STERR2	EQU	*
*    ERROR DURING STARTUP. EXIT.
* 
	ABL	TDISP	EXIT 
* 
	EJECT
* 
********************
* LOCAL DISPATCHER *
********************
* 
*   THIS SECTION CONTAINS A DISPATCHER FOR THE PLC DRIVER.
*   IT CAN BE CALLED EITHER FROM ANOTHER ROUTINE IN THE 
*   PLC DRIVER, OR FROM A TERMINAL DEVICE DRIVER (THROUGH 
*   THE NETWORK DISTRIBUTOR). 
*   SOME INTERRUPTS OR DEVICE DRIVER CALLS SET SEVERAL
*   RESOURCES FREE. THIS MEANS THAT SEVERAL WAITING 
*   PROCERSSES MAY BECOME READY FOR ACTIVATION. ONLY ONE
*   OF THESE PROCESSES CAN BE ACTIVATED DIRECTLY. THE 
*   OTHER PROCESSES WILL BE ACTIVATED IN TURN, WHEN FIRST 
*   PROCESS EXITS TO THIS DISPATCHER. 
* 
* 
*   ROUTINES IN ORDER OF APPEARANCE IN CODE:
* 
*	NAME	FUNCTION 
* 
*	PLDISP	ACTIVATE PROCESS OR PERFORM COMMON FUNCTION
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLDISP
* 
* FUNCTION: 
*	THIS ROUTINE LOOKS FOR WAITING PROCESSES THAT ARE 
*	READY FOR DISPATCHING. IF ANY IS FOUND, IT IS 
*	ACTIVATED. THE ROUTINE ALSO PERFORMS ACTIONS THAT 
*	ARE NOT EXPLICITLY REQUESTED BY USER PROCESSES, EG
*	GENERAL READ. WHEN NOTHING IS LEFT TO DO, THE ROUTINE 
*	EXITS TO TOSS DISPATCHER. 
*	TWO ENTRIES ARE PROVIDED. ONE IS USED WHEN CALLER 
*	KNOWS OWN DWT ADDRESS, ONE WHEN CALLER KNOWS OWN
*	CWT ADDRESS.
* 
* CALL: 
*	ABL	PLDISP
*	ABL	PLDSP2
* 
* INPUT:
*	A5  =	CWT ADDRESS (IF PLDSP2) 
*	A6  =	DWT ADDRESS (IF PLDISP) 
*	A1-A8 ON A15 STACK
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
PLDISP	EQU	*
PRDISP	EQU	*
	CF	A15,GETCWT	A5 := CWT ADDRESS
	LDR	A5,A5
	ABL(Z)	TDISP	NOT DEFINED. EXIT 
* 
* 
PLDSP2	EQU	*
* 
* 
DP100	EQU	* 
	ENB
*    HANDLE CHARACTER INPUT 
	LD	A4,CWTBUF,A5	INPUT BUFFER WAITING?
	RF(Z)	DP200	NO, CONTINUE 
	LD	A6,BUFDWT,A4	DWT ADDRESS
* 
	CF	A15,PLGECH	A2 := CHARACTER
	LDR	A1,A1	CHECK RETURN CODE
	RF(N)	DP110	BUFFER EMPTY 
	LD	A3,DWTST,A6	DEVICE STATUS 
	ANK	A3,DWFINP	INPUT REQUESTED? 
	ABL(NZ)	INPRST	YES, RETURN TO DEVICE DRIVER
* 
	LD	A1,DWTADR,A6	ADDRESS BLOCK
	LD	A1,INTADR,A1	INTERRUPT ENTRY DEFINED? 
	ABR(NZ)	A1	YES, GO TO INTERRUPT HANDLER
* 
DP110	EQU	* 
	CW	A4,DWTLD1,A6	BUFFER CHAINED TO THIS DWT?
	RF(NE)	DP120	NO, CONTINUE
	CM	DWTLD1,A6	REMOVE LINK 
DP120	EQU	* 
	CM	CWTBUF,A5	NO BUFFER WAITING 
	CF	A15,PLRLBU	RELEASE BUFFER 
* 
*      CHECK IF LEVEL 3 RECIEVE READY SHOULD BE SENT
	CF	A15,GETIFR	A2 := NR OF FRAMES NOT ACK:ED
	SUK	A2,6	TIME TO SEND RR?
	ABL(NN)	SENDRR	YES 
* 
* 
DP200	EQU	* 
	ENB
*    HANDLE POWER UP FOR TC 
	LD	A1,PFPOST	POWER UP TASK PENDING?
	OR	A1,PLCPFP	PLC POWER UP PENDING? 
	ABL(NZ)	TDISP	YES, EXIT
* 
* 
DP300	EQU	* 
*    HANDLE ABORT OF ONE WORK STATION 
	LD	A6,CWTABW,A5	WS TO ABORT, IF ANY
	ABL(NZ)	ABTHAN	DO ABORT, IF REQUESTED
* 
* 
DP400	EQU	* 
*    CHECK IF ANYONE WAITING FOR CCA
	LD	A4,CWTCCQ,A5	ANYONE IN CCA QUEUE? 
	RF(Z)	DP500	NO, CONTINUE 
	LD	A1,CWTCCB,A5	CCA FREE?
	RF(NZ)	DP500	NO, CONTINUE
	IM	CWTCCB,A5	SET CCA BUSY
	ABL	CCARST	ACTIVATE WAITING PROCESS
* 
* 
DP500	EQU	* 
*    CHECK BUFFER QUEUES
	LD	A6,CWTSBQ,A5	ANYONE IN SHORT BUFFERS QUEUE? 
	RF(Z)	DP510	NO, CHECK LONG 
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTPBS	POOLBLOCK FOR SHORT BUFFERS
	CF	A15,PLGTBU	A4 := BUFFER ADDRESS 
	RF(Z)	DP510	NO BUFFER AVAILABLE
	LDK	A7,CWTSBQ	OFFSET TO CWT QUEUE HEAD 
	RF	DP520	COMMON PART FOR SHORT/LONG
* 
DP510	EQU	* 
	LD	A6,CWTLBQ,A5	ANYONE IN LONG BUFFERS QUEUE?
	RF(Z)	DP600	NO, CONTINUE 
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTPBL	POOLBLOCK FOR LONG BUFFERS 
	CF	A15,PLGTBU	A4 := BUFFER ADDRESS 
	RF(Z)	DP600	CONTINUE IF NO BUFFER AVAILABLE
	LDK	A7,CWTLBQ	OFFSET TO LONG BUFFERS QUEUE HEAD
* 
DP520	EQU	* 
*      SHORT OR LONG BUFFER FOUND 
	LDR	A2,A4	SAVE BUFFER ADDRESS
	LDR	A4,A6	DWT QUEUE LINK 
	ADR	A7,A5	BUFFER QUEUE HEAD
	CF	A15,LNKOUT	REMOVE FROM QUEUE
	SUKL	A6,DWTOTQ	A6 := DWT ADDRESS 
	LDR	A4,A2	RESTORE BUFFER ADDRESS 
	LDK	A1,0	RET CODE := OK
	ABL	BUFRST	RETURN TO ROUTINE WAITING 
* 
* 
DP600	EQU	* 
*    CHECK IF GENERAL READ SHOULD BE PERFORMED
	LD	A1,CWTGR,A5	GENERAL READ ALLOWED? 
	RF(NZ)	DP800	NO, EXIT
* 
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTPBG	POOLBLOCK FOR GENERAL READ BUFFERS 
	CF	A15,PLGTBU	A4 := BUFFER ADDRESS 
	ABL(NZ)	GREAD	PERFORM GR IF BUFFER FOUND 
* 
* 
DP800	EQU	* 
*    NOTHING MORE TO DO. EXIT TO DISPATCHER 
	ABL	TDISP	TOSS DISPATCHER
* 
	EJECT
* 
************
* ROUTINES *
************
* 
*   THIS SECTION CONTAINS MISCELLANEOUS SERVICE ROUTINES. 
*   ALL ROUTINES ARE CALLED BY AN   ABL   "NAME" INSTRUCTION. 
*   REGISTER INTERFACE IS DESCRIBED FOR EACH ROUTINE. 
*   WHEN A ROUTINE HAS PERFORMED THE REQUESTED FUNCTION,
*   IT WILL EXIT TO THE LOCAL DISPATCHER. 
* 
*   ROUTINES IN ORDER OF APPEARANCE IN CODE:
* 
*	NAME	FUNCTION 
* 
*	ABTHAN	ABORT ALL WAITING DWT:S ON A WORK STATION
*	PLREWS	HANDLE RECOVERY OF ONE WORK STATION
*	SENDRR	SEND LEVEL 3 RECIEVE READY MESSAGE 
*	GREAD	PERFORM GENERAL READ
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	ABTHAN
* 
* FUNCTION: 
*	THIS ROUTINE WILL HANDLE ABORTS FOR ONE WORK
*	STATION. ALL REQUESTS OF DWT:S WAITING FOR
*	LEVEL 3 ACK OR WAITING IN CCA OR BUFFER QUEUES
*	WILL BE ABORTED. ONE CALL IS NEEDED FOR EACH
*	REQUEST TO BE ABORTED.
* 
* CALL: 
*	ABL	ABTHAN
* 
* INPUT:
*	A5  =	CWT ADDRESS 
*	A6  =	WORK STATION NUMBER 
* 
* OUTPUT: 
*      AT RETURN TO REQUEST:
*	A1  =	RETURN CODE 
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
************************************************************
* 
ABTHAN	EQU	*
	LDR	A3,A6	WORK STATION NUMBER
	SLA	A3,1	MAKE INDEX
	ADR	A3,A5	ADD CWT ADDRESS
	ADK	A3,CWTWSS	A3 := ADDRESS OF STATUS FOR WS 
* 
	EJECT
* 
	LDR	A8,A6	SAVE WS NUMBER 
	LD*	A1,CWTINT,A5	WORK STATION TABLE
	CF	A15,NDGEDN	A7 := HIGEST DWT NR ON WS
	LDK	A1,0 
	LCR	A1,A3	WORK STATION STATUS
* 
	ADK	A7,1	PREPARE FOR SUK 
AH100	EQU	* 
	SUK	A7,1	NEXT DWT
	RF(N)	AH110	EXIT IF ALL DONE 
	LDR	A6,A8	WS NUMBER
	CF	A15,GETDWT	A6 := DWT ADDRESS
	RB(Z)	AH100	NOT DEFINED
* 
	CM	DWTLD2,A6	RESET FLOW CONTROL
	LD	A2,DWTST,A6	DWT STATUS
	LDR	A3,A2
	LDKL	A4,/FFFF-DWFPLC	MASK FOR PLC FLAGS
	ANS	A4,DWTST,A6	RESET FLAGS
	ANK	A2,DWFAK3	IS DWT WAITING FOR LEVEL 3 ACK?
	RF(Z)	AH105	NO, CONTINUE 
	ANK	A3,DWFSAC	ALWAYS WAIT FOR LEVEL 3 ACK? 
	ABL(NZ)	AK3RST	YES, RETURN WITH ACK 3
	ABL	WINRST	NO, RETURN TO WINDOW QUEUE
* 
AH105	EQU	* 
	LD	A4,DWTOTQ,A6	CCA QUEUE ELEMENT POINTER
	LDR	A2,A7	SAVE DEVICE ADDRESS
	LDR	A3,A1	SAVE RETURN CODE 
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTCCQ	CCA QUEUE HEAD 
	CF	A15,LNKOUT	LINK MONITOR BLOCK OUT OF QUEUE
	LDR	A7,A7	FOUND? 
	ABL(NZ)	CCAABT	YES, ABORT REQUEST
	LDR	A7,A2	RESTORE DEVICE ADDRESS 
	LDR	A1,A3	RESTORE RETURN CODE
* 
	CF	A15,OUTBUQ	REMOVE FROM BUFFER QUEUE 
	LDR	A2,A2	FOUND IN QUEUE?
	ABL(NZ)	BUFRST	YES, TERMINATE REQUEST
	RB	AH100	NEXT DWT
* 
AH110	EQU	* 
*    ALL PROCESSES WAITING FOR ACK 3 OR IN QUEUES ARE ABORTED 
	CM	CWTABW,A5	NO MORE ABORT 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLREWS
* 
* FUNCTION: 
*	THIS ROUTINE WILL HANDLE RECOVERY OF ONE WORK 
*	STATION. ACTUAL CALL TO TERMINAL DEVICE DRIVER
*	RECOVERY ROUTINES ARE MADE THROUGH NDREWS.
* 
* CALL: 
*	ABL	PLREWS
* 
* INPUT:
*	A5  =	CWT ADDRESS 
*	A6  =	WORK STATION NUMBER 
* 
* OUTPUT: 
*      AT ENTRY TO DEVICE RECOVERY: 
*	SEE NDREWS
* 
************************************************************
* 
PLREWS	EQU	*
	LDR	A3,A6	WORK STATION NUMBER
	SLA	A3,1	MAKE INDEX
	ADR	A3,A5	ADD CWT ADDRESS
	ADK	A3,CWTWSS	A3 := ADDRESS OF STATUS FOR WS 
* 
	LDKL	A2,/FFFF-WSFERR	MASK FOR ERROR FLAG 
	ANRS	A2,A3	INDICATE WS WORKING AFTER ERROR 
	LCR	A1,A3	WS STATUS
	LDK	A2,0 
	SCR	A2,A3	RESET STATUS 
	LDK	A4,RESECP	ASSUME SECONDARY POWER UP
	ANK	A1,NOTOPR	WAS IT?
	RF(NZ)	PR110	YES 
	LDK	A4,RELINE	NO, LINK ERROR 
PR110	EQU	* 
	LD*	A3,CWTINT,A5	WORK STATION TABLE
	CF	A15,NDREWS	CALL RECOVERY FOR ALL DWT:S ON WS
* 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	SENDRR
* 
* FUNCTION: 
*	THIS ROUTINE WILL SEND ONE LEVEL 3 RECIEVE READY
*	MESSAGE TO A SECONDARY STATION. 
* 
* CALL: 
*	ABL	SENDRR
* 
* INPUT:
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
SENDRR	EQU	*
	CF	A15,PLCCCA	RESERVE CCA
	CF	A15,GETBLK	GET MONITOR BLOCK AS BUFFER
	ENB
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTMBQ	QUEUE FOR KEEPING TRACK OF MB:S
	CF	A15,LNKFST	PUT MONITOR BLOCK IN QUEUE 
	ADK	A4,2	A4 := START OF USER PART
	CF	A15,WRADR2	WRITE LINE ADDRESS IN CCA & BUFFER 
	LDK	A2,CMDSW	COMMAND := STANDARD WRITE 
	SC	A2,CWTCCA+CCRCMD,A5	TO CCA
	LDK	A2,TYRR	MESSAGE TYPE := RECIEVE READY
	SC	A2,CWTCCA+CCRIDB,A5	TO CCA, IDENTITY
	LDK	A2,X25DAT	LENGTH OF X25 HEADER 
	ST	A2,CWTCCA+CCRLEN,A5	BUFFER LENGTH TO CCA
	CM	CWTCCA+CCRC1B,A5	RESET DATA CHAIN & MSB BUFFER ADDR 
	ST	A4,CWTCCA+CCRBUF,A5	BUFFER ADDRESS TO CCA 
* 
	CF	A15,GETLCS	A1 := STATUS & INH 
	RF(Z)	RR100	CONTINUE IF OK 
	CM	CWTCCB,A5	SET CCA FREE
	RF	RR110	SKIP RR 
RR100	EQU	* 
	CF	A15,FWOPR	A2 := P(R). UPDATE FLOW CTRL
	ORK	A2,/01	MESSAGE TYPE := RR
	SC	A2,X25FLW,A4	TO BUFFER
	CF	A15,PLCCIO	EXECUTE CIO START
	RF(Z)	RR120	EXIT IF OK 
RR110	EQU	* 
	SUK	A4,2	START ADDRESS OF MONITOR BLOCK
	CF	A15,LNKOUT	REMOVE FROM QUEUE. A7 ALREADY SET
	CF	A15,FREBLK	RETURN MONITOR BLOCK 
* 
RR120	EQU	* 
	ABL	PLDSP2	LOCAL DISPATCHER
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GREAD 
* 
* FUNCTION: 
*	THIS ROUTINE WILL PERFORM ONE GENERAL READ
*	OPERATION TO THE PLC. 
* 
* CALL: 
*	ABL	GREAD 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
GREAD	EQU	* 
	LDR	A6,A4	PARAMETER := BUFFER ADDRESS
	CF	A15,PLCCCA	RESERVE PLC CCA
*      SET CCA PARAMETERS 
	CM	CWTCCA+CCRC1B,A5	CLEAR DATA CHAINING & MSB ADDR 
	ST	A6,CWTCCA+CCRBUF,A5	BUFFER ADDRESS
	LD	A2,BUFLEN,A6	BUFFER LENGTH
	ST	A2,CWTCCA+CCRLEN,A5 
	LDK	A2,CMDGR	COMMAND GENERAL READ
	ST	A2,CWTCCA+CCRDLS,A5	DLS INDEX & COMMAND 
	CF	A15,PLCCIO	EXECUTE CIO START
	ABL	PLDSP2	CHECK WHAT TO DO NEXT 
* 
	EJECT
* 
*************** 
* SUBROUTINES * 
*************** 
* 
*   THIS SECTION CONTAINS MISCELLANEOUS SERVICE SUBROUTINES.
*   ALL ROUTINES ARE CALLED BY A   CF  A15,"NAME" 
*   INSTRUCTION. REGISTER INTERFACE IS DESCRIBED FOR EACH 
*   ROUTINE. ONLY REGISTERS A1-A8 & PSW ARE CONSIDERED. 
*   REGISTERS NOT MENTIONED UNDER "OUTPUT" ARE UNCHANGED
*   FROM CALL.
*   THE ROUTINES ARE OF TWO TYPES, ASYNCHRONOUS ROUTINES
*   AND COMPUTATION ROUTINES. ASYNCHRONOUS ROUTINES MAY,
*   IF THE REQUESTED FUNCTION IS OCCUPIED OR NOT USEABLE, 
*   EXIT TO THE LOCAL DISPATCHER AND/OR TOSS DISPATCHER.
*   THIS MEANS THAT THE A15 STACK AT CALL MUST CONTAIN
*   INTERRUPT RETURN, A1-A8 AND NOTHING ELSE. COMPUTATION 
*   ROUTINES HAVE NO SUCH LIMITATIONS, AS THEY WILL RETURN
*   IMMEDIATELY WHEN THEY HAVE PERFORMED THE PROCESSING.
* 
	EJECT
* 
*   ROUTINES IN ORDER OF APPEARANCE IN CODE:
* 
*	NAME	FUNCTION 
* 
*      ASYNCHRONOUS ROUTINES
*	PLCCCA	RESERVE CCA FOR PROCESS
*	PLCCIO	EXECUTE CIO START
* 
*      COMPUTATION ROUTINES 
*	PLCNOP	SET FLAG INDICATING PLC NOT OPERABLE 
*	GETDWT	CALCULATE DWT ADDRESS
*	GETCWT	CALCULATE CWT ADDRESS
*	GETFR	GET NUMBER OF OUTSTANDING FRAMES
*	FLWINP	HANDLE FLOW CONTROL FOR INPUT
*	FLWOUT	HANDLE FLOW CONTROL FOR OUTPUT 
*	WRADDR	WRITE LINE ADDRESS IN CCA AND BUFFER 
*	STAHAN	PLC RETURN STATUS HANDLER
*	GETSTA	GET STATUS FOR I/O CONNECTION
*	PLGTBU	ALLOCATE BUFFER AND SET TO PLC FORMAT
*	PLRLBU	RELEASE BUFFER OF PLC FORMAT 
*	PLCHAR	GET/PUT CHARACTER FROM/IN PLC FORMAT BUFFER
*	INTYPE	DECIDE TYPE OF INPUT MESSAGE 
*	OUTBUQ	REMOVE ELEMENT FROM BUFFER QUEUE 
*	LNKFST	LINK ELEMENT FIRST IN QUEUE
*	LNKLST	LINK ELEMENT LAST IN QUEUE 
*	LNKOUT	LINK ELEMENT OUT OF QUEUE
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLCCCA
* 
* FUNCTION: 
*	THIS ROUTINE IS CALLED WHEN A PROCESS WANTS TO
*	USE THE PLC COMMAND COMMUNICATION AREA (CCA). 
*	IF THE AREA IS FREE, THE ROUTINE SETS IT BUSY 
*	AND RETURNS. IF THE AREA IS BUSY, THE CALLING 
*	PROCESS IS PUT IN A QUEUE, AND EXIT IS MADE TO
*	THE LOCAL DISPATCHER. 
*	PLCCCA ONLY RESERVES THE AREA.
*	PLCCCS ALSO SAVES THE QUEUE ELEMENT ADDRESS.
* 
* CALL: 
*	CF	A15,PLCCCA 
*	CF	A15,PLCCCS 
* 
* INPUT:
*	A3  =	QUEUE ELEMENT ADDRESS SAVE AREA (IF PLCCCS) 
*	A5  =	CWT ADDRESS 
*	A6  =	PARAMETER 
*	A1-A8 ON A15 STACK
* 
* OUTPUT: 
*	A1  =	RETURN CODE (IF PLCCCS, ELSE CHANGED) 
*	A2-A4	CHANGED 
*	A7-A8	CHANGED 
*	CR  =	CHANGED 
*	INTERR.	INHIBITED 
* 
************************************************************
* 
	EJECT
* 
PLCCCA	EQU	*
	LDK	A3,0	DON'T SAVE QUEUE ELEMENT ADDRESS
* 
PLCCCS	EQU	*
	INH
	LD	A1,CWTCCQ,A5	ANYONE WAITING FOR CCA?
	RF(NZ)	CA100	YES, PUT IN QUEUE 
	LD	A4,CWTCCB,A5	PLC BUSY?
	RF(NZ)	CA100	YES, PUT IN QUEUE 
* 
*    PLC FREE 
	IM	CWTCCB,A5	SET PLC BUSY
	ADKL	A15,4	ADJUST STACK FOR RETURN 
	LDK	A1,0	RETURN CODE := OK 
	ABR*	A15	RETURN IN INHIBIT MODE
* 
* 
CA100	EQU	* 
*    PLC BUSY. PUT REQUEST IN QUEUE.
	LDR	A1,A6	SAVE PARAMETER 
	LDR*	A2,A15	SKIP PSW 
	LDR*	A2,A15	SAVE RETURN ADDRESS
	CF	A15,GETBLK	GET MONITOR BLOCK AND SAVE A1-A2 
	LDR	A3,A3	SAVE POINTER?
	RF(Z)	CA110	NO, CONTINUE 
	STR	A4,A3	SAVE QUEUE ELEMENT ADDRESS 
CA110	EQU	* 
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTCCQ	PLC BUSY QUEUE HEAD
	CF	A15,LNKLST	PUT BLOCK LAST IN QUEUE
	IFF	UTTEST=0	QUEUE STATISTICS
	LD	A1,CWTPNR,A5	PLC NUMBER 
	SLA	A1,1	MAKE INDEX
	IM	CCQSTA,A1	INCREMENT QUEUE STATISTICS COUNTER
	XIF
	ABL	PLDSP2	LOCAL DISPATCHER
* 
* 
*    RETURN IS MADE HERE WHEN THE CCA IS FREE.
*    (AT A RELEASE INTERRUPT OR FROM DISPATCHER.) 
*      REGISTERS ON ENTRY:
*	A4  =	MONITOR BLOCK ADDRESS 
*	A5  =	CWT ADDRESS 
* 
CCARST	EQU	*
	INH
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTCCQ	CCA QUEUE HEAD 
	CF	A15,LNKOUT	REMOVE PROCESS FROM QUEUE
	LDK	A3,0	RETURN CODE := OK 
* 
* 
*    ENTRY IS MADE HERE WHEN A REQUEST SHOULD BE ABORTED
*    DUE TO I/O ERROR.
*      REGISTERS ON ENTRY:
*	A3  =	RETURN CODE 
*	A4  =	MONITOR BLOCK ADDRESS 
*	A5  =	CWT ADDRESS 
* 
CCAABT	EQU	*
	INH
	LDR	A7,A3	SAVE RETURN CODE 
	CF	A15,FREBLK	RETURN MONITOR BLOCK. LOAD A1-A2 
	LDR	A6,A1	PARAMETER
	LDR	A1,A7	A1 := RETURN CODE
	ABR	A2	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLCCIO
* 
* FUNCTION: 
*	THIS ROUTINE CHECKS IF THE PLC CAN BE USED. IF IT CAN,
*	THE ROUTINE EXECUTES A CIO START INSTRUCTION. 
*	IF THE PLC IS NOT OPERABLE DUE TO TC POWER UP,
*	THE ROUTINE WILL EXIT TO TOSS DISPATCHER. IN ALL OTHER
*	CASES, IT WILL RETURN TO CALLING PROGRAM WITH A RETURN
*	CODE. 
* 
* CALL: 
*	CF	A15,PLCCIO 
* 
* INPUT:
*	A5  =	CWT ADDRESS 
*	A1-A8 ON A15 STACK
* 
* OUTPUT: 
*	A1  =	RETURN CODE 
*		 0 IF OK 
*		 NOT 0 ELSE
*	A2  =	CHANGED 
*	CR  =	CONTENTS OF A1
*	INTERR.	INHIBITED 
* 
************************************************************
* 
PLCCIO	EQU	*
	INH
	LDR*	A2,A15	SKIP PSW 
	LDR*	A2,A15	GET RETURN ADDRESS 
* 
	EJECT
* 
	LD	A1,PFPOST	POWER UP TASK PENDING?
	OR	A1,PLCPFP	PLC POWER UP PENDING? 
	ABL(NZ)	TDISP	YES, GO TO TOSS DISPATCHER 
	LD	A1,CWTOPR,A5	PLC OPERABLE?
	RF(NZ)	CS100	NO, HANDLE
	IFF	UTTEST=0 
	CF	A15,LOGCOM	LOG CCR
	XIF
	EX	CWTCIO,A5	EXECUTE CIO START 
	RF(U)	CS090	UNDEFINED, NOT OK	=13
	LDKL	A1,0	SET CR, OK	=14 
	ABR	A2 
CS090	EQU	* 
* 
	CF	A15,PLCNOP	ERROR. SET NOT OPERABLE
CS100	EQU	* 
	LDK	A1,NOTOPR	RETURN CODE := NOT OPERABLE
	CM	CWTCCB,A5	SET CCA FREE
	LDR	A1,A1	SET CR 
	ABR	A2	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLCNOP
* 
* FUNCTION: 
*	THIS ROUTINE SETS A FLAG TO INDICATE THAT THE PLC 
*	IS "NOT OPERABLE".
* 
* CALL: 
*	CF	A15,PLCNOP 
* 
* INPUT:
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	- 
* 
************************************************************
* 
PLCNOP	EQU	*
	STR	A1,A15	PUSH A1 
	LD	A1,CWTPLS,A5	GET PLC STATUS 
	RF(NZ)	PN100 
	LDKL	A1,-1	SET DUMMY ERROR CODE
PN100	EQU	* 
	ST	A1,CWTOPR,A5	SET PLC NOT OPERABLE 
* 
	IFF	UTTEST=0 
* 
	EJECT
* 
	LD	A1,UTTST	TRAP CONTROL 
	SUK	A1,1	TRAP USED?
	RF(NG)	PN120	NO, SKIP
	LDK	A1,PLCERR	ERROR CODE 
	OTR	A1,0,/2E	TO SOP LAMPS
	DATA	/6300	TRAP TO BUGGER
PN120	EQU	* 
* 
	XIF
* 
	LDR*	A1,A15	POP A1 
	RTN	A15
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GETDWT
* 
* FUNCTION: 
*	THIS ROUTINE CALCULATES THE DWT ADDRESS FOR A 
*	DEVICE CONNECTED TO A PLC.
* 
* CALL: 
*	CF	A15,GETDWT 
* 
* INPUT:
*	A5  =	CWT ADDRESS 
*	A6  =	DLS INDEX 
*	A7  =	DEVICE ADDRESS
* 
* OUTPUT: 
*	A6  =	DWT ADDRESS IF FOUND, 
*		 ELSE 0
*	CR  =	CONTENTS OF A6
*	INTERR.	INHIBITED 
* 
************************************************************
* 
GETDWT	EQU	*
	INH
	STR	A1,A15	PUSH A1 
	LD*	A1,CWTINT,A5	WORK STATION TABLE
	CF	A15,NDGEDW	A6 := DWT ADDRESS
	LDR*	A1,A15	POP A1 
	ADKL	A15,4	ADJUST STACK FOR RETURN 
	ANKL	A6,/FFFE	SET CR & SKIP ODD ADDRESS
	ABR*	A15	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GETCWT
* 
* FUNCTION: 
*	THIS ROUTINE CALCULATES THE CWT ADDRESS FOR 
*	THE PLC CONTROLLING CALLING DEVICE. 
* 
* CALL: 
*	CF	A15,GETCWT 
* 
* INPUT:
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A5  =	CWT ADDRESS IF FOUND, 
*		 ELSE 0
*	A7  =	0 IF LOCAL CONNECTION 
*	CR  =	CHANGED 
* 
************************************************************
* 
GETCWT	EQU	*
	LD	A5,DWTCHP,A6	CHANNEL PARAMETERS 
	ANK	A5,MASKPL	CLEAN CHANNEL UNIT INDEX 
	SLL	A5,1	MAKE INDEX
	IFF	PLCNRR=0 
	IFF	PLCNRL=0 
	LDR*	A7,A6	CHANNEL PARAMETER 
	ANKL	A7,/0500	MASK	=10 
	SUKL	A7,/0500	REMOTE ? 
	RF(Z)	GET010	NO
	ADK	A5,8	ADJUST INDEX FOR REMOTE 
	XIF
GET010	LD	A5,TABCWT,A5	A5 := CWT ADDRESS
* 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GETFR 
* 
* FUNCTION: 
*	THIS ROUTINE CALCULATES THE NUMBER OF OUTSTANDING 
*	FRAMES, IE FRAMES THAT HAVE BEEN TRANSFERRED BUT
*	NOT ACKNOWLEDGED ON LEVEL 3, FOR A LOGICAL
*	CHANNEL.
*	GETIFR GETS NUMBER OF FRAMES RECIEVED BY PLC. 
*	GETOFR GETS NUMBER OF FRAMES SENT BY PLC. 
* 
* CALL: 
*	CF	A15,GETIFR 
*	CF	A15,GETOFR 
* 
* INPUT:
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	CHANGED 
*	A2  =	NUMBER OF OUTSTANDING FRAMES
*	CR  =	CHANGED 
* 
************************************************************
* 
GETIFR	EQU	*
	LD	A2,DWTLD2,A6	FLOW CONTROL COUNTERS
	LDR	A1,A2
	SRL	A2,9	BITS 13-15 := NEXT EXPECTED P(S)
	SRL	A1,5	BITS 13-15 := LAST SENT P(R)
	RF	GF100	TO COMMON PART
* 
	EJECT
* 
GETOFR	EQU	*
	LD	A2,DWTLD2,A6	FLOW CONTROL COUNTERS
	LDR	A1,A2
	SRL	A2,1	BITS 13-15 := NEXT P(S) TO SEND 
	SLC	A1,3	BITS 13-15 := LAST RECIEVED P(R)
* 
* 
GF100	EQU	* 
	SUR	A2,A1	A2 := OUTSTANDING FRAMES 
	ANK	A2,/07	CLEAN & MODULO 8
* 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
* 
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	FLWINP
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES FLOW CONTROL FOR INPUT. IT FETCHES 
*	FLOW CONTROL INFORMATION FROM MESSAGE AND UPDATES 
*	COUNTERS IN DWT.
*	FWIPR IS FOR MESSAGES ONLY CONTAINING P(R). 
*	FWIPSR IS FOR MESSAGES CONTAINING P(S) AND P(R).
*	NO ERROR CHECK IS MADE. 
* 
* CALL: 
*	CF	A15,FWIPR
*	CF	A15,FWIPSR 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	CHANGED 
*	CR  =	CHANGED 
* 
************************************************************
* 
FWIPR	EQU	* 
	STR	A2,A15	PUSH A2 
	LC	A1,X25FLW,A4	FLOW CONTROL FROM INPUT
	ANK	A1,/E0	BITS 8-10 = P(R) IN 
	LC	A2,DWTLD2,A6	OLD FLOW CONTROL 
	ANK	A2,/0E	BITS 12-14 = OLD P(S) IN
	ORR	A1,A2	KEEP OLD P(S)
	LDR*	A2,A15	POP A2 
	RF	FI100	COMMON ENDING 
* 
* 
FWIPSR	EQU	*
	LC	A1,X25FLW,A4	FLOW CONTROL FROM INPUT
	ANK	A1,/EE	CLEAN 
	ADK	A1,/02	BITS 12-14 := NEXT EXPECTED P(S) IN 
	ANK	A1,/EE	MODULO 8
* 
* 
FI100	EQU	* 
	SC	A1,DWTLD2,A6	SAVE NEW FLOW CONTROL
* 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
* 
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	FLWOUT
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES FLOW CONTROL FOR OUTPUT. FLOW
*	CONTROL INFORMATION IS FETCHED FROM DWT, AND COUNTERS 
*	IN DWT ARE UPDATED. 
*	FWOPR IS FOR MESSAGES CONTAINING ONLY P(R). 
*	FWOPSR IS FOR MESSAGES CONTAINING P(S) AND P(R).
* 
* CALL: 
*	CF	A15,FWOPR
*	CF	A15,FWOPSR 
* 
* INPUT:
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	CHANGED 
*	A2  =	BITS 0-7  ZERO
*		BITS 8-10  P(R) TO SEND
*		BIT 11  ZERO 
*		BITS 12-14  P(S) TO SEND IF FWOPSR 
*		             ELSE ZERO 
*		BIT 15  ZERO 
*	CR  =	CHANGED 
* 
************************************************************
* 
FWOPR	EQU	* 
	LD	A2,DWTLD2,A6	FLOW CONTROL COUNTERS
	LDR	A1,A2
	SRL	A2,4	BITS 8-10 := NEXT EXPECTED P(S) IN
*			 (= P(R) TO SEND) 
	ANK	A2,/E0	CLEAN 
	ANK	A1,/0E	BITS 12-14 = NEXT P(S) TO SEND
	ORR	A1,A2	P(S) := SAME AS BEFORE 
	RF	FO100	COMMON ENDING 
* 
* 
FWOPSR	EQU	*
	LD	A2,DWTLD2,A6	FLOW CONTROL COUNTERS
	LDR	A1,A2
	SRL	A2,4	BITS 8-10 := NEXT EXPECTED P(S) IN
*			 (= P(R) TO SEND) 
	ANK	A2,/E0	CLEAN 
	ANK	A1,/0E	BITS 12-14 = NEXT P(S) TO SEND
	ORR	A2,A1	COUNTERS FOR MESSAGE 
	LDR	A1,A2
	ADK	A1,/02	INCREMENT P(S) TO SEND
	ANK	A1,/EE	MODULO 8
* 
* 
FO100	EQU	* 
	SC	A1,DWTLD2+1,A6	SAVE FLOW CONTROL COUNTERS 
* 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
* 
	IFF	CPU852=1 
	RTN	A15
	XIF
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	WRADDR
* 
* FUNCTION: 
*	THIS ROUTINE WRITES THE LINE ADDRESS IN A 
*	MESSAGE. THE ADDRESS CONSISTS OF: DROP ADDRESS, 
*	GROUP NUMBER AND DEVICE ADDRESS. WRADR1 SETS
*	GROUP=1 INDICATING NO FLOW CONTROL, WRADR2 SETS 
*	GROUP=0 INDICATING FLOW CONTROL.
* 
* CALL: 
*	CF	A15,WRADR1 
*	CF	A15,WRADR2 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A2  =	CHANGED 
*	CR  =	CHANGED 
* 
************************************************************
* 
WRADR1	EQU	*
	LDK	A2,/11	GROUP NUMBER 1
	RF	WA100	TO COMMON PART
* 
	EJECT
* 
WRADR2	EQU	*
	LDK	A2,/10	GROUP NUMBER 0
* 
* 
WA100	EQU	* 
	SC	A2,X25LGN,A4	GROUP NUMBER TO BUFFER 
	LC	A2,DWTCP2,A6	CHANNEL PARAMETERS 
	ANK	A2,MASKWS	CLEAN WS NUMBER
	SC	A2,CWTCCA+CCRDLS,A5	TO CCA
	LC	A2,DWTCP2+1,A6
	ANK	A2,MASKLC	CLEAN DEVICE ADDRESS 
	SC	A2,X25LCN,A4	TO BUFFER
* 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
* 
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	STAHAN
* 
* FUNCTION: 
*	THIS ROUTINE HANDLES PLC STATUS WORD FOR ONE
*	WORK STATION. IF "NO CONNECTION", "LINK RESET"
*	OR "DCE NOT OPERABLE" IS INDICATED, AN ERROR
*	CODE WILL BE
*	SET IN THE WORK STATION STATUS WORD (CWTWSS). 
*	OTHER STATUS BITS ARE NOT ALLOWED.
* 
* CALL: 
*	CF	A15,STAHAN 
* 
* INPUT:
*	A1  =	PLC STATUS
*	A2  =	WORK STATION NUMBER 
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	DEVICE RETURN CODE
*	CR  =	CHANGED 
* 
************************************************************
* 
STAHAN	EQU	*
	STR	A3,A15	PUSH A3 
	LDR	A3,A1	ANY ERROR? 
	RF(Z)	SH120	NO, RETURN 
	STR	A4,A15	PUSH A4 
* 
	EJECT
* 
	LDK	A1,NOTOPR	ASSUME NO CONNECTION 
	ANKL	A3,STADNO+STANOC	IS IT? 
	RF(NZ)	SH100	YES, CONTINUE 
	LDK	A1,LINERR	NO, LINK ERROR 
SH100	EQU	* 
	LDR	A3,A2	WORK STATION NUMBER
	SLA	A3,1	MAKE INDEX
	ADR	A3,A5	ADD CWT ADDRESS
	ADK	A3,CWTWSS	A3 := ADDRESS OF STATUS FOR WS 
	SCR	A1,A3	SAVE ERROR CODE
	LDK	A4,WSFERR	WORK STATION ERROR 
	ANR*	A4,A3	ALREADY DETECTED? 
	RF(NZ)	SH110	YES, RETURN 
	LDK	A4,WSFERR
	ORRS	A4,A3	SET ERROR DETECTED
	ST	A2,CWTABW,A5	INDICATE ABORT DWT:S FOR WS
* 
SH110	EQU	* 
	LDR*	A4,A15	POP A4 
SH120	EQU	* 
	LDR*	A3,A15	POP A3 
* 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GETSTA
* 
* FUNCTION: 
*	THIS ROUTINE WILL CHECK THE I/O STATUS FOR
*	A DEVICE. 
*	GETWSS WILL ONLY CHECK THE STATUS FOR THE 
*	WORK STATION CONNECTION.
*	GETLCS WILL CHECK BOTH LOGICAL CHANNEL AND
*	WORK STATION STATUS.
* 
* CALL: 
*	CF	A15,GETLCS 
*	CF	A15,GETWSS 
* 
* INPUT:
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A1  =	RETURN CODE 
*	CR  =	CONTENTS OF A1
*	INTERR.	INHIBITED 
* 
************************************************************
* 
GETLCS	EQU	*
	INH
	STR	A3,A15	PUSH A3 
* 
	LDK	A1,LINERR	SET RETURN CODE IN CASE
	LD	A3,DWTST,A6	DWT STATUS
	ANK	A3,DWFRES	RESET PACKET RECIEVED? 
	RF(NZ)	LS110	YES, RETURN. RET CODE = LINERR
	RF	LS100	NOT RESET. CHECK WSS
* 
* 
GETWSS	EQU	*
	INH
	STR	A3,A15	PUSH A3 
* 
* 
LS100	EQU	* 
	LC	A3,DWTCP2,A6	WS NUMBER
	ANK	A3,MASKWS	CLEAN
	SLA	A3,1	MAKE INDEX
	ADR	A3,A5	CWT ADDRESS
	LC	A1,CWTWSS,A3	WS STATUS
* 
* 
LS110	EQU	* 
	LDR*	A3,A15	POP A3 
	ADKL	A15,4	ADJUST STACK
	ANK	A1,/FF	CLEAN RETURN CODE & SET CR
	ABR*	A15	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLGTBU
* 
* FUNCTION: 
*	THIS ROUTINE WILL ALLOCATE A BUFFER AND FORMAT IT 
*	ACCORDING TO THE FORMAT USED BY THIS DRIVER.
* 
* CALL: 
*	CF	A15,PLGTBU 
* 
* INPUT:
*	A7  =	POOLBLOCK ADDRESS 
* 
* OUTPUT: 
*	A2  =	LENGTH OF USER PART OF BUFFER 
*	A4  =	START OF USER PART OF BUFFER (IF ANY) 
*	CR  =	NOT 0 IF BUFFER ALLOCATED 
*		0 IF NO BUFFER ALLOCATED 
*	INTERR.	INHIBITED 
* 
************************************************************
* 
PLGTBU	EQU	*
	LDR*	A2,A15	SKIP PSW 
	LDR*	A2,A15	GET RETURN ADDRESS 
	CF	A15,GETBUF	A4 := BUFFER. INH
	ABR(Z)	A2	RETURN IF NO BUFFER
* 
	ST	A2,0,A15	SAVE RETURN ADDRESS
	ADK	A4,BUFHLN	START OF USER PART 
	ST	A7,BUFLNK,A4	SAVE POOLBLOCK ADDRESS 
	LD	A2,POBBUS,A7	BUFFER SIZE
	SUK	A2,BUFHLN	A2 := LENGTH OF USER PART
	RF(P)	GU100	CONTINUE IF OK 
	ANK	A2,0	TOO SHORT. BUFFER LENGTH & CR := 0
GU100	EQU	* 
	ST	A2,BUFLEN,A4	USER BUFFER LENGTH 
	ABR*	A15	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLRLBU
* 
* FUNCTION: 
*	THIS ROUTINE RELEASES AN I/O BUFFER OF THE
*	FORMAT USED BY THIS DRIVER. 
* 
* CALL: 
*	CF	A15,PLRLBU 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
* 
* OUTPUT: 
*	A4  =	CHANGED 
*	CR  =	CHANGED 
*	INTERR.	INHIBITED IF CPU 852
* 
************************************************************
* 
PLRLBU	EQU	*
	STR	A7,A15	PUSH A7 
	LD	A7,BUFLNK,A4	POOLBLOCK ADDRESS
	SUK	A4,BUFHLN	A4 :- PHYSICAL START OF BUFFER 
	CF	A15,RELBUF	RELEASE BUFFER & INH 
	LDR*	A7,A15	POP A7 
* 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	PLCHAR
* 
* FUNCTION: 
*	THESE ROUTINES ARE USED TO GET A CHARACTER
*	FROM A BUFFER OR PUT A CHARACTER IN A BUFFER. 
*	THE BUFFER SHOULD HAVE A HEADER OF THE NORMAL 
*	PLC FORMAT (SE "BUFFER LAYOUT" CONSTANT 
*	DEFINITION).
* 
* CALL: 
*	CF	A15,PLGECH 
*	CF	A15,PLPUCH 
* 
* INPUT:
*	A2  =	IF PUT CHAR 
*		BITS 0-7 IRRELEVANT
*		BITS 8-15 CHARACTER
*	A4  =	BUFFER ADDRESS
* 
* OUTPUT: 
*	A1  =	RETURN CODE 
*		-1 IF OVERFLOW/UNDERFLOW, ELSE 
*		 AT PLPUCH: 0
*		 AT PLGECH: NR OF CHAR LEFT IN BUFFER
*	A2  =	IF PLGECH & A1>=0 : 
*		BITS 0-7 ZERO
*		BITS 8-15 CHARACTER
*	INTERR.	INHIBITED 
* 
************************************************************
* 
	EJECT
* 
PLGECH	EQU	*
	INH
* 
	LD	A1,BUFLEN,A4	LENGTH OF TEXT IN BUFFER 
	LD	A2,BUFBIX,A4	BYTE INDEX 
	SUR	A1,A2
	SUK	A1,1	A1 := NR OF CHAR LEFT 
	RF(N)	CH100	EXIT IF UNDERFLOW
	IM	BUFBIX,A4	INCREMENT INDEX 
	ADR	A2,A4	ABSOLUTE ADDRESS OF CHARACTER
	LCR	A2,A2	GET CHARACTER
	ANK	A2,/FF	CLEAN 
* 
	RF	CH110	NORMAL EXIT 
* 
* 
PLPUCH	EQU	*
	INH
* 
	LD	A1,BUFBIX,A4	BYTE INDEX 
	CW	A1,BUFLEN,A4	OUTSIDE BUFFER?
	RF(NL)	CH100	YES, ERROR
	IM	BUFBIX,A4	INCREMENT INDEX 
	ADR	A1,A4	FREE PLACE IN BUFFER 
	SCR	A2,A1	PUT CHARACTER IN BUFFER
	LDK	A1,0	RETURN CODE := OK 
	RF	CH110	NORMAL EXIT 
* 
* 
CH100	EQU	* 
	LDKL	A1,-1	RETURN CODE := ERROR
CH110	EQU	* 
	ADKL	A15,4	ADJUST STACK
	ABR*	A15	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	INTYPE
* 
* FUNCTION: 
*	THIS ROUTINE CHECKS A GENERAL READ ANSWER FROM
*	THE PLC TO DETERMINE TYPE OF MESSAGE. 
* 
* CALL: 
*	CF	A15,INTYPE 
* 
* INPUT:
*	A5  =	CWT ADDRESS 
* 
* OUTPUT: 
*	A2  =	CHANGED 
*	A3  =	TYPE
*	A4  =	CHANGED 
*	CR  =	CHANGED 
* 
************************************************************
* 
INTYPE	EQU	*
	LDK	A2,X25DAT	MINIMUM INPUT LENGTH 
	CW	A2,CWTRCA+CCRLEN,A5	LENGTH >= MINIMUM?
	RF(G)	ITERR	NO, ERROR
* 
	EJECT
* 
	LD	A3,CWTRCA+CCRBUF,A5	BUFFER ADDRESS
	LC	A2,X25LGN,A3	GROUP NUMBER 
	LDR	A4,A2	SAVE 
	ANK	A4,/0F	CLEAN 
	RF(NZ)	IT120	NOT GROUP ZERO
* 
*    CHANNEL GROUP ZERO. NORMAL MESSAGES. 
	LC	A3,X25FLW,A3	FLOW CONTROL BYTE
	LDR	A4,A3	SAVE 
	ANK	A4,/01	FLAG
	RF(NZ)	IT100	NOT DATA PACKET 
	LDK	A3,TYDATA	ASSUME NORMAL DATA 
	ANK	A2,/80	QUALIFY BIT SET?
	RF(Z)	ITEXIT	NO, NORMAL DATA. EXIT 
	LDK	A3,TYSTAT	YES, STATUS MESSAGE
	RF	ITEXIT	EXIT 
* 
IT100	EQU	* 
	LDR	A4,A3	SAVE FLOW CONTROL BYTE 
	ANK	A3,/02	RECIEVE READY?
	RF(NZ)	IT110	NO
	LDK	A3,TYRR	TYPE := RECIEVE READY
	RF	ITEXIT	EXIT 
* 
IT110	EQU	* 
	LDK	A3,TYRES	ASSUME TYPE = RESET 
	ANK	A4,/04	IS IT RESET?
	RF(Z)	ITEXIT	YES, EXIT 
	LDK	A3,TYRESC	NO, TYPE := RESET CONFIRMATION 
	RF	ITEXIT	EXIT 
* 
	EJECT
* 
IT120	EQU	* 
*    NOT NORMAL MESSAGE 
	LDK	A3,TYNFLO	ASSUME TYPE = NO FLOW CONTROL
	SUK	A4,1	IS IT NO FLOW CONTROL?
	RF(Z)	ITEXIT	YES, EXIT 
* 
ITERR	EQU	* 
	LDK	A3,TYERR	IRRECOVERABLE ERROR 
* 
ITEXIT	EQU	*
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	OUTBUQ
* 
* FUNCTION: 
*	THIS ROUTINE WILL REMOVE A DWT FROM THE QUEUES FOR
*	SHORT OR LONG OUTPUT BUFFERS, IF IT IS IN ANY 
*	OF THE QUEUES.
* 
* CALL: 
*	CF	A15,OUTBUQ 
* 
* INPUT:
*	A5  =	CWT ADDRESS 
*	A6  =	DWT ADDRESS 
* 
* OUTPUT: 
*	A2  =	NOT 0 IF DWT FOUND
*		 0 IF DWT NOT FOUND
*	A4  =	CHANGED 
*	CR  =	CHANGED 
* 
************************************************************
* 
OUTBUQ	EQU	*
	STR	A1,A15	PUSH A1 
	STR	A7,A15	PUSH A7 
	LDR	A4,A6	DWT ADDRESS
	ADKL	A4,DWTOTQ	QUEUE LINK
* 
	LDR	A7,A5	CWT ADDRESS
	ADK	A7,CWTSBQ	SHORT BUFFERS QUEUE
	CF	A15,LNKOUT	REMOVE DWT FROM QUEUE
	LDR	A7,A7	FOUND? 
	RF(NZ)	OB100	YES, RETURN 
* 
	LDR	A7,A5
	ADKL	A7,CWTLBQ	LONG BUFFERS QUEUE
	CF	A15,LNKOUT	REMOVE FROM QUEUE
* 
OB100	EQU	* 
	LDR	A2,A7	A2 := FOUND / NOT FOUND
* 
	LDR*	A7,A15	POP A7 
	LDR*	A1,A15	POP A1 
	IFT	CPU852=1 
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	LNKFST
* 
* FUNCTION: 
*	THIS ROUTINE LINKS A QUEUE ELEMENT FIRST IN 
*	A QUEUE (CLOSEST TO QUEUE HEAD).
*	ONE WORD IN EACH ELEMENT IS USED AS A LINK. 
*	END OF QUEUE IS INDICATED BY LINK=0 IN LAST 
*	ELEMENT.
* 
* CALL: 
*	CF	A15,LNKFST 
* 
* INPUT:
*	A4  =	QUEUE ELEMENT LINK ADDRESS
*	A7  =	QUEUE HEAD LINK ADDRESS 
* 
* OUTPUT: 
*	A1  =	CHANGED 
*	CR  =	CHANGED 
* 
************************************************************
* 
LNKFST	EQU	*
	LDR*	A1,A7	FIRST QUEUE ELEMENT 
	STR	A1,A4	SET LINK FROM NEW ELEMENT
	STR	A4,A7	SET NEW ELEMENT FIRST
	IFT	CPU852=1 
	RF	LNKRET	RETURN 
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	LNKLST
* 
* FUNCTION: 
*	THIS ROUTINE LINKS A QUEUE ELEMENT LAST IN
*	A QUEUE (OPOSITE END TO QUEUE HEAD).
*	ONE WORD IN EACH ELEMENT IS USED AS A LINK. 
*	END OF QUEUE IS INDICATED BY LINK=0 IN LAST 
*	ELEMENT.
* 
* CALL: 
*	CF	A15,LNKLST 
* 
* INPUT:
*	A4  =	QUEUE ELEMENT LINK ADDRESS
*	A7  =	QUEUE HEAD LINK ADDRESS 
* 
* OUTPUT: 
*	A1  =	CHANGED 
*	A7  =	CHANGED 
*	CR  =	CHANGED 
* 
************************************************************
* 
LNKLST	EQU	*
	LDR	A1,A7	SAVE PRESENT ELEMENT 
	LDR*	A7,A7	NEXT ELEMENT
	RB(NZ)	LNKLST	CONTINUE IF NOT LAST ELEMENT 
	STR	A4,A1	LINK NEW ELEMENT AFTER LAST
	CMR	A4	SET END MARKER IN LAST ELEMENT
* 
	EJECT
* 
	IFT	CPU852=1 
	RF	LNKRET	RETURN 
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	LNKOUT
* 
* FUNCTION: 
*	THIS ROUTINE REMOVES AN ELEMENT FROM A QUEUE. 
*	ONE WORD IN EACH ELEMENT IS USED AS A LINK. 
*	END OF QUEUE IS INDICATED BY LINK=0 IN LAST 
*	ELEMENT.
* 
* CALL: 
*	CF	A15,LNKOUT 
* 
* INPUT:
*	A4  =	QUEUE ELEMENT LINK ADDRESS
*	A7  =	QUEUE HEAD LINK ADDRESS 
* 
* OUTPUT: 
*	A1  =	CHANGED 
*	A7  =	=0 IF ELEMENT NOT FOUND 
*		><0 IF ELEMENT FOUND 
*	CR  =	CHANGED 
* 
************************************************************
* 
LNKOUT	EQU	*
	LDR	A1,A7	SAVE PRESENT ELEMENT 
	LDR*	A7,A7	NEXT ELEMENT
	RF(Z)	LO100	EXIT IF END OF QUEUE 
	CWR	A4,A7	ELEMENT FOUND? 
	RB(NE)	LNKOUT	NO, CHECK NEXT 
* 
	EJECT
* 
	LDR*	A7,A7	ELEMENT AFTER WANTED ELEMENT
	STR	A7,A1	SET LINK FROM PREVIOUS TO NEXT 
	LDK	A7,1	INDICATE ELEMENT FOUND
LO100	EQU	* 
* 
* 
	IFT	CPU852=1 
LNKRET	EQU	*
*    COMMON EXIT FOR QUEUE ROUTINES 
*    RETURN WITHOUT CHANGING INTERRUPT ENABLE FLAG
	ADKL	A15,2	SKIP PSW
	LDR*	P,A15	RETURN
	XIF
* 
	IFF	CPU852=1 
	RTN	A15
	XIF
* 
	EJECT
* 
* 
* 
* 
************************************************************
* 
*   PHILIPS TERMINAL SYSTEM  PTS
* 
*   TBUFF  =  TOSS BUFFER HANDLING SUBROUTINES
* 
* 
* 
************************************************************
* 
*   THIS PROGRAM CONTAINS A SET OF BUFFER HANDLING
*   SUBROUTINES. THEY OPERATE ON BUFFERS ORGANIZED
*   IN BUFFER POOLS. A BUFFER POOL CONSISTS OF A
*   POOLBLOCK FOR CONTROL INFORMATION, AND ONE OR 
*   MORE BUFFER AREAS. THE POOLBLOCK AND BUFFER 
*   AREA(S) SHOULD BE SUPPLIED BY THE USER. 
* 
*   ROUTINES IN ORDER OF APPEARANCE IN CODE:
* 
*	NAME	FUNCTION 
* 
*	GETBUF	GET BUFFER FROM POOL 
*	RELBUF	RETURN BUFFER TO POOL
*	AREBUF	DIVIDE AREA INTO BUFFERS 
* 
	EJECT
* 
************* 
* CONSTANTS * 
************* 
* 
* 
*    POOLBLOCK LAYOUT DEFINITION
* 
*      POOLBLOCK WORD OFFSETS 
POBID	EQU	0	POOL IDENTITY 
POBFLG	EQU	2	BINARY FLAGS 
POBFRE	EQU	4	FREE LIST LINK HEAD
POBBUS	EQU	6	BUFFER SIZE (BYTES)
POBARS	EQU	8	AREA SIZE (BYTES)
* 
*      POOLBLOCK LENGTH 
POBLEN	EQU	10	LENGTH (BYTES)
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	GETBUF
* 
* FUNCTION: 
*	THIS ROUTINE FETCHES ONE BUFFER FROM A BUFFER 
*	POOL AND GIVES IT TO THE CALLER.
* 
* CALL: 
*	CF	A15,GETBUF 
* 
* INPUT:
*	A7  =	POOLBLOCK ADDRESS 
* 
* OUTPUT: 
*	A4  =	BUFFER ADDRESS IF BUFFER ALLOCATED
*		  ELSE ZERO
*	CR  =	CONTENTS OF A4
*	INTERR.=	INHIBITED
* 
************************************************************
* 
GETBUF	EQU	*
	INH
	LD	A4,POBFRE,A7	FREE LIST START
	RF(Z)	GB100	NO BUFFER LEFT. EXIT 
* 
	EJECT
* 
	STR	A1,A15	PUSH A1 
	LDR*	A1,A4	NEW START OF FREE LIST
	ST	A1,POBFRE,A7	TO POOLBLOCK 
	LDR*	A1,A15	POP A1 
* 
GB100	EQU	* 
	ADKL	A15,4	ADJUST STACK
	LDR	A4,A4	CR := CONTENTS OF A4 
	ABR*	A15	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	RELBUF
* 
* FUNCTION: 
*	THIS ROUTINE RELEASES ONE BUFFER AND RETURNS
*	IT TO A BUFFER POOL.
* 
* CALL: 
*	CF	A15,RELBUF 
* 
* INPUT:
*	A4  =	BUFFER ADDRESS
*	A7  =	POOLBLOCK ADDRESS 
* 
* OUTPUT: 
*	CR  =	CHANGED 
*	INTERR.=	INHIBITED
* 
************************************************************
* 
RELBUF	EQU	*
	INH
	STR	A1,A15	PUSH A1 
* 
	LD	A1,POBFRE,A7	OLD FREE LIST START
	STR	A1,A4	LINK AFTER NEW BUFFER
	ST	A4,POBFRE,A7	SET NEW FREE LIST START
* 
	LDR*	A1,A15	POP A1 
	ADKL	A15,4	ADJUST STACK
	ABR*	A15	RETURN
* 
	EJECT
* 
************************************************************
* 
* ROUTINE NAME: 
*	AREBUF
* 
* FUNCTION: 
*	THIS ROUTINE ALLOCATES A SPECIFIED DATA AREA TO 
*	A BUFFER POOL. THIS CAN BE DONE IN TWO WAYS.
*	"INIBUF" IS USED WHEN A NEW BUFFER POOL IS
*	INITIATED. IT DIVIDES THE AREA INTO BUFFERS,
*	LINKS THE BUFFERS IN A CHAIN FROM THE FREE LIST 
*	HEAD IN POOLBLOCK, AND PUTS AN END MARKER (-1)
*	IN THE LAST BUFFER. "LNKBUF" IS USED WHEN A NEW 
*	AREA IS ADDED TO AN EXISTING BUFFER POOL. IT
*	DIVIDES THE AREA INTO BUFFERS, AND LINKS THE
*	BUFFERS FIRST IN THE FREE LIST. 
* 
* CALL: 
*	CF	A15,INIBUF 
*	CF	A15,LNKBUF 
* 
* INPUT:
*	A4  =	AREA ADDRESS
*	A7  =	POOLBLOCK ADDRESS 
* 
* OUTPUT: 
*	CR  =	CHANGED IF CPU852 
* 
************************************************************
* 
	EJECT
* 
INIBUF	EQU	*
	IFT	CPU852=1 
	STR	A1,A15	PUSH A1 
	XIF
* 
	IFF	CPU852=1 
	MSR	4,A15	PUSH A1-A4 
	XIF
* 
	LDK	A1,0	MARKER FOR LAST BUFFER
	RF	IL100	GO TO COMMON PART 
* 
* 
LNKBUF	EQU	*
	IFT	CPU852=1 
	STR	A1,A15	PUSH A1 
	XIF
* 
	IFF	CPU852=1 
	MSR	4,A15	PUSH A1-A4 
	XIF
* 
	LD	A1,POBFRE,A7	LINK TO OLD BUFFERS
* 
* 
IL100	EQU	* 
* 
*    COMMON PART FOR INIBUF AND LNKBUF
* 
	IFT	CPU852=1 
	STR	A2,A15	PUSH A2-A4
	STR	A3,A15 
	STR	A4,A15 
	XIF
* 
	EJECT
* 
	LDR	A2,A7
	ADK	A2,POBFRE	FREE LIST START
	LDR	A3,A4
	AD	A3,POBARS,A7	END OF AREA
	SU	A3,POBBUS,A7	HIGEST BUFFER START IN AREA
* 
IL110	EQU	* 
*    BUFFER LINKING LOOP
	SRL	A3,1	SHIFT ADDRESS	=15 
	SRL	A4,1	.	=15 
	CWR	A4,A3	ROOM LEFT? 
	RF(G)	IL120	NO, FINISH 
* 
	SLL	A3,1	.	=15 
	SLL	A4,1	.	=15 
	STR	A4,A2	SET LINK FROM PREVIOUS TO PRESENT
	LDR	A2,A4	NEW PREVIOUS 
	AD	A4,POBBUS,A7	NEW PRESENT
	RB	IL110	TAKE NEXT BUFFER
* 
IL120	EQU	* 
	SLL	A3,1	.	=15 
	SLL	A4,1	.	=15 
	STR	A1,A2	SET LINK OR END IN LAST BUFFER 
* 
	IFT	CPU852=1 
	LDR*	A4,A15	POP A1-A4
	LDR*	A3,A15
	LDR*	A2,A15
	LDR*	A1,A15
	ADKL	A15,2	ADJUST STACK
	LDR*	P,A15	RETURN
	XIF
* 
	IFF	CPU852=1 
	MLR	4,A15	POP A1-A4
	RTN	A15
	XIF
* 
	IFF	UTTEST=0 
	EJECT
* 
******************************************
* 
* ROUTINE NAMES: LOGCOM 
*                LOGIOC 
*                LOGATT 
* FUNCTION:      LOG MSG TYPE AND CCR+BUFFER
*                 DLSSEL SPECIFIES DLS TO BE SELECTED 
*                 0 MEANS LOG ALL 
* 
* RECORD FORMAT:   BYTE 1-2 MSG TYPE (CO,RE,AT) 
*                  BYTE 3   DLS INDEX 
*                  BYTE 4   COMMAND CODE
*                  BYTE 5-6 STATUS-1
*                  BYTE 7   BUFFER LENGTH 
*                  BYTE 8   PACKET HEADER -1
*                  BYTE 9   PACKET HEADER -2 (LOGICAL CHANNEL)
*                  BYTE 10  PACKET HEADER -3 (FLOW CONTOL)
*                  BYTE 11-16  6 FIRST DATA BYTES 
*********************************************** 
* 
DLSSEL	DATA	0	0=LOG ALL 
*			ELSE DLS TO BE LOGGED 
	XIF
PLCLOG	EQU	*
	IFF	UTTEST=0 
LOGPTR	DATA	LOGARE	RECORD POINTER IN LOG AREA 
LOGARE	RES	960	LOG AREA 
LOGEND	EQU	*
	DATA	'ENDLOG'	MARK END OF LOG AREA 
*-------------------------------------------- 
LOGCOM	EQU	*	SUBROUTINE ENTRY 
	IFT	CPU852=1 
	STR	A1,A15 
	STR	A2,A15 
	STR	A3,A15 
	XIF
	IFF	UTTEST=0 
	IFF	CPU852=1 
	MSR	3,A15	PUSH A1-A3 
	XIF
	IFF	UTTEST=0 
	LDKL	A1,'CO'	MSG TYPE
	LDK	A2,CWTCCA	CCA OFFSET 
	RF	LOG:10

LOGIOC	EQU	*	SUBROUTINE ENTRY 
	IFT	CPU852=1 
	STR	A1,A15 
	STR	A2,A15 
	STR	A3,A15 
	XIF
	IFF	UTTEST=0 
	IFF	CPU852=1 
	MSR	3,A15	PUSH A1-A3 
	XIF
	IFF	UTTEST=0 
	LDKL	A1,'RE'	MSG TYPE
	LDK	A2,CWTRCA	RCA OFFSET 
	RF	LOG:10

LOGATT	EQU	*	SUBROUTINE ENTRY 
	IFT	CPU852=1 
	STR	A1,A15 
	STR	A2,A15 
	STR	A3,A15 
	XIF
	IFF	UTTEST=0 
	IFF	CPU852=1 
	MSR	3,A15	PUSH A1-A3 
	XIF
	IFF	UTTEST=0 
	LDKL	A1,'AT'	MSG TYPE
	LDK	A2,CWTRCA	RCA OFFSET 
*------------------------------------------ 
LOG:10	EQU	*	COMMON PART
	LD	A3,LOGPTR 
	STR	A1,A3	LOG MSG TYPE 
	ADR	A2,A5	CCR PTR
	LD	A1,DLSSEL	SELECTED DLS
	RF(Z)	LOG:15	LOG ALL 
	CC	A1,CCRDLS,A2
	RF(NE)	LOG:20	NOT SELECTED,SKIP
LOG:15	EQU	*
	LD	A1,CCRDLS,A2	DLS INDEX
	ST	A1,2,A3	+COMMAND INTO LOG 
	LD	A1,CCRSTA,A2	STATUS-1 
	ST	A1,4,A3	LOG STATUS-1
	LD	A1,CCRLEN,A2	BUFFER LENGTH
	SC	A1,6,A3	INTO LOG
	LD	A2,CCRBUF,A2	BUFFER ADDRESS 
	LDR*	A1,A2	BYTE 0-1
	SC	A1,8,A3	PACKET HEADER 2 
	SRL	A1,8 
	SC	A1,7,A3	PACKET HEADER 1 
	LD	A1,2,A2	PACKET HEADER 3+ BYTE 1 
	SC	A1,10,A3
	SRL	A1,8 
	SC	A1,9,A3 
	LD	A1,4,A2	BYTE 2-3
	SC	A1,12,A3
	SRL	A1,8 
	SC	A1,11,A3
	LD	A1,6,A2	BYTE 4-5
	SC	A1,14,A3
	SRL	A1,8 
	SC	A1,13,A3
	LD	A1,8,A2 
	SRL	A1,8 
	SC	A1,15,A3
	ADK	A3,16
	ST	A3,LOGPTR	NEXT RECORD IN LOG AREA 
	CWK	A3,LOGEND	END OF LOG AREA? 
	RF(NE)	LOG:20	NO!
	LDKL	A1,LOGARE	RESET PTR 
	ST	A1,LOGPTR 
LOG:20	EQU	*
	IFT	CPU852=1 
	LDR*	A3,A15	RESTORE
	LDR*	A2,A15
	LDR*	A1,A15
	ADKL	A15,4 
	ABR*	A15	RETURN
	XIF
	IFF	UTTEST=0 
	IFF	CPU852=1 
	MLR	3,A15
	RTN	A15
	XIF
* 
* 
	END

Full view