//---------------------------------------------------------------------- // вывод одного операнда bool idaapi mn102_outop(op_t &x) { switch ( x.type ){ // ссылка на память с использованием регистра (регистров) // (disp,Ri) case o_displ: // открывающая скобка есть всегда // регистр пристуствует? out_symbol('('); OutValue(x); out_symbol(','); out_register(ph.regNames[x.reg]); out_symbol(')'); break; // регистр case o_reg: if ( x.reg&0x80)out_symbol('(' ); if ( x.reg&0x10 ){ out_register(ph.regNames[((x.reg>>5)&3)+rD0]); out_symbol(','); } out_register(ph.regNames[x.reg&0x0F]); if ( x.reg&0x80)out_symbol(')' ); break; // непосредственные данные case o_imm: #if IDP_INTERFACE_VERSION > 37 refinfo_t ri; // micro bug-fix if ( get_refinfo(cmd.ea, x.n, &ri) ){ if ( ri.flags==REF_OFF16 ) set_refinfo(cmd.ea, x.n, REF_OFF32, ri.target, ri.base, ri.tdelta); } #endif OutValue(x, /*OOFS_NOSIGN | */ OOF_SIGNED | OOFW_IMM); break; // ссылка на программу case o_near: OutVarName(x); break; // прямая ссылка на память case o_mem: out_symbol('('); OutVarName(x); out_symbol(')'); break; // пустыка не выводится case o_void: return 0; // неизвестный операнд default: warning("out: %a: bad optype %d",cmd.ea,x.type); break; }
//---------------------------------------------------------------------- // вывод одного операнда bool idaapi C39_outop(op_t &x) { switch ( x.type ){ // только регистр case o_reg: out_register(ph.regNames[x.reg]); break; // непосредственные данные (8 бит) case o_imm: out_symbol('#'); #if IDP_INTERFACE_VERSION > 37 refinfo_t ri; // micro bug-fix if(get_refinfo(cmd.ea, x.n, &ri)){ if(ri.flags==REF_OFF16) set_refinfo(cmd.ea, x.n, REF_OFF32, ri.target, ri.base, ri.tdelta); msg("Exec OFF16_Op Fix AT:%a Flags=%lx, Target=%lx, Base=%lx, Delta=%lx\n", cmd.ea, ri.flags,ri.target,ri.base,ri.tdelta); } #endif OutValue(x, /*OOFS_NOSIGN | */ OOF_SIGNED | OOFW_IMM); break; // прямая ссылка на программу (реально - относительно PC) case o_near: OutVarName(x); break; // обращение к ячейке памяти case o_mem: if(x.specflag1&URR_IND) out_symbol('('); OutValue(x, OOFS_NOSIGN | OOFW_IMM); if(x.specflag1&URR_IND) out_symbol(')'); break; // пустыка не выводится case o_void: return 0; // неизвестный операнд default: warning("out: %lx: bad optype",cmd.ea,x.type); break; } return 1; }
//---------------------------------------------------------------------- bool outop(op_t &x) { switch(x.type) { case o_void: return 0; case o_reg: if(x.prepost) out_symbol('['); //Вывод регистра по номеру в регистре OutReg(x.reg); if(x.xmode) { out_symbol('+'); OutValue(x, OOF_ADDR | OOF_NUMBER | OOFW_8); } if(x.prepost) out_symbol(']'); break; case o_phrase: OutLine(ph.regNames[x.reg]); break; case o_bit: { switch(x.reg) { case rPSW: { OutLine("PSW."); switch(x.value) { case 0: OutLine("CY");break; case 4: OutLine("AC");break; case 6: OutLine("Z");break; case 7: OutLine("IE");break; default:OutValue(x, OOFW_IMM); } break; } case rA: { OutLine( "A." ); OutChar(char('0'+x.value)); } break; default: { if(!OutVarName(x, 1, 0) ) OutValue(x, OOF_ADDR | OOFW_16); out_symbol('.'); //Ичем название бита по указанному адрессу if(!nec_find_ioport_bit((int)x.addr, (int)x.value)) { //Вывод данных(тип o_imm) OutChar(char('0'+x.value)); } }// switch(x.regmode) } // end switch(x.reg) } break; case o_imm: { if(!x.regmode) { out_symbol('#'); //Вывод данных(тип o_imm) OutValue(x, OOFW_IMM ); } else { out_symbol('1'); } } break; case o_mem: { if(x.addr16) out_symbol('!'); //выводит имя переменной из памяти(например byte_98) //Вывод имени переменной if(!OutVarName(x, 1, 0) ) //Вывод данных OutValue(x, OOF_ADDR | OOFW_16); } break; case o_near: { if(x.addr16) out_symbol('!'); if(x.form) out_symbol('['); //Получить линейный адресс ea_t v = toEA(cmd.cs,x.addr); if(!out_name_expr(x, v, x.addr)) { //Вывести значение OutValue(x, OOF_ADDR | OOF_NUMBER | OOFW_16); QueueMark(Q_noName, cmd.ea); } if(x.form) out_symbol(']'); } break; default: warning("out: %a: bad optype %d", cmd.ip, x.type); break; } return(1); }
//---------------------------------------------------------------------- // вывод одного операнда bool N78K_outop(op_t &x) { #if IDP_INTERFACE_VERSION <= 37 uFlag = getFlags(cmd.ea); #endif switch(x.type){ case o_void: return 0; case o_reg: if(x.FormOut & FORM_OUT_SKOBA) out_symbol('['); OutReg(x.reg); if(x.FormOut & FORM_OUT_PLUS) out_symbol('+'); if(x.FormOut & FORM_OUT_DISP){ if(isOff(uFlag, x.n)){ OutVarNameVal(x); } else OutValue(x, OOFW_IMM ); } if(x.FormOut & FORM_OUT_REG){ out_keyword( ph.regNames[x.SecondReg] ); } if(x.FormOut & FORM_OUT_SKOBA) out_symbol(']'); break; case o_bit: switch(x.FormOut){ case FORM_OUT_S_ADDR: case FORM_OUT_SFR: OutVarName(x); out_symbol('.'); #if IDP_INTERFACE_VERSION > 37 if( !nec_find_ioport_bit(x.addr, x.value) ) #endif { OutValue(x, OOFW_IMM); } break; case FORM_OUT_A: OutLine("A."); OutValue(x, OOFW_IMM); break; case FORM_OUT_PSW: OutLine("PSW."); switch(x.value){ case 0: OutLine("CY");break; case 1: OutLine("ISP");break; case 3: OutLine("RBS0");break; case 4: OutLine("AC");break; case 5: OutLine("RBS1");break; case 6: OutLine("Z");break; case 7: OutLine("IE");break; default:OutValue(x, OOFW_IMM); } break; case FORM_OUT_HL: out_symbol('['); OutReg(rHL); out_symbol(']'); out_symbol('.'); if(isOff(uFlag, x.n)){ OutVarNameVal(x); } else OutValue(x, OOFW_IMM ); break; } break; case o_imm: out_symbol('#'); if(isOff(uFlag, x.n)){ OutVarNameVal(x); } else OutValue(x, OOFW_IMM ); break; case o_mem: //выводит имя переменной из памяти(например byte_98) if(x.FormOut & FORM_OUT_VSK) out_symbol('!'); if(x.FormOut & FORM_OUT_SKOBA) out_symbol('['); //Вывод имени переменной OutVarName(x); if(x.FormOut & FORM_OUT_SKOBA) out_symbol(']'); break; case o_near: if(x.FormOut & FORM_OUT_VSK) out_symbol('!'); if(x.FormOut & FORM_OUT_SKOBA) out_symbol('['); { ulong adr; adr = toEA(codeSeg(x.addr,x.n),x.addr); #if IDP_INTERFACE_VERSION > 37 if( !out_name_expr(x, adr, x.addr)){ OutValue(x, OOF_ADDR | OOF_NUMBER | OOFW_16); QueueMark(Q_noName, cmd.ea); } #else {const char *ptr; ptr=get_name_expr(cmd.ea+x.offb, adr, x.addr); if( ptr == NULL ){ OutValue(x, OOF_ADDR | OOF_NUMBER | OOFW_16); QueueMark(Q_noName, cmd.ea); } else OutLine(ptr); } #endif } if(x.FormOut & FORM_OUT_SKOBA) out_symbol(']'); break; // неизвестный операнд default: warning("out: %lx: bad optype",cmd.ea,x.type); break; } return(1); }