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
.
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.
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 |
Muestra la lista de funciones y sus direcciones.
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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.
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 |
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 |
Igual que RESET
, pero muestra el mensaje ERR UNDERFLOW
.
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