extern crate alloc;
use olympia_core::disasm::Disassemble;
use olympia_core::instructions::{
ConstantParam, ExtensionType, Instruction, InstructionOpcode, ParamDefinition, ParamPosition,
ParamType,
};
use olympia_derive::OlympiaInstruction;
use olympia_core::registers::WordRegister;
use olympia_core::registers::WordRegister::*;
#[derive(Debug, PartialEq, Eq, OlympiaInstruction)]
#[olympia(opcode = 0x1111_1001, label = "LD")]
struct LoadStackPointer {
#[olympia(dest, constant(SP))]
dest: WordRegister,
#[olympia(src, constant(WordRegister::HL))]
src: WordRegister,
}
#[test]
fn constant_args_definition() {
let definition = LoadStackPointer::definition();
assert_eq!(definition.label, "LD");
assert_eq!(definition.opcodes, &[0xf9]);
assert_eq!(definition.extension_type, ExtensionType::None);
assert_eq!(
definition.params,
&[
ParamDefinition {
pos: ParamPosition::Dest,
param_type: ParamType::Constant(ConstantParam::WordRegister(WordRegister::SP)),
},
ParamDefinition {
pos: ParamPosition::Src,
param_type: ParamType::Constant(ConstantParam::WordRegister(WordRegister::HL)),
},
]
);
}
#[test]
fn constant_args_expansion() {
let opcode = LoadStackPointerOpcode::from_opcode(0xF9);
let data = vec![];
assert_eq!(
opcode.build_instruction(&mut data.into_iter()),
LoadStackPointer {
dest: WordRegister::SP,
src: WordRegister::HL,
},
);
}
#[test]
fn constant_args_disasm() {
let op = LoadStackPointer {
dest: WordRegister::SP,
src: WordRegister::HL,
};
assert_eq!(op.disassemble(), "LD SP, HL");
}