use crate::decoder::DECODER;
use crate::disassembler::*;
use crate::instruction::Instruction;
use crate::memory_access::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 From<u16> for Isa {
fn from(opcode: u16) -> Self {
DECODER[opcode as usize]
}
}
#[derive(Clone, Copy)]
pub struct IsaEntry {
pub decode: fn(u16, &mut MemoryIter) -> (Operands, usize),
pub disassemble: fn(&Instruction) -> String,
}
impl IsaEntry {
pub const ISA_ENTRY: [IsaEntry; Isa::_Size as usize] = [
IsaEntry { decode: no_operands, disassemble: disassemble_unknown_instruction, },
IsaEntry { decode: register_size_mode_register, disassemble: disassemble_abcd, },
IsaEntry { decode: register_direction_size_effective_address, disassemble: disassemble_add, },
IsaEntry { decode: register_size_effective_address, disassemble: disassemble_adda, },
IsaEntry { decode: size_effective_address_immediate, disassemble: disassemble_addi, },
IsaEntry { decode: data_size_effective_address, disassemble: disassemble_addq, },
IsaEntry { decode: register_size_mode_register, disassemble: disassemble_addx, },
IsaEntry { decode: register_direction_size_effective_address, disassemble: disassemble_and, },
IsaEntry { decode: size_effective_address_immediate, disassemble: disassemble_andi, },
IsaEntry { decode: immediate, disassemble: disassemble_andiccr },
IsaEntry { decode: immediate, disassemble: disassemble_andisr, },
IsaEntry { decode: direction_effective_address, disassemble: disassemble_asm, },
IsaEntry { decode: rotation_direction_size_mode_register, disassemble: disassemble_asr, },
IsaEntry { decode: condition_displacement, disassemble: disassemble_bcc, },
IsaEntry { decode: effective_address_count, disassemble: disassemble_bchg, },
IsaEntry { decode: effective_address_count, disassemble: disassemble_bclr, },
IsaEntry { decode: displacement, disassemble: disassemble_bra, },
IsaEntry { decode: effective_address_count, disassemble: disassemble_bset, },
IsaEntry { decode: displacement, disassemble: disassemble_bsr, },
IsaEntry { decode: effective_address_count, disassemble: disassemble_btst, },
IsaEntry { decode: register_effective_address, disassemble: disassemble_chk, },
IsaEntry { decode: size_effective_address, disassemble: disassemble_clr, },
IsaEntry { decode: register_direction_size_effective_address, disassemble: disassemble_cmp, },
IsaEntry { decode: register_size_effective_address, disassemble: disassemble_cmpa, },
IsaEntry { decode: size_effective_address_immediate, disassemble: disassemble_cmpi, },
IsaEntry { decode: register_size_register, disassemble: disassemble_cmpm, },
IsaEntry { decode: condition_register_displacement, disassemble: disassemble_dbcc, },
IsaEntry { decode: register_effective_address, disassemble: disassemble_divs, },
IsaEntry { decode: register_effective_address, disassemble: disassemble_divu, },
IsaEntry { decode: register_direction_size_effective_address, disassemble: disassemble_eor, },
IsaEntry { decode: size_effective_address_immediate, disassemble: disassemble_eori, },
IsaEntry { decode: immediate, disassemble: disassemble_eoriccr, },
IsaEntry { decode: immediate, disassemble: disassemble_eorisr, },
IsaEntry { decode: register_opmode_register, disassemble: disassemble_exg, },
IsaEntry { decode: opmode_register, disassemble: disassemble_ext, },
IsaEntry { decode: no_operands, disassemble: disassemble_illegal, },
IsaEntry { decode: effective_address, disassemble: disassemble_jmp, },
IsaEntry { decode: effective_address, disassemble: disassemble_jsr, },
IsaEntry { decode: register_effective_address, disassemble: disassemble_lea, },
IsaEntry { decode: register_displacement, disassemble: disassemble_link, },
IsaEntry { decode: direction_effective_address, disassemble: disassemble_lsm, },
IsaEntry { decode: rotation_direction_size_mode_register, disassemble: disassemble_lsr, },
IsaEntry { decode: size_effective_address_effective_address, disassemble: disassemble_move, },
IsaEntry { decode: size_register_effective_address, disassemble: disassemble_movea, },
IsaEntry { decode: effective_address, disassemble: disassemble_moveccr, },
IsaEntry { decode: effective_address, disassemble: disassemble_movefsr, },
IsaEntry { decode: effective_address, disassemble: disassemble_movesr, },
IsaEntry { decode: direction_register, disassemble: disassemble_moveusp, },
IsaEntry { decode: direction_size_effective_address_list, disassemble: disassemble_movem, },
IsaEntry { decode: register_direction_size_register_displacement, disassemble: disassemble_movep, },
IsaEntry { decode: register_data, disassemble: disassemble_moveq, },
IsaEntry { decode: register_effective_address, disassemble: disassemble_muls, },
IsaEntry { decode: register_effective_address, disassemble: disassemble_mulu, },
IsaEntry { decode: effective_address, disassemble: disassemble_nbcd, },
IsaEntry { decode: size_effective_address, disassemble: disassemble_neg, },
IsaEntry { decode: size_effective_address, disassemble: disassemble_negx, },
IsaEntry { decode: no_operands, disassemble: disassemble_nop, },
IsaEntry { decode: size_effective_address, disassemble: disassemble_not, },
IsaEntry { decode: register_direction_size_effective_address, disassemble: disassemble_or, },
IsaEntry { decode: size_effective_address_immediate, disassemble: disassemble_ori, },
IsaEntry { decode: immediate, disassemble: disassemble_oriccr, },
IsaEntry { decode: immediate, disassemble: disassemble_orisr, },
IsaEntry { decode: effective_address, disassemble: disassemble_pea, },
IsaEntry { decode: no_operands, disassemble: disassemble_reset, },
IsaEntry { decode: direction_effective_address, disassemble: disassemble_rom, },
IsaEntry { decode: rotation_direction_size_mode_register, disassemble: disassemble_ror, },
IsaEntry { decode: direction_effective_address, disassemble: disassemble_roxm, },
IsaEntry { decode: rotation_direction_size_mode_register, disassemble: disassemble_roxr, },
IsaEntry { decode: no_operands, disassemble: disassemble_rte, },
IsaEntry { decode: no_operands, disassemble: disassemble_rtr, },
IsaEntry { decode: no_operands, disassemble: disassemble_rts, },
IsaEntry { decode: register_size_mode_register, disassemble: disassemble_sbcd, },
IsaEntry { decode: condition_effective_address, disassemble: disassemble_scc, },
IsaEntry { decode: immediate, disassemble: disassemble_stop, },
IsaEntry { decode: register_direction_size_effective_address, disassemble: disassemble_sub, },
IsaEntry { decode: register_size_effective_address, disassemble: disassemble_suba, },
IsaEntry { decode: size_effective_address_immediate, disassemble: disassemble_subi, },
IsaEntry { decode: data_size_effective_address, disassemble: disassemble_subq, },
IsaEntry { decode: register_size_mode_register, disassemble: disassemble_subx, },
IsaEntry { decode: register, disassemble: disassemble_swap, },
IsaEntry { decode: effective_address, disassemble: disassemble_tas, },
IsaEntry { decode: vector, disassemble: disassemble_trap, },
IsaEntry { decode: no_operands, disassemble: disassemble_trapv, },
IsaEntry { decode: size_effective_address, disassemble: disassemble_tst, },
IsaEntry { decode: register, disassemble: disassemble_unlk, },
];
}