当你运行了模拟器,通过模拟器菜单选择并加载一个umd镜像,模拟器就用这个umd镜像实例化一个UmdIsoReader(见上一篇,源码解读5)。

通过这个UmdIsoReader,从光盘提取的第一个文件是:PSP_GAME/param.sfo

这个文件在模拟器源码中用类PSF表示。

文件中存放的是一些关于游戏的参数信息,这些信息被组织成表格。这些信息包括:对系统固件的版本要求,游戏的标题(名字),游戏的类型,游戏分级,语言,游戏版本,本游戏总共的光盘数,本光盘的盘片号 等。

文件的组织方式:最前面是文件头,紧接着放索引,然后是键表,值表。

文件头:

PSF文件标识符,是一个常量0x46535000

PSF格式版本号,常量0x0101

键表起始位置相对于文件起始位置的偏移

值表起始位置相对于文件起始位置的偏移

索引项总数

每一个索引的格式:

键名在键表中的偏移(上述文件头中有键表起始位置,加上这个偏移就可以得到这个索引所指的键)

常量4(可能表示4字节边界对齐)

键值的数据类型(有三种可能的值,分别是 PSF_DATA_TYPE_BINARY = 0,PSF_DATA_TYPE_STRING = 2,PSF_DATA_TYPE_INT32 = 4)

键值有效数据的字节数

键值有效数据加上pad部分,总共的字节数。因为要4字节对齐,所以不对齐时会有pad填充到对齐

键值在值表中的偏移(上述文件头中有值表起始位置,加上这个偏移就可以得到这个索引所指键的值)

回到源码:

UmdIsoReader iso = new UmdIsoReader(file.getPath());    //打开光盘镜像
            UmdIsoFile psfFile = iso.getFile("PSP_GAME/param.sfo"); //从光盘镜像中提取一个参数文件

PSF psf = new PSF();                                 //实例一个PSF文件对象
            byte[] data = new byte[(int) psfFile.length()];     //申请一个字节缓冲区,要容纳下整个psf文件
            psfFile.read(data);                                 //将psf文件内容读取到缓冲区数组中
            psf.read(ByteBuffer.wrap(data));                     //从缓冲区数组中提取psf文件的内容

可以看到,这里是先从光盘中得到param.sfo文件,然后将这个文件读取到一个缓冲数组中,PSF从这个缓冲数组中提取了所有参数信息。

文件格式上文已经说明的很清楚了,PSF类中解析提取数据的实现此处不再赘述。

关于这种文件的组织格式,参考自网址:http://hitmen.c02.at/files/yapspd/psp_doc/chap26.html#sec26.4,基本就是翻译了一下。不过在模拟器的源码中确认了网页中的内容。两处细节似乎稍有差异。

jpcsp源码解读6:PSF文件相关推荐

  1. JPCSP源码解读14:动态二进制翻译2

    JPCSP源码解读14:动态二进制翻译2 IExecutable 上一篇中提到,我们现在有CodeInstruction,代表单条指令,以及其两个子类,分别代表无分支基本块和本地码序列.另外,有cla ...

  2. jpcsp源码解读9:指令的抽象描述与指令的译码

    本文尝试说明jpcsp中译码器单元的实现方式. / 首先是对指令的一个抽象描述,Instruction类: public static abstract class Instruction / jav ...

  3. PTMs:QLoRA技巧之源码解读(qlora.py文件)—解析命令与加载参数→数据预处理→模型训练+评估+推理

    PTMs:QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理→模型训练+评估+推理 目录 QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理 ...

  4. jpcsp源码解读之一:源码的获取与编译,以及psp详尽硬件信息文档

    是我心血来潮的想法,要解读一下psp模拟器的源码,并添加详尽的中文注释.这个博客则成为文档. 本文面向java语言零基础的程序员,因为我本人的java基础就是零. 水平所限,疏漏错误之处欢迎指正.也欢 ...

  5. jpcsp源码解读5:umd光盘镜像(.iso)

    这次的状况稍显复杂. 首先说一下umd光盘镜像文件的内部组织方式.注意,这些内容全部是从源码解读而来,而不是来自关于这种文件格式的标准文档. java科普之文件操作: fileReader = new ...

  6. jpcsp源码解读之二:main函数与jpcsp的初始化流程

    虽然这个软件是用java语言编写,面向对象,可是总要有个开始的入口,这里关心的就是,main函数在哪里. 似乎java中也可以没有main函数,也可能是我的错误认识.暂且不管,jpcsp中是有main ...

  7. jpcsp源码解读12:本地码管理器与Compiler.xml

    jpcsp这个模拟器的优化手段实在让人汗颜. 之前说过,他把系统调用功能全部用本地码实现了,也就是在软件需要的时候,调用java语言的实现,而不是跳转到内存中相应位置去解释执行,或者对系统调用代码做动 ...

  8. Linux源码解读作业之文件篇

    第一题 操作系统文件的内部表示有文件索引节点表(inode).文件表(file).用户文件描述符表(files),请你基于Linux4.19.X源代码,找出其中对应的数据结构定义,并描述一下这三者之间 ...

  9. jpcsp源码解读10:指令的执行

    这次要说的是处理器类: public class Processor 主要的成员变量: public CpuState cpu = new CpuState(); public static fina ...

最新文章

  1. golang笔记——struct
  2. Horizon Is Easy, Horizon Is Complex
  3. xampp mysql.sock_解决xampp自启动和mysql.sock问题
  4. hdu 1496 Equations(技巧hash)
  5. pl/sql command window 初步接触
  6. Keep the Customer Satisfied
  7. Qt Creator使用3D组件
  8. numpy安装失败-小失误
  9. C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法
  10. chatterbot mysql_ChatterBot代码解读-介绍和框架
  11. 技术实践丨列存表并发更新时的锁等待问题原理
  12. Hibernate之Session merge与update方法
  13. 简单的Verilog测试模板结构
  14. 动态的渐变色网页背景
  15. 爱创课堂每日一题-你做的页面在哪些流览器测试过?
  16. 有C++/C的java学习
  17. 【调剂】上海航天802所2023年研究生调剂开始啦!
  18. ftp软件下载,推荐5款免费的ftp软件下载工具
  19. android截包方法
  20. 网站数据库和服务器的连接不上,数据库怎么和网站服务器连接

热门文章

  1. Hugo的安装和生成博客中遇到的问题
  2. 可以和你女朋友一起玩的 《扑克牌游戏》
  3. PyTorch + openCV 车牌识别(一)
  4. 苹果计算机又记录吗,苹果电脑肿么看历史记录
  5. 查重or真伪查验or原件管理,电子发票三大难题,哪个更让人上火?
  6. 全网最详细的nodejs卸载和安装教程
  7. Win11关闭Superfetch服务的操作方法分享
  8. 春节假期北京收费公路免费通行 高峰日交通量或超200万
  9. 语音呼叫系统IVR流程编写文档整理
  10. 2011年10月最新电脑城GhostXPSP3流金岁月装机版V11.10 舞