PCem

changeset 29:626d3074b545

Fixed use of selector override with POP r/m - GTA now works again.
author TomW
date Thu Oct 31 19:57:25 2013 +0000
parents 22e575515a51
children 3afc5d31f5dc
files src/386_ops.h src/x86_ops_stack.h
diffstat 2 files changed, 46 insertions(+), 10 deletions(-) [+]
line diff
     1.1 --- a/src/386_ops.h	Sun Oct 27 14:37:01 2013 +0000
     1.2 +++ b/src/386_ops.h	Thu Oct 31 19:57:25 2013 +0000
     1.3 @@ -63,6 +63,38 @@
     1.4          return ret;
     1.5  }
     1.6  
     1.7 +static inline uint16_t POP_W_seg(uint32_t seg)
     1.8 +{
     1.9 +        uint16_t ret;
    1.10 +        if (stack32)
    1.11 +        {
    1.12 +                ret = readmemw(seg, ESP);                       if (abrt) return 0;
    1.13 +                ESP += 2;
    1.14 +        }
    1.15 +        else
    1.16 +        {
    1.17 +                ret = readmemw(seg, SP);                        if (abrt) return 0;
    1.18 +                SP += 2;
    1.19 +        }
    1.20 +        return ret;
    1.21 +}
    1.22 +
    1.23 +static inline uint32_t POP_L_seg(uint32_t seg)
    1.24 +{
    1.25 +        uint32_t ret;
    1.26 +        if (stack32)
    1.27 +        {
    1.28 +                ret = readmeml(seg, ESP);                       if (abrt) return 0;
    1.29 +                ESP += 4;
    1.30 +        }
    1.31 +        else
    1.32 +        {
    1.33 +                ret = readmeml(seg, SP);                        if (abrt) return 0;
    1.34 +                SP += 4;
    1.35 +        }
    1.36 +        return ret;
    1.37 +}
    1.38 +
    1.39  #include "x86_ops_arith.h"
    1.40  #include "x86_ops_atomic.h"
    1.41  #include "x86_ops_bcd.h"
     2.1 --- a/src/x86_ops_stack.h	Sun Oct 27 14:37:01 2013 +0000
     2.2 +++ b/src/x86_ops_stack.h	Thu Oct 31 19:57:25 2013 +0000
     2.3 @@ -226,9 +226,10 @@
     2.4  static int opPOPW_a16(uint32_t fetchdat)
     2.5  {
     2.6          uint16_t temp;
     2.7 +        uint32_t tempseg = ssegs ? oldss : ss;
     2.8          
     2.9 -        if (ssegs) ss=oldss;
    2.10 -        temp = POP_W();                                 if (abrt) return 0;
    2.11 +        temp = POP_W_seg(tempseg);                      if (abrt) return 0;
    2.12 +
    2.13          fetch_ea_16(fetchdat);
    2.14          seteaw(temp);
    2.15          if (abrt)
    2.16 @@ -244,9 +245,10 @@
    2.17  static int opPOPW_a32(uint32_t fetchdat)
    2.18  {
    2.19          uint16_t temp;
    2.20 +        uint32_t tempseg = ssegs ? oldss : ss;
    2.21 +                
    2.22 +        temp = POP_W_seg(tempseg);                      if (abrt) return 0;
    2.23          
    2.24 -        if (ssegs) ss=oldss;
    2.25 -        temp = POP_W();                                 if (abrt) return 0;
    2.26          fetch_ea_32(fetchdat);
    2.27          seteaw(temp);
    2.28          if (abrt)
    2.29 @@ -263,10 +265,11 @@
    2.30  static int opPOPL_a16(uint32_t fetchdat)
    2.31  {
    2.32          uint32_t temp;
    2.33 +        uint32_t tempseg = ssegs ? oldss : ss;
    2.34  
    2.35 -        if (ssegs) ss=oldss;
    2.36 -        temp = POP_L();                                 if (abrt) return 0;
    2.37 -        fetch_ea_16(fetchdat);
    2.38 +        temp = POP_L_seg(tempseg);                      if (abrt) return 0;
    2.39 +
    2.40 +        fetch_ea_16(fetchdat);        
    2.41          seteal(temp);
    2.42          if (abrt)
    2.43          {
    2.44 @@ -281,9 +284,10 @@
    2.45  static int opPOPL_a32(uint32_t fetchdat)
    2.46  {
    2.47          uint32_t temp;
    2.48 +        uint32_t tempseg = ssegs ? oldss : ss;
    2.49  
    2.50 -        if (ssegs) ss=oldss;
    2.51 -        temp = POP_L();                                 if (abrt) return 0;
    2.52 +        temp = POP_L_seg(tempseg);                      if (abrt) return 0;
    2.53 +
    2.54          fetch_ea_32(fetchdat);
    2.55          seteal(temp);
    2.56          if (abrt)
    2.57 @@ -291,7 +295,7 @@
    2.58                  if (stack32) ESP -= 4;
    2.59                  else         SP -= 4;
    2.60          }
    2.61 -                        
    2.62 +
    2.63          if (is486) cycles -= ((mod == 3) ? 1 : 6);
    2.64          else       cycles -= ((mod == 3) ? 4 : 5);
    2.65          return 0;