2017-09-26

Dolphin Git 5.0-5581

EmuCR: DolphinDolphin Git 5.0-5581 is compiled. This is the trunk of Dolphin Project. Dolphin is the first Gamecube emulator able to run commercial games! Dolphin is a Gamecube, Wii and Triforce (the arcade machine based on the Gamecube) emulator which supports many extra features and abilities not present on the original consoles. It has a partial Wii support and plays most Gamecube games.

Dolphin Git changelog:
* Merge pull request #6081 from ligfx/graphicsuseconfigchanged
Qt: bold graphics settings on ConfigChanged, not EmulationStateChanged
* Qt: bold graphics settings on ConfigChanged, not EmulationStateChanged
EmulationStateChanged is functionally correct right now, but
ConfigChanged expresses more semantically why the config setting gets
re-read and the widgets updated.
* Qt: add ConfigChanged signal to Settings
* Merge pull request #6077 from leoetlino/dsp-fixes
Small DSP accelerator fixes
* DSP: Fix a missing mask for the predscale register
* UnitTests: Add DSP accelerator tests
Includes DSP accelerator tests for basic behaviour, and everything
that was fixed by the PR.
* DSP: Handle two accelerator loop edge cases properly
There are two special cases that the DSP accelerator handles in a
special way: when the end address is of the form xxxxxxx0 or
xxxxxxx1.
For these two cases, the normal overflow handling doesn't apply.
Instead, the overflow check is different, the ACCOV exception never
fires at all, the predscale register is not updated, reads are not
suspended, and if the end address is 16-byte aligned, the DSP loops
back to start_address + 1 instead of the regular start_address.
* DSP: Fix ACCOV not suspending accelerator reads
When an ACCOV is triggered, the accelerator stops reading back anything
and updating the current address until the YN2 register is set.
This is kept track of internally by the DSP; this state is not exposed
via any register.
However, we need to emulate this behaviour correctly because some
ucodes rely on it (notably AX GC); failure to emulate it will result
in reading past the end and start address for non-looped voices.
* DSP: Fix the predscale update logic
When the current address is xxxxxxxf, after doing the standard ADPCM
decoding and incrementing the current address as usual to get the
next address, the DSP will update the predscale register by reading
2 bytes from memory, and add two to get the next address.
This means xxxxxx10 cannot be a current address, as the DSP goes
from 0f to 12 directly.
A more serious issue with the old code is that if the start address
is 16-byte aligned, some samples will always be skipped, even when
that should not be the case.
An easy way to test whether this behaviour is correct is to check
the current address register and the predscale after each read.
Old code:
...
ACCA=00000002, predscale=
ACCA=00000003, predscale=
...
ACCA=0000000f, predscale=
ACCA=00000010, predscale=
ACCA=00000013, predscale=
ACCA=00000014, predscale=
...
New code (and console):
...
ACCA=00000002, predscale=
ACCA=00000003, predscale=
...
ACCA=0000000f, predscale=
ACCA=00000012, predscale=
ACCA=00000013, predscale=
...
* DSP: Convert accelerator to a C++ class
Slightly cleaner, allows DSP accelerator behaviour to be
added to both HLE and LLE pretty easily, and makes the accelerator
easier to unit test.
I chose to include all accelerator state as private members, and
to expose state that is accessible via registers with getters/setters.
It's more verbose, yes, but it makes it very clear what is part of
the accelerator state and what isn't (e.g. coefs).
This works quite well for registers, since the accelerator can do
whatever it wants internally. For example, the start/end/current
addresses are masked -- having a getter/setter makes it easier to
enforce the mask.
* DSP: Fix gdsp_ifx_write to take a u16 value
And change the JIT to clear the upper 16 bits when calling the write
function to work around bugs in some compilers like clang.
* DSPSpy: Add a test for accelerator loop
This adds a test ucode that can be used to check the accelerator loop
behaviour with various start/end addresses.
It's actually more of a test template than a ready to use test.
* DSPSpy: Print ACCOV mails
* DSPSpy/Base: Handle ACCOV exceptions
This allows dspspy to show that an ACCOV happened, and to resume
accelerator reads after an ACCOV (by refreshing the YN2 register).
* DSPSpy/Base: Clean up trailing whitespace

Download: Dolphin Git 5.0-5581 x64
Download: Dolphin Git 5.0-5581 Android
Source: HereDolphin Git 5.0-2877

0 Comments

Post a Comment