--- np2/generic/unasm.c 2004/02/18 02:03:36 1.1 +++ np2/generic/unasm.c 2007/01/08 08:52:21 1.6 @@ -68,10 +68,10 @@ static char *set_hex(char *str, UINT32 v // ---- -UINT unasm(UNASM r, const BYTE *ptr, UINT leng, BOOL d, UINT32 addr) { +UINT unasm(UNASM r, const UINT8 *ptr, UINT leng, BOOL d, UINT32 addr) { -const BYTE *org; -const BYTE *term; +const UINT8 *org; +const UINT8 *term; UINT flag; REG8 ope; UINT32 ctl; @@ -360,7 +360,7 @@ opeana_ea: if (ptr > term) { return(0); } - p = set_hex(p, LOADINTELWORD(ptr - 4), 16); + p = set_hex(p, LOADINTELDWORD(ptr - 4), 32); } *p++ = ']'; break; @@ -392,14 +392,15 @@ opeana_ea: f = (flag >> UAFLAG_REP) & UAFLAG_REPMASK; if (f) { p = set_str(p, rstr.ope[mnemonic]); - mnemonic = RSTR_REP; + mnemonic = RSTR_REP + (f - 1); } f = (flag >> UAFLAG_SOR) & UAFLAG_SOMASK; if (f) { - p[0] = rstr.reg[RSTR_SEG][f - 1][0]; + p[0] = ' '; + p[1] = rstr.reg[RSTR_SEG][f - 1][0]; p[1] = rstr.reg[RSTR_SEG][f - 1][1]; - p[2] = ':'; - p += 3; + p[3] = ':'; + p += 4; } break; @@ -411,7 +412,7 @@ opeana_ea: return(0); } addr += (SINT32)(SINT8)(*ptr++); - addr += (ptr - org); + addr += (int)(ptr - org); p = set_hex(p, addr, (flag & (1 << UAFLAG_D))?32:16); break; @@ -422,7 +423,7 @@ opeana_ea: return(0); } addr += LOADINTELWORD(ptr - 2); - addr += (ptr - org); + addr += (int)(ptr - org); p = set_hex(p, addr, 16); } else { @@ -430,20 +431,31 @@ opeana_ea: if (ptr > term) { return(0); } - addr += LOADINTELWORD(ptr - 4); - addr += (ptr - org); + addr += LOADINTELDWORD(ptr - 4); + addr += (int)(ptr - org); p = set_hex(p, addr, 32); } break; case OP1_FAR: - ptr += 4; - if (ptr > term) { - return(0); + if (!(flag & (1 << UAFLAG_D))) { + ptr += 4; + if (ptr > term) { + return(0); + } + p = set_hex(p, LOADINTELWORD(ptr - 2), 16); + *p++ = ':'; + p = set_hex(p, LOADINTELWORD(ptr - 4), 16); + } + else { + ptr += 6; + if (ptr > term) { + return(0); + } + p = set_hex(p, LOADINTELWORD(ptr - 2), 16); + *p++ = ':'; + p = set_hex(p, LOADINTELDWORD(ptr - 6), 32); } - p = set_hex(p, LOADINTELWORD(ptr - 2), 16); - *p++ = ':'; - p = set_hex(p, LOADINTELWORD(ptr - 4), 16); break; case OP1_I10: @@ -475,7 +487,7 @@ opeana_ea: goto opeana_ea; case OP1_REx: - p = set_reg(p, RSTR_32 + (ope & 7)); + p = set_reg(p, (RSTR_32 << 3) + (ope & 7)); p[0] = ','; p[1] = ' '; p[2] = (char)mnemonic; @@ -492,7 +504,7 @@ opeana_ea: p[3] = ','; p[4] = ' '; p += 5; - p = set_reg(p, RSTR_32 + (ope & 7)); + p = set_reg(p, (RSTR_32 << 3) + (ope & 7)); mnemonic = RSTR_MOV; break; @@ -572,6 +584,6 @@ opeana_ea: opeana_ed: r->mnemonic = rstr.ope[mnemonic]; p[0] = '\0'; - return(ptr - org); + return((UINT)(ptr - org)); }