This page is a mirror of Tepples' nesdev forum mirror (URL TBD).
Last updated on Oct-18-2019 Download

Controller Recording

Controller Recording
by on (#100918)
Has anyone implemented a controller record-and-playback routine? What approach did you take? Sampled at 60FPS that would take a lot of data. My idea was to have an algorithm that consisted of (16-bit) delta times between different states of the controller. I suppose another way would be to RLE the pad sampling.

Any ideas most welcome :)
Re: Controller Recording
by on (#100920)
There is a joypad simulator system for the NES called Nesbot, it is used to verify that Tool Assisted Speedruns work correctly on the console. I bet the same guy also did joypad input recording and playback too.

As for doing it from within a NES program (to create a demo), RLE should be really easy to implement. A simple series of byte-length values would do the trick.
Re: Controller Recording
by on (#100921)
I think RLE is fine. Maybe a stream of byte pairs, first the 1 byte controller data, then 1 byte saying how many frames until the next change (if change is >255 frames off, just duplicate, it's only 2 bytes every 4 seconds). That's should be compact enough for most purposes.

Here's a snippet from doppelganger's Super Mario Bros. disassembly:
Code:
DemoActionData:
      .db $01, $80, $02, $81, $41, $80, $01
      .db $42, $c2, $02, $80, $41, $c1, $41, $c1
      .db $01, $c1, $01, $02, $80, $00

DemoTimingData:
      .db $9b, $10, $18, $05, $2c, $20, $24
      .db $15, $5a, $10, $20, $28, $30, $20, $10
      .db $80, $20, $30, $30, $01, $ff, $00

DemoEngine:
          ldx DemoAction         ;load current demo action
          lda DemoActionTimer    ;load current action timer
          bne DoAction           ;if timer still counting down, skip
          inx
          inc DemoAction         ;if expired, increment action, X, and
          sec                    ;set carry by default for demo over
          lda DemoTimingData-1,x ;get next timer
          sta DemoActionTimer    ;store as current timer
          beq DemoOver           ;if timer already at zero, skip
DoAction: lda DemoActionData-1,x ;get and perform action (current or next)
          sta SavedJoypad1Bits
          dec DemoActionTimer    ;decrement action timer
          clc                    ;clear carry if demo still going
DemoOver: rts
Re: Controller Recording
by on (#100922)
tokumaru posted his RLE encoder here: viewtopic.php?p=92120#p92120
Re: Controller Recording
by on (#100943)
neilbaldwin wrote:
Has anyone implemented a controller record-and-playback routine? What approach did you take? Sampled at 60FPS that would take a lot of data. My idea was to have an algorithm that consisted of (16-bit) delta times between different states of the controller. I suppose another way would be to RLE the pad sampling.

Any ideas most welcome :)


I implemented controller record-and-playback in NESICIDE in the Test Suite Executive. But that is for implementing repeatable tests [or, conveniently, for running test ROMs with repeatable input patterns for me to use while emudevving].

That said, it'd be *cake* easy for me to add a feature to use the record portion as a funnel to generate an array of controller input data from a run of your program that could be compressed/compiled into your program. Sort of an "attract mode wizard".

In the early days of NESICIDE I actually had a controller input dialog that would allow you to adjust the recorded controller inputs on a widget that looked a lot like an 8-key player piano spool. Then it'd scroll and playback. I have yet to pull that over to the latest codebase.
Re: Controller Recording
by on (#100948)
I made a video showing the capabilities of what I was talking about in the previous post. I'm no video making expert so it's a RAR-compressed AVI.
Re: Controller Recording
by on (#100961)
cpow wrote:
In the early days of NESICIDE I actually had a controller input dialog that would allow you to adjust the recorded controller inputs on a widget that looked a lot like an 8-key player piano spool. Then it'd scroll and playback.

The TAS crowd would expletive love that.
Re: Controller Recording
by on (#101012)
tepples wrote:
cpow wrote:
In the early days of NESICIDE I actually had a controller input dialog that would allow you to adjust the recorded controller inputs on a widget that looked a lot like an 8-key player piano spool. Then it'd scroll and playback.

The TAS crowd would expletive love that.


I should expletive get off my expletive expletive and pull it into the Qt codebase. Yeah. I should. :D