public void GetData() { DebugState state = new DebugState(); InteropEmu.DebugGetState(ref state); _largeSprites = state.PPU.ControlFlags.LargeSprites != 0; _spritePatternAddr = state.PPU.ControlFlags.SpritePatternAddr; Int16 sourcePage = (Int16)(radSpriteRam.Checked ? -1 : nudCpuPage.Value); if (sourcePage == -1) { _spriteRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.SpriteMemory); } else { byte[] cpuMemory = InteropEmu.DebugGetMemoryState(DebugMemoryType.CpuMemory); byte[] spriteRam = new byte[256]; Array.Copy(cpuMemory, sourcePage << 8, spriteRam, 0, 256); _spriteRam = spriteRam; } _spritePixelData = InteropEmu.DebugGetSprites(sourcePage); _hdCopyHelper.RefreshData(); }
public void RefreshPalette() { if (_selectedPalette < 0) { return; } byte[] paletteRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.PaletteMemory); int[] palette = InteropEmu.DebugGetPalette(); int[] currentPalette = new int[16]; Array.Copy(palette, _selectedPalette * 4, currentPalette, 0, 4); GCHandle handle = GCHandle.Alloc(currentPalette, GCHandleType.Pinned); try { Bitmap source = new Bitmap(4, 1, 4 * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); Bitmap target = new Bitmap(128, 32); using (Graphics g = Graphics.FromImage(target)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; g.ScaleTransform(32, 32); g.DrawImageUnscaled(source, 0, 0); g.ResetTransform(); using (Font font = new Font(BaseControl.MonospaceFontFamily, 10, GraphicsUnit.Pixel)) { using (Brush bg = new SolidBrush(Color.FromArgb(150, Color.LightGray))) { for (int i = 0; i < 4; i++) { if (this.DisplayIndexes) { g.DrawOutlinedString(i.ToString(), font, Brushes.Black, bg, 5 + i * 32, 2); } else { g.DrawOutlinedString(paletteRam[_selectedPalette * 4 + i].ToString("X2"), font, Brushes.Black, bg, 14 + i * 32, 18); } } } } if (this.AllowSelection) { using (Pen pen = new Pen(Color.LightBlue, 3)) { g.DrawRectangle(pen, this.SelectedColor * 32 + 2, 2, 29, 29); } } if (this.HighlightMouseOver && _hoverColor >= 0) { using (Pen pen = new Pen(Color.DarkGray, 3)) { g.DrawRectangle(pen, _hoverColor * 32 + 2, 2, 29, 29); } } } this.picPaletteSelection.Image = target; } finally { handle.Free(); } }
public void GetData() { UInt32[] paletteData; _chrPixelData = InteropEmu.DebugGetChrBank(_chrSelection, 9, false, CdlHighlightType.None, false, false, out paletteData); bool isChrRam = InteropEmu.DebugGetMemorySize(DebugMemoryType.ChrRom) == 0; if (_chrSelection < 2) { byte[] chrData = InteropEmu.DebugGetMemoryState(DebugMemoryType.PpuMemory); Array.Copy(chrData, _chrSelection * 0x1000, _chrData, 0, 0x1000); } else { byte[] chrData = InteropEmu.DebugGetMemoryState(isChrRam ? DebugMemoryType.ChrRam : DebugMemoryType.ChrRom); int startIndex = (_chrSelection - 2) * 0x1000; if (startIndex >= chrData.Length) { //Can occur when switching games startIndex = 0; } Array.Copy(chrData, startIndex, _chrData, 0, 0x1000); } }
protected override void EmitDebugData() { //lock (emulatorLock) { if (OnRegisterUpdate != null) { _debugState.Memory.CpuData = InteropEmu.DebugGetMemoryState(DebugMemoryType.CpuMemory); _debugState.Memory.PpuData = InteropEmu.DebugGetMemoryState(DebugMemoryType.PpuMemory); _debugState.Memory.OamData = InteropEmu.DebugGetMemoryState(DebugMemoryType.SpriteMemory); _debugState.Memory.CgRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.PaletteMemory); InteropEmu.DebugGetState(ref _debugState.NesState); _debugState.Memory.X = _debugState.NesState.CPU.X; _debugState.Memory.Y = _debugState.NesState.CPU.Y; _debugState.Sprites.PixelData = InteropEmu.DebugGetSprites(); _debugState.Sprites.Details = Sprite.GetNesSprites(_debugState.Memory.OamData, _debugState.NesState.PPU.ControlFlags.LargeSprites == 1); _debugState.CharacterData.PixelData[0] = InteropEmu.DebugGetChrBank(0, 0, false, CdlHighlightType.None, true, false, out _dummyPaletteData); _debugState.CharacterData.PixelData[1] = InteropEmu.DebugGetChrBank(1, 0, false, CdlHighlightType.None, true, false, out _dummyPaletteData); GetNametableData(); OnRegisterUpdate(_debugState); } } }
public void GetData() { DebugState state = new DebugState(); InteropEmu.DebugGetState(ref state); _largeSprites = state.PPU.ControlFlags.LargeSprites != 0; _spritePatternAddr = state.PPU.ControlFlags.SpritePatternAddr; _spriteRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.SpriteMemory); _spritePixelData = InteropEmu.DebugGetSprites(); }
public void GetData() { InteropEmu.DebugGetPpuScroll(out _xScroll, out _yScroll); InteropEmu.DebugGetState(ref _state); for (int i = 0; i < 4; i++) { InteropEmu.DebugGetNametable(i, NametableDisplayMode.Normal, out _nametablePixelData[i], out _tileData[i], out _attributeData[i]); } _ppuMemory = InteropEmu.DebugGetMemoryState(DebugMemoryType.PpuMemory); InteropEmu.DebugGetPpuScroll(out _xScroll, out _yScroll); _xScroll &= 0xFFF8; _yScroll &= 0xFFF8; }
public void GetData() { InteropEmu.DebugGetPpuScroll(out _xScroll, out _yScroll); InteropEmu.DebugGetState(ref _state); for (int i = 0; i < 4; i++) { InteropEmu.DebugGetNametable(i, ConfigManager.Config.DebugInfo.NtViewerUseGrayscalePalette, out _nametablePixelData[i], out _tileData[i], out _attributeData[i]); } _ppuMemory = InteropEmu.DebugGetMemoryState(DebugMemoryType.PpuMemory); InteropEmu.DebugGetPpuScroll(out _xScroll, out _yScroll); _xScroll &= 0xFFF8; _yScroll &= 0xFFF8; }
public void RefreshData(DebugMemoryType memoryType) { if (_memoryType != memoryType) { _memoryType = memoryType; _byteProvider = null; } byte[] data = InteropEmu.DebugGetMemoryState(this._memoryType); if (data != null) { bool changed = true; if (this._byteProvider != null && data.Length == this._byteProvider.Bytes.Count) { changed = false; for (int i = 0; i < this._byteProvider.Bytes.Count; i++) { if (this._byteProvider.Bytes[i] != data[i]) { changed = true; break; } } } if (changed) { if (_byteProvider == null || _byteProvider.Length != data.Length) { _byteProvider = new StaticByteProvider(data); _byteProvider.ByteChanged += (int byteIndex, byte newValue, byte oldValue) => { InteropEmu.DebugSetMemoryValue(_memoryType, (UInt32)byteIndex, newValue); }; _byteProvider.BytesChanged += (int byteIndex, byte[] values) => { InteropEmu.DebugSetMemoryValues(_memoryType, (UInt32)byteIndex, values); }; this.ctrlHexBox.ByteProvider = _byteProvider; } else { _byteProvider.SetData(data); } this.ctrlHexBox.Refresh(); } } }
private void RefreshData() { if (DebugWorkspaceManager.GetWorkspace() != this._previousWorkspace) { this.InitTblMappings(); _previousWorkspace = DebugWorkspaceManager.GetWorkspace(); } if (this.tabMain.SelectedTab == this.tpgAccessCounters) { this.ctrlMemoryAccessCounters.RefreshData(); } else if (this.tabMain.SelectedTab == this.tpgMemoryViewer) { this.UpdateByteColorProvider(); this.ctrlHexViewer.SetData(InteropEmu.DebugGetMemoryState(this._memoryType)); } }
public void RefreshData() { //Data needed for HD Pack copy bool isChrRam = InteropEmu.DebugGetMemorySize(DebugMemoryType.ChrRom) == 0; if (isChrRam) { _ppuMemory = InteropEmu.DebugGetMemoryState(DebugMemoryType.PpuMemory); } else { for (int i = 0; i < 512; i++) { _absoluteTileIndexes[i] = InteropEmu.DebugGetAbsoluteChrAddress((uint)i * 16) / 16; } } _paletteRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.PaletteMemory); }
public void RefreshViewer() { this._paletteRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.PaletteMemory); byte[] pixelData = InteropEmu.DebugGetPalette(); GCHandle handle = GCHandle.Alloc(pixelData, GCHandleType.Pinned); try { Bitmap source = new Bitmap(4, 8, 4 * 4, System.Drawing.Imaging.PixelFormat.Format32bppArgb, handle.AddrOfPinnedObject()); Bitmap target = new Bitmap(128, 256); using (Graphics g = Graphics.FromImage(target)) { g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; g.DrawImage(source, new Rectangle(0, 0, 128, 256), new Rectangle(0, 0, 4, 8), GraphicsUnit.Pixel); } this.picPalette.Image = target; } finally { handle.Free(); } }
public void RefreshData() { //Data needed for HD Pack copy bool isChrRam = InteropEmu.DebugGetMemorySize(DebugMemoryType.ChrRom) == 0; if (isChrRam) { _ppuMemory = InteropEmu.DebugGetMemoryState(DebugMemoryType.PpuMemory); } else { for (int i = 0; i < 512; i++) { _absoluteTileIndexes[i] = InteropEmu.DebugGetAbsoluteChrAddress((uint)i * 16) / 16; } } _paletteRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.PaletteMemory); for (int i = 4; i < 4 * 8; i += 4) { //Override color 0 in each palette with the background color _paletteRam[i] = _paletteRam[0]; } }
private void BuildCdlData() { int prgSize = InteropEmu.DebugGetMemorySize(DebugMemoryType.PrgRom); if (prgSize <= 0) { return; } byte[] cdlFile = new byte[prgSize]; //Mark data/code regions foreach (SpanInfo span in _spans.Values) { int prgAddress = GetPrgAddress(span); if (prgAddress >= 0 && prgAddress < prgSize) { for (int i = 0; i < span.Size; i++) { if (cdlFile[prgAddress + i] != (byte)CdlPrgFlags.Data && !span.IsData && span.Size <= 3) { cdlFile[prgAddress + i] = (byte)CdlPrgFlags.Code; } else if (span.IsData) { cdlFile[prgAddress + i] = (byte)CdlPrgFlags.Data; } else if (cdlFile[prgAddress + i] == 0) { //Mark bytes as tentative data, until we know that the bytes are actually code cdlFile[prgAddress + i] = 0x04; } } } } for (int i = 0; i < cdlFile.Length; i++) { if (cdlFile[i] == 0x04) { //Mark all bytes marked as tentative data as data cdlFile[i] = (byte)CdlPrgFlags.Data; } } //Find/identify functions and jump targets byte[] prgRomContent = InteropEmu.DebugGetMemoryState(DebugMemoryType.PrgRom); foreach (SymbolInfo symbol in _symbols.Values) { LineInfo line; if (!symbol.SegmentID.HasValue) { //This is a constant, ignore it continue; } foreach (int reference in symbol.References) { if (_lines.TryGetValue(reference, out line) && line.SpanIDs.Count > 0) { SpanInfo span; if (_spans.TryGetValue(line.SpanIDs[0], out span) && !span.IsData && span.Size <= 3) { int referencePrgAddr = GetPrgAddress(span); if (referencePrgAddr >= 0 && referencePrgAddr < prgRomContent.Length) { byte opCode = prgRomContent[referencePrgAddr]; if (opCode == 0x20 || opCode == 0x10 || opCode == 0x30 || opCode == 0x50 || opCode == 0x70 || opCode == 0x90 || opCode == 0xB0 || opCode == 0xD0 || opCode == 0xF0 || opCode == 0x4C || opCode == 0x20 || opCode == 0x4C || opCode == 0x6C) { //This symbol is used with a JSR/jump instruction, so it's either a function or jump target bool isJsr = opCode == 0x20; SpanInfo definitionSpan = GetSymbolDefinitionSpan(symbol); if (definitionSpan != null) { int definitionPrgAddr = GetPrgAddress(definitionSpan); if (definitionPrgAddr >= 0 && definitionPrgAddr < prgRomContent.Length) { cdlFile[definitionPrgAddr] |= (byte)(isJsr ? CdlPrgFlags.SubEntryPoint : CdlPrgFlags.JumpTarget); break; } } } } } } } } InteropEmu.DebugSetCdlData(cdlFile); }
public void GetData() { this._paletteRam = InteropEmu.DebugGetMemoryState(DebugMemoryType.PaletteMemory); this._palettePixelData = InteropEmu.DebugGetPalette(); }
private void UpdateCode() { if (_symbolProvider == null || CurrentFile == null) { return; } List <int> indents = new List <int>(); List <string> addressing = new List <string>(); List <string> comments = new List <string>(); List <int> lineNumbers = new List <int>(); List <string> lineNotes = new List <string>(); _lineNumberNotes = new List <string>(); List <string> codeLines = new List <string>(); byte[] prgRomContent = InteropEmu.DebugGetMemoryState(DebugMemoryType.PrgRom); bool isC = CurrentFile.Name.EndsWith(".h") || CurrentFile.Name.EndsWith(".c"); int lineIndex = 0; foreach (string line in CurrentFile.Data) { string l = line.Replace("\t", " "); addressing.Add(""); int prgAddress = _symbolProvider.GetPrgAddress(CurrentFile.ID, lineIndex); if (prgAddress >= 0) { int opSize = frmOpCodeTooltip.GetOpSize(prgRomContent[prgAddress]); string byteCode = ""; for (int i = prgAddress, end = prgAddress + opSize; i < end && i < prgRomContent.Length; i++) { byteCode += "$" + prgRomContent[i].ToString("X2") + " "; } lineNotes.Add(byteCode); } else { lineNotes.Add(""); } int relativeAddress = InteropEmu.DebugGetRelativeAddress((uint)prgAddress, AddressType.PrgRom); lineNumbers.Add(relativeAddress); _lineNumberNotes.Add(prgAddress >= 0 ? prgAddress.ToString("X4") : ""); string trimmed = l.TrimStart(); int margin = (l.Length - trimmed.Length) * 10; indents.Add(margin); int commentIndex; if (isC) { commentIndex = trimmed.IndexOf("//"); } else { commentIndex = trimmed.IndexOfAny(new char[] { ';', '.' }); } if (commentIndex >= 0) { comments.Add(trimmed.Substring(commentIndex)); codeLines.Add(trimmed.Substring(0, commentIndex)); } else { comments.Add(""); codeLines.Add(trimmed); } lineIndex++; } ctrlCodeViewer.CodeHighlightingEnabled = !isC; ctrlCodeViewer.LineIndentations = indents.ToArray(); ctrlCodeViewer.Addressing = addressing.ToArray(); ctrlCodeViewer.Comments = comments.ToArray(); ctrlCodeViewer.LineNumbers = lineNumbers.ToArray(); ctrlCodeViewer.TextLineNotes = lineNotes.ToArray(); ctrlCodeViewer.LineNumberNotes = _lineNumberNotes.ToArray(); ctrlCodeViewer.TextLines = codeLines.ToArray(); this.RefreshViewer(); }
private void RefreshData() { this.ctrlHexViewer.Data = InteropEmu.DebugGetMemoryState((DebugMemoryType)this.cboMemoryType.SelectedIndex); }