need two CRTC frames per TV frame* because this is the easiest way of ensuring that there are exactly 312 lines between VSyncs, while inserting extra scanlines (via CRTC R5) to change the offset of the top border. The advantage of this is that it allows a static screen area underneath the scrolled part (with an different R5, making the total extra scanlines up to
which you can use for score etc.
The screen blanking to keep the top border looking static is a different (cosmetic) issue, which requires a different interrupt.
Haven't quite followed what you were saying there, but do make sure that you're outputting 312 lines between VSyncs, because some monitors will roll and do crazy things if you don't (although a modern TFT is probably fine with it).
* You don't actually
need two CRTC frames: you can do it the way Firetrack does it, which is to compensate for the extra scanlines at the end of the top border by using careful timing to add extra scanlines into a character row in the bottom border, so that they add up to a multiple of 8 by VSync. But that's far trickier timing, and won't give you a nice static area at the bottom.
Looks lovely by the way - really great project!