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

⟦61c566dcc⟧

    Length: 13804 (0x35ec)
    Notes: pts_type(SC)
    Names: »LRPINT.SC«

Derivation

└─⟦48601905a⟧ Bits:30009668 Philips computer tape "600121"
    └─⟦this⟧ »M:TU10/LRPINT.SC« 
└─⟦d2a299635⟧ Bits:30009698 Philips computer tape "600415"
    └─⟦this⟧ »M:TU10/LRPINT.SC« 

PTS(SC)

	IDENT LRPINT 	REL 10.0 80-03-14 870105041000 

* 
* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   LRPINT = INTERRUPT HANDLERS FOR LKM, RTC
*            AND POWER FAILURE
* 
* 
* 
* 
* 
**************************************************
* 
* 
*   THIS MODULE CONTAINS MANDATORY INTERRUPT HANDLERS 
*   FOR TOSS. THESE ARE:
* 
*   -IHLKM:  LKM INTERRUPT
* 
*   -IHRTC:  RTC INTERRUPT
* 
*   -IHPFAR: POWER FAILURE INTERRUPT
* 
*   IN THIS MODULE ENTRIES FOR REQUEST ERRORS ALSO ARE
*   PROVIDED. THESE ARE:
* 
*   -LKMRQE: SET A7 = -1, QUEUE JOB AND DISPATCH
* 
*   -LKMQDI: QUEUE JOB AND DISPATCH 
* 
	EJECT			LRPINT 
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
	ENTRY	IHLKM	LKM INTERRUPT HANDLER
	ENTRY	LKM030	SPECIAL TLDSEG REQUEST ERROR ENTRY
	ENTRY	LKMRQE	LKM REQUEST ERROR 
	ENTRY	LKMERR	HALT SYSTEM DUE TO FATAL LKM ERROR
	ENTRY	LKMQDI	QUEUE JOB AND DISPATCH
	ENTRY	IHRTC	RTC INTERRUPT HANDLER
	ENTRY	TIMQUE	POINTER TO FIRST BLOCK IN TIMER QUEUE 
	ENTRY	MONCLO	MONITOR CLOCK 
	ENTRY	IHPFAR	POWER FAILURE INTERRUPT HANDLER 
	ENTRY	INIFLG	INITIALIZATION FLAG 
	ENTRY	PFPOST	PWF POST PROCESSING FLAG
	EJECT			LRPINT 
* 
* 
************* 
* EXTERNALS * 
************* 
* 
* 
	EXTRN	TDISP	DISPATCHER 
	EXTRN	DISQUE	DISPATCHER QUEUE
	EXTRN	PRUN	TTAB OF RUNNING PROGRAM 
	EXTRN	MEXIT	MONITOR TASK EXIT
	EXTRN	MONMMU	MONITOR (SYSTEM) MMU TABLE
	EXTRN	QTJOB	QUEUE TASK 
	EXTRN	QMJOB	QUEUE MONITOR JOB
	EXTRN	SWL48	SWITCH TO LEVEL 48 
	EXTRN	SWLXY	SWITCH TO LEVEL XY 
	EXTRN	FREBLK	SET BLOCK FREE
	EXTRN	SAVE8	SAVE 8 REGISTERS 
	EXTRN	PFINIT	RESTART OF DEVICES
	EXTRN	HALT	HALT MODULE 
	EXTRN	INTSAV	INTERRUPT SAVE MODULE 
	EXTRN	RELPAG	RELEASE PAGE
	EXTRN	TLDSEG	LOAD SEGMENT LKM PROCESSOR
	EXTRN	TTB:SB	SEGMENT BLOCK POINTER 
	EXTRN	TTB:PW	PROGRAM STATUS WORD 
	EXTRN	TTB:SA	FIRST WORD OF SAVE AREA IN TTAB 
	EXTRN	LKMAL	LKM REQUEST TABLE
	EJECT			LRPINT 
* 
* 
***************************************** 
* 
*	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	0
* 
* 
*	A PROGRAM VERSION USING NO MONITOR CLOCK FUNCTIONS
*	IS OBTAINED BY SETTING MONCLK EQU 0.
* 
X:A	EQU	1 
MONCLK	EQU	1
* 
	EJECT			LRPINT 
