fix: properly decode format 11 instructions
This commit is contained in:
		@@ -496,7 +496,7 @@ fn thumbPopulate() [0x400]ThumbInstrFn {
 | 
				
			|||||||
                    },
 | 
					                    },
 | 
				
			||||||
                    0b001 => blk: {
 | 
					                    0b001 => blk: {
 | 
				
			||||||
                        const L = i >> 5 & 1 == 1;
 | 
					                        const L = i >> 5 & 1 == 1;
 | 
				
			||||||
                        const rd = i >> 2 & 0x3;
 | 
					                        const rd = i >> 2 & 0x7;
 | 
				
			||||||
                        break :blk format11(L, rd);
 | 
					                        break :blk format11(L, rd);
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                    0b010 => blk: {
 | 
					                    0b010 => blk: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,12 +5,12 @@ const InstrFn = @import("../../cpu.zig").ThumbInstrFn;
 | 
				
			|||||||
pub fn format14(comptime L: bool, comptime R: bool) InstrFn {
 | 
					pub fn format14(comptime L: bool, comptime R: bool) InstrFn {
 | 
				
			||||||
    return struct {
 | 
					    return struct {
 | 
				
			||||||
        fn inner(cpu: *Arm7tdmi, bus: *Bus, opcode: u16) void {
 | 
					        fn inner(cpu: *Arm7tdmi, bus: *Bus, opcode: u16) void {
 | 
				
			||||||
            const count = countRlist(opcode);
 | 
					            const count = @boolToInt(R) + countRlist(opcode);
 | 
				
			||||||
            const start = cpu.r[13] - if (!L) 4 * (@boolToInt(R) + count) else 0;
 | 
					            const start = cpu.r[13] - if (!L) count * 4 else 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var end = cpu.r[13];
 | 
					            var end = cpu.r[13];
 | 
				
			||||||
            if (L) {
 | 
					            if (L) {
 | 
				
			||||||
                end += 4 * (@boolToInt(R) + count);
 | 
					                end += count * 4;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                end -= 4;
 | 
					                end -= 4;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -40,7 +40,7 @@ pub fn format14(comptime L: bool, comptime R: bool) InstrFn {
 | 
				
			|||||||
                address += 4;
 | 
					                address += 4;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            cpu.r[13] = if (L) end else cpu.r[13] - 4 * (@boolToInt(R) + count);
 | 
					            cpu.r[13] = if (L) end else start;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }.inner;
 | 
					    }.inner;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user