use crate::emulator::VBRegister; pub struct RegisterInfo { dwarf: u32, name: &'static str, set: &'static str, alt_name: Option<&'static str>, generic: Option<&'static str>, } impl RegisterInfo { pub fn to_description(&self) -> String { let mut string = format!("name:{}", self.name); if let Some(alt) = self.alt_name { string.push_str(&format!(";alt-name:{}", alt)); } string.push_str(&format!( ";bitsize:32;offset:{};encoding:uint;format:hex;set:{};dwarf:{}", self.dwarf * 4, self.set, self.dwarf )); if let Some(generic) = self.generic { string.push_str(&format!(";generic:{}", generic)); } string } pub fn to_vb_register(&self) -> VBRegister { match self.dwarf { 0..32 => VBRegister::Program(self.dwarf), 32..40 => VBRegister::System(self.dwarf - 32), 40..42 => VBRegister::System(self.dwarf - 16), 42..45 => VBRegister::System(self.dwarf - 13), 45 => VBRegister::PC, other => panic!("unexpected DWARF register {other}"), } } } macro_rules! register { ($set:expr, $dwarf:expr, $name:expr) => { RegisterInfo { dwarf: $dwarf, name: $name, set: $set, alt_name: None, generic: None, } }; ($set:expr, $dwarf:expr, $name:expr, alt: $alt:expr) => { RegisterInfo { dwarf: $dwarf, name: $name, set: $set, alt_name: Some($alt), generic: None, } }; ($set:expr, $dwarf:expr, $name:expr, generic: $generic:expr) => { RegisterInfo { dwarf: $dwarf, name: $name, set: $set, alt_name: None, generic: Some($generic), } }; ($set:expr, $dwarf:expr, $name:expr, alt: $alt:expr, generic: $generic:expr) => { RegisterInfo { dwarf: $dwarf, name: $name, set: $set, alt_name: Some($alt), generic: Some($generic), } }; } const GENERAL: &str = "General Purpose Registers"; const SPECIAL: &str = "Special Registers"; pub const REGISTERS: [RegisterInfo; 46] = [ register!(GENERAL, 0, "r0"), register!(GENERAL, 1, "r1"), register!(GENERAL, 2, "fp", alt: "r2", generic: "fp"), register!(GENERAL, 3, "sp", alt: "r3", generic: "sp"), register!(GENERAL, 4, "gp", alt: "r4"), register!(GENERAL, 5, "tp", alt: "r5"), register!(GENERAL, 6, "r6", generic: "arg1"), register!(GENERAL, 7, "r7", generic: "arg2"), register!(GENERAL, 8, "r8", generic: "arg3"), register!(GENERAL, 9, "r9", generic: "arg4"), register!(GENERAL, 10, "r10"), register!(GENERAL, 11, "r11"), register!(GENERAL, 12, "r12"), register!(GENERAL, 13, "r13"), register!(GENERAL, 14, "r14"), register!(GENERAL, 15, "r15"), register!(GENERAL, 16, "r16"), register!(GENERAL, 17, "r17"), register!(GENERAL, 18, "r18"), register!(GENERAL, 19, "r19"), register!(GENERAL, 20, "r20"), register!(GENERAL, 21, "r21"), register!(GENERAL, 22, "r22"), register!(GENERAL, 23, "r23"), register!(GENERAL, 24, "r24"), register!(GENERAL, 25, "r25"), register!(GENERAL, 26, "r26"), register!(GENERAL, 27, "r27"), register!(GENERAL, 28, "r28"), register!(GENERAL, 29, "r29"), register!(GENERAL, 30, "r30"), register!(GENERAL, 31, "lp", alt: "r31", generic: "ra"), register!(SPECIAL, 32, "eipc", alt: "sr0"), register!(SPECIAL, 33, "eipsw", alt: "sr1"), register!(SPECIAL, 34, "fepc", alt: "sr2"), register!(SPECIAL, 35, "fepsw", alt: "sr3"), register!(SPECIAL, 36, "ecr", alt: "sr4"), register!(SPECIAL, 37, "psw", alt: "sr5", generic: "flags"), register!(SPECIAL, 38, "pir", alt: "sr6"), register!(SPECIAL, 39, "tkcw", alt: "sr7"), register!(SPECIAL, 40, "chcw", alt: "sr24"), register!(SPECIAL, 41, "adtre", alt: "sr25"), register!(SPECIAL, 42, "sr29"), register!(SPECIAL, 43, "sr30"), register!(SPECIAL, 44, "sr31"), register!(SPECIAL, 45, "pc", generic: "pc"), ];