Bueno, TENGO el libro :)
Si echa un vistazo a las instrucciones cubiertas en el Capítulo 17, y enumera los códigos de operación en forma binaria, son los siguientes:
I I I I I I I I
7 6 5 4 3 2 1 0
0 0 0 1 0 0 0 0 LOD !I7 !I6 !I5 I4 !I3 !I2 !I1 !I0
0 0 0 1 0 0 0 1 STO !I7 !I6 !I5 I4 !I3 !I2 !I1 I0
0 0 1 0 0 0 0 0 ADD !I7 !I6 I5 !I4 !I3 !I2 !I1 !I0
0 0 1 0 0 0 0 1 SUB !I7 !I6 I5 !I4 !I3 !I2 !I1 I0
0 0 1 0 0 0 1 0 ADC !I7 !I6 I5 !I4 !I3 !I2 I1 !I0
0 0 1 0 0 0 1 1 SBB !I7 !I6 I5 !I4 !I3 !I2 I1 I0
0 0 1 0 0 1 x x future ALU !I7 !I6 I5 !I4 !I3 I2 x x
0 0 1 0 1 0 x x future ALU !I7 !I6 I5 !I4 I3 !I2 x x
0 0 1 0 1 1 x x future ALU !I7 !I6 I5 !I4 I3 I2 x x
0 0 1 1 0 0 0 0 JMP !I7 !I6 I5 I4 !I3 !I2 !I1 !I0
0 0 1 1 0 0 0 1 JZ !I7 !I6 I5 I4 !I3 !I2 !I1 I0
0 0 1 1 0 0 1 0 JC !I7 !I6 I5 I4 !I3 !I2 I1 !I0
0 0 1 1 0 0 1 1 JNZ !I7 !I6 I5 I4 !I3 !I2 I1 I0
1 1 1 1 1 1 1 1 HLT I7 I6 I5 I4 I3 I2 I1 I0
En el byte de instrucciones, los 4 bits más a la izquierda (I7 a I4) determinan el tipo de instrucción principal (1xh para carga / almacenamiento, 2xh para sumar / restar, 3xh para saltos y FFh para detener) y los cuatro bits más a la derecha ( I3 a través de I0) sirven como modificadores. (Ix significa bit x del byte de instrucción). Estoy usando la convención de libros de un sufijo 'h' para hex, en lugar de un prefijo 0x como se usa en C y otros idiomas.
En el diagrama del libro, la salida de los enclavamientos de 8 bits (etiquetados como "Código") para los 8 bits superiores de la instrucción de 24 bits se debería haber mostrado al entrar en un circuito de decodificación. Y tiene razón, en la forma más simple es solo un montón de compuertas AND inversores (por lo tanto, los dos sentidos de cada bit están disponibles).
Como se muestra a la derecha para cada código de operación, el byte de instrucciones se puede decodificar utilizando los AND de 8 entradas, junto con los inversores según sea necesario. ! I7 es lo mismo que \ $ \ small \ overline {\ text {I7}} \ $, pero descubrí que no puedo usar barras en tablas como esta.
Pero si tiene una línea que va hacia la ALU que dice hacer una suma o una resta, es probable que desee descodificar solo los 6 bits más a la izquierda:
0 0 1 0 0 0 x 0 any ADD/SUB !I7 !I6 I5 !I4 !I3 !I2 x x
y úselo para indicar a la ALU que realice una operación de suma / resta; luego ejecute I0 en el cable ALU que le indica si debe hacer una suma (0) o restar (1); y ejecute I1 en el cable ALU que indica si se debe usar carry / borrow (1) o no (0).
Del mismo modo, también descodificarías parcialmente los 6 bits de la izquierda para un salto:
0 0 1 1 0 0 x x any JMP !I7 !I6 I5 I4 !I3 !I2 x x
y luego deje que los dos bits más a la derecha (I0 e I1) determinen el tipo utilizando un decodificador de 2 a 4. Por lo tanto, no es necesario que siempre decodifique los 8 bits del byte de instrucciones por separado para cada código de operación.
Note que decodifiqué los bits I3 e I2 como 0 para los opcodes de suma y resta, aunque no son necesarios en este momento; esto deja 12 códigos de operación más posibles (un total de 16) para el grupo de instrucciones 2xh, marcado como "futuro" en la tabla anterior. Es probable que estos se utilicen para operaciones adicionales en la ALU, como operaciones lógicas (AND, OR, XOR, NOT) y turnos. Lo mismo se podría hacer para el grupo de salto (3xh).
Si observa otra de mis respuestas aquí , donde analizo los circuitos para un segmento de 1 bit. de la ALU para el 8085, verá que no hay líneas específicas para operaciones como AND, OR, XOR o incluso ADD y SUB dentro de la ALU. En su lugar, hay una serie de líneas de control especiales con nombres como select_op1 y force_ncarry_1 que determinan cómo la ALU procesa las entradas y produce un resultado. Varias combinaciones de estas líneas especiales se habilitan según sea necesario por cada código de operación que se ejecuta (consulte la tabla en la respuesta vinculada).
Otra forma de extender las instrucciones de la clase 2xh es agregar un modo inmediato. Petzold no entra en esto en su libro, pero un modo de direccionamiento inmediato simplemente significa usar el valor del operando de la instrucción directamente (en este caso, los 16 bits más bajos), en lugar de usar el operando como un 16 dirección de bit en RAM.
Comparando los dos:
ADD A, [4000h] adds the contents of memory location 4000h to the accumulator A
ADD A, #4000h adds the value 4000h to the accumulator A
Para manejar este segundo modo de direccionamiento, podemos (como ejemplo) usar el bit I3 para identificar el direccionamiento inmediato: I3 = 0, dirección de memoria, I3 = 1, direccionamiento inmediato. Así que ahora las instrucciones ALU se ven así:
0 0 1 0 0 0 0 0 ADD !I7 !I6 I5 !I4 !I3 !I2 !I1 !I0
0 0 1 0 0 0 0 1 SUB !I7 !I6 I5 !I4 !I3 !I2 !I1 I0
0 0 1 0 0 0 1 0 ADC !I7 !I6 I5 !I4 !I3 !I2 I1 !I0
0 0 1 0 0 0 1 1 SBB !I7 !I6 I5 !I4 !I3 !I2 I1 I0
0 0 1 0 0 1 x x future ALU !I7 !I6 I5 !I4 !I3 I2 x x
0 0 1 0 1 0 0 0 ADD# !I7 !I6 I5 !I4 !I3 !I2 !I1 !I0
0 0 1 0 1 0 0 1 SUB# !I7 !I6 I5 !I4 !I3 !I2 !I1 I0
0 0 1 0 1 0 1 0 ADC# !I7 !I6 I5 !I4 !I3 !I2 I1 !I0
0 0 1 0 1 0 1 1 SBB# !I7 !I6 I5 !I4 !I3 !I2 I1 I0
0 0 1 0 1 1 x x future ALU# !I7 !I6 I5 !I4 I3 I2 x x
He marcado las nuevas instrucciones con un # después del mnemónico.
Esto reduce el número máximo de códigos de operación de ALU únicos en el grupo 2xh de 16 a 8, pero esto aún deja espacio para AND, OR y XOR, incluidas sus contrapartes inmediatas. NOT (que solo funciona en el acumulador) no tiene operandos y, por lo tanto, no tiene una versión inmediata.