Para grande frustração dos proprietários do MC1000, seu BASIC não fornecia um comando para posicionamento de cursor, como os que existem em outras linhas de microcomputadores. Exemplos:
MSX: | LOCATE linha,coluna |
TK-90X (ZX-Spectrum): | PRINT AT linha,coluna; … |
CP-400 (TRS-80 Color): | PRINT @ posição, … |
Apple II: | VTAB linha : HTAB coluna |
Mas há uma forma de fazê-lo, usando uma sequência de quatro caracteres iniciada pelo caracter de controle ESC, documentada (de maneira não muito compreensível) no [[Manual de Referência]], ao tratar da rotina CO da ROM, que serve para imprimir caracteres (e é usada pelo comando PRINT
do BASIC):
- Caracter ESC ($1B / 27);
- Caracter "=" ($3D / 61);
- Caracter com código ASCII correspondente à linha;
- Caracter com código ASCII correspondente à coluna*.
* A rotina CO contém uma distinção para os modos de 32 e 80 colunas. Em modo de 80 colunas, acrescenta-se 32 ao valor da coluna.
Assim, em BASIC temos, para o modo de 32 colunas:
PRINT CHR$ (27);"="; CHR$ (linha); CHR$ (coluna);
Onde 0 ≤ linha ≤ 15 e 0 ≤ coluna ≤ 31.
E para o modo de 80 colunas:
PRINT CHR$ (27);"="; CHR$ (linha); CHR$ (coluna + 32);
Onde 0 ≤ linha ≤ 23 e 0 ≤ coluna ≤ 79.
Infelizmente há um bug no posicionamento para 32 colunas que faz com que o cursor seja posicionado uma linha abaixo do lugar correto.
Por sorte, a sintaxe para 80 colunas (somando 32 ao número da coluna) também funciona no modo de 32 colunas, e aí sim o cursor cai no lugar certo.
Esse recurso foi utilizado numa dica de Edmundo Tojal Donato Júnior, de Alagoas, publicada na Revista Micro Sistemas nº 51 de dezembro de 1985:
10 HOME
20 INPUT "LINHA,COLUNA";L,C: HOME
30 GOSUB 100
40 PRINT "MC-1000";
50 POKE 283,0
60 IF PEEK (283) < > ASC ("C") THEN 60
70 GOTO 10
100 PRINT CHR$ (27); CHR$ (61); CHR$ (L); CHR$ (C + 32);: RETURN
Para reduzir o tamanho de bytes utilizados no comando PRINT
e a poluição visual causada por tantos CHR$
, uma sugestão é guardar os dois primeiros bytes da sequência de escape em uma variável. Uma dica é usar uma variável chamada AT$
de uma forma que lembra a sintaxe usada no ZX-Spectrum:
10 AT$ = CHR$ (27) + "="
20 TEXT : HOME
30 PRINT AT$; CHR$ (10); CHR$ (12 + 32);"MC-1000";
40 PRINT AT$; CHR$ (12); CHR$ (6 + 32);"CCE COLOR COMPUTER";
50 PRINT CHR$ (30);
Essa solução ainda é um pouco visualmente poluída. Pode-se fazer como na dica do Edmundo Tojal e esconder toda a sequência de escape em uma sub-rotina, passando-se as coordenadas em variáveis:
10 TEXT : HOME
20 L = 10:C = 12: GOSUB 100: PRINT "MC-1000";
30 L = 12:C = 6: GOSUB 100: PRINT "CCE COLOR COMPUTER";
40 PRINT CHR$ (30);
50 END
100 PRINT CHR$ (27);"="; CHR$ (L); CHR$ (C + 32);: RETURN
Uma outra dica é usar o comando SET x,y
para passar as coordenadas para a subrotina, dispensando as variáveis adicionais. A subrotina obtém com PEEK
os valores das variáveis do sistema onde o comando SET
armazena os valores das coordenadas. Mas há um porém: o comando SET
emite "TI ERRO" se verificar que está em modo TEXT
. Para ludibriar essa verificação, basta um POKE
na variável do sistema verificada pelo comando SET
, para ele achar que estamos em modo GR
ou HGR
:
10 TEXT : POKE 856,2: HOME
20 SET 12,10: GOSUB 100: PRINT "MC-1000";
30 SET 6,12: GOSUB 100: PRINT "CCE COLOR COMPUTER";
40 PRINT CHR$ (30);
50 END
100 PRINT CHR$ (27);"="; CHR$ ( PEEK (857)); CHR$ ( PEEK (858) + 32);: RETURN
Onde se usam os endereços:
- 856 = Anotação sobre o modo de vídeo atual: 0 =
TEXT
, 1 =GR
, 2 =HGR
. - 857 = Coordenada vertical definida por
SET
. - 858 = Coordenada horizontal definida por
SET
.
Outras dicas rápidas referentes ao cursor:
Estas dicas só se aplicam ao modo de 32 colunas.
Cursor sem piscar (1):
POKE 304,201
A cada leitura do teclado (rotina SKEY?) são chamados dois hooks na área de variáveis do sistema na RAM. O segundo deles é JOBM ($0103 / 304), que originalmente contém uma instrução JP
para a rotina da ROM que conta ciclos para o piscamento do cursor. O POKE
coloca uma instrução RET
em JOBM, desativando o piscamento.
Cursor sem piscar (2):
GR : HOME
Os comandos de seleção de modo gráfico (GR
ou HGR
) realizam automaticamente o procedimento de colocar um RET
em JOBM, desativando o piscamento do cursor. O comando HOME
até faz o MC6847 entrar no modo alfanumérico, mas, diferentemente do comando TEXT
, não restabelece todas as variáveis aos valores usuais do modo de texto. Por exemplo, após um GR : HOME
o MC1000 continua aceitando comandos de desenho (SET
, PLOT
etc.) sem emitir "TI ERRO".
Esta solução é visualmente poluída, pois o usuário vai enxergar a tela piscando em modo GR
.
Para voltar a piscar (1):
POKE 304,195
Restabelece a instrução JP
em JOBM.
Para voltar a piscar (2):
TEXT
Cursor invisível:
POKE 247,202: POKE 248,192: POKE 249,202: POKE 250,192: CALL 52013
Coloca o endereço $C0CA (onde há uma instrução RET
) nas variáveis de 2 bytes UPDBM ($00F7 / 247) e UPDBCM ($00F9 / 249), que originalmente contêm endereços de rotinas da ROM responsáveis pela inversão do caracter na posição do cursor.
O CALL
do final apaga o cursor se ele ainda estiver aceso.
Atenção: O comando HOME
e a impressão de CHR$(30)
desfazem esta configuração.
Para voltar a aparecer (1):
POKE 247,29: POKE 248,203: POKE 249,45: POKE 250,203
Restaura os valores originais de UPDBM e UPDBCM.
Para voltar a aparecer (2):
HOME
ou
PRINT CHR$ (30);
Nenhum comentário:
Postar um comentário