Mario de Lama
malar@arrakis.es
http://www.arrakis.es/~malar
En el capítulo 30 de la Guía de usuario de la hp48 vienen un par de páginas dedicadas a los menús de usuario. Seguramente esto valga para la mayoría de la gente pero para otros es una información escasa, sobre todo si lo que deseas es programar. La mayor omisión de dicho capítulo es la referente a los menús gráficos. Si, has oido bien, en la hp puedes introducir un gráfico como etiqueta de menú de forma que al presionar sobre la tecla correspondiente se ejecute un programa. No estás obligado a poner una cadena de caracteres.
Ya sabes que al comando MENU puedes darle dos usos según los argumentos que le presentes
{ etiqueta_1 { acción1 left_shift_acción1 right_shift_acción1 } ... etiqueta_N { acciónN left_shift_acciónN right_shift_acciónN } }
Donde "etiqueta_i" es la cadena de caracteres que aparece en el menú de pantalla y las distintas acciones son las que se ejecutan al presionar esa tecla con los modos de desplazamiento posibles. La etiqueta no tiene por que ser un string, puedes sustituirla con un GROB (gráfico) de 21 columnas por 7 filas ya que este es el tamaņo de las etiquetas (la primera fila se suele usar para poner la barra que distingue a los directorios de las variables). En realidad la calculadora lo que hace es transformar la cadena que le suministras en un grob y luego ponerlo en la pantalla, si colocas un grob en vez de un string le facilitas la tarea.
BASE | GUARISMOS USADOS | M | L | K | J |
---|---|---|---|---|---|
binaria | 0 1 | 2^3 x M + | 2^2 x L + | 2^1 x K + | 2^0 x J |
octal | 0 1 2 3 4 5 6 7 | 8^3 x M + | 8^2 x L + | 8^1 x K + | 8^0 x J |
decimal | 0 1 2 3 4 5 6 7 8 9 | 10^3 x M + | 10^2 x L + | 10^1 x K + | 10^0 x J |
hexadecimal | 0 1 2 3 4 5 6 7 8
9 A B C D E F | 16^3 x M + | 16^2 x L + | 16^1 x K + | 16^0 x J |
Si alguna vez has transformado un grob en cadena de caracteres, o si lo has puesto en la pila y le has dado al cursor que indica hacia abajo entrando en el modo edicción, puedes ver su estructura que es:
"GROB "NēColumnas" "NēFilas" Gráfico"
En "NēColumnas" y "NēFilas" se expresa el ancho y alto del gráfico en pixeles (puntos de pantalla). En "Gráfico" se da la información acerca del gráfico en una secuencia de hexadecimales. ŋCómo se codifica esa secuencia? Cada número hexadecimal se corresponde con cuatro números binarios que son los que indican si el pixel que representan, con su valor 1 ó 0, está encendido o apagado. Por tanto, cada hexadecimal representa a cuatro pixeles, pero hay una salvedad, el hexadecimal #Eh (en binario #1110d) representa al grob 0111 (simétrico al 1110), quiere esto decir que los cuatro pixeles han de leerse de derecha a izquierda por lo que los bites más significativos se corresponden con los pixeles de más a la derecha. El orden que se sigue para representar el gráfico es de izquierda a derecha y de arriba a abajo, el primer hexadecimal representará entonces a los cuatro pixeles de la esquina superior izquierda.
Como las filas de los gráficos no tienen porque tener un número de pixeles divisibles por 4, al final de cada línea nos quedarán 1, 2, 3 ó 4 pixeles. En el último caso no habrá ningún problema, ponemos el hexadecimal correspondiente y vale. Pero si nos quedan, por ejemplo, 3 pixeles estos se representarán por los 3 bits menos significativos, los de la izquierda y el restante lo ignorará el sistema operativo de la calculadora cuando vaya a representar el gráfico, por ejemplo el grob 110 queda representado por el #3h (que en binario sería #0011d).
Como vale más una imagen que mil palabras vamos a obtener la codificación del siguiente grob:
Si lo separamos en filas y aplicamos la regla anterior tendremos:
Si ponemos todos los hexadecimales seguidos obtendremos el grob:
GROB 21 8 0C78100FF5200284200BA110010900029400044200083100Un poco de historia: La revista Forum HP nació en Barcelona en Diciembre de 1992 y murió en Diciembre de 1993. La dirigió Carles Crespo y entre sus colaboradores se encontraban Enrique de la Torre, Julián Garrido, Daniel C. Bachero, Marcos Ortega y también colaboré algo yo. Se distribuía por correo (entonces sólo usaban Internet los pocos que podían pagar una conexión y la factura del teléfono). Tiempos gloriosos :)
ETIQUETAS no es más que:
\< { GROB 21 8 00E0000051000842000444000EFF10004000EFFFF0CFFF30 GROB 21 8 0EFF00054410800020EFFFF04111508FFF3001401083E830 GROB 21 8 0208008F0E3040114020A08020A080104001000000000000 GROB 21 8 00FF10080130049970CFFFF1CFB7F1EFFFF1EFFFF10E0C10 GROB 21 8 0C1800031C008C1A00831A00803800815810822820010010 GROB 21 8 0C78100FF5200284200BA110010900029400044200083100 GROB 21 8 02590084F5200DE61042D94081F13042E8400D061084F520 GROB 21 8 C10081E300E1FF08F1FFFFF1FFFFF1DD08F12200E1C10081 GROB 21 8 000000CFFF7000462000462000231000990000990000EF10 GROB 21 8 0000008008F0A20CF1E30C81FFFF81FFFF81000CF10008F0 GROB 21 8 0CC7000EDF000FBF300FBF100FBF000FB7008F7B00080100 GROB 21 8 0C300042400021B000294100CFFF300144400228300C1000 GROB 21 8 CC18302E7C701FFD709FFF70EFFF3087FF608FEFF00FDFF1 GROB 21 8 006C10007220F333604C8C90819C90836360030220000C10 } TMENU \>Vereis que al final no hago presentar el menú con MENU si no con TMENU. Este comando lo usamos cuando no queremos que el menú se guarde en la variable de sistema CST. Si hubiese usado MENU, se me crea esa variable y cada vez que presione la tecla dura CST me aparecerá ese menú. Sin embargo, al usar TMENU no se crea esa variable y tendríamos que poner de nuevo la lista en la pila y presionar TMENU cada vez.
Si deseas mostrar un menú durante la ejecución de un programa has de parar su ejecución con PROMPT o HALT. Es lo normal ya que desearás que el programa se detenga para que el usuario pueda darte los datos. Si deseas que se detenga con WAIT tienes dos posibilidades, ejecutar 0 WAIT ó -1 WAIT. Con la primera logras que el programa se detenga y WAIT te devuelve el código de la tecla pulsada (mira en el capítulo 30 estos códigos) y continúa el programa. -1 WAIT hace lo mismo pero ademas fuerza al sistema a que muestre el menú especificado con anterioridad. Hacer la prueba es muy fácil, sólo debes poner la línea -1 WAIT y 0 WAIT al final del programa etiqueta, verás como sólo se muestra el menú en el primer caso.
Hay otra forma de 'detener' el proceso del programa. Es mediante el uso de KEY. Este comando nos devuelve constantemente un 0 (falso) a la pila hasta que presionamos una tecla, en ese momento devuelve un 1 (verdadero) y el código de la tecla presionada. Por ello KEY debe ser usado en un bucle indefinido y en realidad no detiene al programa:
\< 1 DO 1 + UNTIL KEY END IF DUP 51 \=/ THEN DROP2 ELSE DROP END \>Este programilla va sumando 1 al primer 1 que ponemos hasta que presionamos una tecla, si es ENTER (código 51) el programa deja el total en la pila, en caso contrario lo borra. Si el programa es el siguiente vereis que no se muestra el menú hasta finalizar el programa, estamos en el mismo caso que con 0 WAIT.
\< { GROB 21 8 00E0000051000842000444000EFF10004000EFFFF0CFFF30 GROB 21 8 0EFF00054410800020EFFFF04111508FFF3001401083E830 GROB 21 8 0208008F0E3040114020A08020A080104001000000000000 GROB 21 8 00FF10080130049970CFFFF1CFB7F1EFFFF1EFFFF10E0C10 GROB 21 8 0C1800031C008C1A00831A00803800815810822820010010 GROB 21 8 0C78100FF5200284200BA110010900029400044200083100 GROB 21 8 02590084F5200DE61042D94081F13042E8400D061084F520 GROB 21 8 C10081E300E1FF08F1FFFFF1FFFFF1DD08F12200E1C10081 GROB 21 8 000000CFFF7000462000462000231000990000990000EF10 GROB 21 8 0000008008F0A20CF1E30C81FFFF81FFFF81000CF10008F0 GROB 21 8 0CC7000EDF000FBF300FBF100FBF000FB7008F7B00080100 GROB 21 8 0C300042400021B000294100CFFF300144400228300C1000 GROB 21 8 CC18302E7C701FFD709FFF70EFFF3087FF608FEFF00FDFF1 GROB 21 8 006C10007220F333604C8C90819C90836360030220000C10 } TMENU 1 DO 1 + UNTIL KEY END IF DUP 51 \=/ THEN DROP2 ELSE DROP END \>
Regresar