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

⟦fe22d3492⟧

    Length: 17476 (0x4444)
    Notes: pts_type(SC)
    Names: »MSUBS.SC«

Derivation

└─⟦18bf30ff4⟧ Bits:30009692 Philips computer tape "600409"
    └─⟦this⟧ »BDKMON/MSUBS.SC« 
└─⟦71472ef1e⟧ Bits:30009661 Philips computer tape "600103"
    └─⟦this⟧ »BDKMON/MSUBS.SC« 

PTS(SC)

	IDENT  MSUBS 	REL=7.2  DATE=77-09-09 
			UPDATE   #0   77-09-09 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   MSUBS = MONITOR SUBROUTINES 
* 
* 
*   LEVEL     #2  77-09-09
* 
*   RELEASE   #7  77-09-09
* 
**************************************************
* 
*   THIS MODULE CONTAINS THE FOLLOWING MONITOR
*   SUBROUTINES:
* 
*   -SAVE8    SAVE 8 REGISTERS ON STACK 
*   -QTJOB    QUEUE TERMINAL JOB FOR DISPATCHING
*   -QMJOB   QUEUE MONITOR JOB FOF DISPATCHING
*   -ACTOT    ACTIVATE TERMINAL PROGRAM 
*   -EXIT    PROGRAM EXIT 
*   -GETBLK   GET A FREE MONITOR BLOCK
*   -FREBLK   SET A MONITOR BLOCK FREE
*   -FNDDWT   FIND DWT ADDRESS
*   -FNDTID   FIND TERMINAL IDENTIFICATION
*   -TENDIO   END I/O 
*   -PFINIT   RESTAR DEVICE 
*   -SWL48    SWITCH TO LEVEL 48
	EJECT
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	SAVE8	SAVE 8 REGISTERS 
* 
	ENTRY	QTJOB	QUEUE TERMINAL JOB 
* 
	ENTRY	QMJOB	QUEUE MONITOR JOB
* 
	ENTRY	ACTOT	ACTIVATE TERMINAL
* 
	ENTRY	EXIT	PROGRAM EXIT
* 
	ENTRY	GETBLK	GET BLOCK 
* 
	ENTRY	FREBLK	SET BLOCK FREE
* 
	ENTRY	FNDDWT	FIND DWT
* 
	ENTRY	FNDTID	FIND TERMINAL INDENTIFICATION 
* 
	ENTRY	TENDIO	END I/O 
* 
	ENTRY	PFINIT	RESTART DEVICE
* 
	ENTRY	SWL48	SWITCH TO LEVEL 48 
* 
	ENTRY	ILLINT	ILLEGAL INTERRUPT ROUTINE 
* 
	ENTRY	INTSAV	SAVE AREA LAST INTERRUPT
* 
	ENTRY	HALT	HALT-MODULE 
	EJECT
* 
* 
*   ENTRIES TO RESTORE REGISTERS A8-A1 WITHOUT
*   ENEABLE INTERRUPTS
* 
* 
	ENTRY	IHRET8	RESTORE FROM A8 
	ENTRY	IHRET7	             A7 
	ENTRY	IHRET6	             A6 
	ENTRY	IHRET5	             A5 
	ENTRY	IHRET4	             A4 
	ENTRY	IHRET3	             A3 
	ENTRY	IHRET2	             A2 
	ENTRY	IHRET1	             A1 
	ENTRY	IHRTN	RETURN WITHOUT ENABLE INTERRUPTS 
	EJECT
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	DISQUE	POINTER TO FIRST PLACE IN DISPATCHER QUEUE
	EXTRN	TTMJOB	TTAB-ADDRESS OF MJOB
	EXTRN	TTB:ST	TERMINAL STATUS AND PRIORITY LEVEL
	EXTRN	TTB:ID	TERMINAL IDENTIFICATION 
	EXTRN	TTB:SA	SAVE AREA 
	EXTRN	TTB:PP	POINTER TO PENDING QUEUE
	EXTRN	TTB:TD	TERMINAL DEVICE TABLE 
	EXTRN	RETUR8 
	EXTRN	FREQUE	POINTER TO FIRST FREE MONITOR BLOCK 
	EXTRN	DWTST	DWT STATUS 
	EXTRN	DWTWAT	   -WAIT/ACTIVATE INDICATOR 
	EXTRN	DWTECB	   -ECB ADDRESS 
	EXTRN	DWTTQ	   =ADDRESS TO TTAB ON QUEUE 
	EXTRN	DWTTAB	   -TTAB ADDRESS
	EXTRN	TCTAB	TERMINAL CONTROL TABLE 
	EXTRN	CDTAB	COMMON DEVICE TABLE
	EXTRN	PFTAB	TABLE OF DEVICES TO BE RESTARTED 
	EXTRN	TTB:SP,TTB:SS
	EXTRN	RTNA15	RETURN AND ENABLE 
* 
	EJECT
* 
* 
*   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
* 
* 
*   Q T J O B 
* 
*   SUBROUTINE TO QUEUE TERMINAL JOB 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
	STR	A1,A15	SAVE A1-A3 ON STACK 
	STR	A2,A15 
	STR	A3,A15 
	LDKL	A1,DISQUE	LOAD QUEUE ANCHOR ADDRESS 
	LC	A3,TTB:ST+1,A5	LOAD LEVEL TO BE QUEUED
QTJ010	LDR	A2,A1	SAVE LAST ADDRESS
	LDR*	A1,A1	FOLLOW THE THREAD 
	RF(Z)	QTJ020	END QUEUE FOUND 
	CC	A3,TTB:ST+1,A1	COMPARE LEVELS 
	RB(NL)	QTJ010	TRY NEXT 
QTJ020	STR	A1,A5	INSET IN QUEUE 
	STR	A5,A2
	ABL	IHRET3 
	EJECT
* 
* 
*   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 MONITORJOBS AND THE
*   SUBROUTINE 'ACTOT' IS USED TO ACTIVATE AND QUEUE THE
*   JOB.
* 
* 
* 
QMJOB	EQU	* 
	LDKL	A5,TTMJOB	SET TTAB-ADDRESS
	LDK	A3,0 
			AND GO TO ACTOT
	EJECT
* 
* 
*   A C T O T 
* 
*   SUBROUTINE TO ACTIVATE A TERMINAL PROGRAM.
*   ENTRY PARAMETERS:-
* 
*   A1 = PARAMETER
*   A2 = DISPATCH ADDRESS 
*   A3 = SEGMENT POINTER
*   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	EQU	* 
	CF	A15,SAVE8	SAVE REGISTERS
	LD	A4,TTB:SA,A5	IS PROGRAM ACTIVE? 
	RF(NZ)	ACT020	YES, PUT IN PENDING QUEUE
	LDR	A3,A3
	RF(E)	ACT05
	LD	A4,2,A3	LOAD ADDRESS
	ADR	A2,A4
	ST	A4,TTB:SS,A5	LAST SEGMENT START 
ACT05	ST	A2,TTB:SA,A5	DISPATCH ADDRESS
	ST	A3,TTB:SP,A5	SEGMENT POINTER
	ST	A1,TTB:SA+2,A5	AND PARAMETER
	LD	A4,TTB:ID,A5	SET TERMINAL ID
	ST	A4,TTB:SA+4,A5	TO A2 IN SAVE AREA 
	CF	A15,QTJOB	AND QUEUE THE JOB 
ACT010	ABL	IHRET8 
	EJECT
* 
* 
*   PUT REQUEST IN PENDING QUEUE. 
* 
ACT020	CF	A15,GETBLK	GET A FREE BLOCK 
	LDR	A2,A4
	CF	A15,GETBLK
	ADKL	A5,TTB:PP 
ACT030	LDR	A6,A5	SAVE ADDRSSS 
	LDR*	A5,A5	FOLLOW THE QUEUE THREAD 
	RB(NZ)	ACT030	TRY NEXT 
	STR	A4,A6	SET BLOCK IN QUEUE 
	CMR	A4	SET END OF QUEUE
	RB	ACT010
	EJECT
