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

⟦1257124f4⟧

    Length: 35666 (0x8b52)
    Notes: pts_type(SC)
    Names: »DRLT01.SC«

Derivation

└─⟦3a2bec7de⟧ Bits:30009687 Philips computer tape "600313"
    └─⟦this⟧ »M:821/DRLT01.SC« 
└─⟦726a6c4ca⟧ Bits:30009685 Philips computer tape "600309"
    └─⟦this⟧ »M:92D2/DRLT01.SC« 
└─⟦dab19bdd7⟧ Bits:30009677 Philips computer tape "600218"
    └─⟦this⟧ »M:261/DRLT01.SC« 

PTS(SC)

	IDENT DRLT01 	REL 9.2 79-11-16  870105040920 

			=8,TIMER RESET,TEST ORDER,INH-A15
			REL 9.1 79-05-23 
			=7,CLT010 DUBLE DEF LABEL, RB - ABL
			PRR 9.1 79-05-14 
			=6,CWT ADRESS ERROR A5 - A1
			PRR 9.1 79-04-25 
			=5,GETLIN CORRECTED
			REL 9.1 79-04-06 
			=1-4, GEN UPDATE TO 8.2+ STATUS
			REL 8.2 79-04-02 
			=4,TIMER RESET CORRECTED 
			REL 8.2 79-03-22 
			=3,NAK HANDLING CORRECTED
			REL 8.2 79-03-16 
			=2,IMPROV. OF TEST ORDER 
			REL 8.2 79-01-11 
			=1,DISPL.RECV,NAK ERROR,ERR. RETRYCNT
			REL 8.2 78-09-15 



* 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRLT01 = DRIVER CHANNEL UNIT
*            FOR LOCAL TERMINALS
* 
* 
* 
* 
* 
********************************************* 
* 
*   THIS IS THE CHANNEL UNIT DRIVER FOR LOCAL TERMINALS.
*   AT INTERRUPT AN INPUT WORD IS READ TO REGISTER A2. IF DATA
*   INPUT OR DATA REQUEST A BRANCH IS MADE TO INTERRUPT HANDLER 
*   FOR ACTUAL DEVICE.
*   IF CONTROL CHARACTER, THIS IS EXAMINED AND NECESSARY ACTIONS
*   ARE CARRIED OUT.
* 
*   THE DRIVER ALSO INCLUDES THE FOLLOWING SUBROUTINES:-
* 
*   - OUTLIN   SEND ONE CHARACTER VIA CHLT
* 
*   - CHLTON   EXECUTE CIO-START ON EVERY CHLT IN SYSTEM
* 
*   - GETCHR   GET ONE CHARACTER FROM ECB-BUFFER
* 
*    CONTROL WORK TABLES FOR THE CHANNELS ARE 
*    INCLUDED IN THE DRIVER.
	EJECT
* 
* 
* 
*   THE FOLLOWING FUNCTIONS ARE ALSO INCLUDED IN THE DRIVER:- 
* 
*   - OUTPUT   SEND ONE CHARACTER, SAVE A3-A5 AND RETURN TO DISPATCHER
* 
*   - STREG    SAVE A3-A5 AND RETURN TO DISPATCHER
* 
*   - LDREG    IF INTERRUPT IS ALLOWED, RESTORE A3-A5 AND RETURN
*              TO USER VIA A5 
* 
*   - LDREGE   RESTORE A3-A5 AND RETURN TO USER VIA A5
* 
* 
* 
*   NORMAL REGISTER USAGE IN THE DRIVER:- 
* 
*   A1 = RETURN CODE
*   A2 = INPUT WORD 
*   A3 = LINE NUMBER * 2
*   A4 = DEVICE NUMBER * 2
*   A5 = CWT-ADDRESS
*   A6 = DWT-ADDRESS
*   A7 = ORDER
*   A8 = ECB-ADDRESS
* 
* 
* 
	EJECT
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	CHLT1	INTERRUPT FROM CHLT01
	ENTRY	CHLT2	INTERRUPT FROM CHLT2 
	ENTRY	CHLT3	INTERRUPT FROM CHLT3 
	ENTRY	CHLT4	INTERRUP FROM CHLT4
	ENTRY	OUTLIN	SEND ONE CHARACTER
	ENTRY	CHLTON	START OF CHLT 
	ENTRY	OUTPUT	SAVE REGISTERS, SEND CHAR. AND DISPATCH 
	ENTRY	LDREG	RESTORE A3-A5 ANDRETURN
	ENTRY	LDREGE	WAY BACK FROM ECHO HANDLING 
	ENTRY	LDREGF	RETURN
	ENTRY	STREG	SAVE REGISTERS A3-A5 IN DWT
	ENTRY	GETCHR	GET ONE CHARACTER FROM ECB-BUFFER 
	ENTRY	LOCHAN	NUMBER OF LOCAL CHANNEL UNITS 
	ENTRY	RECHAN	NUMBER OF REMOTE CHANNEL UNITS
	ENTRY	REMFC	DUMMY ENTRY
	ENTRY	DWREMU	DUMMY ENTRY 
	ENTRY	ECHRTN	RETURN FROM ECHO
	ENTRY	ECHO	ECHO ROUTINE
	ENTRY	ECHEND	END OF ECHO 
* 
	EJECT
* 
******************************************
*    EXTERNAL TOSS MODULE ENTRIES        *
******************************************
* 
* 
	EXTRN	SAVE8	SAVE REGISTERS A1-A8 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	IHRET8	RESTORE A1-A8 
	EXTRN	INTLT1	INTERRUPT TABLE 
	EXTRN	INTLT2	INTERRUPT TABLE 
	EXTRN	INTLT3	INTERRUPT TABLE 
	EXTRN	INTLT4	INTERRUPT TABLE 
	EXTRN	SETIME	GET TIMER BLOCK 
	EXTRN	SETIMP	GET TIMER BLOCK 
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	TENDIO 
* 
* 
*********************************** 
*    DWT PARAMETERS               * 
*********************************** 
	EXTRN	DWTST	STATUS 
	EXTRN	DWTOR	ORDER
	EXTRN	DWTOCH	LAST OUTPUT CHARACTER 
	EXTRN	DWTECB	ECB-ADDRESS 
	EXTRN	DWTADR	ADDRESS TO ADDRESS-BLOCK
	EXTRN	DWTWAT 
	EXTRN	DWTOTQ	OUTPUT QUEUE
	EXTRN	DWTA3	SAVE AREA A3 
	EXTRN	DWTA4	SAVE AREA A4 
	EXTRN	DWTA5	SAVE AREA A5 
	EXTRN	DWTSB2	STACK BASE 2 IN DWT 
	EXTRN	DWTTP	TIMER POINTER
	EXTRN	DWTECH	ECHO DEVICE DWT 
	EXTRN	INTADR	INTERRUPT ADDRESS DISPLACEMENT
	EXTRN	RECADR	RECOVERY ADDRESS DISPLACEMENT 
	EXTRN	ECHADR	ECHO ADDRESS DISPLACEMENT 
* 
	EJECT

* 
************* 
* CONSTANTS * 
************* 
* 
* 
NOERR	EQU	1	RETURN CODE. NOT OPERABLE 
DUMMSP	EQU	/03	SPECIAL DUMMY
DRQTIM	EQU	30 
* 
	EJECT
* 
************************
* CONDITIONAL ASSEMBLY *
************************
* 
*   A LOGG FUNCTION OF EVERY INPUT AND OUTPUT CHARACTER 
*   MAY BE INCLUDED TO THE DRIVER  BY SETTING X:A=1 
* 
X:A	EQU	1 
LOGING	EQU	0
* 
*    THIS DRIVER HANDLES ONE OR UP TO FOUR LOCAL
*    CHANNELS BY SETTING X:B TO 1,2,3 OR 4
* 
X:B	EQU	1 
LOCHAN	EQU	1
* 
*    ACKUMULATORS FOR NAK, RETRANSMISSION FAULT AND 
*    UNDEFINED CONTROL CHARACTERS ARE UPDATED IN
*    THE DRIVER. THIS FUNCTION CAN BE EXCLUDED FROM 
*    DRIVER BY SETTING X:C = 0. 
* 
X:C	EQU	1 
ACKMUL	EQU	0
* 
*    BY SETTING X:D = 1 A SOFTWARE TIME OUT HANDLING
*    MISSING DATA REQUESTS FROM PRINTERS CAN BE INCLUDED
*    IN THE DRIVER. 
*    AN ACKUMULATOR TO BE UPDATED EVERY TIME A SOFTWARE 
*    TIME OUT OCCURS IS ALSO INCLUDED.
* 
X:D	EQU	1 
SOFTIM	EQU	0
* 
* 
*     ECHO FONCTION CAN BE EXCLODED 
*     BY SETTING X:E = 0
X:E	EQU	1 
CECHO	EQU	01
* 
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	0
* 
	EJECT


RECHAN	EQU	0
REMFC	EQU	0 
CWTRT1	EQU	*
CWTRT2	EQU	*
CWTRT3	EQU	*
CWTRT4	EQU	*
CWTRT5	EQU	*
CWTRT6	EQU	*
CWTRT7	EQU	*
CWTRT8	EQU	*
DWREMU	EQU	*
	EJECT
* 
* 
***************************************************** 
*    C W T L T 1                                    * 
***************************************************** 
* 
*    CONTROL WORK TABLE FOR LOCAL TERMINAL NO. 1
* 
* 
DWA1	EQU	/03	DEVICEADDRESS
* 
CWTLT1	EQU	*	TABLE ENTRY
CWTLDW	EQU	*-CWTLT1	LAST OUTPUT DWT-ADDRESS 
	DATA	0 
CWTLOW	EQU	*-CWTLT1 
	DATA	0	LAST OUTPUT WORD
CWTITA	EQU	*-CWTLT1	ADDRESS TO INTLT1 
	DATA	INTLT1
CWTINR	EQU	*-CWTLT1	INR 
	INR	A2,0,DWA1
CWTOTR	EQU	*-CWTLT1	OTR 
	OTR	A2,0,DWA1
CWTCIS	EQU	*-CWTLT1	CIO-START 
	CIO	A2,1,DWA1
CWTRTC	EQU	*-CWTLT1 
	DATA	0	RETRANSMISSION COUNTER
CWTEQ	EQU	*-CWTLT1	END OF QUEUE 
	DATA	0 
CWTADD	EQU	*-CWTLT1 
* 
	IFT	ACKMUL=1 
* 
	DATA	0	NAK-ACKUMULATOR 
	DATA	0	RETR. FAULT-ACKUMULATOR 
	DATA	0	UNDEFINED-INTERRUPT-ACKUMULATOR 
ACKTIM	EQU	*-CWTLT1 
	DATA	0	PRINTER TIMEOUT ACKUMULATOR 
* 
	XIF
	EJECT
* 
* 
***************************************************** 
*    C W T L T 2                                    * 
***************************************************** 
* 
*    CONTROL WORK TABLE FOR LOCAL TERMINAL NO. 2
* 
CWTLT2	EQU	*
* 
	IFT	LOCHAN=2 
DWA2	EQU	/13	DEVICE ADDRESS 
* 
	DATA	0	LAST OUTPUT DWT-ADDRESS 
	DATA	0	LAST OUTPUT WORD
	DATA	INTLT2	INTERRUPT TABLE
	INR	A2,0,DWA2	INR
	OTR	A2,0,DWA2	OTR
	CIO	A2,1,DWA2	CIO-START
	DATA	0	RETRANSMISSION COUNTER
	DATA	0	END OF QUEUE
* 
	IFT	ACKMUL=1 
* 
	DATA	0	NAK-ACKUMULATOR 
	DATA	0	RETR. FAULT-ACKUMULATOR 
	DATA	0	UNDEFINED- INTERRUPT-ACKUMULATOR
	DATA	0	PRINTER TIMEOUT ACKUMULATOR 
* 
	XIF
* 
	IFT	LOCHAN=2 
* 
	EJECT
	XIF
	IFT	LOCHAN=3 
DWA2	EQU	/13	DEVICE ADDRESS 
* 
	DATA	0	LAST OUTPUT DWT-ADDRESS 
	DATA	0	LAST OUTPUT WORD
	DATA	INTLT2	INTERRUPT TABLE
	INR	A2,0,DWA2	INR
	OTR	A2,0,DWA2	OTR
	CIO	A2,1,DWA2	CIO-START
	DATA	0	RETRANSMISSION COUNTER
	DATA	0	END OF QUEUE
* 
	IFT	ACKMUL=1 
* 
	DATA	0	NAK-ACKUMULATOR 
	DATA	0	RETR. FAULT-ACKUMULATOR 
	DATA	0	UNDEFINED- INTERRUPT-ACKUMULATOR
	DATA	0	PRINTER TIMEOUT ACKUMULATOR 
* 
	XIF
* 
* 
	XIF
	IFT	LOCHAN=4 
* 
* 
*  CHANNEL UNIT WORK TABLE FOR LOCAL TERMINAL NO.2
* 
DWA2	EQU	/13	DEVICE ADDRESS 
* 
	DATA	0	LAST OUTPUT DWT-ADDRESS 
	DATA	0	LAST OUTPUT WORD
	DATA	INTLT2	INTERRUPT TABLE
	INR	A2,0,DWA2	INR
	OTR	A2,0,DWA2	OTR
	CIO	A2,1,DWA2	CIO-START
	DATA	0	RETRANSMISSION COUNTER
	DATA	0	END OF QUEUE
* 
	IFT	ACKMUL=1 
* 
	DATA	0	NAK-ACKUMULATOR 
	DATA	0	RETR. FAULT-ACKUMULATOR 
	DATA	0	UNDEFINED- INTERRUPT-ACKUMULATOR
	DATA	0	PRINTER TIMEOUT ACKUMULATOR 
* 
	XIF
	EJECT
* 
* 
*  CHANNEL UNIT WORK TABLE FOR LOCAL TERMINAL NO.3
* 
CWTLT3	EQU	*
	IFT	LOCHAN=3 
DWA3	EQU	/23	DEVICE ADDRESS 
* 
	DATA	0	LAST OUTPUT DWT-ADDRESS 
	DATA	0	LAST OUTPUT WORD
	DATA	INTLT3	INTERRUPT TABLE
	INR	A2,0,DWA3	INR
	OTR	A2,0,DWA3	OTR
	CIO	A2,1,DWA3	CIO-START
	DATA	0	RETRANSMISSION COUNTER
	DATA	0	END OF QUEUE
* 
	IFT	ACKMUL=1 
* 
	DATA	0	NAK-ACKUMULATOR 
	DATA	0	RETR. FAULT-ACKUMULATOR 
	DATA	0	UNDEFINED- INTERRUPT-ACKUMULATOR
	DATA	0	PRINTER TIMEOUT ACKUMULATOR 
* 
	XIF
* 
* 
	IFT	LOCHAN=4 
DWA3	EQU	/23	DEVICE ADDRESS 
* 
	DATA	0	LAST OUTPUT DWT-ADDRESS 
	DATA	0	LAST OUTPUT WORD
	DATA	INTLT3	INTERRUPT TABLE
	INR	A2,0,DWA3	INR
	OTR	A2,0,DWA3	OTR
	CIO	A2,1,DWA3	CIO-START
	DATA	0	RETRANSMISSION COUNTER
	DATA	0	END OF QUEUE
* 
	IFT	ACKMUL=1 
* 
	DATA	0	NAK-ACKUMULATOR 
	DATA	0	RETR. FAULT-ACKUMULATOR 
	DATA	0	UNDEFINED- INTERRUPT-ACKUMULATOR
	DATA	0	PRINTER TIMEOUT ACKUMULATOR 
* 
	XIF
	EJECT
* 
*    CONTROL WORK TABLE FOR LOCAL TERMINAL NO. 4
* 
CWTLT4	EQU	*
* 
* 
	IFT	LOCHAN=4 
DWA4	EQU	/33	DEVICE ADDRESS 
* 
	DATA	0	LAST OUTPUT DWT-ADDRESS 
	DATA	0	LAST OUTPUT WORD
	DATA	INTLT4	INTERRUPT TABLE
	INR	A2,0,DWA4	INR
	OTR	A2,0,DWA4	OTR
	CIO	A2,1,DWA4	CIO-START
	DATA	0	RETRANSMISSION COUNTER
	DATA	0	END OF QUEUE
* 
	IFT	ACKMUL=1 
* 
	DATA	0	NAK-ACKUMULATOR 
	DATA	0	RETR. FAULT-ACKUMULATOR 
	DATA	0	UNDEFINED- INTERRUPT-ACKUMULATOR
	DATA	0	PRINTER TIMEOUT ACKUMULATOR 
* 
	XIF
* 
	EJECT
* 
**********************************************
*    C H T A B                               *
**********************************************
* 
*   THIS TABLE HOLDS ADDRESSES OF CONTROLLER WORK 
*   TABLES CWT TO CHANNEL UNITS FOR LOCAL AND REMOTE
*   TERMINALS.
* 
* 
CHTAB	EQU	* 
	DATA	CHTABE-*	TABLE LENGTH 
	DATA	CWTLT1	 
	DATA	CWTLT2
	IFT	LOCHAN=3 
	DATA	CWTLT3
	XIF
	IFT	LOCHAN=4 
	DATA	CWTLT3
	DATA	CWTLT4
	XIF
CHTABE	EQU	*	END OF TABLE 
* 
* 
* 
* 
* 
	EJECT
* 
	IFF	LOCHAN=1 
* 
*   C H L T 1 / C H L T 2 
*   THIS IS THE INTERRUPT HANDLER FOR CHLT
* 
*   C H L T 1 
*   INTERRUPT FROM CHLT1
* 
	XIF
	IFT	LOCHAN=2 
CHLT3	EQU	* 
CHLT4	EQU	* 
	XIF
	IFF	LOCHAN=1 
CHLT1	EQU	* 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	LOCHAN=1 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	LOCHAN=1 
	LDKL	A5,CWTLT1	SET CWT-ADDRESS FOR CHLT1 
	RF	CLT010
* 
*   C H L T 2 
*   INTERRUPT FROM CHLT2
* 
CHLT2	EQU	* 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	LOCHAN=1 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	LOCHAN=1 
	LDKL	A5,CWTLT2	SET CWT-ADDRESS FOR CHLT2 
	XIF
	IFT	LOCHAN=2 
CLT010	EX	CWTINR,A5	EXECUTE INR-INSTRUCTION 
* 
	XIF
* 
	IFT	LOCHAN=3 
	RF	CLT010
* 
*   C H L T 3 
*   INTERRUPT FROM CHLT3
* 
CHLT3	EQU	* 
CHLT4	EQU	* 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	LOCHAN=3 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFT	LOCHAN=3 
	LDKL	A5,CWTLT3	SET CWT-ADDRESS FOR CHLT3 
CLT010	EX	CWTINR,A5	EXECUTE INR 
* 
	XIF
	IFT	LOCHAN=4 
	RF	CLT010
* 
* 
*   C H L T 2 
*   INTERRUPT FROM CHLT3
* 
CHLT3	EQU	* 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	LOCHAN=4 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFT	LOCHAN=4 
	LDKL	A5,CWTLT3	SET CWT-ADDRESS FOR CHLT3 
	RF	CLT010
*   C H L T 4 
*   INTERRUPT FROM CHLT4
* 
CHLT4	EQU	* 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	LOCHAN=4 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFT	LOCHAN=4 
	LDKL	A5,CWTLT4	SET CWT-ADDRESS FOR CHLT4 
CLT010	EX	CWTINR,A5	EXECUTE INR 
	XIF
* 
	IFT	LOCHAN=1 
* 
* 
*    C H L T 1
* 
*    INTERRUPT FROM CHLT1 
* 
CHLT1	EQU	* 
CHLT2	EQU	* 
CHLT3	EQU	* 
CHLT4	EQU	* 
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	LOCHAN=1 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFT	LOCHAN=1 
	LDKL	A5,CWTLT1	GET CWT-ADDRESS 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	INR	A2,0,DWA1
* 
	XIF
* 
	IFT	LOGING=1 
	CF	A15,LOGG	** LOGG OF INPUT CHARACTER **
	XIF
	EJECT
* 
* 
*   DETERMINE LINE- AND DEVICE NUMBER 
* 
	LDK	A1,0	RESET RETURN CODE 
	LDR	A3,A2	INPUT WORD IN A3 
	SRL	A3,8 
	LDR	A4,A3
	ANK	A3,/E	2 * LINE NUMBER IN A3
	SRL	A4,3 
	ANK	A4,/E	2 * DEVICE NUMBER IN A4
	ABL(NE)	CLT100	INPUT IS A DATA CHARACTER 
	ANK	A2,/7F 
	SUK	A2,3	POWER ON ?
	RF(E)	CHPOWO 
	SUK	A2,2	NAK ?	=3
	RF(Z)	CLT035		=3 
CLT015	EQU	*		=7(=3)
* 
* 
*    CHECK QUEUE AND SEND IF SOMETHING THERE
* 
	LDR*	A7,A5	LAST OUTPUT DWT IN A7 
	CMR	A5	RESET LAST OUTPUT 
	LD	A6,CWTEQ,A5	OUTPUT QUEUE
	RF(E)	CLT020 
	STR	A2,A15	SAVE A2 
	LD	A2,DWTOTQ,A6	GET QUEUE LINK 
	ST	A2,CWTEQ,A5	STORE IT IN CWT 
	LC	A2,DWTOCH,A6	GET CHARACTER
	CF	A15,OUTLIN	SEND CHARACTER 
	LDR*	A2,A15	RELOAD A2
	EJECT
* 
* 
*    CHECK CONTROL CHARACTER AND UPDATE ERROR-
*    ACKUMULATORS IF NAK, RETRANSMISSION FAULT
*    OR UNDEFINED CONTROL CHARACTER 
* 
CLT020	EQU	*
	LDR	A6,A7	GET LAST OUTPUT
	RF(E)	CLT062 
	SUK	A2,2	ACK ?	=3
	RF(Z)	CLT040 
	ADK	A2,7	TIME-OUT ?
	RF(E)	CLT028 
	SUK	A2,5	7 NAK ?	=3
	RF(Z)	CLT032		=3 
* 
	IFT	ACKMUL=1 
* 
				=1
				=1
	LDK	A7,2 
	SUK	A2,/16	RETRANSMISSION FAULT
	RF(E)	CLT025 
	ADK	A7,2	UNDEFINED INTERRUPT 
CLT025	ADR	A7,A5
	IM	CWTADD,A7	INCREMENT ACKUMULATOR FOR THIS
			TYPE OF INTERRUPT
* 
	XIF
* 
	EJECT
* 
* 
*    NAK, TIME-OUT, RETRANSMISSION FAULT OR 
*    UNDEFINED CONTROL CHARACTER
* 
*    CHECK LAST OUTPUT AND TRY RECOVERY OF THAT DEVICE
*    ONE TIME. IF NOT SUCCESS GO TO DRIVER WITH 
*    MESSAGE NOT OPERABLE.
* 
CLT028	EQU	*
	LDKL	A2,/3000	ECHO MODE AND RECOVERY BIT 
	AN	A2,DWTST,A6	AT LEAST ONE OF THE BITS SET ?
	RF(NE)	CLT032
	LDKL	A2,/1000	INDICATE RECOVERY TRIAL DONE 
	XRS	A2,DWTST,A6	SET BIT IN STATUS WORD 
CLT030	LDK	A3,2	INDICATE RECOVERY OF DEVICE 
	LDK	A4,1		=1 
	LDK	A4,0 
	RF	CPO025
CLT032	LDK	A1,NOERR	INDICATE NOT OPERABLE 
	CM	CWTRTC,A5	CLEAR RETRY COUNTER	=1
	ABL	CLT110 
	EJECT
* 
* 
*    N A K
* 
*    ERROR ACKUMULATOR AND RETRANSMISSION COUNTER IS UPDATED. 
*    LAST OUTPUT CHARACTER IS RETRANSMITTED BY CHANNEL DRIVER 
*    UP TO SIX TIMES AND IF STILL NO SUCCESS RETURN CODE NOT
*    OPERABLE IS SENT TO DEVICE DRIVER. 
* 
CLT035	EQU	*
	IFT	ACKMUL=1 
* 
	IM	CWTADD,A5	UPDATE ERROR ACKUMULATOR
	XIF
* 
	IM	CWTRTC,A5	INCREMENT RETRANSMISSION COUNTER
	LD	A4,CWTRTC,A5	GET COUNTER
	SUK	A4,7	SEVEN TIMES ? 
	RB(E)	CLT015		=7(=3) 
	LD	A2,CWTLOW,A5	GET LAST OUTPUT WORD 
	LDR	A1,A5
	EX	CWTOTR,A1	EXECUTE OTR-INSTRUCTION 
				=3
	IFT	LOGING=1 
	CF	A15,LOGG	**  LOGG OUTPUT CHARACTER  **
	XIF
				=3
	ABL	TDISP
	EJECT
* 
* 
*    ACK      DATA = 07 
* 
*    SIMULATE DATA REQUEST IF RETURN CODE FROM
*    CHLT OR DEVICE WITHOUT DATA REQUEST, 
*    ELSE GO TO DISPATCHER
* 
CLT040	EQU	*
	LDKL	A7,/EFFF
	ANS	A7,DWTST,A6	RESET RECOVERY BIT IN STATUS WORD
	LDR	A1,A1
	RF(NZ)	CLT110	RETURN CODE,SIMULATE DATA REQUEST
	LDR*	A7,A6	DEVICE WITHOUT DATA REQUEST?
	RF(N)	CLT110	YES. SIMULATE DATA REQUEST
* 
	IFF	SOFTIM=1 
* 
CLT062	EQU	*
	RF	EXIT
* 
	XIF
* 
* 
	IFT	SOFTIM=1 
* 
	EJECT
* 
* 
*    PRINTER TIMING 
* 
	INH
				=4
				=4
				=4
	LD	A3,DWTTP,A6	ADDRESS TO TIMER BLOCK
	RF(E)	CLT060 
* 
*    RESTART TIMER
* 
	LDKL	A3,-DRQTIM	RESTART TIMER
	ST*	A3,DWTTP,A6
	RF	EXIT
* 
*    START TIMER
* 
CLT060	LDR	A1,A6	PARAMETER
	LDKL	A4,DWTTP	TIMER POINTER
	ADR	A4,A6	ADD WITH DWT-ADDRESS 
	CF	A15,SETIMP	GET TIMER BLOCK
	DATA	DRQTUT,DRQTIM	ADDRESS TO TIME-OUT ROUTINE AND DELAY 
CLT062	EQU	*
	RF	EXIT

	EJECT
* 
* 
*    RESET TIMER IF STARTED 
* 
				=4
				=4
				=4
				=4
				=4
	EJECT
* 
*    TIME-OUT ROUTINE HANDLING MISSING INTERRUPTS 
*    FROM PRINTERS
* 
DRQTUT	EQU	*
	LDR	A6,A1	GET DWT-ADDRESS
	CM	DWTTP,A6	RESET POINTER TO TIMER BLOCK 
	LD	A3,DWTST,A6 
	SLL	A3,2	ECHO MODE ? 
	RF(N)	CLT110	YES 
* 
	IFT	ACKMUL=1 
	IFF	LOCHAN=1 
* 
	LDR*	A5,A6	CHANNEL PARAMETER 
	ANK	A5,/F
	SLL	A5,1	2 * INDEX 
	ADK	A5,2	JUST TO AVOID TABLE LENGTH
	LD	A5,CHTAB,A5	GET CWT-ADDRESS 
	IM	ACKTIM,A5	INCREMENT ACKUMULATOR 
* 
	XIF
	IFT	SOFTIM=1 
	IFT	ACKMUL=1 
	IFT	LOCHAN=1 
* 
	LDKL	A5,CWTLT1	GET CWT-ADDRESS 
	IM	ACKTIM,A5	INCREMENT ACKUMULATOR 
* 
	XIF
	IFT	SOFTIM=1 
* 
	LD	A7,DWTOR,A6	TEST ORDER ?	=2 
	ANK	A7,/FE	U	=9(=2)
	RB(E)	CLT032	YES, GO TO DEV. INT. HANDLER	=2 
	RB	CLT030	NO, EXECUTE DEV. RECOVERY	=2 
* 
	XIF
* 
	EJECT
* 
*   POWER ON    DATA = 03 
* 
*   RECOVERY ROUTINES ARE STARTED FOR EVERY DEVICE
*    ON ACTUAL LINE EXCEPT THOSE OCCUPYING CHANNEL
*    UNIT OR THOSE IN ECHO MODE.
* 
* 
*     ON EXIT TO RECOVERY ROUTINE:
* 
*     A5 = STACKBASE 2 IN DWT 
*     A6 = DWT-ADDRESS
*     A7 = ORDER
* 
CHPOWO	EQU	*
	CF	A15,GETLIN
	LDR*	A2,A5	GET LAST OUTPUT DWT 
	CM	CWTRTC,A5	RESET RETRANSMISSION COUNTER
	LDK	A4,0 
	LDR	A3,A6	DEVICE COUNTER 
	LDR	A1,A8	ADDRESS POINTER
	RF(Z)	EXIT	EXIT IF NOT DEFINED 
CPO020	ADK	A1,2 
	LDR*	A6,A1	GET DWT-ADDRESS 
	RF(E)	CPO030	NO DWT
	SRC	A6,1 
	RF(N)	CPO030 
	SLC	A6,1 
	LCR	A7,A6	LEFT BYTE OF DWTCHP
	ANK	A7,1	INPUT DEVICE ?
	RF(NE)	CPO025	YES
	LDKL	A7,/EFFF
	ANS	A7,DWTST,A6	RESET RECOVERY BIT 
	LC	A7,DWTST,A6 
	ANK	A7,/20	ECHO MODE ? 
	RF(NE)	CPO030	YES
	CWR	A6,A2	DEVICE WAITING FOR CHANNEL ANSWER ?
	RF(E)	CPO030	YES 
CPO025	LD	A7,DWTADR,A6	ADDRESS TO ADDRESSBLOCK IN A7
	LD	A7,RECADR,A7	ADDRESS TO RECOVERY IN A7
	RF(E)	CPO030	NO RECOVERY 
	LDKL	A5,DWTSB2	STACKBASE 
	ADR	A5,A6
	INH
	CFR	A15,A7	GO TO RECOVERY ROUTINE
CPO030	SUK	A3,2	ALL DEVICES THREATED

	RB(NE)	CPO020	NO TAKE NEXT 
EXIT	ABL	TDISP
	EJECT
* 
* 
*     DATA-REQUEST
* 
CLT100	CF	A15,GETLIN	GET DWT-ADDRESS
	SUR	A6,A4	VALID INTERRUPT ?
	RB(N)	EXIT 
	LDR	A8,A8
	RB(Z)	EXIT	EXIT NOT DEFINED
	LDR*	A6,A8	GET DWT 
	RB(E)	EXIT 
	ANKL	A6,/FFFE
	LCR	A7,A6	LEFT BYTE IN CHANNEL PARAMETER 
	ANK	A7,1	DATA INPUT ?
	RF(NE)	CLT110	YES
	LDR*	A7,A6	GET CHANNEL PARAMETER 
	RB(N)	EXIT 
CLT110	LD	A7,DWTOR,A6	SET ORDER IN A7 
	ANK	A7,/FF 
	LD	A8,DWTECB,A6	AND ECB-ADDRESS IN A8
	IFT	SOFTIM=1 
	LC	A3,DWTOCH,A6	GET LAST CHARACTER	=4
	ANK	A3,/7F		=4 
	SUK	A3,DUMMSP	SPECIAL DUMMY=ETX ?	=4 
	RF(NE)	CLT120	NO	=4
	LDR*	A3,A6	DEVICE WITHOUT DATA REQUEST ?	=9
	RF(N)	CLT120	YES, DO NOT TOUCH TIMER POINTER	=9
	LD	A3,DWTTP,A6	TIMER RUNNING ?	=4
	RF(E)	CLT120	NO	=4 
	INH			=4 
	CM*	DWTTP,A6	RESET TIMER	=4
	CM	DWTTP,A6	RESET ADDRESS POINTER TO TIMER	=4
CLT120	EQU	*		=4
	XIF
	LD	A3,DWTADR,A6	ADDRESS TO ADDRESS-BLOCK IN A3 
	ENB
	ABI	INTADR,A3	GO TO INTERRUPT HANDLER
* 
*   THE FOLLOWING REGISTER VAULES ARE VALID WHEN ENTERING 
*   THE DEVICE DEPENDANT INTERRUPT HANDLER:-
* 
*   A1 = ERROR CODE  (A1=0  NOERROR)
*                    (A1=1  NOT OPERABLE , HARDWARE TIME-OUT) 
*   A6 = DWT-ADDRESS
* 
*   A7 = ORDER
* 
*   A8 = ECB-ADDRESS
	EJECT
* 
*   G E T L I N 
* 
*   SUBROUTINE TO GET ADDRESS IN INTERRUPT TABLE 'INTLTX' 
*   FOR A GIVEN LINE- AND DEVICE NUMBER 
* 
*   ON ENTRY:-
* 
*   A3 = LINE NUMBER * 2
*   A4 = DEVICE NUMBER * 2
* 
*   ON EXIT:- 
* 
*   A6 = TOTAL NUMBER OF DEVICES*2 ON ACTUAL LINE 
*   A8 = ADDRESS IN 'INTLTX' WHERE DWT-ADDRESS IS FOUND 
* 
* 
GETLIN	EQU	*
	LD*	A8,CWTITA,A5	ADDRESS TO INTERRUPT TABLE
	RF(Z)	GTL010		=5 
	ADR	A8,A3	POSITION IN TABLE
	LDR*	A8,A8	ADDRESS TO TERMINAL SECTION 
	RF(Z)	GTL010	RETURN IF NOT DEFINED 
	LDR*	A6,A8	GET ID-WORD 
	ANK	A6,/FF	TWO TIMES NUMBER OF DEVICES 
	ADR	A8,A4	ADDRESS TO DEVICE WORK TABLE POSITION
GTL010	ABL	RTNA15	RETURN AND ENB
	EJECT
