/[pcsx2_0.9.7]/trunk/pcsx2/VUmicroMem.cpp
ViewVC logotype

Diff of /trunk/pcsx2/VUmicroMem.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 31 by william, Tue Sep 7 03:24:11 2010 UTC revision 62 by william, Tue Sep 7 11:08:22 2010 UTC
# Line 18  Line 18 
18  #include "Common.h"  #include "Common.h"
19  #include "VUmicro.h"  #include "VUmicro.h"
20    
21    __aligned16 VURegs vuRegs[2];
22    
23  static u8* m_vuAllMem = NULL;  static u8* m_vuAllMem = NULL;
24  static const uint m_vuMemSize =  static const uint m_vuMemSize =
25          0x1000 +                                        // VU0micro memory          0x1000 +                                        // VU0micro memory
26          0x4000+0x800 +                          // VU0 memory and VU1 registers          0x4000 +                                        // VU0 memory
27          0x4000 +                                        // VU1 memory          0x4000 +                                        // VU1 memory
28          0x4000;          0x4000;
29    
# Line 31  void vuMicroMemAlloc() Line 33  void vuMicroMemAlloc()
33                  m_vuAllMem = vtlb_malloc( m_vuMemSize, 16 );                  m_vuAllMem = vtlb_malloc( m_vuMemSize, 16 );
34    
35          if( m_vuAllMem == NULL )          if( m_vuAllMem == NULL )
36                  throw Exception::OutOfMemory( "vuMicroMemInit > Failed to allocate VUmicro memory." );                  throw Exception::OutOfMemory( L"VU0 and VU1 on-chip memory" );
   
         jASSUME( sizeof( VURegs ) <= 0x800 );  
37    
38          u8* curpos = m_vuAllMem;          u8* curpos = m_vuAllMem;
39          VU0.Micro       = curpos; curpos += 0x1000;          VU0.Micro       = curpos; curpos += 0x1000;
40          VU0.Mem         = curpos; curpos += 0x4000;          VU0.Mem         = curpos; curpos += 0x4000;
         g_pVU1          = (VURegs*)curpos; curpos += 0x800;  
41          VU1.Micro       = curpos; curpos += 0x4000;          VU1.Micro       = curpos; curpos += 0x4000;
42          VU1.Mem         = curpos;          VU1.Mem         = curpos;
43           //curpos += 0x4000;           //curpos += 0x4000;
# Line 50  void vuMicroMemShutdown() Line 49  void vuMicroMemShutdown()
49    
50          vtlb_free( m_vuAllMem, m_vuMemSize );          vtlb_free( m_vuAllMem, m_vuMemSize );
51          m_vuAllMem = NULL;          m_vuAllMem = NULL;
         g_pVU1 = NULL;  
52  }  }
53    
54  void vuMicroMemReset()  void vuMicroMemReset()
55  {  {
56          jASSUME( VU0.Mem != NULL );          pxAssume( VU0.Mem != NULL );
57          jASSUME( VU1.Mem != NULL );          pxAssume( VU1.Mem != NULL );
58    
59          memMapVUmicro();          memMapVUmicro();
60    
# Line 72  void vuMicroMemReset() Line 70  void vuMicroMemReset()
70          memzero_ptr<4*1024>(VU0.Mem);          memzero_ptr<4*1024>(VU0.Mem);
71          memzero_ptr<4*1024>(VU0.Micro);          memzero_ptr<4*1024>(VU0.Micro);
72    
         /* this is kinda tricky, maxmem is set to 0x4400 here,  
            tho it's not 100% accurate, since the mem goes from  
            0x0000 - 0x1000 (Mem) and 0x4000 - 0x4400 (VU1 Regs),  
            i guess it shouldn't be a problem,  
            at least hope so :) (linuz)  
         */  
         VU0.maxmem = 0x4800-4; //We are allocating 0x800 for vu1 reg's  
         VU0.maxmicro = 0x1000-4;  
         VU0.vuExec = vu0Exec;  
         VU0.vifRegs = vif0Regs;  
   
73          // === VU1 Initialization ===          // === VU1 Initialization ===
74          memzero(VU1.ACC);          memzero(VU1.ACC);
75          memzero(VU1.VF);          memzero(VU1.VF);
# Line 94  void vuMicroMemReset() Line 81  void vuMicroMemReset()
81          VU1.VI[0].UL = 0;          VU1.VI[0].UL = 0;
82          memzero_ptr<16*1024>(VU1.Mem);          memzero_ptr<16*1024>(VU1.Mem);
83          memzero_ptr<16*1024>(VU1.Micro);          memzero_ptr<16*1024>(VU1.Micro);
   
         VU1.maxmem   = 0x4000-4;//16*1024-4;  
         VU1.maxmicro = 0x4000-4;  
 //      VU1.VF       = (VECTOR*)(VU0.Mem + 0x4000);  
 //      VU1.VI       = (REG_VI*)(VU0.Mem + 0x4200);  
         VU1.vuExec   = vu1Exec;  
         VU1.vifRegs  = vif1Regs;  
84  }  }
85    
86  void SaveStateBase::vuMicroFreeze()  void SaveStateBase::vuMicroFreeze()
87  {  {
88          FreezeTag( "vuMicro" );          FreezeTag( "vuMicro" );
89    
90          jASSUME( VU0.Mem != NULL );          pxAssume( VU0.Mem != NULL );
91          jASSUME( VU1.Mem != NULL );          pxAssume( VU1.Mem != NULL );
92    
93          Freeze(VU0.ACC);          Freeze(VU0.ACC);
94          Freeze(VU0.code);  
95            // Seemingly silly and pointless use of temp var:  GCC is unable to bind packed fields
96            // (appears to be a bug, tracked here: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36566 ).
97            // Dereferencing outside the context of the function (via a temp var) seems to circumvent it. --air
98            
99            u32& temp_vu0_code = VU0.code;
100            Freeze(temp_vu0_code);
101    
102          FreezeMem(VU0.Mem,   4*1024);          FreezeMem(VU0.Mem,   4*1024);
103          FreezeMem(VU0.Micro, 4*1024);          FreezeMem(VU0.Micro, 4*1024);
104    
# Line 119  void SaveStateBase::vuMicroFreeze() Line 106  void SaveStateBase::vuMicroFreeze()
106          Freeze(VU0.VI);          Freeze(VU0.VI);
107    
108          Freeze(VU1.ACC);          Freeze(VU1.ACC);
109          Freeze(VU1.code);  
110            u32& temp_vu1_code = VU1.code;
111            Freeze(temp_vu1_code);
112    
113          FreezeMem(VU1.Mem,   16*1024);          FreezeMem(VU1.Mem,   16*1024);
114          FreezeMem(VU1.Micro, 16*1024);          FreezeMem(VU1.Micro, 16*1024);
115    

Legend:
Removed from v.31  
changed lines
  Added in v.62

  ViewVC Help
Powered by ViewVC 1.1.22