trunk/src/emu/cpu/i386/i386op16.c
| r21490 | r21491 | |
| 2955 | 2955 | UINT16 address, selector; |
| 2956 | 2956 | if( modrm >= 0xc0 ) |
| 2957 | 2957 | { |
| 2958 | | fatalerror("i386: groupFF_16 /%d NYI\n", (modrm >> 3) & 0x7); |
| 2958 | report_invalid_modrm(cpustate, "groupFF_16", modrm); |
| 2959 | 2959 | } |
| 2960 | 2960 | else |
| 2961 | 2961 | { |
| r21490 | r21491 | |
| 3002 | 3002 | |
| 3003 | 3003 | if( modrm >= 0xc0 ) |
| 3004 | 3004 | { |
| 3005 | | fatalerror("i386: groupFF_16 /%d NYI\n", (modrm >> 3) & 0x7); |
| 3005 | report_invalid_modrm(cpustate, "groupFF_16", modrm); |
| 3006 | 3006 | } |
| 3007 | 3007 | else |
| 3008 | 3008 | { |
| r21490 | r21491 | |
| 3038 | 3038 | CYCLES(cpustate,CYCLES_PUSH_RM); |
| 3039 | 3039 | } |
| 3040 | 3040 | break; |
| 3041 | | case 7: |
| 3042 | | I386OP(invalid)(cpustate); |
| 3043 | | break; |
| 3044 | 3041 | default: |
| 3045 | | fatalerror("i386: groupFF_16 /%d unimplemented\n", (modrm >> 3) & 0x7); |
| 3042 | report_invalid_modrm(cpustate, "groupFF_16", modrm); |
| 3046 | 3043 | break; |
| 3047 | 3044 | } |
| 3048 | 3045 | } |
| r21490 | r21491 | |
| 3236 | 3233 | break; |
| 3237 | 3234 | |
| 3238 | 3235 | default: |
| 3239 | | fatalerror("i386: group0F00_16 /%d unimplemented\n", (modrm >> 3) & 0x7); |
| 3236 | report_invalid_modrm(cpustate, "group0F00_16", modrm); |
| 3240 | 3237 | break; |
| 3241 | 3238 | } |
| 3242 | 3239 | } |
| r21490 | r21491 | |
| 3340 | 3337 | break; |
| 3341 | 3338 | } |
| 3342 | 3339 | default: |
| 3343 | | fatalerror("i386: unimplemented opcode 0x0f 01 /%d at %08X\n", (modrm >> 3) & 0x7, cpustate->eip - 2); |
| 3340 | report_invalid_modrm(cpustate, "group0F01_16", modrm); |
| 3344 | 3341 | break; |
| 3345 | 3342 | } |
| 3346 | 3343 | } |
| r21490 | r21491 | |
| 3460 | 3457 | } |
| 3461 | 3458 | break; |
| 3462 | 3459 | default: |
| 3463 | | fatalerror("i386: group0FBA_16 /%d unknown\n", (modrm >> 3) & 0x7); |
| 3460 | report_invalid_modrm(cpustate, "group0FBA_16", modrm); |
| 3464 | 3461 | break; |
| 3465 | 3462 | } |
| 3466 | 3463 | } |
trunk/src/emu/cpu/i386/i386ops.h
| r21490 | r21491 | |
| 354 | 354 | { 0xA5, OP_2BYTE|OP_I386, I386OP(shld16_cl), I386OP(shld32_cl), }, |
| 355 | 355 | { 0xA8, OP_2BYTE|OP_I386, I386OP(push_gs16), I386OP(push_gs32), }, |
| 356 | 356 | { 0xA9, OP_2BYTE|OP_I386, I386OP(pop_gs16), I386OP(pop_gs32), }, |
| 357 | | { 0xAA, OP_2BYTE|OP_I386, I386OP(unimplemented), I386OP(unimplemented), }, |
| 357 | { 0xAA, OP_2BYTE|OP_I386, I386OP(rsm), I386OP(rsm), }, |
| 358 | 358 | { 0xAB, OP_2BYTE|OP_I386, I386OP(bts_rm16_r16), I386OP(bts_rm32_r32), }, |
| 359 | 359 | { 0xAC, OP_2BYTE|OP_I386, I386OP(shrd16_i8), I386OP(shrd32_i8), }, |
| 360 | 360 | { 0xAD, OP_2BYTE|OP_I386, I386OP(shrd16_cl), I386OP(shrd32_cl), }, |
trunk/src/emu/cpu/i386/pentops.c
| r21490 | r21491 | |
| 75 | 75 | { |
| 76 | 76 | UINT8 modm = FETCH(cpustate); |
| 77 | 77 | if( modm >= 0xc0 ) { |
| 78 | | fatalerror("pentium: cmpxchg8b_m64 - invalid modm\n"); |
| 78 | report_invalid_modrm(cpustate, "cmpxchg8b_m64", modm); |
| 79 | 79 | } else { |
| 80 | 80 | UINT32 ea = GetEA(cpustate, modm, 0); |
| 81 | 81 | UINT64 value = READ64(cpustate,ea); |
| r21490 | r21491 | |
| 132 | 132 | GetNonTranslatedEA(cpustate, modm, NULL); |
| 133 | 133 | break; |
| 134 | 134 | default: |
| 135 | | fatalerror("pentium: bad/unsupported 0f ae opcode\n"); |
| 135 | report_invalid_modrm(cpustate, "sse_group0fae", modm); |
| 136 | 136 | } |
| 137 | 137 | } else { |
| 138 | | fatalerror("pentium: bad/unsupported 0f ae opcode\n"); |
| 138 | report_invalid_modrm(cpustate, "sse_group0fae", modm); |
| 139 | 139 | } |
| 140 | 140 | } |
| 141 | 141 | |
trunk/src/emu/cpu/i386/i386.c
| r21490 | r21491 | |
| 2715 | 2715 | #endif |
| 2716 | 2716 | } |
| 2717 | 2717 | |
| 2718 | | static void report_unimplemented_opcode(i386_state *cpustate) |
| 2718 | static void report_invalid_modrm(i386_state *cpustate, const char* opcode, UINT8 modrm) |
| 2719 | 2719 | { |
| 2720 | 2720 | #ifndef DEBUG_MISSING_OPCODE |
| 2721 | | fatalerror("i386: Unimplemented opcode %02X at %08X\n", cpustate->opcode, cpustate->pc - 1 ); |
| 2721 | logerror("i386: Invalid %s modrm %01X at %08X\n", opcode, modrm, cpustate->pc - 2); |
| 2722 | 2722 | #else |
| 2723 | | astring errmsg; |
| 2724 | | errmsg.cat("i386: Unimplemented opcode "); |
| 2723 | logerror("i386: Invalid %s modrm %01X", opcode, modrm); |
| 2725 | 2724 | for (int a = 0; a < cpustate->opcode_bytes_length; a++) |
| 2726 | | errmsg.catprintf(" %02X", cpustate->opcode_bytes[a]); |
| 2727 | | errmsg.catprintf(" at %08X", cpustate->opcode_pc ); |
| 2725 | logerror(" %02X", cpustate->opcode_bytes[a]); |
| 2726 | logerror(" at %08X\n", cpustate->opcode_pc); |
| 2728 | 2727 | #endif |
| 2728 | i386_trap(cpustate, 6, 0, 0); |
| 2729 | 2729 | } |
| 2730 | 2730 | |
| 2731 | 2731 | /* Forward declarations */ |
trunk/src/emu/cpu/i386/i386ops.c
| r21490 | r21491 | |
| 703 | 703 | break; |
| 704 | 704 | case 4: CYCLES(cpustate,1); break; // TODO |
| 705 | 705 | default: |
| 706 | | fatalerror("i386: mov_cr_r32 CR%d!\n", cr); |
| 707 | | break; |
| 706 | logerror("i386: mov_cr_r32 CR%d!\n", cr); |
| 707 | return; |
| 708 | 708 | } |
| 709 | 709 | cpustate->cr[cr] = data; |
| 710 | 710 | } |
| r21490 | r21491 | |
| 730 | 730 | CYCLES(cpustate,CYCLES_MOV_DR6_7_REG); |
| 731 | 731 | break; |
| 732 | 732 | default: |
| 733 | | fatalerror("i386: mov_dr_r32 DR%d!\n", dr); |
| 734 | | break; |
| 733 | logerror("i386: mov_dr_r32 DR%d!\n", dr); |
| 734 | return; |
| 735 | 735 | } |
| 736 | 736 | } |
| 737 | 737 | |
| r21490 | r21491 | |
| 2201 | 2201 | CYCLES(cpustate,CYCLES_DEC_MEM); |
| 2202 | 2202 | } |
| 2203 | 2203 | break; |
| 2204 | | case 6: /* PUSH Rm8 */ |
| 2204 | case 6: /* PUSH Rm8*/ |
| 2205 | 2205 | { |
| 2206 | 2206 | UINT8 value; |
| 2207 | 2207 | if( modrm >= 0xc0 ) { |
| r21490 | r21491 | |
| 2219 | 2219 | } |
| 2220 | 2220 | break; |
| 2221 | 2221 | default: |
| 2222 | | fatalerror("i386: groupFE_8 /%d unimplemented\n", (modrm >> 3) & 0x7); |
| 2222 | report_invalid_modrm(cpustate, "groupFE_8", modrm); |
| 2223 | 2223 | break; |
| 2224 | 2224 | } |
| 2225 | 2225 | } |
| r21490 | r21491 | |
| 2490 | 2490 | |
| 2491 | 2491 | static void I386OP(loadall)(i386_state *cpustate) // Opcode 0x0f 0x07 (0x0f 0x05 on 80286), undocumented |
| 2492 | 2492 | { |
| 2493 | | popmessage("LOADALL instruction hit!"); |
| 2494 | | CYCLES(cpustate,1); // TODO: correct cycle count |
| 2493 | fatalerror("i386: LOADALL unimplemented at %08X\n", cpustate->pc - 1); |
| 2495 | 2494 | } |
| 2496 | 2495 | |
| 2497 | | static void I386OP(unimplemented)(i386_state *cpustate) |
| 2496 | static void I386OP(rsm)(i386_state *cpustate) |
| 2498 | 2497 | { |
| 2499 | | report_unimplemented_opcode(cpustate); |
| 2498 | logerror("i386: Invalid RSM outside SMM at %08X\n", cpustate->pc - 1); |
| 2499 | i386_trap(cpustate, 6, 0, 0); |
| 2500 | 2500 | } |
| 2501 | 2501 | |
| 2502 | 2502 | static void I386OP(invalid)(i386_state *cpustate) |
trunk/src/emu/cpu/i386/i486ops.c
| r21490 | r21491 | |
| 314 | 314 | break; |
| 315 | 315 | } |
| 316 | 316 | default: |
| 317 | | fatalerror("i486: unimplemented opcode 0x0f 01 /%d at %08X\n", (modrm >> 3) & 0x7, cpustate->eip - 2); |
| 317 | report_invalid_modrm(cpustate, "group0F01_16", modrm); |
| 318 | 318 | break; |
| 319 | 319 | } |
| 320 | 320 | } |
| r21490 | r21491 | |
| 432 | 432 | break; |
| 433 | 433 | } |
| 434 | 434 | default: |
| 435 | | fatalerror("i486: unimplemented opcode 0x0f 01 /%d at %08X\n", (modrm >> 3) & 0x7, cpustate->eip - 2); |
| 435 | report_invalid_modrm(cpustate, "group0F01_32", modrm); |
| 436 | 436 | break; |
| 437 | 437 | } |
| 438 | 438 | } |
| r21490 | r21491 | |
| 492 | 492 | UINT8 modrm = FETCH(cpustate); |
| 493 | 493 | UINT8 cr = (modrm >> 3) & 0x7; |
| 494 | 494 | UINT32 oldcr = cpustate->cr[cr]; |
| 495 | | cpustate->cr[cr] = LOAD_RM32(modrm); |
| 495 | UINT32 data = LOAD_RM32(modrm); |
| 496 | 496 | switch(cr) |
| 497 | 497 | { |
| 498 | 498 | case 0: |
| r21490 | r21491 | |
| 507 | 507 | break; |
| 508 | 508 | case 4: CYCLES(cpustate,1); break; // TODO |
| 509 | 509 | default: |
| 510 | | fatalerror("i486: mov_cr_r32 CR%d !", cr); |
| 511 | | break; |
| 510 | logerror("i386: mov_cr_r32 CR%d!\n", cr); |
| 511 | return; |
| 512 | 512 | } |
| 513 | cpustate->cr[cr] = data; |
| 513 | 514 | } |
trunk/src/emu/cpu/i386/i386op32.c
| r21490 | r21491 | |
| 1768 | 1768 | |
| 1769 | 1769 | static void I386OP(pushfd)(i386_state *cpustate) // Opcode 0x9c |
| 1770 | 1770 | { |
| 1771 | if(!cpustate->IOP1 && !cpustate->IOP2 && V8086_MODE) |
| 1772 | FAULT(FAULT_GP,0) |
| 1771 | 1773 | UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP)); |
| 1772 | 1774 | if(i386_limit_check(cpustate,SS,offset-4) == 0) |
| 1773 | 1775 | PUSH32(cpustate, get_flags(cpustate) & 0x00fcffff ); |
| r21490 | r21491 | |
| 2759 | 2761 | |
| 2760 | 2762 | if( modrm >= 0xc0 ) |
| 2761 | 2763 | { |
| 2762 | | fatalerror("i386: groupFF_32 /%d: NYI\n", (modrm >> 3) & 0x7); |
| 2764 | report_invalid_modrm(cpustate, "groupFF_32", modrm); |
| 2763 | 2765 | } |
| 2764 | 2766 | else |
| 2765 | 2767 | { |
| r21490 | r21491 | |
| 2806 | 2808 | |
| 2807 | 2809 | if( modrm >= 0xc0 ) |
| 2808 | 2810 | { |
| 2809 | | fatalerror("i386: groupFF_32 /%d: NYI\n", (modrm >> 3) & 0x7); |
| 2811 | report_invalid_modrm(cpustate, "groupFF_32", modrm); |
| 2810 | 2812 | } |
| 2811 | 2813 | else |
| 2812 | 2814 | { |
| r21490 | r21491 | |
| 2843 | 2845 | } |
| 2844 | 2846 | break; |
| 2845 | 2847 | default: |
| 2846 | | fatalerror("i386: groupFF_32 /%d unimplemented at %08X\n", (modrm >> 3) & 0x7, cpustate->pc-2); |
| 2848 | report_invalid_modrm(cpustate, "groupFF_32", modrm); |
| 2847 | 2849 | break; |
| 2848 | 2850 | } |
| 2849 | 2851 | } |
| r21490 | r21491 | |
| 3035 | 3037 | break; |
| 3036 | 3038 | |
| 3037 | 3039 | default: |
| 3038 | | fatalerror("i386: group0F00_32 /%d unimplemented\n", (modrm >> 3) & 0x7); |
| 3040 | report_invalid_modrm(cpustate, "group0F00_32", modrm); |
| 3039 | 3041 | break; |
| 3040 | 3042 | } |
| 3041 | 3043 | } |
| r21490 | r21491 | |
| 3139 | 3141 | break; |
| 3140 | 3142 | } |
| 3141 | 3143 | default: |
| 3142 | | fatalerror("i386: unimplemented opcode 0x0f 01 /%d at %08X\n", (modrm >> 3) & 0x7, cpustate->eip - 2); |
| 3144 | report_invalid_modrm(cpustate, "group0F01_32", modrm); |
| 3143 | 3145 | break; |
| 3144 | 3146 | } |
| 3145 | 3147 | } |
| r21490 | r21491 | |
| 3259 | 3261 | } |
| 3260 | 3262 | break; |
| 3261 | 3263 | default: |
| 3262 | | fatalerror("i386: group0FBA_32 /%d unknown\n", (modrm >> 3) & 0x7); |
| 3264 | report_invalid_modrm(cpustate, "group0FBA_32", modrm); |
| 3263 | 3265 | break; |
| 3264 | 3266 | } |
| 3265 | 3267 | } |
| r21490 | r21491 | |
| 3465 | 3467 | UINT16 selector; |
| 3466 | 3468 | |
| 3467 | 3469 | if( modrm >= 0xc0 ) { |
| 3468 | | fatalerror("i386: load_far_pointer32 NYI\n"); |
| 3470 | report_invalid_modrm(cpustate, "load_far_pointer32", modrm); |
| 3469 | 3471 | } else { |
| 3470 | 3472 | UINT32 ea = GetEA(cpustate,modrm,0); |
| 3471 | 3473 | STORE_REG32(modrm, READ32(cpustate,ea + 0)); |