Cojonudo, yo he estado rucando un algoritmo para hacer esto, y lo tenía aqui al alcance de la mano !!!
Además creo que el tuyo es más eficiente, ¿no?
;Calculate screen pattern's position ( 32x24 ) d=posX, e=posY, hl=Pattern name exact position
ld a,[SPRITE1_X]
ld d, a
srl d ; d=d/2
srl d ; d=d/2
srl d ; d=d/2
ld a,[SPRITE1_Y]
ld e, a
srl e ; e=e/2
srl e ; e=e/2
srl e ; e=e/2
xor a
ld bc, 0
ld hl, NAMETABLE1
ld a, e
cp 0
jr z, @@FINREPETICION ;There is not any Y lines left
@@NUEVALINEA:
ld bc, 32
add hl, bc ; hl = hl + 32
dec e ; posY = posY - 1
jr nz, @@NUEVALINEA ;There is any Y lines left
@@FINREPETICION:
ld b, 0
ld c, d
add hl, bc ; hl=hl+bc