eu acho que aquilo eh para sincronizar os delays do 6845/memoria/rom com o andamento do shift register. note que aquele circuito eh para gerar uma tela texto, provavelmente de 80x25 caracteres, entao o 6845 puxa da memoria um byte q indica o caracter e entao uma rom manda para o shift register o bitmap do caracter, exatamente no instante em que o ultimo pixel do caracter anterior saiu do shift register.
se vc tirar a rom de caracteres, os bytes puxados pelo 6845 iriam direto para o shift register e ainda assim teria que existir esse tipo de sincronismo. o 6845 iria pensar q sua tela eh 80x100 caracteres, por exemplo, mas na verdade vc teria 640 pixels nesses 80 bytes. e nas 100 linhas, na verdade, vc teria caracteres de 2 linhas de altura, usando o pino RA0 como um truque, selecionando linhas pares/impares e dobrando a resolucao final, para 640x200 pixels, que eh a resolucao do CGA. por sinal eu descolei uma tabela com os valores utilizados no 6845 para texto e graficos no PC:
- Código: Selecionar todos
Registers: Accessed through ports 3B5 & 3D5 VALID VALUES
MONO CO40 CO80 GRPH
00 - Horiz. total characters 61 38 71 38
01 - Horiz. displayed characters per line 50 28 50 28
02 - Horiz. synch position 52 2D 5A 2D
03 - Horiz. synch width in characters 0F 0A 0A 0A
04 - Vert. total lines 19 1F 1F 7F
05 - Vert. total adjust (scan lines) 06 06 06 06
06 - Vert. displayed rows 19 19 19 64
07 - Vert. synch position (character rows) 19 1C 1C 70
08 - Interlace mode 02 02 02 02
09 - Maximum scan line address 0D 07 07 01
0A - Cursor start (scan line) 0B 06 06 06
0B - Cursor end (scan line) 0C 07 07 07
0C - Start address (MSB) 00 00 00 00
0D - Start address (LSB) 00 00 00 00
0E - Cursor address (MSB) (read/write) 00 -- -- --
0F - Cursor address (LSB) (read/write) 00 -- -- --
10 - Light pen (MSB) (read only) -- -- -- --
11 - Light pen (LSB) (read only) -- -- -- --
- Registers 00-0D are write only, registers 0E-0F are read/write and
registers 10-11 are read only
- Cursor address is calculated with using the following (row*80)+col
quem quiser tomar como exercicio, tem q converter, pq tah em hexa. e alinhar a tabela, pq tah tudo torto! hehehe
nota que no grafico ele seta o tamanho da tela em 40x100 (registro 1 e 6) e seta a altura do caracter para 1 (registro 9), isso significa que o 6845 gera temporaizacao para 40x200 bytes, daih a placa de video propriamente dita se vira com o resto. com 40x200 bytes, vc teria 320x200 monocromatico. dobrando e recalculando os valores, vc teria uma configuracao para 640x200.
outra opcao seria nao usar um shift register, mas sim um DAC. nesse caso eu suspeito que o 6845 nao conseguiria gerar a temporizacao para algo alem de 160x200 pixels se vc usasse um DAC de 8 bits. se usar um bus de 16 bits, puxar uma word e alternar os bytes, conseguiria dobrar isto, ou seja, teria 320x200. se aumentar o tamanho da word ou diminuir o tamanho dos pixels, usando 16 bits e pixels de 4 bits (16 cores), vc teria 640x200. suspeito que seria possivel fazer ateh mesmo 640x400 pixels, entrelacado, nesse caso vc teria que aumentar a altura de caracter de 2 para 4 (seria o valor 3 no registro 9), mas vc teria o buffer de memoria quebrado em 4 partes distintas, ficaria um pouco confuso para programar.
algumas ideias adicionais de uso do 6845:
http://www.howell1964.freeserve.co.uk/l ... _clone.htm
ali explica sutilezas do 6845, como alguns registros cujo valor eh o valor total-1.
uma forma interessante de contornar essa separacao do buffer em linhas pares/impares ou mais separacoes seria usar resolucoes q sao potencia de 2, como 256, 512, 1024, etc. isso facilita bastante pq permite encadear os pinos RAx com os pinos MAx: por exemplo, supondo um display de 64x48 caracteres e caracteres de 8x8, para uma tela monocromatica vc poderia idealizar caracteres 8x8 imaginarios. os 64 bytes que chegam fornecem 512 pixels monocromaticos, que vao para um shift register. os 64 bytes sao enderecados pelos 6 bits menos significativos do bus de endereco (MA0-5). entao vc tem 48 linhas de caracteres, sendo cada caracter com 8 linhas, enderecados pelos pinos RA0-2 e pelos restantes MA6-A11, com mais 6 bits. como os pinos avancam em sequencia e temos potencia de 2 ali, vc poderia simplesmente construir:
[MA0-5 RA0-2 MA6-11] = 15 bits de endereco (na ordem mostrada)
e isso forma um buffer linear de 512x384 pixels (precisa ajustar isso dentro de um quadro NTSC e ativar o interlace ou ajustar em um quadro VGA/70Hz, de 400 linhas). talvez existisse algum detalhe extra relacionado a delay, enfim, uma outra opcao seria usar o 6845 apenas para gerar as temporizacoes, de modo que o buffer mesmo estaria sendo varrido por um canal de DMA (ou circuito equivalente, como 4x 7493 ou um chip de DMA de Z80, formando os 15 bits do buffer de video) que manda os bytes para um DAC.
enfim, eu diria que para comecar, se vc conseguir gerar os sinais de sync e blank corretamente, formando um quadrado branco com bordas pretas (sinal fixo mesmo, ativado pelo pino blank), jah eh meio caminho andado. depois tem q escolher uma arquitetura para memoria e pixels, o que vai definir se vai usar shift register, latches, DACs, etc.