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

⟦8f8535361⟧

    Length: 48898 (0xbf02)
    Notes: pts_type(SC)
    Names: »DRDC07.SC«

Derivation

└─⟦efe3a1cfc⟧ Bits:30009667 Philips computer tape "600113"
    └─⟦this⟧ »TOSSWORK/DRDC07.SC« 

PTS(SC)

	IDENT DRDC07 	REL 8.2 78-09-15  870103240912 

* 
********************************************* 
* 
*   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
	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 
* 
*	DWT DISPLACEMENTS 
* 
DWTTP	EQU	/10	TIMER POINTER ORDER PROCESS 
DWTWQ	EQU	/12	WRITE/GET BUFFER QUEUE
DWTBQ	EQU	/14	BUFFER QUEUE ANCHOR 
DWTBTP	EQU	/16	TIMER POINTER FOR BUFFER QUEUE 
	EJECT
* 
* 
*	PARAMETERS FOR CONDITIONAL ASSEMBLY 
* 
* 
X:A	EQU	130	RECEIVE BUFFER LENGTH 
RBUFL	EQU	X:A 
X:B	EQU	0 
TBUFL	EQU	X:B 
X:C	EQU	60	DCTASK FILE CODE 
DC07FC	EQU	X:C
X:D	EQU	1	IF 1 INTERRUPT LOGGING
LOGG	EQU	X:D
X:E	EQU	300	POLL TIMEOUT VALUE
TIMPOL	EQU	X:E
X:F	EQU	14	NUMBER OF RECEIVE BUFFERS
RBUFNR	EQU	X:F	VARIABLE BETWEEN 3 AND 14
X:G	EQU	0 
HFDUP	EQU	X:G	FULL(=1),HALF(=0)DUPLEX 
X:H	EQU	/02	INPUT DEVICE ADDRESS
CHLCIN	EQU	X:H
CHLCUT	EQU	CHLCIN+/10	OUTPUT DEVICE ADDRESS 
	EJECT
* 
* 
*	REQUEST HANDLING
* 
* 
* 
*	PARAMETERS
* 
*	A7=ORDER
* 
*	/02: READ 
*	/06: WRITE
*	/08: EXCHANGE 
*	/22: RELEASE READ BUFFER
*	/31: GET WRITE BUFFER 
*	/37: TRANSFER PARAMETERS
* 
	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
	IFF	TBUFL=0
DCGWQ	DATA	0	GET BUFFER REQUEST QUEUE 
	XIF
DCTPGP	DATA	0	TIMER POINTER GENERAL POLL
DC07DC	DATA	DCACTD	ADDRESS BLOCK DC TASK
DC07AD	DATA	DCACT	ADDRESS BLOCK 
	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
SWITCH	DATA	0	OUTPUT BUFFER FLAG
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,/08-/06 
	RF(Z)	DCEX	EXCHANGE
	SUK	A7,/22-/08 
	RF(Z)	DCRR	RELEASE READ BUFFER 
	SUK	A7,/37-/22 
	RF(Z)	DCTP	TRANSFER PARAMETERS 
	IFF	TBUFL=0
	ADK	A7,/37-/31 
	RF(Z)	DCGW	GET WRITE BUFFER
	XIF
	RF	DCA100
	EJECT
* 
* 
*	ACTIVATION FROM DCTASK
* 
* 
DCACTD	EQU	*
	SUK	A7,/02 
	RF(E)	DCRDDC	READ
	SUK	A7,/22-/02 
	RF(E)	DCRR	RELEASE READ BUFFER 
	SUK	A7,/37-/22 
	RF(E)	DCTP	TRANSFER PARAMETERS 
DCA100	EQU	*	REQUEST ERROR
	ABL	DISIOE	INVALID ORDER 
	EJECT
* 
* 
*	READ FROM DCTASK
* 
* 
*	REQUEST FROM DC-TASK
*	COMPLETE WHEN:
*	  STATUS CHANGE ON DC EQUIPMENT 
*	  SPONTANOUS MESSAGE RECEPTION
* 
DCRDDC	EQU	*
	CF	A15,CKMESS	CHECK IF MESSAGE RECEIVED
DCRTN	EQU	* 
	ABL	TDISP	GO TO DISPATCHER 
* 
* 
*	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
	EJECT
* 
*  HERE TO INTRODUCE DWT IN DC-TAB
*      IF NOT DC-TASK CONCERNED 
* 
	CWK	A6,DW0700	DC-TASK ?
	RF(E)	ENDIO	YES
	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
	SUR	A1,A1	RETURN CODE=0
ENDIO	EQU	* 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RB	DCRTN 
	EJECT
* 
* 
*	WRITE 
* 
* 
*	COMPLETE WHEN:
*	  SUCCESFUL TRANSMISSION
*	  TIME OUT
* 
* 
DCWR	EQU	*
	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 
	ADK	A1,7	ADJUST ADDRESS
	ST	A1,ECBBA,A8	STORE IN ECB
	LD	A4,-4,A1	GET LENGTH 
	SUK	A4,1	UPDATE LENGTH 
	ST	A4,ECBEL,A8	STORE IN ECB
	LDK	A1,0	SET RC = 0
	CF	A15,TENDIO	COMPLETE READ REQUEST
	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
* 
* 
*	GET WRITE BUFFER
* 
* 
	IFF	TBUFL=0
*	COMPLETE WHEN:
*	  BUFFER BEEN ALOCATED
*	  TIME OUT
* 
* 
DCGW	EQU	*
	CF	A15,GTBUF	GET TRANSMIT BUFFER 
	LDR	A4,A4
	RF(Z)	DCGW10	NO FREE BUFFER
	ST	A4,ECBBA,A8 
	LDKL	A1,TBUFL+TBUFL
	ST	A1,ECBEL,A8	STORE BUFFER LENGTH 
	LDK	A1,0 
	RB	ENDIO	COMPLETE REQUEST
DCGW10	EQU	*
	CF	A15,TIMERE	START TIMER
	CF	A15,INSGWQ	QUEUE REQUEST
	RB	DCRTN 
	XIF
	EJECT
* 
* 
*	RELEASE READ BUFFER 
* 
* 
DCRR	LD	A4,ECBBA,A8 
	SUK	A4,7 
	CF	A15,RRBUF 
	LDK	A1,0 
	CF	A15,TENDIO	COMPLETE RRBUF REQUEST 
	RB	DCRTN 
* 
* 
*	EXCHANGE
* 
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE PASSED TO TERMINAL
*	  TIME OUT
* 
DCEX	EQU	*
	RB	DCWR	SAME INITIALIZATION AS WRITE 
	EJECT
* 
* 
* 
*	TIMER HANDLING PART 
* 
* 
* 
*	READ TIMER=TIMERR 
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,ECBCW,A8	GET TIMEOUT VALUE 
	RF(Z)	TIME10	NO TIMING 
	ST	A2,TIMERR 
	CF	A15,SETIME
	DATA	TOUTRE
TIMERR	DATA	0 
	ST	A4,DWTTP,A6	STORE TIMER POINTER 
TIME10	EQU	*
	RF	GBUF10	RETURN 
* 
*	TIMEOUT READ TIMER
* 
TOUTRE	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6
* 
	IFF	TBUFL=0
	CF	A15,REMOVG	REMOVE FROM QUEUE
	XIF
	EJECT
TOUTR1	EQU	*
	LDK	A1,/40	INDICATE TIME OUT 
	LD	A2,DWTOR,A6	CHECK IF EXCHANGE ORDER 
	SUK	A2,8 
	RF(NZ)	TOUTR2	NOT EXCHANGE 
	ORK	A1,2	RETURN CODE /42 AT EXCHANGE TIME OUT
TOUTR2	RB	ENDIO	COMPLETE REQUEST
* 
*	WRITE TIMER=TIMWR 
* 
TIMEWR	LDR	A1,A6
	LD	A2,ECBCW,A8	GET TIMEOUT VALUE 
	RB(Z)	TIME10	NO TIMING 
	ST	A2,TIMWR
	CF	A15,SETIME
	DATA	TOUTWR
TIMWR	DATA	0
	ST	A4,DWTTP,A6 
	RB	TIME10
	EJECT
* 
*	TIMEOUT WRITE TIMER 
* 
TOUTWR	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6
	LD	A1,DWTOR,A6	GET ORDER 
	SUK	A1,6 
	RF(Z)	TOUT10	WRITE 
	SUK	A1,2 
	RB(NZ)	TOUTR1	ORDER IS NOT EXCHANGE
