add cpu register types, flags, and helper utilities
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
pub const Status = packed struct(u8) {
|
||||
carry: bool = false,
|
||||
zero: bool = false,
|
||||
interrupt_disable: bool = true,
|
||||
decimal: bool = false,
|
||||
break_command: bool = false,
|
||||
unused: bool = true,
|
||||
overflow: bool = false,
|
||||
negative: bool = false,
|
||||
|
||||
pub fn toByte(self: Status, break_set: bool) u8 {
|
||||
var copy = self;
|
||||
copy.break_command = break_set;
|
||||
copy.unused = true;
|
||||
return @bitCast(copy);
|
||||
}
|
||||
|
||||
pub fn fromByte(value: u8) Status {
|
||||
var status: Status = @bitCast(value);
|
||||
status.break_command = false;
|
||||
status.unused = true;
|
||||
return status;
|
||||
}
|
||||
};
|
||||
|
||||
pub const Registers = struct {
|
||||
a: u8 = 0,
|
||||
x: u8 = 0,
|
||||
y: u8 = 0,
|
||||
sp: u8 = 0xfd,
|
||||
pc: u16 = 0,
|
||||
status: Status = .{},
|
||||
|
||||
pub fn dumpRegisters(self: Registers) void {
|
||||
const std = @import("std");
|
||||
std.debug.print("A:{X:02} X:{X:02} Y:{X:02} SP:{X:02} PC:{X:04}\n", .{
|
||||
self.a, self.x, self.y, self.sp, self.pc,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
pub const Model = enum {
|
||||
mos6502,
|
||||
mos6507,
|
||||
mos6510,
|
||||
ricoh2a03,
|
||||
ricoh2a07,
|
||||
wdc65c02,
|
||||
r65c02,
|
||||
};
|
||||
@@ -0,0 +1,39 @@
|
||||
const std = @import("std");
|
||||
|
||||
pub inline fn packAddress(low: u8, high: u8) u16 {
|
||||
return @as(u16, low) | (@as(u16, high) << 8);
|
||||
}
|
||||
|
||||
pub inline fn unpackAddress(addr: u16) struct { low: u8, high: u8 } {
|
||||
return .{
|
||||
.low = @truncate(addr),
|
||||
.high = @truncate(addr >> 8),
|
||||
};
|
||||
}
|
||||
|
||||
pub inline fn makeWord(low: u8, high: u8) u16 {
|
||||
return @as(u16, low) | (@as(u16, high) << 8);
|
||||
}
|
||||
|
||||
pub fn addRelative(base: u16, offset: i8) u16 {
|
||||
const signed_offset: i16 = offset;
|
||||
const unsigned_offset: u16 = @bitCast(signed_offset);
|
||||
return base +% unsigned_offset;
|
||||
}
|
||||
|
||||
pub fn pageCrossed(base: u16, address: u16) bool {
|
||||
return (base & 0xff00) != (address & 0xff00);
|
||||
}
|
||||
|
||||
pub fn bitNumber(operation: anytype, first: anytype) u3 {
|
||||
return @intCast(@intFromEnum(operation) - @intFromEnum(first));
|
||||
}
|
||||
|
||||
pub fn validateBus(comptime Bus: type) void {
|
||||
if (!@hasDecl(Bus, "read")) {
|
||||
@compileError("Bus must define read(self: *Bus, address: u16) u8");
|
||||
}
|
||||
if (!@hasDecl(Bus, "write")) {
|
||||
@compileError("Bus must define write(self: *Bus, address: u16, value: u8) void");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
pub const m6502 = @import("m6502/root.zig");
|
||||
Reference in New Issue
Block a user