Sitio Web de Héctor E. Medellín Anaya

## Simulador de un procesador microprogramado Este applet simula un procesador micro programado, esta basado en el ejemplo de micro arquitectura MIC-1 del libro "Organización de Computadoras, un enfoque estructurado" segunda edición de Andrew S. Tanenbaum. El applet muestra el funcionamiento de la microarquitectura permitiendo varias formas de simulación. La microarquitectura consta de 16 registros, una ULA, el registro de dirección de memoria de 12 bits (MAR) y el registro de intercambio de memoria (MBR), un circuito desplazador (SHIFTER), dos multiplexores (MUXA y MUXM), dos buffers (BUF-A y BUF-B), un contador de micro programa (MPC), un registro de micro instrucción (MIR), un incrementador (+1) una micromemoria de 256 palabras de 32 bits (no se muestran en elapplet), una memoria principal de 4096 palabras de 16 bits y algo de lógica extra (decodificadores, reloj y la lógica de microsecuenciamiento). El formato de las microinstrucciones es el siguiente: MUXA - controla la entrada izquierda de la ALU: 0=buffer A, 1=MBR. COND - tipo de salto en el microprograma: 0=no salta, 1=salta si N=1, 2=salta si Z=1, 3=salta siempre. ALU - función de la ALU: 0=A+B, 1=A and B, 2=A, 3=not A. SHIF - función del desplazador: 0=nada, 1=derecha, 2=izquierda. MBR - carga MBR a partir del desplazador: 0=no carga, 1=carga. MAR - carga MAR a partir del buffer B: 0=no carga, 1=carga. RD - petición de lectura de memoria: 0=no pide, 1=carga MBR de memoria. WD - petición de escritura de memoria: 0=no pide, 1=escribe MBR en la memoria. LODC - control de almacenamiento en la memoria de anotaciones: 0=no almacena, 1=almacena. C - selecciona el registro donde almacenar si LODC=1: 0=PC, 1=AC, 2=SP, 3=IR, 4=TIR, etc. B - selecciona la fuente del bus B: 0=PC, 1=AC, 2=SP, 3=IR, etc. A - selecciona la fuente del bus A: 0=PC, 1=AC, 2=SP, 3=IR, etc. ADDR - dirección del salto en el microprograma. La ventana de vaciado muestra 32 localidades de la memoria de nivel 2 en hexadecimal. La ventana de desensamblado muestra 8 instrucciones en direcciones alrededor de la palabra direccionada por el 'pc'. Algunos de los registros pueden modificarse haciendo clic sibre un dígito hexadecimal del contenido. El botón izquierdo incrementa el valor del dígito en uno y el botón derecho lo decrementa. Esto también funciona las localidades del área de desensamblado de memoria y de vaciado de memoria. El valor de algunos registro se pone en ceros si se hace clic sobre el nombre del registro. Para modificar las instrucciones en memoria se puede hacer clic sobre el campo de mnemónico de la instrucción, esta cambiará a la siguiente instrucción. Debido a las restricciones del manejo de archivos a través de los applets, para cargar un nuevo programa se utiliza al botón "Cargar programa" y se abre una ventana con una área de texto donde se pega el código en hexadecimal. Para iniciar la ejecución de las instrucciones, presione el botón "Iniciar". Mientras las instrucciones se ejecutan, el botón cambia a "Detener", presiónelo si desea detener el proceso. Se tiene 4 modos de simulación, del paso1 al paso4. En el paso1 se simula una sola instrucción de nivel 2 haciendo pausa en cada micro paso, se avanza presionando el mismo botón, el cual mostrará el letrero "Siguiente". En el paso2 se simula una sola instrucción de nivel 2 mostrando los micro pasos sin hacer pausa. En el paso3 se simula una sola instrucción de nivel 2 sin mostrar los micro pasos. Por último en el paso4 se simulan instrucciones hasta volver a presionar este botón o encontrar un breakpoint. Se puede insertar un punto que ruptura (breakpoint) haciendo clic en el campo de dirección de la ventana de vaciado o de desensamblado. Volviendo a hacer clic se borra el break point o haciendo clic en otra dirección se traslada en breakpoint a la nueva dirección. El break point detiene la simulación en el modo paso4 cuando el registro pc toma el valor de esa dirección. Las barras de desplazamiento del área de vaciado permiten examinar cualquier región de la memoria. #### CODIGOS DE OPERACION binario nemotécnico instrucción significado 0000xxxxxxxxxxxx lodd carga directo ac:=m[x] 0001xxxxxxxxxxxx stod almacena directo m[x]:=ac 0010xxxxxxxxxxxx addd suma directo ac:=ac+m[x] 0011xxxxxxxxxxxx subd resta directo ac:=ac-m[x] 0100xxxxxxxxxxxx jpos salta si positivo if ac>=0 then pc:=x 0101xxxxxxxxxxxx jzer salta si cero if ac=0 then pc:=x 0110xxxxxxxxxxxx jump salta pc:=x 0111xxxxxxxxxxxx loco carga constante ac:=x (0<=x<=4095) 1000xxxxxxxxxxxx lodl carga local ac:=m[sp+x] 1001xxxxxxxxxxxx stol almacena local m[sp+x]:=ac 1010xxxxxxxxxxxx addl suma local ac:=ac+m[sp+x] 1011xxxxxxxxxxxx subl resta local ac:=ac-m[sp+x] 1100xxxxxxxxxxxx jneg salta si negativo if ac<0 then pc:=x 1101xxxxxxxxxxxx jnze salta si no cero if ac<>0 then pc:=x 1110xxxxxxxxxxxx call llama a procedimiento sp:=sp-1;m[sp]:=pc;pc:=x 1111000000000000 pshi apila indirecto sp:=sp-1;m[sp]:=m[ac] 1111001000000000 popi desapila indirecto m[ac]:=m[sp];sp:=sp+1 1111010000000000 push apila sp:=sp-1;m[sp]:=ac 1111011000000000 pop desapila ac:=m[sp];sp:=sp+1 1111100000000000 retn retorno pc:=m[sp];sp:=sp-1 1111101000000000 swap intercambia tmp:=ac;ac:=sp;sp:=tmp 11111100yyyyyyyy insp incrementa sp sp:=sp+y (0<=y<=255) 11111110yyyyyyyy desp decrementa sp sp:=sp-y (0<=y<=255) El siguiente programa es un ejemplo que incluye una subrutina para dividir dos números enteros. X EQU 0 Y EQU 1 C EQU 2 A EQU 4 B EQU 5 COCIENTE EQU 6 RESIDUO EQU 7 JUMP MAIN DIV DESP 3 LODL A STOL X LODL B STOL Y LOCO 0 STOL C WHILE LODL X SUBL Y JNEG END STOL X LOCO 1 ADDL C STOL C JUMP WHILE END LODL C PUSH LODL COCIENTE+1 POPI LODL X PUSH LODL RESIDUO+1 POPI INSP 3 RETN MAIN LOCO C1 PUSH LOCO R1 PUSH LODD M PUSH LODD N PUSH CALL DIV INSP 4 FIN JUMP FIN M DFW 34 N DFW 2368 C1 DFW 0 R1 DFW 0 El siguiente es el código en hexadecimal correspondiente a este programa. Este código puede copierse y pegarse en la ventana de carga de archivo. $601A $FE03 $8004 $9000 $8005 $9001 $7000 $9002 $8000 $B001 $C010 $9000 $7001 $A002 $9002 $6008 $8002 $F400 $8007 $F200 $8000 $F400 $8008 $F200 $FC03 $F800 $7027 $F400 $7028 $F400 $0025 $F400 $0026 $F400 $E001 $FC04 $6024 $0022 $0940 $0000 $0000