TOUT10	LD	A2,DWTECB,A6
	LD	A4,ECBBA,A2	FETCH BUFFER
	IFF	TBUFL=0
	CF	A15,RTBUF	RELEASE TRANSMITBUFFER
	CF	A15,CKGBQ	CHECK GET BUFFER QUEUE
	XIF
	CF	A15,REMOVW	REMOVE FROM WRITE QUEUE
	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	ADKL	A15,4	ADJUST STACK POINTER
	ABR*	A15	RETURN TO CALLER
* 
* 
*	GET TRANSMIT BUFFER 
* 
	IFF	TBUFL=0
*	CALLING SEQUENCE: CF A15,GTBUF
*	A4=0 IF NO BUFFER IS FREE 
*	ELSE A4 CONTAINS BUFFER ADDRESS 
*	A2 AND A3 ARE DESTROYED 
* 
* 
GTBUF	LDKL	A2,DCTBUF	TRANSMIT BUFFERS 
	RB	GBUF
	EJECT
* 
* 
*	CHECK GET BUFFER QUEUE
* 
* 
CKGBQ	EQU	* 
	LDR	A7,A6	SAVE A6
	LD	A6,DCGWQ	GET QUEUE ANCHOR 
	RF(Z)	CKG110	NO ONE ON QUEUE 
	SUK	A6,DWTWQ 
	LD	A2,DWTST,A6 
	RF(N)	CKG100	NO REQUEST
	LD	A2,DWTOR,A6 
	SUK	A2,/31 
	RF(NZ)	CKG100	NO GET BUFFER REQUEST
	CF	A15,GTBUF	GET TRANSMIT BUFFER 
	LDR	A4,A4
	RF(Z)	CKG110	NO BUFFER FREE
	LD	A3,DWTECB,A6
	ST	A4,ECBBA,A3	STORE BUFFER ADDRESS
	LDKL	A1,TBUFL+TBUFL
	ST	A1,ECBEL,A3	STORE BUFFER LENGTH 
	LDK	A1,0 
	CF	A15,TENDIO	COMPLETE REQUEST 
CKG100	EQU	*
	CF	A15,REMOVG	REMOVE FROM QUEUE
CKG110	LDR	A6,A7	RESTORE A6 
	RB	GBUF10	RETURN 
	XIF
	EJECT
* 
* 
*	RELEASE RECEIVE BUFFER
* 
*	A4 CONTAINS BUFFER ADDRESS
*	CALLING SEQUENCE: CF A15,RRBUF
*	A2 AND A3 ARE DESTROYED 
* 
* 
RRBUF	LDKL	A2,DCRBUF	RECEIVE BUFFERS
RBUF	INH
RBUF10	EQU	*
	LDR*	A3,A2 
	RF(Z)	RBUF20 
	LDR	A2,A3
	RB	RBUF10
RBUF20	EQU	*
	STR	A4,A2
	CMR	A4 
	RB	GBUF10	RETURN TO CALLER 
* 
* 
*	RELEASE TRANSMIT BUFFER 
* 
	IFF	TBUFL=0
*	A4 CONTAINS BUFFER ADDRESS
*	CALLING SEQUENCE: CF A15,RTBUF
*	A2 AND A3 ARE DESTROYED 
* 
* 
RTBUF	LDKL	A2,DCTBUF	TRANSMIT BUFFERS 
	RB	RBUF
	XIF
	EJECT
* 
* 
*	INSERT DWT IN WRITE REQUEST QUEUE 
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSWQ	LDKL	A2,DCWRQ	GET QUEUE ANCHOR
INSWQ1	LDK	A4,DWTWQ 
INSWQ2	LDR*	A3,A2 
	RF(Z)	INSWQ3	END OF QUEUE FOUND
	LDR	A2,A3
	RB	INSWQ2
INSWQ3	ADR	A4,A6
	STR	A4,A2	INSERT IN QUEUE
	CMR	A4	INDICATE END OF QUEUE 
	RB	GBUF10	RETURN 
* 
* 
*	REMOVE DWT FROM WRITE REQUEST QUEUE 
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVW	LDKL	A2,DCWRQ	GET QUEUE ANCHOR 
REM05	LDK	A4,DWTWQ	GET DWT-LINK TO BE REMOVED 
REM06	ADR	A4,A6 
REM10	LDR*	A3,A2
	RB(Z)	GBUF10	NOT ON QUEUE: RETURN
	CWR	A3,A4
	RF(E)	REM15
	LDR	A2,A3	GET NEXT 
	RB	REM10 
