mirror of
https://github.com/libretro/bsnes-libretro-cplusplus98.git
synced 2025-04-13 07:30:47 +00:00
Should finally compile.
This commit is contained in:
parent
82aa116b90
commit
e6f610eb82
3
Makefile
3
Makefile
@ -23,9 +23,10 @@ compile = \
|
||||
) \
|
||||
)
|
||||
|
||||
all: library;
|
||||
|
||||
include gameboy/Makefile
|
||||
|
||||
all: library;
|
||||
|
||||
set-static:
|
||||
$(eval fpic := )
|
||||
|
@ -16,14 +16,14 @@ namespace GameBoy {
|
||||
#include "serialization.cpp"
|
||||
Cartridge cartridge;
|
||||
|
||||
void Cartridge::load(const string &xml, uint8_t *data, unsigned size) {
|
||||
void Cartridge::load(const string &xml, const uint8_t *data, const unsigned size) {
|
||||
//uint32_t crc = crc32_calculate(data, size);
|
||||
//print("CRC32 = ", hex<4>(crc), "\n");
|
||||
|
||||
romdata = new uint8[romsize = size];
|
||||
memcpy(romdata, data, size);
|
||||
|
||||
info.mapper = Mapper::Unknown;
|
||||
info.mapper.i = Mapper::Unknown;
|
||||
info.ram = false;
|
||||
info.battery = false;
|
||||
info.rtc = false;
|
||||
@ -37,14 +37,14 @@ void Cartridge::load(const string &xml, uint8_t *data, unsigned size) {
|
||||
if(head.name == "cartridge") {
|
||||
foreach(attr, head.attribute) {
|
||||
if(attr.name == "mapper") {
|
||||
if(attr.content == "none") info.mapper = Mapper::MBC0;
|
||||
if(attr.content == "MBC1") info.mapper = Mapper::MBC1;
|
||||
if(attr.content == "MBC2") info.mapper = Mapper::MBC2;
|
||||
if(attr.content == "MBC3") info.mapper = Mapper::MBC3;
|
||||
if(attr.content == "MBC5") info.mapper = Mapper::MBC5;
|
||||
if(attr.content == "MMM01") info.mapper = Mapper::MMM01;
|
||||
if(attr.content == "HuC1") info.mapper = Mapper::HuC1;
|
||||
if(attr.content == "HuC3") info.mapper = Mapper::HuC3;
|
||||
if(attr.content == "none") info.mapper.i = Mapper::MBC0;
|
||||
if(attr.content == "MBC1") info.mapper.i = Mapper::MBC1;
|
||||
if(attr.content == "MBC2") info.mapper.i = Mapper::MBC2;
|
||||
if(attr.content == "MBC3") info.mapper.i = Mapper::MBC3;
|
||||
if(attr.content == "MBC5") info.mapper.i = Mapper::MBC5;
|
||||
if(attr.content == "MMM01") info.mapper.i = Mapper::MMM01;
|
||||
if(attr.content == "HuC1") info.mapper.i = Mapper::HuC1;
|
||||
if(attr.content == "HuC3") info.mapper.i = Mapper::HuC3;
|
||||
}
|
||||
|
||||
if(attr.name == "rtc") info.rtc = (attr.content == "true" ? true : false);
|
||||
@ -117,7 +117,7 @@ void Cartridge::power() {
|
||||
|
||||
void Cartridge::map() {
|
||||
MMIO *mapper = 0;
|
||||
switch(info.mapper) { default:
|
||||
switch(info.mapper.i) { default:
|
||||
case Mapper::MBC0: mapper = &mbc0; break;
|
||||
case Mapper::MBC1: mapper = &mbc1; break;
|
||||
case Mapper::MBC2: mapper = &mbc2; break;
|
||||
|
@ -8,16 +8,31 @@ struct Cartridge : property<Cartridge> {
|
||||
#include "huc1/huc1.hpp"
|
||||
#include "huc3/huc3.hpp"
|
||||
|
||||
enum Mapper : unsigned {
|
||||
MBC0,
|
||||
MBC1,
|
||||
MBC2,
|
||||
MBC3,
|
||||
MBC5,
|
||||
MMM01,
|
||||
HuC1,
|
||||
HuC3,
|
||||
Unknown,
|
||||
//enum Mapper : unsigned {
|
||||
// MBC0,
|
||||
// MBC1,
|
||||
// MBC2,
|
||||
// MBC3,
|
||||
// MBC5,
|
||||
// MMM01,
|
||||
// HuC1,
|
||||
// HuC3,
|
||||
// Unknown,
|
||||
//};
|
||||
//
|
||||
|
||||
struct Mapper {
|
||||
enum e {
|
||||
MBC0,
|
||||
MBC1,
|
||||
MBC2,
|
||||
MBC3,
|
||||
MBC5,
|
||||
MMM01,
|
||||
HuC1,
|
||||
HuC3,
|
||||
Unknown,
|
||||
} i;
|
||||
};
|
||||
|
||||
struct Information {
|
||||
@ -41,7 +56,7 @@ struct Cartridge : property<Cartridge> {
|
||||
uint8_t *ramdata;
|
||||
unsigned ramsize;
|
||||
|
||||
void load(const string &xml, uint8_t *data, unsigned size);
|
||||
void load(const string &xml, const uint8_t *data, const unsigned size);
|
||||
void unload();
|
||||
|
||||
uint8 rom_read(unsigned addr);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -15,8 +15,8 @@ void CPU::Main() {
|
||||
|
||||
void CPU::main() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::CPU) {
|
||||
scheduler.sync = Scheduler::SynchronizeMode::All;
|
||||
if(scheduler.sync.i == Scheduler::SynchronizeMode::CPU) {
|
||||
scheduler.sync.i = Scheduler::SynchronizeMode::All;
|
||||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ void CPU::main() {
|
||||
}
|
||||
}
|
||||
|
||||
void CPU::interrupt_raise(CPU::Interrupt id) {
|
||||
void CPU::interrupt_raise(CPU::Interrupt::e id) {
|
||||
switch(id) {
|
||||
case Interrupt::Vblank: status.interrupt_request_vblank = 1; break;
|
||||
case Interrupt::Stat : status.interrupt_request_stat = 1; break;
|
||||
|
@ -5,12 +5,22 @@ struct CPU : Processor, MMIO {
|
||||
|
||||
bool trace;
|
||||
|
||||
enum class Interrupt : unsigned {
|
||||
Vblank,
|
||||
Stat,
|
||||
Timer,
|
||||
Serial,
|
||||
Joypad,
|
||||
//enum class Interrupt : unsigned {
|
||||
// Vblank,
|
||||
// Stat,
|
||||
// Timer,
|
||||
// Serial,
|
||||
// Joypad,
|
||||
//};
|
||||
|
||||
struct Interrupt {
|
||||
enum e {
|
||||
Vblank,
|
||||
Stat,
|
||||
Timer,
|
||||
Serial,
|
||||
Joypad,
|
||||
} i;
|
||||
};
|
||||
|
||||
struct Status {
|
||||
@ -63,7 +73,7 @@ struct CPU : Processor, MMIO {
|
||||
|
||||
static void Main();
|
||||
void main();
|
||||
void interrupt_raise(Interrupt id);
|
||||
void interrupt_raise(Interrupt::e id);
|
||||
void interrupt_test();
|
||||
void interrupt_exec(uint16 pc);
|
||||
void power();
|
||||
|
@ -13,7 +13,7 @@ void LCD::Main() {
|
||||
|
||||
void LCD::main() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
if(scheduler.sync.i == Scheduler::SynchronizeMode::All) {
|
||||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
}
|
||||
|
||||
@ -30,7 +30,7 @@ void LCD::add_clocks(unsigned clocks) {
|
||||
if(status.lx >= 456) scanline();
|
||||
|
||||
cpu.clock -= clocks;
|
||||
if(cpu.clock <= 0 && scheduler.sync != Scheduler::SynchronizeMode::All) {
|
||||
if(cpu.clock <= 0 && scheduler.sync.i != Scheduler::SynchronizeMode::All) {
|
||||
co_switch(scheduler.active_thread = cpu.thread);
|
||||
}
|
||||
}
|
||||
|
@ -10,8 +10,8 @@ void Scheduler::enter() {
|
||||
co_switch(active_thread);
|
||||
}
|
||||
|
||||
void Scheduler::exit(ExitReason reason) {
|
||||
exit_reason = reason;
|
||||
void Scheduler::exit(ExitReason::e reason) {
|
||||
exit_reason.i = reason;
|
||||
active_thread = co_active();
|
||||
co_switch(host_thread);
|
||||
}
|
||||
@ -27,7 +27,7 @@ void Scheduler::init() {
|
||||
}
|
||||
|
||||
Scheduler::Scheduler() {
|
||||
exit_reason = ExitReason::UnknownEvent;
|
||||
exit_reason.i = ExitReason::UnknownEvent;
|
||||
host_thread = 0;
|
||||
active_thread = 0;
|
||||
}
|
||||
|
@ -1,13 +1,16 @@
|
||||
struct Scheduler : property<Scheduler> {
|
||||
enum class SynchronizeMode : unsigned { None, CPU, All } sync;
|
||||
enum class ExitReason : unsigned { UnknownEvent, StepEvent, FrameEvent, SynchronizeEvent };
|
||||
readonly<ExitReason> exit_reason;
|
||||
//enum class SynchronizeMode : unsigned { None, CPU, All } sync;
|
||||
//enum class ExitReason : unsigned { UnknownEvent, StepEvent, FrameEvent, SynchronizeEvent };
|
||||
struct SynchronizeMode { enum e { None, CPU, All } i; } sync;
|
||||
struct ExitReason { enum e { UnknownEvent, StepEvent, FrameEvent, SynchronizeEvent } i; };
|
||||
|
||||
ExitReason exit_reason;
|
||||
|
||||
cothread_t host_thread;
|
||||
cothread_t active_thread;
|
||||
|
||||
void enter();
|
||||
void exit(ExitReason);
|
||||
void exit(ExitReason::e);
|
||||
void swapto(Processor&);
|
||||
|
||||
void init();
|
||||
|
@ -9,15 +9,15 @@ namespace GameBoy {
|
||||
System system;
|
||||
|
||||
void System::run() {
|
||||
scheduler.sync = Scheduler::SynchronizeMode::None;
|
||||
scheduler.sync.i = Scheduler::SynchronizeMode::None;
|
||||
|
||||
scheduler.enter();
|
||||
if(scheduler.exit_reason() == Scheduler::ExitReason::FrameEvent) {
|
||||
if(scheduler.exit_reason.i == Scheduler::ExitReason::FrameEvent) {
|
||||
}
|
||||
}
|
||||
|
||||
void System::runtosave() {
|
||||
scheduler.sync = Scheduler::SynchronizeMode::CPU;
|
||||
scheduler.sync.i = Scheduler::SynchronizeMode::CPU;
|
||||
runthreadtosave();
|
||||
|
||||
scheduler.active_thread = lcd.thread;
|
||||
@ -27,8 +27,8 @@ void System::runtosave() {
|
||||
void System::runthreadtosave() {
|
||||
while(true) {
|
||||
scheduler.enter();
|
||||
if(scheduler.exit_reason() == Scheduler::ExitReason::SynchronizeEvent) break;
|
||||
if(scheduler.exit_reason() == Scheduler::ExitReason::FrameEvent) {
|
||||
if(scheduler.exit_reason.i == Scheduler::ExitReason::SynchronizeEvent) break;
|
||||
if(scheduler.exit_reason.i == Scheduler::ExitReason::FrameEvent) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,11 @@
|
||||
class Interface;
|
||||
|
||||
enum class Input : unsigned {
|
||||
Up, Down, Left, Right, B, A, Select, Start,
|
||||
//enum class Input : unsigned {
|
||||
// Up, Down, Left, Right, B, A, Select, Start,
|
||||
//};
|
||||
|
||||
struct Input {
|
||||
enum e { Up, Down, Left, Right, B, A, Select, Start, };
|
||||
};
|
||||
|
||||
struct System : MMIO {
|
||||
|
@ -110,7 +110,7 @@ namespace nall {
|
||||
|
||||
inline void bits(unsigned bits) { mask = (1ULL << (bits - 1)) + ((1ULL << (bits - 1)) - 1); data &= mask; }
|
||||
inline varuintmax_t() : data(0), mask(~0ULL) {}
|
||||
inline varuintmax_t(const uintmax_t i) : data(i),
|
||||
inline varuintmax_t(const uintmax_t i) : data(i), mask(~0ULL) {}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,8 @@ endif
|
||||
|
||||
obj/libsnes.o: $(snes)/libsnes/libsnes.cpp $(snes)/libsnes/*
|
||||
|
||||
obj/libco.o : libco/libco.c libco/*
|
||||
|
||||
obj/snes-system.o : $(snes)/system/system.cpp $(call rwildcard,$(snes)/system/) $(call rwildcard,$(snes)/video/)
|
||||
obj/snes-memory.o : $(snes)/memory/memory.cpp $(call rwildcard,$(snes)/memory/)
|
||||
obj/snes-cpucore.o : $(snes)/cpu/core/core.cpp $(call rwildcard,$(snes)/cpu/core/)
|
||||
|
@ -95,7 +95,7 @@ void Cartridge::xml_parse_ram(xml_element &root) {
|
||||
}
|
||||
|
||||
void Cartridge::xml_parse_icd2(xml_element &root) {
|
||||
if(mode != Mode::SuperGameBoy) return;
|
||||
if(mode.i != Mode::SuperGameBoy) return;
|
||||
icd2.revision = 1;
|
||||
|
||||
foreach(attr, root.attribute) {
|
||||
@ -227,7 +227,7 @@ void Cartridge::xml_parse_sa1(xml_element &root) {
|
||||
|
||||
void Cartridge::xml_parse_necdsp(xml_element &root) {
|
||||
has_necdsp = true;
|
||||
necdsp.revision = NECDSP::Revision::uPD7725;
|
||||
necdsp.revision.i = NECDSP::Revision::uPD7725;
|
||||
necdsp.frequency = 8000000;
|
||||
|
||||
for(unsigned n = 0; n < 16384; n++) necdsp.programROM[n] = 0x000000;
|
||||
@ -238,8 +238,8 @@ void Cartridge::xml_parse_necdsp(xml_element &root) {
|
||||
|
||||
foreach(attr, root.attribute) {
|
||||
if(attr.name == "revision") {
|
||||
if(attr.content == "upd7725" ) necdsp.revision = NECDSP::Revision::uPD7725;
|
||||
if(attr.content == "upd96050") necdsp.revision = NECDSP::Revision::uPD96050;
|
||||
if(attr.content == "upd7725" ) necdsp.revision.i = NECDSP::Revision::uPD7725;
|
||||
if(attr.content == "upd96050") necdsp.revision.i = NECDSP::Revision::uPD96050;
|
||||
} else if(attr.name == "frequency") {
|
||||
necdsp.frequency = decimal(attr.content);
|
||||
} else if(attr.name == "program") {
|
||||
@ -249,12 +249,12 @@ void Cartridge::xml_parse_necdsp(xml_element &root) {
|
||||
}
|
||||
}
|
||||
|
||||
unsigned promsize = (necdsp.revision == NECDSP::Revision::uPD7725 ? 2048 : 16384);
|
||||
unsigned dromsize = (necdsp.revision == NECDSP::Revision::uPD7725 ? 1024 : 2048);
|
||||
unsigned promsize = (necdsp.revision.i == NECDSP::Revision::uPD7725 ? 2048 : 16384);
|
||||
unsigned dromsize = (necdsp.revision.i == NECDSP::Revision::uPD7725 ? 1024 : 2048);
|
||||
unsigned filesize = promsize * 3 + dromsize * 2;
|
||||
|
||||
file fp;
|
||||
if(fp.open(string(dir(basename()), program), file::mode::read)) {
|
||||
if(fp.open(string(dir(basename()), program), file::mode_read)) {
|
||||
if(fp.size() == filesize) {
|
||||
for(unsigned n = 0; n < promsize; n++) necdsp.programROM[n] = fp.readm(3);
|
||||
for(unsigned n = 0; n < dromsize; n++) necdsp.dataROM[n] = fp.readm(2);
|
||||
@ -312,8 +312,8 @@ void Cartridge::xml_parse_necdsp(xml_element &root) {
|
||||
} else if(sha256 != "" && sha256 != programhash) {
|
||||
system.interface->message(string(
|
||||
"Warning: NEC DSP program ", program, " SHA256 is incorrect.\n\n"
|
||||
"Expected:\n", xml_hash, "\n\n"
|
||||
"Actual:\n", rom_hash
|
||||
"Expected:\n", sha256, "\n\n"
|
||||
"Actual:\n", programhash
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -401,7 +401,7 @@ void Cartridge::xml_parse_srtc(xml_element &root) {
|
||||
|
||||
foreach(node, root.element) {
|
||||
if(node.name == "map") {
|
||||
Mapping m(strc);
|
||||
Mapping m(srtc);
|
||||
foreach(attr, node.attribute) {
|
||||
if (attr.name == "address") xml_parse_address(m, attr.content);
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ void ICD2::Enter() { icd2.enter(); }
|
||||
|
||||
void ICD2::enter() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
if(scheduler.sync.i == Scheduler::SynchronizeMode::All) {
|
||||
GameBoy::system.runtosave();
|
||||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#ifdef NECDSP_CPP
|
||||
|
||||
string NECDSP::disassemble(uint14 ip) {
|
||||
string output = { hex<4>(ip), " " };
|
||||
string output = string(hex<4>(ip), " ");
|
||||
uint24 opcode = programROM[ip];
|
||||
uint2 type = opcode >> 22;
|
||||
|
||||
|
@ -12,7 +12,7 @@ void NECDSP::Enter() { necdsp.enter(); }
|
||||
|
||||
void NECDSP::enter() {
|
||||
while(true) {
|
||||
if(scheduler.sync == Scheduler::SynchronizeMode::All) {
|
||||
if(scheduler.sync.i == Scheduler::SynchronizeMode::All) {
|
||||
scheduler.exit(Scheduler::ExitReason::SynchronizeEvent);
|
||||
}
|
||||
|
||||
@ -254,14 +254,14 @@ void NECDSP::enable() {
|
||||
}
|
||||
|
||||
void NECDSP::power() {
|
||||
if(revision == Revision::uPD7725) {
|
||||
if(revision.i == Revision::uPD7725) {
|
||||
regs.pc.bits(11);
|
||||
regs.rp.bits(10);
|
||||
regs.dp.bits( 8);
|
||||
dpmask = 0x000000, dptest = 0xffffff; //uPD7725 not mapped to SNES bus
|
||||
}
|
||||
|
||||
if(revision == Revision::uPD96050) {
|
||||
if(revision.i == Revision::uPD96050) {
|
||||
regs.pc.bits(14);
|
||||
regs.rp.bits(11);
|
||||
regs.dp.bits(11);
|
||||
|
@ -1,6 +1,7 @@
|
||||
class NECDSP : public Coprocessor, public Memory {
|
||||
public:
|
||||
enum class Revision : unsigned { uPD7725, uPD96050 } revision;
|
||||
//enum class Revision : unsigned { uPD7725, uPD96050 } revision;
|
||||
struct Revision { enum e { uPD7725, uPD96050 } i; } revision;
|
||||
unsigned frequency;
|
||||
unsigned drmask, drtest;
|
||||
unsigned srmask, srtest;
|
||||
|
@ -175,12 +175,21 @@ bool snes_load_cartridge_super_game_boy(
|
||||
const char *rom_xml, const uint8_t *rom_data, unsigned rom_size,
|
||||
const char *dmg_xml, const uint8_t *dmg_data, unsigned dmg_size
|
||||
) {
|
||||
|
||||
string xmlrom, xmldmg;
|
||||
snes_cheat_reset();
|
||||
if(rom_data) SNES::memory::cartrom.copy(rom_data, rom_size);
|
||||
string xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SNESCartridge(rom_data, rom_size).xmlMemoryMap;
|
||||
if(dmg_data) SNES::memory::gbrom.copy(dmg_data, dmg_size);
|
||||
string xmldmg = (dmg_xml && *dmg_xml) ? string(dmg_xml) : SNESCartridge(dmg_data, dmg_size).xmlMemoryMap;
|
||||
SNES::cartridge.load(SNES::Cartridge::Mode::SuperGameBoy, lstring(xmlrom, xmldmg));
|
||||
|
||||
if (rom_data) {
|
||||
xmlrom = (rom_xml && *rom_xml) ? string(rom_xml) : SNESCartridge(rom_data, rom_size).xmlMemoryMap;
|
||||
SNES::memory::cartrom.copy(rom_data, rom_size);
|
||||
}
|
||||
|
||||
if (dmg_data) {
|
||||
xmldmg = (dmg_xml && *dmg_xml) ? string(dmg_xml) : GameBoyCartridge(dmg_data, dmg_size).xml;
|
||||
GameBoy::cartridge.load(xmldmg, dmg_data, dmg_size);
|
||||
}
|
||||
|
||||
SNES::cartridge.load(SNES::Cartridge::Mode::SuperGameBoy, string(xmlrom, ""));
|
||||
SNES::system.power();
|
||||
return true;
|
||||
}
|
||||
@ -215,12 +224,10 @@ uint8_t* snes_get_memory_data(unsigned id) {
|
||||
return SNES::memory::stBram.data();
|
||||
case SNES_MEMORY_GAME_BOY_RAM:
|
||||
if(SNES::cartridge.mode.i != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||
SNES::supergameboy.save();
|
||||
return SNES::memory::gbram.data();
|
||||
return GameBoy::cartridge.ramdata;
|
||||
case SNES_MEMORY_GAME_BOY_RTC:
|
||||
if(SNES::cartridge.mode.i != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||
SNES::supergameboy.save();
|
||||
return SNES::memory::gbrtc.data();
|
||||
return 0; // FIXME: Where is this stored?
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -255,12 +262,11 @@ unsigned snes_get_memory_size(unsigned id) {
|
||||
break;
|
||||
case SNES_MEMORY_GAME_BOY_RAM:
|
||||
if(SNES::cartridge.mode.i != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||
size = SNES::memory::gbram.size();
|
||||
size = GameBoy::cartridge.ramsize;
|
||||
break;
|
||||
case SNES_MEMORY_GAME_BOY_RTC:
|
||||
if(SNES::cartridge.mode.i != SNES::Cartridge::Mode::SuperGameBoy) break;
|
||||
size = SNES::memory::gbrtc.size();
|
||||
break;
|
||||
size = 0; // FIXME: Where is this stored?
|
||||
}
|
||||
|
||||
if(size == -1U) size = 0;
|
||||
|
@ -156,7 +156,7 @@ void System::power() {
|
||||
if(cartridge.mode.i == Cartridge::Mode::SuperGameBoy) cpu.coprocessors.append(&icd2);
|
||||
if(cartridge.has_superfx()) cpu.coprocessors.append(&superfx);
|
||||
if(cartridge.has_sa1()) cpu.coprocessors.append(&sa1);
|
||||
if(cartridge.has_upd77c25()) cpu.coprocessors.append(&necdsp);
|
||||
if(cartridge.has_necdsp()) cpu.coprocessors.append(&necdsp);
|
||||
if(cartridge.has_msu1()) cpu.coprocessors.append(&msu1);
|
||||
if(cartridge.has_serial()) cpu.coprocessors.append(&serial);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user