Should finally compile.

This commit is contained in:
Themaister 2011-01-12 16:55:14 +01:00
parent 82aa116b90
commit e6f610eb82
20 changed files with 641 additions and 597 deletions

View File

@ -23,9 +23,10 @@ compile = \
) \
)
all: library;
include gameboy/Makefile
all: library;
set-static:
$(eval fpic := )

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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();

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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();

View File

@ -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) {
}
}
}

View File

@ -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 {

View File

@ -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) {}
};
}

View File

@ -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/)

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);