// license:BSD-3-Clause// copyright-holders:Andrew Gardner#include"emu.h"#include<cstdio>#include<cstring>#include<cstdlib>#include"tables.h"#include"dsp56def.h"namespaceDSP_56156{/******************//* Table decoding *//******************/bfShiftdecode_BBB_table(uint16_tBBB){switch(BBB){case0x4:returnBBB_UPPER;case0x2:returnBBB_MIDDLE;case0x1:returnBBB_LOWER;}returnBBB_INVALID;}voiddecode_cccc_table(constuint16_tcccc,op_mnem&mnemonic){switch(cccc){case0x0:mnemonic=oCC;break;case0x1:mnemonic=oGE;break;case0x2:mnemonic=oNE;break;case0x3:mnemonic=oPL;break;case0x4:mnemonic=oNN;break;case0x5:mnemonic=oEC;break;case0x6:mnemonic=oLC;break;case0x7:mnemonic=oGT;break;case0x8:mnemonic=oCS;break;case0x9:mnemonic=oLT;break;case0xa:mnemonic=oEQ;break;case0xb:mnemonic=oMI;break;case0xc:mnemonic=oNR;break;case0xd:mnemonic=oES;break;case0xe:mnemonic=oLS;break;case0xf:mnemonic=oLE;break;}// NEW // switch (cccc)// NEW // {// NEW // case 0x0: sprintf(mnemonic, "cc(hs)"); break;// NEW // case 0x1: sprintf(mnemonic, "ge "); break;// NEW // case 0x2: sprintf(mnemonic, "ne "); break;// NEW // case 0x3: sprintf(mnemonic, "pl "); break;// NEW // case 0x4: sprintf(mnemonic, "nn "); break;// NEW // case 0x5: sprintf(mnemonic, "ec "); break;// NEW // case 0x6: sprintf(mnemonic, "lc "); break;// NEW // case 0x7: sprintf(mnemonic, "gt "); break;// NEW // case 0x8: sprintf(mnemonic, "cs(lo)"); break;// NEW // case 0x9: sprintf(mnemonic, "lt "); break;// NEW // case 0xa: sprintf(mnemonic, "eq "); break;// NEW // case 0xb: sprintf(mnemonic, "mi "); break;// NEW // case 0xc: sprintf(mnemonic, "nr "); break;// NEW // case 0xd: sprintf(mnemonic, "es "); break;// NEW // case 0xe: sprintf(mnemonic, "ls "); break;// NEW // case 0xf: sprintf(mnemonic, "le "); break;// NEW // }}voiddecode_DDDDD_table(constuint16_tDDDDD,reg_id&SD){switch(DDDDD){case0x00:SD=iX0;break;case0x01:SD=iY0;break;case0x02:SD=iX1;break;case0x03:SD=iY1;break;case0x04:SD=iA;break;case0x05:SD=iB;break;case0x06:SD=iA0;break;case0x07:SD=iB0;break;case0x08:SD=iLC;break;case0x09:SD=iSR;break;case0x0a:SD=iOMR;break;case0x0b:SD=iSP;break;case0x0c:SD=iA1;break;case0x0d:SD=iB1;break;case0x0e:SD=iA2;break;case0x0f:SD=iB2;break;case0x10:SD=iR0;break;case0x11:SD=iR1;break;case0x12:SD=iR2;break;case0x13:SD=iR3;break;case0x14:SD=iM0;break;case0x15:SD=iM1;break;case0x16:SD=iM2;break;case0x17:SD=iM3;break;case0x18:SD=iSSH;break;case0x19:SD=iSSL;break;case0x1a:SD=iLA;break;case0x1b:SD=iINVALID;break;/* no 0x1b */case0x1c:SD=iN0;break;case0x1d:SD=iN1;break;case0x1e:SD=iN2;break;case0x1f:SD=iN3;break;}}voiddecode_DD_table(constuint16_tDD,reg_id&SD){switch(DD){case0x0:SD=iX0;break;case0x1:SD=iY0;break;case0x2:SD=iX1;break;case0x3:SD=iY1;break;}}voiddecode_DDF_table(constuint16_tDD,constuint16_tF,reg_id&S,reg_id&D){constuint16_tswitchVal=(DD<<1)|F;switch(switchVal){case0x0:S=iX0;D=iA;break;case0x1:S=iX0;D=iB;break;case0x2:S=iY0;D=iA;break;case0x3:S=iY0;D=iB;break;case0x4:S=iX1;D=iA;break;case0x5:S=iX1;D=iB;break;case0x6:S=iY1;D=iA;break;case0x7:S=iY1;D=iB;break;}}voiddecode_EE_table(constuint16_tEE,reg_id&D){switch(EE){case0x1:D=iMR;break;case0x3:D=iCCR;break;case0x2:D=iOMR;break;}}voiddecode_F_table(constuint16_tF,reg_id&SD){switch(F){case0x0:SD=iA;break;case0x1:SD=iB;break;}}voiddecode_h0hF_table(constuint16_th0h,uint16_tF,reg_id&S,reg_id&D){constuint16_tswitchVal=(h0h<<1)|F;switch(switchVal){case0x8:S=iX0;D=iA;break;case0x9:S=iX0;D=iB;break;case0xa:S=iY0;D=iA;break;case0xb:S=iY0;D=iB;break;case0x2:S=iA;D=iA;break;case0x1:S=iA;D=iB;break;case0x0:S=iB;D=iA;break;case0x3:S=iB;D=iB;break;}}voiddecode_HH_table(constuint16_tHH,reg_id&SD){switch(HH){case0x0:SD=iX0;break;case0x1:SD=iY0;break;case0x2:SD=iA;break;case0x3:SD=iB;break;}}voiddecode_HHH_table(constuint16_tHHH,reg_id&SD){switch(HHH){case0x0:SD=iX0;break;case0x1:SD=iY0;break;case0x2:SD=iX1;break;case0x3:SD=iY1;break;case0x4:SD=iA;break;case0x5:SD=iB;break;case0x6:SD=iA0;break;case0x7:SD=iB0;break;}}voiddecode_IIIIx_table(constuint16_tIIII,constuint16_tx,reg_id&S,reg_id&D){S=D=iINVALID;switch(IIII){case0x0:S=iX0;D=iFHAT;break;case0x1:S=iY0;D=iFHAT;break;case0x2:S=iX1;D=iFHAT;break;case0x3:S=iY1;D=iFHAT;break;case0x4:S=iA;D=iX0;break;case0x5:S=iB;D=iY0;break;case0x6:S=iA0;D=iX0;break;case0x7:S=iB0;D=iY0;break;case0x8:if(x)S=iF;D=iFHAT;break;case0x9:if(!x)S=iF;D=iFHAT;break;case0xa:S=iWEIRD;D=iWEIRD;break;case0xb:S=iWEIRD;D=iWEIRD;break;case0xc:S=iA;D=iX1;break;case0xd:S=iB;D=iY1;break;case0xe:S=iA0;D=iX1;break;case0xf:S=iB0;D=iY1;break;}}voiddecode_JJJF_table(constuint16_tJJJ,constuint16_tF,reg_id&S,reg_id&D){constuint16_tswitchVal=(JJJ<<1)|F;switch(switchVal){case0x0:S=iB;D=iA;break;case0x1:S=iA;D=iB;break;case0x2:S=iINVALID;D=iINVALID;break;case0x3:S=iINVALID;D=iINVALID;break;case0x4:S=iX;D=iA;break;case0x5:S=iX;D=iB;break;case0x6:S=iY;D=iA;break;case0x7:S=iY;D=iB;break;case0x8:S=iX0;D=iA;break;case0x9:S=iX0;D=iB;break;case0xa:S=iY0;D=iA;break;case0xb:S=iY0;D=iB;break;case0xc:S=iX1;D=iA;break;case0xd:S=iX1;D=iB;break;case0xe:S=iY1;D=iA;break;case0xf:S=iY1;D=iB;break;}}voiddecode_JJF_table(constuint16_tJJ,constuint16_tF,reg_id&S,reg_id&D){constuint16_tswitchVal=(JJ<<1)|F;switch(switchVal){case0x0:S=iX0;D=iA;break;case0x1:S=iX0;D=iB;break;case0x2:S=iY0;D=iA;break;case0x3:S=iY0;D=iB;break;case0x4:S=iX1;D=iA;break;case0x5:S=iX1;D=iB;break;case0x6:S=iY1;D=iA;break;case0x7:S=iY1;D=iB;break;}}voiddecode_JF_table(constuint16_tJ,constuint16_tF,reg_id&S,reg_id&D){constuint16_tswitchVal=(J<<1)|F;switch(switchVal){case0x0:S=iX;D=iA;break;case0x1:S=iX;D=iB;break;case0x2:S=iY;D=iA;break;case0x3:S=iY;D=iB;break;}}// NEW // void decode_k_table(uint16_t k, char *Dnot)// NEW // {// NEW // switch(k)// NEW // {// NEW // case 0x0: sprintf(Dnot, "B"); break;// NEW // case 0x1: sprintf(Dnot, "A"); break;// NEW // }// NEW // }voiddecode_kSign_table(constuint16_tk,std::string&plusMinus){switch(k){case0x0:plusMinus="+";break;case0x1:plusMinus="-";break;}}voiddecode_KKK_table(constuint16_tKKK,reg_id&D1,reg_id&D2){switch(KKK){case0x0:D1=iFHAT;D2=iX0;break;case0x1:D1=iY0;D2=iX0;break;case0x2:D1=iX1;D2=iX0;break;case0x3:D1=iY1;D2=iX0;break;case0x4:D1=iX0;D2=iX1;break;case0x5:D1=iY0;D2=iX1;break;case0x6:D1=iFHAT;D2=iY0;break;case0x7:D1=iY1;D2=iX1;break;}}voiddecode_NN_table(uint16_tNN,reg_id&ret){switch(NN){case0x0:ret=iN0;break;case0x1:ret=iN1;break;case0x2:ret=iN2;break;case0x3:ret=iN3;break;}}voiddecode_TT_table(uint16_tTT,reg_id&ret){switch(TT){case0x0:ret=iR0;break;case0x1:ret=iR1;break;case0x2:ret=iR2;break;case0x3:ret=iR3;break;}}voiddecode_QQF_table(constuint16_tQQ,constuint16_tF,reg_id&S1,reg_id&S2,reg_id&D){constuint16_tswitchVal=(QQ<<1)|F;switch(switchVal){case0x0:S1=iY0;S2=iX0;D=iA;break;case0x1:S1=iY0;S2=iX0;D=iB;break;case0x2:S1=iY1;S2=iX0;D=iA;break;case0x3:S1=iY1;S2=iX0;D=iB;break;case0x4:S1=iY0;S2=iX1;D=iA;break;case0x5:S1=iY0;S2=iX1;D=iB;break;case0x6:S1=iY1;S2=iX1;D=iA;break;case0x7:S1=iY1;S2=iX1;D=iB;break;}}voiddecode_QQF_special_table(constuint16_tQQ,constuint16_tF,reg_id&S1,reg_id&S2,reg_id&D){constuint16_tswitchVal=(QQ<<1)|F;switch(switchVal){case0x0:S1=iY0;S2=iX0;D=iA;break;case0x1:S1=iY0;S2=iX0;D=iB;break;case0x2:S1=iY1;S2=iX0;D=iA;break;case0x3:S1=iY1;S2=iX0;D=iB;break;case0x4:S1=iX1;S2=iY0;D=iA;break;case0x5:S1=iX1;S2=iY0;D=iB;break;case0x6:S1=iX1;S2=iY1;D=iA;break;case0x7:S1=iX1;S2=iY1;D=iB;break;}}voiddecode_QQQF_table(constuint16_tQQQ,constuint16_tF,reg_id&S1,reg_id&S2,reg_id&D){constuint16_tswitchVal=(QQQ<<1)|F;switch(switchVal){case0x0:S1=iX0;S2=iX0;D=iA;break;case0x1:S1=iX0;S2=iX0;D=iB;break;case0x2:S1=iX1;S2=iX0;D=iA;break;case0x3:S1=iX1;S2=iX0;D=iB;break;case0x4:S1=iA1;S2=iY0;D=iA;break;case0x5:S1=iA1;S2=iY0;D=iB;break;case0x6:S1=iB1;S2=iX0;D=iA;break;case0x7:S1=iB1;S2=iX0;D=iB;break;case0x8:S1=iY0;S2=iX0;D=iA;break;case0x9:S1=iY0;S2=iX0;D=iB;break;case0xa:S1=iY1;S2=iX0;D=iA;break;case0xb:S1=iY1;S2=iX0;D=iB;break;case0xc:S1=iY0;S2=iX1;D=iA;break;case0xd:S1=iY0;S2=iX1;D=iB;break;case0xe:S1=iY1;S2=iX1;D=iA;break;case0xf:S1=iY1;S2=iX1;D=iB;break;}}voiddecode_RR_table(uint16_tRR,reg_id&ret){switch(RR){case0x0:ret=iR0;break;case0x1:ret=iR1;break;case0x2:ret=iR2;break;case0x3:ret=iR3;break;}}voiddecode_rr_table(uint16_trr,reg_id&ret){switch(rr){case0x0:ret=iR0;break;case0x1:ret=iR1;break;case0x2:ret=iR2;break;case0x3:ret=iR3;break;}}voiddecode_s_table(constuint16_ts,op_mnem&arithmetic){switch(s){case0x0:arithmetic=oSU;break;case0x1:arithmetic=oUU;break;}}voiddecode_ss_table(constuint16_tss,op_mnem&arithmetic){switch(ss){case0x0:arithmetic=oSS;break;case0x1:arithmetic=oINVALID;break;// NEW // case 0x1: arithmetic = "ss"; break;case0x2:arithmetic=oSU;break;case0x3:arithmetic=oUU;break;}}voiddecode_uuuuF_table(constuint16_tuuuu,constuint16_tF,std::string&arg,reg_id&S,reg_id&D){constuint16_tswitchVal=(uuuu<<1)|F;//D = "sub?";//S = "add";arg="invalid";switch(switchVal){case0x00:arg="add";S=iX0;D=iA;break;case0x01:arg="add";S=iX0;D=iB;break;case0x02:arg="add";S=iY0;D=iA;break;case0x03:arg="add";S=iY0;D=iB;break;case0x04:arg="add";S=iX1;D=iA;break;case0x05:arg="add";S=iX1;D=iB;break;case0x06:arg="add";S=iY1;D=iA;break;case0x07:arg="add";S=iY1;D=iB;break;case0x08:arg="sub";S=iX0;D=iA;break;case0x09:arg="sub";S=iX0;D=iB;break;case0x0a:arg="sub";S=iY0;D=iA;break;case0x0b:arg="sub";S=iY0;D=iB;break;case0x0c:arg="sub";S=iX1;D=iA;break;case0x0d:arg="sub";S=iX1;D=iB;break;case0x0e:arg="sub";S=iY1;D=iA;break;case0x0f:arg="sub";S=iY1;D=iB;break;case0x18:arg="add";S=iB;D=iA;break;case0x19:arg="add";S=iA;D=iB;break;case0x1a:arg="sub";S=iB;D=iA;break;case0x1b:arg="sub";S=iA;D=iB;break;case0x1c:arg="tfr";S=iB;D=iA;break;case0x1d:arg="tfr";S=iA;D=iB;break;case0x1e:arg="move";S=iINVALID;D=iINVALID;break;case0x1f:arg="move";S=iINVALID;D=iINVALID;break;}}voiddecode_Z_table(constuint16_tZ,std::string&ea){/* This is fixed as per the Family Manual errata addendum */switch(Z){case0x1:ea="(A1)";break;case0x0:ea="(B1)";break;}}voidassemble_ea_from_m_table(constuint16_tm,constintn,std::string&ea){chartemp[32];switch(m){case0x0:sprintf(temp,"(R%d)+",n);break;case0x1:sprintf(temp,"(R%d)+N%d",n,n);break;}ea=temp;}voidassemble_eas_from_mm_table(uint16_tmm,intn1,intn2,std::string&ea1,std::string&ea2){chartemp1[32];chartemp2[32];switch(mm){case0x0:sprintf(temp1,"(R%d)+",n1);sprintf(temp2,"(R%d)+",n2);break;case0x1:sprintf(temp1,"(R%d)+",n1);sprintf(temp2,"(R%d)+N%d",n2,n2);break;case0x2:sprintf(temp1,"(R%d)+N%d",n1,n1);sprintf(temp2,"(R%d)+",n2);break;case0x3:sprintf(temp1,"(R%d)+N%d",n1,n1);sprintf(temp2,"(R%d)+N%d",n2,n2);break;}ea1=temp1;ea2=temp2;}voidassemble_ea_from_MM_table(uint16_tMM,intn,std::string&ea){chartemp[32];switch(MM){case0x0:sprintf(temp,"(R%d)",n);break;case0x1:sprintf(temp,"(R%d)+",n);break;case0x2:sprintf(temp,"(R%d)-",n);break;case0x3:sprintf(temp,"(R%d)+N%d",n,n);break;}ea=temp;}voidassemble_ea_from_q_table(uint16_tq,intn,std::string&ea){chartemp[32];switch(q){case0x0:sprintf(temp,"(R%d+N%d)",n,n);break;case0x1:sprintf(temp,"-(R%d)",n);break;}ea=temp;}voidassemble_ea_from_t_table(uint16_tt,uint16_tval,std::string&ea){chartemp[32];switch(t){case0x0:sprintf(temp,"X:>$%x",val);break;case0x1:sprintf(temp,"#>$%x",val);break;// NEW // case 0x0: sprintf(ea, "X:$%04x", val); break;// NEW // case 0x1: sprintf(ea, "#$%04x", val); break;}ea=temp;}voidassemble_ea_from_z_table(uint16_tz,intn,std::string&ea){chartemp[32];switch(z){case0x0:sprintf(temp,"(R%d)-",n);break;case0x1:sprintf(temp,"(R%d)+N%d",n,n);break;}ea=temp;}voidassemble_D_from_P_table(uint16_tP,uint16_tppppp,std::string&D){chartemp[32];std::stringfullAddy;/* Convert Short Absolute Address to full 16-bit */switch(P){case0x0:sprintf(temp,"X:<$%x",ppppp);// NEW // sprintf(temp, "X:$%02x", ppppp);break;case0x1:assemble_address_from_IO_short_address(ppppp,fullAddy);sprintf(temp,"X:<<$%s",fullAddy.c_str());// NEW // sprintf(temp, "X:$%s", fullAddy.c_str());break;}D=temp;}voidassemble_arguments_from_W_table(uint16_tW,charma,constreg_id&SD,conststd::string&ea,std::string&source,std::string&destination){chartemp[32];sprintf(temp,"%c:%s",ma,ea.c_str());switch(W){case0x0:source=regIdAsString(SD);destination=temp;break;case0x1:source=temp;destination=regIdAsString(SD);break;}}voidassemble_arguments_from_W_table(uint16_tW,charma,conststd::string&SD,conststd::string&ea,std::string&source,std::string&destination){chartemp[32];sprintf(temp,"%c:%s",ma,ea.c_str());switch(W){case0x0:source=SD;destination=temp;break;case0x1:source=temp;destination=SD;break;}}voidassemble_reg_from_W_table(uint16_tW,charma,constreg_id&SD,constint8_txx,std::string&S,std::string&D){uint8_tabs_xx;chartemp[32];charoperation[32];if(xx<0)sprintf(operation,"-");elsesprintf(operation,"+");abs_xx=abs(xx);sprintf(temp,"%c:(R2%s$%x)",ma,operation,abs_xx);// NEW // sprintf(temp, "%c:(R2%s$%02x)", ma, operation, abs_xx);switch(W){case0x0:S=regIdAsString(SD);D=temp;break;case0x1:S=temp;D=regIdAsString(SD);break;}}voidassemble_address_from_IO_short_address(uint16_tpp,std::string&ea){chartemp[32];uint16_tfullAddy=0xffe0;fullAddy|=pp;sprintf(temp,"%.04x",fullAddy);ea=temp;}int8_tget_6_bit_signed_value(uint16_tbits){uint16_tfullAddy=bits;if(fullAddy&0x0020)fullAddy|=0xffc0;return(int8_t)fullAddy;}/********************//* HELPER FUNCTIONS *//********************/uint16_tdsp56156_op_maskn(uint16_tcur,uint16_tmask){inti;uint16_tretVal=(cur&mask);uint16_ttemp=0x0000;intoffsetCount=0;/* Shift everything right, eliminating 'whitespace'... */for(i=0;i<16;i++){if(mask&(0x1<<i))/* If mask bit is non-zero */{temp|=(((retVal>>i)&0x1)<<offsetCount);offsetCount++;}}returntemp;}boolregisterOverlap(constreg_id&r0,constsize_tbmd,constreg_id&r1){if(bmd==BM_NONE)returnfalse;if(r0==r1)returntrue;if(r0==iA&&(bmd&BM_LOW)&&r1==iA0)returntrue;if(r0==iA&&(bmd&BM_MIDDLE)&&r1==iA1)returntrue;if(r0==iA&&(bmd&BM_HIGH)&&r1==iA2)returntrue;if(r0==iB&&(bmd&BM_LOW)&&r1==iB0)returntrue;if(r0==iB&&(bmd&BM_MIDDLE)&&r1==iB1)returntrue;if(r0==iB&&(bmd&BM_HIGH)&&r1==iB2)returntrue;returnfalse;}uint16_tregValue16(dsp56156_core*cpustate,constreg_id®){if(reg==iX0)returnX0;if(reg==iX1)returnX1;if(reg==iY0)returnY0;if(reg==iY1)returnY1;if(reg==iA0)returnA0;if(reg==iA1)returnA1;if(reg==iB0)returnB0;if(reg==iB1)returnB1;if(reg==iR0)returnR0;if(reg==iR1)returnR1;if(reg==iR2)returnR2;if(reg==iR3)returnR3;if(reg==iN0)returnN0;if(reg==iN1)returnN1;if(reg==iN2)returnN2;if(reg==iN3)returnN3;if(reg==iM0)returnM0;if(reg==iM1)returnM1;if(reg==iM2)returnM2;if(reg==iM3)returnM3;osd_printf_debug("The dsp561xx core is requesting a 16 bit value from non-16 bit register!");return0xdead;}voidsetReg16(dsp56156_core*cpustate,constuint16_t&value,constreg_id®){if(reg==iX0)X0=value;if(reg==iX1)X1=value;if(reg==iY0)Y0=value;if(reg==iY1)Y1=value;if(reg==iA0)A0=value;if(reg==iA1)A1=value;if(reg==iB0)B0=value;if(reg==iB1)B1=value;if(reg==iR0)R0=value;if(reg==iR1)R1=value;if(reg==iR2)R2=value;if(reg==iR3)R3=value;if(reg==iN0)N0=value;if(reg==iN1)N1=value;if(reg==iN2)N2=value;if(reg==iN3)N3=value;if(reg==iM0)M0=value;if(reg==iM1)M1=value;if(reg==iM2)M2=value;if(reg==iM3)M3=value;}std::stringregIdAsString(constreg_id®Id){switch(regId){caseiX:return"X";caseiX0:return"X0";caseiX1:return"X1";caseiY:return"Y";caseiY0:return"Y0";caseiY1:return"Y1";caseiA:return"A";caseiA0:return"A0";caseiA1:return"A1";caseiA2:return"A2";caseiB:return"B";caseiB0:return"B0";caseiB1:return"B1";caseiB2:return"B2";caseiR0:return"R0";caseiR1:return"R1";caseiR2:return"R2";caseiR3:return"R3";caseiN0:return"N0";caseiN1:return"N1";caseiN2:return"N2";caseiN3:return"N3";caseiM0:return"M0";caseiM1:return"M1";caseiM2:return"M2";caseiM3:return"M3";caseiLC:return"LC";caseiSR:return"SR";caseiOMR:return"OMR";caseiSP:return"SP";caseiSSH:return"SSH";caseiSSL:return"SSL";caseiLA:return"LA";caseiMR:return"MR";caseiCCR:return"CCR";caseiF:return"F";caseiFHAT:return"^F";caseiINVALID:return"!!";caseiWEIRD:return"?";}return"INVALID_REG_ID";}std::stringopMnemonicAsString(constop_mnem&mnem){switch(mnem){caseoCC:return"cc";caseoGE:return"ge";caseoNE:return"ne";caseoPL:return"pl";caseoNN:return"nn";caseoEC:return"ec";caseoLC:return"lc";caseoGT:return"gt";caseoCS:return"cs";caseoLT:return"lt";caseoEQ:return"eq";caseoMI:return"mi";caseoNR:return"nr";caseoES:return"es";caseoLS:return"ls";caseoLE:return"le";caseoSS:return"ss";caseoSU:return"su";caseoUU:return"uu";caseoINVALID:return"!!";}return"INVALID_OPCODE_MNEMONIC";}reg_idstringAsRegID(conststd::string&str){if(str.compare("X")==0)returniX;if(str.compare("X0")==0)returniX0;if(str.compare("X1")==0)returniX1;if(str.compare("Y")==0)returniY;if(str.compare("Y0")==0)returniY0;if(str.compare("Y1")==0)returniY1;if(str.compare("A")==0)returniA;if(str.compare("A0")==0)returniA0;if(str.compare("A1")==0)returniA1;if(str.compare("A2")==0)returniA2;if(str.compare("B")==0)returniB;if(str.compare("B0")==0)returniB0;if(str.compare("B1")==0)returniB1;if(str.compare("B2")==0)returniB2;if(str.compare("R0")==0)returniR0;if(str.compare("R1")==0)returniR1;if(str.compare("R2")==0)returniR2;if(str.compare("R3")==0)returniR3;if(str.compare("N0")==0)returniN0;if(str.compare("N1")==0)returniN1;if(str.compare("N2")==0)returniN2;if(str.compare("N3")==0)returniN3;if(str.compare("M0")==0)returniM0;if(str.compare("M1")==0)returniM1;if(str.compare("M2")==0)returniM2;if(str.compare("M3")==0)returniM3;if(str.compare("LC")==0)returniLC;if(str.compare("SR")==0)returniSR;if(str.compare("OMR")==0)returniOMR;if(str.compare("SP")==0)returniSP;if(str.compare("SSH")==0)returniSSH;if(str.compare("SSL")==0)returniSSL;if(str.compare("LA")==0)returniLA;if(str.compare("MR")==0)returniMR;if(str.compare("CCR")==0)returniCCR;if(str.compare("F")==0)returniF;if(str.compare("^F")==0)returniFHAT;if(str.compare("!!")==0)returniINVALID;if(str.compare("?")==0)returniWEIRD;returniINVALID;}uint8_tregIDAsNum(constreg_id®Id){if(regId==iR0)return0;if(regId==iR1)return1;if(regId==iR2)return2;if(regId==iR3)return3;if(regId==iN0)return0;if(regId==iN1)return1;if(regId==iN2)return2;if(regId==iN3)return3;if(regId==iM0)return0;if(regId==iM1)return1;if(regId==iM2)return2;if(regId==iM3)return3;return255;}}