#define opnNone         0x0
#define opnPreRt        0x1         //  contains trailing comma
#define opnRd           0x2
#define opnFd           0x4
#define opnRdComma      0x8
#define opnRdOptRs      0x10        //  [Rd,] Rs
#define opnRs           0x20
#define opnFs           0x40
#define opnRsComma      0x80
#define opnRt           0x100
#define opnFt           0x200
#define opnRtComma      0x400
#define opnPostRs       0x800
#define opnImm16        0x1000
#define opnRel16        0x2000
#define opnImm10        0x4000
#define opnImm20        0x8000
#define opnImm26        0x10000
#define opnAddr26       0x20000

#define opnByteIndex    0x40000
#define opnWordIndex    0x80000
#define opnDwordIndex   0x100000
#define opnLeftIndex    0x200000
#define opnRightIndex   0x400000
#define opnAnyIndex     0x7c0000

#define opnShift        0x800000
#define opnCache        0x1000000

#define opnR4000        0x2000000

#define opnRdRsRt       opnRd + opnRdComma + opnRs + opnRsComma + opnRt
#define opnRtRsImm16    opnPreRt + opnRs + opnRsComma + opnImm16
#define opnRsRtRel16    opnRs + opnRsComma + opnRt + opnRtComma + opnRel16
#define opnRsRel16      opnRs + opnRsComma + opnRel16
#define opnRtRd         opnPreRt + opnRd
#define opnRsRt         opnRs + opnRsComma + opnRt
#define opnRsRtImm10    opnRs + opnRsComma + opnRt + opnRtComma + opnImm10
#define opnRdRs         opnRd + opnRdComma + opnRs
#define opnRtByteIndex  opnPreRt + opnByteIndex
#define opnRtWordIndex  opnPreRt + opnWordIndex
#define opnRtDwordIndex opnPreRt + opnDwordIndex
#define opnRtLeftIndex  opnPreRt + opnLeftIndex
#define opnRtRightIndex opnPreRt + opnRightIndex
#define opnRtImm16      opnPreRt + opnImm16
#define opnRdRtShift    opnRd + opnRdComma + opnRt + opnRtComma + opnShift
#define opnRdRtRs       opnRd + opnRdComma + opnRt + opnRtComma + opnPostRs
#define opnFdFs         opnFd + opnRdComma + opnFs
#define opnFdFsFt       opnFd + opnRdComma + opnFs + opnRsComma + opnFt
#define opnFsFt         opnFs + opnRsComma + opnFt
#define opnRtFs         opnPreRt + opnFs
#define opnFtDwordIndex opnFt + opnRtComma + opnDwordIndex
#define opnRsImm16      opnRs + opnRsComma + opnImm16
#define opnCacheRightIndex opnCache + opnRightIndex

typedef union instr {
    ULONG   instruction;
    struct _jump_instr {
        ULONG   Target  : 26;
        ULONG   Opcode  : 6;
        } jump_instr;
    struct _break_instr {
        ULONG   Opcode  : 6;
        ULONG   Fill    : 10;
        ULONG   Value   : 10;
        ULONG   Special : 6;
        } break_instr;
    struct _trap_instr {
        ULONG   Opcode  : 6;
        ULONG   Value   : 10;
        ULONG   RT      : 5;
        ULONG   RS      : 5;
        ULONG   Special : 6;
        } trap_instr;
    struct _immed_instr {
        ULONG   Value   : 16;
        ULONG   RT      : 5;
        ULONG   RS      : 5;
        ULONG   Opcode  : 6;
        } immed_instr;
    struct _special_instr {
        ULONG   Funct   : 6;
        ULONG   RE      : 5;
        ULONG   RD      : 5;
        ULONG   RT      : 5;
        ULONG   RS      : 5;
        ULONG   Opcode  : 6;
        } special_instr;
    struct _float_instr {
        ULONG   Funct   : 6;
        ULONG   FD      : 5;
        ULONG   FS      : 5;
        ULONG   FT      : 5;
        ULONG   Format  : 5;
        ULONG   Opcode  : 6;
        } float_instr;
    } INSTR;

extern PUCHAR   pszReg[];

extern UCHAR    pszAbs_s[];
extern UCHAR    pszAdd[];
extern UCHAR    pszAddi[];
extern UCHAR    pszAddiu[];
extern UCHAR    pszAddu[];
extern UCHAR    pszAdd_s[];
extern UCHAR    pszAnd[];
extern UCHAR    pszAndi[];
extern UCHAR    pszBc0f[];
extern UCHAR    pszBc0fl[];
extern UCHAR    pszBc0t[];
extern UCHAR    pszBc0tl[];
extern UCHAR    pszBc1f[];
extern UCHAR    pszBc1fl[];
extern UCHAR    pszBc1t[];
extern UCHAR    pszBc1tl[];
extern UCHAR    pszBc2f[];
extern UCHAR    pszBc2fl[];
extern UCHAR    pszBc2t[];
extern UCHAR    pszBc2tl[];
extern UCHAR    pszBc3f[];
extern UCHAR    pszBc3fl[];
extern UCHAR    pszBc3t[];
extern UCHAR    pszBc3tl[];
extern UCHAR    pszBgez[];
extern UCHAR    pszBgezal[];
extern UCHAR    pszBgezall[];
extern UCHAR    pszBgezl[];
extern UCHAR    pszBgtz[];
extern UCHAR    pszBgtzl[];
extern UCHAR    pszBeq[];
extern UCHAR    pszBeql[];
extern UCHAR    pszBlez[];
extern UCHAR    pszBlezl[];
extern UCHAR    pszBltz[];
extern UCHAR    pszBltzal[];
extern UCHAR    pszBltzall[];
extern UCHAR    pszBltzl[];
extern UCHAR    pszBne[];
extern UCHAR    pszBnel[];
extern UCHAR    pszBreak[];
extern UCHAR    pszC_eq_s[];
extern UCHAR    pszC_f_s[];
extern UCHAR    pszC_le_s[];
extern UCHAR    pszC_lt_s[];
extern UCHAR    pszC_nge_s[];
extern UCHAR    pszC_ngl_s[];
extern UCHAR    pszC_ngle_s[];
extern UCHAR    pszC_ngt_s[];
extern UCHAR    pszC_ole_s[];
extern UCHAR    pszC_olt_s[];
extern UCHAR    pszC_seq_s[];
extern UCHAR    pszC_sf_s[];
extern UCHAR    pszC_ueq_s[];
extern UCHAR    pszC_ule_s[];
extern UCHAR    pszC_ult_s[];
extern UCHAR    pszC_un_s[];
extern UCHAR    pszCache[];
extern UCHAR    pszCeil_w_s[];
extern UCHAR    pszCfc0[];
extern UCHAR    pszCfc1[];
extern UCHAR    pszCfc2[];
extern UCHAR    pszCfc3[];
extern UCHAR    pszCtc0[];
extern UCHAR    pszCtc1[];
extern UCHAR    pszCtc2[];
extern UCHAR    pszCtc3[];
extern UCHAR    pszCop0[];
extern UCHAR    pszCop1[];
extern UCHAR    pszCop2[];
extern UCHAR    pszCop3[];
extern UCHAR    pszCvt_d_s[];
extern UCHAR    pszCvt_e_s[];
extern UCHAR    pszCvt_q_s[];
extern UCHAR    pszCvt_s_s[];
extern UCHAR    pszCvt_w_s[];
extern UCHAR    pszDiv[];
extern UCHAR    pszDiv_s[];
extern UCHAR    pszDivu[];
extern UCHAR    pszDmfc0[];
extern UCHAR    pszDmtc0[];
extern UCHAR    pszDmult[];
extern UCHAR    pszDmultu[];
extern UCHAR    pszDsll[];
extern UCHAR    pszDsllv[];
extern UCHAR    pszDsll32[];
extern UCHAR    pszDsra[];
extern UCHAR    pszDsrav[];
extern UCHAR    pszDsra32[];
extern UCHAR    pszDsrl[];
extern UCHAR    pszDsrlv[];
extern UCHAR    pszDsrl32[];
extern UCHAR    pszDsub[];
extern UCHAR    pszDsubu[];
extern UCHAR    pszEret[];
extern UCHAR    pszFloor_w_s[];
extern UCHAR    pszJ[];
extern UCHAR    pszJr[];
extern UCHAR    pszJal[];
extern UCHAR    pszJalr[];
extern UCHAR    pszLb[];
extern UCHAR    pszLbu[];
extern UCHAR    pszLdc1[];
extern UCHAR    pszLdc2[];
extern UCHAR    pszLdc3[];
extern UCHAR    pszLd[];
extern UCHAR    pszLdl[];
extern UCHAR    pszLdr[];
extern UCHAR    pszLh[];
extern UCHAR    pszLhu[];
extern UCHAR    pszLui[];
extern UCHAR    pszLwc0[];
extern UCHAR    pszLwc1[];
extern UCHAR    pszLwc2[];
extern UCHAR    pszLwc3[];
extern UCHAR    pszLw[];
extern UCHAR    pszLwl[];
extern UCHAR    pszLwr[];
extern UCHAR    pszMfc0[];
extern UCHAR    pszMfc1[];
extern UCHAR    pszMfc2[];
extern UCHAR    pszMfc3[];
extern UCHAR    pszMfhi[];
extern UCHAR    pszMflo[];
extern UCHAR    pszMov_s[];
extern UCHAR    pszMtc0[];
extern UCHAR    pszMtc1[];
extern UCHAR    pszMtc2[];
extern UCHAR    pszMtc3[];
extern UCHAR    pszMthi[];
extern UCHAR    pszMtlo[];
extern UCHAR    pszMul_s[];
extern UCHAR    pszMult[];
extern UCHAR    pszMultu[];
extern UCHAR    pszNeg_s[];
extern UCHAR    pszNop[];
extern UCHAR    pszNor[];
extern UCHAR    pszOr[];
extern UCHAR    pszOri[];
extern UCHAR    pszRfe[];
extern UCHAR    pszRound_w_s[];
extern UCHAR    pszSb[];
extern UCHAR    pszSdc1[];
extern UCHAR    pszSdc2[];
extern UCHAR    pszSdc3[];
extern UCHAR    pszSd[];
extern UCHAR    pszSdl[];
extern UCHAR    pszSdr[];
extern UCHAR    pszSh[];
extern UCHAR    pszSll[];
extern UCHAR    pszSllv[];
extern UCHAR    pszSlt[];
extern UCHAR    pszSlti[];
extern UCHAR    pszSltiu[];
extern UCHAR    pszSltu[];
extern UCHAR    pszSqrt_s[];
extern UCHAR    pszSra[];
extern UCHAR    pszSrl[];
extern UCHAR    pszSrav[];
extern UCHAR    pszSrlv[];
extern UCHAR    pszSub[];
extern UCHAR    pszSub_s[];
extern UCHAR    pszSubu[];
extern UCHAR    pszSw[];
extern UCHAR    pszSwc0[];
extern UCHAR    pszSwc1[];
extern UCHAR    pszSwc2[];
extern UCHAR    pszSwc3[];
extern UCHAR    pszSwl[];
extern UCHAR    pszSwr[];
extern UCHAR    pszSync[];
extern UCHAR    pszSyscall[];
extern UCHAR    pszTeq[];
extern UCHAR    pszTeqi[];
extern UCHAR    pszTge[];
extern UCHAR    pszTgei[];
extern UCHAR    pszTgeiu[];
extern UCHAR    pszTgeu[];
extern UCHAR    pszTlbr[];
extern UCHAR    pszTlbwi[];
extern UCHAR    pszTlbwr[];
extern UCHAR    pszTlbp[];
extern UCHAR    pszTlt[];
extern UCHAR    pszTlti[];
extern UCHAR    pszTltiu[];
extern UCHAR    pszTltu[];
extern UCHAR    pszTne[];
extern UCHAR    pszTnei[];
extern UCHAR    pszTrunc_w_s[];
extern UCHAR    pszXor[];
extern UCHAR    pszXori[];
extern UCHAR    pszDadd[];
extern UCHAR    pszDadd[];
extern UCHAR    pszDadd[];
extern UCHAR    pszDadd[];
extern UCHAR    pszDadd[];
extern UCHAR    pszDadd[];
extern UCHAR    pszLld[];
extern UCHAR    pszScd[];