Gracias. Sigo sin saber exactamente que es PARCHE+1 y qué hace exactamente. Aquí te explico mi código:
La posición Y está en COORD_Y y la x en COORD_X. La pantalla se guarda en un buffer llamado PANT_BUFFER y apuntado por HL.
ld a,[COORD_X] ;redondeo la coord_x
and 248
ld d,0
ld e,a
ld h,0
ld a,[COORD_Y] ;redondeo la coord_y y multiplico por 32
and 248
ld l,a
ld c,32
call mult
add hl,de
La rutina "mult" que multiplica HL por un número dado en el registro C es:
;------------------------------------------
;Multiplica un número HL=número C= *n
;------------------------------------------
mult:
ld a,c
or a
jp z,@@cero
push de
dec c
ld b,c
push hl
pop de
@@buc1:
add hl,de
djnz @@buc1
pop de
ret
@@cero:
ld hl,0
ret
Bueno, ahora supuestamente estará en HL un número comprendido entre 0 y 6144 (la tabla de patrones) donde está el byte buscado. Aún tengo que sumar Y and 7 a HL para que HL apunte al byte específico:
ld a,[COORD_Y]
and 7
ld d,0
ld e,a
add hl,de
Ahora sí HL debe apuntar al byte de la pantalla que contiene el punto a detectar.
Queda rotar ese byte a la izquierda tantas veces como X and 7.
ld a,[COORD_X]
and 7
or a
jp z,@@sigue ;si es cero salto el paso de rotar
ld b,a
@@buc:
push bc
call ROTA_IZQUIERDA
pop bc
djnz @@bu2
La rutina de rotación es:
ROTA_IZQUIERDA:
;---------------------------
;HL=dir.byte a rotar
;---------------------------
@@rota:
sla [hl]
ret
Por último, cargo en A el valor del byte apuntado por HL y comparo el 7ºbit:
ld a,[hl]
bit 7,a
jp nz, COLISION_AL_CANTO
Como ves, mi ensamblador es como para escribir la segunda parte del libro de Rodney Zacks
pero bueno, algo aprendo cada día
Tengo que ponerme a ver instrucciones como RRCA y todo eso, y aprender mejor a manipular nibbles y todo eso... pero poco a poco
¡Gracias!