Diff for /np2/i386c/ia32/paging.c between versions 1.22 and 1.24

version 1.22, 2004/03/24 14:34:23 version 1.24, 2004/03/25 15:08:32
Line 184  static const UINT8 page_access_bit[32] = Line 184  static const UINT8 page_access_bit[32] =
  * +- CR3(物理アドレス)   * +- CR3(物理アドレス)
  */   */
   
 static UINT32 paging(const UINT32 laddr, const int ucrw);  static UINT32 MEMCALL paging(const UINT32 laddr, const int ucrw) GCC_ATTR_REGPARM;
 #if defined(IA32_SUPPORT_TLB)  #if defined(IA32_SUPPORT_TLB)
 static BOOL tlb_lookup(const UINT32 vaddr, const int crw, UINT32 *paddr);  static BOOL tlb_lookup(const UINT32 vaddr, const int crw, UINT32 *paddr) GCC_ATTR_REGPARM;
 static void tlb_update(const UINT32 laddr, const UINT entry, const int crw);  static void tlb_update(const UINT32 laddr, const UINT entry, const int crw) GCC_ATTR_REGPARM;
 #endif  #endif
   
 #if defined(IA32_PAGING_EACHSIZE)  #if defined(IA32_PAGING_EACHSIZE)
Line 286  cpu_memory_access_la_RMW_d(UINT32 laddr, Line 286  cpu_memory_access_la_RMW_d(UINT32 laddr,
 UINT8 MEMCALL  UINT8 MEMCALL
 cpu_linear_memory_read_b(UINT32 laddr, const int ucrw)  cpu_linear_memory_read_b(UINT32 laddr, const int ucrw)
 {  {
         UINT32 addr;          UINT32 paddr;
   
         addr = paging(laddr, ucrw);          paddr = paging(laddr, ucrw);
         return cpu_memoryread(addr);          return cpu_memoryread(paddr);
 }  }
   
 UINT16 MEMCALL  UINT16 MEMCALL
 cpu_linear_memory_read_w(UINT32 laddr, const int ucrw)  cpu_linear_memory_read_w(UINT32 laddr, const int ucrw)
 {  {
         UINT32 addr, addr2;          UINT32 paddr, paddr2;
         UINT16 value;          UINT16 value;
   
         addr = paging(laddr, ucrw);          paddr = paging(laddr, ucrw);
         if ((laddr + 1) & 0x00000fff) {          if ((laddr + 1) & 0x00000fff) {
                 return cpu_memoryread_w(addr);                  return cpu_memoryread_w(paddr);
         } else {          } else {
                 addr2 = paging(laddr + 1, ucrw);                  paddr2 = paging(laddr + 1, ucrw);
                 value = cpu_memoryread_b(addr);                  value = cpu_memoryread_b(paddr);
                 value += (UINT16)cpu_memoryread_b(addr2) << 8;                  value += (UINT16)cpu_memoryread_b(paddr2) << 8;
                 return value;                  return value;
         }          }
 }  }
Line 312  cpu_linear_memory_read_w(UINT32 laddr, c Line 312  cpu_linear_memory_read_w(UINT32 laddr, c
 UINT32 MEMCALL  UINT32 MEMCALL
 cpu_linear_memory_read_d(UINT32 laddr, const int ucrw)  cpu_linear_memory_read_d(UINT32 laddr, const int ucrw)
 {  {
         UINT32 addr, addr2;          UINT32 paddr, paddr2;
         UINT32 value;          UINT32 value;
         UINT remain;          UINT remain;
   
         addr = paging(laddr, ucrw);          paddr = paging(laddr, ucrw);
         remain = 0x1000 - (laddr & 0x00000fff);          remain = 0x1000 - (laddr & 0x00000fff);
         if (remain >= 4) {          if (remain >= 4) {
                 return cpu_memoryread_d(addr);                  return cpu_memoryread_d(paddr);
         } else {          } else {
                 addr2 = paging(laddr + remain, ucrw);                  paddr2 = paging(laddr + remain, ucrw);
                 switch (remain) {                  switch (remain) {
                 case 3:                  case 3:
                         value = cpu_memoryread(addr);                          value = cpu_memoryread(paddr);
                         value += (UINT32)cpu_memoryread_w(addr + 1) << 8;                          value += (UINT32)cpu_memoryread_w(paddr + 1) << 8;
                         value += (UINT32)cpu_memoryread(addr2) << 24;                          value += (UINT32)cpu_memoryread(paddr2) << 24;
                         break;                          break;
   
                 case 2:                  case 2:
                         value = cpu_memoryread_w(addr);                          value = cpu_memoryread_w(paddr);
                         value += (UINT32)cpu_memoryread_w(addr2) << 16;                          value += (UINT32)cpu_memoryread_w(paddr2) << 16;
                         break;                          break;
   
                 case 1:                  case 1:
                         value = cpu_memoryread(addr);                          value = cpu_memoryread(paddr);
                         value += (UINT32)cpu_memoryread(addr2) << 8;                          value += (UINT32)cpu_memoryread(paddr2) << 8;
                         value += (UINT32)cpu_memoryread_w(addr2 + 1) << 16;                          value += (UINT32)cpu_memoryread_w(paddr2 + 1) << 16;
                         break;                          break;
   
                 default:                  default:
Line 353  void MEMCALL Line 353  void MEMCALL
 cpu_linear_memory_write_b(UINT32 laddr, UINT8 value, const int user_mode)  cpu_linear_memory_write_b(UINT32 laddr, UINT8 value, const int user_mode)
 {  {
         const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode;          const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode;
         UINT32 addr;          UINT32 paddr;
   
         addr = paging(laddr, ucrw);          paddr = paging(laddr, ucrw);
         cpu_memorywrite(addr, value);          cpu_memorywrite(paddr, value);
 }  }
   
 void MEMCALL  void MEMCALL
 cpu_linear_memory_write_w(UINT32 laddr, UINT16 value, const int user_mode)  cpu_linear_memory_write_w(UINT32 laddr, UINT16 value, const int user_mode)
 {  {
         const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode;          const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode;
         UINT32 addr, addr2;          UINT32 paddr, paddr2;
   
         addr = paging(laddr, ucrw);          paddr = paging(laddr, ucrw);
         if ((laddr + 1) & 0x00000fff) {          if ((laddr + 1) & 0x00000fff) {
                 cpu_memorywrite_w(addr, value);                  cpu_memorywrite_w(paddr, value);
         } else {          } else {
                 addr2 = paging(laddr + 1, ucrw);                  paddr2 = paging(laddr + 1, ucrw);
                 cpu_memorywrite(addr, (UINT8)value);                  cpu_memorywrite(paddr, (UINT8)value);
                 cpu_memorywrite(addr2, (UINT8)(value >> 8));                  cpu_memorywrite(paddr2, (UINT8)(value >> 8));
         }          }
 }  }
   
Line 379  void MEMCALL Line 379  void MEMCALL
 cpu_linear_memory_write_d(UINT32 laddr, UINT32 value, const int user_mode)  cpu_linear_memory_write_d(UINT32 laddr, UINT32 value, const int user_mode)
 {  {
         const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode;          const int ucrw = CPU_PAGE_WRITE|CPU_PAGE_DATA|user_mode;
         UINT32 addr, addr2;          UINT32 paddr, paddr2;
         UINT remain;          UINT remain;
   
         addr = paging(laddr, ucrw);          paddr = paging(laddr, ucrw);
         remain = 0x1000 - (laddr & 0x00000fff);          remain = 0x1000 - (laddr & 0x00000fff);
         if (remain >= 4) {          if (remain >= 4) {
                 cpu_memorywrite_d(addr, value);                  cpu_memorywrite_d(paddr, value);
         } else {          } else {
                 addr2 = paging(laddr + remain, ucrw);                  paddr2 = paging(laddr + remain, ucrw);
                 switch (remain) {                  switch (remain) {
                 case 3:                  case 3:
                         cpu_memorywrite(addr, (UINT8)value);                          cpu_memorywrite(paddr, (UINT8)value);
                         cpu_memorywrite_w(addr + 1, (UINT16)(value >> 8));                          cpu_memorywrite_w(paddr + 1, (UINT16)(value >> 8));
                         cpu_memorywrite(addr2, (UINT8)(value >> 24));                          cpu_memorywrite(paddr2, (UINT8)(value >> 24));
                         break;                          break;
   
                 case 2:                  case 2:
                         cpu_memorywrite_w(addr, (UINT16)value);                          cpu_memorywrite_w(paddr, (UINT16)value);
                         cpu_memorywrite_w(addr2, (UINT16)(value >> 16));                          cpu_memorywrite_w(paddr2, (UINT16)(value >> 16));
                         break;                          break;
   
                 case 1:                  case 1:
                         cpu_memorywrite(addr, (UINT8)value);                          cpu_memorywrite(paddr, (UINT8)value);
                         cpu_memorywrite(addr2, (UINT8)(value >> 8));                          cpu_memorywrite(paddr2, (UINT8)(value >> 8));
                         cpu_memorywrite_w(addr2 + 1, (UINT16)(value >> 16));                          cpu_memorywrite_w(paddr2 + 1, (UINT16)(value >> 16));
                         break;                          break;
                 }                  }
         }          }
Line 680  paging_check(UINT32 laddr, UINT length,  Line 680  paging_check(UINT32 laddr, UINT length, 
         }          }
 }  }
   
 static UINT32  static UINT32 MEMCALL
 paging(const UINT32 laddr, const int ucrw)  paging(const UINT32 laddr, const int ucrw)
 {  {
         UINT32 paddr;           /* physical address */          UINT32 paddr;           /* physical address */
Line 692  paging(const UINT32 laddr, const int ucr Line 692  paging(const UINT32 laddr, const int ucr
         UINT err;          UINT err;
   
 #if defined(IA32_SUPPORT_TLB)  #if defined(IA32_SUPPORT_TLB)
         if (tlb_lookup(laddr, crw, &paddr))          if (tlb_lookup(laddr, ucrw, &paddr))
                 return paddr;                  return paddr;
 #endif  /* IA32_SUPPORT_TLB */  #endif  /* IA32_SUPPORT_TLB */
   

Removed from v.1.22  
changed lines
  Added in v.1.24


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