mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-04-02 10:42:14 -04:00
In the release thread, byuu says: The first official release of higan has been posted. higan is the new name for bsnes, and it continues with the latter's version numbering. Note that as of now, bsnes still exists. It's a module distributed inside of higan. bsnes is now specific to my SNES emulator. Due to last minute changes to the emulator interface, and missing support in ananke, I wasn't able to include Cydrak's Nintendo DS emulator dasShiny in this build, but I hope to do so in the next release. http://code.google.com/p/higan/downloads/list For both new and experienced users, please read the higan user guide first: http://byuu.org/higan/user-guide In the v091 WIP thread, byuu says: r15->r16: - BS-X MaskROM handling (partial ... need to split bsx/flash away from sfc/chip, restructure code - it requires tagging the base cart markup for now, but it needs to parse the slotted cart markup) - phoenixflags / phoenixlink += -m32 - nall/sort stability - if(input.poll(scancode[activeScancode]) == false) return; - MSU1 / USART need to use interface->path(1) - MSU1 needs to use Markup::Document, not XML::Document - case-insensitive folder listings - remove nall/emulation/system.hpp files (move to ananke) - remove rom/ram id= checks with indexing X have cores ask for manifest.bml (skipped for v092's release, too big a change) - rename compatibility profile to balanced (so people don't assume it has better compatibility than accuracy)
120 lines
4.3 KiB
C++
120 lines
4.3 KiB
C++
#ifndef NALL_EMULATION_GAME_BOY_HPP
|
|
#define NALL_EMULATION_GAME_BOY_HPP
|
|
|
|
#include <nall/sha256.hpp>
|
|
#include <nall/string.hpp>
|
|
|
|
namespace nall {
|
|
|
|
struct GameBoyCartridge {
|
|
string markup;
|
|
inline GameBoyCartridge(uint8_t *data, unsigned size);
|
|
|
|
//private:
|
|
struct Information {
|
|
string mapper;
|
|
bool ram;
|
|
bool battery;
|
|
bool rtc;
|
|
bool rumble;
|
|
|
|
unsigned romsize;
|
|
unsigned ramsize;
|
|
|
|
bool cgb;
|
|
bool cgbonly;
|
|
} info;
|
|
};
|
|
|
|
GameBoyCartridge::GameBoyCartridge(uint8_t *romdata, unsigned romsize) {
|
|
markup = "";
|
|
if(romsize < 0x4000) return;
|
|
|
|
info.mapper = "unknown";
|
|
info.ram = false;
|
|
info.battery = false;
|
|
info.rtc = false;
|
|
info.rumble = false;
|
|
|
|
info.romsize = 0;
|
|
info.ramsize = 0;
|
|
|
|
unsigned base = romsize - 0x8000;
|
|
if(romdata[base + 0x0104] == 0xce && romdata[base + 0x0105] == 0xed
|
|
&& romdata[base + 0x0106] == 0x66 && romdata[base + 0x0107] == 0x66
|
|
&& romdata[base + 0x0108] == 0xcc && romdata[base + 0x0109] == 0x0d
|
|
&& romdata[base + 0x0147] >= 0x0b && romdata[base + 0x0147] <= 0x0d
|
|
) {
|
|
//MMM01 stores header at bottom of image
|
|
//flip this around for consistency with all other mappers
|
|
uint8_t header[0x8000];
|
|
memcpy(header, romdata + base, 0x8000);
|
|
memmove(romdata + 0x8000, romdata, romsize - 0x8000);
|
|
memcpy(romdata, header, 0x8000);
|
|
}
|
|
|
|
info.cgb = (romdata[0x0143] & 0x80) == 0x80;
|
|
info.cgbonly = (romdata[0x0143] & 0xc0) == 0xc0;
|
|
|
|
switch(romdata[0x0147]) {
|
|
case 0x00: info.mapper = "none"; break;
|
|
case 0x01: info.mapper = "MBC1"; break;
|
|
case 0x02: info.mapper = "MBC1"; info.ram = true; break;
|
|
case 0x03: info.mapper = "MBC1"; info.ram = true; info.battery = true; break;
|
|
case 0x05: info.mapper = "MBC2"; info.ram = true; break;
|
|
case 0x06: info.mapper = "MBC2"; info.ram = true; info.battery = true; break;
|
|
case 0x08: info.mapper = "none"; info.ram = true; break;
|
|
case 0x09: info.mapper = "MBC0"; info.ram = true; info.battery = true; break;
|
|
case 0x0b: info.mapper = "MMM01"; break;
|
|
case 0x0c: info.mapper = "MMM01"; info.ram = true; break;
|
|
case 0x0d: info.mapper = "MMM01"; info.ram = true; info.battery = true; break;
|
|
case 0x0f: info.mapper = "MBC3"; info.rtc = true; info.battery = true; break;
|
|
case 0x10: info.mapper = "MBC3"; info.rtc = true; info.ram = true; info.battery = true; break;
|
|
case 0x11: info.mapper = "MBC3"; break;
|
|
case 0x12: info.mapper = "MBC3"; info.ram = true; break;
|
|
case 0x13: info.mapper = "MBC3"; info.ram = true; info.battery = true; break;
|
|
case 0x19: info.mapper = "MBC5"; break;
|
|
case 0x1a: info.mapper = "MBC5"; info.ram = true; break;
|
|
case 0x1b: info.mapper = "MBC5"; info.ram = true; info.battery = true; break;
|
|
case 0x1c: info.mapper = "MBC5"; info.rumble = true; break;
|
|
case 0x1d: info.mapper = "MBC5"; info.rumble = true; info.ram = true; break;
|
|
case 0x1e: info.mapper = "MBC5"; info.rumble = true; info.ram = true; info.battery = true; break;
|
|
case 0xfc: break; //Pocket Camera
|
|
case 0xfd: break; //Bandai TAMA5
|
|
case 0xfe: info.mapper = "HuC3"; break;
|
|
case 0xff: info.mapper = "HuC1"; info.ram = true; info.battery = true; break;
|
|
}
|
|
|
|
switch(romdata[0x0148]) { default:
|
|
case 0x00: info.romsize = 2 * 16 * 1024; break;
|
|
case 0x01: info.romsize = 4 * 16 * 1024; break;
|
|
case 0x02: info.romsize = 8 * 16 * 1024; break;
|
|
case 0x03: info.romsize = 16 * 16 * 1024; break;
|
|
case 0x04: info.romsize = 32 * 16 * 1024; break;
|
|
case 0x05: info.romsize = 64 * 16 * 1024; break;
|
|
case 0x06: info.romsize = 128 * 16 * 1024; break;
|
|
case 0x07: info.romsize = 256 * 16 * 1024; break;
|
|
case 0x52: info.romsize = 72 * 16 * 1024; break;
|
|
case 0x53: info.romsize = 80 * 16 * 1024; break;
|
|
case 0x54: info.romsize = 96 * 16 * 1024; break;
|
|
}
|
|
|
|
switch(romdata[0x0149]) { default:
|
|
case 0x00: info.ramsize = 0 * 1024; break;
|
|
case 0x01: info.ramsize = 2 * 1024; break;
|
|
case 0x02: info.ramsize = 8 * 1024; break;
|
|
case 0x03: info.ramsize = 32 * 1024; break;
|
|
}
|
|
|
|
if(info.mapper == "MBC2") info.ramsize = 512; //512 x 4-bit
|
|
|
|
markup = "";
|
|
markup.append("cartridge\n");
|
|
markup.append(" board type=", info.mapper, "\n");
|
|
markup.append(" rom name=program.rom size=0x", hex(romsize), "\n");
|
|
if(info.ramsize > 0) markup.append(" ram name=save.ram size=0x", hex(info.ramsize), "\n");
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|