OR, AND, and XOR combine two registers bit by bit - and on original CHIP-8 they all share one surprising quirk: they reset VF to zero. Today you implement all three and pin that quirk.
Implement 8XY1 (OR), 8XY2 (AND), and 8XY3 (XOR), each resetting VF to 0.
The three logical instructions are bit-for-bit combinations of VX and VY: 8XY1 is OR, 8XY2 is AND, 8XY3 is XOR, each storing the result back in VX. The bitwise operation itself is unremarkable - 0xF0 OR 0x0F is 0xFF, AND is 0x00, XOR is 0xFF.
The catch is a genuine quirk of the original interpreter: all three reset VF to 0. It is not a carry or a meaningful flag, just an artifact of how the 1970s hardware reused a register during the operation, and some later interpreters dropped it - but real ROMs of the era depend on it, so this project pins it. That is why the spec starts with VF = 1 and checks every one of OR, AND, and XOR drives it back to 0. Name that reset in your code explicitly rather than assuming these ops leave VF untouched; forgetting it is the classic stale-flag bug.
// inside the 8XY_ low-nibble switch:case 0x1: v.V[x] |= v.V[y] // ORcase 0x2: v.V[x] &= v.V[y] // ANDcase 0x3: v.V[x] ^= v.V[y] // XOR// then, for all three, VF is reset - decide where that line goes