34
Programando con HPGCC Traducido al Español por Oscar Fuentes F. Pág. 1 Programando con Guía de Inicio Rápido. Este manual apunta darle al usuario una breve introducción de programación en la HP49G+ con HP-GCC. No se intenta enseñar el lenguaje de programación C. Si usted es nuevo en C, hay muchas tutoriales de C on-line que usted puede mirar primero. Esta guía se refiere a las características de HPGCC Versión 2.0. Por favor seleccione uno de los capítulos debajo: 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.

Manual Hpgcc Español

Embed Size (px)

DESCRIPTION

Manual hpgcc español para HP50g

Citation preview

Page 1: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 1

Programando con

Guía de Inicio Rápido.

Este manual apunta darle al usuario una breve introducción de programación en la

HP49G+ con HP-GCC. No se intenta enseñar el lenguaje de programación C. Si usted es

nuevo en C, hay muchas tutoriales de C on-line que usted puede mirar primero.

Esta guía se refiere a las características de HPGCC Versión 2.0.

Por favor seleccione uno de los capítulos debajo:

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.

Page 2: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 2

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

Page 3: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 3

INTRODUCCION

Antes de extendernos, usted debe conocer la arquitectura de las modernas

calculadoras HP’s. Las anteriores calculadoras graficas HP usaban un procesador

personalizado conocido como 'Saturno'. Durante muchos años, el código de la calculadora

se desarrollo para este chip. Desgraciadamente el Saturno era un CPU muy lento. Como

Saturno sólo corría a 4MHz los programadores tenían que acudir al lenguaje ensamblador

para obtener mayor velocidad.

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.

El código existente de la calculadora fue escrito para el procesador Saturno.

Reescribirlo a ARM era tremendamente caro. Así que HP escribió un programa que hizo el

ARM pretender ser un Saturno. Este proceso es conocido como emulación, pero

desgraciadamente crea un descenso grande de velocidad. El resultado es una 49g+ de 2 a 5

veces más rápida que la 49g.

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.

Es aquí donde HP-GCC entra. Le permite escribir programas que corren

directamente en el chip ARM.

Page 4: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 4

Programando

Tradicionalmente en el mundo HP, grandes programas son escritos en System RPL o

lenguaje Saturno assembler. Yo no entraré en el lenguaje assembler, cuando nadie lo debe

tener que programar hoy (a menos que algunos quieran por supuesto!)

SysRPL es un lenguaje basado en el stack. "Hola Mundo" en SysRPL podría parecer como:

:: DOCLLCD Limpia el LCD

"Hola mundo" Coloca el string "Hola mundo" en el stack

DISPROW1 Despliegue en la fila 1 de la pantalla

WaitForKey

2DROP ;

@ fin del programa

"Hola Mundo" usando HPGCC es

Page 5: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 5

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:

Un compilador C. C se usa ampliamente en la industria - por ejemplo, el Kernel de Linux

es principalmente escrito en C. Como a tal hay una gran variedad de recursos en la web.

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.

Page 6: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 6

HPGCC 2.0 -Tutorial de Instalación en Windows

Primero, descargue el archivo mas reciente setup.exe desde el mirror HPGCC.

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:

Page 7: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 7

Click en Next, luego, seleccione el directorio de instalación:

Click en Next otra vez, luego seleccione los components que desea instalar:

Page 8: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 8

La instalación completa proporciona el código fuente (source code) de las librerías hpgcc,

pudiendo ser usada por desarrolladores. Click en Next:

Next otra vez:

Page 9: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 9

Y espere que el proceso de instalación finalize:

La pantalla final le preguntara la última operación a ejecutar:

Page 10: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 10

Por conveniencia, nosotros recomendamos agregar automáticamente el PATH con el

instalador, simplemente click en Finish.

El mensaje final es:

Finalmente, el archivo readme.

Page 11: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 11

Ahora, usted esta listo para la primera compilación. Usted debe tener ahora el siguiente

icono en su escritorio, haga doble clic sobre él.

Usted abrirá el editor de texto:

Page 12: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 12

Para compilar su primer programa, ir ha File/Open Project(s) y seleccione un archivo

proyecto en c:\Program Files\arm-hp\examples/hiworld/hiworld.pnproj:

Al abrirlo, usted tendrá la siguiente pantalla en blanco:

Page 13: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 13

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:

La línea “elf2hp…” significa que todo esta correcto.

Page 14: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 14

Ahora, abra el explorador y seleccione el archivo .hp:

Finalmente, envíelo a su calculadora con el HP software connectivity kit, o una tarjeta SD.

Para correrlo en su calculadora, usted necesita el ARMToolBox que es dado en el directorio

respectivo:

Page 15: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 15

Instálelo enviando el archivo SETUP.BIN a su HP49g+. Para seleccionar el numero del

puerto para instalar la biblioteca en su calculadora, coloque el número del puerto como un

número real en el stack (por ejemplo 1: 2.0), luego ejecute SETUP.BIN.

