Después de mirar por algunos sitios, decidí hacerme mi propia ampliación, ya que lo más "sencillo" que había encontrado necesitaba dos chips de memoria, uno encima de cada ROM. Estaba seguro de que se podría hacer con uno solo, y así ha sido.
Estos son los materiales que necesitamos:
- Un chip de memoria 62256 (32Kx8 bits, como el que monta, por ejemplo, el DivIDE)
- Una resistencia de 470 ohmios (puede ser incluso un poco mayor si no teneis de este valor)
- Dos diodos 1N4148
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_01.jpg)
Al chip de memoria, previamente le doblaremos algunos de sus pines para afuera, de la forma en la que se ve en la foto. El resto de los pines los dejaremos bien rectos, ya que serán los que se "agarren" al chip sobre el que va a ir éste.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_02.jpg)
Esta es la idea: poner el chip de RAM literalmente encima de uno de los chips de ROM. Yo he escogido el que tiene el BASIC, ya que el otro, el del KERNAL, va sobre zócalo y es el que he cambiado.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_03.jpg)
Hay que asegurarse de que los pines que quedan doblados hacia afuera, no llegan a tocar los pines de la ROM donde se asienta.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_05.jpg)
Antes de "enchufarlo" de forma definitiva, hay que hacer unas conexiones. Se trata de unir con alambre de cobre los pines que se muestran en la foto. Estos pines corresponden al costado derecho del chip (viéndolo desde arriba, con la muesca apuntando hacia arriba, o bien, si tomamos como referencia la segunda foto, el costado superior)
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_06.jpg)
Y ahora sí, lo ponemos encima del chip de la ROM. Los pines que no hemos doblado hacia afuera deben hacer buen contacto con sus homónimos en el chip de la ROM. Si no estamos seguros de que vaya a ser así, habrá que dar una gotita de estaño en los sospechosos.
Fijarse que quedan dos pines a cada lado "colgando" fuera.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_07.jpg)
El mismo chip desde otro ángulo, para que se vea bien lo que digo de que quedan pines "al aire".
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_08.jpg)
Cogemos la resistencia y soldamos cada extremo como se ve en la imagen, uniendo los dos cablecitos que están soldados a los pines. Nótese que he dejado más "rabito" en la resistencia en un lado que en otro, porque ahí soldaremos más cosas.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_09.jpg)
Ahora hay que localizar UC5 en la placa del VIC20. Es un decodificador, cuyas salidas indican qué banco de memoria se está intentando usar. Nosotros queremos que nuestra RAM se active cuando se quiera acceder al banco BLK1 o BLK2 (pines 13 y 14 de UC5), así que la idea es formar una puerta AND, cuya salida valdrá 0 cuando cualquiera de los pines BLK1 ó BLK2 valga 0. De eso se encargan los dos diodos y la resistencia.
Los diodos hay que soldarlos con el cátodo mirando al chip (la banda negra) como indica la imagen. Si los soldais al revés, no funcionará el invento.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_10.jpg)
Los otros dos extremos de los diodos se unen entre sí y se sueldan al rabito largo que dejamos de la resistencia. Si queremos evitarnos cortocircuitos indeseados, podemos "enfundar" a los diodos con aislante. Si haceis eso, dejad antes un poco "al aire" el pin 14 de UC5 porque ahí volveremos a soldar algo.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_11.jpg)
Llevamos un cable del pin R/W del 6502 (pin 34)...
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_12.jpg)
... al pin 27 de nuestra RAM (pin de escritura). Este pin es el que queda en medio de dos que están unidos por el alambre.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_13.jpg)
Ahora, del pin 14 de UC5 que dejamos un poco al descubierto, soldamos un cable...
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_14.jpg)
... que irá al pin 1 de nuestra memoria 62256.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_15.jpg)
¡El último cable! Localizad UC6, y soldar un cablecillo desde su pin 2...
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_16.jpg)
... al pin 2 de la memoria 62256.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_17.jpg)
Echad un último repaso a todas las conexiones, y especialmente, a que la RAM esté bien agarrada a la ROM. Yo no he necesitado soldarla, pero sí que le he puesto un puntito de pegamento térmico. Otra solución es poner cinta adhesiva de doble cara uniendo los cuerpos de ambos chips.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_18.jpg)
Si todo va bien, el resultado debería ser éste 19967 bytes libres en lugar de los clásicos 3583.
![Imagen](http://www.zxprojects.com/images/stories/vic20_upgr16k/vic20_19.jpg)
Para poder activar o desactivar esta ampliación a voluntad
Si se requiere por compatibilidad con algún juego se puede hacer de esta forma: en lugar de soldar los dos diodos al rabito de la resistencia, soldarlos un terminal de un interruptor que pondreis en algún sitio accesible. El otro terminal del interruptor se suelda al rabito de la resistencia. Con el interruptor cerrado, el circuito queda tal cual lo he explicado. Con el interruptor abierto, los dos diodos quedan "aislados" de la resistencia y la memoria nunca se activa.
Más cosas sobre el mapeo de memoria en el VIC-20
En el VIC20 hay definidos 8 bloques de memoria, de 8KB cada uno. Se denominan BLK0, BLK1, BLK2, ..., hasta BLK7. Se denominan así por las salidas del decodificador UC5 (74LS138) que es quien determina a cuál de los 8 bloques está accediendo el procesador. Estos 8 bloques son los 64KB de memoria total vista por la CPU.
Los bloques "huecos" que tiene el VIC20 corresponden a los bloques BLK1, BLK2, BLK3 y BLK5 (y como se verá a continuación, una porción de BLK0). Como os podeis imaginar, la memoria base está en BLK0. Este bloque de 8KB se subdivide a su vez en 8 bloques de 1KB cada uno, de los cuales están "ocupados" en el VIC20 base los sub-bloques 0,4,5,6 y 7, que son los 5KB de RAM que lleva el aparato. Los sub-bloques 1,2 y 3 no están usados y (creo) que pueden usarse para expandir el aparato a 8KB: son las señales RAM1, RAM2 y RAM3. Una ampliación de 3KB que use esas tres señales no afecta a la ampliación que he descrito.
La ampliación de 16K propuesta "rellena" los bloques BLK1 y BLK2 (8KB cada bloque). Una ampliación de memoria externa que mapee en estos mismos bloques porque use también las señales BLK1 y BLK2 entrará en conflicto con la ampliación interna, salvo que esa ampliación externa tenga jumpers o microswitches para elegir en qué bloques ha de mapearse. En ese caso, si puede elegirse que se mapee bloques distintos, como por ejemplo BLK3 y/o BLK5, no entrará en conflicto.
Con circuitería extra podría haberse aprovechado un poco más del chip de memoria y rellenar también BLK3. Estos tres bloques son contiguos entre sí, y además son los que siguen de forma natural a BLK0, donde comienza la memoria de usuario. Esto significa que toda la memoria que el BASIC puede ver es la que se le dé en los bloques BLK0, hasta BLK3 inclusive (28159 bytes o 27.5KB). Seguramente, en la próxima ocasión que tenga, le haré un "upgrade" a la ampliación de memoria para que use, al menos, 24 de los 32KB.
El último bloque "hueco" es BLK5, que no es contiguo a los demás. Eso significa que no será visible por el BASIC (pero sí por cualquier programa en C/M). Es también el bloque donde suelen mapearse los cartuchos ROM para VIC20, así que una ampliación de 32KB que se mapeara en todos estos bloques BLK1,2,3 y 5 (factible con el chip que tenemos, añadiendo un poco más de circuitería) entraría en conflicto con practicamente cualquier cartucho ROM o RAM por culpa de este BLK5, a menos que la circuitería permitiera desactivar este u otros bloques a voluntad.
El resto de bloques, hasta completar los 64KB, son los bloques BLK4, donde están mapeados los registros de E/S de los diferentes periféricos del VIC20, BLK6 (ROM BASIC, 8KB) y BLK7 (ROM kernel, 8KB).