V-Gears 0
Free Final Fantasy VII engine.
FieldDisassembler.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2022 The V-Gears Team
3 *
4 * This file is part of V-Gears
5 *
6 * V-Gears is free software: you can redistribute it and/or modify it under
7 * terms of the GNU General Public License as published by the Free Software
8 * Foundation, version 3.0 (GPLv3) of the License.
9 *
10 * V-Gears is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#pragma once
17
18#include <array>
21
22class BinaryReader;
23class Function;
24
29 RET = 0x0,
30 REQ = 0x01,
31 REQSW = 0x02,
32 REQEW = 0x03,
33 PREQ = 0x04,
34 PRQSW = 0x05,
35 PRQEW = 0x06,
36 RETTO = 0x07,
37 JOIN = 0x08,
38 SPLIT = 0x09,
39 SPTYE = 0x0A,
40 GTPYE = 0x0B,
41 DSKCG = 0x0E,
42 SPECIAL = 0x0F,
43 JMPF = 0x10,
44 JMPFL = 0x11,
45 JMPB = 0x12,
46 JMPBL = 0x13,
47 IFUB = 0x14,
48 IFUBL = 0x15,
49 IFSW = 0x16,
50 IFSWL = 0x17,
51 IFUW = 0x18,
52 IFUWL = 0x19,
53 MINIGAME = 0x20,
54 TUTOR = 0x21,
55 BTMD2 = 0x22,
56 BTRLD = 0x23,
57 WAIT = 0x24,
58 NFADE = 0x25,
59 BLINK = 0x26,
60 BGMOVIE = 0x27,
61 KAWAI = 0x28,
62 KAWIW = 0x29,
63 PMOVA = 0x2A,
64 SLIP = 0x2B,
65 BGPDH = 0x2C,
66 BGSCR = 0x2D,
67 WCLS = 0x2E,
68 WSIZW = 0x2F,
69 IFKEY = 0x30,
70 IFKEYON = 0x31,
71 IFKEYOFF = 0x32,
72 UC = 0x33,
73 PDIRA = 0x34,
74 PTURA = 0x35,
75 WSPCL = 0x36,
76 WNUMB = 0x37,
77 STTIM = 0x38,
78 GOLDU = 0x39,
79 GOLDD = 0x3A,
80 CHGLD = 0x3B,
81 HMPMAX1 = 0x3C,
82 HMPMAX2 = 0x3D,
83 MHMMX = 0x3E,
84 HMPMAX3 = 0x3F,
85 MESSAGE = 0x40,
86 MPARA = 0x41,
87 MPRA2 = 0x42,
88 MPNAM = 0x43,
89 MPU = 0x45,
90 MPD = 0x47,
91 ASK = 0x48,
92 MENU = 0x49,
93 MENU2 = 0x4A,
94 BTLTB = 0x4B,
95 HPU = 0x4D,
96 HPD = 0x4F,
97 WINDOW = 0x50,
98 WMOVE = 0x51,
99 WMODE = 0x52,
100 WREST = 0x53,
101 WCLSE = 0x54,
102 WROW = 0x55,
103 GWCOL = 0x56,
104 SWCOL = 0x57,
105 STITM = 0x58,
106 DLITM = 0x59,
107 CKITM = 0x5A,
108 SMTRA = 0x5B,
109 DMTRA = 0x5C,
110 CMTRA = 0x5D,
111 SHAKE = 0x5E,
112 NOP = 0x5F,
113 MAPJUMP = 0x60,
114 SCRLO = 0x61,
115 SCRLC = 0x62,
116 SCRLA = 0x63,
117 SCR2D = 0x64,
118 SCRCC = 0x65,
119 SCR2DC = 0x66,
120 SCRLW = 0x67,
121 SCR2DL = 0x68,
122 MPDSP = 0x69,
123 VWOFT = 0x6A,
124 FADE = 0x6B,
125 FADEW = 0x6C,
126 IDLCK = 0x6D,
127 LSTMP = 0x6E,
128 SCRLP = 0x6F,
129 BATTLE = 0x70,
130 BTLON = 0x71,
131 BTLMD = 0x72,
132 PGTDR = 0x73,
133 GETPC = 0x74,
134 PXYZI = 0x75,
135 PLUS_ = 0x76, // PLUS!
136 PLUS2_ = 0x77, // PLUS2!
137 MINUS_ = 0x78, // MINUS!
138 MINUS2_ = 0x79, // MINUS2!
139 INC_ = 0x7A, // INC!
140 INC2_ = 0x7B, // INC2!
141 DEC_ = 0x7C, // DEC!
142 DEC2_ = 0x7D, // DEC2!
143 TLKON = 0x7E,
144 RDMSD = 0x7F,
145 SETBYTE = 0x80,
146 SETWORD = 0x81,
147 BITON = 0x82,
148 BITOFF = 0x83,
149 BITXOR = 0x84,
150 PLUS = 0x85,
151 PLUS2 = 0x86,
152 MINUS = 0x87,
153 MINUS2 = 0x88,
154 MUL = 0x89,
155 MUL2 = 0x8A,
156 DIV = 0x8B,
157 DIV2 = 0x8C,
158 MOD = 0x8D,
159 MOD2 = 0x8E,
160 AND = 0x8F,
161 AND2 = 0x90,
162 OR = 0x91,
163 OR2 = 0x92,
164 XOR = 0x93,
165 XOR2 = 0x94,
166 INC = 0x95,
167 INC2 = 0x96,
168 DEC = 0x97,
169 DEC2 = 0x98,
170 RANDOM = 0x99,
171 LBYTE = 0x9A,
172 HBYTE = 0x9B,
173 TWOBYTE = 0x9C,
174 SETX = 0x9D,
175 GETX = 0x9E,
176 SEARCHX = 0x9F,
177 PC = 0xA0,
179 DFANM = 0xA2,
180 ANIME1 = 0xA3,
181 VISI = 0xA4,
182 XYZI = 0xA5,
183 XYI = 0xA6,
184 XYZ = 0xA7,
185 MOVE = 0xA8,
186 CMOVE = 0xA9,
187 MOVA = 0xAA,
188 TURA = 0xAB,
189 ANIMW = 0xAC,
190 FMOVE = 0xAD,
191 ANIME2 = 0xAE,
192 ANIM_1 = 0xAF, // ANIM!1
193 CANIM1 = 0xB0,
194 CANM_1 = 0xB1, // CANM!1
195 MSPED = 0xB2,
196 DIR = 0xB3,
197 TURNGEN = 0xB4,
198 TURN = 0xB5,
199 DIRA = 0xB6,
200 GETDIR = 0xB7,
201 GETAXY = 0xB8,
202 GETAI = 0xB9,
203 ANIM_2 = 0xBA, // ANIM!2
204 CANIM2 = 0xBB,
205 CANM_2 = 0xBC, // CANM!2
206 ASPED = 0xBD,
207 CC = 0xBF,
208 JUMP = 0xC0,
209 AXYZI = 0xC1,
210 LADER = 0xC2,
211 OFST = 0xC3,
212 OFSTW = 0xC4,
213 TALKR = 0xC5,
214 SLIDR = 0xC6,
215 SOLID = 0xC7,
216 PRTYP = 0xC8,
217 PRTYM = 0xC9,
218 PRTYE = 0xCA,
219 IFPRTYQ = 0xCB,
220 IFMEMBQ = 0xCC,
221 MMBUD = 0xCD,
222 MMBLK = 0xCE,
223 MMBUK = 0xCF,
224 LINE = 0xD0,
225 LINON = 0xD1,
226 MPJPO = 0xD2,
227 SLINE = 0xD3,
228 SIN = 0xD4,
229 COS = 0xD5,
230 TLKR2 = 0xD6,
231 SLDR2 = 0xD7,
232 PMJMP = 0xD8,
233 PMJMP2 = 0xD9,
234 AKAO2 = 0xDA,
235 FCFIX = 0xDB,
236 CCANM = 0xDC,
237 ANIMB = 0xDD,
238 TURNW = 0xDE,
239 MPPAL = 0xDF,
240 BGON = 0xE0,
241 BGOFF = 0xE1,
242 BGROL = 0xE2,
243 BGROL2 = 0xE3,
244 BGCLR = 0xE4,
245 STPAL = 0xE5,
246 LDPAL = 0xE6,
247 CPPAL = 0xE7,
248 RTPAL = 0xE8,
249 ADPAL = 0xE9,
250 MPPAL2 = 0xEA,
251 STPLS = 0xEB,
252 LDPLS = 0xEC,
253 CPPAL2 = 0xED,
254 RTPAL2 = 0xEE,
255 ADPAL2 = 0xEF,
256 MUSIC = 0xF0,
257 SOUND = 0xF1,
258 AKAO = 0xF2,
259 MUSVT = 0xF3,
260 MUSVM = 0xF4,
261 MULCK = 0xF5,
262 BMUSC = 0xF6,
263 CHMPH = 0xF7,
264 PMVIE = 0xF8,
265 MOVIE = 0xF9,
266 MVIEF = 0xFA,
267 MVCAM = 0xFB,
268 FMUSC = 0xFC,
269 CMUSC = 0xFD,
270 CHMST = 0xFE,
271 GAMEOVER = 0xFF
273
283 ARROW = 0xF5,
284 PNAME = 0xF6,
285 GMSPD = 0xF7,
286 SMSPD = 0xF8,
287 FLMAT = 0xF9,
288 FLITM = 0xFA,
289 BTLCK = 0xFB,
290 MVLCK = 0xFC,
291 SPCNM = 0xFD,
292 RSGLB = 0xFE,
293 CLITM = 0xFF
295
305 EYETX = 0x00,
306 TRNSP = 0x01,
307 AMBNT = 0x02,
308 Unknown03 = 0x03, // Makou Reactor can write these unknowns.
309 Unknown04 = 0x04,
310 Unknown05 = 0x05,
311 LIGHT = 0x06,
312 Unknown07 = 0x07,
313 Unknown08 = 0x08,
314 Unknown09 = 0x09,
315 SBOBJ = 0x0A,
316 Unknown0B = 0x0B,
317 Unknown0C = 0x0C,
318 SHINE = 0x0D,
319 RESET = 0xFF
321
322class FieldEngine;
323
328
329 public:
330
335
339 unsigned char opcode_size;
340
344 unsigned int opcode;
345
349 const char* opcode_name;
350
354 const char* argument_format;
355
359 std::function<InstPtr()> factory_function;
360 };
361
366
372 static std::map<std::string, const InstructionRecord*> FieldInstructions();
373
383 static int FindId(uint32 start_addr, uint32 end_addr, const InstVec& insts);
384
393
404 InstVec& insts, const std::vector<unsigned char>& raw_script_data
405 );
406
411
415 float GetScaleFactor() const;
416
417
421 virtual void DoDisassemble() override;
422
423 private:
424
428 static const int MAGIC;
429
433 static const int NUM_SECTIONS;
434
439
444
449
454
459
464
469
473 MODELS = 6
474 };
475
480
485
492
496 size_t index;
497 };
498
503
508
513
518
523
528
535
539 std::array<uint16, 3> blank;
540
544 std::array<char, 8> creator;
545
549 std::array<char, 8> name;
550
556 std::vector<std::array<char, 8>> field_entity_names;
557
563 std::vector<uint32> akao_offsets;
564
571 std::vector<std::array<uint16, 32>> entity_scripts;
572
580 void Read(BinaryReader& reader){
581 magic = reader.ReadU16();
583 number_of_entities = reader.ReadU8();
584 number_of_models = reader.ReadU8();
585 offset_to_strings = reader.ReadU16();
587 scale = reader.ReadU16();
588 for (int i = 0; i < 3; i ++) blank[i] = reader.ReadU16();
589 for (int i = 0; i < 8; i ++) creator[i] = reader.ReadU8();
590 for (int i = 0; i < 8; i ++) name[i] = reader.ReadU8();
591 for (int i = 0; i < number_of_entities; i ++){
592 std::array<char, 8> name;
593 for (int j = 0; j < 8; j ++) name[j] = reader.ReadU8();
594 field_entity_names.emplace_back(name);
595 }
596 for (int i = 0; i < number_of_akao_offsets; i ++)
597 akao_offsets.emplace_back(reader.ReadU32());
599 for (int i = 0; i < number_of_entities; i ++){
600 std::array<uint16, 32> scripts;
601 for (int j = 0; j < 32; j ++) scripts[j] = reader.ReadU16();
602 entity_scripts.push_back(scripts);
603 }
604 }
605 };
606
613 virtual void Open(const char *filename) override;
614
634 std::string entity_name, size_t entity_index, size_t script_index,
635 size_t script_entry_point, uint32 next_script_entry_point, bool is_start, bool is_end
636 );
637
654 void AddFunc(
655 std::string entity_name, size_t entity_index, size_t script_index,
656 uint32 next_script_entry_point, const bool is_start, const bool is_end,
657 bool to_return_only, std::string func_name
658 );
659
676 size_t end_pos, std::vector<float>& point_a, std::vector<float>& point_b
677 );
678
684 std::unique_ptr<Function> StartFunction(size_t script_index);
685
689 void ReadHeader();
690
697
707 uint16 cur_entry_point, size_t entity_index, size_t script_index
708 );
709
724 template<typename T> void ParseOpcode(
725 int opcode, std::string name, T instruction, int stack_change, const char* argument_format
726 ){
727 uint32 full_opcode = (full_opcode << 8) + opcode;
728 this->insts_.push_back(instruction);
729 this->insts_.back()->SetOpcode(full_opcode);
730 this->insts_.back()->SetAddress(this->address_);
731 this->insts_.back()->SetStackChange(0);
732 this->insts_.back()->SetName(std::string(name));
733 this->insts_.back()->SetCodeGenData("");
734 this->ReadParams(this->insts_.back(), argument_format);
735 }
736
741
746
750 std::array<uint32, 7> sections_;
751
758
763
768
773
777 float scale_factor_ = 1.0f;
778};
OPCODES
Field opcodes.
Definition: FieldDisassembler.h:28
@ PTURA
Definition: FieldDisassembler.h:74
@ ADPAL2
Definition: FieldDisassembler.h:255
@ BITON
Definition: FieldDisassembler.h:147
@ OFST
Definition: FieldDisassembler.h:211
@ GTPYE
Definition: FieldDisassembler.h:40
@ CHGLD
Definition: FieldDisassembler.h:80
@ PMJMP2
Definition: FieldDisassembler.h:233
@ HBYTE
Definition: FieldDisassembler.h:172
@ MUL
Definition: FieldDisassembler.h:154
@ RETTO
Definition: FieldDisassembler.h:36
@ ANIME1
Definition: FieldDisassembler.h:180
@ IFMEMBQ
Definition: FieldDisassembler.h:220
@ FMUSC
Definition: FieldDisassembler.h:268
@ FADE
Definition: FieldDisassembler.h:124
@ IDLCK
Definition: FieldDisassembler.h:126
@ MINUS_
Definition: FieldDisassembler.h:137
@ PXYZI
Definition: FieldDisassembler.h:134
@ MOD
Definition: FieldDisassembler.h:158
@ PGTDR
Definition: FieldDisassembler.h:132
@ MVIEF
Definition: FieldDisassembler.h:266
@ DMTRA
Definition: FieldDisassembler.h:109
@ SOLID
Definition: FieldDisassembler.h:215
@ CCANM
Definition: FieldDisassembler.h:236
@ JMPB
Definition: FieldDisassembler.h:45
@ IFKEYOFF
Definition: FieldDisassembler.h:71
@ JUMP
Definition: FieldDisassembler.h:208
@ HPU
Definition: FieldDisassembler.h:95
@ MOD2
Definition: FieldDisassembler.h:159
@ AKAO2
Definition: FieldDisassembler.h:234
@ IFUW
Definition: FieldDisassembler.h:51
@ PLUS2_
Definition: FieldDisassembler.h:136
@ MPJPO
Definition: FieldDisassembler.h:226
@ LADER
Definition: FieldDisassembler.h:210
@ GOLDU
Definition: FieldDisassembler.h:78
@ TURNW
Definition: FieldDisassembler.h:238
@ DEC_
Definition: FieldDisassembler.h:141
@ AXYZI
Definition: FieldDisassembler.h:209
@ SCRLO
Definition: FieldDisassembler.h:114
@ TWOBYTE
Definition: FieldDisassembler.h:173
@ SETWORD
Definition: FieldDisassembler.h:146
@ IFSW
Definition: FieldDisassembler.h:49
@ LDPAL
Definition: FieldDisassembler.h:246
@ FCFIX
Definition: FieldDisassembler.h:235
@ CMOVE
Definition: FieldDisassembler.h:186
@ OR2
Definition: FieldDisassembler.h:163
@ BATTLE
Definition: FieldDisassembler.h:129
@ REQSW
Definition: FieldDisassembler.h:31
@ BMUSC
Definition: FieldDisassembler.h:262
@ MINUS2_
Definition: FieldDisassembler.h:138
@ WCLS
Definition: FieldDisassembler.h:67
@ SETX
Definition: FieldDisassembler.h:174
@ PLUS2
Definition: FieldDisassembler.h:151
@ GAMEOVER
Definition: FieldDisassembler.h:271
@ CC
Definition: FieldDisassembler.h:207
@ BLINK
Definition: FieldDisassembler.h:59
@ STPLS
Definition: FieldDisassembler.h:251
@ SLDR2
Definition: FieldDisassembler.h:231
@ JOIN
Definition: FieldDisassembler.h:37
@ COS
Definition: FieldDisassembler.h:229
@ CANIM2
Definition: FieldDisassembler.h:204
@ TURNGEN
Definition: FieldDisassembler.h:197
@ HMPMAX3
Definition: FieldDisassembler.h:84
@ MENU
Definition: FieldDisassembler.h:92
@ TURN
Definition: FieldDisassembler.h:198
@ MMBUD
Definition: FieldDisassembler.h:221
@ TLKR2
Definition: FieldDisassembler.h:230
@ RDMSD
Definition: FieldDisassembler.h:144
@ DLITM
Definition: FieldDisassembler.h:106
@ FMOVE
Definition: FieldDisassembler.h:190
@ FADEW
Definition: FieldDisassembler.h:125
@ MPU
Definition: FieldDisassembler.h:89
@ DSKCG
Definition: FieldDisassembler.h:41
@ SIN
Definition: FieldDisassembler.h:228
@ MMBUK
Definition: FieldDisassembler.h:223
@ DIV2
Definition: FieldDisassembler.h:157
@ BTRLD
Definition: FieldDisassembler.h:56
@ BGROL2
Definition: FieldDisassembler.h:243
@ DEC2
Definition: FieldDisassembler.h:169
@ MSPED
Definition: FieldDisassembler.h:195
@ IFUBL
Definition: FieldDisassembler.h:48
@ MPARA
Definition: FieldDisassembler.h:86
@ BGROL
Definition: FieldDisassembler.h:242
@ XOR2
Definition: FieldDisassembler.h:165
@ DIR
Definition: FieldDisassembler.h:196
@ INC_
Definition: FieldDisassembler.h:139
@ SCRCC
Definition: FieldDisassembler.h:118
@ ASK
Definition: FieldDisassembler.h:91
@ MPPAL
Definition: FieldDisassembler.h:239
@ MINIGAME
Definition: FieldDisassembler.h:53
@ BITXOR
Definition: FieldDisassembler.h:149
@ MHMMX
Definition: FieldDisassembler.h:83
@ MOVA
Definition: FieldDisassembler.h:187
@ MPRA2
Definition: FieldDisassembler.h:87
@ WINDOW
Definition: FieldDisassembler.h:97
@ RTPAL2
Definition: FieldDisassembler.h:254
@ BGON
Definition: FieldDisassembler.h:240
@ REQEW
Definition: FieldDisassembler.h:32
@ BGPDH
Definition: FieldDisassembler.h:65
@ PMJMP
Definition: FieldDisassembler.h:232
@ INC
Definition: FieldDisassembler.h:166
@ SCR2DC
Definition: FieldDisassembler.h:119
@ WAIT
Definition: FieldDisassembler.h:57
@ SPLIT
Definition: FieldDisassembler.h:38
@ CANM_2
Definition: FieldDisassembler.h:205
@ SEARCHX
Definition: FieldDisassembler.h:176
@ PMVIE
Definition: FieldDisassembler.h:264
@ WMOVE
Definition: FieldDisassembler.h:98
@ SLIDR
Definition: FieldDisassembler.h:214
@ MPPAL2
Definition: FieldDisassembler.h:250
@ BTLON
Definition: FieldDisassembler.h:130
@ SWCOL
Definition: FieldDisassembler.h:104
@ DEC
Definition: FieldDisassembler.h:168
@ DIV
Definition: FieldDisassembler.h:156
@ BTLTB
Definition: FieldDisassembler.h:94
@ RTPAL
Definition: FieldDisassembler.h:248
@ STPAL
Definition: FieldDisassembler.h:245
@ AND
Definition: FieldDisassembler.h:160
@ PLUS
Definition: FieldDisassembler.h:150
@ LINON
Definition: FieldDisassembler.h:225
@ GWCOL
Definition: FieldDisassembler.h:103
@ IFKEY
Definition: FieldDisassembler.h:69
@ WSIZW
Definition: FieldDisassembler.h:68
@ AND2
Definition: FieldDisassembler.h:161
@ JMPBL
Definition: FieldDisassembler.h:46
@ VISI
Definition: FieldDisassembler.h:181
@ GETPC
Definition: FieldDisassembler.h:133
@ MVCAM
Definition: FieldDisassembler.h:267
@ SMTRA
Definition: FieldDisassembler.h:108
@ MPDSP
Definition: FieldDisassembler.h:122
@ SLIP
Definition: FieldDisassembler.h:64
@ SETBYTE
Definition: FieldDisassembler.h:145
@ SLINE
Definition: FieldDisassembler.h:227
@ CMUSC
Definition: FieldDisassembler.h:269
@ AKAO
Definition: FieldDisassembler.h:258
@ LSTMP
Definition: FieldDisassembler.h:127
@ GOLDD
Definition: FieldDisassembler.h:79
@ OR
Definition: FieldDisassembler.h:162
@ ASPED
Definition: FieldDisassembler.h:206
@ MOVIE
Definition: FieldDisassembler.h:265
@ WCLSE
Definition: FieldDisassembler.h:101
@ MMBLK
Definition: FieldDisassembler.h:222
@ MUSIC
Definition: FieldDisassembler.h:256
@ MUL2
Definition: FieldDisassembler.h:155
@ MUSVT
Definition: FieldDisassembler.h:259
@ RANDOM
Definition: FieldDisassembler.h:170
@ PC
Definition: FieldDisassembler.h:177
@ KAWIW
Definition: FieldDisassembler.h:62
@ MPD
Definition: FieldDisassembler.h:90
@ IFKEYON
Definition: FieldDisassembler.h:70
@ SPTYE
Definition: FieldDisassembler.h:39
@ HMPMAX1
Definition: FieldDisassembler.h:81
@ WREST
Definition: FieldDisassembler.h:100
@ CHMST
Definition: FieldDisassembler.h:270
@ SPECIAL
Definition: FieldDisassembler.h:42
@ OFSTW
Definition: FieldDisassembler.h:212
@ GETAXY
Definition: FieldDisassembler.h:201
@ IFUWL
Definition: FieldDisassembler.h:52
@ BGCLR
Definition: FieldDisassembler.h:244
@ GETX
Definition: FieldDisassembler.h:175
@ LINE
Definition: FieldDisassembler.h:224
@ JMPFL
Definition: FieldDisassembler.h:44
@ RET
Definition: FieldDisassembler.h:29
@ MESSAGE
Definition: FieldDisassembler.h:85
@ WSPCL
Definition: FieldDisassembler.h:75
@ SCR2D
Definition: FieldDisassembler.h:117
@ REQ
Definition: FieldDisassembler.h:30
@ SCRLP
Definition: FieldDisassembler.h:128
@ XYZI
Definition: FieldDisassembler.h:182
@ ANIME2
Definition: FieldDisassembler.h:191
@ BGOFF
Definition: FieldDisassembler.h:241
@ TALKR
Definition: FieldDisassembler.h:213
@ KAWAI
Definition: FieldDisassembler.h:61
@ PMOVA
Definition: FieldDisassembler.h:63
@ PREQ
Definition: FieldDisassembler.h:33
@ DFANM
Definition: FieldDisassembler.h:179
@ XYI
Definition: FieldDisassembler.h:183
@ DIRA
Definition: FieldDisassembler.h:199
@ MPNAM
Definition: FieldDisassembler.h:88
@ CMTRA
Definition: FieldDisassembler.h:110
@ STTIM
Definition: FieldDisassembler.h:77
@ XYZ
Definition: FieldDisassembler.h:184
@ CPPAL2
Definition: FieldDisassembler.h:253
@ CKITM
Definition: FieldDisassembler.h:107
@ XOR
Definition: FieldDisassembler.h:164
@ HPD
Definition: FieldDisassembler.h:96
@ CANIM1
Definition: FieldDisassembler.h:193
@ PRTYE
Definition: FieldDisassembler.h:218
@ PRTYP
Definition: FieldDisassembler.h:216
@ SCR2DL
Definition: FieldDisassembler.h:121
@ PRTYM
Definition: FieldDisassembler.h:217
@ SCRLA
Definition: FieldDisassembler.h:116
@ BGMOVIE
Definition: FieldDisassembler.h:60
@ PRQSW
Definition: FieldDisassembler.h:34
@ CANM_1
Definition: FieldDisassembler.h:194
@ NFADE
Definition: FieldDisassembler.h:58
@ ADPAL
Definition: FieldDisassembler.h:249
@ VWOFT
Definition: FieldDisassembler.h:123
@ LBYTE
Definition: FieldDisassembler.h:171
@ MAPJUMP
Definition: FieldDisassembler.h:113
@ WMODE
Definition: FieldDisassembler.h:99
@ IFPRTYQ
Definition: FieldDisassembler.h:219
@ MUSVM
Definition: FieldDisassembler.h:260
@ JMPF
Definition: FieldDisassembler.h:43
@ ANIM_1
Definition: FieldDisassembler.h:192
@ UC
Definition: FieldDisassembler.h:72
@ INC2_
Definition: FieldDisassembler.h:140
@ TURA
Definition: FieldDisassembler.h:188
@ MENU2
Definition: FieldDisassembler.h:93
@ CPPAL
Definition: FieldDisassembler.h:247
@ IFUB
Definition: FieldDisassembler.h:47
@ ANIMB
Definition: FieldDisassembler.h:237
@ WNUMB
Definition: FieldDisassembler.h:76
@ TUTOR
Definition: FieldDisassembler.h:54
@ PLUS_
Definition: FieldDisassembler.h:135
@ BITOFF
Definition: FieldDisassembler.h:148
@ MULCK
Definition: FieldDisassembler.h:261
@ STITM
Definition: FieldDisassembler.h:105
@ IFSWL
Definition: FieldDisassembler.h:50
@ MOVE
Definition: FieldDisassembler.h:185
@ MINUS2
Definition: FieldDisassembler.h:153
@ GETAI
Definition: FieldDisassembler.h:202
@ SCRLW
Definition: FieldDisassembler.h:120
@ HMPMAX2
Definition: FieldDisassembler.h:82
@ WROW
Definition: FieldDisassembler.h:102
@ ANIMW
Definition: FieldDisassembler.h:189
@ BTLMD
Definition: FieldDisassembler.h:131
@ PDIRA
Definition: FieldDisassembler.h:73
@ MINUS
Definition: FieldDisassembler.h:152
@ DEC2_
Definition: FieldDisassembler.h:142
@ SCRLC
Definition: FieldDisassembler.h:115
@ SOUND
Definition: FieldDisassembler.h:257
@ NOP
Definition: FieldDisassembler.h:112
@ PRQEW
Definition: FieldDisassembler.h:35
@ LDPLS
Definition: FieldDisassembler.h:252
@ ANIM_2
Definition: FieldDisassembler.h:203
@ SHAKE
Definition: FieldDisassembler.h:111
@ opCodeCHAR
Definition: FieldDisassembler.h:178
@ BTMD2
Definition: FieldDisassembler.h:55
@ BGSCR
Definition: FieldDisassembler.h:66
@ INC2
Definition: FieldDisassembler.h:167
@ GETDIR
Definition: FieldDisassembler.h:200
@ CHMPH
Definition: FieldDisassembler.h:263
@ TLKON
Definition: FieldDisassembler.h:143
OPCODES_KAWAI
KAWAI opcodes.
Definition: FieldDisassembler.h:304
@ Unknown07
Definition: FieldDisassembler.h:312
@ SBOBJ
Definition: FieldDisassembler.h:315
@ TRNSP
Definition: FieldDisassembler.h:306
@ SHINE
Definition: FieldDisassembler.h:318
@ Unknown0B
Definition: FieldDisassembler.h:316
@ Unknown03
Definition: FieldDisassembler.h:308
@ Unknown0C
Definition: FieldDisassembler.h:317
@ RESET
Definition: FieldDisassembler.h:319
@ Unknown05
Definition: FieldDisassembler.h:310
@ Unknown04
Definition: FieldDisassembler.h:309
@ EYETX
Definition: FieldDisassembler.h:305
@ Unknown09
Definition: FieldDisassembler.h:314
@ Unknown08
Definition: FieldDisassembler.h:313
@ AMBNT
Definition: FieldDisassembler.h:307
@ LIGHT
Definition: FieldDisassembler.h:311
OPCODES_SPECIAL
SPECIAL opcodes.
Definition: FieldDisassembler.h:282
@ FLMAT
Definition: FieldDisassembler.h:287
@ PNAME
Definition: FieldDisassembler.h:284
@ RSGLB
Definition: FieldDisassembler.h:292
@ ARROW
Definition: FieldDisassembler.h:283
@ SMSPD
Definition: FieldDisassembler.h:286
@ FLITM
Definition: FieldDisassembler.h:288
@ MVLCK
Definition: FieldDisassembler.h:290
@ CLITM
Definition: FieldDisassembler.h:293
@ SPCNM
Definition: FieldDisassembler.h:291
@ BTLCK
Definition: FieldDisassembler.h:289
@ GMSPD
Definition: FieldDisassembler.h:285
boost::intrusive_ptr< Instruction > InstPtr
Pointer to an Instruction.
Definition: Instruction.h:43
std::vector< InstPtr > InstVec
Type representing a vector of InstPtrs.
Definition: Instruction.h:382
Reader for binary files.
Definition: BinaryReader.h:27
unsigned int ReadU32()
Reads 32 bits of data as an unsigned integer.
Definition: BinaryReader.h:93
unsigned char ReadU8()
Reads 8 bits of data as an unsigned integer.
Definition: BinaryReader.h:133
unsigned short int ReadU16()
Reads 16 bits of data as a signed integer.
Definition: BinaryReader.h:123
Base class for disassemblers.
Definition: Disassembler.h:28
uint32 address_
The current address.
Definition: Disassembler.h:130
void ReadParams(InstPtr inst, const char *types)
Read parameters and associate them with an instruction.
Definition: Disassembler.cpp:58
InstVec & insts_
List of disassembled instructions.
Definition: Disassembler.h:120
A disassebler for field maps.
Definition: FieldDisassembler.h:327
static const int MAGIC
Field file identification magic number.
Definition: FieldDisassembler.h:428
virtual void DoDisassemble() override
Disassembles the instructions.
Definition: FieldDisassembler.cpp:120
std::array< uint32, 7 > sections_
The list of sections.
Definition: FieldDisassembler.h:750
uint32 header_end_position_
Last address of the header.
Definition: FieldDisassembler.h:745
float GetScaleFactor() const
Retrieves the scale factor for the field.
Definition: FieldDisassembler.cpp:63
std::unique_ptr< Function > StartFunction(size_t script_index)
Initializes a function for an entity.
Definition: FieldDisassembler.cpp:111
void ParseOpcode(int opcode, std::string name, T instruction, int stack_change, const char *argument_format)
Parses an opcode.
Definition: FieldDisassembler.h:724
static InstructionRecord FLOW_OPCODES[]
A list of flow control opcodes needed by the disassembler.
Definition: FieldDisassembler.h:365
float scale_factor_
The scale factor of the field.
Definition: FieldDisassembler.h:777
static std::map< std::string, const InstructionRecord * > FieldInstructions()
Generates a map of control flow instructions.
Definition: FieldDisassembler.cpp:307
void ReadHeader()
Reads the header.
Definition: FieldDisassembler.cpp:67
static const int NUM_SECTIONS
The number of sections in a field.
Definition: FieldDisassembler.h:433
static int FindId(uint32 start_addr, uint32 end_addr, const InstVec &insts)
Finds the ID of the character a function refers to.
Definition: FieldDisassembler.cpp:161
FieldEngine * engine_
The engine.
Definition: FieldDisassembler.h:740
void AddFunc(std::string entity_name, size_t entity_index, size_t script_index, uint32 next_script_entry_point, const bool is_start, const bool is_end, bool to_return_only, std::string func_name)
Adds a function to the engine.
Definition: FieldDisassembler.cpp:171
FieldScriptFormatter & formatter_
The formatter.
Definition: FieldDisassembler.h:772
void ReadHeader(BinaryReader &reader)
Reads the header.
int16 section_pointers_size_
Size of the pointers to sections.
Definition: FieldDisassembler.h:757
uint32 GetEndOfScriptOffset(uint16 cur_entry_point, size_t entity_index, size_t script_index)
Retrieves the offset of the end of a script.
Definition: FieldDisassembler.cpp:89
~FieldDisassembler()
Destructor.
Definition: FieldDisassembler.cpp:65
ScriptHeader header_
The field header.
Definition: FieldDisassembler.h:762
virtual void Open(const char *filename) override
Open a file for disassembly.
Definition: FieldDisassembler.cpp:83
void DisassembleIndivdualScript(std::string entity_name, size_t entity_index, size_t script_index, size_t script_entry_point, uint32 next_script_entry_point, bool is_start, bool is_end)
Disassembles a script (function).
Definition: FieldDisassembler.cpp:251
bool ReadOpCodesToPositionOrReturn(size_t end_pos, std::vector< float > &point_a, std::vector< float > &point_b)
Reads opcodes from a script, and detects lines.
Definition: FieldDisassembler.cpp:315
FieldDisassembler(FieldScriptFormatter &formatter, FieldEngine *engine, InstVec &insts)
Constructor.
Definition: FieldDisassembler.cpp:57
SECTIONS
The sections of a field.
Definition: FieldDisassembler.h:438
@ SCRIPT
The scripts section.
Definition: FieldDisassembler.h:443
@ WALKMESH
The walkmesh section.
Definition: FieldDisassembler.h:448
@ ENCOUNTERS
Encounter data section.
Definition: FieldDisassembler.h:468
@ TILE_MAP
The tiles section.
Definition: FieldDisassembler.h:453
@ MODELS
Field models section.
Definition: FieldDisassembler.h:473
@ CAMERA_MATRIX
The camera section.
Definition: FieldDisassembler.h:458
@ TRIGGERS
The triggers section.
Definition: FieldDisassembler.h:463
bool loaded_from_raw_data_
Indicates if the field has been loaded from raw data.
Definition: FieldDisassembler.h:767
Represents the FF7 Field engine.
Definition: FieldEngine.h:31
Formatter for field scripts.
Definition: FieldScriptFormatter.h:26
Invalid header exception.
Definition: DecompilerException.h:51
DummyFormatter formatter
Definition: ff7_field_disasm_all_opcodes_by_category_test.cpp:1966
unsigned short uint16
Definition: scummsys.h:433
unsigned int uint32
Definition: scummsys.h:435
signed short int16
Definition: scummsys.h:434
unsigned char uint8
Definition: scummsys.h:431
Information about an instruction.
Definition: FieldDisassembler.h:334
unsigned int opcode
The opcode code.
Definition: FieldDisassembler.h:344
const char * opcode_name
The opcode short name (mnemonic).
Definition: FieldDisassembler.h:349
unsigned char opcode_size
The size, in bytes, of the opcode.
Definition: FieldDisassembler.h:339
const char * argument_format
Format of the opcode arguments.
Definition: FieldDisassembler.h:354
std::function< InstPtr()> factory_function
Definition: FieldDisassembler.h:359
A script header.
Definition: FieldDisassembler.h:502
uint16 magic
Field file identification magic number.
Definition: FieldDisassembler.h:507
uint16 number_of_akao_offsets
The number of Akao/tuto blocks/offsets.
Definition: FieldDisassembler.h:527
uint16 scale
Scale of field.
Definition: FieldDisassembler.h:534
std::vector< std::array< char, 8 > > field_entity_names
The list of entity names.
Definition: FieldDisassembler.h:556
uint8 number_of_models
The number of models in the field.
Definition: FieldDisassembler.h:517
uint8 number_of_entities
The number of entities in the field.
Definition: FieldDisassembler.h:512
void Read(BinaryReader &reader)
Reads the header.
Definition: FieldDisassembler.h:580
uint16 offset_to_strings
Offset at which the field text strings begin.
Definition: FieldDisassembler.h:522
std::vector< std::array< uint16, 32 > > entity_scripts
Entity script entry points.
Definition: FieldDisassembler.h:571
std::array< char, 8 > name
The field name.
Definition: FieldDisassembler.h:549
std::vector< uint32 > akao_offsets
Akao/Tuto block offsets.
Definition: FieldDisassembler.h:563
std::array< char, 8 > creator
Field creator name.
Definition: FieldDisassembler.h:544
std::array< uint16, 3 > blank
Blank data, unused.
Definition: FieldDisassembler.h:539
Info about a script.
Definition: FieldDisassembler.h:479
uint16 entry_point
Address of the script entry point.
Definition: FieldDisassembler.h:484
size_t index
Script index.
Definition: FieldDisassembler.h:496
uint32 next_entry_point
Address of the next script entry point.
Definition: FieldDisassembler.h:491
Structure representing a function.
Definition: Function.h:26