RSC II
Escrevendo Nomes


Você está em: MarMSX >> Cursos >> Assembly Z80 >> RSC II   No próximo exemplo, vamos usar a mesma sub-rotina da ROM WRTVRM para escrever um nome na tela.
  Além disso, vamos aproveitar para ver uma ferramenta bastante útil na depuração de um programa em Assembly: o simulador do RSCII.

  Digite o programa a seguir (ou da figura lado).

Linha Código Comentário
10 ORG &HC000 Endereço inicial onde o programa será colocado na memória.
20 WRTVRM: EQU &H4D Define a etiqueta WRTVRM. Assim, WRTVRM equivale ao valor &H4D.
30 LD HL,0 Atribui valor 0 ao registrador HL.
40 LD BC,NOME Passa para o registrador BC a posição inicial da primeira letra do nome.
50 LOOP: LD A,(BC) Passa como parâmetro para A a letra atual.
60 CALL WRTVRM Chama sub-rotina da BIOS que escreve letra na tela.
Linha Código Comentário
70 INC HL Incrementa HL (posição na tela).
80 INC BC Incrementa BC (posição no nome).
90 OR 0 Faz operação lógica com A (contém o código ASCII da letra atual), para setar os flags.
100 JP NZ,LOOP Quando o caractere ASCII for 0, encerra o programa, senão desvia para etiqueta LOOP.
110 RET Devolve o controle ao programa de onde foi chamado.
120 DEFM "Marcelo" Pseudo-código para definir a string com o nome "Marcelo".
130 DEFB 0 Pseudo-código para definir um byte na memória. Este byte sinaliza o fim da string.
  Obs: foram utilizadas algumas macros do RSC II para introduzir o nome na memória logo após o programa.

  Macros:
  • DEFM - define uma cadeia com tantos caracteres alfanuméricos (entre aspas) enquanto couber em uma linha.
  • DEFB - define desde 1 até n valores (tantos quantos couberem em uma linha) de um byte, que serão colocados a partir do endereço que marca o contador no momento de passagem por esta linha, durante a montagem (assemble) do programa.
  • DEFW - idem DEFB, só que para dois bytes em vez de um.
  Divisão do código e string na memória:
 Código:
 C000  		   10 		ORG  &HC000
 004D  		   20 WRTVRM:	EQU  &H4D
 C000  210000	   30 		LD   HL,0
 C003  0112C0	   40 		LD   BC,NOME
 C006  0A	   50 LOOP:	LD   A,(BC)
 C007  CD4D00	   60 		CALL WRTVRM
 C00A  23	   70 		INC  HL
 C00B  03	   80 		INC  BC
 C00C  F600	   90 		OR   0
 C00E  C206C0	  100 		JP   NZ,LOOP
 C011  C9	  110 		RET

 String:
 C012  4D617263	  120 NOME:	DEFM "Marcelo"
 C019  00	  130 		DEFB 0
  Após assemblar o programa (EN), vamos ao BASIC para rodá-lo. Digite:
  DEFUSR=&HC000:X=USR(0)
  O programa também poderá ser executado dentro do simulador RSCII através do comando PR <end>.
  No caso desse programa, seria:
 PR &HC000
  Porem, após executar um programa, o RSCII sempre limpa a tela. Assim, não seria possível visualizar o nome escrito ali, pois ele seria imediatamente apagado.
  O programa na figura ao lado é uma variação do programa anterior, no qual escreve o nome na tela 50 vezes (registrador D determina o número de repetições).
 Depurando com o simulador do RSCII.

  O Assembly é uma linguagem difícil de ser programada, e necessita de um bom depurador para acompanhar o desempenho do programa.
  O RSCII fornece uma excelente ferramenta de depuração, que é o simulador. O simulador é chamado através do comando SI, seguido do endereço inicial do programa.
  No caso do nosso programa, teremos que digitar:
 SI &HC000
  Em seguida, escolha a opção H (hexadecimal).
  Observando a figura ao lado, o simulador mostra:
  • A instrução atual (próxima instrução, ainda não executada).
  • O conteúdo do registradores AF, BC, DE, HL, IX, IY e também do AF', BC', DE' e HL' (segunda linha).
  • Os flags "SZ H PNC".
  • O conteúdo do registradores IR, PC e SP.
  • A configuração de slots.
  • Área de memória (ao centro).
  • Conteúdo da pilha (à direita).
  Área de memória.

  Para os registradores A (em cima) e A' (embaixo), destacados em amarelo, aparece o caractere correspondente ao código ASCII do valor de cada registrador. Na imagem ao lado, o caractere correspondente ao código ASCII &H4D ou 77 é a letra "M".

  Para os pares de registradores BC, DE, HL, IX e IY, cada coluna representa uma área de memória apontada pelo par correspondente. As colunas estão destacadas em verde.

  A pilha, destacada em azul claro, contém o dez últimos dados depositados na pilha (SP). Exemplo de funcionamento:
 Inicio   Empilha valor 1234   Empilha valor ABCD
 0000            1234                ABCD
 0000            0000                1234
 0000            0000                0000
 ...             ...                 ...
  Você poderá executar o programa passo a passo e verificar as mudanças que acontecem nos registradores e na memória. Assim, poderá verificar se cada instrução usada está funcionando de acordo com o desejado.

  Principais comandos do simulador do RSCII:
  • E - Executa a próxima instrução (visualizada na última linha do simulador). Após a execução, os registradores poderão ser modificados por essa instrução. O manual do RSCII recomenda para que se tome cuidado com instruções do tipo OUT. Evite chamar sub-rotinas da BIOS (ROM), pois elas geralmente contém instruções desse tipo.
  • S - Salta a instrução (não executa). Assim, nada é afetado.
  • C - Altera o conteúdo de memória de um ou mais bytes, a partir de uma posição. Ex: Após os dois pontos, digite: &HD000 &HCD,&HC3. Isto irá alterar o conteúdo de memória das posições &HD000 e &HD001 para &HCD e &HC3, respectivamente.
  • L - Roda o programa todo de uma vez.
  Principais comandos do simulador do RSCII (continuação):
  • B - Troca o banco de SLOTS.
  • I - Introduz um ponto de interrupção para execução automática. Colocar o endereço de memória após os dois pontos ":".
  • R - Chama rotina em outro SLOT.
  • M - Edita os registradores. Começa na primeira linha. Tecle enter para confirmar mudança e vá para a segunda linha. Tecle enter para finalizar.
  • O - Edita registradores PC e SP. Após o ":", use as expressões PC=valor ou SP=valor.
  Obs: Consulte o manual para maiores detalhes sobre esses comandos.

  No próximo capítulo, será apresentado o passo a passo de um programa em LM no simulador.

  Para sair do simulador, tecle CONTROL + STOP.
  O comando VM (visualizar memória) do RSCII permite apresentar um determinado conteúdo de memória. A sintaxe é:
 VM <end_inicial>-<end_final>
  O comando apresentado na figura ao lado, permite visualizar tanto o programa, como a string na memória.
  O conteúdo apresentado está configurado da seguinte maneira:
 Endereço | Valor em hexa | Código ASCII
  Obs: Para cada linha, temos 8 posições de memória.

  Para o nosso programa exemplo, o comando é:
 VM &HC000-&HC019


<< Anterior RSC II Próxima >>