Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Castlevania: Symphony Of The Night
- -- Version 1.2
- function code2Hex(code)
- return string.format("%X",code);
- end
- function code2StrAt(pc)
- code = memory.readdword(pc);
- return code2Str(code, pc);
- end
- function code2Str(code, pc)
- codeArgs = parseCode(code, pc);
- if(codeArgs.c2s == nil) then
- return string.format("ERROR: %X",code);
- end
- codestr = codeArgs.c2s(codeArgs);
- if(pc%4 == 0) then
- return codestr;
- else
- return string.format("* %s",codestr);
- end
- end
- -- Code Translation --
- e = "ERR";
- c2sErr = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rt,ca.rs,ca.immU); end;
- 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;
- c2sF3R = function(ca) return string.format("%s r%i, r%i, r%i",ca.name,ca.rd,ca.rs,ca.rt); end;
- c2sFShift = function(ca) return string.format("%s r%i, r%i, %i",ca.name,ca.rd,ca.rs,ca.sa); end;
- c2sF2R = function(ca) return string.format("%s r%i, r%i",ca.name,ca.rs,ca.rt); end;
- c2sFRs = function(ca) return string.format("%s r%i",ca.name,ca.rs); end;
- c2sFRd = function(ca) return string.format("%s r%i",ca.name,ca.rd); end;
- c2sFJalr = function(ca) return string.format("%s r%i, r%i",ca.name,ca.rs,ca.rd); end;
- c2sFJr = c2sFRs;
- c2sName = function(ca) return string.format("%s",ca.name); end;
- c2sISOp = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rt,ca.rs,ca.imm); end;
- c2sIUOp = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rt,ca.rs,ca.immU); end;
- c2sI1ROp = function(ca) return string.format("%s r%i, %X",ca.name,ca.rt,ca.immU); end;
- c2sIBr2R = function(ca) return string.format("%s r%i, r%i, %X",ca.name,ca.rs,ca.rt,ca.br); end;
- c2sIBr1R = function(ca) return string.format("%s r%i, %X",ca.name,ca.rs,ca.br); end;
- c2sIRel = function(ca) return string.format("%s r%i, %X(r%i)",ca.name,ca.rt,ca.imm,ca.rs); end;
- c2sJ = function(ca) return string.format("%s %X",ca.name,ca.j); end;
- opNames = {"func", "br", "j", "jal", "beq", "bne", "blez", "bgtz",
- "addi", "addiu", "slti", "sltiu", "andi", "ori", "xori", "lui",
- "cop0", e, "cop2", e, e, e, e, e,
- e, e, e, e, e, e, e, e,
- "lb", "lh", "lwl", "lw", "lbu", "lhu", "lwr", e,
- "sb", "sh", "swl", "sw", e, e, "swr", e,
- e, e, "lwc1", e, e, e, e, e,
- e, e, "swc1", "hle", e, e, e, e,
- };
- opC2S = {c2sErr, c2sErr, c2sJ, c2sJ, c2sIBr2R, c2sIBr2R, c2sIBr1R, c2sIBr1R,
- c2sISOp, c2sIUOp, c2sISOp, c2sIUOp, c2sIUOp, c2sIUOp, c2sIUOp, c2sI1ROp,
- c2sName, c2sErr, c2sName, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sErr,
- c2sIRel, c2sIRel, c2sIRel, c2sIRel, c2sErr, c2sErr, c2sIRel, c2sErr,
- c2sErr, c2sErr, c2sIRel, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- c2sErr, c2sErr, c2sIRel, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- };
- funcNames = {"sll", e, "srl", "sra", "sllv", e, "srlv", "srav",
- "jr", "jalr", e, e, "syscall", "break", e, e,
- "mfhi", "mthi", "mflo", "mtlo", e, e, e, e,
- "mult", "multu", "div", "divu", e, e, e, e,
- "add", "addu", "sub", "subu", "and", "or", "xor", "nor",
- e, e, "slt", "sltu", e, e, e, e,
- e, e, e, e, e, e, e, e,
- e, e, e, e, e, e, e, e,
- };
- funcC2S = {c2sFShift, c2sErrF, c2sFShift, c2sFShift, c2sF3R, c2sErrF, c2sF3R, c2sF3R,
- c2sFJr, c2sFJalr, c2sErrF, c2sErrF, c2sName, c2sName, c2sErrF, c2sErrF,
- c2sFRd, c2sFRs, c2sFRd, c2sFRs, c2sErrF, c2sErrF, c2sErrF, c2sErrF,
- c2sF2R, c2sF2R, c2sF2R, c2sF2R, c2sErrF, c2sErrF, c2sErrF, c2sErrF,
- c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
- c2sErrF, c2sErrF, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
- c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
- c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R, c2sF3R,
- };
- brNames = {"bltz", "bgez", e, e, e, e, e, e,
- e, e, e, e, e, e, e, e,
- "bltzal", "bgezal", e, e, e, e, e, e,
- e, e, e, e, e, e, e, e,
- };
- brC2S = {c2sIBr1R, c2sIBr1R, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- c2sIBr1R, c2sIBr1R, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr, c2sErr,
- };
- function setCodeNameFunc(codeArgs)
- local name;
- local func;
- if(codeArgs.opcode == 0) then
- name = funcNames[codeArgs.func+1];
- if(name == e) then name = name..codeArgs.func; end
- func = funcC2S[codeArgs.func+1];
- elseif(codeArgs.orcode == 1) then
- name = brNames[codeArgs.rt+1];
- if(name == e) then name = name..codeArgs.rt; end
- func = brC2S[codeArgs.rt+1];
- else
- name = opNames[codeArgs.opcode+1];
- if(name == e) then name = name..codeArgs.opcode; end
- func = opC2S[codeArgs.opcode+1];
- end
- codeArgs.name = name;
- codeArgs.c2s = func;
- end
- function parseCode(code,pc)
- local codeArgs = {
- opcode = bit.rshift(bit.band(code,0xFC000000),26),
- rs = bit.rshift(bit.band(code,0x03E00000),21),
- rt = bit.rshift(bit.band(code,0x001F0000),16),
- rd = bit.rshift(bit.band(code,0x0000F800),11),
- sa = bit.rshift(bit.band(code,0x000007C0),6),
- func = bit.rshift(bit.band(code,0x0000003F),0),
- immU = bit.rshift(bit.band(code,0x0000FFFF),0),
- j = bit.rshift(bit.band(code,0x03FFFFFF),0)*4,
- }
- codeArgs.imm = codeArgs.immU-bit.band(codeArgs.immU,0x8000)*2;
- codeArgs.br = pc+4+codeArgs.imm*4;
- setCodeNameFunc(codeArgs);
- return codeArgs;
- end
- -- End Code Translation --
- while true do
- WEAPSLOT = 0x3C9B4;
- INVBASE = 0x97A8D;
- MUSIC = 0x97C9C;
- DEFAULTMUSIC = 0x80138460;
- PAUSED = 0x973EC;
- SCROLL = 0x13768C;
- EQUIPSLOT = 0x3C9B0;
- EQUIPBASES = {0x97A8D, 0x97A8D, 0x97B50, 0x97B36, 0x97B66, 0x97B6F, 0x97B6F};
- EQUIPMENU = 0x51B44; -- Hackish
- lockedMP = 0x800F6090;
- pause = memory.readdword(PAUSED);
- if(pause ~= 0) then
- selection = memory.readbyte(WEAPSLOT);
- selWeapon = memory.readbyte(INVBASE+selection);
- selPC = INVBASE+selection;
- selCode = memory.readdword(selPC);
- gui.text(10,2, "Weapon: "..string.format("%i(0x%X)",selWeapon,selWeapon));
- gui.text(85,2, "WpHex: 0x"..code2Hex(selCode));
- gui.text(160,2, "WpCode: "..code2StrAt(selPC));
- musicPt = memory.readdword(MUSIC);
- if(musicPt ~= DEFAULTMUSIC) then
- gui.text(10,10, "Music Pointer: "..string.format("0x%X",musicPt));
- if(lockedMP) then
- musicPt = lockedMP;
- gui.text(140,10, "CheckMP: "..string.format("0x%X",musicPt));
- end
- musicPt = musicPt - 0x80000000;
- gui.text(10,18, "Ctrl: "..code2StrAt(musicPt+0x90));
- gui.text(140,18, "Effect: "..code2StrAt(musicPt+0x28));
- gui.text(10,26, "Timer1: "..code2StrAt(musicPt+0x40));
- gui.text(140,26, "Timer2: "..code2StrAt(musicPt+0x6C));
- end
- -- Inventory Items
- menu = memory.readbyte(EQUIPMENU);
- if menu==0x50 then
- scrollAmt = -memory.readwordsigned(SCROLL)/6;
- equipSlot = memory.readword(EQUIPSLOT);
- invstart = EQUIPBASES[equipSlot+1]+scrollAmt;
- for i=0,11 do
- local col = i%2;
- local row = (i-i%2)/2;
- item = memory.readbyte(invstart+i);
- gui.text(10+165*col, 124+12*row, string.format("0x%X",item));
- end
- end
- else
- gui.clearuncommitted();
- end
- emu.frameadvance()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement