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

< SEGUINDO ADIANTE: O NLSFUNC.EXE >


Para implementarmos as páginas de código, já montamos duas peças do quebra-cabeças: emitimos o comando "country" e carregamos o driver de vídeo Display.Sys. O primeiro apenas fornece informações sobre o país, e o segundo reserva memória para carregar as páginas de código e incorpora o código para gerenciar o vídeo. Mas manejar o suporte às páginas de código mesmo, que é bom, nenhum deles sabe fazer. E como se trata de exibir informações em um dispositivo de saída, tudo indica que essa tarefa deveria ser manejada por um device driver, ou gerenciador de dispositivo. Mas não é: a maneira tortuosa do DOS resolver esse tipo de problema fez implementar essas funções por meio de um programa residente. Ele se chama Nlsfunc.Exe, cujo nome parece um tanto complicado apenas até se perceber que nada mais é que a abreviação de National Language Support Functions, ou seja, funções de suporte para idiomas nacionais. O que é perfeitamente razoável, para variar.

Como todo bom residente, o Nlsfunc.Exe fica quietinho ocupando seu quinhão de memória e somente se manifesta ao ser solicitado. E quando isso ocorre? Toda a vez que for preciso exibir no vídeo um caractere cujo código ASCII seja superior a 128. A coisa funciona assim: se o suporte às páginas de código estiver totalmente implementado, quando um programa solicita ao sistema operacional que exiba, por exemplo, o caractere correspondente ao código ASCII 132, o Nlsfunc.Exe intercepta a solicitação e verifica qual a página de código ativa (sim, pois se sua placa de vídeo for EGA ou VGA você pode ter mais de uma página de código carregada na memória, mas em um dado instante apenas uma pode estar em uso: essa é a ativa). Com essa informação, determina o caractere correspondente. E o repassa ao Display.Sys, o gerenciador de vídeo, que então o exibe na tela. Parece complicado, mas funciona.

E a que caractere corresponde o código ASCII 132? Bem, é para isso que servem as páginas de código: depende da que estiver ativa. Se for, por exemplo, a 860, que corresponde ao idioma português, será um a-til. Mas se for a 850 (multilinguagem) ou a 437 (inglês internacional, a página de código de hardware gravada na ROM da maioria das placas de vídeo), será um a-trema. Entendeu agora por que a maior parte dos vídeos (e todos os que usam adaptadores CGA) mostram aquele desagradável a-trema no lugar do a-til?

Sendo o Nlsfunc.Exe um programa residente, pode ser carregado até mesmo da linha de comando. O que é uma péssima idéia: como é parte de uma longa cadeia, ele sozinho nada faz. E não tem sentido fazer todas as demais alterações no Config.Sys e Autoexec.Bat e deixar apenas ele para ser carregado da linha de comando. Por conseguinte, é claro que seu lugar é no Autoexec.Bat, que serve justamente para isso. Portanto, para carregar o Nlsfunc.Exe, basta incluir no Autoexec.Bat uma linha com seu nome, sem extensão. Isso, claro, desde que o arquivo que contém o programa esteja no diretório corrente. Se não, é preciso preceder o nome com a via do diretório (como o Nlsfunc.Exe faz parte do sistema operacional, durante a instalação ele foi armazenado no diretório que contém os demais arquivos do sistema, geralmente o diretório C:\DOS).

Mas qual é o diretório corrente no momento em que o sistema é carregado? Ora, o diretório raiz do disco de boot. Portanto, pode-se repetir aqui o mesmo procedimento adotado com o Display.Sys e Country.Sys: copiar o arquivo Nlsfunc.Exe para o diretório raiz do disco de boot. Com isso, além de evitar a inclusão da via de diretório na chamada do programa, se garante que todos os arquivos necessários à carga e configuração do sistema estejam onde devem estar, ou seja, no diretório raiz do drive C (ou, se você não tem disco rígido, do disquete usado para dar o boot do drive A). E então, para carregar o Nlsfunc.Exe, basta incluir no Autoexec.Bat uma linha com seu nome. Algo, assim, singelo:

nslfunc

Simples, não? E, de fato, o é. Mas desde que o arquivo Country.Sys também tenha sido copiado para o mesmo diretório raiz. Pois o Nlsfunc.Exe necessita de algumas informações no momento mesmo em que é carregado, e vai buscá-las no comando "country" e no arquivo Country.Sys. Que precisa saber onde encontrar.

Que informações são essas? Ora, o país. Veja porque: como será encarregado do suporte às páginas de código, ao ser carregado o Nlsfunc.Exe lê a área de memória que armazena as informações escritas pelo comando "country", já previamente executado, e verifica qual o país (lembre-se que o Config.Sys, onde está obrigatoriamente o comando "country", é executado antes do Autoexec.Bat, onde é carregado o Nlsfunc.Exe). Depois, ele consulta o arquivo Country.Sys, em disco, para buscar as informações pertinentes ao país, que agora já conhece. Portanto, é fundamental que ele saiba onde encontrar o arquivo Country.Sys. Se ambos estão no diretório raiz, o diretório corrente no momento da carga do sistema, tudo bem. Se não, é imprescindível informar ao Nlsfunc.Exe onde encontrar o Country.Sys. Isso é feito incluindo na mesma linha, logo após a chamada ao Nlsfunc.Exe, a especificação completa do arquivo Country.Sys. Portanto, se você não copiou os arquivos correspondentes para o diretório raiz do disco de boot e os arquivos do DOS estão no diretório C:\DOS, a linha do seu Autoexec.Bat que carregará o Nlsfunc.Exe deverá ter o aspecto:

c:\dos\nlsfunc c:\dos\Country.Sys

E, nesse ponto, cabe uma advertência importante: caso o Nlsfunc.Exe não consiga encontrar o arquivo Country.Sys no disco (isto é, se ambos não estiverem no diretório raiz ou se a especificação do Country.Sys não for fornecida como parâmetro na linha que carrega o Nlsfunc.Exe), aparentemente nada de anormal acontecerá. Ao contrário do que consta do manual do DOS 5.0 em português, que está errado, não é emitida mensagem de erro. Mas o suporte às páginas de código não será implementado. Você somente notará que algo não vai bem ao tentar mudar a página de código ou, pior, quando perceber alguns caracteres muito estranhos onde deveriam estar seus caracteres acentuados. Preste atenção a esse ponto, pois é um engano fácil de cometer e difícil de identificar: tudo parece correr bem, mas nada funciona...

B. Piropo