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

⟦09205f05a⟧

    Length: 52694 (0xcdd6)
    Notes: pts_type(SC)
    Names: »DRDC07.SC«

Derivation

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

PTS(SC)

	IDENT DRDC07 	REL 9.2 80-01-03  870105040920 

			=1, CONDITIONAL ASS CPU852 
			REL 9.2 79-11-16 


* 
********************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
* 
*   DRDC07: DRIVER DATA COMMUNICATION 
*           HDLC FULL DUPLEX PROCEDURE
* 
* 
* 
* 
* 
********************************************* 
* 
* 
* 
* 
* 
	EJECT
* 
* 
*	ENTRY POINTS
* 
* 
	ENTRY	DC07AD	ADDRESS BLOCK TERMINAL REQUESTS 
	ENTRY	IH0701	INPUT INTERRUPT 
	ENTRY	IH0702	OUTPUT INTERRUPT
	ENTRY	DC07ON	POWER ON ROUTINE
	ENTRY	DW0700	DWT FOR DC TASK 
* 
* 
*	EXTERNAL REFERENCES 
* 
* 
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	SAVE8	SAVE A1-A8 ON A15 STACK
	EXTRN	TENDIO	COMPLETE I/O EVENT
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	SETIME	SET TIMER 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTOR	DWT ORDER
	EXTRN	DWTECB	DWT ECB 
	EXTRN	QMJOB	QUEUE MONITOR JOB
	EXTRN	DC:MIN	MOVE DATA TO USER BUFFER
	EXTRN	DC:MOT	MOVE DATA FROM USER BUFFER
	EXTRN	DISEND	COMPLETE REQUEST
	EJECT
* 
* 
* 
* 
*   STANDARD INTERFACE PART FOR DATA COMMUNICATION
* 
* 
* 
* 
*	DWT CONTENTS
* 
*	DWTCHP	TERMINAL ADDRESS AS GIVEN AT PARAMETER TRANSFER (BIT #08-#15)
*	DWTST	BIT #00:     NO REQUEST 
* 
* 
*	ECB PARAMETERS
* 
* 
ECBBA	EQU	2	BUFFER ADDRESS
ECBRL	EQU	4	REQUESTED LENGTH
ECBEL	EQU	6	EFFECTIVE LENGTH
ECBRC	EQU	8	RETURN CODE 
ECBCW	EQU	10	CONTROL WORD 
	EJECT
************************************************************************* 
* 
*	CONDITIONAL ASSEMBLY
* 
************************************************************************* 
* 
*	A PROGRAM VERSION USING TOSS PAGING IS
*	OBTAINED BY SETTING MMUPAG EQU 1
* 
MMUPAG	EQU	0
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0 
* 
CPU852	EQU	1		=1
* 
*	DWT DISPLACEMENTS 
* 
DWTDRD	EQU	/10	START OF DRIVER DEFINED PART 
	IFT	MMUPAG=0 
START	EQU	DWTDRD
	XIF
	IFT	MMUPAG=1 
START	EQU	DWTDRD+4
	XIF
DWTTP	EQU	START+/00	TIMER POINTER ORDER PROCESS 
DWTWQ	EQU	START+/02	WRITE/GET BUFFER QUEUE
DWTBQ	EQU	START+/04	BUFFER QUEUE ANCHOR 
DWTBTP	EQU	START+/06	TIMER POINTER FOR BUFFER QUEUE 
DWTTIM	EQU	START+/08	REQUEST TIMER VALUE
	EJECT
* 
* 
*	PARAMETERS FOR CONDITIONAL ASSEMBLY 
* 
* 
X:A	EQU	130	RECEIVE BUFFER LENGTH 
RBUFL	EQU	X:A 
X:B	EQU	60	DCTASK FILE CODE 
DC07FC	EQU	X:B
X:C	EQU	1	IF 1 INTERRUPT LOGGING
LOGG	EQU	X:C
X:D	EQU	300	POLL TIMEOUT VALUE
TIMPOL	EQU	X:D
X:E	EQU	14	NUMBER OF RECEIVE BUFFERS
RBUFNR	EQU	X:E	VARIABLE BETWEEN 3 AND 14
X:F	EQU	0 
HFDUP	EQU	X:F	FULL(=1),HALF(=X:F)DUPLEX 
X:G	EQU	0 
P6805	EQU	X:G	COMPUTER 6805 IF ::= 1
X:H	EQU	/02	INPUT DEVICE ADDRESS
	IFF	P6805=1
CHLCIN	EQU	X:H
	XIF
	IFT	P6805=1
CHLCIN	EQU	X'0A'
	XIF
X:I	EQU	1000
TBUFL	EQU	X:I	MMU BUFFER LENGTH 
	IFF	P6805=1
CHLCUT	EQU	CHLCIN+/10	OUTPUT DEVICE ADDRESS 
	XIF
	IFT	P6805=1
CHLCUT	EQU	CHLCIN+1 
	XIF
* 
* 
* 
DEVIND	EQU	-2	DEVICE INDEX DATA COMMUNICATION 
BUFLEN	EQU	TBUFL+2
	EJECT
* 
* 
*	REQUEST HANDLING
* 
* 
* 
*	PARAMETERS
* 
*	A7=ORDER
* 
*	/02: READ 
*	/06: WRITE
*	/37: TRANSFER PARAMETERS
*	/39: SET REQUEST TIMER VALUE
* 
	EJECT
* 
* 
*	CONSTANTS AND WORK AREAS
* 
* 
DCONOF	DATA	0	ON- / OFFLINESWITCH 
DCSTOL	DATA	0	OLD DC EQUIPMENT STATUS 
DCSTCU	DATA	0	CURRENT STATUS
DCWRQ	DATA	0	WRITE REQUEST QUEUE
DCTPGP	DATA	0	TIMER POINTER GENERAL POLL
* 
*	DC TASK ADDRESS 
* 
	DATA	0	INDICATES NO MMU BLOCKS 
	DATA	DEVIND	DEVICE INDEX 
DC07DC	DATA	DCACTD	ADDRESS BLOCK DC TASK
	DATA	ABORT	ABORT ROUTINE ADDRESS 
	DATA	DCRBUF	ANCHOR RECEIVE BUFFER POOL 
* 
*	DRIVER ADDRESS BLOCK
* 
	DATA	BUFLEN	MMU BUFFER SIZE
	DATA	DEVIND	DEVICE INDEX 
DC07AD	DATA	DCACT	ADDRESS BLOCK 
	DATA	ABORT	ABORT ROUTINE ADDRESS 
	DATA	DCRBUF	ANCHOR RECEIVE BUFFER POOL 
	RES	15	SUBROUTINE STACK FOR INTERRUPTS 
STB	RES	1 
* 
* 
TIMBUF	EQU	1800	180 SECONDS 
	EJECT
* 
*     CIO START-IN COMMANDS 
* 
CICMO	EQU	/2	CONNECT MODEM
CIDISC	EQU	/1	DISCONNECT MODEM
CIWAIC	EQU	/3	WAIT FOR CALLL
CIREPC	EQU	/5	RECEIVE ON PROG.CHANNEL 
CIAREP	EQU	/4	RECEIVE ON PROG.CHANNEL (2-WIRE)
CIREMX	EQU	/B	RECEIVE ON MUX CHANNEL
CIAREM	EQU	/E	RECEIVE ALARM ON MUX CHANNEL
* 
*     CIO START-OUT COMMANDS
* 
CINRTS	EQU	1	NO REQUEST TO SEND 
CIT4WP	EQU	2	4-WIRE PROG.CHANNEL
CIT2WP	EQU	3	2-WIRE PROG.CHANNEL
CIT4WM	EQU	/A	4-WIRE MUX.CHANNEL
CIT2WM	EQU	/B	2-WIRE MUX.CHANNEL
CIIDLE	EQU	4	TRANSMIT IDLE 1
	EJECT
* 
*  CHANNEL UNIT PARAMETRS 
* 
* 
* PROCEDURE WORK AREAS
* 
STATUS	DATA	0	(=1):N(S)FAIL,(=2):N(R) FAIL
BUFNUL	DATA	0	BUFFER OVERFLOW INDICATOR 
SWITCH	DATA	0	OUTPUT BUFFER FLAG
TRMACT	DATA	0	OUTPUT ACTIVE FLAG
	IFF	MMUPAG=0 
SWMMU	DATA	0	FLAG TO INDIC.USER BUFFER MVD/NOT MVD
	XIF
TESTCF	DATA	0	INPUT BUFFER FLAG 
MODE	DATA	0	MODE INDICATOR (0~=DISC,1=NRM,2=CMDR) 
QTRM	DATA	0	COMMAND/RESPONSE QUEUE AREA 
FIELD1	DATA	0	ADDRESS + C-FIELD RECEPTION 
WRDWT	DATA	0	WRITING DWT
	RES	15	STACK FOR INPUT PROCESS 
STBIN	RES	1	INPUT STACK POINTER 
	RES	15	STACK FOR OUTPUT PROCESS
STBUT	RES	1	OUTPUT STACK POINTER
* 
* 
*     PROCEDURE COUNTERS
* 
* 
CPCNT	DATA	0	CHECK POINT
VSCNT	DATA	0	SEND STATE VARIABLE
VRCNT	DATA	0	RECEIVE STATE VARIABLE 
NSCNT	DATA	0	SEND COUNTER 
NRCNT	DATA	0	RECEIVE COUNTER
LNRCNT	DATA	0	LAST ACCEPTED N(R)
	EJECT
* 
* 
*    PROCEDURE EQUATES
* 
* 
*   COMMANDS
* 
SNRM	EQU	/93	SET NORMAL RESPONSE MODE 
DISC	EQU	/53	SET DISCONNECT MODE
SIM	EQU	/7	SET INIT MODE
* 
*   MASKS ON RECEIVED FRAMES
* 
RRMSK	EQU	1	RECEIVE READY 
RNRMSK	EQU	5	RECEIVE NOT READY
REJMSK	EQU	9	REJECT COMMAND 
IMSK	EQU	1	INFORMATION FRAME
UIMSK	EQU	3	UNNUMBERED I-FRAME
* 
*   SENDING FRAMES
* 
RNR	EQU	/15	RECEIVE NOT READY 
UA	EQU	/73	NON SEQUENCED ACK
ROL	EQU	/1F	REQUEST ON LINE 
RR	EQU	/11	READY TO RECEIVE 
CMDR	EQU	/97	INVALID COMMAND
REJ	EQU	/19	FRAME REJECTION 
	EJECT
* 
* 
*	ACTIVATION FROM TERMINAL TASKS
* 
DCACT	EQU	* 
	LDK	A1,0	PRESET RETURN CODE
	SUK	A7,/02 
	RF(Z)	DCRD	READ SPECIFIC 
	SUK	A7,/06-/02 
	RF(Z)	DCWR 
	SUK	A7,/37-/06 
	RF(Z)	DCTP	TRANSFER PARAMETERS 
	SUK	A7,/39-/37	SET REQUEST TIMER VALUE 
	RF(Z)	REQTIM	SET REQUEST TIMER VALUE 
	RF	DCA100
	EJECT
* 
* 
*	ACTIVATION FROM DCTASK
* 
* 
DCACTD	EQU	*
	SUK	A7,/02 
	RF(E)	DCRDDC	READ
	SUK	A7,/37-/02 
	RF(E)	DCTP	TRANSFER PARAMETERS 
DCA100	EQU	*	REQUEST ERROR
	ABL	DISIOE	INVALID ORDER 
	EJECT

************************************************************
* 
*    ABORT ROUTINE
* 
************************

ABORT	LD	A1,DWTTP,A6	TIMER POINTER
	RF(Z)	AB:10	NO TIMER RUNNING 
	CM*	DWTTP,A6	KILL TIMER
	CM	DWTTP,A6

AB:10	LD	A1,DWTOR,A6	ORDER CODE 
	SUK	A1,2 
	RF(Z)	AB:RTN	READ REQUEST. NO ACTION 
	SUK	A1,4 
	RF(NZ)	AB:RTN	NO ACTION IF NOT READ/WRITE

	CF	A15,REMOVW	REMOVE DWT FROM WRITE QUEUE
	LD	A2,WRDWT	WRITING DWT ADDRESS
	CWR	A2,A6
	RF(NE)	AB:RTN	NOT THIS DWT 
	CM	WRDWT	RESET WRITING DWT 

AB:RTN	EQU	*
	IFT	CPU852=1 
	ADKL	A15,4 
	ABR*	A15	RETURN IN INHIBIT MODE
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
	EJECT
* 
* 
*	READ FROM DCTASK
* 
* 
*	REQUEST FROM DC-TASK
*	COMPLETE WHEN:
*	  STATUS CHANGE ON DC EQUIPMENT 
*	  SPONTANOUS MESSAGE RECEPTION
* 
DCRDDC	EQU	*
	LD	A2,ECBRL,A8	REQUEST BUFFER LENGTH 
	CF	A15,CKMESS	CHECK IF MESSAGE RECEIVED
	RF	DCRTN	RETURN
	EJECT
* 
* 
*	TRANSFER PARAMETERS 
* 
* 
*	REQUEST FROM DC-TASK: TRANSFER TERMINAL COMPUTER ADDRESS
*	        FROM TERMINALS: TRANSFER TERMINAL ADDRESSES 
* 
* 
DCTP	LD	A2,ECBCW,A8	GET PARAMETER 
	STR	A2,A6	SAVE IN FIRST WORD OF DWT
* 
* 
*  HERE TO INTRODUCE DWT IN DC-TAB
*      IF NOT DC-TASK CONCERNED 
* 
	CWK	A6,DW0700	DC-TASK ?
	RF(E)	DCTP30	YES 
			CHECK IF DWT IN DC:TAB 
	LD	A1,DCTAB	START OF DC:TAB
	AD*	A1,DCTAB	NEXT FREE ENTRY 
DCTP23	EQU	*
	SUK	A1,2	BACKWARDS 
	CW	A1,DCTAB	AT START ? 
	RF(E)	DCTP25	NOT FOUND 
	CWR*	A6,A1	DWT?
	RF(E)	DCTP30	YES EXIT
	RB	DCTP23	CHECK NEXT ENTRY BACWARDS
DCTP25	EQU	*	FIND FREE SLOT 
	LD	A1,DC:IN	GET DC:TAB INPUT POINTER 
	CWK	A1,DC:END	TABLE ALREADY FULL ? 
	ABL(E)	DISIOE	YES REQUEST ERROR
	STR	A6,A1	INSERT DWT IN DC:TAB 
	LDK	A1,2 
	ADS	A1,DC:IN	UPDATE DC:TAB INPUT POINTER 
	ADS	A1,DC:TAB	INCREMENT DC:TAB LENGTH
DCTP30	EQU	*
	SUR	A1,A1	RETURN CODE=0
ENDIO	EQU	* 
	CF	A15,TENDIO	COMPLETE REQUEST 
DCRTN	EQU	* 
	ABL	TDISP	GOTO DISPATCHER
	EJECT
* 
* 
*	WRITE 
* 
* 
*	COMPLETE WHEN:
*	  SUCCESFUL TRANSMISSION
*	  TIME OUT
* 
* 
DCWR	EQU	*
	IFT	MMUPAG=1 
	LD	A1,ECBRL,A8	REQUESTED LENGTH
	CWK	A1,BUFLEN+BUFLEN-2	TEST IF CORRECT LENGTH
	RF(G)	IL:LEN	ILLEGAL LENGTH           *** 9.1 ** 
	XIF
	CF	A15,TIMEWR	SET TIMER
	CF	A15,INSWQ 	QUEUE REQUEST
	RB	DCRTN 
	EJECT
* 
* 
* 
*	READ
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE RECEIVED
*	  TIME OUT
* 
* 
DCRD	EQU	*
* 
* 
	LD	A1,DWTBQ,A6	CHECK BUFFER QUEUE
	RF(NZ)	DCRD10	NOT EMPTY
* 
* 
* 
	CF	A15,TIMERE	START TIMER
* 
* 
* 
	RB	DCRTN 
* 
* 
*	BUFFER WAITING IN QUEUE 
* 
* 
DCRD10	EQU	*
	LDR*	A2,A1	GET NEXT ONE
	ST	A2,DWTBQ,A6	STORE AS FIRST IN QUEUE 
	LD	A4,2,A1	GET LENGTH
	SUK	A4,1	UPDATE LENGTH 
	ST	A4,ECBEL,A8	STORE IN ECB
	ADK	A1,6	ADJUST ADDRESS
	LDR	A4,A1	RECEIVE BUFFER ADDRESS 
	LDK	A1,0 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
	LD	A1,DWTBQ,A6 
	RB(NZ)	DCRTN 
	LD	A1,DWTBTP,A6	QUEUE EMPTY, STOP TIMING 
	RB(Z)	DCRTN
	CM*	DWTBTP,A6
	CM	DWTBTP,A6 
	RB	DCRTN 
	EJECT
* 
* 
*	SET REQUEST TIMER VALUE 
* 
* 
REQTIM	EQU	*
	LD	A2,ECBCW,A8	TIMEOUT VALUE 
	ST	A2,DWTTIM,A6	SAVE TIMEOUT VALUE IN DWT
	RB	DCTP30
	EJECT
********************************************************************* 
* 
*	ILLEGAL SIZE OF APPLICATION BUFFER      *** 9.1 *** 
* 
********************************************************************* 
IL:LEN	EQU	*
	LDKL	A1,/8008	REQUEST ERROR + ILLEGAL LENGTH 
	ABL	DISEND 
	EJECT
* 
* 
* 
*	TIMER HANDLING PART 
* 
* 
* 
*	READ TIMER=TIMERR 
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET TIMEOUT VALUE
	RF(Z)	TIME10	NO TIMING 
	ST	A2,TIMERR 
	CF	A15,SETIME
	DATA	TOUTRE
TIMERR	DATA	0 
	ST	A4,DWTTP,A6	STORE TIMER POINTER 
	RF	TIME10
* 
*	TIMEOUT READ TIMER
* 
TOUTRE	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6
* 
TOUTR1	EQU	*
	LDK	A1,/40	INDICATE TIME OUT 
 	RB	ENDIO	COMPLETE REQUEST 
	EJECT
* 
*	WRITE TIMER=TIMWR 
* 
TIMEWR	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET TIMEOUT VALUE
	RF(Z)	TIME10	NO TIMING 
	ST	A2,TIMWR
	CF	A15,SETIME
	DATA	TOUTWR
TIMWR	DATA	0
	ST	A4,DWTTP,A6 
TIME10	EQU	*
	IFT	CPU852=1 
	ADKL	A15,4 
	ABR*	A15 
	XIF
	IFT	CPU852=0 
	RTN	A15
	XIF
	EJECT
* 
*	TIMEOUT WRITE TIMER 
* 
TOUTWR	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6
 	LD	A2,DWTECB,A6 
	LD	A4,ECBBA,A2	FETCH BUFFER
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
	RB	TOUTR1
	EJECT
* 
* 
*	STOP REQUEST TIMING 
* 
*	REMAINING TIME IS RETURNED IN A2
* 
* 
CTIME	EQU	* 
	LD	A2,DWTTP,A6	GET TIMER POINTER 
	RF(Z)	CTIM10	NOT RUNNING 
	LDR*	A2,A2 
	NGR	A2,A2	GET REMAINING TIME 
	CM*	DWTTP,A6	STOP TIMER
	CM	DWTTP,A6
CTIM10	EQU	*
	RTN	A5 
	EJECT
* 
*	GET RECEIVE BUFFER
* 
*	CALLING SEQUENCE: CF A15,GRBUF
*	A4=0 IF NO BUFFER IS FREE 
*	ELSE A4 CONTAINS BUFFER ADDRESS 
*	A2 AND A3 ARE DESTROYED 
* 
* 
GRBUF	LDKL	A2,DCRBUF	RECEIVE BUFFERS
GBUF	INH
	LDR*	A4,A2 
	RF(Z)	GBUF10	NO BUFFER FREE
	LDR*	A3,A4	REMOVE BUFFER FROM FREE CHAIN 
	STR	A3,A2
GBUF10	EQU	*
	IFT	CPU852=1 
	ADKL	A15,4 
	ABR*	A15 
	XIF
	IFT	CPU852=0 
	RTN	A15
	XIF
* 
	EJECT
* 
* 
*	RELEASE RECEIVE BUFFER
* 
*	A4 CONTAINS BUFFER ADDRESS
*	CALLING SEQUENCE: CF A15,RRBUF
*	A2 AND A3 ARE DESTROYED 
* 
* 
RRBUF	LDKL	A2,DCRBUF	RECEIVE BUFFERS
RBUF	INH
RBUF10	EQU	*
	LDR*	A3,A2 
	RF(Z)	RBUF20 
	LDR	A2,A3
	RB	RBUF10
RBUF20	EQU	*
	STR	A4,A2
	CMR	A4 
	RB	GBUF10	RETURN TO CALLER 
	EJECT
* 
* 
*	INSERT DWT IN WRITE REQUEST QUEUE 
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSWQ	LDKL	A2,DCWRQ	GET QUEUE ANCHOR
	LDK	A4,DWTWQ 
INSWQ2	LDR*	A3,A2 
	RF(Z)	INSWQ3	END OF QUEUE FOUND
	LDR	A2,A3
	RB	INSWQ2
INSWQ3	ADR	A4,A6
	STR	A4,A2	INSERT IN QUEUE
	CMR	A4	INDICATE END OF QUEUE 
	RB	GBUF10	RETURN 
* 
* 
*	REMOVE DWT FROM WRITE REQUEST QUEUE 
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVW	LDKL	A2,DCWRQ	GET QUEUE ANCHOR 
	LDK	A4,DWTWQ	GET DWT-LINK TO BE REMOVED
	ADR	A4,A6
REM10	LDR*	A3,A2
	RB(Z)	GBUF10	NOT ON QUEUE: RETURN
	CWR	A3,A4
	RF(E)	REM15
	LDR	A2,A3	GET NEXT 
	RB	REM10 
REM15	LDR*	A3,A4	REMOVE 
	STR	A3,A2
	RB	GBUF10	RETURN 
	EJECT
* 
* 
*	QUEUE ALLOCATED RECEIVE BUFFER
* 
*	A4=BUFFER ADDR
*	A2,A3 DESTROYED 
* 
QRBUF	EQU	* 
	LDKL	A2,DW0700+DWTWQ	BEGINNING OF RECEIVE QUEUE
QR100	EQU	* 
	LDR*	A3,A2 
	RF(Z)	QR200	END OF QUEUE FOUND 
	LDR	A2,A3
	RB	QR100 
QR200	STR	A4,A2	INSERT INTO QUEUE 
	CMR	A4	INDICATE END OF QUEUE 
	RTN	A5 
	EJECT
* 
* 
*	CHECK IF UNEXPECTED MESSAGE OR STATUS CHANGE
* 
*	REGISTERS A1,A2,A3,A4,A6 AND A8 ARE DESTROYED 
* 
CKMESS	LDKL	A6,DW0700 
	LD	A1,DWTST,A6 
	RF(N)	CKM110	NO REQUEST
	LDK	A1,2	READ REQUEST ?
	CW	A1,DWTOR,A6 
	RF(NE)	CKM110	NO 
	LD	A8,DWTECB,A6	ECB ADDR TO A8 
	LD	A3,DWTWQ,A6	A3=ADDR TO READ QUEUE 
	RF(Z)	CKM200	NO READ IN QUEUE
	LDR*	A2,A3	A2=ADDR TO NEXT READ BUFFER 
	ST	A2,DWTWQ,A6	STORE THIS ADDR INTO QUEUE
	LD	A4,2,A3	SET LENGTH
	SUK	A4,1	UPDATE LENGTH 
	ST	A4,ECBEL,A8	STORE NUMBERS OF CHARACTERS 
	LD	A4,4,A3 
	ST	A4,ECBCW,A8	STORE LINE DEVICE ADDRESS 
	ADK	A3,6	ADDRESS DATA PART 
	LDR	A4,A3	RECEIVE BUFFER ADDRESS 
	LDK	A1,0 
	CF	A15,DC:MIN	MOVE DATA TO USER ADDRESS
	RF	CKM110
CKM200	LD	A1,DCSTCU	NO MESSAGE RECEIVED,CHECK STATUS
	OR	A1,DCONOF	TAKE CARE OF POLL TIME OUT
	CW	A1,DCSTOL 
	ST	A1,DCSTOL 
	RF(E)	CKM110	NO CHANGE OF STATUS 
	ORKL	A1,/2000	INDICATE STATUS CHANGE 
CKM100	EQU	*
	CF	A15,TENDIO	COMPLETE READ GENERAL REQUEST
CKM110	EQU	*
	IFT	CPU852=1 
	ADKL	A15,4 
	ABR*	A15 
	XIF
	IFT	CPU852=0 
	RTN	A15
	XIF
	EJECT
* 
* 
*	HDLC INPUT PROCESS
* 
*	READ ONE FRAME,ANALYZE IT 
*	QUEUE RESPONSES FOR 
*	OUTPUT PROCESS
* 
* 
BRM	EQU	*	BASIC RECEIVE MODE
	LDKL	A5,STBIN	LOAD INPUT STACK BASE
	CF	A5,RDFRAM	READ ONE FRAME
	RB(NZ)	BRM	INVALID FRAME 
	LC	A1,FIELD1	GET CLUSTER ADDRESS 
	CC	A1,DW0700+1 
	RB(NE)	BRM	NOT MENT FOR THIS CLUSTER 
	LC	A1,FIELD1+1	GET C-FIELD 
	LDR	A2,A1	SAVE IT
	XRK	A2,SNRM
	RF(NZ)	BRM100
* 
* 
*	SNRM RECEIVED 
* 
* 
	LDK	A1,1 
	ST	A1,MODE	INDICATE NORMAL RESPONSE MODE 
	CF	A5,RESCON	RESET COUNTERS
BRM050	EQU	*
	LDK	A1,1	LOAD 'UA' 
	RF	BRMTRA
* 
BRM100	EQU	*
	LDR	A2,A1
	XRK	A2,DISC	DISCONNECT ? 
	RF(NZ)	BRM110
* 
* 
*	DISC RECEIVED 
* 
* 
BRM105	EQU	*
	CM	MODE	INDICATE DISCONNECT MODE 
	RB	BRM050
BRM110	EQU	*
	LD	A2,MODE 
	RF(NZ)	BRM120	NRM OR CMDR
* 
* 
*	DISCONNECT MODE, REQUEST FOR ONLINE 
* 
* 
	LDK	A1,2	LOAD 'ROL'
	RF	BRMTRA
BRM120	EQU	*
	SUK	A2,2 
	RF(Z)	BRM160	CMDR-MODE 
	EJECT
* 
* NORMAL RESPONSE MODE
*    TRANSACTIONS 
* 
	ANK	A1,/F	IGNORE COUNTERS
	LDR	A2,A1	GET C-FIELD
	XRK	A2,RNRMSK
	RF(NZ)	BRM130
* 
*	RNR RECEIVED
* 
* 
	CF	A5,UPDCON	UPDATE COUNTERS AND CHECK OUTPUT QUEUE
	CF	A5,TSTNR	CMDR ? 
	LC	A1,FIELD1+1	GET C-FIELD 
	ANK	A1,/10	CHECK POLL-BIT
	RB(Z)	BRM	P-BIT OFF
	LDK	A1,3	LOAD 'RR' 
	LD	A2,DCRBUF 
	RF(NZ)	BRMTRA	OK READY TO RECEIVE
	LDK	A1,5	LOAD RNR
	RF	BRMTRA
* 
BRM130	EQU	*
	LDR	A2,A1	GET MASK 
	XRK	A2,RRMSK 
	RF(Z)	BRM140 
	LDR	A2,A1
	XRK	A2,REJMSK
	RF(NZ)	BRM150
* 
*	RR OR REJ RECEIVED
* 
BRM140	EQU	*
	CF	A5,UPDCON	UPDATE COUNTERS AND CHECK OUTPUT QUEUE
	CF	A5,TSTNR	CMDR ? 
BRM145	EQU	*
	LC	A1,FIELD1+1	GET C-FIELD 
	ANK	A1,/10	CHECK POLL-BIT
	RB(Z)	BRM	P-BIT OFF
	LDK	A1,6	INDICATE POLL-BIT RECEIVED
	RF	BRMTRA
* 
	EJECT
* 
* FETCH IF INVALID CONTROL FIELD
* 
BRM150	EQU	*
	LDR	A2,A1
	ANK	A2,IMSK
	RF(Z)	BRM170	I-FRAME 
	LC	A1,FIELD1+1	GET C-FIELD 
	ANK	A1,/EF	EXCLUDE POLL-BIT
	LDR	A2,A1
	XRK	A2,UIMSK	UI ?
	RF(Z)	BRM155	YES 
	LDR	A2,A1
	XRK	A2,SIM	SIM ? 
	RF(NZ)	BRM156	NO 
BRM155	EQU	*
	LC	A1,FIELD1+1 
	ANK	A1,/10	P-BIT ON ?
	RB(NZ)	BRM050	YES
	RB	BRM 
* 
* 
*	INVALID COMMAND 
* 
* 
BRM156	EQU	*
	LDK	A2,0	PRESENT CONTERS 
	LDK	A3,/80	FAIL CODE (CMDR MODE SETTING) 
	CF	A5,PRCMDR	INIT CMDR 
BRM160	EQU	*
	LDK	A2,2 
	ST	A2,MODE	INDICATE CMDR MODE
	LDK	A1,4	LOAD 'CMDR' 
* 
*	QUEUE FOR TRANSMISSION
* 
BRMTRA	EQU	*
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
	RB	BRM 
	EJECT
* 
* 
*	I-FRAME RECEIVED
* 
* 
BRM170	EQU	*
	LD	A1,BUFNUL 
	RB(NZ)	BRM	NO BUSY STATEMENT 
	CF	A5,UPDCON	UPDATE COUNTERS 
	LD	A1,STATUS	CHECK UNEXPECTED N(S) 
	ANK	A1,1	N(S) OK?
	RF(NZ)	BRM185	NO 
	CF	A5,TSTNR	CHECK UNEXPECTED N(R)
	LC	A1,FIELD1+1 
	ANK	A1,/10	CHECK POLL BIT
	RF(Z)	BRM180	P-BIT OFF 
	LDK	A1,6	INDICATE POLL-BIT RECEIVED
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
BRM180	EQU	*
	CF	A15,GRBUF	ALLOCATE LINK BUFFER
* 
*  HERE TO PROCESS AVAILABLE FRAME
*    A4=BUFFER
* 
	LC	A2,+5,A4	GET STA
	ANK	A2,/FF 
	CF	A5,FINTER	FIND OUT DESTINATION
	LDR	A6,A3	DWT FOUND
	RF(NZ)	BRM190	YES
	EJECT
* 
*   SUBTERMINAL ADDRESS IS NOT CONTAINED
*     IN DCTAB SUBSET.
*  QUEUE INCOMMING MESSAGE TO DC-TASK 
*       AND CHECK IF REQUEST PENDING
* 
	ST	A2,+4,A4	SAVE WRONG SUB TRMNL. ADDRESS
	CF	A5,QRBUF	QUEUE IN DW0700
	CF	A15,CKMESS	COMPLETE DC-REQUEST
	ABL	BRM
* 
*  EXEPTION STATE:WRONG N(S)
*     FULL-DUPLEX:SEND REJ WITHOUT TESTING POLL-BIT 
*     HALF-DUPLEX:WAIT POLL-BIT 
* 
BRM185	EQU	*
	CM	STATUS	RESTORE STATUS 
	LDKL	A1,HFDUP	GET FULL OR HALF DUPLEX
	RB(Z)	BRM145	WAIT POLL 
	LDK	A1,/FF	INDICATE REJ TOBE SENT
	RB	BRMTRA
	EJECT
* 
*    COMPLETE READ OR EXCHANGE REQUEST
* 
BRM190	EQU	*
	LD	A1,DWTST,A6	GET STATUS
	RF(N)	COMP30	NO REQUEST
	LD	A1,DWTOR,A6	GET ORDER 
	SUK	A1,2 
	RF(NZ)	COMP30	NOT READING
COMP25	EQU	*
	LD	A8,DWTECB,A6	GET ECB ADDRRESS 
	LD	A1,+2,A4	GET LENGTH 
	SUK	A1,1	UPDATE LENGTH 
	ST	A1,ECBEL,A8	SAVE IT 
	CF	A5,CTIME	RESET TIMER                 =2 
	ST	A2,ECBCW,A8 
	ADK	A4,6	ADDRESS OF BUFFER DATA
	LDK	A1,0 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
	ABL	BRM	BASIS RECEIVE MODE 
	EJECT
* 
*   QUEUE RECEIVED MESSAGE
* 
COMP30	EQU	*
	LDK	A2,DWTBQ	GET PROPER QUEUE ANCHOR 
	ADR	A2,A6
	LC	A1,+6,A4	GET TC IDENT 
	ANK	A1,/FF 
	ST	A1,+4,A4	SAVE IT
	CF	A5,QR100	QUEUE RECEIVED BUFFER
	LD	A1,DWTBQ,A6 
	LDR*	A2,A1	FIRST IN QUEUE
	RF(NZ)	COMP35
	LDR	A1,A6
	CF	A15,SETIME	START BUF SUPERVISION TIMER
	DATA	COMP40,TIMBUF 
	ST	A4,DWTBTP,A6
COMP35	ABL	BRM
* 
*  TIME OUT ENTRY 
* 
COMP40	EQU	*
	LDR	A6,A1	GET DWT
	CM	DWTBTP,A6 
	LD	A1,DWTBQ,A6	GET ANCHOR
	RF(Z)	COMP50	NOTHING IS QUEUED 
	CM	DWTBQ,A6	CLEAR QUEUE ANCHOR 
COMP42	EQU	*
	LDKL	A2,DW0700+DWTWQ	GET DC-TASK QUEUE ANCHOR
COMP43	EQU	*
	LDR*	A3,A2 
	RF(Z)	COMP44	END OF QUEUE
	LDR	A2,A3
	RB	COMP43
COMP44	EQU	*
	STR	A1,A2	INSERT BUFFERS IN DC TSSK QUEUE
	CF	A15,CKMESS	COMPLETE DC-TASK READ
COMP50	EQU	*
	ABL	TDISP
	EJECT
* 
*   HERE TO TEST N(R) VALIDITY
* 
TSTNR	EQU	* 
	LD	A1,STATUS	GET STATUS
	ANK	A1,2	WRONG N(R)? 
	RF(NZ)	TSTNRX	YES
	RTN	A5 
********** INIT CMDR PARAMETERS *********** 
TSTNRX	EQU	*
	CM	STATUS	RESTORE STATUS 
	LD	A1,VSCNT
	SLL	A1,4 
	LD	A2,VRCNT
	ORR	A2,A1	PRESENT COUNTERS IN A2 
	LDK	A3,/10	FAIL CODE IN A3 
	CF	A5,PRCMDR	INIT FIELDS 
	ABL	BRM160 
	EJECT
* 
*  HERE TO INITIALIZE CMDR OUTPUT FIELDS
* 
PRCMDR	EQU	*
	LDK	A1,CMDR	LOAD 'CMDR'+F-BIT
	LDKL	A4,DLOBUF	GET BUFFER ADDRESS
	ADK	A4,1 
	SCR	A1,A4	STORE C-FIELD
	LC	A1,FIELD1+1	GET WRONG RECEIVED C-FIELD
	ADK	A4,1 
	SCR	A1,A4	STORE IT 
	ADK	A4,1 
	SCR	A2,A4	SAVE PRESENT COUNTERS
	ADK	A4,1 
	SCR	A3,A4	SAVE FAIL PARAMETERS 
	RTN	A5 
	EJECT
* 
* 
*	HDLC OUTPUT PROCESS 
* 
*	QUEUED AS MONITOR JOB FROM INPUT PROCESS
* 
*	TRANSMIT FRAME IF ANY ON QUEUE
*	PRIORITY 1: COMMANDS/RESPONSES (UA,CMDR,ROL)
*	PRIORITY 2: RR-FRAMES WHEN NOTHING PENDING
* 
* 
TRM	EQU	* 
	INH		SET INHIBIT 
	LDKL	A5,STBUT	LOAD STACKBASE 
	IM	TRMACT	OUTPUT IN PROGRESS 
	LDR	A7,A1	SAVE PARAMETER 
	CCK	A1,/FF00	REJ ? 
	RF(NE)	TRM050	NO 
	LDK	A1,REJ	LOAD 'REJ'+ F-BIT 
	RF	TRM110
TRM050	EQU	*
	CF	A5,CPTIM	CHECK POLL TIMER 
	LDR	A1,A7	RESTORE PARAMETER
	RF(Z)	TRM150	CHECK   APPLICATION QUEUE 
	SUK	A1,1 
	RF(Z)	TRM100	UA ON QUEUE 
	SUK	A1,1 
	RF(Z)	TRM120	ROL ON QUEUE
	SUK	A1,1 
	RF(Z)	TRM130	RR ON QUEUE 
	SUK	A1,1 
	RF(Z)	TRM140	CMDR ON QUEUE 
	SUK	A1,1 
	RF(Z)	TRM180	RNR ON QUEUE
	RF	TRM150	CHECK   APPLICATION QUEUE
	EJECT
* 
* 
*	UA SHOULD BE SENT 
* 
* 
TRM100	EQU	*
	LDK	A1,UA	LOAD 'UA'+F
TRM110	EQU	*
	CF	A5,TRSFR	SEND SHORT FRAME 
	RF	TRMEND
* 
* 
*	ROL SHOULD BE SENT
* 
* 
TRM120	EQU	*
	LDK	A1,ROL	LOAD 'ROL'+F
	RB	TRM110
* 
* 
*	RR SHOULD BE SENT 
* 
* 
TRM130	EQU	*
	LDK	A1,RR	LOAD 'RR'+F
TRM135	EQU	*
	LD	A2,VRCNT	GET NEXT EXPECTED SEND COUNTER 
	SLL	A2,5	ADJUST IT 
	ORR	A1,A2	INSERT IN RR 
	RB	TRM110
* 
* 
*	CMDR SHOULD BE SENT 
* 
* 
TRM140	EQU	*
	LDKL	A4,DLOBUF	GET BUFFER ADDRESS
	LDK	A3,5	FRAME LENGTH TO A3
	CF	A5,WRFRAM	SEND THE FRAME
	RF	TRMEND
* 
* 
*	CHECK   APPLICATION QUEUE AND SEND
*	I-FRAME OR RR-FRAME 
* 
* 
TRM150	EQU	*
	LD	A6,DCRBUF 
	RF(NZ)	TRM190	OK CHECK QUEUE 
* 
* 
*	RNR SHOULD BE SENT, BUFFER SHORTAGE 
* 
* 
TRM180	EQU	*
	LDK	A1,RNR	LOAD 'RNR'+F
	RB	TRM135
* 
*	CHECK APPLICATION QUEUE 
* 
TRM190	EQU	*
	LD	A6,DCWRQ	CHECK APPLICATION QUEUE
	RB(Z)	TRM130	NOTHING IN QUEUE
	EJECT
* 
* 
* 
*   HERE TO TRANSMIT AN IFRAME
* 
TRM300	EQU	*
	SUK	A6,DWTWQ	GET DWT ADDRESS 
	LDKL	A4,DLOBUF	GET OUTPUT BUFFER ADDRESS 
	CF	A5,PRCFI	PREPARE C-FIELD FORMAT 
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	LD	A3,ECBRL,A8	GET REQUESTED LENGTH
	ADK	A3,1	ADJUST LENGTH 
	ST	A6,WRDWT	SAVE WRITING DWT 
	LDR*	A1,A6	GET SUB-TERM ADDRESS
	ANK	A1,/FF 
* 
	IFF	MMUPAG=0 
	LDKL	A4,MMUBUF	GET MMU BUFFER ADDRESS
	LD	A7,SWMMU	GET MMU FLAG 
	RF(NZ)	TRM320	BUFFER IS IN MMU BUFFER
	IM	SWMMU	INDICATE USER BUFFER IS MOVED 
	ST	A4,ECBBA,A8	
	CF	A15,DC:MOT	MOVE DATA TO MMU BUFFER
TRM320	EQU	*
	XIF
* 
	LD	A7,ECBBA,A8	OUTPUT BUFFER ADDRESS 
	ADK	A7,1	USE FREE-WORD TO INSERT IT
	SCR	A1,A7
	SUK	A7,2	INIT OUTPUT ADDRESSING
	ST	A7,SWITCH 

Full view