Oh yeah, and a new way to implement the drawing opcode (faster than pixel-by-pixel), I think would be... XOR a complete line of bits into VRAM. Namely... you have 8 bits (1 byte) for the first scanline of the sprite, you just XOR that into the video memory.
Then check that memory section after XORing and if it's not equal to the original sprite data of the scanline (8 bits long, ya), then something was erased, and collision flag needs to be set.
Just another tip. I get the feeling people are doing it pixel by pixel and checking for which bit is erased... which might be quite tedious.
You read about it in the Chip-8 thread. Shendo was having the same problem.
Look back at your subtraction opcode. The flag should be set also when the result of the subtraction is 0, not just when the result is less than 0. VF is actually a carry AND zero flag, not just a carry flag.
Cowgod forgot to put that in his document. Or maybe he didn't know about that himself.