BASIC

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.

DIM var [ , ... ]

Além de matrizes, DIM também pode declarar variáveis. Variáveis declaradas ou atribuídas mais cedo são localizadas e acessadas mais rapidamente. Declarar primeiro as variáveis de uso mais frequente pode trazer um ganho de desempenho.

[ 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. (exprN1exprN2)

exprN1 >= exprN2 ou exprN1 => exprN2

É maior ou igual a. (exprN1exprN2)

exprN1 <> exprN2 ou exprN1 >< exprN2

É diferente de. (exprN1exprN2)

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:

exprN1 OR exprN2

Para cada par correspondente de bits dos operandos:

NOT exprN

Para cada bit do operando:

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 )

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 matrizes 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 exprN GOTO 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 exprN THEN 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 exprN THEN lin

IF exprN GOTO lin

Sintaxes abreviadas alternativas para IF exprN THEN GOTO lin.

FOR varN = exprN1 TO 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 exprN GOSUB 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 o resultado das instruções de impressão (PRINT, LIST) será exibido 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 (;) é 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, ocorre uma quebra de linha e o cursor vai para o início da linha seguinte. No lugar de uma expressão pode-se usar uma das cláusulas:

TEXT

Entra no modo de texto e limpa a tela. Reativa o piscamento do cursor que é desativado nos modos gráficos. Não muda a posição do cursor.

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:

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 a DRAW -(4-3),0 ou DRAW -1,0, e não a DRAW -7,0 como se esperaria. De fato, a instrução não aceita parâmetros negativos. Instruções como DRAW (-1),0 (o sinal de menos não é reconhecido como parte da sintaxe porque não vem imediatamente após a palavra DRAW) ou DY = -5 : DRAW 0,DY causam erro de parâmetro ilegal.

UNPLOT, UNDRAW

Como PLOT e DRAW, 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 com TEMPO, o MC1000 travará.

Instruções utilitárias

CLEAR [ exprN1 [ , exprN2 ] ]

Apaga todas as variáveis e matrizes. 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 POKEs 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 comando CLEAR 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.

Nota: CLEAR também anula laços FOR não concluídos e chamadas GOSUB que ainda não atingiram o RETURN correspondente.

PEEK( exprN )

(Função.) Valor numérico (0–255) armazenado no 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 POKEs já que o MC1000 não tem uma instrução DEFUSR. 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.