CALC

Top 

Realiza un salto condicional (si el bit 0 del acumulador es 1) a otra parte del programa y memoriza el punto de retorno. Puede ser dentro de la misma porción de código o de alguna otra subrutina. Esta se identifica por una etiqueta (label), y es siempre hacia adelante (no es prudente hacer saltos hacia atrás). Es el punto a partir del cual se seguirá ejecutando el programa. Use la instrucción RET para volver a seguir ejecutando el programa en la línea siguiente a la que se hizo el llamado.

 

        CAL Sub1        ;Salta (o llama) a la subrutina de nombre "Sub1"

        ST q0.0         ;Instrucción siguiente o punto de retorno de la subrutina

        LD sm0.4

        CALC Sub1       ;Salta (o llama) a la subrutina de nombre "Sub1" si el bit 0 del acumulador es 1

        LD sm0.5

        CALNC Sub1      ;Salta a la subrutina llamada "Sub1" si el bit 0 del acumulador es 0

        END             ;Termina el programa y vuelve a ejecutar desde el principio

 

Sub1:   LD i0.0         ;Primera instrucción de la subrutina

        RETC            ;Retorno condicional (si el bit 0 del acumulador es 1)

        AND i0.1

        RETNC           ;Retorno condicional (si el bit 0 del acumulador es 0)

        XOR i0.2

        RET             ;Retorno incondicional de la subrutina

 

 

Encadenamiento de llamados

 

     ld 1                        ;Valor 1 al acumulador (Acc)

     CALC sum_xi_yi              ;Ejecuta sum_xi_yi porque el Acc está en 1
     CALC suma_yi                ;suma_y se ejecutará si Acc quedó en 1 después de haber ejecutado sum_xi_yi
     CALC a                      ;a se ejecutará si Acc quedó en 1 después de haber ejecutado suma_yi


 

     sum_xi_yi, suma_yi y a alteran el valor del acumulador. Por eso la siguiente es dependiente de la anterior. Para que el esquema funcione cada una de las subrutinas debería terminar con un LD 1:


sum_xi_yi:       instrucción
                     ...

                     ...
                     LD 1             ;Valor devuelto en el acumulador definido
                     RET

suma_yi:          instrucción
                     ...

                     ...
                     LD 1                ;Valor devuelto en el acumulador definido
                     RET

 

 

  Esta instrucción se ubica en el sector de salidas

 


Sintaxis

 Nótese que termina con los ":", y que éstos no aparecen cuando está con la instrucción. Así es como se distingue entre destino de salto y argumento.
 Supongamos que hay varias máquinas iguales controladas por un solo equipo. Repetir la rutina por cada una adaptando los nombres de los saltos es para errores. Se puede organizar poniendo el código de control de cada una en una pestaña. Esto reduce a copiar y pegar con mucho menos cambios. Entonces, para que las etiquetas no se confundan se les añade el nombre de la pestaña correspondiente:
  

NombrePestaña@Etiqueta

   

  Entonces el programa (principal) quedaría de esta forma:

  

        CAL Main@Sub1   ;Salta (o llama) a la subrutina de nombre "Sub1"

        ST q0.0         ;Instrucción siguiente o punto de retorno de la subrutina

        LD sm0.4

        CALC Main@Sub1  ;Salta (o llama) a la subrutina de nombre "Sub1" si el bit 0 del acumulador es 1

        LD sm0.5

        CALNC Main@Sub1 ;Salta a la subrutina llamada "Sub1" si el bit 0 del acumulador es 0

        END             ;Termina el programa y vuelve a ejecutar desde el principio

 

Sub1:   LD i0.0         ;Primera instrucción de la subrutina

        RETC            ;Retorno condicional (si el bit 0 del acumulador es 1)

        AND i0.1

        RETNC           ;Retorno condicional (si el bit 0 del acumulador es 0)

        XOR i0.2

        RET             ;Retorno incondicional de la subrutina

 

  

 Descargar ejemplo (español) (inglés)

   

CAL

CALNC

JMP

RET

 

 

Lista de instrucciones
Índice