Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

Con ‘ó’ de Destrucción

–En Ensamblador no hay PRINT–

(###POR AHORA LES QUEDO A DEBER LOS DIBUJITOS###)

Estaba un día recorriendo los blogs de desarrolladores de videojuegos amateur (y uso el término amateur para no insultar publicamente a quienes les regalan su dinero a estos lamers) y me encontré una entrada muy divertida sobre alguien que no podía usar letras acentuadas porque el XNA no se lo permitía. Esto me recordó a mi mismo allá cuando comenzaba a jugar con el BASIC. Me preguntaba porqué en la mayoría de los juegos de entonces los textos se escribían letra por letra en lugar de desplegarse párrafos completos de golpe como lo hacía la función PRINT.

A un problema muy parecido a este se enfrentan quienes se han iniciado en la programación directa de hardware gráfico. Algunas bibliotecas incluyen llamadas a sistemas mas o menos parecidas por fuera, pero por completo diferentes en su implementacion(como printf y wsprintf en C). En el caso del Windows, que en modo GUI (Graphics User Interface) ya funciona en modo gráfico, existen llamadas a sistema como TextOut que pueden desplegar texto de manera similar a como lo hace el famoso ‘printf’, aunque requieren parámetros como las coordenadas, longitud del texto a escribir y hasta la posición de memoria de un DeviceContext. Estos sugieren que esta función se encuentra entre las mas cercanas al nucleo del sistema. Pero en otra ocasión hablaré sobre programación en Windows. Lo que realmente quiero contarles es como se maneja el texto cuando trabajamos con un sistema gráfico carente de rutinas de entrada y salida de cadenas ASCII.

Primero que nada, hay que introducirles el concepto de ‘Sprite’, en otra nota hablaré mas detalladamente de lo que es un sprite, por ahora solo tienen que saber que un sprite es un dibujo mas o menos pequeño que se mueve por una pantalla de manera mas o menos rápida. o como dirían los que no saben de videojuegos: “Los monitos”. Los sprites están hechos de pixeles que no son mas que cuadritos de un solo color que componen la pantalla de una computadora. Dependiendo de la cantidad de colores a cada uno de estos cuadritos le corresponde una cantidad determinada de memoria dentro de la RAM de video. Por ejemplo, una pantalla típica de una laptop de 1440 x 900 a color verdadero necesita 5,184,000 bytes para una toma fija de pantalla. Aunque como nunca se trabaja con imágenes fijas la memoria de video necesaria es bastante mas grande, tipicamente unos cientos de megas a unos pocos gigas los sistemas caseros actuales(del 2009). Desde el punto de vista de un programador, los sprites no son mas que arrays o ristras de datos dentro de la memoria a los que se hace referencia por la posición del primero de sus elementos. A la hora de dibujar un sprite tan solo se copian tales ristras de un lado a otro de la memoria.

Ahora bien, supongo que ya se han de imaginar que para un juego típico en 2D no hay diferencia entre los dibujos de las armas, los personajes ni en este caso las letras y los números usados para mostrar información al jugador. ¿Pero como se hace para que el juego despliegue una cadena de alfanumérica dada una cadena de texto ascii o un número? Comencemos con los números porque es el caso mas fácil de entender.

La mayoría de los juegos antiguos solo permitían almacenar de 0 a 9 vidas,bombas o armas especiales. Esto tiene una razón, para empezar, primero hacemos los sprites del número 0 al 9 y los almacenamos de manera lineal en la memoria del sistema (en ese orden); luego hacemos una tabla con 10 entradas, donde cada una es la posición de memoria (o puntero como dirían los que usan C ) del inicio de estos sprites. La primera entrada corresponde a la posicién de inicio del sprite 0, la siguiente la del uno y así sucesivamente hasta el 9. Llamémosle a esta estructura, tabla_de_numeros_09.

Entonces, supongamos que la cantidad de vidas del jugador es 3 y queremos dibujar tal número, como dentro del programa el 3 está en formato binario puro tan solo sumamos ese 3 (o el contenido de la variable ‘vidas’ y lo usamos como índice del arreglo llamado tabla_de_numeros_09). De manera instantanea obtenemos la posicién del sprite correspondiente al número que queremos mostrar y solo lo mandamos dibujar con la misma rutina de dibujo de sprites que usamos para el resto del juego. Una advertencia, es importante validar que el contenido de la variable siempre esté en el rango de 0 a 9 porque si se sale de este rango puede retornar como posicién del sprite alguna zona de memoria desconocida y en el mejor de los casos, desencadenar un General Protection Fault. Antes de que pregunten, en el caso de que queramos imprimir cero, La suma de tabla_de_numeros_09 mas cero es igual a la primera posicion del arreglo, donde es. En el caso de ciertos procesadores, puede ser necesario hacer algunos desplazamientos y rotaciones binarias en los registros indices.

¿Y si necesitamos representar mas de una cifra? Aquí es donde comienzan los problemas, pero es posible usar un método similar a este para desplegar símbolos ASCII y usar cualquier método para convertir un valor binario a una cadena ASCII de los ya mencionados. Para hacer esto, Solo se usa el valor ASCII que deseamos mostrar como la entrada a la tabla con las posiciones de los sprites. En el caso de las cadenas alfanuméricas, esta tabla podría llamarse tabla_alfanumerica. De este modo no solo podremos desplegar números y letras, sino cualquier otro símbolo que queramos desplegar o hasta sustituir del ASCII original, esto es especialmente importante cuando queremos mostrar símbolos que no están en los conjuntos estandar. De nuevo, hay que tener cuidado con no dar un indice que esté mas allá de la tabla para evitar errores peligrosos.

Desgraciadamente, hoy en día no hay tanto control sobre las computadoras como lo había antes y para manejar sprites hay que obtener una serie de permisos del sistema operativo, pero esa será nota para otra entrada. Estos algoritmos se supone que pueden ser aplicados a cualquier sistema gráfico que use una memoria de video para representar pixeles, aunque tambien puede usarse una tabla como esta para apuntar a estructuras de malla poligonal en el caso de los juegos 3D o 2D que empleen geometría vectorial.

Cuando estaba por acabar esta nota me pasé por la mente que a quien lee este blog no le serviría de nada saber como hacer una tabla de sprites para representar letras y números de manera éptima si no sabe como tener acceso a la memoria de video en una computadora casera. Pero de todos modos voy a subir esta nota porque no he escrito nada en mas de una semana y porque no me aguantaba las ganas de insultar lamers. Mas adelante escribiré una nota sobre como manejar gráficos en ensamblador sobre Windows.

Anuncios

septiembre 10, 2009 - Posted by | Uncategorized

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: