diff --git a/src/core/bus/io.zig b/src/core/bus/io.zig index e054487..b90eef8 100644 --- a/src/core/bus/io.zig +++ b/src/core/bus/io.zig @@ -302,6 +302,14 @@ pub fn write(bus: *Bus, comptime T: type, address: u32, value: T) void { 0x0400_0009 => bus.ppu.bg[0].cnt.raw = (@as(u16, value) << 8) | (bus.ppu.bg[0].cnt.raw & 0xFF), 0x0400_000A => bus.ppu.bg[1].cnt.raw = (bus.ppu.bg[1].cnt.raw & 0xFF00) | value, 0x0400_000B => bus.ppu.bg[1].cnt.raw = (@as(u16, value) << 8) | (bus.ppu.bg[1].cnt.raw & 0xFF), + 0x0400_0040 => bus.ppu.win.h[0].set(.Lo, value), + 0x0400_0041 => bus.ppu.win.h[0].set(.Hi, value), + 0x0400_0042 => bus.ppu.win.h[1].set(.Lo, value), + 0x0400_0043 => bus.ppu.win.h[1].set(.Hi, value), + 0x0400_0044 => bus.ppu.win.v[0].set(.Lo, value), + 0x0400_0045 => bus.ppu.win.v[0].set(.Hi, value), + 0x0400_0046 => bus.ppu.win.v[1].set(.Lo, value), + 0x0400_0047 => bus.ppu.win.v[1].set(.Hi, value), 0x0400_0048 => bus.ppu.win.setInL(value), 0x0400_0049 => bus.ppu.win.setInH(value), 0x0400_004A => bus.ppu.win.setOutL(value), @@ -459,18 +467,38 @@ pub const BldY = extern union { raw: u16, }; +const u8WriteKind = enum { Hi, Lo }; + /// Write-only pub const WinH = extern union { + const Self = @This(); + x2: Bitfield(u16, 0, 8), x1: Bitfield(u16, 8, 8), raw: u16, + + pub fn set(self: *Self, comptime K: u8WriteKind, value: u8) void { + self.raw = switch (K) { + .Hi => (@as(u16, value) << 8) | self.raw & 0xFF, + .Lo => (self.raw & 0xFF00) | value, + }; + } }; /// Write-only pub const WinV = extern union { + const Self = @This(); + y2: Bitfield(u16, 0, 8), y1: Bitfield(u16, 8, 8), raw: u16, + + pub fn set(self: *Self, comptime K: u8WriteKind, value: u8) void { + self.raw = switch (K) { + .Hi => (@as(u16, value) << 8) | self.raw & 0xFF, + .Lo => (self.raw & 0xFF00) | value, + }; + } }; pub const WinIn = extern union {