PageRenderTime 53ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/tools/ref/emu8x/rom.java

https://code.google.com/p/lifos/
Java | 447 lines | 386 code | 1 blank | 60 comment | 75 complexity | 788a46cc887a5c6f63810813bd14dc1d MD5 | raw file
Possible License(s): BSD-3-Clause
  1. import java.io.*;
  2. public class rom {
  3. public static void main (String[] args) throws IOException
  4. {
  5. int model;
  6. InputStreamReader isr = new InputStreamReader(System.in);
  7. BufferedReader stdin = new BufferedReader(isr);
  8. System.out.println("Enter the filename of the ROM dump:");
  9. String romfile = stdin.readLine();
  10. System.out.print("Enter the model of this ROM (82, 83, 85, 86): ");
  11. try {
  12. model = Integer.parseInt(stdin.readLine());
  13. } catch (NumberFormatException exception) {
  14. System.out.println("Invalid model.");
  15. return;
  16. }
  17. if (model != 82 && model != 83 && model != 85 && model != 86)
  18. {
  19. System.out.println("Invalid model.");
  20. return;
  21. }
  22. //Now open the file
  23. File emulator = new File("Emulator.bin");
  24. File rom = new File(romfile);
  25. InputStream emu = new FileInputStream(emulator);
  26. InputStream romf = new FileInputStream(rom);
  27. long fl;
  28. fl = emulator.length();
  29. byte[] dataEmulator = new byte[(int) fl];
  30. emu.read(dataEmulator);
  31. fl = rom.length();
  32. byte[] dataROM = new byte[(int) fl];
  33. romf.read(dataROM);
  34. emu.close();
  35. romf.close();
  36. //Now find the bytes for the stored ROM images and
  37. //add the appropriate one
  38. int i = 0x83;
  39. while (dataEmulator[i] != -1)
  40. {
  41. i++;
  42. }
  43. if (i > 0x86)
  44. {
  45. System.out.println("The Emulator.bin file already contains 4 ROM images. No more may be added.");
  46. return;
  47. }
  48. byte n = 0;
  49. byte newpages = 0;
  50. switch (model)
  51. {
  52. case 82:
  53. newpages = 8;
  54. n = 0;
  55. break;
  56. case 83:
  57. newpages = 13;
  58. n = 1;
  59. break;
  60. case 85:
  61. newpages = 8;
  62. n = 2;
  63. break;
  64. case 86:
  65. newpages = 14;
  66. n = 3;
  67. break;
  68. }
  69. //Check ROM version
  70. String outmsg = "";
  71. int checksum = 0, j = 0;
  72. int patches[];
  73. if (model == 82)
  74. {
  75. for (j = 0; j < (128*1024); j++)
  76. checksum += dataROM[j];
  77. if (checksum == 496640)
  78. {
  79. //82 ROM 16.0
  80. outmsg = "TI-82 v16.0";
  81. patches = new int[] {0xBB, 0xD0, 0xE7, 0xFA, 0x116, 0x592, 0x5CB, 0x209F, 0x4C7D, 0x4CA8, 0x4CED, 0x4CF8, 0x4D01, 0x4D25, 0x4D37, 0x4D41, 0x4D52, 0x4D5B, 0x52C9, 0x52E3, 0x5349, 0x5372, 0x53AA, 0x53B0, 0x5441, 0x545A, 0x5463, 0x558D, 0x5597, 0x55B9, 0x57F4, 0x57FD, 0x581D, 0x582D, 0x5852, 0x585D, 0x5863, 0x7824, 0x7833, 0x783A, 0x7857, 0xA8BA, 0xA8CB, 0xA8D2, 0xA8F3, 0xB1D1, 0xB293, 0xCEDF, 0x100D9, 0x100E4, 0x10115, 0x10120, 0x10138, 0x11B33, 0x11B42, 0x11B49, 0x11B52, 0x11B61, 0x12040, 0x12046, 0x1204D, 0x16563, 0x16601, 0x16607, 0x1660F, 0x16615, 0x16635, 0x1663B, 0x16641, 0x192D6, 0x193F2, 0x193F9, 0x19400, 0x19407, 0x1940E, 0x19415, 0x19421};
  82. for (j = 0; j < patches.length; j++)
  83. {
  84. dataROM[patches[j]] = -128 + 0x6D;
  85. dataROM[patches[j]+1] = -1;
  86. }
  87. dataROM[0x11B30] = -128 + 0x6D;
  88. dataROM[0x11B31] = -2;
  89. //On key delay
  90. dataROM[0x554] = 0x00;
  91. dataROM[0x555] = 0x03;
  92. }
  93. if (checksum == 496896)
  94. {
  95. //82 ROM 17.0
  96. outmsg = "TI-82 v17.0";
  97. patches = new int[] {0xBB, 0xD0, 0xE7, 0xFA, 0x116, 0x592, 0x5CB, 0x209F, 0x4C7D, 0x4CA8, 0x4CED, 0x4CF8, 0x4D01, 0x4D25, 0x4D37, 0x4D41, 0x4D52, 0x4D5B, 0x52C9, 0x52E3, 0x5349, 0x5372, 0x53AA, 0x53B0, 0x5441, 0x545A, 0x5463, 0x558D, 0x5597, 0x55B9, 0x57F4, 0x57FD, 0x581D, 0x582D, 0x5852, 0x585D, 0x5863, 0x7824, 0x7833, 0x783A, 0x7857, 0xA8BA, 0xA8CB, 0xA8D2, 0xA8F3, 0xB1D1, 0xB293, 0xCEDF, 0x100D9, 0x100E4, 0x10115, 0x10120, 0x10138, 0x11B33, 0x11B42, 0x11B49, 0x11B52, 0x11B61, 0x12040, 0x12046, 0x1204D, 0x16569, 0x16607, 0x1660D, 0x16615, 0x1661B, 0x1663B, 0x16641, 0x16647, 0x192D6, 0x193F2, 0x193F9, 0x19400, 0x19407, 0x1940E, 0x19415, 0x19421};
  98. for (j = 0; j < patches.length; j++)
  99. {
  100. dataROM[patches[j]] = -128 + 0x6D;
  101. dataROM[patches[j]+1] = -1;
  102. }
  103. //Replace LCD copy with routine in ED,FE opcode
  104. dataROM[0x11B30] = -128 + 0x6D;
  105. dataROM[0x11B31] = -2;
  106. //On key delay
  107. dataROM[0x554] = 0x00;
  108. dataROM[0x555] = 0x03;
  109. }
  110. if (checksum == 501248)
  111. {
  112. //82 ROM 18.0
  113. outmsg = "TI-82 v18.0";
  114. patches = new int[] {0xBB, 0xD0, 0xE7, 0xFA, 0x116, 0x592, 0x5CB, 0x209F, 0x4C7D, 0x4CA8, 0x4CED, 0x4CF8, 0x4D01, 0x4D25, 0x4D37, 0x4D41, 0x4D52, 0x4D5B, 0x52C9, 0x52E3, 0x5349, 0x5372, 0x53AA, 0x53B0, 0x5441, 0x545A, 0x5463, 0x558D, 0x5597, 0x55B9, 0x57F4, 0x57FD, 0x581D, 0x582D, 0x5852, 0x585D, 0x5863, 0x7824, 0x7833, 0x783A, 0x7857, 0xA8BA, 0xA8CB, 0xA8D2, 0xA8F3, 0xB1DB, 0xB29D, 0xCEDF, 0x100D9, 0x100E4, 0x10115, 0x10120, 0x10138, 0x11B33, 0x11B42, 0x11B49, 0x11B52, 0x11B61, 0x12040, 0x12046, 0x1204D, 0x16569, 0x16607, 0x1660D, 0x16615, 0x1661B, 0x1663B, 0x16641, 0x16647, 0x192E5, 0x19401, 0x19408, 0x1940F, 0x19416, 0x1941D, 0x19424, 0x19430};
  115. for (j = 0; j < patches.length; j++)
  116. {
  117. dataROM[patches[j]] = -128 + 0x6D;
  118. dataROM[patches[j]+1] = -1;
  119. }
  120. //Replace LCD copy with routine in ED,FE opcode
  121. dataROM[0x11B30] = -128 + 0x6D;
  122. dataROM[0x11B31] = -2;
  123. //On key delay
  124. dataROM[0x554] = 0x00;
  125. dataROM[0x555] = 0x03;
  126. }
  127. if (checksum == 493312)
  128. {
  129. //82 ROM 19.0
  130. outmsg = "TI-82 v19.0";
  131. patches = new int[] {0xBB, 0xD0, 0xE7, 0xFA, 0x116, 0x592, 0x5CB, 0x20B9, 0x4C7D, 0x4CA8, 0x4CED, 0x4CF8, 0x4D01, 0x4D25, 0x4D37, 0x4D41, 0x4D52, 0x4D5B, 0x52C9, 0x52E3, 0x5349, 0x5372, 0x53AA, 0x53B0, 0x5441, 0x545A, 0x5463, 0x558D, 0x5597, 0x55B9, 0x57F4, 0x57FD, 0x581D, 0x582D, 0x5852, 0x585D, 0x5863, 0x7824, 0x7833, 0x783A, 0x7857, 0xA8C3, 0xA8D4, 0xA8DB, 0xA8FC, 0xB1EB, 0xB2AD, 0xCEDF, 0x100D9, 0x100E4, 0x10115, 0x10120, 0x10138, 0x11B33, 0x11B42, 0x11B49, 0x11B52, 0x11B61, 0x12040, 0x12046, 0x1204D, 0x16569, 0x16607, 0x1660D, 0x16615, 0x1661B, 0x1663B, 0x16641, 0x16647, 0x192E5, 0x19401, 0x19408, 0x1940F, 0x19416, 0x1941D, 0x19424, 0x19430};
  132. for (j = 0; j < patches.length; j++)
  133. {
  134. dataROM[patches[j]] = -128 + 0x6D;
  135. dataROM[patches[j]+1] = -1;
  136. }
  137. //LCD copy
  138. dataROM[0x11B30] = -128 + 0x6D;
  139. dataROM[0x11B31] = -2;
  140. //On key delay
  141. dataROM[0x554] = 0x00;
  142. dataROM[0x555] = 0x03;
  143. }
  144. if (checksum == 456607)
  145. {
  146. //82 ROM 19.006
  147. outmsg = "TI-82 v19.006";
  148. patches = new int[] { 0xBB, 0xD0, 0xE7, 0xFA, 0x135, 0x5E5, 0x611, 0x21E4, 0x4C7D, 0x4CA8, 0x4CED, 0x4CF8, 0x4D01, 0x4D25, 0x4D37, 0x4D41, 0x4D52, 0x4D5B, 0x52C9, 0x52E3, 0x5349, 0x5372, 0x53AA, 0x53B0, 0x5441, 0x545A, 0x5463, 0x558D, 0x5597, 0x55B9, 0x57F4, 0x57FD, 0x581D, 0x582D, 0x5852, 0x585D, 0x5863, 0x7824, 0x7833, 0x783A, 0x7857, 0xA8BA, 0xA8CB, 0xA8D2, 0xA8F3, 0xB1DA, 0xB2CD, 0xCEDF, 0x100D9, 0x100E4, 0x10115, 0x10120, 0x10138, 0x11B33, 0x11B42, 0x11B49, 0x11B52, 0x11B61, 0x12040, 0x12046, 0x1204D, 0x16561, 0x165FF, 0x16605, 0x1660D, 0x16613, 0x16633, 0x16639, 0x1663F, 0x192EC, 0x19408, 0x1940F, 0x19416, 0x1941D, 0x19424, 0x1942B, 0x19437};
  149. for (j = 0; j < patches.length; j++)
  150. {
  151. dataROM[patches[j]] = -128 + 0x6D;
  152. dataROM[patches[j]+1] = -1;
  153. }
  154. //LCD copy
  155. dataROM[0x11B30] = -128 + 0x6D;
  156. dataROM[0x11B31] = -2;
  157. //On key delay
  158. dataROM[0x5A7] = 0x00;
  159. dataROM[0x5A8] = 0x03;
  160. //Link port patching
  161. patches = new int[] { 0x2F6B, 0xA984, 0xA986, 0xA9AF, 0xA9B4, 0xA9BA, 0xA9C1, 0xA9DD, 0xA9DF, 0xAAB5, 0xAAB7, 0xAACC, 0xAAD0, 0xAAD7, 0xAADB, 0xAAE9, 0xAAED, 0xAAF8, 0xAAFA, 0xAB12, 0xAB14, 0xAB1C, 0xAB27, 0xAB29, 0xB1EB, 0xB9AF, 0x19258, 0x1925A};
  162. byte[] patchvalues = new byte[] { -0x40, 0x03, 0x03, -0x18, -0x2C, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, -0x2C, 0x03, 0x02, 0x03, 0x03, -0x18, 0x03, 0x01, 0x03, -0x04, 0x03, 0x03};
  163. for (j = 0; j < patches.length; j++)
  164. {
  165. dataROM[patches[j]] = patchvalues[j];
  166. }
  167. }
  168. }
  169. if (model == 83)
  170. {
  171. for (j = 0; j < (128*1024); j++)
  172. checksum += dataROM[j];
  173. switch (checksum)
  174. {
  175. case 632323:
  176. outmsg = "TI-83 v1.02";
  177. //LCD copy
  178. patches = new int[] { 0x135, 0x14A, 0x161, 0x174, 0x190, 0x62A, 0x656, 0x20CF, 0x52CF, 0x52FA, 0x533E, 0x5349, 0x5352, 0x5376, 0x5388, 0x5392, 0x53A3, 0x53AC, 0x5915, 0x592F, 0x59B8, 0x59E1, 0x5A19, 0x5A1F, 0x5B1C, 0x5B35, 0x5B3E, 0x5C68, 0x5C72, 0x5C94, 0x5EB3, 0x5EBE, 0x5EC4, 0x7304, 0x7313, 0x731A, 0x7337, 0xC046, 0xC0E5, 0xC0EB, 0xC0F3, 0xC0F9, 0xC119, 0xC11F, 0xC125, 0x101EB, 0x101F6, 0x10225, 0x12105, 0x12114, 0x1211B, 0x1212B, 0x1213A, 0x1214B, 0x12575, 0x1257B, 0x12582, 0x188C4, 0x189E1, 0x189E8, 0x189EF, 0x189F6, 0x189FD, 0x18A04, 0x18A10, 0x1CBB3, 0x1CBC4, 0x1CBCB, 0x1CBEC, 0x1D6CB, 0x1E923, 0x1E92C, 0x1E94C, 0x1E95C, 0x20135, 0x2014A, 0x20161, 0x20174, 0x20190, 0x2062A, 0x20656, 0x220CF, 0x245F0};
  179. for (j = 0; j < patches.length; j++)
  180. {
  181. dataROM[patches[j]] = -128 + 0x6D;
  182. dataROM[patches[j]+1] = -1;
  183. }
  184. //LCD copy
  185. dataROM[0x12102] = -128 + 0x6D;
  186. dataROM[0x12103] = -2;
  187. //On key delay
  188. dataROM[0x5EC] = 0x00;
  189. dataROM[0x5ED] = 0x03;
  190. break;
  191. case 631904:
  192. outmsg = "TI-83 v1.03";
  193. //LCD copy
  194. patches = new int[] {0x135, 0x14A, 0x161, 0x174, 0x190, 0x62A, 0x656, 0x20CF, 0x52CF, 0x52FA, 0x533E, 0x5349, 0x5352, 0x5376, 0x5388, 0x5392, 0x53A3, 0x53AC, 0x5915, 0x592F, 0x59B8, 0x59E1, 0x5A19, 0x5A1F, 0x5B1C, 0x5B35, 0x5B3E, 0x5C68, 0x5C72, 0x5C94, 0x5EB3, 0x5EBE, 0x5EC4, 0x730B, 0x731A, 0x7321, 0x733E, 0xC046, 0xC0E5, 0xC0EB, 0xC0F3, 0xC0F9, 0xC119, 0xC11F, 0xC125, 0x101EB, 0x101F6, 0x10225, 0x12105, 0x12114, 0x1211B, 0x1212B, 0x1213A, 0x1214B, 0x12575, 0x1257B, 0x12582, 0x188C4, 0x189E1, 0x189E8, 0x189EF, 0x189F6, 0x189FD, 0x18A04, 0x18A10, 0x1CBB3, 0x1CBC4, 0x1CBCB, 0x1CBEC, 0x1D6CB, 0x1E925, 0x1E92E, 0x1E94E, 0x1E95E, 0x20135, 0x2014A, 0x20161, 0x20174, 0x20190, 0x2062A, 0x20656, 0x220CF, 0x245F0};
  195. for (j = 0; j < patches.length; j++)
  196. {
  197. dataROM[patches[j]] = -128 + 0x6D;
  198. dataROM[patches[j]+1] = -1;
  199. }
  200. //LCD copy
  201. dataROM[0x12102] = -128 + 0x6D;
  202. dataROM[0x12103] = -2;
  203. //On key
  204. dataROM[0x5EC] = 0x00;
  205. dataROM[0x5ED] = 0x03;
  206. break;
  207. case 631987:
  208. outmsg = "TI-83 v1.04";
  209. //LCD copy
  210. patches = new int[] {0x135, 0x14A, 0x161, 0x174, 0x190, 0x62A, 0x656, 0x20CF, 0x52CF, 0x52FA, 0x533E, 0x5349, 0x5352, 0x5376, 0x5388, 0x5392, 0x53A3, 0x53AC, 0x5915, 0x592F, 0x59B8, 0x59E1, 0x5A19, 0x5A1F, 0x5B1C, 0x5B35, 0x5B3E, 0x5C68, 0x5C72, 0x5C94, 0x5EB3, 0x5EBE, 0x5EC4, 0x730B, 0x731A, 0x7321, 0x733E, 0xC046, 0xC0E5, 0xC0EB, 0xC0F3, 0xC0F9, 0xC119, 0xC11F, 0xC125, 0x101EB, 0x101F6, 0x10225, 0x12105, 0x12114, 0x1211B, 0x1212B, 0x1213A, 0x1214B, 0x12575, 0x1257B, 0x12582, 0x188C4, 0x189E1, 0x189E8, 0x189EF, 0x189F6, 0x189FD, 0x18A04, 0x18A10, 0x1CBB3, 0x1CBC4, 0x1CBCB, 0x1CBEC, 0x1D6CB, 0x1E925, 0x1E92E, 0x1E94E, 0x1E95E, 0x20135, 0x2014A, 0x20161, 0x20174, 0x20190, 0x2062A, 0x20656, 0x220CF, 0x245F0};
  211. for (j = 0; j < patches.length; j++)
  212. {
  213. dataROM[patches[j]] = -128 + 0x6D;
  214. dataROM[patches[j]+1] = -1;
  215. }
  216. //LCD copy
  217. dataROM[0x12102] = -128 + 0x6D;
  218. dataROM[0x12103] = -2;
  219. //On key
  220. dataROM[0x5EC] = 0x00;
  221. dataROM[0x5ED] = 0x03;
  222. break;
  223. case 596116:
  224. outmsg = "TI-83 v1.06";
  225. //LCD copy
  226. patches = new int[] {0x135, 0x14A, 0x161, 0x174, 0x190, 0x62A, 0x656, 0x20E0, 0x52CF, 0x52FA, 0x533E, 0x5349, 0x5352, 0x5376, 0x5388, 0x5392, 0x53A3, 0x53AC, 0x5915, 0x592F, 0x59B8, 0x59E1, 0x5A19, 0x5A1F, 0x5B1C, 0x5B35, 0x5B3E, 0x5C68, 0x5C72, 0x5C94, 0x5EB3, 0x5EBE, 0x5EC4, 0x730B, 0x731A, 0x7321, 0x733E, 0xC046, 0xC0E5, 0xC0EB, 0xC0F3, 0xC0F9, 0xC119, 0xC11F, 0xC125, 0x101EB, 0x101F6, 0x10225, 0x12105, 0x12114, 0x1211B, 0x1212B, 0x1213A, 0x1214B, 0x12575, 0x1257B, 0x12582, 0x188C4, 0x189E1, 0x189E8, 0x189EF, 0x189F6, 0x189FD, 0x18A04, 0x18A10, 0x1CBB3, 0x1CBC4, 0x1CBCB, 0x1CBEC, 0x1D6CB, 0x1E925, 0x1E92E, 0x1E94E, 0x1E95E, 0x20135, 0x2014A, 0x20161, 0x20174, 0x20190, 0x2062A, 0x20656, 0x220E0, 0x245F0};
  227. for (j = 0; j < patches.length; j++)
  228. {
  229. dataROM[patches[j]] = -128 + 0x6D;
  230. dataROM[patches[j]+1] = -1;
  231. }
  232. //LCD copy
  233. dataROM[0x12102] = -128 + 0x6D;
  234. dataROM[0x12103] = -2;
  235. //On key
  236. dataROM[0x5EC] = 0x00;
  237. dataROM[0x5ED] = 0x03;
  238. break;
  239. case 633709:
  240. outmsg = "TI-83 v1.07";
  241. //LCD copy
  242. patches = new int[] {0x135, 0x14A, 0x161, 0x174, 0x190, 0x62A, 0x656, 0x20CF, 0x52CF, 0x52FA, 0x533E, 0x5349, 0x5352, 0x5376, 0x5388, 0x5392, 0x53A3, 0x53AC, 0x5915, 0x592F, 0x59B8, 0x59E1, 0x5A19, 0x5A1F, 0x5B1C, 0x5B35, 0x5B3E, 0x5C68, 0x5C72, 0x5C94, 0x5EB3, 0x5EBE, 0x5EC4, 0x730B, 0x731A, 0x7321, 0x733E, 0xC046, 0xC0E5, 0xC0EB, 0xC0F3, 0xC0F9, 0xC119, 0xC11F, 0xC125, 0x101EB, 0x101F6, 0x10225, 0x12105, 0x12114, 0x1211B, 0x1212B, 0x1213A, 0x1214B, 0x12575, 0x1257B, 0x12582, 0x188C4, 0x189E1, 0x189E8, 0x189EF, 0x189F6, 0x189FD, 0x18A04, 0x18A10, 0x1CBB3, 0x1CBC4, 0x1CBCB, 0x1CBEC, 0x1D6CB, 0x1E925, 0x1E92E, 0x1E94E, 0x1E95E, 0x20135, 0x2014A, 0x20161, 0x20174, 0x20190, 0x2062A, 0x20656, 0x220CF, 0x245F0};
  243. for (j = 0; j < patches.length; j++)
  244. {
  245. dataROM[patches[j]] = -128 + 0x6D;
  246. dataROM[patches[j]+1] = -1;
  247. }
  248. //LCD copy
  249. dataROM[0x12102] = -128 + 0x6D;
  250. dataROM[0x12103] = -2;
  251. //On key
  252. dataROM[0x5EC] = 0x00;
  253. dataROM[0x5ED] = 0x03;
  254. break;
  255. case 641476:
  256. outmsg = "TI-83 v1.08";
  257. //LCD copy
  258. patches = new int[] {0x135, 0x14A, 0x161, 0x174, 0x1AA, 0x652, 0x67E, 0x2109, 0x52CF, 0x52FA, 0x533E, 0x5349, 0x5352, 0x5376, 0x5388, 0x5392, 0x53A3, 0x53AC, 0x5915, 0x592F, 0x59B8, 0x59E1, 0x5A19, 0x5A1F, 0x5B1C, 0x5B35, 0x5B3E, 0x5C68, 0x5C72, 0x5C94, 0x5EB3, 0x5EBE, 0x5EC4, 0x730B, 0x731A, 0x7321, 0x733E, 0xC046, 0xC0E5, 0xC0EB, 0xC0F3, 0xC0F9, 0xC119, 0xC11F, 0xC125, 0x101EB, 0x101F6, 0x10225, 0x12105, 0x12114, 0x1211B, 0x1212B, 0x1213A, 0x1214B, 0x12575, 0x1257B, 0x12582, 0x188C4, 0x189E1, 0x189E8, 0x189EF, 0x189F6, 0x189FD, 0x18A04, 0x18A10, 0x1CBB3, 0x1CBC4, 0x1CBCB, 0x1CBEC, 0x1D6CB, 0x1E925, 0x1E92E, 0x1E94E, 0x1E95E, 0x20135, 0x2014A, 0x20161, 0x20174, 0x201AA, 0x20652, 0x2067E, 0x22109, 0x245F0};
  259. for (j = 0; j < patches.length; j++)
  260. {
  261. dataROM[patches[j]] = -128 + 0x6D;
  262. dataROM[patches[j]+1] = -1;
  263. }
  264. //LCD copy
  265. dataROM[0x12102] = -128 + 0x6D;
  266. dataROM[0x12103] = -2;
  267. //On key
  268. dataROM[0x614] = 0x00;
  269. dataROM[0x615] = 0x03;
  270. break;
  271. case 631156:
  272. outmsg = "TI-83 v1.10";
  273. //LCD copy
  274. patches = new int[] {0x135, 0x14A, 0x161, 0x174, 0x1AF, 0x657, 0x683, 0x210E, 0x52CF, 0x52FA, 0x533E, 0x5349, 0x5352, 0x5376, 0x5388, 0x5392, 0x53A3, 0x53AC, 0x5915, 0x592F, 0x59B8, 0x59E1, 0x5A19, 0x5A1F, 0x5B1C, 0x5B35, 0x5B3E, 0x5C68, 0x5C72, 0x5C94, 0x5EB3, 0x5EBE, 0x5EC4, 0x730B, 0x731A, 0x7321, 0x733E, 0xC046, 0xC0E5, 0xC0EB, 0xC0F3, 0xC0F9, 0xC119, 0xC11F, 0xC125, 0x101EB, 0x101F6, 0x10225, 0x12105, 0x12114, 0x1211B, 0x1212B, 0x1213A, 0x1214B, 0x12575, 0x1257B, 0x12582, 0x188C4, 0x189E1, 0x189E8, 0x189EF, 0x189F6, 0x189FD, 0x18A04, 0x18A10, 0x1CBB3, 0x1CBC4, 0x1CBCB, 0x1CBEC, 0x1D6CB, 0x1E925, 0x1E92E, 0x1E94E, 0x1E95E, 0x20135, 0x2014A, 0x20161, 0x20174, 0x201AF, 0x20657, 0x20683, 0x2210E, 0x245F0};
  275. for (j = 0; j < patches.length; j++)
  276. {
  277. dataROM[patches[j]] = -128 + 0x6D;
  278. dataROM[patches[j]+1] = -1;
  279. }
  280. //LCD copy
  281. dataROM[0x12102] = -128 + 0x6D;
  282. dataROM[0x12103] = -2;
  283. //On key
  284. dataROM[0x619] = 0x00;
  285. dataROM[0x61A] = 0x03;
  286. //Special patch for initialization
  287. dataROM[0x6FC] = 0x16;
  288. break;
  289. }
  290. }
  291. if (model == 85)
  292. {
  293. for (j = 0; j < (128*1024); j++)
  294. checksum += dataROM[j];
  295. switch (checksum)
  296. {
  297. case 534272:
  298. outmsg = "TI-85 v3.0a";
  299. dataROM[0xAF1] = 0x00;
  300. dataROM[0xAF2] = 0x03;
  301. break;
  302. case 628224:
  303. outmsg = "TI-85 v9.0";
  304. dataROM[0xAEE] = 0x00;
  305. dataROM[0xAEF] = 0x03;
  306. break;
  307. case 659712:
  308. outmsg = "TI-85 v10.0";
  309. dataROM[0xAEE] = 0x00;
  310. dataROM[0xAEF] = 0x03;
  311. break;
  312. }
  313. }
  314. if (model == 86)
  315. {
  316. for (j = 0; j < (256*1024); j++)
  317. checksum += dataROM[j];
  318. if (checksum == 979968)
  319. {
  320. //v1.2
  321. outmsg = "TI-86 v1.2";
  322. dataROM[0x1C73D] = -128 + 0x40;
  323. //Patch the ON key delay
  324. dataROM[0xBD6] = 0x00;
  325. dataROM[0xBD7] = 0x03;
  326. }
  327. if (checksum == 958464)
  328. {
  329. //v1.3
  330. outmsg = "TI-86 v1.3";
  331. dataROM[0x1C73D] = -128 + 0x40;
  332. //Patch the ON key delay
  333. dataROM[0xBD6] = 0x00;
  334. dataROM[0xBD7] = 0x03;
  335. }
  336. if (checksum == 940800)
  337. {
  338. //v1.4
  339. outmsg = "TI-86 v1.4";
  340. dataROM[0x1C73D] = -128 + 0x40;
  341. //Patch ON key
  342. dataROM[0xBD6] = 0x00;
  343. dataROM[0xBD7] = 0x03;
  344. }
  345. if (checksum == 967705)
  346. {
  347. //v1.5
  348. outmsg = "TI-86 v1.5";
  349. dataROM[0x1C73D] = -128 + 0x40;
  350. //Patch ON key
  351. dataROM[0xBE1] = 0x00;
  352. dataROM[0xBE2] = 0x03;
  353. }
  354. if (checksum == 966400)
  355. {
  356. //v1.6
  357. outmsg = "TI-86 v1.6";
  358. //Patch it to 64KB of RAM
  359. dataROM[0x1C73D] = -128 + 0x40;
  360. //Patch the ON key delay
  361. dataROM[0xBE1] = 0x00;
  362. dataROM[0xBE2] = 0x03;
  363. }
  364. }
  365. System.out.println(outmsg);
  366. dataEmulator[i] = n;
  367. //Update page count
  368. dataEmulator[0x1C] += newpages;
  369. //Patch binary
  370. FileOutputStream fout = new FileOutputStream(emulator);
  371. fout.write(dataEmulator);
  372. int aaa = 0;
  373. if (model == 86)
  374. aaa = 2;
  375. if (model == 83)
  376. aaa = 3;
  377. for (i = 0; i < (dataROM.length)-(16384*aaa); i++)
  378. fout.write(dataROM[i]);
  379. //fout.write(dataROM);
  380. fout.close();
  381. //Create ROM!
  382. FileInputStream ftemp = new FileInputStream(emulator);
  383. byte[] appData = new byte[(int) emulator.length()];
  384. ftemp.read(appData);
  385. ftemp.close();
  386. FileWriter myout = new FileWriter("Emulator.hex");
  387. int page = 0;
  388. int scheck = 0;
  389. double aa = (emulator.length() / 16384);
  390. //if (model == 86)
  391. // aa -= 2;
  392. //if (model == 83)
  393. // aa -= 3;
  394. for (i = 0; i < aa; i++)
  395. {
  396. myout.write(":0200000200");
  397. scheck = 0xFC - page;
  398. myout.write(hexvalue(page) + hexvalue(scheck) + "\r\n");
  399. if (i == (aa - 1))
  400. { WritePage(appData,16384*i,myout,true); } else { WritePage(appData,16384*i,myout, false); }
  401. page++;
  402. }
  403. myout.write(":00000001FF");
  404. myout.close();
  405. }
  406. public static void WritePage(byte[] input, int offset, FileWriter fh, boolean chop) throws IOException
  407. {
  408. int a;
  409. int b;
  410. int c = 512;
  411. if (chop == true)
  412. c = 509;
  413. int address = 0x4000;
  414. for (a = 0; a<c; a++)
  415. {
  416. address = 0x4000 + (a*32);
  417. fh.write(":20" + Integer.toString(address, 16).toUpperCase() + "00");
  418. for (b = 0; b<32; b++)
  419. {
  420. fh.write(hexvalue(input[offset+(a*32)+b]));
  421. }
  422. fh.write(checksum(input, offset+(a*32), 32, address));
  423. fh.write("\r\n");
  424. }
  425. }
  426. public static String hexvalue(int hex)
  427. {
  428. if (hex < 0)
  429. hex += 0x100;
  430. return Integer.toString(hex + 0x100, 16).substring(1).toUpperCase();
  431. }
  432. public static String checksum(byte[] input, int start, int length, int address)
  433. {
  434. int checksum = 32;
  435. int i;
  436. checksum += (address & 0xff) + (address >> 8);
  437. for (i=0; i<length; i++)
  438. {
  439. if (input[start+i] < 0)
  440. { checksum += 0x100 + input[start+i]; } else
  441. { checksum += input[start+i]; }
  442. }
  443. checksum = 0x100 - checksum;
  444. return hexvalue(checksum & 0xFF);
  445. }
  446. }