メモリの読み込み処理は emu.registerafter() で登録する

gui.register() は1フレームに1回呼び出されるわけではないので、メモリ読み込みに使うと色々おかしなことになります。例えば以下のスクリプトをFCEUXで実行するとポーズ中でもXが増え続けます。

local x_prev = 0

function f()
    local x = x_prev
    x = x + 1
    gui.text(64, 64, string.format("X:%d", x))
    gui.text(64, 72, string.format("PrevX:%d", x_prev))
    x_prev = x
end

function main()
    --emu.registerafter(f)
    gui.register(f)
end

main()

単純に現在のフレームのメモリを読んで値を表示する程度なら問題にならないこともありますが、前フレームの値を記録しておいて後から参照したりする場合 gui.register() を使っているとうまくいきません。メモリ読み込みには emu.registerafter() を使うべきです。

物凄く今更な気がしますが私はずっと gui.register() を使っててハマったので一応。