jpcsp源码解读6:PSF文件
当你运行了模拟器,通过模拟器菜单选择并加载一个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文件相关推荐
- JPCSP源码解读14:动态二进制翻译2
JPCSP源码解读14:动态二进制翻译2 IExecutable 上一篇中提到,我们现在有CodeInstruction,代表单条指令,以及其两个子类,分别代表无分支基本块和本地码序列.另外,有cla ...
- jpcsp源码解读9:指令的抽象描述与指令的译码
本文尝试说明jpcsp中译码器单元的实现方式. / 首先是对指令的一个抽象描述,Instruction类: public static abstract class Instruction / jav ...
- PTMs:QLoRA技巧之源码解读(qlora.py文件)—解析命令与加载参数→数据预处理→模型训练+评估+推理
PTMs:QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理→模型训练+评估+推理 目录 QLoRA技巧之源码解读(qlora.py文件)-解析命令与加载参数→数据预处理 ...
- jpcsp源码解读之一:源码的获取与编译,以及psp详尽硬件信息文档
是我心血来潮的想法,要解读一下psp模拟器的源码,并添加详尽的中文注释.这个博客则成为文档. 本文面向java语言零基础的程序员,因为我本人的java基础就是零. 水平所限,疏漏错误之处欢迎指正.也欢 ...
- jpcsp源码解读5:umd光盘镜像(.iso)
这次的状况稍显复杂. 首先说一下umd光盘镜像文件的内部组织方式.注意,这些内容全部是从源码解读而来,而不是来自关于这种文件格式的标准文档. java科普之文件操作: fileReader = new ...
- jpcsp源码解读之二:main函数与jpcsp的初始化流程
虽然这个软件是用java语言编写,面向对象,可是总要有个开始的入口,这里关心的就是,main函数在哪里. 似乎java中也可以没有main函数,也可能是我的错误认识.暂且不管,jpcsp中是有main ...
- jpcsp源码解读12:本地码管理器与Compiler.xml
jpcsp这个模拟器的优化手段实在让人汗颜. 之前说过,他把系统调用功能全部用本地码实现了,也就是在软件需要的时候,调用java语言的实现,而不是跳转到内存中相应位置去解释执行,或者对系统调用代码做动 ...
- Linux源码解读作业之文件篇
第一题 操作系统文件的内部表示有文件索引节点表(inode).文件表(file).用户文件描述符表(files),请你基于Linux4.19.X源代码,找出其中对应的数据结构定义,并描述一下这三者之间 ...
- jpcsp源码解读10:指令的执行
这次要说的是处理器类: public class Processor 主要的成员变量: public CpuState cpu = new CpuState(); public static fina ...
最新文章
- golang笔记——struct
- Horizon Is Easy, Horizon Is Complex
- xampp mysql.sock_解决xampp自启动和mysql.sock问题
- hdu 1496 Equations(技巧hash)
- pl/sql command window 初步接触
- Keep the Customer Satisfied
- Qt Creator使用3D组件
- numpy安装失败-小失误
- C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法
- chatterbot mysql_ChatterBot代码解读-介绍和框架
- 技术实践丨列存表并发更新时的锁等待问题原理
- Hibernate之Session merge与update方法
- 简单的Verilog测试模板结构
- 动态的渐变色网页背景
- 爱创课堂每日一题-你做的页面在哪些流览器测试过?
- 有C++/C的java学习
- 【调剂】上海航天802所2023年研究生调剂开始啦!
- ftp软件下载,推荐5款免费的ftp软件下载工具
- android截包方法
- 网站数据库和服务器的连接不上,数据库怎么和网站服务器连接