HispaMSX

Resuelto lo de la detección de colisiones en asm :)

2005-03-11 00:40:23

Buenas, señores :)

A estas horas intempestivas tengo el placer de comunicarles que ya he 
acabado con esa espina que atormentaba mi alma :) Ha sido duro y un 
largo descubrir de nuevas instrucciones que desconocía pero aquí está. 
Decir que tal como se me había sugerido, la clave estaba en hallar 
primero cuál de los dos operandos es el mayor antes de hacer la resta 
y proceder a invertir el orden para evitar generar resultados en 
complemento a dos.

Por si a alguien le pudiera ser útil,
aquí está el listado. Mañana, más despejado, intentaré optimizar un 
poco (acabo de descubrir las instrucciones EQU, etc.) pues esto tiene 
que estar de aquella manera ;)



           ORG  51000
           LD   HL,6945 ;pos x sprite 6
           CALL &H4A
           LD   E,A
           LD   HL,6913   ;pos x sprite 0
           CALL &H4A
           CP   E
           JP   NC,CORRECTO ;si sprite 0 > sprite 6 resta directamente
           LD   C,A         ;si no, invertir orden operandos
           LD   A,E
           SUB  C           ;y resto
           JP   COMPARA     ;y salto ya a comparaciones
 CORRECTO: SUB  E           ;resto normalmente
 COMPARA:  CP   16          ;comparo
           JP   C,SIGUE
           RET  
 SIGUE:    LD   HL,6944     ;lo mismo con coordenadas y
           CALL &H4A
           LD   E,A
           LD   HL,6912
           CALL &H4A
           CP   E
           JP   NC,CORRECT2
           LD   C,A
           LD   A,E
           SUB  C
           JP   COMPARA2
 CORRECT2: SUB  E
 COMPARA2: CP 8
           JP   C,CHOQUE
           RET               ;si no hay choque, vuelvo a programa
 CHOQUE:   LD   A,1          ;si hay choque, meto 1 en 50008, que es
           LD   (50008),A    ;una especie de "bandera" que indica el
 FIN:      RET               ;choque
           END  


Gracias de nuevo,

Juanma







<Anterior en la conversación] Conversación actual [Siguiente en la conversación>
  • Resuelto lo de la detección de colisiones en asm :), Darth Fistro <=