Escritos
B. Piropo
Anteriores:
< Trilha Zero >
Volte de onde veio
20/04/1992

< TROCANDO A PÁGINA >


Vamos começar a aprender como trocar a página de código para exibir os caracteres acentuados do português em nossas telas. E apenas começar, por que a coisa é um pouco mais complicada do que era de se esperar. Por outro lado, o processo é bastante instrutivo. De modo que, mesmo que sua máquina use o padrão de vídeo CGA, que não permite trocar a página de código, vale a pena acompanhar o assunto. Você vai aprender um bocado sobre a maneira tortuosa que o DOS usa para resolver certos problemas.

Acontece que o DOS foi desenvolvido no início dos anos 80 para um micro que já não existe: o primeiro PC, com apenas 64K de RAM e sem disco rígido. E, naquele tempo, ninguém pensou em internacionalização (na verdade, ninguém pensou que a coisa iria dar tão certo a ponto de ser necessário internacionalizar). O bicho trazia gravado em ROM na placa de vídeo um conjunto de caracteres que dava e sobrava para escrever em inglês. Para que mais?

De lá para cá muita coisa mudou. Inclusive o DOS. Mas mantendo, sempre que possível, compatibilidade com as versões anteriores. O que é elogiável, mas implica em soluções de compromisso. Na verdade as novas versões do DOS nada mais são que adaptações da primeira: um imenso conjunto de remendos para dar suporte a novos componentes e satisfazer a novas necessidades.

Com a internacionalização do sistema não poderia ser diferente. No que toca aos velhos padrões de vídeo CGA e MDA, nada poderia ser feito: eles somente permitem exibir nas telas texto o conjunto de caracteres indelevelmente gravado em ROM. Deixe, portanto, nos umbrais do mundo CGA, qualquer esperança de ver em sua tela um bonito a-til: no máximo você vai conseguir aquele ridículo a-trema usado para simulá-lo. Já os padrões EGA e VGA (assim como o padrão LCD, usado nas telas de cristal líquido do falecido IBM portátil), por terem sido desenvolvidos mais tarde, já incorporaram a possibilidade de acessar a outros conjuntos de caracteres além daquele gravado em ROM. A forma de fazê-lo é bastante engenhosa: carrega-se um ou mais conjuntos de caracteres na memória RAM. Depois, quando o sistema operacional vai consultar a fonte para saber qual o formato do caractere a ser exibido na tela, desvia-se a consulta dos endereços de memória da fonte gravada em ROM para os novos endereços ocupados pela fonte em RAM que se deseja usar naquele momento. O sistema não percebe a diferença e mostra na tela o mapa de bits que encontrou. Esses conjuntos de caracteres que correspondem às fontes são denominados "páginas de código", e cada um suporta a um idioma ou conjunto de idiomas. Uma solução inteligente, mas, claramente, uma adaptação que irá exigir uma série de intervenções por parte do usuário.

Se você estranhou o fato de se manter uma fonte em ROM mesmo nas placas EGA ou VGA, a razão é simples: sem ela, a máquina não teria como mostrar mensagens na tela antes de carregar o sistema operacional. E, o mais grave: como informar que algo deu errado caso não consiga carregar o sistema do disco? Por isso toda placa de vídeo vem com uma fonte default gravada em ROM. Ela é a "página de código de hardware" e geralmente corresponde à nossa velha conhecida tabela ASCII estendida, a mesma usada pelo padrão CGA, a página de código 437 que dá suporte ao idioma inglês.

Então vamos ver como proceder para usar outra página de código que não a de hardware. E para ter uma visão panorâmica da situação, abordaremos o assunto de forma genérica antes de descer aos detalhes. Que não são poucos. Mas não se esqueça da condição básica: sua placa de vídeo e monitor devem ser EGA ou VGA.

Primeiro precisamos de ajustar o sistema para gerenciar o vídeo e tornar possível a mudança das páginas de código. Ora, o vídeo é um dispositivo. E nós sabemos que o suporte para gerenciar um dispositivo é fornecido por um gerenciador de dispositivo, ou "device driver". Que, nesse caso, traz o nome óbvio de Display.Sys e deve ser instalado através do comando "device" no arquivo Config.Sys. Se o DOS usasse uma forma menos tortuosa de fazer as coisas, isso seria o bastante. Mas não: com o Display.Sys nada mais fazemos que informar ao sistema qual é a placa de vídeo e quantas páginas de código pretendemos usar. Note que eu disse quantas, e não quais: no que toca às páginas de código, tudo o que o Display.Sys faz é reservar espaço na memória para elas. Ele não as carrega nem lhes oferece suporte: apenas gerencia o vídeo.

Quem fornece o suporte, ou seja, quem controla que página de código está ativa em um dado momento e manipula as chamadas de vídeo, é um pequeno residente, o Nlsfunc.Exe (cujo nome deriva justamente de "national language support functions", ou funções de suporte para idiomas nacionais). Que deve, então, ser carregado na memória. E a forma ideal de fazê-lo é através do Autoexec.Bat.

Já temos dois elos na nossa corrente: o Nlsfunc, que "sabe" qual página de código está em uso, intercepta as chamadas de vídeo, dirigindo-as para a área da memória onde estão armazenadas as novas fontes e repassa o resultado para o Display.Sys. E este último, que trata da exibição do resultado no vídeo.

Deveria ser o bastante, mas não é: pois nem um nem outro carregam na memória RAM as páginas de código desejadas. Isso é feito por meio do comando "mode", também em geral emitido de dentro do Autoexec.Bat. E como já temos quem carregue as páginas de código, quem as maneje e quem as exiba, parece que é o suficiente. Mas não: o DOS não iria deixar isso barato assim. Tem mais.

Falta ainda algo que poderíamos chamar de efeito Francelino: informar ao sistema que país é esse. Pois algumas páginas de código são compartilhadas por mais de um idioma. Para isso basta usar o comando "country", emitido no Config.Sys. E, finalmente, é preciso tornar ativa a página de código desejada por meio do comando "chcp" (de "change codepage", ou trocar página de código). E c'est finí.

Isso tudo parece complicado demais: drivers, comandos, residentes, uma confusão medonha só por causa de uns acentos na tela. Na verdade, há mesmo uma certa complexidade, a meu ver, desnecessária. Mas nada que seja impossível destrinchar. Você logo verá como o diabo é menos feio do que o pintam.

B. Piropo