mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-05 03:02:00 +02:00
byuu says: higan changelog: - generates title displayed in emulator window by asking the core - core builds title solely from "information/title" ... if it's not there, you don't get a title at all - sub-system load menu is gone ... since there are multiple revisions of the SGB, this never really worked well anyway - to load an SGB, BS-X or ST cartridge, load the base cartridge first - "File->Load Game" moved to "Load->Import Game" ... may cause a bit of confusion to new users, but I don't like having a single-item menu, we'll just have to explain it to new users - browser window redone to look like ananke - home button here goes to ~/Emulation rather than just ~ like ananke, since this is the home of game folders - game folder icon is now the executable icon for the Tango theme (orange diamond), meant to represent a complete game rather than a game file or archive ananke changelog: - outputs GBC games to "Game Boy Color/" instead of "Game Boy/" - adds the file basename to "information/title" Known issues: - using ananke to load a GB game trips the Super Famicom SGB mode and fails (need to make the full-path auto-detection ignore non-bootable systems) - need to dump and test some BS-X media before releasing - ananke lacks BS-X Satellaview cartridge support - v092 isn't going to let you retarget the ananke/higan game folder path of ~/Emulation, you will have to wait for a future version if that bothers you so greatly [Later, after the v092 release, byuu posted this additional changelog: - kill laevateinn - add title() - add bootable, remove load - combine file, library - combine [][][] paths - fix SFC subtype handling XML->BML - update file browser to use buttons - update file browser keyboard handling - update system XML->BML - fix sufami turbo hashing - remove Cartridge::manifest ]
160 lines
3.5 KiB
C++
Executable File
160 lines
3.5 KiB
C++
Executable File
#include <fc/fc.hpp>
|
|
|
|
namespace Famicom {
|
|
|
|
Interface *interface = nullptr;
|
|
|
|
string Interface::title() {
|
|
return cartridge.title();
|
|
}
|
|
|
|
double Interface::videoFrequency() {
|
|
return 21477272.0 / (262.0 * 1364.0 - 4.0);
|
|
}
|
|
|
|
double Interface::audioFrequency() {
|
|
return 21477272.0 / 12.0;
|
|
}
|
|
|
|
bool Interface::loaded() {
|
|
return cartridge.loaded();
|
|
}
|
|
|
|
string Interface::sha256() {
|
|
return cartridge.sha256();
|
|
}
|
|
|
|
unsigned Interface::group(unsigned id) {
|
|
switch(id) {
|
|
case ID::ProgramROM:
|
|
case ID::ProgramRAM:
|
|
case ID::CharacterROM:
|
|
case ID::CharacterRAM:
|
|
return 1;
|
|
}
|
|
|
|
throw;
|
|
}
|
|
|
|
void Interface::load(unsigned id, const string &manifest) {
|
|
cartridge.load(manifest);
|
|
}
|
|
|
|
void Interface::save() {
|
|
for(auto &memory : cartridge.memory) {
|
|
saveRequest(memory.id, memory.name);
|
|
}
|
|
}
|
|
|
|
void Interface::load(unsigned id, const stream &stream, const string &manifest) {
|
|
if(id == ID::ProgramROM) {
|
|
stream.read(cartridge.board->prgrom.data, min(cartridge.board->prgrom.size, stream.size()));
|
|
}
|
|
|
|
if(id == ID::ProgramRAM) {
|
|
stream.read(cartridge.board->prgram.data, min(cartridge.board->prgram.size, stream.size()));
|
|
}
|
|
|
|
if(id == ID::CharacterROM) {
|
|
stream.read(cartridge.board->chrrom.data, min(cartridge.board->chrrom.size, stream.size()));
|
|
}
|
|
|
|
if(id == ID::CharacterRAM) {
|
|
stream.read(cartridge.board->chrram.data, min(cartridge.board->chrram.size, stream.size()));
|
|
}
|
|
}
|
|
|
|
void Interface::save(unsigned id, const stream &stream) {
|
|
if(id == ID::ProgramRAM) {
|
|
stream.write(cartridge.board->prgram.data, cartridge.board->prgram.size);
|
|
}
|
|
|
|
if(id == ID::CharacterRAM) {
|
|
stream.write(cartridge.board->chrram.data, cartridge.board->chrram.size);
|
|
}
|
|
}
|
|
|
|
void Interface::unload() {
|
|
save();
|
|
cartridge.unload();
|
|
}
|
|
|
|
void Interface::power() {
|
|
system.power();
|
|
}
|
|
|
|
void Interface::reset() {
|
|
system.reset();
|
|
}
|
|
|
|
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;
|
|
|
|
information.name = "Famicom";
|
|
information.width = 256;
|
|
information.height = 240;
|
|
information.overscan = true;
|
|
information.aspectRatio = 8.0 / 7.0;
|
|
information.resettable = true;
|
|
information.capability.states = true;
|
|
information.capability.cheats = true;
|
|
|
|
media.append({ID::Famicom, "Famicom", "fc", true});
|
|
|
|
{
|
|
Device device{0, ID::Port1 | ID::Port2, "Controller"};
|
|
device.input.append({0, 0, "A" });
|
|
device.input.append({1, 0, "B" });
|
|
device.input.append({2, 0, "Select"});
|
|
device.input.append({3, 0, "Start" });
|
|
device.input.append({4, 0, "Up" });
|
|
device.input.append({5, 0, "Down" });
|
|
device.input.append({6, 0, "Left" });
|
|
device.input.append({7, 0, "Right" });
|
|
device.order = {4, 5, 6, 7, 1, 0, 2, 3};
|
|
this->device.append(device);
|
|
}
|
|
|
|
port.append({0, "Port 1"});
|
|
port.append({1, "Port 2"});
|
|
|
|
for(auto &device : this->device) {
|
|
for(auto &port : this->port) {
|
|
if(device.portmask & (1 << port.id)) {
|
|
port.device.append(device);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|