Neste número: Comandos do MSX
Comandos do MSX
Artigo Original: Oscar Júlio Burd e Luiz Sérgio Y.Moreira, Digitação: Wilson Pilon
Os microcomputadores da linha MSX possuem um grande repertório de comandos, muitos deles ainda desconhecidos. Desfrute deste potencial, valendo-se das principais instruções do MSX BASIC.
Este é o terceiro e último artigo sobre o padrão MSX, e nele abordaremos de maneira geral todos os comandos do MSX BASIC.
Por uma questão de objetividade, dividimos os comandos em 11 grupos segundo suas funções: uso em programação, som, entrada e saída, fluxo, uso exclusivo em gráficos (este já devidamente comentado no segundo artigo sobre os MSX, publicado em MS No 54), uso em texto, manipulação de variáveis, manipulação de memória, tratamento de interrupções, funções matemáticas e outras.
Note que o MSX BASIC possui mais de 180 comandos e funções, sendo também a mais poderosa das linguagens para micros de 8 bits existente no mundo. A nível de mercado nacional, o MSX BASIC pode ser comparado com o BASIC do IBM-PC, pois este é uma máquina de 16 bits.
Nas tabelas abaixo, você encontrará os 11 grupos de funções e seus respectivos comandos do MSX BASIC. Por questões de espaço, trataremos com alguma profundidade aqules comandos que julgamos importantes em cada grupo.
Tratamento de Interrupções |
---|
ERROR |
INTERVAL ON/OFF/STOP |
KEY [n] ON/OFF/STOP |
SPRITE ON/OFF/STOP |
STRIG ON/OFF/STOP |
ON ERROR GOTO |
ON INTERVAL |
ON KEY GOSUB |
ON SPRITE GOSUB |
ON STOP GOSUB |
ON STRIG GOSUB |
RESUME |
Outros Usos |
---|
BASE |
DEF USR |
FRE |
KEY LIST |
KEY ON/OFF |
KEY [n],"[série]" |
LET |
TIME |
USR |
VARPTR |
VDP |
Uso em Fluxo de Programas |
---|
FOR-NEXT |
GOSUB |
GOTO |
IF THEN ELSE |
ON GOTO |
RETURN |
RESUME |
ON GOSUB |
Uso Exclusivo em Gráficos |
---|
CIRCLE |
CLS |
COLOR |
DRAW |
LINE |
PAINT |
POINT |
PRESET |
PSET |
PUT SPRITE |
SCREEN |
SPRITE$ |
Uso em Som |
---|
BEEP |
PLAY |
PLAY([n]) |
SOUND |
Uso em Texto |
---|
CLS |
COLOR |
CSRLN |
LOCATE |
PRINT USING |
SCREEN |
SPRITE$ |
SPC |
TAB |
WIDTH |
POS |
PUT SPRITE |
Funções Matemáticas |
---|
ABS |
AND |
ATN |
BIN$ |
COS |
DEF FN |
EQV |
EXP |
FIX |
HEX$ |
IMP |
INT |
LOG |
NOT |
OCT$ |
OR |
RND |
SGN |
SIN |
SQR |
TAN |
XOR |
Uso em Programação |
---|
AUTO |
CLEAR |
CONT |
DATA |
DEF FN |
DELETE |
DIM |
END |
ERASE |
ERR/ERL |
LIST |
NEW |
READ |
REM |
RENUM |
RESTORE |
RUN |
STOP |
TROFF |
TRON |
Uso em Entrada e Saída |
---|
BLOAD |
BSAVE |
CALL FORMAT |
CALL SYSTEM |
CLOAD |
CLOSE |
COPY |
CSAVE |
DSKF |
EOF |
FIELD |
FILES |
GET # |
INKEY$ |
INP |
INPUT |
INPUTS |
INPUT # |
KILL |
LFILES |
LINE INPUT |
LINE INPUT # |
LIST |
LLIST |
LOAD |
LOF |
LPOS |
LPRINT |
LSET |
MAXFILES |
MERGE |
MOTOR ON/OFF |
NAME |
OPEN |
OUT |
PAD |
PDL |
PRINT # |
PRINT USING |
RUN |
RSET |
SAVE |
STICK |
STRIG |
WAIT |
Manipulação de Memória |
---|
POKE |
VPOKE |
PEEK |
VPEEK |
Uso na Manipulação de Variáveis |
---|
ASC |
CDBL |
CHR$ |
CINT |
CSNG |
CVD |
CVI |
CVS |
DEFINT |
DEFSNG |
DEFDBL |
DEFSTR |
DIM |
INSTR |
LEFT$ |
LEN |
MID$ |
MKD$ |
MKI$ |
MK$ |
RIGHT$ |
SPACE$ |
STR$ |
STRING$ |
SWAP |
VAL |
Vamos ao Assunto
Uso em Texto
SCREEN: Serve para selecionar o tipo de tela. SCREEN 0 ajusta a tela de texto para 40 caracteres por 24 linhas, SCREEN 1 ajusta a tela para 32 caracteres por 24 linhas.
PRINT USING: Usado para imprimir séries de caracteres ou números em formatos específicos. Existem formatos para séries de caracteres e formatos pra números, que podem ser melhor visualizados na tabela abaixo:
Símbolo | Função | Exemplo |
---|---|---|
"^^^^" | Retorna dados numéricos com notação em ponto flutuante | PRINT USING "#####^^^^";234.56 |
"$$" | Adiciona $ antes de dados numéricos | PRINT USING "$$###.##";12.35 |
"+" | Coloca o sinal + ou - conforme eles sejam positivos, negativos ou nulos | PRINT USING "+###.##";1.25 |
"-" | Coloca o sinal - após números negativos | PRINT USING "-";-1.25 |
"#" | Formata o número de dígitos apresentados de um dado numérico | PRINT USING "###.##";355.45 |
"**" | Preenche com asteriscos os espaços em branco de um dado numérico | PRINT USING "**";1.2540 |
"$**" | Acrescenta o símbolo $ antes de dados numéricos e preenche com asteriscos os espaços não ocupados | |
"," | Coloca uma vírgula em cada três dígitos à esquerda do ponto decimal | PRINT USING "####,##";348.23,29 |
"!" | Retorna o primeiro caractere de uma série de caracteres | PRINT USING "!";A$ |
"\n esp\" | Retorna n+2 caracteres de uma série de caracteres | PRINT USING "\ \";D$ |
"&" | Retorna todos os caracteres de uma série | PRINT USING "&";C$ |
PUT SPRITE: Este comando, que já foi explicado no artigo Comandos Gráficos no MSX (MS No 54), permite o uso de sprites em modo texto 1 (SCREEN 1).
10 SCREEN 1,0
20 SPRITE$(8)=CHR$(255)
40 FOR I=0 TO 100:PUT SPRITE 0,(I,95),9,8:NEXT
50 END
O programa acima faz o seguinte: a linha 10 coloca o micro em modo texto 1 com sprites de 8x8 pontos, a linha 20 define o sprite número 8 como sendo uma linha de 8 pontos (chr$(255)), a linha 30 imprime o texto "MOREIRA & BURD", a linha 40 movimenta o sprite na horizontal da posição 0 até a posição 100, e a linha 50 finaliza o programa, permanecendo o micro em modo texto, porém, com o sprite fixo na tela (experimente pressionar ENTER várias vezes e veja o que ocorre com o sprite).
Manipulação de Memória
VPEEK: Retorna o conteúdo do byte de uma determinada posição da memória de vídeo (VRAM). Cabe lembrar que os MSX nacionais possuem 16 Kb de memória exclusiva para vídeo, a qual pode ser inclusive utilizada para armazenar dados. Este comando é semelhante ao comando PEEK.
VPOKE: Armazena um byte num dado endereço da VRAM, sendo similar ao comando POKE.
O programa da Listagem 2 preenche a primeira linha da tela de texto 0 com o caractere A (código ASCII=65).
Tratamento de Interrupções
Este é um dos pontos altos do MSX BASIC, pois permite inclusive o uso de um relógio interno para interrupção por tempo.
ON INTERVAL GOSUB: Determina que a cada intervalo de tempo (especificado no comando), o fluxo do programa seja desviado para uma sub-rotina qualquer.
10 SCREEN 0
20 T=1
30 ON INTERVAL=60 GOSUB 1000
40 INTERVAL ON
50 PLAY "C":GOTO 50
1000 PRINT T;" segundos"
1010 T=T+1:BEEP
1020 RETURN
O programa acima simula um cronômetro, pois mostra na tela a passagem do tempo de segundo em segundo. Na linha 30, determinamos que a sub-rotina da linha 1000 seja executada a cada segundo (60 pulsos do relógio equivalem a um segundo), na linha 40, ligamos esta modalidade de interrupção, e na linha 1010, incrementamos a variável T(tempo).
ON KEY GOSUB: Determina que uma sub-rotina seja executada quando uma das dez teclas de função for pressionada.
10 SCREEN 0
20 ON KEY GOSUB 1000,,2000
30 KEY(1) ON:KEY(3) ON
40 PRINT ".";:GOTO 40
1000 CLS:PRINT "MICRO"
1010 RETURN
2000 PRINT:PRINT " SISTEMAS"
2010 RETURN
Na linha 20 definimos que ao ser pressionada a tecla F1, deve ser executada a sub-rotina da linha 1000 e que ao ser pressionada a tecla F3 deve ser executada a sub-rotina da linhas 2000. A linha 30 liga o sistema de interrupção das teclas F1 e F3. Experimente. Após o início da execução do programa, pressionar a tecla F1 e em seguida, F3.
ON SPRITE GOSUB: Determina que uma sub-rotina seja executada quando ocorrer uma colisão de sprites, ou seja, quando um ponto de um sprite tocar um ponto acesso de outro sprite.
10 SCREEN 1,0
20 SPRITE$(0)=CHR$(255)+CHR$(255)
30 ON SPRITE GOSUB 1000
40 SPRITE ON
50 FOR I=0 TO 180
60 PUT SPRITE 0,(I,I),7,0
70 PUT SPRITE 1,(I,95),9,0
80 NEXT
90 GOTO 50
1000 PRINT "BUM",I
1010 RETURN
Na linha 20 definimos o sprite 0 como uma barra, na linha 30 determinamos que a sub-rotina da linha 1000 deve ser executada sempre que houver uma colisão de sprites, na linha 40 ligamos o sistema de interrupção por colisão de sprites.
Da linha 50 até a 80 movimentamos o sprite 0 em dois planos distintos, em caminhos que se encontram. Na linha 1000 imprimimos o BUM seguido do valor de I (coordenada horizontal da colisão).
Funções Matemáticas
OCT$: Converte um número decimal em uma série de caracteres que representam o valor deste número (base 8).
10 INPUT "DIGITE UM NUMERO";N
20 PRINT OCT$(N)
30 GOTO 10
O programa anterior recebe um número decimal (linha 10) e imprime o seu equivalente octal (linha 20).
HEX$: Semelhante à função anterior, retornando, porém, o seu equivalente na representação hexadecimal (base 16).
10 INPUT "DIGITE UM NUMERO";N
20 PRINT HEX$(N)
30 GOTO 10
BIN$: Similar às funções anteriores, retornando, porém, o número na sua representação binária (base 2). O programa abaixo imprime os números de 0 até 255 com sua respectiva representação binária.
10 FOR I=0 TO 255
20 PRINT I,BIN$(I)
30 NEXT
40 END
Uso em Programação
Os MSX trazem todos os comandos existentes nos micros mais avançados, tais como AUTO, RENUM, CLEAR, etc.. Falaremos, a seguir, dos comandos ERR e ERL que auxiliam na correção e manipulação de erros, inclusive do próprio usuário.
ERR: Retorna o código do erro
ERL: Retorna o número da linha onde ocorreu o erro.
10 ON ERROR GOTO 1000
20 INPUT "DIGITE UM NUMERO";N
30 PRINT "10/";N;"=";
40 PRINT 10/N
50 GOTO 20
1000 PRINT:PRINT "CODIGO DE ERRO:";ERR
1010 PRINT "NA LINHA:";ERL
1020 RESUME 20
O programa anterior imprime o resultado da divisão de 10 pelo número que você digitou. Caso ocorra um erro (você digitou 0 ou uma letra), é executada a sub-rotina da linha 1000 indicando qual o erro e em que linha ele ocorreu.
Uso em Som
A geração de som e efeitos sonoros é mais um ponto forte do MSX, veja por quê:
PLAY: Este comando permite executar músicas segundo uma macrolinguagem musical. Nesta macrolinguagem é possível tocar oito oitavas, modificar o tempo de execução de uma música, utilizar até dez formatos de ondas sonoras diferentes, etc.
É importante lembrar que os MSX contam com três canais de som independentes (o que permite a geração de sons e músicas extremamente complexas) e que o integrado gerador de som pode executar uma tarefa musical independente da UPC, isto é, o micro pode tocar uma música enquanto a UPC executa operações diversas.
10 PLAY "s1m3000"
20 PLAY "CDEFG","DEFGA","o6EFGAB"
30 GOTO 20
Na linha 10 o canal de som é ajustado para emitir um formato de onda especial, na linha 20 executa-se a música "CDEFG" neste mesmo canal A com som de piano, "DEFGA" no canal B com som de órgão e "o6EFGAB" no canal C com som de órgão na sexta oitava.
SOUND: Usado para manipular os registradores do integrado de som, também chamado de PSG (Programmable Sound Generator). Estes registradores controlam itens como volume, mixage de ruído, formas de ondas sonoras, etc..
10 SOUND 4,23:SOUND 5,0:SOUND 6,20
20 SOUND 7,3:SOUND 9,2:SOUND 10,16
30 SOUND 11,9:SOUND 12,2:SOUND 13,12
40 PRINT"MICRO SISTEMAS":GOTO 40
No programa anterior temos um exemplo do poder sonoro dos MSX, gerando o som de um helicóptero. Na linha 40 temos a impressão contínua da mensagem MICRO SISTEMAS enquanto é emitido o som.
Uso em Entrada e Saída
Neste segmento, incluímos, todos os comandos do sistema operaciona MSX DOS e os comandos do MSX BASIC. Trataremos apenas deste último, deixando os comando do MSX DOS para um próximo artigo.
LINE INPUT: Associaos caracteres digitados a uma variável alfanumerica, aceitando o delimitador vírcula (,) como um caracter qualquer (acabou a velha dor de cabeça).
STICK: Retorna um valor numérico conforme o estado do controlador de jogo (joystick) ou teclas de controle de cursor (as teclas que ficam à direita do teclado).
10 M=STICK(0)
20 PRINT M
30 GOTO 10
Na linha 10 é lido o estado das teclas de controle do cursor e na 20 é impresso o valor deste estado. Experimente pressionar duas dessas teclas ao mesmo tempo.
STRIG: Retorna o estado dos botões de disparo do controlador de jogo ou da barra de espaço. Se um destes elementos for pressionado, retorna o valor -1, em caso contrário, será retornado o valor 0
10 M=STRIG(0)
20 PRINT M
30 GOTO 10
Na linha 10 é lido o estado da barra de espaço (ou do botão de disparo do controlador), a linha 20 imprime o valor do estado. Experimente pressionar a barra de espaço e confira.
Uso em Fluxo de Programas
IF THEN ELSE: Este é o comando IF THEN, comum a todo BASIC, relacionado ainda com o ELSE (senão), que é realizado quando a comparação do IF resulta falso.
RESUME: Continua a execução de um programa BASIC após uma rotina de erro ter sido executada. Possui três modalidades: RESUME, onde o programa continua na instrução que causou o erro, RESUME NEXT, onde o programa continua na instrução imediatamente após o erro, e RESUME número da linha, onde o programa continua na linha de número indicado.
Uso na Manipulação de Variáveis
INSTR: Busca a primeira ocorrência de um ou mais caracteres dentro de outra série de caracteres, imprimindo os caracteres iniciais desta ocorrência.
10 A$="O RATO ROEU"
20 PRINT A$
30 INPUT "digite uma letra ou palavra";N$
40 PRINT INSTR(A$,N$)
50 GOTO 10
Na linha 40 descobre-se o local da ocorrência da série de caracteres de N$ na frase O RATO ROEU que está em A$. Para experimentar e compreender, digite estes exemplos: O, TO, ROEU.
SWAP: Troca o conteúdo de duas variáveis entre sí.
10 A=5
20 B=6
30 SWAP A,B
40 PRINT A,B
50 END
Na linha 30 os conteúdos de A e B são permutados, resultando na impressão dos números 6 e 5.
Outros Comandos
TIME: É uma variável reservada do sistema. Esta variável conta o tempo, sendo automaticamente incrementada a cada 1/60 segundo.
10 TIME=0
20 FOR I=0 TO 999:NEXT
30 PRINT "ESTE 'FOR' DEMOROU:";TIME/60;"segundos"
40 END
Na linha 10 colocamos 0 como valor inicial em TIME, na linha 20 é executado um FOR para deixar o tempo correr, e na linha 30 são impressos quantos segundos demorou o MSX BASIC na execução do programa. Se você, depois disso, escrever PRINT TIME a qualquer momento, você verificará que o valor de TIME sempre aumenta (pois o tempo passa).
VARPTR: Descobre o endereço na memória do MSX em que uma determinada variável ou matriz em BASIC está. Uma vez determinado este endereço, você pode passá-lo para um programa em linguagem de máquina (por exemplo) que poderá ler o conteúdo da variável ou elemento da matriz. Este comando é muito útil para programadores experientes que trabalham com linguagem de máquina.
Manipulando Arquivos em Cassete
Nosso propósito, neste final, é fazer um breve relato dos comandos disponíveis para a manipulação de arquivos em fita cassete. Em seguida, daremos um exemplo simples de um programa para demonstrar alguns dos comandos.
BSAVE e BLOAD: Armazena e lê da fita um arquivo binário. Este arquivo pode conter dados de memória, uma tela gráfica, programas em linguagem de máquina, etc..
BLOAD"TESTE":Carrega o arquivo TESTE na memória.
CSAVE e CLOAD: Armazena e lê arquivos BASIC exclusivamente em fita.
CSAVE "TESTE"
OPEN e CLOSE: Acessam um dispositivo como um arquivo de entrada ou saída. O dispositivo pode ser: gravador, impressora, tela de texto, etc. CLOSE fecha o dispositivo.
OPEN "CAS:" FOR OUTPUT AS #3, abre o gravador cassete como arquivo de saída com número de referência 3. Para se escrever um dado no gravador, usa-se, por exemplo, PRINT #3,"Testando..."
OPEN "CAS:" FOR INPUT AS #2, abre o gravador cassete como arquivo de entrada com número de referência 2. Para se ler do gravador, usa-se, por exemplo, INPUT #2,L$
O programa a seguir é um exemplo simples de uma agenda telefônica de dez nomes.
10 GOTO 300
20 CLS:FOR I=0 TO 9:PRINT I;"- ";:INPUT "nome= ";NO$(I):INPUT "telefone= ";TE$(I):IF TE$(I) <> "F" OR TE$(I) <> "f" THEN NEXT:RETURN ELSE RETURN
30 CLS:PRINT "pressione REC e PLAY no gravador":PRINT "e ENTER no micro":GOSUB 200
40 OPEN "agenda.dat" FOR OUTPUT AS #1:PRINT #1,I
50 CLS:PRINT "gravando..."
60 FOR K=0 TO I:PRINT #1,NO$(K):PRINT #1,TE$(K):NEXT:CLOSE:RETURN
70 REM
80 CLS:PRINT "posicione a fita e tecle PLAY":PRINT "tecle ENTER no micro":GOSUB 200
90 CLS:PRINT "lendo dados...":OPEN "agenda.dat" FOR INPUT AS #1:INPUT #1,I
100 FOR K=0 TO I:INPUT #1,NO$(K),TE$(K):NEXT:CLOSE:RETURN
110 CLS:FOR K=0 TO I-1:PRINT NO$(K),TE$(K):NEXT
120 PRINT "tecle ENTER para continuar":GOSUB 200:RETURN
200 IF INKEY$ <>CHR$(13) THEN 200 ELSE RETURN
300 CLS:PRINT "Moreira & Burd":PRINT "1-novos dados":PRINT "2-grava dados":PRINT "3-le dados":PRINT "4-lista dados":PRINT "5-fim"
310 A$=INKEY$:IF A$= "" THEN 310 ELSE ON VAL(A$) GOSUB 20,30,70,110,400
320 GOTO 300
400 CLS:PRINT "adeus..."
410 END
Ao utilizar esta agenda, pela primeira vez, você deve selecionar a opção 1 e incluir os nomes conforme o programa pede. Mais tarde, quando você desejar alterar um nome da lista (por exemplo, o quinto nome), selecione a opção 1, pressione ENTER até surgir '5-nome=' e então escreva o novo nome (o mesmo é válido para telefone). A função das outras opções é: 5=encerrar o programa, 4=listar os dados correntes, 3=ler os dados da fita, e 2=armazenar os dados atuais em fita. Note que é possível ter vários arquivos, cada qual com um conjunto de nomes diferentes. Os programadores experientes podem alterar o programa para aceitar uma quantidade maior de dados.
Nossa observação final sobre esta matéria é de que ela representa apenas uma pequena amostra do MSX BASIC, pois seria impossível descrever todos os comandos em um único artigo. Um aspecto observado por nós foi o de que em nenhum livro ou manual constam todos os comandos do MSX BASIC, fato este que nos levou a escrever um guia de referência completo do MSX, que está em edição pela MacGraw-Hill do Brasil.
Terminamos com uma observação pessoal: dentro do mercado de micros de 8 bits, o MSX é, sem dúvida, o melhor computador que já utilizamos, quer seja pelas facilidades que apresenta em programação, quer pela total padronização de seus periféricos.
WebMSX
- ms-55.dsk: Rode os programas pelo WebMSX