Real sprites land near the edges, so DXYN needs two edge rules: the starting position wraps around the screen, but the sprite itself clips rather than spilling over. Today you pin both.
Make DXYN wrap the starting coordinate modulo the screen and clip pixels that fall past an edge.
Two different edge behaviours meet in DXYN, and mixing them up is a classic bug. First, the starting coordinate wraps: because VX and VY are bytes but the screen is only 64 by 32, the start corner is taken modulo the screen size. A sprite told to start at x = 68 actually starts at column 4 (68 mod 64). This is what lets a program position a sprite anywhere using a byte coordinate.
Second, once drawing begins from that wrapped corner, the individual pixels clip - they do not wrap. A sprite whose start is near the right edge simply loses the pixels that would fall past column 63; they are dropped, not drawn on the opposite side. So a sprite starting at column 62 lights only columns 62 and 63, and the rest vanish. Pinning both in one lesson - one draw that clips at the edge and one whose start wraps into range - keeps the two rules from bleeding into each other, which is exactly the mistake that makes sprites smear across the screen.
// wrap only the starting corner into range:px := int(v.V[x]) % 64py := int(v.V[y]) % 32// ...then, per pixel, skip (clip) any column >= 64 or row >= 32// instead of wrapping the individual pixel