Projeto MicroBug

Sistema Gerenciador de Módulos

COORD. RENATO DEGIOVANI - BRASIL - 1984
(C) ATI-EDITORA - "REVISTA MICRO SISTEMAS"

(Texto traduzido do original de Einar Saukas, contido no pacote  tkpak001.zip)

INTRODUÇÃO

O "MICRO BUG" é um utilitário de desenvolvimento completo para micros compatíveis com o  ZX81 (TK82C, TK83, TK85, CP200, AS1000, etc). Ele é chamado de "SGM" ("Sistema Gerenciador de Modulos") porque implementa apenas um conjunto básico de comandos (para edição de memória e desenvolvimento de programas) mas suas funcionalidades podem ser facilimente extendidas pela implementação de Módulos Operacionais (MO) externos.

Este projeto foi produzido pelo time de desenvolvimento da revista "Micro Sistemas" (coordenados por Renato Degiovani) e publicado da revistanas edições de abril a dezenbro de 1984. Ele tem uma grande importação histórica para os usuários brasileiros por duas razões principais:

1. A revista publicou os fontes completos do código assembler do sistema, incluindo comentários detalhados e explanações sobre sua estrutura interna e implementação, durante 9 meses (cerca de 4 páginas por mês). Por ser a mais importante revista de computadores no Brasil, isso motivou um grande número de usuários de "ZX81" a aprender programação assembler Z80, melhorando a quantidade e qualidade de programadores brasileiros.

2. A flexibilidade do sistema proveu uma base comum para a implementação de utilitários assembler resultando nos anos seguintes em vários (bons) módulos operacionais produzidos pelos leitores da revista:: DISASSEMBLER, ED-ART, TRACE, RENUMERGE, etc.

CARREGANDO O MO

Após carregar o MICRO BUG da fita, o SGM será instalado na memória, a tela de apresentação será mostrada e será aguardado que se pressione uma tecla. O sistema irá executar um NEW para arrumar o RAMTOP e , então, estará pronto para uso. Para entrar no MICRO BUG, execute:

RAND USR 31210

