Zesty - a pin-accurate, cycle-accurate NES emulator written in Zig
1//! Stack-related tests.
2const std = @import("std");
3const cpu = @import("../cpu.zig");
4
5test "PHA/PLA" {
6 var z = cpu.testZes(.{ .rom = &.{
7 .{
8 0x8000, cpu.assemble(
9 \\LDA #$89
10 \\PHA
11 \\LDA #0
12 \\PLA
13 ),
14 },
15 } });
16 cpu.run(&z); // Setup A register
17
18 try std.testing.expectEqual(0xfd, z.cpu.sp);
19 cpu.run(&z); // PHA
20 try std.testing.expectEqual(0xfc, z.cpu.sp);
21 try std.testing.expectEqual(0x8003, z.cpu.pc);
22 try std.testing.expectEqual(0x89, z.ram[0x1fd]);
23 try std.testing.expect(z.cpu.status.negative);
24 try std.testing.expect(!z.cpu.status.zero);
25
26 cpu.run(&z); // Reset A register
27 try std.testing.expectEqual(0x8005, z.cpu.pc);
28 try std.testing.expectEqual(0x00, z.cpu.a);
29 try std.testing.expect(!z.cpu.status.negative);
30 try std.testing.expect(z.cpu.status.zero);
31
32 cpu.run(&z); // PLA
33 try std.testing.expectEqual(0x8006, z.cpu.pc);
34 try std.testing.expectEqual(0x89, z.cpu.a);
35 try std.testing.expectEqual(0xfd, z.cpu.sp);
36 try std.testing.expect(z.cpu.status.negative);
37 try std.testing.expect(!z.cpu.status.zero);
38}
39
40test "PHP/PLP" {
41 var z = cpu.testZes(.{ .rom = &.{
42 .{
43 0x8000, cpu.assemble(
44 \\CLI
45 \\SED
46 \\LDA #0
47 \\PHP
48 \\
49 \\SEI
50 \\CLD
51 \\LDA #$ff
52 \\PLP
53 ),
54 },
55 } });
56
57 // Prepare flags
58 cpu.run(&z); // Clear I
59 cpu.run(&z); // Set D
60 cpu.run(&z); // Set Z
61 try std.testing.expect(!z.cpu.status.negative);
62 try std.testing.expect(z.cpu.status.zero);
63 try std.testing.expect(z.cpu.status.decimal);
64 try std.testing.expect(!z.cpu.status.irq_disabled);
65
66 try std.testing.expectEqual(0xfd, z.cpu.sp);
67 cpu.run(&z); // PHP
68 try std.testing.expectEqual(0xfc, z.cpu.sp);
69
70 try std.testing.expectEqual(0x8005, z.cpu.pc);
71 try std.testing.expectEqual(0b00111010, z.ram[0x1fd]);
72
73 // Reset flags
74 cpu.run(&z); // Set I
75 cpu.run(&z); // Clear D
76 cpu.run(&z); // Clear Z; Set N
77 try std.testing.expect(z.cpu.status.negative);
78 try std.testing.expect(!z.cpu.status.zero);
79 try std.testing.expect(!z.cpu.status.decimal);
80 try std.testing.expect(z.cpu.status.irq_disabled);
81
82 try std.testing.expectEqual(0xfc, z.cpu.sp);
83 cpu.run(&z); // PLP
84 try std.testing.expectEqual(0xfd, z.cpu.sp);
85
86 try std.testing.expectEqual(0x800a, z.cpu.pc);
87
88 // Check if flags are restored
89 try std.testing.expect(!z.cpu.status.negative);
90 try std.testing.expect(z.cpu.status.zero);
91 try std.testing.expect(z.cpu.status.decimal);
92 try std.testing.expect(!z.cpu.status.irq_disabled);
93
94 // BRK should not be restored.
95 try std.testing.expect(!z.cpu.status.brk);
96}