Implementación VHDL del MBC5

Hacía mucho que no posteaba algún proyecto, pero esto lo merece.

Desde hace un tiempo, llevo pensando en poder prescindir de los chips MBC5 originales de nintendo en mis cartuchos flash para GameBoy, ya que es difícil andar consiguiendo cartuchos antiguos, tiendas de segunda mano, ebay, amigos…

Así que había pensado en reimplementar el MBC5 usando algún chip de lógica programable. El problema es que no tenía conocimientos sobre ello :-)

Así que me puse a diseñar el funcionamiento del MBC5 en puertas lógicas, usando el Ktechlab, hasta que tuve algo que más o menos se comportaba como debía, asi que entonces ya me empezé a plantear en hacer un diseño definitivo.

Buscando encontré la gama XC9500 de Xilinx, CPLDs pequeños de 5V, con el más simple de todos, el XC9536, en formato TQFP de 44 pines, muy similar al MBC5 de 32 pines, que podria adaptar fácilmente a mi cartucho. Asi que me puse manos a la obra. Amazon y a buscar un libro de VHDL. Encontré de segunda mano “Digital Design, an embedded systems approach using VHDL” a buen precio, asi, que lo compré, y me está resultando una buena lectura, muy recomendable. Una vez aprendido lo básico, ya me puse a jugar con un kit de desarrollo CoolRunnerII que tenemos en el LABee, y cogiendo algo de soltura. Asi que un dia me puse a escribir líneas de VHDL y este fin de semana, más o menos he dejado el  diseño listo.

En la captura podeis ver la simulación de mi implementación del MBC5 funcionando, pruebo todos los modos posibles, selección de bancos ROM bajo, ROM alto, bancos de RAM, activación y desactivación de la RAM externa, escritura en la RAM externa, reset… todo parece funcionar según el diseño original del MBC5. Lo único que he cambiado es el mapeado del banco 0 para la compatibilidad con el MBC1. El MBC5 permite mapear el banco 0 en el segundo banco de ROM físico del cartucho a partir de 4000h, mientras que el MBC1, si le pedimos seleccionar el banco 0, nos pondrá el banco 1 en 4000H. No conozco ningún juego o programa que mapee el banco 0 en 4000h, asi que creo que es más interesante usar el formato del MBC1 y asi evitar incompatibilidades con programas antiguos.

Con el ISE de xilinx, ya he sintetizado el diseño, seleccionado los pines para la E/S y dejado todo listo para cuando me lleguen los CPLD’s que tengo pedidos y el JTAG USB de xilinx. En seguida podré probarlo en hardware real y a ver que pasa.

Ahora que he empezado con la lógica programable, me va a ser difícil parar, esto es demasiado interesante y útil como para no hacer más cosas :-)

En cuanto tenga todo comprobado publicaré los fuentes VHDL de mi diseño. Además tengo pensado hacerle unos añadidos, ya que me sobran dos o tres pines… más ROM? más RAM?, I/O? ya veremos ;-)

PlataformaCero

Desde hace un par de meses, estoy trabajando en un nuevo proyecto muy interesante. Ahora soy coordinador técnico de PlataformaCero, un nuevo centro de producción artístico en LABoral centro de arte, a cargo de Pedro Soler.

La apuesta es por el arte interactivo y visual, electrónica, prototipado, interacción, performance extendida… y me he encargado de equipar dos espacios muy interesantes, el LABee, laboratorio de electrónica experimental, un lab equipado con todo tipo de equipamiento para el desarrollo electrónico, y el fabLAB, un laboratorio de fabricación digital, con cortadora láser, fresadora CNC con eje rotatorio, impresora 3D… unos recursos geniales para cualquier tema de desarrollo experimental. Además disponemos del Plat0, un plató de televisión experimental, equipado con un estupendo equipo audiovisual, estaciones de edición, y equipo de audio profesional, y el EcoLAB, un laboratorio ambiental para expetimentar con permacultura, cultivo sostenible, redes de sensores y control de las plantaciones, etc. De hecho en este último, estoy ahora desarrollando un sistema de monitorización ambiental basado en arduino+xbee, para mapear el entorno cara a estudiar las condiciones y decidir que plantar y demás.

Además se realizará una convocatoria abierta de proyectos cara a residencias pagadas y con dinero para producción, talleres profesionales sobre temas relacionados con  la linea del centro, pequeños talleres mensuales sobre materias relacionadas con los espacios (electrónica, fabricación, etc), y un evento anual, ya clásico en el mundillo, el SummerLAB.

Dentro de poco publicaremos abiertamente el proyecto  con toda la información.

Nuevo server, vuelta del foro.

Vieju.Net, la red de retroinformática donde se aloja ladecadence.net, se ha hecho con un server nuevo bastante majo (dual xeon, 2gb de ram, 4 discos scsi en raid), asi que se ha aprovechado para instalar un debian 5 reluciente y poner todo al dia. Yo por mi parte acabo de actualizar el wordpress, y parece que todo va bien. Y para finalizar, como digo en el título, he revivido el foro. Hace tiempo lo cerré por un enorme problema de spam, pero aprovechando la migración, me he metido con ello, y después de decenas de consultas cruzadas de SQL(10.000 mensajes de spam y unos 1000 usuarios-bot), parece que lo he dejado limpio. Además he actualizado el software del foro y he añadido captchas para el registro e identificación, que supongo que ayudarán a que lo del spam no vuelva a pasar.

Podeis visitarlo en http://ladecadence.net/foro/
Espero que vuelva a coger inercia.

Un saludo.

Humor en el código. BeOS.

No hay duda que BeOS fue un gran sistema operativo, un sistema operativo que por presiones del mercado y por qué no decirlo, mala suerte, pasó casi sin pena ni gloria, aunque mucha gente que llegó a usarlo en su momento, quedó enamorada de él y todavía hoy conserva una base de usuarios significante para un sistema operativo que no se actualiza oficialmente desde noviembre de 2001, aunque gracias a proyectos de software libre como Haiku, puede que dentro de poco veamos un “OpenBeOS” que puede dar mucho que hablar.
Beos siempre se caracterizó por sus impecables APIs, alabadas en su momento por los programadores, su arquitectura y su rendimiento. Pero volviendo al tema del post, en ese impecable código, te puedes encontrar bastantes guiños de los programadores, que se ve que amaban lo que hacian, y se permitian pasarselo bien mientras creaban el sistema.

Unos ejemplos de la API:

int32 is_computer_on(void)

Returns 1 if the computer is on. If the computer isn't on, the value returned by this function is undefined.

double is_computer_on_fire(void)

Returns the temperature of the motherboard if the computer is currently on fire. If the computer isn't on fire, the function returns some other value.

Ahora por ejemplo en las enumeraciones de las CPU’s y plataformas soportadas podemos encontrar cosas como:

typedef enum cpu_types {
B_CPU_PPC_601,
B_CPU_PPC_603,
[...]
B_CPU_Z80,


typedef enum platform_types {
B_BEBOX_PLATFORM = 0,
B_MAC_PLATFORM,
B_AT_CLONE_PLATFORM,
B_ENIAC_PLATFORM,
B_APPLE_II_PLATFORM,
B_CRAY_PLATFORM,
B_LISA_PLATFORM,
B_TI_994A_PLATFORM,
B_TIMEX_SINCLAIR_PLATFORM,
B_ORAC_1_PLATFORM,
B_HAL_PLATFORM,
B_BESM_6_PLATFORM,
B_MK_61_PLATFORM,
B_NINTENDO_64_PLATFORM
} platform_type;

Ahi dejan claro que una cosa es un sistema multiplataforma y luego está BeOS :-)
Un saludo.

Preview de VMUDingoo

He estado portando un emulador de la Visual Memory de Dreamcast a Dingux. El emulador era para PSP, asi que he tenido que tocar bastantes cosas, resolución, mapeo de controles, inicialización, etc, pero ya está casi listo.

Os dejo con un video de preview, en cuanto depure un par de cosas y le añada un selector de roms propio, lo publicaré.

Un saludo.

VMUDingoo – Preview from David Pello on Vimeo.

Mod SNES PAL/NTSC y CIC con microcontrolador.

Ya habia hecho el mod de video PAL/NTSC y del chip de región CIC al modo clásico, con interruptores para seleccionar los modos. Pero la verdad, taladrar agujeros en la SNES, ponerle unos feos interruptores… da pena. Asi que siguiendo ideas por la red, me puse a hacer mi propio mod basado en un microcontrolador, un AVR ATTiny2313, que se encarga de activar/desactivar las lineas que antes manejaban los interruptores. Ahora estaba el tema de la entrada… ¿qué mejor que usar algo integrado en la consola como el botón de reset?

Lo que hice fue monitorizar la linea de reset, asi cuando se pulse normal, no pasa nada, la consola se resetea normalmente, pero si se mantiene como dos segundos, el microcontrolador cambia al siguiente de los modos definidos, PAL, NTSC, PAL con CIC desactivado y NTSC con CIC desactivado.  La consola se enciende por defecto en modo PAL con CIC activado, como de fábrica.

Lo que falta es una manera de saber en que modo estamos… ¿que tal usar algo integrado en la consola…. como el LED de encendido?

Asi que lo cambié por un led RGB conectado al microcontrolador. Asi cada modo tiene un color, respectivamente rojo, verde, azul y rosa.

El esquema es seguir las instrucciones normales de estos mods, pero usando este circuito con el microcontrolador:

SNES-AVR-MOD-2

El firmware para el ATTiny2313 lo teneis aqui. (Poner los fuses a 0xD4 low, 0xDF high).
Fuente en: http://ladecadence.pastebin.com/f5dd1face

He añadido una galería con las fotos del montaje: http://ladecadence.net/galeria/#mod_snes

Un video del funcionamiento del mod:

Generador de sprites para Sega Master System

Estos dias he estado trasteando un poco con sistemas basados en z80 (calculadora Texas Instruments Ti-83+, MSX, Sega Master System…), y con ello ha surgido un pequeño proyecto (bueno, no tan pequeño) para la Master System, que iré publicando cuando esté el tema más maduro. Pero de momento he empezado a programar un poco para ella, leerme documentación, etc, y bueno, cuando he empezado con el tema gráfico, crear los bloques (tiles y sprites) gráficos no es una tarea sencilla. Resulta que le SMS usa un sistema “planar” para guardar los sprites (4 bytes por linea de 8 pixeles, 4 bits de color por pixel, donde el bit cero del primer byte, es el bit cero de color del primer pixel, el bit uno es el bit cero de color del segundo pixel… etc, hasta el bit siete del cuarto byte, que es el bit tres de color del octavo pixel, creo que se entiende).

Asi que para agilizar esto, que sería tedioso hacerlo a mano, me puse a hacer una pequeña aplicación para poder dibujar los sprites y que me generara los gráficos automáticamente, y para matar dos pájaros de un tiro, me planteé hacerla en javascript, que nunca me ponía a aprenderlo.

El resultado:

smssprite

Al final le añadí también la capacidad de trabajar con sprites de 8×8 y 8×16 pixeles y de generar los datos de paleta y personalizarla a partir de los 64 colores hardware de la SMS.

Podeis usar la aplicación en:  http://ladecadence.net/smssprite/smssprite.html

PD: Los datos los genera en notación para usarlos con un ensamblador de z80 (yo uso el wla-dx).