El propósito de esta entrada es la descripción de una serie de modificaciones realizadas en un ordenador VIC-20, en particular un aumento de memoria RAM y una modificación en un cartucho ROM para aceptar integrados EPROM de diferentes tamaños que permita la grabación y ejecución de otros programas.
Un VIC-20 dispone de fábrica de un total de 5kB en memoria RAM (3.5kB disponibles en entorno BASIC para datos de usuario, 1kB reservado por el entorno Basic para usos varios, 0.5KB reservado para la memoria de pantalla), además de 1kB de memoria RAM para vídeo en color, 8kB de memoria ROM para lenguaje BASIC y 8kB de memoria ROM para Kernel de sistema. Se cuentan en total con ocho bloques de memoria, cada uno de ellos de 8kB de tamaño y distribuídos como se indica en la siguiente tabla.
Bloque | Uso | Decimal | HEX |
0 | Sistema (*) | 0 | 0000 |
1 | Libre | 8192 | 2000 |
2 | Libre | 16384 | 4000 |
3 | Libre | 24576 | 6000 |
4 | Sistema | 32768 | 8000 |
5 | Libre | 40960 | A000 |
6 | Basic | 49152 | C000 |
7 | Kernal | 57344 | E000 |
Tabla 1. Distribución de memoria VIC-20
Dentro del Bloque 0 se dispone de un total de 3kB de memoria RAM que se encuentran libres y que pueden ser direccionables mediante la correspondiente ampliación de memoria. El resto de las direcciones de memoria del Bloque 0 están ocupadas para otros usos, en particular la memoria de pantalla (0.5kB), uso propio del entorno de lenguaje Basic (1kB) y los datos de usuario en el entorno de lenguaje BASIC (3.5kB), tal y como se ha mencionado anteriormente.
Los Bloques 1, 2 y 3 se encuentran completamente disponibles por lo que sería posible direccionar memoria en estos bloques una vez instalada la correspondiente ampliación (un total de 24kB, más 3kB disponibles en el banco 0, hacen un total de 27kB disponibles para ampliación).
El Bloque 4 se encuentra reservado para características del sistema, como la ROM de caracteres, la memoria de vídeo en color, etc.
El Bloque 5 se encuentra reservado para, generalmente, los cartuchos ROM que se instalan a través del conector trasero de expansión, aunque no existe un criterio único, o una limitación de que los cartuchos ocupen un sólo Bloque de memoria. Por ejemplo, los juegos de Adventure International de 16kB de tamaño, como el Pirate Cove, suelen estar configurados mediante jumpers en el interior del cartucho para ocupar los Bloques 2 y 3 (aunque esta configuración se puede modificar mediante los citados jumpers). Por regla general, el procedimiento de autoarranque de estos cartuchos considera el programa direccionado en el inicio del Bloque 5 (A000) pero existen variaciones en este sentido.
Interesa por lo tanto preparar una ampliación de memoria que aproveche al máximo la memoria disponible, pero que también permita la instalación de cartuchos de hasta 16kB. Una opción válida sería realizar una ampliación direccionando la totalidad de Bloques disponibles, disponiendo además de una serie de switches que permita desactivar Bloques de memoria para introducir en ellos programas instalados en cartucho. En el ejemplo anterior, se desactivaría la ampliación de memoria en los Bloques 2 y 3 previamente a la introducción del cartucho del programa Pirate Cove y al arranque del sistema.
La otra opción, más sencilla aunque más modesta en cuanto a capacidades, y basada en el artículo de Per Oloffson disponible en el siguiente enlace, es la que se desarrollará aquí. Nos limitaremos a proporcionar una ampliación de memoria de 16kB mapeada a los Bloques 1 y 2, dejando los Bloques 3 y 5 disponibles para el uso de cartuchos ROM de hasta 16kB de memoria.
Las señales de selección de Bloque están disponibles en el chip decodificador 74LS138 (marca UC5) en la placa madre del ordenador. El Bloque 1 se selecciona a través del pin 14, y el Bloque 2 a través del pin 13.
El material necesario para realizar la modificación será el siguiente:
- 1 x Módulo SRAM Cypress CY62256NLL 256-kBit (32kB x 8).
- 1 x Resistencia de 470 ohm.
- 2 x Diodos 1N4148.
- Cable para conexiones.
La manera más sencilla de montar el módulo de memoria RAM es montarlo directamente sobre uno de los dos integrados ROM disponibles en la placa madre del ordenador. En inglés, a esta disposición se la conoce como piggyback. De esta forma, se pueden aprovechar la gran mayoría de señales disponibles en el integrado base.
Como se puede observar en el esquema superior, el integrado CY62256NLL no sólo cuenta con cuatro pines más que el módulo de ROM en la placa, sino que la distribución de señales en los pines no es exacta. Aquellos pines con distintas señales habrán de ser levantados y no podrán entrar en contacto unos con otros.
Una vez instalado el módulo de memoria RAM sobre uno de los integrados ROM en la base de la placa, se tendrá la siguiente disposición.
- Pin 1. Levantado y sin estar en contacto con el integrado ROM en la base, conectado mediante un cable al pin 14 de UC5 (74LS138).
- Pin 2. Levantado y sin estar en contacto con el integrado ROM en la base, conectado mediante un cable al pin 2 de UC6 (74LS138).
- Pin 20 y pin 22. Levantados y conectados entre sí mediante un puente, y sin estar en contacto con el integrado ROM en la base. A este par de pines se conectarán, por medio de dos cables y dos diodos 1N4148, los pines 13 y 14 de UC5.
- Pin 26 y pin 28 conectados entre sí mediante un puente. Este par de pines se conectará con el par 20 y 22 anterior a través de la resistencia de 470 ohm.
- Pin 27. Levantado y conectado mediante un cable al pin 34 de UE10 (procesador 6502), y sin estar en contacto con el integrado ROM en la base.
La configuración descrita anteriormente se observa en mayor detalle en la fotografía adjunta a continuación.
Una vez efectuada la modificación anterior se inicializa el sistema obteniéndose un valor de 19967 bytes disponibles desde el entorno de lenguaje BASIC o, lo que es lo mismo, la suma de los 3583 bytes disponibles en un VIC-20 de fábrica, y los 16384 bytes de la ampliación mapeados en los Bloques 1 y 2.
Visto lo anterior, revisamos a continuación el diseño de un cartucho típico de 16kB, en concreto correspondiente al juego Pirate Cove de Adventure International.
El cartucho dispone de un integrado de 16kB de memoria ROM, mapeado inicialmente en los Bloques 2 y 3, y de un integrado 74LS00 que realiza el mapeado en dichos bloques basado en la selección de una serie de jumpers configurables en la placa del cartucho. Será necesario, en primera instancia, modificar la configuración de estos jumpers y establecer los Bloques 5 y 3 para no chocar con la ampliación de memoria realizada anteriormente (y mapeada en los Bloques 1 y 2).
Se ha procedido a la retirada del integrado de memoria ROM, y a la colocación de un cartucho para, a continuación montar un módulo EPROM tipo 27C128 (con idéntico tamaño, 16kB, aunque se han hecho pruebas también con un módulo tipo 27C256 con dos bancos de 16kB). Toda vez que los integrados EPROM de la familia anteriormente descrita no presentan la misma distribución de pines que un módulo 23128 como el originalmente instalado en el cartucho, será necesario modificar la distribución de forma similar a la realizada anteriormente. El proceso exacto se encuentra descrito en numerosos otros sitios en Internet, como en el siguiente enlace.