Post subject: lsnes emulator development (lsnes rr1-Δ18ε3)
Emulator Coder, Skilled player (1114)
Joined: 5/1/2010
Posts: 1217
What I have been lately working on: SNES and Gameboy rerecording emulator based on bsnes core. Wiki: Lsnes Files: rr1-Δ18ε3 - Windows Installer 19 MB rr1-Δ18ε3 - Source code 2 MB (Can be used to build for Linux, Windows, OS X, and possibly other UNIX compatible OSs) rr1-β0 [Friday January 6th 2012] ================================ * lsnes rr1-β0 rr1-β1 [Friday January 6th 2012] ================================ * Remove dummy test SRAM * Fix controller logical numbers rr1-β2 [Tuesday January 10th 2012] ================================== * Fix lsnes-dumpavi * Pack movie data in memory rr1-β3 [Tuesday January 10th 2012] ================================== * Fix framecount/length given when loading movies * Controller command memory leak fixes * Don't leak palette if freeing screen object rr1-β4 [Wednesday January 11th 2012] ==================================== * Detect git revision and have version shown * Reformat the version message a bit * Wxwidgets: Allow controlling dumper start/stop from menu rr1-β5 [Wednesday January 11th 2012] ==================================== * Partially rewrite the manual * Finish the manual modifications * Lua: Support Lua 5.2.X too rr1-β6 [Wednesday January 11th 2012] ==================================== * Win32: Fix compile errors rr1-β7 [Thursday January 12th 2012] ================================== * Refactor controller input code * Don't fall off commandline processing routine rr0-Δ1ε2 [Thursday January 12th 2012] ===================================== * Support Lua 5.2 rr1-β8 [Friday January 13th 2012] ================================= * Remove core/coroutine * When showing input in readwrite mode, show last sent input * Rewind movie to beginning function * Fix frame number reported to Lua in repaint after load * Fix desyncs with rewind movie to begnning function * wxwidgets: Allow editing jukebox from the GUI * wxwidgets: Save settings on exit, load settings on startup * Support ${project} for filenames * SDL: Fix command history rr1-β9 [Saturday January 14th 2012] =================================== * SDL: Fix order-of-global-ctor bug * Fix another order-of-global-ctor bug rr1-β10 [Saturday January 14th 2012] ==================================== * NULL some window pointers when quitting * Wxwidgets: Fix thread memory managment rr1-β11 [Sunday January 15th 2012] ================================== * Evdev: Don't call keygroup::set_position in invalid thread * wxwidgets: Actually implement load state preserving input rr1-β12 [Sunday January 15th 2012] ================================== * wxwidgets: GUI for memory search * Add warning about calling synchronous queue in callback to UI rr1-β13 [Wednesday January 18th 2012] ===================================== * Remember last saved file when populating file to load * Remember absolute path for last save * Suppost boost threads for MT dumping * Fix compiling on win32 * Lua: New function input.raw, which gives data for all buttons * Lua: input.keyhook * Make mouse be ordinary keys instead of being special * SDL: Fix NUL codepoints in commands (fix weird cursor behaviour) rr1-β14 [Thursday January 19th 2012] ==================================== * Merge status panel and main window * True movie slot support * SDL: Fix compilation error * Fix cross calls in dumper menu code rr1-β15 [Friday January 20th 2012] ================================== * Cancel pending saves function * Wxwidgets: Inline some menu handling * Use RAII for modal pauses * Some more modal pause RAII stuff * Wxwidgets: Refactor dialog code * Wxwidgets: Fix system -> reset * Wxwidgets: Read the watch expressions in the right thread rr1-β16 [Saturday January 21th 2012] ==================================== * Wxwidgets: No, Lua code does not support reading script from .zip * Wxwidgets: Increase number of autohold slots (in case more are needed) * Don't append trailing '-' to prefix when saving movie. * ROM/savestate handling fixes rr1 [Saturday January 21th 2012] ================================ * Document the memory watch expression syntax rr1-Δ1 [Monday January 23rd 2012] ================================= * Fix compression settings in lsnes-dumpavi * Fix unattended dumping * Raw dumping support * Documentation for the raw dump mode * Rewrite lsnes-dumpavi to use adv_dumper interface * Let one control the method AVI dumper preturbs the sampling rate rr1-Δ2 [Monday February 6th 2012] ================================= * Wxwidgets: Pass correct mode when dumping * Also set core ports when loading savestate rr1-Δ2ε1 [Monday February 6th 2012] =================================== * Add header file in order to make it compile with bsnes v086 * Allow compiling against bsnes v086 rr1-Δ3 [Monday February 21st 2012] ================================== * Don't prompt before quitting * Start unpaused and preserve pause/unpause over load-type ops * Try to autodetect headered ROMs * Add option to skip the ROM patching screen * Fix SDL event polling * Fix the speed throttle * Wxwidgets: Reposition buttons a bit * wxwidgets: Hotkey configuration * Wxwidgets: Improve key selector by loading the existing key if available rr1-Δ4 [Monday March 4th 2012] ============================== * Code cleanup * Fix (i)strip_CR * Fix generic_port_read() * Introduce some string functions to refactor the rest of code with * Get rid of setting::print_all() * Use standard boolean parser for parsing booleans * Remove SHA-256 indices * Refactor some generic platform code * Refactor settings commands * Don't dump JMD at undefined compression level * Remove unnecressary conversions in dumper control * Refactor ROM option parsing * Refactor some moviedata commands * Refactor edit-author * Refactor memory watch commands * Fix a bug in extract_token() * Refactor keymapper.cpp command parsing * Refactor remaining tokensplitters * Don't do anything undefined if Lua C function throws an exception * Premultiplied_color default constructor (transparent color) * Lua class system * Lua Bitmap * Oops, bsnes v085/v086 patchseries was incomplete, fix that * Debug multithreading-related errors rr1-Δ4ε1 [Monday March 4th 2012] ================================ * Fix movie corruption in certain cases rr1-Δ5 [Thursday March 8th 2012] ================================ * Add new lua hooks * Add emulator_ready() lua function * Lua: utime(): Microsecond-resolution time * Update manuals for changes * Lua: Add on_idle() and on_timer() * Don't call subframe poll on first poll (only if needed) * Fix double-polling for real * Lua: input.geta/input.seta * Add documentation for added lua stuff * Fix compilation * Wxwidgets: Fix the "internal focus lost" problem * Wxwidgets: Fix broken modifiers * Shorten maxwait from 5s to 0.1s * Lua: bit.extract * Refactor render queue management * Allow optional initial fill color for bitmaps * Lock palettes to protect color array structure * Special-case render object allocation * Add patchseries for v087 * Lua: bit.value * Lua: input.controllertype() rr1-Δ5ε1 [Saturday March 10th 2012] =================================== * Movieinfo: Print port 2 type right * Reread controls after loadstate * Actually fix the "on_input() not called after loadstate" correctly rr1-Δ5ε2 [Tuesday March 13th 2012] ================================== * Fix saving of movie data for port2 * Fix SRAM handling with Bsnes v087 rr1-Δ6 [Wednesday April 11th 2012] ================================== * Do some small fixups with dumpers * Split AVI file structure related classes to dedicated file * Refactor makefile * More code file moving * Switch to dedicated SHA-256 implementation * Fix Win32 building * Library loading support * Refactor AVI dumping a lot (WIP) * Add the needed support for internal buffering by audio codec * Add missing LF in cscd.cpp * Some dumping improvements * AVI dumping fixups * TSCC video codec * Don't corrupt AVI if emulator is closed while dumping * Make settings window scrollable so it doesn't grow excessively large * Hicolor raw dumping * Refactor codec zlib handling * RAW dump over TCP/IP support * Fix compilation (missing header) * Some makefile fixes * Fix dumper modes and remove some dead code * Support hiding the status panel * Turbo on hold/turbo toggle * Way simpler turbo implementation * Change targetfps to be percentage * Speed and volume adjustment * Command for changing volume * Implement screen scaling * Fix the "re-show too short" problem with status panel * Allow drag'n'drop of file to ROM select dialog / rom patch dialog * Configurable movie/ROM paths * Lua: gui.rainbow * Portaudio: Fix speaker popping * Wxwidgets: Move some menu entries around * Wxwidgets: UI speed adjustment * Wxwidgets: More menu twiddling * Some more twiddling with the menus * Refactor TCP dumping * Split cases for prefix and special for dumper targets * Also support dumping JMD and SDMP over TCP/IP * Win32 joystick support * Wxwidgets: Make scaling factors be global variables * Wxwidgets: New settings dialog: Axes and paths * Wxwidgets: Some more menu shuffling * Lua: gui.box * Wxwidgets: Move screen scaling into main settings dialog * Internally classify keys * Rework jukebox * Wxwidgets: Move settings to main configuration dialog * Fix error with settings avi-tscc-keyint and avi-cscd-keyint * Wxwidgets: Move the rest of config to main configuration dialog * Set wxTR_HIDE_ROOT on hotkey tree * Split keys in classes * Refactor path handling * Fix title and prompt in slot count changing * Try to fix the "key does not change" problem with Win32 * Win32: Fix the hotkeys tree by adding wxTR_LINES_AT_ROOT * Note WIN32MM joystick driver * Wxwidgets: Configuration dialog: Disable buttons that make no sense * Wxwidgets: Disable clear buttons on nonclearable settings * Wxwidgets: New ROM select dialog * Wxwidgets: Change name of SNES cartridge ROM * Wxwidgets: Make DnD to SRAM filename boxes work properly * Wxwidgets: New project options dialog * Fix the project options dialog on Win32 * Wxwidgets: Fix ROM select dialog with wxwidgets 2.9 * Wxwidgets: Project options dialog improvements: * Make settings dialog saner size if there are no joysticks * Wxwidgets: Some more attempts at fixing settings dialog sizing * Wxwidgets: Mention lack of joysticks in joystick config * Wxwidgets: Finally fix the settings dialog size * Wxwidgets: Fix key entry dialog key box sizing to behave * Wxwidgets joystick support rr1-Δ7 [Saturday April 21th 2012] ================================= * Refactor joystick support * Refactor joystick support more * Evdev: Fix pressure-sensitive buttons not showing up * Print joystick driver name for show-joysticks * Evdev: Add BTN_TOOL_QUINTTAP * Evdev: Move name tables to joystick.cpp * Evdev: Remove some unused variables * Wxwidgets: Don't print disabled axis as unknown type * Make keymapper threadsafe * Make command interface threadsafe too * Make settings threadsafe * Add option to open the config dialog without opening a ROM * Wxwidgets: Fix compiling on Win32 * Wxwidgets: Kill internal hotkeys data before exiting the config dialog * Wxwidgets: Add option to prompt for key in key select dialogs * Wxwidgets: Fix the "key goes away underneath" crash. * Add unistd.h to src/core/loadlib.cpp * Wxwdigets: Fix mouse coordinates in presence of scaling * AVI dumper: Always flush as much as possible, not just 1 frame * AVI dumper: Add mode 4: Upcovert to next common rate using SRC * New hotkeys config dialog * Add manual changes for SRC * Add start paused option * Wxwidgets: Start paused applies even to new project rr1-Δ7ε1 [Wednesday April 25th 2012] ==================================== * AVI dumper: ZMBV support * AVI ZMBV: Lots of refactoring * AVI dumper: Performance counters * lsnes-dumpavi: Change order of dumper startup and lua startup * AVI dumper: Fix secondary audio in mode 4 * AVI dumper: Do high-quality audio resampling in dedicated thread * AVI ZMBV: Pad the buffers instead of doing OOB access rr1-Δ7ε2 [Monday May 7th 2012] ============================== * Extend zlibstream to support Z_SYNC_FLUSH and simplify zmbv code * Fix reading analog values rr1-Δ8 [Thursday May 10th 2012] =============================== * Reintroduce delay reset support * Lua: memory.hash_region rr1-Δ8ε1 [Wednesday May 16th 2012] ================================== * Revamp the build system * Add autohold for 1 frame (framehold) commands * Framehold: Fix a bug where loading savestate didn't reset the holds * Framehold: Add corresponding hotkeys and fix spurious autohold signal * More build system work * Ranlib the built bsnes archive * Build: Fix wrong polarity on BOOST mt postfix * Small build instructions rewording * Some rewording on options.build * Add missing bsnes version define * Apparently delayreset only compiles with bsnes v085. * Support v086 and v087 (but without delayresets) * SDL: Save settings on exit * SDL: Add command to enter command line with specified text * SDL: More advanced editing rr1-Δ9 [Tuesday May 22nd 2012] ============================== * Try to fix the "arrow keys get lost" problem * MSU-1 support * Fix bug where mode change due to rewind is not shown * Unsafe rewinding * Fix lua_callback_do_unsafe_rewind in no-Lua case * Fix directory transversal in handling rerecord counting rr1-Δ10 [Thursday June 7th 2012] ================================ * AVI dumper: Sound mode 5: Fixed high-quality 48kHz * Lua: Reset Lua VM function * wxWidgets: Run script -> Run batch file * Expand memory addresses from 32 to 64 bits * Support pure virtual mappings * Export the iospace flag to Lua. * Fix bug with loading memory watches under Win32 rr1-Δ10ε1 [Friday July 6th 2012] ================================ * Mirror some internal BSNES structures into virtual memory space * Add support of DnD movies/saves into the main window * Fix the "click on panel locks up keyboard" for real rr1-Δ11 [Sunday July 15th 2012] =============================== * Librarify screen rendering * Split all references to bsnes core to dedicated file * Merge the new framebuffer code * Delete include/core/bsnes.hpp * Obtain the maximum number of logical controllers from the core defs * Get rid of porttype_t and devicetype_t * Move controller types to bsnes core, get rid of *LOGICAL* constants * Move prototypes for controller-specific functions from emucore.hpp * Reload ROM image on the fly * Move core-specific code to core bindings * Allow binding methods in Lua classes * Get rid of nall * Move button symbols to core specific code * Backport changes to generic stuff from gambatte core bindings work * Fix compile errors for Win32 * More compile error fixing * Remove some debug spam on startup * Fix some display scaling related bugs * Fix sorting of various comboboxes * Update the manual (common for both versions) * Remember invalid settings * Fix mistake in settings dialog (not printing errors) * [GB] Gambatte core support * [GB] Fix ridiculous resolutions for special screens * [GB] max, not min! * [GB] Get gambatte version from the core itself * [GB] Updated manual for gambatte version * [GB] Fix savestate-related bugs * [GB] Fix saving of channel 1 sweep unit * [GB] Fix dumping (wrong framerate) * lsnes rr1-Δ11ε1 [Wednesday July 18th 2012] ==================================== * Fix bug in skip poll feature rr1-Δ12 [Friday July 20th 2012] =============================== * Non-insane savestate anchoring rr1-Δ13 [Thursday August 30th 2012] =================================== * Don't try to call methods from uninitialized pointers * Memory search extensions * Preserve the movie if loading state in readonly mode * Add option to use the older read-only load behavior * Fix timeline check in one special case * Revamp ROM loading * Update manual * Fix various bugs introduced in ROM changes * wxwidgets: New menu layout * Don't throw exceptions from ROM loading out of main loop * Standalone hotkey configuration dialog * wxwidgets: Cleanup the shown bindings a bit * wxwidgets: Clean up key configuration dialog * wxwidgets: Use comboboxes instead of 3state checkboxes * wxwidgets: Also unpause on ROM DnD rr1-Δ13ε1 [Saturday September 1st 2012] ======================================= * Video dumping: Add pipedec * Fix uninitialized variables in bsnes core * [GB] Fix a crash when loading a ROM rr1-Δ14 [Sunday September 9th 2012] =================================== * Fold Gambatte code to mainline rr1 maintenance branch * Say what file extension is expected from dump file * Memory watch computation data typing * Memory watch: lsnes internal mmio area * New memory watch editor * Allow adding addresses directly from memory search * Wxwidgets: Split memory watches in panel * Hexadecimal memory watch support * Wxwidgets: Refactor memory search code * Wxwidgets: Make status panel monospaced * Wxwidgets: Memory search: Add an option to disable VMAs * Make / in memory watches mean FP division. * lsnes-dumpavi: Don't hold back on emulation speed * Base subtitle support * Wxwidgets: Basic subtitles editor * Document subtitle-related stuff * Subtitle management from Lua * Allow dumping subtitles as .sub file * Export the rerecord count via MMIO and Lua * Fix rerecord count reporting when loading movies * Don't trash movie data when loading in readonly mode rr1-Δ14ε1 [Friday September 21st 2012] ====================================== * Fix crashes when closing settings dialog on Mac OS X * Fix build on Mac OS X * Lua: loopwarapper * Fix syntax bug in serialization.hpp * Allow hiding the messages window * Lua: input.joyset * Allow inconsistent savestates * lsnes-dumpavi: Allow setting settings * Implement mode where emulator saves every frame * Fix desync on loading savestate in readonly mode after movie * Fix save dialogs not working right on Mac OS X. * Fix insane status width on Win32 * Make autohold not hang the emulator for a long time * Wxwidgets: Allow loading ROMs and movies from commandline * Update manual rr1-Δ15 [Wednesday September 26th 2012] ======================================= * Be bit smarter with --load * New audio API WIP * Fix building after the commentary track thingy * Some more build fixing for Win32 * Lua: input.joyget * Also add support for Gambatte SVN 358 * Use builtin font for rendering status panel * Fix the new status area code * Add option to detach memory watch to its own window * Recent ROMs / Movies menu * Libao support * Update manuals about libao * Make lag counter useful in SNES games that autopoll * Fix a syntax error in gambatte patche * Fix missing wxT in recentmenu * Fix gambatte core bindings rr1-Δ15ε1 [Thursday September 27th 2012] ======================================== * Wxwidgets: Don't resize in paint handler, it makes wxwidgets blow up * If a ROM and movie are dropped at once, load both * Gambatte: Don't save spurious movie SRAMs in movie files * Make SGB ROMs actually usable * Don't probe for existence for filename to in recent_files::add/get * Only one commentary track editor at a time please * Commentary editor: Allow reopening the editor after close rr1-Δ15ε2 [Saturday September 29th 2012] ======================================== * Lua: memory.readregion / memory.writeregion * Lua: memory.map* * Lua: memory.map_structure * Fix bus_address for gambatte * Fix features dependent on bsnes debugger * Cleanup bsnes debugger logic * Fix resets in presence of save every frame rr1-Δ15ε3 [Saturday October 27th 2012] ====================================== * Lua: input.lcid_to_pcid * Fix off-by-one bug with slot hashes * Fix crashes on certain memory watch expressions * Lua: memory.read_expr * Lua: Fix memory.read_expr on nil argument * Fix the code to compile on G++ 4.7 * Change button_id to be a function pointer field, not a virtual method * Refactor porttype_info into library/ (as port_type) * Add bsnes patches to fix libsnes to compile on GCC 4.7 * Revert "Refactor porttype_info into library/ (as port_type)" * Gambatte: Always use legacy lag counting * Memory commands: Memory addresses are up to 16 hex digits, not up to 8 * Fix analog controllers * Fix autohold menus * Fix button symbols in input display * Compensate for nuts bsnes superscope/justifier handling * Lua: Fix bit.extract with booleans rr1-Δ16 [Thursday January 24th 2013] ==================================== * Stop on movie end: Stop at correct frame, not one frame too late * Clean up library includes * Backport library updates and sort out the fucking messages mess * Portaudio: Re-enable blacklisting of default and sysdefault * Fix crashes when closing lsnes with voice playback active * Refactor voice import/export and support pregap, postgap and gain * Support voice OggOpus import/export * Hack to allow using 16-button controllers * Remove nonexistent controllers from input display * Don't use constructs not implemented in gcc 4.6 * Wxwidgets: Allow setting voice/record volumes from the UI * Cores: Blurb * Update libgambatte to SVN 364 * Load XML even without gamepack * Support screen rotation & flipping * Backport the new bit functions * Lua: Backport new Lua functions from master and add bit.rflagdecode * Real-time updates for voice streams in editor * Live subtitle editing * Actually honor music volume setting rr1-Δ16ε1 [Sunday February 3rd 2013] ==================================== * Wxwidgets: Fix memory watch rendering * Allow setting stream gain * Wxwidgets: VU meters & volume adjustment window * Lua: Custom fonts support * Lua: Fix bug with methods and resetting Lua VM * Fix rerecord count when loading movies * Fix paths in bsnes patches * Change AVI default sound mode * Fix loading standard-mode movies rr1-Δ17 [Monday February 11th 2013] =================================== * Very basic movie editing support * Movie editor: Refactoring * Movie editor: Popup menu * Movie editor: Don't offer popup menu items that make no sense * Movie editor: Show button/axis names in popup menu * Movie editor: Don't offer out-of-movie edits in menu * Movie editor: Allow changing window size * Movie editor: Sanity-limit number of rows * Movie editor: Don't recount the entire movie when change is known * Movie editor: Insert frame after * Movie editor: Handle partially stored frames properly * Fix all sorts of wacky behavior with dummy audio callback * Show nominal and actual sample rates in VU window * Movie editor: Delete (sub)frame * Movie editor: Fix deleting the leading subframe * Movie editor: Locked scrolling mode * Movie editor: Reorganize the popup menu a bit * Movie editor: Show movie length * Win32: Use MoveFileEx to replace the target in one operation * Movie editor: Fix compilation on Win32 * Wxwidgets: Repaint the status panel after RW/RO switch * Movie editor: Run to frame function * Movie editor: Append multiple frames at once * Movie editor: Truncate movie * Movie editor: Scroll to specified frame * Movie editor: Scrolling fixes * Movie editor: Handle scrolling when rewinding * Movie editor: Tweak colors * Movie editor: Scroll to current frame * Update manual * Movie editor: Allow toggling whole sequence of axis values at once * Movie editor: Show buttons even when released * Backport some bugfixes from compiler warning fixing * Fix compiling on Win32 * Allow changing the Opus bitrate at runtime * Wxwidgets: Load filenames as ROMs and support --lua=<file> * Wxwidgets: Support -h and --help rr1-Δ17ε1 [Monday March 4th 2013] ================================= * Commentary: Max bitrate limiting * Unconditionally reload hostmemory on loadstate * Lua: Query bindings, manipulate aliases, create inverse bindings * Fix crash with bitmaps and resetting Lua VM * More paint / reset fixes * Voicesubs: Don't access uninitialized variables * gui.text: Don't corrupt memory on rendering off bottom * Fix writing of screenshot magic to be reliable * Lua: Some new and backported input functions * Lua: input.port_type: Be consistent on type of port 0 * Movie editor: Fix the reset delay counters to be right way around * Lua: input.controller_info * Lua: Document input.controller_info * Lua: on_snoop2 * Lua: on_button and input.veto_button rr1-Δ17ε2 [Monday April 1st 2013] ================================= * Fix saving PNG screenshots * Movie editor: Sweep axis * Load selected slot in ro/rw/preserve/movie mode * input.joyset: Preserve and invert user input * Allow immediate saving at point of save * Fix mouse movement * Wxwidgets: Filter filenames in load/save dialogs, autoappend extensions * data/verysmall.font is mising glyph 70 (F) * Lua: CUSTOMFONT: Allow painting with halo * Fix value search to work with byte types rr1-Δ17ε3 [Wednesday April 17st 2013] ===================================== * Fix status panel (and movie editor) flicker * Actually fix the statuspane/movie-editor flicker * Show effects of Lua in input display * Offer lsmv.backup as file filter too for load lsmv * Allow slowing down subframe advance (it used to always be very fast) * Display current save slot information * Add snes9x fonts * Fix hotkeys stopping working after X-ing settings dialog * Movie editor: Fix bug if extending finished movie * Cap current_frame_first_subframe to movie size when recounting movie * Movie editor: Interpret ctrl+click as right click rr1-Δ17ε4 [Monday June 24th 2013] ================================= * Lua: Fix drawing lines in some angles. * Fix compilation error if size_t != uint64_t. * Ogg: Properly initialize data_count on read ogg pages. * Memory search: Autoupdate memory search by default. * Memory search: Move buttons to context menu, add disqualify address. * Memory search: Use text panels instead of textbox. * Backport Mac OS X build fix. * OggOpus: Fix Vendor vs. ENCODER. * Lua: gui.delta_<class>_gap. * Fix RTC on loadstate in readonly mode. * Save/Restore host memory across unsafe rewinds. * gui.text: Fix clipping to left/top border. * Implicit creation of inverse binds for aliases. * Fix subtitle generation. rr1-Δ18 [Thursday July 25th 2013] ================================= * Fix reading signed values via read-s* * Movie editor copy&paste * Fix reading system controls using input.get2. * (D)Bitmap decoding from PNG support. * Allow loading PNG/PAL/BITMAP from string. * Lua: Don't crash if some method throws. * Support Y-cabled gamepad16. * Lua: Allow shortening evaluate-lua to L. * Lua: Methods for handling movies as objects. rr1-Δ18ε1 [Friday October 4th 2013] =================================== * Add installer script * Backport support for SGB GB WRAM and HRAM. * Support BITMAP+PALETTE -> DBITMAP. * If loading movie/savestate without ROM, prompt one. * Fix movie initialization on ROM load. * Fix compilation if wxString is wchar_t based. * Save ROM name hints. * Use hints for default filename on ROM load. * runuifun: Call the function only once. * Fix NULL pointer dereference if gametype changes from NULL. * Lua: gui.arrow * Fix diagonal arrows. * Print() can print any type. * Extend userdata printing. * Fix wrong use of lua_error. * Lua: Tilemaps * Don't allow editing reset flags after reading. rr1-Δ18ε2 [Monday October 14th 2013] ==================================== * Fix crash if reloading ROM with non-default controllers in readwrite mode rr1-Δ18ε3 [Sunday January 5th 2014] =================================== * Backport bsnes/gambatte patches and make emu at least run * Fix compiling gambatte binding with versions not supporting debug extensions * Handle frame spanning movie page boundary * Platform::wait(): Never wait on zero delay Using compat core instead of accuracy gives about 2x speed and should only affect Air Strike Patrol (which uses graphics effects Compat can't emulate).
Warepire
He/Him
Editor
Joined: 3/2/2010
Posts: 2178
Location: A little to the left of nowhere (Sweden)
Cool! I will have to check this out a little later. I have not looked at the code for your rr-port so I don't know if you already thought of / did this. One thing that crossed my mind with the games that use the RTC chips is that it may be possible to enslave that clock to something internal in the SNES and make the RTC "start time" a setting. Thus allowing us to choose the optimal clock state (the movie files would have have to be extended to carry this setting). IF there are any "important" games that use the RTC that is...
creaothceann
He/Him
Editor
Joined: 4/7/2005
Posts: 1874
Location: Germany
Some thoughts...
  • It would be really helpful to default to the faster compatibility core. The accuracy core is only needed to show a graphical effect in one or two games. Using the same key input file for both cores should never result in a desync.
  • Loading ROMs with spaces in the file didn't work until I figured out that lsnes-sdl "--rom=%~1" in a batch file works. Wouldn't it be more intuitive for lsnes to assume that the first parameter (that is not a switch) is the ROM file?
  • Supporting ROM files with headers is kind of iffy - you may as well add support for all kinds of compressed archives. (Using uncompressed files for everything would be helpful, imo.)
  • The need to press Pause to start playing is kind of unintuitive - SNES9x uses the "play" and "record" program states for that.
  • The manual is kind of unusable - wall-of-text alert! The best solution imo would be *.htm files (one for each section) with hyperlinked indices for quick navigation.
  • It really needs an easy way to change keys, at least a list of the default keys (I eventually found them in the log) and a list of all available key names.
  • Don't worry about Avisynth's "AVISource" command, there are much more modern ones available (FFIndex+FFVideoSource and DSS2). Btw. a window popping up with the installed codecs (like in SNES9x) would also be good.
