ULONG ParseIntOp(PUCHAR inString, PUCHAR *outString, POPTBLENTRY pEntry, PULONG poffset) { ULONG instruction; ULONG Ra, Rb, Rc; ULONG lit; ULONG Format; // Whether there is a literal or 3rd reg instruction = OPCODE(pEntry->opCode) + OP_FNC(pEntry->funcCode); Ra = GetIntReg(inString, &inString); if (!TestCharacter(inString, &inString, ',')) error(OPERAND); if (TestCharacter(inString, &inString, '#')) { // // User is giving us a literal value lit = GetValue(inString, &inString, TRUE, WIDTH_LIT); Format = RBV_LITERAL_FORMAT; } else { // // using a third register value Rb = GetIntReg(inString, &inString); Format = RBV_REGISTER_FORMAT; } if (!TestCharacter(inString, &inString, ',')) error(OPERAND); Rc = GetIntReg(inString, &inString); if (!TestCharacter(inString, &inString, '\0')) error(EXTRACHARS); instruction = instruction + REG_A(Ra) + RBV_TYPE(Format) + REG_C(Rc); if (Format == RBV_REGISTER_FORMAT) { instruction = instruction + REG_B(Rb); } else { instruction = instruction + LIT(lit); } return(instruction); }
REG_MPTR(cen, 0x17), /* Build a pc register. */ #define REG_PC(NAME, N) REG(NAME, N, CRX_PC_REGTYPE) REG_PC(pc, 0x0) }; const int crx_num_regs = ARRAY_SIZE (crx_regtab); const reg_entry crx_copregtab[] = { /* Build a Coprocessor register c<N>. */ #define REG_C(N) REG(CONCAT2(c,N), N, CRX_C_REGTYPE) REG_C(0), REG_C(1), REG_C(2), REG_C(3), REG_C(4), REG_C(5), REG_C(6), REG_C(7), REG_C(8), REG_C(9), REG_C(10), REG_C(11), REG_C(12), REG_C(13), REG_C(14), REG_C(15), /* Build a Coprocessor Special register cs<N>. */ #define REG_CS(N) REG(CONCAT2(cs,N), N, CRX_CS_REGTYPE) REG_CS(0), REG_CS(1), REG_CS(2), REG_CS(3), REG_CS(4), REG_CS(5), REG_CS(6), REG_CS(7), REG_CS(8), REG_CS(9), REG_CS(10), REG_CS(11), REG_CS(12), REG_CS(13), REG_CS(14), REG_CS(15) }; const int crx_num_copregs = ARRAY_SIZE (crx_copregtab);