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); } } }