Emulator Coder, Skilled player (1114)
Joined: 5/1/2010
Posts: 1217
Warepire wrote:
One thing that crossed my mind with the games that use the RTC chips is that it may be possible to enslave that clock to something internal in the SNES and make the RTC "start time" a setting.
RTC start tme is a setting already. The count is slaved to sound output, which occurs at a known rate.
Warepire wrote:
Thus allowing us to choose the optimal clock state (the movie files would have have to be extended to carry this setting).
There's already a place in movie files for clock state.
creaothceann wrote:
  • It would be really helpful to default to the faster compatibility core. The accuracy core is only needed to show a graphical effect in one or two games. Using the same key input file for both cores should never result in a desync.
That would require buiding a build with compatibility core. There is currently no support for switching cores at runtime (that would require pretty much putting the core with some extra API into shared object / dynamic link library and loading that stuff at runtime). And you are right that it seems that Accuracy and compatibility cores are extremely similar with timings.
creaothceann wrote:
  • Loading ROMs with spaces in the file didn't work until I figured out that lsnes-sdl "--rom=%~1" in a batch file works. Wouldn't it be more intuitive for lsnes to assume that the first parameter (that is not a switch) is the ROM file?
Unfortunately for some other cartridge modes, there can be up to 3 ROM files (each with additional markup file). And for me, --rom="foo bar.sfc" works fine. I don't know why it doesn't work on Windows:
  • That isn't the right syntax?
  • Startup code is buggy?
