@database FPUExc
@node Main "FPUExc"

Prozeduren

   @{" ClearExc " link Modul 34}                    @{" DisableExc " link Modul 29}                  @{" EnableExc " link Modul 27}
   @{" GetExcSet " link Modul 38}                   @{" GetRounding " link Modul 42}                 @{" SetExc " link Modul 32}
   @{" SetExcSet " link Modul 36}                   @{" SetRounding " link Modul 41}              

Konstanten

   @{" noExc " link Modul 23}                       @{" stdExc " link Modul 21}                   

Typ-Deklarationen

   @{" fpuExc " link Modul 15}                      @{" fpuExcSet " link Modul 17}                   @{" roundingMode " link Modul 18}


@endnode
@node Modul "TMP:Modula-2/FPUExc.def"
DEFINITION MODULE FPUExc;
(*$ NameChk:=FALSE *)

(*
 * 18.7.90/bp
 * Exception-Verwaltung für 68040/68881/68882.
 * Wenn das Modul nur importiert wird, werden die FPU-
 * Traps aus 'stdExc' erlaubt, d.h. die Überprüfungen der
 * FPU sind vollständig.
 * Falls keine FPU im System ist, passiert gar nichts,
 * bzw. RETURN ist 0
 * Die aufgelaufenen Exceptions im FPSR werden nur beim
 * Start gelöscht, nicht von den Prozeduren!
 *)

TYPE
  @{" fpuExc " link FPUExc/Modul 15}=(inex1,inex2,dz,unfl,ovfl,operr,snan,bsun);
  @{" fpuExcSet " link FPUExc/Modul 17}=SET OF @{" fpuExc " link FPUExc/Modul 15};
  @{" roundingMode " link FPUExc/Modul 18}=
    (toNearest,toZero,toMinusInfty,toPlusInfty);

CONST
  stdExc=@{" fpuExcSet " link FPUExc/Modul 17}{dz..bsun}; (* NICHT (!) inex1,inex2 *)
  noExc =@{" fpuExcSet " link FPUExc/Modul 17}{};

(* default (nur importieren) ist: {dz..bsun} *)

PROCEDURE EnableExc;
            (* alle stdExc ON *)
PROCEDURE DisableExc;
            (* alles OFF, toNearest, round extended *)

PROCEDURE SetExc(e{0}:@{" fpuExc " link FPUExc/Modul 15});
            (* einzelne setzen/löschen *)
PROCEDURE ClearExc(e{0}:@{" fpuExc " link FPUExc/Modul 15});

PROCEDURE SetExcSet(s{0}:@{" fpuExcSet " link FPUExc/Modul 17});
            (* genau den Set setzen *)
PROCEDURE GetExcSet():@{" fpuExcSet " link FPUExc/Modul 17};
            (* aktuellen Zustand holen *)

PROCEDURE SetRounding(r{0}:@{" roundingMode " link FPUExc/Modul 18});
PROCEDURE GetRounding():@{" roundingMode " link FPUExc/Modul 18};

END FPUExc.

@endnode
