-- Debugger.Mesa Edited by: Bruce September 22, 1980 3:58 PM DIRECTORY Actions USING [ReadProc, WriteProc], Ascii USING [SP], DebugFormat USING [OctalFormat], DebugOps USING [LongREAD, LongWRITE, ShortCopyREAD, StringExpToDecimal, StringExpToLOctal, StringExpToOctal], DOutput USING [Char, EOL, LongOctal, Number, Octal, Text], Dump USING [Char], PrincOps USING [StateVector, SVPointer], State USING [GetGS, GSHandle], UserInput USING [ResetUserAbort, userAbort]; Debugger: PROGRAM IMPORTS DebugOps, DOutput, Dump, State, UserInput EXPORTS Actions, DebugOps, Dump = BEGIN data: State.GSHandle ← State.GetGS[]; Abort: PUBLIC SIGNAL = CODE; CommandNotAllowed: PUBLIC SIGNAL = CODE; Proceed: PUBLIC SIGNAL = CODE; Quit: PUBLIC SIGNAL = CODE; Kill: PUBLIC SIGNAL = CODE; AsciiDisplay: PUBLIC PROC [start, chars: STRING] = {AsciiDump[start,chars,TRUE]}; AsciiRead: PUBLIC PROC [start, chars: STRING] = {AsciiDump[start,chars,FALSE]}; AsciiDump: PROCEDURE [start, chars: STRING, interpret: BOOLEAN] = BEGIN i: CARDINAL; s: PACKED ARRAY [0..1] OF CHARACTER; p: POINTER = @s; lp: LONG POINTER ← LOOPHOLE[DebugOps.StringExpToLOctal[start]]; cnt: CARDINAL ← DebugOps.StringExpToDecimal[chars]; DOutput.EOL[]; FOR i IN [0..cnt) DO IF i MOD 2 = 0 THEN p↑ ← DebugOps.LongREAD[lp+i/2]; IF ~interpret THEN DOutput.Char[s[i MOD 2]] ELSE {Dump.Char[s[i MOD 2]]; DOutput.Text[IF i MOD 2 = 0 THEN ","L ELSE "; "L]}; IF UserInput.userAbort THEN {ControlDel[]; RETURN}; ENDLOOP; RETURN END; ControlDel: PROC = {UserInput.ResetUserAbort[]; DOutput.Text[" ... aborted"L]}; Read: PUBLIC PROC [start, cnt: STRING, proc: Actions.ReadProc ← ReadUser] = BEGIN lp: LONG POINTER ← LOOPHOLE[DebugOps.StringExpToLOctal[start]]; num: CARDINAL ← DebugOps.StringExpToDecimal[cnt]; DoRead[lp,num,proc]; END; OctalRead: PUBLIC PROCEDURE [start, cnt: STRING] = {Read[start,cnt]}; ReadUser: PUBLIC PROC [loc: LONG POINTER] RETURNS [UNSPECIFIED] = BEGIN RETURN[DebugOps.LongREAD[loc]] END; DoRead: PUBLIC PROC [ start: LONG POINTER, cnt: CARDINAL, proc: Actions.ReadProc] = BEGIN j,n: CARDINAL; i: INTEGER ← -1; FOR j IN [0..cnt) DO IF UserInput.userAbort THEN RETURN; IF (i ← i+1) MOD 8 = 0 THEN BEGIN DOutput.EOL[]; DOutput.LongOctal[start + j]; DOutput.Char['/] END; DOutput.Char[' ]; DOutput.Number[n ← proc[start+j], DebugFormat.OctalFormat]; DOutput.Char[IF n ~IN[0..7] THEN 'B ELSE Ascii.SP]; ENDLOOP; END; Write: PUBLIC PROC [loc, val: STRING, proc: Actions.WriteProc ← WriteUser] = BEGIN lp: LONG POINTER ← LOOPHOLE[DebugOps.StringExpToLOctal[loc]]; v: UNSPECIFIED ← DebugOps.StringExpToOctal[val]; DoWrite[lp,v,proc]; END; OctalWrite: PUBLIC PROCEDURE [loc, val: STRING] = {Write[loc,val]}; WriteUser: PUBLIC PROC [loc: LONG POINTER, val: UNSPECIFIED] = BEGIN DebugOps.LongWRITE[loc,val] END; DoWrite: PUBLIC PROC [ loc: LONG POINTER,val: UNSPECIFIED, proc: Actions.WriteProc] = BEGIN proc[loc,val] END; EvalStack: PUBLIC PROCEDURE = BEGIN OPEN DOutput; i: CARDINAL; sp: PrincOps.SVPointer ← data.StatePtr; state: PrincOps.StateVector; IF sp = NIL THEN GOTO empty; Text[" ("L]; Octal[sp]; Text[") "L]; DebugOps.ShortCopyREAD[ from: sp, to: @state, nwords: SIZE[PrincOps.StateVector]]; IF state.stkptr = 0 THEN GOTO empty; FOR i IN [0..state.stkptr) DO Char[' ]; Octal[state.stk[i]] ENDLOOP; RETURN EXITS empty => DOutput.Text["empty!"L]; END; END.