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

⟦9504787f4⟧

    Length: 17212 (0x433c)
    Notes: pts_type(SC)
    Names: »LRPINT.SC«

Derivation

└─⟦f350e1b7a⟧ Bits:30009678 Philips computer tape "600219"
    └─⟦this⟧ »MONGEN/LRPINT.SC« 

PTS(SC)

	IDENT LRPINT 	REL 11.0 81-01-26 870105041100 

* 
* 
**************************************************
* 
*   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
* 
*   THE FOLLOWING ENTRIES ARE USED TO QUEUE TASKS:
* 
*   -LKMRQE: SET A7 = -1, QUEUE TASK AND DISPATCH 
* 
*   -LKMSRC: SET A7 TO RETURN CODE (C(A2)), QUEUE TASK AND DISPATCH 
* 
*   -LKMQDI: QUEUE TASK 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 TASK AND DISPATCH 
	ENTRY	LKMSRC	SET RETURN CODE IN A7 TO USER 
	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 TASK
	EXTRN	MEXIT	MONITOR TASK EXIT
	EXTRN	MONMMU	MONITOR (SYSTEM) MMU TABLE
	EXTRN	QTJOB	QUEUE TASK 
	EXTRN	QMJOB	QUEUE MONITOR TASK 
	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	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	1
* 
* 
*	A PROGRAM VERSION USING NO MONITOR CLOCK FUNCTIONS
*	IS OBTAINED BY SETTING MONCLK EQU 0.
* 
X:A	EQU	1 
MONCLK	EQU	1
* 
	EJECT			LRPINT 
* 
* 
*	A PROGRAM VERSION SUPPORTING DATE FUNCTIONS 
*	IS OBTAINED BY SETTING MONDAT = MONCLK = 1. 
* 
X:B	EQU	0 
MONDAT	EQU	1
* 
* 
*	A PROGRAM VERSION WITH MONITOR CLOCK FUNCTIONS
*	ADAPTED TO 60 HERTZ NET FREQUENCY (USA/CANADA)
*	IS OBTAINED BY SETTING NETFRQ EQU 60. 
*	NOTICE THAT THE DEFAULT VALUE SHOULD BE 50. 
* 
NETFRQ	EQU	50 
* 
	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 TASK
* 
*   - 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 TASK 
*   A6 = LKM DATA DIRECTIVE 
*   A2, A3 ARE DESTROYED
* 
*   ALL OTHER REGISTERS REMAIN UNCHANGED FROM CALLING TASK
* 
* 
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	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	INSTRUCTION CODE 
	LDR*	A6,A2	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	INSTRUCTION CODE
	ELR	A6,A2	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	*
	ADK	A2,2	UPDATE DISPATCH ADDRESS 
* 
	IFF	MMUPAG+DSKPAG=0
	CWK	A6,9	CHECK DATA DIRECTIVE
	ABL(E)	TLDSEG	LOAD SEGMENT REQUEST 
	XIF
* 
	IFT	DSKPAG=1 
	LD	A3,TTB:SB,A5	SEGMENT BLOCK ADDRESS
	RF(Z)	LKM030	NO SEGMENT
	LCR	A4,A3	SEGMENT STATUS 
	ANK	A4,/5E	CHECK IF CORE RESIDENT OR...
	RF(NZ)	LKM030	...USED BY AN INTERRUPTED TASK 
	CF	A15,RELPAG	RELEASE PAGE 
	XIF
* 
	EJECT			LRPINT 
* 
* 
LKM030	EQU	*
	CM	PRUN	INDICATE IDLE LOOP RUNNING 
	CF	A15,SWL48	SWITCH TO LEVEL 48
	LDK	A4,0 
	LDR	A3,A6	DATA DIRECTIVE 
	RF(NN)	LKM050	NO LABEL 
* 
*   LKM REQUEST WITH LABEL
* 
	IFT	MMUPAG=0 
	LDR*	A4,A2	LABEL 
	XIF
* 
	IFT	MMUPAG=1 
	ELR	A4,A2	LABEL
	XIF
* 
	ADK	A2,2	ADJUST DISPATCH ADDRESS 
	NGR	A3,A3	MAKE DATA DIRECTIVE POSITIVE 
* 
	EJECT			LRPINT 
* 
*   UPDATE TTB:SA AND GO TO LKM PROCESSOR 
* 
LKM050	EQU	*
	ST	A2,TTB:SA,A5	SET NEXT DISPATCH ADDRESS
	ADR	A3,A3	INDEX IN LKMAL 
	RF(Z)	LKMQDI	TASK 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 TASK AND DISPATCH. 
* 
*   A5 = TTAB ADDRESS 
* 
* 
LKMRQE	EQU	*
	LDKL	A2,-1 
* 
* 
*   L K M S R C 
* 
*   SET A7 = A2, QUEUE TASK AND DISPATCH. 
* 
*   A2 = RETURN CODE
*   A5 = TTAB ADDRESS 
* 
* 
LKMSRC	EQU	*
	ST	A2,TTB:SA+14,A5	SET RETURN CODE IN SAVE AREA A7 
	EJECT
* 
* 
*   L K M Q D I 
* 
*   QUEUE TASK 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	SEGMENT BLOCK ADDRESS 
	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
* 
	EJECT			LRPINT 
* 
* 
	IFT	NETFRQ=50
	LDKL	A4,-4	SET 100 MS SWITCH 
	ST	A4,COUNT
	XIF
* 
	IFT	NETFRQ=60
	LDKL	A4,-5	SET 100 MS SWITCH 
	XIF
* 
	LDKL	A2,CLOCK	QUEUE CLOCK ROUTINE AS MJOB
	CF	A15,QMJOB 
* 
	IFT	MONCLK=1 
	IM	SECOND
	RF(P)	RTC025	UPDATE MONITOR CLOCK
	XIF
* 
SWDISP	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)	SWDISP	GO TO DISPATCHER 
	CM	MONCLO+2,A4	RESTART TIME COUNTER
	SUK	A4,2	END 
	RF(N)	MCLO30	MIDNIGHT CARRY AND WE HAVE A NEW DAY
	RB(P)	MCLO10	UPDATE MINUTES
	LDK	A3,24	UPDATE HOURS 
	RB	MCLO20
* 
MCLO30	EQU	*
	IM	MCARRY	INCREMENT MIDNIGHT CARRY 
* 
	EJECT			LRPINT 
* 
* 
	IFT	MONDAT=1 
* 
*	UPDATE DAY, MONTH AND YEAR
* 
	IFT	CPU852=1 
	LDKL	A1,MONTH	MONTH ADDRESS
	LDKL	A2,DAY	DAY ADDRESS
	LDK	A3,1 
	XIF
* 
	IFT	MONCLK+MONDAT=2
	IFT	CPU852=0 
	MLK	3
	DATA	MONTH,DAY,1	MONTH AND DAY ADDRESS TO A1 AND A2
	XIF
* 
	IFT	MONCLK+MONDAT=2
	IMR	A2	INCREMENT DAY 
	LDR*	A4,A1	MONTH 
	LDR	A6,A4
	LDR*	A5,A2	NEW DAY 
	SUK	A5,29	CHECK IF DAY WAS 28
	RF(Z)	MCLO40	YES, GO AND CHECK IF FEBRUARY 
	SUK	A5,2	CHECK IF DAY WAS 30 
	RF(Z)	MCLO60	YES 
	SUK	A5,1	CHECK IF DAY WAS 31 
	RB(NZ)	SWDISP	NO, RETURN 
	RF	MCLO50	YES, WE HAVE A NEW MONTH 
* 
MCLO40	EQU	*
	SUK	A6,2	CHECK IF FEBRUARY 
	RB(NZ)	SWDISP	NO, RETURN 
* 
	EJECT			LRPINT 
* 
*	CHANGE TO NEW MONTH (AND YEAR?) 
* 
* 
MCLO50	EQU	*
	STR	A3,A2	SET DAY := 1 
	IMR	A1	INCREMENT MONTH 
	SUK	A4,12	CHECK IF MONTH WAS DECEMBER
	RB(NZ)	SWDISP	NO, RETURN 
	STR	A3,A1	SET MONTH TO JANUARY 
	IM	YEAR	HAPPY NEW YEAR!!!
	RB	SWDISP	RETURN 
* 
MCLO60	EQU	*
	LDR	A7,A6	MONTH
	ANK	A6,1 
	RF(Z)	MCLO70	MONTH EVEN
	SUK	A7,7 
	RB(P)	MCLO50	SEPTEMBER OR NOVEMBER 
	RB	SWDISP	JANUARY, MARCH, MAY OR JULY
* 
MCLO70	EQU	*
	SUK	A7,7 
	RB(N)	MCLO50	APRIL OR JUNE 
	XIF
* 
	IFT	MONCLK=1 
	RB	SWDISP	RETURN 
	XIF
* 
	EJECT			LRPINT 
* 
* 
*   M O N C L O 
* 
* 
	IFT	MONCLK+MONDAT=2
	DATA	0	THIS WORD USED BY MONTIM (TDATE)
YEAR	DATA	0 
MONTH	DATA	0
DAY	DATA	0
	XIF
* 
MONCLO	EQU	*
	IFT	MONCLK=1 
MCARRY	DATA	0	ACKUMULATED 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	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	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