Investigue un poco los puertos serie del PIC para usarlos como registro de desplazamiento, ya que esto acortaria el codigo ademas de simplificar la parte electronica, pero no vi ningun modo directamente aplicable y por lo tanto lo deje para investigarlo mas adelante, ya que no sabia si podian trabajar a la velocidad requerida por el video.
Una vez que tuve una idea mas clara de lo que queria, volvi a buscar implementaciones similares, y esta vez pude encontrar una:
LINKPara mi sorpresa encontre que el proyecto es muy similar, y si bien requiere algunas pequeñas modificaciones, me confirmo que era posible. Leyendo un poco el codigo me di cuenta donde es que esta el poder de la serie 18 de los PIC, mas que en la velocidad bruta de otros micros, la evolucion esta en varias mejoras al conjunto de instrucciones y a la organizacion de la memoria. Estos chips eliminan muchas limitaciones del paginado de memoria existente en las series anteriores, que hacian que aunque se tuviera mucha memoria en la mayoria de los modelos no se pudiera disponer por ejemplo de mas de 256 bytes contiguos, lo cual complicaria la implementacion de una memoria de pantalla. Tambien se agregaron instrucciones para manejar tablas de valores en ROM que reducen el tamaño del codigo requerido y permite trabajar con tablas mas grandes (antes se podia manejar un maximo de 255 valores), pero lo que mas me sorprendio fue el agregado de varios registros indice de 16 bits para direccionamiento indirecto, y que encima se puedan acceder con modos de pre-incremento, post-incremento y post-decremento, que ayudan a reducir el codigo significativamente.
Para que tengan una idea, el PIC puede trabajar a 32MHz y ejecuta en condiciones normales 1 instruccion por cada 4 ciclos, esto es un maximo de 8 MIPS es decir 8 instrucciones por microsegundo. Una linea de video dura 64 microsegundos, lo cual si vamos a imprimir 32 caracteres hace que tenga que enviarse un caracter cada 2 us (microsegundos), por lo tanto por cada caracter en pantalla podemos ejecutar un maximo de 16 instrucciones, pero esto es el maximo ya que en ocasiones se necesita ejecutar instrucciones que requieren el doble de tiempo, por lo cual por caracter vamos a poder ejecutar entre 8 y 16 instrucciones como maximo. Con tan poco margen, el maximo teorico si se pudiera imprimir cada pixel con una sola linea de codigo que ejecute en 1 ciclo, se podrian lograr 16 pixels por caracter, lo que nos da 32 caracteres x 16 pixels = 512 pixels en blanco y negro, pero con la imagen fija y codificada en el programa. Si quisieramos leer la imagen desde memoria o que sea modificable ya no se podria lograr esa resolucion, ni siquiera la mitad, por esto es que sin hard adicional solamente se puede imprimir texto.
La implementacion de ese proyecto hace uso de todas las ventajas que enumere de la serie 18, es decir utiliza una zona de memoria contigua como RAM de video, utiliza las instrucciones para acceder rapidamente a una tabla que contiene la ROM de caracteres, y hace uso del incremento automatico y los punteros de 16 bits, con lo cual obtiene un codigo suficientemente compacto, tanto que permite el funcionamiento por interrupciones, una cada aproximadamente 64 us, y hasta puede procesar el puerto serie del PIC para comunicarse con el dispositivo que le envia los caracteres.
El proyecto basicamente es una terminal serie que recibe caracteres y los imprime en pantalla, consta de 38 columnas x 16 filas, mas una fila extra como linea de estado. Puede comunicarse a 1200, 2400, 4800 o 9600 bps, tiene scroll de pantalla hacia arriba y no implementa otros codigos como el borrado de pantalla o la ubicacion del cursor en una fila y columna determinadas. Ademas de esto implementa el registro de desplazamiento en el mismo PIC usando un puerto SPI, activandolo y desactivandolo para que actue como se requiere, de manera que el hard es extremadamente simple, funciona con un cristal de 8MHz ya que utiliza una caracteristica del PIC de multiplicar la frecuencia de reloj internamente a 32MHz, y usa un DAC basico de 3 resistencias para la salida de video, mas un capacitor de acople en la alimentacion del PIC.
Las modificaciones que habria que hacer serian eliminar el puerto serie, implementar un sistema de puertos de 8 bits para comunicarse con el microprocesador, y definir algunos comandos basicos para ajustar la posicion del cursor, borrar pantalla, leer y escribir posiciones de memoria de la RAM de pantalla, leer la posicion del cursor, y alguna otra cosa que se nos ocurra. Tambien se podria ajustar la resolucion para adaptarla al sistema PAL, ya que ahora trabaja a 60Hz para un TV NTSC y se podria llegar a aumentar al menos la cantidad de filas que son muy pocas, eliminando ademas la linea de estado para que todas sean iguales.