1- import nes, os, times, algorithm, sdl2, sdl2.audio, sdl2.joystick
1+ import
2+ rewinder, nes,
3+ os, times, algorithm,
4+ sdl2, sdl2.audio, sdl2.joystick
25
36const saveSize = 600
47
58var
69 reverse = false
710 reverseReset = false
8- reverseStart = 0
9- states: array [saveSize, NESObj ]
10- statesPos = 0
11- pastStartsAt = 0
11+ rewind = newRewinder ()
1212
1313when defined (emscripten):
1414 proc emscripten_set_main_loop (fun: proc () {.cdecl .}, fps,
@@ -145,9 +145,9 @@ proc loop {.cdecl.} =
145145 let newTime = epochTime ()
146146
147147 if reverse:
148- copyMem ( addr nesConsole[], addr states[statesPos], sizeof (nesConsole[]))
149- statesPos = (statesPos + saveSize - 1 ) mod saveSize
150- if statesPos == pastStartsAt :
148+ if not rewind.empty:
149+ nesConsole[] = rewind. pop ()
150+ else :
151151 reverse = false
152152 reverseReset = true
153153 paused = true
@@ -164,9 +164,7 @@ proc loop {.cdecl.} =
164164 texture.updateTexture (nil , addr nesConsole.buffer, pitch)
165165
166166 if not reverse:
167- copyMem (addr states[statesPos], addr nesConsole[], sizeof (nesConsole[]))
168- statesPos = (statesPos + 1 ) mod saveSize
169- pastStartsAt = statesPos
167+ rewind.push (nesConsole[])
170168
171169 # when defined(emscripten):
172170 # audioDevice.queueAudio(addr nesConsole.apu.chan[0], uint32(nesConsole.apu.chanPos * sizeof(float32)))
@@ -204,7 +202,6 @@ proc loop {.cdecl.} =
204202 of SDL_SCANCODE_T :
205203 if not reverseReset and not reverse:
206204 reverse = true
207- reverseStart = statesPos
208205 of SDL_SCANCODE_F : speed = 2.5
209206 of SDL_SCANCODE_F9 : speed = 1.0
210207 of SDL_SCANCODE_F10 : speed = max (speed - 0.05 , 0.05 )
0 commit comments