pattern table
This commit is contained in:
@@ -171,6 +171,53 @@ impl PPU {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get the correct color for the pixel from the given palette
|
||||
fn get_color(&self, pixel: Byte, _palette: Byte) -> Pixel {
|
||||
// TODO: not implemented yet. returns some black and white color
|
||||
match pixel {
|
||||
0 => PALETTE[&0x30],
|
||||
1 => PALETTE[&0x3d],
|
||||
2 => PALETTE[&0x2d],
|
||||
_ => PALETTE[&0x3f]
|
||||
}
|
||||
}
|
||||
|
||||
// Get one of the two pattern tables of the PPU
|
||||
// This also initializes/updates the pattern table
|
||||
fn get_pattern_table<T: PPUMemory>(&mut self, index: usize, _palette: Byte, mem: &T) -> &Sprite {
|
||||
// 16 x 16 tiles of 8x8px sprites per pattern table => 128x128px
|
||||
for x in 0..16 { // tile row
|
||||
for y in 0..16 { // tile column
|
||||
// byte offset in pattern mem. Each row is 256 bytes
|
||||
// and each pixel is 16 bytes
|
||||
let tile_offset_b = y*256 + x*16;
|
||||
|
||||
// iterate over individual pixels of one tile
|
||||
for row in 0..8 {
|
||||
let tile_addr = index as Addr * 0x1000 + tile_offset_b + row;
|
||||
|
||||
// NES memory organization: The pattern table defines the
|
||||
// two least significant bits of the color (value between
|
||||
// 0-3). Two bitplanes in memory each having one byte per
|
||||
// row
|
||||
let mut tile_lsb = mem.readb_ppu(tile_addr);
|
||||
let mut tile_msb = mem.readb_ppu(tile_addr + 8);
|
||||
for col in 0..8 {
|
||||
let pixel = (tile_lsb & 0x01) + (tile_msb & 0x01);
|
||||
self.pattern_table[index].put_pixel(
|
||||
(x * 8 + (7-col)) as u32, // x starts on the right, sprit is from left
|
||||
(y * 8 + row) as u32,
|
||||
self.get_color(123, pixel));
|
||||
tile_lsb >>= 1;
|
||||
tile_msb >>= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&self.pattern_table[index]
|
||||
}
|
||||
}
|
||||
|
||||
impl Memory for PPU {
|
||||
|
||||
Reference in New Issue
Block a user