Flag de Paridad no me funciona (a veces)

Programando el Amstrad en Ensamblador.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Flag de Paridad no me funciona (a veces)

Mensajepor MoteroV4 » Mar 20 Abr , 2021 5:23 pm

Hola buenas, quiero pintar el suelo usando un tramado, un degradado para lo cual, además de controlar el nº de línea necesito saber cuándo ésta es par o impar.

El problema es que hago un OR A al inicio del bucle para que active el flag P de Paridad, y que justo después se detecte esta operación con un JP PE,** pero a veces funciona y otras no.

Hago una llamada a una función (pintar_linea) que simplemente hace un LDIR para pintar la línea, comando que según he leído resetea el flag P.
He estado depurando y el INC B es el que me está detectando que no hay Overflow y me pone flag V a 0, provocando que también se vea como P/V Impar. Por ej. al principio cuando hago OR A del valor en A=B=7A=122 debería ponerse a 1 ya que es PAR pero no lo hace, y el JP PE,_par no salta a su etiqueta.

Muestro una foto de las líneas que detecta como pares (verde brillante) y las impares (verde normal). Deberían verse líneas finas de 1pix, alternando una verde brillante y la siguiente verde oscuro, y así sucesivamente, en modo de pruebas.

¿Por qué el flag de paridad no me funciona como debería?
GRACIAS.

Código: Seleccionar todo

;;------------------------------------------------------------------------
;; *********** pintar_terreno ********
;; Dibujar líneas con un patrón de color y tramado en función del nº de
;; línea actual o si es par/impar.
;; ENTRADAS
;; Ctes: Verde, VerdeBr, ... etc.
;; SALIDAS:
;; color: byte de color en formato píxel Mode0
;; pintar_linea:
;; Registros destruidos: AF, BC,
;;------------------------------------------------------------------------
pintar_terreno:
ld b, #120 ;;FOR b=120 TO 199 - líneas de pantalla
bucle_pintar:
ld a, b
or a ;;activar flag de paridad P/V par=1 // impar=0

_if:
jp pe, _par ;;IF (b es par) THEN _par
_impar: ;;ELSE (b es impar)
ld a, #Verde ;;asignar cte. Verde oscuro
jr _end_if ;;salir del IF
_par:
ld a, #VerdeBr ;;asignar cte. Verde brillante
_end_if:

push bc ;;salvar en B la línea actual del bucle

ld (color), a ;;asignar parámetro de color para la función
call pintar_linea

pop bc ;;NEXT b
ld a, #199
cp b
ret z
inc b ;;Incrementar bucle. Modifica flag de Overflow V=1 // No Overflow V=0
jr bucle_pintar
Imagen
Adjuntos
Snap 2021-04-20, 16_29_18.png

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: Flag de Paridad no me funciona (a veces)

Mensajepor Fran123 » Mar 20 Abr , 2021 8:14 pm

para saber si es par o impar basta con que mires el último bit, con SRL rotas y el bit 0 lo sacas al CARRY.

el bit de paridad te dará si el nº de bits a 1 es par o no
Hola buenas, quiero pintar el suelo usando un tramado, un degradado para lo cual, además de controlar el nº de línea necesito saber cuándo ésta es par o impar.

El problema es que hago un OR A al inicio del bucle para que active el flag P de Paridad, y que justo después se detecte esta operación con un JP PE,** pero a veces funciona y otras no.

Hago una llamada a una función (pintar_linea) que simplemente hace un LDIR para pintar la línea, comando que según he leído resetea el flag P.
He estado depurando y el INC B es el que me está detectando que no hay Overflow y me pone flag V a 0, provocando que también se vea como P/V Impar. Por ej. al principio cuando hago OR A del valor en A=B=7A=122 debería ponerse a 1 ya que es PAR pero no lo hace, y el JP PE,_par no salta a su etiqueta.

Muestro una foto de las líneas que detecta como pares (verde brillante) y las impares (verde normal). Deberían verse líneas finas de 1pix, alternando una verde brillante y la siguiente verde oscuro, y así sucesivamente, en modo de pruebas.

¿Por qué el flag de paridad no me funciona como debería?
GRACIAS.

Código: Seleccionar todo

;;------------------------------------------------------------------------
;; *********** pintar_terreno ********
;; Dibujar líneas con un patrón de color y tramado en función del nº de
;; línea actual o si es par/impar.
;; ENTRADAS
;; Ctes: Verde, VerdeBr, ... etc.
;; SALIDAS:
;; color: byte de color en formato píxel Mode0
;; pintar_linea:
;; Registros destruidos: AF, BC,
;;------------------------------------------------------------------------
pintar_terreno:
ld b, #120 ;;FOR b=120 TO 199 - líneas de pantalla
bucle_pintar:
ld a, b
or a ;;activar flag de paridad P/V par=1 // impar=0

_if:
jp pe, _par ;;IF (b es par) THEN _par
_impar: ;;ELSE (b es impar)
ld a, #Verde ;;asignar cte. Verde oscuro
jr _end_if ;;salir del IF
_par:
ld a, #VerdeBr ;;asignar cte. Verde brillante
_end_if:

push bc ;;salvar en B la línea actual del bucle

ld (color), a ;;asignar parámetro de color para la función
call pintar_linea

pop bc ;;NEXT b
ld a, #199
cp b
ret z
inc b ;;Incrementar bucle. Modifica flag de Overflow V=1 // No Overflow V=0
jr bucle_pintar
Imagen

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: Flag de Paridad no me funciona (a veces)

Mensajepor MoteroV4 » Mar 20 Abr , 2021 8:43 pm

para saber si es par o impar basta con que mires el último bit, con SRL rotas y el bit 0 lo sacas al CARRY.

el bit de paridad te dará si el nº de bits a 1 es par o no
Gracias, funciona comprobando el Carry. :-)

Aunque como novato que soy sigo sin entender por qué el flag P no funciona, que supongo es el que han habilitado para este tipo de operaciones...

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: Flag de Paridad no me funciona (a veces)

Mensajepor Fran123 » Mar 20 Abr , 2021 8:57 pm

es que el flap P no es para lo que tú quieres

creo que no todas las operaciones actualizan los flags
para saber si es par o impar basta con que mires el último bit, con SRL rotas y el bit 0 lo sacas al CARRY.

el bit de paridad te dará si el nº de bits a 1 es par o no
Gracias, funciona comprobando el Carry. :-)

Aunque como novato que soy sigo sin entender por qué el flag P no funciona, que supongo es el que han habilitado para este tipo de operaciones...

Avatar de Usuario
NotFound
Me voy lanzando
Me voy lanzando
Mensajes: 36
Registrado: Mié 17 Ene , 2007 4:31 pm

Re: Flag de Paridad no me funciona (a veces)

Mensajepor NotFound » Mar 20 Abr , 2021 10:42 pm

Hola
Aunque como novato que soy sigo sin entender por qué el flag P no funciona, que supongo es el que han habilitado para este tipo de operaciones...
El flag de paridad comprueba la paridad del número de bits, no del valor numérico:

Código: Seleccionar todo

0 - 0 bits a 1, par
1 - 1 bit a 1, impar
2=10b - 1 bit a 1, impar
3=11b - 2 bits a 1, par
etc.
O sea, que no sirve para comprobar si el valor numérico del registro es par o impar.
Salu2

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: Flag de Paridad no me funciona (a veces)

Mensajepor MoteroV4 » Mié 21 Abr , 2021 12:33 am

Hola
Aunque como novato que soy sigo sin entender por qué el flag P no funciona, que supongo es el que han habilitado para este tipo de operaciones...
El flag de paridad comprueba la paridad del número de bits, no del valor numérico:

Código: Seleccionar todo

0 - 0 bits a 1, par
1 - 1 bit a 1, impar
2=10b - 1 bit a 1, impar
3=11b - 2 bits a 1, par
etc.
O sea, que no sirve para comprobar si el valor numérico del registro es par o impar.
OK, comprendido por fin. Ahora le veo sentido.
Gracias!!


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic