-
Notifications
You must be signed in to change notification settings - Fork 519
Description
A program can tell that it's running on PyBoy because the buttons always change right at vblank.
To reproduce:
- Install PyBoy
- Start the test ROM "Telling LYs?" (which I have precompiled for your convenience here)
- Press all 8 buttons in any order
- Watch the arrow sprite at the right side
Expect: Arrow moves after each press, followed by "Pass", as on a real GameBoy
Actual: Arrow stays at upper right of the screen, followed by an "Incorrect behavior" message that clearly isn't "Pass", as below:
The Game Boy emulator BGB by beware passes this test. Normally it changes the input on the first scanline of vertical blanking to reduce input latency. But if a program reads input multiple times during a frame, the emulator starts to randomize on which scanline the input changes. This way, the program can't discern that it's being emulated and freeze on a copy protection screen, but it adds one frame of lag. Once the program returns to polling once a frame, BGB returns to the low-latency behavior.
Related forum topic: https://forums.nesdev.com/viewtopic.php?f=20&t=18026
