quarta-feira, março 09, 2011

ZX81/TK82C: Programando em Linguagem de Máquina

Embora o BASIC do ZX81 fosse suficiente para diversas aplicações, ele não tinha o desempenho necessário para jogos de ação. Para isto era necessário programar em linguagem de máquina; um pouco de código Z80 era suficiente para obter um bom desempenho, mesmo no modo SLOW.

O BASIC possui três instruções para interagir com código de máquina: PEEK, POKE e USR. A primeira possibilitava ler o conteúdo de qualquer posição de memória; a segunda permitia alterar este conteúdo; a terceira chamava uma rotina em linguagem de máquina.

Os princípios da programação em linguagem de máquina eram divulgados nas revistas e livros (mais detalhes na próxima parte). Uma vantagem que possuía era a experiência em programação com o 8080, tanto na escola como no trabalho. Conhecendo o processador Z80, alguns detalhes básicos da organização da memória do ZX81 e o endereço de algumas rotinas do seu firmware, você estava pronto para sair programando... no papel.

Escrito um programa em linguagem assembly, era preciso convertê-lo no código de máquina. Embora eu eventualmente tenha conseguido obter um Assembler que executava no próprio TK82C, no início eu me valia do MACRO-80 rodando em um dos micros CP/M-80 do trabalho.

Uma pergunta importante que não deve ter vindo a você é onde o código de máquina era colocado? Os comandos SAVE e LOAD salvavam e restauravam em fita K7 programas BASIC, portanto era preciso colocar o código dento de um programa BASIC. O lugar preferido era um comentário (REM), normalmente no início do código (cujo endereço era conhecido).

Surge daí uma convenção que os leitores das revistas especializadas devem lembrar até hoje. Num primeiro passo se digitava uma linha de comentário com um determinado tamanho e um programa simples (o LOADER ou MONITOR) para colocar o código no comentário. Em seguida se apagava o MONITOR (tá pensando que tem memória sobrando?) e se digitava a parte em BASIC do programa. Depois era salvar em fita e rodar, torcendo para não ter digitado algo errado (alguns Monitores mais sofisticados usavam um checksum para detectar erros de digitação).

O exemplo abaixo é um dos meus primeiros programas em assembler para o TK82C (clique para ampliar). Não foi nenhuma ideia muito original - alguém tinha publicado na revista Micro Sistemas um programa simples inspirado no Frogger e eu achei que conseguia fazer algo melhor. O resultado foi devidamente rejeitado pela Micro Sistema, por já ter publicado recentemente um programa semelhante. Avenida II acabou sendo acolhido pela MicroBits, uma revista de circulação mais modesta movida ao espírito hobbista.

3 comentários:

Tiago "PacMan" Peczenyj disse...

Daniel,

Dos micros com Z80 que vc ja teve a oportunidade de usar, qual o que mais te agradou? No Brasil temos uma legião de fãs do MSX (incluindo eu) mas confesso que não cheguei utilizar outros micros.

Daniel Quadros disse...

Tiago,

Na verdade não tive muitos micros com Z80. Eu tive o TK82C, que era um micro muito interessante mas extremamente limitado, e a "placa Z80" para o Apple II, que usava para rodar programas CP/M-80 como o Wordstar. Do Apple II eu fui direto para o PC.

No meu TCC e no primeiro emprego (Scopus) eu trabalhei com o 8080, que é o ancestral do Z80.

Daniel

Anônimo disse...

Que saudades deste tempo, eu comecei com o NEZ-8000 (clone do ZX-81), depois mudei para TK-85, brinquei muito com BASIC e fiz muita coisa em Assembler Z80, não só digitando programas, mas aprendendo a programar o Z80, muitos efeitos de tela, caracteres grandes, etc, era um barato. Cheguei ao extremo da insanidade, ao digitar o Simulador de Voo que foi publicado em código HEXA numa revista nacional. A gurizada de hoje, não imagina o que era na época, a gente não ter informação nenhuma, saiu um simples jogo em BASIC de Adivinhe o Número numa revista, e lá íamos correndo pro micro pra digitar ou adaptar para o TK.