Skip to content

Instantly share code, notes, and snippets.

@RGBA-CRT
Last active July 15, 2024 11:42
Show Gist options
  • Save RGBA-CRT/4ddd038f4f9000e4213d60ac00b308e3 to your computer and use it in GitHub Desktop.
Save RGBA-CRT/4ddd038f4f9000e4213d60ac00b308e3 to your computer and use it in GitHub Desktop.
GBA 犬夜叉 解析メモ
# GBA 犬夜叉 解析メモ
2024/5/27 RGBA_CRT
デバッグメニューを探したい
===============================================================
```c
「中断したところからゲームを再開します」 is param1=8204, param2=b5
filter: (R0!=$4500) && (R0!=$4600)
ScriptEngine_Prepare -> 0x0800105c
PTR_DAT_TextBaseTableTable -> 0x087dd63c
ScriptEngine_Prepare(param1, param2)
-> uint8_t tbl_idx = (param1 >> 8) & 0x3F = 2
-> uint8_t tbl_idx2 = (param1 ) & 0xfF = 4
-> PTR_DAT_TextBaseTableTable[tbl_idx]
-> GameTextTable = PTR_DAT_TextBaseTableTable[2] = 080aab9c
u32 GameTextTable[] = 080aab9c;
&GameTextTable[tbl_idx2] = &GameTextTable[4] = SystemMessageTable: 0x080AABAC
-> value= 00001A0c
u16 TableL3 = SystemMessageTable + (*SystemMessageTable) = 80AC5B8 + 00001A0c = 0x80AC5B8
SystemMessage_B5 = (TableL3+param2) + TableL3[param2]
---
if ((param_1 & 0x4000) == 0) {
TextBase = (undefined *)((int)(TextBase + uVar3 * 2) + (int)*(short *)(TextBase + uVar3 * 2));
// (0x80AC5B8 + B5*2) + (0x80AC5B8 + B5*2)
// (0x80AC5B8 + 16A) + (0x80AC5B8 + 16A)
}
---
Idx B5 : 「中断したところからゲームを再開します」
-> Addr: &(SystemMessageTable[0xb5]) = 0x80ac722
-> *((uint16_t*)0x80ac722) = 0686
diff: (&(SystemMessageTable[0xb5]) - SystemMessageTable) = 1B76
-------------------------------------------------
上を呼び出している箇所、スクリプトエンジン側
タイトル画面 : 83b0580
タイトル画面で上下キー押したときのスクリプト: 83b0590
FD 01 00 00 04 FF FF FF FD
| | | | | | | |
| | | | | | | - スクリプト終端
| | | | | --- +5~6 MessageId
| | | | ------ +4 ??
| | | --------- +3 TextBox Row
| | ------------ +2 TextBox Colmn //MessageTable(Prepareのparam1の
| --------------- +1 uVar7, 0xFFなら特殊処理
------------------ +0 Command: Call??
道具交換(通信): 83b0220
Hackするならちょうどいいエントリポイント?
FD 03 00 00 04 25 01 FF
| | | | | | | |
| | | | | | | - スクリプト終端
| | | | | --- +5~6 MessageId
| | | | ------ +4 ??
| | | --------- +3 TextBox Row
| | ------------ +2 TextBox Colmn //MessageTable(Prepareのparam1の
| --------------- +1 uVar7, 0xFFなら特殊処理
------------------ +0 Command: Call??
MessageId: 0001: パートナーランキング (0x000AC8B9)
-> table: 0x000AC5B8
↓これはROM収録順に並べただけ。テーブルの値によって並び替えられる。
0x92がアニメ番号(112)だった
1 0x000AC8B9 パートナーランキング
2 0x000AC8C6 道具保管庫
3 0x000AC8D1 マップクリア条件
...
104 0x000ACC8C 勝利条件:
105 0x000ACC97 敗北条件:
106 0x000ACCA2 はい
107 0x000ACCA5 いいえ
108 0x000ACCA9 X:(変数1)
109 0x000ACCAE Y:(変数1)
110 0x000ACCB3  0123456789ABCDEF\n(変数1):(変数1)(変数1)(変数1)(変数1)
111 0x000ACCD1 (変数1):
112 0x000ACCD5 アニメ番号:(変数1)
113 0x000ACCE0 SE :(変数1)\n BGM :(変数1)\n VOICE:(変数1)
114 0x000ACD01 タイマー:(変数1)秒\n命中率:(変数1)
115 0x000ACD16 移動コード:(変数1)\n攻撃コード:(変数1)
116 0x000ACD2E 顔番号 :(変数1)\n表情番号:(変数1)
117 0x000ACD45 (変数1)文
↓を召喚するテキストスクリプト
113 0x000ACCE0 SE :(変数1)\n BGM :(変数1)\n VOICE:(変数1)
FD 03 00 00 04 93 00
ということはFD ? ? ? ? 93 00でヒットしたスクリプトがデバッグコードなのでは。
Hit: 83afb2e ← !?!?!?!?!?!?!?
hit: 83b0221 ← これは手動で書いたもの(5B)
------------------
GameMainのJumpTableの決まり方
2180が現在実行している関数シーケンスのオペコード
803CF10~あたりに関数シーケンステーブルがある
Maxは別途制御されているがこれがテーブル
803ce5c
-------------
PrepareText
通信:arg1=0x800 arg2=0000005D
PTR_DAT_TextBaseTableTable[8] = 083af328
(TableL3+param2) + TableL3[param2] = (083af328+(5d)*2) + *(083af328+(5d)*2) = (083af328+(5d)*2) + (0e3f) = 83b0221
逆算。
83afb2eの5Bは?
まずはPTR_DAT_TextBaseTableTableのうち近いもの。
8、083AF328っぽい。
---
PTR_DAT_TextBaseTableTable:
0 0803CE5C
1 08117480
2 080AAB9C
3 0811A450
4 08218920
5 082E5418
6 08393320
7 0811A04C
8 083AF328
9 0803F17C
10 0809D4CC
11 081495C8
12 081C89B4
13 083B0778
14 083B101C
15 0845F33C
16 084DF6E8
17 084F2D1C
18 085582D0
19 085586D4
20 08558AD8
21 00000000
22 00000000
23 08558EDC
24 08040201
25 80402010
26 08016039
27 0801603D
28 0801605D
29 0801608D
30 080160D9
31 08016111
32 08016129
33 080161D1
34 08016239
35 08016285
36 080162ED
37 0801637D
38 080163F5
39 08016435
40 08016461
41 080164C9
42 08016545
43 08016AB5
44 08016B0D
45 08016B45
46 08016B85
47 08016BE9
48 08016039
49 08016C85
50 08016CF9
51 08016039
52 08016039
53 08016039
54 08016D39
55 08016FE5
56 0801720D
57 08016039
58 0801828D
59 08018A1D
60 08018E1D
61 08018FE1
62 08019279
63 08019345
--
次、arg2逆算。
2F。
つまりプログラムシーケンスで2Fを組んでいるものを探せばいい。
プログラムシーケンス.テキスト表示 = opc: 0x38
サウンドデバッグテキストIdx: idx: 0x2F
→見つけた。0803E785
---
Table8 Table8
Base Base 083AF328 138081064
idx_hex Idx dec table_val_h address
0 0 0122 290 138081354 83AF44A
1 1 015A 346 138081412 83AF484
2 2 0175 373 138081441 83AF4A1
3 3 01A4 420 138081490 83AF4D2
4 4 01B5 437 138081509 83AF4E5
5 5 01D9 473 138081547 83AF50B
6 6 01E6 486 138081562 83AF51A
7 7 020B 523 138081601 83AF541
8 8 0218 536 138081616 83AF550
9 9 026A 618 138081700 83AF5A4
A 10 0277 631 138081715 83AF5B3
B 11 02BC 700 138081786 83AF5FA
C 12 02C9 713 138081801 83AF609
D 13 02CF 719 138081809 83AF611
E 14 0307 775 138081867 83AF64B
F 15 03A7 935 138082029 83AF6ED
10 16 03C2 962 138082058 83AF70A
11 17 03C8 968 138082066 83AF712
12 18 03C7 967 138082067 83AF713
13 19 03D4 980 138082082 83AF722
14 20 03D3 979 138082083 83AF723
15 21 0403 1027 138082133 83AF755
16 22 0402 1026 138082134 83AF756
17 23 0432 1074 138082184 83AF788
18 24 0431 1073 138082185 83AF789
19 25 0453 1107 138082221 83AF7AD
1A 26 0452 1106 138082222 83AF7AE
1B 27 047B 1147 138082265 83AF7D9
1C 28 048F 1167 138082287 83AF7EF
1D 29 04D4 1236 138082358 83AF836
1E 30 04DA 1242 138082366 83AF83E
1F 31 04E0 1248 138082374 83AF846
20 32 057D 1405 138082533 83AF8E5
21 33 059F 1439 138082569 83AF909
22 34 05B3 1459 138082591 83AF91F
23 35 05B9 1465 138082599 83AF927
24 36 05DB 1499 138082635 83AF94B
25 37 05E1 1505 138082643 83AF953
26 38 05F8 1528 138082668 83AF96C
27 39 05FE 1534 138082676 83AF974
28 40 0604 1540 138082684 83AF97C
29 41 0611 1553 138082699 83AF98B
2A 42 0625 1573 138082721 83AF9A1
2B 43 062B 1579 138082729 83AF9A9
2C 44 063F 1599 138082751 83AF9BF
2D 45 06AE 1710 138082864 83AFA30
2E 46 06C2 1730 138082886 83AFA46
2F 47 07A8 1960 138083118 83AFB2E
30 48 07AE 1966 138083126 83AFB36
31 49 081B 2075 138083237 83AFBA5
32 50 08CE 2254 138083418 83AFC5A
33 51 0913 2323 138083489 83AFCA1
34 52 093C 2364 138083532 83AFCCC
35 53 098F 2447 138083617 83AFD21
36 54 09A0 2464 138083636 83AFD34
37 55 09A6 2470 138083644 83AFD3C
38 56 09B9 2489 138083665 83AFD51
39 57 09BF 2495 138083673 83AFD59
3A 58 0A27 2599 138083779 83AFDC3
3B 59 0A49 2633 138083815 83AFDE7
3C 60 0A56 2646 138083830 83AFDF6
3D 61 0A63 2659 138083845 83AFE05
3E 62 0A85 2693 138083881 83AFE29
3F 63 0ACA 2762 138083952 83AFE70
40 64 0AD7 2775 138083967 83AFE7F
41 65 0AF9 2809 138084003 83AFEA3
42 66 0B06 2822 138084018 83AFEB2
43 67 0B13 2835 138084033 83AFEC1
44 68 0B1B 2843 138084043 83AFECB
45 69 0B4B 2891 138084093 83AFEFD
46 70 0B7B 2939 138084143 83AFF2F
47 71 0BAB 2987 138084193 83AFF61
48 72 0BB1 2993 138084201 83AFF69
49 73 0BCC 3020 138084230 83AFF86
4A 74 0BF5 3061 138084273 83AFFB1
4B 75 0C01 3073 138084287 83AFFBF
4C 76 0BFF 3071 138084287 83AFFBF
4D 77 0C42 3138 138084356 83B0004
4E 78 0C65 3173 138084393 83B0029
4F 79 0C90 3216 138084438 83B0056
50 80 0CA7 3239 138084463 83B006F
51 81 0CBE 3262 138084488 83B0088
52 82 0CF5 3317 138084545 83B00C1
53 83 0D56 3414 138084644 83B0124
54 84 0D5C 3420 138084652 83B012C
55 85 0D69 3433 138084667 83B013B
56 86 0D6F 3439 138084675 83B0143
57 87 0DE3 3555 138084793 83B01B9
58 88 0DE9 3561 138084801 83B01C1
59 89 0DF6 3574 138084816 83B01D0
5A 90 0E02 3586 138084830 83B01DE
5B 91 0E0F 3599 138084845 83B01ED
5C 92 0E2A 3626 138084874 83B020A
5D 93 0E3F 3647 138084897 83B0221
5E 94 0E45 3653 138084905 83B0229
5F 95 0E4B 3659 138084913 83B0231
60 96 0E51 3665 138084921 83B0239
61 97 0ED5 3797 138085055 83B02BF
62 98 0F2F 3887 138085147 83B031B
63 99 0F51 3921 138085183 83B033F
64 100 0F6C 3948 138085212 83B035C
65 101 0F87 3975 138085241 83B0379
66 102 0FA9 4009 138085277 83B039D
67 103 0FCB 4043 138085313 83B03C1
68 104 0FC9 4041 138085313 83B03C1
69 105 0FCE 4046 138085320 83B03C8
6A 106 0FDB 4059 138085335 83B03D7
6B 107 1072 4210 138085488 83B0470
6C 108 10DA 4314 138085594 83B04DA
6D 109 10DF 4319 138085601 83B04E1
6E 110 10E5 4325 138085609 83B04E9
6F 111 10EB 4331 138085617 83B04F1
70 112 10F1 4337 138085625 83B04F9
71 113 10F7 4343 138085633 83B0501
72 114 1120 4384 138085676 83B052C
73 115 1126 4390 138085684 83B0534
74 116 1179 4473 138085769 83B0589
75 117 117E 4478 138085776 83B0590
76 118 1184 4484 138085784 83B0598
77 119 1190 4496 138085798 83B05A6
78 120 1196 4502 138085806 83B05AE
79 121 11B8 4536 138085842 83B05D2
7A 122 11BE 4542 138085850 83B05DA
7B 123 11BC 4540 138085850 83B05DA
7C 124 11C2 4546 138085858 83B05E2
7D 125 123F 4671 138085985 83B0661
7E 126 123D 4669 138085985 83B0661
7F 127 1266 4710 138086028 83B068C
80 128 1288 4744 138086064 83B06B0
81 129 128E 4750 138086072 83B06B8
82 130 1294 4756 138086080 83B06C0
83 131 129A 4762 138086088 83B06C8
84 132 1298 4760 138086088 83B06C8
85 133 1296 4758 138086088 83B06C8
86 134 1294 4756 138086088 83B06C8
87 135 1292 4754 138086088 83B06C8
88 136 1290 4752 138086088 83B06C8
89 137 12B2 4786 138086124 83B06EC
8A 138 12B0 4784 138086124 83B06EC
8B 139 12AE 4782 138086124 83B06EC
8C 140 12AC 4780 138086124 83B06EC
8D 141 12AA 4778 138086124 83B06EC
8E 142 12A8 4776 138086124 83B06EC
8F 143 12A6 4774 138086124 83B06EC
90 144 12AC 4780 138086132 83B06F4
---
ーーーーーーーーーーーーーーーー
OK、出せた
まずタイトル→付録まで進む
次に、Current関数シーケンスアドレスに上記で見つけた0803E785を書き込む
2130: 85
2131: e7
次にCurrentシーケンスオペコードをFF 00にする → 上記アドレスにジャンプしてくれる
以下の順番で。
2181: 00
2180: FF
-------------
関数シーケンス:
0803e773: バイナリエディタ?
0803E780-84: エンディング
0803E785-91: サウンドデバッグ
0803E791-96: なにもおきない
0803E797-9c: フリー移動@マップ
0803E79d-A9: シナリオ番号選択???@マップ
0803E7AA-E82F: デバッグメニュー。
- 描画がバグっているが、↓(顔カットイン)、A(決定)、B(戻る)で描画が治る
- もしかしたら立ち絵が出ているでも画面なら壊れてないかも
0803E7E1: マップ上で自キャラ変更?? → デバッグメニューのコマキャラが暴発しただけかも
おまけ?
0803E830: 製品コード??
0803e4f7: 無限レベルアップ??
0803e5d5: 能力アップ
0803eebf: 武器レベルアップ(刀々斎)
これ以上は文字列テーブル対応表を作らないと無理そう
↓とかは残っている
0x000ACD01:
タイマー:(変数1)秒
命中率:(変数1)
0x000ACD16:
移動コード:(変数1)
攻撃コード:(変数1)
----
```
--------------------------
0x70 0x558 0x80acbf0 ================
設定1 :ON/OFF
0x71 0x566 0x80acc00 ================
設定2 :ON/OFF
0x72 0x574 0x80acc10 ================
サウンドモード
0x73 0x57b 0x80acc19 ================
道具カタログ
0x74 0x582 0x80acc22 ================
イベントアルバム
0x75 0x589 0x80acc2b ================
キャラクター図鑑
0x76 0x593 0x80acc37 ================
基本用語ファイル
0x77 0x59e 0x80acc44 ================
作戦目的
0x78 0x59c 0x80acc44 ================
作戦目的
0x79 0x5a3 0x80acc4d ================
SCENE(変数1)「(文字列)」
---------------------------------
探し方
1. Step1 MessageID -> TextScript Address
- テキストスクリプトからメッセージの表示をCallしているところを探す
- FD ? ? ? ? XX 00
- XXにメッセージ番号を入れる。
- サウンドデバッグなら93
- found: 0x083af756
1. Step2 TextScript IDの特定
- TextScriptTableからStep1に近いアドレスを探す
- `TextScriptTable 0x3af328 =================`
- いかが見つかる
- `0x16 0x402 0x83af756`
1. Step3 GameScriptのアドレス特定
- opc: 0x38
- GameScriptにおけるテキスト表示のオペコード
- arg1 text_code: 0x16
- Step2で見つけたTextScript Id
- 803e270 あたりから38 16で検索
- script: 805e6be
- この例だと外れ。
--
タイマー
- TextScriptAddress: 8601db5
- こんな高いアドレスのTextScriptTableを知らない。
0x92 0x5f9 0x80accd5 ================
アニメ番号:(変数1)
- TextScriptAddress: 86630bb
- こんな高いアドレスのTextScriptTableを知らない。
0x90 0x5db 0x80accb3 ================
 0123456789ABCDEF
(変数1):(変数1)(変数1)(変数1)(変数1)
- TextScriptAddress: 83af91f
- TextScriptId: 0x22 0x5b3 0x83af91f
- GameScriptAddres: 0x803e777
- バイナリエディタ>?>?
omake
- GameScriptAddres: 0803e767 // <道具>をコピーしました //複製の札?
0x74 0x582 0x80acc22 ================
イベントアルバム
- TSA: 83af7ca
- TSI: 0x1a 0x452 0x83af7ae
- GSA:
立ち絵付きメッセージ
31 00 12 36 00 70
|-メッセージID
@RGBA-CRT
Copy link
Author

INU_001 (2)
INU_003

@RGBA-CRT
Copy link
Author

tool: ghidra, no$gba, mesen2, RGBA-CRT/U-GCCT

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment