14 auto location = 0x7FC0;
15 rom_size_ = 0x400 << rom_data[location + 0x17];
16 sram_size_ = 0x400 << rom_data[location + 0x18];
20 std::copy(rom_data.begin(), rom_data.begin() +
rom_size_,
rom_.begin());
22 std::fill(
ram_.begin(),
ram_.end(), 0);
29 size_t rom_data_size = rom_data.size();
30 size_t rom_address = 0;
31 const size_t ROM_CHUNK_SIZE = 0x8000;
32 for (
size_t bank = 0x00; bank <= 0x3F; ++bank) {
33 for (
size_t offset = 0x8000; offset <= 0xFFFF; offset += ROM_CHUNK_SIZE) {
34 if (rom_address < rom_data_size) {
35 std::copy(rom_data.begin() + rom_address,
36 rom_data.begin() + rom_address + ROM_CHUNK_SIZE,
37 memory_.begin() + (bank << 16) + offset);
38 rom_address += ROM_CHUNK_SIZE;
75 if (((bank >= 0x70 && bank < 0x7e) || bank >= 0xf0) && adr < 0x8000 &&
81 if (adr >= 0x8000 || bank >= 0x40) {
83 return rom_[((bank << 15) | (adr & 0x7fff)) & (
rom_size_ - 1)];
89 if (((bank >= 0x70 && bank < 0x7e) || bank > 0xf0) && adr < 0x8000 &&
98 if (bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
100 return ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (
sram_size_ - 1)];
102 if (adr >= 0x8000 || bank >= 0x40) {
104 return rom_[(((bank & 0x3f) << 16) | adr) & (
rom_size_ - 1)];
110 if ((bank & 0x7f) < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
112 return ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (
sram_size_ - 1)];
114 bool secondHalf = bank < 0x80;
116 if (adr >= 0x8000 || bank >= 0x40) {
118 return rom_[(((bank & 0x3f) << 16) | (secondHalf ? 0x400000 : 0) | adr) &
126 if (bank < 0x40 && adr >= 0x6000 && adr < 0x8000 && sram_size_ > 0) {
128 ram_[(((bank & 0x3f) << 13) | (adr & 0x1fff)) & (
sram_size_ - 1)] = val;
133 uint8_t bank = address >> 16;
134 uint32_t offset = address & 0xFFFF;
137 if (address <= 0x1FFF) {
138 return (0x7E << 16) + offset;
139 }
else if (address <= 0x5FFF) {
140 return (bank << 16) + (offset - 0x2000) + 0x2000;
141 }
else if (address <= 0x7FFF) {
142 return offset - 0x6000 + 0x6000;
145 return (bank << 16) + (offset - 0x8000) + 0x8000;
147 }
else if (bank == 0x7D) {
148 return offset + 0x7D0000;
149 }
else if (bank == 0x7E || bank == 0x7F) {
150 return offset + 0x7E0000;
151 }
else if (bank >= 0x80) {
std::vector< uint8_t > rom_
std::vector< uint8_t > ram_
uint8_t cart_readHirom(uint8_t bank, uint16_t adr)
uint32_t GetMappedAddress(uint32_t address) const
uint8_t cart_read(uint8_t bank, uint16_t adr)
std::vector< uint8_t > memory_
void cart_writeLorom(uint8_t bank, uint16_t adr, uint8_t val)
uint8_t cart_readLorom(uint8_t bank, uint16_t adr)
uint8_t cart_readExHirom(uint8_t bank, uint16_t adr)
void cart_write(uint8_t bank, uint16_t adr, uint8_t val)
void cart_writeHirom(uint8_t bank, uint16_t adr, uint8_t val)
void Initialize(const std::vector< uint8_t > &romData, bool verbose=false)
SNES Emulation and debugging tools.
Main namespace for the application.