mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-06-07 21:38:58 +08:00
WIP: impl Entis GLS CSX v2 disasm
This commit is contained in:
1166
src/scripts/entis_gls/csx/v2/disasm.rs
Normal file
1166
src/scripts/entis_gls/csx/v2/disasm.rs
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,5 @@
|
||||
use super::super::base::*;
|
||||
use super::disasm::*;
|
||||
use super::types::*;
|
||||
use crate::ext::io::*;
|
||||
use crate::scripts::base::*;
|
||||
@@ -359,8 +360,18 @@ impl ECSExecutionImage {
|
||||
}
|
||||
|
||||
impl ECSImage for ECSExecutionImage {
|
||||
fn disasm<'a>(&self, _writer: Box<dyn std::io::Write + 'a>) -> Result<()> {
|
||||
Err(anyhow::anyhow!("Disassembly not implemented for CSX v2"))
|
||||
fn disasm<'a>(&self, writer: Box<dyn std::io::Write + 'a>) -> Result<()> {
|
||||
let mut disasm = ECSExecutionImageDisassembler::new(
|
||||
self.image.to_ref(),
|
||||
&self.section_function,
|
||||
&self.section_func_info,
|
||||
&self.section_import_native_func,
|
||||
&self.section_class_info,
|
||||
&self.section_const_string,
|
||||
Some(writer),
|
||||
);
|
||||
disasm.execute()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn export(&self) -> Result<Vec<Message>> {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
//! Ported from CSXToolPlus C# project
|
||||
//! See parent module documentation for more details.
|
||||
mod disasm;
|
||||
mod img;
|
||||
mod types;
|
||||
|
||||
|
||||
@@ -170,9 +170,13 @@ pub enum CSInstructionCode {
|
||||
}
|
||||
|
||||
pub use CSInstructionCode::*;
|
||||
#[allow(unused_imports)]
|
||||
pub use CodeLoadLocal as CodeLoadLocalImm32;
|
||||
#[allow(unused_imports)]
|
||||
pub use CodeLoadMem as CodeLoadMemBase;
|
||||
#[allow(unused_imports)]
|
||||
pub use CodeStoreLocal as CodeStoreLocalImm32;
|
||||
#[allow(unused_imports)]
|
||||
pub use CodeStoreMem as CodeStoreMemBase;
|
||||
|
||||
#[repr(u8)]
|
||||
@@ -822,8 +826,8 @@ pub struct ClassInfoEntry {
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct SectionClassInfo {
|
||||
names: Vec<WideString>,
|
||||
infos: Vec<ClassInfoEntry>,
|
||||
pub names: Vec<WideString>,
|
||||
pub infos: Vec<ClassInfoEntry>,
|
||||
}
|
||||
|
||||
impl StructUnpack for SectionClassInfo {
|
||||
@@ -1206,3 +1210,31 @@ impl StructPack for SectionImportNativeFunc {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct ECSExecutionImageCommandRecord {
|
||||
pub code: CSInstructionCode,
|
||||
pub addr: u32,
|
||||
pub size: u32,
|
||||
pub new_addr: u32,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct ECSExecutionImageAssembly {
|
||||
pub commands: Vec<ECSExecutionImageCommandRecord>,
|
||||
}
|
||||
|
||||
impl Deref for ECSExecutionImageAssembly {
|
||||
type Target = Vec<ECSExecutionImageCommandRecord>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.commands
|
||||
}
|
||||
}
|
||||
|
||||
impl DerefMut for ECSExecutionImageAssembly {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
&mut self.commands
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user