Pila de usuario y otras funciones complementarias

Utilidades de gestión de memoria y registros con una pila ilimitada en la memoria indirecta.

Para cambiar la dirección base de la pila, ver STACK BOTTOM TO X.

Etiqueta

La etiqueta J se corresponde con la tecla TAN, porque aúna la funcionalidad de las teclas SIN y COS, que son de carga y recuperación de datos desde la pila de usuario.

Detalle de funciones

Todas las funciones sanitizan las variables en las que la pila depende para su funcionamiento correcto.

Se puede indicar la dirección mínima de los registros indirectos que utilizará la pila para reservar los registros indirectos menores para almacenamiento persistente. Cambiar el valor de la línea para ello (La suma de comprobación también cambiará). Es necesario ejecutar J009 RESET después de cambiar la dirección mínima de la pila con la consiguiente pérdida de cualquier dato almacenado en la pila.

Dirección Nombre
J002 HELP
J003 X ⇆ LASTx
J004 POP x
J005 DEALLOC
J006 DISCARD X
J007 PUSH x
J008 ALLOC n=X
J009 RESET
J010 MEM COPY


J001
J002 HELP

Muestra la lista de funciones y sus direcciones.

X ⇆ LASTx

Sustituye el valor del registro X con el valor del registro LASTx.

Registro Antes Después
T t t
Z z z
Y y y
X x l
L l x

POP x

Extrae el valor situado en la cima de la pila y lo deja en el registro X. La pila RPN asciende una posición. El contenido de LASTx no se ve afectado.

Si la pila está vacía, esta función no hace nada.

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

DEALLOC

Libera la memoria reservada con ALLOC n=X No es necesario suministrar el tamaño del bloque, aunque sí es necesario llamar a esta función en orden de pila, es decir, en orden inverso a las llamadas a PUSHx y ALLOC n=X. Se pierde el valor de LASTx

Registro Antes Después
T t t
Z z z
Y y y
X x x
L l x
J j+n+1 j

DISCARD X

La pila RPN desciende una posición eliminando el registro X. La diferencia con R↓ es que R↓ copia el valor de X en T, mientras que descartar X hace una copia de T en Z.

Registro Antes Después
T t t
Z z t
Y y z
X x y
L l l

PUSH x

Introduce el valor del registro X en la pila. La pila RPN desciende una posición duplicando T en Z. El contenido de LASTx no se ve afectado.

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

ALLOC n=X

Reserva n registros indirectos en la pila de usuario. n se determina con el valor en el registro X en el momento de hacer la llamada. Esta función sustituye el valor n en el registro X por un iterador cuyo valor entero es la dirección del comienzo del bloque reservado y el valor flotante indica la última dirección disponible del bloque reservado. Este iterador se puede usar con ISG para iterar sobre los registros reservados. LASTx pasa a contener el valor n.

Registro Antes Después
T t t
Z z z
Y y y
X n jjj,iii
L l l
J j j+n+1

RESET

Inicializa la pila de memoria indirecta, ya sea por primera ejecución o por desbarajuste de la pila. El desbarajuste de pila puede producirse por errores en la ejecución de otros programas, por olvidar extraer el mismo número de datos que los que se insertan previamente o en orden inverso incorrecto, o por sobreescribir la variable J.

Debido a que CLRVARx no se puede ejecutar desde un programa, se le pedirá al usuario que la borre manualmente e indicará brevemente con VIEW J la dirección que habrá que proporcionar a CLRVARx

Es posible reiniciar la pila rápidamente con tan sólo limpiar el marcador 0 (CF 0). Este método podría no funcionar correctamente en algunos casos exóticos.

Registro Antes Después
T t t
Z z z
Y y y
X x x
L l l
J ? STK_bot×1,001

MEMORY COPY

Copia n valores desde y a la memoria indirecta. En los registros Z, Y y X ha de colocarse la dirección del bloque de destino (dest), la dirección del bloque de origen (orig) y el número de elementos (n), respectivamente. Las direcciones de los bloques de origen y destino se especifican con la dirección de memoria indirecta menor del bloque. Tras la copia, el registro T se copia a X y los registros Y, Z y T se limpian. Las direcciones válidas van de -32 a 801-n

Registro Antes Después
T t 0
Z dest 0
Y src 0
X n t
L l l

Otras funciones

Típicamente estas funciones solo se llaman desde otros programas que manipulan la pila de usuario a bajo nivel. Las direcciones están indicadas en el código fuente.

SANITIZE

Esta función recupera el estado inicial de la pila en caso de que hubiesen problemas con la consistencia de los índices que pueden ocurrir si se aborta la ejecución de un programa que usa la pila o si hay un programa con errores que no usa la pila correctamente.

Se recomienda llamar a esta función antes de utilizar la dirección (J) para evitar errores de registro inválido. La dirección (J) sólo se puede usar para almacenar temporalmente valores distintos de cero.

Registro Antes Después Condiciones
T t t
Z z z
Y y y
X x x
L l l
J j j Con marcador 0
J ? STK_bot×1,001 Sin marcador 0

STACK BOTTOM TO X

Esta función proporciona la dirección de memoria indirecta a usar como primer elemento de la pila. Éste es número que se ha de cambiar para ajustar la localización de la pila. La pila no usará las direcciones menores que este número.

Registro Antes Después
T t z
Z z y
Y y x
X x STK_bot
L l l

RESET UNDERFLOW

Igual que RESET, pero muestra el mensaje ERR UNDERFLOW.

Código fuente

J001 LBL J
J002 GTO J011
J003 GTO J072
J004 GTO J061
J005 GTO J098
J006 GTO J082
J007 GTO J051
J008 GTO J087
J009 GTO J038
J010 GTO J130
  HELP:
J011 SF 10
J012 HELP MEM UTILS
J013 PSE
J014 J003 x→LASTx→x
J015 J006 DISCARD x
J016 J007 PUSH x
J017 J004 POP x
J018 J008 ALLOC n=X
J019 J005 DEALLOC
J020 J009 RESET
J021 J010 MEMCOPY
J022 RTN
  *SANITIZE:
J023 FS? 0
J024 RTN
J025 x<> J
J026 R↓
J027 XEQ J033
J028 R↓
J029 CF 10
J030 REGT×1.001
J031 x<> J
J032 RTN
  *STACK BOTTOM TO X:
J033 0              : Cambiar este valor a n+1 para reservar los primeros n registros
                      indirectos para otros usos como variables globales, etc.
J034 RTN
  *RESET UNDERFLOW:
J035 SF 10
J036 ERR UNDERFLOW
J037 PSE
  RESET:
J038 CF 0
J039 SF 10
J040 PLEASE CLRVARx
J041 PSE
J042 x<> J
J043 R↓
J044 XEQ J033
J045 x<> J
J046 ALL
J047 VIEW J
J048 PSE
J049 FIX 4
J050 RTN
  PUSH x:
J051 XEQ J023
J052 STO(J)
J053 ISG J
J054 ᴱ                          :   No-op. La E indica que si el programa salta aquí,
                                    hay un error (posiblemente en los argumentos de entrada)
J055 CLx
J056 1
J057 STO(J)
J058 XEQ J006
J059 SF 0
J060 RTN
  POP x:
J061 FS? 0
J062 GTO J064
J063 RTN
J064 0
J065 STO(J)
J066 R↓
J067 CF 0
J068 DSE J
J069 SF 0
J070 RCL(J)
J071 RTN
  x ⇆ LASTx:
J072 XEQ J023
J073 R↑
J074 XEQ J007
J075 LASTx
J076 x<>y
J077 ABS
J078 R↓
J079 XEQ J004
J080 R↓
J081 RTN
  DISCARD x:
J082 R↓
J083 CF 10
J084 REGZ
J085 R↓
J086 RTN
  ALLOC n=X:
J087 XEQ J023
J088 STO+ J
J089 SF 0
J090 STO(J)
J091 ISG J
J092 ᴱ
J093 R↓
J094 CF 10
J095 IP(J-2)×1.001-REGT+1
J096 STO(J)
J097 RTN
  DEALLOC:
J098 ABS
J099 R↓
J100 XEQ J004
J101 x<>(J)
J102 R↓
J103 XEQ J033
J104 R↓
J105 CF 10
J106 IP(J)-(J)-REGT
J107 x<0?
J108 GTO J035
J109 x<>(J)
J110 R↓
J111 IP(J)×1.001-REGT÷1ᴱ3
J112 STO J
J113 CLx
J114 STO(J)
J115 DSE J
J116 GTO J114
J117 R↓
J118 XEQ J033
J119 R↓
J120 IP(J)+REGT÷1ᴱ3
J121 STO J
J122 R↓
J123 LASTx
J124 CF 0
J125 ISG J
J126 ᴱ
J127 DSE J
J128 SF 0
J129 RTN
  MEMORY COPY:
J130 x≤0?
J131 RTN
J132 R↑
J133 XEQ J007
J134 x<> H
J135 R↓
J136 x<> I
J137 R↓
J138 x<> J
J139 R↓
J140 R↓
J141 RCL(I)
J142 STO(J)
J143 R↓
J144 1
J145 STO+ I
J146 STO+ J
J147 R↓
J148 DSE H
J149 GTO J141
J150 STO H
J151 R↓
J152 STO I
J153 R↓
J154 STO J
J155 0
J156 ENTER
J157 ENTER
J158 XEQ J004
J159 RTN


Longitud             705