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;
