mirror of https://github.com/bsnes-emu/bsnes.git
279 Commits
Author | SHA1 | Message | Date |
---|---|---|---|
![]() |
27c24bc8a6 |
Update to bsnes v063 release.
Time for another (hopefully) stable release. The changelog has all updates since the last stable release. Most notably, this release features substantial accuracy improvements all around. Almost all of them represent brand new findings never before seen in any SNES emulator. Changelog: - fixed off-by-one buffer size issue in S-PPU RTO calculations [PiCiJi] - added XML parser - added XML-based memory mapping system - moved header-based memory mapping code into snesreader library - added some linker flags for Fedora [belegdol] - added cheat code database; with codes for over 1,500 games [mightymo] - fixed a bug where S-CPU IRQs were being tested one cycle early on direct page indexed read opcodes - added global cheat system enable/disable checkbox to cheat code editor - fixed bug in overflow calculation of S-CPU ADC and SBC opcodes in BCD mode [blargg] - emulated the S-CPU ALU MUL and DIV hardware delays with partial result calculation steps [blargg] - controller port read now returns real-time results of B button when strobe latch is raised - major improvements to emulation of the S-SMP TEST register [blargg, byuu] - fixed DSP2 memory map [Overload] - "Apply Patch" checkbox will now scan UPS patch folder if one is set in the paths section - fixed S-CPU TSC negative flag calculation in emulation mode [address] - added "make uninstall" command to Makefile for Linux users - S-CPU (H)DMA now updates the S-CPU MDR; fixes a freeze in Speedy Gonzales - Stage 6-1 - very substantial code cleanups and optimizations as a result of moving from C++98 to C++0x |
|
![]() |
fac95dfec5 |
Update to bsnes v062r10 release.
Added make uninstall, and fixed up nall::function to also bind lambdas that don't yet exist in GCC 4.4. Spent most of tonight rewriting the standalone UPS patcher. |
|
![]() |
362542924e |
Update to bsnes v062r09 release.
Mostly minor stuff again. Fixes: array, linear_vector and pointer_vector need to set source.pool = 0 before calling reset() to avoid destroying the object we're trying to move. All of nall::string is inside namespace nall now. No idea what I was trying to do before with the half-global approach. nall::function gains a reset() function, more obvious than func = (void*)0; The movie file loader wasn't binding the right action when changing files and clicking load, can't believe nobody noticed that one. |
|
![]() |
4179282244 |
Update to bsnes v062r08 release.
This WIP has bsnes.exe, snesreader.dll, and src/. If you need anything else, get it from past releases, please. I fixed TSC negative flag calculation in emulation mode. Will pass this test now: http://blargg.parodius.com/snes-tests/snes_test_tsc.zip _Way_ too obscure to affect anything, but definitely good to get it right. Also rewrote nall/function.hpp to use C++0x variadic templates. New version is ~85 lines instead of ~190, 40% smaller, doesn't require recursively including itself, doesn't require the C preprocessor, evaluates to ensure the member function pointer is big enough to hold what you're assigning statically (at compile time) instead of dynamically (at run time), and supports infinite arguments instead of zero to eight now. |
|
![]() |
02820ef2e9 |
Update to bsnes v062r07 release.
This is source code only, no binaries. Sorry, worn out after spending four hours straight writing crazy ass Julian<>Gregorian date functions. Holy fucking hell that is crazy shit. Tell me, how many days have passed since 01-01-4731 BC on the Julian calendar? Okay, this really was just about taking advantage of vectors inside of vectors. I've updated the XML parser to use vectors of actual objects instead of pointers. This makes cleanup free, and turns countless ->'s into .'s -- much nicer to look at. I may take advantage of overloaded operators for something now, not sure yet. |
|
![]() |
0ecce7b93d |
Update to bsnes v062r06 release.
You'll need snesreader's DLL from my last WIP post to use the above. This initializes mode, region and ram_size again in Cartridge::load() to stop the phantom SRAM files from being generated. This fixes DSP-2 mapping to match Overload's findings (which requires an unposted snesreader, so Dungeon Master won't run for you guys yet.) This removes nall/traits.hpp and uses std::tr1::type_traits instead. It also drops move, forward and identity in favor of those from std::tr1::utility*. This fixes linear_vector and pointer_vector to not crash when using vectors of vectors and copying them. This fixed linear_vector, pointer_vector and array to initialize all internal variables for all constructors. This fixes the file browser to look for patches in your patch directory, so the "Apply Patch" box should work correctly now. * I have no objection to using functions from the C++ standard library when they don't suck. |
|
![]() |
f94fcd6f30 |
Update to bsnes v062r05 release.
To run this, you'll need the DLLs from v062r04's public beta, and the updated snesreader.dll in the same folder as the WIP. No profiling. This fixes UPS patching, and it also modifies snesreader to generate the XML map separately, so that the map can be generated post- patching. The new enum classes weren't attaching properly to the config file, so the input settings, expansion port and region settings are saved again. It also converts the S-SMP timers back to unsigned integers instead of using floating point, no accuracy improvement but much more in line with hardware. Lastly, it makes the div register shift left 16 places and pre-shifts on divide, which is just for aesthetics. And I'll wait on your tests, FitzRoy. I really hope that Big Run Jaleco Rally is correct, because I don't have the first idea how to debug that one. Speedy I can probably handle. |
|
![]() |
57f903630a |
Update to bsnes v062r04 release.
I suppose I should start calling these nightlies, heh. blargg went ahead and verified every last possible edge case with regards to the S-CPU MUL / DIV registers. It uncovered a few errors in my implementation, which have since been corrected. The design used now should be a direct reflection of the hardware implementation: no actual multiplication, no actual division, and no variable-length bit-shifting. We also spent about eight hours straight hammering away at the S-SMP test register. We have a partial understanding of TEST.d3 and TEST.d0, and a complete understanding of the other six bits. All of this has been implemented as well. Lastly, snesreader gets a tiny update to fix Test Drive II, which broke due to a slight regression when porting the mapping code to XML. |
|
![]() |
9329de0a8d |
Update to bsnes v062r03 release.
blargg and I sat around for a good 8+ hours today hacking away at the S-SMP Pandora's Box: the TEST register. What better way to spend Pi Day, right? We came up with the following tests: http://byuusan.kuro-hitsuji.net/blargg_2010-03-14.zip First, controller_strobebehavior.smc improves emulation of $4016. When the joypad strobe latch = 1, reading $4016 returns the current value of the B button. As in, you can keep reading it over and over. It won't increment the shift register, and it will keep telling you the actual current state of the button. This is very much like the NES behavior. One more TODO in the S-CPU code taken care of. Next, all kinds of S-SMP TEST register improvements. Turns out d7-d6 alone controls the actual S-SMP clock rate. 0 = 100%, 1 = 50%, 2 = 0% (locks the S-SMP forever), 3 = 10%. Wild stuff, you can actually permanently slow the S-SMP relative to the S-CPU. d6-d5 is a timer tick control, but it actually uses d7-d4 overlaid. The algorithm is fucking nuts, and is really my only contribution to today's work. The rest was all blargg's research. We had d2 wrong, it's not MMIO disable, it's RAM disable. As in, disable read and write. Returns 0x5a on regular SNES, 0xff on mini- SNES. 0x5a is not the S-SMP MDR. IPLROM is still readable when RAM is disabled. d1 was correct, just RAM write disable. Can still write to $f8 and $f9, of course. But it won't go through to RAM. d3 and d0, we are still a little unsure on. The T0-T2 timers seem to have a low and high phase, and if you strobe them you can force ticks of stage 2 to happen, and you can disable them in such a manner than stage 2 never ticks at all. blargg is still uncovering all sorts of crazy things in $xB mode, so emulation of these two bits is not perfect. But overall we are leaps and bounds further now toward complete emulation. I'd say we went from 10% to 80% with today's work. But we'll have to see how deep the rabbit hole goes on d3+d0 first. Current register map: case 0xf0: { //TEST if(regs.p.p) break; //writes only valid when P flag is clear status.clock_speed = (data >> 6) & 3; //100%, 50%, 0%, 10% status.timer_speed = (data >> 4) & 3; //100%, ... status.timers_enabled = data & 0x08; status.ram_disabled = data & 0x04; status.ram_writable = data & 0x02; status.timers_disabled = data & 0x01; unsigned base = 1 + (1 << status.clock_speed); unsigned step = base + (15 >> (3 - status.timer_speed)); status.timer_step = 1.0 / (3.0 / step); t0.sync_stage1(); t1.sync_stage1(); t2.sync_stage1(); } break; Fairly confident that no emulator prior to this WIP could pass any of blargg's tests, so this is all brand new information. Fun stuff :) |
|
![]() |
989648c21c |
Update to bsnes v062 release.
Major accuracy improvements have happened over the past few days. They easily warrant a new beta release. First, it turns out that every emulator to date; not only for the SNES, but for the Apple II GS as well, incorrectly computed ADC (add) and SBC (subtract) flags in BCD (binary-coded decimal) mode. At least fifteen years of emulating the 65816 processor, at least five known investigations into their behavior, and we all still had it wrong. So I wrote some tests that dumped every possible combination of adc and sbc with every possible input and every possible flag, and recorded both the accumulator result and status flag register. From here, blargg figured out the underlying trick: the CPU was computing overflow before the top-nibble's BCD correction pass. With the routines rewritten, bsnes perfectly matches real hardware now. Next, some background. The whole reason I got into SNES emulation was because I was tired of writing code that ran perfectly fine on emulators, but failed miserably on real hardware. The number one problem was emulators allowing video RAM to be written while the screen was being rendered. This single bug has broken dozens of fan translations and ROM hacks. Some have been updated to work around this bug, and many others are left in a permanently broken state (such as the translations of Dragon Quest I & II and Sailor Moon: Another Story, to name just two.) After asking emulator authors to fix this since 1997, I finally had enough in 2004 and started on bsnes. For this particular bug, I'm very happy to report that all but one SNES emulator now properly blocks these invalid accesses. Although sadly one still offers a configuration setting for backwards compatibility with these translations. What an ironic shame ... emulating an emulator. And in the process, sapping the motivation to ever go back and fix these titles to ever run on real hardware. But I digress ... The second biggest problem that causes software created under emulation to break on real hardware has, without a doubt, been the hardware delays as the S-CPU computes MUL (multiplication) and DIV (division) results. To date, whenever you used this hardware functionality, emulators have immmediately furnished the correct results. But on real hardware, multiplication requires eight CPU cycles, and division requires sixteen. Each step computes one bit of the source operand and updates the results. Reading the output registers early thus provides the partially computed results. This is obscure. It isn't well known, and many people writing software for the SNES probably aren't even aware of this limitation. Because of the partial computation results, outright delaying the computation would break many commercial software titles. But by not emulating the delay at all, we were causing a great disservice to anyone wishing to use an emulator for development purposes. Now, once again, thanks to blargg's algorithm help, he has determined the underlying multiplication and division algorithms. Combined with my expertise of SNES analysis and hardware testing, I was able to determine when and how the ALU (arithmetic logic unit) stepped through each work cycle. Our work combined, bsnes now also perfectly emulates the hardware MUL and DIV delays. Again, this isn't going to fix commercial software titles. They would have realized that they were reading back invalid MUL and DIV values, and fixed their code. This is for all of the software developed using emulators. This is an extension of my commitment to create a hardware emulator, and not a video game emulator. We also verified that the S-PPU multiplication interface does indeed return instant results with no delay. So emulation of that interface was already correct. I'm only labelling this release a beta because it hasn't been tested. But I'm fairly confident that it is stable, and I seriously recommend upgrading from v060 or prior releases. This is easily one of the last major pieces missing from emulation. The last notable elements are: S-CPU auto joypad poll timing, S-CPUr1 HDMA crash detection, S-CPU<>S-SMP port ORing, S-SMP timer glitching, S-DSP mute pulse, and full cycle-level emulation of the S-PPU. With all of the aforementioned items, I will consider a v1.0 release of bsnes ;) Lastly, I'll post this screenshot just for fun. When d4s translated Breath of Fire II to German, he added some code that relies on the incorrect emulation of the DIV register to detect emulators. With this emulated properly, you now see the following screen: ./sshots/bs_349.png Sorry to spoil that, but the secret's already out, as the MESS team reported on it publicly already. I intend to add pseudo-randomness support shortly, which should eliminate one of the last vectors possible to distinguish bsnes from real hardware :) A million thanks to blargg for making this release possible. |
|
![]() |
0f0dcf9538 |
Update to bsnes v061r03 release.
This is probably the biggest accuracy fix in several years. Thanks to the efforts of blargg and myself, bsnes is now the very first emulator to properly emulate ALU multiplication delays. It's 100% bit-perfect. Note that we don't yet know the underlying division algorithm. So in this WIP, I just make it wait eight ticks before storing the results. It _may_ cause some issues, but I wanted to get rid of the status.alu_lock and config.alu_mul/div_delay garbage in advance. I'm absolutely enthralled, I never thought I'd actually see this emulated properly. |
|
![]() |
78e1a5b067 |
Update to bsnes v061r02 release.
Complete rewrite of adc + sbc opcodes, should fix: - adc BCD overflow flag - sbc BCD overflow flag - sbc BCD invalid input value Testing is appreciated, I believe Sim Earth is probably the most likely to observe any difference. |
|
![]() |
79404ec523 |
Update to bsnes v061r01 release.
Found the cause of the issue breaking SuperFX games after loading SA-1 games. Seems the XML mapping tree wasn't being cleared. It's also not a good idea to use bsnes/ as the folder name when the Makefile generates a binary by the same name in the same directory, so back to src/ for the main emulator it is. With those fixes, this release should be fully stable; but again my intentions are to keep v060 as the stable release for a while. Nonetheless, you can grab the new beta at Google Code. It should be the last update for at least a few weeks. |
|
![]() |
6c59a2f1b4 |
Update to bsnes v061 release.
Please keep in mind that bsnes v060 remains the current stable release. v061 has been released as a work-in-progress build. As such, it is only available at Google Code. I am releasing this WIP to allow the public to test out and comment on the new XML mapping system, as well as the integration of mightymo's cheat code database into the cheat editor. I would greatly appreciate feedback on these two on the forums. There are some important issues with this release. The biggest is the move to C++0x. This requires GCC 4.4.0 or newer to compile, thus it is not currently possible to build this on OS X using Xcode. Nor would it be possible on certain BSDs or older distros. If you have an older compiler, please stick with v060, or use a binary release where available. Another issue is that TDM/GCC 4.4.1 for Windows crashes with an internal compiler error when attempting to generate a profile for the DSP-1 module. This is a bug in the compiler, and not in the code itself. The workaround is to simply omit profile-guided optimization for this one object. Lastly, there's also a known bug in the memory mapping. If you load an SA-1 game, SuperFX games will not load properly afterward unless you restart the emulator. I'm looking into the cause now, but it didn't seem serious enough to hold up a WIP release. So, yes. If you want a good gaming experience that's been fully tested and stable, please stick with v060. If you want to see some bleeding edge features, I'd appreciate feedback on v061. Thanks for reading this. Changelog: - added mightymo's cheat code database, access via "Find Cheat Codes" button on cheat editor window - added an option to temporarily disable all cheat codes quickly - debugger now properly uses S-SMP IPLROM when needed for disassembling and tracing - indexed indirect read opcodes in the S-CPU were testing for IRQs one cycle too early [someone42] - fix an off-by-one array iteration in S-PPU OAM rendering [PiCiJi] - added some implicit linked libraries to linker flags for Fedora [belegdol] - moved from C++98 to C++0x, resulting in substantial code cleanups and simplifications - C++0x: implemented foreach() concept for linear container iteration - C++0x: implemented concept system using SFINAE and type traits - C++0x: utilized auto keyword to increase source readability - C++0x: moved to strongly-typed enumerators - C++0x: rewrote va_list-based code to use type-safe variadic templates - C++0x: replaced noncopyable class with deleted default copy functions - C++0x: replaced custom static_assert template class with built-in version - C++0x: utilized rvalue references to implement move semantics into string, array, vector and serialization classes - C++0x: utilized std::initializer_list for { ... } initialization support to lstring, array and vector classes |
|
![]() |
a295c86c05 |
Update to bsnes v060r12 release.
Added concept support, vastly improved foreach to handle break properly and only compute the size once (based off concepts), extended it to work QList, and updated cheateditor.cpp to use foreach everywhere now. Added an "Enable Cheat Engine" checkbox to the bottom left of the cheat editor window with a tooltip to help explain it more. It essentially simulates the switch on the Game Genie. A way to quickly toggle all codes on and off, without having to check/uncheck each one individually. Useful for the codes that lock up games between levels and such. It's bound to the existing keyboard shortcut that did this, and they both update the check state and system status properly. Hopefully the GUI option will make more people aware of this functionality. Updated array, linear_vector, pointer_vector and lstring to support std::initializer_list constructors. This allows: lstring list = { "apple", "strawberry", 3.4, -27, true, QString("why?") }; array<int> = { 3, 4, 9, 2 }; std::initializer_list is a pain in the pass, it lacks a subscript operator, an at() function and a get() function. Forced to use constant iterators to read out the contents. [No archive available] |
|
![]() |
a539f2f578 |
Update to bsnes v060r10 release.
Fuck, adding #include <iostream> grows the Windows binary by 300KB pre-UPX, and 100KB post-UPX. And I'm only using std::cout to avoid the very last call to printf(). I may just say fuck it and stick with stdio.h instead. Nothing really big in this one. Added "Select All" + "Clear All" buttons to the cheat finder Added move semantics to dictionary, array, linear_vector and pointer_vector Killed class noncopyable and replaced it with proper class(const class&) = delete; (inheriting noncopyable makes some classes non-POD) Added type-safe variadic sprint() and print() functions, which are designed to replace sprintf() and printf(), which I only use for bug- testing anyway Couple other small things like that [No archive available] |
|
![]() |
e710259611 |
Update to bsnes v060r09 release.
This release parses the 1.3MB cheats.xml file about 960x faster than the last release, no exaggeration at all there. The tiny 5-10ms lag to search now is probably more due to Qt than anything else. It also won't eat up an extra 40MB of RAM, instead only using about 100KB now. So yeah, please give it a try and let me know what you think of the new cheat lookup system. Aside from that, I fixed a tiny S-CPU typo bug where the IRQs were being tested one cycle too early in op dp,x and op dp,y opcodes. I also redid a bit of nall in C++0x. Most importantly, I've added move semantics to nall::string, which should cut out ~20% of the memory allocations bsnes needed before. I really wanted to write a variadic template string::printf replacement, but I couldn't come up with a syntax I liked, and I didn't want to write a sprintf clone because that takes forever and is ugly. So I just said fuck it, removed string::printf (and with it the very last vestige of va_list in all of my code, good riddance), and updated the str* functions to take template arguments to specify padding length and character. Both optional, another fun C++0x only thing - default function template arguments. Before: string foo = string::printf("%.4x", variable); -- went through raw sprintf(), va_list, and had a limited 4k buffer After: string foo = strhex<4>(variable); -- manually built by hand, no buffer issues nall/utility.hpp got my own copies of std::move and std::forward. I have no problem using the std:: ones, but the <move> header seems to be missing, and I already have my own traits library, so that was easy enough for now. Added a move-semantic swap as well. Using nall::sort on an array of nall::string objects should be almost as fast as sorting integers now. The cheat code editor .. whenever you import into a new slot, or clear that slot, it will uncheck the box now as well. [No archive available] |
|
![]() |
f1d1ab7ed1 |
Update to bsnes v060r08 release.
This version embeds mightymo's cheats.xml inside the bsnes executable. It's about 1.3MB, but thankfully Qt compresses it heavily first, so the binary only grows by 100kb. BZip2 doesn't fare as well, surprisingly, and grows the source archive by 200kb. I think it's worth it. The cheat code editor window gets a new button, "Find Cheat Codes ..." If you click it, it will match the SHA256 of the currently loaded game to an entry in the database. No matches? It apologizes for letting you down. But if it finds some, and there's a good chance it will with ~1500 entries, it gives you a list of them. Check the codes you want and they are imported into the available slots. The way it works is the first checked code goes to the first empty slot, the second checked code to the second empty slot, and if there aren't any slots left available (very unlikely), it won't import them. It's incredible, actual innovation in the SNES scene. - no more web searching for codes - no more applying codes for the wrong revision, or the wrong country, or whatever - no more flat out broken codes - no more having to name the codes yourself - cheat grouping avoids the need to add and toggle multiple slots to get a single effect Anyone who likes this, please send a thank you PM to mightymo77 and tukuyomi. They deserve all the credit for the amazing database that makes this possible. Now then: **major caveat, for the love of god read this first!** My XML parser is ... brutal on this file. It has to allocate memory for each attribute and each element. And ... it rapes the ever loving SHIT out of malloc(). Oh my god. On my E8400, it takes a good 30 seconds to parse the 1.3MB database on Linux. And on Windows, holy god, it has a horrendous version of malloc. It takes at least 3-5 minutes. Seriously, go make yourself a cup of coffee if you are running Windows. I only have to parse the file one time per program run, and I only parse it when you click the find cheat codes button for the first time. But yes, it is painful. Very, very painful. [No archive available] |
|
![]() |
1934197fb7 |
Update to bsnes v060r07 release.
Feeling amazing tonight. The low of fighting a bad cold for the past week, blocked nose, bloody lips and wrist pain combined can't hold me down. Two years of searching and I finally found the Midnight Panic EP, and it's amazing. And from this WIP forward, bsnes now uses C++0x instead of C++03. I feel like I've been given this new amazing language, and there's all these wonderful new possibilities for cleaning up and simplifying code. foreach is the most amazing concept. The only reason I've made it this long without it is because I never got to use it. You will pry this one from my cold, dead hands. Already applied it to the cartridge and memory classes. It's insane. Before: for(unsigned i = 0; i < memory::wram.size(); i++) memory::wram[i] = config.cpu.wram_init_value; for(unsigned i = 0; i < cartridge.mapping.size(); i++) { Cartridge::Mapping &m = cartridge.mapping[i]; After: foreach(n, memory::wram) n = config.cpu.wram_init_value; foreach(m, cartridge.mapping) { Before: for(unsigned i = 0; i < 32; i++) { char value[4]; sprintf(value, "%.2x", shahash[i]); strcat(hash, value); } After: foreach(n, shahash) hash << string::printf("%.2x", n); And that's just the first thing! So many things I can do now. Can't wait to come up with uses for all the new features to simplify code even more. - auto type inheritance - variadic templates to nuke the last vestiges of va_list and its associated horrors - strongly typed enums (no more enum Mode { ModeOfRedundancyMode } shit. enum class Mode : unsigned { Normal, BSX }; - _real_ static assertions with actual error messages instead of 40 pages of template errors - default templates parameters to template functions (but still no function partial template specialization, grrr) - property class can be implemented natively without having to trick GCC into using template friend classes - rvalue references will allow my string class and such to implement move semantics, no more useless copying - uniform list initializers, lstring foo = { "a", "b", "c", ... }; And that's just what's there now, it's only half-way done. The completed support will be even more awesome: - lambda functions - nullptr - class variable initialization in the header instead of needing constructors - native functors to replace nall::function with - string literals in UTF-8 - native multi-threading support - and so much more [No archive available] |
|
![]() |
e1c8757a10 |
Update to bsnes v060r06 release.
Completely rewrote the syntax for all XML parsing, took over five hours of nonstop work, holy fuck. Sadly the expanded syntax greatly increases the parser complexity, the SNES::Cartridge class is twice as big now, XML parsing for all special chips takes up 20KB of space. Example: void Cartridge::xml_parse_sdd1(xml_element *root) { has_sdd1 = true; foreach_element(node, root) { if(node->name == "mcu") { foreach_element(leaf, node) { if(leaf->name == "map") { Mapping m((Memory&)sdd1); foreach_attribute(attr, leaf) { if(attr->name == "address") xml_parse_address(m, attr->content); } mapping.add(m); } } } else if(node->name == "mmio") { foreach_element(leaf, node) { if(leaf->name == "map") { Mapping m((MMIO&)sdd1); foreach_attribute(attr, leaf) { if(attr->name == "address") xml_parse_address(m, attr->content); } mapping.add(m); } } } } } Of course, C++ doesn't have foreach(), that'd be too goddamned convenient, right? So behold the spawn of satan himself: #define concat_(x, y) x ## y #define concat(x, y) concat_(x, y) #define foreach_element(iter, object) \ unsigned concat(counter, __LINE__) = 0; \ xml_element* iter; \ while(concat(counter, __LINE__) < object->element.size() \ && (iter = object->element[concat(counter, __LINE__)++]) != 0) #define foreach_attribute(iter, object) \ unsigned concat(counter, __LINE__) = 0; \ xml_attribute* iter; \ while(concat(counter, __LINE__) < object->attribute.size() \ && (iter = object->attribute[concat(counter, __LINE__)++]) != 0) [No archive available] |
|
![]() |
768e9b589d |
Update to bsnes v060r05 release.
Forgot the -lXext thing, saw it when posting. It'll be in r06. Updated the XML parser, will reject a lot more invalid stuff, and it'll parse comments, <? and CDATA stuff. I haven't seen PCDATA mentioned anywhere in the spec, so fuck that for now. Went back to using offset= for SPC7110 data ROM. Thinking about it more, using offset= allows you to put the data ROM anywhere in the file, even before the program ROM. size= forces it to go at the end no matter what. Now, ideally, you want to define both, but offset= should be more important. [No archive available] |
|
![]() |
582f17b330 |
Update to bsnes v060r04 release.
I wrote a dedicated XML parser for nall::string, and updated SNES::cartridge to use that instead of the ad-hoc implementation. It's still not W3C-quality with 100% standards-adherence, but it's at least an order of magnitude better now. The parser supports infinitely nested elements and attributes via pointers to child nodes, supports both single-tag <eg /> and tag-with content <eg>content</eg>, and properly handles and validates the <?xml?> header. It doesn't fully ignore comments yet, but you should be okay anyway. Whitespace culling, especially inside tags, still needs a bit of work. It will properly reject the entire document if there are unopened / unclosed tags now. All in all though, it's very small. Only 3KB for the whole parser. Usage example: void Cartridge::parse_xml_cartridge(const char *data) { xml_element *document = xml_parse(data); if(document == 0) return; for(unsigned i = 0; i < document->element.size(); i++) { xml_element *head = document->element[i]; if(head->name == "cartridge") { for(unsigned n = 0; n < head->attribute.size(); n++) { xml_attribute *attr = head->attribute[n]; if(attr->name == "region") { if(attr->content == "NTSC") region = NTSC; else if(attr->content == "PAL") region = PAL; } else if(attr->name == "ram") { ram_size = strhex(attr->content); } } for(unsigned n = 0; n < head->element.size(); n++) { xml_element *node = head->element[n]; if(node->name == "map") { parse_xml_map_tag(node); } } break; } } delete document; } Also updated DSP-3 and DSP-4 to separate ::DR and ::SR, SPC7110 uses size= for program ROM size calculation now (makes more sense than using offset=), added PCB info to BS-X, Sufami Turbo and Game Boy cartridges to give additional meta-data (SGB emulation will properly size RAM / RTC files again), and updated snesreader with these changes. And for better or worse, I made the vector classes copyable. Not actually used by anything at the moment. I wanted to do: struct xml_element { vector<xml_element> element; }; But obviously that causes an infinite recursion when the vector's copy constructor is called, hence why I had to use pointers. [No archive available] |
|
![]() |
23866a348d |
Update to bsnes v060r03 release.
Okay, this should get 100% compatibility back up again. All special chips map via XML, and I also support BS-X, ST and SGB games again. Only regression is that SGB currently forces on SRAM size to 128KB for each loaded game. I need to move that into snesreader, and hook it into the cartridge interface. Too much work to do it tonight, but in time ... Given the extensiveness of this, heavy testing appreciated. Let me know if you spot any broken titles please. [No archive available] |
|
![]() |
d0de306546 |
Update to bsnes v060r02 release.
This one is not for the faint of heart. All header detection code has been removed from the official bsnes binary. It can now only load games with a valid XML memory mapping file. If you have /path/to/zelda.sfc, then you also need /path/to/zelda.xml that describes how to load the cartridge. The 'ext' archive above contains a new version of snesreader, as well as its DLL. snesreader now contains header detection, as well as XML mapping generation. If you have snesreader, and no XML file, snesreader will create one for you. It won't store it on your hard disk, it'll only be in memory. An XML on the hard disk always overrides the snesreader's auto-generated XML file. So far, only normal ROMs, S-RTC, S-DD1 and SPC7110 games are up and running. Everything else is broken, I'll have to fix them one by one by extending the id= attributes in the XML parser. Here's some example XML files: <?xml version="1.0" encoding="UTF-8"?> <cartridge ram="2000"> <title>The Legend of Zelda - A Link to the Past</title> <pcb>SHVC-1A3M-30</pcb> <map mode="Linear" address="00-7f:8000-ffff" id="ROM"/> <map mode="Linear" address="70-7f:0000-7fff" id="RAM"/> <map mode="Linear" address="80-ff:8000-ffff" id="ROM"/> <map mode="Linear" address="f0-ff:0000-7fff" id="RAM"/> </cartridge> <?xml version="1.0" encoding="UTF-8"?> <cartridge region="NTSC" ram="2000"> <map mode="Direct" address="00-3f:4800-483f" id="SPC7110::MMIO"/> <map mode="Direct" address="80-bf:4800-483f" id="SPC7110::MMIO"/> <map mode="Direct" address="00-3f:4840-4842" id="SPC7110::RTC"/> <map mode="Direct" address="80-bf:4840-4842" id="SPC7110::RTC"/> <map mode="Linear" address="00:6000-7fff" id="SPC7110::RAM"/> <map mode="Linear" address="30:6000-7fff" id="SPC7110::RAM"/> <map mode="Shadow" address="00-0f:8000-ffff" id="ROM"/> <map mode="Shadow" address="80-8f:8000-ffff" id="ROM"/> <map mode="Direct" address="50:0000-ffff" id="SPC7110::DCU"/> <map mode="Linear" address="c0-cf:0000-ffff" id="ROM"/> <map mode="Direct" address="d0-ff:0000-ffff" id="SPC7110::MCU"/> </cartridge> [No archive available] |
|
![]() |
2af60d0a13 |
Update to bsnes v060r01 release.
This WIP fixes the S-PPU overflow issue mentioned by PiCiJi. It won't cause any difference in terms of accuracy, for reasons I explained earlier the effect was transparent, but it's good to do things the right way. It also adds a new ExSPC7110 memory mapping mode that allows for a 2MB program ROM. This is an absolute necessity for the Far East of Eden Zero translation. [No archive available] |
|
![]() |
a8263afc24 |
Update to bsnes v060 release.
This is a long-term stable release. A full changelog will be available at the forum link below later in the day. Also, please note that I have merged all of the various distributions into two packages. The Windows binary package now contains both the profile-optimized (fast) build, and the debugger build. The source code package now contains sources for bsnes, snesreader, snesfilter and supergameboy. Changelog: - added Direct3D HLSL pixel shader support [mudlord] - fixed a signal issue that caused loading games to take 1-2 seconds longer in v059 - 21fx API revised to its final form, S-MSU (public documentation pending) - worked around QTBUG-7188 to fix multi-file 7-zip file listbox to update when scrolling - added scale max - normal, wide, and wide zoom modes to fullscreen mode - added overscan cropping tool (needed for wide zoom mode; useful for developers simulating games on a real TV) - added "go up one folder" button to file load dialog - added group (un)assignment to the input settings window - now honors input.allowInvalidInput setting; defaults to false [Jonas Quinn] - cheat code editor grays out empty slots - cheat code editor adds "clear selected" button to quickly erase multiple cheat codes - to load folders as game images, folders must end in .sfc, .bs, .st, .gb now - debugger: added S-CPU (H)DMA registers; S-SMP registers; S-DSP registers to properties list - snesfilter: HQ2x filter is now multi-threaded (scales infinitely: the more cores you have, the less overhead required) - pixelshaders: added screen curvature shader to simulate curved CRT tubes - source: lots of code cleanup, as always |
|
![]() |
a9943ab4f4 |
Update to bsnes v059r07 release.
Fun WIP, lots of work put into this one. First, I added .st, .bs, .gb, .sgb, .gbc folder-based loading. Works the same as .sfc folders. So far, only .st shows additional preview info (just the ROM size for now), but the base code is in place to specialize .bs / .st / .(s)gb(c) cartridges next. Next, I added overscan configuration settings to the video settings window. The reason for this is twofold: 1. testing your translation / hack without a real TV, you can set overscan to 6% in all directions to ensure all the text is onscreen 2. for the smart video scale mode, noted below Now, when in fullscreen mode, you get three additional scale settings: Scale Max - Normal (keeps aspect ratio, maxes out height) Scale Max - Fill (fills as much as the screen as possible, no cropping) Scale Max - Smart (splits the crop and aspect ratio distortion, 50/50 on each; try it, it looks fairly decent in most titles) No scale max - zoom, because that's just too much cropping; almost nothing plays well with it Note that cropping doesn't work so great right now for games that mix lores and hires (Secret of Mana 2 textboxes, for instance.) I'm working on it, but it's going to be very tough. All filters take solid screen sizes quite well, which surprised me. Also, scale max - smart is for widescreen monitors. It makes zero sense to use it in portrait mode. I'll add some sort of special case, just in case anyone crazy tries it, in a future build. Lastly, I killed the separation of video.cpp and pixelshader.cpp, it's all inside video.cpp now; and I cleaned up the object names in video.cpp. Scale Max - Smart + Curvature pixel shader + NTSC filter - R/F + Scanlines - 70% is an incredible sight to behold. So much processing, yet still easy to get 60fps with perfectly synchronized video and audio. Add that with the Xbox 360 gamepad, throw in a nice S-MSU CD- quality soundtrack, and it's nirvana. Please try out the Scale Max - Smart mode if you are using a widescreen monitor and let me know what you think. [No archive available] |
|
![]() |
46a1eb8cce |
Update to bsnes v059r06 release.
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 |
|
![]() |
4517c0249f |
Update to bsnes v059r05 release.
Funny, much more effective changes but in a lot less time. The file dialog is just a major pain in the ass, I guess. Had to sit and think for at least two hours just to handle the differences between activate (double-click an item) and accept (click accept button.) Eg if it's a folder, double-clicking needs to go into the folder, but the accept button needs to use that folder. But files act differently, load has the open-folder thing that overrides the default entering of folders, and saving doesn't have any such concept at all. Fun fun fun, but done now. libqb (QbWindow, QbCheckAction, QbRadioAction) is dead; DiskBrowser is dead; HexEditor is dead. They've all been merged into nall/qt now. nall/Makefile-qt goes to the more logical nall/qt/Makefile. The last thing to do is export style sheet defaults into nall/qt to get the spacing of the new file dialog under control. Improved the save dialog, instead of putting the entire path in the box, it only puts the non-directory part, and pulls the directory from the file system mode's root path. I decided not to allow .. and / commands inside the save text box. I just strip all that out. Go to the damn folder you want to save in, sheesh. And before anyone complains about that, note that bsnes doesn't even use the save dialog mode :P Still have to hook up the new folder button to an actual dialog, haven't bothered yet. Since there's plenty of room with the extended width, I'm just going to leave them both visible. nall/qt/hex-editor is pretty much a direct port, no changes. But I intend to make the height programmable, and fork that into a stand- alone, super light-weight hex editor to replace bless (so that I can remove Mono.) Same for check-action and radio-action, direct ports. nall/qt/window is a bit different, binds the geometry outside the constructor. This fixes some issues where certain windows weren't saving their geometry properly, like the debugger properties window. And I think there's some other advantage to it not needing a complicated constructor, but I don't recall what at the moment. Modified GL_CLAMP_TO_EDGE to GL_CLAMP_TO_BORDER, so everyone can try out the curvature pixel shader now. Added it to my pixelshaders pack, but I haven't uploaded a new pack yet, so get it from the other thread for now. I mainly need testing on the new file dialog stuff. Please let me know if something strange is broken, other than the new folder button. |
|
![]() |
b538c13aad |
Update to bsnes v059r04 release.
Eight hours of non-stop work, for the sole purpose of trying to separate the file browser underlying mechanics from the bsnes-specific stuff. So far, it's going quite well. 95% of the functionality is there with only 25% of the code size. Forked the underlying stuff to nall/qt/file-dialog.moc.hpp, which is now designed to support open+save+folder selection natively. Save mode adds a text box to enter your own file name, and folder mode hides the filter drop-down and all files automatically. The top bar now spans 100% of the width. I like it more this way. I also killed the tree view in favor of a list view, for the sole reason that I really can't stand how when you go up a folder and the deeper tree is still open. Since the QFileSystemModel is asynchronous, I can't close the tree nodes when navigating up. The simplifications were needed because it was getting damned-near impossible to edit that mess of a file (diskbrowser.cpp.) Compare to filebrowser.cpp, much cleaner. Now I should be able to add open-folder concept for BS-X, ST and SGB games much easier. And of course, I should be able to offer the base QFileDialog as an option, too. After that, I'll probably export the hex editor to a generic class, and then export the Qb stuff (window geometry save/restore, stock check / radio menu buttons.) Also, I just wiped out Windows XP and put Windows 7 back, just to fix the video tearing issue relating to DWM and ... it works perfectly fine. Zero tearing, zero skipping, zero audio popping. All I did was start bsnes v059.04, set audio sync to the usual 31960, and it was just fine. What the hell are people complaining about, exactly? |
|
![]() |
d3d98f9f54 |
Update to bsnes v059r03 release.
For the emulator, I added some missing S-CPU variables to the properties viewer: all eight DMA channel registers, and $420b/DMA enable + $420c/HDMA enable. Should probably add the S-SMP timers in the future. Updated nall/Makefile-qt to take $(qtlibs) as input, eg qtlibs = "QtCore QtGui QtOpenGL" and it does the rest to generate $(qtlib) and $(qtinc) for you. Killed nall/Makefile::ifhas, as it was rather stupid. I tried to bind the CPU/SMP/PPU/DSP modules inside of SNES::System, but it turned out to be a major pain in the ass. I'll have to plan that a lot more before trying to do that. The ultimate goal would be having the entire emulator inside class SNES, so that you can instantiate multiple copies or whatever. I also updated snesfilter with a nice treat. Inspired by DOLLS' phosphor code, I added OpenMP support to the HQ2x filter. I have a dual core E8400 @ 3GHz. With no filtering, I get 177fps. With HQ2x, I get 123fps. With HQ2x+OpenMP, I get 143fps. Pegs both CPUs to 100%, heh. And other open applications will interfere with speed, eg Audacious drops it to 138fps. Not bad overall though. It should scale even higher on quad cores. And before anyone asks, no I can't add it to the NTSC filter. I'd have to talk to blargg about that, and it's already faster than HQ2x anyway. This is really more a test for things like HQ3x/HQ4x/Phosphor3x/Phosphor5x in the future. Also, it only works on Linux at the moment. Need libgomp and libpthread, which I don't have on Windows. ZSNES took the approach of putting the filter in another thread while the next frame is emulated; whereas bsnes forks off new threads when rendering is hit. I believe the latter is a better approach: it avoids a 16-20ms latency penalty, it's much simpler, and it can scale up to 240 cores (instead of being limited to two.) So yeah, I easily have the fastest, smallest, most definitive version of HQ2x possible right now; so long as you have a quad core :) [No archive available] |
|
![]() |
1d5e09ef07 |
Update to bsnes v059r02 release.
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 |
|
![]() |
97a3a28d86 |
Update to bsnes v059 release.
**Known issues:** - button menus do not show up with Windows Vista/7 theme - snesreader's multi-file archive dialog box doesn't redraw itself on Windows when you choose different games Windows Qt is buggy as always. Nothing we can do but keep waiting. I'm also going to hold off on including pixel shaders until Direct3D PS support is in. It's just going to annoy the 98% of users who can't use them if I include them now. Yes, Windows OpenGL support is that bad. Anyway, from v058 wip10, the following changes were made: - cheat code editor grays out the slot#s when they are empty. I can't put "Empty" in the text boxes for various reasons. - added "Clear Selected" button and multi-selection support to cheat editor. This is meant to quickly erase all slots. - settings and tools windows start at 600x360 when bsnes.cfg is not found / empty - fixed the emulationSpeed section to start with input. instead of config. - open-folder concept requires the folders to end in .sfc to work now, once again doesn't care what the ROM inside is named (this is meant to mimic OS X .app folders) - 21fx API extended to map to $2200, $2201 for now; mostly as a test for A-bus access (21fx->VRAM DMA, etc) (old $21fx registers remain for now) I intend to release this on Saturday as-is even if a few small bugs are reported. But if there's something major we can make another RC build. |
|
![]() |
6ec765f2c4 |
Update to bsnes v058 release.
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. |
|
![]() |
54c7b4692d |
Update to bsnes v057 release.
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. |
|
![]() |
66067f0015 |
Update to bsnes v056 release.
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 |
|
![]() |
4c66de6f27 |
Update to bsnes v055 release.
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 |
|
![]() |
6a17b5ed4f |
Update to bsnes v054 release.
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. |
|
![]() |
8135dfdac9 |
Update to bsnes v053 release.
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 |
|
![]() |
a0000c7846 |
Update to bsnes v052 release.
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 |
|
![]() |
b6a85353bf |
Update to bsnes v051 release.
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 |
|
![]() |
c2453cb634 |
Update to bsnes v050 release.
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. |
|
![]() |
59b86cd3a8 |
Update to bsnes v049 release.
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) |
|
![]() |
c26f9d912a |
Update to bsnes v048 release.
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 |
|
![]() |
7b0e484c18 |
Update to bsnes v047 release.
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. |
|
![]() |
f8e425ff49 |
Update to bsnes v046a release.
[No changelog available] |
|
![]() |
2a6a66f478 |
Update to bsnes v046 release.
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 |
|
![]() |
3c42e6caa0 |
Update to bsnes v045r09 release.
[No changelog available] |
|
![]() |
5f96547beb |
Update to bsnes v045 release.
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. |
|
![]() |
44b5f1bf27 |
Update to bsnes v044 release.
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 |