[cpu] Impl CPU logic
This commit is contained in:
@@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user