Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Test raw PPU vblank timing when PPU rendering is off.
- TEST(ppu_off_vblank)
- {
- static const std::vector<uint8_t> program = {};
- auto emu = createTestEmulator(MapperType::NROM, 2, 1, 0, program);
- auto &ppu = emu->ppu(); // alias for brevity
- ppu.bus_read(IORegisters::PPUSTATUS); // reset latch
- ppu.bus_write(IORegisters::PPUCTRL, 0);
- ppu.bus_write(IORegisters::PPUMASK, 0);
- // Pre-flight check.
- TEST_EQUAL_INT(0, ppu.getFrame());
- TEST_EQUAL_INT(0, ppu.getOddFrame());
- TEST_EQUAL_INT(PreRenderScanline, ppu.getScanline());
- TEST_EQUAL_INT(0, ppu.getCycle());
- TEST_EQUAL_BYTE(0, ppu.getVBlank());
- TEST_EQUAL_INT(PpuState::PreRender, ppu.getState());
- // Process pre-render scanline, plus one tick to start rendering.
- for (int i = 0; i < 341; i++) {
- ppu.tick();
- }
- TEST_EQUAL_INT(0, ppu.getFrame());
- TEST_EQUAL_INT(0, ppu.getOddFrame());
- TEST_EQUAL_INT(FirstRenderScanline, ppu.getScanline());
- TEST_EQUAL_INT(0, ppu.getCycle());
- TEST_EQUAL_BYTE(0, ppu.getVBlank());
- TEST_EQUAL_INT(PpuState::Render, ppu.getState());
- // Get through render scanlines.
- for (int i = 0; i < 341 * 240; i++) {
- ppu.tick();
- }
- TEST_EQUAL_INT(0, ppu.getFrame());
- TEST_EQUAL_INT(0, ppu.getOddFrame());
- TEST_EQUAL_INT(PostRenderScanline, ppu.getScanline());
- TEST_EQUAL_INT(0, ppu.getCycle());
- TEST_EQUAL_BYTE(0, ppu.getVBlank());
- TEST_EQUAL_INT(PpuState::PostRender, ppu.getState());
- // PostRender scanline.
- for (int i = 0; i < 341; i++) {
- ppu.tick();
- }
- TEST_EQUAL_INT(0, ppu.getFrame());
- TEST_EQUAL_INT(0, ppu.getOddFrame());
- TEST_EQUAL_INT(FirstVBlankScanline, ppu.getScanline());
- TEST_EQUAL_INT(0, ppu.getCycle());
- TEST_EQUAL_BYTE(0, ppu.getVBlank());
- TEST_EQUAL_INT(PpuState::VBlank, ppu.getState());
- // Next tick is right before VBLank on.
- ppu.tick();
- TEST_EQUAL_BYTE(0, ppu.getVBlank());
- // Next tick should turn VBlank on.
- ppu.tick();
- TEST_EQUAL_BYTE(1, ppu.getVBlank());
- // Finish vblank period.
- for (int i = 0; i < 339 + 341 * 19; i++) {
- ppu.tick();
- }
- TEST_EQUAL_INT(1, ppu.getFrame());
- TEST_EQUAL_INT(1, ppu.getOddFrame());
- TEST_EQUAL_INT(PreRenderScanline, ppu.getScanline());
- TEST_EQUAL_INT(0, ppu.getCycle());
- TEST_EQUAL_BYTE(1, ppu.getVBlank());
- TEST_EQUAL_INT(PpuState::PreRender, ppu.getState());
- // Cycle #0 of pre-render does not touch vblank, but cycle #1 does.
- ppu.tick();
- TEST_EQUAL_BYTE(1, ppu.getVBlank());
- // Next tick should turn VBlank off.
- ppu.tick();
- TEST_EQUAL_BYTE(0, ppu.getVBlank());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement