chore: rewrite read/write methods for remainig Bus devices
This commit is contained in:
@@ -26,23 +26,15 @@ pub fn deinit(self: Self) void {
|
||||
if (self.buf) |buf| self.alloc.free(buf);
|
||||
}
|
||||
|
||||
pub fn get32(self: *const Self, idx: usize) u32 {
|
||||
if (self.buf) |buf|
|
||||
return (@as(u32, buf[idx + 3]) << 24) | (@as(u32, buf[idx + 2]) << 16) | (@as(u32, buf[idx + 1]) << 8) | (@as(u32, buf[idx]));
|
||||
pub fn read(self: *const Self, comptime T: type, addr: usize) T {
|
||||
if (self.buf) |buf| {
|
||||
return switch (T) {
|
||||
u32 => (@as(u32, buf[addr + 3]) << 24) | (@as(u32, buf[addr + 2]) << 16) | (@as(u32, buf[addr + 1]) << 8) | (@as(u32, buf[addr])),
|
||||
u16 => (@as(u16, buf[addr + 1]) << 8) | @as(u16, buf[addr]),
|
||||
u8 => buf[addr],
|
||||
else => @compileError("BIOS: Unsupported read width"),
|
||||
};
|
||||
}
|
||||
|
||||
std.debug.panic("[CPU/BIOS:32] ZBA tried to read from 0x{X:0>8} but no BIOS was provided.", .{idx});
|
||||
}
|
||||
|
||||
pub fn get16(self: *const Self, idx: usize) u16 {
|
||||
if (self.buf) |buf|
|
||||
return (@as(u16, buf[idx + 1]) << 8) | @as(u16, buf[idx]);
|
||||
|
||||
std.debug.panic("[CPU/BIOS:16] ZBA tried to read from 0x{X:0>8} but no BIOS was provided.", .{idx});
|
||||
}
|
||||
|
||||
pub fn get8(self: *const Self, idx: usize) u8 {
|
||||
if (self.buf) |buf|
|
||||
return buf[idx];
|
||||
|
||||
std.debug.panic("[CPU/BIOS:8] ZBA tried to read from 0x{X:0>8} but no BIOS was provided.", .{idx});
|
||||
std.debug.panic("[BIOS] ZBA tried to read {} from 0x{X:0>8} but not BIOS was present", .{ T, addr });
|
||||
}
|
||||
|
@@ -20,28 +20,32 @@ pub fn deinit(self: Self) void {
|
||||
self.alloc.free(self.buf);
|
||||
}
|
||||
|
||||
pub fn get32(self: *const Self, idx: usize) u32 {
|
||||
return (@as(u32, self.get16(idx + 2)) << 16) | @as(u32, self.get16(idx));
|
||||
pub fn read(self: *const Self, comptime T: type, address: usize) T {
|
||||
const addr = address & 0x3FFFF;
|
||||
|
||||
return switch (T) {
|
||||
u32 => (@as(u32, self.buf[addr + 3]) << 24) | (@as(u32, self.buf[addr + 2]) << 16) | (@as(u32, self.buf[addr + 1]) << 8) | (@as(u32, self.buf[addr])),
|
||||
u16 => (@as(u16, self.buf[addr + 1]) << 8) | @as(u16, self.buf[addr]),
|
||||
u8 => self.buf[addr],
|
||||
else => @compileError("EWRAM: Unsupported read width"),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn set32(self: *Self, idx: usize, word: u32) void {
|
||||
self.set16(idx + 2, @truncate(u16, word >> 16));
|
||||
self.set16(idx, @truncate(u16, word));
|
||||
}
|
||||
pub fn write(self: *const Self, comptime T: type, address: usize, value: T) void {
|
||||
const addr = address & 0x3FFFF;
|
||||
|
||||
pub fn get16(self: *const Self, idx: usize) u16 {
|
||||
return (@as(u16, self.buf[idx + 1]) << 8) | @as(u16, self.buf[idx]);
|
||||
}
|
||||
|
||||
pub fn set16(self: *Self, idx: usize, halfword: u16) void {
|
||||
self.buf[idx + 1] = @truncate(u8, halfword >> 8);
|
||||
self.buf[idx] = @truncate(u8, halfword);
|
||||
}
|
||||
|
||||
pub fn get8(self: *const Self, idx: usize) u8 {
|
||||
return self.buf[idx];
|
||||
}
|
||||
|
||||
pub fn set8(self: *Self, idx: usize, byte: u8) void {
|
||||
self.buf[idx] = byte;
|
||||
return switch (T) {
|
||||
u32 => {
|
||||
self.buf[addr + 3] = @truncate(u8, value >> 24);
|
||||
self.buf[addr + 2] = @truncate(u8, value >> 16);
|
||||
self.buf[addr + 1] = @truncate(u8, value >> 8);
|
||||
self.buf[addr + 0] = @truncate(u8, value >> 0);
|
||||
},
|
||||
u16 => {
|
||||
self.buf[addr + 1] = @truncate(u8, value >> 8);
|
||||
self.buf[addr + 0] = @truncate(u8, value >> 0);
|
||||
},
|
||||
u8 => self.buf[addr] = value,
|
||||
else => @compileError("EWRAM: Unsupported write width"),
|
||||
};
|
||||
}
|
||||
|
@@ -60,14 +60,13 @@ pub fn deinit(self: Self) void {
|
||||
self.backup.deinit();
|
||||
}
|
||||
|
||||
pub fn get32(self: *const Self, idx: usize) u32 {
|
||||
return (@as(u32, self.get16(idx + 2)) << 16) | @as(u32, self.get16(idx));
|
||||
}
|
||||
pub fn read(self: *const Self, comptime T: type, address: u32) T {
|
||||
const addr = address & 0x1FF_FFFF;
|
||||
|
||||
pub fn get16(self: *const Self, idx: usize) u16 {
|
||||
return (@as(u16, self.buf[idx + 1]) << 8) | @as(u16, self.buf[idx]);
|
||||
}
|
||||
|
||||
pub fn get8(self: *const Self, idx: usize) u8 {
|
||||
return self.buf[idx];
|
||||
return switch (T) {
|
||||
u32 => (@as(T, self.buf[addr + 3]) << 24) | (@as(T, self.buf[addr + 2]) << 16) | (@as(T, self.buf[addr + 1]) << 8) | (@as(T, self.buf[addr])),
|
||||
u16 => (@as(T, self.buf[addr + 1]) << 8) | @as(T, self.buf[addr]),
|
||||
u8 => self.buf[addr],
|
||||
else => @compileError("GamePak: Unsupported read width"),
|
||||
};
|
||||
}
|
||||
|
@@ -20,30 +20,32 @@ pub fn deinit(self: Self) void {
|
||||
self.alloc.free(self.buf);
|
||||
}
|
||||
|
||||
pub fn get32(self: *const Self, idx: usize) u32 {
|
||||
return (@as(u32, self.buf[idx + 3]) << 24) | (@as(u32, self.buf[idx + 2]) << 16) | (@as(u32, self.buf[idx + 1]) << 8) | (@as(u32, self.buf[idx]));
|
||||
pub fn read(self: *const Self, comptime T: type, address: usize) T {
|
||||
const addr = address & 0x7FFF;
|
||||
|
||||
return switch (T) {
|
||||
u32 => (@as(u32, self.buf[addr + 3]) << 24) | (@as(u32, self.buf[addr + 2]) << 16) | (@as(u32, self.buf[addr + 1]) << 8) | (@as(u32, self.buf[addr])),
|
||||
u16 => (@as(u16, self.buf[addr + 1]) << 8) | @as(u16, self.buf[addr]),
|
||||
u8 => self.buf[addr],
|
||||
else => @compileError("IWRAM: Unsupported read width"),
|
||||
};
|
||||
}
|
||||
|
||||
pub fn set32(self: *Self, idx: usize, word: u32) void {
|
||||
self.buf[idx + 3] = @truncate(u8, word >> 24);
|
||||
self.buf[idx + 2] = @truncate(u8, word >> 16);
|
||||
self.buf[idx + 1] = @truncate(u8, word >> 8);
|
||||
self.buf[idx] = @truncate(u8, word);
|
||||
}
|
||||
pub fn write(self: *const Self, comptime T: type, address: usize, value: T) void {
|
||||
const addr = address & 0x7FFF;
|
||||
|
||||
pub fn get16(self: *const Self, idx: usize) u16 {
|
||||
return (@as(u16, self.buf[idx + 1]) << 8) | @as(u16, self.buf[idx]);
|
||||
}
|
||||
|
||||
pub fn set16(self: *Self, idx: usize, halfword: u16) void {
|
||||
self.buf[idx + 1] = @truncate(u8, halfword >> 8);
|
||||
self.buf[idx] = @truncate(u8, halfword);
|
||||
}
|
||||
|
||||
pub fn get8(self: *const Self, idx: usize) u8 {
|
||||
return self.buf[idx];
|
||||
}
|
||||
|
||||
pub fn set8(self: *Self, idx: usize, byte: u8) void {
|
||||
self.buf[idx] = byte;
|
||||
return switch (T) {
|
||||
u32 => {
|
||||
self.buf[addr + 3] = @truncate(u8, value >> 24);
|
||||
self.buf[addr + 2] = @truncate(u8, value >> 16);
|
||||
self.buf[addr + 1] = @truncate(u8, value >> 8);
|
||||
self.buf[addr + 0] = @truncate(u8, value >> 0);
|
||||
},
|
||||
u16 => {
|
||||
self.buf[addr + 1] = @truncate(u8, value >> 8);
|
||||
self.buf[addr + 0] = @truncate(u8, value >> 0);
|
||||
},
|
||||
u8 => self.buf[addr] = value,
|
||||
else => @compileError("IWRAM: Unsupported write width"),
|
||||
};
|
||||
}
|
||||
|
@@ -115,38 +115,42 @@ pub const Backup = struct {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get8(self: *const Self, idx: usize) u8 {
|
||||
pub fn read(self: *const Self, address: usize) u8 {
|
||||
const addr = address & 0xFFFF;
|
||||
|
||||
switch (self.kind) {
|
||||
.Flash => {
|
||||
switch (idx) {
|
||||
switch (addr) {
|
||||
0x0000 => if (self.flash.id_mode) return 0x32, // Panasonic manufacturer ID
|
||||
0x0001 => if (self.flash.id_mode) return 0x1B, // Panasonic device ID
|
||||
else => {},
|
||||
}
|
||||
|
||||
return self.flash.read(self.buf, idx);
|
||||
return self.flash.read(self.buf, addr);
|
||||
},
|
||||
.Flash1M => {
|
||||
switch (idx) {
|
||||
switch (addr) {
|
||||
0x0000 => if (self.flash.id_mode) return 0x62, // Sanyo manufacturer ID
|
||||
0x0001 => if (self.flash.id_mode) return 0x13, // Sanyo device ID
|
||||
else => {},
|
||||
}
|
||||
|
||||
return self.flash.read(self.buf, idx);
|
||||
return self.flash.read(self.buf, addr);
|
||||
},
|
||||
.Eeprom => return self.buf[idx],
|
||||
.Sram => return self.buf[idx & 0x7FFF], // 32K SRAM chip is mirrored
|
||||
.Eeprom => return self.buf[addr],
|
||||
.Sram => return self.buf[addr & 0x7FFF], // 32K SRAM chip is mirrored
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set8(self: *Self, idx: usize, byte: u8) void {
|
||||
pub fn write(self: *Self, address: usize, byte: u8) void {
|
||||
const addr = address & 0xFFFF;
|
||||
|
||||
switch (self.kind) {
|
||||
.Flash, .Flash1M => {
|
||||
if (self.flash.prep_write) return self.flash.write(self.buf, idx, byte);
|
||||
if (self.flash.shouldEraseSector(idx, byte)) return self.flash.eraseSector(self.buf, idx);
|
||||
if (self.flash.prep_write) return self.flash.write(self.buf, addr, byte);
|
||||
if (self.flash.shouldEraseSector(addr, byte)) return self.flash.eraseSector(self.buf, addr);
|
||||
|
||||
switch (idx) {
|
||||
switch (addr) {
|
||||
0x0000 => if (self.kind == .Flash1M and self.flash.set_bank) {
|
||||
self.flash.bank = @truncate(u1, byte);
|
||||
},
|
||||
@@ -165,8 +169,8 @@ pub const Backup = struct {
|
||||
else => {},
|
||||
}
|
||||
},
|
||||
.Eeprom => self.buf[idx] = byte,
|
||||
.Sram => self.buf[idx & 0x7FFF] = byte,
|
||||
.Eeprom => self.buf[addr] = byte,
|
||||
.Sram => self.buf[addr & 0x7FFF] = byte,
|
||||
}
|
||||
}
|
||||
};
|
||||
|
Reference in New Issue
Block a user