| 3477 | } |
| 3478 | |
| 3479 | void decodeEa32(DecodeData* data, DecodedOp* op, U8 rm) { |
| 3480 | op->rm=regZero; |
| 3481 | op->sibIndex=regZero; |
| 3482 | op->sibScale = 0; |
| 3483 | if (rm<0x40) { |
| 3484 | switch (rm & 7) { |
| 3485 | case 0x00: op->base=data->ds; op->rm = regAX; break; |
| 3486 | case 0x01: op->base=data->ds; op->rm = regCX; break; |
| 3487 | case 0x02: op->base=data->ds; op->rm = regDX; break; |
| 3488 | case 0x03: op->base=data->ds; op->rm = regBX; break; |
| 3489 | case 0x04: Sib0(data, op); break; |
| 3490 | case 0x05: op->base=data->ds; op->rm = regZero; op->data.disp = data->fetch32(); break; |
| 3491 | case 0x06: op->base=data->ds; op->rm = regSI; break; |
| 3492 | case 0x07: op->base=data->ds; op->rm = regDI; break; |
| 3493 | } |
| 3494 | } else { |
| 3495 | switch (rm & 7) { |
| 3496 | case 0x00: op->base=data->ds; op->rm = regAX; break; |
| 3497 | case 0x01: op->base=data->ds; op->rm = regCX; break; |
| 3498 | case 0x02: op->base=data->ds; op->rm = regDX; break; |
| 3499 | case 0x03: op->base=data->ds; op->rm = regBX; break; |
| 3500 | case 0x04: Sib1(data, op); break; |
| 3501 | case 0x05: op->base=data->ss; op->rm = regBP; break; |
| 3502 | case 0x06: op->base=data->ds; op->rm = regSI; break; |
| 3503 | case 0x07: op->base=data->ds; op->rm = regDI; break; |
| 3504 | } |
| 3505 | if (rm<0x80) { |
| 3506 | op->data.disp = (S8)data->fetch8(); |
| 3507 | } else { |
| 3508 | op->data.disp = data->fetch32(); |
| 3509 | } |
| 3510 | } |
| 3511 | } |
| 3512 | |
| 3513 | void decodeEa(DecodeData* data, DecodedOp* op, U8 rm) { |
| 3514 | if (data->ea16) |