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

⟦bfc632302⟧

    Length: 36434 (0x8e52)
    Notes: pts_type(SC)
    Names: »DRDC13.SC«

Derivation

└─⟦173d42e04⟧ Bits:30009663 Philips computer tape "600105"
    └─⟦this⟧ »TOSSWORK/DRDC13.SC« 

PTS(SC)

	IDENT DRDC13 	REL 10.0 80-03-14 870105041000 

			REL 10.1 79-12-07
			=1, OLLES POWER UP 
			REL 10.1 79-10-26
* 
********************************************* 
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
* 
*   DRDC13  :  VIP7700  FOR  BPPOAA 
* 
*      PROC : SYNCHRONOUS,HALF-DUPLEX,8-BIT ASCII 
**           SIMULATION OF SINGLE ADDRESS TRIBUTARY STATION 
*           TT ADDRESS  ALWAYS 60 HERE (NOT SIGNIFI.) 
*            SERVICE  FRAME  USED : ACK NAK,BSY 
* 
* 
* 
********************************************* 
* 
* 
	EJECT
* 
* 
*	ENTRY POINTS
* 
* 
	ENTRY	DC13AD	ADDRESS BLOCK TERMINAL REQUESTS 
	ENTRY	IH1301	INPUT INTERRUPT 
	ENTRY	IH1302	OUTPUT INTERRUPT
	ENTRY	DC13ON	POWER ON ROUTINE
	ENTRY	DW1300	DWT FOR DCTASK
* 
* 
*	EXTERNAL REFERENCES 
* 
* 
	EXTRN	TDISP	DISPATCHER ENTRY 
	EXTRN	SAVE8	SAVE A1-A8 ON A15 STACK
	EXTRN	TENDIO	COMPLETE I/O EVENT
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	SETIME	SET TIMER 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTOR	DWT ORDER
	EXTRN	DWTECB	DWT ECB 
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUEST LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE READ LENGTH
	EXTRN	ECBCW	ECB CONTROL WORD 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	DC:MIN	MOVE DATA TO USER BUFFER
	EXTRN	DC:MOT	MOVE DATA FROM USER BUFFER
	EXTRN	DISEND	COMPLETE REQUEST AND DISPATCH 
	EXTRN	SETTIM	START TIMER 
	EXTRN	PFPOST	WAIT FOR POWER UP IF SET
	EJECT
* 
* 
* 
* 
*   STANDARD INTERFACE PART FOR DATA COMMUNICATION
* 
* 
* 
* 
*	DWT CONTENTS
* 
*	DWTCHP	TERMINAL ADDRESS AS GIVEN AT PARAMETER TRANSFER (BIT #08-#15)
*	DWTST	BIT #00:     NO REQUEST 
*	DWTTP	TIMERPOINTER, ORDER PROCESS 
*	DWTWQ	WRITE/GET BUFFER QUEUE
* 
	EJECT
********************
* 
*  PARAMETERS FOR CONDITIONAL ASSEMBLY
* 
********************
* 
	 
X:A	EQU	270 
RBUFL	EQU	270	RECEIVE BUFFER LENGTH 
X:B	EQU	/60 
DCFC	EQU	/60	DC TASK FILE CODE
X:C	EQU	1 
LOGG	EQU	1	INTERRUPT LOGGING
X:D	EQU	2 
RBUFNR	EQU	3	NUMBER OF RECEIVE BUFFERS(2-4) 
X:E	EQU	45
TIMPOL	EQU	045	POLL TIMEOUT VALUE 
X:F	EQU	0 
P6805	EQU	00	 
X:G	EQU	/02 
	IFT	P6805=0
CHLCIN	EQU	34 
	XIF
	IFT	P6805=1
CHLCIN	EQU	/0A	DEVICE ADDRESS OF RECEIVER 
	XIF
X:H	EQU	500 
TBUFL	EQU	300	MMU BUFFER LENGTH 
* 
	IFT	P6805=0
CHLCUT	EQU	CHLCIN+/10	DEVICE ADDRESS OF TRANSMITTER 
	XIF
	IFT	P6805=1
CHLCUT	EQU	CHLCIN+/01	DEVICE ADDRESS OF TRANSMITTER 
	XIF
	EJECT
********************
* 
*  CONDITIONAL ASSEMBLY 
* 
********************
MMUPAG	EQU	0	0=NO TOSS MMU-PAGING 
* 
* 
CPU852	EQU	1	0=EXTENDED INSTRUCTION SET 
* 
* 
DEVIND	EQU	-2	DEVICE INDEX DATA COMMUNICATION 
* 
* 
BUFLEN	EQU	TBUFL+TBUFL	MMU BUFFER SIZE
	EJECT
********************************************
* 
*  USE OF STATUS WORD BIT PATTERN 
*  WITHIN DRDC13
* 
********************************************
SWBT00	EQU	/8000	REQUEST ERROR
SWBT02	EQU	/2000	STATUS CHANGE DC-TASK
SWBT09	EQU	/0040	TIMEOUT ERROR DC-TASK
SWBT10	EQU	/0020	CARRIER OFF
SWBT15	EQU	/0001	MODEM NOT READY
SWBT0:12	EQU	/8008	REQUEST ERROR & ILLEGAL LENGTH 
SWBT2:09	EQU	/2040	TIMEOUT ON READ OR WRITE REQUEST 
	EJECT
********************************************
* 
*  DWTREQ IS AN INTERNAL VARIABLE USED
*  AS A REQUEST VECTOR AND MAY HAVE 
*  THE FOLLOWING VALUES.
* 
********************************************
*  DWTREQ = /8100 MEANS AN EXPECTED ACK ON A PREVIOUS MESSAGE 
*  DWTREQ = /0100   "   AN OUTSTANDING WRITE
*  DWTREQ = /0003   "   A BSY TO BE SENT
*  DWTREQ = /0002   "   A NAK TO BE SENT
*  DWTREQ = /0001   "   AN ACK TO BE SENT 
********************************************
	EJECT
********************
* 
*  DWT DISPLACEMENTS
* 
********************
DWTDRD	EQU	/10
* 
* 
	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
DWTSQ	EQU	START+/04	STATUS QUEUE
DWTRQ	EQU	START+/06	RECEIVE QUEUE 
DWTTIM	EQU	START+/08	REQUEST TIMER VALUE
DWTREQ	EQU	START+/0A	REQUEST VECTOR 
DWTTRY	EQU	START+/0C	RETRY-COUNTER
* 
* 
*	REQUEST HANDLING
* 
* 
* 
*	PARAMETERS
* 
*	A7=ORDER
* 
*	/02: READ 
*	/06: WRITE
*	/37: TRANSFER PARAMETERS
*	/39: SET REQUEST TIMEOUT VALUE
* 
	EJECT
******   CHARACTERS EQUATES 
*        SPECIAL PROC. VIP700 
* 
SOH      EQU      /01 
SYN      EQU      /16 
STX      EQU      /02 
ETX      EQU      /03 
EOT      EQU      /04 
SP       EQU      /20 
KC       EQU      /43 
KNUL     EQU      /00 
ACK      EQU      /06 
NAK      EQU      /15 
* 
* 
******   PROC. AREAS AND CONSTANTS
* 
* 
TERID	RES	1	TERMINAL ID 
HEADER   DATA     0           CODE-F1  FOR HEADER 
DCONOF   DATA     0           LINE STATUS 1=OK,0=OFF,2=RESTART
DCSTOL	DATA	0	OLD DC EQUIPMENT STATUS 
DCSTCU	DATA	0	CURRENT STATUS
DCTPGP	DATA	0	TIMER POINTER GENERAL POLL
CURDWT	RES	1	CURRENT DWT
SVRDL	RES	1	SAVE READ LENGTH AREA 
WPOLL	DATA	0	OH !!      MY    POLL  !!
         RES      20          USER STACK
STB      RES      1 
	EJECT
* 
* 
*	ACTIVATION FROM TERMINAL TASKS
* 
DCACT	EQU	* 
	LDK	A1,0	PRESET RETURN CODE
	SUK	A7,/02 
	RF(Z)	DCRD	READ SPECIFIC 
	SUK	A7,/06-/02 
	RF(Z)	DCWR 
	SUK	A7,/37-/06 
	RF(Z)	DCTP	TRANSFER PARAMETERS 
	SUK	A7,/39-/37 
	ABL(Z)	REQTIM	SET REQUEST TIMER
	RF	DCA100
* 
**********
* 
*  ACTIVATION FROM DCTASK 
* 
**********
* 
DCACTD	EQU	*
	SUR	A1,A1	PRESET RETURN CODE 
	SUK	A7,/02 
	RF(E)	DCRDDC	READ
	SUK	A7,/37-/02 
	RF(E)	DCTP	TRANSFER PARAMETERS 
DCA100	ABL	DISIOE	INVALID ORDER 
	EJECT
**********
* 
*  DC TASK ADDRESS BLOCK
* 
**********
* 
	DATA	0	INDICATES NO MMU BUFFER 
	DATA	DEVIND	DEVICE INDEX 
DC13DC	DATA	DCACTD	ACTIVATION ADDRESS 
	DATA	ABORT	ABORT ROUTINE ADDRESS 
	DATA	DCRBUF	RECEIVE BUFFER ANCHOR
	DATA	6	HEADER LENGTH	=2
* 
* 
**********
* 
*  DRIVER ADDRESS BLOCK 
* 
**********
* 
	DATA	BUFLEN	MMU BUFFER SIZE
	DATA	DEVIND	DEVICE INDEX 
DC13AD	DATA	DCACT	ACTIVATION ADDRESS
	DATA	ABORT	ABORT ROUTINE 
	DATA	DCRBUF	RECEIVE BUFFER ANCHOR
	DATA	6	HEADER LENGTH	=2
	EJECT
**********
* 
*  READ FROM DC TASK
*  REQUEST FROM DC TASK 
*  COMPLETE WHEN: 
*  -STATUS CHANGE ON DC EQUIPMENT 
*  -SPONTANEOUS MESSAGE RECEPTION 
* 
**********
* 
DCRDDC	EQU	*
	CF	A15,CKMESS	CHECK IF MESSAGE RECEIVED
	EJECT
* 
* 
DCRTN	EQU	* 
	ABL	TDISP	GO TO DISPATCHER 
* 
* 
*	TRANSFER PARAMETERS 
* 
* 
*	        FROM TERMINALS: TRANSFER TERMINAL ADDRESSES 
* 
* 
DCTP	LD	A2,ECBCW,A8	GET PARAMETER 
	STR	A2,A6	SAVE IN FIRST WORD OF DWT
	CWK	A6,DW1300	DCTASK DWT ? 
	RF(E)	DCTP40	YES!SHOULD'NT BE IN DC:TAB
	LD	A1,DC:IN	 GET DC:TAB INPUT POINTER
	CWK	A1,DC:END	TABLE ALREADY FULL ??
	ABL(E)	DISIOE	YES!! REQUEST ERROR
	EJECT
DCTP10	EQU	*
	LD	A4,DCTAB	GET DC:TAB ADDRESS 
	AD*	A4,DCTAB	LAST TABLE ENTRY
DCTP20	SUK	A4,2	ADDRESS TO NEXT ENTRY 
	CW	A4,DCTAB	ALL ENTRIES CHECKED ?? 
	RF(E)	DCTP30	YES!! DWT NOT IN TABLE
	CWR*	A6,A4	IN TABLE ?
	RF(E)	DCTP40	YES !!
	RB	DCTP20	CHECK NEXT ENTRY 
DCTP30	EQU	*
	STR	A6,A1	INSERT DWT IN DC:TAB 
	LDK	A1,2 
	ADS	A1,DC:IN	UPDATE DC:TAB IN POINTER
	ADS	A1,DC:TAB	INCREMENT DC:TAB LENGTH
DCTP40	EQU	*
	LDK	A1,0 
ENDIO	EQU	* 
	CF	A15,TENDIO	COMPLETE REQUEST 
	RB	DCRTN 
	EJECT
* 
* 
*	WRITE 
* 
* 
*	COMPLETE WHEN:
*	  SUCCESFUL TRANSMISSION
*	  TIME OUT
* 
* 
DCWR	EQU	*
	IFT	MMUPAG=1 
	LD	A1,ECBRL,A8	REQUESTED LENGTH
	CWK	A1,BUFLEN	ILLEGAL LENGTH 
	RF(G)	IL:LEN	YES!! 
	XIF
	CF	A15,TIMEWR	SET TIMER
	LDKL	A2,/0100
	ORS	A2,DWTREQ,A6	INDICATE WRITE REQUEST OUTSTANDING
	CM	DWTTRY,A6	CLEAR RETRY-COUNTER 
	RB	DCRTN 
* 
* 
* 
*	READ
* 
* 
*	COMPLETE WHEN:
*	  MESSAGE RECEIVED
*	  TIME OUT
* 
* 
DCRD	EQU	*
	LD	A8,DWTECB,A6	GET ECB
	LD	A4,DWTRQ,A6	AND RECEIVE MESSAGE QUEUE 
	RF(Z)	DCRD20	NOTHING IN QUEUE
	LDR*	A2,A4	TAKE THE FIRST IN QUEUE 
	ST	A2,DWTRQ,A6 
	LDK	A1,0	RESET RETURN CODE 
	ADK	A4,6 
	LD	A3,-4,A4	EFFECTIVE LENGTH 
	ST	A3,ECBEL,A8 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
	RB	DCRTN 
DCRD10	EQU	*
	LDK	A1,0 
	CF	A15,TENDIO
	RB	DCRTN 
DCRD20	CF	A15,TIMERE	START TIMER
	RB	DCRTN 
	EJECT
********************
* 
*  SET REQUEST TIMEOUT VALUE
* 
********************
* 
REQTIM	EQU	*
	LD	A2,ECBCW,A8	TIMEOUT VALUE 
	ST	A2,DWTTIM,A6	SAVE IT IN DWT 
	RB	DCRD10	TENDIO AND DISPATCH
* 
* 
	IFT	MMUPAG=1 
IL:LEN	LDKL	A1,/8008	REQUEST ERROR + ILLEGAL LENGTH 
	ABL	DISEND	COMPLETE REQUEST
	XIF
* 
* 
	EJECT
********************
* 
*  TIMER HANDLING PART
* 
********************
* 
*  READ TIMER = TIMERR
* 
********************
* 
* 
TIMERE	EQU	*
	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET REQUEST TIME 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 TO CALLER 
* 
********************
* 
*  TIMEOUT READ TIMER 
* 
********************
* 
TOUTRE	EQU	*
	LDR	A6,A1	FETCH DWT
	CM	DWTTP,A6	CLEAR TIMER POINTER
TOUTR1	EQU	*
	LDK	A1,/40	INDICATE TIMEOUT ERROR
	CM	DWTREQ,A6	CLEAR REQUEST VECTOR
TOUTR2	RB	ENDIO	COMPLETE REQUEST
* 
********************
* 
*  WRITE TIMER = TIMWR
* 
********************
* 
TIMEWR	LDR	A1,A6
	LD	A2,DWTTIM,A6	GET REQUEST 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	GET DWT
	CM	DWTTP,A6
	RB	TOUTR1
	EJECT
* 
* 
*	STOP REQUEST TIMING 
* 
*	REMAINING TIME IS RETURNED IN A2
* 
* 
CTIME	EQU	* 
	INH
	LD	A2,DWTTP,A6	GET TIMER POINTER 
	RF(Z)	CTIM10	NOT RUNNING 
	LDR*	A2,A2	GET REMAINING TIME
	NGR	A2,A2
	CM*	DWTTP,A6 
	CM	DWTTP,A6
CTIM10	EQU	*
	ENB
	RTN	A5 
	EJECT
********************
* 
*  GET RECEIVE BUFFER 
* 
*  CALLING SEQUENCE: CF A15,GRBUF 
* 
*  A4 = 0 IF NO AVAILABLE BUFFER
*  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 FREE BUFFER
	LDR*	A3,A4	REMOVE BUFFER FROM FREE CHAIN 
	STR	A3,A2
GBUF10	ADKL	A15,4	ADJUST STACK POINTER
	ABR*	A15	RETURN TO CALLER
	EJECT
********************
* 
*  QUEUE ALLOCATED RECEIVE BUFFER 
* 
*  A4 = BUFFER ADDRESS
*  A2,A3 ARE DESTROYED
* 
********************
* 
QRBUF	EQU	* 
	LDR	A2,A6	QUEUE ON TERMINAL DWT
	ADK	A2,DWTRQ	BEGINNING OF RECEIVE QUEUE
QR100	EQU	* 
	LDR*	A3,A2 
	RF(Z)	QR200	END OF QUEUE FOUND 
	LDR	A2,A3
	RB	QR100 
QR200	STR	A4,A2	INSERT INTO QUEUE 
	CMR	A4	INDICATE OF QUEUE 
	RTN	A5 
	EJECT
********************
* 
*  CHECK IF UNEXPECTED MESSAGE OR STATUS REQUEST CHANGE 
* 
*  REGISTERS A1 - A4,A6,A8 ARE DESTROYED
* 
********************
* 
CKMESS	LDKL	A6,DW1300 
	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 ADDRESS TO A8
	LD	A3,DWTRQ,A6	A3 = ADDRESS TO READ QUEUE
	RF(Z)	CKM200	NO READ IN QUEUE
	LDR*	A2,A3	A2 = ADDRESS TO NEXT READ BUFFER
	ST	A2,DWTRQ,A6	STORE THIS ADDRESS ON QUEUE 
	ADK	A3,6	MOVE POINTER TO TEXT
	ST	A3,ECBBA,A8	SAVE THIS ADDRESS IN ECB
	LD	A4,-4,A3
	ST	A4,ECBEL,A8	STORE NUMBER OF CHARACTERS
	LD	A4,-2,A3
	ST	A4,ECBCW,A8	STORE LINE DEVICE ADDRESS 
	LDR	A4,A3
	LDK	A1,0	RESET RETURN CODE 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
CKM110	RB	GBUF10	RETURN 
* 
CKM200	LD	A1,DCSTCU	NO MESSAGE RECEIVED,CHECK STATUS
	OR	A1,DCONOF	TAKE CARE OF POLL TIMEOUT 
	CW	A1,DCSTOL 
	ST	A1,DCSTOL 
	RB(E)	CKM110	NO CHANGE OF STATUS 
	ORKL	A1,/2000	INDICATE STATUS CHANGE 
	CF	A15,TENDIO	COMPLETE READ REQUEST
	RB	CKM110
	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
AB:RTN	EQU	*
	IFT	CPU852=1 
	RB	GBUF10	RETURN IN INHIBIT MODE 
	XIF
	IFF	CPU852=1 
	RTN	A15
	XIF
	EJECT
* 
* 
*	STORE REGISTER A3-A8
*	CALLING SEQUENSE: CF A15,STREG
* 
*	RESTORE 
*	CALLING SEQUENCE: CF A15,LDREG
* 
* 
STREG	ST	A3,LCA3
	ST	A4,LCA4 
	ST	A5,LCA5 
	ST	A6,LCA6 
	ST	A7,LCA7 
	ST	A8,LCA8 
	RF	RTNA15	RETURN 
	EJECT
LDREG	LDKL	A3,0 
LCA3	EQU	*-2
	LDKL	A4,0
LCA4	EQU	*-2
	LDKL	A5,0
LCA5	EQU	*-2
	LDKL	A6,0
LCA6	EQU	*-2
	LDKL	A7,0
LCA7	EQU	*-2
	LDKL	A8,0
LCA8	EQU	*-2
RTNA15	EQU	*
	ADKL	A15,4 
	ABR*	A15 
	EJECT
* 
* 
*	RECEIVE A FRAME AND DECODE IT 
* 
* 
BRM	LDKL	A5,STB	LOAD STACK BASE FOR A5
	LD	A2,PFPOST 
	RF(NZ)	BRM100	WAIT FOR POWER UP
	LDKL	A2,/100+SYN	SPECIFY SYN PATTERN 
	CIO	A2,1,CHLCIN	START RECEIVER 
BRM100	CF	A5,READ	READ CHARACTER
	SUK	A2,SOH 
	RF(E)	BRM200	SOH 
	SUK	A2,/FF-SOH 
	RB(NE)	BRM100	NOT /FF
	CF	A5,READ	READ CHARACTER
	CWK	A2,/FF 
	RB(NE)	BRM100	NOT ANOTHER /FF
	ABL	BRM920	HALT INPUT AND RESYNCHRONIZE
* 
*	SOH RECEIVED
* 
BRM200	LDK	A7,0	CLEAR BCC 
	CF	A5,READP	READ RID=TC
	ABL(NZ)	BRM100	PARITY ERROR
	CWK	A2,EOT	-EOT-?
************* 
* 
*  OLD CODE FOR THIS INSTRUCTION
*  ABL(Z) BRM900    YES 
* 
************* 
	ABL(Z)	BRM920	YES
	ST	A2,TERID	STORE CURRENT ID 
	ANK	A2,/1F 
	CF	A5,FINTER	FIND DWT
	LDR	A3,A3	OK?
	RB(Z)	BRM100	NO
BRM210	EQU	*
	ST	A3,CURDWT	STORE CURRENT DWT 
	LD	A3,TERID
	LDK	A2,/1F 
	ANS	A2,TERID	SCRATCH POLL/SELECT  BITS 
	ANK	A3,/20 
	RF(Z)	SELTRM	SELECT ADDRESS
	ABL	SCANQ1	POLL ADDRESS
* 
**
****	SELTRM : SCAN SELECTING FRAME
*		HOLD TEXT, ACK ,  NAK
* 
* 
SELTRM	EQU	*
	CF	A5,VERHAD	VERIFY SELECT FRAME 
	ANK	A7,/7F	BCC OK ?
	ABL(NZ)	BRM100	NO
SELT00	CF	A5,READP
	CWK	A2,SYN 
	RB(E)	SELT00 
	CWK	A2,SOH 
	ABL(NE)	BRM100 
	LDK	A7,0	RESET BCC COUNTER 
	LD	A6,CURDWT	GET WORKING DWT 
	CF	A5,READP	IGNORE ADRT
	ABL(NZ)	BRM100 
************* 
* 
*  THIS IS TO TEST IF A FRAME IS CONSTITUTED
*  OF A SELECT MESSAGE ONLY 
* 
************* 
	CWK	A2,EOT	
	ABL(E)	BRM920	IF YES RESYNCHRONISE 
	CF	A5,READP	CHECK CODE FRAME 
	CWK	A2,KNUL
	RF(E)	SELTXT	TEXT
	CWK	A2,ACK 
	RF(E)	SELACK	ACK 
	CWK	A2,NAK 
	ABL(E)	SELNAK	NAK
	ABL	BRM100 
SELTXT	EQU	*

	CF	A5,READP	FC1
	ABL(NZ)	BRM100 
	CF	A5,READP	FC2
	ABL(NZ)	BRM100 
	CF	A5,READP
	CWK	A2,STX	STX 
	ABL(NE)	BRM100 
**********
* 
*  CHECK IF BUFFER AVAILABLE
* 
**********
* 
	LD	A4,DCRBUF	GET BUFFER CHAIN POINTER
	RF(Z)	SELT03	SEND BUSY AND RESYNCHRONISE 
	ADK	A4,6	ADJUST BUFFER POINTER 
	RF	SELT20	OTHERWISE READ MESSAGE 
SELT03	EQU	*
	LD	A6,CURDWT 
	LDK	A2,3	BUSY  TO  SEND
	ST	A2,DWTREQ,A6
	ABL	BRM100 
SELT20	EQU	*
	LDK	A3,1 
	LD	A2,TERID	 GET TERMINAL ID 
	LDR	A1,A4
	SCR	A2,A1	STORE IT AS FIRST CHARACTER
SELT04	EQU	*
	CF	A5,READP	GET CHARACTER
	RF(NZ)	SELT06
	CWK	A2,ETX	END OF TEXT ? 
	RF(E)	SELT10	YES 
SELT05	EQU	*
	CWK	A2,/5A 
	RB(G)	SELT04	GREATER THAN 5A:IGNORE
	CWK	A2,/20 
	RB(L)	SELT04	LESS THAN 20:IGNORE 
	CWK	A3,/10E
	RF(G)	SELT06	FUFFER OVERFLOW 
	LDR	A1,A4
	ADR	A1,A3	COMPUTE BUFFER ADDRESS 
	SCR	A2,A1	STORE CHARACTER
	ADK	A3,1	ADEJUSTE POINETEURE 
	RB	SELT04
**		SUCH A PROGRESS !!! 
SELT10	EQU	*
	CF	A5,READP	READ BCC 
	RF(NZ)	SELT06
	ANK	A7,/7F 
	RF(NZ)	SELT06
	ST	A3,SVRDL	SAVE READ LENGTH 
	CF	A15,GRBUF	GET A BUFFER
	ADK	A4,6	ADJUST BUFFER PONTER
	LD	A2,DWTST,A6	GET STATUS
	RF(N)	SELT40	GO IF WRONG ORDER 
	LDK	A2,/2
	CW	A2,DWTOR,A6	READ ORDER ?
	RF(NE)	SELT40	NO READ ORDER
	LD	A8,DWTECB,A6	GET ECB ADDRESS
	LD	A3,SVRDL	GET READ LENGTH
	ST	A3,ECBEL,A8	STORE EFFECTIVE LENGTH
	LDK	A3,1	ACK TO BE SENT
	ST	A3,DWTREQ,A6	RESTORE REQUEST VECTOR 
	CF	A5,CTIME	STOP TIMER 
	LDK	A1,0	RESET RETURN CODE 
	CF	A15,DC:MIN	MOVE DATA TO USER BUFFER 
	ABL	BRM100 
SELT06	EQU	*
	LDK	A3,2	NAK  TO  BE  SENT 
	ST	A3,DWTREQ,A6	STORE IT 
	ABL	BRM100 
	EJECT
SELACK	EQU	*
	CF	A5,READP	FC1 OR STX 
	ABL(NZ)	BRM100 
	CWK	A2,STX	STX ? 
	ABL(NE)	BRM100 
	CF	A5,READP	GET ETX
	CWK	A2,ETX	ETX ? 
	ABL(NE)	SELAC1	NO
	CF	A5,READP	GET BCC
	ANK	A7,/7F	BCC OK ?
	ABL(NZ)	BRM100	NO
	LD	A2,DWTREQ,A6	GET REQUEST VECTOR 
	ABL(NN)	BRM100	NO EXPECTED ACK 
	CM	DWTREQ,A6 
	CM	DWTTRY,A6 
	LD	A2,DWTOR,A6	GET ORDER 
	CWK	A2,/06	WRITE ? 
	ABL(NE)	BRM100	NO
	LDK	A1,0	R.C. OK 
	CF	A15,TENDIO	COMPLETE REQUEST 
	ABL	BRM100 
SELAC1	EQU	*
	CM	DWTREQ,A6 
	CM	DWTTRY,A6 
	LD	A2,DWTOR,A6 
	CWK	A2,6 
	ABL(NE)	SELT:2 
	LDK	A1,0 
	CF	A15,TENDIO
***************** 
* 
*  ADDITION TO A CASE WHICH 
*  MAY NEVER OCCUR
* 
***************** 
SELT:2	LD	A4,DCRBUF	GET BUFFER CHAIN POINTER
	ABL(Z)	SELT03	NO BUFFER AVAILABLE,SEND BUSY
	ADK	A4,6	ADJUST BUFFER POINTER 
	LD	A3,TERID	GET TERMINAL ID
	LDR	A1,A4	GET BUFFER ADDRESS 
	SCR	A3,A1	STORE TERMINAL ID
	LDK	A3,1	INITIATE LENGTH ACCUMULATOR 
	ABL	SELT05	WHEN UNEXPECTED ACK WITH TEXT 
* 
**********
* 
*  QUEUE BUFFER IN ALL CASES EXCEPT FOR READ REQUEST
* 
**********
* 
SELT40	EQU	*
	LD	A3,SVRDL	GET READ LENGTH
	ST	A3,-4,A4	STORE READ LENGTH
	SUK	A4,6	GET BUFFER BASE 
	CF	A5,QRBUF	QUEUE BUFFER FOR DCTASK
	ABL	BRM100 
	EJECT
SELNAK	EQU	*
	ABL	BRM100 
	EJECT
BRM900	EQU	*
**********
* 
*  THIS CODE IS NOT NEEDED AND THEREFORE
*  IT IS REMOVED
**
* 
*  BRM900	EQU	* 
*  	CF	A5,READ
*  	CWK	A2,/FF
*  	ABL(E)	BRM900 
*  BRM910	CF	A5,READ
*  	CWK	A2,/FF
*  	ABL(NE)	BRM100	NOT SECOND FF
* 
*********** 
BRM920	CF	A5,HALTIN 
	LD	A2,WPOLL
	ABL(Z)	BRM	THAT NOT MY POLL !!!! 
	ABL	SCPOLL 
	EJECT
SCANQ1	EQU	*
	CF	A5,VERHAD	VERIFY HEADER 
	ANK	A7,/7F 
	ABL(NZ)	BRM100	BAD BCC 
	IM	WPOLL 
	CF	A5,CPTIM
	ABL	BRM100 
SCANQ	EQU	* 
	ABL	TREOT
SCPOLL	EQU	*
	CM	WPOLL 
	LD	A6,CURDWT	GET  CURRENT  DWT 
SCPOL1	LD	A3,DWTREQ,A6	GET REQUEST VECTOR 
	ABL(Z)	TRQF10
SCPOL3	EQU	*
	LDR	A4,A3
	ANK	A4,/07	ACK-NAK-BSY ? 
	RF(Z)	SCTXT
	SUK	A4,1 
	RF(Z)	SCACK	=1, ACK
	SUK	A4,1 
	RF(Z)	SCNAK	=2, NAK
	RF	SCBSY	=3, BUSY
SCTXT	EQU	* 
	ANKL	A3,/100 
	ABL(Z)	TRQF10
	ABL	TRTEXT	TRANSMIT TEXT 
SCACK	EQU	* 
	CF	A5,TRACK
	ABL	SCANQ
SCNAK	CF	A5,TRNAK 
	ABL	SCANQ
SCBSY	CF	A5,TRBSY 
	RB	SCANQ 
* 
* 
****	VERHAD : VERIFY HEADER FRAME POLL-SELECT 
* 
* 
VERHAD	EQU	*
	CF	A5,READP	GET CODE 
	XRK	A2,KNUL
	RF(NZ)	VERH10
VERH1	CF	A5,READP 
	XRK	A2,STX	GET STX 
	RF(NZ)	VERH10
	CF	A5,READP
	XRK	A2,ETX	ETX 
	RF(NZ)	VERH10
	CF	A5,READP
VERH10	RTN	A5 
	EJECT
* 
* 
*	TRANSMIT PROCEDURE RESPONSES
* 
* 
	EJECT
* 
* 
*	TRANSMIT SYNC SEQUENCE
* 
* 
TRSYNC	EQU	*
	LD	A2,PFPOST 
	RF(NZ)	TRS050	WAIT FOR POWER UP
	CIO	A2,1,CHLCUT	START TRANSMITTER
TRS050	EQU	*
	CF	A5,READ WAIT FOR OUTPUT INTERRUPT 
	LDK	A3,4	4 SYNS
TRS100	LDK	A2,SYN 
	CF	A5,WRITE	SEND SYN 
	SUK	A3,1 
	RB(NZ)	TRS100
	RTN	A5 
******   TRHEAD  : TRANSMIT HEADER
*                 CODE=HEADER, F1=HEADER+1
* 
TRHEAD   EQU      * 
         CF       A5,TRSYNC   SEND 4 SYN
         LDK      A2,SOH      SEND -SOH-
         CF       A5,WRITE
	LDK	A7,0	RESET  BCC  COUNTER 
	LDK	A2,/60 
         CF       A5,WRITEP   SEND -ADRT- 
	LDK	A2,0 
	LC	A2,HEADER	SEND CODE 
         CF       A5,WRITEP 
	LDK	A2,0 
	LC	A2,HEADER+1	SEND FC1
         CF       A5,WRITEP   SEND F1 
         LDK      A2,SP 
         CF       A5,WRITEP   SEND SPACE
         LDK      A2,STX
         CF       A5,WRITEP   SEND STX
         RTN      A5          RETURN TO CALL
* 
* 
******   TRACK   : TRANSMIT ACK-SP-SP  FRAME
* 
* 
TRACK    EQU      * 
         LDKL     A2,/0620    ACK-SP. 
TRACK1   ST       A2,HEADER 
         CF       A5,TRHEAD   SEND HEADER 
         CF       A5,TRETX    SEND ETX
	LDKL	A3,/FF00
	ANS	A3,DWTREQ,A6 
         RTN      A5          RETURN
* 
* 
******   TRNAK   : TRANSMIT NAK-SP-SP FRAME 
* 
* 
TRNAK    EQU      * 
         LDKL     A2,/1520    NAK-SP
         RB       TRACK1
* 
******   TRETX   : TRANSMIT  ETX/BCC
* 
* 
TRETX     EQU      *
         LDK	A2,ETX            -SEND ETX- 
         CF       A5,WRITEP 
         LDR      A2,A7 
         CF       A5,WRITEP   -SEND BCC 
         RTN      A5
* 
* 
******   TREOT   :  TRANSMIT END-OF-FRAME AND 
*                   STOP TRANSMIT PROCESS 
* 
TREOT    EQU      * 
         LDK      A2,EOT      -EOT- 
         CF       A5,WRITE
         LDK      A2,/7F      -PAD- 
         CF       A5,WRITE
	LDK	A2,/7F	-PAD- 
         CF       A5,WRITE    -PAD- 
         CIO      A2,0,CHLCUT  STOP PROCESS 
         SST      A2,CHLCUT   SST 
         ABL      BRM 
* 
* 
******   TRTEXT  : TRANSMIT TEXT
* 
* 
TRTEXT	EQU	*
	LD	A2,DWTTRY,A6
	CWK	A2,4 
	RF(NE)	TRT080
	CF	A5,CTIME
	CM	DWTREQ,A6 
	CM	DWTTRY,A6 
	LDK	A1,/40 
	CF	A15,TENDIO
	ABL	TRQF10 
TRT080	EQU	*
	LDKL	A2,/8020	NUL-SP 
         ST       A2,HEADER 
         CF       A5,TRHEAD   SEND HEADER 
	LD	A2,DWTECB,A6
	LD	A3,ECBRL,A2 
	ABL(Z)	TRERR	NUL LENGTH = ERROR
	IFF	MMUPAG=0 
	LDKL	A4,MMUBUF	MMU WORK BUFFER 
	ST	A4,ECBBA,A2 
	CF	A15,DC:MOT	MOVE DATA FROM USER BUFFER 
	XIF
	LD	A4,ECBBA,A2 
	ADK	A4,2	ADJUST BUFFER POINTER 
	SUK	A3,2	ADJUST LENGTH 
TRT100   LCR      A2,A4       GET CHARACTER 
         ADK      A4,1        INCREMENT POINTER 
         ANK      A2,/7F
         CWK      A2,/07      ILLEGAL CODE ?
         RF(L)    TRT120      YES- SKIP IT
	CF	A5,WRITEP 
TRT120   EQU      * 
         SUK      A3,1        MORE TO SEND ?
         RB(NZ)   TRT100
         CF       A5,TRETX    NO- SEND ETX/BCC
TRT130   EQU      * 
         LD       A6,CURDWT   GET NORKING DWT 
	LDKL	A3,/8100
	IM	DWTTRY,A6 
         ST       A3,DWTREQ,A6  STORE IT
	ABL	SCANQ
TRERR	CF	A5,CTIME	CLEAR T.O. REQUEST IF ANY 
	CM	DWTREQ,A6	CLEAR REQUEST 
	LDKL	A1,/8000	REQUEST ERROR
	CF	A15,TENDIO	COMPLETE REQUEST 
	ABL	SCANQ
	EJECT
TRBSY	EQU	* 
	LDKL	A2,/6F20	BUSY-SPACE 
	ABL	TRACK1 
TRQF	EQU	*
TRQF10	CF	A5,TRSYNC 
	LDK	A2,SOH 
	CF	A5,WRITE
*		SEND SOH 
	RB	TREOT 
	EJECT
* 
* 
*   RECEIVER INTERRUPT
* 
* 
IH1301	CF	A15,SAVE8	SAVE A1 - A8
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	INR	A2,0,CHLCIN	READ CHAR
	RF(NA)	IHIN20	NOT ACCEPTED,CHECK STATUS
	IFF	LOGG=0 
	CF	A5,LOGIN	LOG RECEIVED CHARACTER 
	XIF
IHIN10	RTN	A5 
IHIN20	CF	A5,SST	PERFORM SST
	ABL	BRM
* 
* 
*   TRANSMITTER INTERRUPT 
* 
* 
IH1302	CF	A15,SAVE8	SAVE A1 - A8
	CF	A15,LDREG	RESTORE DC REGS A3 - A8 
	RB	IHIN10
	EJECT
* 
* 
*	SST INSTRUCTION AND STATUS CHECK
* 
*   CHLC STATUS : BIT 10=CARRIER OFF
*                BIT 14=THROUGHPUT ERROR
*                BIT 15=MODEM NOT READY 
* 
SST	SST	A1,CHLCIN 
	LDR	A2,A1
	IFF	LOGG=0 
	CF	A5,LOGSST	LOG SST INFORMATION 
	XIF
	ANK	A2,2	TEST IF MODEM NOT READY/THROUGHPUT ERROR
	RF(NZ)	SST100	NO PROBLEM 
	ORS	A2,DCSTCU	FLAG ERROR 
	CF	A15,CKMESS
SST100	RTN	A5 
* 
* 
*	HALT INPUT
* 
* 
HALTIN	CIO	A1,0,CHLCIN
	RB	SST	PERFORM SST INSTRUCTION AND STATUS CHECK
	EJECT
* 
* 
*	WRITE FROM OR READ ONE CHARACTER TO A2
* 
* 
WRITE	EQU	* 
	OTR	A2,0,CHLCUT	SEND CHARACTER 
	RF(A)	WRIT10 
	RF	READ
WRIT10	EQU	*
	IFF	LOGG=0 
	CF	A5,LOGOUT	LOG OUTPUT CHARACTER
	XIF
* 
READ	CF	A15,STREG 
	ABL	TDISP
	EJECT
* 
* 
***	WRITEP
* 
*   WRITE A2 WITH PARITY
* 
* 
WRITEP	ECR	A1,A2
	ORK	A2,/80 
WRI100	SLL	A1,1 
	RB(P)	WRI100 
	RF(Z)	WRI101 
	XRK	A2,/80 
	RB	WRI100
WRI101	EQU	*
	XRR	A7,A2
	RB	WRITE 
* 
* 
* 
***	READP 
* 
*   READ CHARACTER TO A2 AND CHECK PARITY 
* 
* 
READP	CF	A5,READ
	CWK	A2,SYN 
	RB(E)	READP
	ECR	A1,A2
RE100	SLL	A1,1
	RF(Z)	RE110
	RB(NN)	RE100 
	XRK	A2,/80 
	RB	RE100 
RE110	LDR	A1,A2 
	ANK	A2,/7F 
	ADKL	A5,4
	ANK	A1,/80 
	XRR	A7,A2
	XRK	A1,/80 
	ABR*	A5
* 
* 
	EJECT
* 
*	FIND DWT CONTAINING SUBTERMINAL ADDRESS AS GIVEN IN A2
* 
*	CALLING SEQUENCE: CF A5,FINTER
*	A2=SUBTERMINAL ADDRESS
*	A4 DESTROYED
*	A3#0: DWT TO FOUND TERMINAL 
* 
FINTER	EQU	*
	LD	A4,DCTAB
	AD*	A4,DCTAB	ADDRESS TO END OF DCTAB 
FINT10	SUK	A4,2 
	LDK	A3,0	DEFAULT VALUE 
	CWK	A4,DCTAB	END OF DC:TAB 
	RF(E)	FINT20	SUBTERMINAL NOT FOUND 
	LDR*	A3,A4	LOAD DWT ADDRESS
	CWR*	A2,A3	COMPARE SUBTERMINAL ADDRESS 
	RB(NE)	FINT10	TAKE NEXT TERMINAL 
FINT20	RTN	A5 
	EJECT
* 
* 
*	POWER ON FUNCTIONS
* 
* 
DC13ON	CF	A15,SAVE8	SAVE A1 - A8
	LDKL	A5,STB	INIT STACK 
	CF	A5,CLREQ	CLEAR REQUEST PENDING
DRDC20	ABL	BRM
* 
* 
*******   CLREQ  :  CLEAR  PENDING  REQUEST  AT 
*                    POWER  ON,BY KILLING REQ. VECTOR 
* 

CLREQ	EQU	* 
	LD	A4,DCTAB
	AD*	A4,DCTAB	END OF TABLE
CLRQ10	SUK	A4,2	MAKE POINTER FOR DWTAD
	CWK	A4,DCTAB 
	RF(E)	CLRQ20	YES 
	LDR*	A6,A4 
	LD	A2,DWTST,A6 
	RB(N)	CLRQ10 
	CM	DWTREQ,A6 
	CF	A5,CTIME
	LDKL	A1,/2040
	CF	A15,TENDIO
	RB	CLRQ10
	LD	A2,DCTPGP 
	RF(NZ)	CLRQ20
	CF	A15,SPOTIM	START POLL TIMER 
CLRQ20	RTN	A5 
	EJECT
**********
* 
*  RESART POLL TIMER WHEN POLL HAS BEEN RECEIVED
* 
**********
* 
CPTIM	CM	DCONOF	INDICATING POLLING
	LDKL	A2,-TIMPOL
	ST*	A2,DCTPGP	RESTART TIMER
	CF	A15,CKMESS	CHECK IF STATUS CHANGE 
	RTN	A5 
* 
**********
* 
*  START POLL TIMER 
* 
**********
* 
SPOTIM	CF	A15,SETTIM	START TIMER
	DATA	PTOUT,TIMPOL
	ST	A4,DCTPGP	STORE TIMER POINTER 
	ADKL	A15,4 
	ABR*	A15 
* 
**********
* 
*  POLL TIMEOUT 
* 
**********
* 
PTOUT	LDKL	A5,STB	LOAD AS STACK BASE
	LDK	A2,/40 
	ST	A2,DCONOF	INDICATE POLL TIMEOUT 
	CF	A15,CKMESS	CHECK IF STATUS CHANGE 
	CF	A15,SPOTIM	START POLL TIMER 
	ABL	TDISP
	EJECT
* 
* 
*	INTERRUPT LOGGING ROUTINE 
* 
* 
	IFF	LOGG=0 
LOGSST	ST	A2,SAVE2
	ORKL	A2,/F000
	RF	LOG10 
LOGOUT	ST	A2,SAVE2
	ORKL	A2,/0F00
	RF	LOG10 
LOGIN	CWK	A2,/FF
	RF(E)	LOGE10 
	ST	A2,SAVE2
LOG10	ST	A3,SAVE3 
	LD	A3,LOGPNT 
	STR	A2,A3
	ADK	A3,2 
	CWK	A3,LOGEND
	RF(L)	LOGEXI 
	LDKL	A3,LOGSTA 
LOGEXI	ST	A3,LOGPNT 
	LD	A2,SAVE2
	LD	A3,SAVE3
LOGE10	RTN	A5 
	EJECT
* 
* 
LOGPNT	DATA	LOGSTA
LOGSTA	EQU	*
	RES	300
LOGEND	EQU	*-4
SAVE2	DATA	0
SAVE3	DATA	0
	XIF
* 
* 
* 
********************
* 
*  DC BUFFER POOL 
* 
********************
* 
RLINK	EQU	RBUFL+RBUFL+8 
* 
DCRBUF	EQU	*
	DATA	*+2	FREE BUFFER ANCHOR
	IFF	RBUFNR=2 
	DATA	*+RLINK 
	RES	RBUFL+3
	IFF	RBUFNR=3 
	DATA	*+RLINK 
	RES	RBUFL+3
	XIF
	DATA	*+RLINK 
	RES	RBUFL+3
	DATA	0	END OF CHAIN
	RES	RBUFL+3
	IFF	MMUPAG=0 
* 
MMUBUF	RES	TBUFL+1	MMU WORK AREA
	XIF
	EJECT
* 
**********
* 
*  DEVICE WORK TASK 
*  FOR DC-TASK
* 
**********
* 
DW1300	EQU	*	TABLE ENTRY
	DATA	0	CU LINE ADDRESS 
	DATA	/8000	STATUS
	DATA	0	ECB ADDRESS 
	DATA	0	ORDER 
	DATA	DC13DC	POINTER TO ADDRESS BLOCK 
	DATA	0	TTAB ADDRESS
	DATA	0	WAIT/ACTIVATE INDICATOR 
	DATA	0	TASK QUEUE
	IFT	MMUPAG=1 
	DATA	0	USER ECB ADDRESS
	DATA	DC:ECB	MMU ECB ADDRESS
	XIF
	DATA	0	TIMER POINTER 
	DATA	0	WRITE QUEUE 
	DATA	0	STATUS QUEUE(NOT USED BY DCTASK)
	DATA	0	RECEIVE MESSAGE QUEUE 
	DATA	0	REQUEST TIMEOUT VALUE 
	DATA	0	REQUEST VECTOR
	DATA	0	RETRY COUNTER 
	IFT	MMUPAG=1 
DC:ECB	EQU	*	MMU ECB
	DATA	0,0,0,0,0,0 
	XIF
	EJECT
* 
* 
DC:IN	DATA	DC:TAB+2 
* 
DCTAB	DATA	DC:TAB 
* 
DC:TAB	DATA	2	LENGTH OF DC:TAB
	DATA	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
* 
DC:END	EQU	*
* 
* 
	END

Full view