//! 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); }