Posicionamento do cursor

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:

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

* 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:

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