scaling & lcd enable back
This commit is contained in:
parent
75c765b392
commit
587916ed34
14
src/main.rs
14
src/main.rs
|
@ -249,6 +249,7 @@ static VERBOSE: RwLock<bool> = RwLock::new(false);
|
||||||
|
|
||||||
const WIDTH: usize = 160;
|
const WIDTH: usize = 160;
|
||||||
const HEIGHT: usize = 144;
|
const HEIGHT: usize = 144;
|
||||||
|
const FACTOR: usize = 3;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
@ -259,10 +260,15 @@ fn main() {
|
||||||
|
|
||||||
// let buffer: Vec<u32> = ;
|
// let buffer: Vec<u32> = ;
|
||||||
|
|
||||||
let window =
|
let window = Window::new(
|
||||||
Window::new("Gameboy", WIDTH, HEIGHT, WindowOptions::default()).unwrap_or_else(|e| {
|
"Gameboy",
|
||||||
panic!("{}", e);
|
WIDTH * FACTOR,
|
||||||
});
|
HEIGHT * FACTOR,
|
||||||
|
WindowOptions::default(),
|
||||||
|
)
|
||||||
|
.unwrap_or_else(|e| {
|
||||||
|
panic!("{}", e);
|
||||||
|
});
|
||||||
|
|
||||||
window.topmost(true);
|
window.topmost(true);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{HEIGHT, WIDTH};
|
use crate::{FACTOR, HEIGHT, WIDTH};
|
||||||
|
|
||||||
use super::{clear_bit, get_bit, set_bit, set_or_clear_bit, CPU};
|
use super::{clear_bit, get_bit, set_bit, set_or_clear_bit, CPU};
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@ struct Palette {
|
||||||
|
|
||||||
pub struct GPU {
|
pub struct GPU {
|
||||||
pub buffer: Vec<u32>,
|
pub buffer: Vec<u32>,
|
||||||
|
scaled_buffer: Vec<u32>,
|
||||||
mode: DrawMode,
|
mode: DrawMode,
|
||||||
mode_clock: usize,
|
mode_clock: usize,
|
||||||
scanline: u8,
|
scanline: u8,
|
||||||
|
@ -79,6 +80,7 @@ impl Default for GPU {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
buffer: vec![0; WIDTH * HEIGHT],
|
buffer: vec![0; WIDTH * HEIGHT],
|
||||||
|
scaled_buffer: vec![0; WIDTH * HEIGHT * 4],
|
||||||
mode: DrawMode::Mode2,
|
mode: DrawMode::Mode2,
|
||||||
mode_clock: 0,
|
mode_clock: 0,
|
||||||
scanline: 0,
|
scanline: 0,
|
||||||
|
@ -172,10 +174,10 @@ impl CPU {
|
||||||
|
|
||||||
fn enter_vblank(&mut self, lcdc: &LCDC) {
|
fn enter_vblank(&mut self, lcdc: &LCDC) {
|
||||||
self.gpu.mode = DrawMode::VBlank;
|
self.gpu.mode = DrawMode::VBlank;
|
||||||
// if lcdc.enable {
|
if lcdc.enable {
|
||||||
self.render_window();
|
self.render_window();
|
||||||
self.memory.set(0xFF0F, set_bit(self.memory.get(0xFF0F), 0));
|
self.memory.set(0xFF0F, set_bit(self.memory.get(0xFF0F), 0));
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exit_vblank(&mut self) {
|
fn exit_vblank(&mut self) {
|
||||||
|
@ -252,12 +254,27 @@ impl CPU {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_window(&mut self) {
|
fn render_window(&mut self) {
|
||||||
|
self.gpu.scaled_buffer = scale_buffer(&self.gpu.buffer, WIDTH, HEIGHT, FACTOR);
|
||||||
self.window
|
self.window
|
||||||
.update_with_buffer(&self.gpu.buffer, WIDTH, HEIGHT)
|
.update_with_buffer(&self.gpu.scaled_buffer, WIDTH * FACTOR, HEIGHT * FACTOR)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn scale_buffer(buffer: &Vec<u32>, width: usize, height: usize, factor: usize) -> Vec<u32> {
|
||||||
|
let mut v = vec![];
|
||||||
|
for y in 0..height {
|
||||||
|
for _ in 0..factor {
|
||||||
|
for x in 0..width {
|
||||||
|
for _ in 0..factor {
|
||||||
|
v.push(buffer[(y * width) + x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
v
|
||||||
|
}
|
||||||
|
|
||||||
fn get_tilemap_offset(tilemap: &TilemapArea) -> u16 {
|
fn get_tilemap_offset(tilemap: &TilemapArea) -> u16 {
|
||||||
match tilemap {
|
match tilemap {
|
||||||
TilemapArea::T9800 => 0x9800,
|
TilemapArea::T9800 => 0x9800,
|
||||||
|
|
Loading…
Reference in a new issue