private void ShowInChrViewer() { int tileIndex = _tileData[_nametableIndex][_tileY * 32 + _tileX]; int attributeData = _attributeData[_nametableIndex][_tileY * 32 + _tileX]; int shift = (_tileX & 0x02) | ((_tileY & 0x02) << 1); int paletteIndex = ((attributeData >> shift) & 0x03); DebugState state = new DebugState(); InteropEmu.DebugGetState(ref state); int tileIndexOffset = state.PPU.ControlFlags.BackgroundPatternAddr == 0x1000 ? 256 : 0; OnSelectChrTile?.Invoke(tileIndex + tileIndexOffset, paletteIndex); }
private void ShowInChrViewer() { int tileIndex = _tileData[_nametableIndex][_tileY * 32 + _tileX]; int attributeData = _attributeData[_nametableIndex][_tileY * 32 + _tileX]; int shift = (_tileX & 0x02) | ((_tileY & 0x02) << 1); int paletteIndex = ((attributeData >> shift) & 0x03); DebugState state = new DebugState(); InteropEmu.DebugGetState(ref state); int tileIndexOffset = state.PPU.ControlFlags.BackgroundPatternAddr == 0x1000 ? 256 : 0; if (!InteropEmu.DebugIsExecutionStopped() || ConfigManager.Config.DebugInfo.PpuRefreshOnBreak) { //Only change the palette if execution is not stopped (or if we're configured to refresh the viewer on break/pause) //Otherwise, the CHR viewer will refresh its data (and it might not match the data we loaded at the specified scanline/cycle anymore) _chrViewer.SelectedPaletteIndex = paletteIndex; } _chrViewer.SelectedTileIndex = tileIndex + tileIndexOffset; OnSelectChrTile?.Invoke(null, EventArgs.Empty); }