Trabalhando com telas e imprimindo textos

Em meu primeiro artigo, fiz uma pequena introdução sobre as razões por trás da minha decisão de aprender assembly para o MSX, mas o mais importante foi o primeiro programa que analisei do Hello World da MSXPen. Não parece muito, mas existem alguns conceitos apresentados que são muito importantes para observar, então eu gostaria de retornar a eles, tais como:

  1. Definindo constantes para rotinas do BIOS, como CHPUT
  2. As declarações org que definem a posição da memória onde o programa será alocado
  3. Os registradores UMA e HL , capazes respectivamente de endereçar dados de 8 e 16 bits
  4. Comandos como LD, PC, LIGAR, INC e JR
  5. O BD (Define Byte)
  6. E um loop simples

Vou evitar ser muito técnico sobre os comandos, instruções e parâmetros, mas ao mesmo tempo, sempre adicionarei comentários em cada linha do código, mesmo para as ações mais comuns, porque acredito que ler o código e compreender o as ações por meio das explicações apresentadas nos comentários podem ser mais envolventes do que listar todos os comandos e tentar explicar o que cada um faz.

O programa Hello World, extendido

Depois de aprender a ler o programa Hello World, decido alterá-lo e imprimir a mensagem na Screen 0 e na Screen 1, que o Livro Vermelho MSX descreve como modos de texto 40 × 24 e 32 × 24 devido ao número de colunas e linhas que cada modo pode apresentar.

Há um detalhe muito interessante sobre o processador de vídeo TMS9918 usado pela primeira geração MSX: a resolução usada pelo processador é de 256 pixels por linha e 192 linhas de pixels em qualquer modo de tela, mas uma vez que o modo Screen0 / 40 × 24 usa caracteres com 6 pixels de largura e 8 pixels de altura, ele só pode usar 240 pixels por linha (40 x 6 = 240 pixels). Por outro lado, os caracteres do modo de texto Screen1 / 32 × 34 têm tamanho de 8 × 8, portanto, usa a resolução de linha de 256 pixels total para mostrar 32 caracteres de 8 pixels de largura. Tela 2 / Modo Gráfico é o mais usado e permite endereçar cada um dos 256 × 192 pixels em blocos de 8 × 8, mas só pode aplicar duas cores por linha de bloco, e finalmente Tela 3 / Modo Multi-Cor permite colorir cada “pixel”, mas esse tamanho de pixel é na verdade um bloco correspondente de 4 × 4 pixels normais.

Mas não vamos nos estender muito sobre esses detalhes técnicos e voltar ao novo programa Hello World:

; chamada de bios para imprimir um caractere na tela CHPUT: equ 0x00a2 ; Rotina da BIOS que envia para a tela o conteúdo apontado pelo registrador A CHGMOD: equ 0x005f ; Rotina do BIOS que altera o modo da tela para o valor definido por A CHGET: equ 0x009F ; Rotina do BIOS que espera que uma tecla seja pressionada ERAFNK: equ 0x00CC ; Rotina do BIOS que define as teclas de função como DSPFNK oculto: equ 0x00CF ; Rotina do BIOS que define as teclas de função conforme mostrado FNKSB: equ 0x00C9 ; Rotina de BIOS que altera as teclas de função entre org oculta e exibida 0xD000 ; endereço de memória de origem início: chamar ERAFNK ; chama a rotina que oculta as teclas de função call FNKSB ; chama a rotina que muda o modo de tecla de função ld a,0 ; carrega o valor 0 em A para ser usado pela chamada CHGMOD call CHGMOD ; chama a rotina para alterar o modo de tela ld hl, message1 ; Carrega no HL a posição inicial da variável message1 call mainLoop ; chama mainLoop para imprimir a mensagem armazenada em message1 call CHGET ; espera que uma tecla seja pressionada ld a,1 ; carrega o valor 1 em A para ser usado pela chamada CHMOD chamada CHGMOD ; chama a rotina para mudar o modo de tela ld hl,message2 ; Carrega no HL a posição inicial da variável message2 call mainLoop ; chama mainLoop para imprimir a mensagem armazenada em message1 call CHGET ; espera que uma tecla seja pressionada chama DSPFNK ; chama a rotina que mostra as teclas de função call FNKSB ; chama a rotina que alterna o modo de tecla de função mainLoop: ld a, (hl) ; carrega em A o conteúdo apontado por HL cp 0 ; compara A com 0, levantando o sinalizador Z se true ret z ; se o sinalizador Z foi definido por cp, retorna para a posição onde a rotina foi chamada call CHPUT ; imprime o conteúdo de A na tela inc hl ; avança uma posição de HL (próximo caractere) jr mainLoop ; repete o loop message1: db "Hello world in screen 0!",0 ; mensagem a ser impressa na tela 0 message2: db "Hello world in screen 1!",0 ; mensagem a ser impressa na tela 1 end start

Nos temos agora algumas novas rotinas da BIOS como CHGET que aguarda uma tecla ser pressionada para pausarmos o programa e ver a primeira mensagem impressa, o trio ERAFNK, DSPFNK e FNKSB que oculta ou mostra as teclas de função na parte inferior da tela e o CHMOD que é chamado para alterar o modo de tela definido pelo valor carregado no UMA registro. Todos os valores e detalhes das rotinas podem ser encontrados no grauw.nl site com este formato:

Endereço CHGMOD : #005F Função : Muda para um determinado modo de tela Entrada : A - Modo de tela Registros: Todos

Perceba que quando a rotina CHGMOD é chamada todos os registradores têm seus dados alterados, então é importante evitar carregar valores em outros registradores antes de realizar a chamada ou lembrar de executar EMPURRE dos dados do registrador para a pilha e depois POP novamente de volta após a chamada. Eu vou falar mais sobre isso nos próximos artigos.

Além das mudanças no modo de tela, não há muitas diferenças em relação ao programa Hello World original e eu apenas dupliquei as linhas para executar as mesmas ações em ambos os modos de tela. Você pode copiar e colar o programa no site da MSXPen, ou apenas abrir desse link para ver o resultado.

Chato chato, bora fazer algo diferente?

No próximo artigo, faremos algo mais interessante, como mudar o design dos personagens e imprimi-lo na tela em diferentes posições. Vejo você lá!

No meu primeiro artigo, fiz uma pequena introdução sobre os motivos da minha decisão de aprender assembly para MSX, mas o mais importante foi o primeiro programa que analisei do Hello World do MSXPen. Não parece muito, mas há alguns conceitos apresentados que são muito importantes de serem observados, então eu gostaria…

2 Comentários

  1. Boa tarde. Excelente série de artigos. Estou procurando a entender. fornecer uma pergunta de iniciativa, mas poderia trazer maiores detalhes sobre o funcionamento das 'Chaves de Função'? Para que elas servem? Ou mesmo me indicar um site/livro/ebook que aborde esses conceitos. Obrigado.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

pt_BRPortuguês do Brasil