Fix Doldecomp formatter
This commit is contained in:
parent
a15c909240
commit
e55398cd01
|
@ -11,6 +11,10 @@ repository = "https://github.com/terorie/ppc750cl"
|
|||
name = "ppc750cl"
|
||||
crate-type = ["cdylib"]
|
||||
|
||||
[features]
|
||||
extension-module = ["pyo3/extension-module"]
|
||||
default = ["extension-module"]
|
||||
|
||||
[dependencies]
|
||||
pyo3 = { version = "0.14", features = ["extension-module", "multiple-pymethods"] }
|
||||
pyo3 = { version = "0.14", features = ["multiple-pymethods"] }
|
||||
ppc750cl = { version = "0.1.1", path = "../disasm" }
|
||||
|
|
|
@ -109,7 +109,7 @@ impl PyIterProtocol for DisasmIterator {
|
|||
if (slf.bytes.len() as u32) - slf.offset < 4 {
|
||||
return Ok(None);
|
||||
}
|
||||
let code = ((slf.bytes[(slf.offset + 0) as usize] as u32) << 24)
|
||||
let code = ((slf.bytes[(slf.offset) as usize] as u32) << 24)
|
||||
| ((slf.bytes[(slf.offset + 1) as usize] as u32) << 16)
|
||||
| ((slf.bytes[(slf.offset + 2) as usize] as u32) << 8)
|
||||
| (slf.bytes[(slf.offset + 3) as usize] as u32);
|
||||
|
@ -121,7 +121,7 @@ impl PyIterProtocol for DisasmIterator {
|
|||
}
|
||||
|
||||
#[pyfunction]
|
||||
fn disasm_iter<'a>(code: &[u8], addr: u32) -> PyResult<DisasmIterator> {
|
||||
fn disasm_iter(code: &[u8], addr: u32) -> PyResult<DisasmIterator> {
|
||||
Ok(DisasmIterator {
|
||||
bytes: code.to_vec(),
|
||||
addr,
|
||||
|
|
|
@ -186,6 +186,12 @@ pub struct DoldecompFormatter<W: Write> {
|
|||
pub writer: W,
|
||||
}
|
||||
|
||||
impl<W: Write> DoldecompFormatter<W> {
|
||||
pub fn new(writer: W) -> Self {
|
||||
Self { writer }
|
||||
}
|
||||
}
|
||||
|
||||
impl<W: Write> AsmFormatter<W> for DoldecompFormatter<W> {
|
||||
fn writer(&mut self) -> &mut W {
|
||||
&mut self.writer
|
||||
|
@ -194,7 +200,8 @@ impl<W: Write> AsmFormatter<W> for DoldecompFormatter<W> {
|
|||
fn before_instruction(&mut self, ins: &Ins) -> IOResult {
|
||||
write!(
|
||||
&mut self.writer,
|
||||
"/* TODO */ {:X} {:X} {:X} {:X}\t",
|
||||
"/* {:0>8X} {:0>2X} {:0>2X} {:0>2X} {:0>2X} */\t",
|
||||
ins.addr,
|
||||
(ins.code >> 24) as u8,
|
||||
(ins.code >> 16) as u8,
|
||||
(ins.code >> 8) as u8,
|
||||
|
@ -223,3 +230,22 @@ impl<N: PrimInt> UpperHex for ReallySigned<N> {
|
|||
f.pad_integral(num >= 0, prefix, &bare_hex)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_doldecomp_formatter() {
|
||||
let buf = Vec::<u8>::new();
|
||||
let mut formatter = DoldecompFormatter::new(buf);
|
||||
|
||||
let ins = Ins::new(0x48000007, 6);
|
||||
ins.write_string(&mut formatter).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
String::from_utf8(formatter.writer).unwrap(),
|
||||
"/* 00000006 48 00 00 07 */\tbla 0x4"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -419,6 +419,17 @@ impl Ins {
|
|||
}
|
||||
|
||||
pub fn write_string<F, W>(&self, out: &mut F) -> std::io::Result<()>
|
||||
where
|
||||
F: AsmFormatter<W>,
|
||||
W: Write,
|
||||
{
|
||||
out.before_instruction(self)?;
|
||||
self.write_string_inner(out)?;
|
||||
out.after_instruction(self)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn write_string_inner<F, W>(&self, out: &mut F) -> std::io::Result<()>
|
||||
where
|
||||
F: AsmFormatter<W>,
|
||||
W: Write,
|
||||
|
@ -913,7 +924,7 @@ impl Ins {
|
|||
impl ToString for Ins {
|
||||
fn to_string(&self) -> String {
|
||||
let buf = Vec::<u8>::new();
|
||||
let mut formatter = SimpleFormatter { writer: buf };
|
||||
let mut formatter = SimpleFormatter::new(buf);
|
||||
self.write_string(&mut formatter).unwrap();
|
||||
unsafe { String::from_utf8_unchecked(formatter.writer) }
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue