Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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();
            });
        }
Ejemplo n.º 3
0
        public StackTracker(Workbench workbench)
        {
            _workbench = workbench;
            MachineOperator mo = workbench._mo;

            _cpu          = mo.Machine.Cpu;
            _memory       = mo.Machine.Memory;
            _stackWrapper = new StackWrapper(mo);
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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;
        }
Ejemplo n.º 7
0
        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();
        }
Ejemplo n.º 8
0
        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;
            }
        }
Ejemplo n.º 9
0
        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;
        }
Ejemplo n.º 10
0
        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();
        }
Ejemplo n.º 11
0
 private void mo_OnClosing(MachineOperator mo)
 {
     TraceLine("Workbench: mo_OnClosing");
     _script.TearDown(mo);
 }
Ejemplo n.º 12
0
 public void TearDown(MachineOperator mo)
 {
     MachineOperator.WriteMessage("WorkbenchScript: mo_OnClosing");
     CloseLog();
 }
Ejemplo n.º 13
0
 public WorkbenchScript(Workbench workbench)
 {
     _workbench = workbench;
     _mo        = _workbench._mo;
     _logOutput = File.AppendText(@"s:\source\repos\Robotron_2084\VirtuRoC\tmp\out.log");
 }
Ejemplo n.º 14
0
 public void LogEnter([Argument(Source.Arguments)] object[] args)
 {
     MachineOperator.WriteMessage($"Trigger '{args[0].ToString()}'");
 }
Ejemplo n.º 15
0
 public void LogEnter([Argument(Source.Name)] string name)
 {
     MachineOperator.WriteMessage($"OnExit '{name}'");
 }
Ejemplo n.º 16
0
 [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
 }