// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include "arch.h" void scan_param(ctx_t *ctx, acc_t *p) { ushort c; reg_t *r; assert(p != 0); c = ctx->get(ctx); if (c == A_MEM) { p->mem = 1; c = ctx->get(ctx); } if (c >= A_IMM16) { assert(p->type == A_REG); p->type = c; c = ctx->get(ctx); } p->val = c; if (p->type == A_IMM32) { p->val = (p->val << 16) | ctx->get(ctx); } else if (p->type == A_IMM64) { p->val = (p->val << 16) | ctx->get(ctx); p->val = (p->val << 16) | ctx->get(ctx); p->val = (p->val << 16) | ctx->get(ctx); } else if (p->type == A_REG) { if (p->val > NREGS) { _except(ctx, E_ILL, "Inexistent REG"); } r = &ctx->r[p->val]; if (r->flags & (RES | CTL)) { _except(ctx, E_ACC, "Reserved REG"); } } } void dumpregs(ctx_t *ctx) { int i; reg_t *r; for (i = 0; i < NREGS; i++) { if (i > 0 && i % 4 == 0) log("\n"); r = &ctx->r[i]; log("%s=0x%016lX ", r->name, r->val); } log("\n"); } void dumpinstr(ctx_t *ctx, ushort c, acc_t *p1, acc_t *p2) { acc_t *p = 0; instr_t *i = &ctx->i[c]; log("%s", i->name); if (i->prms > 0) p = p1; lp: if (p != 0) { if (p->mem) log("["); if (p->type == A_REG) log(" %s", ctx->r[p->val].name); else log(" 0x%lX", p->val); if (p->mem) log("]"); if (p == p1 && i->prms == 2) { p = p2; goto lp; } } log("\n"); } void decode(ctx_t *ctx) { instr_t *i; acc_t p1 = { 0 }, p2 = { 0 }; ushort c = ctx->get(ctx); if (c == 0xFFFF) { _except(ctx, E_SHT, "Shutdown INSTR"); } else if (ISPREF(c)) { // nothing for now } else if (!ISINSTR(c)) { _except(ctx, E_ILL, "Bad opcode"); } // Scanning an instruction i = &ctx->i[c]; // Scan for parameters if (i->prms > 0) { scan_param(ctx, &p1); if (i->prms == 2) { scan_param(ctx, &p2); } } dumpinstr(ctx, c, &p1, &p2); i->func(ctx, &p1, &p2); }