Karoshi MSX Community
05 de Julio de 2021, 03:36:36 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Comparar números de 16 bits con signo en asm  (Leído 4373 veces)
0 Usuarios y 1 Visitante están viendo este tema.
samsaga2
Karoshi Fan
**
Mensajes: 76


Email
« : 15 de Mayo de 2012, 01:52:21 pm »

Estoy intentando comprar dos números de 16 bits con signo en ensamblador y me estoy haciendo un lío.

Primero he intentado tirar de la BIOS (http://map.grauw.nl/resources/msxbios.php#DCOMPR). Pero la documentación no indica si es una comparación de números con o sin signo y no dice más flag que el de si son iguales. He probado intentando usar los mismos flags que con la instrucción CP (http://z80-heaven.wikidot.com/instructions-set:cp) pero me ha salido un churro.

Luego he intentado SBC HL,DE pero no he conseguido salirme con la mía.

¿Resumiendo como puedo averiguar si HL>DE siendo HL y DE dos números de 16 bits con signo?

Beso de tornillo para el que me ayude.
En línea
theNestruo
Karoshi Lover
***
Mensajes: 236


Email
« Respuesta #1 : 15 de Mayo de 2012, 02:59:49 pm »

Ahora no estoy en casa, pero juraría que con sbc se puede hacer...
    xor a
    sbc hl, de
    jp  z, @@HL_IGUAL_DE
    jp  c, @@HL_MENOR_DE
@@HL_MAYOR_DE:
    ...
@@HL_IGUAL_DE:
@@HL_MAYOR_DE:
    ...

Si estoy equivocado, por favor corregidme.

He encontrado en esta página un cheatsheet en el que viene un algoritmo de comparación de 16 bit con signo y no parece ser tan sencillo...
Código:
; BC contains 16-bit signed value X
; DE contains 16-bit signed value Y
; X < Y
    LD A,B ; get MSB of value X
    ADD $80 ; flip sign bit of MSB
    LD L,A ; save signed MSB value for later
    LD A,D ; get MSB of value Y
    ADD $80 ; flip sign bit of MSB
    CP L ; compare LSB of value X & value Y
    JR NZ,.different ; equal? no, so test for less than
    LD A,E ; get LSB of value Y
    CP C ; compare LSB of value X & value Y
.different:
    JP NC,.greater ; less than? no, so value X >= value Y
    CALL condition_true ; X < Y, condition is true
.greater:
; X == Y
    LD A,C ; get LSB of value X
    CP E ; compare with LSB of value Y
    JP NZ,.different ; equal? No, so test is false
    LD A,B ; get MSB of value X
    CP D ; compare with MSB of value Y
    JP NZ,.different ; equal? no, so test is false
    CALL condition_true ; X == Y, condition is true
.different:
; X <= Y
    LD A,D ; get MSB of value Y
    ADD $80 ; flip sign bit of MSB
    LD L,A ; save signed MSB value for later
    LD A,B ; get MSB of value X
    ADD $80 ; flip sign bit of MSB
    CP L ; compare MSB of value X & value Y
    JR NZ,.different ; equal? no, so test for greater than
    LD A,C ; get LSB of value X
    CP E ; compare with LSB of value Y
.different:
    JP C,.greater ; greater? yes, so value X > value Y
    CALL condition_true ; X <= Y, condition is true
.greater:
« Última modificación: 15 de Mayo de 2012, 05:26:54 pm por theNestruo » En línea

theNestruo."Old BASIC programmers never die; they GOSUB but never RETURN."
nenefranz
Karoshi Fan
**
Mensajes: 67



« Respuesta #2 : 15 de Mayo de 2012, 07:53:59 pm »

En esta web también comentan algo sobre comparaciones de 16bits con y sin signo (ir a Z80 IF-ELSE) ...
las comparaciones sin signo funcionan, pero las con signo no las he utilizado, no puedo asegurar que funcionen bien en todos los casos Tongue 

http://www.andreadrian.de/oldcpu/Z80_number_cruncher.html

bueno espero que te sea de utilidad el enlace.

Saludos,


En línea
nanochess
Karoshi Lover
***
Mensajes: 141


Programando algo buenísimo :)


WWW
« Respuesta #3 : 16 de Mayo de 2012, 12:52:59 am »

Si los números están en el rango -16834 a 16383 se puede usar esto:
Código:
or a
sbc hl,de
jp m,aa1   ; Salta si HL < DE
jp p,aa1   ; Salta si HL >= DE
Si los números usan el rango completo de -32768 a 32767 se puede usar esto:
Código:
ld a,h
xor $80
ld h,a
ld a,d
xor $80
ld d,a
sbc hl,de
jp c,aa1    ; Salta si HL < DE
jp nc,aa1   ; Salta si HL >= DE
Espero que te sea de utilidad
En línea

Mira mis juegos MSX/Colecovision/Atari/Intellivision http://nanochess.org/retro_es.html, y sígueme en Twitter http://twitter.com/nanochess
samsaga2
Karoshi Fan
**
Mensajes: 76


Email
« Respuesta #4 : 16 de Mayo de 2012, 10:35:30 am »

Perfecto gracias   Cheesy

Si los números están en el rango -16834 a 16383 se puede usar esto:
Código:
or a
sbc hl,de
jp m,aa1   ; Salta si HL < DE
jp p,aa1   ; Salta si HL >= DE
Si los números usan el rango completo de -32768 a 32767 se puede usar esto:
Código:
ld a,h
xor $80
ld h,a
ld a,d
xor $80
ld d,a
sbc hl,de
jp c,aa1    ; Salta si HL < DE
jp nc,aa1   ; Salta si HL >= DE
Espero que te sea de utilidad

En línea
Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!