OpenMSX Git (2015/12/28) is complie. OpenMSX is an open source MSX emulator which is free according to the Debian Free Software Guidelines, available under the GNU General Public License.For copyright reasons the emulator cannot be distributed with original BIOS ROM images. OpenMSX includes C-BIOS a minimal implementation of the MSX BIOS, allowing to play quite some games without the need to have an original MSX BIOS ROM image. You can also use your own BIOS ROM image if you please.
OpenMSX Git Changelog:
* Fix #990 step_back gives Internal error: overshot destination on turboR
Manuel bisected this bug to commit cf0dff1. I read that commit a few times, but
it wasn't clear to me how that could cause this bug(*). In fact the whole
'after CALL/POP instruction' mechanism wasn't very clear to me, even though I
wrote it myself only a few months ago. That's a sign the code is too
complex/fragile, I hope to rectify that in this patch.
Before this patch we maintained two variables:
after: flags for the last executed instruction
afterNext: flags for the current instruction
After each instruction(**) 'afterNext' is copied to 'after' (hence the name).
And 'after' is cleared. If we're only interested in the current and last
instruction this mechanism works fine. Though with the R800 CALL+RET stuff
(commit cf0dff1) we need information about the last two instructions. We tried
to squeeze that in by doing the queries before the 'afterNext->after' copy.
This works but it took a while before I understood again what was going on.
This patch replaces the 'after' and 'afterNext' variables with a single 'prev'
variable. The lower 8 bits are for the current instruction, the next 8 bits for
the previous one, the next 8 for the 2nd-to-last instruction and so on. After
each instruction we shift this value over 8 bits (clearing the 8 lowest bits
comes for free). So the main advantage is that we now have direct access to the
2nd-to-last instruction without having to play tricks with the update order. I
hope this makes the code clear again.
(*) The bug was located in the savestate part of the patch. Before, because
savestates are only performed between two instructions, we only needed to
include 'after' in the savestate. But that's no longer true for CALL+RET
because that needs info about the last two instructions.
(**) We don't actually shift after every instruction, but only after
instructions in the slow CPU emulation path. See patch for more details.
Download: OpenMSX Git (2015/12/28) x86
Download: OpenMSX Git (2015/12/28) x64
Source: Here
0 Comments
Post a Comment