Regarding VBLANK, it is different between the IIe, IIc and IIgs.
In the IIe, and IIgs, you can just read the high-bit of $c019, but be aware that the meaning is INVERTED between these two machines. This is easy enough to deal with.
In the IIc, things are totally different. $c019 represents the VBL interrupt state. Basically, what you need to do on a IIc is set up a VBL interrupt. You can do this by directly setting up a low-level interrupt, or using the ProDOS MLI calls to add an interrupt handler.
For Flapple Bird (Flappy Bird on Apple II), I have code that handles all 3 VBLANK types. You can check out the code that does it here:
https://github.com/digarok/flapple/blob/master/src/flapple.s The "DetectMachine" function sets up the normal VBLANK detection for either IIe or IIgs, then it calls InitVBlank which checks for a IIc, and if true then it installs a VBL int handler and starts the VBL interrupts firing.
I don't know why they made this so wonky and why the engineers decided to screw with VBLANK on each successive machine release. Unfortunately, I think most software developers ended up not really using VBLANK in games because it's nearly impossible to do anything meaningful graphically with the amount of time you have, the speed of the processor and no graphics hardware. In Flapple Bird, I made a conscious decision to trade fidelity (using a lower resolution mode) for speed (60 FPS locked to VBLANK). But even that wasn't trivial.
Anyway, I learned a lot about the various VBLANK implementations, and my code isn't great but maybe it helps. If someone else is having trouble understanding this, let me know and I'll try to help you out.