2012-04-29 06:16:44 +00:00
|
|
|
#include <fc/fc.hpp>
|
2011-09-12 10:30:44 +00:00
|
|
|
|
2012-04-26 10:51:13 +00:00
|
|
|
namespace Famicom {
|
2011-09-12 10:30:44 +00:00
|
|
|
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
#include "envelope.cpp"
|
|
|
|
#include "sweep.cpp"
|
|
|
|
#include "pulse.cpp"
|
|
|
|
#include "triangle.cpp"
|
|
|
|
#include "noise.cpp"
|
|
|
|
#include "dmc.cpp"
|
2011-09-23 11:13:57 +00:00
|
|
|
#include "serialization.cpp"
|
2011-09-12 10:30:44 +00:00
|
|
|
APU apu;
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
APU::APU() {
|
|
|
|
for(uint amp : range(32)) {
|
|
|
|
if(amp == 0) {
|
|
|
|
pulse_dac[amp] = 0;
|
|
|
|
} else {
|
|
|
|
pulse_dac[amp] = 16384.0 * 95.88 / (8128.0 / amp + 100.0);
|
|
|
|
}
|
|
|
|
}
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
for(uint dmc_amp : range(128)) {
|
|
|
|
for(uint triangle_amp : range(16)) {
|
|
|
|
for(uint noise_amp : range(16)) {
|
|
|
|
if(dmc_amp == 0 && triangle_amp == 0 && noise_amp == 0) {
|
|
|
|
dmc_triangle_noise_dac[dmc_amp][triangle_amp][noise_amp] = 0;
|
|
|
|
} else {
|
|
|
|
dmc_triangle_noise_dac[dmc_amp][triangle_amp][noise_amp]
|
|
|
|
= 16384.0 * 159.79 / (100.0 + 1.0 / (triangle_amp / 8227.0 + noise_amp / 12241.0 + dmc_amp / 22638.0));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::Main() -> void {
|
2011-09-12 10:30:44 +00:00
|
|
|
apu.main();
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::main() -> void {
|
2011-09-12 10:30:44 +00:00
|
|
|
while(true) {
|
2011-09-23 11:13:57 +00:00
|
|
|
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
|
|
|
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
uint pulse_output, triangle_output, noise_output, dmc_output;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse_output = pulse[0].clock();
|
|
|
|
pulse_output += pulse[1].clock();
|
2011-09-15 12:33:26 +00:00
|
|
|
triangle_output = triangle.clock();
|
|
|
|
noise_output = noise.clock();
|
|
|
|
dmc_output = dmc.clock();
|
|
|
|
|
|
|
|
clock_frame_counter_divider();
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
int output = pulse_dac[pulse_output] + dmc_triangle_noise_dac[dmc_output][triangle_output][noise_output];
|
2011-09-26 11:38:57 +00:00
|
|
|
|
|
|
|
output = filter.run_hipass_strong(output);
|
|
|
|
output += cartridge_sample;
|
|
|
|
output = filter.run_hipass_weak(output);
|
|
|
|
//output = filter.run_lopass(output);
|
|
|
|
output = sclamp<16>(output);
|
|
|
|
|
Update to v088r08 release.
byuu says:
From this WIP, I'm starting on the impossible task of
a declarative-based GUI, which I'm calling Ethos.
base/ becomes emulator/, and we add emulator/interface.hpp, which is
a base API that all emulation cores must implement in full.
(Right now, it's kind of a hybrid to work with the old GUI and the new
GUI at the same time, of course.)
Unlike the old interfaces, the new base class also provides all general
usability hooks: loading and saving files and states, cheat codes, etc.
The new interface also contains information and vector structs to
describe all possible loading methods, controller bindings, etc; and
gives names for them all.
The actual GUI in fact should not include eg <gba/gba.hpp> anymore.
Should speed up GUI compilation.
So the idea going forward is that ethos will build a list of emulators
right when the application starts up.
Once you've appended an emulator to that list, you're done. No more GUI
changes are needed to support that system.
The GUI will have code to parse the emulator interfaces list, and build
all the requisite GUI options dynamically, declarative style.
Ultimately, once the project is finished, the new GUI should look ~99%
identical to the current GUI. But it'll probably be a whole lot smaller.
2012-04-29 06:29:54 +00:00
|
|
|
interface->audioSample(output, output);
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
tick();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::tick() -> void {
|
2011-09-12 10:30:44 +00:00
|
|
|
clock += 12;
|
2011-09-23 11:13:57 +00:00
|
|
|
if(clock >= 0 && scheduler.sync != Scheduler::SynchronizeMode::All) co_switch(cpu.thread);
|
2011-09-12 10:30:44 +00:00
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::set_irq_line() -> void {
|
2011-09-16 11:44:07 +00:00
|
|
|
cpu.set_irq_apu_line(frame.irq_pending || dmc.irq_pending);
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::set_sample(int16 sample) -> void {
|
2011-09-26 11:27:06 +00:00
|
|
|
cartridge_sample = sample;
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::power() -> void {
|
2011-09-26 11:38:57 +00:00
|
|
|
filter.hipass_strong = 0;
|
|
|
|
filter.hipass_weak = 0;
|
|
|
|
filter.lopass = 0;
|
|
|
|
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[0].power();
|
|
|
|
pulse[1].power();
|
|
|
|
triangle.power();
|
|
|
|
noise.power();
|
|
|
|
dmc.power();
|
2011-09-12 10:30:44 +00:00
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::reset() -> void {
|
2012-03-23 10:43:39 +00:00
|
|
|
create(APU::Main, 21477272);
|
2011-09-15 12:33:26 +00:00
|
|
|
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[0].reset();
|
|
|
|
pulse[1].reset();
|
|
|
|
triangle.reset();
|
|
|
|
noise.reset();
|
|
|
|
dmc.reset();
|
2011-09-16 11:44:07 +00:00
|
|
|
|
|
|
|
frame.irq_pending = 0;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
|
|
|
frame.mode = 0;
|
|
|
|
frame.counter = 0;
|
|
|
|
frame.divider = 1;
|
|
|
|
|
|
|
|
enabled_channels = 0;
|
2011-09-26 11:27:06 +00:00
|
|
|
cartridge_sample = 0;
|
|
|
|
|
Update to v082r16 release.
byuu says:
Binary output is once again called bsnes. No versioning on the title
without a system cartridge loaded. Still saving config files to
.config/batch for now.
Finally fixed NES APU frame IRQ clearing on $4015 reads.
Added mouse button/axis binding through buttons on the input capture
window.
Added advanced settings window with driver selection and focus policy
settings. Will show your default driver properly if none are selected
now, unlike old bsnes.
That exposed a small bug where phoenix isn't removing widgets on
Layout::remove, worked around it for now by hiding the panels. Damn,
sick of working on phoenix.
Added all missing input controllers, which can all now be mapped, and
bound them to the main menu, and added NES support for selecting "no
connected controller."
Added mouse capture and the requisite tools menu option for it.
Added WindowManager class that keeps track of both position and size now
(eg full geometry), so now you can resize your windows and save the
settings, unlike old bsnes.
WindowManager has more stringent geometry checks. The *client area* (not
the window border) can't be below 0,0 or above the width/height of three
30" monitors. If you have 4+ 30" monitors, then fuck you :P
settings.cfg is now also saved, captures all currently available
settings. Right now, there's only one path for the file browser to
remember. I will probably make this per-system later.
FileBrowser has been made a bit more friendly. The bottom left tells you
what type of files the list is filtered by (so you see "*.sfc" for
SNES), and the bottom right has an open button that can enter folders or
load files.
Added video shader support.
Fixed nall/dsp variadic-channel support, was only outputting the left
channel.
2011-09-19 12:25:56 +00:00
|
|
|
set_irq_line();
|
2011-09-12 10:30:44 +00:00
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::read(uint16 addr) -> uint8 {
|
2011-09-15 12:33:26 +00:00
|
|
|
if(addr == 0x4015) {
|
|
|
|
uint8 result = 0x00;
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
result |= pulse[0].length_counter ? 0x01 : 0;
|
|
|
|
result |= pulse[1].length_counter ? 0x02 : 0;
|
|
|
|
result |= triangle.length_counter ? 0x04 : 0;
|
|
|
|
result |= noise.length_counter ? 0x08 : 0;
|
|
|
|
result |= dmc.length_counter ? 0x10 : 0;
|
|
|
|
result |= frame.irq_pending ? 0x40 : 0;
|
|
|
|
result |= dmc.irq_pending ? 0x80 : 0;
|
Update to v082r16 release.
byuu says:
Binary output is once again called bsnes. No versioning on the title
without a system cartridge loaded. Still saving config files to
.config/batch for now.
Finally fixed NES APU frame IRQ clearing on $4015 reads.
Added mouse button/axis binding through buttons on the input capture
window.
Added advanced settings window with driver selection and focus policy
settings. Will show your default driver properly if none are selected
now, unlike old bsnes.
That exposed a small bug where phoenix isn't removing widgets on
Layout::remove, worked around it for now by hiding the panels. Damn,
sick of working on phoenix.
Added all missing input controllers, which can all now be mapped, and
bound them to the main menu, and added NES support for selecting "no
connected controller."
Added mouse capture and the requisite tools menu option for it.
Added WindowManager class that keeps track of both position and size now
(eg full geometry), so now you can resize your windows and save the
settings, unlike old bsnes.
WindowManager has more stringent geometry checks. The *client area* (not
the window border) can't be below 0,0 or above the width/height of three
30" monitors. If you have 4+ 30" monitors, then fuck you :P
settings.cfg is now also saved, captures all currently available
settings. Right now, there's only one path for the file browser to
remember. I will probably make this per-system later.
FileBrowser has been made a bit more friendly. The bottom left tells you
what type of files the list is filtered by (so you see "*.sfc" for
SNES), and the bottom right has an open button that can enter folders or
load files.
Added video shader support.
Fixed nall/dsp variadic-channel support, was only outputting the left
channel.
2011-09-19 12:25:56 +00:00
|
|
|
|
|
|
|
frame.irq_pending = false;
|
|
|
|
set_irq_line();
|
|
|
|
|
2011-09-15 12:33:26 +00:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
return cpu.mdr();
|
2011-09-12 10:30:44 +00:00
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::write(uint16 addr, uint8 data) -> void {
|
|
|
|
const uint n = (addr >> 2) & 1; //pulse#
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
switch(addr) {
|
2011-09-15 12:33:26 +00:00
|
|
|
case 0x4000: case 0x4004:
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[n].duty = data >> 6;
|
|
|
|
pulse[n].envelope.loop_mode = data & 0x20;
|
|
|
|
pulse[n].envelope.use_speed_as_volume = data & 0x10;
|
|
|
|
pulse[n].envelope.speed = data & 0x0f;
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
|
|
|
case 0x4001: case 0x4005:
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[n].sweep.enable = data & 0x80;
|
|
|
|
pulse[n].sweep.period = (data & 0x70) >> 4;
|
|
|
|
pulse[n].sweep.decrement = data & 0x08;
|
|
|
|
pulse[n].sweep.shift = data & 0x07;
|
|
|
|
pulse[n].sweep.reload = true;
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
|
|
|
case 0x4002: case 0x4006:
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[n].period = (pulse[n].period & 0x0700) | (data << 0);
|
|
|
|
pulse[n].sweep.pulse_period = (pulse[n].sweep.pulse_period & 0x0700) | (data << 0);
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
|
|
|
case 0x4003: case 0x4007:
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[n].period = (pulse[n].period & 0x00ff) | (data << 8);
|
|
|
|
pulse[n].sweep.pulse_period = (pulse[n].sweep.pulse_period & 0x00ff) | (data << 8);
|
2011-09-15 12:33:26 +00:00
|
|
|
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[n].duty_counter = 7;
|
|
|
|
pulse[n].envelope.reload_decay = true;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
if(enabled_channels & (1 << n)) {
|
|
|
|
pulse[n].length_counter = length_counter_table[(data >> 3) & 0x1f];
|
2011-09-15 12:33:26 +00:00
|
|
|
}
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x4008:
|
2011-09-15 12:33:26 +00:00
|
|
|
triangle.halt_length_counter = data & 0x80;
|
|
|
|
triangle.linear_length = data & 0x7f;
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x400a:
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
triangle.period = (triangle.period & 0x0700) | (data << 0);
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x400b:
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
triangle.period = (triangle.period & 0x00ff) | (data << 8);
|
2011-09-15 12:33:26 +00:00
|
|
|
|
|
|
|
triangle.reload_linear = true;
|
|
|
|
|
|
|
|
if(enabled_channels & (1 << 2)) {
|
|
|
|
triangle.length_counter = length_counter_table[(data >> 3) & 0x1f];
|
|
|
|
}
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x400c:
|
2011-09-15 12:33:26 +00:00
|
|
|
noise.envelope.loop_mode = data & 0x20;
|
|
|
|
noise.envelope.use_speed_as_volume = data & 0x10;
|
|
|
|
noise.envelope.speed = data & 0x0f;
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x400e:
|
2011-09-15 12:33:26 +00:00
|
|
|
noise.short_mode = data & 0x80;
|
2011-09-12 10:30:44 +00:00
|
|
|
noise.period = data & 0x0f;
|
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x400f:
|
2011-09-15 12:33:26 +00:00
|
|
|
noise.envelope.reload_decay = true;
|
|
|
|
|
|
|
|
if(enabled_channels & (1 << 3)) {
|
|
|
|
noise.length_counter = length_counter_table[(data >> 3) & 0x1f];
|
|
|
|
}
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x4010:
|
2011-09-16 11:44:07 +00:00
|
|
|
dmc.irq_enable = data & 0x80;
|
|
|
|
dmc.loop_mode = data & 0x40;
|
|
|
|
dmc.period = data & 0x0f;
|
|
|
|
|
|
|
|
dmc.irq_pending = dmc.irq_pending && dmc.irq_enable && !dmc.loop_mode;
|
|
|
|
set_irq_line();
|
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x4011:
|
2011-09-16 11:44:07 +00:00
|
|
|
dmc.dac_latch = data & 0x7f;
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x4012:
|
2011-09-16 11:44:07 +00:00
|
|
|
dmc.addr_latch = data;
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
case 0x4013:
|
2011-09-16 11:44:07 +00:00
|
|
|
dmc.length_latch = data;
|
2011-09-15 12:33:26 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x4015:
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
if((data & 0x01) == 0) pulse[0].length_counter = 0;
|
|
|
|
if((data & 0x02) == 0) pulse[1].length_counter = 0;
|
|
|
|
if((data & 0x04) == 0) triangle.length_counter = 0;
|
|
|
|
if((data & 0x08) == 0) noise.length_counter = 0;
|
2011-09-16 11:44:07 +00:00
|
|
|
|
2011-09-27 11:55:02 +00:00
|
|
|
(data & 0x10) ? dmc.start() : dmc.stop();
|
2011-09-16 11:44:07 +00:00
|
|
|
dmc.irq_pending = false;
|
|
|
|
|
2011-09-27 11:55:02 +00:00
|
|
|
set_irq_line();
|
2011-09-15 12:33:26 +00:00
|
|
|
enabled_channels = data & 0x1f;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case 0x4017:
|
|
|
|
frame.mode = data >> 6;
|
|
|
|
|
|
|
|
frame.counter = 0;
|
|
|
|
if(frame.mode & 2) clock_frame_counter();
|
2011-09-16 11:44:07 +00:00
|
|
|
if(frame.mode & 1) {
|
|
|
|
frame.irq_pending = false;
|
|
|
|
set_irq_line();
|
|
|
|
}
|
|
|
|
frame.divider = FrameCounter::NtscPeriod;
|
2011-09-12 10:30:44 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::Filter::run_hipass_strong(int sample) -> int {
|
2011-09-26 11:38:57 +00:00
|
|
|
hipass_strong += ((((int64)sample << 16) - (hipass_strong >> 16)) * HiPassStrong) >> 16;
|
|
|
|
return sample - (hipass_strong >> 32);
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::Filter::run_hipass_weak(int sample) -> int {
|
2011-09-26 11:38:57 +00:00
|
|
|
hipass_weak += ((((int64)sample << 16) - (hipass_weak >> 16)) * HiPassWeak) >> 16;
|
|
|
|
return sample - (hipass_weak >> 32);
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::Filter::run_lopass(int sample) -> int {
|
2011-09-26 11:38:57 +00:00
|
|
|
lopass += ((((int64)sample << 16) - (lopass >> 16)) * LoPass) >> 16;
|
|
|
|
return (lopass >> 32);
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::clock_frame_counter() -> void {
|
2011-09-15 12:33:26 +00:00
|
|
|
frame.counter++;
|
|
|
|
|
|
|
|
if(frame.counter & 1) {
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[0].clock_length();
|
|
|
|
pulse[0].sweep.clock(0);
|
|
|
|
pulse[1].clock_length();
|
|
|
|
pulse[1].sweep.clock(1);
|
2011-09-15 12:33:26 +00:00
|
|
|
triangle.clock_length();
|
|
|
|
noise.clock_length();
|
|
|
|
}
|
|
|
|
|
Update to v082r33 release.
byuu says:
Added MMC2, MMC4, VRC4, VRC7 (no audio.)
Split NES audio code up into individual modules.
Fixed libsnes to compile: Themaister, can you please test to make sure
it works? I don't have a libsnes client on my work PC to test it.
Added about / license information to bottom of advanced settings screen
for now (better than nothing, I guess.)
Blocked PPU reads/writes while rendering for now, easier than coming up
with a bus address locking thing :/
I can't seem to fix MMC5 graphics during the intro to Uchuu Keibitai.
Without that, trying to implement vertical-split screen mode doesn't
make sense.
So as far as special audio chips go ...
* VRC6 is completed
* Sunsoft 5B has everything the only game to use it uses, but there are
more unused channels I'd like to support anyway (they aren't
documented, though.)
* MMC5 audio unsupported for now
* VRC7 audio unsupported, probably for a long time (hardest audio driver
of all. More complex than core NES APU.)
* audio PCM games (Moero Pro Yakyuu!) I probably won't ever support
(they require external WAV packs.)
2011-10-12 12:03:58 +00:00
|
|
|
pulse[0].envelope.clock();
|
|
|
|
pulse[1].envelope.clock();
|
2011-09-15 12:41:49 +00:00
|
|
|
triangle.clock_linear_length();
|
2011-09-15 12:33:26 +00:00
|
|
|
noise.envelope.clock();
|
|
|
|
|
|
|
|
if(frame.counter == 0) {
|
2011-09-16 11:44:07 +00:00
|
|
|
if(frame.mode & 2) frame.divider += FrameCounter::NtscPeriod;
|
|
|
|
if(frame.mode == 0) {
|
|
|
|
frame.irq_pending = true;
|
|
|
|
set_irq_line();
|
|
|
|
}
|
2011-09-15 12:33:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
auto APU::clock_frame_counter_divider() -> void {
|
2011-09-15 12:33:26 +00:00
|
|
|
frame.divider -= 2;
|
|
|
|
if(frame.divider <= 0) {
|
|
|
|
clock_frame_counter();
|
2011-09-16 11:44:07 +00:00
|
|
|
frame.divider += FrameCounter::NtscPeriod;
|
2011-09-15 12:33:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
const uint8 APU::length_counter_table[32] = {
|
|
|
|
0x0a, 0xfe, 0x14, 0x02, 0x28, 0x04, 0x50, 0x06, 0xa0, 0x08, 0x3c, 0x0a, 0x0e, 0x0c, 0x1a, 0x0e,
|
|
|
|
0x0c, 0x10, 0x18, 0x12, 0x30, 0x14, 0x60, 0x16, 0xc0, 0x18, 0x48, 0x1a, 0x10, 0x1c, 0x20, 0x1e,
|
|
|
|
};
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2015-12-05 05:44:49 +00:00
|
|
|
const uint16 APU::ntsc_noise_period_table[16] = {
|
|
|
|
4, 8, 16, 32, 64, 96, 128, 160, 202, 254, 380, 508, 762, 1016, 2034, 4068,
|
|
|
|
};
|
|
|
|
|
|
|
|
const uint16 APU::pal_noise_period_table[16] = {
|
|
|
|
4, 7, 14, 30, 60, 88, 118, 148, 188, 236, 354, 472, 708, 944, 1890, 3778,
|
|
|
|
};
|
|
|
|
|
|
|
|
const uint16 APU::ntsc_dmc_period_table[16] = {
|
|
|
|
428, 380, 340, 320, 286, 254, 226, 214, 190, 160, 142, 128, 106, 84, 72, 54,
|
|
|
|
};
|
|
|
|
|
|
|
|
const uint16 APU::pal_dmc_period_table[16] = {
|
|
|
|
398, 354, 316, 298, 276, 236, 210, 198, 176, 148, 132, 118, 98, 78, 66, 50,
|
|
|
|
};
|
2011-09-15 12:33:26 +00:00
|
|
|
|
2011-09-12 10:30:44 +00:00
|
|
|
}
|