github Laffinty/FCEUX11 v2.0.4
FCEUX11 v2.0.4

one hour ago

Several memory-safety bugs fixed, a bad cartridge or save no longer takes the emulator down
mapper 218 treated a page number as a byte offset, so unmasked PPU addresses could write outside the nametable area; on cartridges with less than 8K of CHR-RAM, a write to $2007 could run up to 7 KB past the heap. Both are now rewritten the way upstream does it. The picture and the playback of existing movies for such cartridges change accordingly. A malformed movie containing non-ASCII bytes used to abort the process; the GUID is now zeroed as a whole.

No more cross-thread races when loading save states, recording AVI or reading controller state
The VRC7 sound structures contain pointers that were written verbatim into save states, so reading such a state in another process left them dangling and could crash the emulator. The derived data is now rebuilt on load without changing the sound phase. The indices of the AVI ring buffer, the TraceLogger and the CDL counters are now atomic, which removes dropped tail frames and data races, and the .cdl output for non-FDS cartridges is aligned with upstream.

Lua scripts were reading entirely misaligned key names, the mouse is fixed too
The key-name table in input.get() indexed an SDL scancode array by Windows virtual key code, so all 96 keyboard names came out wrong (capslock reported Q) and the three toggle keys were permanently false; it is now based on scancodes. The mouse click value became a bit mask with middle-button support, so two buttons pressed together are no longer both missed.

The Famicom microphone is now read as a plain level, matching real hardware
Bit 2 of $4016 used to be a 1996-era hack that alternated on every read: the value flipped between 1 and 0 while held and both controller ports were affected. Following NESdev and the Mesen2 reference implementation, it is now read as a level, always 1 while held, 0 when released, and only on port P2.

Two fatal GBA crash sites removed, with reproducible tests and diagnostic probes
Two illegal values in sprite attributes could crash the renderer in mid-frame, which meant an outright crash in release builds; they are now treated as sprite-not-displayed, exactly as real hardware does. Nine minimal reproducible fixtures and three permanent guards were added at the same time, and the diagnostic probe now records BIOS system calls, catches crashes and injects input, which makes the remaining compatibility issues easier to pin down.


修复多处可致崩溃的内存越界,坏卡带与坏录像不再带崩模拟器
mapper 218 的 CHR-RAM 映射把页号当成字节偏移使用,未掩码的 PPU 地址会写出绘图区;CHR-RAM 不足 8K 的卡带写 $2007 最多越堆 7 KB,两处均按上游写法重写。该类卡带的画面与既有录像回放会随之变化。含非 ASCII 字节的畸形录像此前会让进程直接中止,现改为把 GUID 整体置零。

修复跨进程读档、AVI 录制与手柄状态的跨线程竞争
VRC7 声卡结构的指针被原样写进即时存档,跨进程读档后成为悬空指针并导致崩溃,现于读档时重建派生数据而不改音色相位;AVI 环形缓冲、TraceLogger 与 CDL 计数器的索引改用原子变量,消除尾帧丢失与读写竞争,非 FDS 卡带的 .cdl 输出也与上游一致化。

Lua 脚本读到的按键名此前整体错位,鼠标按键一并修正
input.get() 的键名表按 Windows 虚拟键码索引 SDL 扫描码数组,96 个键盘名全部读错(capslock 读到 Q),三个切换键恒为 false,现已改以扫描码为基准;鼠标 click 改为位掩码并补上中键,双键同按时不再两个都读不到。

Famicom 麦克风改为电平直读,并对齐真机行为
$4016 的 bit2 此前是 1996 年的逐读翻转实现,按住时读数在 1 与 0 之间交替、两个手柄口都受影响;现按 NESdev 与 Mesen2 的双重参照改为电平直读,按住恒为 1、松开为 0,且仅 P2 口生效。

GBA 侧消除两个致命崩溃点,并补齐可复现的测试与诊断探针
精灵属性中的两个非法取值此前会在渲染途中触发崩溃、发布版直接闪退,现按真机语义视为精灵不显示;同期新增 9 条最小可复现夹具与 3 条常驻守卫,诊断探针支持 SWI 调用记录、崩溃捕获与输入注入,便于继续定位剩余兼容性问题。

Download FCEUX11

Don't miss a new FCEUX11 release

NewReleases is sending notifications on new releases.