PSVITACHEAT · 代码格式手册
代码格式手册.
读懂字段,组合代码。
完整整理原手册的格式与示例,补充 Z06 模块寻址说明。
.psv
代码文件结构
代码文件以游戏的 Title ID 命名,例如 PCSH00297.psv,放在 ux0:vitacheat/db/。游戏编号和版本可从 sce_sys/param.sfo 确认。
一个文件由游戏信息、条目名称和若干代码行组成。同一条目的多行代码按顺序构成一个修改项。
| 字段 | 含义 | 说明 |
|---|---|---|
| # | 游戏信息或注释 | 建议包含游戏编号、名称与版本。 |
| _V0 名称 | 默认关闭的条目 | 这是原 VitaCheat 的文件语义。 |
| _V1 名称 | 默认开启的条目 | Overlay 读取该标记,但新会话不会自动执行。 |
| $ | 代码行起始符 | 后面依次为操作段、地址段和数值段。 |
文件示例
# PCSH00297 Ys VIII CHT 1.02
_V0 EXTRA MAX
$A100 8124D8C6 0000BF00
_V1 SP Max
$3201 8148A1F0 00048240
$3300 00000000 00002710以 _V0 或 _V1 开始一个条目,后续 $ 行归属于这个条目。
$AAAA BBBBBBBB CCCCCCCC
一行代码的组成
三段使用空格分隔,字段由十六进制字符构成。AAAA 为 4 位,后两段各为 8 位;即使只写一个字节,也需要补齐字段。
字段含义由代码类型决定。传送码的第三段是源地址,压缩码的参数行则表示次数、地址间距与数值间距。
$AAAA BBBBBBBB CCCCCCCC| 字段 | 含义 | 说明 |
|---|---|---|
| AAAA | 操作段 | 类型、数据位宽、关联行数或指针级数等信息。 |
| BBBBBBBB | 地址段 | 通常为目标地址;也可能为基地址、模式或步长。 |
| CCCCCCCC | 数值段 | 通常为写入值;也可能为源地址、偏移或按键掩码。 |
| X = 0 / 1 / 2 | 常用位宽编码 | 分别为 8 / 16 / 32 bit;32 位字段也可保存浮点原始位模式。 |
32 位数值
$0200 81481280 05F5E0FF操作码 0200 表示 32 位直接写入。05F5E0FF 是十进制 99,999,999。
$0X00
直接写入
向指定的数据地址写入一个 8、16 或 32 位数值。它没有关联参数行。
$0X00 BBBBBBBB CCCCCCCC| 字段 | 含义 | 说明 |
|---|---|---|
| X | 写入位宽 | 0 = 8 bit;1 = 16 bit;2 = 32 bit。 |
| 00 | 关联行数 | 固定为 00。 |
| BBBBBBBB | 目的地址 | 需要写入的有效内存地址。 |
| CCCCCCCC | 写入值 | 8 位用低 2 个十六进制位;16 位用低 4 位;32 位用全部 8 位。 |
16 位写入
_V0 bait 990
$0100 83823288 000003DE将 0x3DE(十进制 990)作为 16 位数值写入 0x83823288。
32 位写入
_V1 OR 99999999
$0200 81481280 05F5E0FF将十进制 99,999,999 的 32 位编码写入目标地址。
$5X00
内存传送
从源地址读取一个数值,再写入目的地址。这里第三段是地址,不是字面写入值。
$5X00 BBBBBBBB CCCCCCCC| 字段 | 含义 | 说明 |
|---|---|---|
| X | 传送位宽 | 0 / 1 / 2 对应 8 / 16 / 32 bit。 |
| 00 | 关联行数 | 固定为 00。 |
| BBBBBBBB | 目的地址 | 读取后的数值写入此处。 |
| CCCCCCCC | 源地址 | 从此处读取数值。 |
16 位复制
_V0 Infinite Health
$5100 821F4FB8 821F4FB6从 0x821F4FB6 读取 16 位数据,复制到 0x821F4FB8。
$4X01
压缩写入
用两行表达多次写入。第一行给出起始地址和值,第二行给出次数及两种步长。第二行不能作为独立代码解释。
$4X01 BBBBBBBB CCCCCCCC
$NNNN SSSSSSSS VVVVVVVV| 字段 | 含义 | 说明 |
|---|---|---|
| X | 写入位宽 | 0 / 1 / 2 对应 8 / 16 / 32 bit。 |
| 01 | 关联行数 | 后面必须有一行参数。 |
| BBBBBBBB / CCCCCCCC | 起始地址 / 起始值 | 第一次写入使用的地址与数值。 |
| NNNN | 次数 | 十六进制写入数量。 |
| SSSSSSSS | 地址间距 | 相邻目标地址的差值,以字节计算。 |
| VVVVVVVV | 数值间距 | 每次写入后数值的增量;0 表示保持不变。 |
连续写入四次
_V1 Unlock Galley
$4101 82CDE530 000000FF
$0004 00000006 00000001以 16 位写入四次,地址每次增加 6,数值每次增加 1。
等同于以下写入:
$0100 82CDE530 000000FF
$0100 82CDE536 00000100
$0100 82CDE53C 00000101
$0100 82CDE542 00000102$3XZZ
指针写入
先从基地址读取指针并加上偏移,再按相同规则逐级定位。最终目标由实际指针内容决定,而不是把所有偏移直接相加。
$3XZZ BBBBBBBB OOOOOOO1
$3X00 00000000 OOOOOOO2
…
$3300 00000000 CCCCCCCC| 字段 | 含义 | 说明 |
|---|---|---|
| X | 最终写入位宽 | 0 / 1 / 2 对应 8 / 16 / 32 bit。 |
| ZZ | 指针级数 | 指针行的数量,不包括最后的 3300 写入行。 |
| BBBBBBBB | 基地址 | 第一级指针读取的位置。 |
| OOOOOOOn | 各级偏移 | 读出该级指针后加上的偏移。 |
| 3300 | 写入结束行 | 第二段为 0,第三段为最终写入值。 |
定位过程
P1 = read32(8632AE30) + EA20P2 = read32(P1) + 100目标 = read32(P2) + C4
三级指针
_V1 CP 99,999
$3203 8632AE30 0000EA20
$3200 00000000 00000100
$3200 00000000 000000C4
$3300 00000000 0001869F从基地址逐级读取,偏移依次为 EA20、100、C4,最后以 32 位写入 99,999。
$8XZZ / $8YZZ
指针传送
分别计算目的指针链和源指针链,再把源目标上的值复制到目的目标。两个部分用 8800 和 8900 结束。
$8XZZ BBBBBBBB OOOOOOO1
$8X00 00000000 OOOOOOO2
…
$8800 00000000 00000000
$8YZZ DDDDDDDD PPPPPPP1
$8Y00 00000000 PPPPPPP2
…
$8900 00000000 00000000| 字段 | 含义 | 说明 |
|---|---|---|
| X = 0 / 1 / 2 | 目的链位宽 | 分别为 8 / 16 / 32 bit。 |
| Y = 4 / 5 / 6 | 源链位宽标记 | 分别为 8 / 16 / 32 bit。 |
| ZZ | 各链的级数 | 每条链独立写出级数与各级偏移。 |
| 8800 | 目的链结束 | 第二段与第三段均为 0。 |
| 8900 | 源链结束 | 第二段与第三段均为 0。 |
三级、16 位指针复制
_V0 INFINITE MAGIC USAGE
$8103 8789C5E4 00047E80
$8100 00000000 00000004
$8100 00000000 000002E8
$8800 00000000 00000000
$8503 8789C5E8 00000010
$8500 00000000 00000014
$8500 00000000 000002EC
$8900 00000000 00000000目的链偏移为 47E80 → 4 → 2E8;源链偏移为 10 → 14 → 2EC,最终复制 16 位数据。
$7XYY / $77ZZ
指针压缩
组合指针链和重复写入。重复操作可以发生在基地址、链的中间级或最后一级;不能一律理解为只改变最终目标地址。
$7XYY BBBBBBBB OOOOOOO1
$7X00 00000000 OOOOOOO2
…
$77ZZ 00000000 CCCCCCCC
$NNNN SSSSSSSS VVVVVVVV| 字段 | 含义 | 说明 |
|---|---|---|
| X | 写入位宽 | 0 / 1 / 2 对应 8 / 16 / 32 bit。 |
| YY | 指针级数 | 指针行数量,不含 77ZZ 与最后的参数行。 |
| ZZ | 压缩作用级 | 范围 0 ≤ ZZ ≤ YY;0 是基地址,YY 是最后一级。 |
| CCCCCCCC | 起始数值 | 位宽由第一行的 X 决定。 |
| NNNN | 重复次数 | 十六进制数量。 |
| SSSSSSSS / VVVVVVVV | 地址 / 数值间距 | 分别改变所选级的位置和写入值。 |
在最后一级重复
_V1 CP 99,999
$7203 85C0B048 00000100
$7200 00000000 000000D4
$7200 00000000 00000008
$7703 00000000 447A0000
$0004 00000008 00000000三级链,ZZ=3。最后一级偏移依次为 8、10、18、20(十六进制),每次写入相同的 32 位值。
在第一级重复
_V0 ITEM 96+
$7003 85C0B048 00010100
$7000 00000000 00000FD4
$7000 00000000 00000008
$7701 00000000 00000060
$0005 00000004 00000001三级链,ZZ=1。第一级偏移依次为 10100、10104、10108、1010C、10110;8 位写入值依次为 60 到 64。每次都重新计算后续指针。
在基地址重复
_V1 TP 9,999
$7104 82E40F10 00000000
$7100 00000000 00000E50
$7100 00000000 00000018
$7100 00000000 0000000C
$7700 00000000 0000270F
$0006 00000010 00000000ZZ=0。基地址依次为 82E40F10、82E40F20、82E40F30、82E40F40、82E40F50、82E40F60,每次沿四级链以 16 位写入 270F。
$AX00
程序段写入
用于修改程序段中的指令。支持 16 位与 32 位写入,应根据实际 ARM / Thumb 指令边界选择地址与长度。
$AX00 BBBBBBBB CCCCCCCC| 字段 | 含义 | 说明 |
|---|---|---|
| X = 1 / 2 | 写入宽度 | 分别为 16 / 32 bit。 |
| 00 | 关联行数 | 固定为 00。 |
| BBBBBBBB | 目标地址 | 需要修改指令的位置。 |
| CCCCCCCC | 指令位模式 | 16 位使用低 4 个十六进制位,32 位使用全部 8 位。 |
16 位 Thumb NOP
_V0 EXTRA MAX
$A100 8114C8A2 0000BF00写入半字 BF00,内存中的两个字节为 00 BF。该示例为 Thumb NOP。
32 位位模式
_V1 Branch Test
$A200 81132EA8 BE12F075写入数值 BE12F075,内存字节依次为 75 F0 12 BE。指令解释必须结合实际指令集和位置。
$B2XX
模块相对寻址
Z06 将 B2 扩展为选择模块序号与段。后续代码中的相对地址以选中段的实际基址为起点,可以减少固定加载地址变化带来的影响。
$B2XX 0000000Y 00000000| 字段 | 含义 | 说明 |
|---|---|---|
| XX | 模块序号 | 十六进制模块编号,写在操作码的低两位。不是模块 UID。 |
| Y = 0 | seg0 | 通常为程序段。 |
| Y = 1 | seg1 | 通常为数据段。 |
| 最后一段 | 保留字段 | 使用 00000000。 |
模块 0、程序段补丁
_V0 Max Gil After Using
$B200 00000000 00000000
$A100 001CD8C4 0000BF00相当于在模块 0 的 seg0 基址加 001CD8C4 的位置写入 16 位补丁。
模块 0、数据段批量写入
_V0 All Item 99
$B200 00000001 00000000
$4001 00FFF96C 00000063
$006F 00000001 00000000选择 seg1 后,从相对地址 00FFF96C 开始写入 6F 次,地址间距 1,每次写入 8 位 63。
$C2AA
按键条件
条件行控制后续 AA 行代码是否执行。按键值由各按钮位掩码组合而成,例如 L + R 为 00000300。
$C2AA 0000MMMM CCCCCCCC| 字段 | 含义 | 说明 |
|---|---|---|
| AA | 关联行数 | 十六进制表示后续受控代码行数量。 |
| MMMM | 历史设备模式 | Z04 手册定义见下表;这是版本相关字段。 |
| CCCCCCCC | 按钮位掩码 | 多个按钮的值按位 OR 合并。 |
按钮位掩码
| 按钮 | 十六进制值 |
|---|---|
| SELECT | 00000001 |
| START | 00000008 |
| ↑ | 00000010 |
| → | 00000020 |
| ↓ | 00000040 |
| ← | 00000080 |
| L | 00000100 |
| R | 00000200 |
| △ 三角 | 00001000 |
| ○ 圈 | 00002000 |
| × 叉 | 00004000 |
| □ 方块 | 00008000 |
| 无按键 | 00000000 |
L + R 时执行三行
_V0 EXTRA MAX
$C203 00000001 00000300
$0100 8109C5E4 00003846
$0100 8789C5E6 000000BF
$0200 8789C5E8 07F16307按钮满足条件时执行下面三行;不满足时跳过受控行。
$DXAA
内存比较条件
读取目标地址的数值并比较,根据条件决定是否执行之后的 AA 行。X 同时指定比较方式和位宽,共 12 种组合。
$DXAA BBBBBBBB CCCCCCCC| 字段 | 含义 | 说明 |
|---|---|---|
| X | 比较类型 / 位宽 | 按下表选择。 |
| AA | 关联行数 | 十六进制的后续受控行数量。 |
| BBBBBBBB | 比较地址 | 要读取的目标地址。 |
| CCCCCCCC | 比较值 | 对应位宽的十六进制数值或位模式。 |
比较类型
| 关系 | 8 bit | 16 bit | 32 bit |
|---|---|---|---|
| 等于 | X = 0 | X = 1 | X = 2 |
| 不等于 | X = 3 | X = 4 | X = 5 |
| 大于 | X = 6 | X = 7 | X = 8 |
| 小于 | X = 9 | X = A | X = B |
目标字节等于 5 时写入
_V0 GP999,999,999
$D001 81504000 00000005
$0200 81504780 3B9AC9FF地址 81504000 的 8 位值等于 5 时,向 81504780 以 32 位写入 999,999,999。写入行已更正原 PDF 的操作码笔误。
Z04 → Z06 → Overlay
版本差异与勘误
本页覆盖原 PDF 的文件结构、基础行格式和全部九个代码家族,并补充 Z06 的 B2 规则。页码标注使用手册的正文页码;PDF 页序号比正文多 1。
| 字段 | 含义 | 说明 |
|---|---|---|
| 编码 | Z04 → Z06 | Z04 的 ANSI 说明是历史行为,Z06 官网改为 UTF-8。Overlay 支持 UTF-8 / GBK。 |
| 默认启用 | 原版 → Overlay | 原版 _V1 默认开启;Overlay 新会话全部关闭。 |
| 容量 | 不同版本 | PDF 写有 50 条描述 / 200 条代码;Z06 网页说明 50 组、每组最多 200 行。Overlay 使用独立容量限制。 |
| B2 | Z06 补充 | 模块编号写在 XX,段编号写在第二段的 Y。不要交换两个字段。 |
| 指针传送 | Z04 要求 | 原手册要求源与目的链的位宽、级数相同,后续实现不能仅据此推断。 |
| 按键模式 | Z04 表与后续实现 | 保留旧模式表作为参考;Z06 / Overlay 按完整按键位掩码匹配。 |
继续了解
准备在游戏中使用?
VitaCheat Overlay 直接读取你的 .psv 列表。安装与操作说明请查看项目。
查看 VitaCheat Overlay 原手册来源 · Google Drive