chore: give more descriptive panic messages when changing mode fails
This commit is contained in:
		
							
								
								
									
										19
									
								
								src/cpu.zig
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/cpu.zig
									
									
									
									
									
								
							@@ -120,7 +120,7 @@ pub const Arm7tdmi = struct {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub inline fn hasSPSR(self: *const Self) bool {
 | 
			
		||||
        const mode = getMode(self.cpsr.mode.read()) orelse unreachable;
 | 
			
		||||
        const mode = getModeChecked(self, self.cpsr.mode.read());
 | 
			
		||||
        return switch (mode) {
 | 
			
		||||
            .System, .User => false,
 | 
			
		||||
            else => true,
 | 
			
		||||
@@ -128,7 +128,7 @@ pub const Arm7tdmi = struct {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub inline fn isPrivileged(self: *const Self) bool {
 | 
			
		||||
        const mode = getMode(self.cpsr.mode.read()) orelse unreachable;
 | 
			
		||||
        const mode = getModeChecked(self, self.cpsr.mode.read());
 | 
			
		||||
        return switch (mode) {
 | 
			
		||||
            .User => false,
 | 
			
		||||
            else => true,
 | 
			
		||||
@@ -141,12 +141,11 @@ pub const Arm7tdmi = struct {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn changeModeFromIdx(self: *Self, next: u5) void {
 | 
			
		||||
        const mode = getMode(next) orelse unreachable;
 | 
			
		||||
        self.changeMode(mode);
 | 
			
		||||
        self.changeMode(getModeChecked(self, next));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn setUserModeRegister(self: *Self, idx: usize, value: u32) void {
 | 
			
		||||
        const current = getMode(self.cpsr.mode.read()) orelse unreachable;
 | 
			
		||||
        const current = getModeChecked(self, self.cpsr.mode.read());
 | 
			
		||||
 | 
			
		||||
        if (idx < 8) {
 | 
			
		||||
            self.r[idx] = value;
 | 
			
		||||
@@ -166,7 +165,7 @@ pub const Arm7tdmi = struct {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn getUserModeRegister(self: *Self, idx: usize) u32 {
 | 
			
		||||
        const current = getMode(self.cpsr.mode.read()) orelse unreachable;
 | 
			
		||||
        const current = getModeChecked(self, self.cpsr.mode.read());
 | 
			
		||||
 | 
			
		||||
        var result: u32 = undefined;
 | 
			
		||||
        if (idx < 8) {
 | 
			
		||||
@@ -189,7 +188,7 @@ pub const Arm7tdmi = struct {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn changeMode(self: *Self, next: Mode) void {
 | 
			
		||||
        const now = getMode(self.cpsr.mode.read()) orelse unreachable;
 | 
			
		||||
        const now = getModeChecked(self, self.cpsr.mode.read());
 | 
			
		||||
 | 
			
		||||
        // Bank R8 -> r12
 | 
			
		||||
        var r: usize = 8;
 | 
			
		||||
@@ -650,10 +649,14 @@ const Mode = enum(u5) {
 | 
			
		||||
    System = 0b11111,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
pub fn getMode(bits: u5) ?Mode {
 | 
			
		||||
fn getMode(bits: u5) ?Mode {
 | 
			
		||||
    return std.meta.intToEnum(Mode, bits) catch null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn getModeChecked(cpu: *const Arm7tdmi, bits: u5) Mode {
 | 
			
		||||
    return getMode(bits) orelse cpu.panic("[CPU|CPSR] 0b{b:0>5} is an invalid CPU mode", .{bits});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn armUndefined(cpu: *Arm7tdmi, _: *Bus, opcode: u32) void {
 | 
			
		||||
    const id = armIdx(opcode);
 | 
			
		||||
    cpu.panic("[CPU:ARM] ID: 0x{X:0>3} 0x{X:0>8} is an illegal opcode", .{ id, opcode });
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user