byuu says:
Changelog:
- md/vdp: added VIP bit to status register; fixes Cliffhanger
- processor/m68k/disassembler: added modes 7 and 8 to LEA address
disassembly
- processor/m68k/disassembler: enhanced ILLEGAL to display LINEA/LINEF
$xxx variants
- processor/m68k: ILLEGAL/LINEA/LINEF do not modify the stack
register; fixes Caeser no Yabou II
- icarus/sfc: request sgb1.boot.rom and sgb2.boot.rom separately; as
they are different
- icarus/sfc: removed support for external firmware when loading ROM
images
The hack to run Mega Drive Ballz 3D isn't in place, as I don't know if
it's correct, and the graphics were corrupted anyway.
The SGB boot ROM change is going to require updating the icarus database
as well. I will add that in when I start dumping more cartridges here
soon.
Finally ... I explained this already, but I'll do so here as well: I
removed icarus' support for loading SNES coprocessor firmware games with
external firmware files (eg dsp1.program.rom + dsp1.data.rom in the same
path as supermariokart.sfc, for example.)
I realize most are going to see this as an antagonizing/stubborn move
given the recent No-Intro discussion, and I won't deny that said thread
is why this came to the forefront of my mind. But on my word, I honestly
believe this was an ineffective solution for many reasons not related to
our disagreements:
1. No-Intro distributes SNES coprocessor firmware as a merged file, eg
"DSP1 (World).zip/DSP1 (World).bin" -- icarus can't possibly know
about every ROM distribution set's naming conventions for firmware.
(Right now, it appears GoodSNES and NSRT are mostly dead; but there
may be more DATs in the future -- including my own.)
2. Even if the user obtains the firmware and tries to rename it, it
won't work: icarus parses manifests generated by the heuristics
module and sees two ROM files: dsp1.program.rom and dsp1.data.rom.
icarus cannot identify a file named dsp1.rom as containing both
of these sub-files. Users are going to have to know how to split
files, which there is no way to do on stock Windows. Merging files,
however, can be done via `copy /b supermariokart.sfc+dsp1.rom
supermariokartdsp.sfc`; - and dsp1.rom can be named whatever now.
I am not saying this will be easy for the average user, but it's
easier than splitting files.
3. Separate firmware breaks icarus' database lookup. If you have
pilotwings.sfc but without firmware, icarus will not find a match
for it in the database lookup phase. It will then fall back on
heuristics. The heuristics will pick DSP1B for compatibility with
Ballz 3D which requires it. And so it will try to pull in the
wrong firmware, and the game's intro will not work correctly.
Furthermore, the database information will be unavailable, resulting
in inaccurate mirroring.
So for these reasons, I have removed said support. You must now load
SNES coprocessor games into higan in one of two ways: 1) game paks with
split files; or 2) SFC images with merged firmware.
If and when No-Intro deploys a method I can actually use, I give you all
my word I will give it a fair shot and if it's reasonable, I'll support
it in icarus.
byuu says:
Changelog:
- gba,ws: removed Thread::step() override¹
- processor/m68k: move.b (a7)+ and move.b (a7)- adjust a7 by two, not
by one²
- tomoko: created new initialize(Video,Audio,Input)Driver() functions³
- ruby/audio: split Audio::information into
Audio::available(Devices,Frequencies,Latencies,Channels)³
- ws: added Model::(WonderSwan,WonderSwanColor,SwanCrystal)()
functions for consistency with other cores
¹: this should hopefully fix GBA Pokemon Pinball. Thanks to
SuperMikeMan for pointing out the underlying cause.
²: this fixes A Ressaha de Ikou, Mega Bomberman, and probably more
games.
³: this is the big change: so there was a problem with WASAPI where
you might change your device under the audio settings panel. And your
new device may not support the frequency that your old device used. This
would end up not updating the frequency, and the pitch would be
distorted.
The old Audio::information() couldn't tell you what frequencies,
latencies, or channels were available for all devices simultaneously, so
I had to split them up. The new initializeAudioDriver() function
validates you have a correct driver, or it defaults to none. Then it
validates a correct device name, or it defaults to the first entry in
the list. Then it validates a correct frequency, or defaults to the
first in the list. Then finally it validates a correct latency, or
defaults to the first in the list.
In this way ... we have a clear path now with no API changes required to
select default devices, frequencies, latencies, channel counts: they
need to be the first items in their respective lists.
So, what we need to do now is go through and for every audio driver that
enumerates devices, we need to make sure the default device gets added
to the top of the list. I'm ... not really sure how to do this with most
drivers, so this is definitely going to take some time.
Also, when you change a device, initializeAudioDriver() is called again,
so if it's a bad device, it will disable the audio driver instead of
continuing to send samples at it and hoping that the driver blocked
those API calls when it failed to initialize properly.
Now then ... since it was a decently-sized API change, it's possible
I've broken compilation of the Linux drivers, so please report any
compilation errors so that I can fix them.
byuu says:
Changelog:
- emulator/random: new array function with more realistic RAM
initializations
- emulator/random: both low and high entropy register initializations
now use PCG
- gba/player: rumble will time out and disable after being left on for
500ms; fixes Pokemon Pinball issue
- ruby/input/udev: fixed rumble effects [ma\_rysia]
- sfc/system: default to low-entropy randomization of memory
The low-entropy memory randomization is modeled after one of my SHVC
2/1/3 systems. It generates striped patterns in memory, using random
inputs (biased to 0x00/0xff), and has a random chance of corrupting 1-2
bits of random values in the pool of memory (to prevent easy emulator
detection and to match observed results on hardware.)
The reasoning for using PCG on register initializations, is that I don't
believe they're going to have repeating patterns like RAM does anyway.
And register initializations are way more vital.
I want to have the new low-entropy RAM mode tested, so at least for the
next few WIPs, I've set the SNES randomization over to low-entropy.
We'll have to have a long discussion and decide whether we want official
releases to use high-entropy or low-entropy.
Also, I figured out the cause of the Prince of Persia distortion ... I
had the volume under the audio settings tab set to 200%. I didn't
realize there were SNES games that clipped so easily, given how
incredibly weak SNES audio is compared to every other sound source on my
PC. So with no entropy or low-entropy, indeed the game now sounds just
fine.
I can't actually test the udev fixes, so I guess we'll see how that goes
for Screwtape and ma\_rysia.
I made a change to ruby/input/joypad/udev.cpp while diagnosing a problem
with higan's rumble behaviour on Linux, and accidentally committed it
in 15b3dc8b0b as part of a documentation
change.
byuu says:
Changelog:
- higan/emulator: added new Random class with three entropy settings:
none, low, and high
- md/vdp: corrected Vcounter readout in interlace mode [MoD]
- sfc: updated core to use the new Random class; defaults to high
entropy
No entropy essentially returns 0, unless the random.bias(n) function is
called, in which case, it returns n. In this case, n is meant to be the
"logical/ideal" default value that maximizes compatibility with games.
Low entropy is a very simple entropy modeled after RAM initialization
striping patterns (eg 32 0x00s, followed by 32 0xFFs, repeating
throughout.) It doesn't "glitch" like real hardware does on rare
occasions (parts of the pattern being broken from time to time.) It also
only really returns 0 or ~0. So the entropy is indeed extremely low, and
not very useful at all for detecting bugs. Over time, we can try to
improve this, of course.
High entropy is PCG. This replaces the older, lower-entropy and more
predictable, LFSR. PCG should be more than enough for emulator
randomness, while still being quite fast.
Unfortunately, the bad news ... both no entropy and low entropy fix the
Konami logo popping sound in Prince of Persia, but all three entropy
settings still cause the distortion in-game, especially evident at the
title screen. So ... this may be a more serious bug than first
suspected.
The file was originally named `higan-config.md` because the dialog box
it described was called "higan Configuration", which was because the
menu-item to open it was in a menu called "Settings" and it would have
been weird to have a "Settings" item in a "Settings" menu.
Now there are individual menu-items for each tab in the Settings dialog,
none of which are named Settings, so the dialog has been renamed back to
"Settings", and the filename should match.
For Windows documentation, "folder" is the correct term. For generic
documentation, probably either would do but I suspect people are
slightly more likely to be familiar with "folder".
byuu says:
Changelog:
- md/vdp: added full interlace emulation [byuu, Sik, Eke, Mask of
Destiny]
- md/vdp: fix an issue with overscan/highlight when setting was
disabled [hex\_usr]
- md/vdp: serialize field, and all oam/objects state
- icarus/md: do not enable RAM unless header 0x1b0-1b1 == "RA"
[hex\_usr]
I really can't believe how difficult the interlace support was to add. I
must have tried a hundred combinations of adjusting Y, Vscroll, tile
addressing, heights, etc. Many of the changes were a wash that improved
some things, regressed others.
In the end I ended up needing input from three different people to
implement what should have been trivial. I don't know if the Mega Drive
is just that weird, if I've declined that much in skill since the days
when I implemented SNES interlace, or if I've just never been that good.
But either way, I'm disappointed in myself for not being able to figure
either this or shadow/highlight out on my own. Yet I'm extremely
grateful to my friends for helping carry me when I get stuck.
Since it wasn't ever documented before, I'm going to try and document
the changes necessary to implement interlace mode for any future
emudevs.
Also, some of the text in the higan and icarus settings docs wanted to
link to a discussion of why we ignore manifests by default; now we have
such a thing.
byuu says:
Changelog:
- md/vdp: backgrounds always update priority bit output [Cydrak]
- md/vdp: vcounter.d0 becomes vcounter.d8 in interlace mode 3
- md/vdp: return field number in interlace modes from status register
- md/vdp: rework scanline/frame counting in main loop so first frame
won't clock to field 1 instead of field 0
- md/vdp: add support for shadow/highlight mode; optimize to minimal
code [Cydrak]
- md/vdp: update outputPixel() to support interlace modes
- sfc/cpu: auto joypad polling start should clear the shift registers;
fixes Nuke (PD)
- thanks to BMF54123 for this bug report
- tomoko: if an invalid video/audio/input driver is found in the
configuration file, it's reset to "None"
- prevents showing the wrong driver under advanced settings; no
longer requires possibly two reboots to fix
Note: the Mega Drive interlace mode 1 should be working fully, but I
don't know any games that use it. Interlace mode 3 (Sonic 2's two-player
mode) does not work at all yet, but this is a good start.
Also, moved the "you should install the GBA BIOS" advice from the
install pages (where I doubt anybody would see it) to the "importing and
playing" guide, which I figure people are more likely to stumble across.
The actually instructions are still in `install/general.md` for lack of
anywhere more appropriate.
byuu says:
Changelog:
- gba/cpu: synchronize to the PPU, not oneself, when the CPU is
stopped
- this bug was patched in the official v104 release; but not in
the .tar.xz archive
- ms/vdp: backdrop color is on the second 16-entry palette, not the
first [hex\_usr]
- ms/vdp: fix background color 0 priority; fixes Alex Kidd in High
Tech World text boxes [hex\_usr]
- tomoko: choose first option when loading files via the command-line
[hex\_usr]
- icarus: lo/hi RAM addressing was backwards; M68K is big endian;
fixes save files in Sonic 3
Many thanks to hex\_usr for the Master System / Game Gear VDP fix.
That's a tricky system to get good technical information on. The fix
should be correct, but please report if you spot any regressions just in
case.
[As mentioned in the v104 internal release notes, byuu fixed a small typo in
the GBA core. -Ed.]
byuu says:
There are lots of improvements in this new release, both to core
emulation and to the user interface. However, some of these changes are
quite substantial, so regressions are a possibility. Please report any
regressions from v103 on the forums if found.
Note that Mega Drive save RAM files will not be compatible with v103,
but will now be compatible with save RAM files from all other Mega Drive
emulators, and the format will be stable going forward.
Also!! Thanks to the tireless work of Screwtape, the
Help->Documentation link in higan now takes you to a very comprehensive
user guide. Please be sure to consult this if you have any questions
about using higan.
Lastly, I've added a link to my Patreon page (https://patreon.com/byuu/)
to the higan downloads page. The money will go exclusively toward
purchasing SNES games for preservation, hardware and flash carts for
reverse engineering, equipment such as backup drives, etc. Donating is
entirely optional and comes with no rewards, but would of course be
greatly appreciated! ^^;
Changelog (since v103):
- nall/dsp: improved first-order IIR filtering
- Famicom: improved audio filtering (90hz lowpass + 440hz lowpass +
14khz highpass)
- Game Boy Advance: corrected bug in PSG wave channel emulation
[Cydrak]
- Mega Drive: added first-order 2.84KHz low-pass filter to match VA6
model hardware
- Mega Drive: lowered PSG volume relative to YM2612 to match VA6 model
hardware
- Mega Drive: Hblank flag is not always set during Vblank
- Mega Drive: fix PAL mode reporting from control port reads
- Famicom: improved phase duty cycle emulation (mode 3 is 25% phase
inverted; counter decrements)
- Mega Drive: reset does not cancel 68K bus requests
- Mega Drive: 68K is not granted bus access on Z80 reset
- Mega Drive: CTRL port is now read-write, maintains value across
controller changes
- Z80: IX, IY override mode can now be serialized in save states
- 68K: fixed calculations for ABCD, NBCD, SBCD [hex\_usr,
SuperMikeMan]
- SPC700: improved all cycle timings to match results observed by
Overload with a logic anaylzer
- Super Famicom: SMP uses a separate 4x8-bit buffer for $f4-f7; not
APU RAM [hex\_usr]
- Super Famicom: SMP TEST register is now finally 100% fully emulated
[byuu, AWJ]
- Game Boy Advance: DMA can run between CPU instruction cycles
- Game Boy Advance: added 2-cycle delay between DMA activation and
transfers
- higan: improved aspect ratio correction accuracy at higher video
scaling sizes
- higan: overscan masking will now actually crop the underlying video
instead of just blanking it
- Mega Drive: center video when overscan is disabled
- higan: added increment/decrement quick save slot hotkeys
- Game Boy Advance: fixed wave RAM nibble ordering (fixes audio in
Castlevania, Pocket NES)
- higan: added new adaptive windowed mode: resizes the window to the
current emulated system's size
- higan: added new integral scaling mode: resizes the window to fill
as much of the screen as possible
- higan: main window is now resizable and will automatically scale
contents based on user settings
- higan: fixed one-time blinking of the main window on startup caused
by focus stealing bug
- ruby: fixed major memory leak in Direct3D driver
- ruby: added fullscreen exclusive mode to Direct3D driver
- Super Famicom: corrected latching behavior of BGnHOFS PPU registers
- higan: all windows sans the main viewport can be dismissed with the
escape key now
- ruby: complete API rewrite; many audio drivers now support device
selection
- higan: output frequency can now be modified
- higan: configuration settings split to individual menu options for
faster access to individual pages
- ruby: improved WASAPI driver to event-driven model; more compatible
in exclusive mode now
- libco: fix compilation of sjlj and fiber targets [Screwtape]
- ruby: added YV12 and I420 support to X-Video driver
- Game Boy: added TAMA emulation (RTC emulation is not working yet)
[thanks to endrift for notes]
- Game Boy: correct data ordering of MMM01 ROMs (MMM01 ROMs will need
to be re-imported into higan)
- Game Boy: store MBC2 save RAM as 256-bytes instead of 512-bytes (RAM
is 4-bit; not 8-bit with padding)
- Game Boy: fixed a bug with RAM serialization in games without a
battery
- Mega Drive: fix CRAM reads (fixes Sonic Spinball) [hex\_usr]
- Game Boy: added rumble support to MBC5 games such as Pokemon Pinball
- Game Boy: added MBC7 emulation (accelerometer X-axis, EEPROM not
working yet) [thanks to endrift for notes]
- hiro: macOS compilation fixes and UI improvements [MerryMage,
ncbncb]
- Game Boy: added MBC6 emulation (no phone link or flash support;
timing bugs in game still)
- Game Boy: HDMA syncs to other components after each byte transfer
now
- Game Boy: disabling the LCD completely halts the PPU (fixes onscreen
graphical corruption in some games)
- Mega Drive: added 6-button Fighting Pad emulation [hex\_usr]
- 68K: TAS sets d7 when EA mode is a direct register (fixes Asterix
graphical corruption)
- Game Boy: STAT mode is forced to zero when LCD is disabled (fixes
Pokemon Pinball)
- LR35902: complete rewrite
- icarus: high-DPI is not supported on Windows yet; remove setting for
consistency with higan window sizes
- hiro: added full support for high-DPI displays on macOS [ncbncb]
- ARM7TDMI: complete rewrite
- Super Famicom: disabled channels during HDMA initialization appear
to set DoTransfer flag
- V30MZ: code cleanup
- Mega Drive: added optional TMSS emulation; disabled by default
[hex\_usr]
- ARM7TDMI: pipeline decode stage caches CPSR.T [MerryMage]
- ARM7TDMI: fixed timing of THUMB stack multiple instruction
[Cydrak]
- higan: detect when ruby drivers crash; disable drivers on next
startup to prevent crash loop
- Mega Drive: added automatic region detection (favors NTSC-J >
NTSC-U > PAL) [hex\_usr]
- Mega Drive: support 8-bit SRAM
- ARM7TDMI: PC should be incremented by 2 when setting CPSR.T via MSR
instruction [MerryMage]
- ruby: add Windows ASIO driver support (does not work on some systems
due to buggy vendor drivers)
- higan: default to safe drivers on a new install; due to instability
with some optimal drivers