-- State.mesa last edit, Johnsson September 16, 1980 5:06 PM -- Bruce on Oct 10, 1980 2:58 PM DIRECTORY BcdDefs USING [CTIndex, CTNull], Commands USING [CommandRec, Prompt, StringId], DebugOps USING [Foo, FooProc], MachineDefs USING [CFP, ConfigIndex, ExternalStateVector, FHandle, FileHandle, GFHandle, NullConfig, NullGF, nullPHandle, PHandle, SVPointer], PrincOps USING [SignalDesc], UserInput USING [StringProcType]; State: DEFINITIONS IMPORTS Commands = BEGIN OPEN MachineDefs; WritePrompt: PROC = INLINE {IF gs.resetPrompt THEN Commands.Prompt[]}; -- parsing ParseProc: TYPE = PROCEDURE [CHARACTER]; SetParse: PROCEDURE [proc: ParseProc]; ResetParse: PROCEDURE; StringProc: UserInput.StringProcType; -- global state StringId: TYPE = Commands.StringId; StringArray: TYPE = ARRAY StringId OF STRING; Strings: TYPE = DESCRIPTOR FOR StringArray; strings: Strings; AllStrings: PROCEDURE RETURNS [Strings] = INLINE BEGIN RETURN[strings] END; GetString: PROCEDURE [id: StringId] RETURNS [STRING] = INLINE BEGIN RETURN[strings[id]] END; SetString: PROCEDURE [id: StringId, val: STRING]; gs: GSHandle; GetGS, GetSet: PROCEDURE RETURNS [gsh: GSHandle] = INLINE BEGIN RETURN[gs] END; Msg: TYPE = {none, interrupt, punt, bootloaded, maplog, invalid}; GSHandle: TYPE = POINTER TO GState; GState: TYPE = RECORD [ parse: ParseProc ← LOOPHOLE[0], worryBreaks: BOOLEAN ← FALSE, level: INTEGER ← 0, tree: BOOLEAN ← FALSE, nubLevel: CARDINAL ← 1, search: BOOLEAN ← FALSE, nubFrame, sigGF: GFHandle ← MachineDefs.NullGF, debugging: BOOLEAN ← FALSE, frame, gf, bytePC, acount, ocount: UNSPECIFIED ← 0, spare1: BOOLEAN ← FALSE, aread, oread, owrite: LONG POINTER ← NIL, restartMsg: Msg ← none, loggedIn: BOOLEAN ← FALSE, initBCD: BOOLEAN ← FALSE, worryEntry: BOOLEAN ← FALSE, inNub: BOOLEAN ← FALSE, ready: BOOLEAN ← FALSE, teledebugging: BOOLEAN ← FALSE, -- used by GetString firstChar: BOOLEAN ← TRUE, resetPrompt: BOOLEAN ← TRUE, resetParse: BOOLEAN ← TRUE, tool: BOOLEAN ← FALSE, currentId: Commands.StringId ← NULL, currentString: STRING ← NIL, com2: Commands.CommandRec ← NULL, s1: STRING ← NIL, cr: BOOLEAN ← NULL, call0: PROC ← LOOPHOLE[1], call1: PROC [STRING] ← LOOPHOLE[0], call2: PROC [STRING, STRING] ← LOOPHOLE[0], term: PROC [CHARACTER] RETURNS [BOOLEAN] ← LOOPHOLE[0], spare2: BOOLEAN ← FALSE, ESV: ExternalStateVector ← NULL, StatePtr: SVPointer ← NIL, signal: PrincOps.SignalDesc ← LOOPHOLE[0], breakFrame: FHandle ← NIL, mds: CARDINAL ← 0, debuggerFP, debuggeeFP, selfFP: CFP ← NULL, selfFH, debuggeeFH: FileHandle ← NIL]; -- level dependent state top: PRIVATE Handle; Push: PROCEDURE; Pop: PROCEDURE; Get: PROCEDURE RETURNS [h: Handle] = INLINE BEGIN IF top = NIL THEN ERROR OutOfState; RETURN[top] END; LF: PROC RETURNS [FHandle] = INLINE BEGIN IF top = NIL THEN ERROR OutOfState; RETURN[top.lContext] END; GF: PROC RETURNS [GFHandle] = INLINE BEGIN IF top = NIL THEN ERROR OutOfState; RETURN[top.gContext] END; PSB: PROC RETURNS [PHandle] = INLINE BEGIN IF top = NIL THEN ERROR OutOfState; RETURN[top.pContext] END; DNode: TYPE = RECORD [link: NodeHandle, node: POINTER]; NodeHandle: TYPE = POINTER TO DNode; NodeType: TYPE = {fobs}; ContextType: TYPE = {none, local, psb, global, state, break}; Handle: TYPE = POINTER TO Context; Context: TYPE = RECORD [ prev: Handle ← NIL, lContext: FHandle ← NIL, gContext: GFHandle ← NIL, pContext: PHandle ← nullPHandle, interpretContext: POINTER ← NIL, reentrantParse: ParseProc ← LOOPHOLE[0], howSet: ContextType ← none, cti: BcdDefs.CTIndex ← BcdDefs.CTNull, config: ConfigIndex ← NullConfig, fobs: NodeHandle ← NIL, proc: DebugOps.FooProc ← LOOPHOLE[0], fooStack: POINTER TO Stack ← NIL]; Stack: TYPE = RECORD [link: POINTER TO Stack, foo: DebugOps.Foo]; -- Signals and utilities OnYourMark, Go: PROCEDURE; OutOfState: ERROR; END.