Add custom arithmetic functions, created md5.jas

This commit is contained in:
2019-06-19 23:01:15 +02:00
parent fa49500139
commit 2e58861285
7 changed files with 1734 additions and 40 deletions

View File

@@ -31,33 +31,49 @@ lazy_static! {
let mut m = vec![Operation::Invalid; 0xFF + 1];
m[0x00] = Operation::Op("NOP", nop, vec![]);
m[0x10] = Operation::Op("BIPUSH", bipush, vec![Args::Byte]);
m[0x13] = Operation::Op("LDC_W", ldc_w, vec![Args::Constant]);
m[0x15] = Operation::Op("ILOAD", iload, vec![Args::Var]);
m[0x36] = Operation::Op("ISTORE", istore, vec![Args::Var]);
m[0x57] = Operation::Op("POP", pop, vec![]);
m[0x59] = Operation::Op("DUP", dup, vec![]);
m[0x5F] = Operation::Op("SWAP", swap, vec![]);
m[0x60] = Operation::Op("IADD", iadd, vec![]);
m[0x64] = Operation::Op("ISUB", isub, vec![]);
#[cfg(feature = "extra:arithmetic")]
{
m[0x70] = Operation::Op("SHL", shl, vec![]);
m[0x71] = Operation::Op("SHR", shr, vec![]);
m[0x72] = Operation::Op("IMUL", imul, vec![]);
m[0x73] = Operation::Op("IDIV", idiv, vec![]);
}
m[0x7E] = Operation::Op("IAND", iand, vec![]);
m[0xB0] = Operation::Op("IOR", ior, vec![]);
m[0x84] = Operation::Op("IINC", iinc, vec![Args::Var, Args::Byte]);
m[0x99] = Operation::Op("IFEQ", ifeq, vec![Args::Label]);
m[0x9b] = Operation::Op("IFLT", iflt, vec![Args::Label]);
m[0x9F] = Operation::Op("IF_ICMPEQ", if_icmpeq, vec![Args::Label]);
m[0xA7] = Operation::Op("GOTO", goto, vec![Args::Label]);
m[0xAC] = Operation::Op("IRETURN", ireturn, vec![]);
m[0xB6] = Operation::Op("INVOKEVIRTUAL", invokevirtual, vec![Args::Constant]);
m[0xC4] = Operation::Op("WIDE", wide, vec![]);
m[0xFC] = Operation::Op("IN", _in, vec![]);
m[0xFD] = Operation::Op("OUT", out, vec![]);
m[0xFE] = Operation::Op("ERR", err, vec![]);
m[0xFF] = Operation::Op("HALT", halt, vec![]);
#[cfg(feature = "extra:sleep")]
m[0xB0] = Operation::Op("IOR", ior, vec![]);
m[0xB6] = Operation::Op("INVOKEVIRTUAL", invokevirtual, vec![Args::Constant]);
m[0xC4] = Operation::Op("WIDE", wide, vec![]);
#[cfg(feature = "bonus:heap")]
{
m[0xF0] = Operation::Op("SLP", slp, vec![Args::Byte]);
m[0xD1] = Operation::Op("NEWARRAY", newarray, vec![]);
m[0xD2] = Operation::Op("IALOAD", iaload, vec![]);
m[0xD3] = Operation::Op("IASTORE", iastore, vec![]);
m[0xD4] = Operation::Op("GC", gc, vec![]);
}
#[cfg(feature = "bonus:network")]
@@ -69,13 +85,14 @@ lazy_static! {
m[0xE5] = Operation::Op("NETCLOSE", netclose, vec![]);
}
#[cfg(feature = "bonus:heap")]
#[cfg(feature = "extra:sleep")]
{
m[0xD1] = Operation::Op("NEWARRAY", newarray, vec![]);
m[0xD2] = Operation::Op("IALOAD", iaload, vec![]);
m[0xD3] = Operation::Op("IASTORE", iastore, vec![]);
m[0xD4] = Operation::Op("GC", gc, vec![]);
m[0xF0] = Operation::Op("SLP", slp, vec![Args::Byte]);
}
m[0xFC] = Operation::Op("IN", _in, vec![]);
m[0xFD] = Operation::Op("OUT", out, vec![]);
m[0xFE] = Operation::Op("ERR", err, vec![]);
m[0xFF] = Operation::Op("HALT", halt, vec![]);
m
};
@@ -293,18 +310,34 @@ fn slp(machine: &mut Machine) -> Result<()> {
#[cfg(feature = "bonus:network")]
fn netbind(machine: &mut Machine) -> Result<()> {
let port: i32 = machine.cur_stack().pop()?.try_into()?;
machine.net.bind(port as u16)
let result = match machine.net.bind(port as u16) {
Ok(_) => 1,
Err(_) => 0,
};
machine.cur_stack().push(Value::Int(result));
Ok(())
}
#[cfg(feature = "bonus:network")]
fn netconnect(machine: &mut Machine) -> Result<()> {
let port: i32 = machine.cur_stack().pop()?.try_into()?;
let host: i32 = machine.cur_stack().pop()?.try_into()?;
machine.net.connect(host as u32, port as u16)
let result = match machine.net.connect(host as u32, port as u16) {
Ok(_) => 1,
Err(_) => 0,
};
machine.cur_stack().push(Value::Int(result));
Ok(())
}
#[cfg(feature = "bonus:network")]
fn netin(machine: &mut Machine) -> Result<()> {
let netref: i32 = machine.cur_stack().pop()?.try_into()?;
if netref != 1 {
return Err("Invalid netref to netin");
}
let byte = i32::from(machine.net.read_byte()?);
machine.cur_stack().push(Value::Int(byte));
Ok(())
@@ -312,12 +345,21 @@ fn netin(machine: &mut Machine) -> Result<()> {
#[cfg(feature = "bonus:network")]
fn netout(machine: &mut Machine) -> Result<()> {
let netref: i32 = machine.cur_stack().pop()?.try_into()?;
if netref != 1 {
return Err("Invalid netref to netout");
}
let val: i32 = machine.cur_stack().pop()?.try_into()?;
machine.net.write_byte(val as u8)
}
#[cfg(feature = "bonus:network")]
fn netclose(machine: &mut Machine) -> Result<()> {
let netref: i32 = machine.cur_stack().pop()?.try_into()?;
if netref != 1 {
return Err("Invalid netref to netclose");
}
machine.net.close()
}
@@ -367,3 +409,40 @@ fn gc(machine: &mut Machine) -> Result<()> {
machine.heap.gc();
Ok(())
}
#[cfg(feature = "extra:arithmetic")]
fn shl(machine: &mut Machine) -> Result<()> {
let shift: i32 = machine.cur_stack().pop()?.try_into()?;
let value: i32 = machine.cur_stack().pop()?.try_into()?;
machine.cur_stack().push(Value::Int(value << shift));
Ok(())
}
#[cfg(feature = "extra:arithmetic")]
fn shr(machine: &mut Machine) -> Result<()> {
let shift: i32 = machine.cur_stack().pop()?.try_into()?;
let value: i32 = machine.cur_stack().pop()?.try_into()?;
let result: u32 = (value as u32) >> (shift as u32);
machine.cur_stack().push(Value::Int(result as i32));
Ok(())
}
#[cfg(feature = "extra:arithmetic")]
fn imul(machine: &mut Machine) -> Result<()> {
let a: i32 = machine.cur_stack().pop()?.try_into()?;
let b: i32 = machine.cur_stack().pop()?.try_into()?;
machine.cur_stack().push(Value::Int(a * b));
Ok(())
}
#[cfg(feature = "extra:arithmetic")]
fn idiv(machine: &mut Machine) -> Result<()> {
let divisor: i32 = machine.cur_stack().pop()?.try_into()?;
let value: i32 = machine.cur_stack().pop()?.try_into()?;
machine.cur_stack().push(Value::Int(value / divisor));
Ok(())
}