Previous 15994 Revisions Next

r14730 Friday 9th March, 2012 at 21:45:08 UTC by Barry Rodewald
i386,x87: Multiple fixes. [Carl]
[src/emu/cpu/i386]i386.c i386op16.c i386op32.c i386ops.c i486ops.c x87ops.c

src/emu/cpu/i386/i386op16.c
r14729r14730
6161      switch( (modrm >> 3) & 0x7 )
6262      {
6363         case 0:         /* ROL rm16, i8 */
64            if(!(shift & 15))
65            {
66               if(shift & 16)
67               {
68                  cpustate->CF = src & 1;
69                  cpustate->OF = (src & 1) ^ ((src >> 15) & 1);
70               }
71               break;
72            }
73            shift &= 15;
6474            dst = ((src & ((UINT16)0xffff >> shift)) << shift) |
6575                 ((src & ((UINT16)0xffff << (16-shift))) >> (16-shift));
66            cpustate->CF = (src >> (16-shift)) & 0x1;
76            cpustate->CF = dst & 0x1;
77            cpustate->OF = (dst & 1) ^ (dst >> 15);
6778            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
6879            break;
6980         case 1:         /* ROR rm16, i8 */
81            if(!(shift & 15))
82            {
83               if(shift & 16)
84               {
85                  cpustate->CF = (src >> 15) & 1;
86                  cpustate->OF = ((src >> 15) & 1) ^ ((src >> 14) & 1);
87               }
88               break;
89            }
90            shift &= 15;
7091            dst = ((src & ((UINT16)0xffff << shift)) >> shift) |
7192                 ((src & ((UINT16)0xffff >> (16-shift))) << (16-shift));
72            cpustate->CF = (src >> (shift-1)) & 0x1;
93            cpustate->CF = (dst >> 15) & 1;
94            cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
7395            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
7496            break;
7597         case 2:         /* RCL rm16, i8 */
98            shift %= 17;
7699            dst = ((src & ((UINT16)0xffff >> shift)) << shift) |
77100                 ((src & ((UINT16)0xffff << (17-shift))) >> (17-shift)) |
78101                 (cpustate->CF << (shift-1));
79            cpustate->CF = (src >> (16-shift)) & 0x1;
102            if(shift) cpustate->CF = (src >> (16-shift)) & 0x1;
103            cpustate->OF = cpustate->CF ^ ((dst >> 15) & 1);
80104            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
81105            break;
82106         case 3:         /* RCR rm16, i8 */
107            shift %= 17;
83108            dst = ((src & ((UINT16)0xffff << shift)) >> shift) |
84109                 ((src & ((UINT16)0xffff >> (16-shift))) << (17-shift)) |
85110                 (cpustate->CF << (16-shift));
86            cpustate->CF = (src >> (shift-1)) & 0x1;
111            if(shift) cpustate->CF = (src >> (shift-1)) & 0x1;
112            cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
87113            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
88114            break;
89115         case 4:         /* SHL/SAL rm16, i8 */
90116         case 6:
117            shift &= 31;
91118            dst = src << shift;
92119            cpustate->CF = (src & (1 << (16-shift))) ? 1 : 0;
93120            SetSZPF16(dst);
94121            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
95122            break;
96123         case 5:         /* SHR rm16, i8 */
124            shift &= 31;
97125            dst = src >> shift;
98126            cpustate->CF = (src & (1 << (shift-1))) ? 1 : 0;
99127            SetSZPF16(dst);
100128            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
101129            break;
102130         case 7:         /* SAR rm16, i8 */
131            shift &= 31;
103132            dst = (INT16)src >> shift;
104133            cpustate->CF = (src & (1 << (shift-1))) ? 1 : 0;
105134            SetSZPF16(dst);
r14729r14730
329358      UINT16 dst = LOAD_RM16(modrm);
330359      UINT16 bit = LOAD_REG16(modrm);
331360
332      if( dst & (1 << bit) )
361      if( dst & (1 << (bit & 0xf)) )
333362         cpustate->CF = 1;
334363      else
335364         cpustate->CF = 0;
r14729r14730
339368      UINT32 ea = GetEA(cpustate,modrm,0);
340369      UINT16 bit = LOAD_REG16(modrm);
341370      ea += 2*(bit/16);
371      ea = (cpustate->address_size)?ea:(ea&0xffff);
342372      bit %= 16;
343373      UINT16 dst = READ16(cpustate,ea);
344374
r14729r14730
358388      UINT16 dst = LOAD_RM16(modrm);
359389      UINT16 bit = LOAD_REG16(modrm);
360390
361      if( dst & (1 << bit) )
391      if( dst & (1 << (bit & 0xf)) )
362392         cpustate->CF = 1;
363393      else
364394         cpustate->CF = 0;
365      dst ^= (1 << bit);
395      dst ^= (1 << (bit & 0xf));
366396
367397      STORE_RM16(modrm, dst);
368398      CYCLES(cpustate,CYCLES_BTC_REG_REG);
r14729r14730
370400      UINT32 ea = GetEA(cpustate,modrm,1);
371401      UINT16 bit = LOAD_REG16(modrm);
372402      ea += 2*(bit/16);
403      ea = (cpustate->address_size)?ea:(ea&0xffff);
373404      bit %= 16;
374405      UINT16 dst = READ16(cpustate,ea);
375406
r14729r14730
391422      UINT16 dst = LOAD_RM16(modrm);
392423      UINT16 bit = LOAD_REG16(modrm);
393424
394      if( dst & (1 << bit) )
425      if( dst & (1 << (bit & 0xf)) )
395426         cpustate->CF = 1;
396427      else
397428         cpustate->CF = 0;
398      dst &= ~(1 << bit);
429      dst &= ~(1 << (bit & 0xf));
399430
400431      STORE_RM16(modrm, dst);
401432      CYCLES(cpustate,CYCLES_BTR_REG_REG);
r14729r14730
403434      UINT32 ea = GetEA(cpustate,modrm,1);
404435      UINT16 bit = LOAD_REG16(modrm);
405436      ea += 2*(bit/16);
437      ea = (cpustate->address_size)?ea:(ea&0xffff);
406438      bit %= 16;
407439      UINT16 dst = READ16(cpustate,ea);
408440
r14729r14730
424456      UINT16 dst = LOAD_RM16(modrm);
425457      UINT16 bit = LOAD_REG16(modrm);
426458
427      if( dst & (1 << bit) )
459      if( dst & (1 << (bit & 0xf)) )
428460         cpustate->CF = 1;
429461      else
430462         cpustate->CF = 0;
431      dst |= (1 << bit);
463      dst |= (1 << (bit & 0xf));
432464
433465      STORE_RM16(modrm, dst);
434466      CYCLES(cpustate,CYCLES_BTS_REG_REG);
r14729r14730
436468      UINT32 ea = GetEA(cpustate,modrm,1);
437469      UINT16 bit = LOAD_REG16(modrm);
438470      ea += 2*(bit/16);
471      ea = (cpustate->address_size)?ea:(ea&0xffff);
439472      bit %= 16;
440473      UINT16 dst = READ16(cpustate,ea);
441474
r14729r14730
19942027
19952028static void I386OP(shld16_i8)(i386_state *cpustate)         // Opcode 0x0f a4
19962029{
1997   /* TODO: Correct flags */
19982030   UINT8 modrm = FETCH(cpustate);
19992031   if( modrm >= 0xc0 ) {
20002032      UINT16 dst = LOAD_RM16(modrm);
20012033      UINT16 upper = LOAD_REG16(modrm);
20022034      UINT8 shift = FETCH(cpustate);
2003      if( shift > 31 || shift == 0 ) {
2035      shift &= 31;
2036      if( shift == 0 ) {
20042037
20052038      } else if( shift > 15 ) {
2006         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
2039         cpustate->CF = (upper & (1 << (16-shift))) ? 1 : 0;
2040         // ppro and above should be (dst >> (32-shift))
20072041         dst = (upper << (shift-16)) | (upper >> (32-shift));
2042         cpustate->OF = cpustate->CF ^ (dst >> 15);
20082043         SetSZPF16(dst);
20092044      } else {
20102045         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
20112046         dst = (dst << shift) | (upper >> (16-shift));
2047         cpustate->OF = cpustate->CF ^ (dst >> 15);
20122048         SetSZPF16(dst);
20132049      }
20142050      STORE_RM16(modrm, dst);
r14729r14730
20182054      UINT16 dst = READ16(cpustate,ea);
20192055      UINT16 upper = LOAD_REG16(modrm);
20202056      UINT8 shift = FETCH(cpustate);
2021      if( shift > 31 || shift == 0 ) {
2057      shift &= 31;
2058      if( shift == 0 ) {
20222059
20232060      } else if( shift > 15 ) {
2024         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
2061         cpustate->CF = (upper & (1 << (16-shift))) ? 1 : 0;
20252062         dst = (upper << (shift-16)) | (upper >> (32-shift));
2063         cpustate->OF = cpustate->CF ^ (dst >> 15);
20262064         SetSZPF16(dst);
20272065      } else {
20282066         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
20292067         dst = (dst << shift) | (upper >> (16-shift));
2068         cpustate->OF = cpustate->CF ^ (dst >> 15);
20302069         SetSZPF16(dst);
20312070      }
20322071      WRITE16(cpustate,ea, dst);
r14729r14730
20362075
20372076static void I386OP(shld16_cl)(i386_state *cpustate)         // Opcode 0x0f a5
20382077{
2039   /* TODO: Correct flags */
20402078   UINT8 modrm = FETCH(cpustate);
20412079   if( modrm >= 0xc0 ) {
20422080      UINT16 dst = LOAD_RM16(modrm);
20432081      UINT16 upper = LOAD_REG16(modrm);
20442082      UINT8 shift = REG8(CL);
2045      if( shift > 31 || shift == 0 ) {
2083      shift &= 31;
2084      if( shift == 0 ) {
20462085
20472086      } else if( shift > 15 ) {
2048         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
2087         cpustate->CF = (upper & (1 << (16-shift))) ? 1 : 0;
20492088         dst = (upper << (shift-16)) | (upper >> (32-shift));
2089         cpustate->OF = cpustate->CF ^ (dst >> 15);
20502090         SetSZPF16(dst);
20512091      } else {
20522092         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
20532093         dst = (dst << shift) | (upper >> (16-shift));
2094         cpustate->OF = cpustate->CF ^ (dst >> 15);
20542095         SetSZPF16(dst);
20552096      }
20562097      STORE_RM16(modrm, dst);
r14729r14730
20602101      UINT16 dst = READ16(cpustate,ea);
20612102      UINT16 upper = LOAD_REG16(modrm);
20622103      UINT8 shift = REG8(CL);
2063      if( shift > 31 || shift == 0 ) {
2104      shift &= 31;
2105      if( shift == 0 ) {
20642106
20652107      } else if( shift > 15 ) {
2066         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
2108         cpustate->CF = (upper & (1 << (16-shift))) ? 1 : 0;
20672109         dst = (upper << (shift-16)) | (upper >> (32-shift));
2110         cpustate->OF = cpustate->CF ^ (dst >> 15);
20682111         SetSZPF16(dst);
20692112      } else {
20702113         cpustate->CF = (dst & (1 << (16-shift))) ? 1 : 0;
20712114         dst = (dst << shift) | (upper >> (16-shift));
2115         cpustate->OF = cpustate->CF ^ (dst >> 15);
20722116         SetSZPF16(dst);
20732117      }
20742118      WRITE16(cpustate,ea, dst);
r14729r14730
20782122
20792123static void I386OP(shrd16_i8)(i386_state *cpustate)         // Opcode 0x0f ac
20802124{
2081   /* TODO: Correct flags */
20822125   UINT8 modrm = FETCH(cpustate);
20832126   if( modrm >= 0xc0 ) {
20842127      UINT16 dst = LOAD_RM16(modrm);
20852128      UINT16 upper = LOAD_REG16(modrm);
20862129      UINT8 shift = FETCH(cpustate);
2087      if( shift > 15 || shift == 0) {
2130      shift &= 31;
2131      if( shift == 0) {
20882132
2133      } else if( shift > 15 ) {
2134         cpustate->CF = (upper & (1 << (shift-1))) ? 1 : 0;
2135         dst = (upper >> (shift-16)) | (upper << (32-shift));
2136         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
2137         SetSZPF16(dst);
20892138      } else {
20902139         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
20912140         dst = (dst >> shift) | (upper << (16-shift));
2141         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
20922142         SetSZPF16(dst);
20932143      }
20942144      STORE_RM16(modrm, dst);
r14729r14730
20982148      UINT16 dst = READ16(cpustate,ea);
20992149      UINT16 upper = LOAD_REG16(modrm);
21002150      UINT8 shift = FETCH(cpustate);
2101      if( shift > 15 || shift == 0) {
2151      shift &= 31;
2152      if( shift == 0) {
21022153
2154      } else if( shift > 15 ) {
2155         cpustate->CF = (upper & (1 << (shift-1))) ? 1 : 0;
2156         dst = (upper >> (shift-16)) | (upper << (32-shift));
2157         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
2158         SetSZPF16(dst);
21032159      } else {
21042160         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
21052161         dst = (dst >> shift) | (upper << (16-shift));
2162         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
21062163         SetSZPF16(dst);
21072164      }
21082165      WRITE16(cpustate,ea, dst);
r14729r14730
21122169
21132170static void I386OP(shrd16_cl)(i386_state *cpustate)         // Opcode 0x0f ad
21142171{
2115   /* TODO: Correct flags */
21162172   UINT8 modrm = FETCH(cpustate);
21172173   if( modrm >= 0xc0 ) {
21182174      UINT16 dst = LOAD_RM16(modrm);
21192175      UINT16 upper = LOAD_REG16(modrm);
21202176      UINT8 shift = REG8(CL);
2121      if( shift > 15 || shift == 0) {
2177      shift &= 31;
2178      if( shift == 0) {
21222179
2180      } else if( shift > 15 ) {
2181         cpustate->CF = (upper & (1 << (shift-1))) ? 1 : 0;
2182         dst = (upper >> (shift-16)) | (upper << (32-shift));
2183         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
2184         SetSZPF16(dst);
21232185      } else {
21242186         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
21252187         dst = (dst >> shift) | (upper << (16-shift));
2188         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
21262189         SetSZPF16(dst);
21272190      }
21282191      STORE_RM16(modrm, dst);
r14729r14730
21322195      UINT16 dst = READ16(cpustate,ea);
21332196      UINT16 upper = LOAD_REG16(modrm);
21342197      UINT8 shift = REG8(CL);
2135      if( shift > 15 || shift == 0) {
2198      shift &= 31;
2199      if( shift == 0) {
21362200
2201      } else if( shift > 15 ) {
2202         cpustate->CF = (upper & (1 << (shift-1))) ? 1 : 0;
2203         dst = (upper >> (shift-16)) | (upper << (32-shift));
2204         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
2205         SetSZPF16(dst);
21372206      } else {
21382207         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
21392208         dst = (dst >> shift) | (upper << (16-shift));
2209         cpustate->OF = ((dst >> 15) ^ (dst >> 14)) & 1;
21402210         SetSZPF16(dst);
21412211      }
21422212      WRITE16(cpustate,ea, dst);
r14729r14730
28232893                     cpustate->CF = 1;
28242894               }
28252895            } else {
2826               cpustate->ext = 0;
28272896               i386_trap(cpustate, 0, 0, 0);
2828               cpustate->ext = 1;
28292897            }
28302898         }
28312899         break;
r14729r14730
28572925                     cpustate->CF = 1;
28582926               }
28592927            } else {
2860               cpustate->ext = 0;
28612928               i386_trap(cpustate, 0, 0, 0);
2862               cpustate->ext = 1;
28632929            }
28642930         }
28652931         break;
r14729r14730
30723138            }
30733139            memset(&seg, 0, sizeof(seg));
30743140            seg.selector = cpustate->ldtr.segment;
3075            i386_load_protected_mode_segment(cpustate,&seg);
3141            i386_load_protected_mode_segment(cpustate,&seg,NULL);
30763142            cpustate->ldtr.limit = seg.limit;
30773143            cpustate->ldtr.base = seg.base;
30783144            cpustate->ldtr.flags = seg.flags;
r14729r14730
30993165            }
31003166            memset(&seg, 0, sizeof(seg));
31013167            seg.selector = cpustate->task.segment;
3102            i386_load_protected_mode_segment(cpustate,&seg);
3168            i386_load_protected_mode_segment(cpustate,&seg,NULL);
31033169            cpustate->task.limit = seg.limit;
31043170            cpustate->task.base = seg.base;
31053171            cpustate->task.flags = seg.flags;
r14729r14730
31243190            }
31253191            memset(&seg, 0, sizeof(seg));
31263192            seg.selector = address;
3127            i386_load_protected_mode_segment(cpustate,&seg);
3128            // check if the segment is within the bounds of the GDT or LDT
3129            if(seg.selector & 0x04)
3130            {  // LDT
3131               if((seg.selector & 0xf8) > cpustate->ldtr.limit)
3132               {
3133                  result = 0;
3134               }
3135            }
3136            else
3137            {  // GDT
3138               if((seg.selector & 0xf8) > cpustate->gdtr.limit)
3139               {
3140                  result = 0;
3141               }
3142            }
3193            result = i386_load_protected_mode_segment(cpustate,&seg,NULL);
31433194            // check if the segment is a code or data segment (not a special segment type, like a TSS, gate, LDT...)
31443195            if(!(seg.flags & 0x10))
31453196               result = 0;
r14729r14730
31873238            }
31883239            memset(&seg, 0, sizeof(seg));
31893240            seg.selector = address;
3190            i386_load_protected_mode_segment(cpustate,&seg);
3191            // check if the segment is within the bounds of the GDT or LDT
3192            if(seg.selector & 0x04)
3193            {  // LDT
3194               if((seg.selector & 0xf8) > cpustate->ldtr.limit)
3195               {
3196                  result = 0;
3197               }
3198            }
3199            else
3200            {  // GDT
3201               if((seg.selector & 0xf8) > cpustate->gdtr.limit)
3202               {
3203                  result = 0;
3204               }
3205            }
3241            result = i386_load_protected_mode_segment(cpustate,&seg,NULL);
32063242            // check if the segment is a code or data segment (not a special segment type, like a TSS, gate, LDT...)
32073243            if(!(seg.flags & 0x10))
32083244               result = 0;
r14729r14730
34883524      }
34893525      else
34903526      {
3491         i386_load_protected_mode_segment(cpustate,&seg);
3527         if(!i386_load_protected_mode_segment(cpustate,&seg,NULL))
3528         {
3529            SetZF(0);
3530            return;
3531         }
3532         if(((seg.flags >> 5) & 3) < cpustate->CPL)
3533         {
3534            SetZF(0);
3535            return;
3536         }
34923537         if(!(seg.flags & 0x10))  // special segment
34933538         {
34943539            // check for invalid segment types
r14729r14730
34993544            }
35003545            else
35013546            {
3502               // TODO: check current privilege level
35033547               STORE_REG16(modrm,(seg.flags << 8) & 0xff00);
35043548               SetZF(1);
35053549            }
35063550         }
35073551         else
35083552         {  // data or code segment (both are valid for LAR)
3509            // TODO: check current privilege level
35103553            STORE_REG16(modrm,(seg.flags << 8) & 0xff00);
35113554            SetZF(1);
35123555         }
r14729r14730
35443587      }
35453588      else
35463589      {
3547         // TODO: check segment type
3548         i386_load_protected_mode_segment(cpustate,&seg);
3549         limit = seg.limit;
3550         STORE_REG16(modrm,limit & 0x0000ffff);
3551         SetZF(1);
3590         UINT8 type;
3591         if(!i386_load_protected_mode_segment(cpustate,&seg,NULL))
3592         {
3593            SetZF(0);
3594            return;
3595         }
3596         if(((seg.flags >> 5) & 3) < cpustate->CPL)
3597         {
3598            SetZF(0);
3599            return;
3600         }
3601         type = seg.flags & 0x1f;
3602         switch(type)
3603         {
3604         case 0:
3605         case 4:
3606         case 5:
3607         case 6:
3608         case 7:
3609         case 8:
3610         case 10:
3611         case 12:
3612         case 13:
3613         case 14:
3614         case 15:
3615            SetZF(0);
3616            return;
3617         default:
3618            limit = seg.limit;
3619            STORE_REG16(modrm,limit & 0x0000ffff);
3620            SetZF(1);
3621         }
35523622      }
35533623   }
35543624   else
src/emu/cpu/i386/x87ops.c
r14729r14730
292292
293293   if ((cpustate->x87_sw & ~cpustate->x87_cw) & 0x3f)
294294   {
295      // TODO
296      fatalerror("Unimplemented: unmasked x87 exception (CW:%.4x, SW:%.4x)", cpustate->x87_cw, cpustate->x87_sw);
295      // device_set_input_line(cpustate->device, INPUT_LINE_FERR, RAISE_LINE);
296      logerror("Unmasked x87 exception (CW:%.4x, SW:%.4x)\n", cpustate->x87_cw, cpustate->x87_sw);
297      if (cpustate->cr[0] & 0x20) // FIXME: 486 and up only
298      {
299         cpustate->ext = 1;
300         i386_trap(cpustate, FAULT_MF, 0, 0);
301      }
297302      return 0;
298303   }
299304
r14729r14730
465470{
466471   floatx80 result;
467472
473   UINT32 ea = GetEA(cpustate, modrm, 0);
468474   if (X87_IS_ST_EMPTY(0))
469475   {
470476      x87_set_stack_underflow(cpustate);
r14729r14730
472478   }
473479   else
474480   {
475      UINT32 ea = GetEA(cpustate, modrm, 0);
476481      UINT32 m32real = READ32(cpustate, ea);
477482
478483      floatx80 a = ST(0);
r14729r14730
500505{
501506   floatx80 result;
502507
508   UINT32 ea = GetEA(cpustate, modrm, 0);
503509   if (X87_IS_ST_EMPTY(0))
504510   {
505511      x87_set_stack_underflow(cpustate);
r14729r14730
507513   }
508514   else
509515   {
510      UINT32 ea = GetEA(cpustate, modrm, 0);
511516      UINT64 m64real = READ64(cpustate, ea);
512517
513518      floatx80 a = ST(0);
r14729r14730
637642{
638643   floatx80 result;
639644
645   UINT32 ea = GetEA(cpustate, modrm, 0);
640646   if (X87_IS_ST_EMPTY(0))
641647   {
642648      x87_set_stack_underflow(cpustate);
r14729r14730
644650   }
645651   else
646652   {
647      UINT32 ea = GetEA(cpustate, modrm, 0);
648653      INT32 m32int = READ32(cpustate, ea);
649654
650655      floatx80 a = ST(0);
r14729r14730
672677{
673678   floatx80 result;
674679
680   UINT32 ea = GetEA(cpustate, modrm, 0);
675681   if (X87_IS_ST_EMPTY(0))
676682   {
677683      x87_set_stack_underflow(cpustate);
r14729r14730
679685   }
680686   else
681687   {
682      UINT32 ea = GetEA(cpustate, modrm, 0);
683688      INT16 m16int = READ16(cpustate, ea);
684689
685690      floatx80 a = ST(0);
r14729r14730
714719{
715720   floatx80 result;
716721
722   UINT32 ea = GetEA(cpustate, modrm, 0);
717723   if (X87_IS_ST_EMPTY(0))
718724   {
719725      x87_set_stack_underflow(cpustate);
r14729r14730
721727   }
722728   else
723729   {
724      UINT32 ea = GetEA(cpustate, modrm, 0);
725730      UINT32 m32real = READ32(cpustate, ea);
726731
727732      floatx80 a = ST(0);
r14729r14730
749754{
750755   floatx80 result;
751756
757   UINT32 ea = GetEA(cpustate, modrm, 0);
752758   if (X87_IS_ST_EMPTY(0))
753759   {
754760      x87_set_stack_underflow(cpustate);
r14729r14730
756762   }
757763   else
758764   {
759      UINT32 ea = GetEA(cpustate, modrm, 0);
760765      UINT64 m64real = READ64(cpustate, ea);
761766
762767      floatx80 a = ST(0);
r14729r14730
886891{
887892   floatx80 result;
888893
894   UINT32 ea = GetEA(cpustate, modrm, 0);
889895   if (X87_IS_ST_EMPTY(0))
890896   {
891897      x87_set_stack_underflow(cpustate);
r14729r14730
893899   }
894900   else
895901   {
896      UINT32 ea = GetEA(cpustate, modrm, 0);
897902      INT32 m32int = READ32(cpustate, ea);
898903
899904      floatx80 a = ST(0);
r14729r14730
921926{
922927   floatx80 result;
923928
929   UINT32 ea = GetEA(cpustate, modrm, 0);
924930   if (X87_IS_ST_EMPTY(0))
925931   {
926932      x87_set_stack_underflow(cpustate);
r14729r14730
928934   }
929935   else
930936   {
931      UINT32 ea = GetEA(cpustate, modrm, 0);
932937      INT16 m16int = READ16(cpustate, ea);
933938
934939      floatx80 a = ST(0);
r14729r14730
963968{
964969   floatx80 result;
965970
971   UINT32 ea = GetEA(cpustate, modrm, 0);
966972   if (X87_IS_ST_EMPTY(0))
967973   {
968974      x87_set_stack_underflow(cpustate);
r14729r14730
970976   }
971977   else
972978   {
973      UINT32 ea = GetEA(cpustate, modrm, 0);
974979      UINT32 m32real = READ32(cpustate, ea);
975980
976981      floatx80 a = float32_to_floatx80(m32real);
r14729r14730
9981003{
9991004   floatx80 result;
10001005
1006   UINT32 ea = GetEA(cpustate, modrm, 0);
10011007   if (X87_IS_ST_EMPTY(0))
10021008   {
10031009      x87_set_stack_underflow(cpustate);
r14729r14730
10051011   }
10061012   else
10071013   {
1008      UINT32 ea = GetEA(cpustate, modrm, 0);
10091014      UINT64 m64real = READ64(cpustate, ea);
10101015
10111016      floatx80 a = float64_to_floatx80(m64real);
r14729r14730
11351140{
11361141   floatx80 result;
11371142
1143   UINT32 ea = GetEA(cpustate, modrm, 0);
11381144   if (X87_IS_ST_EMPTY(0))
11391145   {
11401146      x87_set_stack_underflow(cpustate);
r14729r14730
11421148   }
11431149   else
11441150   {
1145      UINT32 ea = GetEA(cpustate, modrm, 0);
11461151      INT32 m32int = READ32(cpustate, ea);
11471152
11481153      floatx80 a = int32_to_floatx80(m32int);
r14729r14730
11701175{
11711176   floatx80 result;
11721177
1178   UINT32 ea = GetEA(cpustate, modrm, 0);
11731179   if (X87_IS_ST_EMPTY(0))
11741180   {
11751181      x87_set_stack_underflow(cpustate);
r14729r14730
11771183   }
11781184   else
11791185   {
1180      UINT32 ea = GetEA(cpustate, modrm, 0);
11811186      INT16 m16int = READ16(cpustate, ea);
11821187
11831188      floatx80 a = int32_to_floatx80(m16int);
r14729r14730
12121217{
12131218   floatx80 result;
12141219
1220   UINT32 ea = GetEA(cpustate, modrm, 0);
12151221   if (X87_IS_ST_EMPTY(0))
12161222   {
12171223      x87_set_stack_underflow(cpustate);
r14729r14730
12191225   }
12201226   else
12211227   {
1222      UINT32 ea = GetEA(cpustate, modrm, 0);
12231228      UINT32 m32real = READ32(cpustate, ea);
12241229
12251230      floatx80 a = ST(0);
r14729r14730
12471252{
12481253   floatx80 result;
12491254
1255   UINT32 ea = GetEA(cpustate, modrm, 0);
12501256   if (X87_IS_ST_EMPTY(0))
12511257   {
12521258      x87_set_stack_underflow(cpustate);
r14729r14730
12541260   }
12551261   else
12561262   {
1257      UINT32 ea = GetEA(cpustate, modrm, 0);
12581263      UINT64 m64real = READ64(cpustate, ea);
12591264
12601265      floatx80 a = ST(0);
r14729r14730
13881393{
13891394   floatx80 result;
13901395
1396   UINT32 ea = GetEA(cpustate, modrm, 0);
13911397   if (X87_IS_ST_EMPTY(0))
13921398   {
13931399      x87_set_stack_underflow(cpustate);
r14729r14730
13951401   }
13961402   else
13971403   {
1398      UINT32 ea = GetEA(cpustate, modrm, 0);
13991404      INT32 m32int = READ32(cpustate, ea);
14001405
14011406      floatx80 a = ST(0);
r14729r14730
14231428{
14241429   floatx80 result;
14251430
1431   UINT32 ea = GetEA(cpustate, modrm, 0);
14261432   if (X87_IS_ST_EMPTY(0))
14271433   {
14281434      x87_set_stack_underflow(cpustate);
r14729r14730
14301436   }
14311437   else
14321438   {
1433      UINT32 ea = GetEA(cpustate, modrm, 0);
14341439      INT16 m16int = READ32(cpustate, ea);
14351440
14361441      floatx80 a = ST(0);
r14729r14730
14651470{
14661471   floatx80 result;
14671472
1473   UINT32 ea = GetEA(cpustate, modrm, 0);
14681474   if (X87_IS_ST_EMPTY(0))
14691475   {
14701476      x87_set_stack_underflow(cpustate);
r14729r14730
14721478   }
14731479   else
14741480   {
1475      UINT32 ea = GetEA(cpustate, modrm, 0);
14761481      UINT32 m32real = READ32(cpustate, ea);
14771482
14781483      floatx80 a = float32_to_floatx80(m32real);
r14729r14730
15001505{
15011506   floatx80 result;
15021507
1508   UINT32 ea = GetEA(cpustate, modrm, 0);
15031509   if (X87_IS_ST_EMPTY(0))
15041510   {
15051511      x87_set_stack_underflow(cpustate);
r14729r14730
15071513   }
15081514   else
15091515   {
1510      UINT32 ea = GetEA(cpustate, modrm, 0);
15111516      UINT64 m64real = READ64(cpustate, ea);
15121517
15131518      floatx80 a = float64_to_floatx80(m64real);
r14729r14730
16421647{
16431648   floatx80 result;
16441649
1650   UINT32 ea = GetEA(cpustate, modrm, 0);
16451651   if (X87_IS_ST_EMPTY(0))
16461652   {
16471653      x87_set_stack_underflow(cpustate);
r14729r14730
16491655   }
16501656   else
16511657   {
1652      UINT32 ea = GetEA(cpustate, modrm, 0);
16531658      INT32 m32int = READ32(cpustate, ea);
16541659
16551660      floatx80 a = int32_to_floatx80(m32int);
r14729r14730
16771682{
16781683   floatx80 result;
16791684
1685   UINT32 ea = GetEA(cpustate, modrm, 0);
16801686   if (X87_IS_ST_EMPTY(0))
16811687   {
16821688      x87_set_stack_underflow(cpustate);
r14729r14730
16841690   }
16851691   else
16861692   {
1687      UINT32 ea = GetEA(cpustate, modrm, 0);
16881693      INT16 m16int = READ32(cpustate, ea);
16891694
16901695      floatx80 a = int32_to_floatx80(m16int);
r14729r14730
17191724{
17201725   floatx80 result;
17211726
1727   UINT32 ea = GetEA(cpustate, modrm, 0);
17221728   if (X87_IS_ST_EMPTY(0))
17231729   {
17241730      x87_set_stack_underflow(cpustate);
r14729r14730
17261732   }
17271733   else
17281734   {
1729      UINT32 ea = GetEA(cpustate, modrm, 0);
17301735      UINT32 m32real = READ32(cpustate, ea);
17311736
17321737      floatx80 a = ST(0);
r14729r14730
17531758{
17541759   floatx80 result;
17551760
1761   UINT32 ea = GetEA(cpustate, modrm, 0);
17561762   if (X87_IS_ST_EMPTY(0))
17571763   {
17581764      x87_set_stack_underflow(cpustate);
r14729r14730
17601766   }
17611767   else
17621768   {
1763      UINT32 ea = GetEA(cpustate, modrm, 0);
17641769      UINT64 m64real = READ64(cpustate, ea);
17651770
17661771      floatx80 a = ST(0);
r14729r14730
18861891{
18871892   floatx80 result;
18881893
1894   UINT32 ea = GetEA(cpustate, modrm, 0);
18891895   if (X87_IS_ST_EMPTY(0))
18901896   {
18911897      x87_set_stack_underflow(cpustate);
r14729r14730
18931899   }
18941900   else
18951901   {
1896      UINT32 ea = GetEA(cpustate, modrm, 0);
18971902      INT32 m32int = READ32(cpustate, ea);
18981903
18991904      floatx80 a = ST(0);
r14729r14730
19201925{
19211926   floatx80 result;
19221927
1928   UINT32 ea = GetEA(cpustate, modrm, 0);
19231929   if (X87_IS_ST_EMPTY(0))
19241930   {
19251931      x87_set_stack_underflow(cpustate);
r14729r14730
19271933   }
19281934   else
19291935   {
1930      UINT32 ea = GetEA(cpustate, modrm, 0);
19311936      INT16 m16int = READ16(cpustate, ea);
19321937
19331938      floatx80 a = ST(0);
r14729r14730
23322337{
23332338   floatx80 value;
23342339
2340   UINT32 ea = GetEA(cpustate, modrm, 0);
23352341   if (x87_dec_stack(cpustate))
23362342   {
2337      UINT32 ea = GetEA(cpustate, modrm, 0);
23382343      UINT32 m32real = READ32(cpustate, ea);
23392344
23402345      value = float32_to_floatx80(m32real);
r14729r14730
23622367{
23632368   floatx80 value;
23642369
2370   UINT32 ea = GetEA(cpustate, modrm, 0);
23652371   if (x87_dec_stack(cpustate))
23662372   {
2367      UINT32 ea = GetEA(cpustate, modrm, 0);
23682373      UINT64 m64real = READ64(cpustate, ea);
23692374
23702375      value = float64_to_floatx80(m64real);
r14729r14730
23922397{
23932398   floatx80 value;
23942399
2400   UINT32 ea = GetEA(cpustate, modrm, 0);
23952401   if (x87_dec_stack(cpustate))
23962402   {
23972403      cpustate->x87_sw &= ~X87_SW_C1;
2398      UINT32 ea = GetEA(cpustate, modrm, 0);
23992404      value = READ80(cpustate, ea);
24002405   }
24012406   else
r14729r14730
24332438{
24342439   floatx80 value;
24352440
2441   UINT32 ea = GetEA(cpustate, modrm, 0);
24362442   if (!x87_dec_stack(cpustate))
24372443   {
24382444      value = fx80_inan;
r14729r14730
24412447   {
24422448      cpustate->x87_sw &= ~X87_SW_C1;
24432449
2444      UINT32 ea = GetEA(cpustate, modrm, 0);
24452450      INT16 m16int = READ16(cpustate, ea);
24462451      value = int32_to_floatx80(m16int);
24472452   }
r14729r14730
24562461{
24572462   floatx80 value;
24582463
2464   UINT32 ea = GetEA(cpustate, modrm, 0);
24592465   if (!x87_dec_stack(cpustate))
24602466   {
24612467      value = fx80_inan;
r14729r14730
24642470   {
24652471      cpustate->x87_sw &= ~X87_SW_C1;
24662472
2467      UINT32 ea = GetEA(cpustate, modrm, 0);
24682473      INT32 m32int = READ32(cpustate, ea);
24692474      value = int32_to_floatx80(m32int);
24702475   }
r14729r14730
24792484{
24802485   floatx80 value;
24812486
2487   UINT32 ea = GetEA(cpustate, modrm, 0);
24822488   if (!x87_dec_stack(cpustate))
24832489   {
24842490      value = fx80_inan;
r14729r14730
24872493   {
24882494      cpustate->x87_sw &= ~X87_SW_C1;
24892495
2490      UINT32 ea = GetEA(cpustate, modrm, 0);
24912496      INT64 m64int = READ64(cpustate, ea);
24922497      value = int64_to_floatx80(m64int);
24932498   }
r14729r14730
25022507{
25032508   floatx80 value;
25042509
2510   UINT32 ea = GetEA(cpustate, modrm, 0);
25052511   if (!x87_dec_stack(cpustate))
25062512   {
25072513      value = fx80_inan;
r14729r14730
25102516   {
25112517      cpustate->x87_sw &= ~X87_SW_C1;
25122518
2513      UINT32 ea = GetEA(cpustate, modrm, 0);
25142519      UINT64 m64val = 0;
25152520      UINT16 sign;
25162521
r14729r14730
25472552{
25482553   floatx80 value;
25492554
2555   UINT32 ea = GetEA(cpustate, modrm, 1);
25502556   if (X87_IS_ST_EMPTY(0))
25512557   {
25522558      x87_set_stack_underflow(cpustate);
r14729r14730
25612567   if (x87_check_exceptions(cpustate))
25622568   {
25632569      UINT32 m32real = floatx80_to_float32(value);
2564      UINT32 ea = GetEA(cpustate, modrm, 1);
25652570      WRITE32(cpustate, ea, m32real);
25662571   }
25672572
r14729r14730
25722577{
25732578   floatx80 value;
25742579
2580   UINT32 ea = GetEA(cpustate, modrm, 1);
25752581   if (X87_IS_ST_EMPTY(0))
25762582   {
25772583      x87_set_stack_underflow(cpustate);
r14729r14730
25862592   if (x87_check_exceptions(cpustate))
25872593   {
25882594      UINT64 m64real = floatx80_to_float64(value);
2589      UINT32 ea = GetEA(cpustate, modrm, 1);
25902595      WRITE64(cpustate, ea, m64real);
25912596   }
25922597
r14729r14730
26192624{
26202625   floatx80 value;
26212626
2627   UINT32 ea = GetEA(cpustate, modrm, 1);
26222628   if (X87_IS_ST_EMPTY(0))
26232629   {
26242630      x87_set_stack_underflow(cpustate);
r14729r14730
26332639   if (x87_check_exceptions(cpustate))
26342640   {
26352641      UINT32 m32real = floatx80_to_float32(value);
2636      UINT32 ea = GetEA(cpustate, modrm, 1);
26372642      WRITE32(cpustate, ea, m32real);
26382643      x87_inc_stack(cpustate);
26392644   }
r14729r14730
26572662   }
26582663
26592664
2665   UINT32 ea = GetEA(cpustate, modrm, 1);
26602666   if (x87_check_exceptions(cpustate))
26612667   {
26622668      UINT64 m64real = floatx80_to_float64(value);
2663      UINT32 ea = GetEA(cpustate, modrm, 1);
26642669      WRITE64(cpustate, ea, m64real);
26652670      x87_inc_stack(cpustate);
26662671   }
r14729r14730
26832688      value = ST(0);
26842689   }
26852690
2691   UINT32 ea = GetEA(cpustate, modrm, 1);
26862692   if (x87_check_exceptions(cpustate))
26872693   {
2688      UINT32 ea = GetEA(cpustate, modrm, 1);
26892694      WRITE80(cpustate, ea, value);
26902695      x87_inc_stack(cpustate);
26912696   }
r14729r14730
27422747         m16int = -32768;
27432748   }
27442749
2750   UINT32 ea = GetEA(cpustate, modrm, 1);
27452751   if (x87_check_exceptions(cpustate))
27462752   {
2747      UINT32 ea = GetEA(cpustate, modrm, 1);
27482753      WRITE16(cpustate, ea, m16int);
27492754   }
27502755
r14729r14730
27752780         m32int = 0x80000000;
27762781   }
27772782
2783   UINT32 ea = GetEA(cpustate, modrm, 1);
27782784   if (x87_check_exceptions(cpustate))
27792785   {
2780      UINT32 ea = GetEA(cpustate, modrm, 1);
27812786      WRITE32(cpustate, ea, m32int);
27822787   }
27832788
r14729r14730
28082813         m16int = (UINT16)0x8000;
28092814   }
28102815
2816   UINT32 ea = GetEA(cpustate, modrm, 1);
28112817   if (x87_check_exceptions(cpustate))
28122818   {
2813      UINT32 ea = GetEA(cpustate, modrm, 1);
28142819      WRITE16(cpustate, ea, m16int);
28152820      x87_inc_stack(cpustate);
28162821   }
r14729r14730
28422847         m32int = 0x80000000;
28432848   }
28442849
2850   UINT32 ea = GetEA(cpustate, modrm, 1);
28452851   if (x87_check_exceptions(cpustate))
28462852   {
2847      UINT32 ea = GetEA(cpustate, modrm, 1);
28482853      WRITE32(cpustate, ea, m32int);
28492854      x87_inc_stack(cpustate);
28502855   }
r14729r14730
28762881         m64int = U64(0x8000000000000000);
28772882   }
28782883
2884   UINT32 ea = GetEA(cpustate, modrm, 1);
28792885   if (x87_check_exceptions(cpustate))
28802886   {
2881      UINT32 ea = GetEA(cpustate, modrm, 1);
28822887      WRITE64(cpustate, ea, m64int);
28832888      x87_inc_stack(cpustate);
28842889   }
r14729r14730
29112916      result.high |= ST(0).high & 0x8000;
29122917   }
29132918
2919   UINT32 ea = GetEA(cpustate, modrm, 1);
29142920   if (x87_check_exceptions(cpustate))
29152921   {
2916      UINT32 ea = GetEA(cpustate, modrm, 1);
29172922      WRITE80(cpustate, ea, result);
29182923      x87_inc_stack(cpustate);
29192924   }
r14729r14730
33853390
33863391void x87_ficom_m16int(i386_state *cpustate, UINT8 modrm)
33873392{
3393   UINT32 ea = GetEA(cpustate, modrm, 0);
33883394   if (X87_IS_ST_EMPTY(0))
33893395   {
33903396      x87_set_stack_underflow(cpustate);
r14729r14730
33943400   {
33953401      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
33963402
3397      UINT32 ea = GetEA(cpustate, modrm, 0);
33983403      INT16 m16int = READ16(cpustate, ea);
33993404
34003405      floatx80 a = ST(0);
r14729r14730
34223427
34233428void x87_ficom_m32int(i386_state *cpustate, UINT8 modrm)
34243429{
3430   UINT32 ea = GetEA(cpustate, modrm, 0);
34253431   if (X87_IS_ST_EMPTY(0))
34263432   {
34273433      x87_set_stack_underflow(cpustate);
r14729r14730
34313437   {
34323438      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
34333439
3434      UINT32 ea = GetEA(cpustate, modrm, 0);
34353440      INT32 m32int = READ32(cpustate, ea);
34363441
34373442      floatx80 a = ST(0);
r14729r14730
34593464
34603465void x87_ficomp_m16int(i386_state *cpustate, UINT8 modrm)
34613466{
3467   UINT32 ea = GetEA(cpustate, modrm, 0);
34623468   if (X87_IS_ST_EMPTY(0))
34633469   {
34643470      x87_set_stack_underflow(cpustate);
r14729r14730
34683474   {
34693475      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
34703476
3471      UINT32 ea = GetEA(cpustate, modrm, 0);
34723477      INT16 m16int = READ16(cpustate, ea);
34733478
34743479      floatx80 a = ST(0);
r14729r14730
34973502
34983503void x87_ficomp_m32int(i386_state *cpustate, UINT8 modrm)
34993504{
3505   UINT32 ea = GetEA(cpustate, modrm, 0);
35003506   if (X87_IS_ST_EMPTY(0))
35013507   {
35023508      x87_set_stack_underflow(cpustate);
r14729r14730
35063512   {
35073513      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
35083514
3509      UINT32 ea = GetEA(cpustate, modrm, 0);
35103515      INT32 m32int = READ32(cpustate, ea);
35113516
35123517      floatx80 a = ST(0);
r14729r14730
35363541
35373542void x87_fcom_m32real(i386_state *cpustate, UINT8 modrm)
35383543{
3544   UINT32 ea = GetEA(cpustate, modrm, 0);
35393545   if (X87_IS_ST_EMPTY(0))
35403546   {
35413547      x87_set_stack_underflow(cpustate);
r14729r14730
35453551   {
35463552      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
35473553
3548      UINT32 ea = GetEA(cpustate, modrm, 0);
35493554      UINT32 m32real = READ32(cpustate, ea);
35503555
35513556      floatx80 a = ST(0);
r14729r14730
35733578
35743579void x87_fcom_m64real(i386_state *cpustate, UINT8 modrm)
35753580{
3581   UINT32 ea = GetEA(cpustate, modrm, 0);
35763582   if (X87_IS_ST_EMPTY(0))
35773583   {
35783584      x87_set_stack_underflow(cpustate);
r14729r14730
35823588   {
35833589      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
35843590
3585      UINT32 ea = GetEA(cpustate, modrm, 0);
35863591      UINT64 m64real = READ64(cpustate, ea);
35873592
35883593      floatx80 a = ST(0);
r14729r14730
36463651
36473652void x87_fcomp_m32real(i386_state *cpustate, UINT8 modrm)
36483653{
3654   UINT32 ea = GetEA(cpustate, modrm, 0);
36493655   if (X87_IS_ST_EMPTY(0))
36503656   {
36513657      x87_set_stack_underflow(cpustate);
r14729r14730
36553661   {
36563662      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
36573663
3658      UINT32 ea = GetEA(cpustate, modrm, 0);
36593664      UINT32 m32real = READ32(cpustate, ea);
36603665
36613666      floatx80 a = ST(0);
r14729r14730
36843689
36853690void x87_fcomp_m64real(i386_state *cpustate, UINT8 modrm)
36863691{
3692   UINT32 ea = GetEA(cpustate, modrm, 0);
36873693   if (X87_IS_ST_EMPTY(0))
36883694   {
36893695      x87_set_stack_underflow(cpustate);
r14729r14730
36933699   {
36943700      cpustate->x87_sw &= ~(X87_SW_C3 | X87_SW_C2 | X87_SW_C1 | X87_SW_C0);
36953701
3696      UINT32 ea = GetEA(cpustate, modrm, 0);
36973702      UINT64 m64real = READ64(cpustate, ea);
36983703
36993704      floatx80 a = ST(0);
src/emu/cpu/i386/i386.c
r14729r14730
3434
3535#define INT_DEBUG   1
3636
37static void i386_load_protected_mode_segment(i386_state *cpustate, I386_SREG *seg )
37static UINT32 i386_load_protected_mode_segment(i386_state *cpustate, I386_SREG *seg, UINT64 *desc )
3838{
3939   UINT32 v1,v2;
4040   UINT32 base, limit;
r14729r14730
5151
5252   entry = seg->selector & ~0x7;
5353   if (limit == 0 || entry + 7 > limit)
54      return;
54      return 0;
5555
5656   v1 = READ32(cpustate, base + entry );
5757   v2 = READ32(cpustate, base + entry + 4 );
r14729r14730
6363      seg->limit = (seg->limit << 12) | 0xfff;
6464   seg->d = (seg->flags & 0x4000) ? 1 : 0;
6565   seg->valid = (seg->selector & ~3)?(true):(false);
66
67   if(desc)
68      *desc = ((UINT64)v2<<32)|v1;
69   return 1;
6670}
6771
6872static void i386_load_call_gate(i386_state* cpustate, I386_CALL_GATE *gate)
r14729r14730
101105   if (PROTECTED_MODE)
102106   {
103107      if (!V8086_MODE)
104         i386_load_protected_mode_segment(cpustate, &cpustate->sreg[segment] );
108         i386_load_protected_mode_segment(cpustate, &cpustate->sreg[segment], NULL );
105109      else
106110      {
107111         cpustate->sreg[segment].base = cpustate->sreg[segment].selector << 4;
r14729r14730
358362
359363   memset(&desc, 0, sizeof(desc));
360364   desc.selector = selector;
361   i386_load_protected_mode_segment(cpustate,&desc);
365   i386_load_protected_mode_segment(cpustate,&desc,NULL);
362366   DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
363367   RPL = selector & 0x03;
364368
r14729r14730
401405   {
402406      if((cpustate->sreg[seg].flags & 0x0018) == 0x0010 && cpustate->sreg[seg].flags & 0x0004) // if expand-down data segment
403407      {
404         if(offset <= cpustate->sreg[seg].limit)
408         // compare if greater then 0xffffffff when we're passed the access size
409         if((offset <= cpustate->sreg[seg].limit) || ((cpustate->sreg[seg].d)?0:(offset > 0xffff)))
405410         {
406411            logerror("Limit check at 0x%08x failed. Segment %04x, limit %08x, offset %08x (expand-down)\n",cpustate->pc,cpustate->sreg[seg].selector,cpustate->sreg[seg].limit,offset);
407412            return 1;
r14729r14730
433438
434439      memset(&stack, 0, sizeof(stack));
435440      stack.selector = selector;
436      i386_load_protected_mode_segment(cpustate,&stack);
441      i386_load_protected_mode_segment(cpustate,&stack,NULL);
437442      DPL = (stack.flags >> 5) & 0x03;
438443
439444      if((selector & ~0x0003) == 0)
r14729r14730
491496
492497      memset(&desc, 0, sizeof(desc));
493498      desc.selector = selector;
494      i386_load_protected_mode_segment(cpustate,&desc);
499      i386_load_protected_mode_segment(cpustate,&desc,NULL);
495500      DPL = (desc.flags >> 5) & 0x03;
496501
497502      if(selector & 0x0004)  // LDT
r14729r14730
692697         /* Task gate */
693698         memset(&desc, 0, sizeof(desc));
694699         desc.selector = segment;
695         i386_load_protected_mode_segment(cpustate,&desc);
700         i386_load_protected_mode_segment(cpustate,&desc,NULL);
696701         if(segment & 0x04)
697702         {
698703            logerror("IRQ: Task gate: TSS is not in the GDT.\n");
r14729r14730
729734         /* Interrupt or Trap gate */
730735         memset(&desc, 0, sizeof(desc));
731736         desc.selector = segment;
732         i386_load_protected_mode_segment(cpustate,&desc);
737         i386_load_protected_mode_segment(cpustate,&desc,NULL);
733738         CPL = cpustate->CPL;  // current privilege level
734739         DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
735740//          RPL = segment & 0x03;  // requested privilege level
r14729r14730
777782               stack.selector = i386_get_stack_segment(cpustate,DPL);
778783            else
779784               stack.selector = i286_get_stack_segment(cpustate,DPL);
780            i386_load_protected_mode_segment(cpustate,&stack);
785            i386_load_protected_mode_segment(cpustate,&stack,NULL);
781786            oldSS = cpustate->sreg[SS].selector;
782787            if(flags & 0x0008)
783788               oldESP = REG32(ESP);
r14729r14730
10111016   cpustate->task.segment = selector;
10121017   memset(&seg, 0, sizeof(seg));
10131018   seg.selector = cpustate->task.segment;
1014   i386_load_protected_mode_segment(cpustate,&seg);
1019   i386_load_protected_mode_segment(cpustate,&seg,NULL);
10151020   cpustate->task.limit = seg.limit;
10161021   cpustate->task.base = seg.base;
10171022   cpustate->task.flags = seg.flags;
r14729r14730
10231028   tss = cpustate->task.base;
10241029   cpustate->ldtr.segment = READ16(cpustate,tss+0x2a) & 0xffff;
10251030   seg.selector = cpustate->ldtr.segment;
1026   i386_load_protected_mode_segment(cpustate,&seg);
1031   i386_load_protected_mode_segment(cpustate,&seg,NULL);
10271032   cpustate->ldtr.limit = seg.limit;
10281033   cpustate->ldtr.base = seg.base;
10291034   cpustate->ldtr.flags = seg.flags;
r14729r14730
11211126   cpustate->task.segment = selector;
11221127   memset(&seg, 0, sizeof(seg));
11231128   seg.selector = cpustate->task.segment;
1124   i386_load_protected_mode_segment(cpustate,&seg);
1129   i386_load_protected_mode_segment(cpustate,&seg,NULL);
11251130   cpustate->task.limit = seg.limit;
11261131   cpustate->task.base = seg.base;
11271132   cpustate->task.flags = seg.flags;
r14729r14730
11331138   tss = cpustate->task.base;
11341139   cpustate->ldtr.segment = READ32(cpustate,tss+0x60) & 0xffff;
11351140   seg.selector = cpustate->ldtr.segment;
1136   i386_load_protected_mode_segment(cpustate,&seg);
1141   i386_load_protected_mode_segment(cpustate,&seg,NULL);
11371142   cpustate->ldtr.limit = seg.limit;
11381143   cpustate->ldtr.base = seg.base;
11391144   cpustate->ldtr.flags = seg.flags;
r14729r14730
12331238   /* Determine segment type */
12341239   memset(&desc, 0, sizeof(desc));
12351240   desc.selector = segment;
1236   i386_load_protected_mode_segment(cpustate,&desc);
1241   i386_load_protected_mode_segment(cpustate,&desc,NULL);
12371242   CPL = cpustate->CPL;  // current privilege level
12381243   DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
12391244   RPL = segment & 0x03;  // requested privilege level
r14729r14730
12911296            logerror("JMP: Available 386 TSS at %08x\n",cpustate->pc);
12921297            memset(&desc, 0, sizeof(desc));
12931298            desc.selector = segment;
1294            i386_load_protected_mode_segment(cpustate,&desc);
1299            i386_load_protected_mode_segment(cpustate,&desc,NULL);
12951300            DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
12961301            if(DPL < CPL)
12971302            {
r14729r14730
13621367               }
13631368            }
13641369            desc.selector = call_gate.selector;
1365            i386_load_protected_mode_segment(cpustate,&desc);
1370            i386_load_protected_mode_segment(cpustate,&desc,NULL);
13661371            DPL = (desc.flags >> 5) & 0x03;
13671372            if((desc.flags & 0x0018) != 0x18)
13681373            {
r14729r14730
14211426            }
14221427            /* Check the TSS that the task gate points to */
14231428            desc.selector = call_gate.selector;
1424            i386_load_protected_mode_segment(cpustate,&desc);
1429            i386_load_protected_mode_segment(cpustate,&desc,NULL);
14251430            DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
14261431            RPL = call_gate.selector & 0x03;  // requested privilege level
14271432            if(call_gate.selector & 0x04)
r14729r14730
15071512   /* Determine segment type */
15081513   memset(&desc, 0, sizeof(desc));
15091514   desc.selector = selector;
1510   i386_load_protected_mode_segment(cpustate,&desc);
1515   i386_load_protected_mode_segment(cpustate,&desc,NULL);
15111516   CPL = cpustate->CPL;  // current privilege level
15121517   DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
15131518   RPL = selector & 0x03;  // requested privilege level
r14729r14730
16531658                  FAULT(FAULT_GP,desc.selector & ~0x03)  // #GP(selector)
16541659               }
16551660            }
1656            i386_load_protected_mode_segment(cpustate,&desc);
1661            i386_load_protected_mode_segment(cpustate,&desc,NULL);
16571662            if((desc.flags & 0x0018) != 0x18)
16581663            {
16591664               logerror("CALL: Call gate: Segment is not a code segment.\n");
r14729r14730
16821687                  stack.selector = i386_get_stack_segment(cpustate,DPL);
16831688               else
16841689                  stack.selector = i286_get_stack_segment(cpustate,DPL);
1685               i386_load_protected_mode_segment(cpustate,&stack);
1690               i386_load_protected_mode_segment(cpustate,&stack,NULL);
16861691               if((stack.selector & ~0x07) == 0)
16871692               {
16881693                  logerror("CALL: Call gate: TSS selector is null\n");
r14729r14730
17861791
17871792               memset(&temp, 0, sizeof(temp));
17881793               temp.selector = oldSS;
1789               i386_load_protected_mode_segment(cpustate,&temp);
1794               i386_load_protected_mode_segment(cpustate,&temp,NULL);
17901795               /* copy parameters from old stack to new stack */
17911796               for(x=(gate.dword_count & 0x1f)-1;x>=0;x--)
17921797               {
r14729r14730
18501855            }
18511856            /* Check the TSS that the task gate points to */
18521857            desc.selector = gate.selector;
1853            i386_load_protected_mode_segment(cpustate,&desc);
1858            i386_load_protected_mode_segment(cpustate,&desc,NULL);
18541859            if(gate.selector & 0x04)
18551860            {
18561861               logerror("CALL: Task Gate: TSS is not global.\n");
r14729r14730
19331938
19341939   memset(&desc, 0, sizeof(desc));
19351940   desc.selector = newCS;
1936   i386_load_protected_mode_segment(cpustate,&desc);
1941   i386_load_protected_mode_segment(cpustate,&desc,NULL);
19371942   CPL = cpustate->CPL;  // current privilege level
19381943   DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
19391944   RPL = newCS & 0x03;
r14729r14730
21132118
21142119      /* Check SS selector and descriptor */
21152120      desc.selector = newSS;
2116      i386_load_protected_mode_segment(cpustate,&desc);
2121      i386_load_protected_mode_segment(cpustate,&desc,NULL);
21172122      DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
21182123      if((newSS & ~0x07) == 0)
21192124      {
r14729r14730
22522257      }
22532258      memset(&desc, 0, sizeof(desc));
22542259      desc.selector = task;
2255      i386_load_protected_mode_segment(cpustate,&desc);
2260      i386_load_protected_mode_segment(cpustate,&desc,NULL);
22562261      if((desc.flags & 0x001f) != 0x000b)
22572262      {
22582263         logerror("IRET (%08x): Task return: Back-linked TSS is not a busy TSS.\n",cpustate->pc);
r14729r14730
22862291         }
22872292         memset(&desc, 0, sizeof(desc));
22882293         desc.selector = newCS;
2289         i386_load_protected_mode_segment(cpustate,&desc);
2294         i386_load_protected_mode_segment(cpustate,&desc,NULL);
22902295         DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
22912296         RPL = newCS & 0x03;
22922297         memset(&stack, 0, sizeof(stack));
22932298         stack.selector = newSS;
2294         i386_load_protected_mode_segment(cpustate,&stack);
2299         i386_load_protected_mode_segment(cpustate,&stack,NULL);
22952300         //SSRPL = newSS & 0x03;
22962301         //SSDPL = (stack.flags >> 5) & 0x03;
22972302
r14729r14730
25022507            }
25032508            memset(&desc, 0, sizeof(desc));
25042509            desc.selector = newCS;
2505            i386_load_protected_mode_segment(cpustate,&desc);
2510            i386_load_protected_mode_segment(cpustate,&desc,NULL);
25062511            DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
25072512            RPL = newCS & 0x03;
25082513            if((desc.flags & 0x0018) != 0x0018)
r14729r14730
25632568            /* return to outer privilege level */
25642569            memset(&desc, 0, sizeof(desc));
25652570            desc.selector = newCS;
2566            i386_load_protected_mode_segment(cpustate,&desc);
2571            i386_load_protected_mode_segment(cpustate,&desc,NULL);
25672572            DPL = (desc.flags >> 5) & 0x03;  // descriptor privilege level
25682573            RPL = newCS & 0x03;
25692574            if(operand32 == 0)
r14729r14730
26462651            }
26472652            memset(&stack, 0, sizeof(stack));
26482653            stack.selector = newSS;
2649            i386_load_protected_mode_segment(cpustate,&stack);
2654            i386_load_protected_mode_segment(cpustate,&stack,NULL);
26502655            DPL = (stack.flags >> 5) & 0x03;
26512656            if((newSS & ~0x03) == 0)
26522657            {
r14729r14730
28522857   {
28532858      memset(&seg, 0, sizeof(seg));
28542859      seg.selector = (UINT16) param[0];
2855      i386_load_protected_mode_segment(cpustate,&seg);
2860      i386_load_protected_mode_segment(cpustate,&seg,NULL);
28562861      result = seg.base;
28572862   }
28582863   else
r14729r14730
28732878   {
28742879      memset(&seg, 0, sizeof(seg));
28752880      seg.selector = (UINT16) param[0];
2876      i386_load_protected_mode_segment(cpustate,&seg);
2881      i386_load_protected_mode_segment(cpustate,&seg,NULL);
28772882      result = seg.limit;
28782883   }
28792884   return result;
r14729r14730
31393144         if(cpustate->TF && cpustate->old_tf)
31403145         {
31413146            cpustate->prev_eip = cpustate->eip;
3142            cpustate->ext = 0;
3147            cpustate->ext = 1;
31433148            i386_trap(cpustate,1,0,0);
31443149         }
31453150
src/emu/cpu/i386/i386ops.c
r14729r14730
6262      switch( (modrm >> 3) & 0x7 )
6363      {
6464         case 0:         /* ROL rm8, i8 */
65            if(!(shift & 7))
66            {
67               if(shift & 0x18)
68               {
69                  cpustate->CF = src & 1;
70                  cpustate->OF = (src & 1) ^ ((src >> 7) & 1);
71               }
72               break;
73            }
74            shift &= 7;
6575            dst = ((src & ((UINT8)0xff >> shift)) << shift) |
6676                 ((src & ((UINT8)0xff << (8-shift))) >> (8-shift));
67            cpustate->CF = (src >> (8-shift)) & 0x1;
77            cpustate->CF = dst & 0x1;
78            cpustate->OF = (dst & 1) ^ (dst >> 7);
6879            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
6980            break;
7081         case 1:         /* ROR rm8, i8 */
82            if(!(shift & 7))
83            {
84               if(shift & 0x18)
85               {
86                  cpustate->CF = (src >> 7) & 1;
87                  cpustate->OF = ((src >> 7) & 1) ^ ((src >> 6) & 1);
88               }
89               break;
90            }
91            shift &= 7;
7192            dst = ((src & ((UINT8)0xff << shift)) >> shift) |
7293                 ((src & ((UINT8)0xff >> (8-shift))) << (8-shift));
73            cpustate->CF = (src >> (shift-1)) & 0x1;
94            cpustate->CF = (dst >> 7) & 1;
95            cpustate->OF = ((dst >> 7) ^ (dst >> 6)) & 1;
7496            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
7597            break;
7698         case 2:         /* RCL rm8, i8 */
99            shift %= 9;
77100            dst = ((src & ((UINT8)0xff >> shift)) << shift) |
78101                 ((src & ((UINT8)0xff << (9-shift))) >> (9-shift)) |
79102                 (cpustate->CF << (shift-1));
80            cpustate->CF = (src >> (8-shift)) & 0x1;
103            if(shift) cpustate->CF = (src >> (8-shift)) & 0x1;
104            cpustate->OF = cpustate->CF ^ ((dst >> 7) & 1);
81105            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
82106            break;
83107         case 3:         /* RCR rm8, i8 */
108            shift %= 9;
84109            dst = ((src & ((UINT8)0xff << shift)) >> shift) |
85110                 ((src & ((UINT8)0xff >> (8-shift))) << (9-shift)) |
86111                 (cpustate->CF << (8-shift));
87            cpustate->CF = (src >> (shift-1)) & 0x1;
112            if(shift) cpustate->CF = (src >> (shift-1)) & 0x1;
113            cpustate->OF = ((dst >> 7) ^ (dst >> 6)) & 1;
88114            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
89115            break;
90116         case 4:         /* SHL/SAL rm8, i8 */
91117         case 6:
118            shift &= 31;
92119            dst = src << shift;
93            cpustate->CF = (src & (1 << (8-shift))) ? 1 : 0;
120            cpustate->CF = (src >> (8 - shift)) & 0x1;
94121            SetSZPF8(dst);
95122            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
96123            break;
97124         case 5:         /* SHR rm8, i8 */
125            shift &= 31;
98126            dst = src >> shift;
99127            cpustate->CF = (src & (1 << (shift-1))) ? 1 : 0;
100128            SetSZPF8(dst);
101129            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
102130            break;
103131         case 7:         /* SAR rm8, i8 */
132            shift &= 31;
104133            dst = (INT8)src >> shift;
105134            cpustate->CF = (src & (1 << (shift-1))) ? 1 : 0;
106135            SetSZPF8(dst);
r14729r14730
11891218   {
11901219      cpustate->eip = repeated_eip;
11911220      cpustate->pc = repeated_pc;
1192      I386OP(decode_opcode)(cpustate);
1221      try
1222      {
1223         I386OP(decode_opcode)(cpustate);
1224      }
1225      catch (UINT64 e)
1226      {
1227         cpustate->eip = cpustate->prev_eip;
1228         throw e;
1229      }
1230
11931231      CYCLES_NUM(cycle_adjustment);
11941232
11951233      if (cpustate->address_size)
r14729r14730
20742112                     cpustate->CF = 1;
20752113               }
20762114            } else {
2077               cpustate->ext = 0;
20782115               i386_trap(cpustate, 0, 0, 0);
2079               cpustate->ext = 1;
20802116            }
20812117         }
20822118         break;
r14729r14730
21082144                     cpustate->CF = 1;
21092145               }
21102146            } else {
2111               cpustate->ext = 0;
21122147               i386_trap(cpustate, 0, 0, 0);
2113               cpustate->ext = 1;
21142148            }
21152149         }
21162150         break;
src/emu/cpu/i386/i486ops.c
r14729r14730
6767      UINT8 src = LOAD_REG8(modrm);
6868
6969      if( REG8(AL) == dst ) {
70         WRITE8(cpustate,modrm, src);
70         WRITE8(cpustate,ea, src);
7171         cpustate->ZF = 1;
7272         CYCLES(cpustate,CYCLES_CMPXCHG_REG_MEM_T);
7373      } else {
r14729r14730
100100      UINT16 src = LOAD_REG16(modrm);
101101
102102      if( REG16(AX) == dst ) {
103         WRITE16(cpustate,modrm, src);
103         WRITE16(cpustate,ea, src);
104104         cpustate->ZF = 1;
105105         CYCLES(cpustate,CYCLES_CMPXCHG_REG_MEM_T);
106106      } else {
r14729r14730
150150   if( modrm >= 0xc0 ) {
151151      UINT8 dst = LOAD_RM8(modrm);
152152      UINT8 src = LOAD_REG8(modrm);
153      STORE_RM16(modrm, dst + src);
154      STORE_REG16(modrm, dst);
153      STORE_REG8(modrm, dst);
154      STORE_RM8(modrm, dst + src);
155155      CYCLES(cpustate,CYCLES_XADD_REG_REG);
156156   } else {
157157      UINT32 ea = GetEA(cpustate,modrm,1);
r14729r14730
169169   if( modrm >= 0xc0 ) {
170170      UINT16 dst = LOAD_RM16(modrm);
171171      UINT16 src = LOAD_REG16(modrm);
172      STORE_REG16(modrm, dst);
172173      STORE_RM16(modrm, dst + src);
173      STORE_REG16(modrm, dst);
174174      CYCLES(cpustate,CYCLES_XADD_REG_REG);
175175   } else {
176176      UINT32 ea = GetEA(cpustate,modrm,1);
r14729r14730
188188   if( modrm >= 0xc0 ) {
189189      UINT32 dst = LOAD_RM32(modrm);
190190      UINT32 src = LOAD_REG32(modrm);
191      STORE_REG32(modrm, dst);
191192      STORE_RM32(modrm, dst + src);
192      STORE_REG32(modrm, dst);
193193      CYCLES(cpustate,CYCLES_XADD_REG_REG);
194194   } else {
195195      UINT32 ea = GetEA(cpustate,modrm,1);
src/emu/cpu/i386/i386op32.c
r14729r14730
5959      }
6060
6161   } else {
62
62      shift &= 31;
6363      switch( (modrm >> 3) & 0x7 )
6464      {
6565         case 0:         /* ROL rm32, i8 */
6666            dst = ((src & ((UINT32)0xffffffff >> shift)) << shift) |
6767                 ((src & ((UINT32)0xffffffff << (32-shift))) >> (32-shift));
68            cpustate->CF = (src >> (32-shift)) & 0x1;
68            cpustate->CF = dst & 0x1;
69            cpustate->OF = (dst & 1) ^ (dst >> 31);
6970            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
7071            break;
7172         case 1:         /* ROR rm32, i8 */
7273            dst = ((src & ((UINT32)0xffffffff << shift)) >> shift) |
7374                 ((src & ((UINT32)0xffffffff >> (32-shift))) << (32-shift));
74            cpustate->CF = (src >> (shift-1)) & 0x1;
75            cpustate->CF = (dst >> 31) & 0x1;
76            cpustate->OF = ((dst >> 31) ^ (dst >> 30)) & 1;
7577            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_REG, CYCLES_ROTATE_MEM);
7678            break;
7779         case 2:         /* RCL rm32, i8 */
r14729r14730
7981                 ((src & ((UINT32)0xffffffff << (33-shift))) >> (33-shift)) |
8082                 (cpustate->CF << (shift-1));
8183            cpustate->CF = (src >> (32-shift)) & 0x1;
84            cpustate->OF = cpustate->CF ^ ((dst >> 31) & 1);
8285            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
8386            break;
8487         case 3:         /* RCR rm32, i8 */
r14729r14730
8689                 ((src & ((UINT32)0xffffffff >> (32-shift))) << (33-shift)) |
8790                 (cpustate->CF << (32-shift));
8891            cpustate->CF = (src >> (shift-1)) & 0x1;
92            cpustate->OF = ((dst >> 31) ^ (dst >> 30)) & 1;
8993            CYCLES_RM(cpustate,modrm, CYCLES_ROTATE_CARRY_REG, CYCLES_ROTATE_CARRY_MEM);
9094            break;
9195         case 4:         /* SHL/SAL rm32, i8 */
r14729r14730
340344      UINT32 ea = GetEA(cpustate,modrm,0);
341345      UINT32 bit = LOAD_REG32(modrm);
342346      ea += 4*(bit/32);
347      ea = (cpustate->address_size)?ea:(ea&0xffff);
343348      bit %= 32;
344349      UINT32 dst = READ32(cpustate,ea);
345350
r14729r14730
371376      UINT32 ea = GetEA(cpustate,modrm,1);
372377      UINT32 bit = LOAD_REG32(modrm);
373378      ea += 4*(bit/32);
379      ea = (cpustate->address_size)?ea:(ea&0xffff);
374380      bit %= 32;
375381      UINT32 dst = READ32(cpustate,ea);
376382
r14729r14730
404410      UINT32 ea = GetEA(cpustate,modrm,1);
405411      UINT32 bit = LOAD_REG32(modrm);
406412      ea += 4*(bit/32);
413      ea = (cpustate->address_size)?ea:(ea&0xffff);
407414      bit %= 32;
408415      UINT32 dst = READ32(cpustate,ea);
409416
r14729r14730
437444      UINT32 ea = GetEA(cpustate,modrm,1);
438445      UINT32 bit = LOAD_REG32(modrm);
439446      ea += 4*(bit/32);
447      ea = (cpustate->address_size)?ea:(ea&0xffff);
440448      bit %= 32;
441449      UINT32 dst = READ32(cpustate,ea);
442450
r14729r14730
18671875
18681876static void I386OP(shld32_i8)(i386_state *cpustate)         // Opcode 0x0f a4
18691877{
1870   /* TODO: Correct flags */
18711878   UINT8 modrm = FETCH(cpustate);
18721879   if( modrm >= 0xc0 ) {
18731880      UINT32 dst = LOAD_RM32(modrm);
18741881      UINT32 upper = LOAD_REG32(modrm);
18751882      UINT8 shift = FETCH(cpustate);
1876      if( shift > 31 || shift == 0 ) {
1883      shift &= 31;
1884      if( shift == 0 ) {
18771885
18781886      } else {
18791887         cpustate->CF = (dst & (1 << (32-shift))) ? 1 : 0;
18801888         dst = (dst << shift) | (upper >> (32-shift));
1889         cpustate->OF = cpustate->CF ^ (dst >> 31);
18811890         SetSZPF32(dst);
18821891      }
18831892      STORE_RM32(modrm, dst);
r14729r14730
18871896      UINT32 dst = READ32(cpustate,ea);
18881897      UINT32 upper = LOAD_REG32(modrm);
18891898      UINT8 shift = FETCH(cpustate);
1890      if( shift > 31 || shift == 0 ) {
1899      shift &= 31;
1900      if( shift == 0 ) {
18911901
18921902      } else {
18931903         cpustate->CF = (dst & (1 << (32-shift))) ? 1 : 0;
18941904         dst = (dst << shift) | (upper >> (32-shift));
1905         cpustate->OF = cpustate->CF ^ (dst >> 31);
18951906         SetSZPF32(dst);
18961907      }
18971908      WRITE32(cpustate,ea, dst);
r14729r14730
19011912
19021913static void I386OP(shld32_cl)(i386_state *cpustate)         // Opcode 0x0f a5
19031914{
1904   /* TODO: Correct flags */
19051915   UINT8 modrm = FETCH(cpustate);
19061916   if( modrm >= 0xc0 ) {
19071917      UINT32 dst = LOAD_RM32(modrm);
19081918      UINT32 upper = LOAD_REG32(modrm);
19091919      UINT8 shift = REG8(CL);
1910      if( shift > 31 || shift == 0 ) {
1920      shift &= 31;
1921      if( shift == 0 ) {
19111922
19121923      } else {
19131924         cpustate->CF = (dst & (1 << (32-shift))) ? 1 : 0;
19141925         dst = (dst << shift) | (upper >> (32-shift));
1926         cpustate->OF = cpustate->CF ^ (dst >> 31);
19151927         SetSZPF32(dst);
19161928      }
19171929      STORE_RM32(modrm, dst);
r14729r14730
19211933      UINT32 dst = READ32(cpustate,ea);
19221934      UINT32 upper = LOAD_REG32(modrm);
19231935      UINT8 shift = REG8(CL);
1924      if( shift > 31 || shift == 0 ) {
1936      shift &= 31;
1937      if( shift == 0 ) {
19251938
19261939      } else {
19271940         cpustate->CF = (dst & (1 << (32-shift))) ? 1 : 0;
19281941         dst = (dst << shift) | (upper >> (32-shift));
1942         cpustate->OF = cpustate->CF ^ (dst >> 31);
19291943         SetSZPF32(dst);
19301944      }
19311945      WRITE32(cpustate,ea, dst);
r14729r14730
19351949
19361950static void I386OP(shrd32_i8)(i386_state *cpustate)         // Opcode 0x0f ac
19371951{
1938   /* TODO: Correct flags */
19391952   UINT8 modrm = FETCH(cpustate);
19401953   if( modrm >= 0xc0 ) {
19411954      UINT32 dst = LOAD_RM32(modrm);
19421955      UINT32 upper = LOAD_REG32(modrm);
19431956      UINT8 shift = FETCH(cpustate);
1944      if( shift > 31 || shift == 0 ) {
1957      shift &= 31;
1958      if( shift == 0 ) {
19451959
19461960      } else {
19471961         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
19481962         dst = (dst >> shift) | (upper << (32-shift));
1963         cpustate->OF = ((dst >> 31) ^ (dst >> 30)) & 1;
19491964         SetSZPF32(dst);
19501965      }
19511966      STORE_RM32(modrm, dst);
r14729r14730
19551970      UINT32 dst = READ32(cpustate,ea);
19561971      UINT32 upper = LOAD_REG32(modrm);
19571972      UINT8 shift = FETCH(cpustate);
1958      if( shift > 31 || shift == 0 ) {
1973      shift &= 31;
1974      if( shift == 0 ) {
19591975
19601976      } else {
19611977         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
19621978         dst = (dst >> shift) | (upper << (32-shift));
1979         cpustate->OF = ((dst >> 31) ^ (dst >> 30)) & 1;
19631980         SetSZPF32(dst);
19641981      }
19651982      WRITE32(cpustate,ea, dst);
r14729r14730
19691986
19701987static void I386OP(shrd32_cl)(i386_state *cpustate)         // Opcode 0x0f ad
19711988{
1972   /* TODO: Correct flags */
19731989   UINT8 modrm = FETCH(cpustate);
19741990   if( modrm >= 0xc0 ) {
19751991      UINT32 dst = LOAD_RM32(modrm);
19761992      UINT32 upper = LOAD_REG32(modrm);
19771993      UINT8 shift = REG8(CL);
1978      if( shift > 31 || shift == 0 ) {
1994      shift &= 31;
1995      if( shift == 0 ) {
19791996
19801997      } else {
19811998         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
19821999         dst = (dst >> shift) | (upper << (32-shift));
2000         cpustate->OF = ((dst >> 31) ^ (dst >> 30)) & 1;
19832001         SetSZPF32(dst);
19842002      }
19852003      STORE_RM32(modrm, dst);
r14729r14730
19892007      UINT32 dst = READ32(cpustate,ea);
19902008      UINT32 upper = LOAD_REG32(modrm);
19912009      UINT8 shift = REG8(CL);
1992      if( shift > 31 || shift == 0 ) {
2010      shift &= 31;
2011      if( shift == 0 ) {
19932012
19942013      } else {
19952014         cpustate->CF = (dst & (1 << (shift-1))) ? 1 : 0;
19962015         dst = (dst >> shift) | (upper << (32-shift));
2016         cpustate->OF = ((dst >> 31) ^ (dst >> 30)) & 1;
19972017         SetSZPF32(dst);
19982018      }
19992019      WRITE32(cpustate,ea, dst);
r14729r14730
26752695                  REG32(EAX) = (UINT32)result;
26762696               }
26772697            } else {
2678               cpustate->ext = 0;
26792698               i386_trap(cpustate, 0, 0, 0);
2680               cpustate->ext = 1;
26812699            }
26822700         }
26832701         break;
r14729r14730
27052723                  REG32(EAX) = (UINT32)result;
27062724               }
27072725            } else {
2708               cpustate->ext = 0;
27092726               i386_trap(cpustate, 0, 0, 0);
2710               cpustate->ext = 1;
27112727            }
27122728         }
27132729         break;
r14729r14730
29192935            }
29202936            memset(&seg, 0, sizeof(seg));
29212937            seg.selector = cpustate->ldtr.segment;
2922            i386_load_protected_mode_segment(cpustate,&seg);
2938            i386_load_protected_mode_segment(cpustate,&seg,NULL);
29232939            cpustate->ldtr.limit = seg.limit;
29242940            cpustate->ldtr.base = seg.base;
29252941            cpustate->ldtr.flags = seg.flags;
r14729r14730
29462962            }
29472963            memset(&seg, 0, sizeof(seg));
29482964            seg.selector = cpustate->task.segment;
2949            i386_load_protected_mode_segment(cpustate,&seg);
2965            i386_load_protected_mode_segment(cpustate,&seg,NULL);
29502966            cpustate->task.limit = seg.limit;
29512967            cpustate->task.base = seg.base;
29522968            cpustate->task.flags = seg.flags;
r14729r14730
29602976      case 4:  /* VERR */
29612977         if ( PROTECTED_MODE && !V8086_MODE )
29622978         {
2963            result = 1;
29642979            if( modrm >= 0xc0 ) {
29652980               address = LOAD_RM32(modrm);
29662981               CYCLES(cpustate,CYCLES_VERR_REG);
r14729r14730
29712986            }
29722987            memset(&seg, 0, sizeof(seg));
29732988            seg.selector = address;
2974            i386_load_protected_mode_segment(cpustate,&seg);
2975            // check if the segment is within the bounds of the GDT or LDT
2976            if(seg.selector & 0x04)
2977            {  // LDT
2978               if((seg.selector & 0xf8) > cpustate->ldtr.limit)
2979               {
2980                  result = 0;
2981               }
2982            }
2983            else
2984            {  // GDT
2985               if((seg.selector & 0xf8) > cpustate->gdtr.limit)
2986               {
2987                  result = 0;
2988               }
2989            }
2989            result = i386_load_protected_mode_segment(cpustate,&seg,NULL);
29902990            // check if the segment is a code or data segment (not a special segment type, like a TSS, gate, LDT...)
29912991            if(!(seg.flags & 0x10))
29922992               result = 0;
r14729r14730
30233023      case 5:  /* VERW */
30243024         if ( PROTECTED_MODE && !V8086_MODE )
30253025         {
3026            result = 1;
30273026            if( modrm >= 0xc0 ) {
30283027               address = LOAD_RM16(modrm);
30293028               CYCLES(cpustate,CYCLES_VERW_REG);
r14729r14730
30343033            }
30353034            memset(&seg, 0, sizeof(seg));
30363035            seg.selector = address;
3037            i386_load_protected_mode_segment(cpustate,&seg);
3038            // check if the segment is within the bounds of the GDT or LDT
3039            if(seg.selector & 0x04)
3040            {  // LDT
3041               if((seg.selector & 0xf8) > cpustate->ldtr.limit)
3042               {
3043                  result = 0;
3044               }
3045            }
3046            else
3047            {  // GDT
3048               if((seg.selector & 0xf8) > cpustate->gdtr.limit)
3049               {
3050                  result = 0;
3051               }
3052            }
3036            result = i386_load_protected_mode_segment(cpustate,&seg,NULL);
30533037            // check if the segment is a code or data segment (not a special segment type, like a TSS, gate, LDT...)
30543038            if(!(seg.flags & 0x10))
30553039               result = 0;
r14729r14730
33343318      }
33353319      else
33363320      {
3337         i386_load_protected_mode_segment(cpustate,&seg);
3321         UINT64 desc;
3322         if(!i386_load_protected_mode_segment(cpustate,&seg,&desc))
3323         {
3324            SetZF(0);
3325            return;
3326         }
3327         if(((seg.flags >> 5) & 3) < cpustate->CPL)
3328         {
3329            SetZF(0);
3330            return;
3331         }
33383332         if(!(seg.flags & 0x10))  // special segment
33393333         {
33403334            // check for invalid segment types
r14729r14730
33453339            }
33463340            else
33473341            {
3348               // TODO: check current privilege level
3349               STORE_REG32(modrm,(seg.flags << 8) & 0x00ffff00);
3342               STORE_REG32(modrm,(desc>>32) & 0x00ffff00);
33503343               SetZF(1);
33513344            }
33523345         }
33533346         else
33543347         {
3355            // TODO: check current privilege level
3356            STORE_REG32(modrm,(seg.flags << 8) & 0x00ffff00);
3348            STORE_REG32(modrm,(desc>>32) & 0x00ffff00);
33573349            SetZF(1);
33583350         }
33593351      }
r14729r14730
33903382      }
33913383      else
33923384      {
3393         // TODO: check segment type
3394         i386_load_protected_mode_segment(cpustate,&seg);
3395         limit = seg.limit;
3396         STORE_REG32(modrm,limit);
3397         SetZF(1);
3385         UINT8 type;
3386         if(!i386_load_protected_mode_segment(cpustate,&seg,NULL))
3387         {
3388            SetZF(0);
3389            return;
3390         }
3391         if(((seg.flags >> 5) & 3) < cpustate->CPL)
3392         {
3393            SetZF(0);
3394            return;
3395         }
3396         type = seg.flags & 0x1f;
3397         switch(type)
3398         {
3399         case 0:
3400         case 4:
3401         case 5:
3402         case 6:
3403         case 7:
3404         case 8:
3405         case 10:
3406         case 12:
3407         case 13:
3408         case 14:
3409         case 15:
3410            SetZF(0);
3411            return;
3412         default:
3413            limit = seg.limit;
3414            STORE_REG32(modrm,limit);
3415            SetZF(1);
3416         }
33983417      }
33993418   }
34003419   else

Previous 15994 Revisions Next


© 1998-2018 The MESS Team