GESTION DE SPRITE A LO LARGO DE TODA LA PANTALLA
Bueno, ya está hecho y esto funciona perfecto,...ahora el sprite de la flecha (el #0 que controlamos con el Joystick) recorre toda la pantalla a sus anchas a nuestro gusto, voy a explicar como sencillamente lo he hecho para que la gente que se inicia lo sepa hacer sin problemas...
En el listado concretamente en la rutina que gestiona los parametros Derecha e Izquierda de Joystick justo antes de incrementar o decrementar la coordenada X del sprite #0 llamo a una rutina (con el tipico JSR) que sera la que gestione que el sprite #0 este por encima o por debajo de la barrera de los 255,
,...si la rutina de Joy tuviera tambien las posiciones Arriba y Abajo no habria hecho falta incluirla antes de incrementar o decrementar el valor de Y ya que el tema de la superacion de la barrera de 255 solo aplica a la coordenada X,....dicha rutina la he llamado CHECXSP0 (chequea X en Sprite 0) y ha sido incluida en la rutina de Joy a derecha e izquierda de esta forma:
MENUJOY
DERECHA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #8 ; COMPARA CON EL BIT QUE CONTROLA DERECHA
BNE IZQUIERDA ; SI NO SE HA PULSADO MANDA A IZQUIERDA
LDA #$80 ; BLOQUE GRAFICO FLECHA A LA DERECHA
STA POINSP0 ; PUNTERO SPRITE #0
JSR CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
INC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA DERECHA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO
IZQUIERDA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #4 ; COMPARA CON EL BIT QUE CONTROLA IZQUIERDA
BNE FINAL ; SI NO SE A PULSADO MANDA A FINAL Y VUELVE AL BUCLE
LDA #$83 ; BLOQUE GRAFICO FLECHA A LA IZQUIERDA
STA POINSP0 ; PUNTERO SPRITE #0
JSR CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
DEC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA IZQUIERDA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO
FINAL
JMP MENUJOY ; RETORNA AL INICIO DE BUCLE QUE GESTIONA JOYSTICIK
Creo que se aprecia claramente la inclusion de JSR CHECXSP0 en la rutina de Joy, pero vamos a ver ahora mas detenidamente que hace dicha rutina...antes de nada es importante explicar para la gente que se inicia el conocer las Logicas que nos ofrece el ordenador y que seran muy importantes conocer para utilizar la que sea segun lo que queramos hacer,...las pongo aqui para que se vayan familizarizando:
AND 1-1 >1 "AMBOS"
1-0 >0
0-1 >0
0-0 >0
OR 1-1 > 1 " UNO O AMBOS"
1-0 > 1
0-1 > 1
0-0 > 0
EOR 1-1 > 0 "UNO U OTRO PERO NO AMBOS"
1-0 > 1
0-1 > 1
0-0 > 0
Estas logicas lo que siempre hacen es comparar dos bits segun esten encendidos (valor1) o apagados (valor 0) y simplemente dependiendo de la Logica que utlicemos obtendremos un resultados u otro, si analizamos las logicas veremos que es muy sencillo entenderlas y en consecuencia utilizarlas,...explicado esto vamos a ver que hacia la rutina CHECXSP0....
CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
LDA SP0X ; CARGA EL VALOR DE X DE SPRITE #0 POSICION $D000
CMP #$FF ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 255
BEQ ENCIMA ; SI ES 255 MANDA A SUBRUTINA ENCIMA
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 0
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA DEBAJO
RTS ; RETORNA A LA RUTINA DE JOY E INCREMENTARA O DECREMENTARA
; X SEGUN EL PUNTO DONDE RETORNE EN MAINJOY, MENU JOYSTICK
Que como veis es sencillisima,...simplemente cargara el valor de la coordenada X (SP0X...$D000) y chequeara si ha llegado al valor 255 (entonces tiene que superar la barrera de los 255 y moverse por encima de ella) o si es 0 (entonces no tiene que superar la barrera de los 255 y quedará por debajo de ella),....segun tenga un valor u otro, el programa lo mandara o otra subrutina que verdaderamente gestionara el salto a un lado u otro de la barrera....supongamos que ha llegado a 255 entonces se le manda a la subrutina ENCIMA (por encima de la barrera) dicha rutina tiene este sencillo listado:
ENCIMA
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
ORA #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS
Lo primero que hace es cargar el valor de MSIGX (posicion $D010, que es la que activa desactiva la superacion o no de la barrera, en dicha posicion cada bit (de los 8 que tiene) controlará un sprites, recordad que la cuenta de sprites #0, #1, #3, etc, etc,....en el byte que estamos usando se hara de derecha a izquierda,..es decir con el bit de la derecha del todo controlaremos el sprite #0
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
supongamos que el sprite se encuentra por debajo de la barrera de los 255, con lo cual el valor en MSIGX es el siguiente: #%00000000,...el valor de la derecha del todo es 0, luego nuestro sprite no supera la barrera,....ahora queremos que la supere para ello tendremos que encender el bit correspondiente, con lo que quedaria asi: #%00000001,...pero claro queremos actuar solo sobre ese bit y ese sprite,..aqui es donde viene la utilizacion de las Logicas, en este caso la que mejor nos va es ORA y hacemos la comparacion (la hace la rutina en esta linea)...
ORA #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
Voy a explicar mas detenido que es lo que hace la logica,..compara los valores de MSIGX con otro valor para que salga el resultado que nosotros queremos,..aqui la comparacion:
VALORES CONTENIDOS EN MSIGX 00000000 (esto es aleatorio ya que pueden ser cualquiera)
VALORES QUE ASIGNAMOS A ORA 00000001 (activamos bit para gracias a ORA obtener resultado)
RESULTADO FINAL DE COMPARAR 00000001 (siempre quedara por encima de la barrera de 255)
Ahora nuestro Sprite ya esta por encima de la barrera de 255,...ahora solo nos queda ajustar una cosa,...al superar el sprite la barrera de los 255, resulta que el valor 255 de la coordenada X no aplica ya que al moverse por encima de la barrera con dicho el sprite no aparece en pantalla,..lo unico que tenemos que hacer cuando superamos la barrera es aplicarle el valor 0 a la coordenada X ya que ahora esta por encima y asi es contiguo su paso de un lado a otro cuando la supera, eso se hace en estas lineas finales....
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
Ahora vamos a ver que hace la segunda parte de la rutina,..cuando desde CHECXSP0 se le mandaba a la subrutina DEBAJO,...dicha subrutina gestionara que el Sprite #0 que en ese momento se encuentra por encima de la barrera de 255 haga lo contrario que antes, es decir, que se situe por debajo de dicha barrera,...aqui teneis la rutina que es muy parecida a la anterior cuando hacia que la superase
DEBAJO
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #255 ; CARGA VALOR 255 PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; DEBAJO DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 0 POR DEBAJO DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS
Solo hay dos cosas reseñable y explicables en dicha rutina,...lo primero que ahora el valor de X del sprite #0 que carga es 0 y eso lo hacia en CHECXSP0 en estas lineas...
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION o
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA NOSUPERA
,..¿y porque 0?,...bueno os cuento, en realidad como el sprite llevara un TOPE de pantalla por el lado izquierdo que sera en la coordenada 30 de X,..esto hara que el sprite nunca llegue al valor 0 cuando este por debajo de la barrera y en su lado mas proximo a la izquierda de la pantalla,..como mucho descenderá al valor 30,..esto es como una especie de trampita, ya que hara que nos indique que SOLO cuando el sprite ha llegado al valor 0 se encuentra por encima de la barrera, con lo cual ya sabemos que hacer,..el reconocimiento de coordenada lo hace como veis en las primera lineas en CHECXSP0 si es 0 mandara a DEBAJO
Y atencion porque aqui viene el kit de la cuestion,..antes utlizamos la Logica ORA,..pero ahora lo que queremos es que el bit que controla nuestro sprites, este donde este, tras la comparacion nos de como resultado 0 para que de esa forma se ponga por debajo de la barrera,...es por eso que utilizaremos EOR (comparacion "uno u otro pero no ambos",..supongamos que el sprite esta por encima de la barrera y su valor en MSIGX en su bit correspondiente es 1 (encendido),.para hacer que sea 0 utilizaremos EOR con el siguiente valor y haremos la comparacion
ALORES CONTENIDOS EN MSIGX 00000001 (esto es aleatorio ya que pueden ser cualquiera)
VALORES QUE ASIGNAMOS A EOR 00000001 (activamos bit para gracias a EOR obtener resultado)RESULTADO FINAL DE COMPARAR 00000000 (siempre quedara por debajo de la barrera de 255)
en la rutina esto se hace asi:
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
Ahora solo nos queda calibrar el valor de X en el sprite para que el salto de un lado a otro de la barrera sea suave,...antes metiamos el valor 0,..ahora metemos el valor 255 que es mas proximo al limite de la barrera una vez superada,..lo hace aqui.
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
Y....YA ESTA!!!,...nuestro sprite se pone por encima o por debajo de la barrera de los 255 a nuestro antojo y corretea como "pedro por su casa",...perdonadme el ladrillo pero ya puestos he hecho una explicacion para que quede como consulta para la gente que se inicia en esto y no sabe como hacerlo,..con tanta letra parece complicado, pero es mas sencillo que tirarse un pedo (y perdonen la expresion) una vez entendido,..vuelvo a poner la rutina completa para que vean lo sencilla que es,..recordemos que es una rutina que llamaremos con CHECXSP0 y a la que llamaremos con JSR justo antes de incrementar o decrementar el valor de la coordenada X del sprite #0 en este caso..
CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
LDA SP0X ; CARGA EL VALOR DE X DE SPRITE #0 POSICION $D000
CMP #$FF ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 255
BEQ ENCIMA ; SI ES 255 MANDA A SUBRUTINA ENCIMA
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 0
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA DEBAJO
RTS ; RETORNA A LA RUTINA DE JOY E INCREMENTARA O DECREMENTARA
; X SEGUN EL PUNTO DONDE RETORNE EN MAINJOY, MENU JOYSTICK
ENCIMA
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
ORA #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS
DEBAJO
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #255 ; CARGA VALOR 255 PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; DEBAJO DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 0 POR DEBAJO DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS
Podreis apreciar que la rutina completa en sí no es nada,...abultan mas las explicaciones que otra cosa, los he estado contado y la rutina completa no consume mas que 153 bytes..
Bueno troncos os dejo que ya está bien,..ojala sea de ayuda a la gente que comienza ésta explicacion,..agregada la rutina al listado y compilado queda de la lforma que veis cargando el archivo que os adjunto en esta respuesta en el vice...
Proximo capitulo: poniendole topes de pantalla a derecha e izquierda para que nuestro sprite no se salga de la pantalla y desaparezca de la vista..
Chao
P.D: Este mini ladrillo explicativo esta hecho para gente que se quiera iniciar en el ensamblador, pero va especialmente dedicado a gente como Maniako que demuestra un impetu, ganas y corazon por aprender ensamblador dentro de sus limitaciones y que es de lo mas encomiable,....gente como tu, motiva!!