PPU reset and registers
This commit is contained in:
@@ -55,6 +55,7 @@ impl NES {
|
|||||||
pub fn reset(&mut self) {
|
pub fn reset(&mut self) {
|
||||||
self.clock_count = 0;
|
self.clock_count = 0;
|
||||||
self.cpu.reset(&self.memory);
|
self.cpu.reset(&self.memory);
|
||||||
|
self.ppu.borrow_mut().reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
// A single clock on the NES
|
// A single clock on the NES
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
|
use crate::nes::memory::PPUMemory;
|
||||||
use phf::{Map,phf_map};
|
use phf::{Map,phf_map};
|
||||||
use crate::nes::types::*;
|
use crate::nes::types::*;
|
||||||
use crate::nes::memory::Memory;
|
use crate::nes::memory::Memory;
|
||||||
use image::{ImageBuffer, Rgba};
|
use image::{ImageBuffer, Rgba};
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
static PALETTE: Map<u8, Rgba<u8>> = phf_map! {
|
type Pixel = Rgba<u8>;
|
||||||
|
type Sprite = ImageBuffer<Pixel, Vec<u8>>;
|
||||||
|
|
||||||
|
static PALETTE: Map<u8, Pixel> = phf_map! {
|
||||||
// 0x00
|
// 0x00
|
||||||
0x00u8 => Rgba([84, 84, 84, 255]),
|
0x00u8 => Rgba([84, 84, 84, 255]),
|
||||||
0x01u8 => Rgba([0, 30, 116, 255]),
|
0x01u8 => Rgba([0, 30, 116, 255]),
|
||||||
@@ -75,10 +79,49 @@ static PALETTE: Map<u8, Rgba<u8>> = phf_map! {
|
|||||||
0x3fu8 => Rgba([0, 0, 0, 255]),
|
0x3fu8 => Rgba([0, 0, 0, 255]),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Registers {
|
||||||
|
// 0x2000
|
||||||
|
ctrl: Word,
|
||||||
|
// 0x2001
|
||||||
|
mask: Word,
|
||||||
|
// 0x2002
|
||||||
|
status: Word,
|
||||||
|
// 0x2003
|
||||||
|
oam_addr: Word,
|
||||||
|
// 0x2004
|
||||||
|
oam_data: Word,
|
||||||
|
// 0x2005
|
||||||
|
scroll: Word,
|
||||||
|
// 0x2006
|
||||||
|
addr: Word,
|
||||||
|
// 0x2007
|
||||||
|
data: Word,
|
||||||
|
// 0x2008
|
||||||
|
dma: Word, // 0x4014
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Registers {
|
||||||
|
fn new() -> Registers {
|
||||||
|
Registers {
|
||||||
|
ctrl: 0x00,
|
||||||
|
mask: 0x00,
|
||||||
|
status: 0x00,
|
||||||
|
oam_addr: 0x00,
|
||||||
|
oam_data: 0x00,
|
||||||
|
scroll: 0x00,
|
||||||
|
addr: 0x00,
|
||||||
|
data: 0x00,
|
||||||
|
dma: 0x00,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct PPU {
|
pub struct PPU {
|
||||||
|
registers: Registers,
|
||||||
pub cycle: u16,
|
pub cycle: u16,
|
||||||
pub scanline: u16,
|
pub scanline: u16,
|
||||||
pub canvas_main: ImageBuffer<Rgba<u8>, Vec<u8>>,
|
pub canvas_main: Sprite,
|
||||||
|
pattern_table: [Sprite; 2],
|
||||||
pub frame_ready: bool
|
pub frame_ready: bool
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -86,13 +129,19 @@ pub struct PPU {
|
|||||||
impl PPU {
|
impl PPU {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
PPU {
|
PPU {
|
||||||
|
registers: Registers::new(),
|
||||||
cycle: 0,
|
cycle: 0,
|
||||||
scanline: 0,
|
scanline: 0,
|
||||||
canvas_main: ImageBuffer::new(256, 240),
|
canvas_main: ImageBuffer::new(256, 240),
|
||||||
|
pattern_table: [ImageBuffer::new(128, 128), ImageBuffer::new(128, 128)],
|
||||||
frame_ready: false,
|
frame_ready: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn reset(&mut self) {
|
||||||
|
self.registers = Registers::new();
|
||||||
|
}
|
||||||
|
|
||||||
pub fn clock<T: Memory>(&mut self, _mem: &mut T) {
|
pub fn clock<T: Memory>(&mut self, _mem: &mut T) {
|
||||||
if (self.cycle < self.canvas_main.width() as u16) &&
|
if (self.cycle < self.canvas_main.width() as u16) &&
|
||||||
(self.scanline < self.canvas_main.height() as u16) {
|
(self.scanline < self.canvas_main.height() as u16) {
|
||||||
|
|||||||
Reference in New Issue
Block a user