Kana DS

Learning Japanese writing on the Nintendo DS

30 December, 2006

Left channel only sound in Libnds

This post is written in English so that anybody can find it when searching Google for the topic.

Problem:

Homebrew program with LibNDS only plays sound on the left channel of the console. Panning correctly set, of course.

Solution:

You are problably using an ARM9-only template from the libnds-examples package at SourceForge.net. Using the 'templates/combined' project solved the problem for me (I'm using a DS-Xtreme in case you wonder), all sounds finally playing on both channels. This project template generates a binary for both ARM9 and ARM7 processors.

I know it's weird stuff but it works. Even though I have spent many hours looking into LibNDS' source code, I'm still wondering why..

Anyways, happy coding and best wishes for 2007!

19 December, 2006

Arquitectura de Nintendo DS

El problema principal al que se enfrenta cualquier programador de Nintendo DS es su atípica organización y esquema de memoria. Entender cómo y para qué se usa cada banco de memoria es fundamental para poder hacer funcionar hasta la más simple de las aplicaciones.

Con esta entrada pretendo mostrar lo diferente que resulta programar un juego para consola de para PC, que es con lo que casi todo el mundo empezamos. Vamos a ver las entrañas de esta consola super-ventas con el siguiente esquema, prestado de Dev-Scene.com:



Los puntos a destacar son:

Memoria principal (4MB)
Almacena los ejecutables y la mayoría de los datos de juego en curso. Los juegos caseros normalmente no pasan de estos 4MB para evitar tener que acceder a la memoria del flashcart mediante FAT16/32, siendo el método dependiente de cada familia de cartuchos.

Procesador ARM 9 ( 32bits / 66Mhz )
Recoge las instrucciones de memoria principal, y cuenta con una caché de 32KB para instrucciones y otra de 16KB para datos. Por lo general, este procesador es el encargado de llevar las riendas del programa, ejecutar la lógica del juego, gestionar los recursos, etcétera.

Procesador ARM 7 ( 32 bits / 33Mhz )
Para minimizar el acceso a memoria principal, al ARM 7 tiene acceso a una pseudo-caché 'IWRAM' de 64KB para instrucciones y datos. Este procesador suele gestionar el audio e input, haciendo las funciones de un DSP a veces. Por lo tanto, es necesario que los ejecutables para el ARM7 sean pequeños y quepan totalmente en la IWRAM(justo debajo en el esquema)

Dejadme remarcar el hecho de que las aplicaciones para la consola requieren usar dos ejecutables diferentes: uno para el ARM9 y otro para el ARM7. El último normalmente será 'esclavo' del primero, y atenderá sus peticiones en cuanto a playback de sonidos, lectura del touchscreen etc. Por tanto, es necesario algun mecanismo para que ambos procesadores puedan comunicarse entre sí.

Una manera es, como se explica en el wiki de NDSTech, usar los dos bancos de memoria compartida etiquetados como 'wram' en el esquema. Cada banco posee 16KB y sólo está disponible para un sólo procesador a la vez. Alternando el acceso a cada banco, se puede implementar un sistema de paso de mensajes para por ejemplo transferir paquetes de red o buffers de sonido. Por suerte, ndslib provee un ejecutable estándar para el ARM7 que ya implementa funcionalidades básicas para gestionar efectos de sonido y lectura de los botones y la pantalla táctil.

Tenía pensado hacer el post más largo, pero para no hacerlo demasiado pesado, lo voy a dejar aquí. Pronto escribiré una continuación hablando un poco sobre el DMA y los bancos de VRAM -cuyo conocimiento es esencial para desarrollar en Nintendo DS- poniendo como ejemplo práctico el juego para la compo de navidad que estoy haciendo.

13 December, 2006

Un desvio en el camino: Christmas Compo

Esto puede parecer algo offtopic, pero ahora me explicaré. Aquí van algunas capturas work-in-progress de mi entrada para la Christmas Compo de Drunkencoders. He decido apuntarme para así tener un juego -aunque sea pequeño- hecho en Nintendo DS antes de comenzar con la implementación de Kana DS. Mirando las fotos no es difícil adivinar el juego que voy a malclonar xD. Como el límite de las ROMs caseras(sin meterse en sistemas de ficheros) es de 4MB, sólo meteré una canción.

Despues de un intensivo de dos dias el puente pasado, ya he sido capaz de dejar los planos del modo de video como yo queria, cargar imágenes, programarme un blitblt básico, un fundido a negro de paletas, y algunas rutinas esenciales más que necesitaba. Es lo bueno y malo de la libnds, que viene pelada. Pero así al menos sabes lo que haces en todo momento y aprovechas los recursos al máximo.







Lo próximo serán algunas animaciones de las ardillas y el pintado de círculos por Bresenham. Una vez acabe la compo y los exámenes de Enero, me meteré ya 'a saco' con la implementación de Kana DS. Hasta entonces tengo pendientes uno o dos posts sobre arquitectura y programación de la Nintendo DS.

05 December, 2006

Hello world: repaso al kit de desarrollo

En esta entrada vamos a ver qué se necesita para crear ejecutar nuestras propias aplicaciones en una Nintendo DS, y lo que estoy usando yo con Kana DS. Básicamente, necesitamos tres elementos:
  • SDK libre. DevkitARM y libNDS, todo bajo GPL
  • Un cartucho flash
  • Obviamente, una Nintendo DS
Veamos cada elemento en detalle.

SDK

El conjunto de herramientas devkitARM incluye todo lo necesario para crear ejecutables compatibles con los procesadores ARM7 y ARM9 de Nintendo DS. Es una solución basada en GCC 4, y permite compilar código C y C++.

LibNDS es una librería en C que contiene todas las funciones y definiciones necesarias para acceder al hardware de Nintendo DS. Ha sido creada por múltiples programadores mediante métodos de ingeniería inversa, y es actualizada de vez en cuando conforme investigan el hardware.

Todo lo anterior puede descargarse desde la página de DevkitPro en SourceForge:
http://sourceforge.net/projects/devkitpro


Cartucho flash

En este apartado sólo voy a hablar de los cartuchos más recientes, que no requieren modificar la consola. Las soluciones más populares actualmente son

  • DS-Xtreme. Se inserta en la ranura para cartuchos de Nintendo DS. Lleva 512 megabytes integrados de memoria flash donde guardar juegos y música, y puede ser accedida mediante el puerto mini-USB.
  • Ninja DS Micro. Similar al cartucho anterior, aunque en este caso la memoria es proveída mediante tarjetas micro-SD insertables de hasta 4GB de capacidad. Por tanto, al coste del cartucho debemos sumar el de una tarjeta de memoria micro-SD.
Aspecto del cartucho DS-Xtreme



Ejecutar una aplicación 'casera' es tan fácil como meterla en la memoria del cartucho( por USB o micro-SD, segun el modelo ) y luego cargarla desde el pequeño SO que incluyen. Yo me decanté por el DS-Xtreme, sobretodo por la comodidad del USB... ya que los emuladores actuales no son muy fiables y es hay que ir probando las aplicacones todo el rato en el hardware real para ver si funcionan bien. Además con 512MB me basto y me sobro.

Para acabar, en la primera foto de este artículo podeis ver el 'hello world' de Kana DS corriendo en mi DS Lite. En la siguiente entrada describiré por encima la arquitectura de la consola y algunas de las principales dificultades en cuanto a programación.