···
0x01 => if (self.zpXInd(pins)) |_| self.ora(pins, v), // ORA (zp,X)
0x05 => if (self.zp(pins)) |_| self.ora(pins, v), // ORA zp
0x06 => if (self.zp(pins)) |_| self.asl(pins, .mem), // ASL zp
0x09 => if (self.imm(pins)) |_| self.ora(pins, v), // ORA #
0x0a => if (self.imm(pins)) |_| self.asl(pins, .acc), // ASL A
0x0d => if (self.abs(pins)) |_| self.ora(pins, v), // ORA abs
···
0x24 => if (self.zp(pins)) |_| self.bit(pins), // BIT zp
0x25 => if (self.zp(pins)) |_| self._and(pins, v), // AND zp
0x26 => if (self.zp(pins)) |_| self.rol(pins, .mem), // ROL zp
0x29 => if (self.imm(pins)) |_| self._and(pins, v), // AND #
0x2a => if (self.imm(pins)) |_| self.rol(pins, .acc), // ROL A
0x2c => if (self.abs(pins)) |_| self.bit(pins), // BIT abs
···
0x41 => if (self.zpXInd(pins)) |_| self.eor(pins, v), // EOR (zp,X)
0x45 => if (self.zp(pins)) |_| self.eor(pins, v), // EOR zp
0x46 => if (self.zp(pins)) |_| self.lsr(pins, .mem), // LSR zp
0x49 => if (self.imm(pins)) |_| self.eor(pins, v), // EOR #
0x4a => if (self.imm(pins)) |_| self.lsr(pins, .acc), // LSR A
0x4d => if (self.abs(pins)) |_| self.eor(pins, v), // EOR abs
···
0x61 => if (self.zpXInd(pins)) |_| self.adc(pins, v), // ADC (zp,X)
0x65 => if (self.zp(pins)) |_| self.adc(pins, v), // ADC zp
0x66 => if (self.zp(pins)) |_| self.ror(pins, .mem), // ROR zp
0x69 => if (self.imm(pins)) |_| self.adc(pins, v), // ADC #
0x6a => if (self.imm(pins)) |_| self.ror(pins, .acc), // ROR A
0x6d => if (self.abs(pins)) |_| self.adc(pins, v), // ADC abs
···
//------------------------------------------------------
-
// Opcodes: Load/Store & Arithmetic
-
const Dst = enum { acc, mem };
inline fn ld(self: *Cpu, pins: *zesty.Pins, to: *u8, from: u8) void {
···
inline fn ora(self: *Cpu, pins: *zesty.Pins, v: u8) void {
···
0x01 => if (self.zpXInd(pins)) |_| self.ora(pins, v), // ORA (zp,X)
0x05 => if (self.zp(pins)) |_| self.ora(pins, v), // ORA zp
0x06 => if (self.zp(pins)) |_| self.asl(pins, .mem), // ASL zp
+
0x08 => self.php(pins), // PHP
0x09 => if (self.imm(pins)) |_| self.ora(pins, v), // ORA #
0x0a => if (self.imm(pins)) |_| self.asl(pins, .acc), // ASL A
0x0d => if (self.abs(pins)) |_| self.ora(pins, v), // ORA abs
···
0x24 => if (self.zp(pins)) |_| self.bit(pins), // BIT zp
0x25 => if (self.zp(pins)) |_| self._and(pins, v), // AND zp
0x26 => if (self.zp(pins)) |_| self.rol(pins, .mem), // ROL zp
+
0x28 => self.plp(pins), // PLP
0x29 => if (self.imm(pins)) |_| self._and(pins, v), // AND #
0x2a => if (self.imm(pins)) |_| self.rol(pins, .acc), // ROL A
0x2c => if (self.abs(pins)) |_| self.bit(pins), // BIT abs
···
0x41 => if (self.zpXInd(pins)) |_| self.eor(pins, v), // EOR (zp,X)
0x45 => if (self.zp(pins)) |_| self.eor(pins, v), // EOR zp
0x46 => if (self.zp(pins)) |_| self.lsr(pins, .mem), // LSR zp
+
0x48 => self.pha(pins), // PHA
0x49 => if (self.imm(pins)) |_| self.eor(pins, v), // EOR #
0x4a => if (self.imm(pins)) |_| self.lsr(pins, .acc), // LSR A
0x4d => if (self.abs(pins)) |_| self.eor(pins, v), // EOR abs
···
0x61 => if (self.zpXInd(pins)) |_| self.adc(pins, v), // ADC (zp,X)
0x65 => if (self.zp(pins)) |_| self.adc(pins, v), // ADC zp
0x66 => if (self.zp(pins)) |_| self.ror(pins, .mem), // ROR zp
+
0x68 => self.pla(pins), // PLA
0x69 => if (self.imm(pins)) |_| self.adc(pins, v), // ADC #
0x6a => if (self.imm(pins)) |_| self.ror(pins, .acc), // ROR A
0x6d => if (self.abs(pins)) |_| self.adc(pins, v), // ADC abs
···
//------------------------------------------------------
inline fn ld(self: *Cpu, pins: *zesty.Pins, to: *u8, from: u8) void {
···
+
inline fn push(self: *Cpu, pins: *zesty.Pins, v: u8) void {
+
0 => pins.cpu_addr = self.pc,
+
self.hilo = .stack(self.sp);
+
pins.cpu_addr = @bitCast(self.hilo);
+
else => self.fetch(pins),
+
inline fn pull(self: *Cpu, pins: *zesty.Pins) ?u8 {
+
0 => pins.cpu_addr = self.pc,
+
self.hilo = .stack(self.sp);
+
pins.cpu_addr = @bitCast(self.hilo);
+
self.hilo = .stack(self.sp);
+
pins.cpu_addr = @bitCast(self.hilo);
+
inline fn pha(self: *Cpu, pins: *zesty.Pins) void {
+
self.push(pins, self.a);
+
inline fn php(self: *Cpu, pins: *zesty.Pins) void {
+
var status = self.status;
+
// BRK is always set to true here
+
self.push(pins, status.toByte());
+
inline fn pla(self: *Cpu, pins: *zesty.Pins) void {
+
self.a = self.pull(pins) orelse return;
+
inline fn plp(self: *Cpu, pins: *zesty.Pins) void {
+
const status: Status = .from(self.pull(pins) orelse return);
+
.negative = status.negative,
+
.overflow = status.overflow,
+
.brk = self.status.brk, // Do not inherit BRK.
+
.decimal = status.decimal,
+
.irq_disabled = status.irq_disabled,
+
//------------------------------------------------------
+
const Dst = enum { acc, mem };
inline fn ora(self: *Cpu, pins: *zesty.Pins, v: u8) void {