Os comandos  "A" a "P" são implementados pelo sistema SGM que é instalado nos últimos 2K da RAM (endereços de #783D a #7FFF). Os comandos "Q" e "R" não estão disponíveis. Os comandos "S" a "Z" estão disponíveis para serem implementados através de um MO que pode ser carregado em uma área de reservada de memória de 2.5K (endereços de #6E00 a #77FF para o módulo operacioal, endereços de #7800 a #783C para informações de "interface").

COMANDOS


"A $=D" ou "A $=H" - Atribui a base numérica


O MICRO BUG interpreta números como valores Hexadecimais por default, todos os valores Decimais devem ser precedidos por '$'. O comando A pode ser usado para atribuir o '$' para a base Hexadecimal (então números serão interpretados como Decimais por default) e vice-versa. Mensagem de erro "$=D OU $=H" se a sintaxe estiver incorreta.


"B" - Retorna ao BASIC


Retorna ao BASIC. Execute "RAND USR 31210" para reiniciar o MICRO BUG.


"C" - Carrega um módulo operacional


Carrega um módulo operacional. Se já há um outro módulo na memória, ele é sobreposto pelo novo. Esta operação não afeta os programas em BASIC.


"D [endereço]" - Mostra o conteúdo da memória


Exibe um bloco de memória: endereço e os 8 bytes consecutivos. Teclas de Controle:

"K" (+) : avança                                         SHIFT-S : velocidade de impressão
"J" (-) : retrocede                                       SHIFT-E : formato do endereço (hex/dec)
SPACE : interrompe                                  SHIFT-4 : formato do byte (hex/token)


"E linha,tamanho[,c]" - Criar linha REM


Cria uma linha REM (contendo "tamanho" cópias do caracter "c") para armazenar rotinas em assembler no programa BASIC. Por exemplo: "E 1,4,*" criará a linha "1 REM ****". O valor default para o parâmetro "c" é ESPAÇO. Mensagem de Erro "LINHA ILEGAL" se "linha" > 9999, erro "LINHA EXISTENTE" se a linha já existe. 


"F início,fim,c" - Preenche um bloco de memória com um caracter


Preenche um bloco de memória do endereço "início" até "fim" com o caracter "c".


"G início" - Executa rotinas em linguagem de máquina


Insere um breakpoint se ele está implementado (veja os comandos "K" e "L"), carrega os registradores com os valores do buffer de registradores (veja os comandos "H" e "N"), chama a rotina no endereço "início", armazena os registradores no buffer de registradores, remove o breakpoint. Este comando é útil no debug de rotinas.


"H" - Imprime registradores


Imprime os valores armazenados no buffer de registradores. Os valores são atualizados automaticamente após o uso do comando "G" ou manualmente com o uso do comando "N".


"I início,fim" - Armazena um bloco em fita


Armazena em fita o conteúdo de memória entre os endereços "início" e "fim". Use SHIFT-F para selecionar a velocidade de gravação (normal=300 bps, alta=1600 bps), SPACE para interromper a gravação.


"J início,fim" - Carrega um bloco da fita


Carrega um bloco da fita para a memória entre os endereços "início" e "fim". Use SHIFT-F para selecionar a velocidade de carregamento (normal=300 bps, alta=1600 bps), SPACE para interromper a carga.


"K [endereço]" - Implementa um BREAKPOINT


Especifica um endereço para a inserção de um breakpoint. O comando "G" irá inserir um breakpoint (substituindo 3 bytes consecutivos do endereço especificado) antes de chamar a rotina externa. Quando a rotina atinge este endereço ela é interrompida e retorna imediatamente ao MICRO BUG. O breakpoint é removido automaticamente após a execução do comando "G" ou manualmente com o comando "L". Para reimplementar o breakpoint no mesmo endereço, o comando "K" pode ser chamado novamente sem um parâmetro.


"L" - Remove o BREAKPOINT


Cancela o breakpoint implementado pelo comando "K".


"M [endereço]" - Edita a memória


Mostra e edita o conteúdo da memória. Semelhante ao comando "D", mas mostra apenas um byte por linha. O conteúdo da memória pode ser mudado simplesmente digitando um novo valor em Hexadecimal. Teclas de controle adicionais são SHIFT-3 para o formato do byte (hex/dec) e SHIFT-D para o formato do valor digitado (hex/dec). Para valores decimais é necessário pressionar NEWLINE após digitar cada número.


"N r,valor" - Altera os valores dos pares de registros


Atribui ao par de registro "r" o valor "valor" no buffer de registro. Pode ser usado no debug de rotinas assembler (veja o comando "G"). A sintaxe completa é:

"N B,valor" : atribui valor ao par BC.                    "N D,valor" : atribui valor ao par DE.
"N H,valor" : atribui valor ao par HL.                    "N A,valor" : atribui valor ao par AF.
"N N,valor" : atribui valor ao par pairs.


"O início,fim,destino" - Copia blocos de memória


Copia o bloco fonte (área de memória entre os endereços "início" e "fim") para o endereço "destino". Os blocos fonte e de destino podem se sobrepor. Mensagem de erro "BLOCO ILEGAL" se "início" > "fim".


"P início,fim" - Soma do bloco


Imprime a soma de todos os bytes do bloco de memória. O resultado é dado em Hexadecimal. É útil como um método simples de checagem de dados.

Notes:
- No caso de comandos que requerem a especificação de uma área de memória (como "início,fim"), o último byte (no endereço "fim") não é considerado.
- Os símbolos "[" e "]" indicam um parâmetro opcional. Se o parâmetro for omitido, o comando continua do ponto de execução prévio.

TECLAS DE CONTROLE

Os modos de entrada e saída dos comandos são controlados pela variável MFLAG, armazenada no endereço $7926. Esta é a lista completa de teclas de controle:

TECLA DESCRIÇÃO BIT DE CONTROLE
SHIFT-3 Formato de saída de "M" (hex/dec)

Bit 0 of MFLAG

SHIFT-4 Formato de saída de "D" (hex/token)

Bit 1 of MFLAG

SHIFT-E Formato de endereço (hex/dec)

Bit 2 of MFLAG

SHIFT-S Velocidade de impressão (slow/fast)

Bit 3 of MFLAG

SHIFT-G Disponível

Bit 4 of MFLAG

SHIFT-A Disponível

Bit 5 of MFLAG

SHIFT-D Formato de entrada de "M" (hex/dec)

Bit 6 of MFLAG

SHIFT-F Velocidade de gravação (slow/fast)

Bit 7 of MFLAG

SHIFT-9 Modo gráfico -----
SHIFT-Q Apaga a tela -----
SHIFT-1 Reinicia -----
SHIFT-T Copia tela na impressora -----

NOTAS TÉCNICAS

Para gravar o MICRO BUG em fita, é necessário fazer o seguinte:

>BASIC 
NEW
RAND USR 31210
>E 6,0802,*
>O 7800,7FFF,4082
>E 1,1A,*
>BASIC
2 RAND USR 31210
3 FAST
4 SAVE "MICRO BUG"
5 RAND USR 16514
RUN
>M 4082 (digite este bloco:)
31 EC 6D 21 00 6E 22 04
40 21 DD 40 11 00 78 01
00 08 ED B0 CD 29 02 C3
C3 03
(reset com SHIFT-1)
(inicie a gravação em fita)
>BASIC

O comando "J" pode ser usado para copiar programas protegidos:

 1. Remova a área reservada para os MO: "POKE 16389,120" and "NEW"
 2. Preencha a memória com um valor conhecido: ">F 4400,7700,*"
 3. Carregue o programa (em velocidade normal): ">J 4410,7700"
 4. Após a carga do programa, pressione BREAK e use o comando "D" para achar o endereço final do programa (primeiro endereço de memória somente com asteriscos).
 5. Salve o programa: ">I 4410,end"

DEFININDO UM MÓDULO OPERACIONAL

Um módulo operacional pode definir os comandos de "S" a "Z" e pode chamar qualquer rotina do MICROBUG como uma subrotina. O tamanho do módulo pode ser de até 2.5K (ocupando os endereços de #6E00 até #77FF) e o nome do módulo pode ter até 15 caracteres.

Após o código do módulo ser implementado, ele deve ser integrado ao  MICRO BUG. O endereço inicial de cada módulo deve ser definido na Tabela de Comandos do módulo (endereços de #7800 a #780F), o endereço inicial #7A34 deve ser usada para comandos indefinidos. A rotina $MORG deve ser configurada, definindo o nome do módulo entre os endereços  #7819 e #7827. A soma obtida executando "P 6E00,783A" deve ser armazenada nos endereços #783A e #783B, ela será usada para checar se o módulo operacional foi carregado corretamente. Finalmente, o módulo operacional deve ser salvo usando o comando "I 6E00,783C", em velocidade normal.

O comando "C" pode agora ser usado para carregar o módulo operacional. Este comando automaticamente executa um "J 6E00,783C" em velocidade normal, checa  a soma do módulo e copia a Tabela de Comandos do módulo para a Tabela de Definição de Comandos. Agora os novos comandos definidos pelo módulo podem ser usados normalmente e SHIFT-1 irá apresentar o nome do módulo junto com o logo do MICRO BUG. 

USANDO O MICROBUG COM EMULADORES

Com o emulador EightyOne, é possível carregar diretamente um módulo operacional com o comando  "C", do mesmo modo que no micro real, desde que se tenha o MO gravado na forma de um arquivo wav. O método é muito simples: abra o 'Wav Manager' e carregue o arquivo wav do módulo. Pressione o comando "C"' no Microbug, selecione 'Play' no 'Wav Manager" e espere o MO ser carregado.

Também é possível usar os MO com o emulador Xtender, mas o método é um pouco mais complexo. Leia a documentação completa do pacote TKPAK001.ZIP para os detalhes.


Módulos Operacionais

Aqui estão os Módulos Operacionais desenvolvidos pelos leitores da revista Micro Sistemas, com uma pequena descrição de cada um:


DELETE-GGMI
Autor: Cláudio de Freitas B. Bittencourt  -  Micro Sistemas Nr. 47 (Agosto 1985)

Este MO implementa o comando W, que simula a função DELETE, cuja finalidade é a de apagar blocos de linhas BASIC. Para carregá-lo, utilize o comando C do Microbug. A sintaxe do comando W é a seguinte: 

W xxxx,yyyy

onde xxxx é a primeira linha a ser apagada, e yyyy, a última. O comando será recusado com a informação "LINHA ILEGAL", se yyyy for maior que xxxx ou se a sintaxe não estiver completa. Se a linha xxxx não existir, a linha imediatamente superior será a primeira a ser deletada. Caso a linha yyyy não exista, a linha imediatamente inferior será a última a ser deletada.


DEPURA-ERRO
Autor: Rubens Grazzini Júnior  -  Micro Sistemas Nr. 67 (Abril 1987)

Módulo Operacional do Micro Bug que tinha por finalidade auxiliar na correção de erros na digitação de códigos em assembler publicados em revistas. Ele efetua a soma de 1 a 16 bytes consecutivos, a partir de um endereço especificado pelo usuário. Para utilizar o Depura Erros é necessário carregá-lo com o comando C. A sintaxe do módulo é a seguinte:

S xxxx,yy

sendo xxxx o endereço de memória inicial para a soma dos blocos, e yy o fator de soma que pode ir de 1 a 16. Caso se omita o parâmetro yy, a soma se dará de 8 em 8 bytes.

Para somar os blocos, pressione a tecla K e BREAK ou SHIFT 1 para retornar ao Microbug. Na ocorrência de um erro, pressione SHIFT L e você estará automaticamente no comando M; para retornar, utilize a tecla BREAK e será mostrada a nova soma do bloco alterado.


DEPURADOR FHL
Autores: Luiz Fernandes de Moraes e Fernando José Silva  -  Micro Sistemas Nr. 64 (Janeiro 1987)

Módulo Operacional do Microbug que acrescenta 3 novos comandos (X, Y e Z) e um sub-comando (W), cuja função é tornar ainda mais poderoso o comando M.

COMANDO W: ao digitarmos W recebemos a informação de que o comando M foi incrementado; agora, ao usar o comando M, também será apresentado na tela o caracter ou token correspondente ao byte do endereço apontado. Carregue ou digite um programa BASIC qualquer e depois digite M 4082 para ver o resultado.

COMANDO X: lista as linhas do programa BASIC contido na memória, informando o endereço inicial e o total de bytes de cada uma. A tecla K
avança a tela, até que se chegue ao DFILE.

COMANDO Y: mostra a organização da memória, informando os endereços do DFILE, VARS, ELINE e RAMTOP, quantidade de bytes ocupados pelo programa, pelas variáveis, total de memória ocupada, total de memória disponível e total de bytes acima do RAMTOP (USR).

COMANDO Z: lista as variáveis dando endereço, o total de bytes e identificando se são numéricas , alfanuméricas (strings) ou dimensionadas (o número de bytes gasto com o dimensionamento virá entre parênteses). São mostradas ainda as variáveis de controle de loops, mas sempre no formato: FOR variável = A TO B STEP C. Se a tela encher, pressione a tecla K e outros blocos serão apresentados até que se chegue ao ELINE.


DISASSEMBLER
Autor: Marcos Saito  -  Micro Sistemas Nr. 57 (Junho 1986)

Este Módulo Operacional do Micro Bug  implementa 8 novos comandos. Antes de apresentar os novos comandos, convencionemos:

xxxx - início do primeiro ou único bloco de memória;
yyyy - fim do bloco iniciado por xxxx (o endereço yyyy não pertence ao bloco delimitado);
zzzz - início do segundo bloco de memória;
bb - byte qualquer;
cc - um segundo byte qualquer (na ocorrência deste, bb e cc devem estar em hexadecimal);
eeee - endereço inicial.

Os comandos oferecidos pelo Disassembler são os seguintes:

S xxxx yyyy bbcc - substitui a ocorrência do byte bb por cc, dentro do bloco especificado, imprimindo os endereços onde houve a transformação;
T eeee N/L texto N/L - insere o texto determinado, a partir de eeee;
U xxxx yyyy zzzz - troca, entre si, o conteúdo dos dois blocos de memória;
V xxxx yyyy zzzz - compara o conteúdo dos dois blocos de memória, imprimindo os endereços que discordam;
W xxxx yyyy - zera o bloco de memória especificado;
X xxxx yyyy bb - imprime na tela os endereços do bloco que contenham o byte bb;
Y xxxx yyyy bbcc - pesquisa a ocorrência consecutiva dos bytes bb e cc;
Z eeee - efetua o disassembler a partir do endereço eeee.

OBS.: Nos comandos S, V, X, Y e Z, a tecla BREAK interrompe o processo, enquanto que as outras dão continuidade a ele. O comando Z aceita as operações SHIFT S e SHIFT E para chavearem velocidade de execução e base do endereço apresentado, respectivamente (válido também para os comandos V, X, Y e S). 

O Disassembler utiliza apenas 1536 bytes, ou seja, 1,5 Kb, a partir do endereço 7200h, o que torna possível mudar o RAMTOP, no caso de se necessitar de mais memória para a área do programa em BASIC.


ED-ART
Autor: Cláudio de Freitas B. Bittencourt  -  Micro Sistemas Nr. 54 (Março 1986)

O Ed-Art GGMI é um editor gráfico que se presta à preparação de telas, as quais poderão ser arquivadas em fita independentemente e acopladas a qualquer programa.

ORGANIZAÇÃO DA MEMÓRIA

Um módulo do Micro Bug ocupa a memória do endereço 6E00 até 77FF, mas o Ed-Art é diferente, pois foi necessário aumentar o espaço, baixando o endereço inicial para 6B00 (ou seja, menos 768 bytes). Não se preocupe com essa expansão, pois tudo ocorre automaticamente quando é acionado pela primeira vez qualquer um dos quatro comandos disponíveis no Ed-Art. E o "status quo" anterior é restabelecido ao ser acionado o comando C do Micro Bug, que carrega um novo módulo no lugar do Ed-Art. O único efeito prático é uma diminuição correspondente da memória disponível para os programas BASIC, abaixo do Micro Bug. Mas em 99% dos casos essa pequena quantidade de bytes não fará falta.

Além do arquivo de imagens normal do micro, que aparece na tela da TV, o Ed-Art trabalha com mais dois arquivos, situados em buffers nas seguintes posições da memória:

l°) Principal - de 27392(6B00) a 28159(6DFF)
2°) Reserva - de 28160(6E00) a 28927(70FF)

COMANDO T

O comando T, acessado via Micro Bug, é o editor propriamente dito. Limpe a tela com SHIFT A. O pixel desloca-se nas oito direções cardeais com o uso das teclas abaixo:

TECLA DIREÇÃO TECLA DIREÇÃO
1 esquerda-acima 5 esquerda
2 direita-acima 6 abaixo
3 direita-abaixo 7 acima
4 esquerda-abaixo 8 direita

O pixel pode caminhar nas condições PLOT, UNPLOT e "Sem Rastro", conforme tenham sido acionadas previamente as teclas K, J ou L, as mesmas de +, - e = .


MACROCARACTERES

O pixel é o modo principal de edição, permitindo acesso a todas as funções disponíveis. Podemos imprimir macrocaracteres acionando as teclas N (de <) ou
M(de >). A primeira prepara um caráter grande (4x4) e a segunda um gigante (8x8). Os símbolos "<" e ">" alternam-se com o pixel piscante para indicar a condição assumida. A tecla que você pressionar em seguida será macroimpressa, salvo se for NEW LINE, FUNCTION, RUBOUT ou GRAPHICS, que desativam a preparação. Todos os símbolos do Sinclair são válidos e os de vídeo inverso são preparados por SHIFT N e SHIFT M, em vez de N e M. Se o espaço na tela for insuficiente para o macrocaráter, a tecla de preparação não surtirá efeito. Após a macroimpressão, o pixel estará na condição "Sem Rastro", o que aliás ocorre após qualquer operação extraordinária.

RETA

Use tecla R para preparar uma "reta" e desloque o pixel até o ponto final. No ponto de origem fica um segundo pixel piscante, para sua orientação. Feito isso, use SHIFT R para traçar a reta. NEW LINE é a tecla que desativa a preparação da reta.


CÍRCULO

Coloque o pixel na posição que você pretende que seja o centro do círculo e pressione a tecla C, a letra que vai aparecer irá se alternar com o pixel. O micro ficará então esperando que você tecle dois algarismos relativos ao raio da circunferência, que poderá variar de 02 a 35. O primeiro algarismo é o da dezena e o segundo da unidade. A tecla que desativa a preparação do círculo é NEW LINE.


MANIPULAÇÃO DOS ARQUIVOS

A manipulação dos arquivos é uma das mais versáteis funções do Ed-Art. Ela permite que se faça a interface de duas telas, portanto deve ser usada quando se
pretender dar continuidade horizontal ou vertical às mesmas. As teclas de acionamento são P (de Principal), H (de Horizontal) e V (de Vertical). A tecla P apresenta na tela o conteúdo do buffer principal (o primeiro na memória). Só que, a cada vez que ela é acionada, esse conteúdo é antes trocado com o que está no buffer reserva (o segundo na memória). As teclas H e V provocam na tela o rolamento da imagem para a esquerda e para cima, respectivamente, possibilitando o interfaceamento das duas pelos quatro lados. É semelhante a um SCROLL, só que em vez de rolar linha por linha (coluna por coluna), o rolamento se dá de metade em metade da tela.

As teclas H e V podem ou não trocar o conteúdo dos buffers, dependendo da situação. O conteúdo que ocupar o quadrante superior esquerdo da tela será sempre do buffer principal. Contudo, não convém facilitar: antes de efetuar qualquer operação que possa comprometer a integridade do seu trabalho (ex: CLS, SAVE e LOAD de arquivos), estabeleça o conteúdo correto do buffer principal mediante o acionamento da tecla P - ela existe para isso.


OUTRAS FUNÇÕES DO MODO PIXEL

No modo pixel estão disponíveis ainda as funções abaixo, apresentadas na sequência "tecla-mnemônico-efeito".

9 GRAPHICS efetua inversão de vídeo
SHIFT S LPRINT remete imagem da tela para a impressora
SHIFT A NEW efetua CLS
SHIFT NEWLINE FUNCTION retorna ao Microbug
SHIFT Y RETURN retorna direto ao BASIC
NEWLINE - muda para modo ESCRITA HORIZONTAL

MODO ESCRITA

O modo escrita, que pode ser horizontal ou vertical, permite imprimir todos os símbolos Sinclair em tamanho normal. As funções disponíveis são:

SHIFT 9 GRAPHICS passa a imprimir caracteres inversos
SHIFT 0 RUBOUT executa RUBOUT (horizontal ou vertical)
SHIFT NEWLINE FUNCTION retorna ao Microbug (igual ao modo PIXEL)
NEWLINE - muda modo

A TECLA NEW LINE

A mudança do modo de edição é efetuada pela tecla NEW LINE, obedecendo à seguinte sequência:

PIXEL -> ESCRITA HORIZONTAL -> ESCRITA VERTICAL -> PIXEL ... etc.

O modo em execução é identificado pelo cursor piscante que se alterna com o caráter, ao qual se superpõe. Esse cursor, dependendo do caso, pode ser: pixel, H, [H] , V ou [V].


AUTO-REPETIÇÃO

Quase todas as funções do comando T são auto-repetitivas. Ao ser pressionada uma tecla, a função é prontamente executada e caso você não a libere, após um pequeno tempo de espera começa a auto-repetição em ritmo veloz. Isso, além de agilizar o seu trabalho, lhe permitirá apreciar alguns efeitos dinâmicos com a manipulação de arquivos.


COMANDOS S e U

Retornando ao Micro Bug, você disporá ainda dos comandos S, U e V. O comando S (de SAVE) salva em fita o conteúdo do buffer principal e o comando U carrega, também no buffer principal, o que for lido em fita. Muita atenção no uso desses comandos, pois um erro de arquivo pode apagar irremediavelmente um trabalho acabado, sem possibilidade de recuperação. Recorra sempre à tecla P do modo pixel para estabelecer o conteúdo correto dos buffers.

Para a eventualidade de carregar no buffer uma gravação imperfeita, que mandaria o sistema para o espaço quando mostrada na tela, o comando U zera o bit 6 dos bytes lidos em fita. Isso equivale a subtrair 64 dos códigos não imprimíveis, tornando-os imprimíveis. Os demais permanecem inalterados. 


ACOPLAMENTO EM LINHA PRINT - COMANDO V

Existem diversas maneiras de acoplar as telas produzidas com os seus programas. A mais simples é através do comando V que cria no BASIC uma linha PRINT com o conteúdo total ou parcial do buffer principal. Sua sintaxe é:

V XXXX,YY

onde XXXX é o número da linha que vai ser criada e YY é a quantidade de linhas do buffer principal que deve ser copiada (contando de cima para baixo). Dados impróprios provocam mensagens de erro: as mesmas do comando E do Micro Bug e mais "HUUUU", que é o Ed-Art vaiando se você fizer YY igual a zero ou maior do que 24. Lembre-se de que, no modo normal, o Micro Bug interpreta os dados no sistema hexadecimal, a menos que haja um $ antes.

As linhas PRINT criadas pelo comando V podem perfeitamente ser editadas e o PRINT substituído por outros comandos BASIC válidos, como por exemplo LPRINT; PRINT AT X,Y; LET A$=;etc.


ACOPLAMENTO EM VARIÁVEL STRING

O Micro Bug possui alguns comandos próprios que podem também ser usados no acoplamento, embora de maneira menos direta e bem mais complicada. Dentre esses estão os comandos E (MS n° 33) que cria linhas REM de qualquer tamanho e o comando O (MS nº 34) que transfere conteúdos da memória de um lugar para outro. O uso dessas alternativas requer bom conhecimento da organização de memória do micro e não o recomendamos nem para o preenchimento de variáveis string previamente criadas pela instrução DIM. Essa tarefa é muito mais facilmente executada através do próprio BASIC, com poucas linhas de programação:

10 LET A$=""
20 FOR F=l TO 22*32
30 LET A$=A$ + CHRS PEEK (27391+F)
40 NEXT F
50 STOP

Isso copia as 22 primeiras linhas do buffer principal na variável A$, que pode então ser impressa a qualquer momento no fluxo normal do seu programa, desde que você jamais tecle RUN (rode o programa com GOTO X) nem CLEAR, que apagam as variáveis. O programinha apresentado como exemplo pode e deve ser modificado por você de acordo com as suas conveniências, mas antes entenda-o bem. Repare que o número 22 da linha 20 é a quantidade de linhas a ser copiada e que o 27391 da linha 30 é igual ao endereço inicial do buffer principal menos l. Após ser rodado, o programinha pode ser apagado, mas lembre-se, nada de RUN ou CLEAR.


ACOPLAMENTO NO ARQUIVO DE IMAGENS DO SISTEMA

A maneira mais lógica e inteligente de se efetuar o acoplamento de uma tela é colocá-la no próprio arquivo de imagens do sistema no momento da gravação do
programa em fita. Como você deve ter notado, a maioria dos programas vai e volta da fita para o micro, arrastando atrás de si quase 1 Kb de endereços absolutamente vazios! Pois tratemos de ocupá-los com o que é chamado de "tela de abertura", aquela que se apresenta tão logo o programa seja carregado no micro. É uma excelente idéia fazer uma tela padrão, tipo marca registrada, que  personalize os seus programas. Mas o melhor mesmo nesse tipo de acoplamento é que não aumenta o tamanho dos programas, uma vez que a área utilizada está ali à espera da nossa criatividade.

O acoplamento é bastante simples. Crie, em local estratégico dentro do seu programa, as linhas abaixo:

XXXX RAND USR 31210
YYYY SAVE "nome do seu programa"

Naturalmente, o Micro Bug deve estar em posição na memória do micro. Em seguida, rode o programa BASIC com RUN XXXX ou GOTO XXXX, acionando com isso o Micro Bug. Uma vez lá em cima, você pode agir calmamente, carregando o Ed-Art se ele ainda não estiver em posição, carregando e/ou retocando a tela de abertura, etc. Nessa situação, você só não deve executar os comandos B, E e V; o resto é válido. Quando estiver tudo pronto, com o Ed-Art (no modo pixel do comando T) mostrando a tela escolhida, acione o gravador e tecle SHIFT Y, função que retorna direto ao BASIC sem passar pelo. Micro Bug. O retorno dar-se-á na linha YYYY, executando o SAVE com tela e tudo. Um programa assim gravado, ao ser carregado, mostra a tela de abertura e sai rodando a partir da linha seguinte a YYYY. Claro que o fluxo do programa não deverá mais passar pela linha XXXX.

Essa linha, aliás, pode ser omitida se for adotado o seguinte procedimento:

1°) De alguma forma, descubra o endereço inicial da linha YYYY (será 16509 se for a primeira do programa);
2°) Acione o Micro Bug através do comando direto RAND USR 31210;
3°) Com o comando M, troque o conteúdo da variável do sistema chamada NXTLIN, situada nos endereços 16425/6, pelo endereço inicial de YYYY;
4°) Efetue as operações descritas no processo normal.


LIST
Autor: Luiz Felipe Queiroz Nery  -  Micro Sistemas Nr. 58 (Julho 1986)

O M.O. LIST permite obter a listagem de programas BASIC a partir do Microbug. Após carregar o M.O. com o comando C, tem-se disponível o comando S, cuja sintaxe é a seguinte:

S xxxx

onde xxxx é o número da linha desejada. As linhas do programa Basic são listadas um a uma na parte inferior da tela, sendo que ao pressionar qualquer tecla é executado um scroll para cima, mostrando-se uma nova linha. Não se esqueça de observar a base na qual o Microbug está operando, pois S 100 pode listar tanto a partir da linha 100 (base 10) como a partir da linha 256 (base 16)


RENUMERADOR-GGMI
Autor: Cláudio de Freitas B. Bittencourt  -  Micro Sistemas Nr. 59 (Agosto 1986)

Módulo Operacional do Micro Bug que destina-se a renumerar as linhas de programas BASIC, melhorando-lhes a apresentação. O Renumerador GGMI implementa o comando X, cuja sintaxe é:

X aaaa,bbbb

onde aaaa é a base, ou seja, o número a ser dado à primeira linha, e bbbb é o incremento da numeração. O Renumerador GGMI corrige automaticamente todos os desvios que estiverem na forma:

GOTO Z
GOSUB Z

onde Z é um número inteiro, não necessariamente igual ao de de alguma linha existente. Qualquer desvio fora desse formato (ex.: expressão
aritmética, número fracionário, variável numérica, VAL "número", etc) será ignorado. A renumeração também não será executada se implicar em números de linha com valor igual ou maior que 15872, pois MSB=62 impede o programa de ser rodado corretamente, gerando mensagem de erro 
"Fora da Faixa".

A sintaxe do comando X pode ser simplificada, deixando-se de fornecer um ou os dois argumentos, como por exemplo:

X A
X $10,
X ,5
X ,

Neste caso, na ausência de dados são assumidos os valores 0 e 1 para base e incremento, respectivamente.


TRACE
Autor: Ricardo de Paola  -  Micro Sistemas Nr. 63 (Dezembro 1986)

O programa trace funciona como um módulo operacional do Microbug, e reúne as funções de Disassembler e simulador de programas assembler. Ele implementa os comandos S (simulador de instruções) e T (Disassembler), além de U e V como auxiliares do comando S.

COMANDO T: serve para disassemblar trechos de memória. Funciona como os comandos M e D tendo a seguinte estrutura: T <endereço>. Se não for digitado o endereço, continua-se a partir da instrução seguinte à última disassemblada. A tecla K vai disassemblando as instruções dali em diante e para sair deste comando é só dar <BREAK>. Existem os seguintes comandos SHIFT:

- SHIFT E/SHIFT S: como nos outros comandos do Microbug.
- SHIFT A: chaveia a impressão ou não dos bytes que compõem a instrução.
- SHIFT 3: chaveia em decimal/hexa a impressão dos bytes da instrução.
  Quando for usada a impressão em decimal, em algumas instruções os bytes sobreporão o código da instrução.
- SHIFT D: chaveia em decimal/hexa a impressão dos bytes dos operandos da instrução.

COMANDO S: serve para fazer a simulação passo-a-passo de um programa em Assembler. Seu formato é S <endereço>. Se o endereço não for digitado, assume-se o último endereço usado no comando S (e não o seguinte a ele). O comando S disassembla a instrução nesse endereço e mostra, nas duas últimas linhas da tela, a tela do comando H, onde estão os principais registradores do Z80 (AF, HL, DE, BC), seus conteúdos em hexa e o valor binário dos flags. A partir daí existem as seguintes opções:

- Tecla V: mostra, na primeira linha da tela, os seguintes elementos:
* O valor da posição de memória apontada por HL, ou por IX,IY+d, se a instrução que foi disassemblada fizer referência a IX ou IY.
* O valor de seu SP. É um valor diferente do SP do sistema, e deve apontar para alguma área da RAM com pelo menos uns 20 bytes, mais os níveis de stack que você vai precisar. Inicialmente tem valor 6C00.
* O valor de (SP), ou seja, o próximo valor a ser trazido da pilha por POP ou RET.

- Tecla K: simula a instrução que está sendo mostrada na tela e exibe a seguinte. Para se fazer a simulação é colocado um break-point na instrução seguinte, carrega-se nos registradores o valor mostrado na tela e desvia-se para aquela instrução. Logo depois os registradores são salvos e é mostrada a próxima instrução (a não ser em instruções JP, CALL e RET, onde o processo é outro). 
As chamadas à ROM (endereços menores que 8192) não são simuladas, e sim executadas por completos, porque não há como colocar break-points na ROM. Se você quiser acopanhar a execução de alguma rotina, deve movê-la para a RAM e realocar seus endereços.

- Tecla +: faz o mesmo que a tecla K, porém a tela é rodada junto com o valor dos registradores.

- Tecla N: avança para a instrução que está sendo mostrada.

- BREAK: termina o comando.

Comando U: serve para dar um novo valor ao seu SP (é um N só para o SP). O formato é U <novo valor>.

Comando V: é idêntico ao comando H, porém ele exibe também o valor de (HL) ou (xy+d), do SP e (SP).

CONSIDERAÇÕES:

Nos endereços 711D e 7158 está o valor 7D8D, que é o endereço da rotina $RCP do Microbug. Se você quiser fazer algum preparo, antes que cada instrução seja simulada (tal como posicionar o cursor, inicializar posições, trocar o arquivo de imagens pelo conteúdo de um buffer, passar o micro para FAST, alterar o valor de IX ou IY ou ainda qualquer outra coisa), coloque nestas duas posições de memória o endereço de sua rotina, lembrando de terminá-la com um JP $RCP ou coisa parecida.

Nos endereços 7127 e 715E está o valor 7D7C, que é o endereço da rotina $ARQ. Aqui se desvia, depois de ter sido simulada, a instrução de seu programa. Nesta situação, você passaria o micro para SLOW e voltaria o valor de IX e IY, não sendo necessário reposicionar o cursor nem voltar a tela que estava sendo mostrada antes.

Os endereços 4021, 407B e 407C são variáveis temporárias dos comandos S e T, portanto você deve salvá-las, inicializá-las com seu valor desejado e depois retorná-las, se fizer uso dessas posições em seu programa.

Se você vai fazer uso dos registradores IX ou IY, altere também os endereços 71CB, 71CC e 71CD, que têm as instruções PUSH IX/POP HL, para LD HL (seu ix); e os endereços 71D1, 71D2 e 71D3 para LD HL (seu iy).