- Modernes C++20
- Zyklusgenaue 6502-CPU
- 256 × 240 PPU (60 FPS)
- 4 Cartridge-Mapper
- 5-Kanal APU (44,1 kHz)
- Dear ImGui & OpenGL 3.3
SYSTEMS ARCHITECTURE / C++20 EMULATION
Zyklusgenaue Konsolen-Emulation & Echtzeit-Debugging in modernem C++20
Das Nintendo Entertainment System (NES) ist ein Paradebeispiel für synchrone Hardware-Architektur. Mit einer 1,789 MHz Ricoh 2A03 CPU, einer 5,37 MHz Ricoh 2C02 Picture Processing Unit (PPU) und einer integrierten Audio Processing Unit (APU) erfordert das System eine exakte Takt- und Interrupt-Koordination. Dieser Desktop-Emulator bildet den gesamten Hardwarepfad in modernem C++20 nach und kombiniert zyklusgenaue Emulation mit einer dockbaren Dear ImGui Debugger-Suite zur Echtzeitanalyse von Registern, Disassemblierung, Speicherkarten und Rasterstrahl-Timing.
Ricoh 2A03 (MOS 6502) CPU-Kern
Führt alle 56 offiziellen 6502-Befehle sowie dokumentierte inoffizielle/illegale Opcodes aus. Modelliert Adressierungsarten (Zero Page, Indiziert, Indirekt, Absolut), Zykluszuschläge bei Seitengrenzen-Überschreitung und vollständige Interrupt-Logik (RESET bei $FFFC, NMI bei $FFFA, IRQ/BRK bei $FFFE). Der BCD-Dezimalmodus ist hardwareseitig deaktiviert (Ricoh-Spezifikation).
Ricoh 2C02 Picture Processing Unit (PPU)
Rendert mit 256 × 240 Pixeln bei 60 FPS über 262 Scanlines. Enthält die vollständige 'Loopy'-Scrolling-Engine (Register v, t, x, w), 2 Pattern Tables ($0000/$1000), 4 Nametables mit dynamischem Mirroring (Horizontal, Vertikal, Einzelschirm, Vierschirm), 64-Sprite-OAM-Verarbeitung mit 8-Sprites-pro-Scanline-Begrenzung und zyklusgenaue Sprite-0-Treffererkennung.
Ricoh 2A03 Audio Processing Unit (APU)
Erzeugt 5 unabhängige Audiokanäle: Puls 1 & Puls 2 (variable Tastgrade, Frequenz-Sweep, Hüllkurvendekrement), Dreieck (32-Stufen-Pseudosinus mit linearem Zähler), Rauschen (15-Bit-LFSR-Zufallsfolge) und DMC (Delta-Modulation für 1-Bit-Samples). Gesteuert über 4- und 5-Stufen-Frame-Sequenzer und nichtlineare Mischung für SDL2-Wiedergabe bei 44,1 kHz.
Cartridge-Mapper & Speicher-Multiplexing
Liest das iNES-Dateiformat (.nes) und verwaltet Cartridge-Speicherbereiche. Unterstützt Mapper 0 (NROM: 16KB/32KB PRG, 8KB CHR), Mapper 1 (MMC1: serielles 5-Bit-Schieberegister mit Bankumschaltung und dynamischem Mirroring), Mapper 2 (UxROM: PRG-Bankumschaltung mit fester oberer Bank) und Mapper 3 (CNROM: 8KB CHR-Bankumschaltung).
Architektur-Merkmale in modernem C++20
Nutzt constexpr-Lookup-Tabellen für verzweigungsfreie O(1)-Befehlsdecodierung und Zyklusberechnung.
Verwendet std::span zur allokationsfreien Darstellung und Segmentierung von Speicherbereichen.
Setzt Standardbibliotheksfunktionen (std::rotl, std::rotr, std::popcount) für schnelle Bitverschiebungen ein.
Kapselt Cartridge, Bus, PPU und APU in std::unique_ptr ohne Speicherlecks oder freie Zeiger.
Speichert 2KB RAM und 2KB VRAM in flachen std::array-Puffern für maximale L1-Cache-Lokalität.
NES CPU Speicherbus-Architektur ($0000 - $FFFF)
- $0000 - $07FF
- 2KB internes Arbeits-RAM (Zero Page bei $0000-$00FF, Stack bei $0100-$01FF)
- $0800 - $1FFF
- Spiegelungen von $0000 - $07FF (dreifach gespiegelt)
- $2000 - $2007
- PPU I/O-Register (PPUCTRL, PPUMASK, PPUSTATUS, OAMADDR, OAMDATA, PPUSCROLL, PPUADDR, PPUDATA)
- $2008 - $3FFF
- Spiegelungen von $2000 - $2007 (alle 8 Bytes wiederholt)
- $4000 - $4017
- APU Sound-Register, OAM DMA-Register ($4014), Joypad 1 & 2 ($4016, $4017)
- $4020 - $5FFF
- Cartridge-Erweiterungs-ROM
- $6000 - $7FFF
- Batteriegepuffertes Cartridge PRG-RAM (Save RAM)
- $8000 - $BFFF
- Cartridge PRG-ROM (Untere Bank / über Mapper umschaltbar)
- $C000 - $FFFF
- Cartridge PRG-ROM (Obere Bank / Vektoren: NMI @ $FFFA, RESET @ $FFFC, IRQ @ $FFFE)
Gamepad-Steuerung & Emulator-Tastaturkürzel
- Pfeiltasten
- NES Steuerkreuz (Hoch, Runter, Links, Rechts)
- Z / X
- NES A-Taste / B-Taste
- Enter / rechte Umschalttaste
- NES Start / Select
- F1
- Dear ImGui Debugging-Fenster ein-/ausblenden
- F2
- 6502-CPU Einzelschritt ausführen
- F3
- PPU-Frame weiterschalten (262 Scanlines)
- F5 / Leertaste
- Ausführung fortsetzen / pausieren
- Esc
- Emulator beenden
Build- und Toolchain-Umgebung
Moderner C++20-Compiler (MSVC 2022 / Clang / GCC 11+) · CMake 3.20+ · Ninja / MSBuild · Modernes OpenGL 3.3+ · SDL2 · Dear ImGui (Docking Branch)
Desktop NES-Emulator auf GitHub ansehen