* 
*   O U T L I N 
* 
*   SUBROUTINE TO SEND ONE CHARACTER VIA CHANNEL UNIT.
* 
*     CHARACTER GIVEN IN A2 IS SENT VIA CHLT IF CONTROL 
*     UNIT IS FREE. IN OTHER CASE DWT IS QUEUED ON A
*     OUTPUT QUEUE THREAD.
* 
*     ON ENTRY: 
* 
*     A2 = OUTPUT CHARACTER IN RIGHT BYTE 
*     A6 = DWT-ADDRESS
* 
OUTLIN	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
* 
	IFF	LOCHAN=1 
* 
	LDR*	A1,A6	CHANNEL PARAMETER 
	ANK	A1,/F	CHANNEL INDEX
	SLL	A1,1 
	ADK	A1,2 
	LD	A1,CHTAB,A1	GET CWT-ADDRESS IN A1 
* 
	XIF
* 
* 
	IFT	LOCHAN=1 
* 
	LDKL	A1,CWTLT1 
* 
	XIF
* 
	INH		INHIBIT INTERRUPT 
	LDR*	A4,A1	IS UNIT FREE ?
	RF(E)	OUL050	YES 
	EJECT
* 
*    QUEUE OUTPUT 
* 
OUL005	LD	A4,CWTEQ,A1	OUTPUT QUEUE
	RF(E)	OUL020 
OUL010	CWR	A6,A4
	RF(E)	OUL060	THIS DWT IS ALREADY IN QUEUE
	LD	A3,DWTOTQ,A4
	RF(E)	OUL030	END OF THREAD FOUND 
	LDR	A4,A3	FOLLOW THE THREAD
	RB	OUL010
OUL020	ST	A6,CWTEQ,A1	QUEUE DWT 
	RF	OUL040
OUL030	ST	A6,DWTOTQ,A4	QUEUE DWT
OUL040	CM	DWTOTQ,A6	SET END OF THREAD 
	RF	OUL060
	EJECT
* 
*    SEND CHARACTER 
* 
OUL050	LDR*	A3,A6	GET CHANNEL PARAMETERS
	ANKL	A3,/7F00
	ANK	A2,/FF 
	ORR	A2,A3
OUL055	EQU	*
	EX	CWTOTR,A1	EXECUTE OTR-INSTRUCTION 
	RB(NA)	OUL005
	STR	A6,A1	STORE LAST DWT IN CWT
	IFT	LOGING=1 
	CF	A15,LOGG	** LOGG OF OUTPUT CHARACTER ** 
	XIF
	ST	A2,CWTLOW,A1	STORE LAST OUTPUT IN CWT	=6(=3)
OUL060	SC	A2,DWTOCH,A6	STORE OUTPUT CHARACTER IN DWT
OUL070	EQU	*
	IFT	CPU852=1 
	ABL	IHRET8	RESTORE A1-A8 AND RETURN
	XIF
* 
	IFT	CPU852=0 
	MLR	8,A15	RESTORE A1-A8 FROM STACK...
	INH		U	=9
	ADKL	A15,2	...AND	=9 
	LDR*	P,A15	       RETURN	=9
	XIF
* 
	EJECT
* 
*   C H L T O N 
* 
*   SUBROUTINE TO RESET CWT AND PERFORM CIO-START OF EVERY
*   CHLT IN SYSTEM. THE SUBROUTINE IS ENTERED FROM 'PFINIT' 
* 
CHLTON	EQU	*
* 
	IFF	LOCHAN=1 
* 
	LD	A1,CHTAB
CON010	SUK	A1,2	ALL TREATED ? 
	RF(NZ)	CON020	NO TAKE NEXT 
	ABL	RTNA15	RETURN AND ENB
CON020	LD	A5,CHTAB,A1	LOAD CWT-ADDRESS
	RB(Z)	CON010 
	EX	CWTCIS,A5	EXECUTE CIO-START 
	LDR*	A6,A5	GET LAST DWT
	RB(Z)	CON010 
	CMR	A5	RESET LAST OUTPUT 
	LDK	A2,0 
	CF	A15,OUTLIN	SEND CHARACTER 
	RB	CON010
* 
* 
	XIF
* 
* 
	IFT	LOCHAN=1 
* 
	CIO	A2,1,DWA1	CIO-START
	LD	A6,CWTLT1	GET LAST DWT
	RF(Z)	CON010 
	CM	CWTLT1	RESET LAST OUTPUT
	LDK	A2,0 
	CF	A15,OUTLIN	SEND CHARACTER 
CON010	ABL	RTNA15	RETURN AND ENB
* 
	XIF
* 
	EJECT
* 
*   O U T P U T 
* 
*   SEND ONE CHARACTER VIA 'OUTLIN' INDICATE INTERRUPTS 
*   ALLOWED AND SAVE A3-A5 IN DWT.
* 
* 
OUTPUT	EQU	*
	ANK	A2,/FF 
	LDR	A1,A2
	SUK	A1,/82	STX ? 
	RF(E)	LDRE10 
	SUK	A1,/15	ETB ? 
	RF(E)	LDRE10 
	CF	A15,OUTLIN	SEND ONE CHARACTER VIA CHANNEL UNIT
* 
* 
*   S T R E G 
* 
*   INDICATE INTERRUPTS ALLOWED AND SAVE A3-A5 IN DWT 
* 
* 
STREG	EQU	* 
	INH
	LDKL	A1,/100 
	ORS	A1,DWTST,A6	INDICATE INTERRUPTS ALLOWED
	ST	A3,DWTA3,A6	SAVE REGISTER A3
	ST	A4,DWTA4,A6	              A4
	ST	A5,DWTA5,A6	              A5
	ABL	EXIT		=7 
	EJECT
