¿Cómo producir una C media en Intel 8080?

7

Este es un problema de ejemplo en mi libro. Suponiendo que el pin 5 del puerto 4 está conectado a un amplificador que controla un altavoz, la solución se da como,

La frecuencia del medio C es $$ f = 261.63 \ \ text {Hz} $$ Por lo tanto, el período de tiempo es, $$ T = \ frac1 {f} = 3822 \ \ mu s $$

El programa para producir una onda cuadrada con ese período es,

LOOP1:    OUT 4H     ;Send bit to speaker
          MVI C,86H  ;Set count to 134
LOOP2:    DCR C      ;Count down
          JNZ LOOP2  ;Test count
          CMA        ;Reset bit 5
          NOP        ;Fine tune
          NOP        ;Fine tune
          JMP LOOP1  ;Go for next half cycle

El número de estados T se da como, OUT (10), MVI (7), DCR (4), JNZ (10 si es verdadero, si no 7), CMA (4), NOP (4), JMP (10 ).

Con una frecuencia de reloj de 1 MHz, LOOP2 (para medio ciclo) se ejecuta durante 1912 microsegundos, lo cual es lo suficientemente cerca. LOOP1 debería ejecutarse de nuevo y enviar el complemento de lo que estaba anteriormente en el bit 5 del puerto 4. Pero creo que no.

Cuando finaliza LOOP2, el acumulador tiene 00H sobrante del registro C. CMA cambia el acumulador a FFH. NOP y JMP no cambian el acumulador. Entonces, el LOOP1 itera para el siguiente semiciclo, OUT envía el contenido del acumulador al puerto 4, es decir, FFH cuyo bit 5 es 1, cada vez. Entonces no hay una onda cuadrada, es solo una señal alta. Entonces, ¿cómo produce una C media?

    
pregunta Ayatana

1 respuesta

10

DCR C disminuye el registro C y establece indicadores; no afecta al acumulador (también conocido como registro A). La única instrucción en esta secuencia que afecta al acumulador es el CMA . Por lo tanto, en cada paso a través de LOOP1 , el acumulador se complementará: bit 5 alto en un ciclo y bajo en el siguiente.

Muchas fuentes que incluyen la hoja de datos 8085 describen la ALU 8080/8085 Como funciona directamente en el acumulador, pero esto es una simplificación excesiva. Como se describe en este artículo de Ken Shirriff , La ALU tiene dos registros temporales:

  

La ALU usa dos registros temporales que no son visibles directamente para el programador. El registro temporal del acumulador (ACT) mantiene el valor del acumulador mientras se realiza una operación de ALU. Esto permite que el acumulador se actualice con el nuevo valor sin causar una condición de carrera. El segundo registro temporal (TMP) contiene el otro argumento para la operación ALU. El registro TMP generalmente retiene un valor de la memoria u otro registro.

     

...

     

El registro ACT tiene varias funciones importantes. Primero, contiene la entrada a la ALU. Esto permite que los resultados de la ALU se vuelvan a escribir en el acumulador sin alterar la entrada, lo que causaría inestabilidad. En segundo lugar, el ACT puede mantener valores constantes (por ejemplo, para aumentar o disminuir, o ajuste decimal) sin afectar el acumulador. Finalmente, el ACT permite operaciones de ALU que no usan el acumulador.

Para las instrucciones DCR , el ACT mantiene una constante, el TMP recibe el contenido actual del registro de operandos y se realiza una operación ADD ; para DCR C , el acumulador permanece intacto:

  

Las líneas de control permiten que el registro ACT se cargue con una variedad de constantes. La línea de control 0 / fe_to_act carga 0 o 0xfe en el ACT; el valor es seleccionado por la línea de control sel_0_fe. El valor 0 tiene una variedad de usos. ORAR un valor con 0 permite que el valor pase a través de la ALU sin cambios. Si se establece el acarreo, la adición a 0 realiza un incremento. El valor 0xfe (con signo -2) se usa solo para la instrucción DCR (disminución en 1). Podría pensar que el valor 0xff (con signo -1) sería más apropiado, pero si se establece el acarreo, el AGREGAR 0xfe disminuye en 1. Creo que la motivación es que tanto los incrementos como los decrementos tienen el arrastre establecido, y por lo tanto pueden usar el mismo Lógica para controlar el acarreo.

     

Dado que el 8085 tiene un circuito de incremento / decremento de 16 bits, puede preguntarse por qué la ALU también se usa para incrementar / disminuir. El motivo principal es que el uso de la ALU permite que los indicadores de condición se establezcan mediante INR y DCR. En contraste, las instrucciones de incremento y decremento de 16 bits (INX y DCX) utilizan el incrementador / decremento, y como consecuencia, las marcas no se actualizan.

Solo hay un único conjunto de indicadores en el 8080; DCR afecta a los indicadores Cero, Signo, Paridad y Transferencia auxiliar.

    
respondido por el Russell Borogove

Lea otras preguntas en las etiquetas