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:
- Definindo constantes para rotinas do BIOS, como
CHPUT
- As declarações org que definem a posição da memória onde o programa será alocado
- Os registradores
UMA
eHL
, capazes respectivamente de endereçar dados de 8 e 16 bits - Comandos como
LD
,PC
,LIGAR
,INC
eJR
- O
BD
(Define Byte) - 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á!
Relacionado
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…
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.
As teclas de funções (teclas de função) são teclas10 para as teclas F1-F do MSX. Você encontra mais informações sobre as teclas de funções na página https://www.msx.org/wiki/KEY