Previous 199869 Revisions Next

r21491 Thursday 28th February, 2013 at 23:23:35 UTC by Carl
i386: popfd should trap in v86 mode (nw)
i386: make illegal opcodes trap and logerror rather than fatalerror (nw)
[src/emu/cpu/i386]i386.c i386op16.c i386op32.c i386ops.c i386ops.h i486ops.c pentops.c

trunk/src/emu/cpu/i386/i386op16.c
r21490r21491
29552955            UINT16 address, selector;
29562956            if( modrm >= 0xc0 )
29572957            {
2958               fatalerror("i386: groupFF_16 /%d NYI\n", (modrm >> 3) & 0x7);
2958               report_invalid_modrm(cpustate, "groupFF_16", modrm);
29592959            }
29602960            else
29612961            {
r21490r21491
30023002
30033003            if( modrm >= 0xc0 )
30043004            {
3005               fatalerror("i386: groupFF_16 /%d NYI\n", (modrm >> 3) & 0x7);
3005               report_invalid_modrm(cpustate, "groupFF_16", modrm);
30063006            }
30073007            else
30083008            {
r21490r21491
30383038            CYCLES(cpustate,CYCLES_PUSH_RM);
30393039         }
30403040         break;
3041      case 7:
3042         I386OP(invalid)(cpustate);
3043         break;
30443041      default:
3045         fatalerror("i386: groupFF_16 /%d unimplemented\n", (modrm >> 3) & 0x7);
3042         report_invalid_modrm(cpustate, "groupFF_16", modrm);
30463043         break;
30473044   }
30483045}
r21490r21491
32363233         break;
32373234
32383235      default:
3239         fatalerror("i386: group0F00_16 /%d unimplemented\n", (modrm >> 3) & 0x7);
3236         report_invalid_modrm(cpustate, "group0F00_16", modrm);
32403237         break;
32413238   }
32423239}
r21490r21491
33403337            break;
33413338         }
33423339      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);
33443341         break;
33453342   }
33463343}
r21490r21491
34603457         }
34613458         break;
34623459      default:
3463         fatalerror("i386: group0FBA_16 /%d unknown\n", (modrm >> 3) & 0x7);
3460         report_invalid_modrm(cpustate, "group0FBA_16", modrm);
34643461         break;
34653462   }
34663463}
trunk/src/emu/cpu/i386/i386ops.h
r21490r21491
354354   { 0xA5,     OP_2BYTE|OP_I386,           I386OP(shld16_cl),              I386OP(shld32_cl),          },
355355   { 0xA8,     OP_2BYTE|OP_I386,           I386OP(push_gs16),              I386OP(push_gs32),          },
356356   { 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),                },
358358   { 0xAB,     OP_2BYTE|OP_I386,           I386OP(bts_rm16_r16),           I386OP(bts_rm32_r32),       },
359359   { 0xAC,     OP_2BYTE|OP_I386,           I386OP(shrd16_i8),              I386OP(shrd32_i8),          },
360360   { 0xAD,     OP_2BYTE|OP_I386,           I386OP(shrd16_cl),              I386OP(shrd32_cl),          },
trunk/src/emu/cpu/i386/pentops.c
r21490r21491
7575{
7676   UINT8 modm = FETCH(cpustate);
7777   if( modm >= 0xc0 ) {
78      fatalerror("pentium: cmpxchg8b_m64 - invalid modm\n");
78      report_invalid_modrm(cpustate, "cmpxchg8b_m64", modm);
7979   } else {
8080      UINT32 ea = GetEA(cpustate, modm, 0);
8181      UINT64 value = READ64(cpustate,ea);
r21490r21491
132132            GetNonTranslatedEA(cpustate, modm, NULL);
133133            break;
134134         default:
135            fatalerror("pentium: bad/unsupported 0f ae opcode\n");
135            report_invalid_modrm(cpustate, "sse_group0fae", modm);
136136      }
137137   } else {
138      fatalerror("pentium: bad/unsupported 0f ae opcode\n");
138      report_invalid_modrm(cpustate, "sse_group0fae", modm);
139139   }
140140}
141141
trunk/src/emu/cpu/i386/i386.c
r21490r21491
27152715#endif
27162716}
27172717
2718static void report_unimplemented_opcode(i386_state *cpustate)
2718static void report_invalid_modrm(i386_state *cpustate, const char* opcode, UINT8 modrm)
27192719{
27202720#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);
27222722#else
2723   astring errmsg;
2724   errmsg.cat("i386: Unimplemented opcode ");
2723   logerror("i386: Invalid %s modrm %01X", opcode, modrm);
27252724   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);
27282727#endif
2728   i386_trap(cpustate, 6, 0, 0);
27292729}
27302730
27312731/* Forward declarations */
trunk/src/emu/cpu/i386/i386ops.c
r21490r21491
703703         break;
704704      case 4: CYCLES(cpustate,1); break; // TODO
705705      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;
708708   }
709709   cpustate->cr[cr] = data;
710710}
r21490r21491
730730         CYCLES(cpustate,CYCLES_MOV_DR6_7_REG);
731731         break;
732732      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;
735735   }
736736}
737737
r21490r21491
22012201            CYCLES(cpustate,CYCLES_DEC_MEM);
22022202         }
22032203         break;
2204      case 6:         /* PUSH Rm8 */
2204      case 6:         /* PUSH Rm8*/
22052205         {
22062206            UINT8 value;
22072207            if( modrm >= 0xc0 ) {
r21490r21491
22192219         }
22202220         break;
22212221      default:
2222         fatalerror("i386: groupFE_8 /%d unimplemented\n", (modrm >> 3) & 0x7);
2222         report_invalid_modrm(cpustate, "groupFE_8", modrm);
22232223         break;
22242224   }
22252225}
r21490r21491
24902490
24912491static void I386OP(loadall)(i386_state *cpustate)       // Opcode 0x0f 0x07 (0x0f 0x05 on 80286), undocumented
24922492{
2493   popmessage("LOADALL instruction hit!");
2494   CYCLES(cpustate,1);     // TODO: correct cycle count
2493   fatalerror("i386: LOADALL unimplemented at %08X\n", cpustate->pc - 1);
24952494}
24962495
2497static void I386OP(unimplemented)(i386_state *cpustate)
2496static void I386OP(rsm)(i386_state *cpustate)
24982497{
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);
25002500}
25012501
25022502static void I386OP(invalid)(i386_state *cpustate)
trunk/src/emu/cpu/i386/i486ops.c
r21490r21491
314314            break;
315315         }
316316      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);
318318         break;
319319   }
320320}
r21490r21491
432432            break;
433433         }
434434      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);
436436         break;
437437   }
438438}
r21490r21491
492492   UINT8 modrm = FETCH(cpustate);
493493   UINT8 cr = (modrm >> 3) & 0x7;
494494   UINT32 oldcr = cpustate->cr[cr];
495   cpustate->cr[cr] = LOAD_RM32(modrm);
495   UINT32 data = LOAD_RM32(modrm);
496496   switch(cr)
497497   {
498498      case 0:
r21490r21491
507507         break;
508508      case 4: CYCLES(cpustate,1); break; // TODO
509509      default:
510         fatalerror("i486: mov_cr_r32 CR%d !", cr);
511         break;
510         logerror("i386: mov_cr_r32 CR%d!\n", cr);
511         return;
512512   }
513   cpustate->cr[cr] = data;
513514}
trunk/src/emu/cpu/i386/i386op32.c
r21490r21491
17681768
17691769static void I386OP(pushfd)(i386_state *cpustate)            // Opcode 0x9c
17701770{
1771   if(!cpustate->IOP1 && !cpustate->IOP2 && V8086_MODE)
1772      FAULT(FAULT_GP,0)
17711773   UINT32 offset = (STACK_32BIT ? REG32(ESP) : REG16(SP));
17721774   if(i386_limit_check(cpustate,SS,offset-4) == 0)
17731775      PUSH32(cpustate, get_flags(cpustate) & 0x00fcffff );
r21490r21491
27592761
27602762            if( modrm >= 0xc0 )
27612763            {
2762               fatalerror("i386: groupFF_32 /%d: NYI\n", (modrm >> 3) & 0x7);
2764               report_invalid_modrm(cpustate, "groupFF_32", modrm);
27632765            }
27642766            else
27652767            {
r21490r21491
28062808
28072809            if( modrm >= 0xc0 )
28082810            {
2809               fatalerror("i386: groupFF_32 /%d: NYI\n", (modrm >> 3) & 0x7);
2811               report_invalid_modrm(cpustate, "groupFF_32", modrm);
28102812            }
28112813            else
28122814            {
r21490r21491
28432845         }
28442846         break;
28452847      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);
28472849         break;
28482850   }
28492851}
r21490r21491
30353037         break;
30363038
30373039      default:
3038         fatalerror("i386: group0F00_32 /%d unimplemented\n", (modrm >> 3) & 0x7);
3040         report_invalid_modrm(cpustate, "group0F00_32", modrm);
30393041         break;
30403042   }
30413043}
r21490r21491
31393141            break;
31403142         }
31413143      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);
31433145         break;
31443146   }
31453147}
r21490r21491
32593261         }
32603262         break;
32613263      default:
3262         fatalerror("i386: group0FBA_32 /%d unknown\n", (modrm >> 3) & 0x7);
3264         report_invalid_modrm(cpustate, "group0FBA_32", modrm);
32633265         break;
32643266   }
32653267}
r21490r21491
34653467   UINT16 selector;
34663468
34673469   if( modrm >= 0xc0 ) {
3468      fatalerror("i386: load_far_pointer32 NYI\n");
3470      report_invalid_modrm(cpustate, "load_far_pointer32", modrm);
34693471   } else {
34703472      UINT32 ea = GetEA(cpustate,modrm,0);
34713473      STORE_REG32(modrm, READ32(cpustate,ea + 0));

Previous 199869 Revisions Next


© 1997-2024 The MAME Team