math bcd z80

math - Instrucción DAA Z80



bcd (3)

¿Solo modifica el acumulador de todos modos, según las condiciones establecidas en la tabla DAA, independientemente de las instrucciones anteriores?

Sí. La documentación solo le indica para qué se debe utilizar DAA. Quizás te refieras a la tabla de este enlace :

-------------------------------------------------------------------------------- | | C Flag | HEX value in | H Flag | HEX value in | Number | C flag| | Operation | Before | upper digit | Before | lower digit | added | After | | | DAA | (bit 7-4) | DAA | (bit 3-0) | to byte | DAA | |------------------------------------------------------------------------------| | | 0 | 0-9 | 0 | 0-9 | 00 | 0 | | ADD | 0 | 0-8 | 0 | A-F | 06 | 0 | | | 0 | 0-9 | 1 | 0-3 | 06 | 0 | | ADC | 0 | A-F | 0 | 0-9 | 60 | 1 | | | 0 | 9-F | 0 | A-F | 66 | 1 | | INC | 0 | A-F | 1 | 0-3 | 66 | 1 | | | 1 | 0-2 | 0 | 0-9 | 60 | 1 | | | 1 | 0-2 | 0 | A-F | 66 | 1 | | | 1 | 0-3 | 1 | 0-3 | 66 | 1 | |------------------------------------------------------------------------------| | SUB | 0 | 0-9 | 0 | 0-9 | 00 | 0 | | SBC | 0 | 0-8 | 1 | 6-F | FA | 0 | | DEC | 1 | 7-F | 0 | 0-9 | A0 | 1 | | NEG | 1 | 6-F | 1 | 6-F | 9A | 1 | |------------------------------------------------------------------------------|

Debo decir, nunca he visto una especificación de instrucción más vaga. Si examina la tabla con cuidado, verá que el efecto de la instrucción depende solo de los indicadores C y H y del valor en el acumulador, no depende en absoluto de la instrucción anterior. Además, no divulga lo que sucede si, por ejemplo, C=0 , H=1 y el dígito más bajo en el acumulador es 4 o 5. Por lo tanto, tendrá que ejecutar un NOP en tales casos o generar un error. mensaje, o algo

Le pido disculpas por esta pregunta aparentemente menor, pero parece que no puedo encontrar la respuesta en ningún lugar: simplemente estoy implementando la instrucción DAA en mi emulador Z80, y noté en el manual de Zilog que es para los fines de ajuste. El acumulador para aritmética decimal codificada en binario. Dice que la instrucción está diseñada para ejecutarse justo después de una instrucción de suma o resta.

Mis preguntas son:

  • ¿Qué pasa si se ejecuta después de otra instrucción?
  • ¿Cómo sabe qué instrucción lo precede?
  • Me doy cuenta de que hay una marca N, ¿pero esto seguramente no indicaría definitivamente que la instrucción anterior fue una instrucción de suma o resta?
  • ¿Solo modifica el acumulador de todos modos, según las condiciones establecidas en la tabla DAA, independientemente de las instrucciones anteriores?

Solo quería agregar que la bandera N es lo que quieren decir cuando hablan de la operación anterior. Las adiciones configuran N = 0, las restas configuran N = 1. Por lo tanto, el contenido del registro A y los indicadores C, H y N determinan el resultado.

La instrucción está diseñada para soportar la aritmética BCD pero tiene otros usos. Considere este código:

and 15 add a,90h daa adc a,40h daa

Termina convirtiendo los 4 bits inferiores del registro A en los valores ASCII ''0'', ''1'', ... ''9'', ''A'', ''B'', ..., ''F''. En otras palabras, un convertidor binario a hexadecimal.


También encontré esta instrucción bastante confusa, pero encontré que esta descripción de su comportamiento de z80-heaven es la más útil.

Cuando se ejecuta esta instrucción, el registro A se corrige mediante BCD utilizando el contenido de los indicadores. El proceso exacto es el siguiente: si los cuatro bits menos significativos de A contienen un dígito no BCD (es decir, es mayor que 9) o se establece el indicador H, entonces se agrega $ 06 al registro. Luego se verifican los cuatro bits más significativos. Si este dígito más significativo también es mayor que 9 o se establece el indicador C, entonces se agregan $ 60.

Esto proporciona un patrón simple para la instrucción:

  • si los 4 bits inferiores forman un número mayor que 9 o se establece H, agregue $ 06 al acumulador
  • si los 4 bits superiores forman un número mayor que 9 o se establece C, agregue $ 60 al acumulador

Además, si bien DAA está diseñado para ejecutarse después de una suma o resta, puede ejecutarse en cualquier momento.