gpu improvements
This commit is contained in:
parent
4a48bf6a68
commit
1d041e2d57
|
@ -15,16 +15,25 @@ enum TilemapArea {
|
||||||
T9C00,
|
T9C00,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl TilemapArea {
|
||||||
|
fn get_offset(&self) -> u16 {
|
||||||
|
match self {
|
||||||
|
TilemapArea::T9800 => 0x9800,
|
||||||
|
TilemapArea::T9C00 => 0x9C00,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
enum TiledataArea {
|
enum TiledataArea {
|
||||||
D8000,
|
D8000,
|
||||||
D8800,
|
D9000,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TiledataArea {
|
impl TiledataArea {
|
||||||
fn get_addr(&self, addr: u8) -> u16 {
|
fn get_addr(&self, addr: u8) -> u16 {
|
||||||
match self {
|
match self {
|
||||||
TiledataArea::D8000 => 0x8000 + (addr as u16),
|
TiledataArea::D8000 => 0x8000 + (addr as u16),
|
||||||
TiledataArea::D8800 => 0x8800_u16.wrapping_add_signed(as_signed(addr) as i16),
|
TiledataArea::D9000 => 0x9000_u16.wrapping_add_signed(as_signed(addr) as i16),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,7 +54,7 @@ struct LCDC {
|
||||||
bg_window_enable: bool,
|
bg_window_enable: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
enum Colour {
|
enum Colour {
|
||||||
White,
|
White,
|
||||||
LightGray,
|
LightGray,
|
||||||
|
@ -159,7 +168,7 @@ impl CPU {
|
||||||
tile_area: if get_bit(reg, 4) {
|
tile_area: if get_bit(reg, 4) {
|
||||||
TiledataArea::D8000
|
TiledataArea::D8000
|
||||||
} else {
|
} else {
|
||||||
TiledataArea::D8800
|
TiledataArea::D9000
|
||||||
},
|
},
|
||||||
bg_tilemap: if get_bit(reg, 3) {
|
bg_tilemap: if get_bit(reg, 3) {
|
||||||
TilemapArea::T9C00
|
TilemapArea::T9C00
|
||||||
|
@ -261,15 +270,15 @@ impl CPU {
|
||||||
offset_y: u8,
|
offset_y: u8,
|
||||||
) {
|
) {
|
||||||
let tile_line = (scanline as usize) + (offset_y as usize);
|
let tile_line = (scanline as usize) + (offset_y as usize);
|
||||||
let tile_row = tile_line / 8;
|
let tilemap_row = tile_line / 8;
|
||||||
let tile_px = ((tile_line as u16) % 8) * 2;
|
let tile_px = (tile_line) % 8;
|
||||||
let row_addr = (tile_row * 32) as u16 + get_tilemap_offset(tilemap);
|
let tiledata_offset = tile_px * 2;
|
||||||
|
let row_addr = (tilemap_row * 32) as u16 + tilemap.get_offset();
|
||||||
for x in 0..32 {
|
for x in 0..32 {
|
||||||
let tile_addr = self.memory.get(row_addr + x) + tile_px as u8;
|
let tile_addr =
|
||||||
let lsbs = self.memory.get(tiledata.get_addr(tile_addr));
|
tiledata.get_addr(self.memory.get(row_addr + x)) + tiledata_offset as u16;
|
||||||
let msbs = self.memory.get(tiledata.get_addr(tile_addr + 1));
|
let lsbs = self.memory.get(tile_addr);
|
||||||
// let lsbs = self.memory.get(row_addr + tile_px + (x * 2));
|
let msbs = self.memory.get(tile_addr + 1);
|
||||||
// let msbs = self.memory.get(row_addr + tile_px + (x * 2) + 1);
|
|
||||||
for px_x in 0..8 {
|
for px_x in 0..8 {
|
||||||
let lsb = get_bit(lsbs, px_x);
|
let lsb = get_bit(lsbs, px_x);
|
||||||
let msb = get_bit(msbs, px_x);
|
let msb = get_bit(msbs, px_x);
|
||||||
|
@ -304,13 +313,6 @@ fn scale_buffer(buffer: &Vec<u32>, width: usize, height: usize, factor: usize) -
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_tilemap_offset(tilemap: &TilemapArea) -> u16 {
|
|
||||||
match tilemap {
|
|
||||||
TilemapArea::T9800 => 0x9800,
|
|
||||||
TilemapArea::T9C00 => 0x9C00,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bits_to_mapped_colour(lsb: bool, msb: bool, palette: Palette) -> Colour {
|
fn bits_to_mapped_colour(lsb: bool, msb: bool, palette: Palette) -> Colour {
|
||||||
match (lsb, msb) {
|
match (lsb, msb) {
|
||||||
(true, true) => palette.three,
|
(true, true) => palette.three,
|
||||||
|
|
Loading…
Reference in a new issue