Beispiel #1
0
        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();
        }
Beispiel #2
0
        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();
            }
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
        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);
                }
            }
        }
Beispiel #5
0
        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();
        }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        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;
        }
Beispiel #8
0
        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();
                }
            }
        }
Beispiel #9
0
        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));
            }
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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();
            }
        }
Beispiel #12
0
        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];
            }
        }
Beispiel #13
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);
        }
Beispiel #14
0
 public void GetData()
 {
     this._paletteRam       = InteropEmu.DebugGetMemoryState(DebugMemoryType.PaletteMemory);
     this._palettePixelData = InteropEmu.DebugGetPalette();
 }
Beispiel #15
0
        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();
        }
Beispiel #16
0
 private void RefreshData()
 {
     this.ctrlHexViewer.Data = InteropEmu.DebugGetMemoryState((DebugMemoryType)this.cboMemoryType.SelectedIndex);
 }