Zesty - a pin-accurate, cycle-accurate NES emulator written in Zig
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103const std = @import("std");const zesty = @import("../zesty.zig");const assembler = @import("cpu/assembler.zig");
pub const assemble = assembler.assembleComptime;
test { _ = assembler; _ = @import("cpu/addressing.zig"); _ = @import("cpu/alu.zig"); _ = @import("cpu/control_flow.zig"); _ = @import("cpu/stack.zig"); _ = @import("cpu/undocumented.zig");}
//------------------------------------------------------// Test harnesses
pub const TestInit = struct { /// NMI vector nmi: u16 = 0x8000, /// RESET vector reset: u16 = 0x8000, /// IRQ/BRK vector irq: u16 = 0x8000,
/// Pre-run the reset sequence init_cpu: bool = true,
ram: []const struct { u16, []const u8 } = &.{}, rom: []const struct { u16, []const u8 } = &.{},};
pub fn testZes(opts: TestInit) zesty.Zesty { var cart: zesty.cartridge.Nrom128 = .{};
// NMI vector @memmove( cart.rom[0xfffa & 0x3fff ..][0..2], &std.mem.toBytes(std.mem.nativeToLittle(u16, opts.nmi)), ); // RESET vector @memmove( cart.rom[0xfffc & 0x3fff ..][0..2], &std.mem.toBytes(std.mem.nativeToLittle(u16, opts.reset)), ); // IRQ vector @memmove( cart.rom[0xfffe & 0x3fff ..][0..2], &std.mem.toBytes(std.mem.nativeToLittle(u16, opts.irq)), );
for (opts.rom) |v| { const offset, const bytes = v; @memmove(cart.rom[offset & 0x3fff ..][0..bytes.len], bytes); } var z: zesty.Zesty = .init(.top_loader_ntsc); z.cart = .{ .nrom128 = cart };
for (opts.ram) |v| { const offset, const bytes = v; @memmove(z.ram[offset & 0x7ff ..][0..bytes.len], bytes); }
if (opts.init_cpu) while (!z.cpu.sync) z.stepCpu();
return z;}
pub fn run(z: *zesty.Zesty) void { z.stepCpu(); while (!z.cpu.sync) z.stepCpu();}
pub fn runDebug(z: *zesty.Zesty) void { z.stepCpu(); debug(z); while (!z.cpu.sync) { z.stepCpu(); debug(z); }}
pub fn debug(z: *zesty.Zesty) void { std.debug.print( "#{} addr:{X:04} data:{X:02} {c} pc:{X:04} a:{X:02} x:{X:02} y:{X:02} sp:{X:02} ir:{X:02} {f}\n", .{ z.cpu.cycle -| 1, z.pins.cpu_addr, z.pins.cpu_data, @as(u8, if (z.pins.cpu_rw == .read) 'r' else 'w'), z.cpu.pc, z.cpu.a, z.cpu.x, z.cpu.y, z.cpu.sp, z.cpu.opcode, z.cpu.status, }, );}