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

⟦b72690401⟧

    Length: 20566 (0x5056)
    Notes: pts_type(SC)
    Names: »MSUBS.SC«

Derivation

└─⟦7b35573c9⟧ Bits:30009690 Philips computer tape "600402"
    └─⟦this⟧ »M:AF/MSUBS.SC« 

PTS(SC)

	IDENT MSUBS 	REL 11.0 81-01-26 870105041100

* 
* 
**************************************************
* 
*   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 TASK FOR DISPATCHING
*   -ACTOT    ACTIVATE TASK ON FIFO BASIS 
*   -ACTOTP   ACTIVATE TASK ON LIFO BASIS 
*   -EXIT     TASK EXIT 
*   -GETBLK   GET A FREE MONITOR BLOCK
*   -FREBLK   SET A MONITOR BLOCK FREE
*   -FNDDWT   FIND DWT ADDRESS IN TTAB OR CDTAB 
*   -FNDDWD   FIND DWT ADDRESS IN CDTAB 
*   -FNDTID   FIND TASK IDENTIFICATION
*   -PFINIT   RESTART DEVICE
*   -SWL48    SWITCH TO LEVEL 48
*   -SWLXY    SWITCH TO LEVEL XY
*   -HALT     HALT MODULE 
*   -RELPAG   RELEASE PAGE
* 
	EJECT			MSUBS
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	SAVE8	SAVE 8 REGISTERS 
	ENTRY	QTJOB	QUEUE TASK 
	ENTRY	QMJOB	QUEUE MONITOR TASK 
	ENTRY	ACTOT	ACTIVATE TASK (FIFO) 
	ENTRY	ACTOTP	ACTIVATE TASK (LIFO)
	ENTRY	EXIT	TASK EXIT 
	ENTRY	GETBLK	GET BLOCK 
	ENTRY	FREBLK	SET BLOCK FREE
	ENTRY	FNDDWT	FIND DWT IN TTAB OR CDTAB 
	ENTRY	FNDDWD	FIND DWT IN CDTAB 
	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 
	ENTRY	RELPAG	RELEASE PAGE
	ENTRY	RELPA2	RELEASE PAGE (2ND ENTRY)
	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	FREQUE	POINTER TO FIRST FREE MONITOR BLOCK 
	EXTRN	TTABLD	LOAD TASK TTAB
	EXTRN	PQEMTY	PAGE QUEUE EMPTY FLAG 
	EXTRN	PAGQUE	FREE PAGE QUEUE 
	EXTRN	SEG:PB	PAGE BLOCK ADDRESS
	EXTRN	PAG:QB	QUEUE LINK BACKWARD 
	EXTRN	LKMERR	HALT SYSTEM DUE TO FATAL LKM ERROR
	EXTRN	TTMJOB	TTAB ADDRESS OF '#M'
	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	TASK DEVICE TABLE 
	EXTRN	SCTTCT	TASK CONTROL TABLE
	EXTRN	SCTCDT	COMMON DEVICE TABLE 
	EXTRN	PFTAB	TABLE OF DEVICES TO BE RESTARTED 
	EJECT			MSUBS
* 
* 
***************************************** 
* 
*	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
* 
* 
*	A PROGRAM VERSION USING TOSS DISC PAGING
*	IS OBTAINED BY SETTING DSKPAG EQU 1.
* 
DSKPAG	EQU	0
* 
* 
SOP	EQU	/2E	SOP DEVICE ADDRESS
* 
	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 TASK TO BE QUEUED. 
* 
*   THE REQUESTED TASK IS PUT IN DISPATCHER QUEUE ON
*   PRIORITY BASIS. WITHIN ONE PRIORITY LEVEL TASK 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	ADDRESS OF FIRST TASK IN QUEUE
	RF(Z)	QTJ020	DISQUE EMPTY
	LD	A3,TTB:ST+1,A5	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	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 TASK  '#M'. 
* 
*   ENTRY PARAMETERS: 
* 
*   A1 = PARAMETER
*   A2 = DISPATCH ADDRESS 
*   A3 = PARAMETER
*   A4 = PARAMETER
* 
*   A5 IS SET TO TTAB ADDRESS OF MONITOR TASK '#M' AND THE
*   SUBROUTINE 'ACTOT' IS USED TO ACTIVATE AND QUEUE THE TASK.
* 
* 
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	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 TASK IS NOT ACTIVE THE TASK IS 
*     PUT IN DISPATCHER QUEUE VIA SUBROUTINE 'QTJOB'. 
*   - IF TASK 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	(OLD) DISPATCH ADDRESS 
	RF(NZ)	ACT020	IS PROGRAM ACTIVE
	ST	A2,TTB:SA,A5	SAVE (NEW) DISPATCH ADDRESS
* 
	IFT	CPU852=1 
	ST	A1,TTB:SA+2,A5	PARAMETER 1
	ST	A3,TTB:SA+6,A5	SEGMENT NUMBER 
	ST	A4,TTB:SA+8,A5	PARAMETER 2
	LD	A4,TTB:ID,A5	SET TASK ID
	ST	A4,TTB:SA+4,A5	TO A2 IN SAVE AREA 
	XIF
* 
	IFT	CPU852=0 
	LD	A2,TTB:ID,A5	TASK ID
	MS	4,TTB:SA+2,A5	SET PARAMETERS IN TTAB SAVE AREA
	XIF
* 
	EJECT			MSUBS
* 
* 
	IFF	MMUPAG+DSKPAG=0
	CM	TTB:SB,A5	INDICATE NOT RUNNING IN ANY SEGMENT 
	XIF
* 
	CF	A15,QTJOB	QUEUE THE TASK
* 
ACT010	EQU	*
	IFT	CPU852=1 
	RF	IHRET8	RESTORE A1-A8 AND RETURN 
	XIF
