#define OADLMACH_DEFINE_EXTERNS() {1} #include "oadlmach.oah" #include "libio.oah" proc "[]" hello(a) { for (var i = 0; i < a.length(); i++) { "", a[i], '\n'; } } proc decode(prc, nam) { using namespace oadlmach; using namespace io; try { var n = prc.length(); var i, j, incr; var args = new PackUint(2); for (i = 0; i < n; i += incr) { var op = prc[i]; var opname; incr = OADL_Decode(prc, i, op, args); if (op == OP_BUILTIN) { opname = builtinTab[Int(args[0])]; } else if (op >= OP_PUSH_32) { opname = "PUSH " ## typeTab[op & 63]; } else { opname = opcodeTab[op]; } if (op == OP_ADDRESS) { if (args[0] & 0x800000) { args[0] = -(1 + ((~args[0]) & 0xFFFFFF)); } args[0] += i + incr + 1; } printf("%06x: ", i); for (j = 0; j < 9; j++) { if (j < incr) { printf("%02x", prc[i+j]); } else { printf(" "); } } if (op == OP_BUILTIN) { printf("%s\n", opname); } else { switch (incr) { case 1 : printf("%s\n", opname); case 2 : printf("%s(%02x)\n", opname, args[0]); case 3 : printf("%s(%04x)\n", opname, args[0]); case 4 : printf("%s(%06x)\n", opname, args[0]); case 5 : printf("%s(%08x)\n", opname, args[0]); case 9 : printf("%s(%08x:%08x)\n", opname, args[0], args[1]); } } } } catch (a) { "Cannot read proc ", nam, '\n'; } } proc main() { var i, n; decode(hello, "hello"); decode(main, "main"); }