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

⟦88912c92e⟧

    Length: 14178 (0x3762)
    Notes: pts_type(SC)
    Names: »TDISPO.SC«

Derivation

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

PTS(SC)

	IDENT TDISPO 	REL 8.2 78-09-15  870105040820 

* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   TDISP = TERMINAL DISPATCHER 
* 
* 
* 
* 
* 
* 
**************************************************
* 
* 
* 
*   THIS IS THE TERMINAL DISPATCHER IN TOSS.
*   ENTRY POINT IS 'TDISP' WITH 8 REGISTERS ON A15 STACK. 
*   THE DISPATCHER CHECKS IF THERE IS A JOB IN DISPATCHER-
*   QUEUE WITH HIGHER PRIORITY THAN INTERRUPTED PROGRAM.
*   - IF SO THE QUEUED PROGRAM IS STARTED AND REGISTERS 
*     A1-A14 OF INTERRUPTED PROGRAM ARE SAVED ON A15 STACK. 
*   - IF NOT RETURN IS GIVEN TO INTERRUPTED PROGRAM VIA RETUR8. 
* 
*   AN ENTRYPOINT 'LKMDIS' IS ALSO INCLUDED IN THIS MODULE. 
*   THIS PART IS DISPATCHED AFTER EACH LKM-REQUEST.(NO REGISTERS
*   ON STACK) A CHECK IS MADE IF THERE IS A JOB IN DISPATCHER QUEUE 
*   WITH HIGHER PRIORITY THAN INTERRUPTED PROGRAM.
*   - IF QUEUED JOB IS STARTED
*   - IF NOT RETURN IS GIVEN TO INTERRUPTED PROGRAM VIA RETU14. 
* 
* 
*   AN OPTIONALY ENTRYPOINT 'DISIOE' IS ALSO PROVIDED FOR 
*   ERRORS IN I/O DRIVERS. BIT 0 IS SET IN A1 AND THE SUB-
*   ROUTINE 'TENDIO' IS CALLED BEFORE THE 'TDISP'-ENTRY 
*   IS ENTERED. 
*   ENTRY 'DISEND' ONLY CALLS 'TENDIO' BEFORE 'TDISP'-ENTRY.
	EJECT
* 
*********** 
* ENTRIES * 
*********** 
* 
	ENTRY	TDISP	DISPATCHER ENTRY 
	ENTRY	LKMDIS	DISPATCHED AFTER LKM
	ENTRY	DISIOE	I/O ERROR ENTRY 
	ENTRY	DISEND	END I/O AND DISPATCH
	ENTRY	DISQUE	POINTER TO FIRST PLACE IN DISPATCHER-QUEUE
	ENTRY	GBQUE	POINTER TO FIRST TTAB IN BUFFER QUEUE
	ENTRY	PRUN	TTAB-ADDRESS OF RUNING PROGRAM
	ENTRY	SRUN	POINTER TO RUNNING SEGMENT IN LSBT
	ENTRY	SACT	POINTER TO ACTIVE SEGMENT 
	ENTRY	LRUNEW 
	ENTRY	LRUQUE	POINTER TO FIRST SEGMENT IN LRU-STACK 
	ENTRY	LDPEND	LOAD PENDING.LDTASK IN PAUSE
	ENTRY	RETU14	RESTORE REGISTER A14-A1 VIA A15 STACK 
	ENTRY	RETU13 
	ENTRY	RETU12 
	ENTRY	RETU11 
	ENTRY	RETU10 
	ENTRY	RETUR9 
	ENTRY	RETUR8 
	ENTRY	RETUR7 
	ENTRY	RETUR6 
	ENTRY	RETUR5 
	ENTRY	RETUR4 
	ENTRY	RETUR3 
	ENTRY	RETUR2 
	ENTRY	RETUR1 
	ENTRY	RTNA15 
	ENTRY	UPDLRI	SUBROUTINE TO UPDATE LRUQUEUE 
	ENTRY	FREQUE 
	ENTRY	BLOCKL 
	EJECT
	ENTRY	DWTCHP	CHANNEL PARAMETER 
	ENTRY	DWTST	STATUS 
	ENTRY	DWTECB	ECB ADDRESS 
	ENTRY	DWTOR	ORDER
	ENTRY	DWTADR	POINTER TO ADDRESS-BLOCK
	ENTRY	DWTTAB	TTAB-ADDRESS
	ENTRY	DWTWAT	WAIT ACTIVATE INDICATOR 
	ENTRY	DWTTQ	TERMINAL QUEUE 
	ENTRY	DWTWA	WORK AREA
	ENTRY	DWTTDM	DM REQUEST TTAB ADDRESS 
	ENTRY	DWTVOL	VOLUME NAME 
	ENTRY	ECBBA,ECBRL,ECBEL
	ENTRY	ECBRC,ECBCW
	EJECT
* 
************* 
* EXTERNALS * 
************* 
* 
*   DISPLACEMENT IN TTAB
* 
	EXTRN	TTB:SS	START OF SEGMENT
	EXTRN	TTB:SP	SGMENT POINTER
	EXTRN	TTB:SA	SAVE AREA 
	EXTRN	TTB:ST	STATUS
	EXTRN	TENDIO	END I/O 
	EXTRN	EXIT	PROGRAM EXIT
	EXTRN	BLOK:S	START OF BLOCK POOL 
	EXTRN	BLOCKE	BLOCK POOL LENGTH 
	EXTRN	ACTOT
	EXTRN	QTJOB
	EXTRN	GETBLK 
	EXTRN	LDTASK 
	EXTRN	TTABLD 
* 
************* 
* CONSTANTS * 
************* 
* 
* 
CVTLSB	EQU	/9A	START ADDRESS OF LOAD SEGM BLK 
			FIRST WORD CONTAINS LSBT-LENGTH
	EJECT

* 
******************************************
* 
*   DWT-DISPLACEMENT DECLARATIONS 
* 
***************************************** 
* 

DWTCHP	EQU	0	CHANNEL PARAMETER
DWTST	EQU	2	STSTUS
DWTECB	EQU	4	ECB-ADDRESS
DWTOR	EQU	6	ORDER 
DWTADR	EQU	8	ADDRESS BLOCK POINTER
DWTTAB	EQU	10	TTAB-ADDRESS
DWTWAT	EQU	12	WAIT/ACTIVATE INDICATOR 
DWTTQ	EQU	14	TERMINAL QUEUE 
DWTWA	EQU	16	WORK AREA
DWTTDM	EQU	16	DM REQUEST TTAB ADDRESS 
DWTVOL	EQU	44	VOLUME NAME 
	EJECT
* 
******************************
* 
*   ECB-DISPLACEMENTS 
* 
******************************
* 
ECBBA	EQU	/02 
ECBRL	EQU	/04 
ECBEL	EQU	/06 
ECBRC	EQU	/08 
ECBCW	EQU	/0A 
* 
	EJECT
* 
*   D I S Q U E 
*   POINTER TO FIRST PLACE IN DISPATCHER QUEUE
* 
DISQUE	EQU	*
	DATA	0 
* 
*   P R U N 
*   TTAB-ADDRESS OF RUNING PROGRAM
* 
PRUN	EQU	*
	DATA	0 
* 
*   S R U N 
*   POINTER TO RUNNING SEGMENT IN LSB-TAB 
* 
SRUN	EQU	*
	DATA	0 
* 
* 
*   POINTER TO ACTIVE SEGMENT 
* 
SACT	EQU	*
	DATA	0 
*   G B Q U E 
*   POINTER TO FIRST TASK TABLE IN BUFFER QUEUE 
* 
GBQUE	EQU	* 
	DATA	0 
FREQUE	DATA	BLOK:S
BLOCKL	DATA	BLOCKE
* 
*   L R U Q U E 
*   POINTER TO FIRST SEGMENT IN 'LEAST RECENTLY USED' PARTITION LINK
* 
LRUQUE	EQU	*
	DATA	0 
* 
*   L D P E N D 
*   SEGMENT LOAD PENDING. LDTASK IN 'PAUSE' 
LDPEND	DATA	0 
* 
	EJECT
* 
*   D I S I O E 
* 
*   SET BIT 0 IN ECB RETURN CODE AND GO TO TDISP-ENTRY
* 
DISIOE	EQU	*
	LDKL	A1,/8000	SET RETURN CODE
* 
DISEND	EQU	*
	CF	A15,TENDIO
	EJECT
* 
* 
*   T D I S P 
* 
*   THIS IS THE DISPATCHER ENTRY
* 
TDISP	EQU	* 
	INH
	LD	A1,18,A15	LOAD PSW FROM STACK 
	SRL	A1,10	GET LEVEL
	LD	A5,DISQUE 
	ABL(Z)	SEGDIS	NO QUEUE,RETURN THROUGH SEGDIS 
	CC	A1,TTB:ST+1,A5	AND COMPARE WITH QUEUED LEVEL
	ABL(NG)	SEGDIS	RETURN TO INTERRUPTED PROGRM THRU SEGDIS
	STR	A9,A15	SAVE A9-A14 ON STACK
	STR	A10,A15
	STR	A11,A15
	STR	A12,A15
	STR	A13,A15
	STR	A14,A15
	LD	A1,PRUN 
	STR	A1,A15	SAVE PRUN ON STACK
	LD	A1,SRUN	SAVE SRUN ON STACK
	STR	A1,A15 
			AND DISPATCH QUEUED PROGRAM
	EJECT
* 
* 
*   DISPATCH PROGRAM FIRST IN DISPATCHER QUEUE
* 
*   A5 = TTAB-ADDRESS OF PROGRAM TO BE DISPATCHED 
* 
DIS100	EQU	*
	LDR*	A1,A5	REMOVE JOB FROM DISPATCHER QUEUE
	ST	A1,DISQUE 
	LD	A2,TTB:SA,A5	LOAD DISPATCH ADDRESS
	LD	A1,TTB:ST+1,A5	LOAD LEVEL 
	SLL	A1,10
	CWK	A1,/C000	MONITOR JOB ? 
	RF(E)	DIS200	YES 
	LD	A6,TTB:SP,A5	SEGMENT 0? 
	RF(Z)	DIS105	YES PUT JOB ON STACK
	LDR*	A4,A6	SEGMENT LOADED? 
	ABL(N)	SEGLD	NO LOAD SEGMENT 
	CF	A15,UPDLRU	UPDATE LRU QUEUE 
	EJECT
DIS105	EQU	*
	STR	A2,A15	STORE DISPATCH ADDRESS
	STR	A1,A15	AND LEVEL ON STACK
	LDR	A3,A5
	ADK	A3,14	SET ADDRESS TO A1 IN SAVE AREA 
	LDK	A1,14	SET COUNTER
DIS110	LDR*	A2,A3	SET UP A1-A14 ON STACK
	STR	A2,A15 
	ADK	A3,2 
	SUK	A1,1 
	RB(NZ)	DIS110
DIS120	ST	A5,PRUN	SET TABB-ADDRES FOR DISPATCHED PROG.
	ST	A6,SRUN	SET POINTER TO LSBT FOR RUNNING SEGMENT 
			START QUEUED PROGRAM (A1-A14 ON STACK) 
	EJECT
* 
* 
*   R E T U R 
* 
*    ENTRYPOINTS RETU14-RETUR1 :RELOAD REGISTERS FROM STACK 
*   AND RETURN VIA A15
* 
RETU14	LDR*	A14,A15 
RETU13	LDR*	A13,A15 
RETU12	LDR*	A12,A15 
RETU11	LDR*	A11,A15 
RETU10	LDR*	A10,A15 
RETUR9	LDR*	A9,A15
RETUR8	LDR*	A8,A15
RETUR7	LDR*	A7,A15
RETUR6	LDR*	A6,A15
RETUR5	LDR*	A5,A15
RETUR4	LDR*	A4,A15
RETUR3	LDR*	A3,A15
RETUR2	LDR*	A2,A15
RETUR1	RF	DIS130
RTNA15	STR	A1,A15 
DIS130	LDK	A1,/40	BIT 9 
	ORS	A1,4,A15	SET PSW IN A15 STACK TO ENB 
	LDR*	A1,A15
	RTN	A15
	EJECT
* 
* 
*   MONITOR JOB DISPATCHING 
* 
DIS200	EQU	*
	LDKL	A3,LKMDIS	STORE ADDRESS TO BE DISPATCHED AFTER MONITOR
	STR	A3,A15	JOB ON STACK
	STR	A1,A15	STORE LEVEL 48 ON STACK 
	SUKL	A15,16	ADJUST STACK POINTER 
	STR	A2,A15	SET MONITOR JOB DISPATCH ADDRESS ON STACK 
	STR	A1,A15	SET LEVEL 
	LD	A1,TTB:SA+2,A5	LOAD PARAMETER IN A1 
	STR	A1,A15	AND SET ON STACK
	CF	A15,EXIT	DO EXIT ON MONITOR JOB AND 
	RB	RETUR1	THEN START IT
	EJECT
* 
* 
*   L K M D I S 
* 
*   THIS PART IS DISPATCHED AFTER EACH LKM-REQUEST
*   NO REGISTERS ON STACK 
* 
* 
LKMDIS	EQU	*
	INH
	LD	A1,34,A15	LOAD PSW FROM STACK 
	SRL	A1,10	GET LEVEL
	LD	A5,DISQUE 
	RF(Z)	DIS010	NO QUEUE,RETURN 
	CC	A1,TTB:ST+1,A5	AND COMPARE WITH QUEUED LEVEL
	RB(G)	DIS100	DISPATCH FROM QUEUE 
DIS010	EQU	*
	LDR*	A6,A15	SRUN FROM STACK
	LDR*	A5,A15	PRUN FROM STACK
	LDR*	A14,A15 
	LDR*	A13,A15 
	LDR*	A12,A15 
	LDR*	A11,A15 
	LDR*	A10,A15 
	LDR*	A9,A15
	ST	A5,PRUN 
	ST	A6,SRUN 
	EJECT
* 
*   SEGDIS
*   LEVEL IN REG A1 SHIFTED RIGHT 
* 
SEGDIS	CWK	A1,49	INTERRUPT ROUTINE? 
	RB(NG)	RETUR8	YES RETURN 
	LD	A6,SRUN	ROOT-SEGMENT? 
	RB(Z)	RETUR8	YES RETURN
	LD	A5,PRUN 
	LDR*	A2,A6	SEGMENT LOADED? 
	RF(N)	SEGTAB	JMP IF NOT AND LOAD SEGMENT 
	LD	A2,20,A15	DISP ADRESS:
	EJECT
* 
*   UPDATE LRUSTACK AND TASK TABLE
* 
	CF	A15,UPDLRU
	ST	A2,20,A15	STORE NEW DISPATCH ADDRESS
	RB	RETUR8
	EJECT
* 
*   SAVE INTO TTAB
* 
SEGTAB	EQU	*	SAVE STACK-DATA IN TTAB
	ST	A14,TTB:SA+28,A5	SAVE A9-A14 IN TTAB
	ST	A13,TTB:SA+26,A5
	ST	A12,TTB:SA+24,A5
	ST	A11,TTB:SA+22,A5
	ST	A10,TTB:SA+20,A5
	ST	A9,TTB:SA+18,A5 
	LDR	A4,A5	SAVE A1-A8 FROM STACK INTO TTAB
	ADK	A4,28
	LDK	A3,8 
SEGNXT	LDR*	A1,A15
	STR	A1,A4
	SUK	A4,2 
	SUK	A3,1 
	RB(NZ)	SEGNXT
	LDR*	A1,A15	REMOVE PSW FROM STACK
	LDR*	A2,A15	SAVE PROGRAM COUNTER 
	ST	A2,TTB:SA,A5
	EJECT
* 
*   LOAD SEGMENT
* 
* 
*   GET PARAMETER BLOCK AND FILL IN 
*   SEGMNT POINTER,DISPL AND TTAB-ADDRESS 
* 
SEGLD	EQU	* 
	LDR	A3,A6	LOAD SEGMENT POINTER IN LSBT 
	SU	A2,TTB:SS,A5	RELATIVE ADDRESS 
	NGR	A2,A2	SET NEGATIVE DISPLACEMENT
	LDR	A1,A5	LOAD TTAB-ADDRESS
	CF	A15,GETBLK	GET MONITOR BLOCK
* 
*   ACTIVATE LOAD TASK AND PUT IT IN THE DISPATCHER QUEUE 
* 
	LDR	A1,A4	LOAD PARAMETER 
	LDKL	A2,LDTASK	LOAD DISPATCH ADDRESS 
	LDKL	A5,TTABLD 
	LDK	A3,0 
	CF	A15,ACTOT	ACTIVATE LOAD TASK
* 
*   EXIT TO TERMINAL DISPATCHER 
* 
LD200	EQU	* 
	RB	LKMDIS

	EJECT
* 
*    UPDATE TASK TABLE
* 
UPDLRU	EQU	*
	LD	A7,2,A6	NEW LOAD ADDRESS
	LD	A4,TTB:SS,A5	OLD SEG ADDRESS
	ST	A7,TTB:SS,A5	SAVE NEW ADDRESS 
	SUR	A7,A4	ADRESS DIFFERENCE
	ADR	A2,A7	NEW DISPATCH ADDRESS 
	ST	A2,TTB:SA,A5	STORE DISP ADDRESS 
	ST	A6,TTB:SP,A5	SEGMENT POINTER
* 
*   UPDATE LRU-STACK
* 
UPDLRI	EQU	*
	LD	A3,SACT 
	RF(E)	LRUNDA 
	CWR	A3,A6	SAME AS ACTIVE SEGMENT?
	RF(E)	LRUNDA	YES 
	CF	A15,LRUNEW	NO 
LRUNDA	EQU	*
	LDKL	A7,/2000	QUEUE INDICATOR
	ST	A6,SACT	SET ACTIVE POINTER
	LDR	A4,A7
	ANR*	A7,A6 
	RF(E)	LRUEND 
	XRRS	A4,A6	SET ACTIVE
	LD	A7,8,A6	FIRST IN QUEUE
	LD	A3,10,A6	LAST IN QUEUE ?
	RF(Z)	LRULST 
	ST	A7,-2,A3	UPDATE PRECEDENT OF SUCCEDENT
LRULST	LDR	A7,A7
	RF(NZ)	LRU100
	ST	A3,LRUQUE 
	RF	LRUMOD
LRU100	ST	A3,2,A7 
LRUMOD	CM	8,A6
	CM	10,A6 
	RF	LRUEND
LRUNEW	EQU	*
	STR	A7,A15 
	LDR	A7,A3
	LD	A4,LRUQUE	UPDATE FIRST IN QUEUE 
	RF(NZ)	LRUFOR
	LD	A3,LDPEND	LOAD TASK PENDING?
	RF(Z)	NOPEND	JMP IF NOT
	CM	LDPEND	CLEAR PENDING INDICATOR
	LDR	A3,A5	SAVE A5
	LDKL	A5,TTABLD	
	CF	A15,QTJOB	RESTART LOAD TASK 
	LDR	A5,A3	RESTORE A5 
NOPEND	EQU	*
	ADK	A7,10
	RF	LRUUPD
LRUFOR	ADK	A7,8 
	ST	A7,-2,A4	UPDATE PRECEDENT OF SECOND IN QUEUE
	CMR	A7	CLEAR PRECEDENT POINTER 
	ADK	A7,2 
	STR	A4,A7	SUCCEDENT POINTER
LRUUPD	ST	A7,LRUQUE 
	LDKL	A3,/2000
	ORS	A3,-10,A7
	LDR*	A7,A15
LRUEND	ADKL	A15,2 
	LDR*	P,A15 
	END

Full view