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 "carga" 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 dtener 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