chore: use stdlib endian-aware integer read/write functions
This commit is contained in:
@@ -44,9 +44,7 @@ pub fn checkedRead(self: *Self, comptime T: type, r15: u32, addr: u32) T {
|
||||
fn read(self: *const Self, comptime T: type, addr: u32) 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],
|
||||
u32, u16, u8 => std.mem.readIntSliceLittle(T, buf[addr..][0..@sizeOf(T)]),
|
||||
else => @compileError("BIOS: Unsupported read width"),
|
||||
};
|
||||
}
|
||||
|
@@ -25,9 +25,7 @@ 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],
|
||||
u32, u16, u8 => std.mem.readIntSliceLittle(T, self.buf[addr..][0..@sizeOf(T)]),
|
||||
else => @compileError("EWRAM: Unsupported read width"),
|
||||
};
|
||||
}
|
||||
@@ -36,17 +34,7 @@ pub fn write(self: *const Self, comptime T: type, address: usize, value: T) void
|
||||
const addr = address & 0x3FFFF;
|
||||
|
||||
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,
|
||||
u32, u16, u8 => std.mem.writeIntSliceLittle(T, self.buf[addr..][0..@sizeOf(T)], value),
|
||||
else => @compileError("EWRAM: Unsupported write width"),
|
||||
};
|
||||
}
|
||||
|
@@ -4,8 +4,6 @@ const Backup = @import("backup.zig").Backup;
|
||||
const Allocator = std.mem.Allocator;
|
||||
const log = std.log.scoped(.GamePak);
|
||||
|
||||
const intToBytes = @import("../util.zig").intToBytes;
|
||||
|
||||
const Self = @This();
|
||||
|
||||
title: [12]u8,
|
||||
|
@@ -25,9 +25,7 @@ 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],
|
||||
u32, u16, u8 => std.mem.readIntSliceLittle(T, self.buf[addr..][0..@sizeOf(T)]),
|
||||
else => @compileError("IWRAM: Unsupported read width"),
|
||||
};
|
||||
}
|
||||
@@ -36,17 +34,7 @@ pub fn write(self: *const Self, comptime T: type, address: usize, value: T) void
|
||||
const addr = address & 0x7FFF;
|
||||
|
||||
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,
|
||||
u32, u16, u8 => std.mem.writeIntSliceLittle(T, self.buf[addr..][0..@sizeOf(T)], value),
|
||||
else => @compileError("IWRAM: Unsupported write width"),
|
||||
};
|
||||
}
|
||||
|
@@ -4,7 +4,6 @@ const log = std.log.scoped(.Backup);
|
||||
|
||||
const escape = @import("../util.zig").escape;
|
||||
const asString = @import("../util.zig").asString;
|
||||
const intToBytes = @import("../util.zig").intToBytes;
|
||||
|
||||
const backup_kinds = [5]Needle{
|
||||
.{ .str = "EEPROM_V", .kind = .Eeprom },
|
||||
@@ -411,18 +410,7 @@ const Eeprom = struct {
|
||||
.Large => {
|
||||
if (self.writer.len() == 14) {
|
||||
const addr = @intCast(u10, self.writer.finish());
|
||||
const value_buf = buf[@as(u13, addr) * 8 ..][0..8];
|
||||
|
||||
// zig fmt: off
|
||||
const value = @as(u64, value_buf[7]) << 56
|
||||
| @as(u64, value_buf[6]) << 48
|
||||
| @as(u64, value_buf[5]) << 40
|
||||
| @as(u64, value_buf[4]) << 32
|
||||
| @as(u64, value_buf[3]) << 24
|
||||
| @as(u64, value_buf[2]) << 16
|
||||
| @as(u64, value_buf[1]) << 8
|
||||
| @as(u64, value_buf[0]) << 0;
|
||||
// zig fmt: on
|
||||
const value = std.mem.readIntSliceLittle(u64, buf[@as(u13, addr) * 8 ..][0..8]);
|
||||
|
||||
self.reader.configure(value);
|
||||
self.state = .RequestEnd;
|
||||
@@ -432,18 +420,7 @@ const Eeprom = struct {
|
||||
if (self.writer.len() == 6) {
|
||||
// FIXME: Duplicated code from above
|
||||
const addr = @intCast(u6, self.writer.finish());
|
||||
const value_buf = buf[@as(u13, addr) * 8 ..][0..8];
|
||||
|
||||
// zig fmt: off
|
||||
const value = @as(u64, value_buf[7]) << 56
|
||||
| @as(u64, value_buf[6]) << 48
|
||||
| @as(u64, value_buf[5]) << 40
|
||||
| @as(u64, value_buf[4]) << 32
|
||||
| @as(u64, value_buf[3]) << 24
|
||||
| @as(u64, value_buf[2]) << 16
|
||||
| @as(u64, value_buf[1]) << 8
|
||||
| @as(u64, value_buf[0]) << 0;
|
||||
// zig fmt: on
|
||||
const value = std.mem.readIntSliceLittle(u64, buf[@as(u13, addr) * 8 ..][0..8]);
|
||||
|
||||
self.reader.configure(value);
|
||||
self.state = .RequestEnd;
|
||||
@@ -471,7 +448,7 @@ const Eeprom = struct {
|
||||
},
|
||||
.WriteTransfer => {
|
||||
if (self.writer.len() == 64) {
|
||||
std.mem.copy(u8, buf[self.addr * 8 ..][0..8], &intToBytes(u64, self.writer.finish()));
|
||||
std.mem.writeIntSliceLittle(u64, buf[self.addr * 8 ..][0..8], self.writer.finish());
|
||||
self.state = .RequestEnd;
|
||||
}
|
||||
},
|
||||
|
Reference in New Issue
Block a user