mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-04 21:31:39 +02:00
byuu says: Changelog: - Super Game Boy, BS-X Satellaview and Sufami Turbo cartridges all load manifests that specify their file names, and they all work - Sufami Turbo can now properly handle carts without RAM, or empty slots entirely - Emulator::Interface structures no longer specify any file names, ever - exposed "capability.(cheats,states)" now. So far, this just means the GBA doesn't show the cheat editor, since it doesn't support cheat codes yet - as such, state manager and cheat editor windows auto-hide (may be a tiny bit inconvenient, but it makes not having to sync them or deal with input when no cart is loaded easier) - added "AbsoluteInput" type, which returns mouse coordinates from -32767,-32767 (top left) to +32767,+32767 (bottom right) or -32768,-32768 (offscreen) AbsoluteInput is just something I'm toying with. Idea is to support eg Super Scope or Justifier, or possibly some future Famicom controllers that are absolute-indexed. The coordinates are scaled, so the bigger your window, the more precise they are. But obviously you can't get more precise than the emulated system, so 1x scale will behave the same anyway. I haven't hooked it up yet, need to mess with the idea of custom cursors via phoenix for that first. Also not sure if it will feel smoother or not ... if you resize the window, your mouse will seem to move slower. Still, not having to capture the mouse for SS/JS may be nicer yet. But we'll see ... just experimenting for now.
151 lines
3.6 KiB
C++
Executable File
151 lines
3.6 KiB
C++
Executable File
#include <gb/gb.hpp>
|
|
|
|
namespace GameBoy {
|
|
|
|
Interface *interface = nullptr;
|
|
|
|
void Interface::lcdScanline() {
|
|
if(hook) hook->lcdScanline();
|
|
}
|
|
|
|
void Interface::joypWrite(bool p15, bool p14) {
|
|
if(hook) hook->joypWrite(p15, p14);
|
|
}
|
|
|
|
double Interface::videoFrequency() {
|
|
return 4194304.0 / (154.0 * 456.0);
|
|
}
|
|
|
|
double Interface::audioFrequency() {
|
|
return 4194304.0;
|
|
}
|
|
|
|
bool Interface::loaded() {
|
|
return cartridge.loaded();
|
|
}
|
|
|
|
string Interface::sha256() {
|
|
return cartridge.sha256();
|
|
}
|
|
|
|
void Interface::load(unsigned id, const string &manifest) {
|
|
if(id == ID::GameBoy) cartridge.load(System::Revision::GameBoy, manifest);
|
|
if(id == ID::SuperGameBoy) cartridge.load(System::Revision::SuperGameBoy, manifest);
|
|
if(id == ID::GameBoyColor) cartridge.load(System::Revision::GameBoyColor, manifest);
|
|
}
|
|
|
|
void Interface::save() {
|
|
for(auto &memory : cartridge.memory) {
|
|
interface->saveRequest(memory.id, memory.name);
|
|
}
|
|
}
|
|
|
|
void Interface::load(unsigned id, const stream &stream, const string &manifest) {
|
|
if(id == ID::GameBoyBootROM) {
|
|
stream.read(system.bootROM.dmg, min( 256u, stream.size()));
|
|
}
|
|
|
|
if(id == ID::SuperGameBoyBootROM) {
|
|
stream.read(system.bootROM.sgb, min( 256u, stream.size()));
|
|
}
|
|
|
|
if(id == ID::GameBoyColorBootROM) {
|
|
stream.read(system.bootROM.cgb, min(2048u, stream.size()));
|
|
}
|
|
|
|
if(id == ID::ROM) {
|
|
stream.read(cartridge.romdata, min(cartridge.romsize, stream.size()));
|
|
}
|
|
|
|
if(id == ID::RAM) {
|
|
stream.read(cartridge.ramdata, min(stream.size(), cartridge.ramsize));
|
|
}
|
|
}
|
|
|
|
void Interface::save(unsigned id, const stream &stream) {
|
|
if(id == ID::RAM) {
|
|
stream.write(cartridge.ramdata, cartridge.ramsize);
|
|
}
|
|
}
|
|
|
|
void Interface::unload() {
|
|
save();
|
|
cartridge.unload();
|
|
}
|
|
|
|
void Interface::power() {
|
|
system.power();
|
|
}
|
|
|
|
void Interface::reset() {
|
|
system.power();
|
|
}
|
|
|
|
void Interface::run() {
|
|
system.run();
|
|
}
|
|
|
|
serializer Interface::serialize() {
|
|
system.runtosave();
|
|
return system.serialize();
|
|
}
|
|
|
|
bool Interface::unserialize(serializer &s) {
|
|
return system.unserialize(s);
|
|
}
|
|
|
|
void Interface::cheatSet(const lstring &list) {
|
|
cheat.reset();
|
|
for(auto &code : list) {
|
|
lstring codelist = code.split("+");
|
|
for(auto &part : codelist) {
|
|
unsigned addr, data, comp;
|
|
if(Cheat::decode(part, addr, data, comp)) cheat.append({addr, data, comp});
|
|
}
|
|
}
|
|
cheat.synchronize();
|
|
}
|
|
|
|
void Interface::paletteUpdate() {
|
|
video.generate_palette();
|
|
}
|
|
|
|
Interface::Interface() {
|
|
interface = this;
|
|
hook = nullptr;
|
|
|
|
information.name = "Game Boy";
|
|
information.width = 160;
|
|
information.height = 144;
|
|
information.overscan = false;
|
|
information.aspectRatio = 1.0;
|
|
information.resettable = false;
|
|
information.capability.states = true;
|
|
information.capability.cheats = true;
|
|
|
|
firmware.append({ID::GameBoyBootROM, "Game Boy", "sys", "boot.rom"});
|
|
firmware.append({ID::SuperGameBoyBootROM, "Super Game Boy", "sfc", "boot.rom"});
|
|
firmware.append({ID::GameBoyColorBootROM, "Game Boy Color", "sys", "boot.rom"});
|
|
|
|
media.append({ID::GameBoy, "Game Boy", "sys", "gb" });
|
|
media.append({ID::GameBoyColor, "Game Boy Color", "sys", "gbc"});
|
|
|
|
{
|
|
Device device{0, ID::Device, "Controller"};
|
|
device.input.append({0, 0, "Up" });
|
|
device.input.append({1, 0, "Down" });
|
|
device.input.append({2, 0, "Left" });
|
|
device.input.append({3, 0, "Right" });
|
|
device.input.append({4, 0, "B" });
|
|
device.input.append({5, 0, "A" });
|
|
device.input.append({6, 0, "Select"});
|
|
device.input.append({7, 0, "Start" });
|
|
device.order = {0, 1, 2, 3, 4, 5, 6, 7};
|
|
this->device.append(device);
|
|
}
|
|
|
|
port.append({0, "Device", {device[0]}});
|
|
}
|
|
|
|
}
|