diff --git a/src/core/bus/GamePak.zig b/src/core/bus/GamePak.zig index ec2f28b..f41a18a 100644 --- a/src/core/bus/GamePak.zig +++ b/src/core/bus/GamePak.zig @@ -316,7 +316,7 @@ const Gpio = struct { }; /// GBA Real Time Clock -const Clock = struct { +pub const Clock = struct { const This = @This(); writer: Writer, @@ -501,11 +501,14 @@ const Clock = struct { .cpu = cpu, .gpio = gpio, // Can't use Arm7tdmi ptr b/c not initialized yet }; + + cpu.sched.push(.RealTimeClock, 1 << 24); // Every Second } - fn updateRealTime(self: *This) void { - const now = DateTime.now(); + pub fn updateTime(self: *This) void { + self.cpu.sched.push(.RealTimeClock, 1 << 24); // Reschedule + const now = DateTime.now(); self.year = toBcd(u8, @intCast(u8, now.date.year - 2000)); self.month = toBcd(u5, now.date.month); self.day = toBcd(u3, now.date.day); diff --git a/src/core/scheduler.zig b/src/core/scheduler.zig index 8a4b517..af6989c 100644 --- a/src/core/scheduler.zig +++ b/src/core/scheduler.zig @@ -2,6 +2,7 @@ const std = @import("std"); const Bus = @import("Bus.zig"); const Arm7tdmi = @import("cpu.zig").Arm7tdmi; +const Clock = @import("bus/GamePak.zig").Clock; const Order = std.math.Order; const PriorityQueue = std.PriorityQueue; @@ -60,6 +61,13 @@ pub const Scheduler = struct { 3 => cpu.bus.apu.ch4.channelTimerOverflow(late), } }, + .RealTimeClock => { + const device = &cpu.bus.pak.gpio.device; + if (device.kind != .Rtc or device.ptr == null) return; + + const clock = @ptrCast(*Clock, @alignCast(@alignOf(*Clock), device.ptr.?)); + clock.updateTime(); + }, .FrameSequencer => cpu.bus.apu.tickFrameSequencer(late), .SampleAudio => cpu.bus.apu.sampleAudio(late), .HBlank => cpu.bus.ppu.handleHBlankEnd(cpu, late), // The end of a HBlank @@ -118,4 +126,5 @@ pub const EventKind = union(enum) { SampleAudio, FrameSequencer, ApuChannel: u2, + RealTimeClock, };