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

Diff of /trunk/pcsx2/Elfheader.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 37  uptr args_ptr;         //a big value; in fact, Line 37  uptr args_ptr;         //a big value; in fact,
37    
38  static bool isEmpty(int addr)  static bool isEmpty(int addr)
39  {  {
40          return ((PS2MEM_BASE[addr] == 0) || (PS2MEM_BASE[addr] == 32));          return ((eeMem->Main[addr] == 0) || (eeMem->Main[addr] == 32));
41  }  }
42    
43  //in a0 is passed the address of the command line args,  //in a0 is passed the address of the command line args,
# Line 70  static uint parseCommandLine( const wxSt Line 70  static uint parseCommandLine( const wxSt
70    
71                  // Copy the parameters into the section of memory at args_ptr,                  // Copy the parameters into the section of memory at args_ptr,
72                  // then zero out anything past the end of args till 256 chars is reached.                  // then zero out anything past the end of args till 256 chars is reached.
73                  memcpy( &PS2MEM_BASE[ args_ptr ], args, 256 );                  memcpy( &eeMem->Main[ args_ptr ], args, 256 );
74                  memset( &PS2MEM_BASE[ args_ptr + strlen( args ) ], 0, 256 - strlen( args ) );                  memset( &eeMem->Main[ args_ptr + strlen( args ) ], 0, 256 - strlen( args ) );
75                  args_end = args_ptr + strlen( args );                  args_end = args_ptr + strlen( args );
76    
77                  // Set p to just the filename, no path.                  // Set p to just the filename, no path.
# Line 90  static uint parseCommandLine( const wxSt Line 90  static uint parseCommandLine( const wxSt
90                  args_ptr -= strlen( p ) + 1;                  args_ptr -= strlen( p ) + 1;
91    
92                  //fill param 0; i.e. name of the program                  //fill param 0; i.e. name of the program
93                  strcpy( (char*)&PS2MEM_BASE[ args_ptr ], p );                  strcpy( (char*)&eeMem->Main[ args_ptr ], p );
94    
95                  // Start from the end of where we wrote to, not including all the zero'd out area.                  // Start from the end of where we wrote to, not including all the zero'd out area.
96                  for ( i = args_end - args_ptr + 1, argc = 0; i > 0; i-- )                  for ( i = args_end - args_ptr + 1, argc = 0; i > 0; i-- )
# Line 98  static uint parseCommandLine( const wxSt Line 98  static uint parseCommandLine( const wxSt
98                          while (i && isEmpty(args_ptr + i ))  { i--; }                          while (i && isEmpty(args_ptr + i ))  { i--; }
99    
100                          // If the last char is a space, set it to 0.                          // If the last char is a space, set it to 0.
101                          if ( PS2MEM_BASE[ args_ptr + i + 1 ] == ' ') PS2MEM_BASE[ args_ptr + i + 1 ] = 0;                          if ( eeMem->Main[ args_ptr + i + 1 ] == ' ') eeMem->Main[ args_ptr + i + 1 ] = 0;
102    
103                          while (i && !isEmpty(args_ptr + i )) { i--; }                          while (i && !isEmpty(args_ptr + i )) { i--; }
104    
# Line 111  static uint parseCommandLine( const wxSt Line 111  static uint parseCommandLine( const wxSt
111                                  ret = args_ptr - 4 - 4 - argc * 4;                                  ret = args_ptr - 4 - 4 - argc * 4;
112    
113                                  if (ret < 0 ) return 0;                                  if (ret < 0 ) return 0;
114                                  ((u32*)PS2MEM_BASE)[ args_ptr / 4 - argc ] = args_ptr + i;                                  ((u32*)eeMem->Main)[ args_ptr / 4 - argc ] = args_ptr + i;
115                          }                          }
116                          else                          else
117                          {                          {
# Line 122  static uint parseCommandLine( const wxSt Line 122  static uint parseCommandLine( const wxSt
122                                          ret = args_ptr - 4 - 4 - argc * 4;                                          ret = args_ptr - 4 - 4 - argc * 4;
123    
124                                          if (ret < 0 ) return 0;                                          if (ret < 0 ) return 0;
125                                          ((u32*)PS2MEM_BASE)[ args_ptr / 4 - argc ] = args_ptr + i + 1;                                          ((u32*)eeMem->Main)[ args_ptr / 4 - argc ] = args_ptr + i + 1;
126                                  }                                  }
127                          }                          }
128                  }                  }
129    
130                  // Pass the number of arguments, and if we have arguments.                  // Pass the number of arguments, and if we have arguments.
131                  ((u32*)PS2MEM_BASE)[ args_ptr /4 - argc - 1 ] = argc;                 //how many args                  ((u32*)eeMem->Main)[ args_ptr /4 - argc - 1 ] = argc;                 //how many args
132                  ((u32*)PS2MEM_BASE)[ args_ptr /4 - argc - 2 ] = ( argc > 0);    //have args?    //not used, cannot be filled at all                  ((u32*)eeMem->Main)[ args_ptr /4 - argc - 2 ] = ( argc > 0);    //have args?    //not used, cannot be filled at all
133    
134                  return ret;                  return ret;
135          }          }
# Line 219  void ElfObject::initElfHeaders() Line 219  void ElfObject::initElfHeaders()
219          if (machine != NULL) ELF_LOG( "machine:  %s", machine );          if (machine != NULL) ELF_LOG( "machine:  %s", machine );
220    
221          ELF_LOG("version:   %d",header.e_version);          ELF_LOG("version:   %d",header.e_version);
222          ELF_LOG("entry:  %08x",header.e_entry);          ELF_LOG("entry:     %08x",header.e_entry);
223          ELF_LOG("flags:     %08x",header.e_flags);          ELF_LOG("flags:     %08x",header.e_flags);
224          ELF_LOG("eh size:   %08x",header.e_ehsize);          ELF_LOG("eh size:   %08x",header.e_ehsize);
225          ELF_LOG("ph off:    %08x",header.e_phoff);          ELF_LOG("ph off:    %08x",header.e_phoff);
# Line 242  bool ElfObject::hasHeaders() { return (h Line 242  bool ElfObject::hasHeaders() { return (h
242  void ElfObject::readIso(IsoFile file)  void ElfObject::readIso(IsoFile file)
243  {  {
244          int rsize = file.read(data.GetPtr(), data.GetSizeInBytes());          int rsize = file.read(data.GetPtr(), data.GetSizeInBytes());
245          if (rsize < data.GetSizeInBytes()) throw Exception::EndOfStream( filename );          if (rsize < data.GetSizeInBytes()) throw Exception::EndOfStream(filename);
246  }  }
247    
248  void ElfObject::readFile()  void ElfObject::readFile()
# Line 257  void ElfObject::readFile() Line 257  void ElfObject::readFile()
257          rsize = fread(data.GetPtr(), 1, data.GetSizeInBytes(), f);          rsize = fread(data.GetPtr(), 1, data.GetSizeInBytes(), f);
258          fclose( f );          fclose( f );
259    
260          if (rsize < data.GetSizeInBytes()) throw Exception::EndOfStream( filename );          if (rsize < data.GetSizeInBytes()) throw Exception::EndOfStream(filename);
261  }  }
262    
263  void ElfObject::checkElfSize(s64 elfsize)  void ElfObject::checkElfSize(s64 elfsize)
264  {  {
265          if (elfsize > 0xfffffff)          if (elfsize > 0xfffffff)
266                  throw Exception::BadStream( filename, wxLt("Illegal ELF file size, over 2GB!") );                  throw Exception::BadStream(filename).SetBothMsgs(wxLt("Illegal ELF file size over 2GB!"));
267    
268          if (elfsize == -1)          if (elfsize == -1)
269                  throw Exception::BadStream( filename, wxLt("Elf file does not exist! ") );                  throw Exception::BadStream(filename).SetBothMsgs(wxLt("ELF file does not exist!"));
270    
271          if (elfsize == 0)          if (elfsize == 0)
272                  throw Exception::BadStream( filename, wxLt("Unexpected end of ELF file: ") );                  throw Exception::BadStream(filename).SetBothMsgs(wxLt("Unexpected end of ELF file."));
273  }  }
274    
275  u32 ElfObject::getCRC()  u32 ElfObject::getCRC()
# Line 318  void ElfObject::loadProgramHeaders() Line 318  void ElfObject::loadProgramHeaders()
318    
319                                          // used to be paddr                                          // used to be paddr
320                                          memcpy_fast(                                          memcpy_fast(
321                                                  &PS2MEM_BASE[proghead[ i ].p_vaddr & 0x1ffffff],                                                  &eeMem->Main[proghead[ i ].p_vaddr & 0x1ffffff],
322                                                  data.GetPtr(proghead[ i ].p_offset), size                                                  data.GetPtr(proghead[ i ].p_offset), size
323                                          );                                          );
324    
# Line 431  int GetPS2ElfName( wxString& name ) Line 431  int GetPS2ElfName( wxString& name )
431                  int size = file.getLength();                  int size = file.getLength();
432                  if( size == 0 ) return 0;                  if( size == 0 ) return 0;
433    
   
434                  while( !file.eof() )                  while( !file.eof() )
435                  {                  {
436                          wxString original( fromUTF8(file.readLine().c_str()) );                          const wxString original( fromUTF8(file.readLine().c_str()) );
437                          ParsedAssignmentString parts( original );                          const ParsedAssignmentString parts( original );
438    
439                          if( parts.lvalue.IsEmpty() && parts.rvalue.IsEmpty() ) continue;                          if( parts.lvalue.IsEmpty() && parts.rvalue.IsEmpty() ) continue;
440                          if( parts.rvalue.IsEmpty() )                          if( parts.rvalue.IsEmpty() )
441                          {                          {
442                                  Console.Error( "(GetElfName) Unusual or malformed entry in SYSTEM.CNF ignored:" );                                  Console.Warning( "(SYSTEM.CNF) Unusual or malformed entry in SYSTEM.CNF ignored:" );
443                                  Console.Indent().WriteLn( original );                                  Console.Indent().WriteLn( original );
444                                  continue;                                  continue;
445                          }                          }
# Line 448  int GetPS2ElfName( wxString& name ) Line 447  int GetPS2ElfName( wxString& name )
447                          if( parts.lvalue == L"BOOT2" )                          if( parts.lvalue == L"BOOT2" )
448                          {                          {
449                                  name = parts.rvalue;                                  name = parts.rvalue;
450                                  Console.WriteLn( Color_StrongBlue, L"(GetElfName) Detected PS2 Disc = " + name );                                  Console.WriteLn( Color_StrongBlue, L"(SYSTEM.CNF) Detected PS2 Disc = " + name );
451                                  retype = 2;                                  retype = 2;
452                          }                          }
453                          else if( parts.lvalue == L"BOOT" )                          else if( parts.lvalue == L"BOOT" )
454                          {                          {
455                                  name = parts.rvalue;                                  name = parts.rvalue;
456                                  Console.WriteLn( Color_StrongBlue, L"(GetElfName) Detected PSX/PSone Disc = " + name );                                  Console.WriteLn( Color_StrongBlue, L"(SYSTEM.CNF) Detected PSX/PSone Disc = " + name );
457                                  retype = 1;                                  retype = 1;
458                          }                          }
459                          else if( parts.lvalue == L"VMODE" )                          else if( parts.lvalue == L"VMODE" )
460                          {                          {
461                                  Console.WriteLn( Color_StrongBlue, L"(GetElfName) Disc region type = " + parts.rvalue );                                  Console.WriteLn( Color_Blue, L"(SYSTEM.CNF) Disc region type = " + parts.rvalue );
462                          }                          }
463                          else if( parts.lvalue == L"VER" )                          else if( parts.lvalue == L"VER" )
464                          {                          {
465                                  Console.WriteLn( Color_StrongBlue, L"(GetElfName) Software version = " + parts.rvalue );                                  Console.WriteLn( Color_Blue, L"(SYSTEM.CNF) Software version = " + parts.rvalue );
466                          }                          }
467                  }                  }
468    
# Line 473  int GetPS2ElfName( wxString& name ) Line 472  int GetPS2ElfName( wxString& name )
472                          return 0;                          return 0;
473                  }                  }
474          }          }
475          catch (Exception::BadStream&)          catch (Exception::BadStream& ex)
476          {          {
477                    Console.Error(ex.FormatDiagnosticMessage());
478                  return 0;               // ISO error                  return 0;               // ISO error
479          }          }
480          catch( Exception::FileNotFound& )          catch( Exception::FileNotFound& )
481          {          {
482                    //Console.Warning(ex.FormatDiagnosticMessage());
483                  return 0;               // no SYSTEM.CNF, not a PS1/PS2 disc.                  return 0;               // no SYSTEM.CNF, not a PS1/PS2 disc.
484          }          }
485    

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

  ViewVC Help
Powered by ViewVC 1.1.22