126  .instructionset

We’ve now reversed all the VM instructions, and have a full understanding about how it works. Here is the VM’s instruction set:

Instruction 1st arg 2nd arg What does it do?
“A” “M” arg2 *sym.current_memory_ptr += arg2
“P” arg2 sym.current_memory_ptr += arg2
“C” arg2 sym.written_by_instr_C += arg2
“S” “M” arg2 *sym.current_memory_ptr -= arg2
“P” arg2 sym.current_memory_ptr -= arg2
“C” arg2 sym.written_by_instr_C -= arg2
“I” arg1 n/a instr_A(arg1, 1)
“D” arg1 n/a instr_S(arg1, 1)
“P” arg1 n/a *sym.current_memory_ptr = arg1; instr_I(“P”)
“X” arg1 n/a *sym.current_memory_ptr ^= arg1
“J” arg1 n/a arg1_and_0x3f = arg1 & 0x3f;
if (arg1 & 0x40 != 0)
  arg1_and_0x3f *= -1
if (arg1 >= 0) return arg1_and_0x3f;
else if (*sym.written_by_instr_C != 0) {
  if (arg1_and_0x3f < 0)
    ++*sym.good_if_ne_zero;
  return arg1_and_0x3f;
} else return 2;
“C” arg1 n/a *sym.written_by_instr_C = arg1
“R” arg1 n/a return(arg1)