![]() |
Problema con comparaciones (cmp) Buenas tardes! Estoy desarrollando una que recorre una serie de listas para llegar a un valor concreto y almacenarlo en la variable 8007 (lo explico de manera escueta porque prefiero ser lo mas objetivo posible, si alguien le interesa saber para que es que lo diga y lo ponga en los comentarios sin ningun problema :) ) El problema es el siguiente: Necesito que me devuelva un valor =<4 en la variable 8007, y para ello realizo una resta de -4 sobre el valor actual de un registro en forma de bucle. El fallo esta en que al realizar el comando cmp para comparar dicho valor, no lo compara y evidentemente sigue adelante con la siguiente orden de la rutina. El valor que contiene R2 en el momento de realizar la comparacion es correcto (lo he comprobado, y en los casos de prueba era 31), pero no consigo que entre el bucle por la comparación. Dejo aqui dicha rutina por si alguien me puede echar una mano: Código: .align 2 Un saludo! PD: hay algunos nombres de variables (entiendase por var_8008, .facing_heroe, etc) que no se han utilizado todavia debido a que la rutina esta en fase de desarrollo. Tambien puede que haya algún comentario mal explicado o errado. |
Re: Problema con comparaciones (cmp) Quieres comprobar si el valord e r2 es menor o igual a 4? Pues chico no se como quieres hacerlo. Código: cmp r2, #0x4 Mmmm, no veo como quieres hacer eso. Mira, prueba con esto, porque real,ente no se si el comando bgt existe. Código: cmp r2, #0x4 esto hace que si r2 es menor o igual a 4 vayas a estado, de lo contrario (else) se repite el bucle. Y eso, ya me dirás si te funciona. ---------------------------- Te recomiendo mirar este tuto: https://whackahack.com/foro/t-56345/tutotial-asm-fbi ;) |
Re: Problema con comparaciones (cmp) Buenas! Gracias por la ayuda. El comando lo saque de un tutorial de este mismo foro si no me confundo, pero si no te suena seguramente este mal jaja. Acabo de probar y el juego se queda pillado. Me imagino que se quede pillado en el bucle. Habia probado con esto: Código:
|
Re: Problema con comparaciones (cmp) Cita:
es bls y no ble |
Re: Problema con comparaciones (cmp) Disculpame :no-way: copie la que no era jaja Con bls el resultado es 8F, el valor de r2 en el momento de restar es 31, por lo que el valor del contador no coincide '^^ Ademas de tardar un rato en reaccionar tambien jeje puede ser por las operaciones de restar en bucle? porque en los casos de prueba cuando cargaba el valor de r2 en la var 8007 para comprobar que era el valor correcto lo hacia rapidisimo |
Re: Problema con comparaciones (cmp) Has cambiado el bgt por bls en los dos sitios que tienes puestos? |
Re: Problema con comparaciones (cmp) Cita:
|
Re: Problema con comparaciones (cmp) Lo primero, el contador no te va a funcionar, por el echo de que estás seteado el valor 0 siempre que haces el ciclo. Siempre que vayas a usar un contador en ASM debes mover un cero al registro antes de entrar al bucle y una vez dentro solo debes sumarle uno por cada vez que se repita el ciclo. Y ese registro no puedes usarlo para dentro del bucle, pues está reservado a ser un contador, y si lo sobreescribes ya no servirá de nada. Igualmente un contador se usa para simular ciclos for, que hacen que se repita un bucle n veces. Pero si lo que quieres es hacer un while, no necesitas de contador, que es lo que tu quieres hacer. Si me explicas con detalle lo que quieres hacer te echaré una mano. |
Re: Problema con comparaciones (cmp) No he entendido eso primero jj Código: mov r1, #0x0 @; Contador Código: add r1, r1, #0x1 @; Sumar 1 al valor actual del contador El contador no es para que el bucle (en este caso while efectivamente) se rompa, sino para saber un valor concreto teniendo en cuenta las vueltas que da el bucle. Me explico: Esta rutina es para saber el "tipo de movimiento" (0,1,2,3.. segun AMap) que tiene el player delante de el para ejecutar un objeto que hace que el jugador salte. La intencion es que no pueda saltar a un bloque con el valor 1 (no pasar) segun AMap. Para ello recorre una serie de listas segun valores de la ram como el cabezal del mapa, banco y mapa, para llegar finalmente a la informacion de dicho mapa. La informacion que hay alli se almacenan por halfwords, el primero indica el numero del bloque y el segundo (no lo tengo muy claro pero me vale para lo que quiero hacer) es el movimiento permitido. R2 en este caso carga el segundo valor de dicha halfword que es el valor actual del movimiento permitido, peeeeero no son los mismos valores para cada mapa (en unos el valor 1 de AMap es 0x5, en otros 0x2), por lo que es necesario saber en que punto se encuentra. Para ello voy restando 4 al valor de r2 y comparandolo con <=4 y sumando 1 al contador. Una vez llegado a esto, rompe el bucle y el valor del contador sera el valor actual del bloque, ya que cuando sea 4 o menor sera el valor 0 del AMap. Finalmente devuelve este valor en 8007 con el valor segun AMap que me permite interpretar si el script de salto se puede ejecutar o no, como muchas otras cosas que se me ocurren jejeje Se que es un poco royo pero queria hacer alguna rutina que fuera dinamica para cada mapa, sin tener que hacer una lista con las areas de cada mapa (area de figuras irregulares) ya que es muy engorroso a mi parecer. De momento carga solo el primer bloque del mapa en el que te encuentres, pero con getplayerpos puedo saber en que bloque se encuentra el hero y recorrer la lista de halfwords para concretarlo. Acabo de probar esto y funciona a la perfeccion y rapidisimo! Código: .align 2 |
Re: Problema con comparaciones (cmp) Código: mov r2, #0x1 @; Desplazamiento para cargar segundo byte de la halfword https://imgur.com/a/Qeyh60S Por si no cargara el GIF: https://imgur.com/a/Qeyh60S Como he dicho, de momento solo analiza el primer bloque del mapa donde te encuentres (y solo valores superiores o iguales a 4, por lo que si fuera 0 seguramente no lo analizara correctamente), y he puesto un valor de 1 y D segun los movimientos permitidos del AMap para comprobar que funciona. La idea es ejecutar el comando getplayerpos, y llamar a la rutina para que analice el facing y las coordenadas para que analice los bloques concretos. Muchas gracias por la ayuda, el tutorial me sirvio de mucho. Si a alguien se le ocurre alguna forma de depurar la rutina para hacerla mas pequeña o cualquier idea de uso para otras cosas, no dudeis en hacermelo saber! Cuando este terminada la posteare por si a alguien mas le puede valer. Un saludo! :) |
La franja horaria es GMT +1. Ahora son las 21:29. |
Powered por vBulletin™ Version 3.8.9
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.
SEO by vBSEO 3.6.1
Traducido por vBsoporte - vBulletin en español
Credits System provided by
vBCredits II Deluxe (Lite) -
vBulletin Mods & Addons Copyright © 2019 DragonByte Technologies Ltd.
User Alert System provided by
Advanced User Tagging (Lite) -
vBulletin Mods & Addons Copyright © 2019 DragonByte Technologies Ltd.
vBulletin Optimisation provided by
vB Optimise (Pro) -
vBulletin Mods & Addons Copyright © 2019 DragonByte Technologies Ltd.