Beruflich Dokumente
Kultur Dokumente
Programando con
Introducción:
Una introducción básica a la arquitectura de las modernas calculadoras HP.
Capitulo 1
Instalación en Windows y ejecución de ‘Hola Mundo’
Capitulo 2
Explicación de ‘Hola Mundo’ y tamaños considerados.
Capitulo 3
Consola I/O
Capitulo 4
Timers, Sonidos y Gráficos Simples.
Capitulo 5
Usando la Tarjeta SD
Capitulo 6
Soporte Stack RPL
Capitulo 7
Gráficos en Escala de Grises con HPG
INTRODUCCION
Después NEC (quién fabricó el Saturno para HP) discontinuó el chip. Cuando HP
quiso hacer una nueva serie de calculadoras, ellos decidieron usar uno nuevo, un CPU
standard. El procesador que ellos eligieron es una variante del ARM; específicamente el
S3C2410X de Samsung. Este es un ARM9 de 203MHz. HP lo cronometra a 75MHz para dar
más duración a las baterías.
Mientras, piense un poco sobre esto. Las 49g+, corren a 75MHz en un moderno
procesador de 32 bit, sólo corre un poco más rápido que una 49g con un anticuado
procesador de 4MHz. Incluso cuando usted no está muy interesado en programas rápidos,
considere cuánta potencia de batería está gastándose corriendo a velocidades tan altas.
Usted no necesita 75MHz para hacer uno más uno.
Programando
WaitForKey
2DROP ;
Los programas SysRPL tienen varias ventajas. Ellos pueden ser diminutos (como el código
para decir DISPROW1 se guarda en ROM). También se puede escribir y compilar en la
propia calculadora. Hay también hay gran oportunidad de encontrar un comando que hará
lo que usted quiere exactamente.
Ellos también tienen desventajas. Algunas personas encuentran complicado los programas
basados en el Stack difíciles de seguir. Generalmente no hay ningún tipo de comprobación a
la hora de compilar o ejecutar. También SysRPL sólo se encuentra en las calculadoras HP.
Hay una gran posibilidad que usted nunca encontrará a una persona en vida real que pueda
programarlo. Tampoco no puede controlar el hardware ARM directamente. Olvídese de
escribir un programa que pueda usar escala de grises en puro SysRPL. Finalmente, es lento
como la mayoría de los comandos de SysRPL todavía emulados.
El proyecto HP-GCC apunta a ofrecer una alternativa más conveniente. HP-GCC es:
Compilador para ARM assembler. El código de HPGCC no se emula para que corra
sumamente rápido. Las estimaciones iniciales lo pusieron para depender cien veces la
velocidad de SysRPL. El programador pueden conservar la duración de la pila y todavía
pueden conseguir un incremento de velocidad grande bajando la velocidad del CPU.
Poderoso. Usted puede fácilmente acceder a bajos niveles de recursos del hardware,
como el controlador de escala de grises, timers, etc. Biblioteca de funciones son provistas
para la manipulación de estas cosas.
Luego, ejecute el instalador con un doble clic. Usted necesitara tener privilegios de
administrador para ejecutar el programa de instalación. En caso de tener un mensaje de
error, trate otra vez como administrador..
Luego usted deberá tener:
Donde usted podrá escoger los lenguajes Ingles/Francés /Alemán para la instalación.
Luego se muestra lo siguiente:
Click en Next otra vez, luego seleccione los components que desea instalar:
La instalación completa proporciona el código fuente (source code) de las librerías hpgcc,
pudiendo ser usada por desarrolladores. Click en Next:
Ahora, usted esta listo para la primera compilación. Usted debe tener ahora el siguiente
icono en su escritorio, haga doble clic sobre él.
Cierre la ventana de texto <New>, doble clic en el panel derecho, en hiworld.c y expanda la
ventana:
Para compilar el código, ir a el menú Tools, y luego seleccionar “Make this .hp”. La ventana
Output debe mostrar los siguientes mensajes:
Finalmente, envíelo a su calculadora con el HP software connectivity kit, o una tarjeta SD.
Hello, World!
(Hola Mundo!)
Por ahora, usted sabe como compilar y ejecutar 'hiworld.c'. ¿Que es lo que hace este
archivo?
La razón principal es que printf es una función de uso muy general. Por defecto, usando
printf tiene incluido soporte para diferentes tipos de datos. Después de todo, printf debe
imprimir enteros, strings, y números de punto flotante (floats y doubles).
Una simple optimización es omitir el soporte del punto flotante. Si usted sabe que no
necesitará imprimir floats o doubles, agregue #define TINY_PRINTF a la cabecera de su
archivo.
Esta versión trabaja exactamente igual que el último, pero ahora mide solo 6.5kb. Nosotros
podemos mejorarlo aún más.
printf() tiene que ocuparse de la impresión de los valores de diferentes tipos de datos,
pero nosotros queremos solo imprimir un string. La función puts() se encarga de imprimir
solo strings a la consola standard. Reemplazando printf() con puts() obtenemos un
archivo de casi 4.8kb.
print() es una función simple. No hace ningún texto estructurado. Él simplemente coloca
un string a la posición dada en la pantalla. printf es por otro lado mucho mas complicado.
Tiene un cursor que guarda la huella para la próxima posición para poner el texto
clearScreen() realmente llama una rutina en la ROM para borrar la pantalla. Así que es
bastante diminuto. clear_screen() por otro lado limpia la pantalla y restablece el cursor
arriba a la izquierda de la pantalla. Esto es un poco más grande. Una regla a manejar si
usted esta usando funciones standard de salida en C, como son puts o printf, es usar
clear_screen(). Caso contrario use clearScreen(). Si a usted no le importa el tamaño,
entonces simplemente use siempre clear_screen().
Luego nosotros tenemos print(). Este toma el string, y los parámetros X y Y. Note que los
ejes X y Y es como sigue:
Ahora, veremos un ejemplo que usa un nivel superior I/O. Compile y ejecute 'input.c' en el
directorio c:\arm-hp\examples\simple\. El código fuente es:
Este código demuestra el uso de funciones para leer enteros y string desde el teclado, y
usando printf para desplegarlos. gets() lee un string desde el teclado en la memoria.
readint(), lee un entero con su signo (+/-).
La única nueva funcionalidad aquí es el uso del generador del número aleatorio. srand() se
usa para instalar el generador de número aleatorio. Debe darse que un número que es
diferente cada vez que el programa es ejecutado. Esto se hace alimentándole el valor actual
de un cronómetro. Después de eso, rand() dará un número aleatorio.
Para juegos, cronometrar es esencial. Existen varios recursos para tratar con los timers.
Hardware Timers
El hardware timers ofrece cronometrados muy rápidos. Desafortunadamente esto varía con
la velocidad del CPU. Antes de usar un hardware timer, usted debe llamar a:
void sys_setupTimers()
Este fija el timers a un estado conocido actualizándolo a 750kHz por defecto. Si usted usa
esta función, usted debe llamar a void sys_restoreTimers() al final de su programa.
Este restaura el timers a valores predeterminados del sistema. Si usted cambia la velocidad
del CPU (si usted no sabe cual es entonces no la cambie) los timers serán incorrectos.
Sonido
Nota: unsigned significa “sin signo”, “unsigned int tono” significara que debemos ingresar tono en
forma de entero sin signo, nunca deberemos colocar un número con su respectivo signo (+500 ó
-500 es incorrecto; 500 es lo correcto).
void drawBlockXOR (unsigned char* sprite, int longitud, int x, int y);
Este se usa para dibujar un byte de ancho, gráfico de longitud variable a la pantalla. Estos
realmente difieren solo cuando dibujamos sobre un objeto existente. OR hace un pixel's
negro, XOR los invierte. Sprite contiene los datos para dibujar, la longitud es ahora varios
bytes haciendo a ese sprite, y X/Y es la posición superior izquierda para dibujar.
void fillTiles(unsigned char* sprite, int longitud, int x, int y, int derecha, int abajo);
fillTiles es usado para sombrear un área con el mismo sprite, embaldosando una y otra
vez. El uso es igual como para drawBlockxx, pero con 'right' tiles para el right y 'down'
tiles que se extiende hacia abajo de la posición inicial.
Aquí un ejemplo simple. Este dibuje un bloque en la pantalla que usted puede mover con las
teclas direccionales. Presione ON para salir.
Por defecto, el gráfico es un bloque sólido. Pero alterando los valores de b[], usted puede
cambiar la apariencia del sprite.
La Tarjeta SD
Esta sección solo se aplica a la HP49g+. No trate de usar estas funciones en una 48gii o
39g+.
HPGCC provee una interfaz a la tarjeta SD. Se proveen las siguientes funciones:
fopen(),fclose(),fread(),fwrite(),fputc(),fputs(),fgetc(),fgets(),fdelete()
Estas funciones son similares a los standards. El siguiente ejemplo creará un archivo
"testme.txt” en el directorio raíz de la tarjeta SD. Escribirá "Probando 1, 2, 3" en él.
Los archivos pueden ser abiertos con los modos Read ('r'), Write ('w') o Append('a’).
Las subcarpetas pueden manipularse con el carácter '/'. EG, para abrir archivo 'bob' en
carpeta 'joe', open "joe/bob". Para crear una nueva carpeta, trate de ejecutar fopen en el
nombre de la carpeta.
fopen("new/", "w");
El modulo 'Saturn' incluido con HP-GCC maneja el stack RPL. Le permite empujar y
estallar (push & pop) varios tipos de objetos, y hace la manipulación básica del snack.
Lo primero que se debe conocer es que hay un par de funciones que deben usarse antes de
acceder al stack. Antes de hacer cualquier operación con el stack, usted debe llamar a
sat_stack_init(). Guarde el valor que devuelva, y luego pase el valor a sat_stack_exit
al final de su programa. Usted no debe olvidar esto, estas funciones son necesarias para
prevenir posibles pérdidas ó caídas de memoria.
Otra cosa para conocer es que si usted va empujar objetos grandes al stack usted necesitara
preparar su programa HP-GCC para reservar mas espacio para estos objetos.
Por defecto, 10kb son reservados para empujar los objetos hacia el stack. Usted puede editar
hpgcc.bat para incrementar este número. Cambie la línea:
set hpgcc_rplstacksize=10000
para un número superior para reservar mas memoria si es necesario. Con tal que exista
memoria suficiente que garantice poder empujar cinco objetos en el stack. Usted puede
revisar hpgcc.bat para aumentar este límite, a expensas de un mayor uso de memoria.
Como un ejemplo muy simple, considere un programa que empuja el string "Hola mundo!" al
stack
Aquí otro ejemplo. Este toma un entero exacto (conocido como un ZINT en términos HP) del
stack, lo duplica, y coloca el resultado como un ZINT.
Nota: Si usted tiene en el stack 10, después de ejecutar el programa usted obtendrá 20, si
usted no tiene nada o un número con decimales, usted obtendrá 0.
sat_pop_zint_llong() hará estallar un ZINT fuera de la cima del stack, y devuelve el valor
como un LONGLONG. Un LONGLONG es un signed 64 bit tipo entero, puede soportar
números entre +/- 1.8*10^19. Intentar colocar ZINTs fuera de este rango dará un resultado
malo.
sat_push_zint_llong() acepta un LONGLONG, y lo empuja al stack RPL como un ZINT.
Note que este programa no hace una comprobación de errores. ¿Que pasa si el usuario tenia
el stack RPL vació? ¿Qué pasa si el primer item en stack es un string, y no un ZINT? Aquí un
programa que lo demuestra haciendo estallar 2 ZINTs fuera del stack, agregando y
empujando el resultado...mientras se asegura que hay 2 ZINTs.
Primero, usted debe verificar cuantos items hay en el stack. Si hay menos de 2, entonces
fallará. sat_stack_depth() puede usarse para verificar esto. Note el uso de un GOTO
(naughty!) para saltar a un código de limpieza.
Luego, usted debe verificar el tipo de los 2 objetos. El módulo Saturn provee para examinar
objetos o elementos desde el stack. Primero declare los 2 objetos para hacerlos estallar con
SAT_STACK_ELEMENTS's. Luego, la función sat_get_stack_element() es usado para
obtener los datos del elemento fuera del stack. Este acepta un pointer para el elemento del
stack, y examinar el nivel del stack. Esta función no hace estallar los elementos fuera del
stack! Este simplemente nos permite recuperar información sobre los elementos, no los
propios elementos.
Numerosas bibliotecas son incluidas con HP-GCC. HPG es un API de Gráficos y Escala de
grises de propósito general. Incluye muchos ejemplos y documentación en otra parte así que
ésta será apenas una gira breve.
El modo más versátil de HPG es doble buffered, 16 escala de grises. Esto da 16 niveles de
grises con el mínimo parpadeo/caída. Comenzaremos con un programa que despliega texto
en varios niveles de gris.
Esto es bastante simple. Cuando esta usando HPG debe usar #include <hpgraphics.h>.