use crate::decoder::DECODER;
use crate::memory_access::{MemoryAccess, MemoryIter};
use crate::instruction::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub enum Isa {
Unknown,
Abcd,
Add,
Adda,
Addi,
Addq,
Addx,
And,
Andi,
Andiccr,
Andisr,
Asm,
Asr,
Bcc,
Bchg,
Bclr,
Bra,
Bset,
Bsr,
Btst,
Chk,
Clr,
Cmp,
Cmpa,
Cmpi,
Cmpm,
Dbcc,
Divs,
Divu,
Eor,
Eori,
Eoriccr,
Eorisr,
Exg,
Ext,
Illegal,
Jmp,
Jsr,
Lea,
Link,
Lsm,
Lsr,
Move,
Movea,
Moveccr,
Movefsr,
Movesr,
Moveusp,
Movem,
Movep,
Moveq,
Muls,
Mulu,
Nbcd,
Neg,
Negx,
Nop,
Not,
Or,
Ori,
Oriccr,
Orisr,
Pea,
Reset,
Rom,
Ror,
Roxm,
Roxr,
Rte,
Rtr,
Rts,
Sbcd,
Scc,
Stop,
Sub,
Suba,
Subi,
Subq,
Subx,
Swap,
Tas,
Trap,
Trapv,
Tst,
Unlk,
_Size,
}
impl Isa {
pub const fn is_privileged(self) -> bool {
use Isa::*;
matches!(self, Andisr | Eorisr | Movesr | Moveusp | Orisr | Reset | Rte | Stop)
}
}
impl From<u16> for Isa {
fn from(opcode: u16) -> Self {
DECODER[opcode as usize]
}
}
#[derive(Clone, Copy)]
pub struct IsaEntry<M: MemoryAccess + ?Sized> {
pub decode: fn(u16, &mut MemoryIter<M>) -> Operands,
}
impl<M: MemoryAccess + ?Sized> IsaEntry<M> {
pub const ISA_ENTRY: [IsaEntry<M>; Isa::_Size as usize] = [
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_register_size_mode_register, },
IsaEntry { decode: Operands::new_register_direction_size_effective_address, },
IsaEntry { decode: Operands::new_register_size_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address_immediate, },
IsaEntry { decode: Operands::new_data_size_effective_address, },
IsaEntry { decode: Operands::new_register_size_mode_register, },
IsaEntry { decode: Operands::new_register_direction_size_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address_immediate, },
IsaEntry { decode: Operands::new_immediate, },
IsaEntry { decode: Operands::new_immediate, },
IsaEntry { decode: Operands::new_direction_effective_address, },
IsaEntry { decode: Operands::new_rotation_direction_size_mode_register, },
IsaEntry { decode: Operands::new_condition_displacement, },
IsaEntry { decode: Operands::new_effective_address_count, },
IsaEntry { decode: Operands::new_effective_address_count, },
IsaEntry { decode: Operands::new_displacement, },
IsaEntry { decode: Operands::new_effective_address_count, },
IsaEntry { decode: Operands::new_displacement, },
IsaEntry { decode: Operands::new_effective_address_count, },
IsaEntry { decode: Operands::new_register_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address, },
IsaEntry { decode: Operands::new_register_direction_size_effective_address, },
IsaEntry { decode: Operands::new_register_size_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address_immediate, },
IsaEntry { decode: Operands::new_register_size_register, },
IsaEntry { decode: Operands::new_condition_register_displacement, },
IsaEntry { decode: Operands::new_register_effective_address, },
IsaEntry { decode: Operands::new_register_effective_address, },
IsaEntry { decode: Operands::new_register_direction_size_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address_immediate, },
IsaEntry { decode: Operands::new_immediate, },
IsaEntry { decode: Operands::new_immediate, },
IsaEntry { decode: Operands::new_register_opmode_register, },
IsaEntry { decode: Operands::new_opmode_register, },
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_register_effective_address, },
IsaEntry { decode: Operands::new_register_displacement, },
IsaEntry { decode: Operands::new_direction_effective_address, },
IsaEntry { decode: Operands::new_rotation_direction_size_mode_register, },
IsaEntry { decode: Operands::new_size_effective_address_effective_address, },
IsaEntry { decode: Operands::new_size_register_effective_address, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_direction_register, },
IsaEntry { decode: Operands::new_direction_size_effective_address_list, },
IsaEntry { decode: Operands::new_register_direction_size_register_displacement, },
IsaEntry { decode: Operands::new_register_data, },
IsaEntry { decode: Operands::new_register_effective_address, },
IsaEntry { decode: Operands::new_register_effective_address, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address, },
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_size_effective_address, },
IsaEntry { decode: Operands::new_register_direction_size_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address_immediate, },
IsaEntry { decode: Operands::new_immediate, },
IsaEntry { decode: Operands::new_immediate, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_direction_effective_address, },
IsaEntry { decode: Operands::new_rotation_direction_size_mode_register, },
IsaEntry { decode: Operands::new_direction_effective_address, },
IsaEntry { decode: Operands::new_rotation_direction_size_mode_register, },
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_register_size_mode_register, },
IsaEntry { decode: Operands::new_condition_effective_address, },
IsaEntry { decode: Operands::new_immediate, },
IsaEntry { decode: Operands::new_register_direction_size_effective_address, },
IsaEntry { decode: Operands::new_register_size_effective_address, },
IsaEntry { decode: Operands::new_size_effective_address_immediate, },
IsaEntry { decode: Operands::new_data_size_effective_address, },
IsaEntry { decode: Operands::new_register_size_mode_register, },
IsaEntry { decode: Operands::new_register, },
IsaEntry { decode: Operands::new_effective_address, },
IsaEntry { decode: Operands::new_vector, },
IsaEntry { decode: Operands::new_no_operands, },
IsaEntry { decode: Operands::new_size_effective_address, },
IsaEntry { decode: Operands::new_register, },
];
}