feat: implement BLDCNT, BLDALPHA, BLDY
This commit is contained in:
parent
7e15e83d38
commit
5e4fb7b952
|
@ -81,6 +81,7 @@ pub fn read(bus: *const Bus, comptime T: type, address: u32) T {
|
||||||
0x0400_000C => bus.ppu.bg[2].cnt.raw,
|
0x0400_000C => bus.ppu.bg[2].cnt.raw,
|
||||||
0x0400_000E => bus.ppu.bg[3].cnt.raw,
|
0x0400_000E => bus.ppu.bg[3].cnt.raw,
|
||||||
0x0400_004C => readTodo("Read {} from MOSAIC", .{T}),
|
0x0400_004C => readTodo("Read {} from MOSAIC", .{T}),
|
||||||
|
0x0400_0050 => bus.ppu.bldcnt.raw,
|
||||||
|
|
||||||
// Sound
|
// Sound
|
||||||
0x0400_0060...0x0400_009E => apu.read(T, &bus.apu, address),
|
0x0400_0060...0x0400_009E => apu.read(T, &bus.apu, address),
|
||||||
|
@ -166,8 +167,11 @@ pub fn write(bus: *Bus, comptime T: type, address: u32, value: T) void {
|
||||||
0x0400_0044 => log.debug("Wrote 0x{X:0>8} to WIN0V and WIN1V", .{value}),
|
0x0400_0044 => log.debug("Wrote 0x{X:0>8} to WIN0V and WIN1V", .{value}),
|
||||||
0x0400_0048 => log.debug("Wrote 0x{X:0>8} to WININ and WINOUT", .{value}),
|
0x0400_0048 => log.debug("Wrote 0x{X:0>8} to WININ and WINOUT", .{value}),
|
||||||
0x0400_004C => log.debug("Wrote 0x{X:0>8} to MOSAIC", .{value}),
|
0x0400_004C => log.debug("Wrote 0x{X:0>8} to MOSAIC", .{value}),
|
||||||
0x0400_0050 => log.debug("Wrote 0x{X:0>8} to BLDCNT and BLDALPHA", .{value}),
|
0x0400_0050 => {
|
||||||
0x0400_0054 => log.debug("Wrote 0x{X:0>8} to BLDY", .{value}),
|
bus.ppu.bldcnt.raw = @truncate(u16, value);
|
||||||
|
bus.ppu.bldalpha.raw = @truncate(u16, value >> 16);
|
||||||
|
},
|
||||||
|
0x0400_0054 => bus.ppu.bldy.raw = @truncate(u16, value),
|
||||||
0x0400_0058...0x0400_005C => {}, // Unused
|
0x0400_0058...0x0400_005C => {}, // Unused
|
||||||
|
|
||||||
// Sound
|
// Sound
|
||||||
|
@ -248,9 +252,9 @@ pub fn write(bus: *Bus, comptime T: type, address: u32, value: T) void {
|
||||||
0x0400_0048 => log.debug("Wrote 0x{X:0>4} to WININ", .{value}),
|
0x0400_0048 => log.debug("Wrote 0x{X:0>4} to WININ", .{value}),
|
||||||
0x0400_004A => log.debug("Wrote 0x{X:0>4} to WINOUT", .{value}),
|
0x0400_004A => log.debug("Wrote 0x{X:0>4} to WINOUT", .{value}),
|
||||||
0x0400_004C => log.debug("Wrote 0x{X:0>4} to MOSAIC", .{value}),
|
0x0400_004C => log.debug("Wrote 0x{X:0>4} to MOSAIC", .{value}),
|
||||||
0x0400_0050 => log.debug("Wrote 0x{X:0>4} to BLDCNT", .{value}),
|
0x0400_0050 => bus.ppu.bldcnt.raw = value,
|
||||||
0x0400_0052 => log.debug("Wrote 0x{X:0>4} to BLDALPHA", .{value}),
|
0x0400_0052 => bus.ppu.bldalpha.raw = value,
|
||||||
0x0400_0054 => log.debug("Wrote 0x{X:0>4} to BLDY", .{value}),
|
0x0400_0054 => bus.ppu.bldy.raw = value,
|
||||||
0x0400_004E, 0x0400_0056 => {}, // Not used
|
0x0400_004E, 0x0400_0056 => {}, // Not used
|
||||||
|
|
||||||
// Sound
|
// Sound
|
||||||
|
@ -301,7 +305,7 @@ pub fn write(bus: *Bus, comptime T: type, address: u32, value: T) void {
|
||||||
0x0400_0048 => log.debug("Wrote 0x{X:0>2} to WININ_L", .{value}),
|
0x0400_0048 => log.debug("Wrote 0x{X:0>2} to WININ_L", .{value}),
|
||||||
0x0400_0049 => log.debug("Wrote 0x{X:0>2} to WININ_H", .{value}),
|
0x0400_0049 => log.debug("Wrote 0x{X:0>2} to WININ_H", .{value}),
|
||||||
0x0400_004A => log.debug("Wrote 0x{X:0>2} to WINOUT_L", .{value}),
|
0x0400_004A => log.debug("Wrote 0x{X:0>2} to WINOUT_L", .{value}),
|
||||||
0x0400_0054 => log.debug("Wrote 0x{X:0>2} to BLDY_L", .{value}),
|
0x0400_0054 => bus.ppu.bldy.raw = (bus.ppu.bldy.raw & 0xFF00) | value,
|
||||||
|
|
||||||
// Sound
|
// Sound
|
||||||
0x0400_0060...0x0400_00A7 => apu.write(T, &bus.apu, address, value),
|
0x0400_0060...0x0400_00A7 => apu.write(T, &bus.apu, address, value),
|
||||||
|
@ -430,6 +434,39 @@ pub const BackgroundOffset = extern union {
|
||||||
raw: u16,
|
raw: u16,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Read / Write
|
||||||
|
pub const BldCnt = extern union {
|
||||||
|
bg0a: Bit(u16, 0),
|
||||||
|
bg1a: Bit(u16, 1),
|
||||||
|
bg2a: Bit(u16, 2),
|
||||||
|
bg3a: Bit(u16, 3),
|
||||||
|
obja: Bit(u16, 4),
|
||||||
|
bda: Bit(u16, 5),
|
||||||
|
mode: Bitfield(u16, 6, 2),
|
||||||
|
bg0b: Bit(u16, 8),
|
||||||
|
bg1b: Bit(u16, 9),
|
||||||
|
bg2b: Bit(u16, 10),
|
||||||
|
bg3b: Bit(u16, 11),
|
||||||
|
objb: Bit(u16, 12),
|
||||||
|
bdb: Bit(u16, 13),
|
||||||
|
raw: u16,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Read-only?
|
||||||
|
/// Alpha Blending Coefficients
|
||||||
|
pub const BldAlpha = extern union {
|
||||||
|
eva: Bitfield(u16, 0, 5),
|
||||||
|
evb: Bitfield(u16, 8, 5),
|
||||||
|
raw: u16,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Write-only?
|
||||||
|
/// Brightness COefficients
|
||||||
|
pub const BldY = extern union {
|
||||||
|
evy: Bitfield(u16, 0, 5),
|
||||||
|
raw: u16,
|
||||||
|
};
|
||||||
|
|
||||||
/// Read / Write
|
/// Read / Write
|
||||||
const InterruptRequest = extern union {
|
const InterruptRequest = extern union {
|
||||||
vblank: Bit(u16, 0),
|
vblank: Bit(u16, 0),
|
||||||
|
|
|
@ -31,6 +31,10 @@ pub const Ppu = struct {
|
||||||
dispstat: io.DisplayStatus,
|
dispstat: io.DisplayStatus,
|
||||||
vcount: io.VCount,
|
vcount: io.VCount,
|
||||||
|
|
||||||
|
bldcnt: io.BldCnt,
|
||||||
|
bldalpha: io.BldAlpha,
|
||||||
|
bldy: io.BldY,
|
||||||
|
|
||||||
vram: Vram,
|
vram: Vram,
|
||||||
palette: Palette,
|
palette: Palette,
|
||||||
oam: Oam,
|
oam: Oam,
|
||||||
|
@ -62,6 +66,9 @@ pub const Ppu = struct {
|
||||||
.dispcnt = .{ .raw = 0x0000 },
|
.dispcnt = .{ .raw = 0x0000 },
|
||||||
.dispstat = .{ .raw = 0x0000 },
|
.dispstat = .{ .raw = 0x0000 },
|
||||||
.vcount = .{ .raw = 0x0000 },
|
.vcount = .{ .raw = 0x0000 },
|
||||||
|
.bldcnt = .{ .raw = 0x0000 },
|
||||||
|
.bldalpha = .{ .raw = 0x0000 },
|
||||||
|
.bldy = .{ .raw = 0x0000 },
|
||||||
|
|
||||||
.scanline_buf = [_]?u16{null} ** width,
|
.scanline_buf = [_]?u16{null} ** width,
|
||||||
.scanline_sprites = [_]?Sprite{null} ** 128,
|
.scanline_sprites = [_]?Sprite{null} ** 128,
|
||||||
|
|
Loading…
Reference in New Issue