# Motorola 6845

El Motorola 6845, MC6845 o también conocido como CRTC6845 (Cathode Ray Tube Controller 6845), es un generador de direcciones de video, introducido primeramente por Motorola. Aunque el 6845 fue desarrollado para los diseños basados en el Motorola 6800 y tenía un número de pieza relacionado con esta familia, fue usado junto con muchos otros procesadores.
El 6845 fue usado en los adaptadores video MDA, CGA y Plantronics Colorplus de los primeros ordenadores personales de IBM y sus compatibles, como también en los ordenadores Amstrad CPC y BBC Micro o en las tarjetas Videx VideoTerm para Apple II. La funcionalidad del 6845 fue duplicada y ampliada mediante circuitos personalizados en los adaptadores de video para PC EGA y VGA.

## Diseño

Diseñado originalmente por Hitachi como HD46505. Las versiones construidas por Hitachi se encuentran en una amplia variedad de computadoras japonesas, desde Sony, Sharp, Panasonic y Casio. Clonado posteriormente como MB89321A por Fujitsu.También se le conoce como 6845 CRTC o CRTC6845, que significa "controlador tubo de rayos catódicos". Esta versión se utilizó en Apricot PC y Victor 9000 para proporcionar una pantalla monocromática con resolución de 800x400. Un clon común de este controlador CRT es el controlador CRT United Microelectronics Corporation (UMC) UM6845E. El 6845 era muy similar y estaba relacionado con el posterior 6545 fabricado por MOS Technology (Commodore Semiconductor Group) y Rockwell (en dos versiones).

## Descripción

El 6845 generaba las señales necesarias para conectarse con una pantalla de trama pero no mostraba ningún píxel. Era usado para producir correctamente los tiempos para la sincronización horizontal y vertical y proporcionar la dirección de memoria en la cual el próximo pixel o conjunto de píxeles debía ser leído. El proceso de leer ese valor, convirtiéndolo en pixeles y enviarlos a un CRT era dejado a otros circuitos.
Eran soportados los modos de salida de vídeo entrelazados y no entrelazados, al igual que un cursor de texto por hardware. Se proporcionaba un latch que cuando era disparado duplicaba y conservaba una copia de la dirección de vídeo que había en ese momento para poder ser leída más adelante por la CPU. Esto permitía el funcionamiento de dispositivos de señalización como el lápiz óptico y la pistola de luz que enviaban una señal al 6845 cuando el haz electrónico pasaba por el lugar donde estaban apuntando, permitiendo así que un programa pudiera saber la localización señalada.
Ya que todos los aspectos de la sincronización de vídeo eran programables, una sola máquina podía cambiar entre las sincronizaciones NTSC y PAL por medio de software. El chip también podía ser usado para controlar monitores o cualquier otro tipo de barrido

## Registros

El chip tenía un total de 18 registros de 8 bits que controlaban todos los aspectos de las sincronizaciones video. Solamente dos direcciones eran expuestas a los componentes externos, una que era un índice para seleccionar cual registro interno debía ser accedido, y otra para acceder el registro seleccionado, ya sea para lectura o escritura.
| N.º de Registro | Función |
| 0 | Total horizontal, en númeroo de caracteres |
| 1 | Número de caracteres horizontales mostrados por fila |
| 2 | Posición de sincronización horizontal |
| 3 | Ancho de sincronización horizontal, en número de caracteres |
| 4 | Total vertical |
| 5 | Ajuste del total vertical, en número de líneas de escaneo |
| 6 | Número de filas mostradas (verticalmente) |
| 7 | Posición de sincronización vertical, en Nro de filas de caracteres |
| 8 | Modo de entrelazado |
| 9 | Máxima dirección de líneas de escaneo |
| 10 | Inicio del cursor, en línea de escaneo |
| 11 | Final del cursor, en línea de escaneo |
| 12 | Dirección inicial de la pantalla (High) |
| 13 | Dirección inicial de la pantalla (Low) |
| 14 | Dirección del cursor (High) |
| 15 | Dirección del cursor (Low) |
| 16 | Dirección del Light Pen (High) |
| 17 | Dirección del Light Pen (Low) |
El 6845 se diseñó para visualizaciones basadas en caracteres. Cada dirección que generaba se componía de dos partes, una dirección del carácter, de 14 bits, y una dirección de la fila (línea scan del carácter), de 5 bits. Sin embargo, el 6845 se podía usar también para generar gráficos.
La dirección del carácter aumentaba linealmente. Cuando el chip señalaba la sincronización horizontal (final de la línea), se incrementaba la dirección de la línea. Si la dirección de la fila no igualaba el número programáticamente fijado de líneas por carácter, entonces la dirección del carácter se resetea para tener el mismo valor que tenía al principio de la línea de escaneo actual. La dirección de la línea se resetea a cero después de escanear la última línea del carácter, para así prepararse a escanear la primera línea de la siguiente fila de caracteres.
Si la dirección del carácter era usada para mirar una referencia del carácter en RAM y la dirección de la línea para indexar una tabla de gráficos que representaban el carácter en la ROM, se construía una visualización ordinaria de modo de texto.

## Framebuffers lineales

Como se describió arriba, el 6845 ordinariamente no podía proporcionar grandes framebuffers lineales. Un diseño solo podía usar la dirección de caracteres de 14 bits y ajustar el número de filas por carácter a 1 pero estaría restringido a 16 KB de memoria direccionable. Se puede apreciar en una muestra de código.
Una solución de compromiso se encontraba en el Amstrad CPC que combinaba la dirección de filas y la dirección del caracteres juntas, de tal manera de proporcionar scanlines lineales dentro de un buffer no lineal. Esto tenía las ventajas de una programación más fácil para la visualización de no caracteres y un movimiento suave horizontal, pero severamente impide el movimiento en sentido vertical.

## Modos de vídeo

| Modo | Resolución | Colores | Bytes |
| Alphanumeric Internal | 32 x 16 | 1 + Negro | 512 |
| Alphanumeric External | 32 x 16 | 1 + Negro | 512 |
| Semigraphics 4 | 64 x 32 | 8 + Negro | 512 |
| Semigraphics 6 | 64 x 48 | 4 + Negro | 512 |
| Color Graphics 1 | 64 x 64 | 4 | 1024 |
| Resolution Graphics 1 | 128 x 64 | 1 + Negro | 1024 |
| Color Graphics 2 | 128 x 64 | 4 | 2048 |
| Resolution Graphics 2 | 128 x 96 | 1 + Negro | 1536 |
| Color Graphics 3 | 128 x 96 | 4 | 3072 |
| Resolution Graphics 3 | 128 x 192 | 1 + Negro | 3072 |
| Color Graphics 6 | 128 x 192 | 4 | 6144 |
| Resolution Graphics 6 | 256 x 192 | 1 + Negro | 6144 |

## Diferencias con el 6545

Aunque en gran parte eran compatibles, existían un número de pequeñas variaciones entre el 6845 y el 6545. La mayor diferencia era que el 6545 podía ser configurado de modo que tuviera acceso único al bus de direcciones para la memoria de vídeo. Eran incluidos dos registros adicionales para ajustar cualquier dirección que la CPU deseara leer y el chip se alternaba entre hacer salir direcciones para la generación de la visualización y el ajuste de visualización para el acceso de la CPU.
Pequeños cambios eran que el MOS Technology y una variación del Rockwell 6545 carecían de soporte para salida entrelazada y todos los 6545s incluyeron un ajuste opcional de la dirección, que si se activaba, retrasaba la activación de la visualización por un carácter. Esta segunda característica fue incorporada en las últimas variaciones del Motorola 6845. El 6545 se podía ajustar, usando un bit de estado, para trabajar en modo lineal de 14 bits. En el 6845 se requería el ajuste de la altura del carácter.

## Trucos

El 6845 leía la dirección del comienzo para la visualización de vídeo una vez por frame. Sin embargo, si los valores de la sincronización interna en el chip eran alterados en el tiempo correcto, se podía hacer que se preparara para un nuevo frame sin terminar el actual, creando un salto no continuo de las direcciones generadas a mitad del camino de la visualización. Esto era comúnmente usado por los juegos para proporcionar un área móvil de visualización (generalmente el campo de juego), y un área estática (generalmente una visualización de estado).
El desplazamiento en sentido vertical resultaba restringido porque solamente la dirección de inicio del carácter podía ser ajustada y la dirección de la fila se ponía siempre a cero al inicio del frame, pero ajustando los tiempos del borde era posible desplazar, para incrementos de caracteres enteros, la posición en la que el framebuffer era mostrado en la pantalla. Con el dibujo de píxeles en blanco en los bordes de la pantalla, esto podía hacerse invisible al usuario, creando justo la ilusión de un desplazamiento vertical suave.