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:
     4.1 --- a/src/x86seg.c	Wed Mar 26 22:14:13 2014 +0000
     4.2 +++ b/src/x86seg.c	Sat Mar 29 14:28:13 2014 +0000
     4.3 @@ -308,7 +308,6 @@
     4.4                  s->seg=seg;
     4.5                  if (eflags&VM_FLAG) s->access=3<<5;
     4.6                  else                s->access=0<<5;
     4.7 -                use32=0;
     4.8                  if (s==&_ss) stack32=0;
     4.9  /*                if (s==&_ds)
    4.10                  {