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).