Zesty - a pin-accurate, cycle-accurate NES emulator written in Zig
at main 96 lines 2.9 kB view raw
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}