50%(2)50% fanden dieses Dokument nützlich (2 Abstimmungen)
685 Ansichten77 Seiten
Este documento presenta el código de un programa que simula el movimiento de una pelota rebotando en la pantalla de una calculadora HP-48G. El programa consta de dos módulos, Q1 y Q2. Q1 inicializa la posición de la pelota, mientras que Q2 maneja el bucle principal que actualiza la posición de la pelota y la dibuja en la pantalla, cambiando la dirección de movimiento cuando alcanza los límites. El documento explica detalladamente el razonamiento detrás del código para simular el movimiento y rebote de
Este documento presenta el código de un programa que simula el movimiento de una pelota rebotando en la pantalla de una calculadora HP-48G. El programa consta de dos módulos, Q1 y Q2. Q1 inicializa la posición de la pelota, mientras que Q2 maneja el bucle principal que actualiza la posición de la pelota y la dibuja en la pantalla, cambiando la dirección de movimiento cuando alcanza los límites. El documento explica detalladamente el razonamiento detrás del código para simular el movimiento y rebote de
Este documento presenta el código de un programa que simula el movimiento de una pelota rebotando en la pantalla de una calculadora HP-48G. El programa consta de dos módulos, Q1 y Q2. Q1 inicializa la posición de la pelota, mientras que Q2 maneja el bucle principal que actualiza la posición de la pelota y la dibuja en la pantalla, cambiando la dirección de movimiento cuando alcanza los límites. El documento explica detalladamente el razonamiento detrás del código para simular el movimiento y rebote de
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" 1 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 >> 2 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). 3 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". 4 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. 5 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 6 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 7 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 8 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) 9 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 10 << 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. 11 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 >> 12 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 13 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 14 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 15 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: 16 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 17 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 -------------------------| --------|-----------------------------------------| 18 -- 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 ---------------------------| --------|-----------------------------------------| 19 -- 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 -----------------------| --------|-----------------------------------------| 20 ________|_________________________________________| 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, 21 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 >>. 22 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..... 23 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 >> 24 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 25 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 : 26 << 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 27 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: 28 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 >>" 29 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 30 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 31 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 ? 32 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 33 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 34 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 35 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. 36 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. 37 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. 38 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 39 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 40 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. 41 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 == 42 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". 43 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 >> 44 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 45 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 46 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 47 "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. ************************************************************* ***** 48 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 49 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: 50 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 51 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 52 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. 53 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. 54 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 55 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. 56 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 57 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 58 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... 59 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 " 60 #" $" ($#%&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 61 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: 62 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 63 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 64 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 65 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? 66 ************************************************************* ******** 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. 67 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 68 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 69 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. 70 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 71 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. 72 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: 73 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 74 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 75 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 76 +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 ********************** 77