packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/PMOS/sources/notdone/spurious.mod

IMPLEMENTATION MODULE SpuriousInterrupts;

	(****************************************************************)
	(*								*)
	(*	Spurious interrupt handler for operating system.	*)
	(*								*)
	(*	Author:		P. Moylan				*)
	(*	Last edited:	18 March 1991				*)
	(*	Description:						*)
	(*		This module contains interrupt handlers for	*)
	(*		interrupts 0-7 and 11-13, which are not		*)
	(*		supposed to occur in the present version of my	*)
	(*		software.  The aim is to detect unexpected	*)
	(*		interrupts.					*)
	(*								*)
	(*	Status:	Seems OK, but not adequately tested.		*)
	(*								*)
	(****************************************************************)

FROM LowLevelIO IMPORT
    (* proc *)	EnterCriticalSection, LeaveCriticalSection,
		ProcessorStatus;

FROM Interrupts IMPORT
    (* proc *)	InstallInterruptTask, AcknowledgeInterrupt;

FROM TaskControl IMPORT
    (* proc *)	WaitForInterrupt;

FROM GlassTTY IMPORT
    (* proc *)	WriteString, WriteCard, WriteLn, WriteHexWord;

(************************************************************************)
(*									*)
(*  Remark: The interrupts which are NOT spurious, i.e. the ones which	*)
(*  are genuinely used by my software, are:				*)
(*									*)
(*		 8	timer						*)
(*		 9	keyboard					*)
(*		10	analogue input					*)
(*		14	floppy disk					*)
(*		15	printer						*)
(*									*)
(*  The analogue input interrupt is a little strange: the hardware	*)
(*  actually produces an INT 113 (the second request line of interrupt	*)
(*  controller 2), but then the BIOS maps this back to INT 10.		*)
(*									*)
(************************************************************************)

TYPE InterruptNumber = [0..15];

VAR

    (* Array Handler lists the interrupt routines in this module.	*)

    Handler: ARRAY InterruptNumber OF PROC;

(************************************************************************)

PROCEDURE ErrorMessage (number: InterruptNumber);

    (* Puts an error message on the screen.	*)

    BEGIN
	WriteLn; WriteString ("ERROR: Unexpected interrupt ");
	WriteCard (number);
	WriteString ("  Processor status word is ");
	WriteHexWord (ProcessorStatus());
    END ErrorMessage;

(************************************************************************)

PROCEDURE Handler0;

    (* Interrupt routine for interrupt #0.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(0);  ErrorMessage(0);
	END (*LOOP*);
    END Handler0;

(************************************************************************)

PROCEDURE Handler1;

    (* Interrupt routine for interrupt #1.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(1);  ErrorMessage(1);
	END (*LOOP*);
    END Handler1;

(************************************************************************)

PROCEDURE Handler2;

    (* Interrupt routine for interrupt #2.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(2);  ErrorMessage(2);
	END (*LOOP*);
    END Handler2;

(************************************************************************)

PROCEDURE Handler3;

    (* Interrupt routine for interrupt #3.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(3);  ErrorMessage(3);
	END (*LOOP*);
    END Handler3;

(************************************************************************)

PROCEDURE Handler4;

    (* Interrupt routine for interrupt #4.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(4);  ErrorMessage(4);
	END (*LOOP*);
    END Handler4;

(************************************************************************)

PROCEDURE Handler5;

    (* Interrupt routine for interrupt #5.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(5);  ErrorMessage(5);
	END (*LOOP*);
    END Handler5;

(************************************************************************)

PROCEDURE Handler6;

    (* Interrupt routine for interrupt #6.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(6);  ErrorMessage(6);
	END (*LOOP*);
    END Handler6;

(************************************************************************)

PROCEDURE Handler7;

    (* Interrupt routine for interrupt #7.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(7);  ErrorMessage(7);
	END (*LOOP*);
    END Handler7;

(************************************************************************)

PROCEDURE Handler11;

    (* Interrupt routine for interrupt #11.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(11);  ErrorMessage(11);
	    AcknowledgeInterrupt;
	END (*LOOP*);
    END Handler11;

(************************************************************************)

PROCEDURE Handler12;

    (* Interrupt routine for interrupt #12.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(12);  ErrorMessage(12);
	    AcknowledgeInterrupt;
	END (*LOOP*);
    END Handler12;

(************************************************************************)

PROCEDURE Handler13;

    (* Interrupt routine for interrupt #13.	*)

    BEGIN
	LOOP
	    WaitForInterrupt(13);  ErrorMessage(13);
	    AcknowledgeInterrupt;
	END (*LOOP*);
    END Handler13;

(************************************************************************)

PROCEDURE InitialiseInterruptVectors;

    (* Sets up the interrupt vectors for interrupts 0-7 and 11-13, to	*)
    (* point to the appropriate interrupt handlers.			*)

    VAR j: InterruptNumber;

    BEGIN
	EnterCriticalSection;
	FOR j := 0 TO 7 DO
	    InstallInterruptTask (j, Handler[j]);
	END (*FOR*);
	FOR j := 11 TO 13 DO
	    InstallInterruptTask (j, Handler[j]);
	END (*FOR*);
	LeaveCriticalSection;
    END InitialiseInterruptVectors;

(************************************************************************)

BEGIN
    Handler[0] := Handler0;
    Handler[1] := Handler1;
    Handler[2] := Handler2;
    Handler[3] := Handler3;
    Handler[4] := Handler4;
    Handler[5] := Handler5;
    Handler[6] := Handler6;
    Handler[7] := Handler7;

    Handler[11] := Handler11;
    Handler[12] := Handler12;
    Handler[13] := Handler13;

    InitialiseInterruptVectors;
END SpuriousInterrupts.