//Mgo.bcpl machine-independent stop, go, breakpoint stuff // Last edited: 9 June 1980 //***Many changes for D0*** get "mdecl.d" get "mcommon.d" external [ // MASM DummyCall; @WssCSS // MRGN AddToEveryTimeList // MTXTBUF TxtBNewChar; InputTextBuffer // MSYM EvalAText // MMENU @WsMarkA; PrintActionTime // MCMD StartCmdOverlay //;StartLargeOverlay WnsCSS; SetAbortPure; @CmdAbortAct; ErrorAbort // MINIT0 MStatus // xxACTIONS GoVec; DetachAct; ExitAct // Machine dependent SetupIMA; @CheckStopped; Stop; MStopped; DefaultGoMemory //; OneStep //Defined here HaltWait; HaltWaitMenu; CollectAddr; HaltProc StartSetup; @QuitF; @CantContinue; CallAVec // Defined here for ACTIONS SingleStepM; CallWithAddr; StartWithAddr //; StartBigOvlWithAddr ProceedM; StartM ] static [ @QuitF; @CantContinue = 0; CallAVec ] //In the action table to call SingleStepM. let CallWithAddr(lvProc,MB,nil) be CollectAddr(DummyCall,lvProc,MB) //In the action table to call StartM and OpcodeStep (D1) and StartWithAddr(lvProc,MB,nil) be CollectAddr(StartCmdOverlay,lvProc,MB) //**This has to be resident (calls StartLargeOverlay) //In the action table to call SimGo (D1) //and StartBigOvlWithAddr(lvProc,MB,nil) be // CollectAddr(StartLargeOverlay,lvProc,MB) //CollectAddr collects an address argument from the command line and calls //a procedure like DummyCall, StartCmdOverlay, or StartLargeOverlay. //The first arg to the call is MB. The next two args, omitted if nothing //is on the command line, are AVec and MemX. ErrorAbort if the input text //is not an address. and CollectAddr(Proc,lvCalled,MB) be [ test InputTextBuffer!0 le 0 ifso Proc(lvCalled,MB) ifnot [ let X,AVal = 1,vec size AVal/16 unless EvalAText(InputTextBuffer,lv X,AVal,false, DefaultGoMemory()) do ErrorAbort() unless AVal>>AVal.TypeStorage eq MemTypeStorage do ErrorAbort() Proc(lvCalled,MB,lv AVal>>AVal.Addr,AVal>>AVal.X) ] TxtBNewChar(177B) //Clear command line so ;G continues ] and SingleStepM(MB,AVec,MemX; numargs NA) = StartSetup(false,AVec,MemX,NA,"Step at ","Next step at ",MB) and StartM(MB,AVec,MemX; numargs NA) = StartSetup(true,AVec,MemX,NA,"Go ","Resume ",MB) and StartSetup(RunP,AVec,MemX,NA,S1,S2,MB) = valof [ SetupIMA(RunP,AVec,MemX,NA,(NA ge 3 ? S1,S2),MB) SetAbortPure(lv HaltProc,nil) QuitF = AddToEveryTimeList(HaltWait,nil) MStatus>>MStatus.MachRunning = true resultis DetachMenu ] and ProceedM(nil,MB,nil) be [ StartCmdOverlay(lv StartM,MB); TxtBNewChar(#177) ] and HaltWait(nil) be [ if CheckStopped() then MStopped(true) PrintActionTime() ] //This is used for keyboard halts to all the indefinitely computing //go loops. and HaltProc(nil,nil,nil) be [ if CheckStopped() eq 0 then Stop() test CheckStopped() ne 0 ifso [ WssCSS(", Aborted"); MStopped() ] ifnot WssCSS(", Didn't halt") ] and HaltWaitMenu(nil,nil) be WsMarkA(CmdAbortAct) and DetachMenu(S,nil) be [ WsMarkA(CmdAbortAct); WsMarkA(DetachAct); WsMarkA(ExitAct) ]