* 
* 
*   I H L K M 
* 
* 
*   THIS IS THE LKM INTERRUPT HANDLER. THE FOLLOWING
*   STEPS ARE CARRIED OUT:
* 
*   - IF STACK OVERFLOW SYSTEM HALTS. 
* 
*   - ELSE REGISTERS A1 - A14 ARE SAVED IN TTAB FOR RUNNING 
*     PROGRAM.
* 
*   - EXIT CONDITIONS ARE SET AND A BRANCH IS MADE TO 
*     APPROPRIATE LKM PROCESSOR.
* 
*   EXIT CONDITIONS ARE:
* 
*   A4 = LABEL ADDRESS OF LKM REQUEST 
*        (A4 = 0 INDICATES NO LABEL IN LKM REQUEST) 
*   A5 = TTAB ADDRESS OF CALLING PROGRAM
*   A6 = LKM DATA DIRECTIVE 
*   A2, A3 ARE LOST.
* 
*   ALL OTHER REGISTERS REMAIN UNCHANGED FROM CALLING 
*   PROGRAM.
* 
* 
* 
IHLKM	EQU	* 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	RIT	/1D	RESET INTERNAL INTERRUPT FLAG
* 
	EJECT			LRPINT 
* 
* 
	ST	A15,LKM010	SAVE A15 
	LD	A15,PRUN	LOAD TTAB ADDRESS
* 
	IFT	CPU852=1 
	ADKL	A15,TTB:SA+28	SET A15 TO LAST IN SAVE AREA
	STR	A14,A15	SAVE USER REGISTERS, -A14
	STR	A13,A15	-A13 
	STR	A12,A15	-A12 
	STR	A11,A15	-A11 
	STR	A10,A15	-A10 
	STR	A9,A15	-A9 
	STR	A8,A15	-A8 
	STR	A7,A15	-A7 
	STR	A6,A15	-A6 
	STR	A5,A15	-A5 
	STR	A4,A15	-A4 
	STR	A3,A15	-A3 
	STR	A2,A15	-A2 
	STR	A1,A15	-A1 
	XIF
* 
	IFT	CPU852=0 
	MS	14,TTB:SA+2,A15	SAVE A1-A14 IN TTAB SAVE AREA 
	XIF
* 
	LD	A5,PRUN	GET TTAB ADDRESS OF CALLING TASK
	LDKL	A15,0	RESTORE A15 STACK POINTER 
LKM010	EQU	*-2
* 
	EJECT			LRPINT 
* 
*   GET LKM REQUEST PARAMETERS
* 
	LDR*	A3,A15
	LDR*	A2,A15	LOAD P.C. AND ADJUST STACK POINTER 
	ST	A3,TTB:PW,A5	STORE PSW IN TTAB
* 
	IFT	MMUPAG=0 
	LD	A3,-2,A2	GET INSTRUCTION CODE 
	LDR*	A6,A2	GET DATA DIRECTIVE
	XIF
* 
	IFT	MMUPAG=1 
	ANK	A3,1 
	RF(NZ)	LKM015	USER MODE
	TL	MONMMU	NO, LOAD MONITOR MMU TABLE 
* 
LKM015	EQU	*
 	EL	A3,-2,A2	GET INSTRUCTION CODE
	ELR	A6,A2	GET DATA DIRECTIVE 
	XIF
* 
	CWK	A3,/2804 
	RF(E)	LKM025	LKM 
	CWK	A3,/6300 
	RF(E)	LKM025	TRAP
* 
*   STACK OVERFLOW: HALT SYSTEM 
* 
	LDK	A1,7	HALT PARAMETER
	RF	LKM070	HALT SYSTEM DUE TO STACK OVERFLOW
* 
	EJECT			LRPINT 
* 
* 
LKM025	EQU	*
	IFT	DSKPAG=1 
	LD	A3,TTB:SB,A5	GET SEGMENT BLOCK ADDRESS
	RF(Z)	LKM027	NO SEGMENT
	LCR	A4,A3	GET SEGMENT STATUS 
	ANK	A4,/1E	CHECK IF CORE RESIDENT OR...
	RF(NZ)	LKM027	...USED BY AN INTERRUPTED TASK 
* 
*   INSERT PAGE BLOCK IN PAGE QUEUE 
* 
	CF	A15,RELPAG	RELEASE PAGE 
	LD	A4,TTB:PW,A5	GET PSW
	ST	A4,-2,A15	RESTORE PSW ON STACK
	XIF
* 
LKM027	EQU	*
	IFF	MMUPAG+DSKPAG=0
	CWK	A6,9	CHECK DATA DIRECTIVE
	ABL(E)	TLDSEG	LOAD SEGMENT REQUEST 
	XIF
* 
	EJECT			LRPINT 
* 
* 
LKM030	EQU	*
	CM	PRUN	INDICATE IDLE LOOP RUNNING 
	CF	A15,SWL48	SWITCH TO LEVEL 48
	LDK	A4,0 
	LDR	A3,A6	GET DATA DIRECTIVE 
	RF(NN)	LKM050	NO LABEL 
* 
*   LKM REQUEST WITH LABEL
* 
	ADK	A2,2 
	NGR	A3,A3	MAKE DATA DIRECTIVE POSITIVE 
* 
	IFT	MMUPAG=0 
	LDR*	A4,A2	GET LABEL 
	XIF
* 
	IFT	MMUPAG=1 
	ELR	A4,A2	GET LABEL
	XIF
* 
	EJECT			LRPINT 
* 
*   UPDATE TTB:SA AND GO TO LKM PROCESSOR 
* 
LKM050	EQU	*
	ADK	A2,2	SAVE NEXT ADDRESS TO
	ST	A2,TTB:SA,A5	EXECUTE IN TTAB
	ADR	A3,A3	GET INDEX IN LKMAL 
	RF(Z)	LKMQDI	PROGRAM SWITCH REQUEST
	CW	A3,LKMAL
	RF(NL)	LKMRQE	INVALID DATA DIRECTIVE 
	INH
	LD	A3,LKMAL,A3 
	ABR(NZ)	A3	BRANCH TO LKM PROCESSOR 
* 
	EJECT			LRPINT 
* 
* 
*   L K M E R R 
* 
* 
LKMERR	LDK	A1,15	INDICATE REQUESTED LKM PROC. NOT PRESENT 
* 
LKM070	EQU	*
	CF	A15,HALT	HALT SYSTEM
* 
* 
*   L K M R Q E 
* 
*   SET A7 = -1, QUEUE TERMINAL JOB AND DISPATCH. 
* 
*   A5 = TTAB ADDRESS 
* 
* 
LKMRQE	EQU	*
	LDKL	A2,-1 
	ST	A2,TTB:SA+14,A5	SET -1 IN SAVE AREA A7
* 
* 
*   L K M Q D I 
* 
*   QUEUE TERMINAL JOB AND DISPATCH.
* 
*   A5 = TTAB ADDRESS 
* 
* 
LKMQDI	EQU	*
	CF	A15,QTJOB 
* 
T:DISP	EQU	*	COMMON EXIT TO DISPATCHER
	ABL	TDISP	GO TO DISPATCHER 
	EJECT			LRPINT 

* 
*   I H P F A R 
* 
*   THIS IS THE POWER FAIL/AUTO RESTART INTERRUPT HANDLER.
* 



	DATA	0 
TTABPF	DATA	0	TTAB FOR POWER FAIL 
	DATA	'#P'
	DATA	0 
A15SAV	DATA	0 
	DATA	/00C0 
	DATA	PFTASK





PFX	DATA	1	POWER ON/OFF INDICATOR 
			P=POWER IS ON, N=POWER IS OFF

INIFLG	DATA	1	INITIALIZATION FLAG 
			NZ=INITIALIZATION

PFPOST	DATA	0	PWF POST PROCESSING FLAG
			NZ=PWF POST PROCESSING 
	EJECT			LRPINT 

* 
*   POWER FAIL/AUTO RESTART INTERRUPT 
* 

IHPFAR	EQU	*	 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	RIT	/17	RESET INTERNAL INTERRUPT 
	C1S	PFX	INDICATE POWER ON OR OFF 
	RF(P)	POWON	POWER ON 
* 
*   POWER OFF 
* 
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A14 ON STACK
	STR	A9,A15 
	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,A15SAV	SAVE A15 FOR BETTER TIMES
	HLT
	EJECT			LRPINT 

* 
*   POWER ON
* 

POWON	LD	A15,A15SAV	RELOAD A15

	IFT	CPU852=1 
	LDR*	A14,A15	RESTORE A9-A14
	LDR*	A13,A15 
	LDR*	A12,A15 
	LDR*	A11,A15 
	LDR*	A10,A15 
	LDR*	A9,A15
	XIF

	IFT	CPU852=0 
	MLR	14,A15	RESTORE A9-A14
	MSR	8,A15
	XIF

	LD	A1,DISQUE	QUEUE PFTASK FIRST FOR DISPATCHING
	LDKL	A2,TTABPF 
	CWR	A1,A2
	RB(E)	T:DISP	ALREADY QUEUED, PWF DURING PFPOST 
	STR	A1,A2
	ST	A2,DISQUE 
	IM	PFPOST	INDICATE PWF POST PROCESSING 
	RB	T:DISP
	EJECT			LRPINT 

* 
*   POWER FAIL TASK 
*   STARTED AFTER ALL PWF POST PROCESSING 
* 

PFTASK	CM	PFPOST	CLEAR PWF POST PROC FLAG 
	CM	INIFLG	AND INIT FLAG
	CF	A15,PFINIT	RESTART I/O DEVICES
	CM	PRUN	EXIT PFTASK
	RB	T:DISP
	EJECT			LRPINT 
* 
*   I H R T C 
* 
*   THIS IS THE REAL TIME CLOCK INTERRUPT HANDLER.
*   THE TIMER QUEUE WILL BE PROCESSED EACH 100 MS.
* 
IHRTC	ST	P,INTSAV	SAVE LAST INTERRUPT 
	RIT	/1B	RESET INTERRUPT FLAG 
	IM	COUNT 
	RF(P)	RTC010	CHECK TIMER QUEUE 
	RTN	A15
* 
RTC010	EQU	*
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A4,-4	SET 100 MS SWITCH 
	ST	A4,COUNT
	LDKL	A2,CLOCK	QUEUE CLOCK ROUTINE AS MJOB
	CF	A15,QMJOB 
* 
	IFT	MONCLK=1 
	IM	SECOND
	RF(P)	RTC025	UPDATE MONITOR CLOCK
	XIF
* 
RTC020	EQU	*
	CF	A15,SWLXY	SWITCH TO LEVEL XY
	RB	T:DISP
* 
	EJECT			LRPINT 
* 
* 
	IFT	MONCLK=1 
* 
*   MONITOR CLOCK UPDATING ROUTINE STARTED EACH SECOND. 
* 
RTC025	EQU	*
	LDKL	A4,-9	SET SECOND SWITCH 
	ST	A4,SECOND 
	LDK	A4,4 
* 
MCLO10	LDK	A3,60	NUMBER OF MINUTES AND SECONDS
MCLO20	IM	MONCLO+2,A4	INCREMENT TIME
	XR	A3,MONCLO+2,A4	CHANGE MINUTES OR HOURS
	RB(NE)	RTC020	GO TO DISPATCHER 
	CM	MONCLO+2,A4	RESTART TIME COUNTER
	SUK	A4,2	END 
	RB(N)	MCLO20	MIDNIGHT CARRY
	RB(P)	MCLO10	UPDATE MINUTES
	LDK	A3,24	UPDATE HOURS 
	RB	MCLO20
	XIF
* 
* 
*   M O N C L O 
* 
* 
MONCLO	EQU	*
	IFT	MONCLK=1 
	DATA	0	ACCUMULATED 24 HOUR CARRY 
	DATA	0	HOUR
	DATA	0	MINUTE
	DATA	0	SECOND
SECOND	DATA	0	SECOND SWITCH 

	XIF
	EJECT			LRPINT 
* 
*   CLOCK ROUTINE STARTED EACH 100 MS.
* 
CLOCK	INH 
	LDKL	A4,TIMQUE	LOAD FIRST TIMER ADDRESS
* 
CLK10	LDR	A6,A4 
CLK20	LDR*	A4,A6	GET TIMER BLOCK
	ABL(Z)	MEXIT	END OF QUEUE
	IM	4,A4	INCREMENT TIMER
	RB(N)	CLK10	NOT TIME OUT 
	RF(Z)	CLK30	TIME OUT 
	LDR*	A3,A4	RELEASE TIMER 
	STR	A3,A6
	CF	A15,FREBLK
	LDR	A4,A2
	CF	A15,FREBLK
	RB	CLK20 
* 
	EJECT			LRPINT 
* 
* 
CLK30	CF	A15,CLK40	CALL TIME OUT ROUTINE
	CF	A15,SWL48	SWITCH TO LEVEL 48
	INH
	RB	CLK10 
* 
CLK40	EQU	* 
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A1,/C4C0	LEVEL 49 AND ENABLE
	ST	A1,18,A15	SET NEW PSW ON STACK
	LD	A2,2,A4	LOAD DISP BLOCK 
	LD	A1,4,A2	GET PARAMETER 
	ABI	2,A2	GO TO TIME OUT ROUTINE
* 
* 
COUNT	DATA	0	100 MS SWITCH
* 
* 
*   T I M Q U E 
* 
*   POINTER TO FIRST BLOCK IN TIMER QUEUE 
* 
* 
TIMQUE	EQU	*
	DATA	0 
* 

	END

Full view