2015-11-21 07:36:48 +00:00
|
|
|
auto PPU::vram_addr(uint16 addr) const -> uint {
|
2011-10-27 00:00:17 +00:00
|
|
|
return (status.vram_bank * 0x2000) + (addr & 0x1fff);
|
|
|
|
}
|
|
|
|
|
2015-11-21 07:36:48 +00:00
|
|
|
auto PPU::mmio_read(uint16 addr) -> uint8 {
|
Update to v097 release.
byuu says:
This release features improvements to all emulation cores, but most
substantially for the Game Boy core. All of blargg's test ROMs that pass
in gambatte now either pass in higan, or are off by 1-2 clocks (the
actual behaviors are fully emulated.) I consider the Game Boy core to
now be fairly accurate, but there's still more improvements to be had.
Also, what's sure to be a major feature for some: higan now has full
support for loading and playing ordinary ROM files, whether they have
copier headers, weird extensions, or are inside compressed archives. You
can load these games from the command-line, from the main Library menu
(via Load ROM Image), or via drag-and-drop on the main higan window. Of
course, fans of game folders and the library need not worry: that's
still there as well.
Also new, you can drop the (uncompressed) Game Boy Advance BIOS onto the
higan main window to install it into the correct location with the
correct file name.
Lastly, this release technically restores Mac OS X support. However,
it's still not very stable, so I have decided against releasing binaries
at this time. I'd rather not rush this and leave a bad first impression
for OS X users.
Changelog (since v096):
- higan: project source code hierarchy restructured; icarus directly
integrated
- higan: added software emulation of color-bleed, LCD-refresh,
scanlines, interlacing
- icarus: you can now load and import ROM files/archives from the main
higan menu
- NES: fixed manifest parsing for board mirroring and VRC pinouts
- SNES: fixed manifest for Star Ocean
- SNES: fixed manifest for Rockman X2,X3
- GB: enabling LCD restarts frame
- GB: emulated extra OAM STAT IRQ quirk required for GBVideoPlayer
(Shonumi)
- GB: VBK, BGPI, OBPI are readable
- GB: OAM DMA happens inside PPU core instead of CPU core
- GB: fixed APU length and sweep operations
- GB: emulated wave RAM quirks when accessing while channel is enabled
- GB: improved timings of several CPU opcodes (gekkio)
- GB: improved timings of OAM DMA refresh (gekkio)
- GB: CPU uses open collector logic; return 0xFF for unmapped memory
(gekkio)
- GBA: fixed sequencer enable flags; fixes audio in Zelda - Minish Cap
(Jonas Quinn)
- GBA: fixed disassembler masking error (Lioncash)
- hiro: Cocoa support added; higan can now be compiled on Mac OS X 10.7+
- nall: improved program path detection on Windows
- higan/Windows: moved configuration data from %appdata% to
%localappdata%
- higan/Linux,BSD: moved configuration data from ~/.config/higan to
~/.local/higan
2016-01-17 08:59:25 +00:00
|
|
|
if(addr >= 0x8000 && addr <= 0x9fff) {
|
|
|
|
return vram[vram_addr(addr)];
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr >= 0xfe00 && addr <= 0xfe9f) {
|
|
|
|
if(status.dma_active && status.dma_clock >= 8) return 0xff;
|
|
|
|
return oam[addr & 0xff];
|
|
|
|
}
|
2010-12-29 11:03:42 +00:00
|
|
|
|
2010-12-30 07:18:47 +00:00
|
|
|
if(addr == 0xff40) { //LCDC
|
|
|
|
return (status.display_enable << 7)
|
|
|
|
| (status.window_tilemap_select << 6)
|
|
|
|
| (status.window_display_enable << 5)
|
|
|
|
| (status.bg_tiledata_select << 4)
|
|
|
|
| (status.bg_tilemap_select << 3)
|
2011-10-28 09:51:43 +00:00
|
|
|
| (status.ob_size << 2)
|
|
|
|
| (status.ob_enable << 1)
|
2011-01-02 04:46:54 +00:00
|
|
|
| (status.bg_enable << 0);
|
2010-12-30 07:18:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff41) { //STAT
|
|
|
|
return (status.interrupt_lyc << 6)
|
|
|
|
| (status.interrupt_oam << 5)
|
|
|
|
| (status.interrupt_vblank << 4)
|
|
|
|
| (status.interrupt_hblank << 3)
|
2011-01-02 04:46:54 +00:00
|
|
|
| ((status.ly == status.lyc) << 2)
|
2016-06-05 05:03:21 +00:00
|
|
|
| (status.mode << 0);
|
2010-12-30 07:18:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff42) { //SCY
|
|
|
|
return status.scy;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff43) { //SCX
|
|
|
|
return status.scx;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff44) { //LY
|
2010-12-29 11:03:42 +00:00
|
|
|
return status.ly;
|
|
|
|
}
|
|
|
|
|
2010-12-30 07:18:47 +00:00
|
|
|
if(addr == 0xff45) { //LYC
|
|
|
|
return status.lyc;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff47) { //BGP
|
2011-10-27 00:00:17 +00:00
|
|
|
return (bgp[3] << 6)
|
|
|
|
| (bgp[2] << 4)
|
|
|
|
| (bgp[1] << 2)
|
|
|
|
| (bgp[0] << 0);
|
2010-12-30 07:18:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff48) { //OBP0
|
2011-10-27 00:00:17 +00:00
|
|
|
return (obp[0][3] << 6)
|
|
|
|
| (obp[0][2] << 4)
|
|
|
|
| (obp[0][1] << 2)
|
|
|
|
| (obp[0][0] << 0);
|
2010-12-30 07:18:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff49) { //OBP1
|
2011-10-27 00:00:17 +00:00
|
|
|
return (obp[1][3] << 6)
|
|
|
|
| (obp[1][2] << 4)
|
|
|
|
| (obp[1][1] << 2)
|
|
|
|
| (obp[1][0] << 0);
|
2010-12-30 07:18:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff4a) { //WY
|
|
|
|
return status.wy;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff4b) { //WX
|
|
|
|
return status.wx;
|
|
|
|
}
|
|
|
|
|
2016-01-12 11:08:34 +00:00
|
|
|
if(addr == 0xff4f) { //VBK
|
|
|
|
return status.vram_bank;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff68) { //BGPI
|
|
|
|
return status.bgpi_increment << 7 | status.bgpi;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff69) { //BGPD
|
2011-10-27 00:00:17 +00:00
|
|
|
return bgpd[status.bgpi];
|
|
|
|
}
|
|
|
|
|
2016-01-12 11:08:34 +00:00
|
|
|
if(addr == 0xff6a) { //OBPI
|
|
|
|
return status.obpi_increment << 7 | status.obpi;
|
|
|
|
}
|
|
|
|
|
2011-10-27 00:00:17 +00:00
|
|
|
if(addr == 0xff6b) { //OBPD
|
|
|
|
return obpd[status.obpi];
|
|
|
|
}
|
|
|
|
|
2016-01-12 11:08:34 +00:00
|
|
|
return 0xff; //should never occur
|
2010-12-29 11:03:42 +00:00
|
|
|
}
|
|
|
|
|
2015-11-21 07:36:48 +00:00
|
|
|
auto PPU::mmio_write(uint16 addr, uint8 data) -> void {
|
Update to v097 release.
byuu says:
This release features improvements to all emulation cores, but most
substantially for the Game Boy core. All of blargg's test ROMs that pass
in gambatte now either pass in higan, or are off by 1-2 clocks (the
actual behaviors are fully emulated.) I consider the Game Boy core to
now be fairly accurate, but there's still more improvements to be had.
Also, what's sure to be a major feature for some: higan now has full
support for loading and playing ordinary ROM files, whether they have
copier headers, weird extensions, or are inside compressed archives. You
can load these games from the command-line, from the main Library menu
(via Load ROM Image), or via drag-and-drop on the main higan window. Of
course, fans of game folders and the library need not worry: that's
still there as well.
Also new, you can drop the (uncompressed) Game Boy Advance BIOS onto the
higan main window to install it into the correct location with the
correct file name.
Lastly, this release technically restores Mac OS X support. However,
it's still not very stable, so I have decided against releasing binaries
at this time. I'd rather not rush this and leave a bad first impression
for OS X users.
Changelog (since v096):
- higan: project source code hierarchy restructured; icarus directly
integrated
- higan: added software emulation of color-bleed, LCD-refresh,
scanlines, interlacing
- icarus: you can now load and import ROM files/archives from the main
higan menu
- NES: fixed manifest parsing for board mirroring and VRC pinouts
- SNES: fixed manifest for Star Ocean
- SNES: fixed manifest for Rockman X2,X3
- GB: enabling LCD restarts frame
- GB: emulated extra OAM STAT IRQ quirk required for GBVideoPlayer
(Shonumi)
- GB: VBK, BGPI, OBPI are readable
- GB: OAM DMA happens inside PPU core instead of CPU core
- GB: fixed APU length and sweep operations
- GB: emulated wave RAM quirks when accessing while channel is enabled
- GB: improved timings of several CPU opcodes (gekkio)
- GB: improved timings of OAM DMA refresh (gekkio)
- GB: CPU uses open collector logic; return 0xFF for unmapped memory
(gekkio)
- GBA: fixed sequencer enable flags; fixes audio in Zelda - Minish Cap
(Jonas Quinn)
- GBA: fixed disassembler masking error (Lioncash)
- hiro: Cocoa support added; higan can now be compiled on Mac OS X 10.7+
- nall: improved program path detection on Windows
- higan/Windows: moved configuration data from %appdata% to
%localappdata%
- higan/Linux,BSD: moved configuration data from ~/.config/higan to
~/.local/higan
2016-01-17 08:59:25 +00:00
|
|
|
if(addr >= 0x8000 && addr <= 0x9fff) {
|
|
|
|
vram[vram_addr(addr)] = data;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr >= 0xfe00 && addr <= 0xfe9f) {
|
|
|
|
if(status.dma_active && status.dma_clock >= 8) return;
|
|
|
|
oam[addr & 0xff] = data;
|
|
|
|
return;
|
|
|
|
}
|
2010-12-29 11:03:42 +00:00
|
|
|
|
2010-12-30 07:18:47 +00:00
|
|
|
if(addr == 0xff40) { //LCDC
|
2011-08-19 11:36:26 +00:00
|
|
|
if(status.display_enable == false && (data & 0x80)) {
|
2016-01-12 11:08:34 +00:00
|
|
|
status.ly = 0;
|
|
|
|
status.lx = 0;
|
|
|
|
|
|
|
|
//restart cothread to begin new frame
|
|
|
|
auto clock = this->clock;
|
2016-02-09 11:51:12 +00:00
|
|
|
create(Enter, 4 * 1024 * 1024);
|
2016-01-12 11:08:34 +00:00
|
|
|
this->clock = clock;
|
2011-08-19 11:36:26 +00:00
|
|
|
}
|
|
|
|
|
2010-12-30 07:18:47 +00:00
|
|
|
status.display_enable = data & 0x80;
|
|
|
|
status.window_tilemap_select = data & 0x40;
|
|
|
|
status.window_display_enable = data & 0x20;
|
|
|
|
status.bg_tiledata_select = data & 0x10;
|
|
|
|
status.bg_tilemap_select = data & 0x08;
|
2011-10-28 09:51:43 +00:00
|
|
|
status.ob_size = data & 0x04;
|
|
|
|
status.ob_enable = data & 0x02;
|
2011-01-02 04:46:54 +00:00
|
|
|
status.bg_enable = data & 0x01;
|
2010-12-30 07:18:47 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff41) { //STAT
|
|
|
|
status.interrupt_lyc = data & 0x40;
|
|
|
|
status.interrupt_oam = data & 0x20;
|
|
|
|
status.interrupt_vblank = data & 0x10;
|
|
|
|
status.interrupt_hblank = data & 0x08;
|
2016-06-07 11:55:03 +00:00
|
|
|
|
Update to v099 release.
byuu says:
Time for a new release. There are a few important emulation improvements
and a few new features; but for the most part, this release focuses on
major code refactoring, the details of which I will mostly spare you.
The major change is that, as of v099, the SNES balanced and performance
cores have been removed from higan. Basically, in addition to my five
other emulation cores, these were too much of a burden to maintain. And
they've come along as far as I was able to develop them. If you need to
use these cores, please use these two from the v098 release.
I'm very well aware that ~80% of the people using higan for SNES
emulation were using the two removed profiles. But they simply had
to go. Hopefully in the future, we can compensate for their loss by
increasing the performance of the accuracy core.
Changelog (since v098):
SFC: balanced profile removed
SFC: performance profile removed
SFC: expansion port devices can now be changed during gameplay (atlhough
you shouldn't)
SFC: fixed bug in SharpRTC leap year calculations
SFC: emulated new research findings for the S-DD1 coprocessor
SFC: fixed CPU emulation-mode wrapping bug with pei, [dp], [dp]+y
instructions [AWJ]
SFC: fixed Super Game Boy bug that caused the bottom tile-row to flicker
in games
GB: added MBC1M (multi-cart) mapper; icarus can't detect these so manual
manifests are needed for now
GB: corrected return value when HuC3 unmapped RAM is read; fixes Robopon
[endrift]
GB: improved STAT IRQ emulation; fixes Altered Space, etc [endrift,
gekkio]
GB: partial emulation of DMG STAT write IRQ bug; fixes Legend of Zerd,
Road Rash, etc
nall: execute() fix, for some Linux platforms that had trouble detecting
icarus
nall: new BitField class; which allows for simplifying flag/register
emulation in various cores
ruby: added Windows WASAPI audio driver (experimental)
ruby: remove attempts to call glSwapIntervalEXT (fixes crashing on some
Linux systems)
ui: timing settings panel removed
video: restored saturation, gamma, luminance settings
video: added new post-emulation sprite system; light gun cursors are
now higher-resolution
audio: new resampler (6th-order Butterworth biquad IIR); quite a bit
faster than the old one
audio: added optional basic reverb filter (for fun)
higan: refresh video outside cooperative threads (workaround for shoddy
code in AMD graphics drivers)
higan: individual emulation cores no longer have unique names
higan: really substantial code refactoring; 43% reduction in binary size
Off the bat, here are the known bugs:
hiro/Windows: focus stealing bug on startup. Needs to be fixed in hiro,
not with a cheap hack to tomoko.
higan/SFC: some of the coprocessors are saving some volatile memory to
disk. Completely harmless, but still needs to be fixed.
ruby/WASAPI: some sound cards have a lot of issues with the current driver
(eg FitzRoy's). We need to find a clean way to fix this before it
can be made the default driver. Which would be a huge win because
the latency improvements are substantial, and in exclusive mode,
WASAPI allows G-sync to work very well.
[From the v099 WIP thread, here's the changelog since v098r19:
- GB: don't force mode 1 during force-blank; fixes v098r16 regression
with many Game Boy games
- GB: only perform the STAT write IRQ bug during vblank, not hblank
(still not hardware accurate, though)
-Ed.]
2016-06-11 01:13:18 +00:00
|
|
|
//hardware bug: writes to STAT on DMG,SGB during vblank triggers STAT IRQ
|
|
|
|
//note: this behavior isn't entirely correct; more research is needed ...
|
|
|
|
if(!system.cgb() && status.mode == 1) {
|
2016-06-07 11:55:03 +00:00
|
|
|
cpu.raise(CPU::Interrupt::Stat);
|
|
|
|
}
|
|
|
|
|
2010-12-30 07:18:47 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff42) { //SCY
|
|
|
|
status.scy = data;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff43) { //SCX
|
|
|
|
status.scx = data;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff44) { //LY
|
2010-12-29 11:03:42 +00:00
|
|
|
status.ly = 0;
|
|
|
|
return;
|
|
|
|
}
|
2010-12-30 07:18:47 +00:00
|
|
|
|
|
|
|
if(addr == 0xff45) { //LYC
|
|
|
|
status.lyc = data;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
Update to v097 release.
byuu says:
This release features improvements to all emulation cores, but most
substantially for the Game Boy core. All of blargg's test ROMs that pass
in gambatte now either pass in higan, or are off by 1-2 clocks (the
actual behaviors are fully emulated.) I consider the Game Boy core to
now be fairly accurate, but there's still more improvements to be had.
Also, what's sure to be a major feature for some: higan now has full
support for loading and playing ordinary ROM files, whether they have
copier headers, weird extensions, or are inside compressed archives. You
can load these games from the command-line, from the main Library menu
(via Load ROM Image), or via drag-and-drop on the main higan window. Of
course, fans of game folders and the library need not worry: that's
still there as well.
Also new, you can drop the (uncompressed) Game Boy Advance BIOS onto the
higan main window to install it into the correct location with the
correct file name.
Lastly, this release technically restores Mac OS X support. However,
it's still not very stable, so I have decided against releasing binaries
at this time. I'd rather not rush this and leave a bad first impression
for OS X users.
Changelog (since v096):
- higan: project source code hierarchy restructured; icarus directly
integrated
- higan: added software emulation of color-bleed, LCD-refresh,
scanlines, interlacing
- icarus: you can now load and import ROM files/archives from the main
higan menu
- NES: fixed manifest parsing for board mirroring and VRC pinouts
- SNES: fixed manifest for Star Ocean
- SNES: fixed manifest for Rockman X2,X3
- GB: enabling LCD restarts frame
- GB: emulated extra OAM STAT IRQ quirk required for GBVideoPlayer
(Shonumi)
- GB: VBK, BGPI, OBPI are readable
- GB: OAM DMA happens inside PPU core instead of CPU core
- GB: fixed APU length and sweep operations
- GB: emulated wave RAM quirks when accessing while channel is enabled
- GB: improved timings of several CPU opcodes (gekkio)
- GB: improved timings of OAM DMA refresh (gekkio)
- GB: CPU uses open collector logic; return 0xFF for unmapped memory
(gekkio)
- GBA: fixed sequencer enable flags; fixes audio in Zelda - Minish Cap
(Jonas Quinn)
- GBA: fixed disassembler masking error (Lioncash)
- hiro: Cocoa support added; higan can now be compiled on Mac OS X 10.7+
- nall: improved program path detection on Windows
- higan/Windows: moved configuration data from %appdata% to
%localappdata%
- higan/Linux,BSD: moved configuration data from ~/.config/higan to
~/.local/higan
2016-01-17 08:59:25 +00:00
|
|
|
if(addr == 0xff46) { //DMA
|
|
|
|
status.dma_active = true;
|
|
|
|
status.dma_clock = 0;
|
|
|
|
status.dma_bank = data;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2010-12-30 07:18:47 +00:00
|
|
|
if(addr == 0xff47) { //BGP
|
2011-10-27 00:00:17 +00:00
|
|
|
bgp[3] = (data >> 6) & 3;
|
|
|
|
bgp[2] = (data >> 4) & 3;
|
|
|
|
bgp[1] = (data >> 2) & 3;
|
|
|
|
bgp[0] = (data >> 0) & 3;
|
2010-12-30 07:18:47 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff48) { //OBP0
|
2011-10-27 00:00:17 +00:00
|
|
|
obp[0][3] = (data >> 6) & 3;
|
|
|
|
obp[0][2] = (data >> 4) & 3;
|
|
|
|
obp[0][1] = (data >> 2) & 3;
|
|
|
|
obp[0][0] = (data >> 0) & 3;
|
2010-12-30 07:18:47 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff49) { //OBP1
|
2011-10-27 00:00:17 +00:00
|
|
|
obp[1][3] = (data >> 6) & 3;
|
|
|
|
obp[1][2] = (data >> 4) & 3;
|
|
|
|
obp[1][1] = (data >> 2) & 3;
|
|
|
|
obp[1][0] = (data >> 0) & 3;
|
2010-12-30 07:18:47 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff4a) { //WY
|
|
|
|
status.wy = data;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff4b) { //WX
|
|
|
|
status.wx = data;
|
|
|
|
return;
|
|
|
|
}
|
2011-10-27 00:00:17 +00:00
|
|
|
|
|
|
|
if(addr == 0xff4f) { //VBK
|
|
|
|
status.vram_bank = data & 1;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff68) { //BGPI
|
|
|
|
status.bgpi_increment = data & 0x80;
|
|
|
|
status.bgpi = data & 0x3f;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff69) { //BGPD
|
|
|
|
bgpd[status.bgpi] = data;
|
|
|
|
if(status.bgpi_increment) status.bgpi++;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff6a) { //OBPI
|
|
|
|
status.obpi_increment = data & 0x80;
|
|
|
|
status.obpi = data & 0x3f;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(addr == 0xff6b) { //OBPD
|
|
|
|
obpd[status.obpi] = data;
|
|
|
|
if(status.obpi_increment) status.obpi++;
|
|
|
|
}
|
2010-12-29 11:03:42 +00:00
|
|
|
}
|