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 +}
