Externamente, o BASIC do MC1000 é bem parecido com BASIC Applesoft, programado pela Microsoft para o Apple II (com instruções como HOME
, GR
, INVERSE
, etc.; ausência de INKEY$
, INSTR
, etc.) Mas quando o BASIC Applesoft só foi criado já existiam versões do Microsoft BASIC rodando em máquinas baseadas no Intel 8080, o precursor do Z80. O BASIC do MC1000 parece ser um descendente de uma dessas versões antigas cujos números de ponto flutuante eram armazenados em 4 bytes, resultando em uma precisão de aproximadamente 6 dígitos decimais, em vez dos aproximadamente 9 dígitos de versões posteriores.
Resumo
(Para uma explicação mais detalhada consulta o Manual do BASIC.)
Instruções e linhas
Uma linha digitada sem um número de linha é executada imediatamente (modo direto); linhas digitadas com número de linha são armazenadas na RAM para execução posterior.
:
- Separa instruções na mesma linha.
REM
- Faz com que o resto da linha seja ignorada pelo interpretador, permitindo que o programador inclua no programa comentários para serem lidos por outras pessoas.
Operações sobre o programa BASIC na memória
NEW
- Apaga o programa atual e todas as variáveis.
AUTO
[ lin1 [-
lin2 ] ]- Inicia um modo de digitação de linhas em que a numeração é fornecida automaticamente, iniciando em lin1 e aumentando de 10 em 10 até lin2. Na ausência de parâmetros, a numeração se inicia em 10. Na ausência de lin2, a sequencia continua até que o usuário pressione <CTRL>+<C>.
LIST
[ [ lin1 ]-
[ lin2 ] ]- Exibe a porção do programa entre as linhas lin1 e lin2, inclusive. Na ausência de lin1 a listagem inicia na primeira linha do programa. Na ausência de lin2 a listagem segue até a última linha do programa.
EDIT
lin- Executa uma rotina para edição da linha lin. (Ver Manual do BASIC.)
Variáveis
- Numéricas
- AB: Armazenam valores numéricos de ponto flutuante na faixa de ±1,70141×1038.
- Cadeia de caracteres
- AB
$
: Armazenam cadeias de 0 a 255 caracteres.
Matrizes
- Numéricas
- AB
(
exprN [,
... ])
- Cadeia de caracteres
- AB
$
(
exprN [,
... ])
Onde A é uma letra, B é nada, uma letra ou um algarismo. O tamanho da matriz é limitado apenas pela memória disponível. O nome de uma variável ou matriz pode conter mais caracteres, mas são ignorados. (Os nomes "PRECO", "PRAIA", "PRESIDENCIALISMO" todos se referem a uma mesma variável "PR".)
DIM
mat(
exprN [,
... ])
- Cria a matriz mat com as dimensões especificadas. Cada índice varia de 0–exprN.
- [
LET
] var=
expr - [
LET
] mat(
exprN [,
... ]) =
expr - Atribui um valor a uma variável, ou a um elemento de uma matriz. A presença da palavra
LET
é opcional.
Operadores
Aritméticos
- exprN1
+
exprN2 - Adição.
- exprN1
−
exprN2 - Subtração.
- exprN1
*
exprN2 - Multiplicação. (exprN1 × exprN2)
- exprN1
/
exprN2 - Divisão. (exprN1 ÷ exprN2)
- exprN1
↑
exprN2 - Exponenciação. (exprN1exprN2)
Relacionais
Retornam −1 para expressões verdadeiras e 0 para expressões falsas.
- exprN1
=
exprN2 - É igual a.
- exprN1
<
exprN2 - É menor do que.
- exprN1
>
exprN2 - É maior do que.
- exprN1
<=
exprN2 ou exprN1=<
exprN2 - É menor ou igual a. (exprN1 ≤ exprN2)
- exprN1
>=
exprN2 ou exprN1=>
exprN2 - É maior ou igual a. (exprN1 ≥ exprN2)
- exprN1
<>
exprN2 ou exprN1><
exprN2 - É diferente de. (exprN1 ≠ exprN2)
Lógicos
Atuam a nível de bit em operandos numéricos, convertidos a inteiros de 16 bits com sinal.
- exprN1
AND
exprN2 - Para cada par correspondente de bits dos operandos:
- 0
AND
0 = 0. - 0
AND
1 = 0. - 1
AND
0 = 0. - 1
AND
1 = 1.
- 0
- exprN1
OR
exprN2 - Para cada par correspondente de bits dos operandos:
- 0
OR
0 = 0. - 0
OR
1 = 1. - 1
OR
0 = 1. - 1
OR
1 = 1.
- 0
NOT
exprN- Para cada bit do operando:
NOT
0 = 1.NOT
1 = 0.
Funções aritméticas
ABS(
exprN)
- Módulo de exprN. (Isto é, o valor de exprN sem o sinal.)
SGN(
exprN)
- Sinal de exprN: −1 (negativo), 0 (zero) ou 1 (positivo).
INT(
exprN)
- Número inteiro mais próximo menor ou igual a exprN.
SQR(
exprN)
- Raiz quadrada de exprN.
SIN(
exprN)
- Seno de exprN radianos.
COS(
exprN)
- Co-seno de exprN radianos.
TAN(
exprN)
- Tangente de exprN radianos.
ATN(
exprN)
- Arco-tangente de exprN radianos.
EXP(
exprN)
- eexprN, onde e = 2,71828.
LOG(
exprN)
- Logaritmo natural de exprN. (log e exprN, ln exprN.)
RND(
exprN)
-
- Se exprN > 0, um número pseudoaleatório entre 0 (inclusive) e 1 (exclusive).
- Se exprN = 0, repete o último número gerado.
- Se exprN < 0, usa o parâmetro para inicializar a semente do gerador de números pseudoaleatórios.
DEF FN
AB(
varN) =
exprN- Define uma função.
FN
AB(
exprN)
- Calcula o valor da função AB para o valor exprN.
Algumas funções matemáticas ausentes no BASIC do MC1000 podem ser definidas assim:
- Arco-seno, sen−1 x
DEF FN AS(X) = ATN(X / SQR (1 - X * X))
- Arco-cosseno, cos−1 x
DEF FN AC(X) = 1.5707963 - ATN(X / SQR(1 - X * X))
- Logaritmo na base 10, log 10 x
DEF FN LD(X) = LOG(X) / 2.3025851
Operações sobre cadeias de caracteres
- exprC1
+
exprC2 - (Operador.) Concatena cadeias.
LEN(
exprC)
- Comprimento da cadeia exprC.
LEFT$(
exprC,
exprN)
- Os exprN caracteres mais à esquerda da cadeia exprC.
MID$(
exprC,
exprN1 [,
exprN2 ])
- exprN2 caracteres de exprC, começando da posição exprN1. Na ausência de exprN2, considera-se até o final da cadeia.
RIGHT$(
exprC,
exprN)
- Os exprN caracteres mais à esquerda da cadeia exprC.
STR$(
exprN)
- A cadeia representando o valor numérico exprN.
VAL(
exprC)
- O valor numérico da cadeia exprC.
CHR$(
exprN)
- O caracter de código ASCII exprN.
ASC(
exprC)
- O código ASCII do primeiro caracter da cadeia exprC.
Controle
RUN
[ lin ]- Apaga todas as variáveis e executa o programa atual a partir da linha lin. Na ausência de lin a execução inicia na primeira linha do programa. Em execução, o programa pode ser pausado com <CTRL>+<S> e interrompido com <CTRL>+<C>.
STOP
- Para a execução do programa e imprime o número da linha.
CONT
- Retoma a execução do programa.
END
- Para a execução do programa.
GOTO
lin- Salta para a linha de número lin.
ON
exprNGOTO
lin [,
... ]- Salta para um dos números de linha especificados segundo o valor de exprN (1, 2, … n). Se exprN = 0 ou maior que a quantidade de números de linha especificados, ignora e passa à instrução seguinte. Se exprN < 0, ocorre erro de parâmetro ilegal.
IF
exprNTHEN
instr [:
... ]- Se exprN for falsa (=0), ignora o restante da linha atual e passa à próxima linha. Se exprN for verdadeira (≠0), continua a execução das instruções seguintes na linha.
IF
exprNTHEN
linIF
exprNGOTO
lin- Sintaxes abreviadas alternativas para
IF
exprNTHEN GOTO
lin. FOR
varN=
exprN1TO
exprN2 [STEP
exprN3 ]- Inicia um laço para todos os valores de varN de exprN1 até exprN2, saltando de exprN3 em exprN3. Se a cláusula
STEP
for omitida, subentende-se 1. NEXT
[ varN [,
... ] ]- Repete o laço
FOR
para os próximos valores de varN1, varN2, ... varNn. Se nenhuma variável for especificada, repete o laço mais recente. GOSUB
lin- Salta para a subrotina na linha lin.
RETURN
- Retorna de uma subrotina para a instrução seguinte à instrução
GOSUB
. ON
exprNGOSUB
lin [,
... ]- Salta para a subrotina em um dos números de linha especificados segundo o valor de exprN (1, 2, ... n). Se exprN = 0 ou maior que a quantidade de números de linha especificados, ignora e passa à instrução seguinte. Se exprN < 0, ocorre erro de parâmetro ilegal.
Entrada e saída
INPUT
[ literalC;
] var [,
... ]- Imprime a mensagem contida em literalC, se for especificada; em seguida imprime um ponto de interrogação ("?"), espera que o usuário digite dados separados por vírgulas e os armazena nas variáveis especificadas.
READ
var [,
... ]- Lê valores das listas
DATA
e os armazena nas variáveis especificadas. DATA
literal [,
... ]- Lista de valores de dados a serem lidos com
READ
. RESTORE
[ lin ]- Posiciona o ponto de leitura da lista
DATA
no início da linha lin. Ou na primeira linha do programa se lin estiver ausente. PR#
exprN- Determina se as instruções de impressão (
PRINT
,LIST
) serão exibidos na tela (exprN = 0), na impressora (exprN = 1) ou em ambos (exprN = 2). PRINT
[ expr [ sep ...] ] [ sep ]-
Imprime os valores de diversas expressões em sequência. Quando um ponto-e-vírgula (
;
) for usado como separador, o valor seguinte é impresso na posição atual do cursor. Uma vírgula (,
) avança o cursor para o próximo "ponto de tabulação" (até 13 espaços adiante). Se a instrução terminar com um separador, o cursor fica posicionado no lugar correspondente aguardando a próxima instrução de impressão. Caso contrário, o cursor cai para o início da linha seguinte. No lugar de uma expressão pode-se usar uma das cláusulas:SPC(
exprN)
: Imprime exprN espaços.TAB(
exprN)
: Imprime espaços até o cursor chegar à exprN-ésima posição de caracter a partir do início da linha.VTAB(
exprN)
: Posiciona o cursor verticalmente. (Não funciona. Ver bugs.)
TEXT
- Entra o modo de texto e limpa a tela.
HOME
- Limpa a tela de texto e posiciona o cursor no canto superior esquerdo.
NORMAL
- Determina impressão em modo normal (letras claras sobre fundo escuro).
INVERSE
- Determina impressão em modo invertido (letras escuras sobre fundo claro).
WIDTH
exprN- Introduz uma quebra de linha automática após cada exprN caracteres impressos em sequência. O valor padrão é 255.
POS(
exprN)
- (Função.) Retorna o deslocamento do cursor desde a última quebra de linha.
COLUMN
exprN-
Só admite dois valores:
- 32 — Direciona a impressão de texto para o VDG MC6847, de 32 colunas, e limpa a tela.
- 80 — Se houver cartão de 80 colunas, direciona a impressão de texto para ele e limpa a tela. Caso contrário, produz erro "tipo incompatível".
Outros valores produzem erro "parâmetro ilegal".
INP(
exprN)
- (Função.) Lê um valor da porta de entrada exprN.
OUT
exprN1,
exprN2- Envia o valor exprN2 para a porta de saída exprN1.
WAIT
exprN1,
exprN2 [,
exprN3 ]- Espera até que
(INP(
exprN1) XOR
exprN3) AND
exprN2 ≠.0. Na ausência de exprN3, assume-se 0.
Operações com a fita cassete
SAVE
[ nome ]- Salva o programa em BASIC atual na fita. O nome é uma sequência de 1 a 5 caracteres alfanuméricos (sem aspas). ATENÇÃO: Se o programa for salvo com nome, será NECESSÁRIO informar o nome no comando
LOAD
, então é importante anotar o nome do programa em algum lugar. Um programa sem nome executa automaticamente após a carga, com impressões desativadas (vide a variável do sistema $0344 / 836). LOAD
[ nome ]- Carrega um programa em BASIC da fita. O nome é uma sequência de 1 a 5 caracteres alfanuméricos (sem aspas). ATENÇÃO: Se o programa foi salvo com nome, é NECESSÁRIO informar o nome no comando
LOAD
. Um programa sem nome executa automaticamente após a carga, com impressões desativadas (vide a variável do sistema $0344 / 836). SAVE *
matN- Salva o conteúdo de uma matriz numérica na fita. Atenção: Deve haver um espaço entre o asterisco e o nome da matriz.
LOAD *
matN- Carrega o conteúdo de uma matriz numérica da fita. A matriz deve ser criada com
DIM
antes da carga. Atenção: Deve haver um espaço entre o asterisco e o nome da matriz. TLOAD
- Carrega um programa em código de máquina da fita e o executa em "modo de jogo".
Gráficos
GR
- Passa ao modo gráfico de baixa resolução (128×64 pixels, 4 cores) e limpa a tela.
COLOR =
exprN- Define a cor de desenho do modo de baixa resolução como exprN (0–3).
HGR
- Passa ao modo gráfico de alta resolução (256×192 pixels, preto e branco) e limpa a tela.
PLOT
exprNx,
exprNy- Faz um ponto nas coordenadas exprNx, exprNy.
PLOT
[ exprNx1,
exprNy1 ]TO
exprNx2,
exprNy2 [TO
... ]- Desenha uma ou mais linhas conectadas na tela gráfica. Se uma primeira coordenada não for especificada antes da palavra
TO
, o desenho parte do último ponto desenhado. DRAW
[-
] exprNx,
[-
] exprNy-
Desenha uma linha do último ponto desenhado (x, y) até novas coordenadas x + exprNx, y + exprNy etc.
Atenção: Os sinais de menos, quando presentes, fazem parte da sintaxe do comando, e não das expressões numéricas. A instrução
DRAW -4-3,0
equivale aDRAW -(4-3),0
ouDRAW -1,0
, e não aDRAW -7,0
como se esperaria. De fato, a instrução não aceita parâmetros negativos. Instruções comoDRAW (-1),0
(o sinal de menos não é reconhecido como parte da sintaxe porque não vem imediatamente após a palavraDRAW
) ouDY = -5 : DRAW 0,DY
causam erro de parâmetro ilegal. UNPLOT
,UNDRAW
- Como
PLOT
eDRAW
, mas apagam ao invés de desenhar. SET
exprNx,
exprNy- Muda a coordenada armazenada do último ponto desenhado, sem desenhar nada.
Som
TEMPO
exprN1,
exprN2,
exprN3- exprN1 (0‒255) define o período do envelope do canal; exprN2 (0‒3) define o compasso do canal; exprN3(1‒3) informa qual canal está sendo configurado.
SOUND
exprN1,
exprN2,
exprN3-
Toca uma nota; exprN1 (0‒255) seleciona a nota (ver valores válidos no Manual do BASIC); exprN2 (0‒255) indica a duração da nota; exprN3 (1‒3) informa o canal em que a nota soará.
Atenção: Se se emitir uma instrução
SOUND
sem ter configurado o canal comTEMPO
, o computador travará.
Instruções utilitárias
CLEAR
[ exprN1 [,
exprN2 ] ]- Apaga todas as variáveis. Se exprN1 for especificado, define o tamanho da área de armazenamento de cadeias. Se exprN2 for especificado, define o limite superior dessa área. A RAM depois desse endereço fica livre para ser usada pelo usuário para
POKE
s e programas em linguagem de máquina, sem risco de ser invadido pelo crescimento do programa BASIC, suas variáveis ou pilha do Z80. Quando o computador com 16KiB de RAM é ligado, a situação é tal como se tivesse sido emitido o comandoCLEAR 512,16127
: Há 512 bytes de área para cadeias ($3D00–$3EFF, 15616–16127); e depois 256 bytes até o fim da RAM ($3F00–$3FFF, 16128–16383) livres para o usuário. PEEK(
exprN)
- (Função.) Valor do endereço de memória exprN (0–65535).
POKE
exprN1,
exprN2- Armazena o valor exprN2 (0–255) no endereço de memória exprN1 (0–65535).
CALL
end- Executa a rotina em linguagem de máquina começando no endereço de memória end (0–65535).
USR(
exprN)
- (Função.) Passa um argumento a uma rotina do usuário em linguagem de máquina. Antes é preciso colocar o endereço do início da rotina nos endereços $0304 e $0305 (772 e 773), o que deve ser feito com
POKE
s já que o MC1000 não tem uma instruçãoDEFUSR
. O parâmetro exprN estará disponível em $03BF–$03C2 (4 bytes), e o valor colocado aí será o valor de retorno da função. FRE(
exprN)
- (Função.) Quantidade de memória livre para crescimento do programa BASIC, variáveis e matrizes. O valor da expressão exprN é irrelevante.
FRE(
exprC)
- (Função.) Compacta a área de cadeias de caracteres e retorna a quantidade de memória livre para cadeias de caracteres. O valor da expressão exprC é irrelevante.
TRO N
- Ativa a exibição dos números de linha de cada instrução executada, para depuração do programa.
TRO F
- Desliga a exibição dos números de linhas.
DEBUG
- Executa um programa monitor para criação e depuração de programas em linguagem de máquina. (Ver Manual do BASIC.)
EXIT
- Reinicia o interpretador BASIC.
Nenhum comentário:
Postar um comentário