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

⟦54b87a1f6⟧

    Length: 17276 (0x437c)
    Notes: pts_type(SC)
    Names: »MSUBS.SC«

Derivation

└─⟦7f25f14aa⟧ Bits:30009683 Philips computer tape "600307"
    └─⟦this⟧ »M:92F4/MSUBS.SC« 
└─⟦f740ae34d⟧ Bits:30009708 Philips computer tape "M_92F3"
    └─⟦this⟧ »M:92F3/MSUBS.SC« 

PTS(SC)

	IDENT MSUBS 	REL 9.2 79-11-16  870105040920

* 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   MSUBS = MONITOR SUBROUTINES 
* 
* 
* 
* 
* 
**************************************************
* 
* 
*   THIS MODULE CONTAINS THE FOLLOWING MONITOR
*   SUBROUTINES:
* 
*   -SAVE8    SAVE 8 REGISTERS ON STACK 
*   -QTJOB    QUEUE TASK FOR DISPATCHING
*   -QMJOB    QUEUE MONITOR JOB FOR DISPATCHING 
*   -ACTOT    ACTIVATE TASK ON FIFO BASIS 
*   -ACTOTP   ACTIVATE TASK ON LIFO BASIS 
*   -EXIT     PROGRAM EXIT
*   -GETBLK   GET A FREE MONITOR BLOCK
*   -FREBLK   SET A MONITOR BLOCK FREE
*   -FNDDWT   FIND DWT ADDRESS
*   -FNDTID   FIND TASK IDENTIFICATION
*   -PFINIT   RESTART DEVICE
*   -SWL48    SWITCH TO LEVEL 48
*   -SWLXY    SWITCH TO LEVEL XY
*   -HALT     HALT MODULE 
* 
	EJECT			MSUBS
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	SAVE8	SAVE 8 REGISTERS 
	ENTRY	QTJOB	QUEUE TASK 
	ENTRY	QMJOB	QUEUE MONITOR JOB
	ENTRY	ACTOT	ACTIVATE TASK (FIFO) 
	ENTRY	ACTOTP	ACTIVATE TASK (LIFO)
	ENTRY	EXIT	PROGRAM EXIT
	ENTRY	GETBLK	GET BLOCK 
	ENTRY	FREBLK	SET BLOCK FREE
	ENTRY	FNDDWT	FIND DWT
	ENTRY	FNDTID	FIND TASK INDENTIFICATION 
	ENTRY	PFINIT	RESTART DEVICE
	ENTRY	SWL48	SWITCH TO LEVEL 48 
	ENTRY	SWLXY	SWITCH TO LEVEL XY 
	ENTRY	ILLINT	ILLEGAL INTERRUPT ROUTINE 
	ENTRY	INTSAV	SAVE AREA LAST INTERRUPT
	ENTRY	HALT	HALT MODULE 
* 
*   ENTRIES TO RESTORE REGISTERS A8-A1 WITHOUT
*   ENABLE INTERRUPTS 
* 
	ENTRY	IHRET8	RESTORE FROM A8 
	ENTRY	IHRET2	A2
	ENTRY	IHRET1	             A1 
	ENTRY	IHRTN	RETURN WITHOUT ENABLE INTERRUPTS 
	EJECT			MSUBS
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	DISQUE	POINTER TO 1ST PLACE IN DISPATCHER QUEUE
	EXTRN	TTMJOB	TTAB ADDRESS OF MJOB
	EXTRN	TTB:SB	SEGMENT BLOCK POINTER 
	EXTRN	TTB:ST	TASK STATUS AND PRIORITY LEVEL
	EXTRN	TTB:ID	TASK IDENTIFICATION 
	EXTRN	TTB:SA	SAVE AREA 
	EXTRN	TTB:PP	POINTER TO PENDING QUEUE
	EXTRN	TTB:TD	TERMINAL DEVICE TABLE 
	EXTRN	FREQUE	POINTER TO FIRST FREE MONITOR BLOCK 
	EXTRN	DWTADR	-ADDRESS BLOCK
	EXTRN	SCTTCT	TASK CONTROL TABLE
	EXTRN	SCTCDT	COMMON DEVICE TABLE 
	EXTRN	PFTAB	TABLE OF DEVICES TO BE RESTARTED 
	EXTRN	TIODM	DM ENTRY 
	EXTRN	CHKIND	DM ENTRY
