Add files via upload

This commit is contained in:
alyosha-tas 2017-06-24 12:55:10 -04:00 committed by GitHub
parent 83cf32e9a9
commit 6e5eaba155
4 changed files with 990 additions and 940 deletions

View File

@ -524,7 +524,19 @@ static unsigned pow2ceil(unsigned n) {
return n; return n;
} }
int Cartridge::loadROM(const char *romfiledata, unsigned romfilelength, const bool forceDmg, const bool multicartCompat) { void Cartridge::bios_remap(int setting) {
// disable the BIOS if writing 1 or 0x22 (GBC)
if (setting == 1 || setting == 0x11) {
std::memcpy(memptrs.romdata(), memptrs.notbiosdata_, loc_bios_length);
}
// we'll also use it to reset to BIOS on reset
if (setting == 0) {
std::memcpy(memptrs.romdata(), memptrs.biosdata_, loc_bios_length);
}
}
int Cartridge::loadROM(const char *romfiledata, unsigned romfilelength, const char *biosfiledata, unsigned biosfilelength, const bool forceDmg, const bool multicartCompat) {
//const std::auto_ptr<File> rom(newFileInstance(romfile)); //const std::auto_ptr<File> rom(newFileInstance(romfile));
//if (rom->fail()) //if (rom->fail())
@ -621,19 +633,41 @@ int Cartridge::loadROM(const char *romfiledata, unsigned romfilelength, const bo
std::printf("rambanks: %u\n", rambanks); std::printf("rambanks: %u\n", rambanks);
const std::size_t filesize = romfilelength; //rom->size(); const std::size_t filesize = romfilelength; //rom->size();
rombanks = std::max(pow2ceil(filesize / 0x4000), 2u); rombanks = std::fmax(pow2ceil(filesize / 0x4000), 2u);
std::printf("rombanks: %u\n", static_cast<unsigned>(filesize / 0x4000)); std::printf("rombanks: %u\n", static_cast<unsigned>(filesize / 0x4000));
mbc.reset(); mbc.reset();
use_bios = biosfilelength > 0 ? true : false;
loc_bios_length = biosfilelength;
memptrs.reset(rombanks, rambanks, cgb ? 8 : 2); memptrs.reset(rombanks, rambanks, cgb ? 8 : 2);
rtc.set(false, 0); rtc.set(false, 0);
//rom->rewind(); //rom->rewind();
//rom->read(reinterpret_cast<char*>(memptrs.romdata()), (filesize / 0x4000) * 0x4000ul); //rom->read(reinterpret_cast<char*>(memptrs.romdata()), (filesize / 0x4000) * 0x4000ul);
std::memcpy(memptrs.romdata(), romfiledata, (filesize / 0x4000) * 0x4000ul); std::memcpy(memptrs.romdata(), romfiledata, (filesize / 0x4000) * 0x4000ul);
std::memset(memptrs.romdata() + (filesize / 0x4000) * 0x4000ul, 0xFF, (rombanks - filesize / 0x4000) * 0x4000ul); std::memset(memptrs.romdata() + (filesize / 0x4000) * 0x4000ul, 0xFF, (rombanks - filesize / 0x4000) * 0x4000ul);
enforce8bit(memptrs.romdata(), rombanks * 0x4000ul); enforce8bit(memptrs.romdata(), rombanks * 0x4000ul);
//we want to copy in the bios data only if it exists
if (use_bios) {
memptrs.biosdata_ = new unsigned char[biosfilelength];
memptrs.notbiosdata_ = new unsigned char[biosfilelength];
std::memcpy(memptrs.biosdata_, biosfiledata, biosfilelength);
std::memcpy(memptrs.notbiosdata_, romfiledata, biosfilelength);
//if using GBC, the header is not overwritten by the BIOS
if (biosfilelength > 256) {
std::memcpy(memptrs.biosdata_ + 256, memptrs.notbiosdata_ + 256, 256);
}
std::memcpy(memptrs.romdata(), memptrs.biosdata_, biosfilelength);
}
//if (rom->fail()) //if (rom->fail())
// return -1; // return -1;

View File

@ -67,6 +67,9 @@ public:
void setStatePtrs(SaveState &); void setStatePtrs(SaveState &);
void loadState(const SaveState &); void loadState(const SaveState &);
bool use_bios;
unsigned loc_bios_length;
bool loaded() const { return mbc.get(); } bool loaded() const { return mbc.get(); }
const unsigned char * rmem(unsigned area) const { return memptrs.rmem(area); } const unsigned char * rmem(unsigned area) const { return memptrs.rmem(area); }
@ -97,13 +100,15 @@ public:
bool getMemoryArea(int which, unsigned char **data, int *length) const; bool getMemoryArea(int which, unsigned char **data, int *length) const;
int loadROM(const char *romfiledata, unsigned romfilelength, bool forceDmg, bool multicartCompat); int loadROM(const char *romfiledata, unsigned romfilelength, const char *biosfiledata, unsigned biosfilelength, bool forceDmg, bool multicartCompat);
const char * romTitle() const { return reinterpret_cast<const char *>(memptrs.romdata() + 0x134); } const char * romTitle() const { return reinterpret_cast<const char *>(memptrs.romdata() + 0x134); }
void setRTCCallback(std::uint32_t (*callback)()) { void setRTCCallback(std::uint32_t (*callback)()) {
rtc.setRTCCallback(callback); rtc.setRTCCallback(callback);
} }
void bios_remap(int setting);
template<bool isReader>void SyncState(NewState *ns); template<bool isReader>void SyncState(NewState *ns);
}; };

View File

@ -35,10 +35,14 @@ MemPtrs::~MemPtrs() {
void MemPtrs::reset(const unsigned rombanks, const unsigned rambanks, const unsigned wrambanks) { void MemPtrs::reset(const unsigned rombanks, const unsigned rambanks, const unsigned wrambanks) {
delete []memchunk_; delete []memchunk_;
delete []biosdata_;
delete []notbiosdata_;
memchunk_len = 0x4000 + rombanks * 0x4000ul + 0x4000 + rambanks * 0x2000ul + wrambanks * 0x1000ul + 0x4000; memchunk_len = 0x4000 + rombanks * 0x4000ul + 0x4000 + rambanks * 0x2000ul + wrambanks * 0x1000ul + 0x4000;
memchunk_ = new unsigned char[memchunk_len]; memchunk_ = new unsigned char[memchunk_len];
romdata_[0] = romdata(); romdata_[0] = romdata();
rambankdata_ = romdata_[0] + rombanks * 0x4000ul + 0x4000; rambankdata_ = romdata_[0] + rombanks * 0x4000ul + 0x4000;
wramdata_[0] = rambankdata_ + rambanks * 0x2000ul; wramdata_[0] = rambankdata_ + rambanks * 0x2000ul;
wramdataend_ = wramdata_[0] + wrambanks * 0x1000ul; wramdataend_ = wramdata_[0] + wrambanks * 0x1000ul;
@ -60,13 +64,17 @@ void MemPtrs::reset(const unsigned rombanks, const unsigned rambanks, const unsi
} }
void MemPtrs::setRombank0(const unsigned bank) { void MemPtrs::setRombank0(const unsigned bank) {
romdata_[0] = romdata() + bank * 0x4000ul; romdata_[0] = romdata() + bank * 0x4000ul;
rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0]; rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0];
disconnectOamDmaAreas(); disconnectOamDmaAreas();
} }
void MemPtrs::setRombank(const unsigned bank) { void MemPtrs::setRombank(const unsigned bank) {
romdata_[1] = romdata() + bank * 0x4000ul - 0x4000; romdata_[1] = romdata() + bank * 0x4000ul - 0x4000;
rmem_[0x7] = rmem_[0x6] = rmem_[0x5] = rmem_[0x4] = romdata_[1]; rmem_[0x7] = rmem_[0x6] = rmem_[0x5] = rmem_[0x4] = romdata_[1];
disconnectOamDmaAreas(); disconnectOamDmaAreas();
} }

View File

@ -51,6 +51,9 @@ class MemPtrs {
unsigned char * rdisabledRamw() const { return wramdataend_ ; } unsigned char * rdisabledRamw() const { return wramdataend_ ; }
unsigned char * wdisabledRam() const { return wramdataend_ + 0x2000; } unsigned char * wdisabledRam() const { return wramdataend_ + 0x2000; }
public: public:
unsigned char *biosdata_;
unsigned char *notbiosdata_;
enum RamFlag { READ_EN = 1, WRITE_EN = 2, RTC_EN = 4 }; enum RamFlag { READ_EN = 1, WRITE_EN = 2, RTC_EN = 4 };
MemPtrs(); MemPtrs();
@ -61,7 +64,7 @@ public:
unsigned char * wmem(unsigned area) const { return wmem_[area]; } unsigned char * wmem(unsigned area) const { return wmem_[area]; }
unsigned char * vramdata() const { return rambankdata_ - 0x4000; } unsigned char * vramdata() const { return rambankdata_ - 0x4000; }
unsigned char * vramdataend() const { return rambankdata_; } unsigned char * vramdataend() const { return rambankdata_; }
unsigned char * romdata() const { return memchunk_ + 0x4000; } unsigned char * romdata() const { return memchunk_ + 0x4000;}
unsigned char * romdata(unsigned area) const { return romdata_[area]; } unsigned char * romdata(unsigned area) const { return romdata_[area]; }
unsigned char * romdataend() const { return rambankdata_ - 0x4000; } unsigned char * romdataend() const { return rambankdata_ - 0x4000; }
unsigned char * wramdata(unsigned area) const { return wramdata_[area]; } unsigned char * wramdata(unsigned area) const { return wramdata_[area]; }