Edit: I tried the Win32 SDL version in wine. It handles space in command line correctly. Edit #2: "--rom=foo bar.sfc" seems to work, at least in Wine cmd.exe. lsnes itself only handles '/' in rom filenames specially. Space is not special.
creaothceann wrote:
    Supporting ROM files with headers is kind of iffy - you may as well add support for all kinds of compressed archives. (Using uncompressed files for everything would be helpful, imo.)
I have function that just blindly strips first 512 bytes (--headered-rom and friends, headered checkbox in the wx version). Currently it supports .zip archives. .7z could be useful, but that is likely fair amount of code, even with likes of liblzma and so.
creaothceann wrote:
  • It really needs an easy way to change keys, at least a list of the default keys (I eventually found them in the log) and a list of all available key names.
Manual has list of all key names. But yeah, those sections are pretty unreadable. I could dump a lists of default keys and corresponding commands and all supported key names. Edit: Oh, there is command 'show-bindings' (<esc>show-bindings<enter>) that shows list of all active keybindings.
creaothceann wrote:
  • Btw. a window popping up with the installed codecs (like in SNES9x) would also be good.
That is hard for two reasons:
  • It is not something I can even test
  • The emulator internal architecture pretty strongly separates core and UI. You can not open windows from emulator core (excluding special things like yes/no prompts), where AVI dumpers run. And the UI parts are specific for each UI.
Senior Moderator
Joined: 8/4/2005
Posts: 5777
Location: Away
You're a damn hero, Ilari! Finally bsnes's excellent emulation will be put to good use here!
Warp wrote:
Edit: I think I understand now: It's my avatar, isn't it? It makes me look angry.
Former player
Joined: 9/1/2005
Posts: 803
moozooh wrote:
You're a damn hero, Ilari! Finally bsnes's excellent emulation will be put to good use here!
The only hard part will be convincing people to use it rather than snes9x 1.43.
Warepire
He/Him
Editor
Joined: 3/2/2010
Posts: 2178
Location: A little to the left of nowhere (Sweden)
After a while I guess we will have to make snes9x 1.43 a deprecated emulator like we did with Famtasia.
creaothceann
He/Him
Editor
Joined: 4/7/2005
Posts: 1874
Location: Germany
Ilari wrote:
That would require buiding a build with compatibility core. There is currently no support for switching cores at runtime (that would require pretty much putting the core with some extra API into shared object / dynamic link library and loading that stuff at runtime).
Runtime switching isn't really needed, especially if it'd be slower than static linking... Only those who would create/dump movies for Air Strike Patrol would need another build.
Ilari wrote:
creaothceann wrote:
    Supporting ROM files with headers is kind of iffy - you may as well add support for all kinds of compressed archives. (Using uncompressed files for everything would be helpful, imo.)
I have function that just blindly strips first 512 bytes (--headered-rom and friends, headered checkbox in the wx version). Currently it supports .zip archives. .7z could be useful, but that is likely fair amount of code, even with likes of liblzma and so.
It's just that byuu has a certain stance on the issue (ROM headers are worse than useless (patching problems), archives don't have enough benefits today and needlessly complicate the code) and I agree with him. You can even include a build of snespurify, in addition to the source.
Ilari wrote:
It is not something I can even test
VirtualBox / VMWare with a Windows installation? Anyway, it's just that uncompressed / barely compressed AVI files are a bit too space-wasting (and maybe slow?) for my taste, especially when the ZMBV codec or ffmpeg's RGB codecs are already available (uncompressed video would be at least ca. 10 MB per second). But it's something that can be lived with, I guess.
Emulator Coder, Skilled player (1114)
Joined: 5/1/2010
Posts: 1217
creaothceann wrote:
Runtime switching isn't really needed, especially if it'd be slower than static linking... Only those who would create/dump movies for Air Strike Patrol would need another build.
I'll change the build scripts to do compat build instead of accuracy build. IIRC, that's just two changes to the build script.
creaothceann wrote:
archives don't have enough benefits today and needlessly complicate the code) and I agree with him.
Well, I need the .zip code anyway (the movie / savestate files are .zip files). And code to just skip the first 512 bytes on command? That's easy.
creaothceann wrote:
Ilari wrote:
It is not something I can even test
VirtualBox / VMWare with a Windows installation?
Not an option for now.
creaothceann wrote:
Anyway, it's just that uncompressed / barely compressed AVI files are a bit too space-wasting (and maybe slow?) for my taste, especially when the ZMBV codec or ffmpeg's RGB codecs are already available (uncompressed video would be at least ca. 10 MB per second).
The AVIs it dumps are far from uncompressed. More like 1MB/s than 10MB/s (of course, depends on the game).
creaothceann
He/Him
Editor
Joined: 4/7/2005
Posts: 1874
Location: Germany
Ilari wrote:
I'll change the build scripts to do compat build instead of accuracy build. IIRC, that's just two changes to the build script.
Nice. :)
Ilari wrote:
And code to just skip the first 512 bytes on command? That's easy.
I know, but it removes the motivation for users to clean their ROMs.
Ilari wrote:
The AVIs it dumps are far from uncompressed. More like 1MB/s than 10MB/s (of course, depends on the game).
OK, I'll see if I can set it up.
Emulator Coder, Skilled player (1114)
Joined: 5/1/2010
Posts: 1217
creaothceann wrote:
Ilari wrote:
The AVIs it dumps are far from uncompressed. More like 1MB/s than 10MB/s (of course, depends on the game).
OK, I'll see if I can set it up.
There's not much setting up. The AVI encoder/muxer is completely self-contained and statically linked. The command to start dump is 'dump-avi <prefix>', to end dump 'end-avi'. (Wx version has those as menu commands). The encoder knows following settings: * Compression level (CPU/space tradeoff). Defaults to 7. * Force 512x448/480 dump. Defaults to off. * Amount of padding to apply to sides. Defaults to 0 on all sides.
creaothceann
He/Him
Editor
Joined: 4/7/2005
Posts: 1874
Location: Germany
OK, I'll try that. :) This is how a HTML version of the manual might look like: http://www.mediafire.com/?tucden2yv0ff4 (done with Frontpage Express, so it shouldn't be used for an actual release)
Site Admin, Skilled player (1255)
Joined: 4/17/2010
Posts: 11495
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
How about adding the canvas layer coloring option? It's the layer that's normally black and comes behind all other layers. Changing its color is necessary for ripping sprites and maps. For now comunities are using hacked savestates of bsnes IIRC.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Emulator Coder, Skilled player (1114)
Joined: 5/1/2010
Posts: 1217
feos wrote:
How about adding the canvas layer coloring option? It's the layer that's normally black and comes behind all other layers. Changing its color is necessary for ripping sprites and maps.
Unless there is some "public" variable to muck with in bsnes core, I don't think that would be easy to implement...
Site Admin, Skilled player (1255)
Joined: 4/17/2010
Posts: 11495
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
I think they just hack some palette color. Don't know if this can affect syncing (probablt badly), but one doesn't need syncing non-hacked palette movies on hacked mode. http://www.vgmaps.com/forums/index.php?topic=821.0 EDIT: Oh, vSNES it is called.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
Editor, Emulator Coder, Site Developer
Joined: 5/11/2011
Posts: 1108
Location: Murka
If it's just poking+freezing a particular palette entry, that should be doable with a lua script, right?
Site Admin, Skilled player (1255)
Joined: 4/17/2010
Posts: 11495
Location: Lake Char­gogg­a­gogg­man­chaugg­a­gogg­chau­bun­a­gung­a­maugg
Haven't seen anything palette related in sneslua. While it's not mentioned in genslua docs either, but is implemented since 11b. The snes9x lua thread didn't answer the question about that possibility.
Warning: When making decisions, I try to collect as much data as possible before actually deciding. I try to abstract away and see the principles behind real world events and people's opinions. I try to generalize them and turn into something clear and reusable. I hate depending on unpredictable and having to make lottery guesses. Any problem can be solved by systems thinking and acting.
creaothceann
He/Him
Editor
Joined: 4/7/2005
Posts: 1874
Location: Germany
feos wrote:
How about adding the canvas layer coloring option? It's the layer that's normally black and comes behind all other layers. Changing its color is necessary for ripping sprites and maps. For now communities are using hacked savestates of bsnes IIRC. [...] I think they just hack some palette color. Don't know if this can affect syncing (probably badly), but one doesn't need syncing non-hacked palette movies on hacked mode. http://www.vgmaps.com/forums/index.php?topic=821.0 EDIT: Oh, vSNES it is called.
vSNES can't load bsnes savestates because they can change with every new emulator release and have no meta information themselves. For the SNES the "canvas" is called backdrop and fills every pixel on MainScreen with palette color 0 where BGs & sprites are transparent or disabled for MainScreen. (MainScreen can have color math applied to it, using either the color constant or SubScreen pixels.) So it might be as simple as setting the first 2 bytes of CGRAM (and writing to register $2132 for the color constant if necessary).
Joined: 1/5/2012
Posts: 52
Location: Maridia
Sounds like the best solution is for bSNES to store, in a known location within the save state files, the offsets at which RAM, VRAM, etc are stored in the file. Then tools like vSNES or a dedicated sprite ripping program would be easily able to look up the graphic data in memory. Or, does bSNES support Lua scripting? A script could trivially dump any region of memory to a file, producing a raw VRAM dump or such. (Or if not, why does it have to be bSNES?)
Emulator Coder, Skilled player (1114)
Joined: 5/1/2010
Posts: 1217
creaothceann wrote:
So it might be as simple as setting the first 2 bytes of CGRAM (and writing to register $2132 for the color constant if necessary).
Writing to CGRAM from Lua script is possible, but unfortunately read/write to registers is not implemented.
Former player
Joined: 2/19/2007
Posts: 424
Location: UK
Ilari wrote:
creaothceann wrote:
So it might be as simple as setting the first 2 bytes of CGRAM (and writing to register $2132 for the color constant if necessary).
Writing to CGRAM from Lua script is possible, but unfortunately read/write to registers is not implemented.
When you implement read/write to registers, it would be nice to have both realistic and non-modifying reads available. Many readable registers change their state when read from, and only only sometimes want that to happen. For example, you might want to dump the bg1 tilemap without disturbing the game. To do this, you need to be able to read the tile map address, the tilemap size, etc. as well as the being able to read vram istelf. When I needed to do this in snes9x I had to implement my own non-modifying reads to support this, either because registers were write-only or because they modified their internal state when read. Some registers only provide useful information after something has been written to another register. To handle cases like this, one can add that extra information as extra arguments to the read instead.
creaothceann
He/Him
Editor
Joined: 4/7/2005
Posts: 1874
Location: Germany
Rena wrote:
Sounds like the best solution is for bSNES to store, in a known location within the save state files, the offsets at which RAM, VRAM, etc are stored in the file. Then tools like vSNES or a dedicated sprite ripping program would be easily able to look up the graphic data in memory.
Yes, exactly. (SNES9x stores the most meta data than any other emulator, and it's still not for every single variable. Would be nice if one did...)
Rena wrote:
(Or if not, why does it have to be bSNES?)
It's the most accurate one.
creaothceann
He/Him
Editor
Joined: 4/7/2005
Posts: 1874
Location: Germany
Editor, Skilled player (1203)
Joined: 9/27/2008
Posts: 1085
I very much appreciate the work being put in here. I certainly love an accurate emulation, and am all for the increased emulation accuracy when it comes to TASing. Though my computer can't run the compatibility core at full speed (roughly 50 fps out of 60), a TAS does not require this. I've also been looking into the lua as it is implemented. After getting used to the idea of callbacks and that giving functions certain names lets lsnes automatically call them, I feel right at home. Well, mostly, anyway. I was never a fan of the emulua joypad.get(), as it returns a table with named key values, with the complementary joypad.set() taking such a table. I worked with it because I didn't actually need more than that, but I was still often inconvenienced. I kind of like the lsnes input.get() and input.set() functions, for the reason it returns and takes numbers instead of tables. Though I still find one inconvenience, regardless: Only one button at a time can be returned/modified. No, I'm not suggesting tables, keep away from those! Still, I find myself working with it with better ease than with the emulua joypad functions. A request: Perhaps input.geta() and input.seta() functions that return and take a bit-packed value instead of taking an index and returning or taking a zero/non-zero value. As for callbacks, this is a nice job done so far. Although there's nothing like gui.register of certain emulators (the kind that just continuously runs while emulation is paused), there are callbacks that respond to key hits which can then request a display update, with the same effect I want: Input for lua while emulation is paused. I enjoy being able to run lua while emulation is paused, and this does not waste unnecessary processing when there is nothing in particular happening. A notice: The on_frame() callback is not called when you start a lua script through wxwidgets, then frame advance once. It is called properly on the second and following frame advances after the script begins. A question: How would one call on_startup() in wxwidgets? There does not appear to be a window with which to initiate the emulator with a lua script, and starting the script through the menu doesn't call it (though, in that case, just shove the code in the main body and it's run on script initialization). A request: A callback for when a request to advance a frame takes place. Although, on_input() seems to be doing this job, it's not perfectly clear if this is the intention. I spot two on_input calls each frame during normal non-lag frames in one game I was playing around with (Sim City), and on_snoop tells me just one request for each button to the controller takes place.
Emulator Coder, Skilled player (1114)
Joined: 5/1/2010
Posts: 1217
FatRatKnight wrote:
Though my computer can't run the compatibility core at full speed (roughly 50 fps out of 60), a TAS does not require this.
Even my laptop (much less powerful than my desktop, and even that is oldish) can run it at about 90fps if no exotic chips are involved. Also, earlier versions had bugs in speedthrottle code, causing the emulator to run too slow. Set targetfps to "infinite" (yes, it is numeric, but it has special value for infinity) for benchmarking. I have even heard of the emulator running at 10fps on computer capabale of about 60fps. I rewrote the speedthrottle for rr1-delta3. Hopefully the new one is better (at least it jitters less for me). Also, the SDL version isn't much faster (well, I don't know about single-core CPUs, there might be some difference) as emulation and UI run on dedicated threads (with minimal synchronization, output is triple-buffered).
FatRatKnight wrote:
A request: Perhaps input.geta() and input.seta() functions that return and take a bit-packed value instead of taking an index and returning or taking a zero/non-zero value.
Good idea, even if some controllers have two first indices be analog values instead of buttons.
FatRatKnight wrote:
Although there's nothing like gui.register of certain emulators (the kind that just continuously runs while emulation is paused),
on_idle? That shouldn't be hard (although one has to be careful not to waste CPU by spending too much time polling if such hook exists!)
FatRatKnight wrote:
A notice: The on_frame() callback is not called when you start a lua script through wxwidgets, then frame advance once. It is called properly on the second and following frame advances after the script begins.
Hmm... Sounds bit odd. I take a look at this.
FatRatKnight wrote:
A question: How would one call on_startup() in wxwidgets? There does not appear to be a window with which to initiate the emulator with a lua script, and starting the script through the menu doesn't call it
Eh, the way on_startup() currently works, it isn't useful. And there is currently no way to execute a script so it gets that callback from wxwidgets version (and probably there isn't a way in SDL version either). I'll see how that stuff could be fixed.
FatRatKnight wrote:
A request: A callback for when a request to advance a frame takes place. Although, on_input() seems to be doing this job, it's not perfectly clear if this is the intention. I spot two on_input calls each frame during normal non-lag frames in one game I was playing around with, and on_snoop tells me just one request for each button to the controller takes place.
The frame advance button has autorepeat, so one hold may advance more than one frame... As to on_input() occuring twice but on_snoop() just notifying each button once, that's very strange. You are sure not even one button is polled twice (two on_snoops for one button), because that would explain two on_input()s (yes, I have seen game poll for just one button). on_input() can legitly occur more than once per frame if game polls more than once per frame (some do). I'll need to check if the logic is right...