Zesty - a pin-accurate, cycle-accurate NES emulator written in Zig
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697//! Stack-related tests.const std = @import("std");const cpu = @import("../cpu.zig");
test "PHA/PLA" { var z = cpu.testZes(.{ .rom = &.{ .{ 0x8000, cpu.assemble( \\LDA #$89 \\PHA \\LDA #0 \\PLA ), }, } }); cpu.run(&z); // Setup A register
try std.testing.expectEqual(0xfd, z.cpu.sp); cpu.run(&z); // PHA try std.testing.expectEqual(0xfc, z.cpu.sp); try std.testing.expectEqual(0x8003, z.cpu.pc); try std.testing.expectEqual(0x89, z.ram[0x1fd]); try std.testing.expect(z.cpu.status.negative); try std.testing.expect(!z.cpu.status.zero);
cpu.run(&z); // Reset A register try std.testing.expectEqual(0x8005, z.cpu.pc); try std.testing.expectEqual(0x00, z.cpu.a); try std.testing.expect(!z.cpu.status.negative); try std.testing.expect(z.cpu.status.zero);
cpu.run(&z); // PLA try std.testing.expectEqual(0x8006, z.cpu.pc); try std.testing.expectEqual(0x89, z.cpu.a); try std.testing.expectEqual(0xfd, z.cpu.sp); try std.testing.expect(z.cpu.status.negative); try std.testing.expect(!z.cpu.status.zero);}
test "PHP/PLP" { var z = cpu.testZes(.{ .rom = &.{ .{ 0x8000, cpu.assemble( \\CLI \\SED \\LDA #0 \\PHP \\ \\SEI \\CLD \\LDA #$ff \\PLP ), }, } });
// Prepare flags cpu.run(&z); // Clear I cpu.run(&z); // Set D cpu.run(&z); // Set Z try std.testing.expect(!z.cpu.status.negative); try std.testing.expect(z.cpu.status.zero); try std.testing.expect(z.cpu.status.decimal); try std.testing.expect(!z.cpu.status.irq_disabled);
try std.testing.expectEqual(0xfd, z.cpu.sp); cpu.run(&z); // PHP try std.testing.expectEqual(0xfc, z.cpu.sp);
try std.testing.expectEqual(0x8005, z.cpu.pc); try std.testing.expectEqual(0b00111010, z.ram[0x1fd]);
// Reset flags cpu.run(&z); // Set I cpu.run(&z); // Clear D cpu.run(&z); // Clear Z; Set N try std.testing.expect(z.cpu.status.negative); try std.testing.expect(!z.cpu.status.zero); try std.testing.expect(!z.cpu.status.decimal); try std.testing.expect(z.cpu.status.irq_disabled);
try std.testing.expectEqual(0xfc, z.cpu.sp); cpu.run(&z); // PLP try std.testing.expectEqual(0xfd, z.cpu.sp);
try std.testing.expectEqual(0x800a, z.cpu.pc);
// Check if flags are restored try std.testing.expect(!z.cpu.status.negative); try std.testing.expect(z.cpu.status.zero); try std.testing.expect(z.cpu.status.decimal); try std.testing.expect(!z.cpu.status.irq_disabled);
// BRK should not be restored. try std.testing.expect(!z.cpu.status.brk);}