segunda-feira, janeiro 31, 2022

Tutorial Linguagem Assembly para MSX: Introdução

Motivação

Inicio aqui um tutorial sobre programação assembly para o MSX. Existem vários tutoriais, feitos no brasil, na espanha, holanda, etc.. Muito bons por sinal, porém a grande parte deles foi até uma leve introdução e em seguida foram descontinuados. Existem também bons livros de assembly para MSX, não? Não... Infelizmente as chamadas "bíblias do assembly msx" nacionais são muito confusas, não se dedicam há um projeto, simplesmente despejam dezenas de instruções sem mostrar de fato algo útil a ser feito com elas.

Artigo Original: Wilson Pilon

Eu mesmo estou digitando alguns livros em assembly de MSX no projeto MSX Typer, eles são válidos como referência e consultas, mas não creio que realmente ensinem algo mais profundo. Os livros não tratam segmentação de memória, acesso a disco, MSX 2, MSX-DOS além de outras coisas. Pretendo então criar aqui um tutorial como eu gostaria de ter na época. Este tutorial é totalmente baseado (praticamente cópia ou plágio se preferir) num dos livros primordiais para programação Assembly para IBM-PC: 

Peter Norton's Assembly Language Book for the IBM-PC - Brady Books, 1986 - Norton e John Socha

O livro, obviamente, é voltado para o 8088 e para o MS-DOS, o que vou fazer é usá-lo apenas como base, ajustando o que for aproveitado para Z80, MSX e MSX-DOS, e incluindo seções novas específicas do MSX ou substituindo porções que não fariam sentido para o MSX.

Não pretendo fazer uma obra definitiva ou melhor do que já existe, mas pretendo completá-la, mesmo que demore algum tempo. Atualmente, devido aos meus problemas de saúde, devo tentar aproveitar um pouco do tempo livre para me focar em coisas bem diferentes, e a programação assembly é um hobby que tem me ajudado muito.

Introdução

Quando você completar este tutorial, espero que consiga escrever programas completos em linguagem assembly. No meio do caminho, você também vai aprender algumas técnicas usadas para tornar seu trabalho mais simples. Estas técnicas, incluindo projeto modular e refinamentos sucessivos, em particular, alivia muito o trabalho de escrita em programas complexos. Se você já teve esse sentimento de "por onde eu começo", então verá que o refinamento sucessivo pode dar um modo simples e natural de se escreve programas. E também é divertido!

No entanto, este tutorial não é só teoria. Nós montaremos um programa também. O programa é chamado DskPatch (de Disk Patch), e ele será útil a você por diversas razões. Primeiro de tudo, você verá o refinamento sucessivo e o projeto modular em um programa real, de modo que terá uma oportunidade de observar por que essas técnicas são tão úteis. Além disso, como você verá logo em seguida, DskPatch é, por direito próprio, um editor de tela completa para uso geral em setores de disco - um programa que você poderá usar, em todo ou parte, muito após o término do tutorial.

Por que Linguagem Assembly?

Irei assumir que você está lendo este tutorial porque deseja aprender linguagem assembly. Mas você pode não estar bem certo do motivo para aprendê-la.

Uma razão, talvez a menos óbvia, é que os programas em linguagem assembly sejam o coração de qualquer MSX. Em relação a todas as outras linguagens de programação, a linguagem assembly é o denominador comum entre elas. Ela leva você mais perto da máquina do que as linguagens de alto nível, de modo que o aprendizado da linguagem de máquina também significa aprender a entender o microprocessador Z-80 dentro do seu computador. Ensinar-lhe-ei as instruções do microprocessador Z80, como um tutorial de introdução, mas irei bem mais adiante e também veremos certo material avançado que será de inestimável valor quando você começar a escrever seus próprios programas.

Uma vez você entendendo o microprocessador Z80 dentro do seu MSX, muitos elementos que você verá em outros programas e em linguagens de alto nível terão maior significado. Por exemplo, você pode ter notado que o maior inteiro permitido no BASIC é 32767. De onde vem este número? Este é um número estranho para um limite máximo. Mas, como você verá adiante, o número 32767 é diretamente relacionado ao modo com que o Z80 armazena os números.

Depois, você também pode estar interessado em velocidade e tamanho. Via de regra, os programas em linguagem assembly são muito mais rápidos do que os escritos em qualquer outra linguagem. Programas típicos em linguagem assembly são duas ou três vezes mais rápidos do que os programas equivalentes em C ou Pascal, e geralmente ultrapassam os programas em BASIC interpretado em 15 vezes ou mais. Os programas em linguagem assembly também são menores. O programa DskPatch que montaremos neste tutorial ocupa certa de um kbyte. Comparando com os programas em geral, isto é muito pouco. Um programa semelhante escrito em C ou Pascal ocuparia cerca de dez vezes mais espaço. Por estas razões, entre outras, muitos programas ou ferramentas profissionais são desenvolvidos inteiramente em assembly.

Os programas em linguagem assembly também possibilitam um total acesso a todas as características do seu computador. Uma série de programas permanecem na memória após a sua execução. Tais programas mudam o modo de trabalho da máquina, e usam características do sistema disponíveis sometne para programas em linguagem assembly.

Parte Prática

DskPatch

Em nosso trabalho com a linguagem assembly, veremos diretamente os setores de disco, apresentando caracteres e números armazenados lá pelo DOS em notação hexadecimal. DskPatch é um editor de tela completa para discos, e nos permitirá alterar caracteres e números em um setor do disco. Usando DskPatch você poderá, por exemplo, ver os setores onde o DOS armazena o diretório de um disco e alterar os nomes dos arquivos ou outras informações. Esse é um bom modo de se aprender como o DOS armazena informações no disco.

Com DskPatch, no entanto, você ganhará mais do que um programa. Ele contém cerca de 50 sub-rotinas. Muitas delas são sub-rotinas de uso geral que você poderá utilizar para incluir em seus próprios programas. Assim, este tutorial não somente é uma introdução ao Z80 e à programação em linguagem assembly, mas também uma fonte de sub-rotinas úteis.

Além disso, um editor de tela completa precisa usar características específicas à família MSX de computadores. Através dos exemplos neste tutorial, você também aprenderá a escrever programas úteis para MSX.

Requisitos de Equipamento

Que equipamento você precisará para rodar os exemplos deste tutorial? Precisará de um MSX 2.0 ou superior, com pelo menos 64k de memória mapeada (veremos também a memória expandida). Recomendo a versão 2 do MSX-DOS, porém a 1 já basta para a maior parte das tarefas, e pelo menos uma unidade de disco. Precisará de um debugador, de preferência o Super-X, mas o Mega Assembler também servirá. E, a partir da Parte II, precisará do Macro Assembler da Microsoft (m80/l80) ou do Compass.

Organização deste Tutorial

Este tutorial está dividido em três partes, cada qual com uma ênfase diferente. Sabendo ou não alguma coisa sobre microprocessadores ou linguagem assembly, você verá diversas seções de interesse.

A parte 1 focaliza o microprocessador Z80. Aqui, você aprenderá os mistérios dos bits, bytes e linguagem de máquina. Cada um dos seus capítulos contém uma riqueza enorme de exemplos reais que utilizam um debuger, que pode ser baixado nos endereços indicados na parte prática. O debugador permitirá que você veja dentro do famoso microprocessdor Z80 embutido dentro do seu MSX enquanto está trabalhando sob o mesmo. A parte 1 assume somente que você possui um conhecimento elementar de BASIC e sabr como trabalhar com seu computador.

A parte 2, pasa para a linguagem assembly e como escrever programas no assembler. O método é progressivo, e ao invés de cobrir todos os detalhes da linguagem assembly em si, irei me concentrar num grupo de comandos assembler que precisamos saber para escrever programas úteis.

Usaremos o assembler para reescrever alguns dos programas da Parte 1, e depois partiremos para a criação do DskPatch. Montaremos este programa lentamente, para que você aprenda a utilizar o método de refinamentos sucessivos para criar grandes programas. Também veremos técnicas como o projeto modular, que ajudam a escrever programas limpos. Como disse, estas técnicas simplificam a programação removendo algumas das complexidades normalmente associadas à escrita de programas em linguagem assembly.

Na parte 3, irei me deter no uso de características mais avançadas encontradas nos MSX. Estas características incluem o movimento do cursor e o apagamento da tela.

Na parte 3 também veremos as técnicas para depurar programas maiores em linguagem assembly. Os programas em linguagem assembly crescem muito rapidamente e podem facilmente ter 100 ou 200 linhas sem fazerem muita coisa (DskPatch será maior). Embora esteja usando essas técnicas de depuração em programas maiores do que algumas dezenas de linhas, você verá que elas também são úteis com programas pequenos.

Dito isso, sem mais demora, vamos passar para o Z80 e ver como ele armazena números.

Downloads

Aqui disponibilizo todos os downloads necessários para o tutorial. No texto você encontra links para o Super-X e para o Mega Assembler e Compass (sem download), o tutorial de Macro Assembler será desenvolvido no meio deste projeto, então no momento não tem link para ele, porém aqui você pode baixar o disco e a documentação em PDF e em TXT.

  • msxasmtt.dsk: Disco com as ferramentas úteis para o projeto, contendo o M80/L80, Super-X, Mega Assembler, editores, etc..
  • msxtut.dsk: Disco contendo os arquivos necessários para o DSKPATCH, os compiladores e o make para MSX-DOS1.
  • dskpatch.zip: Arquivo contendo a versão corrente dos fontes do DSKPATCH.
  • masm-80.zip: Arquivos que fazem parte da suite de programação do Macro Assembler.
  • m80l80.txt: Documentação em formato TXT do M80 e do L80.
  • m80doc.zip: Documentação completa em PDF da suite Macro Assembler.
  • msxdos22.zip: Disco contendo o MSX-DOS 2.2.
  • make.zip: Arquivo contendo as versões de MAKE para MSX-DOS 1 e MSX-DOS 2.
  • msxedit.dsk: Disco contendo alguns editores adicionais para MSX.
  • msxdocs.zip: Documentações diversas sobre o MSX e sobre o Z80, como listagem da BIOS, o MSX Handbook, manual do MSX-DOS 2, dentre outros.

Nenhum comentário:

Postar um comentário