1 #include "psxexe.h"
2 #include "psxexe_analyzer.h"
3 #include <cstring>
4 
5 #define PSXEXE_SIGNATURE   "PS-X EXE"
6 #define PSXEXE_TEXT_OFFSET 0x00000800
7 #define PSX_USER_RAM_START 0x80000000
8 #define PSX_USER_RAM_END   0x80200000
9 
10 namespace REDasm {
11 
LOADER_PLUGIN_TEST(PsxExeLoader,PsxExeHeader)12 LOADER_PLUGIN_TEST(PsxExeLoader, PsxExeHeader) { return !strncmp(header->id, PSXEXE_SIGNATURE, PSXEXE_SIGNATURE_SIZE); }
13 
PsxExeLoader(AbstractBuffer * buffer)14 PsxExeLoader::PsxExeLoader(AbstractBuffer *buffer): LoaderPluginT<PsxExeHeader>(buffer) { }
assembler() const15 std::string PsxExeLoader::assembler() const { return "mips32le"; }
createAnalyzer(DisassemblerAPI * disassembler) const16 Analyzer *PsxExeLoader::createAnalyzer(DisassemblerAPI *disassembler) const { return new PsxExeAnalyzer(disassembler); }
17 
load()18 void PsxExeLoader::load()
19 {
20     m_signatures.insert("psyq");
21 
22     if(m_header->t_addr > PSX_USER_RAM_START)
23         m_document->segment("RAM0", 0, PSX_USER_RAM_START, (m_header->t_addr - PSX_USER_RAM_START), SegmentType::Bss);
24 
25     m_document->segment("TEXT", PSXEXE_TEXT_OFFSET, m_header->t_addr, m_header->t_size, SegmentType::Code | SegmentType::Data);
26 
27     if((m_header->t_addr + m_header->t_size) < PSX_USER_RAM_END)
28         m_document->segment("RAM1", 0, m_header->t_addr + m_header->t_size, PSX_USER_RAM_END - (m_header->t_addr + m_header->t_size), SegmentType::Bss);
29 
30     m_document->entry(m_header->pc0);
31 }
32 
33 }
34