move gpu types out
This commit is contained in:
parent
3d15a1ef6f
commit
6eb791ebf4
|
@ -1,122 +1,17 @@
|
||||||
use self::tile_window::TileWindow;
|
use self::{
|
||||||
|
tile_window::TileWindow,
|
||||||
|
types::{
|
||||||
|
Colour, DrawMode, ObjSize, Object, ObjectFlags, Palette, TiledataArea, TilemapArea, LCDC,
|
||||||
|
},
|
||||||
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
processor::{as_signed, get_bit, set_bit, set_or_clear_bit, CPU},
|
processor::{get_bit, set_bit, set_or_clear_bit, CPU},
|
||||||
FACTOR, HEIGHT, WIDTH,
|
FACTOR, HEIGHT, WIDTH,
|
||||||
};
|
};
|
||||||
use minifb::{Window, WindowOptions};
|
use minifb::{Window, WindowOptions};
|
||||||
|
|
||||||
mod tile_window;
|
mod tile_window;
|
||||||
|
mod types;
|
||||||
#[derive(PartialEq)]
|
|
||||||
enum DrawMode {
|
|
||||||
HBlank,
|
|
||||||
VBlank,
|
|
||||||
Mode2,
|
|
||||||
Mode3,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
enum TilemapArea {
|
|
||||||
T9800,
|
|
||||||
T9C00,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TilemapArea {
|
|
||||||
fn get_addr(&self, addr: u16) -> u16 {
|
|
||||||
match self {
|
|
||||||
TilemapArea::T9800 => 0x9800 + addr,
|
|
||||||
TilemapArea::T9C00 => 0x9C00 + addr,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
enum TiledataArea {
|
|
||||||
D8000,
|
|
||||||
D9000,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TiledataArea {
|
|
||||||
fn get_addr(&self, addr: u8) -> u16 {
|
|
||||||
match self {
|
|
||||||
TiledataArea::D8000 => 0x8000 + ((addr as u16) * 16),
|
|
||||||
TiledataArea::D9000 => 0x9000_u16.wrapping_add_signed((as_signed(addr) as i16) * 16),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
|
||||||
enum ObjSize {
|
|
||||||
S8x8,
|
|
||||||
S8x16,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ObjSize {
|
|
||||||
fn get_height(&self) -> u8 {
|
|
||||||
match self {
|
|
||||||
ObjSize::S8x8 => 8,
|
|
||||||
ObjSize::S8x16 => 16,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
struct LCDC {
|
|
||||||
enable: bool,
|
|
||||||
window_tilemap: TilemapArea,
|
|
||||||
window_enable: bool,
|
|
||||||
tile_area: TiledataArea,
|
|
||||||
bg_tilemap: TilemapArea,
|
|
||||||
obj_size: ObjSize,
|
|
||||||
obj_enable: bool,
|
|
||||||
bg_window_enable: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
|
||||||
enum Colour {
|
|
||||||
White,
|
|
||||||
LightGray,
|
|
||||||
DarkGray,
|
|
||||||
Black,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Colour {
|
|
||||||
fn to_rgb(&self) -> u32 {
|
|
||||||
match self {
|
|
||||||
Colour::White => Self::from_u8_rgb(0xFF, 0xFF, 0xFF),
|
|
||||||
Colour::LightGray => Self::from_u8_rgb(0xAA, 0xAA, 0xAA),
|
|
||||||
Colour::DarkGray => Self::from_u8_rgb(0x55, 0x55, 0x55),
|
|
||||||
Colour::Black => Self::from_u8_rgb(0x00, 0x00, 0x00),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn from_u8_rgb(r: u8, g: u8, b: u8) -> u32 {
|
|
||||||
let (r, g, b) = (r as u32, g as u32, b as u32);
|
|
||||||
(r << 16) | (g << 8) | b
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
struct Palette {
|
|
||||||
zero: Colour,
|
|
||||||
one: Colour,
|
|
||||||
two: Colour,
|
|
||||||
three: Colour,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ObjectFlags {
|
|
||||||
behind_bg_and_window: bool,
|
|
||||||
y_flip: bool,
|
|
||||||
x_flip: bool,
|
|
||||||
palette: Palette,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Object {
|
|
||||||
x: u8,
|
|
||||||
y: u8,
|
|
||||||
tile_index: u8,
|
|
||||||
flags: ObjectFlags,
|
|
||||||
}
|
|
||||||
|
|
||||||
const TILE_WINDOW_WIDTH: usize = 16 * 8;
|
const TILE_WINDOW_WIDTH: usize = 16 * 8;
|
||||||
const TILE_WINDOW_HEIGHT: usize = 24 * 8;
|
const TILE_WINDOW_HEIGHT: usize = 24 * 8;
|
||||||
|
|
112
src/processor/gpu/types.rs
Normal file
112
src/processor/gpu/types.rs
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
use crate::processor::as_signed;
|
||||||
|
|
||||||
|
#[derive(PartialEq)]
|
||||||
|
pub(super) enum DrawMode {
|
||||||
|
HBlank,
|
||||||
|
VBlank,
|
||||||
|
Mode2,
|
||||||
|
Mode3,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub(super) enum TilemapArea {
|
||||||
|
T9800,
|
||||||
|
T9C00,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TilemapArea {
|
||||||
|
pub(super) fn get_addr(&self, addr: u16) -> u16 {
|
||||||
|
match self {
|
||||||
|
TilemapArea::T9800 => 0x9800 + addr,
|
||||||
|
TilemapArea::T9C00 => 0x9C00 + addr,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub(super) enum TiledataArea {
|
||||||
|
D8000,
|
||||||
|
D9000,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TiledataArea {
|
||||||
|
pub(super) fn get_addr(&self, addr: u8) -> u16 {
|
||||||
|
match self {
|
||||||
|
TiledataArea::D8000 => 0x8000 + ((addr as u16) * 16),
|
||||||
|
TiledataArea::D9000 => 0x9000_u16.wrapping_add_signed((as_signed(addr) as i16) * 16),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub(super) enum ObjSize {
|
||||||
|
S8x8,
|
||||||
|
S8x16,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ObjSize {
|
||||||
|
pub(super) fn get_height(&self) -> u8 {
|
||||||
|
match self {
|
||||||
|
ObjSize::S8x8 => 8,
|
||||||
|
ObjSize::S8x16 => 16,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub(super) struct LCDC {
|
||||||
|
pub(super) enable: bool,
|
||||||
|
pub(super) window_tilemap: TilemapArea,
|
||||||
|
pub(super) window_enable: bool,
|
||||||
|
pub(super) tile_area: TiledataArea,
|
||||||
|
pub(super) bg_tilemap: TilemapArea,
|
||||||
|
pub(super) obj_size: ObjSize,
|
||||||
|
pub(super) obj_enable: bool,
|
||||||
|
pub(super) bg_window_enable: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub(super) enum Colour {
|
||||||
|
White,
|
||||||
|
LightGray,
|
||||||
|
DarkGray,
|
||||||
|
Black,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Colour {
|
||||||
|
pub(super) fn to_rgb(&self) -> u32 {
|
||||||
|
match self {
|
||||||
|
Colour::White => Self::from_u8_rgb(0xFF, 0xFF, 0xFF),
|
||||||
|
Colour::LightGray => Self::from_u8_rgb(0xAA, 0xAA, 0xAA),
|
||||||
|
Colour::DarkGray => Self::from_u8_rgb(0x55, 0x55, 0x55),
|
||||||
|
Colour::Black => Self::from_u8_rgb(0x00, 0x00, 0x00),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn from_u8_rgb(r: u8, g: u8, b: u8) -> u32 {
|
||||||
|
let (r, g, b) = (r as u32, g as u32, b as u32);
|
||||||
|
(r << 16) | (g << 8) | b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
|
pub(super) struct Palette {
|
||||||
|
pub(super) zero: Colour,
|
||||||
|
pub(super) one: Colour,
|
||||||
|
pub(super) two: Colour,
|
||||||
|
pub(super) three: Colour,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) struct ObjectFlags {
|
||||||
|
pub(super) behind_bg_and_window: bool,
|
||||||
|
pub(super) y_flip: bool,
|
||||||
|
pub(super) x_flip: bool,
|
||||||
|
pub(super) palette: Palette,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) struct Object {
|
||||||
|
pub(super) x: u8,
|
||||||
|
pub(super) y: u8,
|
||||||
|
pub(super) tile_index: u8,
|
||||||
|
pub(super) flags: ObjectFlags,
|
||||||
|
}
|
Loading…
Reference in a new issue