Cuando la instalación finalice, reinicie su calculadora para atar la biblioteca (ON+C).

Para finalizar ejecute su programa hiworld, coloque el correspondiente string ARM en el

stack, seleccione el comando PrRUN del ARMToolBox y veras lo que pasa…

Page 16: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 16

Hello, World!

(Hola Mundo!)

Por ahora, usted sabe como compilar y ejecutar 'hiworld.c'. ¿Que es lo que hace este archivo?

El archivo contiene el siguiente código:

La primera línea, #include <hpgcc49.h>, incluye los archivos necesarios de

encabezado. Casi siempre debe estar allí.

clear_screen() obviamente limpia la pantalla de la calculadora.

Ahora está el código bucle hasta que la tecla ON es presionada. Sin él, el programa

terminaría tan rápido que usted no podría ver el texto. Como usted podrá suponer

keyb_isON() devuelve TRUE si la tecla ON es presionada.

Otros teclado útil a funciones relacionadas son keyb_isRS(), keyb_isLS() y

keyb_isAlpha(). Estos retornan el estado de las teclas Right Shift, Left Shift y Alpha

respectivamente. ON, Alpha y las teclas Shift son todas conectadas directamente al CPU.

Las teclas restantes son conectadas a una formación matricial. Para probar para una tecla

use keyb_isKeyPressed(columna, fila). Este retorna TRUE si la tecla (columna, fila)

es presionada. Desafortunadamente los números fila y columna no coinciden con la posición

física de las teclas. Use el siguiente grafico para determinar las coordenadas para cualquier

tecla.

Page 17: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 17

También esta keyb_isAnyKeyPressed(). Esta retorna TRUE si cualquier tecla se esta

presionando.

Optimizando el tamaño: Varias formas de Hello World

Hay un pequeño problema con este programa: Tiene más de 10kb! Es muy grande para un

programa tan simple.

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.

Page 18: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 18

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.

Si el tamaño es realmente un problema, nosotros podemos desviar las funciones de salida

standard y escribir directamente a la pantalla. El siguiente programa mide cerca de 4.5kb.

Page 19: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 19

La primera diferencia es el uso de la función clearScreen() para limpiar la pantalla.

En la versión anterior, nosotros estábamos limpiando la pantalla con clear_screen() –

ahora nosotros estamos usando clearScreen(). Esto es un poco confuso. ¿Por qué se tiene

2 funciones para limpiar la pantalla?

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().

Note que ambos clearScreen() y clear_screen() solo trabajan si usted no esta

usando una librería gráfica.

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:

Así, (0,0) es realmente la esquina superior izquierda, no la inferior izquierda.

print("Hello, World!!",0,0); imprimirá el texto "Hello World" en la esquina superior izquierda de la pantalla.

Page 20: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 20

Algunos ejemplos de Nivel Superior

(Consola I/O)

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 (+/-).

Algunas otras rutinas de teclado son: readuint(entero sin signo), readdouble,

readlonglong, y readulonglong(long long sin signo). Algunas rutinas de salida

son:

Page 21: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 21

puts(char * string) – Imprime un string en la pantalla. Esta es una función standard

de C, como print(), pero usted no puede especificar directamente donde escribirá el string.

home() – Devuelve el cursor a la esquina superior izquierda.

gotoxy(int x, int y) – Mueve el cursor a la posición X, Y.

Como otro ejemplo, aquí un simple juego adivinaza. El programa escoge un número entre

cero y cien, y usted tiene que adivinarlo. El programa le dirá si su suposición es demasiado

alta, o demasiado baja.

Page 22: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 22

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.

Page 23: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 23

Timers, Sonidos y Gráficos Simples

Para juegos, cronometrar es esencial. Existen varios recursos para tratar con los timers.

El Reloj de Tiempo Real

El mejor recurso para elegir el momento adecuado de baja velocidad y retrasos es el Real

Time Clock (o RTC). El RTC es generalmente usado para guardar el tiempo actual. Usted

puede recuperar el tiempo actual usando sys_RTC_seconds() – Este devuelve

sec+60·min+3600·hour.

El RTC también proporciona un “Tick” (señal) programable de salida. La frecuencia del

Tick es independiente de la velocidad del CPU principal.

sys_isRTCTick() es usado para leer el Tick de salida. Devuelve 1 si un RTC Tick ah

ocurrido desde la ultima vez que fue llamado. Por defecto (en ROM 1.23), la frecuencia del

Tick es 8 Hertz. La frecuencia del Tick puede programarse usando:

unsigned char sys_setRTCTickPeriod(unsigned char n)

Esta función toma un número, n. Esta función fija el periodo RTC tick a (n+1)/128 segundos.

n debe estar entre 1 y 127. Esta función devuelve el viejo valor de n, es muy recomendado que

si usted usa esta función, usted restaure el periodo del Tick a la anterior frecuencia al final

de su función.

Luego, tenemos:

void sys_waitRTCTicks(int count)

Esta función simplemente espera por 'count' ticks para pasar a la frecuencia por defecto de

8Hz, sys_waitRTCTick(8) espera aproximadamente por 1 segundo. Incrementando la

frecuencia del RTC Tick mejorando la exactitud del delay.

El Real Time Clock solo proporciona una salida entre 1Hz y 128Hz. Para cronometrar

rápidamente usted debe usar un timer de hardware especializado.

Page 24: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 24

Hardware Timers

Nota: El soporte de Hardware Timer es actualmente experimental, y no es muy exacto. Esta

documentación espera ser revisada.

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.

Para usar el Timer, llamar

void sys_waitTicks(unsigned int tiempo)

Esto retrasa los ticks para 'time'. En modo lento, los ticks deben ocurrir cada 750kHz.

sys_waitTicks(750000) debe tardar alrededor de un segundo.

Sonido

El buzzer interno es bastante fácil de manipular. Es conectado a un propósito general I/O

pin, pin B2. Alternando estos pin produciremos sonidos.

void sys_playTone(unsigned int tono, unsigned int duración)

se proporciona para hacer sonidos simples. Esta función confía en el Hardware timers, con

sys_setupTimers() lo llama para usarlo.

Básicamente, 'tono' es una frecuencia en Hertz y 'duración' es un tiempo en centésimas de

segundo. Un 'fudge factor' a sido aplicado para corregir la inexactitud de la cronometración

del sistema. Los resultados no son súper exactos, pero son bastantemente buenos para efectos

de 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).

Page 25: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 25

Rutinas de Gráfico Simples

Actualmente hay 2 Bibliotecas Graficas que trabajan con Escala de Grises incluidas en

HPGCC - HPG y GGL. Estas bibliotecas son poderosas pensada para juegos y aplicaciones

mas complicadas. Esta página particular involucra las rutinas monocromáticas primitivas

incluidas en HPLib.

Estas rutinas son proyectadas para aplicaciones graficas muy simples. Ellos no son double

buffered y operan en el área de la pantalla predefinida. No trate y combine estos con otras

bibliotecas Gráficas. Además, ellos no son fijas – intentar dibujar fuera de los limites de la

pantalla puede causar corrupción de memoria.

void clearScreen();

Limpia la pantalla.

void invertScreen();

Una función simple de pantalla – este invierte los colores del LCD (es decir negro se hace

blanco, blanco se hace negro). Esto sólo se invertirá por un ciclo de poder – llamando

invertScreen() otra vez no devolverá la pantalla normal. Esto es una ayuda útil de

depuración.

void LCDSynch();

Esta rutina espera, y solo retorna cuando el LCD ah finalizando redibujando la pantalla. Es

útil para prevenir una caída durante la manipulación de la pantalla directamente. No útil

para programas simples, solo juegos o animaciones.

void drawBlockOR(unsigned char* sprite, int longitud, int x, int y);

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.

Page 26: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 26

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.

Page 27: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 27

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.

Page 28: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 28

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");

Creará una nueva carpeta, llamada new.

En la actualidad es poco conocido sobre la funcionalidad de la tarjeta SD. Esto es manejado

por el OS de la HP y nosotros no tenemos mucha documentación sobre él.

Page 29: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 29

Soporte Stack RPL

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

Page 30: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 30

Usted puede ver el uso obligatorio de sat_stack_init y sat_stack_exit. Ademas, las

funciones sat_stack_push_string() empujan un string 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.

Page 31: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 31

Ahora este programa es considerablemente mas complicado. ¿Cómo funciona?

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.

Page 32: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 32

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.

Page 33: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 33

La Biblioteca de Gráficos HPG

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>.

Page 34: Manual Hpgcc Español

Programando con HPGCC

Traducido al Español por Oscar Fuentes F. Pág. 34

hpg_set_mode_gray16(1) pone HPG en el nivel 16, modo doble buffered. 16 Shade

obviamente mide que hay 16 sombras de gris para escoger. Doble buffering es una técnica

para reducir el parpadeo. Con el modo doble buffered, cualquier cambio a la pantalla solo

tiene lugar después de llamar a hpg_flip(). Este recurso que su pantalla entera es trazado

enseguida. Sin el doble buffering el usuario puede ver el parpadeo como los objetos son

estirados separadamente.

hpg_clear() es usado para limpiar la pantalla aunque HPG es activo.

' hpg_set_color(hpg_stdscreen, HPG_COLOR_XXX);' es usado para cambiar el color

actual. Además HPG_COLOR_BLACK, HPG_COLOR_GRAY_1 (muy claro) a GRAY_15 (muy oscuro).

hpg_draw_text() funciones simples como print(), pero este dibuja el color actualmente

seleccionado.

Aquí esta otro ejemplo que dibuja algún texto y formas en la pantalla. Vea la documentación

de referencia de HPG para una explicación de cada función.