Hace unos diez años obtuve las tarjetas de video ISA de 286 ... 486 máquinas destinadas a la descarga. Las tarjetas de video han sido probadas y desde entonces han estado acumulando polvo en un cajón. Hace un par de años, tuve una idea, pero ¿debería conectar una tarjeta de video a un microcontrolador? De esto es de lo que hablaré en el artículo.
Para conectar una tarjeta de video ISA antigua, un bus de datos de 8 bits y un bus de direcciones de 20 bits son suficientes. Microcontroladores Amo a la familia AVR por su simplicidad, así que tomé Atmega16. Pero puede tomar cualquier cosa conveniente para usted: en este caso, las mismas patas stm32 definitivamente serán suficientes sin flejes externos. Pero el Atmega16 no tiene suficientes patas para todos estos autobuses, por lo que el bus de direcciones se ensambló en tres registros paralelos soviéticos más (tengo una gran cantidad de ellos) K588IR1. El microcontrolador a su vez establece las partes de dirección en estos tres registros. No se requiere más.

En el conector ISA, las salidas de este circuito deben conectarse de la siguiente manera:
+5,
+12,
GND
REFRESH (tirado a + 5V a través de una resistencia),
A0-A19,
D0-D7,
RESET
Memw
Memr
IOW
IOR
Ale
RDY
AEN (se conecta a GND).
En la imagen en rojo, marqué los pines del conector ISA que deben conectarse.
Para algunas tarjetas de video, debe conectar -5 V y -12 V (debe obtenerlas en algún lugar, por ejemplo, de fuentes TracoPower) y la señal OSC (14.318 MHz), puede ser generada por el generador más simple en K155LN1. Otras tarjetas gráficas no necesitan estas líneas. Aquí es lo afortunado. En general, si el pie correspondiente en el ISA cuelga en el aire en la tarjeta de video, definitivamente no puede conectarlo. Tenga en cuenta que el consumo de la tarjeta de video en la línea de + 5V es bastante considerable: si usa algo como LM7805 como fuente de alimentación, asegúrese de colocarlo en un radiador (preferiblemente con un ventilador).
Personalmente, mi diseño ensamblado se ve así:

Lo único que queda es inicializar de alguna manera la tarjeta de video y comenzar a trabajar con ella. Hay proyectos similares en Internet: encontré uno (
enlace ), donde obtuve el código de inicialización de la tarjeta de video Trident 9000i. En el mismo programa de Internet, hay un código de inicialización para Trident9000C, pero los comentarios indican que no funciona. Lo comprobé. Realmente no funciona: en la pantalla, la basura y la tarjeta de video no responden a la escritura de datos en la RAM.
Video de trabajo (la imagen se transmitió a través de SPI a Atmega16 (como puede ver, estas líneas se dejan libres en el diagrama) a través del puerto LPT de la computadora):
(Hice una reserva en el video - modo 320x200, no 320x240)
Al combinar este módulo con un mouse óptico (
artículo sobre el uso del sensor del mouse ) obtuve esto:
Si desea ejecutar cualquier tarjeta gráfica ISA existente, entonces para esto debe encontrar el BIOS de la tarjeta gráfica requerida (por ejemplo,
aquí ) en Internet y desarmarla usando IDA. Hay un código X86 normal. Simplemente no comienza en la dirección 0: hay una firma (2 bytes) y una suma de comprobación (1 byte). Total, debe comenzar con el tercer byte. Y descubra constantemente en qué puertos debe grabar lo que necesita para que la tarjeta funcione. Francamente, no tuve la paciencia para entender lo que estaba mal con el Trident9000C.
Para trabajar con el bus ISA, se escribió un módulo:
Módulo para trabajar con el bus ISA La inicialización de la tarjeta gráfica Trident 9000i es la siguiente:
Inicializando gráficos Trident 9000i También lancé la tarjeta de video OAK OTI077 (hasta que accidentalmente le apliqué 12 V y se quemó):
Inicialización de la tarjeta gráfica OAK OTI077 Por cierto, ¿hay algún especialista en registros de adaptadores VGA aquí? Veo cosas extrañas en el código de cambio del modo de video al inicializar la tarjeta de video:
Aquí, en general, no hay nada especial. La escritura en los registros del controlador de atributos se realiza en 2 pasos: primero escribimos el número de registro y luego los datos. Para comenzar siempre registrando el número, lea ISR1 (de 0x03DA), así es como es.
Pero aquí está lo extraño. ¡El controlador de atributos no tiene un registro 0x20! Tiene el último registro 0x14. E incluso si hubiera tal registro, ¿por qué no hay un registro de valor? Debería haber dos entradas en el puerto. Y aquí está ella sola. Busqué en Internet y descubrí que por alguna razón (en los libros no encontré esto), puede escribir, digamos, en el registro 0x10 el valor 0x20 a la vez simplemente combinando los bits: System_Out8 (ATTRCON_ADDR, 0x10 | 0x20); ¿Entonces el registro especificado escribe 0x20 en el registro 0x00? ¿Pero por qué funciona esto? ¿Y eso es así? Esto es interesante para mí, por eso, todo es que a veces el color se cae después de la inicialización. La paleta simplemente no está configurada. Se puede ver que está cambiando, pero los colores no son lo que deberían ser. Si la inicialización se realiza nuevamente, entonces todo se restaura. En qué etapa sucede esto no está claro. Experimentalmente, descubrí que con alta probabilidad, esto es solo la instalación del modo de video. Pero qué no está exactamente allí, no lo entiendo.
→
Enlace al archivo con la placa de circuito impreso
→
Enlace al archivo con firmware