Previous 199869 Revisions Next

r18626 Saturday 20th October, 2012 at 20:41:27 UTC by Carl
i386: 486+ WP bit support [Carl]
[src/emu/cpu/i386]i386ops.c i386ops.h i386priv.h i486ops.c

trunk/src/emu/cpu/i386/i386priv.h
r18625r18626
393393#define STACK_32BIT         (cpustate->sreg[SS].d)
394394#define V8086_MODE         (cpustate->VM)
395395#define NESTED_TASK         (cpustate->NT)
396#define WP               (cpustate->cr[0] & 0x10000)
396397
397398#define SetOF_Add32(r,s,d)   (cpustate->OF = (((r) ^ (s)) & ((r) ^ (d)) & 0x80000000) ? 1: 0)
398399#define SetOF_Add16(r,s,d)   (cpustate->OF = (((r) ^ (s)) & ((r) ^ (d)) & 0x8000) ? 1 : 0)
r18625r18626
487488   bool user = (cpustate->CPL == 3) && (rwn >= 0);
488489   *error = 0;
489490
490   // TODO: cr0 wp bit, 486 and higher
491491   UINT32 page_dir = cpustate->program->read_dword(pdbr + directory * 4);
492492   if((page_dir & 1) && ((page_dir & 4) || !user))
493493   {
r18625r18626
496496         page_entry = cpustate->program->read_dword((page_dir & 0xfffff000) + (table * 4));
497497         if(!(page_entry & 1))
498498            ret = 0;
499         else if((!(page_entry & 2) && user && (rwn == 1)) || (!(page_entry & 4) && user))
499         else if((!(page_entry & 2) && (user || WP) && (rwn == 1)) || (!(page_entry & 4) && user))
500500         {
501501            *error = 1;
502502            ret = 0;
r18625r18626
516516      {
517517         if (page_dir & 0x80)
518518         {
519            if(!(page_dir & 2) && user && (rwn == 1))
519            if(!(page_dir & 2) && (user || WP) && (rwn == 1))
520520            {
521521               *error = 1;
522522               ret = 0;
r18625r18626
535535            page_entry = cpustate->program->read_dword((page_dir & 0xfffff000) + (table * 4));
536536            if(!(page_entry & 1))
537537               ret = 0;
538            else if((!(page_entry & 2) && user && (rwn == 1)) || (!(page_entry & 4) && user))
538            else if((!(page_entry & 2) && (user || WP) && (rwn == 1)) || (!(page_entry & 4) && user))
539539            {
540540               *error = 1;
541541               ret = 0;
r18625r18626
562562   if(!ret)
563563   {
564564      if(rwn != -1)
565         *error |= ((rwn & 1)<<1) | ((cpustate->CPL == 3)<<2);
565         *error |= ((rwn == 1)<<1) | ((cpustate->CPL == 3)<<2);
566566      return 0;
567567   }
568568   return 1;
trunk/src/emu/cpu/i386/i386ops.h
r18625r18626
301301   { 0x20,      OP_2BYTE|OP_I386,         I386OP(mov_r32_cr),            I386OP(mov_r32_cr),         },
302302   { 0x21,      OP_2BYTE|OP_I386,         I386OP(mov_r32_dr),            I386OP(mov_r32_dr),         },
303303   { 0x22,      OP_2BYTE|OP_I386,         I386OP(mov_cr_r32),            I386OP(mov_cr_r32),         },
304   { 0x22,      OP_2BYTE|OP_I486,         I486OP(mov_cr_r32),            I386OP(mov_cr_r32),         },
304305   { 0x23,      OP_2BYTE|OP_I386,         I386OP(mov_dr_r32),            I386OP(mov_dr_r32),         },
305306   { 0x24,      OP_2BYTE|OP_I386,         I386OP(mov_r32_tr),            I386OP(mov_r32_tr),         },
306307   { 0x26,      OP_2BYTE|OP_I386,         I386OP(mov_tr_r32),            I386OP(mov_tr_r32),         },
trunk/src/emu/cpu/i386/i386ops.c
r18625r18626
653653
654654static void I386OP(mov_r32_cr)(i386_state *cpustate)      // Opcode 0x0f 20
655655{
656   if(PROTECTED_MODE && cpustate->CPL)
657      FAULT(FAULT_GP, 0);
656658   UINT8 modrm = FETCH(cpustate);
657659   UINT8 cr = (modrm >> 3) & 0x7;
658660
r18625r18626
662664
663665static void I386OP(mov_r32_dr)(i386_state *cpustate)      // Opcode 0x0f 21
664666{
667   if(PROTECTED_MODE && cpustate->CPL)
668      FAULT(FAULT_GP, 0);
665669   UINT8 modrm = FETCH(cpustate);
666670   UINT8 dr = (modrm >> 3) & 0x7;
667671
r18625r18626
683687
684688static void I386OP(mov_cr_r32)(i386_state *cpustate)      // Opcode 0x0f 22
685689{
690   if(PROTECTED_MODE && cpustate->CPL)
691      FAULT(FAULT_GP, 0);
686692   UINT8 modrm = FETCH(cpustate);
687693   UINT8 cr = (modrm >> 3) & 0x7;
688
689   cpustate->cr[cr] = LOAD_RM32(modrm);
694   UINT32 data = LOAD_RM32(modrm);
690695   switch(cr)
691696   {
692      case 0: CYCLES(cpustate,CYCLES_MOV_REG_CR0); break;
697      case 0:
698         data &= 0xfffeffff; // wp not supported on 386
699         CYCLES(cpustate,CYCLES_MOV_REG_CR0);
700         break;
693701      case 2: CYCLES(cpustate,CYCLES_MOV_REG_CR2); break;
694702      case 3: CYCLES(cpustate,CYCLES_MOV_REG_CR3); break;
695703      case 4: CYCLES(cpustate,1); break; // TODO
r18625r18626
697705         fatalerror("i386: mov_cr_r32 CR%d!\n", cr);
698706         break;
699707   }
708   cpustate->cr[cr] = data;
700709}
701710
702711static void I386OP(mov_dr_r32)(i386_state *cpustate)      // Opcode 0x0f 23
703712{
713   if(PROTECTED_MODE && cpustate->CPL)
714      FAULT(FAULT_GP, 0);
704715   UINT8 modrm = FETCH(cpustate);
705716   UINT8 dr = (modrm >> 3) & 0x7;
706717
trunk/src/emu/cpu/i386/i486ops.c
r18625r18626
466466   REG32(EDI) = SWITCH_ENDIAN_32(REG32(EDI));
467467   CYCLES(cpustate,1);      // TODO
468468}
469
470static void I486OP(mov_cr_r32)(i386_state *cpustate)      // Opcode 0x0f 22
471{
472   if(PROTECTED_MODE && cpustate->CPL)
473      FAULT(FAULT_GP, 0);
474   UINT8 modrm = FETCH(cpustate);
475   UINT8 cr = (modrm >> 3) & 0x7;
476   cpustate->cr[cr] = LOAD_RM32(modrm);
477   switch(cr)
478   {
479      case 0: CYCLES(cpustate,CYCLES_MOV_REG_CR0); break;
480      case 2: CYCLES(cpustate,CYCLES_MOV_REG_CR2); break;
481      case 3: CYCLES(cpustate,CYCLES_MOV_REG_CR3); break;
482      case 4: CYCLES(cpustate,1); break; // TODO
483      default:
484         fatalerror("i386: mov_cr_r32 CR%d !", cr);
485         break;
486   }
487}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team