Add a fully functioning disassemblere?
This commit is contained in:
82
src/ops.rs
82
src/ops.rs
@@ -6,8 +6,17 @@ use std::io::{Read};
|
||||
|
||||
pub type OpFunc = fn(&mut Machine) -> Result<()>;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Args {
|
||||
Byte,
|
||||
Short,
|
||||
Var,
|
||||
Label,
|
||||
Constant,
|
||||
}
|
||||
|
||||
pub enum Operation {
|
||||
Op(&'static str, OpFunc),
|
||||
Op(&'static str, OpFunc, Vec<Args>),
|
||||
Invalid(u8)
|
||||
}
|
||||
|
||||
@@ -15,50 +24,51 @@ const JUMP_OFFSET: i32 = 3;
|
||||
|
||||
pub fn num_to_op(op: u8) -> Operation {
|
||||
match op {
|
||||
0x00 => Operation::Op("NOP", nop),
|
||||
0x10 => Operation::Op("BIPUSH", bipush),
|
||||
0x13 => Operation::Op("LDC_W", ldc_w),
|
||||
0x15 => Operation::Op("ILOAD", iload),
|
||||
0x36 => Operation::Op("ISTORE", istore),
|
||||
0x57 => Operation::Op("POP", pop),
|
||||
0x59 => Operation::Op("DUP", dup),
|
||||
0x5F => Operation::Op("SWAP", swap),
|
||||
0x60 => Operation::Op("IADD", iadd),
|
||||
0x64 => Operation::Op("ISUB", isub),
|
||||
0x7E => Operation::Op("IAND", iand),
|
||||
0xB0 => Operation::Op("IOR", ior),
|
||||
0x84 => Operation::Op("IINC", iinc),
|
||||
0x99 => Operation::Op("IFEQ", ifeq),
|
||||
0x9b => Operation::Op("IFLT", iflt),
|
||||
0x9F => Operation::Op("IF_ICMPEQ", if_icmpeq),
|
||||
0xA7 => Operation::Op("GOTO", goto),
|
||||
0xAC => Operation::Op("IRETURN", ireturn),
|
||||
0xB6 => Operation::Op("INVOKEVIRTUAL", invokevirtual),
|
||||
0xC4 => Operation::Op("WIDE", wide),
|
||||
0xFC => Operation::Op("IN", _in),
|
||||
0xFD => Operation::Op("OUT", out),
|
||||
0xFF => Operation::Op("HALT", halt),
|
||||
0x00 => Operation::Op("NOP", nop, vec![]),
|
||||
0x10 => Operation::Op("BIPUSH", bipush, vec![Args::Byte]),
|
||||
0x13 => Operation::Op("LDC_W", ldc_w, vec![Args::Constant]),
|
||||
0x15 => Operation::Op("ILOAD", iload, vec![Args::Var]),
|
||||
0x36 => Operation::Op("ISTORE", istore, vec![Args::Var]),
|
||||
0x57 => Operation::Op("POP", pop, vec![]),
|
||||
0x59 => Operation::Op("DUP", dup, vec![]),
|
||||
0x5F => Operation::Op("SWAP", swap, vec![]),
|
||||
0x60 => Operation::Op("IADD", iadd, vec![]),
|
||||
0x64 => Operation::Op("ISUB", isub, vec![]),
|
||||
0x7E => Operation::Op("IAND", iand, vec![]),
|
||||
0xB0 => Operation::Op("IOR", ior, vec![]),
|
||||
0x84 => Operation::Op("IINC", iinc, vec![Args::Var, Args::Byte]),
|
||||
0x99 => Operation::Op("IFEQ", ifeq, vec![Args::Label]),
|
||||
0x9b => Operation::Op("IFLT", iflt, vec![Args::Label]),
|
||||
0x9F => Operation::Op("IF_ICMPEQ", if_icmpeq, vec![Args::Label]),
|
||||
0xA7 => Operation::Op("GOTO", goto, vec![Args::Label]),
|
||||
0xAC => Operation::Op("IRETURN", ireturn, vec![]),
|
||||
0xB6 => Operation::Op("INVOKEVIRTUAL", invokevirtual, vec![Args::Constant]),
|
||||
0xC4 => Operation::Op("WIDE", wide, vec![]),
|
||||
0xFC => Operation::Op("IN", _in, vec![]),
|
||||
0xFD => Operation::Op("OUT", out, vec![]),
|
||||
0xFE => Operation::Op("ERR", err, vec![]),
|
||||
0xFF => Operation::Op("HALT", halt, vec![]),
|
||||
|
||||
#[cfg(feature = "extra:sleep")]
|
||||
0xF0 => Operation::Op("SLP", slp),
|
||||
0xF0 => Operation::Op("SLP", slp, vec![Args::Byte]),
|
||||
|
||||
#[cfg(feature = "bonus:network")]
|
||||
0xE1 => Operation::Op("NETBIND", netbind),
|
||||
0xE1 => Operation::Op("NETBIND", netbind, vec![]),
|
||||
#[cfg(feature = "bonus:network")]
|
||||
0xE2 => Operation::Op("NETCONNECT", netconnect),
|
||||
0xE2 => Operation::Op("NETCONNECT", netconnect, vec![]),
|
||||
#[cfg(feature = "bonus:network")]
|
||||
0xE3 => Operation::Op("NETIN", netin),
|
||||
0xE3 => Operation::Op("NETIN", netin, vec![]),
|
||||
#[cfg(feature = "bonus:network")]
|
||||
0xE4 => Operation::Op("NETOUT", netout),
|
||||
0xE4 => Operation::Op("NETOUT", netout, vec![]),
|
||||
#[cfg(feature = "bonus:network")]
|
||||
0xE5 => Operation::Op("NETCLOSE", netclose),
|
||||
0xE5 => Operation::Op("NETCLOSE", netclose, vec![]),
|
||||
|
||||
#[cfg(feature = "bonus:heap")]
|
||||
0xD1 => Operation::Op("NEWARRAY", newarray),
|
||||
0xD1 => Operation::Op("NEWARRAY", newarray, vec![]),
|
||||
#[cfg(feature = "bonus:heap")]
|
||||
0xD2 => Operation::Op("IALOAD", iaload),
|
||||
0xD2 => Operation::Op("IALOAD", iaload, vec![]),
|
||||
#[cfg(feature = "bonus:heap")]
|
||||
0xD3 => Operation::Op("IASTORE", iastore),
|
||||
0xD3 => Operation::Op("IASTORE", iastore, vec![]),
|
||||
|
||||
x => Operation::Invalid(x)
|
||||
}
|
||||
@@ -126,6 +136,12 @@ fn goto(machine: &mut Machine) -> Result<()> {
|
||||
machine.block.jump(offset)
|
||||
}
|
||||
|
||||
fn err(machine: &mut Machine) -> Result<()> {
|
||||
machine.halted = true;
|
||||
eprintln!("MACHINE CALLED ERR");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn halt(machine: &mut Machine) -> Result<()> {
|
||||
machine.halted = true;
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user