Cerca de dez anos atrás, eu adquiri as placas de vídeo ISA de 286 ... 486 máquinas destinadas a despejo. As placas de vídeo foram testadas e, desde então, acumulam poeira em uma gaveta. Há alguns anos, eu pensei, mas devo conectar uma placa de vídeo a um microcontrolador? É sobre isso que vou falar neste artigo.
Para conectar uma placa de vídeo ISA antiga, um barramento de dados de 8 bits e um barramento de endereço de 20 bits são suficientes. Microcontroladores Eu amo a família AVR por sua simplicidade, então peguei o Atmega16. Mas você pode tomar qualquer coisa conveniente para você - nesse caso, as mesmas pernas stm32 definitivamente serão suficientes sem cintas externas. Como o Atmega16 não possui pernas suficientes para todos esses barramentos, o barramento de endereços foi montado em mais três registros paralelos soviéticos (eu tenho uma grande quantidade deles) K588IR1. O microcontrolador, por sua vez, define as partes do endereço nesses três registros. Mais não é necessário.

No conector ISA, as saídas deste circuito devem ser conectadas da seguinte maneira:
+5,
+12,
GND
REFRESH (puxado para + 5V através de um resistor),
A0-A19,
D0-D7,
RESET
Memw,
Memr,
IOW
IOR
Ale
RDY,
AEN (conecta ao GND).
Na figura em vermelho, marquei os pinos do conector ISA que requerem conexão.
Para algumas placas de vídeo, é necessário conectar -5 V e -12 V (você precisa obtê-las em algum lugar - por exemplo, de fontes TracoPower) e o sinal OSC (14,318 MHz) - pode ser gerado pelo gerador mais simples do K155LN1. Outras placas gráficas não precisam dessas linhas. Aqui está a sorte. Em geral, se o pé correspondente no ISA estiver suspenso no ar na placa de vídeo, você definitivamente não poderá conectá-lo. Lembre-se de que o consumo da placa de vídeo na linha + 5V é bastante substancial - se você usar algo como o LM7805 para fonte de alimentação, coloque-a em um radiador (de preferência com um ventilador).
Pessoalmente, meu design montado é assim:

A única coisa que resta é inicializar a placa de vídeo e começar a trabalhar com ela. Existem projetos semelhantes na Internet - encontrei um (
link ), onde obtive o código de inicialização da placa de vídeo Trident 9000i. No mesmo programa da Internet, há um código de inicialização para o Trident9000C, mas os comentários indicam que ele não funciona. Eu verifiquei. Realmente não funciona - na tela, o lixo e a placa de vídeo não respondem à gravação de dados na RAM.
Vídeo do trabalho (a imagem foi transmitida via SPI para o Atmega16 (como você pode ver, essas linhas são deixadas livres no diagrama) através da porta LPT do computador):
(Fiz uma reserva no vídeo - modo 320x200, não 320x240)
Ao combinar este módulo com um mouse óptico (
artigo sobre o uso do sensor do mouse ), obtive o seguinte:
Se você deseja executar qualquer placa gráfica ISA existente, para isso, encontre o BIOS da placa gráfica necessária (por exemplo,
aqui ) na Internet e desmonte-o usando o IDA. Existe um código X86 regular. Ele simplesmente não inicia no endereço 0 - há uma assinatura (2 bytes) e uma soma de verificação (1 byte). Total, você precisa começar com o terceiro byte. E descubra consistentemente em quais portas o que você precisa gravar para que o cartão funcione. Francamente, não tive paciência para entender o que havia de errado com o Trident9000C.
Para trabalhar com o barramento ISA, um módulo foi gravado:
Módulo para trabalhar com o barramento ISA A inicialização da placa gráfica Trident 9000i é a seguinte:
Inicializando gráficos do Trident 9000i Também lancei a placa de vídeo OAK OTI077 (até aplicar acidentalmente 12 V nela e ela queimar):
Inicialização da placa gráfica OAK OTI077 A propósito, existem especialistas em registros de adaptadores VGA aqui? Vejo coisas estranhas no modo de vídeo alterar o código ao inicializar a placa de vídeo:
Aqui, em geral, não há nada de especial. A gravação nos registros do controlador de atributo é feita em 2 etapas: primeiro, escrevemos o número do registro e depois os dados. Para começar sempre registrando o número, leia ISR1 (de 0x03DA) - é assim que é.
Mas aqui está a coisa estranha. O controlador de atributo não possui um registro 0x20! Ele tem o último registro 0x14. E mesmo que exista esse registro, por que não há registro de valor? Deve haver duas entradas na porta. E aqui está ela sozinha. Pesquisei na Internet e descobri que, por algum motivo (não encontrei isso nos livros), você pode escrever, digamos, no 0x10 registrar o valor 0x20 por vez, simplesmente combinando os bits: System_Out8 (ATTRCON_ADDR, 0x10 | 0x20); Em seguida, o registro especificado grava 0x20 no registro 0x00? Mas por que isso funciona? E é assim? Isso é interessante para mim, é por isso - a coisa toda é que às vezes a cor cai após a inicialização. A paleta simplesmente não está definida. Vê-se que está mudando, mas as cores não são exatamente o que deveriam ser. Se a inicialização for feita novamente, tudo será restaurado. Em que estágio isso acontece não está claro. Experimentalmente, descobri que, com alta probabilidade, essa é apenas a instalação do modo de vídeo. Mas o que exatamente não está lá, eu não entendo.
→
Link para o arquivo com a placa de circuito impresso
→
Link para o arquivo com firmware