Ver Mensaje Individual
  #9  
14/12/2018
Predeterminado Re: Problema con comparaciones (cmp)
No he entendido eso primero jj
Código:
mov r1, #0x0 @; Contador
	strb r2, [r3]
	@; EL PROBLEMA ESTA AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NO COMPARA LAS VARIABLES?
	cmp r3, #0x4
	bls Estado @;Si no va al bucle
	b Bucle @;Si es menor o igual a 3 sale del bucle
Asta donde yo entiendo (porfavor corrigeme si me equivoco), mov r1, #0x0 setea r0 a 0, antes de entrar al bucle y luego llama a este. Una vez dentro con
Código:
add r1, r1, #0x1 @; Sumar 1 al valor actual del contador
suma un 1 sobre el valor anterior de r1 y lo sobrescribe en r1 de nuevo.

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
.thumb

Main:
	push {lr}
	mov r0, #0x31
	mov r1, #0x0 @; Contador
	cmp r0, #0x4
	bls Estado @;Si no va al bucle
	b Bucle @;Si es menor o igual a 3 sale del bucle
	
Bucle:
	add r1, r1, #0x1 @; Sumar 1 al valor actual del contador
	sub r0, r0, #0x4 @; Restar 1 al valor actual del valor de la variable a comparar
	cmp r0, #0x4
	bls Estado
	b Bucle
	
Estado:
	ldr r2, .var_8007
	strb r1, [r2] @;////// PONER R2 SI NO FUNCIONA
	pop {pc}	
	
.align 2
.var_8007: .word 0x20375E6
Por lo que me da a entender que hay algun problema con el valor de R2, pero tampoco entiendo porque si cuando lo guardaba en 8007 daba el valor correcto.

Última edición por Rasputin; 14/12/2018 a las 19:18