* 
* 
SOP	EQU	/2E	SOP DEVICE ADDRESS
* 
	EJECT			MSUBS
* 
* 
***************************************** 
* 
*	CONDITIONAL ASSEMBLY
* 
***************************************** 
* 
*	A PROGRAM VERSION USING TOSS MMU PAGING 
*	IS OBTAINED BY SETTING MMUPAG EQU 1.
* 
MMUPAG	EQU	0
* 
* 
*	A PROGRAM VERSION USING THE EXTENDED INSTRUCTION
*	SET IS OBTAINED BY SETTING CPU852 EQU 0.
* 
CPU852	EQU	1
* 
* 
*	A PROGRAM VERSION USING TOSS DISC PAGING
*	IS OBTAINED BY SETTING DSKPAG EQU 1.
* 
DSKPAG	EQU	1
* 
	EJECT			MSUBS
* 
* 
*   S A V E 8 
* 
*   SUBROUTINE TO SAVE 8 REGISTERS ON STACK 
*   WITHOUT ENABLING INTERRUPTS.
* 
* 
SAVE8	EQU	* 
	INH		INHIBIT INTERRUPTS
	STR	A3,A15 
	STR	A4,A15 
	STR	A5,A15 
	STR	A6,A15 
	STR	A7,A15 
	STR	A8,A15 
	LD	A3,16,A15	LOAD P.C. (RETURN ADDRESS)
	ST	A3,SAVE81	AND MODIFY BRANCH ADDRESS 
	ST	A2,14,A15 
	ST	A1,16,A15 
	LD	A3,12,A15	RESTORE A3
	ABL	0	THIS IS USED TO BRANCH BACK
SAVE81	EQU	*-2
* 
	EJECT			MSUBS
* 
* 
*   Q T J O B 
* 
*   SUBROUTINE TO QUEUE TASK FOR DISPATCHING. 
* 
*   ENTRY PARAMETER:- 
* 
*   A5 = TTAB ADDRESS OF PROGRAM TO BE QUEUED.
* 
*   THE REQUESTED JOB IS PUT IN DISPATCHER QUEUE ON 
*   PRIORITY BASIS. WITHIN ONE PRIORITY LEVEL JOB IS
*   PUT LAST IN QUEUE.
* 
* 
QTJOB	EQU	* 
	INH
* 
	IFT	CPU852=1 
	STR	A1,A15	SAVE A1-A3 ON STACK 
	STR	A2,A15 
	STR	A3,A15 
	XIF
* 
	IFT	CPU852=0 
	MSR	3,A15	SAVE A1-A3 ON STACK
	XIF
* 
	LDKL	A1,DISQUE	LOAD QUEUE ANCHOR ADDRESS 
	LDR*	A2,A1	GET ADDRESS OF FIRST TASK IN QUEUE
	RF(Z)	QTJ020	DISQUE EMPTY? 
	LD	A3,TTB:ST+1,A5	GET PRIORITY LEVEL 
* 
	EJECT			MSUBS
* 
* 
QTJ010	CC	A3,TTB:ST+1,A2	COMPARE WITH QUEUED LEVEL
	RF(L)	QTJ020	INSERT? 
	LDR	A1,A2	SAVE ADDRESS 
	LDR*	A2,A1	GET NEXT TTAB ADDRESS IN QUEUE
	RB(NZ)	QTJ010	NOT END OF QUEUE?
* 
QTJ020	STR	A2,A5	UPDATE QUEUE LINKS 
	STR	A5,A1
* 
	IFT	CPU852=1 
	ABL	IHRET3 
	XIF
* 
	IFT	CPU852=0 
	MLR	3,A15	RESTORE A1-A3 FROM STACK...
	RTN	A15	...AND RETURN
	XIF
* 
	EJECT			MSUBS
* 
* 
*   Q M J O B 
* 
*   SUBROUTINE TO QUEUE MONITOR JOBS ON LEVEL 49. 
* 
*   ENTRY PARAMETERS:-
* 
*   A1 = PARAMETER
*   A2 = DISPATCH ADDRESS 
* 
*   A5 IS SET TO TTAB ADDRESS OF MONITOR JOBS AND THE 
*   SUBROUTINE 'ACTOT' IS USED TO ACTIVATE AND QUEUE THE
*   JOB.
* 
* 
QMJOB	EQU	* 
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	INH
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A5,TTMJOB	SET TTAB ADDRESS
	RF	ACT01 
* 
	EJECT			MSUBS
* 
* 
*   A C T O T , A C T O T P 
* 
*   SUBROUTINE TO ACTIVATE A TASK.
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = PARAMETER 1
*   A2 = DISPATCH ADDRESS 
*   A3 = SEGMENT NUMBER 
*   A4 = PARAMETER 2
*   A5 = TTAB ADDRESS 
* 
*   - IF REQUESTED PROGRAM IS NOT ACTIVE THE PROGRAM IS 
*     PUT IN DISPATCHER QUEUE VIA SUBROUTINE 'QTJOB'. 
*   - IF PROGRAM IS ACTIVE, THE REQUEST IS PUT IN A PENDING 
*     QUEUE.
*   - ACTOT WILL PUT REQUEST IN PENDING QUEUE ON FIFO BASIS.
*   - ACTOTP WILL PUT REQUEST IN PENDING QUEUE ON LIFO BASIS. 
* 
* 
ACTOTP	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	INH
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDK	A6,1	INDICATE LIFO 
	RF	ACT03 
* 
	EJECT			MSUBS
* 
* 
ACTOT	EQU	* 
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	INH
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
ACT01	LDK	A6,0	INDICATE FIFO
* 
ACT03	EQU	* 
	LD	A7,TTB:SA,A5	GET (OLD) DISPATCH ADDRESS 
	RF(NZ)	ACT020	IS PROGRAM ACTIVE
	ST	A1,TTB:SA+2,A5	PARAMETER 1
	ST	A2,TTB:SA,A5	SAVE (NEW) DISPATCH ADDRESS
	ST	A3,TTB:SA+6,A5	SEGMENT NUMBER 
	ST	A4,TTB:SA+8,A5	PARAMETER 2
	LD	A4,TTB:ID,A5	SET TERMINAL ID
	ST	A4,TTB:SA+4,A5	TO A2 IN SAVE AREA 
* 
	IFF	MMUPAG+DSKPAG=0
	CM	TTB:SB,A5	INDICATE NOT RUNNING IN ANY SEGMENT 
	XIF
* 
	CF	A15,QTJOB	QUEUE THE JOB 
* 
	EJECT			MSUBS
* 
* 
ACT010	EQU	*
	IFT	CPU852=1 
	ABL	IHRET8	RESTORE A1-A8 AND RETURN
	XIF
* 
	IFT	CPU852=0 
	MLR	8,A15	RESTORE A1-A8 FROM STACK...
	RTN	A15	...AND RETURN
	XIF
* 
*   PUT REQUEST IN PENDING QUEUE
* 
ACT020	LDR	A7,A4	SAVE PARAMETER 2 
 	CF	A15,GETBLK	GET A FREE BLOCK
	LDR	A1,A7	PARAMETER 2
	LDR	A2,A4
	CF	A15,GETBLK
	ADKL	A5,TTB:PP 
* 
ACT030	LDR	A3,A5	SAVE ADDRESS 
	LDR*	A5,A5	FOLLOW THE QUEUE THREAD 
	ADK	A6,0	SET CR
	RF(NZ)	ACT040	QUEUE ON LIFO BASIS
	ADK	A5,0	SET CR
	RB(NZ)	ACT030	NOT END OF QUEUE 
* 
ACT040	EQU	*
	STR	A4,A3	SET BLOCK IN QUEUE 
	STR	A5,A4
	RB	ACT010
* 
	EJECT			MSUBS
* 
* 
*   E X I T 
* 
*   SUBROUTINE TO SET A PROGRAM FREE AND QUEUE FIRST
*   PENDING PROGRAM.
* 
*   ENTRY PARAMETER:
* 
*   A5 = TTAB ADDRESS 
* 
*   A3-A4, A7 ARE DESTROYED 
* 
* 
EXIT	EQU	*
	CM	TTB:SA,A5	RESET PROGRAM COUNTER 
	LD	A4,TTB:PP,A5	GET PENDING PROGRAM POINTER
	RF(Z)	IHRTN	NO PENDING PROGRAM 
	LDR*	A3,A4	GET QUEUE THREAD
	ST	A3,TTB:PP,A5	AND SAVE IN PENDING POINTER
	CF	A15,FREBLK	RELEASE BLOCK AND GET PARAMETERS 
	LDR	A7,A1	SAVE PARAMETER 2 
	LDR	A4,A2
	CF	A15,FREBLK
	LDR	A4,A7	PARAMETER 2
	RB	ACTOT	ACTIVATE TASK 
* 
	EJECT			MSUBS
* 
* 
*   G E T B L K 
* 
*   SUBROUTINE TO GET A FREE BLOCK FROM MONITOR 
*   BLOCK POOL. REGISTERS A3-A1 ARE STORED IN FOUND 
*   FREE BLOCK. 
* 
*   EXIT PARAMETER:-
* 
*   A4 = ADDRESS TO FOUND FREE BLOCK
* 
* 
GETBLK	EQU	*
	INH
	STR	A5,A15	SAVE A5 
	LD	A4,FREQUE	GET FIRST BLOCK IN FREE QUEUE 
	RF(NZ)	GBL010
	LDK	A1,/B	HALT PARAMETER 
	CF	A15,HALT	HALT IF NO MORE FREE BLOCKS
* 
GBL010	LDR*	A5,A4 
	ST	A5,FREQUE	TAKE BLOCK OUT OF FREE QUEUE
	STR	A3,A4	STORE A3-A1 IN BLOCK 
	ST	A2,2,A4 
	ST	A1,4,A4 
	LDR*	A5,A15	RESTORE A5 
* 
	IFT	CPU852=1 
	RF	IHRTN 
	XIF
* 
	IFT	CPU852=0 
	RTN	A15
	XIF
* 
	EJECT			MSUBS
* 
* 
*   F R E B L K 
* 
*   SUBROUTINE TO GET PARAMETERS FROM A MONITOR BLOCK 
*   AND SET THIS BLOCK FREE.
* 
*   ENTRY PARAMETER:- 
* 
*   A4 = BLOCK ADDRESS
* 
*   EXIT PARAMETERS:- 
* 
*   A3 = FIRST PARAMETER IN BLOCK 
*   A2 = SECOND    "          " 
*   A1 = THIRD     "          " 
* 
* 
FREBLK	EQU	*
	INH
	LDR*	A3,A4	UPDATE A3 
	LD	A1,FREQUE 
	STR	A1,A4
	ST	A4,FREQUE	SET BLOCK FREE
	LD	A2,2,A4 
	LD	A1,4,A4 
* 
	IFT	CPU852=1 
	RF	IHRTN 
	XIF
* 
	IFT	CPU852=0 
	RTN	A15
	XIF
* 
	EJECT			MSUBS
* 
* 
*   F N D D W T 
* 
*   SUBROUTINE TO FIND A DWT. 
* 
*   ENTRY PARAMETERS:-
* 
*   A5 = TTAB ADDRESS 
*   A7 = ORDER CODE WHEN CALLED FROM DATA MANAGEMENT
*   A8 = ECB ADDRESS
* 
*   EXIT PARAMETERS:- 
* 
*   A2 = DWT INDEX
*   A6 = DWT ADDRESS IF FOUND, ELSE 0 
* 
* 
FNDDWT	STR	A1,A15	SAVE A1 
	LDKL	A6,TTB:TD+2 
	ADR	A6,A5	GET ADDRESS TO TERMINAL DEVICE TABLE 
	LD	A1,-2,A6	GET TABLE LENGTH 
* 
	IFT	MMUPAG=1 
	ELR	A2,A8	LOAD FILE CODE FROM ECB
	XIF
* 
	IFT	MMUPAG=0 
	LDR*	A2,A8	LOAD FILE CODE FROM ECB 
	XIF
* 
	EJECT			MSUBS
* 
* 
FND100	SUK	A1,4 
	RF(N)	FND110	FILE CODE NOT IN TTAB?
	CC	A2,1,A6	SEARCH IN DEVICE TABLE
	RF(NE)	FND106	BRANCH IF NOT FOUND
	STR	A1,A15 
	LD	A1,2,A6	DWT ADDRESS 
	LD	A1,DWTADR,A1	ADDRESS BLOCK
	CWK	A1,TIODM 
	RF(NE)	FND200	NOT DM REQUEST?
	CF	A15,CHKIND	CHECK INDEX IN DM
	RF	FND200	INDEX OK 
	LDR*	A1,A15
* 
FND106	EQU	*
	ADK	A6,4	ADDRESS TO NEXT FILE CODE 
	RB	FND100	TRY NEXT 
* 
* SEARCH IN COMMON DEVICE TABLE 
* 
FND110	LD	A6,SCTCDT	CDTAB ADDRESS 
	LDR*	A1,A6	CDTAB LENGTH
	ADK	A6,2	POINTER TO FIRST ENTRY
* 
	EJECT			MSUBS
* 
* 
FND120	SUK	A1,4 
	RF(N)	FND130	FILE CODE NOT FOUND?
	CC	A2,1,A6	
	RF(NE)	FND126	FILE CODE NOT FOUND? 
	STR	A1,A15 
	LD	A1,2,A6 
	LD	A1,DWTADR,A1
	CWK	A1,TIODM 
	RF(NE)	FND200	NOT DM REQUEST?
	CF	A15,CHKIND	CHECK INDEX IN DM
	RF	FND200	INDEX OK 
	LDR*	A1,A15
* 
FND126	ADK	A6,4 
	RB	FND120	TRY NEXT ENTRY IN CDTAB
* 
FND130	LDK	A6,0 
	RF	IHRET1
* 
FND200	LDR*	A1,A15	RESET STACK
	LCR	A2,A6	LOAD DWT INDEX 
	LD	A6,2,A6	LOAD DWT ADDRESS
* 
FND210	RF	IHRET1
* 
	EJECT			MSUBS
* 
* 
*   F N D T I D 
* 
*   SUBROUTINE TO FIND TTAB ADDRESS FROM TASK IDENTIFICATION. 
* 
*   ENTRY PARAMETER:
* 
*   A7 = TASK IDENTIFICATION
* 
*   EXIT PARAMETER: 
* 
*   A2 = TTAB ADDRESS 
*   A2 = 0 INDICATES ILLEGAL IDENTIFICATION 
* 
* 
FNDTID	STR	A1,A15	SAVE A1 
	LD*	A1,SCTTCT	TCTAB LENGTH 
	AD	A1,SCTTCT 
* 
FTI010	SUK	A1,2 
	CW	A1,SCTTCT 
	RF(E)	FTI030	ALL TTABS EXAMINED? 
	LDR*	A2,A1	TTAB ADDRESS
	CW	A7,TTB:ID,A2	COMPARE IDENTIFICATIONS
	RB(NE)	FTI010	NO MATCH?
 	RF	IHRET1 
* 
FTI030	LDK	A2,0	ILLEGAL IDENTIFICATION
	RF	IHRET1
* 
	EJECT			MSUBS
* 
* 
*   RESTORE REGISTERS AND RETURN WITHOUT
*   ENABLE INTERRUPTS.
* 
* 
	IFT	CPU852=1 
IHRET8	LDR*	A8,A15
IHRET7	LDR*	A7,A15
IHRET6	LDR*	A6,A15
IHRET5	LDR*	A5,A15
IHRET4	LDR*	A4,A15
IHRET3	LDR*	A3,A15
IHRET2	LDR*	A2,A15
IHRET1	LDR*	A1,A15
IHRTN	INH 
	ADKL	A15,4	ADJUST STACK POINTER
	ABR*	A15	AND RETURN
	XIF
* 
	IFT	CPU852=0 
IHRET8	MLR	8,A15	RESTORE A1-A8 FROM STACK...
	RTN	A15	...AND RETURN
* 
IHRET2	MLR	2,A15	RESTORE A1-A2 FROM STACK...
	RTN	A15	...AND RETURN
* 
IHRET1	LDR*	A1,A15	RESTORE A1 FROM STACK... 
* 
IHRTN	RTN	A15	...AND RETURN 
	XIF
* 
	EJECT			MSUBS
* 
* 
*   P F I N I T 
* 
*   SUBROUTINE TO RESTART DEVICES.
* 
*   ALL RESTART ROUTINES GIVEN IN TABLE 'PFTAB' ARE CALLED. 
*   REGISTERS A1-A8 ARE AVAILABLE FOR THE RESTART ROUTINES. 
* 
* 
PFINIT	EQU	*
	LDK	A1,2	SET INDEX TO FIRST ROUTINE
* 
PFI100	CW	A1,PFTAB	CHECK IF LAST
	RF(NL)	PFI110	ALL RESTARTED? 
	STR	A1,A15	SAVE A1 
	INH
	CFI	A15,PFTAB,A1	CALL RESTART MODULE 
	LDR*	A1,A15	RESTORE A1 
	ADK	A1,2	NEXT DEVICE 
	RB	PFI100
* 
PFI110	RTN	A15	RETURN WHEN ALL STARTED
* 
	EJECT			MSUBS
* 
* 
*   S W L 4 8 
* 
*   SWITCH TO LEVEL 48 AND ENABLE.
* 
* 
SWL48	EQU	* 
	STR	A1,A15	SAVE A1 
* 
SWL481	EQU	*
	LDKL	A1,/C0C0	PSW FOR LEVEL 48 
* 
SWL482	EQU	*
	ST	A1,4,A15	SAVE IT ON A15 STACK 
	LDR*	A1,A15	RESTORE A1 
	RTN	A15
* 
	EJECT			MSUBS
* 
* 
*   S W L X Y 
* 
*   SWITCH TO LEVEL XY AND ENABLE.
* 
*   LEVEL := 48 IF LEVEL ON STACK IS >= 48
*   LEVEL := XY "    "   "    "   "  XY < 48
* 
*   THIS MODULE IS TO BE CALLED WITH 8 REGISTERS ON STACK.
* 
* 
SWLXY	EQU	* 
	STR	A1,A15	SAVE A1 
	LC	A1,24,A15	GET LEVEL FROM STACK
	ANK	A1,/FC 
	SUK	A1,/BC 
	RB(G)	SWL481 
	LD	A1,24,A15 
	ANKL	A1,/FFFE	SYSTEM MODE BIT
	RB	SWL482
* 
	EJECT			MSUBS
* 
* 
*   INTERRUPT SAVE AND HALT MODULE
* 
* 
INTSAV	DATA	0 
SAVA15	DATA	0 
* 
ILLINT	LDK	A1,5	HALT PARAMETER
	CF	A15,HALT
* 
HALT	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	STR	A9,A15	SAVE A9-A14 ON STACK
	STR	A10,A15
	STR	A11,A15
	STR	A12,A15
	STR	A13,A15
	STR	A14,A15
	XIF
* 
	IFT	CPU852=0 
	MSR	14,A15	SAVE A1-A14 ON STACK
	XIF
* 
	ST	A15,SAVA15
	OTR	A1,0,SOP	INDICATE TYPE OF HALT 
	HLT
* 
* 
* 
	END

Full view