const std = @import("std"); const sys = @import("system.zig"); const sdl = @import("SDL3"); const palette = [_]u32{ 0x000000ff, // black 0xffffffff, // white 0xff0000ff, // red // ... }; pub fn main() !void { var system: sys.System = .{}; _ = sdl.SDL_SetAppMetadata("ZigCon", "0.0.1", "com.cityboundforest.zigcon"); if (!sdl.SDL_Init(sdl.SDL_INIT_VIDEO)) { std.debug.print("SDL Init Errror: {s}\n", .{sdl.SDL_GetError()}); return error.SDLInitializationFailed; } defer sdl.SDL_Quit(); var window: *sdl.SDL_Window = undefined; var renderer: *sdl.SDL_Renderer = undefined; if (!sdl.SDL_CreateWindowAndRenderer("ZigCon", 600, 600, 0, @ptrCast(&window), @ptrCast(&renderer))) { std.debug.print("SDL Window Error: {s}\n", .{sdl.SDL_GetError()}); return error.WindowCreationError; } defer sdl.SDL_DestroyWindow(@ptrCast(window)); _ = sdl.SDL_SetRenderLogicalPresentation(@ptrCast(renderer), 600, 600, sdl.SDL_LOGICAL_PRESENTATION_LETTERBOX); var run = true; const texture = sdl.SDL_CreateTexture(@ptrCast(renderer), sdl.SDL_PIXELFORMAT_RGBA32, sdl.SDL_TEXTUREACCESS_STREAMING, sys.System.WIDTH, sys.System.HEIGHT); defer sdl.SDL_DestroyTexture(@ptrCast(texture)); const format_details = sdl.SDL_GetPixelFormatDetails(sdl.SDL_PIXELFORMAT_RGBA32); var r: u8 = undefined; var g: u8 = undefined; var b: u8 = undefined; var a: u8 = undefined; while (run) { var event: sdl.SDL_Event = undefined; var surface: *sdl.SDL_Surface = undefined; while (sdl.SDL_PollEvent(@ptrCast(&event))) { if (event.type == sdl.SDL_EVENT_QUIT) { run = false; } } try system.step(); if (sdl.SDL_LockTextureToSurface(@ptrCast(texture), null, @ptrCast(&surface))) { for (0..sys.System.HEIGHT) |y| { for (0..sys.System.WIDTH) |x| { const idx = system.ram[sys.System.VRAM_START + y * sys.System.HEIGHT + x]; const color = palette[idx]; sdl.SDL_GetRGBA(color, @ptrCast(format_details), null, @ptrCast(&r), @ptrCast(&g), @ptrCast(&b), @ptrCast(&a)); _ = sdl.SDL_WriteSurfacePixel(@ptrCast(surface), @intCast(x), @intCast(y), r, g, b, a); } } sdl.SDL_UnlockTexture(@ptrCast(texture)); } const dst_rect: sdl.SDL_FRect = .{ .x = 0.0, .y = 0.0, .w = 600.0, .h = 600.0, }; _ = sdl.SDL_SetRenderDrawColorFloat(@ptrCast(renderer), 0.0, 0.0, 0.0, sdl.SDL_ALPHA_OPAQUE_FLOAT); _ = sdl.SDL_RenderClear(@ptrCast(renderer)); _ = sdl.SDL_RenderTexture(@ptrCast(renderer), @ptrCast(texture), null, @ptrCast(&dst_rect)); _ = sdl.SDL_RenderPresent(@ptrCast(renderer)); } }