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