(*---------------------------------------------------------------------------
    :Program.    Interrupt.mod
    :Author.     Fridtjof Siebert
    :Address.    Nobileweg 67, D-7-Stgt-40
    :Shortcut.   [fbs]
    :History.    V1.0, 22-May-88, [fbs], M2-Version
    :History.    V1.1, 08-Apr-90, [fbs], Oberon Version
    :Copyright.  PD
    :Language.   Oberon
    :Translator. Demo Oberon Compiler
    :Contents.   DemoProgramm, daß zeigt, wie man einen Interrupt von Oberon
    :Contents.   aus anlegen kann.
---------------------------------------------------------------------------*)

MODULE Interrupt;

IMPORT I:   Intuition,
       g:   Graphics,
       e:   Exec,
       sys: SYSTEM;

VAR
  NuWindow: I.NewWindow;
  Window: I.WindowPtr;
  VP: g.ViewPortPtr;          (* ViewPort des WB-Screens          *)
  Msg : I.IntuiMessagePtr;    (* Message für WindowClose-Gadget   *)
  VertBIntr: e.Interrupt;     (* Meine Interrupt-Struktur         *)
  ColCount,Wait: INTEGER;     (* Variablen für Interrupt-Prozedur *)
  Increase: INTEGER;          (* Wird Farbe heller oder dunkler ? *)


PROCEDURE MyIntProc(); (* $SaveRegs+ $StackChk- *)

BEGIN

  INC(Wait);
  IF Wait>2 THEN        (* nur jeden 3. Interrupt die Farbe ändern *)
    Wait:=0; INC(ColCount,Increase);
    IF (ColCount=15) OR (ColCount=0) THEN Increase:=-Increase; END;
    g.SetRGB4(VP,1,ColCount,ColCount,ColCount); (* Farbe setzten *)
  END;

END MyIntProc; (* $StackChk= *)


BEGIN

  NuWindow.leftEdge  := 100;
  NuWindow.topEdge   := 75;
  NuWindow.width     := 250;
  NuWindow.height    := 32;
  NuWindow.blockPen  := 1;
  NuWindow.idcmpFlags:= LONGSET{I.closeWindow};
  NuWindow.flags     := LONGSET{I.windowSizing,I.windowDrag,I.windowDepth,I.windowClose};
  NuWindow.checkMark := NIL;
  NuWindow.title     := sys.ADR("Fridi's Interrupt");
  NuWindow.minWidth  := 40;
  NuWindow.minHeight := 20;
  NuWindow.maxWidth  := 640;
  NuWindow.maxHeight := 256;
  NuWindow.type      := {I.wbenchScreen};
  Window := I.OpenWindow(NuWindow);

  IF Window#NIL THEN

    VP := I.ViewPortAddress(Window);

    VertBIntr.node.type := e.interrupt; (* Typ ist Interrupt                *)
    VertBIntr.node.pri  := -60;         (* nich so wichtig                  *)
    VertBIntr.node.name := NIL;         (* kein Name                        *)
    VertBIntr.data := NIL;              (* keine Daten. data ist dann in A1 *)
    VertBIntr.code := MyIntProc;        (* InterruptProzedur                *)

    Increase:= 1; ColCount := 0; Wait := 0;
    e.AddIntServer(e.vertb,sys.ADR(VertBIntr));
    e.WaitPort(Window^.userPort);
    e.RemIntServer(e.vertb,sys.ADR(VertBIntr));

  END;

CLOSE

  IF Window#NIL THEN I.CloseWindow(Window) END;

END Interrupt.
