scratch/2021-03-16/zig8/src/main.zig

77 lines
2.3 KiB
Zig

const std = @import("std");
const emu = @import("emu.zig");
const Display = @import("display.zig").Display;
const c = @cImport(@cInclude("SDL.h"));
const Cpu = emu.Cpu;
const WIDTH = 64;
const HEIGHT = 32;
const WINDOW_WIDTH = WIDTH * 10;
const WINDOW_HEIGHT = HEIGHT * 10;
const PIXELBUF_LEN = WIDTH * HEIGHT * @sizeOf(u32);
pub fn main() !void {
_ = c.SDL_Init(c.SDL_INIT_VIDEO);
defer c.SDL_Quit();
const window = c.SDL_CreateWindow("CHIP-8", c.SDL_WINDOWPOS_CENTERED, c.SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, c.SDL_WINDOW_OPENGL);
defer c.SDL_DestroyWindow(window);
const renderer = c.SDL_CreateRenderer(window, -1, c.SDL_RENDERER_ACCELERATED);
defer c.SDL_DestroyRenderer(renderer);
const texture = c.SDL_CreateTexture(renderer, c.SDL_PIXELFORMAT_RGBA8888, c.SDL_TEXTUREACCESS_STATIC, WIDTH, HEIGHT);
defer c.SDL_DestroyTexture(texture);
var zig8 = emu.Cpu {
.i = 0x00,
.pc = 0x200,
.sp = 0x00,
.v = [_]u8{0x00} ** 16,
.stack = [_]u16{0x00} ** 16,
.memory = [_]u8{0x0000} ** 0x1000,
.disp = Display.new(),
};
try emu.load_rom_path(&zig8, "./bin/IBM Logo.ch8");
var pixel_buf: [PIXELBUF_LEN]u8 = [_]u8 {0x00} ** PIXELBUF_LEN;
emuloop: while(true) {
_ = c.SDL_UpdateTexture(texture, null, @ptrCast(*const c_void, &pixel_buf), WIDTH * @sizeOf(u32));
_ = c.SDL_RenderCopy(renderer, texture, null, null);
_ = c.SDL_RenderPresent(renderer);
var event: c.SDL_Event = undefined;
while(c.SDL_PollEvent(&event) != 0) {
switch(event.type) {
c.SDL_QUIT => break :emuloop,
else => {}
}
}
emu.step(&zig8);
draw(&zig8.disp, &pixel_buf);
}
}
fn draw(display: *const Display, pixel_buf: *[8192]u8) void {
var emu_i: usize = 0;
while (emu_i < display.buf.len) : (emu_i += 1) {
var pixel_i = emu_i * 4;
if (display.buf[emu_i] == 0x01) {
pixel_buf[pixel_i] = 0xFF;
pixel_buf[pixel_i + 1] = 0xFF;
pixel_buf[pixel_i + 2] = 0xFF;
pixel_buf[pixel_i + 3] = 0xFF;
} else {
pixel_buf[pixel_i] = 0xFF;
pixel_buf[pixel_i + 1] = 0x00;
pixel_buf[pixel_i + 2] = 0x00;
pixel_buf[pixel_i + 3] = 0x00;
}
}
}