* 
*   L D R E G 
* 
*   IF INTERRUPT ALLOWED RESTORE A3-A5 FROM DWT AND RETURN
*   VIA A5. ELSE GO TO DISPATCHER.
* 
* 
LDREG	EQU	* 
	LD	A3,DWTST,A6 
	ANKL	A3,/100 
	ABL(Z)	EXIT		=4
	XRS	A3,DWTST,A6
* 
* 
*   L D R E G E 
* 
*   RESTORE A3-A5 FROM DWT AND RETURN TO USER VIA A5
* 
* 
LDREGF	EQU	*
	LD	A5,DWTA5,A6	                A5
LDREGE	EQU	*
	LD	A3,DWTA3,A6	RELOAD REGISTER A3
	LD	A4,DWTA4,A6	                A4
LDRE10	LD	A7,DWTOR,A6	GET ORDER 
	ANK	A7,/FF 
	LD	A8,DWTECB,A6
	RTN	A5	RETURN VIA A5-STACK 
	EJECT
* 
* 
*    G E T C H R
* 
*    SUBROUTINE TO GET ONE CHARACTER FROM ECB-BUFFER
* 
*    ON ENTRY:
* 
*    A3 = BUFFER INDEX
*    A8 = ECB-ADDRESS 
* 
*    ON EXIT: 
* 
*    A2 = CHARACTER 
*    A1 = 0 IF LAST CHARACTER ELSE # 0
* 
*    IF LAST CHARACTER IS REACHED A3 IS STORED IN ECB EFFECTIVE LENGTH
* 
* 
GETCHR	EQU	*
	LD	A1,4,A8	REQUESTED LENGTH
	SUR	A1,A3
	RF(NP)	GCH010	LAST CHARACTER REACHED 
	LD	A2,2,A8	GET BUFFER ADDRESS
	ADR	A2,A3
	LCR	A2,A2	CHAR. TO A2
	ANK	A2,/FF 
	ADK	A3,1	INCREMENT BUFFER INDEX
	RF	GCH020
GCH010	ST	A3,6,A8	STORE EFFECTIVE LENGTH
GCH020	EQU	*
RTNA15	ADKL	A15,2	RETURN AND ENABLE 
	ENB
	LDR*	P,A15 
	EJECT
* 
* 
*   L O G G 
* 
*   IF CONDITIONALY ASSEMBLY IS SET EVERY INPUT AND 
*   OUTPUT CHARACTER ARE LOGGED 
* 
* 
* 
	IFT	LOGING=1 
* 
LOGG	STR	A1,A15 
	LD	A1,POINT
	ADK	A1,2 
	CWK	A1,BUFE	BUFE IS MAX LOGG AREA
	RF(NE)	L1
	LDKL	A1,BUF	SET FIRST LOGG ADDRESS 
L1	ST	A1,POINT
	STR	A2,A1	LOGG OF INR OR OTR INSTRUCTION 
	LDR*	A1,A15
	ADKL	A15,2 
	LDR*	P,A15	RETURN
* 
* 
POINT	DATA	BUF	LOGG POINTER 
* 
BUF	RES	63	LOGG AREA
BUFE	EQU	*
* 
	XIF
	EJECT
* 
* 
*    E C H O , E C H E N D
* 
*    SUBROUTINE TO ECHO CHARACTER CONTAINING TWO PARTS, 
*    ONE GENERAL AND ONE DEVICE-DEPENDENT 
* 
*    PART ONE: FIND DWT-ADDRESS OF ECHO-DEVICE, 
*              LOAD STACKBASE AND FIND ADDRESS
*              TO DEVICE-DEPENDENT ECHO-ROUTINE 
* 
*    PART TWO: ECHO ONE OR MORE CHARACTERS
*              CORRESPONDING TO ONE CHARACTER 
*              TO BE STORED IN INPUT ECB-BUFFER 
* 
* 
*    PART ONE FOLLOWS AND PART TWO CAN BE FOUND 
*    IN THE DRIVER MODULE CORRESPONDING TO ECHO 
*    OUTPUT DEVICE
* 
*    RESTRICTIONS IN DEVICE DEPENDENT ECHO DRIVER 
* 
*    A7 MUST NOT BE DESTROYED 
*    THE ECHO-ROUTINE SHOULD BE TERMINATED WITH A 
*    JUMP TO 'ECHRTN'.
* 
ECHEND	EQU	*
* 
	IFT	CECHO=1
* 
	LDKL	A7,/8000	INDICATE END I/O 
	XIF
ECHO	EQU	*
	IFT	CECHO=1
	ST	A3,DWTA3,A6	SAVE A3-A5 IN DWT 
	ST	A4,DWTA4,A6 
	ST	A5,DWTA5,A6 
	LD	A1,DWTST,A6	STATUS
	SLL	A1,2 
	RF(NN)	RETUR	NO ECHO REQUESTED 
	LDR	A4,A6	SAVE DWT-ADDRESS OF INPUT DEVICE 
	LD	A6,DWTECH,A6	DWT-ADDRESS OF OUTPUT DEVICE 
	ST	A4,DWTWAT,A6	SAVE DWT-ADDRESS OF INPUT DEVICE 
	LDKL	A5,DWTSB2 
	ADR	A5,A6	STACKBASE-ADDRESS IN A5
	LD	A1,DWTADR,A6	ADDRESS TO ADDRESS-BLOCK 
	ABI	ECHADR,A1	GO TO ECHO-ROUTINE DEVICE-DEPENDENT
	XIF
ECHRTN	EQU	*
	IFT	CECHO=1
	LDR	A7,A7	END? 
	RF(NN)	ERETUR	NO 
	CF	A15,TENDIO	END I/O OUTPUT DEVICE
ERETUR	LD	A6,DWTWAT,A6	RELOAD DWT-ADDRESS OF INPUT DEVICE 
RETUR	ABL	LDREGF	RELOAD A3-A5 AND RETURN VIA A5 
* 
	END

Full view