REM15	LDR*	A3,A4	REMOVE 
	STR	A3,A2
	RB	GBUF10	RETURN 
	EJECT
* 
* 
* 
*	INSERT DWT IN GET WRITE BUFFER QUEUE
* 
	IFF	TBUFL=0
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
INSGWQ	LDKL	A2,DCGWQ	GET QUEUE ANCHOR 
	RB	INSWQ1
* 
* 
*	REMOVE DWT FROM GET WRITE BUFFER QUEUE
* 
*	A2,A3,A4 DESTROYED
*	A6=DWT
* 
REMOVG	LDKL	A2,DCGWQ	GET QUEUE ANCHOR 
	RB	REM05 
	XIF
	EJECT
* 
* 
*	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
	ADK	A3,7	MOVE POINTER TO TEXT
	ST	A3,ECBBA,A8	SAVE THIS ADDR IN ECB 
	LD	A4,-5,A3
	SUK	A4,1	UPDATE LENGTH 
	ST	A4,ECBEL,A8	STORE NUMBERS OF CHARACTERS 
	LD	A4,-3,A3
	ST	A4,ECBCW,A8	STORE LINE DEVICE ADDRESS 
	LDK	A1,0	PARAMETER=OK
CKM100	CF	A15,TENDIO	COMPLETE READ GENERAL REQUEST
CKM110	ADKL	A15,4	ADJUST STACK POINTER
	ABR*	A15	RETURN
CKM200	LD	A1,DCSTCU	NO MESSAGE RECEIVED,CHECK STATUS
	OR	A1,DCONOF	TAKE CARE OF POLL TIME OUT
	CW	A1,DCSTOL 
	ST	A1,DCSTOL 
	RB(E)	CKM110	NO CHANGE OF STATUS 
	ORKL	A1,/2000	INDICATE STATUS CHANGE 
	RB	CKM100
	EJECT
* 
* 
*	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' 
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
	RB	BRM 
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'
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
	RB	BRM 
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 ? 
	LDK	A1,3	LOAD 'RR' 
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
	RB	BRM 
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,0	INDICATE POLL-BIT RECEIVED
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
	RB	BRM 
	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' 
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
	RB	BRM 
	EJECT
* 
* 
*	I-FRAME RECEIVED
* 
* 
BRM170	CF	A5,UPDCON	UPDATE COUNTERS AND CHECK OUTPUT QUEUE
	LD	A1,STATUS	CHECK UNEXPECTED N(S) 
	ANK	A1,1	N(S) OK?
	RF(NZ)	BRM185	NO 
	CF	A5,TSTNR	CHECK UNEXPECTED N(R)
	CF	A15,GRBUF	ALLOCATE DATA LINK BUFFER 
	LC	A1,FIELD1+1 
	ANK	A1,/10	CHECK POLL BIT
	RF(Z)	BRM180	P-BIT OFF 
	LDK	A1,0	INDICATE POLL-BIT RECEIVED
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
BRM180	EQU	*
* 
*  HERE TO PROCESS AVAILABLE FRAME
*    A4=BUFFER
* 
	LC	A2,+6,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
	CF	A15,QMTRM	QUEUE FOR TRANSMISSION
	ABL	BRM
	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 
	LDR	A1,A4
	ADK	A1,7	BUFFER DATA 
	ST	A1,ECBBA,A8	SAVE IT 
	LDK	A1,0	SET RC=0
	CF	A15,TENDIO	COMPLETE READ REQUEST
	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 
	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 
	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 
	ABL	TDISP	END OF JOB 
* 
* 
*	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
	ABL	TDISP
* 
* 
*	CHECK   APPLICATION QUEUE AND SEND
*	I-FRAME OR RR-FRAME 
* 
* 
TRM150	EQU	*
	LD	A6,DCWRQ	CHECK APPLICATION QUEUE
	RF(NZ)	TRM300	SOMEONE ON QUEUE 
TRM170	EQU	*
	LD	A1,DCRBUF	BUFFER SHORTAGE ? 
	RB(NZ)	TRM130	NO 
* 
* 
*	RNR SHOULD BE SENT, BUFFER SHORTAGE 
* 
* 
	LDK	A1,RNR	LOAD 'RNR'+F
	RB	TRM135
	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 
	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