Advertisement
Guest User

SOS script

a guest
Mar 10th, 2014
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.22 KB | None | 0 0
  1. -- Castlevania: Symphony Of The Night
  2. -- Version 1.2
  3.  
  4. function code2Hex(code)
  5. return string.format("%X",code);
  6. end
  7. function code2StrAt(pc)
  8. code = memory.readdword(pc);
  9. return code2Str(code, pc);
  10. end
  11. function code2Str(code, pc)
  12. codeArgs = parseCode(code, pc);
  13. if(codeArgs.c2s == nil) then
  14. return string.format("ERROR: %X",code);
  15. end
  16. codestr = codeArgs.c2s(codeArgs);
  17. if(pc%4 == 0) then
  18. return codestr;
  19. else
  20. return string.format("* %s",codestr);
  21. end
  22. end
  23.  
  24. -- Code Translation --
  25. e = "ERR";
  26. c2sErr = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rt,ca.rs,ca.immU); end;
  27. c2sErrF = function(ca) return string.format("%s r%i, r%i, r%i, %X",ca.name,ca.rd,ca.rs,ca.rt,ca.sa); end;
  28. c2sF3R = function(ca) return string.format("%s r%i, r%i, r%i",ca.name,ca.rd,ca.rs,ca.rt); end;
  29. c2sFShift = function(ca) return string.format("%s r%i, r%i, %i",ca.name,ca.rd,ca.rs,ca.sa); end;
  30. c2sF2R = function(ca) return string.format("%s r%i, r%i",ca.name,ca.rs,ca.rt); end;
  31. c2sFRs = function(ca) return string.format("%s r%i",ca.name,ca.rs); end;
  32. c2sFRd = function(ca) return string.format("%s r%i",ca.name,ca.rd); end;
  33. c2sFJalr = function(ca) return string.format("%s r%i, r%i",ca.name,ca.rs,ca.rd); end;
  34. c2sFJr = c2sFRs;
  35. c2sName = function(ca) return string.format("%s",ca.name); end;
  36. c2sISOp = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rt,ca.rs,ca.imm); end;
  37. c2sIUOp = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rt,ca.rs,ca.immU); end;
  38. c2sI1ROp = function(ca) return string.format("%s r%i, %X",ca.name,ca.rt,ca.immU); end;
  39. c2sIBr2R = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rs,ca.rt,ca.br); end;
  40. c2sIBr1R = function(ca) return string.format("%s r%i, %X",ca.name,ca.rs,ca.br); end;
  41. c2sIRel = function(ca) return string.format("%s r%i, %X(r%i)",ca.name,ca.rt,ca.imm,ca.rs); end;
  42. c2sJ = function(ca) return string.format("%s %X",ca.name,ca.j); end;
  43.  
  44. opNames = {"func", "br", "j", "jal", "beq", "bne", "blez", "bgtz",
  45. "addi", "addiu", "slti", "sltiu", "andi", "ori", "xori", "lui",
  46. "cop0", e, "cop2", e, e, e, e, e,
  47. e, e, e, e, e, e, e, e,
  48. "lb", "lh", "lwl", "lw", "lbu", "lhu", "lwr", e,
  49. "sb", "sh", "swl", "sw", e, e, "swr", e,
  50. e, e, "lwc1", e, e, e, e, e,
  51. e, e, "swc1", "hle", e, e, e, e,
  52. };
  53. opC2S = {c2sErr, c2sErr, c2sJ, c2sJ, c2sIBr2R, c2sIBr2R, c2sIBr1R, c2sIBr1R,
  54. c2sISOp, c2sIUOp, c2sISOp, c2sIUOp, c2sIUOp, c2sIUOp, c2sIUOp, c2sI1ROp,
  55. c2sName, c2sErr, c2sName, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  56. c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  57. c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sErr,
  58. c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sErr, c2sErr, c2sIRel, c2sErr,
  59. c2sErr, c2sErr, c2sIRel, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  60. c2sErr, c2sErr, c2sIRel, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  61. };
  62.  
  63. funcNames = {"sll", e, "srl", "sra", "sllv", e, "srlv", "srav",
  64. "jr", "jalr", e, e, "syscall", "break", e, e,
  65. "mfhi", "mthi", "mflo", "mtlo", e, e, e, e,
  66. "mult", "multu", "div", "divu", e, e, e, e,
  67. "add", "addu", "sub", "subu", "and", "or", "xor", "nor",
  68. e, e, "slt", "sltu", e, e, e, e,
  69. e, e, e, e, e, e, e, e,
  70. e, e, e, e, e, e, e, e,
  71. };
  72. funcC2S = {c2sFShift, c2sErrF, c2sFShift, c2sFShift, c2sF3R, c2sErrF, c2sF3R, c2sF3R,
  73. c2sFJr, c2sFJalr, c2sErrF, c2sErrF, c2sName, c2sName, c2sErrF, c2sErrF,
  74. c2sFRd, c2sFRs, c2sFRd, c2sFRs, c2sErrF, c2sErrF, c2sErrF, c2sErrF,
  75. c2sF2R, c2sF2R, c2sF2R, c2sF2R, c2sErrF, c2sErrF, c2sErrF, c2sErrF,
  76. c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
  77. c2sErrF, c2sErrF, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
  78. c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
  79. c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
  80. };
  81.  
  82. brNames = {"bltz", "bgez", e, e, e, e, e, e,
  83. e, e, e, e, e, e, e, e,
  84. "bltzal", "bgezal", e, e, e, e, e, e,
  85. e, e, e, e, e, e, e, e,
  86. };
  87. brC2S = {c2sIBr1R, c2sIBr1R, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  88. c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  89. c2sIBr1R, c2sIBr1R, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  90. c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
  91. };
  92.  
  93. function setCodeNameFunc(codeArgs)
  94. local name;
  95. local func;
  96. if(codeArgs.opcode == 0) then
  97. name = funcNames[codeArgs.func+1];
  98. if(name == e) then name = name..codeArgs.func; end
  99. func = funcC2S[codeArgs.func+1];
  100. elseif(codeArgs.orcode == 1) then
  101. name = brNames[codeArgs.rt+1];
  102. if(name == e) then name = name..codeArgs.rt; end
  103. func = brC2S[codeArgs.rt+1];
  104. else
  105. name = opNames[codeArgs.opcode+1];
  106. if(name == e) then name = name..codeArgs.opcode; end
  107. func = opC2S[codeArgs.opcode+1];
  108. end
  109.  
  110. codeArgs.name = name;
  111. codeArgs.c2s = func;
  112. end
  113.  
  114. function parseCode(code,pc)
  115. local codeArgs = {
  116. opcode = bit.rshift(bit.band(code,0xFC000000),26),
  117. rs = bit.rshift(bit.band(code,0x03E00000),21),
  118. rt = bit.rshift(bit.band(code,0x001F0000),16),
  119. rd = bit.rshift(bit.band(code,0x0000F800),11),
  120. sa = bit.rshift(bit.band(code,0x000007C0),6),
  121. func = bit.rshift(bit.band(code,0x0000003F),0),
  122. immU = bit.rshift(bit.band(code,0x0000FFFF),0),
  123. j = bit.rshift(bit.band(code,0x03FFFFFF),0)*4,
  124. }
  125. codeArgs.imm = codeArgs.immU-bit.band(codeArgs.immU,0x8000)*2;
  126. codeArgs.br = pc+4+codeArgs.imm*4;
  127. setCodeNameFunc(codeArgs);
  128. return codeArgs;
  129. end
  130. -- End Code Translation --
  131.  
  132. while true do
  133. WEAPSLOT = 0x3C9B4;
  134. INVBASE = 0x97A8D;
  135. MUSIC = 0x97C9C;
  136. DEFAULTMUSIC = 0x80138460;
  137. PAUSED = 0x973EC;
  138. SCROLL = 0x13768C;
  139. EQUIPSLOT = 0x3C9B0;
  140. EQUIPBASES = {0x97A8D, 0x97A8D, 0x97B50, 0x97B36, 0x97B66, 0x97B6F, 0x97B6F};
  141. EQUIPMENU = 0x51B44; -- Hackish
  142.  
  143. lockedMP = 0x800F6090;
  144.  
  145. pause = memory.readdword(PAUSED);
  146. if(pause ~= 0) then
  147. selection = memory.readbyte(WEAPSLOT);
  148. selWeapon = memory.readbyte(INVBASE+selection);
  149. selPC = INVBASE+selection;
  150. selCode = memory.readdword(selPC);
  151.  
  152. gui.text(10,2, "Weapon: "..string.format("%i(0x%X)",selWeapon,selWeapon));
  153. gui.text(85,2, "WpHex: 0x"..code2Hex(selCode));
  154. gui.text(160,2, "WpCode: "..code2StrAt(selPC));
  155.  
  156. musicPt = memory.readdword(MUSIC);
  157. if(musicPt ~= DEFAULTMUSIC) then
  158. gui.text(10,10, "Music Pointer: "..string.format("0x%X",musicPt));
  159. if(lockedMP) then
  160. musicPt = lockedMP;
  161. gui.text(140,10, "CheckMP: "..string.format("0x%X",musicPt));
  162. end
  163. musicPt = musicPt - 0x80000000;
  164. gui.text(10,18, "Ctrl: "..code2StrAt(musicPt+0x90));
  165. gui.text(140,18, "Effect: "..code2StrAt(musicPt+0x28));
  166. gui.text(10,26, "Timer1: "..code2StrAt(musicPt+0x40));
  167. gui.text(140,26, "Timer2: "..code2StrAt(musicPt+0x6C));
  168. end
  169.  
  170. -- Inventory Items
  171.  
  172. menu = memory.readbyte(EQUIPMENU);
  173. if menu==0x50 then
  174. scrollAmt = -memory.readwordsigned(SCROLL)/6;
  175. equipSlot = memory.readword(EQUIPSLOT);
  176. invstart = EQUIPBASES[equipSlot+1]+scrollAmt;
  177. for i=0,11 do
  178. local col = i%2;
  179. local row = (i-i%2)/2;
  180. item = memory.readbyte(invstart+i);
  181. gui.text(10+165*col, 124+12*row, string.format("0x%X",item));
  182. end
  183. end
  184. else
  185. gui.clearuncommitted();
  186. end
  187. emu.frameadvance()
  188. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement