WIP: impl Entis GLS CSX v2 disasm

This commit is contained in:
2026-01-20 21:44:15 +08:00
parent edfb17205e
commit e8bb180b14
4 changed files with 1214 additions and 4 deletions

View File

File diff suppressed because it is too large Load Diff

View File

@@ -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>> {

View File

@@ -1,5 +1,6 @@
//! Ported from CSXToolPlus C# project
//! See parent module documentation for more details.
mod disasm;
mod img;
mod types;

View File

@@ -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
}
}