use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OperandEncoding {
None,
I8,
I16,
I32,
I64,
Bytes(usize),
Data1,
Data2,
Data4,
Jump8,
Jump32,
U8,
U16,
U32,
Syscall,
}
#[allow(missing_docs)]
mod opcodes_generated {
use super::OperandEncoding;
include!("../opcodes_generated.rs");
}
pub use opcodes_generated::OpCode;
impl OpCode {
#[must_use]
pub fn all_known() -> Vec<OpCode> {
let mut entries = Vec::new();
for byte in u8::MIN..=u8::MAX {
let opcode = OpCode::from_byte(byte);
if matches!(opcode, OpCode::Unknown(_)) {
continue;
}
if !entries.contains(&opcode) {
entries.push(opcode);
}
}
entries
}
}
impl fmt::Display for OpCode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
OpCode::Unknown(value) => write!(f, "UNKNOWN_0x{value:02X}"),
_ => f.write_str(self.mnemonic()),
}
}
}