public void LoadTest() { var pbp = new Pbp(); pbp.Load(File.OpenRead("../../../TestInput/HelloJpcsp.pbp")); }
public void _LoadFile(string fileName) { //GC.Collect(); SetVirtualFolder(Path.GetDirectoryName(fileName)); var memoryStream = new PspMemoryStream(PspMemory); var arguments = new[] { "ms0:/PSP/GAME/virtual/EBOOT.PBP", }; Stream loadStream = File.OpenRead(fileName); //using () { var elfLoadStreamTry = new List <Stream>(); //Stream ElfLoadStream = null; var format = new FormatDetector().DetectSubType(loadStream); string title = null; switch (format) { case FormatDetector.SubType.Pbp: { var pbp = new Pbp().Load(loadStream); elfLoadStreamTry.Add(pbp[Pbp.Types.PspData]); Logger.TryCatch(() => { var paramSfo = new Psf().Load(pbp[Pbp.Types.ParamSfo]); if (paramSfo.EntryDictionary.ContainsKey("TITLE")) { title = (string)paramSfo.EntryDictionary["TITLE"]; } if (paramSfo.EntryDictionary.ContainsKey("PSP_SYSTEM_VER")) { HleConfig.FirmwareVersion = paramSfo.EntryDictionary["PSP_SYSTEM_VER"].ToString(); } }); } break; case FormatDetector.SubType.Elf: elfLoadStreamTry.Add(loadStream); break; case FormatDetector.SubType.Dax: case FormatDetector.SubType.Cso: case FormatDetector.SubType.Iso: { arguments[0] = "disc0:/PSP/GAME/SYSDIR/EBOOT.BIN"; var iso = SetIso(fileName); Logger.TryCatch(() => { var paramSfo = new Psf().Load(iso.Root.Locate("/PSP_GAME/PARAM.SFO").Open()); title = (string)paramSfo.EntryDictionary["TITLE"]; }); var filesToTry = new[] { "/PSP_GAME/SYSDIR/BOOT.BIN", "/PSP_GAME/SYSDIR/EBOOT.BIN", "/PSP_GAME/SYSDIR/EBOOT.OLD", }; foreach (var fileToTry in filesToTry) { try { elfLoadStreamTry.Add(iso.Root.Locate(fileToTry).Open()); } catch (Exception e) { Console.WriteLine(e); } //if (ElfLoadStream.Length != 0) break; } /* * if (ElfLoadStream.Length == 0) * { * throw (new Exception(String.Format("{0} files are empty", String.Join(", ", FilesToTry)))); * } */ } break; default: throw (new NotImplementedException("Can't load format '" + format + "'")); } Exception loadException = null; HleModuleGuest hleModuleGuest = null; foreach (var elfLoadStream in elfLoadStreamTry) { try { loadException = null; if (elfLoadStream.Length < 256) { throw(new InvalidProgramException("File too short")); } hleModuleGuest = Loader.LoadModule( elfLoadStream, memoryStream, MemoryManager.GetPartition(MemoryPartitions.User), ModuleManager, title, moduleName: fileName, isMainModule: true ); loadException = null; break; } catch (InvalidProgramException e) { loadException = e; } } if (loadException != null) { throw loadException; } RegisterSyscalls(); const uint startArgumentAddress = 0x08000100; var endArgumentAddress = startArgumentAddress; var argumentsChunk = arguments .Select(argument => Encoding.UTF8.GetBytes(argument + "\0")) .Aggregate(new byte[] { }, (accumulate, chunk) => accumulate.Concat(chunk)) ; var reservedSyscallsPartition = MemoryManager.GetPartition(MemoryPartitions.Kernel0).Allocate( 0x100, Name: "ReservedSyscallsPartition" ); var argumentsPartition = MemoryManager.GetPartition(MemoryPartitions.Kernel0).Allocate( argumentsChunk.Length, Name: "ArgumentsPartition" ); PspMemory.WriteBytes(argumentsPartition.Low, argumentsChunk); Debug.Assert(ThreadManForUser != null); // @TODO: Use Module Manager //var MainThread = ThreadManager.Create(); //var CpuThreadState = MainThread.CpuThreadState; var currentCpuThreadState = new CpuThreadState(CpuProcessor); { if (hleModuleGuest == null) { //throw new InvalidOperationException("hleModuleGuest == null"); } //CpuThreadState.PC = Loader.InitInfo.PC; currentCpuThreadState.Gp = hleModuleGuest.InitInfo.Gp; currentCpuThreadState.CallerModule = hleModuleGuest; var threadId = (int)ThreadManForUser.sceKernelCreateThread(currentCpuThreadState, "<EntryPoint>", hleModuleGuest.InitInfo.Pc, 10, 0x1000, PspThreadAttributes.ClearStack, null); //var Thread = HleThreadManager.GetThreadById(ThreadId); ThreadManForUser._sceKernelStartThread(currentCpuThreadState, threadId, argumentsPartition.Size, argumentsPartition.Low); //Console.WriteLine("RA: 0x{0:X}", CurrentCpuThreadState.RA); } currentCpuThreadState.DumpRegisters(); MemoryManager.GetPartition(MemoryPartitions.User).Dump(); //ModuleManager.LoadedGuestModules.Add(HleModuleGuest); //MainThread.CurrentStatus = HleThread.Status.Ready; } }
public static GameEntry HandleIso(string IsoFile) { var IsoFileInfo = new FileInfo(IsoFile); Psf ParamSfo; var Entry = new GameEntry(); byte[] Icon0Png; string UmdData = string.Empty; if (DefaultIcon == null) { var TempMemoryStream = new MemoryStream(); Properties.Resources.icon0.Save(TempMemoryStream, ImageFormat.Png); DefaultIcon = TempMemoryStream.ToArray(); } using (var IsoStream = File.OpenRead(IsoFile)) { switch (new FormatDetector().DetectSubType(IsoStream)) { case FormatDetector.SubType.Pbp: var PBP = new Pbp().Load(File.OpenRead(IsoFile)); ParamSfo = new Psf(PBP[Pbp.Types.ParamSfo]); Icon0Png = PBP.ContainsKey(Pbp.Types.Icon0Png) ? PBP[Pbp.Types.Icon0Png].ReadAll() : DefaultIcon; UmdData = "---"; break; case FormatDetector.SubType.Iso: case FormatDetector.SubType.Cso: case FormatDetector.SubType.Dax: using (var Iso = IsoLoader.GetIso(IsoFile)) { var FileSystem = new HleIoDriverIso(Iso); if (!FileSystem.FileExists("/PSP_GAME/PARAM.SFO")) { throw (new Exception($"Not a PSP ISO '{IsoFile}'")); } ParamSfo = new Psf(new MemoryStream(FileSystem.OpenRead("/PSP_GAME/PARAM.SFO").ReadAll())); if (FileSystem.FileExists("/UMD_DATA.BIN")) { UmdData = FileSystem.OpenRead("/UMD_DATA.BIN").ReadAllContentsAsString(); } Icon0Png = FileSystem.FileExists("/PSP_GAME/ICON0.PNG") ? FileSystem.OpenRead("/PSP_GAME/ICON0.PNG").ReadAll() : DefaultIcon; Entry.PatchedWithPrometheus = FileSystem.FileExists("/PSP_GAME/SYSDIR/prometheus.prx") || FileSystem.FileExists("/PSP_GAME/SYSDIR/EBOOT.OLD"); } break; default: return(null); } } FillGameEntryFromSfo(Entry, ParamSfo); Entry.IsoSize = IsoFileInfo.Length; Entry.Hash = GetHash(IsoFile); Entry.IsoFile = IsoFile; Entry.DiscId0 = UmdData.Split('|')[0]; Entry.Icon0Png = Icon0Png; return(Entry); }
public void _LoadFile(String FileName) { //GC.Collect(); SetVirtualFolder(Path.GetDirectoryName(FileName)); var MemoryStream = new PspMemoryStream(PspMemory); var Loader = PspEmulatorContext.GetInstance <ElfPspLoader>(); Stream LoadStream = File.OpenRead(FileName); //using () { Stream ElfLoadStream = null; var Format = new FormatDetector().Detect(LoadStream); switch (Format) { case "Pbp": ElfLoadStream = new Pbp().Load(LoadStream)["psp.data"]; break; case "Elf": ElfLoadStream = LoadStream; break; case "Cso": case "Iso": { var Iso = SetIso(FileName); ElfLoadStream = Iso.Root.Locate("/PSP_GAME/SYSDIR/BOOT.BIN").Open(); } break; default: throw (new NotImplementedException("Can't load format '" + Format + "'")); } Loader.Load( ElfLoadStream, MemoryStream, HleState.MemoryManager.GetPartition(HleMemoryManager.Partitions.User), HleState.ModuleManager ); RegisterSyscalls(); uint CODE_PTR_ARGUMENTS = 0x08000100; { var BinaryWriter = new BinaryWriter(MemoryStream); var StreamWriter = new StreamWriter(MemoryStream); StreamWriter.AutoFlush = true; MemoryStream.Position = CODE_PTR_ARGUMENTS; BinaryWriter.Write((uint)(CODE_PTR_ARGUMENTS + 4)); BinaryWriter.Flush(); StreamWriter.Write("ms0:/PSP/GAME/virtual/EBOOT.PBP\0"); StreamWriter.Flush(); } uint argc = 1; uint argv = CODE_PTR_ARGUMENTS + 4; //uint argv = CODE_PTR_ARGUMENTS; var MainThread = HleState.ThreadManager.Create(); var CpuThreadState = MainThread.CpuThreadState; { CpuThreadState.PC = Loader.InitInfo.PC; CpuThreadState.GP = Loader.InitInfo.GP; CpuThreadState.SP = HleState.MemoryManager.GetPartition(HleMemoryManager.Partitions.User).Allocate(0x1000, MemoryPartition.Anchor.High, Alignment: 0x100).High; CpuThreadState.K0 = MainThread.CpuThreadState.SP; CpuThreadState.RA = HleEmulatorSpecialAddresses.CODE_PTR_EXIT_THREAD; CpuThreadState.GPR[4] = (int)argc; // A0 CpuThreadState.GPR[5] = (int)argv; // A1 } CpuThreadState.DumpRegisters(); HleState.MemoryManager.GetPartition(HleMemoryManager.Partitions.User).Dump(); MainThread.CurrentStatus = HleThread.Status.Ready; } }