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

⟦6a8a85647⟧

    Length: 14222 (0x378e)
    Notes: pts_type(SC)
    Names: »DRIC01.SC«

Derivation

└─⟦dab19bdd7⟧ Bits:30009677 Philips computer tape "600218"
    └─⟦this⟧ »M:261/DRIC01.SC« 

PTS(SC)

	IDENT DRIC01 	9.2DK 0 80-01-02  870105040920 

			=DK0, MMU BUF SIZE 
			80-03-11 
* 
* 
**********************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRIC01 = INTERTASK COMMUNICATION HANDLER
* 
* 
* 
* 
* 
* 
**********************************************
* 
*   THIS MODULE HANDLES THE INTERTASK COMMUNICATION 
* 
	EJECT			DRIC01 
* 
*   ORDERS: 
* 
*   /02  READ, NOT ADDRESSED
*   /06  WRITE, NOT ADDRESSED 
*   /0A  READ, ADDRESSED
*   /0B  WRITE, ADDRESSED 
*   /39  SET TIMEOUT
* 
*   ENTRY PARAMETERS: 
* 
*   A5   STACK BASE 2 
*   A6   DWT ADDRESS
*   A7   ORDER CODE 
*   A8   ECB ADDRESS
*  A12   ADDRESS TO DRIVER ADDRESS BLOCK
* 
	EJECT			DRIC01 
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	ITAD	ADDRESS BLOCK 
	ENTRY	ITABRT	ABORT INTERTASK REQUEST 
	ENTRY	IT:BUF	INTERTASK DRIVER BUFFER (MMU) 
	EJECT			DRIC01 
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	TENDIO	ENDIO 
	EXTRN	DISIOE	REQUEST ERROR 
	EXTRN	DISEND	TENDIO AND DISPATCH 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTECB	ECB ADDRESS 
	EXTRN	DWTADR	DRIVER ADDRESS BLOCK
	EXTRN	DWTTAB	DWT TTAB ADDRESS
	EXTRN	DWTSB1	STACK BASE 1 IN DWT 
	EXTRN	BUFLEN	DRIVER BUFFER LENGTH
	EXTRN	SETIMP	TIMER 
	EXTRN	FNDTID	FIND TTAB ADDRESS FROM TID
	EXTRN	TTB:ST	TASK STATUS 
	EXTRN	TTB:TD	TERMINAL DEVICES
	EXTRN	IHRTN	RTN A15 WITHOUT ENABLING INTERRUPTS
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUESTED LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE LENGTH 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	ECBCW	ECB CONTROL WORD 
	EJECT			DRIC01			TOSSIO
* 
* 
***************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
***************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	1
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	0
* 
*	MMU BUFFER SIZE 
* 
X:A	EQU	50
X:Q	EQU	575		DK0
DVBLEN	EQU	575+X:Q		DK0 
* 
*	INTERTASK DEVICE INDEX
* 
X:B	EQU	8 
DEVIND	EQU	X:B
* 
	EJECT			DRIC01 
* 
* 
********************* 
* 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 
DWTIME	EQU	START+/02	TIME 
DWTANC	EQU	START+/04	POINTER TO FIRST DWT IN QUEUE
DWTQUE	EQU	START+/06	QUEUE ANCHOR ADDRESS 
* 
	EJECT			DRIC01 
* 
* 
***************** 
* ADDRESS BLOCK * 
***************** 
* 
* 
	DATA	DVBLEN+DVBLEN	MMU BUFFER SIZE 
	DATA	DEVIND	INTERTASK DEVICE INDEX 
ITAD	DATA	ICAD	ACTIVATION ADDRESS 
	DATA	ITABRT	ABORT ADDRESS
* 
* 
RD:QUE	DATA	0	QUEUE ANCHOR NOT ADDRESSED READ REQ.
WR:QUE	DATA	0	QUEUE ANCHOR NOT ADDRESSED WRITE REQ. 
* 
*	INTERTASK DRIVER BUFFER (MMU) 
* 
IT:BUF	EQU	*
	IFT	MMUPAG=1 
 	RES	DVBLEN+1	MMU BUFFER 
	XIF
* 
	EJECT			DRIC01 
* 
*	A C T I V A T I O N 
* 
ICAD	EQU	*
	LDR	A1,A7	ORDER CODE TO A1 
	SUK	A1,2 
	RF(Z)	RD:NAD	READ NOT ADDRESSED? 
	SUK	A1,4 
	ABL(Z)	WR:NAD	WRITE NOT ADDRESSED? 
	SUK	A1,4 
	RF(Z)	RD:ADR	READ ADDRESSED? 
	SUK	A1,1 
	RF(Z)	WR:ADR	WRITE ADDRESSED?
	SUK	A1,/2E 
	RF(NZ)	DIS:OE	REQUEST ERROR? 
* 
*   	S E T   T I M E O U T
* 
	LD	A2,ECBCW,A8	GET TIME
	ST	A2,DWTIME,A6
	RF	END:IO
* 
	EJECT			DRIC01 
* 
*	R E A D, A D D R E S S E D
* 
*	W R I T E, A D D R E S S E D
* 
RD:ADR	EQU	*	READ, ADDRESSED
WR:ADR	EQU	*	WRITE, ADDRESSED 
* 
*   	FIND TTAB OF ADDRESSED TASK
* 
	LD	A7,ECBCW,A8	TID 
	CF	A15,FNDTID	TTAB ADDRESS TO A2 
	ADK	A2,0	SET CR
	RF(Z)	DIS:OE	NOT FOUND?
	CW	A2,DWTTAB,A6
	RF(E)	DIS:OE	ILLEGAL TID?
	ADKL	A2,TTB:TD	ADDRESS TO TERMINAL DEVICE TABLE
	LDR*	A1,A2	TABLE LENGTH
	LDR	A7,A12	DRIVER ADDRESS BLOCK
	XRK	A7,1	IF INPUT, POINT TO OUTPUT BLOCK AND V.V.
* 
	EJECT			DRIC01 
* 
*   	FIND DWT OF ADDRESSED TASK 
* 
ADR:20	ADK	A2,4	ADDRESS TO NEXT DWT ADDRESS 
	SUK	A1,4 
	RF(N)	DIS:OE	NOT FOUND?
* 
	LDR*	A4,A2	DWT ADDRESS 
	CW	A7,DWTADR,A4	SEARCHED DWT?
	RB(NE)	ADR:20	NO, TRY NEXT 
* 
	LDR	A2,A4
	LD	A1,DWTST,A2	ANY REQUEST?
	RF(N)	ADR:40	NO! 
* 
	LD	A1,DWTQUE,A2	GET QUEUE ANCHOR ADDRESS 
	CWR	A1,A6	CHECK QUEUE ANCHOR 
	RF(E)	ADR:30	REQUEST ISSUED FOR THIS TASK? 
* 
	ANK	A7,1 
	RF(Z)	ADR:25	READ? 
	CWK	A1,RD:QUE
	RF(E)	ADR:30	COMPLEMENTARY REQUEST?
	RF	ADR:50	NO 
* 
	EJECT			DRIC01 
* 
* 
ADR:25	CWK	A1,WR:QUE
	RF(NE)	ADR:50	NO COMPLEMENTARY REQUEST?
* 
*   	ABORT TIMER IF ANY 
* 
ADR:30	CF	A15,ITAB05	ABORT TIMER AND REMOVE DWT FROM QUEUE
	ANK	A7,1 
	RF(Z)	RD:N05	READ? 
* 
*   	MOVE BUFFER
* 
ADR:35	EQU	*
	LDKL	A5,DWTSB1	GET STACK BASE
	ADR	A5,A6
	CF	A5,MOVBUF 
	CF	A15,TENDIO	END WRITE
	LDR	A6,A2
* 
	IFT	MMUPAG=1 
	LD	A3,ECBBA,A8	GET SENDING BUFFER ADDRESS
	ANK	A3,1 
	RF(Z)	ADR:38	BUFFER ADDRESS EVEN?
	ORS	A3,ECBBA,A9	MAKE RECEIVING BUFFER ADDRESS UNEVEN 
	RF	END:IO
* 
ADR:38	EQU	*
	SUK	A3,2	A3 := /FFFE 
	ANS	A3,ECBBA,A9	MAKE RECEIVING BUFFER ADDRESS EVEN 
	XIF
* 
END:IO	CF	A15,TENDIO	END READ 
* 
T:DISP	ABL	TDISP
* 
	EJECT			DRIC01 
* 
*	OUEUE REQUEST 
* 
ADR:40	LDK	A7,0	INDICATE ADDRESSED REQUEST
* 
ADR:50	EQU	*
	LD	A3,DWTIME,A6	TIME 
	RF(Z)	TWR:30 
	ADK	A3,1 
	RF(Z)	ADR:70	NO TIMING WANTED? 
	SUK	A3,1 
	RF(N)	DIS:OE	NEGATIVE TIME?
	LDR	A1,A6	DWTOUT = PARAM. WHEN WRITE, ELSE DWTIN 
	LDK	A4,DWTTP 
	ADR	A4,A6	TIMER POINTER
	ST	A3,TIME 
	CF	A15,SETIMP	SET TIMER
	DATA	TIMOUT	TIMEOUT ADDRESS
TIME	DATA	0 
* 
	EJECT			DRIC01 
* 
*   	INSERT IN QUEUE WITHIN PRIORITY
* 
ADR:70	EQU	*
	ST	A2,DWTQUE,A6	STORE QUEUE ANCHOR IN DWT
	LD	A5,DWTTAB,A6	TTAB ADDRESS 
	LD	A1,TTB:ST+1,A5	LEVEL
	SUK	A7,1 
	RF(P)	ADR:80	NOT-ADDRESSED REQUEST?
	ADK	A2,DWTANC	POINT TO ADDRESS OF FIRST DWT IN QUEUE 
* 
ADR:80	LDR	A4,A2	SAVE 
	LDR*	A2,A2	NEXT IN QUEUE 
	RF(Z)	ADR:90	END FOUND?
	LD	A5,DWTTAB,A2	TTAB ADDRESS 
	CC	A1,TTB:ST+1,A5	COMPARE LEVELS 
	RB(NL)	ADR:80
* 
ADR:90	STR	A2,A6	INSERT IN QUEUE
	STR	A6,A4
	RB	T:DISP
* 
DIS:OE	ABL	DISIOE	REQUEST ERROR 
* 
	EJECT			DRIC01 
* 
*	R E A D, N O T  A D D R E S S E D 
* 
RD:NAD	EQU	*	READ, NOT ADDRESSED
	LD	A2,DWTANC,A6	CHECK QUEUE OF ADDRESSED WRITE REQUESTS
	RF(NZ)	RD:N10	ANYTHING IN QUEUE? 
	LD	A2,WR:QUE	CHECK QUEUE OF NOT ADDRESSED WRITE REQ. 
	RF(Z)	RD:N20	QUEUE EMPTY?
	LDR*	A3,A2	NO, REMOVE FROM QUEUE 
	ST	A3,WR:QUE	UPDATE QUEUE ANCHOR 
* 
RD:N00	EQU	*
	CF	A15,ABTIM2	ABORT TIMER IF ANY 
* 
RD:N05	EQU	*
	LDR	A4,A6	EXCHANGE A2 AND A6 
	LDR	A6,A2
	LDR	A2,A4
	RB	ADR:35
* 
RD:N10	LDR*	A3,A2	REMOVE FROM QUEUE 
	ST	A3,DWTANC,A6	UPDATE QUEUE ANCHOR
	RB	RD:N00
* 
RD:N20	LDKL	A2,RD:QUE	GET RD:QUE ADDRESS
	RB	ADR:50	INSERT IN QUEUE
* 
	EJECT			DRIC01 
* 
*	W R I T E, N O T  A D D R E S S E D 
* 
WR:NAD	EQU	*	WRITE, NOT ADDRESSED 
	LD	A2,DWTANC,A6	CHECK QUEUE OF ADDRESSED READ REQUESTS 
	RF(NZ)	WR:N10	ANYTHING IN QUEUE? 
	LD	A2,RD:QUE	CHECK QUEUE OF NOT ADDRESSED READ REQ.
	RF(Z)	WR:N20	QUEUE EMPTY?
	LDR*	A3,A2	NO, REMOVE FROM QUEUE 
	ST	A3,RD:QUE	UPDATE QUEUE ANCHOR 
* 
WR:N05	CF	A15,ABTIM2	ABORT TIMER IF ANY 
	RB	ADR:35
* 
WR:N10	LDR*	A3,A2	REMOVE FROM QUEUE 
	ST	A3,DWTANC,A6	UPDATE QUEUE ANCHOR
	RB	WR:N05
* 
WR:N20	LDKL	A2,WR:QUE	GET WR:QUE ADDRESS
	RB	ADR:50
* 
	EJECT			DRIC01 
* 
*	T I M E O U T 
* 
TIMOUT	LDR	A6,A1	DWT ADDRESS
	CM*	0,A2	RESET TIMER POINTER 
	LDR	A2,A6
	CF	A15,ITAB10	REMOVE FROM QUEUE
* 
TWR:30	EQU	*
	CMR	A6	RESET QUEUE LINK
	LDK	A1,/40	RETURN CODE 
	RB	END:IO
* 
	EJECT			DRIC01 
* 
*	I T A B R T 
* 
*  THIS SUBROUTINE IS CALLED FROM TABORT. 
*  IT WILL UPDATE QUEUE AND ABORT TIMER (IF ANY). 
* 
*  INPUT:  A6 = DWT ADDRESS 
* 
*  OUTPUT: A1-A4 ARE DESTROYED
* 
ITABRT	EQU	*
	LDR	A2,A6
* 
ITAB05	EQU	*
	CF	A15,ABTIM	ABORT TIMER 
* 
*	REMOVE DWT FROM QUEUE 
* 
ITAB10	EQU	*
	LD	A1,DWTQUE,A2	GET QUEUE ACHHOR 
	CWK	A1,RD:QUE
	RF(E)	ITAB20	NOT-ADDRESSED READ REQUEST? 
	CWK	A1,WR:QUE
	RF(E)	ITAB20	NOT-ADDRESSED WRITE REQUEST?
	ADK	A1,DWTANC	POINT TO ADDRESS OF FIRST DWT IN QUEUE 
* 
	EJECT			DRIC01 
* 
* 
ITAB20	LDR	A4,A1	SAVE 
	LDR*	A1,A1	NEXT IN QUEUE 
	CWR	A1,A2	SEARCHED DWT?
	RB(NE)	ITAB20	NO!
	LDR*	A3,A1	REMOVE FROM QUEUE 
	STR	A3,A4	UPDATE QUEUE LINKS 
	CMR	A2	RESET QUEUE LINK
* 
	IFT	CPU852=1 
	RF	IH:RTN
	XIF
* 
	IFT	CPU852=0 
	RTN	A15
	XIF
* 
	EJECT			DRIC01 
* 
*	A B T I M 
* 
*  SUBROUTINE FOR ABORTING TIMER (IF ANY).
* 
*  INPUT:  A2 = DWT ADDRESS 
* 
*  OUTPUT: A1, A3 ARE DESTROYED 
* 
ABTIM2	EQU	*
	CMR	A2	RESET QUEUE LINK
* 
ABTIM	LDK	A1,DWTTP
	ADR	A1,A2	TIMER POINTER ADDRESS
	LDR*	A3,A1 
	RF(Z)	IH:RTN	NO TIMER ACTIVE?
	CM*	0,A1 
	CMR	A1	INDICATE NO TIMER SET 
* 
	IFT	CPU852=1 
IH:RTN	ABL	IHRTN
	XIF
* 
	IFT	CPU852=0 
IH:RTN	RTN	A15
	XIF
* 
	EJECT			DRIC01 
* 
*	M O V B U F 
* 
*   SUBROUTINE TO MOVE BUFFER FROM SENDING TASK 
*   TO ADDRESSED TASK.
*   EFFECTIVE LENGTH IN BOTH INPUT AND OUTPUT ECB ARE SET.
*   A1 WILL CONTAIN RETURN CODE /8 IF SENDING REQUESTED LENGTH
*   WAS GREATER THAN RECEIVING REQUESTED LENGTH.
*   TENDIO WILL PERFORM THE MOVE IN SYSTEMS WITH MMU. 
* 
*   INPUT PARAMETERS: 
*   A2  RECEIVING DWT 
*   A5  STACK POINTER 
*   A6  SENDING DWT 
* 
*   REGISTER USAGE: 
*   A1  RETURN CODE 
*   A2  DWT RECEIVING TASK
*   A3  WORKING REGISTER
*   A4  BUFFER POINTER
*   A5  STACKPOINTER
*   A6  DWT SENDING TASK
*   A7  RECEIVING BUFFER POINTER
*   A8  ECB ADDRESS SENDING TASK
*   A9  ECB ADDRESS RECEIVING TASK
* 
MOVBUF	EQU	*
	LD	A8,DWTECB,A6	SENDING ECB
	ENB		GIVE OTHER TASKS A CHANCE 
* 
	EJECT			DRIC01 
* 
* 
	LDK	A1,0 
	LD	A9,DWTECB,A2	RECEIVING ECB
	LD	A3,ECBRL,A8	SENDING REQUESTED LENGTH
	RB(N)	DIS:OE 
	CW	A3,ECBRL,A9 
	RF(NG)	MOV:05
	LDK	A1,8	RETURN CODE (INCORRECT LENGTH)
	LD	A3,ECBRL,A9 
	RB(N)	DIS:OE 
* 
MOV:05	EQU	*
	IFT	MMUPAG=1 
	LDKL	A4,ITAD	GET ADDRESS TO DRIVER ADDRESS BLOCK 
	CW	A3,BUFLEN,A4	CHECK MMU BUFFER SIZE
	RF(NG)	MOV:10	MMU BUFFER LARGE ENOUGH? 
	LDKL	A1,/8008	NO, INDICATE ERROR 
	ABL	DISEND	BRANCH TO DISPATCHER VIA TENDIO 
* 
MOV:10	EQU	*
	XIF
* 

	ST	A3,ECBEL,A8	EFFECTIVE LENGTH
	ST	A3,ECBEL,A9	EFFECTIVE LENGTH
* 
	EJECT			DRIC01 
* 
* 
	IFT	MMUPAG=0 
	LD	A4,ECBBA,A8	SENDING BUFFER ADDRESS
	LD	A7,ECBBA,A9	RECEIVING BUFFER ADDRESS
* 
MOV:15	EQU	*
	SUK	A3,1 
	RF(N)	MOV:20	ALL CHARACTERS MOVED? 
	LCR	A9,A4
	SCR	A9,A7
	ADK	A4,1 
	ADK	A7,1 
	RB	MOV:15
* 
MOV:20	EQU	*
	XIF
* 
	INH
	RTN	A5 
* 
* 
* 
	END

Full view