PSVITACHEAT · 代码格式手册

代码格式手册.

读懂字段,组合代码。
完整整理原手册的格式与示例,补充 Z06 模块寻址说明。

13 个章节10 类代码原手册 2017-09-10
来源

基于 PSVITACHEAT 代码文件手册 · v360.z04 Beta(简体中文)的 20 页内容整理。B2 与编码补充来自 Z06 官网。涉及版本差异或原文笔误的地方已单独注明。

01

.psv

代码文件结构

正文 3

代码文件以游戏的 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 开始一个条目,后续 $ 行归属于这个条目。

02

$AAAA BBBBBBBB CCCCCCCC

一行代码的组成

正文 4

三段使用空格分隔,字段由十六进制字符构成。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。

03

$0X00

直接写入

正文 5

向指定的数据地址写入一个 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 位编码写入目标地址。

04

$5X00

内存传送

正文 6

从源地址读取一个数值,再写入目的地址。这里第三段是地址,不是字面写入值。

格式
$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。

05

$4X01

压缩写入

正文 7

用两行表达多次写入。第一行给出起始地址和值,第二行给出次数及两种步长。第二行不能作为独立代码解释。

格式
$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
06

$3XZZ

指针写入

正文 8–9

先从基地址读取指针并加上偏移,再按相同规则逐级定位。最终目标由实际指针内容决定,而不是把所有偏移直接相加。

格式
$3XZZ BBBBBBBB OOOOOOO1
$3X00 00000000 OOOOOOO2
…
$3300 00000000 CCCCCCCC
字段含义说明
X最终写入位宽0 / 1 / 2 对应 8 / 16 / 32 bit。
ZZ指针级数指针行的数量,不包括最后的 3300 写入行。
BBBBBBBB基地址第一级指针读取的位置。
OOOOOOOn各级偏移读出该级指针后加上的偏移。
3300写入结束行第二段为 0,第三段为最终写入值。

定位过程

  1. P1 = read32(8632AE30) + EA20
  2. P2 = read32(P1) + 100
  3. 目标 = 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。

07

$8XZZ / $8YZZ

指针传送

正文 10–12

分别计算目的指针链和源指针链,再把源目标上的值复制到目的目标。两个部分用 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 位数据。

08

$7XYY / $77ZZ

指针压缩

正文 13–16

组合指针链和重复写入。重复操作可以发生在基地址、链的中间级或最后一级;不能一律理解为只改变最终目标地址。

格式
$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 00000000

ZZ=0。基地址依次为 82E40F10、82E40F20、82E40F30、82E40F40、82E40F50、82E40F60,每次沿四级链以 16 位写入 270F。

09

$AX00

程序段写入

正文 17

用于修改程序段中的指令。支持 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。指令解释必须结合实际指令集和位置。

10

$B2XX

模块相对寻址

Z06 网页 §4.7

Z06 将 B2 扩展为选择模块序号与段。后续代码中的相对地址以选中段的实际基址为起点,可以减少固定加载地址变化带来的影响。

格式
$B2XX 0000000Y 00000000
字段含义说明
XX模块序号十六进制模块编号,写在操作码的低两位。不是模块 UID。
Y = 0seg0通常为程序段。
Y = 1seg1通常为数据段。
最后一段保留字段使用 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。

11

$C2AA

按键条件

正文 18

条件行控制后续 AA 行代码是否执行。按键值由各按钮位掩码组合而成,例如 L + R 为 00000300。

格式
$C2AA 0000MMMM CCCCCCCC
字段含义说明
AA关联行数十六进制表示后续受控代码行数量。
MMMM历史设备模式Z04 手册定义见下表;这是版本相关字段。
CCCCCCCC按钮位掩码多个按钮的值按位 OR 合并。

按钮位掩码

按钮十六进制值
SELECT00000001
START00000008
↑00000010
→00000020
↓00000040
←00000080
L00000100
R00000200
△ 三角00001000
○ 圈00002000
× 叉00004000
□ 方块00008000
无按键00000000

L + R 时执行三行

示例
_V0 EXTRA MAX
$C203 00000001 00000300
$0100 8109C5E4 00003846
$0100 8789C5E6 000000BF
$0200 8789C5E8 07F16307

按钮满足条件时执行下面三行;不满足时跳过受控行。

12

$DXAA

内存比较条件

正文 19

读取目标地址的数值并比较,根据条件决定是否执行之后的 AA 行。X 同时指定比较方式和位宽,共 12 种组合。

格式
$DXAA BBBBBBBB CCCCCCCC
字段含义说明
X比较类型 / 位宽按下表选择。
AA关联行数十六进制的后续受控行数量。
BBBBBBBB比较地址要读取的目标地址。
CCCCCCCC比较值对应位宽的十六进制数值或位模式。

比较类型

关系8 bit16 bit32 bit
等于X = 0X = 1X = 2
不等于X = 3X = 4X = 5
大于X = 6X = 7X = 8
小于X = 9X = AX = B

目标字节等于 5 时写入

示例
_V0 GP999,999,999
$D001 81504000 00000005
$0200 81504780 3B9AC9FF

地址 81504000 的 8 位值等于 5 时,向 81504780 以 32 位写入 999,999,999。写入行已更正原 PDF 的操作码笔误。

13

Z04 → Z06 → Overlay

版本差异与勘误

全文与 Z06 补充

本页覆盖原 PDF 的文件结构、基础行格式和全部九个代码家族,并补充 Z06 的 B2 规则。页码标注使用手册的正文页码;PDF 页序号比正文多 1。

字段含义说明
编码Z04 → Z06Z04 的 ANSI 说明是历史行为,Z06 官网改为 UTF-8。Overlay 支持 UTF-8 / GBK。
默认启用原版 → Overlay原版 _V1 默认开启;Overlay 新会话全部关闭。
容量不同版本PDF 写有 50 条描述 / 200 条代码;Z06 网页说明 50 组、每组最多 200 行。Overlay 使用独立容量限制。
B2Z06 补充模块编号写在 XX,段编号写在第二段的 Y。不要交换两个字段。
指针传送Z04 要求原手册要求源与目的链的位宽、级数相同,后续实现不能仅据此推断。
按键模式Z04 表与后续实现保留旧模式表作为参考;Z06 / Overlay 按完整按键位掩码匹配。

继续了解

准备在游戏中使用?

VitaCheat Overlay 直接读取你的 .psv 列表。安装与操作说明请查看项目。

查看 VitaCheat Overlay 原手册来源 · Google Drive