Skip to content

Commit

Permalink
Added GPU "skeleton"
Browse files Browse the repository at this point in the history
  • Loading branch information
velllu committed Sep 10, 2023
1 parent 9863c19 commit 25c4bd8
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 17 deletions.
27 changes: 11 additions & 16 deletions src/cpu.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::common::{merge_two_u8s_into_u16, Operator, split_u16_into_two_u8s};
use crate::common::{merge_two_u8s_into_u16, split_u16_into_two_u8s, Operator};
use crate::consts::bus::IO_START;
use crate::registers::OneByteRegister;
use crate::GameBoy;
Expand Down Expand Up @@ -28,12 +28,7 @@ type Cycles = u8;

// INC/DEC function
impl GameBoy {
fn increment_r(
&mut self,
register: OneByteRegister,
operator: Operator,
amount: u8,
) {
fn increment_r(&mut self, register: OneByteRegister, operator: Operator, amount: u8) {
let register = self.registers.get_r(register);

*register = match operator {
Expand All @@ -48,11 +43,7 @@ impl GameBoy {

// LD functions
impl GameBoy {
fn load_r_into_r(
&mut self,
register_to_be_loaded: OneByteRegister,
register: OneByteRegister,
) {
fn load_r_into_r(&mut self, register_to_be_loaded: OneByteRegister, register: OneByteRegister) {
let register_to_be_loaded = *self.registers.get_r(register_to_be_loaded);
let register = self.registers.get_r(register);

Expand All @@ -68,7 +59,8 @@ impl GameBoy {

fn load_r_into_io(&mut self, register: OneByteRegister) {
let register = *self.registers.get_r(register);
self.bus.write_byte((IO_START + self.next(1) as usize) as u16, register);
self.bus
.write_byte((IO_START + self.next(1) as usize) as u16, register);
}

fn load_io_into_r(&mut self, register: OneByteRegister) {
Expand All @@ -82,17 +74,20 @@ impl GameBoy {
// CP functions
impl GameBoy {
fn compare_ra_to_i(&mut self) {
self.flags.update_zero_flag(self.registers.a.wrapping_sub(self.next(1)));
self.flags
.update_zero_flag(self.registers.a.wrapping_sub(self.next(1)));
}

fn compare_ra_to_r(&mut self, register: OneByteRegister) {
let register = *self.registers.get_r(register);
self.flags.update_zero_flag(self.registers.a.wrapping_sub(register));
self.flags
.update_zero_flag(self.registers.a.wrapping_sub(register));
}

fn compare_ra_to_ram(&mut self, address: u16) {
let ram = self.bus.read(address);
self.flags.update_zero_flag(self.registers.a.wrapping_sub(ram));
self.flags
.update_zero_flag(self.registers.a.wrapping_sub(ram));
}
}

Expand Down
86 changes: 86 additions & 0 deletions src/gpu.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
#![allow(unused)]

use std::marker::Copy;

use crate::GameBoy;

#[derive(PartialEq)]
enum GPUState {
OAMSearch,
PixelTransfer,
HBlank,
VBlank,
}

#[derive(Clone, Copy)]
enum Source {
Background,
Window,
}

#[derive(Clone, Copy)]
enum Color {
One,
Two,
Three,
Four,
}

#[derive(Clone, Copy)]
struct PixelData {
source: Source,
color: Color,
}

pub struct GPU {
state: GPUState,

/// The buffer of the pixels to push
fifo: [Option<PixelData>; 8],
}

impl GPU {
pub(crate) fn new() -> Self {
Self {
state: GPUState::OAMSearch,
fifo: [None; 8],
}
}
}

// TODO: During pixel transfer mode, the vram should not be accessible
// TODO: During pixel transfer mode and oam search mode, the oam should not be accessible

impl GameBoy {
/// We need to search in the Object Attribute Memory the sprites that are actually
/// visible in the current line
fn oam_search(&mut self) {
// TODO
self.gpu.state = GPUState::PixelTransfer;
}

fn pixel_transfer(&mut self) {
// TODO
self.gpu.state = GPUState::HBlank;
}

fn hblank(&mut self) {
// TODO
self.gpu.state = GPUState::VBlank;
}

fn vblank(&mut self) {
// TODO
self.gpu.state = GPUState::OAMSearch;
}

#[rustfmt::skip]
pub(crate) fn gpu_step(&mut self) {
match self.gpu.state {
GPUState::OAMSearch => self.oam_search(),
GPUState::PixelTransfer => self.pixel_transfer(),
GPUState::HBlank => self.hblank(),
GPUState::VBlank => self.vblank(),
}
}
}
10 changes: 9 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use common::merge_two_u8s_into_u16;
use consts::bus::ROM_SIZE;
use errors::EmuError;
use flags::Flags;
use gpu::GPU;
use registers::Registers;
use screen::Screen;

Expand All @@ -14,6 +15,7 @@ mod consts;
mod cpu;
mod errors;
mod flags;
mod gpu;
mod interrupts;
mod registers;
mod screen;
Expand All @@ -26,6 +28,7 @@ pub struct GameBoy {
pub screen: Screen,
pub registers: Registers,
pub flags: Flags,
pub gpu: GPU,

/// Some gameboy opcodes have a prefix `0xCB`
pub is_cb: bool,
Expand All @@ -41,6 +44,7 @@ impl GameBoy {
screen: Screen::new(),
registers: Registers::new(),
flags: Flags::new(),
gpu: GPU::new(),
is_cb: false,
current_opcode: None,
})
Expand All @@ -52,6 +56,7 @@ impl GameBoy {
screen: Screen::new(),
registers: Registers::new(),
flags: Flags::new(),
gpu: GPU::new(),
is_cb: false,
current_opcode: None,
}
Expand All @@ -78,7 +83,10 @@ impl GameBoy {
self.is_cb = false;

// CPU - Interrupts
self.execute_interrupts()
self.execute_interrupts();

// GPU
self.gpu_step();
}
}

Expand Down

0 comments on commit 25c4bd8

Please sign in to comment.