Mandelbrot

Hoy acabé la parte de software para nuestro proyecto de Arquitectura de Computadoras. Por supuesto no va a servir de mucho si los inges no acaban el micro, pero me he divertido al menos.

Nuestro micro es bastante sencillo; tiene instrucciones para manejo de memoria, una pilita (en la misma memoria), saltos, un ALU de enteros, y (el chiste), una unidad aritmética de complejos.

La idea era hacer algo nuevo.

La aplicación obvia para nuestro micro es un fractal; sobre todo porque tenemos salida VGA de nuestra tarjeta Spartan-3E, y entonces (mientras los inges se hacen bolas con el código VHDL), yo hice un ensamblador, un desensamblador, un convertidor de código máquina a VHDL, y un emulador. La idea es tener todo el software depurado para que al momento de correr la aplicación en la tarjeta, si algo sale mal, sepamos que de hecho es el código VHDL y no algún error bobo en el software.

El ensamblador lo hice con Yacc y Lex (y sé que no era necesario; sólo era muy sencillo hacerlo así), el desensamblador en Perl (aunque lo pasé a C porque cómo joden los inges con la eficiencia), el convertidor en C, y el emulador también en C, utilizando Gtk+ para emular el monitor. Ya entrados y en el vicio, hice también el programa en ensamblador que dibujara Mandelbrot en la pantalla.

Para que se den una idea, este es un programa en nuestro ensamblador que dibuja una línea vertical justo al centro del monitor (en VGA tenemos 640×480 de resolución):

1: start:    
2:   mov 0, %ebx
3:   mov 7, %ecx
4:   mov 320, %eax
5: for:    
6:   vput  
7:   mov 1, %edx
8:   add %ebx, %edx
9:   mov 480, %edx
10:   sub %edx, %ebx
11:   jz end
12:   jmp for
13: end:    
14:   jmp end

Les queda de tarea descifrarlo. Sólo quiero especificar que el ciclo infinito al final es idea de los inges: parece que la idea de que las cosas terminen les molesta.

Tenemos sólo cuatro registros enteros (%eax, %ebx, %ecx y %edx), y cuatro complejos (iguales, pero “c” en lugar de “e”). Cada complejo tiene una parte real y una imaginaria. No pongo el algoritmo de Mandelbrot porque está bastante más largo (108 líneas de ensamblador; pequeño para todo lo que hace), pero sí les pongo que para graficarlo uno calcula

z_{n+1}=z_{n}^{2}+c

donde z_{0}=0+0i, y c recorre un área que será la que cubra la pantalla.

(Realmente no había razón para ponerles la fórmula; pero ya tengo rato buscando un pretexto para utilizar mi \LaTeX{} renderer).

Mi emulador ya pudo dibujar Mandelbrot, y sin más preámbulo se los presento:

Mandelbrot

Mandelbrot

Si les parece que los colores son demasiado “All the leaves are brown…”, tienen toda la razón. Sólo tenemos 3 bits para representar colores, así que sólo tenemos ocho: negro, azul, verde, rojo, magenta, cyan, amarillo y blanco. Así que la caballada estaba flaca para empezar.

El proyecto está bonito; si lo acabamos lo va a estar más.

2 comentarios sobre “Mandelbrot

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *