75 lines
2.3 KiB
Zig
Executable File
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);
|
|
}
|
|
}
|
|
}
|