Skip to content

Commit b431c48

Browse files
committed
Additional opcodes
1 parent 45035e7 commit b431c48

File tree

1 file changed

+65
-3
lines changed

1 file changed

+65
-3
lines changed

tools/psyq-obj-parser/psyq-obj-parser.cc

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,15 @@ enum class PsyqOpcode : uint8_t {
4444
FILENAME = 28,
4545
PROGRAMTYPE = 46,
4646
UNINITIALIZED = 48,
47-
SLD_END = 60,
47+
INC_SLD_LINENUM = 50,
48+
INC_SLD_LINENUM_BY_BYTE = 52,
49+
SET_SLD_LINENUM = 56,
50+
SET_SLD_LINENUM_FILE = 58,
51+
END_SLD = 60,
4852
FUNCTION = 74,
4953
FUNCTION_END = 76,
54+
SECTION_DEF = 82,
55+
SECTION_DEF2 = 84,
5056
};
5157

5258
enum class PsyqRelocType : uint8_t {
@@ -412,11 +418,37 @@ std::unique_ptr<PsyqLnkFile> PsyqLnkFile::parse(PCSX::File* file, bool verbose)
412418
ret->symbols.insert(symbolIndex, symbol);
413419
break;
414420
}
415-
case (uint8_t)PsyqOpcode::SLD_END: {
421+
case (uint8_t)PsyqOpcode::INC_SLD_LINENUM: {
422+
uint16_t offset = file->read<uint16_t>();
423+
vprint("INC_SLD_LINENUM offset {}\n", offset);
424+
425+
break;
426+
}
427+
case (uint8_t)PsyqOpcode::INC_SLD_LINENUM_BY_BYTE: {
428+
uint16_t offset = file->read<uint16_t>();
429+
uint8_t _byte = file->read<uint8_t>();
430+
vprint("INC_SLD_LINENUM_BY_BYTE offset {}, _byte {}\n", offset, _byte);
431+
432+
break;
433+
}
434+
case (uint8_t)PsyqOpcode::SET_SLD_LINENUM: {
435+
uint16_t offset = file->read<uint16_t>();
436+
uint32_t lineNum = file->read<uint32_t>();
437+
vprint("SET_SLD_LINENUM lineNum {}, offset {}\n", lineNum, offset);
438+
break;
439+
}
440+
case (uint8_t)PsyqOpcode::SET_SLD_LINENUM_FILE: {
441+
uint16_t offset = file->read<uint16_t>();
442+
uint32_t lineNum = file->read<uint32_t>();
443+
uint16_t _file = file->read<uint16_t>();
444+
vprint("SET_SLD_LINENUM_FILE lineNum {}, offset {}, _file {}\n", lineNum, offset, _file);
445+
break;
446+
}
447+
case (uint8_t)PsyqOpcode::END_SLD: {
416448
// 2 bytes of nothing
417449
uint16_t zero = file->read<uint16_t>();
418450
assert(zero == 0);
419-
vprint("SLD_END\n");
451+
vprint("END_SLD\n");
420452
break;
421453
}
422454
case (uint8_t)PsyqOpcode::FUNCTION: {
@@ -442,6 +474,36 @@ std::unique_ptr<PsyqLnkFile> PsyqLnkFile::parse(PCSX::File* file, bool verbose)
442474
section, offset, endLine);
443475
break;
444476
}
477+
case (uint8_t)PsyqOpcode::SECTION_DEF: {
478+
uint16_t section = file->read<uint16_t>();
479+
uint32_t value = file->read<uint32_t>();
480+
uint16_t _class = file->read<uint16_t>();
481+
uint16_t type = file->read<uint16_t>();
482+
uint32_t size = file->read<uint32_t>();
483+
std::string name = readPsyqString(file);
484+
vprint("SECTION_DEF: section {}, value {}, _class {}, type {}, size {}\n",
485+
section, value, _class, type, size);
486+
break;
487+
}
488+
case (uint8_t)PsyqOpcode::SECTION_DEF2: {
489+
uint16_t section = file->read<uint16_t>();
490+
uint32_t value = file->read<uint32_t>();
491+
uint16_t _class = file->read<uint16_t>();
492+
uint16_t type = file->read<uint16_t>();
493+
uint32_t size = file->read<uint32_t>();
494+
495+
uint16_t dims = file->read<uint16_t>();
496+
while (dims-- > 0) {
497+
// ignore for now
498+
uint16_t dim = file->read<uint16_t>();
499+
}
500+
501+
std::string tag = readPsyqString(file);
502+
std::string name = readPsyqString(file);
503+
vprint("SECTION_DEF2: section {}, value {}, _class {}, type {}, size {}, dims {}, tag {}, name {}\n",
504+
section, value, _class, type, size, dims, tag, name);
505+
break;
506+
}
445507
default: {
446508
fmt::print("Unknown opcode {}.\n", opcode);
447509
return nullptr;

0 commit comments

Comments
 (0)