Programação com Applesoft BASIC



Apple II
Programação com Applesoft BASIC



Um pouco da história do Applesoft BASIC

Quando Steve Wozniak escreveu Integer BASIC para o Apple II, ele não implementou suporte para matemática de ponto flutuante, porque estava interessado principalmente em escrever jogos, uma tarefa para a qual os inteiros sozinhos eram suficientes.

Em 1976, a Microsoft desenvolveu o Microsoft BASIC para a tecnologia MOS 6502, mas na época não havia nenhum computador de produção que o utilizasse. Ao saber que a Apple tinha uma máquina 6502, a Microsoft perguntou se a empresa estava interessada em licenciar o BASIC, mas Steve Jobs respondeu que a Apple já tinha uma versão.

O Apple II foi apresentado ao público na West Coast Computer Faire em abril de 1977 e ficou disponível para venda em junho. Uma das reclamações mais comuns dos clientes sobre o computador era a falta de matemática de ponto flutuante do BASIC.

Tornando as coisas mais problemáticas, o computador pessoal rival Commodore PET tinha um interpretador BASIC com capacidade de ponto flutuante desde o início. Como Wozniak - a única pessoa que entendia o Integer BASIC bem o suficiente para adicionar recursos de ponto flutuante - estava ocupado com a unidade e o controlador Disk II e com o DOS do Apple, a Apple recorreu à Microsoft.

A Apple supostamente obteve uma licença de oito anos para o Applesoft BASIC da Microsoft, por uma taxa fixa de US$ 31.000, renovando-a em 1985 por meio de um acordo que deu à Microsoft os direitos e o código-fonte para a versão Macintosh do BASIC da Apple.

O Applesoft foi projetado para ser compatível com Integer BASIC e usa o núcleo da implementação BASIC 6502 da Microsoft, que inclui o uso do comando GET para detectar pressionamentos de tecla e não exigir espaços nas linhas do programa.

Embora o Applesoft BASIC seja mais lento que o Integer BASIC, ele possui muitos recursos que o BASIC mais antigo não possui:
      - Strings atômicas: Uma string não é mais um array de caracteres (como em Integer BASIC e C ); em vez disso, é um objeto coletado por lixo (como em Scheme e Java ). Isso permite arrays de strings; cria uma matriz de onze variáveis ​​de string numeradas de 0 a 10. DIM A$(10);
      - Arrays multidimensionais (números ou strings);
      - Variáveis ​​de ponto flutuante de precisão simples com um expoente de 8 bits e um significado de 31 bits e
            recursos matemáticos aprimorados, incluindo trigonometria e funções logarítmicas;
      - Comandos para gráficos de alta resolução;
      - Instruções DATA, com comandos READ e RESTORE, para representar valores numéricos e de string em quantidade;
      - Funções CHR$, STR$, e VAL para conversão entre tipos de string e numéricos (ambos os idiomas tinham a função ASC);
      - Funções definidas pelo usuário: funções simples de uma linha escritas em BASIC, com um único parâmetro;
      - Captura de erros: permitindo que programas BASIC lidem com erros inesperados por meio de sub-rotinas
            escritas em BASIC.

Por outro lado, o Applesoft não possui o operador MOD (restante) do Integer BASIC.

Adaptar o BASIC para o Apple II foi um trabalho tedioso, pois a Apple recebeu uma listagem de fontes do Microsoft BASIC 6502 que provou ser bugada e também exigiu a adição de comandos Integer BASIC.

Como a Apple não tinha o montador 6502 disponível, a equipe de desenvolvimento foi forçada a enviar o código-fonte pelas linhas telefônicas para a Call Computer, uma empresa que oferecia serviços de compilador.

Este foi um processo extremamente tedioso e lento e depois que a Call Computer perdeu o código-fonte devido a um mau funcionamento do equipamento, um dos programadores, Cliff Huston, usou seu próprio computador IMSAI 8080 para montar o fonte do Applesoft BASIC.

Limitações

Em vários modelos iniciais do Apple II, o Applesoft BASIC não suportava o uso de letras minúsculas em programas, exceto em strings. PRINT é um comando válido, mas 'print' resulta Print em um erro de sintaxe.

O Applesoft não possui vários comandos e funções comuns à maioria dos interpretes Microsoft BASIC (não 6502), como:
      - INSTR (procure por uma substring em uma string)
      - PRINT USING (formatar números na saída impressa)
      - INKEY$ (verifique se há um pressionamento de tecla sem interromper o programa; embora um PEEK para o local $C000
            alcance essa ação)
      - LPRINT (saída para uma impressora em vez da tela)

O Applesoft não possui comandos para manipulação de arquivos ou discos, exceto para salvar e carregar programas via fita cassete. O sistema operacional de disco Apple II, conhecido simplesmente como DOS, aumenta os comandos na linguagem para fornecer tais habilidades.

Apenas as duas primeiras letras dos nomes das variáveis ​​são significativas. Por exemplo, "LOW" e "LOSS" são tratados como a mesma variável, e tentar atribuir um valor a "LOSS" substitui qualquer valor atribuído a "LOW".
Um programador também deve evitar letras consecutivas que são comandos ou operações do Applesoft. O nome "SCORE" para uma variável é interpretado como contendo o OR operador booleano, renderizado como SC OR E.
"BACKGROUND" contém GR, o comando para invocar o modo gráfico de baixa resolução e resulta em um erro de sintaxe.

Som e gráficos

O único suporte de som é a opção de um caractere de campainha PRINT ASCII, para soar o bipe de alerta do sistema e um comando que faz clicar no alto-falante.
A linguagem não é rápida o suficiente para produzir mais do que um zumbido de barítono a partir de cliques repetidos. Os programas podem, no entanto, armazenar uma rotina de linguagem de máquina a ser chamada para gerar tons musicais eletrônicos abrangendo várias oitavas.

O Applesoft suporta a exibição gráfica de baixa resolução (Lores), onde 40 pixels de cor horizontalmente e até 48 verticalmente, podem ser exibidos em 16 cores, e o modo de alta resolução (Hires) de 280 por 192 pontos.
Existem comandos para plotar pixels e desenhar linhas horizontais e verticais em Lores. Hires permite desenhar pixels e linhas através de comandos.

As tabelas de formas baseadas em vetores podem ser usadas para desenhar objetos apenas em modo Hires. Eles consistem em linhas horizontais e verticais, e formas inteiras podem ser dimensionadas para tamanhos maiores e giradas em qualquer ângulo.
Nenhuma disposição existe para misturar texto e gráficos, exceto as quatro linhas de texto do Apple na parte inferior de uma tela gráfica.

Já no Apple IIe, foram adicionadas duas novas resuloções chamadas de "dupla resolução", podendo ser duplo Lores (DGR) ou duplo Hires (DHGR). Ficou disponível em máquinas com 64Kb de memória e pelo menos 1Kb no slot de expansão Auxiliar.
Esse modo basicamente duplica a resolução original, e inclui todas as 16 cores da paleta de Lores. O Applesoft não oferece suporte direto para estes modos. Deve ser utilizada rotina em linguagem de máquina. Os modos específicos do Apple IIgs também não são suportados.



Guia rápido do Applesoft BASIC



Controle de Variáveis

CLEAR
     Apaga toas as variáveis em memória

[LET] var = expr
     Atribui um conteúdo para uma variável

DIM var( tam [, tam ...] ) [, var( tam [, tam ...] ) ...]
     Alocar array(s) com determinada(s) dimensão(ões)

DEF FN nome(var) = aexpr
     Definir uma função de uma única variável


Controle de Fluxo

GOTO numLinha
     Ir para o número da linha

GOSUB numLinha
     Ir para a sub-rotina no número da linha. Retorna para a próxima linha que chamou.

RETURN
     Retorno da sub-rotina

ON aexpr GOTO numLinha [, numLinha ...]
     Desvia execução do programa BASIC para as linhas baseada no índice (valor = 1, 2, ...)

ON aexpr GOSUB numLinha [, numLinha ...]
     Desvia execução do programa BASIC para as linhas das sub-rotinas com base no índice (valor = 1, 2, ...)

POP
     Converta o último GOSUB em um GOTO

FOR var = aexpr TO aexpr [ STEP aexpr ]
     Loop com variável de contador

NEXT [ var [, var ...] ]
     Fim do(s) loop(s)

IF expr THEN declaração
IF expr GOTO numLinha

     Condicional; se expr for falso, o resto da linha é ignorado

END
     Encerre o programa de forma limpa

STOP
     Para a execução do programa BASIC, como se tivesse ocorrido um erro


Manipulação de Erros

ONERR GOTO linenum
     Define tratamento de erros para a linha

RESUME
     Tenta executar a última linha que causou erro em ONERR GOTO


Entrada/saída de texto

PRINT expr [ [;,] expr ... ] [;]
     Texto de saída. [;] concatena, [,] avança para a próxima parada de tabulação. Um [;] suprime a quebra de linha.
     [expr] pode incluir avançar por vários espaços SPC (aexpr) ou avançar para a coluna TAB(aexpr).

INPUT [string ;] var [, var ...]
     Leia a linha de entrada delimitada por vírgulas, com prompt opcional

GET var
     Ler uma tecla do teclado

HOME
     Limpa a tela texto

HTAB aexpr
     Posicione o cursor de texto horizontalmente (coluna 1...40 ou 1...80)

VTAB aexpr
     Posicione o cursor de texto verticalmente (linha 1...24)

INVERSE
     Defina o modo de saída para preto sobre branco

FLASH
     Defina o modo de saída para intermitente (piscante)

NORMAL
     Defina o modo de saída para branco sobre preto

TEXT
     Muda para o modo texto. Não limpa a tela


Gráficos de baixa resolução

GR
     Defina a exibição para o modo gráfico de baixa resolução/misto com texto ("Lo-res") e limpa a tela

COLOR= aexpr
     Define a cor a ser utilizada (0...15)

PLOT aexpr, aexpr
     Desenha um ponto (bloco em Lo-res) (x = 0...39, y = 0...39/47)

HLIN aexpr, aexpr AT aexpr
     Desenha uma linha horizontal (colunas x1, x2 at y)

VLIN aexpr, aexpr AT aexpr
     Desenha uma linha vertical (linhas y1, y2 at x)


Gráficos de alta resolução

HGR
     Defina a exibição para o modo gráfico de alta resolução/misto com 4 linhas de texto ("Hi-res") e limpa a tela

HGR2
     Defina a exibição para o modo gráfico de alta resolução 2/sem texto ("Hi-res") e limpa a tela

HPLOT [TO] aexpr, aexpr [ TO aexpr, aexpr ] ...
     Desenha um ponto/linha (x=0...279, y=0...191)

HCOLOR= aexpr
     Define a cor a ser utilizada (0...7)


Dados em série

DATA valor [, valor ...]
     Define dados em série. Valores podem ser literais (strings sem aspas), strings ou números

READ var [, var ...]
     Leia o próximo valor da série DATA

RESTORE
     Recomeça a leitura dos dados de DATA, posicionando no primeiro valor.


Diversos

REM [comentario]
     Inicia um comentário. O restante da linha é ignorado.

TRACE
     Ativa o modo "trace" (imprime o número da linha que foi executada)

NOTRACE
     Desativa o modo "trace"


Tabela de figuras em alta resolução (Hi-Res Shape)

ROT= aexpr
     Define o ângulo (rotação) da figura na tabela (0...63)

SCALE= aexpr
     Define o tamanho (escala) da figura na tabela (1...255)

DRAW aexpr [ AT aexpr, aexpr ]
     Desenha a figura da tabela na cor atual

XDRAW aexpr [ AT aexpr, aexpr ]
     Desenha a figura da tabela na cor atual, com lógica XOR nos bits de definição


Comandos do Interpretador e Estado do Programa BASIC

CONT
     Continuar a execução do programa BASIC na próxima linha após o comando STOP

DEL
     Apaga linhas de um programa na memória

LIST [ numLinha [, numLinha ] ]
     Listar linhas de um programa

NEW
     Apaga da memória o programa atual e suas variáveis

RUN [ numLinha ]
     Inicia a execução do programa na linha


Comandos Interativos Diretos

HIMEM: aexpr
     Define o limite superior da memória para variáveis

IN# aexpr
     Direciona entrada direta do slot

LOMEM: aexpr
     Define o limite inferior da memória para variáveis

SPEED= aexpr
     Altera a velocidade de escrita de caracteres na tela texto. Padrão é 255. (1....255)

WAIT aexpr1, aexpr2 [, aexpr3]
     Aguarde até que a localização da memória mascarada pelo aexpr2 seja igual ao aexpr3 (ou zero)


Operações com Fita Cassete

LOAD
     Carrega um programa da fita cassete

RECALL
     Carrega variáveis de memória da fita cassete

SAVE
     Grava o programa atual da memória na fita cassete

STORE
     Grava as variáveis de memória atual na fita cassete

SHLOAD
     Carrega da fita cassete uma figura na tabela de figuras de alta resolução


Manipulação Direta na Memória

PEEK( posMem )
     Retorna o valor de uma posição de memória

     PEEK(32) — borda esquerda da janela de texto
     PEEK(33) — largura da janela de texto
     PEEK(34) — borda superior da janela de texto
     PEEK(35) — parte inferior da janela de texto
     PEEK(36) — posiciona o cursor na coluna n
     PEEK(37) — posiciona o cursor na linha n
     PEEK(78) & PEEK(79) — Campo de número aleatório
     PEEK(222) — Último código de erro
     PEEK(230) — Página Hi-Res em uso (32 = página 1, 64 = página 2)
     PEEK(49152) ou PEEK(-16384) — Lê o teclado
     PEEK(49168) ou PEEK(-16368) — limpa buffer do teclado
     PEEK(49178) ou PEEK(-16358) — Se está em modo texto (> 127) ou modo gráfico (< 128)
     PEEK(49179) ou PEEK(-16357) — Se está em modo mixado (4 linhas de texto) (> 127) ou tela cheia (< 128)
     PEEK(49180) ou PEEK(-16356) — Se está na página 2 (> 127) ou página 1 (< 128)
     PEEK(49181) ou PEEK(-16355) — Se está em modo Hi-res (> 127) ou modo Lo-res (< 128)
     PEEK(49182) ou PEEK(-16354) — Se possui modo mousetext (> 127)
     PEEK(49183) ou PEEK(-16353) — Se está em modo 80-colunas (> 127)
     PEEK(49200) ou PEEK(-16336) — gera um click no alto-falante
     PEEK(49248) ou PEEK(-16288) — lê botão do Paddle #3
     PEEK(49249) ou PEEK(-16287) — lê botão do Paddle #0
     PEEK(49250) ou PEEK(-16286) — lê botão do Paddle #1
     PEEK(49251) ou PEEK(-16285) — lê botão do Paddle #2

POKE posMem, valor
     Muda o valor da posição de memória

     POKE 32,n — borda esquerda da janela de texto
     POKE 33,n — largura da janela de texto
     POKE 34,n — borda superior da janela de texto
     POKE 35,n — parte inferior da janela de texto
     POKE 36,n — posiciona o cursor na coluna n
     POKE 37,n — posiciona o cursor na linha n
     POKE 216,n — sinalizador ONERR (n < 128 desativa o manipulador ONERR)
     POKE 230,n — Página Hi-Res em uso (32 = página 1, 64 = página 2)
     POKE 49168,0 ou POKE -16368,0 — limpa buffer do teclado
     POKE 49200,0 ou POKE -16336,0 — vibra o alto-falante (click)
     POKE 49232,0 ou POKE -16304,0 — modo gráfico
     POKE 49233,0 ou POKE -16303,0 — modo texto
     POKE 49234,0 ou POKE -16302,0 — modo gráfico sem linha de texto
     POKE 49235,0 ou POKE -16301,0 — modo gráfico com linhas de texto
     POKE 49236,0 ou POKE -16300,0 — exibe págian Hi-res 1
     POKE 49237,0 ou POKE -16299,0 — exibe págian Hi-res 2
     POKE 49238,0 ou POKE -16298,0 — modo gráfico Lo-res
     POKE 49239,0 ou POKE -16297,0 — modo gráfico Hi-res

