Advertisement
Guest User

Hareng

a guest
Oct 23rd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.91 KB | None | 0 0
  1. -- Définitions pour l'extracteur/inséreur --
  2. little_endian = true
  3. big_endian = false
  4.  
  5. EXT=1
  6. INS=2
  7.  
  8. modes_ext_ins = {
  9. ["SANS_POINTEURS"] = { ext = "X", ins = "X", taille = 2, inverser = true },
  10. ["SNES16"] = { ext = "X", ins = "X", taille = 2, inverser = true },
  11. ["SNES24-HighRom"] = { ext = "X-$C00000", ins = "X+$C00000", taille = 3, inverser = true },
  12. ["SNES24-LowRom1"] = { ext = "(X/$10000)*$8000+X%$8000", ins = "((X/$8000)*$10000)+(X%$8000)+$8000", taille = 3, inverser = true },
  13. ["SNES24-LowRom2"] = { ext = "(X/$10000-$80)*$8000+X%$8000", ins = "(((X/$8000)+$80)*$10000)+(X%$8000)+$8000", taille = 3, inverser = true }
  14. }
  15.  
  16. function extraire(nom_rom, nom_table, nom_texte, debut_txt, fin_txt, pt_arg1, pt_arg2, pt_arg3, pt_arg4, pt_arg5)
  17. local rom = Fichier.new()
  18.  
  19. local texte = Buffer.new()
  20. local table = Table_ext_ins.new()
  21. local sortie = Output.new("Fichier", nom_texte, "w")
  22. local pointeurs = Table_pointeurs.new()
  23.  
  24. local debut_pt, nb_pt, taille_pt, calcul, inverser
  25.  
  26. print(string.format("Extraction du script '%s'", nom_texte))
  27.  
  28. if (type(pt_arg1) == "number") then
  29. debut_pt = pt_arg1
  30. nb_pt = pt_arg2
  31. taille_pt = pt_arg3
  32. calcul = pt_arg4
  33. inverser = pt_arg5
  34. elseif (type(pt_arg1) == "string") then
  35. if (pt_arg1 == "SANS_POINTEURS") then
  36. nb_pt = 0
  37. debut_pt = 0
  38. calcul = "X"
  39. else
  40. debut_pt = pt_arg2
  41. nb_pt = pt_arg3
  42. calcul = modes_ext_ins[pt_arg1].ext .. string.format("+$%X", pt_arg4) .. string.format("-$%X", pt_arg5)
  43. end
  44.  
  45. taille_pt = modes_ext_ins[pt_arg1].taille
  46. inverser = modes_ext_ins[pt_arg1].inverser
  47. -- calcul = modes_ext_ins[pt_arg1].ext .. string.format("+$%X", pt_arg4) .. string.format("-$%X", pt_arg5)
  48.  
  49. else
  50. error("arg #6 : number or string expected", 2)
  51. return
  52. end
  53.  
  54. table:ouvrir(nom_table, EXT)
  55. rom:open(nom_rom, "rb")
  56.  
  57. if (nb_pt ~= 0) then
  58. pointeurs:charger(rom, debut_pt, nb_pt, taille_pt)
  59. end
  60.  
  61. if (inverser) then
  62. pointeurs:inverser()
  63. end
  64.  
  65. pointeurs:calculer(calcul)
  66.  
  67. calcul = string.format("X-$%X", tronquer(debut_txt, taille_pt))
  68. pointeurs:calculer(calcul)
  69.  
  70. rom:seek(debut_txt, 0)
  71. rom:read(texte, fin_txt - debut_txt + 1)
  72. rom:close()
  73.  
  74. Ext_ins.extraire(texte, table, sortie, pointeurs)
  75.  
  76. print("Extraction terminée !\n")
  77. end
  78.  
  79. function inserer(nom_rom, nom_table, nom_texte, debut_txt, fin_txt, pt_arg1, pt_arg2, pt_arg3, pt_arg4, pt_arg5)
  80. local rom = Fichier.new()
  81.  
  82. local texte = Buffer.new()
  83. local table = Table_ext_ins.new()
  84. local sortie = Output.new("Buffer")
  85. local pt_buffer_sortie = sortie:get_buffer()
  86. local pointeurs = Table_pointeurs.new()
  87.  
  88. local debut_pt, nb_pt, taille_pt, calcul, inverser
  89.  
  90. print(string.format("Insertion du script '%s'", nom_texte))
  91.  
  92. if (type(pt_arg1) == "number") then
  93. debut_pt = pt_arg1
  94. nb_pt = pt_arg2
  95. taille_pt = pt_arg3
  96. calcul = pt_arg4
  97. inverser = pt_arg5
  98. elseif (type(pt_arg1) == "string") then
  99. debut_pt = pt_arg2
  100. nb_pt = pt_arg3
  101. taille_pt = modes_ext_ins[pt_arg1].taille
  102. inverser = modes_ext_ins[pt_arg1].inverser
  103. calcul = modes_ext_ins[pt_arg1].ins .. string.format("+$%X", pt_arg4) .. string.format("-$%X", pt_arg5)
  104. else
  105. error("arg #6 : number or string expected", 2)
  106. return
  107. end
  108.  
  109. pointeurs:fixer_taille_pt(taille_pt)
  110. table:ouvrir(nom_table, INS)
  111.  
  112. rom:open(nom_texte, "rb",'utf-8')
  113. rom:load_text(texte)
  114. rom:close()
  115.  
  116. Ext_ins.inserer(texte, table, sortie, pointeurs)
  117.  
  118. calcul = calcul .. string.format("+$%X", debut_txt)
  119. pointeurs:calculer(calcul)
  120.  
  121. if (inverser) then
  122. pointeurs:inverser()
  123. end
  124.  
  125. rom:open(nom_rom, "rb+")
  126. rom:seek(debut_txt, 0)
  127.  
  128. if (pt_buffer_sortie:size() > fin_txt - debut_txt + 1) then
  129. taille = fin_txt - debut_txt + 1
  130. print(string.format("Espace insuffisant, il manque %d octets...", pt_buffer_sortie:size() - (fin_txt - debut_txt + 1)))
  131. else
  132. taille = pt_buffer_sortie:size()
  133. print(string.format("Espace restant : %d octets", (fin_txt - debut_txt + 1) - taille))
  134. end
  135.  
  136. rom:write(pt_buffer_sortie, taille)
  137.  
  138. if (pointeurs:nb_pt() == 0) then
  139. max = 0
  140. else
  141. max = pointeurs:nb_pt() - 1
  142. end
  143.  
  144. for i = 0, max do
  145. if (pointeurs:index(i):numero() <= nb_pt) then
  146. rom:seek(debut_pt + (pointeurs:index(i):numero() - 1) * taille_pt, 0)
  147. pointeurs:index(i):ecrire(rom)
  148. else
  149. print(string.format("Le pointeur %d ne sera pas inséré (Nb pointeurs : %d)", pointeurs:index(i):numero(), nb_pt))
  150. end
  151. end
  152.  
  153. rom:close()
  154.  
  155. print("Insertion terminée !\n")
  156.  
  157. return taille + debut_txt
  158. end
  159.  
  160. -- Définitions de fonctions diverses --
  161.  
  162. function insert(f_in, debut, data)
  163. if (debut > f_in:seek("end")) then
  164. print("insert : la zone à dumper se situe en dehors du fichier")
  165. f_in:seek("set", pos_in)
  166. return
  167. end
  168.  
  169. f_in:seek("set", debut)
  170. f_in:write(data)
  171. end
  172.  
  173. function hexdump(f_in, debut, taille)
  174. local pos_in = f_in:seek()
  175. local data
  176.  
  177. if (f_in:seek("end") < debut + taille) then
  178. print("hexdump : la zone à dumper se situe en dehors du fichier")
  179. f_in:seek("set", pos_in)
  180. return
  181. end
  182.  
  183. f_in:seek("set", debut)
  184. data = f_in:read(taille)
  185. f_in:seek("set", pos_in)
  186.  
  187. return data
  188. end
  189.  
  190. function concatener(nom_out, table_noms)
  191. local i, data_temp, taille_table
  192. local f_in, out
  193. local erreur
  194.  
  195. taille_table = table.getn(table_noms)
  196. out, erreur = io.open(nom_out, "wb")
  197.  
  198. for i = 1, taille_table do
  199. if (type(table_noms[i]) ~= "string") then
  200. print("concatener : Le " .. i .. "ème élément de la table n'est pas une chaine")
  201. else
  202. f_in , erreur = io.open(table_noms[i], "rb")
  203.  
  204. if (f_in == nil) then
  205. print("concatener : Erreur lors de l'ouverture d'un fichier d'entrée :")
  206. print(erreur)
  207. else
  208. data_temp = f_in:read("*a")
  209. out:write(data_temp)
  210. f_in:close()
  211. end
  212. end
  213. end
  214.  
  215. out:close()
  216. end
  217.  
  218. function creer_table(nom_in, nom_out, debut)
  219. local f_in, f_out
  220. local temp
  221. local n_courant = debut
  222.  
  223. f_in = io.open(nom_in, "r")
  224. f_out = io.open(nom_out, "w")
  225.  
  226. temp = 0
  227.  
  228. while (temp ~= nil) do
  229. temp = f_in:read("*l")
  230.  
  231. if (temp ~= nil and string.len(temp) ~= 0) then
  232. f_out:write(string.format("%X=%s\n", n_courant, temp))
  233.  
  234. n_courant = n_courant + 1
  235. end
  236. end
  237.  
  238. f_in:close()
  239. f_out:close()
  240.  
  241. end
  242.  
  243. function tronquer(valeur, taille)
  244. if (taille == 1) then
  245. return andB(valeur, 0xFF)
  246. elseif (taille == 2) then
  247. return andB(valeur, 0xFFFF)
  248. elseif (taille == 3) then
  249. return andB(valeur, 0xFFFFFF)
  250. end
  251.  
  252. return valeur
  253.  
  254. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement