|
|
DataMuseum.dkPresents historical artifacts from the history of: Philips Data Systems |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Philips Data Systems Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 17212 (0x433c)
Notes: pts_type(SC)
Names: »LRPINT.SC«
└─⟦f350e1b7a⟧ Bits:30009678 Philips computer tape "600219"
└─⟦this⟧ »MONGEN/LRPINT.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