private static void MachineOperator_OnPaused(MachineOperator mo, PausedEventArgs e) { string saveStateFile = @"s:\source\repos\Robotron_2084\VirtuRoC\tmp\save_state.bin"; if (e.BreakpointRCP == _workbench.AsmService.GetAddress("doneAtari")) { _machineOperator.Machine.SaveStateToFile(saveStateFile); try { Cpu cpu = _machineOperator.Machine.Cpu; int divideAX = _workbench.AsmService.GetAddress("divideAX"); int rts = _workbench.AsmService.GetAddress("divideAX_RTS"); long min = 10000; long max = 0; for (int A = 0; A <= 255; A++) { for (int X = 1; X <= 255; X++) { cpu.RPC = divideAX; long cycles = Execute4C00(cpu, divideAX, rts, A, X, A / X, A % X); min = cycles < min ? cycles : min; max = cycles > max ? cycles : max; } } Trace.WriteLine($"min={min}, max={max}"); } finally { _machineOperator.LoadStateFromFile(saveStateFile); } } }
static void Main(string[] args) { /* * using (var reader = new StreamReader( @"s:\source\repos\Robotron_2084\VirtuRoX\tmp\MemoryOperations.csv" )) * using (var csv = new CsvReader( reader, Thread.CurrentThread.CurrentCulture )) { * _records = csv.GetRecords<RecordedMemoryOperation>().ToList(); * } * * var bla = _records.GroupBy( info => info.Address ).Select( group => new Tuple<int, int>( group.Key, group.Count() ) ).OrderBy( x => x.Item1 ); * _dict = bla.ToDictionary( x => x.Item1 ); * Console.WriteLine( _dict.Count ); * object[,] res = GetReadCounts( 224, 32 ); * Console.WriteLine( _dict.ToString() ); * return; */ /* * AsmLinesWindow wnd1 = new AsmLinesWindow(); * wnd1.ShowDialog(); * return; */ Parser.Default.ParseArguments <Options>(args) .WithParsed <Options>(o => { ConsoleTraceListener tracer = new ConsoleTraceListener(); Trace.Listeners.Add(tracer); Trace.WriteLine("Main() start"); AsmReader reader = new AsmReader(@"s:\source\repos\Robotron_2084\Disassemblies\Robotron (Apple).asm"); //reader.Test1(); Trace.WriteLine($"Running workbench{(o.Breakpoints ? "with" : "without")} breakpoints: -b {o.Breakpoints}"); using (_machineOperator = new MachineOperator()) { if (o.Breakpoints) { // _machineOperator.OnPaused += MachineOperator_OnPaused; _workbench = new Workbench(_machineOperator, o); } else { _machineOperator.OnLoaded += ( MachineOperator mo ) => mo.LoadStateFromFile(mo.BlaBin); } //Form1 frm = new Form1(); //frm.Populate(); //frm.Show(); _machineOperator.ShowDialog(); } Trace.WriteLine("Main() end"); Trace.Flush(); Trace.Listeners.Remove(tracer); tracer.Close(); Trace.Close(); }); }
public StackTracker(Workbench workbench) { _workbench = workbench; MachineOperator mo = workbench._mo; _cpu = mo.Machine.Cpu; _memory = mo.Machine.Memory; _stackWrapper = new StackWrapper(mo); }
public StackWrapper(MachineOperator mo) { _cpu = mo.Machine.Cpu; _memory = mo.Machine.Memory; for (int stackPtr = 0xff; stackPtr >= 0; stackPtr--) { _stackBytes[stackPtr] = new StackByte(_memory, stackPtr); } }
private void mo_OnLoaded(MachineOperator mo) { TraceLine("Workbench: mo_OnLoaded"); _mo.MainPage.AsmAction = DoAction; _window1 = new AsmLinesWindow(); _window1.Show(); _window1.ScrollToAddress(0x4000); _script = new WorkbenchScript1(this); }
public VirtuRoCWpfKeyboardService(MachineOperator mop, Machine machine, UserControl page) : base(machine) { if (page == null) { throw new ArgumentNullException("page"); } _operator = mop; page.KeyDown += OnPageKeyDown; page.KeyUp += OnPageKeyUp; page.GotKeyboardFocus += (sender, e) => _updateAnyKeyDown = true; }
public void SampleTest() { Trace.Indent(); Parser.Default.ParseArguments <Options>(new string[] { "-b -c -f" }) .WithParsed <Options>(o => { using (MachineOperator machineOperator = new MachineOperator()) { Workbench workbench = new Workbench(machineOperator, o); machineOperator.ShowDialog(); } }); Trace.Unindent(); }
public void mo_OnPause(MachineOperator mo, PausedEventArgs e) { FlushLog(); _mo.MainPage.StateText = SafeGetLabel(e.BreakpointRCP); switch (e.PausedReason) { case PausedReason.Breakpoint: _sm.Fire(_breakpointTrigger, e); break; case PausedReason.Keypress: // do nothing // it doesn't help to see a partial log, better execute until next breakpoint break; } }
public Workbench(MachineOperator mo, Options options) { _mo = mo; _mo.OnLoaded += mo_OnLoaded; _mo.OnClosing += mo_OnClosing; _mo.OnPaused += mo_OnPause; _options = options; AsmService = new AsmService(); RecordedOperations = new RecordedOperations(_mo.Machine); _mem = _mo.Machine.Memory; _cpu = _mo.Machine.Cpu; _mem.OnRead += mem_OnRead; _mem.OnReadZeroPage += mem_OnRead; _mem.OnWrite += mem_OnWrite; _mem.OnWriteZeroPage += mem_OnWrite; _cpu.OnExecuted += cpu_OnExecuted; }
private void mo_OnPause(MachineOperator mo, PausedEventArgs e) { _script.mo_OnPause(mo, e); TraceLine($"executed: {_executed}, reads: {_reads}, writes: {_writes}"); using (var writer = new StreamWriter(@"s:\source\repos\Robotron_2084\VirtuRoC\tmp\MemoryOperations.csv")) using (var csv = new CsvWriter(writer, Thread.CurrentThread.CurrentCulture)) { csv.WriteRecords(RecordedOperations.MemoryOperations); } using (var writer = new StreamWriter(@"s:\source\repos\Robotron_2084\VirtuRoC\tmp\ExecutedOperations.csv")) using (var csv = new CsvWriter(writer, Thread.CurrentThread.CurrentCulture)) { csv.WriteRecords(RecordedOperations.ExecutedOperations); } _window1.ScrollToAddress(e.BreakpointRCP); // TODO: Warum brauchen wir hier auch ein MainPage.Focus() ? _mo.MainPage.Focus(); }
private void mo_OnClosing(MachineOperator mo) { TraceLine("Workbench: mo_OnClosing"); _script.TearDown(mo); }
public void TearDown(MachineOperator mo) { MachineOperator.WriteMessage("WorkbenchScript: mo_OnClosing"); CloseLog(); }
public WorkbenchScript(Workbench workbench) { _workbench = workbench; _mo = _workbench._mo; _logOutput = File.AppendText(@"s:\source\repos\Robotron_2084\VirtuRoC\tmp\out.log"); }
public void LogEnter([Argument(Source.Arguments)] object[] args) { MachineOperator.WriteMessage($"Trigger '{args[0].ToString()}'"); }
public void LogEnter([Argument(Source.Name)] string name) { MachineOperator.WriteMessage($"OnExit '{name}'"); }
[Advice(Kind.Before)] // you can have also After (async-aware), and Around(Wrap/Instead) kinds public void LogEnter([Argument(Source.Name)] string name) { MachineOperator.WriteMessage($"OnEntry '{name}'"); //you can debug it }