00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "global.h"
00041 #include "decoder.h"
00042 #include "BinaryFile.h"
00043
00044 #include "hppa-names.h"
00045
00046
00047 extern char _assembly;
00048 char aprefix;
00049 char adata;
00050 char* apre;
00051 char* astr;
00052 char *cmpltsep = ".";
00053
00054
00055 const char* GetSym(unsigned pc);
00056 const char* GetReloc(unsigned pc);
00057
00058
00059 #define ANAME apre += sprintf( apre, "%s", name );
00060
00061
00062
00063
00064
00065 #define CONS(x) strcat(constrName, x);
00066 #define IGNORE(x) not_used(*(int*)&x);
00067
00068
00069 void not_used(int unwanted)
00070 {
00071 unwanted = 0;
00072 }
00073
00074 DWord getDword (unsigned lc)
00075
00076
00077 {
00078 return
00079 (DWord)
00080 ((((((
00081 *(Byte *)lc << 8
00082 ) + *(Byte *)(lc+1)) << 8
00083 ) + *(Byte *)(lc+2)) << 8
00084 ) + *(Byte *)(lc+3));
00085 }
00086
00087 static char killBuffer;
00088
00089
00090 char* killDot(char* str)
00091 {
00092 strcpy(killBuffer, str);
00093 char* p = strchr(killBuffer, '.');
00094 if (p) *p = '\0';
00095 return killBuffer;
00096 }
00097
00098 static char shexBuffer;
00099
00100 char* signedHex(int disp)
00101 {
00102 if (disp < 0)
00103 sprintf(shexBuffer, "-0x%x", -disp);
00104 else
00105 sprintf(shexBuffer, "0x%x", disp);
00106 return shexBuffer;
00107 }
00108
00109
00110
00111 int dis_c_c_n(ADDRESS hostpc)
00112 {
00113 int result = 0;
00114 match hostpc to
00115 | c_c_nonneg() => { result = 0; }
00116 | c_c_neg() => { result = 8; }
00117 endmatch
00118 return result;
00119 }
00120
00121 void NJMCDecoder::dis_c_c(ADDRESS hostpc)
00122 {
00123 static char *logw = {"",",=",",<",",OD"
00124 ,",TR",",!=",",>=",",EV"};
00125
00126
00127 static char *cmpsubw = {"",",=",",<",",<=",",<<",",<<=",
00128 ",SV",",OD",
00129 ",TR",",<>",",>=",",>",",>>=",
00130 ",>>",",NSV",",EV"};
00131 static char *cmpsubdw = {"",",*=",",*<",",*<=",",*<<",",*<<=",
00132 ",*SV",",*OD",
00133 ",*TR",",*<>",",*>=",",*>",",*>>=",
00134 ",*>>",",*NSV",",*EV"};
00135
00136
00137
00138 match hostpc to
00139 | c_arith_w(c3_16, neg) => {
00140 apre += sprintf(apre, "%s", cmpsubw[c3_16 + dis_c_c_n(neg)]);
00141 CONS("c_arith_w ")
00142 }
00143 | c_arith_dw(c3_16, neg) => {
00144 apre += sprintf(apre, "%s", cmpsubdw[c3_16 + dis_c_c_n(neg)]);
00145 CONS("c_arith_dw ")
00146 }
00147 | c_cmpb_w(c3_16, neg) => {
00148 apre += sprintf(apre, "%s", cmpsubw[c3_16 + dis_c_c_n(neg)]);
00149 CONS("c_cmpb_w ")
00150 }
00151 | c_cmpb_dw(c3_16, neg) => {
00152 apre += sprintf(apre, "%s", cmpsubdw[c3_16 + dis_c_c_n(neg)]);
00153 CONS("c_cmpb_dw ")
00154 }
00155 | c_sep(c3_16) => {
00156 apre += sprintf(apre, "%s", logw[c3_16]);
00157 CONS("c_sep ")
00158 }
00159 | c_bbs_w(c_16) => {
00160 apre += sprintf(apre, "[%d]",1-c_16);
00161 CONS("c_bbs_w ")
00162 }
00163 | c_bbs_dw(c_16) => {
00164 apre += sprintf(apre, "[%d]",1-c_16);
00165 CONS("c_bbs_dw ")
00166 }
00167 | c_arith_none() => {
00168 }
00169 else {
00170 astr += sprintf(astr, "#c_C%08X", getDword(hostpc));
00171 }
00172 endmatch
00173 }
00174
00175 void NJMCDecoder::dis_c_xd(ADDRESS hostpc)
00176 {
00177
00178 match hostpc to
00179 | x_addr_nots(x) => {
00180 astr += sprintf(astr, "%s", x_11_names[x]);
00181 CONS("x_addr_nots ")
00182 }
00183 | x_addr_s_byte(x) => {
00184 apre += sprintf(apre, "%s", ",s");
00185 astr += sprintf(astr, "%s", x_11_names[x]);
00186 CONS("x_addr_s_byte ")
00187 }
00188 | x_addr_s_hwrd(x) => {
00189 apre += sprintf(apre, "%s", ",s");
00190 astr += sprintf(astr, "%s", x_11_names[x]);
00191 CONS("x_addr_s_hwrd ")
00192 }
00193 | x_addr_s_word(x) => {
00194 apre += sprintf(apre, "%s", ",s");
00195 astr += sprintf(astr, "%s", x_11_names[x]);
00196 CONS("x_addr_s_word ")
00197 }
00198 | x_addr_s_dwrd(x) => {
00199 apre += sprintf(apre, "%s", ",s");
00200 astr += sprintf(astr, "%s", x_11_names[x]);
00201 CONS("x_addr_s_dwrd ")
00202 }
00203 | s_addr_im_r(i) => {
00204 astr += sprintf(astr, "%d", i);
00205 CONS("s_addr_im_r ")
00206 }
00207 | s_addr_r_im(i) => {
00208 astr += sprintf(astr, "%d", i);
00209 CONS("s_addr_r_im ")
00210 }
00211 | l_addr_16_old(i) => {
00212 astr += sprintf(astr, "%d", i);
00213 CONS("l_addr_16_old ")
00214 }
00215 | l_addr_17_old(i) => {
00216 astr += sprintf(astr, "%d", i);
00217 CONS("l_addr_17_old ")
00218 }
00219 else {
00220 apre += sprintf(apre, "#c_X_ADDR_SHIFT%08X", getDword(hostpc));
00221 astr += sprintf(astr, "#c_X_ADDR_SHIFT%08X", getDword(hostpc));
00222 }
00223 endmatch
00224 }
00225
00226 void NJMCDecoder::dis_c_wcr(ADDRESS hostpc)
00227 {
00228 unsigned long regl;
00229 match hostpc to
00230 | c_mfctl(r_06) => {
00231 regl = r_06;
00232 CONS("c_mfctl ")
00233 }
00234 | c_mfctl_w() => {
00235 regl = 11;
00236 apre += sprintf(apre, ",w");
00237 CONS("c_mfctl_w ")
00238 }
00239 else {
00240 regl = 0;
00241 apre += sprintf(apre, "#c_WCR%08X#", getDword(hostpc));
00242 }
00243 endmatch
00244 astr += sprintf(astr, "%s", cr_06_names[regl]);
00245 }
00246
00247 void NJMCDecoder::dis_c_null(ADDRESS hostpc)
00248 {
00249 match hostpc to
00250 | c_br_nnull() => {
00251 CONS("c_br_nnull ")
00252 }
00253 | c_br_null() => {
00254 apre += sprintf(apre, ",n");
00255 CONS("c_br_null ")
00256 }
00257 else
00258 apre += sprintf(apre, "#c_NULL%08X#", getDword(hostpc));
00259 endmatch
00260 }
00261
00262 void NJMCDecoder::dis_c_bit(ADDRESS hostpc)
00263 {
00264 match hostpc to
00265 | c_bitpos_w(p_06) => {
00266 astr += sprintf(astr, "@%d",p_06);
00267 CONS("c_bitpos_w ")
00268 }
00269 | c_bitsar() => {
00270 astr += sprintf(astr, "%s", "%cr11");
00271 CONS("c_bitsar ")
00272 }
00273 else
00274 astr += sprintf(astr, "#c_BIT%08X#", getDword(hostpc));
00275 endmatch
00276 }
00277
00278 void NJMCDecoder::dis_c_addr(ADDRESS hostpc)
00279 {
00280 match hostpc to
00281 | c_s_addr_mb() => {
00282 apre += sprintf(apre, ",mb");
00283 CONS("c_s_addr_mb ")
00284 }
00285 | c_s_addr_ma() => {
00286 apre += sprintf(apre, ",ma");
00287 CONS("c_s_addr_ma ")
00288 }
00289 | c_s_addr_notm() => {
00290 CONS("c_s_addr_notm ")
00291 }
00292 | c_x_addr_m() => {
00293 apre += sprintf(apre, ",x");
00294 CONS("c_x_addr_m ")
00295 }
00296 | c_x_addr_notm() => {
00297 CONS("c_x_addr_notm ")
00298 }
00299 | c_y_addr_e() => {
00300 apre += sprintf(apre, ",e");
00301 CONS("c_y_addr_e ")
00302 }
00303 | c_y_addr_me() => {
00304 apre += sprintf(apre, ",me");
00305 CONS("c_y_addr_me ")
00306 }
00307 | c_y_addr_m() => {
00308 apre += sprintf(apre, ",m");
00309 CONS("c_y_addr_m ")
00310 }
00311 | c_y_addr_none() => {
00312 CONS("c_y_addr_none ")
00313 }
00314 | c_l_addr_none() => {
00315 CONS("c_l_addr_none ");
00316 }
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331 else
00332
00333 CONS("BUG!!");
00334 endmatch
00335 }
00336
00337 void NJMCDecoder::dis_flt_fmt(int fmt)
00338 {
00339
00340 switch(fmt) {
00341 case 0: apre += sprintf(apre, ",sgl"); break;
00342 case 1: apre += sprintf(apre, ",dbl"); break;
00343 case 3: apre += sprintf(apre, ",quad"); break;
00344 default:apre += sprintf(apre, ",?"); break;
00345 }
00346 }
00347
00348 static char regbuf;
00349 char* NJMCDecoder::dis_freg(int regNum)
00350 {
00351 if (regNum >= 32)
00352 sprintf(regbuf, "fr%dR", regNum - 32);
00353 else
00354 sprintf(regbuf, "fr%d", regNum);
00355 return regbuf;
00356 }
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374 int NJMCDecoder::decodeAssemblyInstruction (ADDRESS pc, int delta)
00375 {
00376 ADDRESS hostPC = pc + delta;
00377 *(apre = aprefix) = '\0';
00378 *(astr = adata) = '\0';
00379 apre += sprintf(apre, "%x: %08x ", pc, *(unsigned*)hostPC);
00380
00381 match hostPC to
00382 | NOP => {
00383 apre += sprintf(apre, "%s", "NOP");
00384 CONS("NOP ")
00385 }
00386 | COPY(r, t) => {
00387 apre += sprintf(apre, "%s", "COPY");
00388 astr += sprintf(astr, "%s,%s", r_06_names[r], t_27_names[t]);
00389 CONS("COPY ")
00390 }
00391 | arith(cmplt,r_11,r_06,t_27) => {
00392 ANAME
00393 dis_c_c(cmplt);
00394 astr += sprintf(astr, "%s,%s,%s", r_11_names[r_11],r_06_names[r_06],t_27_names[t_27]);
00395 CONS("arith ")
00396 }
00397 | arith_imm(cmplt, im11_21, r_06, t_11) => {
00398 ANAME
00399 dis_c_c(cmplt);
00400 astr += sprintf(astr, "%d,%s,%s", im11_21, r_06_names[r_06], t_11_names[t_11]);
00401 CONS("arith_imm ")
00402 }
00403 | ADDIL(imm21, r_06) => {
00404 ANAME
00405 astr += sprintf(astr, "%d,%s,%s", imm21, r_06_names[r_06], t_11_names[1]);
00406 CONS("ADDIL ")
00407 }
00408 | LDIL(imm21, t_06) => {
00409 ANAME
00410 astr += sprintf(astr, "0x%x,%s", imm21, t_06_names[t_06]);
00411 CONS("LDIL ")
00412 }
00413 | iloads(c_addr, xd, s, b,t_27) => {
00414 ANAME
00415 dis_c_addr(c_addr);
00416 dis_c_xd(xd);
00417 astr += sprintf(astr, "(%s,%s),%s",
00418 s2_16_names[s], b_06_names[b],
00419 t_27_names[t_27]);
00420 CONS("iloads ")
00421 }
00422 | istores(c_addr, r_11, xd, s, b) => {
00423 ANAME
00424 dis_c_addr(c_addr);
00425 astr += sprintf(astr, "%s,", r_11_names[r_11]);
00426 dis_c_xd(xd);
00427 astr += sprintf(astr, "(%s,%s)", s2_16_names[s], b_06_names[b]);
00428 CONS("istores ")
00429 }
00430 | iloads_ldisp(c_addr,xd, s, b,t_11) => {
00431 ANAME
00432 IGNORE(c_addr)
00433 dis_c_xd(xd);
00434 astr += sprintf(astr, "(%s,%s),%s",
00435 s2_16_names[s], b_06_names[b],
00436 t_11_names[t_11]);
00437 CONS("iloads_ldisp ")
00438 }
00439 | istores_ldisp(c_addr,r_11,xd, s, b)[name] => {
00440 ANAME
00441 astr += sprintf(astr, "%s,", r_11_names[r_11]);
00442 IGNORE(c_addr)
00443 dis_c_xd(xd);
00444 astr += sprintf(astr, "(%s,%s)",
00445 s2_16_names[s], b_06_names[b]);
00446 CONS("istores_ldisp ")
00447 }
00448 | LDO(ldisp, b, t)[name] => {
00449 ANAME
00450 astr += sprintf(astr, "%d(%s),%s", ldisp, b_06_names[b], t_06_names[t]);
00451 CONS("LDO ")
00452 }
00453 | VSHD(r1, r2, t, c) => {
00454 ANAME
00455 dis_c_c(c);
00456 astr += sprintf(astr, "%s,%s,%s", r_11_names[r1], r_06_names[r2],
00457 t_27_names[t]);
00458 CONS("VSHD ")
00459 }
00460 | SHD(r1, r2, p, t, c) => {
00461 ANAME
00462 dis_c_c(c);
00463 astr += sprintf(astr, "%s,%s,%d,%s", r_11_names[r1], r_06_names[r2],
00464 p, t_27_names[t]);
00465 CONS("SHD ")
00466 }
00467 | ext_var(r, len, t, c) => {
00468 ANAME
00469 dis_c_c(c);
00470 astr += sprintf(astr, "%s,%d,%s", r_11_names[r], len,
00471 t_27_names[t]);
00472 CONS("ext_var ")
00473 }
00474 | ext_fix(r, p, len, t, c) => {
00475 ANAME
00476 dis_c_c(c);
00477 astr += sprintf(astr, "%s,%d,%d,%s", r_11_names[r], p, len,
00478 t_27_names[t]);
00479 CONS("ext_fix ")
00480 }
00481 | dep_var(r, len, t, c) => {
00482 ANAME
00483 dis_c_c(c);
00484 astr += sprintf(astr, "%s,%d,%s", r_11_names[r], len,
00485 t_27_names[t]);
00486 CONS("dep_var ")
00487 }
00488 | dep_fix(r, p, len, t, c) => {
00489 ANAME
00490 dis_c_c(c);
00491 astr += sprintf(astr, "%s,%d,%d,%s", r_11_names[r], p, len,
00492 t_27_names[t]);
00493 CONS("dep_fix ")
00494 }
00495 | dep_ivar(i, len, t, c) => {
00496 ANAME
00497 dis_c_c(c);
00498 astr += sprintf(astr, "%d,%d,%s", i, len,
00499 t_27_names[t]);
00500 CONS("dep_ivar ")
00501 }
00502 | dep_ifix(i, p, len, t, c) => {
00503 ANAME
00504 dis_c_c(c);
00505 astr += sprintf(astr, "%d,%d,%d,%s", i, p, len,
00506 t_27_names[t]);
00507 CONS("dep_ifix ")
00508 }
00509 | ubranch(nulli,ubr_target,t_06) => {
00510 ANAME
00511 dis_c_null(nulli);
00512
00513 ADDRESS dest = ubr_target + hostPC - delta;
00514 const char* dsym = pBF->SymbolByAddress(dest);
00515 char hexsym;
00516 if (dsym == 0) sprintf(hexsym, "0x%x", dest);
00517 astr += sprintf(astr, "%s, %s", (dsym ? dsym : hexsym), t_06_names[t_06]);
00518 CONS("ubranch ")
00519 }
00520 | BL.LONG(nulli,ubr_target) => {
00521 ANAME
00522 dis_c_null(nulli);
00523 astr += sprintf(astr, "%d %s", ubr_target, t_06_names[2]);
00524 CONS("BL.LONG ")
00525 }
00526 | BLR(nulli,x_11,t_06) => {
00527 ANAME
00528 dis_c_null(nulli);
00529 astr += sprintf(astr, "%s,%s", x_11_names[x_11], t_06_names[t_06]);
00530 CONS("BLR ")
00531 }
00532 | BV(nulli,x_11,b_06) => {
00533 ANAME
00534 dis_c_null(nulli);
00535 astr += sprintf(astr, "%s(%s)", x_11_names[x_11], b_06_names[b_06]);
00536 CONS("BV ")
00537 }
00538 | bve(p_31,nulli,b_06) => {
00539 ANAME
00540 not_used(p_31);
00541 IGNORE(nulli)
00542 astr += sprintf(astr, " (%s)", b_06_names[b_06]);
00543 CONS("bve ")
00544
00545
00546
00547
00548
00549
00550
00551 }
00552 | BREAK(im5_27,im13_06)[name] => {
00553 ANAME
00554 astr += sprintf(astr, "%d,%d", im5_27,im13_06);
00555 CONS("BREAK ")
00556 }
00557 | sysop_i_t(im10_06,t_27) => {
00558 ANAME
00559 astr += sprintf(astr, "%d,%s", im10_06,t_27_names[t_27]);
00560 CONS("sysop_i_t ");
00561 }
00562 | sysop_simple => {
00563 ANAME
00564 CONS("sysop_simple ");
00565 }
00566 | sysop_r(r_11) => {
00567 ANAME
00568 astr += sprintf(astr, "%s", r_11_names[r_11]);
00569 CONS("sysop_r ")
00570 }
00571 | sysop_cr_t(cmplt, t_27) => {
00572 ANAME
00573 dis_c_wcr(cmplt);
00574 astr += sprintf(astr, ",%s", t_27_names[t_27]);
00575 CONS("sysop_cr_t ")
00576 }
00577 | MTCTL(r_11, cr_06) => {
00578 ANAME
00579 astr += sprintf(astr, "%s,%s", r_11_names[r_11],cr_06_names[cr_06]);
00580 CONS("MTCTL ")
00581 }
00582 | MFIA(t_27) => {
00583 ANAME
00584 astr += sprintf(astr, "%s", t_27_names[t_27]);
00585 CONS("MFIA ")
00586 }
00587 | LDSID(s2_16,b_06,t_27) => {
00588 ANAME
00589 astr += sprintf(astr, "(%s,%s),%s", s2_16_names[s2_16],
00590 b_06_names[b_06], t_27_names[t_27]);
00591 CONS("LDSID ")
00592 }
00593 | MTSP(r_11,sr) => {
00594 ANAME
00595 astr += sprintf(astr, "%s,%s", r_11_names[r_11],
00596 s3_16_names[sr]);
00597 CONS("MTSP ")
00598 }
00599 | MFSP(sr,t_27) => {
00600 ANAME
00601 astr += sprintf(astr, "%s,%s", s3_16_names[sr],
00602 t_27_names[t_27]);
00603 CONS("MFSP ")
00604 }
00605 | addb_all(c_cmplt, null_cmplt, r_11, r_06, target) => {
00606 ANAME
00607 dis_c_c(c_cmplt);
00608 dis_c_null(null_cmplt);
00609 astr += sprintf(astr, "%s,%s,0x%x", r_11_names[r_11],
00610 r_06_names[r_06], target + pc + 8);
00611 CONS("addb_all ")
00612 }
00613 | addib_all(c_cmplt, null_cmplt, im5, r_06, target) => {
00614 ANAME
00615 dis_c_c(c_cmplt);
00616 dis_c_null(null_cmplt);
00617 astr += sprintf(astr, "%d,%s,0x%x", im5,
00618 r_06_names[r_06], target + pc + 8);
00619 CONS("addb_all ")
00620 }
00621 | cmpb_all(c_cmplt, null_cmplt, r_11, r_06, target) => {
00622 ANAME
00623 dis_c_c(c_cmplt);
00624 dis_c_null(null_cmplt);
00625 astr += sprintf(astr, "%s,%s,0x%x", r_11_names[r_11],
00626 r_06_names[r_06], target + pc + 8);
00627 CONS("cmpb_all ")
00628 }
00629 | cmpib_all(c_cmplt, null_cmplt, im5_11, r_06, target) => {
00630 ANAME
00631 dis_c_c(c_cmplt);
00632 dis_c_null(null_cmplt);
00633 astr += sprintf(astr, "%d,%s,0x%x", im5_11, r_06_names[r_06],
00634 target + pc + 8);
00635 CONS("cmpib_all ")
00636 }
00637 | bb_all(c_cmplt, null_cmplt, r_11, bit_cmplt, target) => {
00638 apre += sprintf(apre, "%s", "BB");
00639 dis_c_c(c_cmplt);
00640 dis_c_null(null_cmplt);
00641 astr += sprintf(astr, "%s,", r_11_names[r_11]);
00642 dis_c_bit(bit_cmplt);
00643 sprintf(astr, ",%x", target + pc + 8);
00644 CONS("bb_all ")
00645 }
00646 | flt_c0_all(fmt, r, t) => {
00647 apre += sprintf(apre, "%s", killDot(name));
00648 dis_flt_fmt(fmt);
00649 astr += sprintf(astr, "%s, ", dis_freg(r));
00650 astr += sprintf(astr, "%s", dis_freg(t));
00651 CONS("flt_c0_all ")
00652 }
00653 | flt_c1_all(sf, df, r, t) => {
00654 apre += sprintf(apre, "%s", killDot(name));
00655 dis_flt_fmt(sf);
00656 dis_flt_fmt(df);
00657 astr += sprintf(astr, "%s, ", dis_freg(r));
00658 astr += sprintf(astr, "%s", dis_freg(t));
00659 CONS("flt_c1_all ")
00660 }
00661 | flt_c2_all(fmt, c, r1, r2) => {
00662 apre += sprintf(apre, "%s", killDot(name));
00663 dis_flt_fmt(fmt);
00664 astr += sprintf(astr, "%s, ", dis_freg(r1));
00665 astr += sprintf(astr, "%s", dis_freg(r2));
00666
00667 astr += sprintf(astr, "\t");
00668 IGNORE(c)
00669 CONS("flt_c2_all ")
00670 }
00671 | flt_c3_all(fmt, r1, r2, t)[name] => {
00672 apre += sprintf(apre, "%s", killDot(name));
00673 dis_flt_fmt(fmt);
00674 astr += sprintf(astr, "%s, ", dis_freg(r1));
00675 astr += sprintf(astr, "%s, ", dis_freg(r2));
00676 astr += sprintf(astr, "%s", dis_freg(t));
00677 CONS("flt_c3_all ")
00678 }
00679 | XMPYU(r1, r2, t) => {
00680 apre += sprintf(apre, "XMPYU");
00681 astr += sprintf(astr, "%s, ", dis_freg(r1));
00682 astr += sprintf(astr, "%s, ", dis_freg(r2));
00683 astr += sprintf(astr, "%s", dis_freg(t));
00684 CONS("FMPYU ");
00685 }
00686
00687
00688 | fwloads(c_addr, xd, s, b, t_27) => {
00689 apre += sprintf(apre, "%s",killDot(name));
00690
00691 dis_c_addr(c_addr);
00692 dis_c_xd(xd);
00693 astr += sprintf(astr, "(%s,%s),%s",
00694 s2_16_names[s], b_06_names[b],
00695 dis_freg(t_27));
00696 CONS("fwloads ")
00697 }
00698 | fwstores(c_addr, r, xd, s, b) => {
00699 apre += sprintf(apre, "%s",killDot(name));
00700
00701 dis_c_addr(c_addr);
00702 astr += sprintf(astr, "%s,", dis_freg(r));
00703 dis_c_xd(xd);
00704 astr += sprintf(astr, "(%s,%s)",
00705 s2_16_names[s], b_06_names[b]);
00706 CONS("fwstores ")
00707 }
00708 | fdloads(c_addr, xd, s, b, t_27) => {
00709 apre += sprintf(apre, "%s",killDot(name));
00710
00711 dis_c_addr(c_addr);
00712 dis_c_xd(xd);
00713 astr += sprintf(astr, "(%s,%s),%s",
00714 s2_16_names[s], b_06_names[b],
00715 dis_freg(t_27));
00716 CONS("fdloads ")
00717 }
00718 | fdstores(c_addr, r, xd, s, b) => {
00719 apre += sprintf(apre, "%s", killDot(name));
00720
00721 dis_c_addr(c_addr);
00722 astr += sprintf(astr, "%s,", dis_freg(r));
00723 dis_c_xd(xd);
00724 astr += sprintf(astr, "(%s,%s)",
00725 s2_16_names[s], b_06_names[b]);
00726 CONS("fdstores ")
00727 }
00728
00729 else
00730 apre += sprintf(apre, "unrecog. %02X %08X",
00731 (getDword(hostPC) >> 26) & 0x3F, getDword(hostPC) & 0x03FFFFFF);
00732 endmatch
00733
00734
00735 sprintf(_assembly, "%s%*s%s", aprefix, 28-strlen(aprefix), " ", adata);
00736 return 4;
00737
00738 }
00739
00740
00741
00742
00743
00744
00745
00746
00747