DEFINITION MODULE M2OM;
(* 16.8.90/bp Optionen-Scanner *)
(* 7.1.91/bp neue Option e=entryClear *)
(*$ LargeVars:=FALSE NameChk:=FALSE LongAlign:=FALSE *)
FROM M2DM IMPORT Ident;

TYPE
(*
 * neu 13.10.91/bp
 * saveAllRegs(OneShot) und genDebug (+-X)
 * chipData
 * neu: profile, joker(=bytes,words in dregs)
 * Dies sind 31 Stück!
 *)
 Options=(stkchk,nilchk,rngchk,ovflchk,casechk,retchk,longWordAlign,
	 volatile,safeParmPass,cStrings,joker,genDebug,
	 entcode,entryClear,copyDyn,pardealloc,loadA4,saveA4,saveAllRegs,
	 withimp,namechk,largeVars,chipBss,chipCode,chipData,
	 m68010,m68020,m68030,m68040,m68881,
	 userOpt);

 CompOpts= [MIN(Options)..m68881];
 OptionsSet=SET OF CompOpts;
 OptionError=(optOk,optUndefined,optDefined,optFrozen,optSingleShot);

CONST

(*
  firstDefault=OptionsSet{stkchk..warnings,entryClear}
Fehler 6904!!		-OptionsSet{saveA4,loadA4,chipBss,chipCode,chipData,profile};
*)
  firstDefault=OptionsSet{stkchk..cStrings,joker,entcode..pardealloc,
			  withimp..largeVars};

(* Diese sind von der Kommandozeile angebbar, also halten sie über
   mehrere Module!
 *)
  holdOver=OptionsSet{stkchk,nilchk,entryClear,genDebug,
		rngchk,ovflchk,casechk,retchk,longWordAlign,joker,
		volatile,safeParmPass,largeVars,entryClear,m68010,
		m68020,	m68030,m68040,m68881}; (* +userOpt von cmdLin! *)
  oneShots=OptionsSet{entcode,copyDyn,pardealloc,loadA4,saveA4,saveAllRegs,genDebug};

VAR
 cpuCh:CHAR; (* letzte Angabe '0'..'8' READ ONLY! *)

 debug, optiCode,verbose, iconOn, warnings, profile: BOOLEAN;

(* optiCode=~debug *)
(* wenn gendebug, dann debug,~opticode *)
(* wenn profile, dann ~gendebug! *)

 Option: ARRAY Options OF BOOLEAN; (* READ ONLY!! sehr schnell! *)
 optArr: ARRAY['A'..'Z'] OF Options; (* READ ONLY! *)
(* abCDEFGHIJkLmNOPQRSTuVWXYZ Groß=benutzt, O und G, und T special!*)

 (* Option +-tModName Zielmodul, z.B. MArts, m2smDemo usw. *)
 (* von M2SM verwaltet, von LM benutzt *)
 toName: ARRAY[0..31] OF CHAR;

PROCEDURE HoldNewOption(id{8}:Ident; val{7}:BOOLEAN):BOOLEAN;
(* define von commandline, wenn schon da, dann neue Werte, sonst
   Heap.Allocate. Wenn standardoption:Error
*)

PROCEDURE SetVal(id{8}:Ident; new{6},val{7}:BOOLEAN):OptionError;
(*
 * Wenn new, dannn neu mit val anlegen oder wenn bereits von cmdLine
 * angegeben, dann alten Wert lassen. sonst
 * Pushe Stack der Option id und setze deren Wert auf val.
 *)

PROCEDURE GetVal(id{8}:Ident; VAR val{10}:BOOLEAN):BOOLEAN;
(*
 * Gibt aktuellen Wert der Option id in val zurück. id muss in der Tabelle
 * schon eingetragen sein, sonst RETURN FALSE!
 *)

PROCEDURE Pop(id{8}:Ident):OptionError;
(*
 * Popt den Stack der Option id. id muss schon in der Tabelle eingetragen sein.
 * FALSE: undef. Bezeichner
 *)

PROCEDURE SetCPU(ch{3}:CHAR);
(* setzt alle m68xxx-Optionen entsprechend ch *)
PROCEDURE HoldOption(o{6}:CompOpts; v{7}:BOOLEAN);
(* setzt ganze Option auf v und merkt für nächste Unit *)
PROCEDURE PushOption(o{6}: CompOpts; v{7}: BOOLEAN);
PROCEDURE PopOption(o{6}: CompOpts); (*immer mit 1 nachschieben!*)
PROCEDURE FreezeOptions(set{6}: OptionsSet);
PROCEDURE UnFreezeOptions(set{6}: OptionsSet);

PROCEDURE ShowOpts; (* gibt alles auf Terminal aus *)

PROCEDURE InitM2OM; (* von M2SM.InitScanner aufgerufen! *)

END M2OM.def
