cache: add stack and lvt string/int counts to rs2asm
This commit is contained in:
@@ -24,7 +24,19 @@
|
|||||||
*/
|
*/
|
||||||
grammar rs2asm;
|
grammar rs2asm;
|
||||||
|
|
||||||
prog: (line NEWLINE)+ ;
|
prog: (header NEWLINE)* (line NEWLINE)+ ;
|
||||||
|
|
||||||
|
header: int_stack_count | string_stack_count | int_var_count | string_var_count ;
|
||||||
|
|
||||||
|
int_stack_count: '.int_stack_count ' int_stack_value ;
|
||||||
|
string_stack_count: '.string_stack_count ' string_stack_value ;
|
||||||
|
int_var_count: '.int_var_count ' int_var_value ;
|
||||||
|
string_var_count: '.string_var_count ' string_var_value ;
|
||||||
|
|
||||||
|
int_stack_value: INT ;
|
||||||
|
string_stack_value: INT ;
|
||||||
|
int_var_value: INT ;
|
||||||
|
string_var_value: INT ;
|
||||||
|
|
||||||
line: instruction | label | switch_lookup ;
|
line: instruction | label | switch_lookup ;
|
||||||
instruction: instruction_name instruction_operand ;
|
instruction: instruction_name instruction_operand ;
|
||||||
|
|||||||
@@ -29,13 +29,13 @@ import java.util.Map;
|
|||||||
public class ScriptDefinition
|
public class ScriptDefinition
|
||||||
{
|
{
|
||||||
private int id;
|
private int id;
|
||||||
private int intStackCount;
|
|
||||||
private int[] instructions;
|
private int[] instructions;
|
||||||
private int[] intOperands;
|
private int[] intOperands;
|
||||||
private String[] stringOperands;
|
private String[] stringOperands;
|
||||||
private int localStringCount;
|
private int intStackCount;
|
||||||
private int stringStackCount;
|
private int stringStackCount;
|
||||||
private int localIntCount;
|
private int localIntCount;
|
||||||
|
private int localStringCount;
|
||||||
private Map<Integer, Integer>[] switches;
|
private Map<Integer, Integer>[] switches;
|
||||||
|
|
||||||
public int getId()
|
public int getId()
|
||||||
|
|||||||
@@ -42,6 +42,10 @@ public class ScriptWriter extends rs2asmBaseListener
|
|||||||
private final LabelVisitor labelVisitor;
|
private final LabelVisitor labelVisitor;
|
||||||
|
|
||||||
private int pos;
|
private int pos;
|
||||||
|
private int intStackCount;
|
||||||
|
private int stringStackCount;
|
||||||
|
private int localIntCount;
|
||||||
|
private int localStringCount;
|
||||||
private List<Integer> opcodes = new ArrayList<>();
|
private List<Integer> opcodes = new ArrayList<>();
|
||||||
private List<Integer> iops = new ArrayList<>();
|
private List<Integer> iops = new ArrayList<>();
|
||||||
private List<String> sops = new ArrayList<>();
|
private List<String> sops = new ArrayList<>();
|
||||||
@@ -52,6 +56,34 @@ public class ScriptWriter extends rs2asmBaseListener
|
|||||||
this.labelVisitor = labelVisitor;
|
this.labelVisitor = labelVisitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enterInt_stack_value(rs2asmParser.Int_stack_valueContext ctx)
|
||||||
|
{
|
||||||
|
int value = Integer.parseInt(ctx.getText());
|
||||||
|
intStackCount = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enterString_stack_value(rs2asmParser.String_stack_valueContext ctx)
|
||||||
|
{
|
||||||
|
int value = Integer.parseInt(ctx.getText());
|
||||||
|
stringStackCount = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enterInt_var_value(rs2asmParser.Int_var_valueContext ctx)
|
||||||
|
{
|
||||||
|
int value = Integer.parseInt(ctx.getText());
|
||||||
|
localIntCount = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enterString_var_value(rs2asmParser.String_var_valueContext ctx)
|
||||||
|
{
|
||||||
|
int value = Integer.parseInt(ctx.getText());
|
||||||
|
localStringCount = value;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exitInstruction(rs2asmParser.InstructionContext ctx)
|
public void exitInstruction(rs2asmParser.InstructionContext ctx)
|
||||||
{
|
{
|
||||||
@@ -175,6 +207,10 @@ public class ScriptWriter extends rs2asmBaseListener
|
|||||||
public ScriptDefinition buildScript()
|
public ScriptDefinition buildScript()
|
||||||
{
|
{
|
||||||
ScriptDefinition script = new ScriptDefinition();
|
ScriptDefinition script = new ScriptDefinition();
|
||||||
|
script.setIntStackCount(intStackCount);
|
||||||
|
script.setStringStackCount(stringStackCount);
|
||||||
|
script.setLocalIntCount(localIntCount);
|
||||||
|
script.setLocalStringCount(localStringCount);
|
||||||
script.setInstructions(opcodes.stream().mapToInt(Integer::valueOf).toArray());
|
script.setInstructions(opcodes.stream().mapToInt(Integer::valueOf).toArray());
|
||||||
script.setIntOperands(iops.stream()
|
script.setIntOperands(iops.stream()
|
||||||
.map(i -> i == null ? 0 : i)
|
.map(i -> i == null ? 0 : i)
|
||||||
|
|||||||
@@ -101,8 +101,6 @@ public class Disassembler
|
|||||||
|
|
||||||
public String disassemble(ScriptDefinition script) throws IOException
|
public String disassemble(ScriptDefinition script) throws IOException
|
||||||
{
|
{
|
||||||
StringBuilder writer = new StringBuilder();
|
|
||||||
|
|
||||||
int[] instructions = script.getInstructions();
|
int[] instructions = script.getInstructions();
|
||||||
int[] iops = script.getIntOperands();
|
int[] iops = script.getIntOperands();
|
||||||
String[] sops = script.getStringOperands();
|
String[] sops = script.getStringOperands();
|
||||||
@@ -113,6 +111,9 @@ public class Disassembler
|
|||||||
|
|
||||||
boolean[] jumps = needLabel(script);
|
boolean[] jumps = needLabel(script);
|
||||||
|
|
||||||
|
StringBuilder writer = new StringBuilder();
|
||||||
|
writerHeader(writer, script);
|
||||||
|
|
||||||
for (int i = 0; i < instructions.length; ++i)
|
for (int i = 0; i < instructions.length; ++i)
|
||||||
{
|
{
|
||||||
int opcode = instructions[i];
|
int opcode = instructions[i];
|
||||||
@@ -188,7 +189,33 @@ public class Disassembler
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write if operand != 0 or if the instruction is specifically to load int
|
if (operand != 0)
|
||||||
return operand != 0 || opcode == Opcodes.LOAD_INT;
|
{
|
||||||
|
// always write non-zero operand
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (opcode)
|
||||||
|
{
|
||||||
|
case Opcodes.LOAD_INT:
|
||||||
|
case Opcodes.ILOAD:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// int operand is not used, don't write it
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writerHeader(StringBuilder writer, ScriptDefinition script)
|
||||||
|
{
|
||||||
|
int intStackCount = script.getIntStackCount();
|
||||||
|
int stringStackCount = script.getStringStackCount();
|
||||||
|
int localIntCount = script.getLocalIntCount();
|
||||||
|
int localStringCount = script.getLocalStringCount();
|
||||||
|
|
||||||
|
writer.append(".int_stack_count ").append(intStackCount).append('\n');
|
||||||
|
writer.append(".string_stack_count ").append(stringStackCount).append('\n');
|
||||||
|
writer.append(".int_var_count ").append(localIntCount).append('\n');
|
||||||
|
writer.append(".string_var_count ").append(localStringCount).append('\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class AssemblerTest
|
|||||||
{
|
{
|
||||||
return new String[]
|
return new String[]
|
||||||
{
|
{
|
||||||
"395.rs2asm", "91.rs2asm"
|
"91.rs2asm"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
033
|
|
||||||
get_boostedskilllevels
|
|
||||||
int_to_string
|
|
||||||
1112
|
|
||||||
033
|
|
||||||
get_realskilllevels
|
|
||||||
034 3
|
|
||||||
033 3
|
|
||||||
int_to_string
|
|
||||||
1112 1
|
|
||||||
033
|
|
||||||
get_skillexperiences
|
|
||||||
034 4
|
|
||||||
load_string ","
|
|
||||||
036 1
|
|
||||||
035
|
|
||||||
load_string " XP:"
|
|
||||||
037 2
|
|
||||||
036 2
|
|
||||||
033 4
|
|
||||||
035 1
|
|
||||||
040 46
|
|
||||||
036 3
|
|
||||||
load_int 0
|
|
||||||
034 5
|
|
||||||
025 4181
|
|
||||||
load_int 0
|
|
||||||
if_icmpeq LABEL29
|
|
||||||
jump LABEL60
|
|
||||||
LABEL29:
|
|
||||||
033 3
|
|
||||||
load_int 99
|
|
||||||
if_icmplt LABEL33
|
|
||||||
jump LABEL59
|
|
||||||
LABEL33:
|
|
||||||
load_int 105
|
|
||||||
load_int 105
|
|
||||||
load_int 256
|
|
||||||
033 3
|
|
||||||
load_int 1
|
|
||||||
iadd
|
|
||||||
3408
|
|
||||||
034 5
|
|
||||||
035 2
|
|
||||||
load_string "|Next level at:|Remaining XP:"
|
|
||||||
concat_string
|
|
||||||
036 2
|
|
||||||
035 3
|
|
||||||
load_string "|"
|
|
||||||
033 5
|
|
||||||
035 1
|
|
||||||
040 46
|
|
||||||
load_string "|"
|
|
||||||
033 5
|
|
||||||
033 4
|
|
||||||
isub
|
|
||||||
035 1
|
|
||||||
040 46
|
|
||||||
037 4
|
|
||||||
concat_string
|
|
||||||
036 3
|
|
||||||
LABEL59:
|
|
||||||
jump LABEL78
|
|
||||||
LABEL60:
|
|
||||||
035 2
|
|
||||||
load_string "|Next level at:"
|
|
||||||
concat_string
|
|
||||||
036 2
|
|
||||||
035 3
|
|
||||||
load_string "|"
|
|
||||||
load_int 105
|
|
||||||
load_int 105
|
|
||||||
load_int 256
|
|
||||||
033 3
|
|
||||||
load_int 1
|
|
||||||
iadd
|
|
||||||
3408
|
|
||||||
035 1
|
|
||||||
040 46
|
|
||||||
037 2
|
|
||||||
concat_string
|
|
||||||
036 3
|
|
||||||
LABEL78:
|
|
||||||
load_int 992
|
|
||||||
load_int -2147483645
|
|
||||||
load_int -1
|
|
||||||
033 2
|
|
||||||
035 2
|
|
||||||
035 3
|
|
||||||
load_int 495
|
|
||||||
load_int 25
|
|
||||||
load_int 5
|
|
||||||
idiv
|
|
||||||
load_string "IiIssfi"
|
|
||||||
033 1
|
|
||||||
2412
|
|
||||||
load_int 0
|
|
||||||
043 2
|
|
||||||
return
|
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
033
|
.int_stack_count 2
|
||||||
|
.string_stack_count 1
|
||||||
|
.int_var_count 2
|
||||||
|
.string_var_count 1
|
||||||
|
iload 0
|
||||||
switch
|
switch
|
||||||
3: LABEL20
|
3: LABEL20
|
||||||
5: LABEL54
|
5: LABEL54
|
||||||
@@ -6,7 +10,7 @@
|
|||||||
7: LABEL3
|
7: LABEL3
|
||||||
jump LABEL84
|
jump LABEL84
|
||||||
LABEL3:
|
LABEL3:
|
||||||
033 1
|
iload 1
|
||||||
042 175
|
042 175
|
||||||
if_icmplt LABEL7
|
if_icmplt LABEL7
|
||||||
jump LABEL9
|
jump LABEL9
|
||||||
@@ -14,7 +18,7 @@ LABEL7:
|
|||||||
load_int 0
|
load_int 0
|
||||||
return
|
return
|
||||||
LABEL9:
|
LABEL9:
|
||||||
035
|
sload
|
||||||
string_remove_html
|
string_remove_html
|
||||||
3623
|
3623
|
||||||
load_int 1
|
load_int 1
|
||||||
@@ -28,7 +32,7 @@ LABEL17:
|
|||||||
return
|
return
|
||||||
jump LABEL84
|
jump LABEL84
|
||||||
LABEL20:
|
LABEL20:
|
||||||
033 1
|
iload 1
|
||||||
042 175
|
042 175
|
||||||
if_icmplt LABEL24
|
if_icmplt LABEL24
|
||||||
jump LABEL26
|
jump LABEL26
|
||||||
@@ -36,7 +40,7 @@ LABEL24:
|
|||||||
load_int 0
|
load_int 0
|
||||||
return
|
return
|
||||||
LABEL26:
|
LABEL26:
|
||||||
035
|
sload
|
||||||
string_remove_html
|
string_remove_html
|
||||||
3623
|
3623
|
||||||
load_int 1
|
load_int 1
|
||||||
@@ -59,7 +63,7 @@ LABEL40:
|
|||||||
if_icmpeq LABEL44
|
if_icmpeq LABEL44
|
||||||
jump LABEL51
|
jump LABEL51
|
||||||
LABEL44:
|
LABEL44:
|
||||||
035
|
sload
|
||||||
3609
|
3609
|
||||||
load_int 1
|
load_int 1
|
||||||
if_icmpeq LABEL49
|
if_icmpeq LABEL49
|
||||||
@@ -72,7 +76,7 @@ LABEL51:
|
|||||||
return
|
return
|
||||||
jump LABEL84
|
jump LABEL84
|
||||||
LABEL54:
|
LABEL54:
|
||||||
033 1
|
iload 1
|
||||||
042 175
|
042 175
|
||||||
if_icmplt LABEL58
|
if_icmplt LABEL58
|
||||||
jump LABEL60
|
jump LABEL60
|
||||||
@@ -80,7 +84,7 @@ LABEL58:
|
|||||||
load_int 0
|
load_int 0
|
||||||
return
|
return
|
||||||
LABEL60:
|
LABEL60:
|
||||||
033
|
iload 0
|
||||||
load_int 5
|
load_int 5
|
||||||
if_icmpeq LABEL64
|
if_icmpeq LABEL64
|
||||||
jump LABEL76
|
jump LABEL76
|
||||||
@@ -91,7 +95,7 @@ LABEL64:
|
|||||||
jump LABEL76
|
jump LABEL76
|
||||||
LABEL68:
|
LABEL68:
|
||||||
get_gamecycle
|
get_gamecycle
|
||||||
033 1
|
iload 1
|
||||||
isub
|
isub
|
||||||
load_int 500
|
load_int 500
|
||||||
if_icmpge LABEL74
|
if_icmpge LABEL74
|
||||||
|
|||||||
Reference in New Issue
Block a user