Diff for /np2/i386c/memory.c between versions 1.37 and 1.40

version 1.37, 2012/01/23 10:23:54 version 1.40, 2012/01/29 14:53:54
Line 552  void MEMCALL memp_reads(UINT32 address,  Line 552  void MEMCALL memp_reads(UINT32 address, 
   
 void MEMCALL memp_writes(UINT32 address, const void *dat, UINT leng) {  void MEMCALL memp_writes(UINT32 address, const void *dat, UINT leng) {
   
         const UINT8 *out = dat;          const UINT8 *out = (UINT8 *)dat;
         UINT diff;          UINT diff;
   
         /* fast memory access */          /* fast memory access */
Line 582  void MEMCALL memp_writes(UINT32 address, Line 582  void MEMCALL memp_writes(UINT32 address,
   
 // ---- Logical Space (BIOS)  // ---- Logical Space (BIOS)
   
   static UINT32 MEMCALL physicaladdr(UINT32 addr, BOOL wr) {
   
           UINT32  a;
           UINT32  pde;
           UINT32  pte;
   
           a = CPU_STAT_PDE_BASE + ((addr >> 20) & 0xffc);
           pde = memp_read32(a);
           if (!(pde & CPU_PDE_PRESENT)) {
                   goto retdummy;
           }
           if (!(pde & CPU_PDE_ACCESS)) {
                   memp_write8(a, (UINT8)(pde | CPU_PDE_ACCESS));
           }
           a = (pde & CPU_PDE_BASEADDR_MASK) + ((addr >> 10) & 0xffc);
           pte = cpu_memoryread_d(a);
           if (!(pte & CPU_PTE_PRESENT)) {
                   goto retdummy;
           }
           if (!(pte & CPU_PTE_ACCESS)) {
                   memp_write8(a, (UINT8)(pte | CPU_PTE_ACCESS));
           }
           if ((wr) && (!(pte & CPU_PTE_DIRTY))) {
                   memp_write8(a, (UINT8)(pte | CPU_PTE_DIRTY));
           }
           addr = (pte & CPU_PTE_BASEADDR_MASK) + (addr & 0x00000fff);
           return(addr);
   
    retdummy:
           return(0x01000000);     /* XXX */
   }
   
   
 void MEMCALL meml_reads(UINT32 address, void *dat, UINT leng) {  void MEMCALL meml_reads(UINT32 address, void *dat, UINT leng) {
   
         if (!CPU_STAT_PM) {          UINT    size;
   
           if (!CPU_STAT_PAGING) {
                 memp_reads(address, dat, leng);                  memp_reads(address, dat, leng);
         }          }
         else if (CPU_STAT_VM86) {  
                 cpu_memory_access_la_region(address, leng,  
                   CPU_PAGE_READ_DATA | CPU_PAGE_USER_MODE, dat);  
         }  
         else {          else {
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);                  while(leng) {
                           size = 0x1000 - (address & 0xfff);
                           size = min(size, leng);
                           memp_reads(physicaladdr(address, FALSE), dat, size);
                           address += size;
                           dat = ((UINT8 *)dat) + size;
                           leng -= size;
                   }
         }          }
 }  }
   
 void MEMCALL meml_writes(UINT32 address, const void *dat, UINT leng) {  void MEMCALL meml_writes(UINT32 address, const void *dat, UINT leng) {
   
         if (!CPU_STAT_PM) {          UINT    size;
   
           if (!CPU_STAT_PAGING) {
                 memp_writes(address, dat, leng);                  memp_writes(address, dat, leng);
         }          }
         else if (CPU_STAT_VM86) {  
                 cpu_memory_access_la_region(address, leng,  
                   CPU_PAGE_WRITE_DATA | CPU_PAGE_USER_MODE, (UINT8 *)dat);  
         }  
         else {          else {
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);                  while(leng) {
                           size = 0x1000 - (address & 0xfff);
                           size = min(size, leng);
                           memp_writes(physicaladdr(address, TRUE), dat, size);
                           address += size;
                           dat = ((UINT8 *)dat) + size;
                           leng -= size;
                   }
         }          }
 }  }
   
Line 616  REG8 MEMCALL memr_read8(UINT seg, UINT o Line 659  REG8 MEMCALL memr_read8(UINT seg, UINT o
         UINT32  addr;          UINT32  addr;
   
         addr = (seg << 4) + LOW16(off);          addr = (seg << 4) + LOW16(off);
         if (!CPU_STAT_PM) {          if (CPU_STAT_PAGING) {
                 return(memp_read8(addr));                  addr = physicaladdr(addr, FALSE);
         }  
         else if (CPU_STAT_VM86) {  
                 return(cpu_linear_memory_read_b(addr,  
                   CPU_PAGE_READ_DATA | CPU_PAGE_USER_MODE));  
         }  
         else {  
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);  
                 return(0xff);  
         }          }
           return(memp_read8(addr));
 }  }
   
 REG16 MEMCALL memr_read16(UINT seg, UINT off) {  REG16 MEMCALL memr_read16(UINT seg, UINT off) {
Line 634  REG16 MEMCALL memr_read16(UINT seg, UINT Line 670  REG16 MEMCALL memr_read16(UINT seg, UINT
         UINT32  addr;          UINT32  addr;
   
         addr = (seg << 4) + LOW16(off);          addr = (seg << 4) + LOW16(off);
         if (!CPU_STAT_PM) {          if (!CPU_STAT_PAGING) {
                 return(memp_read16(addr));                  return(memp_read16(addr));
         }          }
         else if (CPU_STAT_VM86) {          else if ((addr + 1) & 0xfff) {
                 return(cpu_linear_memory_read_w(addr,                  return(memp_read16(physicaladdr(addr, FALSE)));
                   CPU_PAGE_READ_DATA | CPU_PAGE_USER_MODE));  
         }  
         else {  
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);  
                 return(0xffff);  
         }          }
           return(memr_read8(seg, off) + (memr_read8(seg, off + 1) << 8));
 }  }
   
 void MEMCALL memr_write8(UINT seg, UINT off, REG8 dat) {  void MEMCALL memr_write8(UINT seg, UINT off, REG8 dat) {
Line 652  void MEMCALL memr_write8(UINT seg, UINT  Line 684  void MEMCALL memr_write8(UINT seg, UINT 
         UINT32  addr;          UINT32  addr;
   
         addr = (seg << 4) + LOW16(off);          addr = (seg << 4) + LOW16(off);
         if (!CPU_STAT_PM) {          if (CPU_STAT_PAGING) {
                 memp_write8(addr, dat);                  addr = physicaladdr(addr, TRUE);
         }  
         else if (CPU_STAT_VM86) {  
                 cpu_linear_memory_write_b(addr, dat,  
                   CPU_PAGE_WRITE_DATA | CPU_PAGE_USER_MODE);  
         }  
         else {  
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);  
         }          }
           memp_write8(addr, dat);
 }  }
   
 void MEMCALL memr_write16(UINT seg, UINT off, REG16 dat) {  void MEMCALL memr_write16(UINT seg, UINT off, REG16 dat) {
Line 669  void MEMCALL memr_write16(UINT seg, UINT Line 695  void MEMCALL memr_write16(UINT seg, UINT
         UINT32  addr;          UINT32  addr;
   
         addr = (seg << 4) + LOW16(off);          addr = (seg << 4) + LOW16(off);
         if (!CPU_STAT_PM) {          if (!CPU_STAT_PAGING) {
                 memp_write16(addr, dat);                  memp_write16(addr, dat);
         }          }
         else if (CPU_STAT_VM86) {          else if ((addr + 1) & 0xfff) {
                 cpu_linear_memory_write_w(addr, dat,                  memp_write16(physicaladdr(addr, TRUE), dat);
                   CPU_PAGE_WRITE_DATA | CPU_PAGE_USER_MODE);  
         }          }
         else {          else {
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);                  memr_write8(seg, off, (REG8)dat);
                   memr_write8(seg, off + 1, (REG8)(dat >> 8));
         }          }
 }  }
   
 void MEMCALL memr_reads(UINT seg, UINT off, void *dat, UINT leng) {  void MEMCALL memr_reads(UINT seg, UINT off, void *dat, UINT leng) {
   
         UINT8   *in = dat;  
         UINT32  addr;          UINT32  addr;
         UINT    rem;          UINT    rem;
         UINT    size;          UINT    size;
   
         if (CPU_STAT_PM && !CPU_STAT_VM86) {  
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);  
                 return;  
         }  
   
         while(leng) {          while(leng) {
                 off = LOW16(off);                  off = LOW16(off);
                 addr = (seg << 4) + off;                  addr = (seg << 4) + off;
                 rem = 0x10000 - off;                  rem = 0x10000 - off;
                 size = min(leng, rem);                  size = min(leng, rem);
                 if (!CPU_STAT_PM) {                  if (CPU_STAT_PAGING) {
                         memp_reads(addr, in, size);                          rem = 0x1000 - (addr & 0xfff);
                 }  
                 else {  
                         /* VM86 */  
                         rem = CPU_PAGE_SIZE - (addr & CPU_PAGE_MASK);  
                         size = min(size, rem);                          size = min(size, rem);
                         cpu_memory_access_la_region(addr, size,                          addr = physicaladdr(addr, FALSE);
                           CPU_PAGE_READ_DATA | CPU_PAGE_USER_MODE, in);  
                 }                  }
                   memp_reads(addr, dat, size);
                 off += size;                  off += size;
                 in += size;                  dat = ((UINT8 *)dat) + size;
                 leng -= size;                  leng -= size;
         }          }
 }  }
   
 void MEMCALL memr_writes(UINT seg, UINT off, const void *dat, UINT leng) {  void MEMCALL memr_writes(UINT seg, UINT off, const void *dat, UINT leng) {
   
         const UINT8     *out = dat;          UINT32  addr;
         UINT32          addr;          UINT    rem;
         UINT            rem;          UINT    size;
         UINT            size;  
   
         if (CPU_STAT_PM && !CPU_STAT_VM86) {  
                 ia32_panic("%s: call from BIOS, but protected mode", __func__);  
                 return;  
         }  
   
         while(leng) {          while(leng) {
                 off = LOW16(off);                  off = LOW16(off);
                 addr = (seg << 4) + off;                  addr = (seg << 4) + off;
                 rem = 0x10000 - off;                  rem = 0x10000 - off;
                 size = min(leng, rem);                  size = min(leng, rem);
                 if (!CPU_STAT_PM) {                  if (CPU_STAT_PAGING) {
                         memp_writes(addr, out, size);  
                 }  
                 else {  
                         /* VM86 */  
                         rem = 0x1000 - (addr & 0xfff);                          rem = 0x1000 - (addr & 0xfff);
                         size = min(size, rem);                          size = min(size, rem);
                         cpu_memory_access_la_region(addr, size,                          addr = physicaladdr(addr, TRUE);
                           CPU_PAGE_WRITE_DATA | CPU_PAGE_USER_MODE, (UINT8 *)out);  
                 }                  }
                   memp_writes(addr, dat, size);
                 off += size;                  off += size;
                 out += size;                  dat = ((UINT8 *)dat) + size;
                 leng -= size;                  leng -= size;
         }          }
 }  }

Removed from v.1.37  
changed lines
  Added in v.1.40


RetroPC.NET-CVS <cvs@retropc.net>