PCem
changeset 92:c49302f432e2
Loading a segment register in real mode no longer clears USE32.
CR3 no longer masks values written to it.
Real mode interrupts now take IDT base into account.
Fixes 'huge unreal' mode (flat assembler).
| author | TomW |
|---|---|
| date | Sat Mar 29 14:28:13 2014 +0000 |
| parents | 6579fed92118 |
| children | df0c5617560a |
| files | src/386.c src/808x.c src/x86_ops_mov_ctrl.h src/x86seg.c |
| diffstat | 4 files changed, 8 insertions(+), 7 deletions(-) [+] |
line diff
1.1 --- a/src/386.c Wed Mar 26 22:14:13 2014 +0000 1.2 +++ b/src/386.c Sat Mar 29 14:28:13 2014 +0000 1.3 @@ -339,7 +339,7 @@ 1.4 writememw(ss,((SP-6)&0xFFFF),pc); 1.5 SP-=6; 1.6 } 1.7 - addr=num<<2; 1.8 + addr = (num << 2) + idt.base; 1.9 1.10 flags&=~I_FLAG; 1.11 flags&=~T_FLAG; 1.12 @@ -376,7 +376,7 @@ 1.13 writememw(ss,((SP-6)&0xFFFF),pc); 1.14 SP-=6; 1.15 } 1.16 - addr=num<<2; 1.17 + addr = (num << 2) + idt.base; 1.18 1.19 flags&=~I_FLAG; 1.20 flags&=~T_FLAG; 1.21 @@ -1343,7 +1343,7 @@ 1.22 writememw(ss,(SP-4)&0xFFFF,CS); 1.23 writememw(ss,(SP-6)&0xFFFF,pc); 1.24 SP-=6; 1.25 - addr=1<<2; 1.26 + addr = (1 << 2) + idt.base; 1.27 flags&=~I_FLAG; 1.28 flags&=~T_FLAG; 1.29 pc=readmemw(0,addr); 1.30 @@ -1378,7 +1378,7 @@ 1.31 writememw(ss,(SP-4)&0xFFFF,CS); 1.32 writememw(ss,(SP-6)&0xFFFF,pc); 1.33 SP-=6; 1.34 - addr=temp<<2; 1.35 + addr = (temp << 2) + idt.base; 1.36 flags&=~I_FLAG; 1.37 flags&=~T_FLAG; 1.38 oxpc=pc;
2.1 --- a/src/808x.c Wed Mar 26 22:14:13 2014 +0000 2.2 +++ b/src/808x.c Sat Mar 29 14:28:13 2014 +0000 2.3 @@ -639,6 +639,7 @@ 2.4 cgate32=0; 2.5 loadcs(0xFFFF); 2.6 rammask=0xFFFFFFFF; 2.7 + idt.base = 0; 2.8 flags=2; 2.9 makeznptable(); 2.10 initmmucache(); 2.11 @@ -669,6 +670,7 @@ 2.12 loadcs(0xFFFF); 2.13 //rammask=0xFFFFFFFF; 2.14 flags=2; 2.15 + idt.base = 0; 2.16 } 2.17 2.18 static void setznp8(uint8_t val)
3.1 --- a/src/x86_ops_mov_ctrl.h Wed Mar 26 22:14:13 2014 +0000 3.2 +++ b/src/x86_ops_mov_ctrl.h Sat Mar 29 14:28:13 2014 +0000 3.3 @@ -107,7 +107,7 @@ 3.4 cr2 = regs[rm].l; 3.5 break; 3.6 case 3: 3.7 - cr3 = regs[rm].l & ~0xfff; 3.8 + cr3 = regs[rm].l; 3.9 flushmmucache(); 3.10 break; 3.11 default: 3.12 @@ -140,7 +140,7 @@ 3.13 cr2 = regs[rm].l; 3.14 break; 3.15 case 3: 3.16 - cr3 = regs[rm].l & ~0xfff; 3.17 + cr3 = regs[rm].l; 3.18 flushmmucache(); 3.19 break; 3.20 default:
