diff --git a/src/main.zig b/src/main.zig index 79667ae..0a5a83c 100644 --- a/src/main.zig +++ b/src/main.zig @@ -6,6 +6,8 @@ const Bus = @import("Bus.zig"); const Arm7tdmi = @import("cpu.zig").Arm7tdmi; const Scheduler = @import("scheduler.zig").Scheduler; +const buf_pitch = @import("ppu.zig").buf_pitch; + pub fn main() anyerror!void { // Allocator for Emulator + CLI Aruments var gpa = std.heap.GeneralPurposeAllocator(.{}){}; @@ -57,14 +59,6 @@ pub fn main() anyerror!void { const texture = SDL.SDL_CreateTexture(renderer, SDL.SDL_PIXELFORMAT_BGR555, SDL.SDL_TEXTUREACCESS_STREAMING, 240, 160) orelse sdlPanic(); defer SDL.SDL_DestroyTexture(texture); - const buf_pitch = 240 * @sizeOf(u16); - const buf_len = buf_pitch * 160; - var white: [buf_len]u8 = [_]u8{ 0xFF, 0x7F } ** (buf_len / 2); - - var white_heap = try alloc.alloc(u8, buf_len); - for (white) |b, i| white_heap[i] = b; - defer alloc.free(white_heap); - emu_loop: while (true) { emu.runFrame(&scheduler, &cpu, &bus); @@ -76,7 +70,8 @@ pub fn main() anyerror!void { else => {}, } - _ = SDL.SDL_UpdateTexture(texture, null, &white_heap, buf_pitch); + const buf_ptr = bus.ppu.frame_buf.ptr; + _ = SDL.SDL_UpdateTexture(texture, null, buf_ptr, buf_pitch); _ = SDL.SDL_RenderCopy(renderer, texture, null, null); SDL.SDL_RenderPresent(renderer); } diff --git a/src/ppu.zig b/src/ppu.zig index f197568..86c22b5 100644 --- a/src/ppu.zig +++ b/src/ppu.zig @@ -4,24 +4,38 @@ const EventKind = @import("scheduler.zig").EventKind; const Scheduler = @import("scheduler.zig").Scheduler; const Allocator = std.mem.Allocator; +const width = 240; +const height = 160; +pub const buf_pitch = width * @sizeOf(u16); +const buf_len = buf_pitch * height; pub const Ppu = struct { vram: Vram, palette: Palette, sched: *Scheduler, + frame_buf: []u8, + alloc: Allocator, pub fn init(alloc: Allocator, sched: *Scheduler) !@This() { // Queue first Hblank sched.push(.{ .kind = .HBlank, .tick = sched.tick + 240 * 4 }); + // Initialize the Frame Buffer to white + const white_buf: [buf_len]u8 = [_]u8{ 0xFF, 0x7F } ** (buf_len / 2); + const frame_buf = try alloc.alloc(u8, buf_len); + std.mem.copy(u8, frame_buf, &white_buf); + return @This(){ .vram = try Vram.init(alloc), .palette = try Palette.init(alloc), .sched = sched, + .frame_buf = frame_buf, + .alloc = alloc, }; } pub fn deinit(self: @This()) void { + self.alloc.free(self.frame_buf); self.vram.deinit(); self.palette.deinit(); }