Advertisement
Guest User

dmzel fix code

a guest
Aug 4th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.27 KB | None | 0 0
  1. int main(int argc, char* argv[])
  2. {
  3. std::vector<uint8_t> rom;
  4. {
  5. std::ifstream file("C:\\dmg\\dmzel", std::ios::binary);
  6. if (file && file.is_open())
  7. {
  8. file.seekg(0, std::ios::end);
  9. uint64_t size = file.tellg();
  10. file.seekg(0x4000, std::ios::beg);
  11.  
  12. int addr = 0;
  13. // read 0x4000 bytes from 0x4000 - 0x7FFF in each 0x10000 segment
  14. while (size > file.tellg())
  15. {
  16. rom.resize(rom.size() + 0x4000);
  17. file.read((char*)rom.data() + addr, 0x4000);
  18. addr += 0x4000;
  19. file.seekg(0xc000, std::ios::cur);
  20. }
  21. }
  22. }
  23.  
  24. auto p = (char*)rom.data();
  25.  
  26. // Fix header mapper type
  27. p[0x147] = 0x1b;
  28.  
  29. // Fix header checksum
  30. uint8_t hdr_sum = 0;
  31. for (int i = 0x134; i < 0x14D; i++)
  32. hdr_sum = hdr_sum - p[i] - 1;
  33.  
  34. p[0x14D] = hdr_sum;
  35.  
  36. // Fix global checksum
  37. uint16_t gbsum = 0;
  38. for (int i = 0; i < rom.size(); i++)
  39. {
  40. if (i == 0x14E || i == 0x14F)
  41. continue; // cksum field not included in sum
  42. gbsum += (uint8_t)p[i];
  43. }
  44.  
  45. p[0x14E] = (gbsum >> 8) & 0xFF;
  46. p[0x14F] = gbsum & 0xFF;
  47.  
  48. // Write out file
  49. std::ofstream out("C:\\dmg\\dmzel_fixed.gbc", std::ios_base::binary);
  50. if (out && out.is_open())
  51. out.write(p, rom.size());
  52.  
  53. return 0;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement