feat: implement broken IPCFIFO
This commit is contained in:
@@ -24,11 +24,13 @@ pub fn read(bus: *const Bus, comptime T: type, address: u32) T {
|
||||
0x0400_0208 => @intFromBool(bus.io.shared.ime),
|
||||
0x0400_0210 => bus.io.shared.ie,
|
||||
0x0400_0214 => bus.io.shared.irq,
|
||||
|
||||
0x0410_0000 => bus.io.shared.ipc_fifo.recv(.arm7),
|
||||
else => warn("unexpected: read(T: {}, addr: 0x{X:0>8}) {} ", .{ T, address, T }),
|
||||
},
|
||||
u16 => switch (address) {
|
||||
0x0400_0180 => @truncate(bus.io.shared.ipc_sync.raw),
|
||||
0x0400_0184 => @truncate(bus.io.shared.ipc_fifo_cnt.raw),
|
||||
0x0400_0180 => @truncate(bus.io.shared.ipc_fifo.sync.raw),
|
||||
0x0400_0184 => @truncate(bus.io.shared.ipc_fifo.cnt.raw),
|
||||
else => warn("unexpected: read(T: {}, addr: 0x{X:0>8}) {} ", .{ T, address, T }),
|
||||
},
|
||||
u8 => switch (address) {
|
||||
@@ -44,11 +46,18 @@ pub fn write(bus: *Bus, comptime T: type, address: u32, value: T) void {
|
||||
0x0400_0208 => bus.io.shared.ime = value & 1 == 1,
|
||||
0x0400_0210 => bus.io.shared.ie = value,
|
||||
0x0400_0214 => bus.io.shared.irq = value,
|
||||
|
||||
0x0400_0188 => bus.io.shared.ipc_fifo.send(.arm7, value) catch |e| std.debug.panic("FIFO error: {}", .{e}),
|
||||
else => log.warn("unexpected: write(T: {}, addr: 0x{X:0>8}, value: 0x{X:0>8})", .{ T, address, value }),
|
||||
},
|
||||
u16 => switch (address) {
|
||||
0x0400_0180 => bus.io.shared.ipc_sync.raw = value,
|
||||
0x0400_0184 => bus.io.shared.ipc_fifo_cnt.raw = value,
|
||||
0x0400_0180 => bus.io.shared.ipc_fifo.sync.raw = blk: {
|
||||
const ret = value & ~@as(u16, 0xF) | (bus.io.shared.ipc_fifo.sync.raw & 0xF);
|
||||
log.debug("IPCFIFOSYNC <- 0x{X:0>8}", .{ret});
|
||||
|
||||
break :blk ret;
|
||||
},
|
||||
0x0400_0184 => bus.io.shared.ipc_fifo.cnt.raw = value,
|
||||
else => log.warn("unexpected: write(T: {}, addr: 0x{X:0>8}, value: 0x{X:0>8})", .{ T, address, value }),
|
||||
},
|
||||
u8 => switch (address) {
|
||||
|
||||
Reference in New Issue
Block a user