1
0
chip8-zig/src/main.zig

75 lines
2.3 KiB
Zig
Executable File

const rl = @import("raylib");
const std = @import("std");
const assert = @import("std").debug.assert;
const ChipContext = @import("chip.zig").ChipContext;
const RaylibChip = @import("raylib-chip.zig");
pub fn gen_sin_wave(wave: *rl.Wave, frequency: f32) void {
assert(wave.sampleSize == 16); // Only 16 bits are supported
const sample_rate: f32 = @floatFromInt(wave.sampleRate);
const sample_size: u5 = @truncate(wave.sampleSize);
const max_sample_value: f32 = @floatFromInt(@shlExact(@as(u32, 1), sample_size - 1));
const data: [*]i16 = @ptrCast(@alignCast(wave.data));
for (0..wave.frameCount) |i| {
const i_f32: f32 = @floatFromInt(i);
const sin_value: f32 = @sin(std.math.pi*2*frequency/sample_rate*i_f32);
data[i] = @intFromFloat(sin_value*max_sample_value);
}
}
pub fn main() anyerror!void {
var chip = ChipContext.init();
chip.init_default_sprites();
{
const file = try std.fs.cwd().openFile("ROMs/morse_demo.ch8", .{ .mode = .read_only });
defer file.close();
try chip.set_memory_from_file(0x200, file);
}
const pixel_size = 20;
const screen_width = ChipContext.DISPLAY_WIDTH * pixel_size;
const screen_height = ChipContext.DISPLAY_HEIGHT * pixel_size;
rl.initWindow(screen_width, screen_height, "CHIP-8");
defer rl.closeWindow();
rl.initAudioDevice();
defer rl.closeAudioDevice();
rl.setTargetFPS(60);
const sample_rate = 44100;
var data = [1]i16{0} ** sample_rate;
var chip_wave = rl.Wave{
.frameCount = sample_rate,
.sampleRate = sample_rate,
.sampleSize = 16,
.channels = 1,
.data = @ptrCast(&data),
};
gen_sin_wave(&chip_wave, 440);
var chip_sound = rl.loadSoundFromWave(chip_wave);
defer rl.unloadSound(chip_sound);
rl.setSoundVolume(chip_sound, 0.2);
var raylib_chip = RaylibChip.init(&chip, &chip_sound);
raylib_chip.tick_speed = 500;
raylib_chip.timer_speed = 60;
while (!rl.windowShouldClose()) {
var dt = rl.getFrameTime();
raylib_chip.update(dt);
{
rl.beginDrawing();
defer rl.endDrawing();
rl.clearBackground(rl.Color.white);
raylib_chip.render(0, 0, screen_width, screen_height);
}
}
}