bsnes by byuu ------------- Compiled using infos found on byuu's homepage and forums (http://byuu.org), on bsnes Dev Talk (http://board.zsnes.com/phpBB2/viewforum.php?f=22) and on the old bsnes thread (http://snesemu.black-ship.net/misc/archives/bsnes_thread.zip) Last edited: 2010-01-24 -- utvlvzpnjtboabuahnbjmaepuadpn | tr [ab-z~] [~a-yz] | sed 's/~at~/@/; s/~dot~/\./' -------------------------------------------------------------------------------------------- 2010-01-24 - v0.059.06 This is an experimental release, as such it is posted only to Google Code. Changelog: * 21fx API moved to pre-finalized form as S-MSU1; more about this on the forum * OpenGL driver now uses GL_CLAMP_TO_BORDER instead of GL_CLAMP_TO_EDGE to support screen curvature shader * rewrote file open dialog; code is greatly simplified, interface is improved * all cheat code columns are now enquoted, and empty codes at the bottom of the file are omitted (format is compatible with previous releases still) * debugger: added missing DMA variables to S-CPU properties viewer * snesfilter: added OpenMP (multi-threading) support to HQ2x filter * lots of other miscellaneous code cleanup work 2010-01-11 - v0.059.02 v059.02 changelog: * added folder-up button to the file loading window * hid new-folder button except on path selection window * removed "Assign Modifiers as Keys" button; replaced with input.modifierEnable in the configuration file * fixed a Qt signal issue that was causing ROM loading to take an extra second or two longer than necessary * scale 5x setting will now maintain an exact multiple in both width and height for both NTSC and PAL modes * re-added group assignment and unassignment to the input settings window * re-wrote mouse capture code to be more intuitive, now uses buttons to set assignment * re-added input.allowInvalidInput check to stop up+down and left+right key combinations by default [Jonas Quinn] * split "Tools Dialog" menu option into separate items for each tool (Cheat Editor, Cheat Finder, State Manager) * added S-SMP and S-DSP property information readouts to the debugger 2010-01-06 - v0.059 This is mostly a polishing release. There's lots of nice little improvements over the last release, so it should be well worth the update. Changelog: * fixed a bug in the save state manager that was allowing saves for unsupported special chips * added save state support for SuperFX games * added save state support for SA-1 games * the "Apply UPS" checkbox actually works now; allows bypassing of patching prior to ROM loading * ROM loader will display internal ROM title and header info for uncompressed files ending in ".sfc" * added Shift JIS to UTF-8 conversion for internal ROM titles * "open-folder" concept now requires folders to end in ".sfc" to avoid false positives * shrunk all GUI buttons and right-aligned them, as some of them were ridiculously long before * rewrote settings and tools windows to be driven via tabs instead of lists; this saves a lot of screen space * rewrote input mapping system to use a tree view instead of the confusing combo box hierarchy; hopefully more people will find the user interface GUI hotkey remapping section now * added support to map modifiers as individual keys (eg you can map the shift key to the SNES select button) * rewrote the cheat code editor, it behaves exactly like the state manager now; there are 128 pre-defined slots, and it is easy to clear any or all of them * the cheat file will auto erase itself upon exit if all codes and descriptions have been erased * fixed title bar game name ordering; was "bsnes v058 - Game Name", is now "Game Name - bsnes v059" * fixed a bug where pressing escape inside the main window's menus would cause the program to quit * Windows: worked around QTBUG-7188 to fix the multi-file archive loading dialog; it was not updating properly before * Linux: added full-API PulseAudio driver with synchronization and latency control [RedDwarf] * Linux: fixed a crashing bug involving OpenGL and glXSwapIntervalEXT() * Linux: X-Video driver texture now resizes dynamically to support > 1024x1024 for any future filters to use * Debugger: single-stepping instructions now updates all windows marked to "auto update" * Debugger: fixed execute breakpoints, they were disassembling at the wrong offset * Debugger: S-CPU bus breakpoints now mirror WRAM $7e:0000-1fff to $00-3f|80-bf:0000-1fff * Debugger: fixed a rendering issue when stepping through hires games * Debugger: added property system; can now view internal register states of all S-CPU and S-PPU registers (S-SMP and S-DSP coming soon) * Debugger: added CGRAM palette viewer * Debugger: added OAM sprite viewer (no graphical output yet) * Debugger: added options window -- so far only to control output of memory / execution usage tables * Debugger: updated usage and memory export file names to start with the loaded cartridge name * Source: cleaned Utility class, split some of the functionality out to Cartridge class * Source: greatly simplified SNES::Cheat class, SNES::Cartridge class; etc A note to Windows Vista and Windows 7 users: there is still an open bug in Qt 4.6.0 that causes menus attached to popup buttons to initially appear invisible. See QTBUG-6645 for reference. As it is a bug with Qt itself, there is nothing I can do about it but wait patiently. You can work around this by pressing the tab key after you click the button. This affects the options buttons on the file load dialog, and on the input settings window. Also, mudlord has submitted an updated Direct3D driver that adds HLSL pixel shader support. It was too close to get into this release, I'd like some time to test it. But hopefully it will get in by v060, or at the very worst, v061. Many, many thanks to mudlord for the awesome work :D 2009-12-09 - v0.058 We've tested the latest release on at least a dozen computers now, all seems to be in order for a release. Changelog: * added 21fx support (more on this later) * added movie recording and playback support * added rewind support (enable under Settings->Configuration->Advanced, use backspace key to rewind) * added speedup (fast forward) and slowdown key bindings * audio no longer stutters on Windows when moving or resizing the main window * co-processors can now specify their own clock rates instead of sharing the S-CPU clock rate * Super Game Boy 2 now runs at the correct hardware speed, and not 2.4% faster like the Super Game Boy 1 does * added Vsync support to the Windows OpenGL driver (Intel graphics drivers do not support this option, because their engineers are lazy) * OpenGL driver no longer re-initializes when changing video synchronization, helps pixel shaders * refactored user interface compilation; now split into several object files, auto-generated MOC files placed under src/obj/ * worked around a bug in the PulseAudio sound server that was causing the ALSA output driver to lock up [BearOso] * rewrote and simplified the save state manager, it is no longer a part of the core * S-DD1 and SPC7110 can now access up to 256MB via their MMCs * re-added background and OAM layer toggling under the tools dialog * added config file options to adjust emulation speed levels (config.system.speed*) * added snesreader, snesfilter and supergameboy support to the OS X port * added a really neat pixel shader that can perform point scaling to non-even multiples, eg it looks great even with aspect correction [Fes] * upgraded to Qt 4.6.0 official Debugger changelog: * added memory export and import to the memory editor * added bus usage analyzer: logs opcodes, memory reads, memory writes and M/X states to usage.bin file * added disassembler that can trace both forward and backward from the current execution address * extended read/write breakpoints to the S-SMP * re-added trace masking option Errata: there is one known bug in Qt 4.6.0 that affects the Windows port: menus attached to buttons show up as invisible on Windows Vista and above. I only use this on the file load dialog options button, and only to toggle the information pane on and off. Given that this is less severe than the bugs in the beta versions, I've upgraded anyway. I'll submit a bug report to the Qt team for this shortly. Also, my sincerest thanks to Bradley Hughes from the Qt development team for quickly fixing this show-stopper bug that greatly affected performance in bsnes v056. Nov 22, 2009 - v0.057 I'm really sorry about this, but a major issue snuck into v056. It was caused by a bug in the newly released Qt 4.6.0 RC1. Whenever one moved the mouse cursor over the main window in the Windows port, the frame rate was immediately cut in half, which effectively ruined Mouse, Super Scope and Justifier support. As for how this could happen, well ... I'm ... really at a loss for words about this. This release does not change the source code at all except to increment the version number, and it is built against Qt 4.6.0 beta 1 instead of 4.6.0 release candidate 1 as v055 was. I will file an official bug complaint and post a link to it here during next week. Again, my apologies for any inconvenience. I incorrectly assumed it would be safe to update to RC1, and didn't spot the bug in time. Nov 22, 2009 - v0.056 This release adds a lot of new user interface features, and polishes Super Game Boy support. Note that many pixel shaders need to be coded specifically for bsnes, eg ones designed for Pete's OpenGL2 plugin will not work. I will maintain a pixelshaders archive on the bsnes download page with a collection of working shaders. Right now, there are three: HDR TV, Scale2x and HQ2x; written by guest(r) and Pete, and ported by myself. Changelog: * lowered Game Boy audio volume so that it matches SNES audio volume * fixed Super Game Boy multi-player support * fixed Super Game Boy swapped player bug * compressed Game Boy cartridges can now be loaded * added save state support for Super Game Boy games * blocked illegal Super Game Boy packets, fixes Zelda DX, Akumajou Dracula, etc palette issues * main window once again shrinks on size changes * joypads can now control the file loading window (support is very rudimentary) * cleaned up video and audio sliders, increased audio input frequency range for 59hz monitors * rewrote all of the input capture system from scratch * added dozens of additional GUI hotkey bindings to resize the main window, control synchronization, control speed, etc * it is now possible to map keyboard modifiers (shift, control, alt, super) to any input or hotkey; eg alt+enter = fullscreen * merged all input capture windows into the main settings panel * added turbo button support; hold down turbo buttons to send a 30hz input pulse * added asciiPad controller emulation; contains off/turbo/auto fire toggles and slow-motion mode * asciiPad support allows for quick switching between keyboard and gamepad input * merged scanline filter into the user interface (under Video Settings) to allow it to work on all filters; including the NTSC filter * killed off an evil QString <> string intermediary class called utf8; string class can convert to and from QString directly now * added fast BS-X, Sufami Turbo and Game Boy cartridge loading: use the filter list under "Load Cartridge" to bypass the BIOS selection screen * added pixel shader support to the OpenGL driver on Windows and Linux; note that it only really works well on Linux at the moment * added proper Vsync support to the OpenGL driver on Windows and Linux using GL extensions; again this really only works well on Linux * added unique path memory for shaders, folders, cartridges, BS-X, Sufami Turbo and Game Boy images * upgraded to Qt 4.6.0 release candidate 1; fixes an issue with the first checkbox in lists not updating when clicked Oct 31, 2009 - v0.055 Happy Halloween, this release adds full Super Game Boy support ... but is it a trick, or a treat? ;) ::cough::, lameness aside ... The Game Boy emulation core is courtesy of gambatte, and excellent, accuracy-focused, open source, and lightning fast Game Boy Color emulator. Now I know what you're thinking, using a Game Boy Color emulator with the Super Game Boy? The truth is, gambatte was just such an amazingly perfect fit that nothing else compared. I fully believe that even as a CGB emulator, gambatte will do a better job than any pure DMG emulator could. The emulation of the ICD2 chip (aka the Super Game Boy) was fully reverse engineered by myself. Eventually I'll get an updated document put up explaining how it works. The next question might be, "why emulate the Super Game Boy when existing Game Boy emulators do?"; well, they can only simulate part of the SGB. Features such as custom SNES sound effects, hand-drawn borders, multi-tap support and custom SNES code execution can only be accomplished by a true SNES emulator. Space Invaders is perhaps the most impressive demonstration, as it contains an entire SNES game embedded inside the Game Boy cartridge. bsnes' SGB emulation supports virtually every command, full sound mixing from both the SNES and Game Boy sides, both BIOS revisions, etc. The only thing that is not fully functional yet is the multi-player support, but it should be in due time. Save state support is also planned for a later date. Changelog: * added Super Game Boy emulation (thanks to gambatte for the Game Boy core) * extended hybrid scanline/cycle PPU renderer to support Mode7 register caching; fixes scanline flickering on NHL '94 title screen * all windows (other than the main window) can be closed with the escape key now * file dialog path selection now accepts typed paths; can be used to access hidden directories and network shares * file dialog's game information panel can now be disabled * fixed a crashing issue when the file dialog was given an invalid path * fixed screenshot capture save location * added screenshot capture option to tools menu * state manager now auto-closes when loading a state; it can be reopened quickly with F3 * fixed GZip archive loading * fixed NTSC off-by-one filter bug on hires screens * extended Scale2x, LQ2x and HQ2x to properly filter hires screens * added Pixellate2x filter Oct 19, 2009 - v0.054 After a half-dozen hours of installing and compiling various combinations of MinGW and Qt, I've finally found a combination that once again allows for profile-guided optimizations: MinGW GCC 4.3.3 and Qt 4.6.0-beta 1. Though Qt 4.4 still has broken PGO, the latest Qt beta no longer has the process freeze issue upon termination. This release is essentially the same as v053, but it's now at least as fast as v052 was, and ~10% faster than v053, which lacked profiling. I did add in two quick changes, however: first, when starting in fullscreen mode, the video output size was being incorrectly set to the windowed size; second, by requiring save states to match the CRC32 of games, it made debugging with them impossible, so I've turned off the CRC32 matching. Oct 18, 2009 - v0.053 This release greatly polishes the user interface, adds a new cheat code search utility, adds the snesfilter library, and adds Qt-based GUI support to both snesfilter and snesreader. snesfilter gains 2xSaI, Super 2xSaI and Super Eagle support, plus full configuration for both the NTSC and scanline filters; and snesreader gains support support for multi-file ROM archives (eg GoodMerge sets.) Statically linking Qt to bsnes, snesfilter and snesreader would be too prohibitive size-wise (~10MB or so.) I have to link dynamically so that all three can share the same Qt runtime, which gets all of bsnes and its modules to ~1MB (including the debugger build); and Qt itself to about ~2.5MB. However, there is some bad news. There's a serious bug in MinGW 4.4+, where it is not generating profile-guided input files (*.gcno files.) There is also a serious bug in Qt 4.5.2/Windows when using dynamic linking: the library is hanging indefinitely, forcing me to manually terminate the process upon exit. This prevents the creation of profile-guided output files (*.gcda files.) It would be tough enough to work around one, but facing both of these issues at once is too much. I'm afraid I have no choice but to disable profile-guided optimizations until these issues can be addressed. I did not know about these bugs until trying to build the official v053 release, so it's too late to revert to an all-in-one binary now. And I'm simply not willing to stop releasing new builds because of bugs in third-party software. As soon as I can work around this, I'll post a new optimized binary. In the mean time, despite the fact that this release is actually more optimized, please understand that the Windows binary will run approximately ~10% slower than previous releases. I recommend keeping v052 for now if you need the performance. Linux and OS X users are unaffected. Changelog: * save RAM is initialized to 0xff again to work around Ken Griffey Jr Baseball issue * libco adds assembly-optimized targets for Win64 and PPC-ELF [the latter courtesy of Kernigh] * libco/x86 and libco/amd64 use pre-assembled blocks now, obviates need for custom compilation flags * added a new cheat code search utility to the tools menu * separated filters from main bsnes binary to libsnesfilter / snesfilter.dll * added 2xSaI, Super 2xSaI and Super Eagle filters [kode54] * added full configuration settings for NTSC and scanline filters (12+ new options) * further optimized HQ2x filter [blargg] * added Vsync support to the Mac OS X OpenGL driver * added folder creation button to custom file load dialog * fixed a few oddities with loading of "game folders" (see older news for an explanation on what this is) * updated to blargg's file_extractor v1.0.0 * added full support for multi-file archives (eg GoodMerge sets) * split multi-cart loading again (BS-X, Sufami Turbo, etc) as required for multi-file support * cleaned up handling of file placement detection for save files (.srm, .cht, etc) * file load dialog now remembers your previous folder path across runs even without a custom games folder assigned * windows now save their exact positioning and size across runs, they no longer forcibly center * menus now have radio button and check box icons where appropriate * debugger's hex editor now has a working scrollbar widget * added resize splitter to settings and tools windows * worked around Qt style sheet bug where subclassed widgets were not properly applying style properties Sep 28, 2009 - v0.052 This is a maintenance release, which fixes a few important bugs. It also adds some graphical icons to soften the user interface. Note that if you have set any custom paths with v051, you'll need to set them again for the fix to work. As always, my apologies for releasing two versions so close together. I felt the bugs were important enough to warrant it. Changelog: * fixed loading of files and folders containing non-ANSI characters (Chinese, Japanese, etc) * fixed a slight lag on startup due to the new file browser * fixed path selection setting, screenshots will now be saved to the correct directory * hid memory editor scrollbar since it does not work yet * disabled window positioning on Linux due to bugs in the Compiz compositor * added icons from the Tango icon library to the menus and panels Sep 26, 2009 - v0.051 Starting with this release, I wish to take bsnes in a new direction. It has always excelled in accuracy, as the only SNES emulator to offer a full 100% compatibility rate with all known commercial software. But over the years, it has also gained an impressive array of features and enhancements not found anywhere else. It is also the only actively developed SNES emulator with rapid, periodic releases. Its only achilles heel is the steep system requirements, which is quickly being overcome by aggressive new optimizations and steadily-increasing hardware speeds. In an effort to make bsnes even more accessible to everyone, starting with this release, bsnes is now fully open source software, licensed under the terms of the GNU General Public License. I would like to work toward positioning bsnes as a truly general use emulator, and would welcome any help with this. Specifically, I am looking for an interested Debian maintainer to package bsnes for Linux users; as well as for anyone interested in helping to optimize and improve bsnes as a whole. It also seems that many still do not know about bsnes, I'd appreciate advice and help on spreading the word. Please leave a message on my forum if you are interested. I would also welcome and support any forks that target specific areas: a speed-oriented version, a tool-assisted speedrun version, netplay bindings, and so on. As part of this targeting, I've also released a custom debugger-enabled version, which trades a bit of speed in turn for best-in-class debugging capabilities. Please check back here over the following few days, I'll be writing up documentation explaining all of the various unique features of bsnes, as well as detailed compilation instructions for programmers. Changelog: * corrected a small bug in HDMA processing; fixes College Football '97 flickering * corrected ROMBR and PBR SuperFX register masking; fixes Voxel demo [MooglyGuy] * DSP-4 driver AI bug fixed [Jonas Quinn] * added save state support to the S-DD1, S-RTC, DSP-1, DSP-2 and ST-0010 co-processors * fixed a freeze issue when the S-SMP encounters STOP and SLEEP opcodes * Cx4 save states no longer need floating-point values, and are thus fully portable now * added new custom file loading dialog; allows non-modal usage, screenshot previews and ROM info summary, among many other benefits * added support for IPS soft-patching * added blargg's File_Extractor library * added support for archives compressed using 7-zip, RAR and BZip2; which is in addition to existing support for Gzip, ZIP and JMA * state manager now properly updates the timestamp column on saves [FitzRoy] * added OpenGL renderer to OS X port * fixed system beep issue with keyboard input on OS X port * fixed menubar visibility issue on OS X port * fixed a Display handle leak on Linux port [snzzbk] * X-video driver now releases SHM memory properly upon exit [emon] * fixed Direct3D rendering issue that was blurring video on some cards [Fes] * enhanced window positioning code for all platforms * debugger is now GUI-driven instead of via command-line * memory hex editor is now fully usable * added PPU video RAM viewer to debugger * added S-CPU and S-SMP tracing capabilities to debugger * Qt version upgraded to 4.5.2, and compiled with optimizations enabled; runs faster but makes the binary slightly larger * too many code cleanups to list Aug 25, 2009 - v0.050 I always regret having to post new releases so quickly, but a semi-major bug crept into v049. I'd rather fix it now, before I start making major changes that will need testing again. The problem was that the S-PPU was not being synchronized as often as it should have been, resulting in titles such as F-Zero and Super Mario Kart showing flickering lines here and there. This release fixes that. This release also adds savestate support for Mega Man X2 and Mega Man X3, which utilize the Cx4 coprocessor; and it fixes a bug where input was still accepted even when the main window was minimized. Aug 21, 2009 - v0.049 This is a maintenance release, but it offers a lot of bug-fixes and speed-ups, so it should be well worth the update. The debugger is not finished yet, so use it at your own risk. It is disabled in the binary release because breakpoint testing impacts performance. Once it is ready, I will release a separate binary with the debugger enabled. Changelog: * Optimized S-PPU emulation, provides a ~10-15% speedup in normal games * Cleaned up cheat editor user interface * Added save state and export data path selections * Added workaround for a strange issue that caused PAL games to run at 60 fps sometimes * Fixed sprite caching issue; fixes SD F-1 Grand Prix * Fixed PPUcounter reset issue; fixes Bishoujo Janshi Suchie-Pai [Jonas Quinn] * Fixed scaling on scanline, Scale2x, LQ2x and HQ2x filters on hires and interlace screens * Fixed sizeof(bool) serialization issue for PowerPC architecture [Richard Bannister] * Fixed cheat code sort ordering * Fixed a bug with centering in fullscreen mode * Fixed an audio pitch bug when changing frequency * Fixed a volume adjust bug when frequency was exactly 32000hz * Fixed X-video RGB rendering bugs [thanks to tukuyomi for testing] * Fixed a file open dialog issue on Linux when using QGtkStyle [jensbw] * Fixed a memory corruption issue involving QApplication::main() [giovannibajo] * Added a preliminary debugger (disabled in binary releases due to associated speed hit) * Added S-CPU and S-SMP stepping and tracing support * Added read/write/execute breakpoint support * Added memory editor (currently it can only view memory) * Added screenshot capture support [kode54] * Save state archives are now ~60% smaller than before * Various code cleanup work, as usual (note: the debugger code is messy, as it is in-progress) Jul 11, 2009 - v0.048 The biggest feature of this new release is the addition of save state support. Note that this is only currently supported for normal games, and the SPC7110 and OBC-1 co-processors. Other special chips, such as the SuperFX and SA-1, cannot currently save and load state files. I will be adding support for other co-processors little by little in future releases. Changelog: * Added save state support * Added SPC7110 and OBC1 save state support * Added new tools group, with new cheat code and save state managers * Lots of new UI shortcuts: quick save state, quick load state, show state manager, etc * Escape key will now close both the settings and tools group windows * Added major speed-ups to both SuperFX and SA-1 emulation; both now run ~15-25% faster than v047 * Added new video filter, LQ2x; it's as fast as Scale2x while being almost as smooth as HQ2x * Re-wrote HQ2x algorithm; code size was reduced to less than 10% of its original size with virtually no speed loss * Corrected SuperFX2 cache access timing; fixes Stunt Race FX menus and slowdown in other titles * Relaxed palette write limitations for PGA Tour Golf [Jonas Quinn] * Fixed a slight timing issue that was breaking 'An Americal Tail - Feivel Goes West' * Turned off auto-save of SRAM as it was causing slowdowns when writing to flash memory; can be re-enabled via bsnes.cfg -> system.autoSaveMemory = true * Added bsnes.cfg -> system.autoHideMenus, defaults to false; when true, menu and status bars will be hidden upon entering fullscreen mode * Added skeletons for ST011 and ST018 support. Both Quick-move titles get in-game now * Re-wrote S-CPU and S-SMP processor cores to use templates, removed custom pre-processor * Split PPUcounter into a base class inherited by both PPU and CPU; allows both cores to run out-of-order * Split inline header functions to separate files, allows headers to be included in any order now Jun 06, 2009 - v0.047 The most notable feature for this release is the addition of SuperFX support. This enables an additional eight commercial games, and two unreleased betas, to run with full support. Most notably of these would be Super Mario World 2: Yoshi's Island and Starfox. Though timing is not quite perfect just yet, there should be no known issues with any titles at the time of this release. That means there should only be two official, commercially-released titles that are not compatible with bsnes at this time: Quick-move Shogi Match with Nidan Rank-holder Morita 1 and 2 (using the ST011 and ST018 co-processors, respectively.) SuperFX support was the work of many people. GIGO was a great help by providing the source code to his SuperFX emulator (for reference; the implementation in bsnes is my own design), _Demo_ was very helpful in getting Starfox to work properly, and Jonas Quinn provided roughly a half-dozen very important bug fixes that affected nearly every SuperFX game. Without them, this release would not be possible. So please do thank them if you appreciate SuperFX support in bsnes. Please note that SuperFX emulation is very demanding. I hate to have to repeat this, but once again: bsnes is a reference emulator. It exists to better understand the SNES hardware. It is written in such a manner as to be friendly to other developers (both emulator authors and game programmers), and the findings are meant to help improve other emulators. As far as I know, bsnes is the first emulator to fully support all SuperFX caching mechanisms (instruction cache, both pixel caches, ROM and RAM buffering caches, ...); as well as many other obscure features, such as full support for ROM / RAM access toggling between the SNES and SuperFX CPUs, and multiplier overhead timing. By emulating these, I was able to discover what additional components are needed to emulate Dirt Racer and Power Slide, two titles that no emulator has yet been able to run (they aren't very good games, you weren't missing much.) It should be possible to backport these fixes to faster emulators now. That said, with a Core 2 Duo E8400 @ 3GHz, on average I get ~100fps in Super Mario World 2, ~95fps in Starfox and ~85fps in Doom. Compare this to ~165fps in Zelda 3, a game that does not use the SuperFX chip. My binary releases also target 32-bit x86 architecture. For those capable of building 64-bit binaries, especially Linux users, that should provide an additional ~10% speedup. Be sure to profile the application if you build it yourself. Lastly on the SuperFX front, note that Starfox 2 is fully playable, but that most images floating around have corrupted headers. I do not attempt to repair bad headers, so these images will not work. Please either use NSRT on the Japanese version, or use Gideon Zhi's English fan translation patch, if you are having trouble running this title. With that out the way, a few other improvements have been made to this release: xinput1_3.dll is no longer required for the Windows port (though you will need it if you want to use an Xbox 360 controller), the video drivers in ruby now allocate the smallest texture size possible for blitting video, and the code has been updated with preliminary compilation support for Mac OS X. Note that I will not be releasing binaries for this: it is primarily meant for developers and for porting my other libraries to the platform. Richard Bannister maintains a much better OS X port with full EE support and a native Apple GUI that follows their interface guidelines much better than a Qt port ever could. He has also synced the Mac port with this release. You can find a link to that in the bsnes download section. May 10, 2009 - v0.046 Unfortunately, I was not able to include any actual Super Game Boy support in this release. I was however able to back-port all other changes since v045, as well as add a lot of new stuff. Though there are few visible changes from the last release, internally much has changed. I'm releasing this mostly as a point release whilst everything should be stable. I've decided to support the Super Game Boy via external DLL (or SO for Linux users.) There are many reasons for this. Most notably is that the largest special chip in bsnes right now weighs in at ~30kb of code. Emulating an entire Game Boy, not including the SGB enhancements, would require an additional ~800kb of code, or nearly half the size of the entire SNES emulation core. Add to that potential issues with licensing, conflicts with the build process / namespace, a significant increase to build time, and a lack of flexibility over which Game Boy emulator to use, and it's pretty clear that this is something best left external. At least until we have a fully trimmed, fully working SGB emulator available. The way this will work is bsnes will look for SuperGameBoy.(dll,so), and if present, it will call out to pre-defined functions. Users will need the SGB BIOS loaded, at which point they can select a Game Boy cartridge, and bsnes will use the DLL for actual emulation. Sadly I don't have a working DLL ready for this release, and even if I did, there's no sound bridge yet for the Game Boy audio. Other than that, much of the core has been updated in an attempt to make the core more library-like. It still has a few major limitations: it requires libco (which is not portable) and nall (which is quite large), and only one instance can be instantiated as all of the base objects are pre-defined and inter-linked. Not that I can imagine any practical use for multiple simultaneous SNES emulators anyway ... Changelog: * Save RAM is now automatically saved once per minute * Added delay to Super Scope / Justifier latching to fix X-Zone * Fixed an edge case in CPU<>PPU counter history * S-CPU can now run up to one full scanline ahead of S-PPU before syncing * Added interface for Super Game Boy support (no emulation yet) * Fixed a bug with path selection not adding trailing slash * All S-SMP opcodes re-written to use new pre-processor * Entire core encapsulated into SNES namespace * Core accepts files via memory only; zlib and libjma moved outside of core * Major Makefile restructuring: it's now possible to build with just "make" alone * Linux: libxtst / inputproto is no longer required for compilation * Lots of additional code cleanup Apr 19, 2009 - v0.045 This is a maintenance release to fix a crashing bug in S-DD1 games (Star Ocean, Street Fighter Alpha 2), and a video issue in games using the WAI instruction. As always, my apologies for any inconvenience. SA-1 support required modification of a large amount of delicate code in the emulation core, and our limited testing team was not able to catch these in time before release. Apr 19, 2009 - v0.044 This release adds full SA-1 support, with no known issues. All 26 games have been tested by myself and others, and a few have been beaten from start to finish. The latter include Super Mario RPG, Kirby's Dreamland 3, Kirby Super Star and Jikkyou Oshaberi Parodius. Please understand that the SA-1 is essentially four times faster than the SNES' main CPU, so system requirements will be very high for these games. For example, on an E8400 @ 3.0GHz, I average ~160fps in ordinary games. But for SA-1 emulation, this drops to ~90fps, with the worst case being ~80fps. The following features are emulated: * 5a22 CPU core (bus-cycle accurate) * Memory access timing * SA-1 -> S-CPU interrupts (IRQ + CHDMA IRQ) * S-CPU -> SA-1 interrupts (IRQ + Timer IRQ + DMA IRQ + NMI) * SIV / SNV interrupt vector selection * Timer unit (linear and H/V) * Super MMC unit (ROM + BW-RAM) * BS-X flash cart slot mapping * Normal DMA * Character-conversion 1 DMA (2bpp + 4bpp + 8bpp) * Character-conversion 2 DMA (2bpp + 4bpp + 8bpp) * BW-RAM virtual bitmap mode (2bpp + 4bpp) * Arithmetic unit (multiplication + division + cumulative sum) * Variable-length bit processing (fixed and auto increment) While the following features are not currently emulated, mostly due to lack of information: * SA-1 bus conflict delays * Write protection (BW-RAM + I-RAM) * SA-1 CPU priority for DMA transfers * DMA access timing Apr 17, 2009 - v0.043 This version adds complete SA-1 emulation. Sans a sprite issue in Jumpin' Derby that was discovered after the build was completed, all games should be fully playable. The following games in particular have been played from start to finish with no bugs found: * Dragon Ball Z: Hyper Dimension * Jikkyou Oshaberi Parodius * Kirby Super Star Kirby's Dream Land 3 * Super Mario RPG: Legend of the Seven Stars All other games have been tested for several minutes each. Special thanks to Fras, King of Chaos and powerspike for completing these games; and everyone else who helped test. All features of the SA-1 have been emulated, even those that aren't used by commercially released software. It and the S-CPU are synchronized at the bus level, and even bus conflicts are emulated. Sans future bug fixes, this is about as precise as I can get the emulation. Please note that the SA-1 is four times more powerful than the SNES' main CPU, and has many additional features on top of that. Therefore, a much more powerful machine will be required. To give an idea, on my E8400 @ 3GHz, I get ~160fps in Zelda 3 (a non-SA1 game), ~95fps in Kirby 3, and ~85fps in Mario RPG. I do hope to one day offer a speed-focused build that sacrifices some accuracy whilst maintaining as much compatibility as possible. Unfortunately, as one person, I have to prioritize other issues first. Side note: I wasn't able to determine the proper BS-X cart mapping for Bass Tsuri no. 1 or SD Gundam G NEXT; so data carts will not work just yet. I hope to correct this in a future release. Mar 30, 2009 - v0.042 A new release quite a bit faster than I was expecting, but a lot has changed. Most importantly is a new Windows input driver, "RawInput". The downside is that this makes bsnes require at least Windows XP, as Windows 2000 and earlier lack RawInput support. The upside is that input from multiple keyboards and mice can be distinguished from each other — very useful for dual-Justifier support in Lethal Enforcers. Users of previous versions of bsnes will need to manually select the new driver via Settings->Configuration->Advanced->Input driver, and will need to re-map all assigned input keys, including the default user interface hotkeys. Or alternatively, delete the configuration file under %APPDATA%\.bsnes or ~/.bsnes. Also new is an XInput driver, which avoids the DirectInput driver limitation of being unable to distinguish the two shoulder trigger buttons. This makes bsnes require DirectX 9.0c or later for the necessary drivers. Note that Windows Vista SP0 does not ship with these, so if you haven't installed it yet, you'll need to do so. This driver is part of the "RawInput" driver mentioned above. This part is important: if you receive an error regarding xinput1_3.dll, you need to download and install the DirectX 9.0c run-time. For those on Windows 2000, or without DirectX 9.0c, it is still possible to compile and run bsnes with the older DirectInput driver only; but I won't be providing a binary myself for this — at least not at this time. More bad news for some: hiro, my Win32 / GTK+ API wrapper, has been discontinued and removed from the source tree for this release. Qt 4.5.0+ is now required for the user interface. Very sorry to the Linux distros that do not have packages for QT 4.5 yet. You'll need to continue with v041 for now. Mar 15, 2009 - v0.041 I apologize for posting a new version so quickly. This is mostly a maintenance release: joypad analog axes can once again be mapped to the mouse / super scope axis controls, the input capture window has been rewritten to be much more compact, and I've omitted all unneeded features of Qt 4.5 to reduce the final binary size as much as possible (from ~3.33MB to ~2.3MB.) The source archive is also ~20% smaller. Barring any unforseen problems, this will likely be the last official release for a while. Also, I finally have dedicated hosting for byuu.org. I ask that you please update any bookmarks to point here, rather than to byuu.cinnamonpirate.com from this point on, as we'd like to free up the cinnamonpirate sub-domain slot. Mar 09, 2009 - v0.040 Too much to really name. The biggest news is that the entire user interface has been re-written from scratch. It is now far more polished and professional. To name one example; the cheat code editor now has checkboxes in the list to quickly toggle codes on an off, there is now a global hotkey to toggle all cheat codes, and each cheat code can contain multiple individual Game Genie or Pro Action Replay codes, allowing easy grouping of multi-part codes. You'll also notice new artwork: a logo created by Derrick Sobodash (note that the logo contest from below is still active — if someone can design a better logo, it can appear in v041), and a new photo-realistic SNES controller graphic by FirebrandX. I was finally able to utilize MinGW's profile-guided optimizations, which means this release is approximately ~12% faster than v039. And emulation itself was even improved(!), such as with Jonas Quinn's fix for a sprite overflow bug. There were many other changes as well: Linux users will be happy to see RGB overlay support for the X-Video driver, many will benefit from greatly enhanced warning messages and tooltips throughout the GUI, Windows users will now be able to access the menu without freezing emulation, etc etc. Jan 18, 2009 - v0.039 Changelog: * Recovered ~10% speed loss from last release via S-CPU IRQ timing optimizations * Implemented O(1) binary-heap priority queue for event scheduling * Fixed a bug where BS-X slotted carts were never mapping SRAM * Fixed a bug where invalid controller input was always being allowed * Fixed all compilation warnings with GCC 4.3 and Visual C++ 9.0 * Added advanced options to control S-CPU ALU hardware delays * S-RTC and SPC7110 timers updated to handle time_t overflow (Y2k38) gracefully * Cheat codes can now have multiple codes per entry, and multiple lines per description * Rewrote config file parser; removed config/ class from emulator core * Windows: added 256x256 image to program icon set * Linux: fixed Xorg keysym mapping, key names should show correctly in all cases now * UI: updated video panel, added fullscreen-on-startup and NTSC merge fields options * UI: simplified audio panel * UI: boolean options on advanced panel can be toggled via double-click * Lots of code cleanup, especially for S-CPU IRQ handling and nall template library Dec 15, 2008 - v0.038 * eliminated S-DD1 DMA enslavement to the S-CPU; this allows the S-DD1 to behave more like the real chip, and it also simplifies the S-CPU DMA module * eliminated S-PPU enslavement to the S-CPU; all processor cores now run independently of each other * added cycle-level S-PPU timing for OAM address reset and OBSEL; fixes scanline glitches in Mega Lo Mania and Winter Olympics * removed ppu.hack.* settings; as they are no longer needed due to above changes * corrected VRAM tiledata cache bug; fixes Super Buster Bros v1.0 reset glitch * added memory export and trace logging key bindings to user interface * removed WAV logging (to trim the emulation core) * embedded readme and license texts inside executable * simplified S-CPU, S-SMP flag register handling * source code cleanup for S-CPU timing module * GUI-Linux: added style improvements to the listbox and combo box controls * GUI-Linux: finally added filetype filter support to the file open dialog * GUI-all: shrunk configuration panel [FitzRoy] * GUI-all: modified paths panel descriptions for clarity [FitzRoy] Oct 26, 2008 - v0.037 This release adds support for the SNES mouse, Super Scope and Justifier peripherals. It also simplifies cartridge loading and refines the user interface. Lastly, GZ and ZIP archives can now contain non-ANSI characters (Chinese, Japanese, Russian, ...) This support existed in the last release for all uncompressed files. Together, this means only JMA support on Windows lacks support for loading non-ANSI filenames. This is due to the library itself (really, it's more Windows' fault), and licensing issues prevent me from patching libjma as I did with zlib (bsnes is not GPL compatible.) I'm planning to work with Nach to fix this in a future release. About the cartridge loading changes ... the emulator now determines what kind of cartridge is being loaded (eg normal, BS-X BIOS, Sufami Turbo cart, etc) by looking inside the file itself. If it detects a cart type that requires more than one ROM image to load, it will present you with the appropriate specialized load menu automatically. Aside from being more intuitive, this method also allows loading of BS-X and Sufami Turbo games from the command-line or via file association. Changelog: * added mouse support to DirectInput and SDL input drivers * up to 96 buttons per controller; 8 buttons per mouse (5 per mouse on Linux) can be mapped now * added SNES mouse support (does not support speed setting yet) * added Super Scope support * added Justifier support (supports both Justifiers) * input management system almost completely rewritten to support new controllers * "Load Special" menu removed, all cart loading merged to "Load Cartridge ..." option * replaced "Power Cycle" and "Unload Cartridge" with "Power" -> "On" / "Off" * when video exceeds screen size and is scaled down, aspect ratio is now maintained [Ver Greeneyes] * zlib modified to support non-ANSI characters * cheat code count was limited to 1,024 codes before; it now supports unlimited codes per game * added sort by description setting for cheat code list * polished listbox control interaction (disable buttons when nothing selected, etc) * cleaned up OBC-1 chip emulation (code is functionally identical to v036) * added option to toggle fullscreen mode to settings menu * added advanced mode options to toggle base unit (none, Satellaview) and system region (Auto-detect, NTSC, PAL) Sep 16, 2008 - v0.036 This release fixes a somewhat serious bug introduced in v035, and also vastly improves Windows support for non-ANSI filenames. The bug was triggered when HDMA would occur during DMA. If the DMA were long enough, subsequent HDMA transfers would be blocked. This caused graphical glitches in Star Ocean, Super Mario Kart, and possible more games. If you noticed any regressions from v034 to v035, this was almost certainly the cause. Once again, we're operating under the assumption that there are no known bugs currently, so please let us know here if you find any. I've also rewritten the file handling for the emulator. On Windows, attempting to load a file with non-ANSI characters (eg Russian, Japanese, etc) would cause these characters to be removed. This meant that no version of bsnes thus far could load these files. This problem was exacerbated when I ported the user interface to Unicode (UTF-16), this caused even config and locale file loading to crash the emulator. The root of the problem is that Windows only accepts non-ANSI strings in UTF-16 format, whereas bsnes' UI wrapper converts strings to UTF-8 interally. When passing these file names to the standard file functions (fopen(), std::ifstream, etc), file loading would fail. To fix this, I replaced all file access functions with a new version that would convert the UTF-8 filenames back to UTF-16, and use appropriate access functions (_wfopen(), _wmkdir(), etc.) ... but there is still one limitation to this: ZIP and GZ support use zlib, and JMA support uses libjma. Neither of these libraries convert UTF-8 strings to UTF-16 before attempting to open files. Due to licensing issues, as well as technical issues, I am unable to correct this at this time. What this means is that loading ZIP, GZ and JMA files; on Windows only; and with Unicode characters in the file name only; will cause the image load to fail. Loading uncompressed images (SMC, SFC, etc) will work with or without Unicode on all platforms. I tried to be as thorough as possible with this fix: command-line arguments (via CommandLineToArvW + GetCommandLineW), user path (via SHGetFolderPathW), real path (via _wfullpath),folder creation (via _wmkdir) and file access/existence checks (via _wfopen) were updated in all cases. I also updated file loading for ROMs (SMC, SFC, etc), save RAM (SRM), real-time clock save (RTC), cheat files (CHT), UPS patches (UPS) and both configuration files (bsnes.cfg and locale.cfg.) Configuration file loading should work even if your username contains non-ANSI characters, and it should also detect config files put in the same folder as the bsnes executable, even if the path to the executable contains non-ANSI characters. Still, if you spot any bugs, aside from the ZIP/GZ/JMA loading issue, please let me know via e-mail at setsunakun0; at hotmail. Lastly, I'd like to apologize for the poor support for non-ANSI filenames in the past. Using an English version of Windows didn't expose the problems to me. I'll be more thorough in the future with this. Aug 22, 2008 - v0.035 Changelog: * Added video synchronization support at long last [blargg, byuu]. * Added audio panel to control volume, latency, frequency and SNES input frequency settings. * Added driver panel to select APIs to use for video, audio and input. * Added crash handler for driver initialization. * Xv and SDL video drivers now work with compositing enabled on Linux/Xorg. * Improved ALSA audio driver for Linux. * Now using a fixed output frequency, along with a 4-tap hermite resampler. * Improved header detection; fixes Batman: Revenge of The Joker and a few fan translations. * Frameskip will now randomly choose a frame in each set to display; helps with animations. * Locales now support meta-data, which allows for unique translations of the same English input. Aug 10, 2008 - v0.034 For this release: SPC7110 emulation speed has been greatly optimized, massive improvements to HDMA timing have been implemented, Multitap support was added, and the user interface was polished a bit more. Changelog: * SPC7110 decompression code updated to latest version by neviksti and converted to a state machine; SPC7110 overhead is now identical to S-DD1 overhead (eg ~5% speed hit over standard games) * Fixed a major bug in SPC7110 data port emulation that was crashing Super Power League 4 [Jonas Quinn] * HDMA trigger point corrected to H=1104, bus sync timing corrected * All illegal DMA A-bus accesses should now be properly blocked * DMA state machine rewritten, greatly simplified * Major corrections to HDMA run timing; fixes flickering bugs in Mecarobot Golf and Super Mario Kart * Emulator now defaults to 2/1/3 SNES (CPU/PPU1/PPU2 revision numbers) * Multitap emulation added, can be attached to either or both controller ports; user interface updated to reflect this * Status messages (cartridge loaded / unloaded, UPS patch applied, etc) now appear in status bar * Added advanced configuration option, "input.analog_axis_resistance", to control gamepad analog stick sensitivity Also, the SPC7110 emulator download link below was removed: if you are looking for this, please download the bsnes v034 source code, which has the most up-to-date version in the src/chip/spc7110 folder. Jul 19, 2008 - v0.033 This release adds SPC7110 emulation, without the need for graphics packs!!, and a rewritten S-RTC (real-time clock) emulator. SPC7110 support means that Far East of Eden Zero, FEoEZ: Shounen Jump Edition, Momotarou Dentetsu Happy and Super Power League 4 are now all fully playable. I will warn you, the emulation is very slow in this version -- while most areas of each game will run at the same speed as other games, there are a few peak moments where speed will drop by up to ~50%. The reason for the slow-down is that I am currently uncertain how to determine the amount of data to decompress in advance, so I default to the maximum amount possible. The reason I am releasing now anyway, is because I beleive in the "release early, release often" paradigm. It will likely take me a few weeks to finish researching this chip, and I didn't want to keep the work I had private during that time. But rest assured, bsnes v034 should feature much faster SPC7110 emulation. neviksti, Andreas Naive and jolly_codger worked non-stop on the SPC7110 decompression algorithm for the past two weeks. caitsith2 provided valuable data to the effort. I only wish that I could've been of some use, but alas, I had no role in this. In the end, it was neviksti who managed to crack all three(!!) compression modes of this chip, which turned out to be a customized 8-bit QM-coder with a prediction model. You can read more about this here. I would also like to thank Dark Force and John Weidman (aka The Dumper) for their research notes on the SPC7110 register interface. For those who don't understand the hoopla about figuring out this compression algorithm when we already had graphics pack simulation, I should note that we have since found a few errors in these packs. Not to mention, you no longer need ~4-16MB packs for each game you wish to run. They work like any other game now. Better still, the chip can now be used to compress new graphics, eg for any future translation efforts on these titles. The real-time clocks in both Far East of Eden Zero and Dai Kaijuu Monogatari 2 will now save a ".rtc" file in your save folder, which contains the clock as set by the video game, as well as a timestamp from your computer when the time was last updated. It uses the difference between the saved timestamp and current time to update the time. This allows you to specify any time you like, whereas previously bsnes would just use your computer's current time, ignoring the time you set in-game. It also allows the "round clock by 30 seconds" option in both games to work. I avoided this before because this method makes supporting daylight savings time and such impractical, although I should note that the original hardware did not support DST, either. This method was required to pass the SPC7110 tests, and is overall much more faithful to how the original chips worked. Once again, I'd really like to personally thank neviksti for his tireless efforts. Eliminating graphics packs from SNES emulation was one of my primary reasons for getting involved in the SNES emulation scene. That neviksti managed to crack this algorithm means a lot to me. Thank you so much, neviksti. This release is dedicated to you, now go get some sleep Wink May 25, 2008 - v0.032a * Windows: file open filters are now working once again * All ports: emulation speed setting is now properly restored at startup May 25, 2008 - v0.032 * Core: simplified CPU / SMP flag calculations * Added ALSA audio output driver to Linux port [Nach] * Improved font handling for Windows and Linux ports * Greatly cleaned up the user interface * Windows port now uses Unicode instead of ANSI * Added localization support * Config and locale files can now be placed inside bsnes executable directory for single-user mode, if desired * Fixed crashing bug with HQ2x on Linux/amd64 port [RedDwarf, Nach] * Hid "Power Cycle" option by default, as it is too similar to "Reset" * Slighty tweaked program icon [FitzRoy] * Minor code cleanups -- replaced union bitfields with templates, improved memory allocation, etc Apr 13, 2008 - v0.031 New release posted. Perhaps the most important change was fixing a bug in the Windows port when the keyboard was used for input. For some reason, the IsDialogMessage() function I use for tab key support was causing the main window to emit the Windows error beep every time a key was pressed after a few minutes of use. I do not know why this is, so I have simply disabled the tab key support to prevent this from happening. Other than that, lots of polishing went into this release. UPS soft-patching will work with the recently released Der Langrisser v1.02 translation, for those curious. You can also store the UPS patches in GZ/ZIP/JMA support, and bsnes will detect this and decompress the patches first. Use the same ".ups" file extension for this, as it detects via file header. If you wish to try out the newly added OpenGL support: start bsnes, go to Settings->Configuration->Advanced and set system.video to "wgl" (or "glx" for Linux users), and then restart the emulator. Please bear in mind that ATI's OpenGL drivers are an industry-wide joke, so I'd only recommend trying this on an nVidia or Intel video card. Changelog: * Fixed bug and re-enabled HDMA bus sync delays * Emulated newly discovered IRQ timing edge case * Optimized offset-per-tile rendering * Added state-machine implementation of S-DSP core, ~5% speedup * Added SPC7110 detection, will now warn that this chip is unsupported * Fixed very annoying Windows port OS beeping noise when using keyboard for input * Linux port will now save most recent folder when no default ROM path is selected * Added OpenGL rendering support to Windows port [krom] * Fixed Direct3D pixel mode scaling bug [krom, sinamas, VG] * Improved SNES controller graphic [FitzRoy] * Added UPS (not IPS) soft-patching support; UPS patch must be made against unheadered ROM * As always, cleaned up source code a bit Mar 24, 2008 - v0.030 I didn't want to release a new version so soon, however there is a rather serious bug in bsnes v029 where the path information for the save RAM files is discarded when one has not selected a default save RAM / cheat path from the path settings tab in the configuration settings window. Because of this, it gets stored to the base directory. For Windows users, this is c:\, and for Linux users, this is / This bug forced my hand, so I'm releasing v030 to correct this issue. I also cleaned up the S-DSP emulation code to be more consistent with my programming style -- it gets bit-perfect matches to v029's wave output, so I don't foresee there being any problems. Mar 17, 2008 - v0.029 A new version of bsnes has been released. It contains a few minor emulation fixes, as well as user interface improvements. Behind the scenes, the source has been cleaned up more in preparation for running the CPU and PPU (video processor) separately from each other (eg with no enslavement.) This is required for implementing a clock cycle based PPU renderer. * Greatly improved invalid DMA transfer behavior, should be nearly perfect now * Major code cleanup -- most importantly, almost all PPU timing-related settings moved back to PPU, from CPU * Added option to auto-detect file type by inspecting file headers rather than file extensions * Rewrote video filter system to move it out of the emulation core -- HQ2x and Scale2x will work even in hires and interlace modes now, 50% scanline filter added * Re-added bsnes window icon * Added new controller graphic when assigning joypad keys [FitzRoy] * Redundant "Advanced" panel settings which can be configured via the GUI are no longer displayed * Improved speed regulation settings * XP and Vista themes will now apply to bsnes controls * Added "Path Settings" window to allow easy selection of default file directories * Tab key now mostly works throughout most of the GUI (needs improvement) * Main window will no longer disappear when setting a video multipler which results in a window size larger than the current desktop resolution * Added two new advanced options: one to control GUI window opacity, and one to adjust the statusbar text Feb 04, 2008 - v0.028 Changelog: * OpenGL (with hardware filter mode support) and SDL video drivers added to Linux port * OpenAL (with speed regulation disable support) and OSS audio drivers added to Linux port [Nach] * SDL input driver (with joypad support) added to Linux port * Emulator pause option added * Added option to select behavior of bsnes when idle: allow input, ignore input or pause emulator * Added support to remap common GUI actions to key/joypad presses on the "Input Configuration" screen * bsnes will now clamp the video output size when it is larger than the screen resolution * GUI library has been enhanced, and renamed to hiro * Fullscreen mode now always centers video, rather than approximates * Fullscreen mode now works correctly on Linux/Openbox * Extra layer of abstraction in src/ui has been removed, as GUI lib unifies all ports anyway * Video, audio and input drivers unified into standard library, named ruby * All custom headers have been merged into a new template library, named nall * Makefile rewritten, vastly improved. Allows quick toggling of compiled-in drivers * Makefile: all object files now placed in /src/obj, binary placed in / * libco greatly enhanced, no longer requires an assembler to build [byuu, blargg, Nach] * libco SJLJ driver added; bsnes should now build on any Unix-derivative now (Solaris, OS X, PS3, etc) [Nach] * Fixed register $213e.d4 PPU1 open bus behavior [zones] * Windows port will not activate screensaver while bsnes is running [Nightcrawler] * Visual C++ target no longer requires stdint.h * And lots more -- mostly code refactoring related Dec 22, 2007 - v0.027 This version replaces libui with miu -- a new GUI wrapper library, and cleans up large portions of the source code. Unfortunately, the GUI rewrite took far, far longer than I ever imagined. As a result, no work has gone into the core emulation for this version. But with the GUI rewrite out of the way, that should change in the near future. And thanks to the new UI library, I can now begin work on adding a cross-platform debugger to bsnes, at long last. Changelog: * Major source code cleanup (lib/, ui/miu/, ui/vai/) * Cheat code editor was broken in v0.026, this is now fixed * Cheat code file format simplified for human readability * Makefile install target improvements [belegdol] * libui replaced with miu GUI library * Custom video / audio / input drivers replaced with vai HW library * ppc and ppc64 libco targets added [Vas Crabb] * x86 and x86-64 libco targets now work on OS X [Lucas Newman] Nov 21, 2007 - v0.026 * Major source code cleanup * Completely rewrote memory mapper to support runtime MMCs * Updated S-DD1 MMC to use new memory mapping interface * Improved S-DD1 emulation, thanks to information from orwannon * Added support for SameGame -- load via "Load Special -> Load BS-X Slotted Cart" menu option * Completely rewrote cartridge loader to support BS-X, BS-X slotted carts and ST carts * Created custom dialog windows for multicart loading * Improved generic memory mapper, which eliminates the need for cart.db [Nach] * Added BS-X slotted cart detection to generic memory mapper [Nach] * Linux port will now ignore keypresses when window is inactive * Linux port will use much less CPU power when idle * Added detailed compilation instructions to Makefile for Linux port * Added "make install" target and PNG program icon for Linux port * Switched Windows compiler to MinGW/GCC4 * Windows executable is now packed with UPX to decrease filesize * Removed .ufo, .gd7 and .078 ROM extensions; added .bs extension * Added preliminary support for the BS-X base unit, BS-X base cartridge + MMC, and BS-X flash I/O Oct 16, 2007 - v0.025a My apologies, I added code to display an alert when the Sufami Turbo BIOS was not present at the last minute before the recent release. What I failed to realize was that I added the alert to the same routine that loads save RAM files. Meaning that whenever one loads a game that has not yet created a .srm file, one will get a warning that the save RAM file does not exist. Oops. You'll never see the warning more than once, and it's harmless, but for those it annoys, and for people who haven't upgraded yet, I've posted bsnes v0.025a. This version changes absolutely nothing other than disabling the warning box in question. I'll be sure to get a proper, tested fix into the next release. Again, I apologize for any inconveniece this may have caused. Oct 14, 2007 - v0.025 bsnes is exactly three years old today. I've posted a new version which adds DSP-3 and DSP-4 special chip support. The DSP-3 is used by SD Gundam GX, and the DSP-4 is used by Top Gear 3000. Please note that the DSP-3 is not fully emulated, thusly SD Gundam GX is not fully playable. Also, due to lack of timing emulation with the DSP-4, the Top Gear 3000 track sometimes flickers in split screen mode. However, it is believed that Top Gear 3000 is fully playable. I should also note that I have started on SuperFX emulation, as some will inevitably see said code in my source releases. What I have now is nothing more than a skeleton implementation, and absolutely nothing using it is playable yet. I am making absolutely no promises that I will ever be able to emulate this chip. It will take at least several months of work, and even then, the speed will probably be too slow to reach 60fps on any system, but ... I'm working on it. While I have no way to run tests on the actual SuperFX hardware, I will do the best I can to emulate the chip accurately. I will be emulating the caching and cycle delays as best I can, but the information I have on this chip is extremely limited, so don't expect miracles. Lastly, as promised, I have released the special chips I have personally emulated to the public domain. See license.txt for more information if interested. I cannot release the special chips whose code I did not write to the public domain, but all of that is already available under the GPLv2 (from ZSNES) or the SNES9x license. Changelog: * Added DSP-3 support, thanks to John Weidman, Kris Bleakley, Lancer, z80 gaiden * Added DSP-4 support, thanks to Dreamer Nom, John Weidman, Kris Bleakley, Nach, z80 gaiden * Started on support for SuperFX, no games playable as chip emulation is less than 1% complete * Unsupported special chips will now display an alert * Missing stbios.bin file when loading Sufami Turbo cartridges will now display an alert * Video settings now saved separately for windowed and fullscreen mode * Advanced option video<.mode>.synchronize can be enabled for vsync, but will cause sound crackling * Added menu option to toggle FPS counter * Minor source code cleanup Oct 01, 2007 - v0.024 This is an interim release between some major changes to the video mode support, which may take a long time to complete. It also fixes a bug with CGRAM access timing, re-adds the Sufami Turbo load menu, and adds support for the ST-010 coprocessor, used by F1 Race of Champions. To load Sufami Turbo cartridges, stbios.bin must be placed inside a folder named bios in the bsnes folder. There is not currently a warning if this file is missing. Sep 16, 2007 - v0.023 I've recently fixed a bug in bsnes that I feel is serious enough to warrant a new release, even though little else has changed. I attempted to build this release with MinGW, but ran into problems with profiling and JMA support, so this release was built with Visual C++ once again. Changelog: * Fixed serious bug in S-SMP incw and decw instructions -- fixes sound bug in Emerald Dragon * Added Nach's MinGW fixes -- can now be compiled with MinGW/GCC3 or MinGW/GCC4 * Fixed const char* cast warnings in GCC 4.2, thanks to [vEX] for the feedback * Updated source to use latest libraries for libco, libui, etc. * Added new advanced options to adjust aspect ratio correction * Cleaned up source code a bit Aug 04, 2007 - v0.022 Today marks a milestone for bsnes, and possibly for SNES emulation as a whole. With this new release, bsnes' compatibility has now reached 100.0%, with zero game-specific hacks. With every last commercially released game tested by both FitzRoy and tetsuo55 for at least five minutes each, all known bugs have been resolved. Now, needless to say, I am referring to the emulation of the base SNES unit. As many SNES cartridges contain additional coprocessors on their PCBs, there are still unplayable titles. So how can I claim compatibility of 100%? Because I don't consider special chips inside game cartridges as part of the base SNES hardware. I realize that many people enjoy these games, and I do actively attempt to emulate as many coprocessors as possible (six are supported thus far). However, coprocessors such as the SuperFX and SA-1 continue to pose very significant challenges. So, after nearly three years of development, I've finally achieved my primary goal. But it wasn't a complete victory ... I've learned a lot over the years. Emulation accuracy is not black and white -- there are heavy costs to pay and forced tradeoffs to achieve it. I no longer believe there is only one absolute path for emulation, as I did in 2004. So does this mean bsnes is now perfect? Of course not. There are many technical details that are not emulated correctly. This also does mean that there are no bugs, merely that there are no bugs that we are aware of. While absolute verification of 100% compatibility is obvioulsy impossible, even by actually beating every single game from start to finish, this very well should be the first time any SNES emulator could claim zero known bugs with all known games tested. I very much expect this announcement to entice many new users to begin actively searching for bugs, in an effort to discredit my above claim. My response? Go for it! I would very much appreciate any and all discovered bugs to be posted here, so that they can be verified and addressed. One major thing that needs to be said, is that there consists of one major hack in all SNES emulators, including bsnes: the use of scanline-based PPU renderers. This necessitates global hacks in all emulators to minimize their inaccuracies. I was going to write up a very long post here, going into specifics, but I've decided an article would be a better place for that. I will hopefully be writing up this article in a few days to post here. In the meantime, one very important issue does need to be addressed. This version fixes a bug in Uniracers 2-player mode, where the game writes to OAM during active display. Like other PPU global hacks, Uniracers required a special consession. But because this hack only affects one game, it can very fairly be seen as cheating. Suffice to say, bsnes does not contain a game-specific hack, and the change made to fix Uniracers affects all games, but I do still very much consider it to be a hack. The fix I have added is quite literally and honestly more accurate than the behavior of bsnes v0.021. Before, writes to OAM and CGRAM during active display went where a programmer would expect, which would cause bugs when ran on real hardware. Uniracers is the only game known to do this, and it is very dangerous to do so. The writes do go through, but not where one would expect. The access address basically changes as the screen is rendered. With a scanline-based PPU, it is not possible to emulate the individual steppings of the PPU, as there is not enough precision. Further, the entire SNES emulation community has virtually no information on how active display OAM and CGRAM writes work. Now, as Uniracers is the only game known to do this, I had the choice of either intentionally remapping the writes to an arbitrary location, or change it to the address Uniracers expects. Neither would be more accurate than the other, as both are completely wrong from a haradware standpoint. So the decision was to either fix Uniracers and deal with some calling it a game-specific hack, or to leave it broken with absolutely no gain to accuracy. Rather than decide for myself, I asked those who have supported me over the past three years for their opinions. The decision was unanimous to fix Uniracers. You can read the discussion, along with a more technical explanation of the issue, here. I will be addressing this topic in much greater detail in the article I will be writing up shortly. Changelog: * Fixed buffer overflow that was manifesting as corrupted tiles in Lemmings 2 * OAM and CGRAM addresses are now invalidated during active display, however the algorithms for how this address invalidation occurs is currently still unknown, so reads/writes are mapped to static addresses for now * Re-added cheat code editor. * Windows only: keypresses when main emulation window is not active are ignored once again Jun 10, 2007 - v0.021 This is a maintainence release. I am mostly releasing this for the sake of the recently released Der Langrisser translation. Changelog: Windows port can once again map joypads through the Input Configuration panel Using enter or spacebar to assign a key should no longer instantly map those keys F11 now toggles fullscreen mode Esc now toggles menu on and off (use F11+Esc combined to hide UI completely) Fixed a bug in King of Dragons (J, U, E), KOFF was not cleared during S-DSP power(), thanks to FitzRoy for the report, and blargg for assistance fixing the bug Fixed serious crashing error with File->Load on Linux/amd64 port Hopefully fixed min/max undefined error on GCC 4.2.0, but I am unable to test to verify Fixed many cast const char* to char* warnings for GCC 4.2.0, but some probably remain, as again, I am unable to test as I lack GCC 4.2.0 Set XV_AUTO_COLORKEY to 1 for Video/Xv renderer. Should fix some video drivers where there was no output, especially after running mplayer, etc. Thanks to sinimas for the fix Added clear_video() to Video/Xv renderer. Green edges at the bottom and right sides of the video output are now gone, and unloading a ROM will clear video I have finally figured out how to poll the keyboard status in real-time through Xorg: the XQueryKeymap function. I will be rewriting the Linux key capture system to use this, instead of capturing window key up / down messages through GTK+. This will finally allow me to completely abstract the UI from the hardware video, audio and input interfaces: a necessary step toward Linux joypad support. Jun 03, 2007 - v0.020 Five months and 43 WIP releases in the making, today I am releasing bsnes v0.020. I'd really like to express my thanks to blargg, for he has written a new S-DSP emulator that is an impressive 32 times more precise than all existing S-DSP emulators. It is now bus-accurate, and should produce bit-perfect sound output to that of a real SNES, excepting very minor, very extreme edge cases. Not only did he do this, he went out of his way to develop a special version exclusively for bsnes to ease licensing concerns and take advantage of bsnes' unique features, notably cothreads. I can't thank him enough. Unfortunately, bsnes has taken a ~10% speed hit over v0.019 by using this new S-DSP emulator, but I must stress the speed hit is entirely due to the way bsnes is implemented. blargg's standalone S-DSP emulator is very, very fast. Anyone is free to take a look at his S-DSP emulator, as he has released it as open source under the LGPL, by visiting his homepage, here. Unfortunately, the new cross-platform UI is not entirely finished. Some sacrifices had to be made to support libui. Specifically, the following features are missing from v0.019, but will hopefully be added back in future releases: * Fullscreen support * Input Configuration panel cannot capture joypad input. Joypad support is still present, but it must be mapped manually through the Advanced panel or through editing bsnes.cfg by hand * The Cheat Code Editor is missing, but cht files can still be used from bsnes v0.019, and created by hand * Sufami Turbo support is not accessible from the UI * The UI on Windows is slightly less polished due to compromises to allow the UI to be readable on Linux. I am sorry for the rough edges listed above, but I wanted to get a new release out, as it has been over five months since the last release, and I really want the world to be able to experience blargg's new S-DSP emulator. Changelog: * Added blargg's new S-DSP emulator, runs at 1.024mhz. Many thanks to blargg for this, as this puts all portions of SNES emulation except for the S-PPU at bus-accuracy * blargg's S-DSP core fixes bugs in both Koushien 2 (J) and Toy Story (U) * Corrected all S-SMP cycle timings to be hardware accurate. Thanks to blargg for creating an amazing test ROM that tested every possible opcode * Corrected S-CPU wai instruction timing, fixes Mortal Kombat II * Reverted HDMA sync emulation once more to fix Breath of Fire II (G) and Secret of Mana (U) * Completely rewrote user interface to use libui, which is a wrapper that allows the same code to produce the same UI on both Windows (through the Win32 API) and Linux (through the GTK+ API) * Corrected $2100.d7 OAM reset behavior, thanks to research from anomie * Massively revamped the Linux port, should compile with no warnings or errors now * Added 64-bit support to libco, tested on FreeBSD/amd64, should work on Linux as well * Revamped makefile with suggestions from Nach * Improved Linux Xv renderer to use the far more common YUY2 format, which should work on most Xorg drivers, allowing hardware accelerated video scaling * Completely rewrote config file system. bsnes.cfg is now saved to user's profile folder on both Windows and Linux, allowing multi-user support * A lot more work has been done behind the scenes, including massive code cleanups and portability improvements You may download the new version on the main bsnes page. Jan 02, 2007 - v0.019 I´m releasing bsnes v0.019 today. This version contains Bandai Sufami Turbo support, new IRQ emulation code, and some various bugfixes. Unfortunately, this release is not entirely cause for celebration. Due to fatal errors in Microsoft´s "enterprise class" c++ compiler package, I am no longer able to compile bsnes with profile guided optimizations. I have tested v0.018 with and without these optimizations, and the difference is a 40% speedup when PGO is used, even more significant than I had previously believed. However, bsnes has now become too complex for Visual C++ to handle. Unfortunately, there is nothing I can do about this, except wait for Microsoft to fix their compiler. (Warning: this paragraph contains personal opinions, skip it if you can´t handle that) As if this wasn´t enough, I´m now doing my best to wean my dependence from Microsoft´s line of operating systems, as I´m particularly concerned about the black box nature of Vista and its´ DRM control mechanisms. This isn´t a road I wish to begin traveling down, and thusly have no interest in upgrading to future versions of Windows. Therefore, as of late, I´ve been writing a UI wrapper that will allow me to code applications that are truly platform independent. The biggest goal for this library is to design a GUI for bsnes that runs virtually identically on both Windows and Linux/BSD. This is mostly complete, however there were many tricks I used in bsnes using the win32 API that I simply cannot do with GTK+ on Linux/BSD, such as the memory editor window subclassing. I will be porting bsnes to use this new UI wrapper, and in turn this will lessen the attractiveness / functionality of the bsnes UI to a certain degree. Perhaps the most devastating news is that I am still contemplating the idea of designing a dot-based PPU renderer for bsnes. As if the loss of PGO wasn´t bad enough, this will likely eat away an unimaginable level of performance as well. I can only estimate the speed loss being between 100-500%. Yes, it will be that bad. And despite weeks of planning, I cannot think of a way to allow a scanline-based and dot-based renderer to coexist as selectable options, given their massive differences in implementation. And let´s not even joke about SA-1 or SuperFX support ... those processors are each four to eight times more powerful than the SNES´ main CPU. All of these speed losses will basically make bsnes mostly irrelevant as an alternative to ZSNES, SNES9x et al. Although I believe I really came close to a viable alternative with v0.018, I know that I cannot both create a mainstream emulator, as well as keep with my original goal to emulate the SNES as accurately as possible. The past few months have been very tough for me; trying to decide which of the above two goals to pursue. I´ve still not absolutely made up my mind. But for now, I´ve been sitting on a mostly untouched version of bsnes for the last few months, and have decided to release it to the public, profile guided optimizations be damned. I´m once again asking for help, if anyone can figure out why bsnes won´t compile with PGO support, please let me know. I´d very much like to get one last PGO build of bsnes released before starting on a dot-based PPU renderer. But given the usual response I get from these requests for help, I´d suggest no one getting their hopes up that bsnes will ever be as fast as it once was again. The new version can be downloaded at the usual place. I´m leaving v0.018 up, as it may very well be the last stable, fast version of bsnes ever released. Oct 14, 2006 - v0.018 I began working on bsnes on October 14th, 2004. I am releasing bsnes v0.018 today to celebrate bsnes' two year anniversary. Please note that this release incurs a ~15% speed reduction since v0.017, due to IRQ and S-SMP timing improvements. Changelog: * Fixed many critical errors in IRQ timing, should be *very* close to real hardware now * Corrected major CPU timing bug involving CPU I/O condition 4 * Corrected bug with generic HiROM / LoROM memory maps * Corrected bug involving HDMA indirect channel termination [anomie] * OAM address reset now occurs when screen display is enabled, per recent research * Readded full DMA, HDMA and HDMA init bus sync timing * Added preliminary emulation of S-SMP $00f0 TEST register (6 of 8 bits are supported) * Readded emulation of known timing differences between CPU revisions 1 and 2 * Config file can now control scanline-based PPU render position. This will only be needed until a proper dot-based PPU renderer is added * Removed core debugging hooks so that debugging console can remain in public releases, it now functions as a tracer and memory editor * Config file paths once again work correctly even if missing trailing backslash * Video configuration simplified, sorry in advance to those who enjoyed the profile mode used before * Added new configuration screen to control some emulation settings * Replaced bsnes program icon with a much nicer one [FitzRoy] * Optimized memory speed detection algorithm * Preliminary UPS soft-patching support (do not use this yet!) * Decreased memory usage and optimized generic libraries used by bsnes (/src/lib) * Now caching OAM by one line, somewhat similar to a real SNES. Fixes Winter Gold, but causes line rendering error in Mega lo Mania * Lots more, as usual The following games have been fixed since v0.017 by the above bugfixes: * Battle Blaze (J, U) * Circuit USA (J) * F1 Grand Prix (J) * Funaki Masakatsu no Hybrid Wrestler - Tougi Denshou (J) * Jumbo Ozaki no Hole in One (J) * Mahjongg Taikai II (J) * RPG Tsukuru - Super Dante (J) * Robocop Versus The Terminator (U, E) * Sink or Swim (U, E) * Street Racer (J) * Touge Densetsu Saisoku Battle (J) * Winter Olympics (U, E) Aug 27, 2006 - v0.017 * This version adds major accuracy improvements, countless bugfixes and DSP-1 support. At the time of this release, the only remaining known bug in bsnes is with Uniracers 2-player mode, with well over 300+ games tested. Changelog: * DSP-1 support added [Andreas Naive, byuu] * Added cooperative multithreading library, written by myself * Rewritten CPU core, now bus accurate * Rewritten APU core, now bus accurate * Added cartridge database * Added several PCB mappers, thanks to research from Overload * Added several games to database, fixing several mapping-related bugs * Improved mirroring [Nach, grinvader, byuu] * vscroll bug in hires, interlaced mode fixed. Fixes RPM racing * RTO X=256 bug corrected. Fixes Super Conflict title screen [anomie] * Fixed bug in NTSC filter with hires games * Updated snes_ntsc to version 2.0.1 [blargg] * Fixed bugs in HiROM / LoROM memory mapping. Fixes countless games * Fixed major bugs in HDMA routine. Fixes ToP, Mortal Kombat and Genjuu Ryodan * Added out-of-order execution to CPU, APU synchronization for major speedup with no accuracy loss * IRQs are now delayed after H/DMA transfers. Fixes Wild Guns * HDMA transfers now kill active DMA channels that are on the same channel. Fixes Bugs Bunny and World Class Rugby. Special thanks to zones for researching this * CPU emulation mode accuracy was improved * Cleaned up port-specific code to ease porting * Created unified Makefile, used by all ports [Nach] * Created GTK+ port of bsnes (although input is currently broken) * WRAM is now initialized to 0x55, SRAM to 0xff. Fixes Power Drive, Death Brade and RPM Racing * Fixed extreme NMI / IRQ edge case. Fixes Chou Aniki * Adjusted PAL execution speed. Fixes Earthworm Jim 2 (E) sound effects * Fixed auto joypad polling bug. Fixes La Wares * Fixed H/DMA bug that was preventing saves from working in Secret of Evermore * bsnes low loads d3dx9_*.dll dynamically at runtime, it is no longer required * Added support for 239-line PAL mode rendering * As usual, there have been much more changes I've forgotten about since the last release * Two C4 bugs fixed. Mega Man X2 / X3 have no remaining known bugs [anomie, byuu] Apr 24, 2006 - v0.016 * Added Direct3D renderer with options for disabling hardware filtering and scanlines * Screenshots can now be captured in BMP, JPEG, or PNG format * Added config file option to specify default ROM and SRAM paths * Config file is always loaded from path to bsnes executable * Added support for analog mode joypad input * Up to 32 joypads can be used at once now * Fixed bug regarding enabling interlace mid-frame * Moved PPU rendering to V=240, from V=0 * Started on new debugger. So far only debug messages and memory editor added * Added joypad axis resistance option for analog input mode * Added config file option to set window style attributes * Added color adjustment settings for brightness, contrast, gamma, and scanline intensity * Added grayscale, sepia, and invert color settings * Added NTSC filter by blargg, HQ2x filter by MaxSt, and Scale2x filter * PPU now renders scanline 224 * Revampled about box * Added Game Genie / PAR cheat code support + editor, saves codes to .cht files * HDMA channels are no longer disabled when starting DMA, fixes Dracula X [DMV27] * Fixes to OAM priority mode (not perfect), fixes Final Fantasy: Mystic Quest [DMV27] * Fixed ENDX sound bug, fixes voices in Earthworm Jim 2 [DMV27] * bsnes should now compile with MinGW [DMV27] * Added DSP-2 support * Added OBC-1 support * Major rewrite of SNES address bus mirroring and MMIO handlers * Many address mirroring corrections, fixes Dezaemon, etc * Blocked invalid (H)DMA transfers, fixes Kirby's Super Funhouse * Wrote Win32 API wrapper and ported all GUI code to use it, should help to create Linux GUI later on * Revampled input system, should lead to customizable GUI shortcut keys later on * Fixed numerous bugs with input registers. Fixes many games that previous had their intro cut off (Super Conflict, etc), and many that never accepted input (Super Double Dragon, etc) * Moved auto joypad strobing from V=225 to V=227 * Killed OAM table caching and window range caching, as they were actually hindering speed * Rewrote input configuration screen to show currently mapped keys * Greatly enhanced configuration options for each video profile * Modified fullscreen mode to exit to windowed mode when menu is activated, use F11 to toggle fullscreen mode * Fixed bugs in txs, wai, brk, cop, and rti opcodes [DMV27] * Fixed bug with emulation-mode IRQs [DMV27] * Initializing DMA registers to $ff [DMV27] * Memory writes now update CPU MDR register (open bus) [DMV27] * Improved ROM header detection, fixes Chou Jikuu Yousai Macross [DMV27] * Reading OAM no longer updates OAM latch * Writing to OAM high table no longer updates OAM latch * Writing CGRAM now updates CGRAM latch * Improved pseudo-hires rendering [blargg] * Much, much more Dec 04, 2005 - v0.015 * Added GZ / ZIP / JMA archive support [Nach, NSRT team] * Fixed bug in APU ADDW/SUBW opcode flags, thanks to DMV27, anomymous for info * Mosaic support is now (mostly) hardware accurate, thanks to TRAC for info * Fixed a bug in SC tilemap clipping, fixes Seiken Densetsu 3 * Emulated pseudo-hires mode, uses a fairly poor color filter to simulate TV effect, the same one that SNES9x and Super Sleuth use * Rewrote the ROM loading code to be more port-friendly, and improved header detection * Added C4 emulation -- mostly correct. Only minor bugs remain, possibly not C4 related [Nach, byuu], also uses code from zsKnight, Overload, and anomie * Fixed noise channel generation for DSP, fixes Dual Orb 2 opening. Thanks to DMV27 for info * Fixed bug with DSP VxSRCN registers, fixes horrible sound corruption in Mortal Kombat 2/3 * Modified DSP KON register reading to act according to anomie's research, while still allowing Der Langrisser, etc. to play sounds correctly * Fixed a bug in CPU BCD math, fixes numbers in SimEarth, thanks to DMV27 for info * Rewrote the windows port from scratch * -- Added triple buffering support (buggy) * -- Added DirectInput (joypad) support, allows both keyboard and joypad to be mapped to the same SNES controller button. Only one controller supported for this release, will be improved shortly * -- Added pause key (mapped to Pause/Break) * -- bsnes no longer consumes CPU time when paused or when no ROM is loaded * -- Updated DirectDraw to 7, and added video mode configuration options to configuration file * -- Video modes can specify screen width+height, refresh rate, and render width+height * -- Added CTRL+[1-0] hotkeys for swapping video modes * -- Added +/- hotkeys for adjusting frameskipping rate * -- Added adjustable speed regulation. There are five modes, all can be adjusted inside the configuration file. CTRL+[+/-] will adjust the speed mode. * -- Added PPU options to toggle any BG / OAM layers with any priority, HDMA effects, and offset per tile effects * -- Added option to accept invalid button combinations (up+down, left+right) to joypad config menu * -- bsnes now properly clears the main window when unloading games * [code] Made destructors for base classes virtual, so the correct destructors will be called now Nov 13, 2005 - v0.014 This version adds speed regulation, greatly improves PPU rendering, and increases speed by ~30% over the previous version. Changelog: * Rewrote offset-per-tile mode emulation, should be correct now. Fixes Chrono Trigger, Contra III, Tetris Attack, etc. * Fixed a bug with HDMA occuring during interrupts. Fixes Tales of Phantasia souond test screen * Updated compiler to Visual Studio 2005, and enabled profile guided optimizations * Added conditional compilation of debugging functions (faster without them) * Added conditional compilation of core classes as pointers (allowing polymorphism) or objects (allowing inlining). The latter results in a speed increase * Small fixes to BG and OAM rendering routines * Corrected sprite tile bounds wrapping * Corrected sprite rendering in hires video modes * Rewrote color add/sub routines, should be correct now. Fixes Illusion of Gaia menu, etc. * Optimized video blitting routines, will temporarilly break mixed video mode screenshots * Prevented selecting menu options via return key from being recognized as keypresses by the emulator * Added system speed regulation (60hz/NTSC or 50hz/PAL)! Many thanks to kode54, GIGO, and Richard Bannister for their assistance I disabled the debugger and polymorphism, and enabled profile guided optimizations for this build, to maximize speed. The debugger and polymorphism can be re-enabled via uncommenting the respective #defines in src/base.h and recompiling, or bsnes v0.013 can be used. I may start releasing two separate builds in the future... not sure yet. Oct 24, 2005 - v0.013 * Greatly improved HDMA timing and accuracy with help from anomie and DMV27 -- fixes bugs in Energy Breaker and Street Fighter Alpha 2 * Fixed a problem with color add/sub code -- fixes opening battle in Tales of Phantasia and clouds in Energy Breaker * Temporarily added DMV27's bugfix for the DSP KON register -- fixes sound in Der Langrisser, but this is not a hardware-accurate fix * Disabled VRAM writes outside of vblank -- fixes Hook, but breaks many PD ROMs and fan translations (Roto's BS Zelda hack, Gideon Zhi's Ys 4 translation, etc). I might add an option in the future to toggle this behavior, but for now these games will no longer work. Please keep in mind these games will not run properly on real SNES hardware, either. * Improved frameskipping code thanks to a suggestion from Richard Bannister * Misc. other code cleanups and improvements (notably in the color table generation code) * bsnes is now endian-safe and runs on Mac OS X * Added caching support for window clipping tables resulting in a slight speedup. Please let me know if you spot any errors as a result of this change. Oct 02, 2005 - v0.012 Changelog: * Added S-DSP emulation * Added sound output support via DirectSound -- no sound buffering though, so sound is muted by default * Added option to record raw sound output to WAV files * Added multiple color adjustment filters to the video output * Added mode3/4 direct color support * Added mode7 direct color and mosaic support * Greatly improved mode7 rendering algorithm thanks to anomie * Fixed mode7 screen repitition and EXTBG effects * Greatly increased accuracy of NMI and IRQ timing, and emulated many newly discovered hardware quirks involving the two * A few speed improvements courtesy of Nach for profiling the code for me I'm now looking for assistance with sound buffering. Specifically, I need help modifying the DirectSound code to allow the emulator to be ran between 50%-400% normal speed, while keeping the sound output relatively good. If you have experience with this and can help, please get in touch with me (setsunakun0 at hotmail dot com). Aug 27, 2005 - v0.011 * Fixed Mode 0 color palette index problem. Fixes ToP, DQ5, etc. * Improved LoROM memory mapper to support 32mbit images. Fixes Tokimeki Memorial, etc. * Added full S-DD1 support, SFA2 and Star Ocean are now playable. Special thanks to Andreas Naive * Updated BGnxOFS / Mode7 registers with anomie's latest findings * Added basic ROM mirroring support. Fixes copy protection issues in MMX, etc. * Rewrote string library to work better on gcc/linux * Cleaned up S-RTC/S-DD1 emulation to make way for future add-on chip emulation * Rewrote DMA code, now runs cycle-by-cycle * Rewrote HDMA code, now allows HDMA to be enabled mid-frame, fixes many games * Fixed a bug in Mode7 vertical screen flip mode. Fixes FF5 title screen, etc. * Greatly improved IRQ triggering. Fixes Der Langrisser, etc. * Added full support for open bus. This includes PPU1 and PPU2 open bus support * Modified CPU core back to cycle-based system. Slower, but improves debugger * Implemented temporary fix for debugger to handle new cycle-based cores * Modified CGRAM to ignore highest bit, since it is not used at all by the SNES, and is impossible to read on real hardware. Lowers memory usage by ~1.2mb * Added mostly accurate PAL timing support. This should increase compatibility by ~30% or so * More stuff I'm forgetting at the moment... Aug 04, 2005 - v0.010 bsnes now supports SPC700 emulation (no DSP or sound support, however), and has greatly improved compatibility. It also now contains a keyboard-only joypad configuration tool. Jun 26, 2005 - v0.009 * Fixed non-interlaced display modes from not drawing every other frame * Changed OAM halve to skip every other scanline in 224-height modes * Updated renderer to properly support games that switch resolutions mid-frame * Fixed VRAM address remapping modes, fixes DQ3R, FF: MQ * Fixed a bug in main color window clipping affecting BGs * Added video color curve option, thanks to Overload for the idea + color table * Added vblank, FPS counter, and DDraw surface memory options to settings menu * Added fullscreen modes 640x480 and 1024x768 to video modes * Added option to toggle the menubar on and off by pressing the escape key * Mode3 was not rendering sprites * Priorities were wrong for modes 2-4, thanks to anomie for info * Fixed a serious bug in IRQ interrupts. May not be perfect, but helps many games Jun 22, 2005 - v0.008 moving the window + main color window clipping into the bg/oam/mode7 rendering routines themselves, I was able to greatly simplify the most complicated part of rendering: the final pass where color add/sub effects are applied. As a result, the new PPU core is not only ~35% faster (on graphics intensive screens, even faster on simpler screens), but more accurate as well. Awesome. In celebration, I´m releasing bsnes v0.008. I can actually run all games I have at >60fps on my Athlon 1.67ghz PC. Probably not something to brag about, though ... Oh, and I also updated the keyboard polling code to only capture keypresses if the main window has focus. I´ve been meaning to do this for the better part of a year now, but never got around to it. If, for some reason, you still want to use the old renderer, you can uncomment the first line in src/ppu/bppu/bppu.h and recompile the emulator yourself. Or you can use v0.007a, I´ll leave it up for a bit. Jun 12, 2005 - v0.007a Jun 12, 2005 - v0.007 I have done quite a bit, so I´ll try my best to recap most of the fixes since the last release... * HDMA was not running during DMA transfers * Emulator did not recognize any filetype other than .smc * Added configuration file support and imported my vector/string/config libraries into bsnes * Added option to use system RAM instead of video RAM for display, this can greatly increase speed on certain video cards * Increased speed by ~15% by adding 256x224 renderer (still very buggy when the SNES mixes video modes mid-frame) * mvn/mvp opcodes were not setting the DB register * Fixed joypad input in many games (Super Mario: All Stars, Dragon Quest III, etc.) * Major speedup with frakeskip option * Fixed default aspect ratio when emulator is first started There´s probably a lot more, but that´s all I remember offhand... this release should be a lot closer to the quality of v0.005a, but still needs a bit more polishing. May 13, 2005 - v0.006 The rewrite is now complete. I finished adding frameskip, and fixed some crashing issues with loading multiple ROMs. I wrapped all malloc/free calls with memalloc/memfree, which are custom functions that log each call, and let you pass sprintf-style arguments to them to debug memory leaks. Don´t see any, nor have I noticed any in bsnes; but it makes a nice test tool anyway. I found out today that the mvn/mvp instructions actually set the DB register to the destination bank. Weird. This fixed Final Fantasy V, Chrono Trigger, and Dragon Quest III (which now runs as a result) graphics. Not all of them, but quite a few. I had also previously been setting the M/X flags of the P register when xce was executed. I never anticipated a game using xce while in native mode to switch to... native mode... but apparently, Chrono Trigger does. And my code was incorrect. So now Chrono Trigger gets past the name select screen, but dies a few screens after still. The only really major flaw I am aware of that bsnes v0.005 did not have is with the battle screens in Squaresoft games. I get horrible flickering and "crushed scanlines" every other frame on them, for some reason. I´ll try and track that down for the next release, but I didn´t want to hold up a new release any longer. As a result, I´ll leave up v0.005a for the time being until I get this problem fixed. Feb 06, 2005 - v0.0.005a Feb 05, 2005 - v0.0.005 Released a new version of bsnes today. Version 0.0.005 is up on the main page now. The changes since .004 wip10 include: DRAM timing fix (now occurs mid-opcode), memory address speed fix, added CPU cycle condition 4 to all opcodes that use it, and fixed a bug where DRAM refresh was not changing start positions every other scanline. With the new version, Chrono Trigger should get a little further, and Final Fantasy 5 should get in-game now. The only problem FF5 seems to have is sprite corrution in the menus. I´m too busy with the CPU timing to mess around with the PPU right now, though. Also, the APU is not bridged to the CPU in this release, so compatibility is (still) really low. After I get the APU working fairly well, I´ll (try and) start keeping a what´s new file so that people can know what all changed between public releases of the emulator without having to follow this page. Sorry for the inconvenience in the mean time. Dec 24, 2004 - v0.0.004 Dec 13, 2004 - v0.0.003 wip1 Dec 11, 2004 - v0.0.002 ir11 Doubled the width of sprites when the width of the screen is 512. The SNES Test Program now runs through all of the character test correctly. The windows are off-by-one though. Added the very bizarre 00:4300-00:437f memory region that is unique from 7e:4300-7e:437f. Then I added read support from $2180. This allowed the SNES Test Program to not crash after failing the electronics test, and it also fixed the horrible graphics corruption in Der Langrisser. The fonts were still failing, so I went in with my tracer and found out what was causing it. The following code: gx816->regs.pc += (signed char)(arg + 2); This is the code used to increment the pc counter after relative branches. The problem is that I had parinthesis around the + 2 as well as arg. Therefore, if arg was 0x7e, 0x7f, 0xfe, or 0xff, it would change the sign. This would in turn make the program counter off by 256 bytes. Very bad. Fixing this fixed the font in Der Langrisser, and also fixed Super Mario World, when Yoshi spits a turtle out, the game will no longer crash. Next, via the Der Langrisser world map, I realized that anomie´s description of the BG/mode7 register latches was reversed: the BG registers (may) share a common latch between all of them, but the mode7 registers do not. I removed the common latches from the mode7 regs, but I haven´t added the latch to the BG registers yet. I also realized that clearing the entire screen on a BG mode change would probably not be a good thing for games that change video modes mid-frame. So I tried working on getting the weird single-frame garble that pops up every minute or so to go away, but to no avail. I´m having a difficult time tracking down the exact cause of the error, but I believe it to be a buffer overflow, or something along those lines.