// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. enum { CD_NONE, CD_C, CD_O, CD_Z, CD_S, CD_P, CD_BE, CD_L, CD_LE, CD_AXZ, CD_BXZ, CD_CXZ, CD_DXZ, }; enum { SUFF_LOCK = (1 << 15), SUFF_NOMORE = (1 << 14), SUFF_COND = (1 << 13), SUFF_REP = (1 << 15), Fx_MASK = 0x1F, F3_SHIFT = 10, F2_SHIFT = 5, }; enum { A_NONE = 0b00000, A_REG = 0b00001, A_IMM64 = 0b00010, AM_START = 0b00100, AM_IMM64 = 0b00, AM_RR = 0b01, AM_RRI = 0b10, AM_RRII = 0b11, AM_8ACC = 0b00100, AM_16ACC = 0b01000, AM_32ACC = 0b01100, AM_64ACC = 0b10000, AM_MLEN_MASK = 0b11100, AM_MFMT_MASK = 0b00011, }; #define ACC_FMT_IS_MEM(x) ((x) >= AM_START && (x) <= (AM_64ACC|AM_RRII)) #define ACC_IS_MEM(x) (ACC_FMT_IS_MEM((x)->type)) struct acc_t { uint type; ulong val; // A_REG ulong reg; // AM_... ulong addr; uint mlen; // For instruction dumping ONLY ushort reg1, reg2; short imm1, imm2; }; enum { NOPRM, P_REG, P_IMM, P_MEM=4 }; struct instr_t { char *name; char *full; uint prm1; uint prm2; uint prm3; uint (*func)(ctx_t *, acc_t *, acc_t *, acc_t *, ulong *, ulong *, ulong *); }; bool eval_cond(ctx_t *ctx, uint cond); void exec_instr(ctx_t *ctx, instr_t *in, acc_t *p1, acc_t *p2, acc_t *p3, bool lock, bool rep); void extract_param(ctx_t *ctx, acc_t *p, uchar fmt); void dump_instr(ctx_t *ctx, instr_t *in, acc_t *p1, acc_t *p2, acc_t *p3, bool lock, bool rep);