Programação com Integer BASIC
Programação com Integer BASIC
Um pouco da história do Integer BASIC
No último ano do ensino médio, o professor de eletrônica de Steve Wozniak providenciou para que os principais alunos da turma tivessem vagas em empresas de eletrônicos locais. Wozniak foi enviado para Sylvania onde programou em FORTRAN em um IBM 1130.
Alguns anos depois, Wozniak estava trabalhando na Hewlett-Packard (HP) executando simulações de projetos de chips e layout lógico para calculadoras. Por aproximadamente $ 100.000, pode-se construir uma máquina razoavelmente equipada que pode suportar entre 16 e 32 usuários executando programas BASIC. A HP seguiu isso com o HP 9830, uma máquina do tamanho de um desktop por US$ 10.000 que também executava o BASIC, ao qual Wozniak tinha acesso.
Em janeiro de 1975, o Altair 8800 foi anunciado e desencadeou a revolução do microcomputador. Em março, Wozniak participou da primeira reunião do Homebrew Computer Club e começou a formular o projeto de seu próprio computador. Um dos softwares mais importantes para o Altair, e um dos mais pirateados, foi o Altair BASIC da recém-formada Microsoft. Wozniak concluiu que sua máquina teria que ter um BASIC próprio, que seria, esperançosamente, o primeiro para o processador MOS 6502. Como a linguagem precisava de 4 kB de RAM, ele fez disso a memória mínima para o projeto.
As rAs referências de Wozniak para BASIC eram uma cópia de 101 BASIC Computer Games e um manual do HP BASIC. Ele não sabia que o BASIC da HP era muito diferente da
versão DEC BASIC usada em 101 Games, que também era a base do Microsoft BASIC para o Altair.
Com base nessas fontes, Wozniak começou a esboçar a sintaxe para a linguagem. O projeto inicialmente incluía suporte para números de ponto flutuante, mas na esperança de conseguir publicar o primeiro BASIC para o 6502 e se tornar "uma estrela", ele decidiu abandonar o ponto flutuante e escrever um sistema apenas com números inteiros para economizar algumas semanas de tempo de programação.
Wozniak mais tarde descreveria sua linguagem como "destinada principalmente a jogos e usos educacionais".
Referindo-se à linguagem durante todo o desenvolvimento como "GAME BASIC", Wozniak escreveu o código à mão, traduzindo as instruções do código assembler em seus equivalentes de código de máquina e, em seguida, enviando o resultado para seu computador. Sem nenhum treinamento sobre como escrever uma linguagem de computador, ele usou sua experiência em calculadoras HP para implementar uma máquina de pilha para interpretar expressões. Uma vez que as rotinas básicas estavam funcionando, ele trabalhou nos outros comandos um por um, de forma modular. A cada visita ao clube Homebrew, ele demonstrava mais alguns recursos adicionados no último mês.
Nos anúncios do início de 1976 para seu computador Apple I, a Apple Inc fez as afirmações de que "nossa filosofia é fornecer software para nossas máquinas gratuitamente ou a um custo mínimo" e "sim pessoal, o Apple BASIC é gratuito". Isto foi impresso logo após a infame Carta Aberta de Bill Gates aos Hobbyists que sugeria que as pessoas o estavam roubando e copiando versões do Altair BASIC.
Wozniak ajudou Jobs, que trabalhava para a Atari, a reformular o jogo Breakout. Em algum momento posterior, ele decidiu ver se alguém poderia escrever o jogo em BASIC. Ele adicionou comandos para ler controladores paddle, em uma série de rápidas edições, teve uma versão do jogo em funcionamento. Para melhorar sua jogabilidade, ele adicionou um alto-falante para fazer cliques quando a bola batesse nas coisas. Ao mostrá-lo a Steve Jobs, Wozniak demonstrou que poderia mudar rapidamente as cores que seu jogo usava, apenas alterando o código-fonte. Wozniak escreveu mais tarde que havia provado que "o software era muito mais flexível que o hardware" e que ele e Jobs perceberam que "agora, qualquer um poderia criar jogos de arcade sem ter que projetá-lo em hardware"./>
Wozniak completou uma biblioteca de ponto flutuante para o 6502 e a publicou na edição de agosto de 1976 do Dr. Dobb's. Esta biblioteca foi posteriormente incluída nas ROMs do Apple II. Wozniak começou a trabalhar no back-porting do código de ponto flutuante para o Apple BASIC, mas se desviou na tarefa para projetar um controlador de disquete para o que se tornou o Disk II. Mike Markkula disse que a empresa iria à Consumer Electronics Show em Las Vegas se o sistema de disco estivesse pronto a tempo. Então Wozniak e Randy Wigginton trabalharam nele sem parar durante as férias de 1977.
QuanQuando voltou ao tópico de ponto flutuante no BASIC, Jobs reclamou que estava demorando muito. Sem Wozniak estar ciente, a Apple já havia conseguido uma licença com a Microsoft para receber sua versão 6502 recém-concluída do código Altair. Examinando o código da Microsoft, Wozniak decidiu que era mais fácil adicionar suporte gráfico ao código do que adicionar ponto flutuante ao seu próprio BASIC, já que o posterior exigia correção manual do código da máquina original enquanto o da Microsoft era escrito em assembler e mais facilmente modificado.
O desenvolvimento do BASIC da Apple terminou e se tornou o Applesoft BASIC. Wozniak observou mais tarde: "Minha maior decepção foi para as terríveis funções de string como LEFT$(VAR, 5) e MID$(VAR2,5,3) em vez das minhas".
Quando o Apple II foi lançado no verão de 1977, o Integer BASIC foi fornecido em ROM, enquanto o Applesoft BASIC foi enviado em cassete. Com o lançamento do Apple II Plus em 1979, ocorreu a troca e o Applesoft foi fornecido em ROM.
Edição do programa
Como a maioria das implementações BASIC da época, o Integer BASIC trabalha tanto como o interpretador de linguagem quanto como o ambiente de edição de linha. Quando o BASIC estava em execução, um prompt de comando ">" era exibido onde o usuário podia inserir instruções.
No Apple 1, ao contrário dos outros computadores domésticos, ele iniciava no modo monitor e não no ambiente BASIC. Para iniciar o BASIC era necessário pressionar Ctrl+B + Return.
As instruções que são inseridas com números iniciais são armazenadas como um progrma para "execução adiada", e podem ser novas linhas ou substituindo qualquer uma que tenha o mesmo número anteriormente. Os números de linha podem ser de 0 a 32767, e as linhas podem conter até 128 caracteres de comprimento.
As instruções que são inseridas sem um número de linha são executadas imediatamente.
Integer BASIC também incluiu o comando AUTO, para inserir automaticamente números de linha partindo de um número inicial, como em AUTO 100, adicionando 10 ao último número a cada nova linha. AUTO 300,5 começaria a numerar na linha 300 com incrementos de 5; 300, 305, etc. A numeração automática é desativada digitando MAN.
Uma característica interessante do editor era que uma seção da tela poderia ser reservada como a "janela", onde as atualizações ao vivo aconteciam. Esta era normalmente a tela inteira, mas poderia ser limitada a uma área menor inserindo valores POKE nos locais de memória 32 a 35. Este recurso poderia ser usado para criar uma área de texto editável enquanto o resto da tela estava no modo gráfico.
Depuração
Como na maioria dos BASICs, os programas são iniciados com o comando RUN e, como era comum, podiam ser direcionados para um número de linha específico, como RUN 300. A execução pode ser interrompida a qualquer momento usando Ctrl+ C e continuada com o comando CON, ao contrário do comando mais típico CONT.
Para execução passo a passo, a instrução TRACE pode ser usada no prompt de comando ou colocada dentro do próprio programa. Quando ativado, os números de linha são impressos para cada linha executada pelo programa. O recurso pode ser desativado novamente com NOTRACE.
Um recurso um tanto incomum foi o comando DSP (para "exibir"). Quando encontrado em um programa, a partir desse ponto, qualquer alteração no valor de uma variável seria exibida. Por exemplo, DSP X exibe o valor de X toda vez que for alterado, junto com o número da linha em que a alteração ocorreu. Assim como no TRACE, o DSP foi desligado com NODSP.
Matemática
Integer BASIC, como o próprio nome indica, usa inteiros como base para seu pacote matemático. Estes são armazenados internamente como um número de 16 bits, little-endian (como é o 6502). Isso permite um valor máximo para qualquer cálculo entre -32767 e 32767; embora o formato também possa armazenar o valor -32768, o BASIC não pode exibir esse número. Os cálculos que resultaram em valores fora desse intervalo produziram um ERR >32767.
Operadores incluídos +(adição), -(subtração), *(multiplicação), /(divisão), MOD (resto) e expoente usando o caractere ^.
Operadores binários incluídos AND, OR e NOT. As comparações binárias incluem o conjunto padrão de operadores: =, >, <, >=, <=, <> e o (inspirado no HP) #, que é equivalente a <>.
Apenas arrays unidimensionais eram permitidos, limitados em tamanho apenas pela memória disponível. As funções matemáticas eram escassas; apenas ABS (valor absoluto), SGN (sinal) e RND (número aleatório) foram suportados.
No caso da função RND, em contraste com as versões derivadas da Microsoft, onde o parâmetro era ignorado e RND sempre retornava um valor 0..<1, o Integer BASIC utiliza o efetivamente o parâmetro. Exemplo: RND(6) retorna um inteiro de 0 a 5.
Strings
A manipulação de string do Integer BASIC foi baseada no sistema no HP BASIC. Isso tratava as variáveis de string como matrizes de caracteres que precisavam ser dimensiondas antes antes do uso. Isso é semelhante ao modelo em C ou Fortran 77. Isso contrasta com os BASICs do tipo Microsoft, onde as strings são um tipo intrínseco de comprimento variável.
Antes das versões BASIC do Microsoft se tornarem o padrão de fato, esse estilo não era incomum; North Star BASIC e Atari BASIC usaram o mesmo conceito, assim como outros.
Strings em Integer Basic usavam uma quantidade fixa de memória, independentemente do número de caracteres usados dentro delas, até um máximo de 255 caracteres. Isso tinha a vantagem de evitar a necessidade de coleta de lixo do heap que era notoriamente lento no BASIC Micosoft, mas significava que as strings menores que o comprimento declarado eram desperdiçadas.
O acesso à substring foi fornecido por meio da sintaxe de fatiamento de matriz. Por exemplo, PRINT A$(0,5) imprime os primeiros seis caracteres de A$, caracteres de 0 a 5. A concatenação foi fornecida usando o mesmo sistema, A$(5)="ABC" substituindo quaisquer caracteres começando na posição 5 pela string "ABC".
Isso contrasta com a manipulação de strings no estilo DEC/Microsoft, que usa funções de string como MID$ para acessar substrings e + para concatenação.
Como muitos dos recursos que seriam fornecidos por funções de string foram fornecidos pelo fatiamento de array, a seleção de funções de string foi reduzida. LEN retorna o comprimento de uma string e ASC retornou o código numérico ASCII para a primeira letra em uma string. Faltava um equivalente do CHR$ que retornava o caractere ASCII com um determinado código numérico.
Gráficos e som
Quando lançado, o único controlador de jogo para a Apple era o controlador paddle, que tinha dois controladores em um único conector. A posição do controlador pode ser lida usando a função PDL, passando o número do controlador, 0 ou 1, como em A=PDL(0):PRINT A, retornando um valor entre 0 e 255.
As máquinas da Apple não incluíam hardware de som dedicado, apenas um simples "bipe". A produção de sons é realizada pela instrução PEEK numa localização mapeada da memória do alto-falante, -16336. Uitilizando o PEEK repetidamente com esse valor produzia tons, e o manual sugeria usar uma expressão matemática para fazer isso, como S=PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336)-PEEK(-16336).
O suporte para gráficos foi mais detalhado. O modo gráfico é ativado com a instrução GR e desativado com TEXT. O desenho normalmente começava com a emissão de um comando para mudar a cor, o que era feito definindo uma pseudo-variável COLOR. Para mudar a cor para verde claro, COLOR=12.
Para produzir um único ponto na tela, utiliza-se a instrução PLOT. Para desenhar um ponto na linha 10 e coluna 10, PLOT 10,10. Para desenhar uma linha horizontal na linha 20, HLIN 0,39 AT 20. Para desenhar uma linha vertical mais curta na coluna 7, VLIN 5,15 AT 7.
Para saber qual a cor de um ponto na tela, utiliza-se A=SCRN X,Y,onde X é a linha e Y a coluna da tela.
Nomes de variáveis
Onde Dartmouth BASIC e HP-BASIC limitaram os nomes de variáveis a no máximo dois caracteres (uma única letra ou uma letra seguida por um dígito) e onde o MS-BASIC permitiu uma letra seguida por uma letra ou dígito opcional (ignorando os caracteres subsequentes), o Integer BASIC era incomum no suporte a qualquer nome de variável de comprimento (por exemplo, SUM, GAMEPOINTS, PLAYER2). A única ressalva era que os nomes das variáveis não podiam conter palavras reservadas; por exemplo, THISCOLOR e COLORFUL eram nomes de variáveis inválidos porque continham a palavra-chave COLOR, um comando do sistema. Além disso, as linhas eram limitadas a 128 caracteres, portanto, os nomes das variáveis não podiam exceder esse comprimento.