36 lines
1.1 KiB
Plaintext
36 lines
1.1 KiB
Plaintext
fcn unasm(code){
|
|
all_ops,nthString := all_syms.pump(Dictionary(),"reverse"),-1;
|
|
println("Datasize: %d bytes, Strings: %d bytes"
|
|
.fmt(vars.len()*WORD_SIZE,strings.reduce(fcn(s,[(k,v)]){ s+k.len() },0)));
|
|
word:='wrap(pc){ code.toLittleEndian(pc,WORD_SIZE,False) }; // signed
|
|
pc:=0; while(pc<code.len()){
|
|
op:=code[pc]; print("%4d: %2d ".fmt(pc,op));
|
|
pc+=1;
|
|
switch(op){
|
|
case(66){
|
|
n,str := code[pc], code[pc+=1,n].text;
|
|
println("String #%d %3d \"%s\"".fmt(nthString+=1,n,
|
|
Compiler.Asm.quotify(str)));
|
|
pc+=n;
|
|
}
|
|
case(FETCH,STORE,PUSH){
|
|
println("%s [%d]".fmt(all_ops[op],word(pc)));
|
|
pc+=WORD_SIZE;
|
|
}
|
|
case(ADD,SUB,MUL,DIV,MOD,LT,GT,LE,GE,EQ,NE,AND,OR,NEG,NOT,
|
|
PRTC,PRTI,PRTS,HALT){ println(all_ops[op]) }
|
|
case(JMP){
|
|
n:=word(pc);
|
|
println("jmp (%d) %d".fmt(n, pc + n));
|
|
pc+=WORD_SIZE;
|
|
}
|
|
case(JZ){
|
|
n:=word(pc);
|
|
println("jz (%d) %d".fmt(n, pc + n));
|
|
pc+=WORD_SIZE;
|
|
}
|
|
else throw(Exception.AssertionError("Unknown opcode %d".fmt(op)));
|
|
}
|
|
}
|
|
}
|