TetaNES v0.15.0 is released. TetaNES is a cross-platform emulator for the Nintendo Entertainment System (NES) released in Japan in 1983 and North America in 1986, written in Rust using wgpu. It runs on Linux, macOS, Windows, and in a web browser with Web Assembly.
Features:
Runs on Linux, macOS, Windows, and Web.
Standalone emulation core in tetanes-core.
NTSC, PAL and Dendy emulation.
Headless Mode when using tetanes-core.
Pixellate and NTSC filters.
CRT shader for that retro feel.
Up to 4 players with gamepad support.
Zapper (Light Gun) support using the mouse.
iNES and NES 2.0 ROM header formats supported.
Over 30 supported mappers covering >90% of licensed games.
Game Genie Codes.
PPU Debugger
Runtime performance stats
Preference snd keybonding menus using egui.
Increase/Decrease speed & Fast Forward
Visual & Instant Rewind
Save & Load States
Battery-backed RAM saves
Screenshots
Gameplay recording and playback
Audio recording
TetaNES Changelog:
⛰️ Features
(mapper) Add Taito TC0190/TC0350 and TC0690 (Mappers 33, 48) - (b127fe6)
(mapper) Serve tier 3a bank-switchers from page tables - (9b63b40)
🐛 Bug Fixes
(audio) Ramp the output in and out instead of cutting - (5d25e83)
(audio) Pace on a deadline and hold the buffer with rate control - (8d27d27)
(audio) Prime the output stream before it starts consuming - (e67a133)
(core) [breaking] Hand out one nes frame per clock_frame call - (7cca0af)
BREAKING: ControlDeck::clock_frame returns Result
(input) Add enter/shift defaults for start/select - (68776d2)
(input) Stop bindings colliding and buttons sticking - (d2a6bf7)
(input) Fixed shortcuts to be on press instead of on release - (099462f)
(input) Fixed modifier rolling and stuck joypad keys - (568023c)
(libretro) Six defects found in review, and the claims that hid them - (28b97dd)
(ppu-viewer) Fixed oam tab zoom - (f150119)
(preferences) Fixed game-genie entry closing when focused in menu - (2e4b9d6)
(renderer) Sync wgpu surface to window size so menu clicks land - (a39fede)
(rewind) Render every rewound frame below 1x - (ae4d19b)
Drop Game Genie codes when the cart is swapped - (3ae10ff)
🚜 Refactor
(core) [breaking] Take readers and writers, not paths - (04bc7ae)
BREAKING: fs and ControlDeck save/load now take Read/Write, the path-taking forms are *_path, fs::load_bytes is gone since &[u8] is already a reader, and Config::data_dir is replaced by Config::sram_dir: Option
(core) [breaking] Flatten ownership so Bus holds the console - (c34e8b8)
BREAKING: ControlDeck::cpu() returns registers only; the console is ControlDeck::bus(), and save states, rewind and replay are now Bus rather than Cpu. ControlDeck::load_cpu is load_bus. Mapper and Memory moved from Ppu to Bus, as did the debugger. PpuDebugger is Debugger and its callback takes &Bus. Ppu::load_nametables/load_pattern_tables/load_oam take the CHR window to read from. The memory::Read and memory::Write traits are removed in favor of inherent methods. Save states from earlier builds will not load.
(core) [breaking] Make video::Frame a fixed-size buffer - (b79a2fe)
BREAKING: video::Frame no longer derefs to Vec
(core) [breaking] Collapse the clocking API and clean up public surface - (2b4fd1e)
BREAKING: MSRV is now 1.88; 1.85 could not build the crate at all. Map::sync is Map::update_banks, Ppu::sync_mapper is Ppu::rebuild_mapper_state, and MMC5's colliding update_chr_banks is select_chr_set. Frame buffers are fixed-size: Ppu::frame_buffer and ControlDeck::frame_buffer_raw return &[u16; ppu::size::FRAME], ControlDeck::frame_buffer returns &[u8; Frame::SIZE], and frame_buffer_into takes &mut [u8; Frame::SIZE]. ControlDeck::apu_mut returns &mut Apu, joypad takes &self, and wram returns &[u8; bus::size::WRAM]. Clocking clears the previous call's audio samples instead of accumulating; opt out with Config::clear_audio_on_clock = false. The five older clock_* entry points are deprecated shims rather than removals.
(core) [breaking] Delete the convention-only traits from common.rs - (61cedf4)
BREAKING: the Clock, Reset, Regional, Sample and Sram traits are gone, and the prelude drops them. clock, reset, region, set_region, output, save and load are inherent methods on each component and forward exactly as before, so a call like deck.cpu_mut().clock() is unchanged - only the trait import goes away.
(core) [breaking] Delete the pre-page-table memory path - (9ca8ae6)
BREAKING: mapper::Banks, mapper::BankAccess, ppu::CIRam and the mem module are gone. mem::Memory
(ppu) [breaking] Hold the PPU registers as fields, not structs - (145a954)
BREAKING: ppu::ctrl::Ctrl, ppu::mask::Mask and ppu::status::Status are gone; read the ctrl_*, mask_* and status_* fields on Ppu instead.
(ui) Follow the debugger accessors, and stop building one to discard it - (2606f3e)
📚 Documentation
(core) Describe the code as it stands, not its history - (5a5b65b)
Correct the supported-mapper table's counts, VRC4f and percentages - (ebcc66c)
Correct stale facts in CLAUDE.md, the mapper docs and the README table - (b702137)
Fix stale references and drop history from the branch's comments - (97a2850)
⚡ Performance
(core) [breaking] Keep the cart's ROM out of save states - (12156e5)
BREAKING: save states and rewind snapshots no longer carry the cart's ROM, so a state can only be applied to the game it came from. Cpu::load and ControlDeck::load_cpu are fallible, returning cpu::StateMismatch when the state does not belong to the loaded cart.
(rewind) Re-render rewound frames instead of storing them - (1ba7f48)
⚙️ Miscellaneous Tasks
Clear the must_use, const fn and rustdoc warnings - (5ef3404)
Fixed cd - (0022029)
Download: TetaNES v0.15.0
web: browser
Source:Here
2026-08-08
Tags:
Console,
FC,
Official_Build,
TetaNES

NewsLetter
Bookmark
Submit News
Email Us

Random Related Topic
0 Comments
Post a Comment
Can't post a comment? Try This!