CALL posMem
     Executa uma rotina em linguagem de máquina iniciada no endereço

     CALL 54915 ou CALL-10621-limpar a pilha (retirar todas as entradas FOR/NEXT, GOSUB/RETURN, entradas ONERR/RESUME)
     CALL 62248 ou CALL -3288 — retira as entradas da pilha ONERR/RESUME
     CALL 62436 ou CALL -3100 — mostra a página 1 de hi-res
     CALL 62450 ou CALL -3086 — limpar a página de alta resolução atual na cor preto
     CALL 62454 ou CALL -3082 — impar a página de alta resolução atual na cor definida
     CALL 64500 ou CALL -1036 — move cursor para direita
     CALL 64528 ou CALL -1008 — move cursor para esquerda
     CALL 64538 ou CALL -998 — move cursor para cima
     CALL 64578 ou CALL -958 — limpar o texto do cursor até a parte inferior da janela
     CALL 64614 ou CALL -922 — move cursor para baixo
     CALL 64668 ou CALL -868 — limpar o texto do cursor até o final da linha
     CALL 64780 ou CALL -756 — aguarde o pressionamento de uma tecla
     CALL 65152 ou CALL -384 — defina o modo de texto inverso
     CALL 65156 ou CALL -380 — defina o modo de texto normal

PR# numSlot
     Saída direta para o slot
     PR#0 — set 40 column mode
     PR#3 — set 80 column mode



Funções

Funções Numéricas

ABS( aexpr )
     Valor absoluto do número

ATN( aexpr )
     Arcotangente do número

COS( aexpr )
     Cosseno do número

EXP( aexpr )
     Expoente do número

INT( aexpr )
     Parte inteira do número

LOG( aexpr )
     Log natural do número

RND( aexpr )
     Gerador de números pseudo-aleatórios. Se aexpr for
     positivo, retorna um número aleatório de 0 a 0,999.... Se aexpr for
     zero, repete o último resultado. Se aexpr for negativo, propaga novamente o gerador.

SGN( aexpr )
     Sinal do número (-1, 0, 1)

SIN( aexpr )
     Seno do número

SQR( aexpr )
     Raiz quadrada do número

TAN( aexpr )
     Tangente de número


Funções com String

LEN( sexpr )
     Quantida de caracteres na string

LEFT$( sexpr, aexpr )
     Parte esquerda da string (string, tamanho)

MID$( sexpr, aexpr [, aexpr] )
     Parte de uma string (string, posição inicial, comprimento)

RIGHT$( sexpr, aexpr )
     Parte direita da string (string, tamanho)


Funções de Conversão de Tipo

ASC( sexpr )
     Código ASCII para o primeiro caractere da string

CHR$( aexpr )
     Mostra o caracter do código informado

STR$( aexpr )
     Representação String de um número

VAL( sexpr )
     Transforma uma string numérica em número


Funções de Interação do Sistema

FRE( aexpr )
     Limpeza de valores de strings liberadas na memória (retorna 0)

PDL( aexpr )
     Posição do Paddle (número do paddle)

POS( aexpr )
     Posição horizontal (coluna) cursor na tela

SCRN( aexpr, aexpr )
     Cor do ponto em Lo-res na posição (x,y) [4]

USR( aexpr )
     Executa rotina em linguagem de máquina, retornando o valor do acumulador


Funções definidas pelo usuário

FN nome( expr )
     Executar função definida pelo usuário



Operadores

Operadores de Comparação

=
     Igualdade

<
     Menor que

>
     Maior que

<= =<
     Menor ou igual

>= =>
     Maior ou igual

<> ><
     Não igual


Operadores Booleanos

AND
     Conjunção

OR
     Disjunção

NOT
     Negação


Operadores Aritméticos

^
     Exponenciação

*
     Multiplicação

/
     Divisão

+
     Adição

-
     Subtração


Operadores com Strings

+
     Concatenação de String


Precedência de Operadores

Os operadores são listados verticalmente em ordem de precedência, do maior para o menor.
Os operadores na mesma linha têm a mesma prioridade e em uma expressão são executados da esquerda para a direita.
Essa ordem difere da ordem em alguns outros dialetos do BASIC, mas corresponde ao Applesoft.

( )
+ - NOT (operadores unários)
^
* /
+ -
= < > <= =< >= => <> ><
AND
OR


Códigos de Erros

Os códigos de erro podem ser determinados chamando PEEK(222) num manipulador ONERR.

0
     Next without for

16
     Syntax error

22
     Return without gosub

42
     Out of data

53
     Illegal quantity

69
     Overflow

77
     Out of memory

90
     Undefined statement

107
     Bad subscript

120
     Redimensioned array

133
     Division by zero

163
     Type mismatch

176
     String too long

191
     Formula too complex

224
     Undefined function

254
     Re-enter

255
     Break

Copyright © 2012 ~ 2022, Apple2Pro.com.br. Todos os direitos reservados.
#214729