feat(sched): add HBlank and VBlank events to the scheduler
This commit is contained in:
		| @@ -1,5 +1,6 @@ | ||||
| const std = @import("std"); | ||||
|  | ||||
| const Scheduler = @import("scheduler.zig").Scheduler; | ||||
| const Io = @import("bus/io.zig").Io; | ||||
| const Bios = @import("bus/bios.zig").Bios; | ||||
| const GamePak = @import("bus/pak.zig").GamePak; | ||||
| @@ -13,11 +14,11 @@ pub const Bus = struct { | ||||
|     ppu: Ppu, | ||||
|     io: Io, | ||||
|  | ||||
|     pub fn init(alloc: Allocator, path: []const u8) !@This() { | ||||
|     pub fn init(alloc: Allocator, sched: *Scheduler, path: []const u8) !@This() { | ||||
|         return @This(){ | ||||
|             .pak = try GamePak.init(alloc, path), | ||||
|             .bios = try Bios.init(alloc, "./bin/gba_bios.bin"), // TODO: don't hardcode this + bundle open-sorce Boot ROM | ||||
|             .ppu = try Ppu.init(alloc), | ||||
|             .ppu = try Ppu.init(alloc, sched), | ||||
|             .io = Io.init(), | ||||
|         }; | ||||
|     } | ||||
|   | ||||
| @@ -18,14 +18,14 @@ const arm_lut: [0x1000]InstrFn = populate(); | ||||
|  | ||||
| pub const Arm7tdmi = struct { | ||||
|     r: [16]u32, | ||||
|     sch: *Scheduler, | ||||
|     sched: *Scheduler, | ||||
|     bus: *Bus, | ||||
|     cpsr: CPSR, | ||||
|  | ||||
|     pub fn init(scheduler: *Scheduler, bus: *Bus) @This() { | ||||
|     pub fn init(sched: *Scheduler, bus: *Bus) @This() { | ||||
|         return .{ | ||||
|             .r = [_]u32{0x00} ** 16, | ||||
|             .sch = scheduler, | ||||
|             .sched = sched, | ||||
|             .bus = bus, | ||||
|             .cpsr = .{ .raw = 0x0000_00DF }, | ||||
|         }; | ||||
|   | ||||
| @@ -4,14 +4,14 @@ const Bus = @import("bus.zig").Bus; | ||||
|  | ||||
| const cycles_per_frame: u64 = 100; // TODO: How many cycles actually? | ||||
|  | ||||
| pub fn runFrame(sch: *Scheduler, cpu: *Arm7tdmi, bus: *Bus) void { | ||||
| pub fn runFrame(sched: *Scheduler, cpu: *Arm7tdmi, bus: *Bus) void { | ||||
|     var cycles: u64 = 0; | ||||
|     while (cycles < cycles_per_frame) : (cycles += 1) { | ||||
|         sch.tick += 1; | ||||
|         sched.tick += 1; | ||||
|         _ = cpu.step(); | ||||
|  | ||||
|         while (sch.tick >= sch.nextTimestamp()) { | ||||
|             sch.handleEvent(cpu, bus); | ||||
|         while (sched.tick >= sched.nextTimestamp()) { | ||||
|             sched.handleEvent(cpu, bus); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -23,12 +23,12 @@ pub fn main() anyerror!void { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     var bus = try Bus.init(alloc, zba_args[0]); | ||||
|     defer bus.deinit(); | ||||
|  | ||||
|     var scheduler = Scheduler.init(alloc); | ||||
|     defer scheduler.deinit(); | ||||
|  | ||||
|     var bus = try Bus.init(alloc, &scheduler, zba_args[0]); | ||||
|     defer bus.deinit(); | ||||
|  | ||||
|     var cpu = Arm7tdmi.init(&scheduler, &bus); | ||||
|  | ||||
|     cpu.skipBios(); | ||||
|   | ||||
| @@ -1,15 +1,18 @@ | ||||
| const std = @import("std"); | ||||
|  | ||||
| const Allocator = std.mem.Allocator; | ||||
| const Scheduler = @import("scheduler.zig").Scheduler; | ||||
|  | ||||
| pub const Ppu = struct { | ||||
|     vram: Vram, | ||||
|     palette: Palette, | ||||
|     sched: *Scheduler, | ||||
|  | ||||
|     pub fn init(alloc: Allocator) !@This() { | ||||
|     pub fn init(alloc: Allocator, sched: *Scheduler) !@This() { | ||||
|         return @This(){ | ||||
|             .vram = try Vram.init(alloc), | ||||
|             .palette = try Palette.init(alloc), | ||||
|             .sched = sched, | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -35,6 +35,12 @@ pub const Scheduler = struct { | ||||
|                 .HeatDeath => { | ||||
|                     std.debug.panic("[Scheduler] Somehow, a u64 overflowed", .{}); | ||||
|                 }, | ||||
|                 .HBlank => { | ||||
|                     std.debug.panic("[Scheduler] tick {}: Hblank", .{self.tick}); | ||||
|                 }, | ||||
|                 .VBlank => { | ||||
|                     std.debug.panic("[Scheduler] tick {}: VBlank", .{self.tick}); | ||||
|                 }, | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -57,4 +63,6 @@ fn lessThan(_: void, a: Event, b: Event) Order { | ||||
|  | ||||
| pub const EventKind = enum { | ||||
|     HeatDeath, | ||||
|     HBlank, | ||||
|     VBlank, | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user