Advertisement
rubixcuber

SnesToPC

Jan 25th, 2021
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.78 KB | None | 0 0
  1. bool HasHeader(string path)
  2. {
  3. if (!File.Exists(path)) return false;
  4.  
  5. long size = new System.IO.FileInfo(path).Length;
  6.  
  7. if ((size & 0x000200) != 0) return true;
  8.  
  9. return false;
  10. }
  11.  
  12. bool IsHirom(string path)
  13. {
  14. if (!File.Exists(path)) return false;
  15. BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read));
  16.  
  17. try
  18. {
  19. int o = 0x7FD5;
  20. if (HasHeader(path)) o += 0x200;
  21. reader.BaseStream.Seek(o, SeekOrigin.Begin);
  22. byte v = reader.ReadByte();
  23. reader.Close();
  24. if ((v & 1) == 1) return true;
  25. return false;
  26. }
  27. catch(Exception e)
  28. {
  29. reader.Close();
  30. return false;
  31. }
  32. }
  33.  
  34. uint SNESToPC(string path, uint addr)
  35. {
  36. return SNESToPC(path, addr & 0x0000FF, (addr & 0x00FF00)/0x100, (addr & 0xFF0000) / 0x10000);
  37. }
  38.  
  39. uint SNESToPC(string path, uint addrlo, uint addrhi, uint bank)
  40. {
  41.  
  42. bool header = HasHeader(path);
  43.  
  44. if (IsHirom(path))
  45. {
  46. uint addr = (addrlo) + (addrhi * 0x100) + (bank * 0x10000);
  47. if ((addr & 0x400000) != 0)
  48. {
  49. addr &= 0x3FFFFF;
  50. }
  51. else
  52. {
  53. addr = ((addr & 0x8000)!=0) ? addr & 0x3FFFFF : 0;
  54. }
  55. return addr;
  56. }
  57. else
  58. {
  59. bank &= 0x7F;
  60. return (uint)((addrlo & 0xFF) + (0x100 * (addrhi & 0xFF)) + (0x8000 * bank) - ((header) ? 0 : 0x200) - 0x7E00);
  61. }
  62. }
  63.  
  64. uint SNESToPC(bool header, bool hirom, uint addr)
  65. {
  66. return SNESToPC(header, hirom, addr & 0x0000FF, (addr & 0x00FF00) / 0x100, (addr & 0xFF0000) / 0x10000);
  67. }
  68.  
  69. uint SNESToPC(bool header, bool hirom, uint addrlo, uint addrhi, uint bank)
  70. {
  71.  
  72. if (hirom)
  73. {
  74. uint addr = (addrlo) + (addrhi * 0x100) + (bank * 0x10000);
  75. if ((addr & 0x400000) != 0)
  76. {
  77. addr &= 0x3FFFFF;
  78. }
  79. else
  80. {
  81. addr = ((addr & 0x8000) != 0) ? addr & 0x3FFFFF : 0;
  82. }
  83. return addr;
  84. }
  85. else
  86. {
  87. bank &= 0x7F;
  88. return (uint)((addrlo & 0xFF) + (0x100 * (addrhi & 0xFF)) + (0x8000 * bank) - ((header) ? 0 : 0x200) - 0x7E00);
  89. }
  90. }
  91.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement