Skip to content

Commit cdd1fcf

Browse files
committed
Move rewinder to own module
1 parent 8fe9f9e commit cdd1fcf

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

src/nimes.nim

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
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

36
const saveSize = 600
47

58
var
69
reverse = false
710
reverseReset = false
8-
reverseStart = 0
9-
states: array[saveSize, NESObj]
10-
statesPos = 0
11-
pastStartsAt = 0
11+
rewind = newRewinder()
1212

1313
when 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)

src/rewinder.nim

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import nes
2+
3+
const rewindSize = 600
4+
5+
type Rewinder* = ref object
6+
states: array[rewindSize, NESObj]
7+
pos: int
8+
stored: int
9+
10+
proc newRewinder*: Rewinder =
11+
new result
12+
13+
proc empty*(r: Rewinder): bool =
14+
r.stored == 0
15+
16+
proc pop*(r: var Rewinder): NESObj = # This may be slow and need a popInto()
17+
r.pos = (r.pos + rewindSize - 1) mod rewindSize
18+
copyMem(addr result, addr r.states[r.pos], sizeof(result))
19+
r.stored = max(r.stored - 1, 0)
20+
21+
proc push*(r: var Rewinder, c: var NESObj) =
22+
copyMem(addr r.states[r.pos], addr c, sizeof(c))
23+
r.pos = (r.pos + 1) mod rewindSize
24+
r.stored = min(r.stored + 1, rewindSize)

0 commit comments

Comments
 (0)