* 
	IFT	CPU852=0 
	MLR	8,A15	RESTORE A1-A8 FROM STACK...
	RTN	A15	...AND RETURN
	XIF
* 
	EJECT			MSUBS
* 
*   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 TASK FREE AND QUEUE FIRST 
*   PENDING REQUEST.
* 
*   ENTRY PARAMETER:
* 
*   A5 = TTAB ADDRESS 
* 
*   A3-A4, A7 ARE DESTROYED 
* 
* 
EXIT	EQU	*
	CM	TTB:SA,A5	RESET DISPATCH ADDRESS
	LD	A4,TTB:PP,A5	PENDING REQUEST POINTER
	RF(Z)	IHRTN	NO PENDING REQUEST 
	LDR*	A3,A4	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	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 IN TTAB OR CDTAB.
* 
*   ENTRY PARAMETERS: 
* 
*   A5 = TTAB ADDRESS 
*   A8 = ECB ADDRESS
* 
*   EXIT PARAMETERS:
* 
*   A2 = DWT INDEX
*   A6 = DWT ADDRESS IF FOUND, ELSE 0 
* 
* 
*   F N D D W D 
* 
*   SUBROUTINE TO FIND A DWT IN CDTAB.
* 
*   ENTRY PARAMETERS: 
* 
*   A2 = FILE CODE
* 
*   EXIT PARAMETERS, SEE FNDDWT 
* 
	EJECT			MSUBS
* 
* 
FNDDWT	EQU	*
	IFT	MMUPAG=1 
	ELR	A2,A8	LOAD FILE CODE FROM ECB
	XIF
* 
	IFT	MMUPAG=0 
	LDR*	A2,A8	LOAD FILE CODE FROM ECB 
	XIF
* 
	STR	A1,A15	SAVE A1 
	LDKL	A6,TTB:TD+2 
	ADR	A6,A5	ADDRESS TO TASK DEVICE TABLE 
	LD	A1,-2,A6	TABLE LENGTH 
* 
FND100	SUK	A1,4 
	RF(N)	FND110	FILE CODE NOT IN TTAB 
	CC	A2,1,A6	SEARCH IN DEVICE TABLE
	RF(E)	FND200	FILE CODE FOUND 
	ADK	A6,4	ADDRESS TO NEXT FILE CODE 
	RB	FND100	TRY NEXT 
* 
	EJECT			MSUBS
* 
* SEARCH IN COMMON DEVICE TABLE 
* 
FNDDWD	EQU	*
	STR	A1,A15	SAVE A1 
* 
FND110	LD	A6,SCTCDT	CDTAB ADDRESS 
	LDR*	A1,A6	CDTAB LENGTH
	ADK	A6,2	POINTER TO FIRST ENTRY
* 
FND120	SUK	A1,4 
	RF(N)	FND130	FILE CODE NOT FOUND 
	CC	A2,1,A6	
	RF(E)	FND200	FILE CODE FOUND 
	ADK	A6,4	ADDRESS TO NEXT FILE CODE 
	RB	FND120	TRY NEXT ENTRY IN CDTAB
* 
FND130	LDK	A6,0 
	RF	IHRET1
* 
FND200	EQU	*
	LCR	A2,A6	LOAD DWT INDEX 
	LD	A6,2,A6	LOAD DWT ADDRESS
	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
	LDR*	A7,A15
	LDR*	A6,A15
	LDR*	A5,A15
	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	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
* 
	EJECT			MSUBS
* 
* 
*   R E L P A G 
* 
*   RELEASE PAGE AND RESTART LDTASK IF PAGQUE WAS EMPTY 
* 
*   ENTRY PARAMETERS: 
* 
*   A3 = SEGBLK ADDRESS (PAGBLK ADDRESS IF RELPA2)
*   A5 = TTAB ADDRESS (RELPA2)
* 
*   EXIT PARAMETER: 
* 
*   A4 IS DESTROYED 
* 
* 
	IFT	DSKPAG=1 
RELPA2	EQU	*
	CM	TTB:SB,A5	INDICATE NOT RUNNING IN ANY SEGMENT 
	RF	REL:10
* 
RELPAG	EQU	*	RELEASE PAGE MAIN ENTRY
	LD	A3,SEG:PB,A3	PAGE BLOCK ADDRESS 
* 
REL:10	EQU	*
	LDKL	A4,PAGQUE	PAGQUE ADDRESS
	ST	A4,PAG:QB,A3
	LDR*	A4,A4	ADDRESS OF FIRST BLOCK IN PAGQUE
	STR	A4,A3	UPDATE QUEUE LINKS 
	ST	A3,PAGQUE 
	ST	A3,PAG:QB,A4
	LD	A4,PQEMTY	CHECK IF LDTASK IS IN PAUSE STATE 
	RF(Z)	REL:20 
* 
	EJECT			MSUBS
* 
*   RESTART LOAD TASK 
* 
	CM	PQEMTY	INDICATE PAGE QUEUE NOT EMPTY
	LDR	A4,A5	SAVE A5
	LDKL	A5,TTABLD	LDTASK TTAB ADDRESS 
	CF	A15,QTJOB	RESTART LOAD TASK 
	LDR	A5,A4	RESTORE A5 
* 
REL:20	EQU	*
	IFT	CPU852=1 
	RB	IHRTN 
	XIF
* 
	IFT	DSKPAG=1 
	IFT	CPU852=0 
	RTN	A15
	XIF
* 
	IFT	DSKPAG=0 
RELPAG	EQU	*	DUMMY ENTRIES TO AVOID ASS. ERR. 
RELPA2	EQU	*
	ABL	LKMERR	INDICATE SYSGEN ERROR 
	XIF
* 
* 
* 
	END

Full view