Recuperación de datos desde la pila de usuario

Este programa permite una profundidad de la pila RPN limitada únicamente por la memoria indirecta disponible. Recupera los registros Y, Z y T que previamente han sido retirados a la memoria indirecta con el programa H y reestablece la sesión guardada con H004 PUSH MEM.

Etiqueta

La etiqueta I se corresponde con la tecla COS, que pretende ser abreviación de stack out. Además está colocada entre las teclas ENTER y R↓.

Detalle de funciones

Dirección Nombre
I<ENTER> POP YZT
I004 POP MEM

POP YZT

Pulsar XEQ, seguido de I, seguido de ENTER. Los registros Y, Z y T se sobreescriben con los valores almacenados en las tres últimas posiciones de la pila de memoria indirecta. Los registros X y LASTx se conservan. Si la pila no tiene al menos un tamaño de 3, la operación se aborta con un mensaje de error evitando la destrucción de datos en direcciones indirectas menores a la dirección mínima de la pila, pero la pila RPN se deja en un estado indefinido.

Registro Antes Después
T t (j+2)
Z z (j+1)
Y y (j)
X x x
L l l
J j+3 j

POP MEM

Recupera todas las variables de la A a la Z (excepto J), los registros estadísticos, los registros X, Y, Z y T, y el registro LASTx en la pila que se guardaron previamente con el programa PUSH MEM. ¡Se sustituirán todos los datos de las variables con los de los datos guardados en la pila de usuario! POP MEM se puede ver como descartar la sesión actual y recuperar el estado de la calculadora al que estaba antes de la llamada a PUSH MEM.

Se puede cancelar la sesión anterior insertando en la pila el valor 37 (J007 PUSH X) seguido de J005 DEALLOC

Para pasar datos a la sesión anterior, hay más alternativas a la descrita en el programa H : Se deberá preparar de antemano una dirección de memoria indirecta con espacio suficiente. Este puntero se tendrá que pasar a la sesión anidada en una variable AZ. La sesión anidada guardará entonces los datos de salida en la memoria indirecta. Es el equivalente a un puntero out .

Ejemplo: Este ejemplo muestra como usar PUSH X para reservar un solo registro de memoria indirecta. Entre paréntesis tabulado, la instrucción o instrucciones alternativas para tres valores de retorno en lugar de uno.

RCL J          : Se guarda en I la dirección de memoria
STO I            indirecta donde guardar el valor a devolver
                 por la sesión anidada.
XEQ PUSH X     : Se reserva un registro de memoria indirecta con PUSH
  (XEQ PUSH YZT)
XEQ PUSH MEM   : Se inicia la sesión nueva
  ...
  STO(I)       : Se guarda el dato a pasar a la sesión anterior
    (STO (I))
    (ISG I)
    (STO (I))
    (ISG I)
    (STO (I))
  ...
XEQ POP MEM    : Fin de la sesión
XEQ POP X      : Se recupera en el registro X el valor de
                 la sesión anidada.
  (XEQ POP YZT)

De forma similar, los programas PUSH YZT y ALLOC n=X se pueden usar para reservar más memoria donde guardar los datos de devolución antes de la llamada a H004 PUSH MEM.

Registro Antes Después
T t (j+3)
Z z (j+2)
Y y (j+1)
X x (j)
L l (j+4)
J j+37 j

Código fuente

I001 LBL I
  POP YZT:
I002 XEQ J023
I003 GTO I005
I004 GTO I024
I005 0
I006 STO(J)
I007 R↓
I008 DSE J
I009 GTO I011
I010 GTO J035
I011 0
I012 x<>(J)
I013 DSE J
I014 GTO I016
I015 GTO J035
I016 0
I017 x<>(J)
I018 CF 0
I019 DSE J
I020 SF 0
I021 RCL(J)
I022 R↑
I023 RTN
  POP MEM:
I024 ⎻32
I025 RCL J
I026 29
I027 STO- J
I028 DSE J
I029 GTO I031
I030 GTO J035
I031 R↓
I032 x<> J
I033 ENTER
I034 x<>y
I035 22
I036 +
I037 LASTx
I038 x<>y
I039 R↓
I040 XEQ J010
I041 ⎻7
I042 x<>y
I043 7
I044 XEQ J010
I045 XEQ J005
I046 XEQ I002
I047 R↓
I048 ABS
I049 R↓
I050 STO I
I051 R↓
I052 STO H
I053 XEQ I002
I054 R↓
I055 GTO J004


Longitud             178