Added writing binary file to memory
This commit is contained in:
		
							parent
							
								
									7f2742e18a
								
							
						
					
					
						commit
						17b399f98b
					
				
							
								
								
									
										69
									
								
								src/main.rs
								
								
								
								
							
							
						
						
									
										69
									
								
								src/main.rs
								
								
								
								
							| 
						 | 
				
			
			@ -1,6 +1,13 @@
 | 
			
		|||
#![allow(dead_code)]
 | 
			
		||||
use core::panic;
 | 
			
		||||
use std::{collections::HashMap, ptr::addr_of, thread::sleep, time::Duration, u16};
 | 
			
		||||
use std::{
 | 
			
		||||
    collections::HashMap,
 | 
			
		||||
    fs::{self, File},
 | 
			
		||||
    io::Read,
 | 
			
		||||
    path::PathBuf,
 | 
			
		||||
    thread::sleep,
 | 
			
		||||
    time::Duration,
 | 
			
		||||
    u16,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type Byte = u8;
 | 
			
		||||
type Word = u16;
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +34,7 @@ impl MemArea {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
    fn contains(&self, address: Word) -> bool {
 | 
			
		||||
        self.start <= address && self.end >= address
 | 
			
		||||
        self.start <= address && self.end > address
 | 
			
		||||
    }
 | 
			
		||||
    fn swap_page(&mut self, page: usize) -> Result<(), MappingError> {
 | 
			
		||||
        match page > self.pages {
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +60,7 @@ struct Mem {
 | 
			
		|||
enum MemoryError {
 | 
			
		||||
    Unmapped,
 | 
			
		||||
    NoDataAtAddress,
 | 
			
		||||
    Unwritable,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +106,17 @@ impl Mem {
 | 
			
		|||
        }
 | 
			
		||||
        Err(MemoryError::Unmapped)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn from_bin(&mut self, f: File) -> Result<(), MemoryError> {
 | 
			
		||||
        let bytes = f.bytes();
 | 
			
		||||
        for (address, byte) in bytes.enumerate() {
 | 
			
		||||
            match byte {
 | 
			
		||||
                Ok(value) => self.write(address as u16, value)?,
 | 
			
		||||
                Err(_) => return Err(MemoryError::Unwritable),
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
enum ExecutionError {
 | 
			
		||||
| 
						 | 
				
			
			@ -312,6 +331,9 @@ impl Cpu {
 | 
			
		|||
                                    "Cpu tried to read from address {:#06x} but there was no data",
 | 
			
		||||
                                    self.pc
 | 
			
		||||
                                ),
 | 
			
		||||
                                _ => {
 | 
			
		||||
                                    unimplemented!()
 | 
			
		||||
                                }
 | 
			
		||||
                            },
 | 
			
		||||
                            ExecutionError::InterruptsDisabled => panic!("InterruptsDisabled"),
 | 
			
		||||
                            ExecutionError::IncompatibleAddrMode => {
 | 
			
		||||
| 
						 | 
				
			
			@ -3396,44 +3418,31 @@ impl Opcode {
 | 
			
		|||
 | 
			
		||||
fn main() {
 | 
			
		||||
    let ram = MemArea::new(0x0000, 0x3FFF, 2, "ram".into());
 | 
			
		||||
    let rom = MemArea::new(0xE000, 0xFFFF, 4, "rom".into());
 | 
			
		||||
    let control = MemArea::new(0x4000, 0x5FFF, 4, "rom".into());
 | 
			
		||||
    let vram = MemArea::new(0x6000, 0xDFFF, 1, "vram".into());
 | 
			
		||||
    let rom = MemArea::new(0xE000, 0xFFFF, 4, "rom".into());
 | 
			
		||||
    let mut memory = Mem::new(ram);
 | 
			
		||||
    match memory.add_area(rom) {
 | 
			
		||||
        Err(error) => println!("Error adding rom: {:?}", error),
 | 
			
		||||
    match memory.add_area(control) {
 | 
			
		||||
        Err(error) => println!("Error adding vram: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    };
 | 
			
		||||
    match memory.add_area(vram) {
 | 
			
		||||
        Err(error) => println!("Error adding vram: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    };
 | 
			
		||||
    match memory.write(0xFFFC, 0x00) {
 | 
			
		||||
        Err(error) => println!("Error writing to memory at address 0xFFFC: {:?}", error),
 | 
			
		||||
    match memory.add_area(rom) {
 | 
			
		||||
        Err(error) => println!("Error adding rom: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    };
 | 
			
		||||
    match memory.write(0xFFFD, 0x00) {
 | 
			
		||||
        Err(error) => println!("Error writing to memory at address 0xFFFD: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    let binary = match fs::File::open(PathBuf::from(
 | 
			
		||||
        "/Users/kline/projects/winter/georgeemu/src/george.bin",
 | 
			
		||||
    )) {
 | 
			
		||||
        Ok(file) => file,
 | 
			
		||||
        Err(error) => panic!("Couldn't open binary file! {:?}", error),
 | 
			
		||||
    };
 | 
			
		||||
    match memory.write(0x0000, 0xEA) {
 | 
			
		||||
        Err(error) => println!("Error writing to memory at address 0x0000: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    };
 | 
			
		||||
    match memory.write(0x0001, 0xA0) {
 | 
			
		||||
        Err(error) => println!("Error writing to memory at address 0x0000: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    };
 | 
			
		||||
    match memory.write(0x0002, 0xAE) {
 | 
			
		||||
        Err(error) => println!("Error writing to memory at address 0x0000: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    };
 | 
			
		||||
    match memory.write(0x0003, 0xA2) {
 | 
			
		||||
        Err(error) => println!("Error writing to memory at address 0x0000: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    };
 | 
			
		||||
    match memory.write(0x0004, 0xA2) {
 | 
			
		||||
        Err(error) => println!("Error writing to memory at address 0x0000: {:?}", error),
 | 
			
		||||
        Ok(()) => {}
 | 
			
		||||
    match memory.from_bin(binary) {
 | 
			
		||||
        Err(error) => println!("{:?}", error),
 | 
			
		||||
        Ok(_) => {}
 | 
			
		||||
    };
 | 
			
		||||
    let mut cpu = Cpu::new(memory);
 | 
			
		||||
    match cpu.reset() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue