diff --git a/pk3DS/Subforms/OWSE.cs b/pk3DS/Subforms/OWSE.cs index ad674a1..52c3d0b 100644 --- a/pk3DS/Subforms/OWSE.cs +++ b/pk3DS/Subforms/OWSE.cs @@ -153,7 +153,14 @@ private void getScriptData() if (decompressedLength/4 != decompressed.Length) RTB_MSCMD.Text = RTB_MSP.Text = "DCMP FAIL"; else - RTB_MSP.Lines = Scripts.parseScript(decompressed); + { + uint[] rawCMD = decompressed.Take((moves - start)/4).ToArray(); + string[] instructions = Scripts.parseScript(rawCMD); + uint[] moveCMD = decompressed.Skip((moves - start)/4).ToArray(); + string[] movements = Scripts.parseMovement(moveCMD); + RTB_MSP.Lines = instructions.Concat(movements).ToArray(); + } + } else RTB_MSCMD.Lines = RTB_MS.Lines = new[] {"No Data"}; @@ -231,7 +238,13 @@ private void getOWSData() if (decompressedLength/4 != decompressed.Length) RTB_OWSCMD.Text = RTB_OSP.Text = "DCMP FAIL"; else - RTB_OSP.Lines = Scripts.parseScript(decompressed); + { + uint[] rawCMD = decompressed.Take((moves - start) / 4).ToArray(); + string[] instructions = Scripts.parseScript(rawCMD); + uint[] moveCMD = decompressed.Skip((moves - start) / 4).ToArray(); + string[] movements = Scripts.parseMovement(moveCMD); + RTB_OSP.Lines = instructions.Concat(movements).ToArray(); + } } else RTB_OWSCMD.Lines = RTB_OS.Lines = new[] {"No Data"}; diff --git a/pk3DS/Tools/Scripts.cs b/pk3DS/Tools/Scripts.cs index 1bd4cca..a98b36f 100644 --- a/pk3DS/Tools/Scripts.cs +++ b/pk3DS/Tools/Scripts.cs @@ -220,20 +220,32 @@ internal static string[] parseScript(uint[] cmd) int offset = i*4; switch (c & 0x7FF) { + case 0x27: op = "$27"; + op += eA(new[] { cmd[++i] }); break; case 0x2E: op = "Begin"; break; case 0x30: op = "Return\n"; break; - case 0x31: op = "Call"; - op += eA(new[] { cmd[++i] }); break; - case 0x35: op = "CondJump"; - op += eA(new[] { cmd[++i] }); break; + case 0x31: op = "CallFunc"; + op += String.Format("[0x{0}] ({1})", + (i * 4 + (int)cmd[++i]).ToString("X4"), + (int)cmd[i]); + break; + case 0x33: op = "$33"; + op += String.Format(" => 0x{0} ({1})", + (i * 4 + (int)cmd[++i]).ToString("X4"), + (int)cmd[i]); + break; + case 0x35: op = "Jump!="; + op += String.Format(" => 0x{0} ({1})", + (i*4 + (int)cmd[++i]).ToString("X4"), + (int)cmd[i]); + break; case 0x36: op = "CondJump2"; op += eA(new[] { cmd[++i] }); break; case 0x4E: op = "Add?"; break; case 0x59: op = "ClearAll"; break; case 0x81: op = "Jump"; - op += Environment.NewLine + - String.Format("\t* => 0x{0} ({1}))", - (i*4 + (int) cmd[++i]).ToString("X4"), + op += String.Format(" => 0x{0} ({1})", + (i*4 + (int)cmd[++i]).ToString("X4"), (int)cmd[i]); break; case 0x82: @@ -248,7 +260,7 @@ internal static string[] parseScript(uint[] cmd) jump[j] = (int)cmd[++i]; val[j] = (int)cmd[++i]; op += Environment.NewLine + - String.Format("\t{2} => 0x{0} ({1}))", + String.Format("\t{2} => 0x{0} ({1})", ((i-1)*4 + jump[j]).ToString("X4"), jump[j], val[j]); @@ -256,7 +268,7 @@ internal static string[] parseScript(uint[] cmd) // Else-Default int elsejump = (int)cmd[++i]; op += Environment.NewLine + - String.Format("\t * 0x{0} ({1}))", + String.Format("\t * => 0x{0} ({1})", (((i - 1) * 4 + elsejump).ToString("X4")), elsejump); break; @@ -264,6 +276,13 @@ internal static string[] parseScript(uint[] cmd) case 0x87: op = "DoCommand?"; op += eA(new[] { cmd[++i], cmd[++i] }); break; case 0x89: op = "LineNo?"; break; + case 0x8A: op = "$8A"; + op += eA(new[] { cmd[++i], cmd[++i] }); break; + case 0x8E: op = "$8E"; + op += eA(new[] { cmd[++i], cmd[++i], cmd[++i] }); break; + case 0x96: op = "$96"; + op += eA(new[] { cmd[++i], + cmd[++i], cmd[++i], cmd[++i], cmd[++i] }); break; case 0xA2: op = "GetGlobal2"; op += eA(new[] { c >> 16 }); break; case 0xA3: op = "GetGlobal"; @@ -276,9 +295,11 @@ internal static string[] parseScript(uint[] cmd) op += eA(new[] { c >> 16 }); break; case 0xBC: op = "PushConst"; op += eA(new[] { c >> 16 }); break; - case 0xBE: op = "PushCmdLocal?"; + case 0xBE: op = "GetArg"; op += eA(new[] { c >> 16 }); break; - case 0xBF: op = "ResetLocal"; + case 0xBF: op = "AdjustStack"; + op += eA(new[] { c >> 16 }); break; + case 0xC5: op = "$C5"; op += eA(new[] { c >> 16 }); break; case 0xC8: op = "CmpLocal"; op += eA(new[] { c >> 16 }); break; @@ -287,7 +308,9 @@ internal static string[] parseScript(uint[] cmd) case 0xD2: op = "BeginScript"; break; case 0x7FF: op = "EndScript"; break; - default: op = "Unknown"; break; + case 0x0: op = "Nop"; break; + default: op = String.Format("**${0}**", (c & 0xFFFF).ToString("X2")); + op += eA(new[] { c >> 16 }); break; } rv[used++] = String.Format("0x{2}: [{0}] {1}", (c & 0x7FF).ToString("X2"), op, offset.ToString("X4")); } @@ -295,6 +318,11 @@ internal static string[] parseScript(uint[] cmd) return rv; } + internal static string[] parseMovement(uint[] cmd) + { + return getHexLines(cmd); + } + internal static string eA(uint[] arr) { string s = "";