quinta-feira, janeiro 21, 2021

Memórias dos Anos 80: A Evolução do Z

No post anterior eu apresentei o software de comunicação Z, que era o principal produto da Humana quando eu comecei a trabalhar lá. Neste post vou falar sobre os aperfeiçoamentos que foram feitos no Z nos meus primeiros dois anos de trabalho.

As janelas do Z (e do Zapt). A janela para o vídeo "status" está sendo definida,
reparar na seta que indica que ela só pode mudar de altura


As dificuldades

A programação do Z tinha algumas dificuldades decorrentes do hardware da época. Embora o PC-AT já tivesse sido lançado, os micros mais populares eram as cópias o PC-XT, com processador 8088 caminhando a 4,77MHz, 256K de Ram e placa de vídeo CGA.

Um software de comunicação é uma aplicação de tempo real. Trabalhando a 9600bps (típica da comunicação direta, sem modem), um byte é recebido a cada milissegundo (aproximadamente).Um buffer de recepção dá uma certa folga, mas você não quer gastar (na média) muito mais que isso no tratamento dos bytes recebidos.

A placa CGA original era particularmente lenta. A falta de uma sincronização dos acessos feitos pelo processador com os acessos feitos para enviar a imagem para o monitor obrigavam a só acessar a memória de vídeo durante os retraços. Os retraços horizontais permitiam escrever uns poucos caracteres, o retraço vertical era insuficiente para atualizar toda a tela (para limpar ou rolar). CGAs aperfeiçoadas (como a do Nexus 1600) e placas baseadas na MDA (Monochrome Display Adapter) não tinham esta restrição e eram suportadas pelo Z, mas não eram comuns.

O acesso à memória pelo 8088 é feito por ponteiros e endereços de 16 bits, combinados com registradores de segmentos para chegar à capacidade total de endereçamento de 1Mbyte. Para melhor desempenho e código mais compacto, idealmente os registradores de segmento não são alterados durante a execução. Só que isso limita a memória acessível a 64K de código mais 64K de dados. No caso do Z, o problema era o limite do código. Quando comecei a mexer, ele já estava próximo ao limite de 64K. Em alguma ocasião eu cheguei a fazer um subconjunto otimizado das rotinas de runtime para não ter que linkar as bibliotecas do compilador. Chegou um momento em que o código não cabia mais em 64K, a solução foi usar dois segmentos de código, procurando separar as rotinas de forma a minimizar as chamadas entre eles (mais demoradas e com instruções mais longas).

Existia uma certa variedade nas interfaces de comunicação. O mais comum eram as interfaces assíncronas seguindo o padrão do PC IBM, mas existiam algumas diferentes. A forma de comandar os modems tinha grandes variações, apesar com padrão "AT" estar ganhando força.

Múltiplos Vídeos

Na emulação de terminal a maioria (se não todos) os comandos recebidos afetam a tela. O Z emulava inicialmente uma tela de 24 linhas de colunas com uma "memória de vídeo" para salvar as linhas que eram roladas para fora (para este fim a limpeza era considerada um rolagem da tela toda). A imagem da tela era armazenada em uma área interna e as partes alteradas copiadas para a memória de vídeo conforme as limitações do harware permitiam.

O meu primeiro grande projeto foi colocar o suporte para múltiplos vídeos, cada um com sua quantidade  de linhas, colunas e memória. A maior dificuldade era como apresentar estes múltiplos vídeos simultaneamente em janelas. Para garantir um bom desempenho, era conveniente que as janelas não pudessem ser sobrepostas (ou seja, que todas as janelas tivessem um contorno retangular).

Foram várias discussões até chegarmos numa solução intuitiva para o usuário e de implementação eficiente: as janelas eram definidas "puxando" o vídeo (como uma cortina) a partir de uma das bordas da tela. Um pouco de trabalho adicional permitiu deixar configurável a presença de de uma moldura nas janelas.

Comunicação Síncrona

O recursos de múltiplos vídeos foi usado inicialmente na emulação do terminal TD-830 da Burroughs (que foi desenvolvida simultaneamente). Conseguimos logo um grande cliente para esta emulação, mas dois problemas surgiram.

O primeiro é que este cliente usava a comunicação síncrona ao invés de assíncrona. Eu só tinha conhecimentos teóricos de comunicação síncrona e, na falta de acesso a um mainframe, os testes tiveram que ser feitos comunicando com um outro micro. Não estava muito seguro com relação a resultado quando fui até o cliente (uma longa viagem de ônibus até o Paraná), mas tudo correu bem.

Atributos de Vídeo

O outro problema e que originalmente o Z não implementava atributos de vídeo (reverso, intenso, invisível e piscante). Ocorre que a empresa que ia usar a emulação tinha como logotipo um pinheiro e na entrada do sistema deles o pinheiro era apresentado... usando vídeo reverso. Apesar da boa impressão com o Z, ficou nítida a decepção do cliente na primeira demonstração.

Não vou entrar aqui nos detalhes técnicos (inclusive porque não me lembro!), mas deu bastante trabalho implementar os atributos. E, alguns meses depois, o código foi jogado fora. Ocorre que o que eu implementei foi o chamado "atributo de caracter", onde cada caracter tem um atributo que o afeta. Mais para frente, para emular terminais IBM, foi preciso emular também os "atributos de campo" onde um atributo vale para os caracteres seguintes até chegar num outro atributo (ou, dependendo do terminal, chegar no fim da tela).

Neste ponto já tínhamos mais projetistas (lembre-se que a Humana crescia exponencialmente nesta época) e a reescrita da atualização do vídeo foi feito (com maestria) por outra pessoa. Como a atualização do vídeo era um ponto crítico, a maior parte do código estava em Assembly.

Interfaces e Modems

Com a inclusão do suporte a interfaces síncronas a configuração de interfaces ficou mais confusa. A parte de modens também exigia a entrada de alguns "encantamentos" na configuração. Era preciso dar alguma estruturação nisto.

A ideia adotada neste primeiro momento foi criar uma espécie de "dicionário" de interfaces e modems, em um arquivo externo. O Z processava este arquivo para fornecer opções hierárquicas (tipo ASSINCRONA:PADRAO) na seleção de interface e modem e selecionar adequadamente os campos a apresentar, os valores aceitos e os valores default.

Foi uma mexida delicada, que em alguns momentos pensei que não ia conseguir terminar. Lembro que queríamos mostrar numa feira no Rio e na véspera da abertura eu estava na varanda do hotel tentando tirar os bugs...

Anos depois esta parte também seria jogada fora, Na versão 2 do Zapt (sucessor do Z) passamos a ter drivers externos para interfaces e modems.

Na medida do possível, essa era a filosofia de desenvolvimento da Humana: ir aperfeiçoando o software sem ter medo de abandonar o que ficava obsoleto.

Para quem quiser ver o Zapt em ação, com comentários, tem um vídeo no meu canal: https://www.youtube.com/watch?v=lvmhLrZiZV8


Nenhum comentário: