diff --git a/kaiseki-chip8/src/decoder.rs b/kaiseki-chip8/src/decoder.rs index d4a30fb..6178368 100644 --- a/kaiseki-chip8/src/decoder.rs +++ b/kaiseki-chip8/src/decoder.rs @@ -1,5 +1,6 @@ -use crate::instructions::{Chip8Instruction, Chip8Opcode}; +use crate::instructions::Chip8Instruction; use kaiseki_core::cpu::decoder::{DecodeError, DecodeOne, Result}; +use kaiseki_core::cpu::Instruction; pub struct Chip8Decoder {} @@ -7,7 +8,7 @@ impl DecodeOne for Chip8Decoder { type Instruction = Chip8Instruction; fn decode_one(&self, bytes: &[u8]) -> Result { - let opcode = Chip8Opcode::from_be_bytes(bytes); + let opcode = ::Opcode::from_be_bytes(bytes); let ins = match opcode.value() { 0x0000..=0x0FFF => match opcode.value() { @@ -24,12 +25,12 @@ impl DecodeOne for Chip8Decoder { addr: opcode.value() & 0x0FFF, }, 0x3000..=0x3FFF => Chip8Instruction::SkipIfEqual { - vx_idx: ((opcode.value() & 0x0F00) >> 2) as u8, - value: (opcode.value() & 0x00FF) as u8, + vx_idx: opcode.get_nybble(2), + value: opcode.get_byte(0), }, 0x4000..=0x4FFF => Chip8Instruction::SkipIfNotEqual { - vx_idx: ((opcode.value() & 0x0F00) >> 2) as u8, - value: (opcode.value() & 0x00FF) as u8, + vx_idx: opcode.get_nybble(2), + value: opcode.get_byte(0), }, _ => Err(DecodeError::UnimplementedOpcode)?, }; diff --git a/kaiseki-chip8/src/instructions.rs b/kaiseki-chip8/src/instructions.rs index 3191fae..d1e1a3e 100644 --- a/kaiseki-chip8/src/instructions.rs +++ b/kaiseki-chip8/src/instructions.rs @@ -1,7 +1,5 @@ use kaiseki_core::cpu::{opcode::Opcode16, Instruction}; -pub type Chip8Opcode = Opcode16; - #[allow(dead_code)] #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Chip8Instruction { @@ -127,6 +125,8 @@ pub enum Chip8Instruction { } impl Instruction for Chip8Instruction { + type Opcode = Opcode16; + fn len_bytes(&self) -> usize { 2 } diff --git a/kaiseki-core/src/cpu/mod.rs b/kaiseki-core/src/cpu/mod.rs index eafe9de..4117fa4 100644 --- a/kaiseki-core/src/cpu/mod.rs +++ b/kaiseki-core/src/cpu/mod.rs @@ -2,5 +2,6 @@ pub mod decoder; pub mod opcode; pub trait Instruction { + type Opcode; fn len_bytes(&self) -> usize; }