public Debugger(DMGBoard b) { InitializeComponent(); disassembler.RetrieveVirtualItem += Debug_RetrieveVirtualItem; disassembler.DoubleBuffered(true); StackView.RetrieveVirtualItem += Stack_RetrieveVirtualItem; Shown += Debugger_Shown; KeyPreview = true; KeyDown += new KeyEventHandler(Debugger_KeyDown); hexBox1.ByteProvider = new DynamicMemoryByteProvider(b); hexBox1.Width = hexBox1.RequiredWidth + 20; labels = new List <Symbol.Label>(); Board = b; Memory = b.GetMemoryManagementUnit(); CPU = (DMGCPU)b.CPU; PPU = (DMGPPU)b.PPU; cart = (Cartridge)b.GetComponents()[0]; String symbolPath = Path.GetDirectoryName(cart.GetRomPath()) + '\\' + Path.GetFileNameWithoutExtension(cart.GetRomPath()) + ".sym"; labels = symbol_loader(symbolPath); disasm = new Disassembler(CPU); assemblies = disasm.Disassemble(); disassembler.VirtualListSize = assemblies.Count + 0x8000; foreach (Components.Component c in Board.GetComponents()) { componentList.Items.Add(c.GetType().Name); } }
static void Main() { for (int i = 0; i < Diagnostics.Length; i++) { Diagnostics[i] = 0; } // Create render target window form = new RenderForm(); form.StartPosition = FormStartPosition.CenterScreen; form.ClientSize = new System.Drawing.Size(160 * 4, 144 * 4); form.WindowState = FormWindowState.Minimized; form.Show(); form.Focus(); form.WindowState = FormWindowState.Normal; // Create swap chain description var swapChainDesc = new SwapChainDescription() { BufferCount = 2, Usage = Usage.RenderTargetOutput, OutputHandle = form.Handle, IsWindowed = true, ModeDescription = new ModeDescription(160, 144, new Rational(60, 1), Format.R8G8B8A8_UNorm), SampleDescription = new SampleDescription(1, 0), Flags = SwapChainFlags.AllowModeSwitch, SwapEffect = SwapEffect.Discard }; // Create swap chain and Direct3D device // The BgraSupport flag is needed for Direct2D compatibility otherwise new RenderTarget() will fail! Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport, swapChainDesc, out Device device, out swapChain); // Get back buffer in a Direct2D-compatible format (DXGI surface) backBuffer = Surface.FromSwapChain(swapChain, 0); // Create Direct2D factory using (var factory = new FactoryD2D()) { var dpi = factory.DesktopDpi; // Create bitmap render target from DXGI surface renderTarget = new RenderTarget(factory, backBuffer, new RenderTargetProperties() { DpiX = 0, DpiY = 0, MinLevel = SharpDX.Direct2D1.FeatureLevel.Level_DEFAULT, PixelFormat = new PixelFormat(Format.Unknown, SharpDX.Direct2D1.AlphaMode.Ignore), Type = RenderTargetType.Hardware, Usage = RenderTargetUsage.None }); } backBufferBMP = new Bitmap(renderTarget, new Size2(160, 144), new BitmapProperties(renderTarget.PixelFormat)); Color[] palette = new Color[4]; palette[0] = Color.White; palette[1] = Color.LightGray; palette[2] = Color.DarkGray; palette[3] = Color.Black; Color[] bitmap = new Color[160 * 144]; while (true) { STOP = false; OpenFileDialog of = new OpenFileDialog { Filter = "Game Boy Files (*.gb)|*.gb|Game Boy Color Files (*.gbc)|*.gbc", RestoreDirectory = true }; of.ShowDialog(); DMGBoard Board = DMGBoard.Builder(of.FileName); AddKeyListeners(form, Board); Debugger d = new Debugger(Board); //d.Show(); //Application.Run(); RenderLoop rl = new RenderLoop(form); while (rl.NextFrame() && !STOP) { int[] temp = Board.RunOneFrame(); for (int i = 0; i < temp.Length; i++) { bitmap[i] = palette[temp[i]]; } renderTarget.BeginDraw(); renderTarget.Transform = Matrix3x2.Identity; renderTarget.Clear(Color.Black); backBufferBMP.CopyFromMemory(bitmap, 160 * 4); renderTarget.DrawBitmap(backBufferBMP, 1f, BitmapInterpolationMode.NearestNeighbor); renderTarget.EndDraw(); swapChain.Present(1, PresentFlags.Restart); } d.Dispose(); } renderTarget.Dispose(); swapChain.Dispose(); device.Dispose(); //Application.Run(); }
public DynamicMemoryByteProvider(DMGBoard b) { B = b; mmu = b.GetMemoryManagementUnit(); }
public static void AddKeyListeners(Form form, DMGBoard board) { Joypad j = board.Joypad; form.KeyDown += (o, e) => { if (e.KeyCode == Keys.F1) { STOP = true; } if (e.Alt && e.KeyCode == Keys.Enter) { swapChain.IsFullScreen = !swapChain.IsFullScreen; } if (e.KeyCode == Keys.A) { j.Buttons(Joypad.Keys.A, Joypad.State.Pressed); } if (e.KeyCode == Keys.Enter) { j.Buttons(Joypad.Keys.Start, Joypad.State.Pressed); } if (e.KeyCode == Keys.Space) { j.Buttons(Joypad.Keys.Select, Joypad.State.Pressed); } if (e.KeyCode == Keys.S) { j.Buttons(Joypad.Keys.B, Joypad.State.Pressed); } //cross if (e.KeyCode == Keys.Down) { j.Cross(Joypad.Keys.CrossDown, Joypad.State.Pressed); } if (e.KeyCode == Keys.Up) { j.Cross(Joypad.Keys.CrossUp, Joypad.State.Pressed); } if (e.KeyCode == Keys.Left) { j.Cross(Joypad.Keys.CrossLeft, Joypad.State.Pressed); } if (e.KeyCode == Keys.Right) { j.Cross(Joypad.Keys.CrossRight, Joypad.State.Pressed); } }; form.KeyUp += (o, e) => { if (e.KeyCode == Keys.A) { j.Buttons(Joypad.Keys.A, Joypad.State.Unpressed); } if (e.KeyCode == Keys.Enter) { j.Buttons(Joypad.Keys.Start, Joypad.State.Unpressed); } if (e.KeyCode == Keys.Space) { j.Buttons(Joypad.Keys.Select, Joypad.State.Unpressed); } if (e.KeyCode == Keys.S) { j.Buttons(Joypad.Keys.B, Joypad.State.Unpressed); } //cross if (e.KeyCode == Keys.Down) { j.Cross(Joypad.Keys.CrossDown, Joypad.State.Unpressed); } if (e.KeyCode == Keys.Up) { j.Cross(Joypad.Keys.CrossUp, Joypad.State.Unpressed); } if (e.KeyCode == Keys.Left) { j.Cross(Joypad.Keys.CrossLeft, Joypad.State.Unpressed); } if (e.KeyCode == Keys.Right) { j.Cross(Joypad.Keys.CrossRight, Joypad.State.Unpressed); } }; }