mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-05 23:31:32 +02:00
byuu says: Finished the cheat code system, it'll now load and save cheats.bml to disk. Also hooked up overscan masking. But for now you can only configure the amount it clips via the configuration file, since I don't have a video settings dialog anymore. And that's the last of the low-hanging fruit. The remaining items are all going to be a pain in the ass for one reason or another. Short-term: - add input port changing support - add other input types (mouse-based, etc) Long-term: - add slotted cart loader (SGB, BSX, ST) - add DIP switch selection window (NSS) - add timing configuration (video/audio sync) Not planned: - video color adjustments (will allow emulated color vs raw color; but no more sliders) - pixel shaders - ananke integration (will need to make a command-line version to get my games in) - fancy audio adjustment controls (resampler, latency, volume) - input focus settings - localization support (not enough users) - window geometry memory - anything else not in higan v094
104 lines
2.9 KiB
C++
104 lines
2.9 KiB
C++
//request from emulation core to load non-volatile media folder
|
|
auto Program::loadRequest(unsigned id, string name, string type) -> void {
|
|
}
|
|
|
|
//request from emulation core to load non-volatile media file
|
|
auto Program::loadRequest(unsigned id, string path) -> void {
|
|
string location = {mediaPaths(emulator->group(id)), path};
|
|
if(!file::exists(location)) return;
|
|
mmapstream stream{location};
|
|
return emulator->load(id, stream);
|
|
}
|
|
|
|
//request from emulation core to save non-volatile media file
|
|
auto Program::saveRequest(unsigned id, string path) -> void {
|
|
string location = {mediaPaths(emulator->group(id)), path};
|
|
filestream stream{location, file::mode::write};
|
|
return emulator->save(id, stream);
|
|
}
|
|
|
|
auto Program::videoColor(unsigned source, uint16 alpha, uint16 red, uint16 green, uint16 blue) -> uint32 {
|
|
alpha >>= 8;
|
|
red >>= 8;
|
|
green >>= 8;
|
|
blue >>= 8;
|
|
return alpha << 24 | red << 16 | green << 8 | blue << 0;
|
|
}
|
|
|
|
auto Program::videoRefresh(const uint32* palette, const uint32* data, unsigned pitch, unsigned width, unsigned height) -> void {
|
|
uint32* output;
|
|
unsigned length;
|
|
|
|
if(video.lock(output, length, width, height)) {
|
|
pitch >>= 2, length >>= 2;
|
|
|
|
for(auto y : range(height)) {
|
|
const uint32* sp = data + y * pitch;
|
|
uint32* dp = output + y * length;
|
|
for(auto x : range(width)) {
|
|
*dp++ = palette[*sp++];
|
|
}
|
|
}
|
|
|
|
if(emulator->information.overscan && config().video.overscan.mask) {
|
|
unsigned h = config().video.overscan.horizontal;
|
|
unsigned v = config().video.overscan.vertical;
|
|
|
|
if(h) for(auto y : range(height)) {
|
|
memory::fill(output + y * length, 4 * h);
|
|
memory::fill(output + y * length + (width - h), 4 * h);
|
|
}
|
|
|
|
if(v) for(auto y : range(v)) {
|
|
memory::fill(output + y * length, 4 * width);
|
|
memory::fill(output + (height - 1 - y) * length, 4 * width);
|
|
}
|
|
}
|
|
|
|
video.unlock();
|
|
video.refresh();
|
|
}
|
|
|
|
static unsigned frameCounter = 0;
|
|
static time_t previous, current;
|
|
frameCounter++;
|
|
|
|
time(¤t);
|
|
if(current != previous) {
|
|
previous = current;
|
|
statusText = {"FPS: ", frameCounter};
|
|
frameCounter = 0;
|
|
}
|
|
}
|
|
|
|
auto Program::audioSample(int16 lsample, int16 rsample) -> void {
|
|
signed samples[] = {lsample, rsample};
|
|
dsp.sample(samples);
|
|
while(dsp.pending()) {
|
|
dsp.read(samples);
|
|
audio.sample(samples[0], samples[1]);
|
|
}
|
|
}
|
|
|
|
auto Program::inputPoll(unsigned port, unsigned device, unsigned input) -> int16 {
|
|
if(presentation->focused()) {
|
|
auto guid = emulator->port[port].device[device].input[input].guid;
|
|
auto mapping = (InputMapping*)guid;
|
|
if(mapping) return mapping->poll();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
auto Program::inputRumble(unsigned port, unsigned device, unsigned input, bool enable) -> void {
|
|
}
|
|
|
|
auto Program::dipSettings(const Markup::Node& node) -> unsigned {
|
|
}
|
|
|
|
auto Program::path(unsigned group) -> string {
|
|
return mediaPaths(group);
|
|
}
|
|
|
|
auto Program::notify(string text) -> void {
|
|
}
|