[cpu] Impl CPU logic

This commit is contained in:
2024-02-18 22:03:21 +05:30
parent 04d1d9160d
commit 624e15dd4c
3 changed files with 44 additions and 9 deletions

View File

@@ -1,4 +1,8 @@
use crate::emu::mmu::{MappedMemory, Memory}; 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; use crate::misc::result::EmulatorResult;
#[derive(Debug)] #[derive(Debug)]
@@ -9,24 +13,49 @@ pub enum CpuState{
#[derive(Debug)] #[derive(Debug)]
pub struct Cpu<'a>{ pub struct Cpu<'a>{
mapped_memory:&'a mut MappedMemory<'a>, mapped_memory:&'a MappedMemory<'a>,
program_counter: &'a ProgramCounter
} }
impl <'a> Cpu<'a>{ 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{ Cpu{
mapped_memory mapped_memory,
program_counter
} }
} }
pub fn cycle()->EmulatorResult<()>{ pub fn cycle(&self)->EmulatorResult<()>{
todo!(); 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(()) Ok(())
} }
fn set_pc(&self,value: &[u8;3])->EmulatorResult<()>{ fn set_pc(&self,value: &[u8;3])->EmulatorResult<()>{
todo!() let x = read_big_endian_u24(value);
// for bytete in value { self.program_counter.set_address(x)
// self.mapped_memory.try_set_byte()
// }try_set_byte
} }
} }

View File

@@ -3,6 +3,7 @@ use sdl2::event::Event;
use sdl2::keyboard::Keycode; use sdl2::keyboard::Keycode;
use sdl2::pixels::Color; use sdl2::pixels::Color;
use simple_logger::SimpleLogger; use simple_logger::SimpleLogger;
use crate::emu::cpu::Cpu;
use crate::emu::iomem::MemoryMappedIO; use crate::emu::iomem::MemoryMappedIO;
use crate::emu::ram::RamMemory; use crate::emu::ram::RamMemory;
use crate::emu::mmu::{Memory, MappedMemory}; use crate::emu::mmu::{Memory, MappedMemory};
@@ -22,6 +23,10 @@ fn main() -> EmulatorResult<()> {
let ram = RamMemory::try_new()?; let ram = RamMemory::try_new()?;
let mmu = MappedMemory::new(&mmio,&ram); 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 sdl_context = sdl2::init().unwrap();
// let video_subsystem = sdl_context.video().unwrap(); // let video_subsystem = sdl_context.video().unwrap();

View File

@@ -2,6 +2,7 @@ use std::fmt::Debug;
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub enum DeviceType { pub enum DeviceType {
CPU,
RAM, RAM,
MMU, MMU,
/// Program counter /// Program counter