* 
* 
*   E X I T 
* 
*   SUBROUTINE TO SET A PROGRAM FREE AND QUEUE FIRST
*   PENDING PROGRAM 
* 
*   ENTRY PARAMETER:- 
* 
*   A5 = TTAB-ADDRESS 
*   REGISTERS A3 AND A4 ARE LOST
* 
EXIT	EQU	*
	INH
	CM	TTB:SA,A5	RESET PROGRAM COUNTER 
	LD	A4,TTB:PP,A5	GET PENDING PROGRAM POINTER
	RF(Z)	EXT010	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 PARAMS 
	LDR	A4,A2
	CF	A15,FREBLK
	CF	A15,ACTOT	ACTIVATE TERMINAL 
EXT010	RF	GBL020
	EJECT
* 
* 
*   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
	CF	A15,HALT		HALT IF ALL BLOCKS OCCUPIED 
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 
GBL020	RF	IHRTN 
	EJECT
* 
* 
*   F R E B L K 
* 
*   SUBROUTINE TO GET PARAMETERS FROM A MONITOR BLOCK 
*   AND SET THIS BLOCK FREE.
* 
*   ENTRY PARAMETER:- 
* 
*   A4 = BLOCKADDRESS 
* 
*   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 
	RF	IHRTN 
	EJECT

* 
* 
*	F N D D W T 
* 
* ENTRY PARAMETERS:-
* 
* A5 = TTAB ADDRESS 
* 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 
	ADR	A6,A5	GET ADDRESS TO TERMINAL DEVICE TABLE 
	LDR*	A1,A6	GET TABLE LENGTH
	ADK	A6,2	ADDRESS TO FIRST FILE CODE
	LDR*	A2,A8	LOAD FILE CODE FROM ECB 

FND100	SUK	A1,4 
	RF(N)	FND110	FILE CODE NOT IN TTAB 
	CC	A2,1,A6	SEARCH IN DEVICE TABLE
	RF(E)	FND200	BRANCH IF FOUND 
	ADK	A6,4	ADDRESS TO NEXT FILE CODE 
	RB	FND100	TRY NEXT 
	EJECT
* 
* SEARCH IN COMMON DEVICE TABLE 
* 

FND110	LD	A6,CDTAB	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 
	RB	FND120	TRY NEXT ENTRY IN CDTAB

FND130	SUR	A6,A6
	RF	FND210
FND200	LCR	A2,A6	LOAD DWT INDEX 
	LD	A6,2,A6	LOAD DWT ADDRESS
FND210	RF	IHRET1
	EJECT
* 
* 
*	F N D T I D 
* 
* 
* SUBROUTINE TO FIND TTAB ADDRESS FROM TERMINAL IDENTIFICATION
* 
* 
* ENTRY PARAMETER:
* 
* A7 = TERMINAL IDNETIFICATION
* 
* 
* EXIT PARAMETER: 
* 
* A2 = TTAB ADDRESS 
* A2 = 0 INDICATES ILLEGAL IDENTIFICATION 
* 
* 
FNDTID	STR	A1,A15	SAVE REG. A1
	LD*	A1,TCTAB	TCTAB LENGTH
	AD	A1,TCTAB

FTI010	SUK	A1,2 
	CW	A1,TCTAB
	RF(E)	FTI030	ALL TTABS EXAMINED
	LDR*	A2,A1	TTAB ADDRESS
	RB(Z)	FTI010	NOT IN SYSTEM 
	CW	A7,TTB:ID,A2	COMPARE IDENTIFICATIONS
	RB(NE)	FTI010	NO MATCH. TRY NEXT 

FTI020	RF	IHRET1
FTI030	SUR	A2,A2	ILLEGAL IDENTIFICATION 
	RF	IHRET1
	EJECT
* 
* 
*	T E N D I O 
* 
* 
* THIS MODULE IS CALLED WHEN COMPLETION OF
* I/O OCCURS. 
* 
* - IF I/O AND ACTIVATION REQUEST:- 
* 
*   ACTOT IS CALLED TO START THE TASK 
* 
* -IF NORMAL I/O WITH WAIT:-
* 
*   QTJOB IS CALLED TO QUEUE THE TASK 
*   FOR DISPATCHING WITH THE FOLLOWING PARAMETERS:- 
* 
*   A5 = TTAB-ADDRESS 
* 
* -IF NORMAL I/O WITH NO WAIT:- 
* 
*   NO ACTION REQUIRED
* 
* IF AN EVENT WAS QUEUED FOR THIS DEVICE (DWTECQ NOT = ZERO)
* THAT TASK IS PUT IN DISPATCHER QUEUE TO REPEAT THE LKM INSTRUCTION
* 
* ENTRY PARAMETERS TO THIS SUBROUTINE ARE:- 
* 
*   A1 = RETURN CODE
*   A6 = DWT ADDRESS
* NO REGISTERS ARE DESTROYED
* 
* N.B. THE ECB RETURN CODE IS UPDATED BY MEANS OF 
* AN 'ORS' INSTRUCTION
* 
* 
	EJECT
* 
*	CHECK IF ANY TERMINAL ON QUEUE FOR THIS DEVICE
* 
TENDIO	EQU	*
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	LD	A5,DWTTQ,A6	ANY TASK QUEUED?
	RF(Z)	TEN110	NO
	LDR*	A3,A5	YES: UPDATE QUEUE ANCHOR ADDRESS
	ST	A3,DWTTQ,A6 
	CF	A15,QTJOB	QUEUE TASK TO REPEAT REQUEST
	EJECT
* 
* 
* UPDATE ECB AND DWT
* 
* 

TEN110	EQU	*
	LD	A5,DWTTAB,A6	GET TTAB ADDRESS FROM DWT
	LDKL	A2,/8000
	ORS	A2,DWTST,A6	INDICATE DEVICE READY IN DWT 
	LDKL	A3,/DBFF	RESET ECHO-BIT AND BITS 5,6
	ANS	A3,DWTST,A6	RESET ECHO-BIT IN STATUS DWT 
	LD	A3,DWTECB,A6	GET ECB ADDRESS
	RF(Z)	TEN130	BRANCH IF ENTERED FROM ECHO OR RECOVERY 
	ORRS	A2,A3	SET EVENT COMPLETED IN ECB
	ORS	A1,8,A3	SET RETURN CODE IN ECB 
	CM	DWTECB,A6	RESET ECB ADDRESS 
	EJECT
* 
*	CHECK IF WAIT OR ACTIVATION 
* 
	LD	A4,DWTWAT,A6	GET WAIT/ACTIVATE INDICATOR
	RF(Z)	TEN130	NOT WAIT OR ACTIVATION
	CWK	A4,1 
	RF(E)	TEN120	WAIT
	CF	A15,FREBLK	ACTIVATE: GET PARAMETER AND DISP ADDR
	CF	A15,ACTOT	ACTIVATE TASK 
	RF	TEN130	RETURN 
TEN120	EQU	*
	CF	A15,QTJOB	WAIT: QUEUE TASK FOR DISPATCHING
TEN130	EQU	*
	EJECT
* 
* 
*   RESTORE REGISTERS AND RETURN WITHOUT
*   ENABLE INTERRUPTS 
* 
* 
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
	EJECT
* 
* 
*   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 
	CFI	A15,PFTAB,A1	CALL RESTART MODULE 
	LDR*	A1,A15	RESTORE A1 
	ADK	A1,2	NEXT DEVICE 
	RB	PFI100
PFI110	RF	SWLRTN	RETURN WHEN ALL STARTED
	EJECT
* 
* 
*   S W L 4 8 
* 
*   SUBROUTINE TO SWITCH PROGRAM PRIORITY LEVEL TO 48.
* 
* 
SWL48	EQU	* 
	INH
	STR	A1,A15 
	LDKL	A1,/C000	PSW FOR LEVEL 48 
	ST	A1,4,A15	SAVE IT ON A15 STACK 
	LDR*	A1,A15	RESTORE A1 
SWLRTN	ABL	RTNA15	RETURN TO CALLER AND ENB
* 
	EJECT
* 
*    INTERRUPT SAVE AND HALT MODULE 
* 
INTSAV	DATA	0 
SAVA15	DATA	0 
ILLINT	CF	A15,HALT
HALT	EQU	*
	CF	A15,SAVE8 
	STR	A9,A15 
	STR	A10,A15
	STR	A11,A15
	STR	A12,A15
	STR	A13,A15
	STR	A14,A15
	ST	A15,SAVA15
	HLT
	END

Full view