fix: Arm32 should represent generic, not pointer to generic
				
					
				
			This commit is contained in:
		| @@ -1,8 +1,8 @@ | |||||||
| pub fn blockDataTransfer(comptime InstrFn: type, comptime P: bool, comptime U: bool, comptime S: bool, comptime W: bool, comptime L: bool) InstrFn { | pub fn blockDataTransfer(comptime InstrFn: type, comptime P: bool, comptime U: bool, comptime S: bool, comptime W: bool, comptime L: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rn: u4 = @truncate(opcode >> 16 & 0xF); |             const rn: u4 = @truncate(opcode >> 16 & 0xF); | ||||||
|             const rlist = opcode & 0xFFFF; |             const rlist = opcode & 0xFFFF; | ||||||
|             const r15 = rlist >> 15 & 1 == 1; |             const r15 = rlist >> 15 & 1 == 1; | ||||||
| @@ -78,7 +78,7 @@ pub fn blockDataTransfer(comptime InstrFn: type, comptime P: bool, comptime U: b | |||||||
|             if (W and L and rlist >> rn & 1 == 0) cpu.r[rn] = new_base; |             if (W and L and rlist >> rn & 1 == 0) cpu.r[rn] = new_base; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         fn transfer(cpu: Arm32, r15_present: bool, i: u5, address: u32) void { |         fn transfer(cpu: *Arm32, r15_present: bool, i: u5, address: u32) void { | ||||||
|             if (L) { |             if (L) { | ||||||
|                 if (S and !r15_present) { |                 if (S and !r15_present) { | ||||||
|                     // Always Transfer User mode Registers |                     // Always Transfer User mode Registers | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| const sext = @import("zba-util").sext; | const sext = @import("zba-util").sext; | ||||||
|  |  | ||||||
| pub fn branch(comptime InstrFn: type, comptime L: bool) InstrFn { | pub fn branch(comptime InstrFn: type, comptime L: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             if (L) cpu.r[14] = cpu.r[15] - 4; |             if (L) cpu.r[14] = cpu.r[15] - 4; | ||||||
|  |  | ||||||
|             cpu.r[15] +%= sext(u32, u24, opcode) << 2; |             cpu.r[15] +%= sext(u32, u24, opcode) << 2; | ||||||
| @@ -14,10 +14,10 @@ pub fn branch(comptime InstrFn: type, comptime L: bool) InstrFn { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn branchAndExchange(comptime InstrFn: type) InstrFn { | pub fn branchAndExchange(comptime InstrFn: type) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         pub fn inner(cpu: Arm32, opcode: u32) void { |         pub fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rn = opcode & 0xF; |             const rn = opcode & 0xF; | ||||||
|  |  | ||||||
|             const thumb = cpu.r[rn] & 1 == 1; |             const thumb = cpu.r[rn] & 1 == 1; | ||||||
|   | |||||||
| @@ -8,10 +8,10 @@ pub fn dataTransfer(comptime InstrFn: type, comptime P: bool, comptime U: bool, | |||||||
|     _ = N; |     _ = N; | ||||||
|     _ = U; |     _ = U; | ||||||
|     _ = P; |     _ = P; | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             _ = cpu; |             _ = cpu; | ||||||
|  |  | ||||||
|             log.err("TODO: handle 0x{X:0>8} which is a coprocessor data transfer instr", .{opcode}); |             log.err("TODO: handle 0x{X:0>8} which is a coprocessor data transfer instr", .{opcode}); | ||||||
| @@ -23,10 +23,10 @@ pub fn registerTransfer(comptime InstrFn: type, comptime opcode1: u3, comptime L | |||||||
|     _ = opcode2; |     _ = opcode2; | ||||||
|     _ = L; |     _ = L; | ||||||
|     _ = opcode1; |     _ = opcode1; | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             _ = cpu; |             _ = cpu; | ||||||
|  |  | ||||||
|             log.err("TODO: handle 0x{X:0>8} which is a coprocessor register transfer instr", .{opcode}); |             log.err("TODO: handle 0x{X:0>8} which is a coprocessor register transfer instr", .{opcode}); | ||||||
| @@ -37,10 +37,10 @@ pub fn registerTransfer(comptime InstrFn: type, comptime opcode1: u3, comptime L | |||||||
| pub fn dataProcessing(comptime InstrFn: type, comptime opcode1: u4, comptime opcode2: u3) InstrFn { | pub fn dataProcessing(comptime InstrFn: type, comptime opcode1: u4, comptime opcode2: u3) InstrFn { | ||||||
|     _ = opcode2; |     _ = opcode2; | ||||||
|     _ = opcode1; |     _ = opcode1; | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             _ = cpu; |             _ = cpu; | ||||||
|  |  | ||||||
|             log.err("TODO: handle 0x{X:0>8} which is a coprocessor data processing instr", .{opcode}); |             log.err("TODO: handle 0x{X:0>8} which is a coprocessor data processing instr", .{opcode}); | ||||||
|   | |||||||
| @@ -2,10 +2,10 @@ const exec = @import("../barrel_shifter.zig").exec; | |||||||
| const ror = @import("../barrel_shifter.zig").ror; | const ror = @import("../barrel_shifter.zig").ror; | ||||||
|  |  | ||||||
| pub fn dataProcessing(comptime InstrFn: type, comptime I: bool, comptime S: bool, comptime kind: u4) InstrFn { | pub fn dataProcessing(comptime InstrFn: type, comptime I: bool, comptime S: bool, comptime kind: u4) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rd: u4 = @truncate(opcode >> 12 & 0xF); |             const rd: u4 = @truncate(opcode >> 12 & 0xF); | ||||||
|             const rn = opcode >> 16 & 0xF; |             const rn = opcode >> 16 & 0xF; | ||||||
|             const old_carry = @intFromBool(cpu.cpsr.c.read()); |             const old_carry = @intFromBool(cpu.cpsr.c.read()); | ||||||
| @@ -152,7 +152,7 @@ pub fn dataProcessing(comptime InstrFn: type, comptime I: bool, comptime S: bool | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         fn undefinedTestBehaviour(cpu: Arm32) void { |         fn undefinedTestBehaviour(cpu: *Arm32) void { | ||||||
|             @setCold(true); |             @setCold(true); | ||||||
|             cpu.setCpsr(cpu.spsr.raw); |             cpu.setCpsr(cpu.spsr.raw); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -2,10 +2,10 @@ const sext = @import("zba-util").sext; | |||||||
| const rotr = @import("zba-util").rotr; | const rotr = @import("zba-util").rotr; | ||||||
|  |  | ||||||
| pub fn halfAndSignedDataTransfer(comptime InstrFn: type, comptime P: bool, comptime U: bool, comptime I: bool, comptime W: bool, comptime L: bool) InstrFn { | pub fn halfAndSignedDataTransfer(comptime InstrFn: type, comptime P: bool, comptime U: bool, comptime I: bool, comptime W: bool, comptime L: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rn = opcode >> 16 & 0xF; |             const rn = opcode >> 16 & 0xF; | ||||||
|             const rd = opcode >> 12 & 0xF; |             const rd = opcode >> 12 & 0xF; | ||||||
|             const rm = opcode & 0xF; |             const rm = opcode & 0xF; | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| pub fn multiply(comptime InstrFn: type, comptime A: bool, comptime S: bool) InstrFn { | pub fn multiply(comptime InstrFn: type, comptime A: bool, comptime S: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rd = opcode >> 16 & 0xF; |             const rd = opcode >> 16 & 0xF; | ||||||
|             const rn = opcode >> 12 & 0xF; |             const rn = opcode >> 12 & 0xF; | ||||||
|             const rs = opcode >> 8 & 0xF; |             const rs = opcode >> 8 & 0xF; | ||||||
| @@ -22,10 +22,10 @@ pub fn multiply(comptime InstrFn: type, comptime A: bool, comptime S: bool) Inst | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn multiplyLong(comptime InstrFn: type, comptime U: bool, comptime A: bool, comptime S: bool) InstrFn { | pub fn multiplyLong(comptime InstrFn: type, comptime U: bool, comptime A: bool, comptime S: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rd_hi = opcode >> 16 & 0xF; |             const rd_hi = opcode >> 16 & 0xF; | ||||||
|             const rd_lo = opcode >> 12 & 0xF; |             const rd_lo = opcode >> 12 & 0xF; | ||||||
|             const rs = opcode >> 8 & 0xF; |             const rs = opcode >> 8 & 0xF; | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ const log = std.log.scoped(.PsrTransfer); | |||||||
| const rotr = @import("zba-util").rotr; | const rotr = @import("zba-util").rotr; | ||||||
|  |  | ||||||
| pub fn psrTransfer(comptime InstrFn: type, comptime I: bool, comptime R: bool, comptime kind: u2) InstrFn { | pub fn psrTransfer(comptime InstrFn: type, comptime I: bool, comptime R: bool, comptime kind: u2) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             switch (kind) { |             switch (kind) { | ||||||
|                 0b00 => { |                 0b00 => { | ||||||
|                     // MRS |                     // MRS | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| const rotr = @import("zba-util").rotr; | const rotr = @import("zba-util").rotr; | ||||||
|  |  | ||||||
| pub fn singleDataSwap(comptime InstrFn: type, comptime B: bool) InstrFn { | pub fn singleDataSwap(comptime InstrFn: type, comptime B: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rn = opcode >> 16 & 0xF; |             const rn = opcode >> 16 & 0xF; | ||||||
|             const rd = opcode >> 12 & 0xF; |             const rd = opcode >> 12 & 0xF; | ||||||
|             const rm = opcode & 0xF; |             const rm = opcode & 0xF; | ||||||
|   | |||||||
| @@ -3,10 +3,10 @@ const shifter = @import("../barrel_shifter.zig"); | |||||||
| const rotr = @import("zba-util").rotr; | const rotr = @import("zba-util").rotr; | ||||||
|  |  | ||||||
| pub fn singleDataTransfer(comptime InstrFn: type, comptime I: bool, comptime P: bool, comptime U: bool, comptime B: bool, comptime W: bool, comptime L: bool) InstrFn { | pub fn singleDataTransfer(comptime InstrFn: type, comptime I: bool, comptime P: bool, comptime U: bool, comptime B: bool, comptime W: bool, comptime L: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u32) void { |         fn inner(cpu: *Arm32, opcode: u32) void { | ||||||
|             const rn = opcode >> 16 & 0xF; |             const rn = opcode >> 16 & 0xF; | ||||||
|             const rd = opcode >> 12 & 0xF; |             const rd = opcode >> 12 & 0xF; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| pub fn armSoftwareInterrupt(comptime InstrFn: type) InstrFn { | pub fn armSoftwareInterrupt(comptime InstrFn: type) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, _: u32) void { |         fn inner(cpu: *Arm32, _: u32) void { | ||||||
|             // Copy Values from Current Mode |             // Copy Values from Current Mode | ||||||
|             const ret_addr = cpu.r[15] - 4; |             const ret_addr = cpu.r[15] - 4; | ||||||
|             const cpsr = cpu.cpsr.raw; |             const cpsr = cpu.cpsr.raw; | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ const asr = @import("../barrel_shifter.zig").asr; | |||||||
| const ror = @import("../barrel_shifter.zig").ror; | const ror = @import("../barrel_shifter.zig").ror; | ||||||
|  |  | ||||||
| pub fn fmt4(comptime InstrFn: type, comptime op: u4) InstrFn { | pub fn fmt4(comptime InstrFn: type, comptime op: u4) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const rs = opcode >> 3 & 0x7; |             const rs = opcode >> 3 & 0x7; | ||||||
|             const rd = opcode & 0x7; |             const rd = opcode & 0x7; | ||||||
|             const carry = @intFromBool(cpu.cpsr.c.read()); |             const carry = @intFromBool(cpu.cpsr.c.read()); | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| pub fn fmt14(comptime InstrFn: type, comptime L: bool, comptime R: bool) InstrFn { | pub fn fmt14(comptime InstrFn: type, comptime L: bool, comptime R: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const count = @intFromBool(R) + countRlist(opcode); |             const count = @intFromBool(R) + countRlist(opcode); | ||||||
|             const start = cpu.r[13] - if (!L) count * 4 else 0; |             const start = cpu.r[13] - if (!L) count * 4 else 0; | ||||||
|  |  | ||||||
| @@ -45,10 +45,10 @@ pub fn fmt14(comptime InstrFn: type, comptime L: bool, comptime R: bool) InstrFn | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt15(comptime InstrFn: type, comptime L: bool, comptime rb: u3) InstrFn { | pub fn fmt15(comptime InstrFn: type, comptime L: bool, comptime rb: u3) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             var address = cpu.r[rb]; |             var address = cpu.r[rb]; | ||||||
|             const end_address = cpu.r[rb] + 4 * countRlist(opcode); |             const end_address = cpu.r[rb] + 4 * countRlist(opcode); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,10 @@ | |||||||
| const sext = @import("zba-util").sext; | const sext = @import("zba-util").sext; | ||||||
|  |  | ||||||
| pub fn fmt16(comptime InstrFn: type, comptime cond: u4) InstrFn { | pub fn fmt16(comptime InstrFn: type, comptime cond: u4) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             // B |             // B | ||||||
|             if (cond == 0xE or cond == 0xF) |             if (cond == 0xE or cond == 0xF) | ||||||
|                 cpu.panic("[CPU/THUMB.16] Undefined conditional branch with condition {}", .{cond}); |                 cpu.panic("[CPU/THUMB.16] Undefined conditional branch with condition {}", .{cond}); | ||||||
| @@ -18,11 +18,11 @@ pub fn fmt16(comptime InstrFn: type, comptime cond: u4) InstrFn { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt18(comptime InstrFn: type) InstrFn { | pub fn fmt18(comptime InstrFn: type) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         // B but conditional |         // B but conditional | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             cpu.r[15] +%= sext(u32, u11, opcode & 0x7FF) << 1; |             cpu.r[15] +%= sext(u32, u11, opcode & 0x7FF) << 1; | ||||||
|             cpu.pipe.reload(cpu); |             cpu.pipe.reload(cpu); | ||||||
|         } |         } | ||||||
| @@ -30,10 +30,10 @@ pub fn fmt18(comptime InstrFn: type) InstrFn { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt19(comptime InstrFn: type, comptime is_low: bool) InstrFn { | pub fn fmt19(comptime InstrFn: type, comptime is_low: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             // BL |             // BL | ||||||
|             const offset = opcode & 0x7FF; |             const offset = opcode & 0x7FF; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,10 +5,10 @@ const lsr = @import("../barrel_shifter.zig").lsr; | |||||||
| const asr = @import("../barrel_shifter.zig").asr; | const asr = @import("../barrel_shifter.zig").asr; | ||||||
|  |  | ||||||
| pub fn fmt1(comptime InstrFn: type, comptime op: u2, comptime offset: u5) InstrFn { | pub fn fmt1(comptime InstrFn: type, comptime op: u2, comptime offset: u5) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const rs = opcode >> 3 & 0x7; |             const rs = opcode >> 3 & 0x7; | ||||||
|             const rd = opcode & 0x7; |             const rd = opcode & 0x7; | ||||||
|  |  | ||||||
| @@ -53,10 +53,10 @@ pub fn fmt1(comptime InstrFn: type, comptime op: u2, comptime offset: u5) InstrF | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt5(comptime InstrFn: type, comptime op: u2, comptime h1: u1, comptime h2: u1) InstrFn { | pub fn fmt5(comptime InstrFn: type, comptime op: u2, comptime h1: u1, comptime h2: u1) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const rs = @as(u4, h2) << 3 | (opcode >> 3 & 0x7); |             const rs = @as(u4, h2) << 3 | (opcode >> 3 & 0x7); | ||||||
|             const rd = @as(u4, h1) << 3 | (opcode & 0x7); |             const rd = @as(u4, h1) << 3 | (opcode & 0x7); | ||||||
|  |  | ||||||
| @@ -108,10 +108,10 @@ pub fn fmt5(comptime InstrFn: type, comptime op: u2, comptime h1: u1, comptime h | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt2(comptime InstrFn: type, comptime I: bool, is_sub: bool, rn: u3) InstrFn { | pub fn fmt2(comptime InstrFn: type, comptime I: bool, is_sub: bool, rn: u3) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const rs = opcode >> 3 & 0x7; |             const rs = opcode >> 3 & 0x7; | ||||||
|             const rd: u3 = @truncate(opcode); |             const rd: u3 = @truncate(opcode); | ||||||
|             const op1 = cpu.r[rs]; |             const op1 = cpu.r[rs]; | ||||||
| @@ -142,10 +142,10 @@ pub fn fmt2(comptime InstrFn: type, comptime I: bool, is_sub: bool, rn: u3) Inst | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt3(comptime InstrFn: type, comptime op: u2, comptime rd: u3) InstrFn { | pub fn fmt3(comptime InstrFn: type, comptime op: u2, comptime rd: u3) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const op1 = cpu.r[rd]; |             const op1 = cpu.r[rd]; | ||||||
|             const op2: u32 = opcode & 0xFF; // Offset |             const op2: u32 = opcode & 0xFF; // Offset | ||||||
|  |  | ||||||
| @@ -182,10 +182,10 @@ pub fn fmt3(comptime InstrFn: type, comptime op: u2, comptime rd: u3) InstrFn { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt12(comptime InstrFn: type, comptime isSP: bool, comptime rd: u3) InstrFn { | pub fn fmt12(comptime InstrFn: type, comptime isSP: bool, comptime rd: u3) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             // ADD |             // ADD | ||||||
|             const left = if (isSP) cpu.r[13] else cpu.r[15] & ~@as(u32, 2); |             const left = if (isSP) cpu.r[13] else cpu.r[15] & ~@as(u32, 2); | ||||||
|             const right = (opcode & 0xFF) << 2; |             const right = (opcode & 0xFF) << 2; | ||||||
| @@ -195,10 +195,10 @@ pub fn fmt12(comptime InstrFn: type, comptime isSP: bool, comptime rd: u3) Instr | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt13(comptime InstrFn: type, comptime S: bool) InstrFn { | pub fn fmt13(comptime InstrFn: type, comptime S: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             // ADD |             // ADD | ||||||
|             const offset = (opcode & 0x7F) << 2; |             const offset = (opcode & 0x7F) << 2; | ||||||
|             cpu.r[13] = if (S) cpu.r[13] - offset else cpu.r[13] + offset; |             cpu.r[13] = if (S) cpu.r[13] - offset else cpu.r[13] + offset; | ||||||
|   | |||||||
| @@ -2,10 +2,10 @@ const rotr = @import("zba-util").rotr; | |||||||
| const sext = @import("zba-util").sext; | const sext = @import("zba-util").sext; | ||||||
|  |  | ||||||
| pub fn fmt6(comptime InstrFn: type, comptime rd: u3) InstrFn { | pub fn fmt6(comptime InstrFn: type, comptime rd: u3) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             // LDR |             // LDR | ||||||
|             const offset = (opcode & 0xFF) << 2; |             const offset = (opcode & 0xFF) << 2; | ||||||
|  |  | ||||||
| @@ -16,10 +16,10 @@ pub fn fmt6(comptime InstrFn: type, comptime rd: u3) InstrFn { | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt78(comptime InstrFn: type, comptime op: u2, comptime T: bool) InstrFn { | pub fn fmt78(comptime InstrFn: type, comptime op: u2, comptime T: bool) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const ro = opcode >> 6 & 0x7; |             const ro = opcode >> 6 & 0x7; | ||||||
|             const rb = opcode >> 3 & 0x7; |             const rb = opcode >> 3 & 0x7; | ||||||
|             const rd = opcode & 0x7; |             const rd = opcode & 0x7; | ||||||
| @@ -81,10 +81,10 @@ pub fn fmt78(comptime InstrFn: type, comptime op: u2, comptime T: bool) InstrFn | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt9(comptime InstrFn: type, comptime B: bool, comptime L: bool, comptime offset: u5) InstrFn { | pub fn fmt9(comptime InstrFn: type, comptime B: bool, comptime L: bool, comptime offset: u5) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const rb = opcode >> 3 & 0x7; |             const rb = opcode >> 3 & 0x7; | ||||||
|             const rd = opcode & 0x7; |             const rd = opcode & 0x7; | ||||||
|  |  | ||||||
| @@ -117,10 +117,10 @@ pub fn fmt9(comptime InstrFn: type, comptime B: bool, comptime L: bool, comptime | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt10(comptime InstrFn: type, comptime L: bool, comptime offset: u5) InstrFn { | pub fn fmt10(comptime InstrFn: type, comptime L: bool, comptime offset: u5) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const rb = opcode >> 3 & 0x7; |             const rb = opcode >> 3 & 0x7; | ||||||
|             const rd = opcode & 0x7; |             const rd = opcode & 0x7; | ||||||
|  |  | ||||||
| @@ -141,10 +141,10 @@ pub fn fmt10(comptime InstrFn: type, comptime L: bool, comptime offset: u5) Inst | |||||||
| } | } | ||||||
|  |  | ||||||
| pub fn fmt11(comptime InstrFn: type, comptime L: bool, comptime rd: u3) InstrFn { | pub fn fmt11(comptime InstrFn: type, comptime L: bool, comptime rd: u3) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, opcode: u16) void { |         fn inner(cpu: *Arm32, opcode: u16) void { | ||||||
|             const offset = (opcode & 0xFF) << 2; |             const offset = (opcode & 0xFF) << 2; | ||||||
|             const address = cpu.r[13] + offset; |             const address = cpu.r[13] + offset; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| pub fn fmt17(comptime InstrFn: type) InstrFn { | pub fn fmt17(comptime InstrFn: type) InstrFn { | ||||||
|     const Arm32 = @typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?; |     const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child; | ||||||
|  |  | ||||||
|     return struct { |     return struct { | ||||||
|         fn inner(cpu: Arm32, _: u16) void { |         fn inner(cpu: *Arm32, _: u16) void { | ||||||
|             // Copy Values from Current Mode |             // Copy Values from Current Mode | ||||||
|             const ret_addr = cpu.r[15] - 2; |             const ret_addr = cpu.r[15] - 2; | ||||||
|             const cpsr = cpu.cpsr.raw; |             const cpsr = cpu.cpsr.raw; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user