diff --git a/src/emu/cpu.rs b/src/emu/cpu.rs index 65274d1..8357c05 100644 --- a/src/emu/cpu.rs +++ b/src/emu/cpu.rs @@ -1,4 +1,8 @@ use crate::emu::mmu::{MappedMemory, Memory}; +use crate::emu::program_counter::ProgramCounter; +use crate::misc::emulator_error::{DeviceType, EmulatorError}; +use crate::misc::emulator_error::DeviceType::{CPU, PC}; +use crate::misc::endian::read_big_endian_u24; use crate::misc::result::EmulatorResult; #[derive(Debug)] @@ -9,24 +13,49 @@ pub enum CpuState{ #[derive(Debug)] pub struct Cpu<'a>{ - mapped_memory:&'a mut MappedMemory<'a>, + mapped_memory:&'a MappedMemory<'a>, + program_counter: &'a ProgramCounter } impl <'a> Cpu<'a>{ - pub fn new(mapped_memory: &'a mut MappedMemory<'a>)->Cpu<'a>{ + pub fn new(mapped_memory: &'a MappedMemory<'a>,program_counter: &'a ProgramCounter)->Cpu<'a>{ Cpu{ - mapped_memory + mapped_memory, + program_counter } } - pub fn cycle()->EmulatorResult<()>{ - todo!(); + pub fn cycle(&self)->EmulatorResult<()>{ + for _i in 0..65536{ + let address_to_execute = self.program_counter.get_pc_value(); + + //fetch + let num1 = self.fetch_triplet(address_to_execute)?; + self.set_triplet(address_to_execute+3,&num1)?; + + let new_pc = read_big_endian_u24(&self.fetch_triplet(address_to_execute+6)?); + self.program_counter.set_address(new_pc)?; + } + // TODO send graphics + // TODO send audio + Ok(()) + } + + fn fetch_triplet(&self, address: u32) -> EmulatorResult<[u8;3]> { + let first_byte = self.mapped_memory.try_get_byte(address)?; + let second_byte = self.mapped_memory.try_get_byte(address+1)?; + let third_byte = self.mapped_memory.try_get_byte(address+2)?; + let num = [first_byte,second_byte,third_byte]; + Ok(num) + } + fn set_triplet(&self, address: u32, val:&[u8;3]) -> EmulatorResult<()> { + self.mapped_memory.try_set_byte(address, val[0])?; + self.mapped_memory.try_set_byte(address + 1, val[1])?; + self.mapped_memory.try_set_byte(address + 2, val[2])?; Ok(()) } fn set_pc(&self,value: &[u8;3])->EmulatorResult<()>{ - todo!() - // for bytete in value { - // self.mapped_memory.try_set_byte() - // }try_set_byte + let x = read_big_endian_u24(value); + self.program_counter.set_address(x) } } diff --git a/src/main.rs b/src/main.rs index 8047a34..c5e2021 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use sdl2::event::Event; use sdl2::keyboard::Keycode; use sdl2::pixels::Color; use simple_logger::SimpleLogger; +use crate::emu::cpu::Cpu; use crate::emu::iomem::MemoryMappedIO; use crate::emu::ram::RamMemory; use crate::emu::mmu::{Memory, MappedMemory}; @@ -22,6 +23,10 @@ fn main() -> EmulatorResult<()> { let ram = RamMemory::try_new()?; let mmu = MappedMemory::new(&mmio,&ram); + let mut cpu = Cpu::new(&mmu,&program_counter); + for i in 0..1{ + cpu.cycle(); + } // let sdl_context = sdl2::init().unwrap(); // let video_subsystem = sdl_context.video().unwrap(); diff --git a/src/misc/emulator_error.rs b/src/misc/emulator_error.rs index 4a010c3..21e2336 100644 --- a/src/misc/emulator_error.rs +++ b/src/misc/emulator_error.rs @@ -2,6 +2,7 @@ use std::fmt::Debug; #[derive(Debug, Copy, Clone)] pub enum DeviceType { + CPU, RAM, MMU, /// Program counter