Skip to content

Tags

Tags give the ability to mark specific points in history as being important
This project is mirrored from https://github.com/doublegate/RustyNES. Pull mirroring updated .
Successfully updated .
  • v0.8.0

    v0.8.0 - Rust 2024 Edition & Dependency Modernization
    
    This release modernizes the RustyNES codebase with Rust 2024 Edition
    and updates all dependencies to their latest stable versions.
    
    - Rust 2024 Edition (MSRV 1.88+)
    - eframe/egui 0.33 for desktop GUI
    - cpal 0.16 + rubato 0.16 for audio with resampling
    - 508+ tests passing, 100% Blargg pass rate
    
    - eframe: 0.29 -> 0.33
    - egui: 0.29 -> 0.33
    - cpal: 0.15 -> 0.16
    - rubato: NEW (0.16)
    - ron: 0.8 -> 0.12
    - thiserror: 1.0 -> 2.0
    - clap: 4.4 -> 4.5
    - rfd: 0.14 -> 0.15
    - gilrs: 0.10 -> 0.11
    
    - M7 (Accuracy Improvements): COMPLETE
    - M8 (Test ROM Validation): COMPLETE
    - M9-S0 (Dependency Upgrade): COMPLETE
    - M9 (Known Issues): Ready to Start
    - M10 (Final Polish): Planned
    
    Full changelog: https://github.com/doublegate/RustyNES/blob/alt-desktop/CHANGELOG.md
  • v0.7.1

    Release v0.7.1 - Desktop Cycle-Accurate Execution Fix
    
    Critical fix for desktop application to use cycle-accurate emulation mode,
    matching the execution behavior of the 100%-passing test suite.
    
    - Changed step_frame() → step_frame_accurate() in app.rs
    - Desktop now uses cycle-perfect execution (1 CPU : 3 PPU : 1 APU)
    - Mid-frame register updates work correctly
    - Timing-sensitive effects (sprite 0 hit, scroll splits) render properly
    
    - Added Bus::with_sample_rate() constructor
    - Added Console::with_sample_rate() constructor
    - APU generates samples at exact audio device rate
    - Eliminates pitch shifting artifacts
    
    - step_frame(): Batches entire instructions, then syncs PPU/APU (coarse)
    - step_frame_accurate(): Executes 1 cycle at a time (cycle-perfect)
    - Default sample rate: 48000 Hz (backward compatible)
  • v0.7.0

    Release v0.7.0 - Milestone 8 Complete (100% Blargg Test Pass Rate)
    
    - 100% Blargg test suite pass rate (90/90 tests)
    - Cycle-accurate CPU timing (all 256 opcodes)
    - Hardware-accurate PPU rendering
    - Precise APU audio synthesis
    
    - Blargg CPU: 22/22 (100%)
    - Blargg PPU: 25/25 (100%)
    - Blargg APU: 15/15 (100%)
    - Mappers: 28/28 (100%)
    - Total Workspace: 500+ tests passing
    
    - cpu_dummy_reads.nes: Cycle-accurate dummy read timing
    - cpu_interrupts.nes: NMI hijacking during BRK
    - RTI I flag restoration without delay
    - prev_irq_inhibit mechanism for IRQ acknowledgment
    
    - Open bus emulation with decay counter
    - OAM bit masking (0xE3 for attribute bytes)
    - Odd frame skip at scanline 261, dot 339
    - VBlank timing precision
    
    - Frame counter immediate clocking on mode switch
    - +1 cycle timing correction
    - DMC 2-stage sample pipeline
    - Hardware-accurate non-linear mixer (NESdev TND formula)
    
    - test_oam_dma: OAM attribute byte masking
    - test_odd_frame_skip: Correct pre-render line timing
  • v0.6.0

    RustyNES v0.6.0 - Accuracy Improvements (Milestone 7 Complete)
    
    Phase 1.5 Stabilization - First Milestone Complete
    Released: December 20, 2025
    
    HIGHLIGHTS
    ==========
    - APU frame counter precision: Fixed 4-step mode timing (22371->22372 cycles)
    - Hardware-accurate audio mixer: Non-linear TND formula matching NESdev reference
    - OAM DMA cycle precision: 513 cycles (even CPU start) vs 514 cycles (odd CPU start)
    - CPU cycle parity tracking for accurate DMA alignment
    - 429 tests passing with 0 failures, 6 ignored (valid architectural reasons)
    
    M7 SPRINT 1: CPU ACCURACY
    =========================
    - All 256 opcodes verified against nestest.nes golden log
    - Page boundary crossing timing accuracy confirmed
    - Unofficial opcode cycle counts validated
    - Interrupt timing precision verified
    
    M7 SPRINT 2: PPU ACCURACY
    =========================
    - VBlank/NMI timing functional with flag read/race condition handling
    - Sprite 0 hit detection working (2/2 basic tests passing)
    - Attribute shift register verification complete
    - Palette RAM mirroring edge cases handled
    
    M7 SPRINT 3: APU ACCURACY
    =========================
    - Frame counter precision fixed: 4-step mode quarter frame at cycle 22372 (was 22371)
    - Hardware-accurate non-linear mixer: NESdev TND formula implemented
    - Triangle linear counter timing verified
    - Mixer output validated against reference implementation
    
    M7 SPRINT 4: TIMING & SYNCHRONIZATION
    =====================================
    - OAM DMA cycle precision: 513 cycles (even CPU start) vs 514 cycles (odd CPU start)
    - CPU cycle parity tracking for accurate DMA alignment
    - CPU/PPU synchronization verified
    - Bus timing accuracy confirmed
    
    TECHNICAL SPECIFICATIONS
    ========================
    - APU Frame Counter (4-step): Cycles 7457, 14913, 22372, 29830
    - TND Mixer Formula: 159.79 / (100 + 1 / (triangle/8227 + noise/12241 + dmc/22638))
    - OAM DMA Timing: 513 + if (cpu_cycles % 2) == 1 { 1 } else { 0 }
    
    QUALITY METRICS
    ===============
    - 429 tests passing
    - 0 test failures
    - 6 tests ignored (valid architectural reasons)
    - Zero regressions from v0.5.0
    
    DEFERRED TO M8+
    ===============
    - Cycle-by-cycle CPU execution (architectural refactor for +/-2 cycle PPU precision)
    - DMC DMA cycle stealing conflicts
    - Additional sprite 0 hit edge cases
    
    WHAT'S NEXT
    ===========
    M8: Test ROM Validation - Target 95%+ pass rate on blargg test suites
    
    Full changelog: https://github.com/doublegate/RustyNES/blob/main/CHANGELOG.md
  • v0.5.0

    RustyNES v0.5.0 - Audio Playback & Rendering Fixes
    
    Audio playback implementation with cpal library, PPU attribute shift register fix, CLI ROM loading, and enhanced console API.
    
    Major fixes:
    - Audio buffer overflow eliminated with intelligent buffer management
    - PPU rendering bugs fixed (attribute shift registers)
    - Graphical glitches resolved (correct text, palettes, sprites)
    
    See release notes for full details.
  • v0.3.0

    v0.3.0 - Mapper Subsystem (Milestone 4 Complete)
  • v0.4.0

    RustyNES v0.4.0 - Integration Layer (Milestone 5)
    
    This release completes the functional core of RustyNES by integrating all
    previously implemented subsystems (CPU, PPU, APU, Mappers) into a cohesive
    NES emulator. The rustynes-core crate provides a hardware-accurate bus
    system and console coordinator ready for GUI development.
    
    MILESTONE 5 DELIVERABLES
    ========================
    
    Bus System (390 lines)
    - Complete NES memory map implementation ($0000-$FFFF)
    - Internal RAM: 2KB with proper mirroring ($0000-$1FFF)
    - PPU registers: $2000-$3FFF with 8-byte mirroring
    - APU/IO registers: $4000-$401F
    - Cartridge space: $4020-$FFFF (PRG ROM/RAM)
    - OAM DMA: Cycle-accurate 513-514 cycle transfers
    - Mapper IRQ integration with CPU interrupt handling
    
    Console Coordinator (425 lines)
    - CPU/PPU/APU timing synchronization
    - PPU: 3 dots per CPU cycle (5.369318 MHz)
    - APU: 1 step per CPU cycle (1.789773 MHz)
    - Frame timing: 29,780 CPU cycles per NTSC frame
    - NMI generation from PPU vblank
    - IRQ handling from mapper scanline counters
    
    Input System (386 lines)
    - Standard NES controller emulation
    - Hardware-accurate shift register protocol
    - Strobe latch control ($4016 bit 0)
    - 8-button serial read sequence (A/B/Select/Start/Up/Down/Left/Right)
    - Open bus behavior ($40 on bits 1-7)
    - Two-controller support ($4016/$4017)
    
    Save State Framework (130 lines)
    - Format specification with 64-byte header
    - Magic number validation ("RNES")
    - Version tracking for compatibility
    - SHA-256 ROM hash for mismatch detection
    - CRC32 integrity verification
    - Modular component serialization (ready for Phase 2)
    
    TEST COVERAGE
    =============
    
    Total: 398 tests passing (100% pass rate)
    
    By Crate:
    - rustynes-cpu: 46 tests (instruction execution, addressing modes, interrupts)
    - rustynes-ppu: 83 tests (rendering, timing, registers, sprites)
    - rustynes-apu: 150 tests (channels, timing, mixing, DMC)
    - rustynes-mappers: 78 tests (NROM, MMC1, UxROM, CNROM, MMC3)
    - rustynes-core: 41 tests (bus routing, console timing, input, DMA)
    
    New in v0.4.0:
    - Bus tests: 22 (memory map, PPU/APU/controller routing, DMA, mirroring)
    - Console tests: 7 (creation, reset, step, frame, ROM loading, timing)
    - Input tests: 9 (controller strobe, button states, serial protocol)
    - Integration tests: 3 (CPU+PPU+APU synchronization)
    
    DOCUMENTATION
    =============
    
    - Comprehensive TODO audit: 8 files corrected from PENDING to COMPLETED
    - Test ROM plan: 212 test files inventoried with execution roadmap
    - Updated README.md, CHANGELOG.md, ROADMAP.md for consistency
    - All TODO files now 100% accurate
    
    TECHNICAL SPECIFICATIONS
    ========================
    
    - Zero unsafe code across all crates
    - Strict clippy pedantic compliance
    - MSRV: Rust 1.75+
    - Dual-licensed: MIT/Apache-2.0
    
    WHAT'S NEXT (Milestone 6)
    =========================
    
    - Desktop GUI with egui/wgpu (rustynes-desktop crate)
    - Visual test ROM validation
    - Playable MVP release
    - Target: 80%+ game compatibility
    
    Phase 1 Progress: 83% complete (5 of 6 milestones)
  • v0.2.0

    Release v0.2.0 - Milestone 3: APU Complete
    
    This release marks the completion of Milestone 3, delivering a complete and hardware-accurate implementation of the Nintendo Entertainment System's 2A03 Audio Processing Unit (APU). All five audio channels are fully functional with cycle-accurate timing and non-linear mixing matching original hardware behavior.
    
    - **5 Audio Channels**: Pulse 1, Pulse 2, Triangle, Noise, and DMC
    - **Frame Counter**: Dual-mode sequencer (4-step and 5-step) with IRQ generation
    - **Hardware Accuracy**: Non-linear mixer matching NES hardware characteristics
    - **Sample Rate Conversion**: Configurable resampler with optional low-pass filtering
    - **Zero Unsafe Code**: 100% safe Rust implementation with #![forbid(unsafe_code)]
    
    - **Envelope Generator**: ADSR envelope with constant volume mode
    - **Length Counter**: Hardware-accurate length table and halt functionality
    - **Sweep Unit**: Frequency sweeping with ones' complement negation for Pulse 1
    - **Linear Counter**: 32-step counter for Triangle channel
    - **LFSR Noise**: 15-bit shift register with dual feedback modes
    - **DMC Sampler**: Delta modulation with DMA interface and IRQ support
    
    - **APU Clock**: 1,789,773 Hz (NTSC)
    - **Frame Rates**: 240 Hz (4-step) / 192 Hz (5-step) quarter frames
    - **Sample Rate**: 48,000 Hz default (configurable)
    - **Mixer Range**: 0.0 to ~2.0 (hardware-accurate non-linear)
    - **Register Interface**: Complete $4000-$4017 memory-mapped implementation
    
    - **150 Tests Total**: 136 unit tests + 14 documentation tests
    - **100% Pass Rate**: All tests passing across all APU components
    - **Comprehensive Validation**: Frame counter, envelope, length counter, sweep, all channels, mixer, resampler
    - **Test ROM Integration**: Blargg APU test suite and additional APU test ROMs included
    
    - **Zero Unsafe Code**: Safe Rust throughout entire implementation
    - **100% Clippy Compliance**: All pedantic lints passing in library code
    - **Comprehensive Documentation**: Full rustdoc coverage of public APIs
    - **Type Safety**: Extensive use of newtype patterns for hardware registers
    
    None. This is the first APU release.
    
    - Pulse Channel 1 with sweep unit ($4000-$4003)
    - Pulse Channel 2 without sweep ($4004-$4007)
    - Triangle Channel with linear counter ($4008-$400B)
    - Noise Channel with LFSR ($400C-$400F)
    - DMC Channel with sample playback ($4010-$4013)
    
    - Non-linear mixer matching hardware lookup tables
    - Resampler with configurable sample rate
    - Optional low-pass filter for audio smoothing
    - Frame counter with 4-step and 5-step modes
    - IRQ generation support
    
    - Complete APU register implementation ($4000-$4017)
    - Status register read ($4015)
    - Frame counter control ($4017)
    - All channel control registers
    
    - **Version**: 0.2.0
    - **Release Date**: 2025-12-19
    - **Milestone**: M3 - APU Complete
    - **Phase**: Phase 1 (MVP Development)
    - **Target Date**: December 2025 ✅ On schedule
    
    - `rustynes-apu`: 0.2.0 (new)
    - `rustynes-cpu`: 0.2.0 (updated)
    - `rustynes-ppu`: 0.2.0 (updated)
    - Workspace: 0.2.0
    
    - Total Tests: 150 (136 unit + 14 doc tests)
    - Pass Rate: 100%
    - Test Files: 11 modules
    - Total Lines: ~2,800+ (APU crate only)
    - Project Total: 279 tests across 3 crates
    
    - `VERSION-PLAN.md` - Comprehensive versioning strategy through v1.0.0
    - `CHANGELOG.md` - Updated with v0.2.0 release notes
    - `test-roms/apu/README.md` - APU test ROM acquisition guide
    - Sprint completion markers for Milestone 3
    
    - Blargg APU Test Suite (blargg_apu_2005.07.30) - 11 test ROMs
    - APU Additional Tests (apu_test) - 8 test ROMs
    - DMC Tests - 4 test ROMs
    
    ```bash
    git clone https://github.com/doublegate/RustyNES.git
    cd RustyNES
    git checkout v0.2.0
    cargo build --release
    ```
    
    ```bash
    cargo test --workspace          # Run all tests
    cargo test -p rustynes-apu     # APU tests only
    ```
    
    Target: Q1 2026
    - NROM (0), MMC1 (1), UxROM (2), CNROM (3), MMC3 (4)
    - 80% game compatibility
    - Mapper framework and trait system
    
    - v0.4.0 (M5): Integration/Core Complete
    - v0.5.0 (M6): Desktop GUI - MVP Release
    - v1.0.0 (M18): 100% TASVideos Accuracy
    
    - **New Crate**: rustynes-apu (complete APU implementation)
    - **Test Coverage**: +150 tests (129 → 279 total)
    - **Lines of Code**: +2,800 lines (APU only)
    - **Files Added**: 88 new files
    - **Audio System**: Complete 5-channel APU with hardware-accurate mixing
    - **Documentation**: VERSION-PLAN.md, updated CHANGELOG.md, APU test guide
    
    - APU-CPU integration pending (Milestone 5)
    - No audio output to speakers yet (requires desktop GUI from Milestone 6)
    - PAL timing not yet implemented (NTSC only)
    - Expansion audio not yet implemented (Milestone 12)
    
    - Rust 1.75+ (MSRV)
    - Any platform supported by Rust standard library
    
    - **Architecture Reference**: NESdev Wiki, Mesen2, Visual2C02
    - **Test ROMs**: Blargg's test suite, nesdev community
    - **Implementation**: RustyNES Contributors
    
    - **Repository**: https://github.com/doublegate/RustyNES
    - **Documentation**: https://docs.rs/rustynes
    - **Issue Tracker**: https://github.com/doublegate/RustyNES/issues
    - **Changelog**: https://github.com/doublegate/RustyNES/blob/main/CHANGELOG.md
    - **Roadmap**: https://github.com/doublegate/RustyNES/blob/main/ROADMAP.md
    - **Version Plan**: https://github.com/doublegate/RustyNES/blob/main/VERSION-PLAN.md
    
    See [CHANGELOG.md](https://github.com/doublegate/RustyNES/blob/v0.2.0/CHANGELOG.md#020---2025-12-19) for complete details.
    
    **Compare**: https://github.com/doublegate/RustyNES/compare/v0.1.0...v0.2.0
    
    ---
    
    **Released**: 2025-12-19
    **Milestone**: M3 (APU Complete) ✅
    **Next**: M4 (Mappers) - Target Q1 2026
  • v0.1.1

    Test release workflow - validates refactored CI/CD pipeline with proper job ordering and permissions
  • v0.1.0

    Release v0.1.0 - Precise. Pure. Powerful.
    
    First official release of RustyNES featuring world-class CPU and PPU implementations.
    
    Highlights:
    - 100% CPU test pass rate (56/56 tests)
    - 97.8% PPU test pass rate (88/90 tests)
    - Complete 6502/2A03 CPU with all 256 opcodes
    - Cycle-accurate 2C02 PPU with VBL/NMI and sprite rendering
    - Zero unsafe code
    - 44 test ROMs acquired for validation
    
    See CHANGELOG.md for full details.