Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int main(int argc, char* argv[])
- {
- std::vector<uint8_t> rom;
- {
- std::ifstream file("C:\\dmg\\dmzel", std::ios::binary);
- if (file && file.is_open())
- {
- file.seekg(0, std::ios::end);
- uint64_t size = file.tellg();
- file.seekg(0x4000, std::ios::beg);
- int addr = 0;
- // read 0x4000 bytes from 0x4000 - 0x7FFF in each 0x10000 segment
- while (size > file.tellg())
- {
- rom.resize(rom.size() + 0x4000);
- file.read((char*)rom.data() + addr, 0x4000);
- addr += 0x4000;
- file.seekg(0xc000, std::ios::cur);
- }
- }
- }
- auto p = (char*)rom.data();
- // Fix header mapper type
- p[0x147] = 0x1b;
- // Fix header checksum
- uint8_t hdr_sum = 0;
- for (int i = 0x134; i < 0x14D; i++)
- hdr_sum = hdr_sum - p[i] - 1;
- p[0x14D] = hdr_sum;
- // Fix global checksum
- uint16_t gbsum = 0;
- for (int i = 0; i < rom.size(); i++)
- {
- if (i == 0x14E || i == 0x14F)
- continue; // cksum field not included in sum
- gbsum += (uint8_t)p[i];
- }
- p[0x14E] = (gbsum >> 8) & 0xFF;
- p[0x14F] = gbsum & 0xFF;
- // Write out file
- std::ofstream out("C:\\dmg\\dmzel_fixed.gbc", std::ios_base::binary);
- if (out && out.is_open())
- out.write(p, rom.size());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement