Add files via upload
This commit is contained in:
parent
83cf32e9a9
commit
6e5eaba155
|
@ -524,7 +524,19 @@ static unsigned pow2ceil(unsigned 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));
|
||||
|
||||
//if (rom->fail())
|
||||
|
@ -621,19 +633,41 @@ int Cartridge::loadROM(const char *romfiledata, unsigned romfilelength, const bo
|
|||
std::printf("rambanks: %u\n", rambanks);
|
||||
|
||||
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));
|
||||
|
||||
mbc.reset();
|
||||
|
||||
use_bios = biosfilelength > 0 ? true : false;
|
||||
loc_bios_length = biosfilelength;
|
||||
|
||||
memptrs.reset(rombanks, rambanks, cgb ? 8 : 2);
|
||||
rtc.set(false, 0);
|
||||
|
||||
//rom->rewind();
|
||||
//rom->read(reinterpret_cast<char*>(memptrs.romdata()), (filesize / 0x4000) * 0x4000ul);
|
||||
|
||||
std::memcpy(memptrs.romdata(), romfiledata, (filesize / 0x4000) * 0x4000ul);
|
||||
std::memset(memptrs.romdata() + (filesize / 0x4000) * 0x4000ul, 0xFF, (rombanks - filesize / 0x4000) * 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())
|
||||
// return -1;
|
||||
|
||||
|
|
|
@ -67,6 +67,9 @@ public:
|
|||
void setStatePtrs(SaveState &);
|
||||
void loadState(const SaveState &);
|
||||
|
||||
bool use_bios;
|
||||
unsigned loc_bios_length;
|
||||
|
||||
bool loaded() const { return mbc.get(); }
|
||||
|
||||
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;
|
||||
|
||||
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); }
|
||||
|
||||
void setRTCCallback(std::uint32_t (*callback)()) {
|
||||
rtc.setRTCCallback(callback);
|
||||
}
|
||||
|
||||
void bios_remap(int setting);
|
||||
|
||||
template<bool isReader>void SyncState(NewState *ns);
|
||||
};
|
||||
|
||||
|
|
|
@ -35,10 +35,14 @@ MemPtrs::~MemPtrs() {
|
|||
|
||||
void MemPtrs::reset(const unsigned rombanks, const unsigned rambanks, const unsigned wrambanks) {
|
||||
delete []memchunk_;
|
||||
delete []biosdata_;
|
||||
delete []notbiosdata_;
|
||||
|
||||
memchunk_len = 0x4000 + rombanks * 0x4000ul + 0x4000 + rambanks * 0x2000ul + wrambanks * 0x1000ul + 0x4000;
|
||||
memchunk_ = new unsigned char[memchunk_len];
|
||||
|
||||
romdata_[0] = romdata();
|
||||
|
||||
rambankdata_ = romdata_[0] + rombanks * 0x4000ul + 0x4000;
|
||||
wramdata_[0] = rambankdata_ + rambanks * 0x2000ul;
|
||||
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) {
|
||||
|
||||
romdata_[0] = romdata() + bank * 0x4000ul;
|
||||
|
||||
rmem_[0x3] = rmem_[0x2] = rmem_[0x1] = rmem_[0x0] = romdata_[0];
|
||||
disconnectOamDmaAreas();
|
||||
}
|
||||
|
||||
void MemPtrs::setRombank(const unsigned bank) {
|
||||
|
||||
romdata_[1] = romdata() + bank * 0x4000ul - 0x4000;
|
||||
|
||||
rmem_[0x7] = rmem_[0x6] = rmem_[0x5] = rmem_[0x4] = romdata_[1];
|
||||
disconnectOamDmaAreas();
|
||||
}
|
||||
|
|
|
@ -51,6 +51,9 @@ class MemPtrs {
|
|||
unsigned char * rdisabledRamw() const { return wramdataend_ ; }
|
||||
unsigned char * wdisabledRam() const { return wramdataend_ + 0x2000; }
|
||||
public:
|
||||
unsigned char *biosdata_;
|
||||
unsigned char *notbiosdata_;
|
||||
|
||||
enum RamFlag { READ_EN = 1, WRITE_EN = 2, RTC_EN = 4 };
|
||||
|
||||
MemPtrs();
|
||||
|
@ -61,7 +64,7 @@ public:
|
|||
unsigned char * wmem(unsigned area) const { return wmem_[area]; }
|
||||
unsigned char * vramdata() const { return rambankdata_ - 0x4000; }
|
||||
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 * romdataend() const { return rambankdata_ - 0x4000; }
|
||||
unsigned char * wramdata(unsigned area) const { return wramdata_[area]; }
|
||||
|
|
Loading…
Reference in New Issue