Asteroids: presentación de números en decimal – repaso de conceptos #Programación retro del Commodore 64

El juego está esencialmente terminado. Por supuesto, se le pueden añadir muchas cosas, pero hemos alcanzado el 99% de los objetivos: una nave que se mueve y dispara, unos asteroides que explotan contra la nave y con los disparos, unos sprites que se mueven por toda la pantalla, caracteres personalizados, pantallas, uso del joystick y del teclado, niveles de dificultad progresivos, sonido, etc.

Si acaso, hay una cosa que queda para considerar que el juego está terminado: los números correspondientes a las coordenadas (X, Y), la velocidad, el ángulo, las vidas y los puntos actualmente se presentan en hexadecimal. Esto es adecuado para un programador, pero no para un usuario normal.

Por tanto, tenemos que hacer que estos números se presenten en decimal. En principio, esto parece una tontería, pero no lo es. El ensamblador es un lenguaje tan simple, en el sentido de que sus instrucciones son tan sencillas, que incluso una tarea como presentar los números en decimal es más compleja de lo que parece.

Vamos a resolverlo, pero primero repasemos algunos conceptos:

Bits, bytes y palabras:

Los ordenadores clásicos almacenan bits y bytes. Hoy en día empieza a haber otros ordenadores, los cuánticos, que almacenan "qubits".

Un bit es un dígito binario, es decir, un 0 o un 1. Un byte es un paquete de ocho bits. Y luego hay palabras (16 bits), dobles palabras (32 bits), etc. Pero el C64 es una máquina de ocho bits; por tanto, almacena bytes.

Y ya está. Al nivel de la electrónica eso es lo que se almacena. Se podría decir que se almacenan números, caracteres, sonidos, etc., pero eso requiere de un proceso adicional que es la codificación de la información.

Números, caracteres, sonido y gráficos:

Los números (sin signo o con él), los caracteres, los sonidos, los gráficos, etc., se pueden codificar digitalmente, es decir, mediante secuencias de bits. Pero dado un byte, por ejemplo, no me parecería correcto decir que eso ES un número con signo, un número sin signo, u otra cosa, porque todo depende de lo que haya codificado o cómo lo interprete el programador o la aplicación.

Por tanto, es buena idea distinguir entre la información (números, caracteres, …), el proceso de codificación, y el resultado de ese proceso (bits y bytes).

Números: codificación binaria y BCD

Desde un punto de vista matemático, el mismo número, por ejemplo, el 17, se puede representar con muchas bases: 17 en decimal, $11 en hexadecimal y %10001 en binario. Pero el número es el mismo: el 17. Y lo que se usa para almacenar el número 17 en el ordenador (en principio) es su codificación binaria, es decir, el byte 00010001.

La codificación binaria es la que el microprocesador entiende de forma nativa, y con la que sabe operar fácilmente. Por tanto, es muy adecuada para el ordenador. Pero no es tan adecuada para los humanos, que estamos acostumbrados a la codificación decimal.

Por ello, el C64 soporta una codificación alternativa llamada BCD – Binary Coded Decimal. Esta codificación consiste en codificar un dígito decimal (del 0 al 9) en un nibble (del 0000 al 1001). Por tanto, con un byte (dos nibbles) se pueden codificar los números decimales desde el 00 hasta el 99. Y encadenando varios bytes se pueden codificar números mayores.

No sólo eso, además, el C64 permite hacer operaciones aritméticas ("adc" y "sbc") usando esta codificación. Para ello hay que activar la aritmética decimal con "sed". También se puede desactivar con "cld".

Lógicamente, para que todo sea correcto el programador debe asegurarse de que la codificación que utiliza (binaria o BCD) y la aritmética que utiliza (binaria o BCD) son coherentes. No se puede mezclar. Si se mezcla los resultados no son correctos.

Por último, el ordenador no utiliza la base 16 como tal. La base 16 o hexadecimal la usa el programador, por ejemplo, al programar en ensamblador, porque es muy cómoda y muy compacta para trabajar con bytes.

Repasados todos estos conceptos, en las entradas que siguen veremos qué hacemos con las coordenadas (X, Y), la velocidad, el ángulo, las vidas y los puntos.


Editar

Josepzin

No hay comentarios:

Publicar un comentario