50 lines
1.5 KiB
Zig
50 lines
1.5 KiB
Zig
const std = @import("std");
|
|
|
|
const log = std.log.scoped(.coprocessor_handler);
|
|
|
|
pub fn dataTransfer(comptime InstrFn: type, comptime P: bool, comptime U: bool, comptime N: bool, comptime W: bool, comptime L: bool) InstrFn {
|
|
_ = L;
|
|
_ = W;
|
|
_ = N;
|
|
_ = U;
|
|
_ = P;
|
|
const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child;
|
|
|
|
return struct {
|
|
fn inner(cpu: *Arm32, opcode: u32) void {
|
|
_ = cpu;
|
|
|
|
log.err("TODO: handle 0x{X:0>8} which is a coprocessor data transfer instr", .{opcode});
|
|
}
|
|
}.inner;
|
|
}
|
|
|
|
pub fn registerTransfer(comptime InstrFn: type, comptime opcode1: u3, comptime L: bool, comptime opcode2: u3) InstrFn {
|
|
_ = opcode2;
|
|
_ = L;
|
|
_ = opcode1;
|
|
const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child;
|
|
|
|
return struct {
|
|
fn inner(cpu: *Arm32, opcode: u32) void {
|
|
_ = cpu;
|
|
|
|
log.err("TODO: handle 0x{X:0>8} which is a coprocessor register transfer instr", .{opcode});
|
|
}
|
|
}.inner;
|
|
}
|
|
|
|
pub fn dataProcessing(comptime InstrFn: type, comptime opcode1: u4, comptime opcode2: u3) InstrFn {
|
|
_ = opcode2;
|
|
_ = opcode1;
|
|
const Arm32 = @typeInfo(@typeInfo(@typeInfo(InstrFn).Pointer.child).Fn.params[0].type.?).Pointer.child;
|
|
|
|
return struct {
|
|
fn inner(cpu: *Arm32, opcode: u32) void {
|
|
_ = cpu;
|
|
|
|
log.err("TODO: handle 0x{X:0>8} which is a coprocessor data processing instr", .{opcode});
|
|
}
|
|
}.inner;
|
|
}
|