PCem

changeset 155:6b3e1b9d0220

Fixed SGDT/SIDT on 286, Windows 3.0 detects CPU correctly again.
author TomW
date Fri Sep 05 21:40:21 2014 +0100
parents d0d530adce12
children e0714e10b44e
files src/386_ops.h src/x86_ops_pmode.h
diffstat 2 files changed, 23 insertions(+), 12 deletions(-) [+]
line diff
     1.1 --- a/src/386_ops.h	Thu Sep 04 21:07:24 2014 +0100
     1.2 +++ b/src/386_ops.h	Fri Sep 05 21:40:21 2014 +0100
     1.3 @@ -190,7 +190,7 @@
     1.4  {
     1.5          /*16-bit data, 16-bit addr*/
     1.6  /*      00              01              02              03              04              05              06              07              08              09              0a              0b              0c              0d              0e              0f*/        
     1.7 -/*00*/  op0F00_a16,     op0F01_w_a16,   opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
     1.8 +/*00*/  op0F00_a16,     op0F01_286,     opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
     1.9  /*10*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.10  /*20*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.11  /*30*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.12 @@ -212,9 +212,9 @@
    1.13  
    1.14          /*32-bit data, 16-bit addr*/
    1.15  /*      00              01              02              03              04              05              06              07              08              09              0a              0b              0c              0d              0e              0f*/        
    1.16 -/*00*/  op0F00_a16,     op0F01_w_a16,   opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.17 +/*00*/  op0F00_a16,     op0F01_286,     opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.18  /*10*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.19 -/*20*/  opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,opMOV_TRx_r_a16,ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.20 +/*20*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.21  /*30*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.22  
    1.23  /*40*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.24 @@ -234,9 +234,9 @@
    1.25  
    1.26          /*16-bit data, 32-bit addr*/
    1.27  /*      00              01              02              03              04              05              06              07              08              09              0a              0b              0c              0d              0e              0f*/        
    1.28 -/*00*/  op0F00_a16,     op0F01_w_a16,   opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.29 +/*00*/  op0F00_a16,     op0F01_286,     opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.30  /*10*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.31 -/*20*/  opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,opMOV_TRx_r_a16,ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.32 +/*20*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.33  /*30*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.34  
    1.35  /*40*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.36 @@ -256,9 +256,9 @@
    1.37  
    1.38          /*32-bit data, 32-bit addr*/
    1.39  /*      00              01              02              03              04              05              06              07              08              09              0a              0b              0c              0d              0e              0f*/        
    1.40 -/*00*/  op0F00_a16,     op0F01_w_a16,   opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.41 +/*00*/  op0F00_a16,     op0F01_286,     opLAR_w_a16,    opLSL_w_a16,    ILLEGAL,        opLOADALL,      opCLTS,         ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.42  /*10*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.43 -/*20*/  opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,opMOV_TRx_r_a16,ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.44 +/*20*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.45  /*30*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
    1.46  
    1.47  /*40*/  ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,        ILLEGAL,
     2.1 --- a/src/x86_ops_pmode.h	Thu Sep 04 21:07:24 2014 +0100
     2.2 +++ b/src/x86_ops_pmode.h	Fri Sep 05 21:40:21 2014 +0100
     2.3 @@ -281,7 +281,7 @@
     2.4          return 0;
     2.5  }
     2.6  
     2.7 -static inline op0F01_common(uint32_t fetchdat, int is32)
     2.8 +static inline op0F01_common(uint32_t fetchdat, int is32, int is286)
     2.9  {
    2.10          uint32_t base;
    2.11          uint16_t limit, tempw;
    2.12 @@ -291,12 +291,16 @@
    2.13                  case 0x00: /*SGDT*/
    2.14                  seteaw(gdt.limit);
    2.15                  base = is32 ? gdt.base : (gdt.base & 0xffffff);
    2.16 +                if (is286)
    2.17 +                        base |= 0xff000000;
    2.18                  writememl(easeg, eaaddr + 2, base);
    2.19                  cycles -= 7;
    2.20                  break;
    2.21                  case 0x08: /*SIDT*/
    2.22                  seteaw(idt.limit);
    2.23                  base = is32 ? idt.base : (idt.base & 0xffffff);
    2.24 +                if (is286)
    2.25 +                        base |= 0xff000000;
    2.26                  writememl(easeg, eaaddr + 2, base);
    2.27                  cycles -= 7;
    2.28                  break;
    2.29 @@ -377,28 +381,35 @@
    2.30  {
    2.31          fetch_ea_16(fetchdat);
    2.32          
    2.33 -        op0F01_common(fetchdat, 0);
    2.34 +        op0F01_common(fetchdat, 0, 0);
    2.35          return 0;
    2.36  }
    2.37  static inline op0F01_w_a32(uint32_t fetchdat)
    2.38  {
    2.39          fetch_ea_32(fetchdat);
    2.40          
    2.41 -        op0F01_common(fetchdat, 0);
    2.42 +        op0F01_common(fetchdat, 0, 0);
    2.43          return 0;
    2.44  }
    2.45  static inline op0F01_l_a16(uint32_t fetchdat)
    2.46  {
    2.47          fetch_ea_16(fetchdat);
    2.48          
    2.49 -        op0F01_common(fetchdat, 1);
    2.50 +        op0F01_common(fetchdat, 1, 0);
    2.51          return 0;
    2.52  }
    2.53  static inline op0F01_l_a32(uint32_t fetchdat)
    2.54  {
    2.55          fetch_ea_32(fetchdat);
    2.56          
    2.57 -        op0F01_common(fetchdat, 1);
    2.58 +        op0F01_common(fetchdat, 1, 0);
    2.59          return 0;
    2.60  }
    2.61  
    2.62 +static inline op0F01_286(uint32_t fetchdat)
    2.63 +{
    2.64 +        fetch_ea_16(fetchdat);
    2.65 +        
    2.66 +        op0F01_common(fetchdat, 0, 1);
    2.67 +        return 0;
    2.68 +}