Raczej nie sprawdzanie tylko maskowanie. Robisz sprite'a i maskę do niego a potem przy nakładaniu pobierasz zawartość, maską kasujesz to, co ma być puste a potem ORujesz sprite'a i dopiero to wrzucasz w ekran.
Jeśli bajt sprite'a wygląda tak:
00001100
00011100
00111000
00110000
00110000
Przygotowujesz maskę np tak:
11110011
11100011
11000111
11001111
11001111
W pamięci pakujesz dane naprzemian - bajt maski, bajt sprite'a. A potem zamiast prostego pobierania i wrzucania w ekran robisz coś takiego:
; de - ekran
; hl - sprite
ld a,(de)
and (hl)
inc hl
or (hl)
inc hl
ld (de),a
Maska może być o piksel "grubsza" - w efekcie dostaniesz efekt jaki można zobaczyć w grach - sprite na z ramką dookoła.
To tak z grubsza.
Chyba, że nie masz tła i chcesz tylko "nałożyć" sprite'a - wtedy wystarczy
ld a,(de)
or (hl)
ld (de),a
Oczywiście do tego musisz dodać czyszczenie w odpowiednim punkcie tak, żeby ci raster nie ściął grafiki, ale tego raczej nie muszę ci tłumaczyć