Introducción al TONC
Escrito el Viernes 12 de Septiembre del 2008 por Ealdor
[A] Organización
TONC consiste en tres partes: una sección de texto, el tutorial actual, una sección de código, la cual contiene todo el código fuente y makefiles de varias demos, y una sección bin que contiene los binarios de las demos. Están en zip separados, pero funcionan mejor cuando se usan conjuntamente. Puedes encontrar estos archivos zip un poco más abajo en está página. Si los descomprimes en un directorio, llamado tonc, tendrás una estructura igual a la que se muestra en la figura de la derecha.
(1) Texto TONC
La sección de texto cubre los principios de la programación de la GBA en detalle. El objetivo aquí no es tanto sobre como hacer funcionar algo, sino como las cosas realmente funcionan, y porque se hace de la forma en la que se hace. Despues de eso, el "como" viene de forma natural. Todos los capítulos tienen una o más de una demostración de la teoría cubierta, y una pequeña discusión de la demo. Porfavor, no cometas el error de solo leer la discusión de la demo: para entender mejor como funcionan las cosas necesitas leer el texto por completo. Mientras que hay partes opcionales, y paginas enteras de texto aburrido que parecen no tener relación con la codificación de la GBA, estos artículos están ahí por una razón y usualmente contienen información extra de conceptos.
Al principio, la parte de texto solo contenía muy poco código en el, luego me dí cuenta de ese error y empecé un proceso de incluir más código en esas páginas; quizas no suficiente como para copiar y pegar y obtener una compilación limpia, pero lo suficiente como para ir con las explicaciones de las demos.
El principal lenguaje será C y un poquito de ensamblador. Estos son los dos principales lenguajes usados en la programación de la GBA aunque hay otros. Ya que los fundamentos de la programación son independientes del lenguaje, podría ser posible adaptar tu lenguaje escojido facilmente.
La programación de la GBA se hace cercana a el hardware, así que espero que tengas conocimientos sobre punteros, números hexadecimales y algebra de Boole/operaciones con bit. Hay tambíen una considerable cantidad de matemáticas aquí, la mayoría relacionada con vectores y matrices. Por último, asumo que tus capacidades intelectuales excedan a la de un mono de laboratorio, por lo que no voy a explayarme demasiado sobre lo que considero cuestiones trivales.
Salvo por la introducción y los apéndices, el texto está dividido en 3 partes. La primera "básico", la cual explica lo absolutamente esencial para conseguir hacer cualquier cosa. Esto incluye configurar el entorno de desarrollo, usos básicos de los gráficos y botones. También contiene texto sobre lo que significa la programación a bajo nivel y la programación eficiente; temas que en mi opinión mas vale aprender mas temprano que tarde. La segunda parte cubre la mayoría de los otros temas de la GBA como por ejemplo los efectos gráficos especiales, temporizadores e interrupciones. La sección final cubre los temas más avanzados que usa elementos de todos los capítulos. Esto incluye la escritura de texto (si, es un tema avanzado en la GBA), el modo 7 gráfico y un capítulo sobre ensamblaje ARM.
Html individual: tonc-text.zip (663 KB)
Html compilado: tonc.chm (1.2 MB)
PDF: tonc.pdf (3.1 MB)
(2) Código TONC
Los códigos fuente de todas las demos mencionadas en el texto pueden ser encontradas en el directorio code. Como en el texto, el código está dividido en 3 partes principales: básico, extendido y avanzado. Los proyectos básicos son (espero) para los muy novatos. Son completamente autónomos para que puedas jugar con ellos sin preocuparte de estropear las otras partes. Los proyectos de extendido toman su código de tonclib, una librería con todas mis #defines y funciones importantes. Las demos de avanzado también usan tonclib literalmente y usarán algunos archivos ensambladores, incluso si es solo para datos. También hay un directorio laboratorio con algunos proyectos interesantes, pero que podrían no estar del todo listos. Aunque son interesantes para hecharle un vistazo, no obstante.
A diferencia de la mayoría de los tutoriales sobre la GBA, tonc usa makefiles en vez de batchfiles para construir los proyectos, ya que son simplemente mejores que los batchfiles. Sin embargo, como muchos de vosotros nunca los habéis visto antes, estos también vienen divididos en tres etapas de dificultad. Hay un master makefile, tonc.mak, en el directorio raíz de code, y el directorio vc6 tiene un proyecto Visual C++ que puedes usar si estás en Windows y tienes una versión de Visual Studio.
La mayoría de las funciones generales usadas en tonc pueden ser encontradas en tonclib. Esto incluye 'text writers' para todos los modos, rutinas de BIOS, un bonito despachador de interrupcion, copia segura y rapida de memoria y rutinas de relleno y mucho más. Merece la pena usarlas.
Descargar: código-tonc.zip (198 KB)
(3) Binarios TONC
El directorio bin contiene los binarios de las demos. Cada uno de ellos ha sido testeado en un cierto número de emuladores, y en hardware usando un cable de comunicación casero Xboo (mira www.devkitpro.org para las instrucciones sobre como hacer uno). En la mayoría de los casos el comportamiento ha sido exactamente el mismo. El archivo tonc_bins.txt indica cuando y donde se producen diferencias entre el hardware y los emuladores.
Descargar: tonc-bin.zip (167 KB)
(4) Declaración de Propósito
Escribí Tonc por dos razones. En primer lugar, como una manera de organizar mis propias ideas. A menudo se suelen ver las cosas bajo una luz diferente cuando escribes las cosas y aprendes de esa experiencia. Segundo, hay una gran cantidad de información mala en otros tutoriales por ahí (las únicas excepciones que conozco son new PERN y el tutorial de sonido de Deku). Si, soy consciente de la manera que suena, pero desaforunadamente sucede de verdad. Unos cuantos ejemplos:
- Solo se da información muy básica, a veces incluso es incorrecta la información.
- Se centran en los modos bitmap, los cuales casi nunca se utilizan para una programación seria de la GBA.
- Malos habitos de programación. Adición de código/datos a los proyectos utilizando #include, uso de herramientas antiguas, configuración no óptima del compilador y tipos de datos, y un código ineficiente (a veces muy ineficiente).
Si eres nuevo y has seguido otros tutoriales, todo parecerá que funciona bien, asi que ¿cuál es el problema?, bueno, eso es parte del problema en realidad. Todo parecerá que funciona correctamente, hasta que empieces proyectos de mayores dimensiones, momento en el que encontrarás errores ocultos y ese código lento atascará/embarrará todo y tendrás que olvidar todos los malos hábitos que has ido adquiriendo y rehacer todo desde el principio. La GBA es una de las pocas plataformas donde la eficiente codificación aún significa algo, y a veces todo lo que se necesita es un cambio de tipo de dato o de compilador. Estas cosas es mejor hacerlas bien desde el principio.
He intentado ir a por todo al principio y simplificar después. Como dijó una vez un científico de 'pelo en pecho': "Haz las cosas tan simples como puedas, pero no más simples". Esto significa que las cosas pueden parecer un poco técnicas a veces, pero eso es solo porque las cosas son bastante técnicas en ocasiones, y no hay razón para pretender que no lo son.
En resumen, Tonc no es "Programación de la GBA para Dummies", nunca lo ha sido y nunca lo será. Hay ya muchísimas cosas para novatos de todas formas. Si te consideras un dummy (y me refiero a dummy, no novato), quizás Tonc no es el lugar adecuado. Sin embargo si estás decidio seriamente a aprender la programación de la GBA no aceptes otro substituto.
[B] Terminología y Notación
Soy un físico de formación lo que significa que conozco las notaciones matemáticas. Las utilizo bastante a menudo en Tonc, así como un número de etiquetas html. Para asegurarme de que tengamos la misma idea aquí hay una lista:
| Tipo | Notación | Ejemplo |
|---|---|---|
bit n in a foo | foo{n} | REG_DISPCNT{4} (active page bit) |
| code | <code> tag | sx |
| command/file | <tt> tag | vid.h |
| matrix | bold, uppercase | P |
| memory | hex + code | 0400:002eh |
| new term | bold, italic | charblock |
| variable | italics | x |
| vector | bold, lowercase | v |
Tambien uso algunos símbolos no ASCII que quizás no se muestren correctamente dependiendo de que tan viejo sea tu navegador. Estos son:
| Simbolo | Descripción |
|---|---|
| α, β, γ | Greek letters |
| ≈ | approximately |
| ½ | one half |
| ¼ | one quarter |
| ¾ | three quarters |
| ≥ | greater or equal |
| ↔ | double-sided arrow |
| ∈ | is in (an interval) |
| 〈 〉 | ‘bra’ & ‘ket’ |
| → | right arrow |
| ² | superscript 2 |
| × | times |
Tambien hago uso libre de la taquigrafía para los tipos de primitivas en C como char, int y demás. Estos son los typedef que mejor indican el tamaño de la variable que se usa. Ya que es esto es muy importante en la programación de consolas, son muy comunes. De todas formas, aquí está la lista:
| Tipo Base | nombre alt. | sin signo | con signo | volatil |
|---|---|---|---|---|
| char | byte | u8 | s8 | vu8 / vs8 |
| short | halfword | u16 | s16 | vu16 / vs16 |
| int | word | u32 | s32 | vu32 / vs32 |
Finalmente, hay un número de diferentes notaciones para los hexadecimales que dependiendo de la situación utilizaré una u otra. La notación C (prefijo '0x', 0x0400) es común para numeros normales, pero también utilizaré el afijo ensamblador a veces ('h', 0400:0000h). Los dos puntos aquí es simplemente para facilitar la lectura. Es dificil decir el números de ceros que hay sin ellos.
(1) Descripciones y nombre de los registros
Conseguir que la GBA haga cosas normalmente involucra el uso de los denominados registros IO. Determinados bits en determinadas direcciones de memoria pueden ser usados para cambiar entre diferentes efectos que la GBA es acapaz de realizar. Cada registro es un alias como una variable normal y necesitas activar/desactivar bits usando operaciones con bit. Veremos más tarde donde están estos registros y que bit hace que; ahora te quiero mostrar como presentaré los registros, y como me referiré a ellos en el texto.
Cada resgitro está asignado a un puntero, usualmente de 16 bits de longitud. Por ejemplo, el resgitro 'display status' es:
#define REG_DISPSTAT *(u16*)0x04000004
Siempre que introduzca un registro daré una visión general de los bits de esta manera:
| F E D C B A 9 8 | 7 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| VcT | - | VcI | HbI | VbI | VcS | HbS | VbS |
La tabla muestra el nombre del registro (REG_DISPSTAT, su dirección (0400:0000h) y los bits individuales. Algunas veces, los bits o los registros enteros son de solo lectura o solo escritura. Los de solo lectura estan indicados con un barra roja encima. Los de solo escritura se indican con un barra azul inferior. Después de la tabla habrá una lista donde se describirán los determinados bits, y tambien muestra los #define/s que utilizo para esos bits:
| bits | nombre | define | descripción |
|---|---|---|---|
| 0 | VbS | DSTAT_IN_VBL | Estado del VBlank, solo lectura. Estará activado dentro del VBlank, y desactivado en el VDraw. |
| other fields | |||
| 8-F | VcT | DSTAT_VCT# | Valor de disparo/activación del VCount. Si el scanline esta a este valor, el bit 2 se activa y una interrupción se activa si se solicita. |
La lista completa del REG_DISPSTAT puede ser encontrada en el capítulo sobre la introducción a los gráficos de la GBA. Por cierto, los #defines son generalmente específicos de tonc. Cada sitio y API tiene su propia terminología aquí. Esto es posible porque no son los nombres lo que es importante, sino los números que representan. Esto es valido para los nombres de los registros propios también, por supuesto. Un último punto sobre los #defines: algunos de los listado tienen un hash ('#') de afijo. Esta es una notación abreviada para indicar que la celda tiene #defines foo_SHIFT y foo_MASK, y una macro foo(). Por ejemplo, el registro display tiene una celda VCount de 8 bits de activación, la cual contiene 'DSTAT_VCT#' en la columna define. Esto significa que las siguientes tres cosas existen en la cabecera del tonc:
#define DSTAT_VCT_MASK 0xFF00
#define DSTAT_VCT_SHIFT 8
#define DSTAT_VCT(_n) ((_n)<<DSTAT_VCT_SHIFT)
Por último, como forma abreviada para un bit específico en un registro, usaré llaves. El número será un número hexadecimal. Por ejemplo, REG_DISPCNT{0} es el bit estado del VBlank (VbS arriba), y REG_DISPCNT{8-F} será el byte entero para el activado del VCount.
[C] Prerequisitos
El texto y código han sido creados para trabajar bajo las siguientes condiciones. Si descubres que tienes un problema, muestramelo y quizas podamos solucionarlo:
- Lenguaje de programación. El lenguaje que usaremos es C con un poquito de ensamblador (pero no C++). Estoy trabajando bajo la suposición de que estás familiarizado con este lenguaje. Si no, ve a aprenderlo primero porque yo no te lo voy a enseñar; esto no es un curso de C. Hay algunos links a tutoriales de C en las referencias.
- Compilador. Obviamente, necesitas un compilador que pueda convertir el código C en un binario de GBA. Yo estoy usando el conjunto de herramientas gratuitas devkitARM (dkARM), el cual está basado en la colección de compiladores GNU (GCC). Las instrucciones de configuración y ejemplos pueden encontrarse en el sitio, y en mi sección, por supuesto. DkARM se ha convertido en el estandar durante el último año o así; si estás usando aún el antiguo DevKit Advance, deberías pensar en cambiarlo. No puedo decir que de dificultoso puede ser que HAM acepte mis codigos/makefiles, pero no debería ser dificil. Si usas el Arm ADS oficial, perdón pero tu estás solo.
Para escribir y administrar mi código yo uso Visual C++ 6.0, pero no estoy utilizando su herramienta make nativa (NMAKE), ya que no es muy portable y parece ser bastante debil también. En lugar de ello, utilizo GNU make, el cual por lo general viene con cualquiera de los devkits.
- Binarios. Necesitarás también algo que pueda ejecutar/correr binarios. En el lado de los emuladores, yo utilizo tanto VisualBoy Advance (VBA) v1.7 o mayor, como no$gba, edición gratuita. Pero aunque los emuladores seán extraordinarios, deberías ser capaz de testearlos en un GBA real también. Consigue una flash card o, si tienes poco presupuesto, siempre puedes construirte tu mismo un cable multibbot como el Xboo. Deberías ser capaz de conseguir todos los componente por menos de 5$.
- Sistema Operativo. Yo utilizo el sistema oprtaivo Windows (Win 98 y WinXP) y cuando me refiero a comandos o programas asumo que también lo estás utilizando. Un usuario de Linux, por ejemplo, le dará poco uso a los proyectos Visual C y no podrá ser capaz de usar Usenti (mi editor de bitmap) o Excellut (mi constructor de LUT en excel).
- Explorador. He testeado estas páginas con MSIE 6 y 7, con Firefox y en ocasiona con Opera también. Salvo en una o dos excepciones, todo es HTML 4.01 y CSS 2 valido. Sin embargo, IE no es un explorador compatible así que hay uno o dos pequeños glitches. Firefox en cambio es muy compatible y hace caso omiso a las etiquetas basadas en columnas en las tablas (los estandares CSS y HTML tienen conflictos con este problema). Pero de nuevo, estas situaciones no son demasiado significantes. En el caso de que quieras una copia impresa, va a salir como si el navegador tuviera aproximadamente 640 pixeles de ancho. Personalmente, prefiero fijar el tipo de la fuente a 'pequeña'; siento como si perdiera la perspectiva con un tamaño 'normal'. Notese que el texto entero es de aproximadamente 300 páginas de largo, así que debería considerar la reducción de las páginas.
[D] Errores y sugerencias
Por mucho que he intentado eliminar errores ortográficos o enlaces rotos, estoy seguro de que algunos se me habrán escapado. Si encuentras alguno, escribeme un correo sobre ello. Por supuesto, si las cosas no están claras o son incorrectas, o si tienes alguna sugerencia, me gustaría saberlo también.
Y, por supuesto:
Esta distribución se provee tal como es, sin ninguna garantía de ningún tipo. No puedo ser responsable de cualquier daño que derive del uso o la imposibilidad de usar esta distribución. El código ha sido testeado en emuladores y en hardware real también, pero no puedo garantizarlo al 100%.
El código puede ser usado y/o modificado como quieran. El texto y código están destinados a ir juntos; si tienes que separar el texto de el código, al menos proporciona un enlace al lugar donde se originaron ambos (por ejemplo, este sitio).
Ambos, texto y código, pueden ser modificados por mí en cualquier momento. Comprueba de vez en cuando para ver si algo ha cambiado. Las fechas de los cambios se muestrán en la parte inferior de cada página y en la parte superior de todos los archivos de código fuente. También hay un log en los apéndices.
Ok, eso ha sido todo. Que os divirtais.
- Jasper Vijn (cearn at coranac dot com)
(15 de Agosto del 2008)