¿Hackear un chip?

Estos días he recibido una consulta de un lector sobre el raster que me ha hecho recordar una historia curiosa y que está considerada uno de los primeros hackeos de la historia de la informática:

Como sabéis, la pantalla del C64 tiene un borde y un fondo. En el fondo es donde se pintan los caracteres y los gráficos bitmap. Su tamaño normal es de 25 filas por 40 columnas, aunque hay modos de 24 filas y 38 columnas que se usan para el scroll.

En el borde no se pinta nada, sólo un color. Por definición, tras el borde no puede haber caracteres ni gráficos bitmap, pero sí puede haber sprites. En principio, los sprites que están en el borde quedan ocultos.

El VIC está programado para, al llegar a la línea 50, dejar de pintar el borde superior y pasar a pintar el fondo. Igualmente, al llegar a la línea 250, dejar de pintar el fondo y pasar a pintar el borde inferior.

Lo curioso del asunto es que podemos engañar al VIC. Si al llegar a la línea 250 cambiamos el modo de la pantalla de 25 filas (el normal) a 24 filas (el que se usa con scroll vertical), el VIC entenderá que el cambio de fondo a borde ya lo ha pasado, y por tanto no lo realizará. ¿Resultado? Pues que dejamos de pintar el borde inferior y el borde superior.

Programar esto es fácil. Básicamente consiste en:

  • Esperar a que el raster llegue a la línea 250.
  • Justo en ese momento, cambiar de 25 a 24 líneas.
  • Poco más tarde, por ejemplo, en la línea 252, volver a modo 25 líneas.

El aspecto de la pantalla queda así:

En esos bordes que hemos retirado, tanto el superior como el inferior, no podremos pintar texto ni bitmaps, pero sí sprites. Y muchos juegos explotaron esto.

Tengo entendido que es posible hacer lo mismo con los bordes laterales, si bien es mucho más complejo de programar. El motivo radica en que esperar a que el raster llegue a la línea X es fácil, porque para eso están el registro $d012 y las interrupciones raster. Sin embargo, controlar cuando el VIC pasa del fondo al borde derecho o del borde izquierdo al fondo es mucho más complejo.

¿Nunca habíais hackeado un chip? Pues ya lo habéis hecho…


Código de ejemplo: Bordes.zip