Antes de nada he hecho una actualización en la entrada de la familia Atari de 8 bits para hablar del VXBE, echadle un vistazo.

#1 CPU MOS 6510 a 1.02 Mhz y RAM del Sistema

¿Que es el 6510? No, no os preocupeis que no se trata de una CPU completamente nueva sino de una versión a medida del MOS 6502 y por lo tanto con una serie de cambios sobre el chip que tampoco lo hacen más potente pero que son importantes para entender como funciona el C64 que fue el ordenador de donde era la CPU.

En primer lugar el 6510 tenía una serie de pines adicionales para la E/S, marcados como P0 a P5 su utilidad era la siguiente:

  • P0 (LORAM): Si este puerto recibe un 1 entonces la ROM del BASIC en el sistema queda mapeada entre las direcciones a000-bfff, si recibe un 0 entonces dicha area de la memoria es tratada como si fuese RAM normal. Al arrancar el ordenador el P0 recibe un 1.
  • P1 (HIRAM): Si este puerto recibe un 1 entonces la ROM del KERNAL (El SO del C64) es mapeada entre las direcciones e000-ffff, si recibe un 0 entonces funciona como RAM normal.
  • P2: Mapea los registros de E/S en los registros d000-dfff si se le envia un 1, si se le envia un 0 entonces la ROM de carácteres (letras) es cargada.
  • P3: Se activa cuando el datasette esta enviando datos al Datasette500px-commodore-datassette
  • P4: Al reves que el P3, se activa si damos Play al Datasette.
  • P5: Se activa junto al P3 y al P4, le marca al 6510 si el Datasette esta en marcha.

Lo que nos interesa son es el P0 y el P1 realmente, el motivo de ello es que el 6510 puede direccionar como mucho hasta 64KB entre RAM y ROM combinados, en muchos sistemas de la época la RAM eran 48KB como mucho porque dejaban unos 16KB para direccionar las ROMs, en el caso del C64 cuando se cargaba un juego en memoria este podía ocupar buena parte de los 64KB de memoria sin problemas simplemente liberando las direcciones de memoria, pero aquí habia trampa.

500px-memory_map

Cuando se colocaba un cartucho en el puerto de expansión/slot de cartuchos que esta en la parte izquierda del todo de la siguiente imagen…

back

… entonces no se cargaba el KERNAL ROM y el BASIC sino que se cargaba desde las direcciones del cartucho y lo que hubiese en dichas direcciones era lo que se cargaba durante el sistema, gracias a ello los juegos en cartucho se cargaban de manera instantanea, funcionando el ordenador como si fuese una consola.

dsc_0324

El registro P2 también es interesante, en juegos no se utiliza mucho pero es algo que el 65816 heredo (recordemos que MOS era propiedad de Commodore) y que se encuentra en la consola SNES debido a esa herencia. Se trata de que activando el P2 entonces el 6510 deja de ser la CPU del sistema y una CPU externa toma el control. La utilidad de esto fue la misma que la de la Softcard de Microsoft en el Apple II, el hecho de poder colocar una tarjeta con el Z80 de CPU (que pasaba a ser la del sistema en ese caso) para cargar el CP/M.

cpm

Pero la utilidad más curiosa es la de los cartuchos para aumentar la potencia del sistema haciendo bypass al original, la mayoría basados en cambiar el 6510 por un 65816 como CPU principal que es compatible hacía atras con el 6510 con tal de aumentar el rendimiento de los juegos.

turbo-master-cpu

Algunos de estos cartuchos de expansión al tener un 65816 que puede direccionar más RAM vienen con unos cuantos megabytes de memoria pero a nivel de juego el uso de la CPU mejorada permite hacer calculos con la CPU como rotaciones de patrones/sprites a mucha velocidad que en el 6510 no serían posibles, en todo caso el hardware gráfico sigue siendo el que es y la calidad visual de los juegos no se ve mejorada llegado a un límite visual.

Pero lo mejor sería comparar un juego de antaño con el upgrade de la CPU, el siguiente funciona en C128, una versión del C64 con 64KB de memoria y con el cartucho CP/M integrado de serie, veamos primero como funciona en el hardware estándar con el 6510 como CPU:

Y veamos como funciona con la expansión del procesador.

Obviamente esto no forma parte del hardware del C64 estándar pero al igual que el VXBE de los Atari de 8 bits es una mejora creada por la comunidad que resulta interesante y curiosa.

#2 El VIC-II

El procesador gráfico del C64 es un generador de patrones/sprites como el TMS9918A cuyo funcionamiento difiere de este en varios aspectos pero cuya funcionalidad final es la misma. El VIC-II puede funcionar a una resolución de 320×200 pixeles y 16 colores en total, que siempre son los de la siguiente paleta:

c64-palette

Al igual que el 6845 y el generador de video del Apple II este funciona de manera intercalada con el 6510 para acceder a la memoria por lo que al contrario que el TMS9918A no tiene memoria propia sino que tiene un direccionamiento de 16 bits que funciona como uno de 14 bits (16KB) ya que los otros dos bits le permiten escoger cual de lo cuatro bancos de la RAM principal va a utilizar, el hecho que los bancos no esten seleccionados hace que los programadores tengan que estar referenciando todo el rato las direcciones de memoria al crear la Name Table y es que en modo no-multicolor la resolución es de 320×200 y 4 bits de color, necesitando 32KB pero en modo multicolor si que cabe en memoria… ¿Entonces cual es el problema? La velocidad de reloj del VIC-II y la RAM hacen un modo bitmap a 160×200 completamente inviable para juegos, al mismo tiempo el VIC-II al acceder también a la RAM al mismo tiempo que la CPU le quita ciclos como en otros sistemas de este tipo, precisamente el hecho que la memoria sea compartida es lo que quita ancho de banda y ciclos al VIC-II ya que:

160*200*60= 1.920.000

Es decir, se necesitaría un VIC-II a casi 2 Mhz para el modo bitmap.

El formato de los patrones/sprites en el C64 difiere enormemente de los del TMS9918A, mientras que uno trabaja con patrones/sprites de 8×8 pixeles al igual que la gran mayoría de sistemas de la época en el caso del C64 tenemos dos tamaños de sprites distintos:

  • En el modo no-multicolor son de 24×21 pixeles cada uno de ellos, con dos colores (uno de frente y otro que es el que tiene asignado el fondo).
  • En el modo multicolor son de 12×21 pixeles con cuatro colores, en este caso cada posicion del patrón ocupa unos 2 bits en memoria.
  • La Name Table generada es de 40×25 patrones con 1 byte en cada posición que referencia los 256 patrones que se pueden utilizar la componer la escena. Dado que el VIC-II no tiene memoria local lo que hace el 6510 es generar la Name Table durante el periodo de overscan sobre el mismo espacio de la RAM que luego leera el VIC-II.
  • Puede colocar hasta 8 patrones/sprites por grupo de lineas para

El otro elemento es el scroll, no esta a nivel de pixel como el de otros sistemas más avanzados sino que avanza de 7 en 7 pixeles tanto en horizontal como en vertical pero al contrario que en los sistemas basados en el TMS9918A y derivados es posible controlar el scroll via CPU desde el momento en que tiene acceso a la RAM aunque no es recomendable. Lo que si que es un problema con el tema del scroll es que acaba moviendo toda la pantalla por lo que si un juego tiene una zona de la pantalla que queremos dejar fija también la mueva, para ello el VIC-II soporta los raster interrupts que permiten parar al vuelo (en el HSYNC se cada linea) y cambiar el valor de los registros dentro del procesador no solo para controllar el scroll, sino que permite (aunque con gráficos estáticos) cosas como esta:

40947

Si el VIC-II tuviese la suficiente velocidad de reloj (y una mejor paleta de colores) tendría unas capacidades excelentes pero no las tiene debido a esa limitación, pero antes de ir a por el tema del upgrade del VIC-II lo mejor es seguir explicando como funciona el renderizado por patrones/sprites.

¿Os acordáis como en el TMS9918A estaba la SAT Table?

sat

Aquí la SAT Table no existe sino que tenemos los registros de posición dentro de la CPU para marcarnos en que posición de la pantalla se empieza a dibujar el patrón/sprite, lo normal es que Y no sea más de 21 posiciones distintas en la linea y una vez dibujadas en pantalla se cambian los valores de los registros haciendo que otro set de unos 8 patrones/sprites con sus datos se cargue en memoria. En todo caso hay que tener en cuenta ademas que la resolución vertical de pantalla no es multiple con la resolución vertical de los patrones/sprites por lo que durante el renderizado los que se encuentran en la parte inferior quedan cortados a la mitad.

La gran mayoría de juegos del C64 funcionan a una resolución de 160×200 porque esto permite colocar cuatro colores por patrón/sprite pero al mismo tiempo la menor resolución afecta a la calidad de imagen.

wizball

 

Por lo que el VIC-II es un chip con mucho potencial pero lento… lento. Ahora bien y volviendo al inciso anterior… ¿Es posible hacer el mismo upgrade que con la CPU pero con el VIC-II y utilizar otro chip a través del puerto de expansión? Pues si que se puede ya que el puerto de expansión da acceso a toda la memoria por lo que en este caso el chip gráfico en el cartucho de expansión tomaría el control en vez del VIC-II dejando a este inutilizado. Commodore no realizo jamás una expansión de este tipo existiendo el Commodore Amiga pero al contrario que co el VXBE para los Atari de 8 bits la comunidad del Commodore no ha realizado jamás un cartucho que cambie el procesador gráfico por otro pero… Curiosamente en este caso si que lo hizo la propia Commodore pero apenas tuvo aceptación y no lo utilizo casi ninguna aplicación.

1750reu

Pues si, es una expansión de RAM pero para entender el concepto hemos de entender que los cartuchos de la época tenian la misma capacidad de acceso que la RAM por lo que el puerto de cartuchos se puede utilizar como una expansión de la RAM y dejar que la CPU y el VIC-II no se molesten durante el proceso aumentando la capacidad del sistema dejando que el VIC-II acceda a la RAM en la placa o en el puerto de expansión y la CPU al contrario. En todo caso en el caso de los Atari de 8 bits el VBXE funciona en un sistema donde el procesador gráfico y la CPU comparten memoria por lo que debería ser posible hacer algo igual y ambos sistemas llevan un 6502 (aunque el 6510 tiene ciertas modificaciones), seria curioso un VXBE en placa+la actualización de la CPU pero entonces dejaría de ser un ordenador de 8 bits.

Con esto terminamos la serie de los ordenadores de 8 bits, en un tiempo, no muy lejano, hablare de la serie de los 16 bits, ahora toca centrarse en el presente.