aboutsummaryrefslogblamecommitdiff
path: root/src/memory.rs
blob: f8b6632efc01204c8160c7aa3f8893ee39bb405b (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                    
             

                                       
                           
                                   
                        
 

                                    
                                         

 
                          
                                 

                            


                                 


                        
                                 


                                                      
                                                   
                                             
                                      
                                     
     
 
                                           
                          
     



                                     








                                                                
             

                                 

                                                                             

                      



                                  

         
 
                                          





                                                                        






                                                                      






                                                                             
             


                                                      



                                                                





                                         



                          

                                       
                        
                     

 
                        
                                

                                             

                                                   

                   
     

                        








                                                                      

         

 







                                  
                 
                                                        

                               
                                                                       

 

                                         




                                      
                        
                     
                                                   




                                                                                        
                                                          



                                                                
                                                        




                                                                                               
                                                               



                                                                        
                                                








                                                 
                                 

                                         
                          
                                  
                                 
                                                        
                                 
                                                     
                
                                                               

         
 

                                              
                          
                                          
                                 
                                                                
                                 
                                                             
                
                                                                

         
 
 
#![allow(dead_code)]
use ppu::PPU;
use mos6502::CPU;
use cartridge::{MirrorType, Cartridge};
use controller::Controller;
use core::cell::{UnsafeCell, Cell};
use core::ptr::null_mut;

pub trait VMem {
    fn read(&self, addr: u16) -> u8;
    fn write(&self, addr: u16, data: u8);
}

pub struct CPUMemory<'a> {
    sram: UnsafeCell<[u8; 2048]>,
    ppu: Cell<*mut PPU<'a>>,
    cpu: Cell<*mut CPU<'a>>,
    mapper: &'a VMem,
    ctl1: Option<&'a Controller>,
    ctl2: Option<&'a Controller>
}

impl<'a> CPUMemory<'a> {
    pub fn new(ppu: &mut PPU<'a>,
               mapper: &'a VMem,
               ctl1: Option<&'a Controller>,
               ctl2: Option<&'a Controller>) -> Self {
        CPUMemory{sram: UnsafeCell::new([0; 2048]),
                  cpu: Cell::new(null_mut()),
                  ppu: Cell::new(ppu),
                  mapper, ctl1, ctl2}
    }

    pub fn init(&self, cpu: *mut CPU<'a>) {
        self.cpu.set(cpu);
    }
}

impl<'a> VMem for CPUMemory<'a> {
    fn read(&self, addr: u16) -> u8 {
        if addr < 0x2000 {
            </