diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..176ede93 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,38 @@ +# GitHub Copilot Instructions + +This document guides AI assistants when contributing to the Processor-Emulator repository. + +## 1. Project Overview +- **Language & Framework**: C# (.NET 6) WPF application with a MainWindow UI and multiple emulator implementations. +- **Core Purpose**: Load and analyze firmware images, emulate CPU architectures, probe filesystems, and extract data. +- **Key Directories**: + - `/` root: main UI code (`App.xaml`, `MainWindow.xaml.cs`, `EmulatorLauncher.cs`) + - `/Emulation`: stub and SPARC emulators + - Files in root implement each chipset emulator and filesystem logic. + +## 2. Coding Conventions +- **Naming**: PascalCase for public types and methods, _camelCase_ for private fields. +- **Async Patterns**: Use `async Task` for I/O or longer-running operations and `await` inside. +- **Helpers & Utilities**: + - Consolidate repeated logic in a single static helper. + - Place utility methods in `Tools.cs` or under a `Utilities` static class. +- **UI Interaction**: Use `Dispatcher.Invoke` or `await` to update UI from background threads. Use shared `ShowTextWindow` helper for log output. + +## 3. AI Integration Guidelines +- **Refactor Duplicates**: When encountering duplicate local functions (e.g., `AnalyzeFileType`, `ShowTextWindow`), merge into one shared definition without hitting request limit, length limit or creating invalid responses or getting stuck in loops. +- **New Emulators**: Implement new `IChipsetEmulator` in its own file. Follow existing patterns: detect types, dispatch via `InstructionTranslator`. +- **File Placement**: Match namespace and folder. Root-level emulators go in `/Emulation` folder or root if project-wide. +- **Error Handling**: Leverage `try/catch` around disk I/O and emulator startup. Surface errors via `ShowTextWindow`. + +## 4. Build & Run Tasks +- Use the existing `tasks.json`: + - **Build**: `dotnet build ProcessorEmulator.csproj` + - **Run**: `dotnet run --project ProcessorEmulator.csproj` +- No unit tests present; ensure manual end-to-end validation of firmware loads. + +## 5. Pull Request Guidelines +- Target `dev` branch. Keep PRs focused and small. +- Include screenshots or logs for UI changes. +- Verify compile and smoke-test emulation scenarios local to Windows/.NET 6. + +> _These instructions help AI assistants contribute consistently and correctly to the Processor-Emulator codebase._ diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..e69de29b diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000..e69de29b diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..16512eb4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + +jobs: + build: + name: Build on Windows + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build ProcessorEmulator.csproj --configuration Release --no-restore + + - name: Run tests (if any) + run: | + echo "Skipping tests: no test projects defined." diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000..7e2ab1c8 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,24 @@ +name: "CodeQL Analysis" + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: csharp + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml new file mode 100644 index 00000000..105c536a --- /dev/null +++ b/.github/workflows/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "nuget" + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 5 diff --git a/.github/workflows/dotnet-build.yml b/.github/workflows/dotnet-build.yml new file mode 100644 index 00000000..e636e6b7 --- /dev/null +++ b/.github/workflows/dotnet-build.yml @@ -0,0 +1,26 @@ +name: ".NET Build" + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + +jobs: + build: + name: build + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build Processor-Emulator.sln --configuration Release --no-restore diff --git a/.github/workflows/dotnet-desktop-build.yml b/.github/workflows/dotnet-desktop-build.yml new file mode 100644 index 00000000..7666a178 --- /dev/null +++ b/.github/workflows/dotnet-desktop-build.yml @@ -0,0 +1,28 @@ +name: ".NET Core Desktop build" + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + +jobs: + build-debug: + name: build (Debug) + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + - run: dotnet build ProcessorEmulator.csproj --configuration Debug + + build-release: + name: build (Release) + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + - run: dotnet build ProcessorEmulator.csproj --configuration Release diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 79e2ded8..5ce2fe5b 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -2,9 +2,9 @@ name: .NET Build on: push: - branches: [ main, master ] + branches: [ dev, main ] pull_request: - branches: [ main, master ] + branches: [ dev, main ] jobs: build: diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml new file mode 100644 index 00000000..0538673a --- /dev/null +++ b/.github/workflows/nightly-build.yml @@ -0,0 +1,34 @@ +name: Nightly Build + +on: + schedule: + # every day at 3am UTC + - cron: '0 3 * * *' + +jobs: + build: + name: Daily Windows Build + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build ProcessorEmulator.csproj --configuration Release --no-restore + + - name: Publish artifacts + run: dotnet publish ProcessorEmulator.csproj --configuration Release --output artifacts + + - name: Upload nightly artifact + uses: actions/upload-artifact@v3 + with: + name: nightly-build + path: artifacts diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 00000000..17acb0fe --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,35 @@ +name: Release Drafter + +on: + push: + branches: [dev, main] + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: release-drafter/release-drafter@v5 + with: + config-name: "release-drafter.yml" + template: | + # 🎉 Release {{ version }} + + Hello everyone! + + We’re excited to share **{{ version }}** with you. Here’s what’s new: + + {{#changes}} + {{> change}} + {{/changes}} + + A heartfelt thank you to all contributors: + {{#contributors}} + - @{{this}} + {{/contributors}} + + Stay tuned for more updates! + change-template: | + {{#if is:added}}✨ **New** {{description}} (thanks @{{author}})!{{/if}} + {{#if is:changed}}🔄 **Updated** {{description}} (thanks @{{author}})!{{/if}} + {{#if is:fixed}}🐞 **Fixed** {{description}} (thanks @{{author}})!{{/if}} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..882b477d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: "Release on Tag" + +on: + push: + # Trigger on git tags, e.g. v1.2.3 + tags: + - 'v*' + +jobs: + build-and-release: + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET 6 SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Build solution + run: | + dotnet restore + dotnet build ProcessorEmulator.csproj --configuration Release + + - name: Publish artifacts + run: | + dotnet publish ProcessorEmulator.csproj --configuration Release --output artifacts + + - name: Create GitHub Release + id: create_release + uses: actions/create-release@v1 + with: + tag_name: ${{ github.ref_name }} + release_name: Release ${{ github.ref_name }} + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: artifacts/ProcessorEmulator.exe + asset_name: ProcessorEmulator-${{ github.ref_name }}.exe + asset_content_type: application/octet-stream diff --git a/.gitignore b/.gitignore index 6e78d5af..0bf844a3 100644 --- a/.gitignore +++ b/.gitignore @@ -256,4 +256,4 @@ bin/Release/net6.0-windows/share/locale/tr/LC_MESSAGES/qemu.mo bin/Release/net6.0-windows/share/locale/uk/LC_MESSAGES/qemu.mo bin/Release/net6.0-windows/share/locale/zh_CN/LC_MESSAGES/qemu.mo bin/Release/net6.0-windows/share/man/man1/qemu.1 -/.github + diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..09b458bb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,44 @@ +{ + // Disable minimap for faster rendering + "editor.minimap.enabled": false, + // Reduce visual decorations + "editor.renderWhitespace": "none", + "editor.folding": false, + "editor.codeLens": false, + "editor.semanticHighlighting.enabled": false, + + // Exclude build folders from file watchers and searches + "files.watcherExclude": { + "**/bin/**": true, + "**/obj/**": true + }, + "search.exclude": { + "**/bin/**": true, + "**/obj/**": true + }, + + // Optimize C# performance + "omnisharp.enableRoslynAnalyzers": false, + "omnisharp.useModernNet": false, + "omnisharp.msbuildLogLevel": "quiet", + // Disable inlay hints to avoid LSP requests on null documents + "editor.inlayHints.enabled": "off", + "[csharp]": { + "editor.inlayHints.enabled": "off" + }, + // Disable C# specific inlay hint settings + "csharp.inlayHints.parameterNames.enabled": "none", + "csharp.inlayHints.parameterTypes.enabled": "none", + "csharp.inlayHints.variableTypes.enabled": "none", + + // Disable outline and breadcrumbs to reduce symbol requests + "outline.showFiles": false, + "breadcrumbs.enabled": false, + + // Disable telemetry for reduced background activity + "telemetry.enableTelemetry": false, + "telemetry.telemetryLevel": "off", + + // YAML: disable built-in validation to ignore ci.yml errors + "yaml.validate": false +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..c464090b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,19 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build Project", + "type": "shell", + "command": "dotnet build \"${workspaceFolder}/ProcessorEmulator.csproj\" --configuration Debug", + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "reveal": "always", + "panel": "shared" + }, + "problemMatcher": ["$msCompile"] + } + ] +} diff --git a/ArchiveExtractor.cs b/ArchiveExtractor.cs index a9091b3d..8bdf0f14 100644 --- a/ArchiveExtractor.cs +++ b/ArchiveExtractor.cs @@ -1,3 +1,4 @@ +using System; using System.Diagnostics; using System.IO; @@ -7,13 +8,26 @@ public static class ArchiveExtractor { public static void ExtractArchive(string archivePath, string outputDir) { - // Assumes 7z.exe is in PATH or same directory as the app + // Resolve 7z executable path + string sevenZip = Resolve7zExecutable(); + if (string.IsNullOrEmpty(sevenZip)) + { + // Fallback for ZIP archives using built-in .NET extraction + if (Path.GetExtension(archivePath).Equals(".zip", StringComparison.OrdinalIgnoreCase)) + { + System.IO.Compression.ZipFile.ExtractToDirectory(archivePath, outputDir); + SanitizeExtraction(outputDir); + return; + } + throw new InvalidOperationException("7z.exe not found. Please install 7-Zip or locate 7z.exe manually."); + } + // Use -spf to allow extraction of full paths var process = new Process { StartInfo = new ProcessStartInfo { - FileName = "7z.exe", - Arguments = $"x \"{archivePath}\" -o\"{outputDir}\" -y", + FileName = sevenZip, + Arguments = $"x -spf \"{archivePath}\" -o\"{outputDir}\" -y", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -22,12 +36,78 @@ public static void ExtractArchive(string archivePath, string outputDir) }; process.Start(); process.WaitForExit(); + // Remove any files extracted outside of the output directory (prevent overwriting host paths) + SanitizeExtraction(outputDir); } public static void ExtractAndAnalyze(string archivePath, string outputDir) { ExtractArchive(archivePath, outputDir); + // Further sanitize before analysis FirmwareAnalyzer.AnalyzeFirmwareArchive(archivePath, outputDir); } + + /// + /// Deletes any files or directories unintentionally placed outside the extraction root. + /// + private static void SanitizeExtraction(string outputDir) + { + try + { + var root = Path.GetFullPath(outputDir).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; + // Check all files under the extraction parent path + var parent = Path.GetDirectoryName(root); + foreach (var file in Directory.GetFiles(parent, "*", SearchOption.AllDirectories)) + { + var full = Path.GetFullPath(file); + if (!full.StartsWith(root, StringComparison.OrdinalIgnoreCase)) + { + File.Delete(full); + } + } + // Optionally, similar cleanup for directories can be added + } + catch { /* Ignore cleanup errors */ } + } + + /// + /// Locates 7z.exe via PATH, common install folders, or user prompt. + /// + private static string Resolve7zExecutable() + { + // Check common Program Files locations + string[] candidates = new[] { + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "7-Zip", "7z.exe"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "7-Zip", "7z.exe") + }; + foreach (var path in candidates) + { + if (File.Exists(path)) return path; + } + // Search in PATH + var paths = Environment.GetEnvironmentVariable("PATH")?.Split(';') ?? Array.Empty(); + foreach (var dir in paths) + { + try + { + var exe = Path.Combine(dir.Trim(), "7z.exe"); + if (File.Exists(exe)) return exe; + } + catch { } + } + // Prompt user to locate 7z.exe + try + { + var dlg = new Microsoft.Win32.OpenFileDialog + { + Title = "Locate 7z.exe", + Filter = "7-Zip Executable (7z.exe)|7z.exe" + }; + if (dlg.ShowDialog() == true) + return dlg.FileName; + } + catch { } + return null; + } } } diff --git a/ArmCpuEmulator.cs b/ArmCpuEmulator.cs index 1dbc000c..ccfab81a 100644 --- a/ArmCpuEmulator.cs +++ b/ArmCpuEmulator.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace ProcessorEmulator.Emulation { diff --git a/BinaryScanner.cs b/BinaryScanner.cs index 6fb16300..2f76bac5 100644 --- a/BinaryScanner.cs +++ b/BinaryScanner.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Linq; -using System.Collections.Generic; namespace ProcessorEmulator.Tools { diff --git a/DirecTVEmulator.cs b/DirecTVEmulator.cs index f58557ca..1b02c6ee 100644 --- a/DirecTVEmulator.cs +++ b/DirecTVEmulator.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; namespace ProcessorEmulator.Emulation { diff --git a/DvrVxWorksDetector.cs b/DvrVxWorksDetector.cs index 97f9bd51..d2064e47 100644 --- a/DvrVxWorksDetector.cs +++ b/DvrVxWorksDetector.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using System.Collections.Generic; using System.Text; diff --git a/Emulation.cs b/Emulation.cs index d2165781..f771fa6a 100644 --- a/Emulation.cs +++ b/Emulation.cs @@ -1,6 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; namespace ProcessorEmulator.Emulation { diff --git a/Emulation/HomebrewEmulator.cs b/Emulation/HomebrewEmulator.cs index 5e0925c2..36efdf69 100644 --- a/Emulation/HomebrewEmulator.cs +++ b/Emulation/HomebrewEmulator.cs @@ -1,4 +1,7 @@ using System; +using System.Windows; +using System.Diagnostics; +using ProcessorEmulator.Tools; namespace ProcessorEmulator.Emulation { @@ -8,20 +11,22 @@ namespace ProcessorEmulator.Emulation /// public class HomebrewEmulator : IEmulator { - private readonly string architecture; + // Architecture is auto-detected from original binary + private byte[] originalBinary; private byte[] memory; private uint[] regs = new uint[32]; private uint pc; private Tools.DeviceTreeManager.Node deviceTree; - public HomebrewEmulator(string architecture) + public HomebrewEmulator() { - this.architecture = architecture; + // No-op: architecture will be detected at runtime } public void LoadBinary(byte[] binary) { - // Load firmware into memory (256MB) + // Store original binary and load firmware into memory (256MB) + originalBinary = binary; memory = new byte[256 * 1024 * 1024]; Array.Copy(binary, 0, memory, 0, binary.Length); // Detect Flattened Device Tree (FDT) blob in memory (magic 0xd00dfeed) @@ -43,8 +48,11 @@ public void LoadBinary(byte[] binary) public void Run() { - // Dispatch by architecture - if (architecture.StartsWith("MIPS", StringComparison.OrdinalIgnoreCase)) + // Auto-detect architecture from original binary + var detectedArch = ArchitectureDetector.Detect(originalBinary); + Debug.WriteLine($"HomebrewEmulator: auto-detected architecture: {detectedArch}"); + // Dispatch by detected architecture + if (detectedArch.StartsWith("MIPS", StringComparison.OrdinalIgnoreCase)) { // MIPS32 fetch-decode-execute const int maxSteps = 1000000; @@ -52,7 +60,7 @@ public void Run() Step(); return; } - else if (architecture.StartsWith("ARM", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("ARM", StringComparison.OrdinalIgnoreCase)) { // Delegate to ARM emulator stub var armEmu = new ArmEmulator(); @@ -60,8 +68,119 @@ public void Run() armEmu.Run(); return; } - // Add other ISA dispatch as needed - throw new NotImplementedException($"Homebrew emulator not implemented for architecture: {architecture}"); + // Additional ISA dispatch + else if (detectedArch.StartsWith("X86", StringComparison.OrdinalIgnoreCase) || + detectedArch.StartsWith("I386", StringComparison.OrdinalIgnoreCase)) + { + var x86Emu = new X86CpuEmulator(); + x86Emu.LoadProgram(memory, 0); + x86Emu.Run(); + return; + } + else if (detectedArch.StartsWith("SPARC64", StringComparison.OrdinalIgnoreCase)) + { + var sparc64 = new Sparc64Emulator(); + sparc64.LoadBinary(memory); + sparc64.Run(); + return; + } + else if (detectedArch.StartsWith("SPARC", StringComparison.OrdinalIgnoreCase)) + { + var sparc = new SparcEmulator(); + sparc.LoadBinary(memory); + sparc.Run(); + return; + } + else if (detectedArch.StartsWith("ALPHA", StringComparison.OrdinalIgnoreCase)) + { + var alpha = new AlphaEmulator(); + alpha.LoadBinary(memory); + alpha.Run(); + return; + } + else if (detectedArch.StartsWith("SUPERH", StringComparison.OrdinalIgnoreCase) || + detectedArch.StartsWith("SH", StringComparison.OrdinalIgnoreCase)) + { + var sh = new SuperHEmulator(); + sh.LoadBinary(memory); + sh.Run(); + return; + } + else if (detectedArch.StartsWith("RISCV32", StringComparison.OrdinalIgnoreCase)) + { + var rv32 = new RiscV32Emulator(); + rv32.LoadBinary(memory); + rv32.Run(); + return; + } + else if (detectedArch.StartsWith("RISCV64", StringComparison.OrdinalIgnoreCase)) + { + var rv64 = new RiscV64Emulator(); + rv64.LoadBinary(memory); + rv64.Run(); + return; + } + else if (detectedArch.StartsWith("S390X", StringComparison.OrdinalIgnoreCase)) + { + var s390 = new S390XEmulator(); + s390.LoadBinary(memory); + s390.Run(); + return; + } + else if (detectedArch.StartsWith("HPPA", StringComparison.OrdinalIgnoreCase)) + { + var hppa = new HppaEmulator(); + hppa.LoadBinary(memory); + hppa.Run(); + return; + } + else if (detectedArch.StartsWith("MICROBLAZE", StringComparison.OrdinalIgnoreCase)) + { + var mb = new MicroBlazeEmulator(); + mb.LoadBinary(memory); + mb.Run(); + return; + } + else if (detectedArch.StartsWith("CRIS", StringComparison.OrdinalIgnoreCase)) + { + var cris = new CrisEmulator(); + cris.LoadBinary(memory); + cris.Run(); + return; + } + else if (detectedArch.StartsWith("LM32", StringComparison.OrdinalIgnoreCase)) + { + var lm = new Lm32Emulator(); + lm.LoadBinary(memory); + lm.Run(); + return; + } + else if (detectedArch.StartsWith("M68K", StringComparison.OrdinalIgnoreCase)) + { + var m68k = new M68KEmulator(); + m68k.LoadBinary(memory); + m68k.Run(); + return; + } + else if (detectedArch.StartsWith("XTENSA", StringComparison.OrdinalIgnoreCase)) + { + var xt = new XtensaEmulator(); + xt.LoadBinary(memory); + xt.Run(); + return; + } + else if (detectedArch.StartsWith("OPENRISC", StringComparison.OrdinalIgnoreCase)) + { + var or = new OpenRiscEmulator(); + or.LoadBinary(memory); + or.Run(); + return; + } + // Unknown or unsupported architecture: warn and fallback to QEMU + MessageBox.Show( + $"Homebrew emulator not implemented for architecture: {detectedArch}.\nFalling back to QEMU emulation.", + "Homebrew Emulator", MessageBoxButton.OK, MessageBoxImage.Warning); + throw new NotImplementedException($"Homebrew emulator not implemented for architecture: {detectedArch}"); } public void Step() diff --git a/EmulatorLauncher.cs b/EmulatorLauncher.cs index a7213fb2..11a350c3 100644 --- a/EmulatorLauncher.cs +++ b/EmulatorLauncher.cs @@ -1,4 +1,3 @@ -using System; using ProcessorEmulator.Tools; namespace ProcessorEmulator.Emulation diff --git a/ExoticFilesystemManager.cs b/ExoticFilesystemManager.cs index c84ac79e..996da829 100644 --- a/ExoticFilesystemManager.cs +++ b/ExoticFilesystemManager.cs @@ -3,9 +3,7 @@ using System.Runtime.InteropServices; using System.Collections.Generic; using System.Linq; -using System.Text; using ProcessorEmulator.Tools.FileSystems; -using System.Reflection; namespace ProcessorEmulator.Tools { diff --git a/FileSystems.cs b/FileSystems.cs index 391d239a..98e5567b 100644 --- a/FileSystems.cs +++ b/FileSystems.cs @@ -2,7 +2,6 @@ using System.IO; using System.Collections.Generic; using System.Linq; -using System.Runtime.InteropServices; namespace ProcessorEmulator.Tools.FileSystems { diff --git a/FilesystemProber.cs b/FilesystemProber.cs index 88bf5754..e0218838 100644 --- a/FilesystemProber.cs +++ b/FilesystemProber.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Collections.Generic; namespace ProcessorEmulator.Tools { diff --git a/FirmwareAnalyzer.cs b/FirmwareAnalyzer.cs index 4b7a09d8..c7720559 100644 --- a/FirmwareAnalyzer.cs +++ b/FirmwareAnalyzer.cs @@ -1,5 +1,4 @@ using System; -using System.IO; namespace ProcessorEmulator.Tools { diff --git a/LinuxFileSystems.cs b/LinuxFileSystems.cs index 0c9028e2..fc8c66fb 100644 --- a/LinuxFileSystems.cs +++ b/LinuxFileSystems.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Collections.Generic; -using System.Security.Cryptography; namespace ProcessorEmulator.Tools.FileSystems { diff --git a/MainWindow.xaml b/MainWindow.xaml index 4349d660..44287629 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -6,9 +6,18 @@ + + + - + + + @@ -19,6 +28,9 @@