terça-feira, 28 de junho de 2022

Joystick de 11 botões

No funcionamento normal da leitura do teclado/joystick (rotina SKEY?), os pinos de ativação dos conectores (7 e 8) são ativados em momentos diferentes. Se ligarmos os dois pinos a um decodificador, poderíamos distinguir também uma situação em que os dois pinos forem ativados simultaneamente (algo que a rotina SKEY? não faz, mas que uma rotina especial de leitura poderia fazer), e assim poderíamos acrescentar outros cinco botões ao joystick de 6 botões.

Esquemático.

Joystick de 6 botões

Cada conector de joystick do MC1000 está preparado de fábrica para que possa, com um cabo divisor especial, receber dois joysticks. (Vide explicação na página sobre o joystick.) Pode-se, em vez disso, criar um único joystick com seis botões, reaproveitando os cinco comandos reservados para o joystick adicional.

Esquemático.
Protótipo aberto.
Protótipo fechado.

Um gamepad de seis botões da Sega com conector DE-9 pode ser modificado para uso no MC1000. (Os botões “START” e “MODE” ficam sem uso.)

Gamepad de seis botões da Sega.

A ideia do joystick de 6 botões pode até ser estendida para um joystick de 11 botões!

Interface de impressora IP1000

Interface para impressora matricial padrão Centronics. A caixa da interface tem o mesmo formato da EM1000.

Seu acionamento em BASIC era feito através do comando PR# que direciona a saída de texto para a tela, para a impressora ou ambos.

Se for direcionada alguma saída para a impressora e a mesma estiver desconectada ou desligada, o programa permanecerá parado esperando até que esta responda.

Fotos tiradas por Jairo P. dos Santos:

Interface de impressora IP1000 com seu conector.
Abertura lateral da IP1000 expondo o conector IDC-20 para o cabo da impressora.
Pass-through na traseira da IP1000 para conectar outros periféricos.
Placa da IP1000.
Placa da IP1000.
Manual de instruções da IP1000 (lado externo).
Manual de instruções da IP1000 (lado interno).

A pinagem do conector lateral (conector IDC macho de 20 pinos) foi levantada pelo Claudio Henrique Picolo, e está apresentada abaixo. Notem que a numeração da pinagem não é padrão para esse tipo de conector, que normalmente tem os pinos pares de um lado e ímpares do outro. O pino 1 fica para trás e o pino 20 para a frente da IP1000 (o lado que encaixa no micro, com inscrições). O “ACK” da IP1000 se liga ao BUSY da impressora.

Pinagem do conector lateral da iP1000.

O Picolo também corrigiu uma anotação incorreta no esquema da IP1000 e produziu uma imagem mostrando os componentes na placa.

Esquema da IP1000 (corrigido).
Desenho da placa da IP1000.

E também um novo arquivo PDF com o chapeado (vide o arquivo "Chapeado - IP-1000 pprint.pdf" na lista de anexos no fim desta página).

Expansão de memória EM1000

Expansão de memória externa que deixa o MC1000 com 64KiB de RAM.

Fotos de Jair Diniz Miguel — que possui dois exemplares deste item raríssimo:

Expansão de memória EM1000 com seu conector.
Pass-through na traseira da EM1000 para conectar outros periféricos.
EM1000 conectada ao MC1000.
Abertura lateral da EM1000.

Atenção: O exame dos esquemáticos da placa-mãe e da expansão revela que a EM1000 não honra a comutação de bancos entre VRAM e RAM feita por meio da [[porta]] COL32 ($80 / 128). Por um lado, a culpa é da placa-mãe: Ela deveria fornecer pela porta de expansão todos os sinais necessários para que a EM1000 se comportasse como esperado. Note-se que ela corretamente fornece o sinal ~ROMCS que indica que a ROM interna será acessada e que a RAM deve se abster de responder — a EM1000 efetivamente reconhece esse sinal e o obedeçe. Só que o mesmo deveria ser feito com o sinal ~BANK, correspondente ao bit 0 de COL32, mas ele não é oferecido. Deixada sem assistência neste quesito, a EM1000 teria que observar por conta própria as escritas à porta $80 para tentar recriar o valor de ~BANK e se desativar quando necessário, mas isso também não foi feito. Consequentemente, mesmo com a VRAM ativada, a RAM da EM1000 continua respondendo às solicitações de escrita e leitura. Em geral o conteúdo da RAM da EM1000 entre $8000 e $9fff será uma cópia do conteúdo da VRAM.

Uma alternativa à EM1000 é recorrer à mod para aumentar a memória interna do MC1000 para 64KiB.

sábado, 25 de junho de 2022

Gravador de fita cassete

Na lateral esquerda do MC1000 há dois conectores rotulados “EAR” e “MIC”. Na caixa do MC1000 vinham dois pequenos cabos com plugues P2 nas duas pontas para conectar esses jaques aos jaques correspondentes em um gravador de fita cassete. Dados e programas podem ser assim armazenados em e/ou lidos de fitas cassete.

Para uso com o MC1000, a CCE lançou os “data recordersDR1000 e DR1000A, gravadores com ajuste de ganho nos amplificadores para otimizar seu uso para ler e gravar dados. Também tinham odômetros (conta-giros) com botão de reset, para localizar arquivos na fita.

O DR1000 e o DR1000A acompanhavam a identidade visual do MC1000 (linhas cruzadas em grade, "arco-íris" verde-amarelo-vermelho-azul, letras em tipo Microgramma), sendo o DR1000A uma versão mais compacta (slim). Data recorders posteriores da CCE (DR2000 e DR2200) não seguem esse visual. Foram lançados quando a CCE já tinha parado de produzir o MC1000.

Gravador DR1000 da CCE.
Gravador DR1000A da CCE.
Gravador DR2000 da CCE.
Gravador DR2200 da CCE.

Atualmente é comum se usarem outras soluções, como um outro computador moderno gravando e reproduzindo arquivos WAV, ou gravadores digitais.

Atenção: Se o motor do gravador estiver ligado enquanto você digita, o teclado pode apresentar um comportamento inesperado. Isso ocorre porque no MC1000 o conector de entrada de som do cassete (“EAR”) compartilha do mesmo circuito usado pela tecla CTRL.

Joystick

Nas laterais do MC1000 há dois conectores para joysticks compatíveis com o console de vídeo-game Atari 2600 VCS.

A CCE comercializava na época o joystick JS1000, lançado para uso com seu vídeo-game Supergame VG2800 (clone do Atari) e com o MC1000.

Joysticks JS1000 da CCE.

Curiosidade: Apesar de qualquer joystick compatível com Atari 2600 ser compatível com o MC1000, outros periféricos de Atari 2600 podem ter comportamentos estranhos no MC1000, como o Video Touch Pad, em que só a primeira coluna de botões responde como se fossem as teclas H, P, X e 0 no MC1000, qualquer que seja a porta conectada. Evite experimentar controles diferentes dos recomendados para evitar possíveis danos ao seu (hoje raríssimo) MC1000!

Provisão de fábrica para 4 joysticks

Analisando-se a placa-mãe do MC1000, nota-se que ele foi concebido para tratar até quatro joysticks. O joystick padrão Atari recebe um sinal de ativação pelo pino 8 de seu conector DE-9, que é então devolvido pelos pinos 1, 2, 3, 4 (direcionais) ou 6 (botão), conforme o que foi pressionado. Nota-se como a trilha de seleção da primeira linha do teclado (pino 21 do AY-3-8910, “IOA0”) está conectada (linha vermelha) ao pino 8 do segundo joystick (J7); e a trilha de seleção da segunda linha do teclado (pino 20 do AY, “IOA1”) está conectada (linha azul) ao pino 8 do primeiro joystick (J6). Isso responde pelo funcionamento usual de dois joysticks. Mas nota-se também que as triilhas seletoras da terceira e da quarta linha do teclado (pinos 19 e 18 do AY, “IOA2” e “IOA3”) também estão ligados ao pino 7 dos conectores J7 e J6 (linhas laranja e verde).

O sinal do pino 7 é desconsiderado por um joystick padrão Atari. Mas o fato desse sinal estar disponível no conector permite que se use um cabo divisor (devidamente confeccionado) que leve o sinal do pino 7 do conector do MC1000 ao pino 8 de um conector adicional.

Em vez de utilizar um cabo para conectar dois joysticks a cada conector, esta característica do MC1000 pode ser aproveitada para a confecção  de joysticks personalizados com 6 ou até 11 botões!

Correspondência com o teclado

Do modo como o circuito do MC1000 está implementado, mexer nos joysticks equivale a pressionar teclas:

Joystick Cima Baixo Esquerda Direita Botão
A I Q Y 1 9
B H P X 0 @
A (2) K S RETURN 3 ;
B (2) J R Z 2 B

Monitor de vídeo

Por meio do conector lateral “MONITOR” o MC1000 gera sinal vídeo composto preto-e-branco para monitor de vídeo monocromático.

A CCE não fabricou monitores de vídeo acompanhando a identidade visual do MC1000. Havia o monitor MV-12 para o MC4000 Exato.

MC1000 conectado a um monitor monocromático contemporâneo para Apple II. (Foto de Juan Castro.)

A geração de vídeo composto monocromático do MC1000 tem um problema. A imagem começa a se distorcer conforme cresce a quantidade de elementos claros.

Televisor

Por meio do conector lateral “TV”, o MC1000 gera sinal de RF de 75Ω de impedância para televisor colorido (PAL-M) pelo canal 13.

O cabo original de RF que vinha com o MC1000 tinha um balun que casava a impedância do sinal de 75Ω para 300Ω para ser compatível com os antigos conectores parafusados de antena da maioria dos televisores dos anos 80. Atualmente, pode-se fazer um cabo RF de 75Ω com um conector RCA numa ponta e um moderno conector coaxial de RF na outra para usá-lo em televisores modernos sem a necessidade de balun ou casador de impedância.

MC1000 ligado a um minitelevisor de LCD.

sexta-feira, 24 de junho de 2022

Fonte de energia

A fonte de energia original do MC1000 é a Power Supply PS1000. Ela converte a corrente alternada da rede elétrica (há um seletor de voltagem) em corrente contínua de 9V.

É uma fonte simples que usava retificação de meia-onda, com dois diodos. Diretamente da caixinha sai um plugue padrão americano (NEMA 1-15P), sem terra, para conectar à tomada de energia. Da caixa sai também um cabo com um conector P2 macho na ponta, que se conecta à traseira do MC1000.

Fonte PS1000.

Conectores

Eis os conectores presentes na console do MC1000:

Conectores na lateral esquerda do MC1000.

Na lateral esquerda:

  • “EAR”: Conector P2 fêmea para conectar um cabo macho-macho à saida “EAR” de um gravador de fita cassete.
  • “MIC”: Conector P2 fêmea para conectar um cabo macho-macho à entrada “MIC” de um gravador de fitas cassete.
  • “JOYSTICK A”: Conector DE-9 macho para conectar um joystick compatível com o console de vídeo-game Atari 2600 VCS para uso do jogador nº 1.
Conectores na lateral direita do MC1000.

Na lateral direita:

  • “JOYSTICK B”: Conector DE-9 macho para conectar um joystick compatível com o console de vídeo-game Atari 2600 VCS para uso do jogador nº 2.
  • “TV”: Conector RCA com sinal RF para televisor colorido (PAL-M).
  • “MONITOR”: Conector RCA com sinal vídeo composto para monitor de vídeo monocromático.
Conectores na traseira do MC1000.

Na traseira:

  • “9V DC”: Conector P2 fêmea para conectar à fonte de energia.
  • “EXPANSION PORT”: Porta de expansão que expõe parte da placa-mãe do MC1000 e à qual se podem conectar periféricos adicionais como:
    • expansão de memória;
    • interface de impressora;
    • controladora de drives de disquete (vaporware);
    • cartão de 80 colunas (vaporware);
    • interface serial RS-232C (vaporware);
    • placa CP/M (vaporware);
    • leitor de pen drives BlueDrive.

sábado, 18 de junho de 2022

BlueDrive

O BlueDrive foi criado pelo Victor Trucco para que micros clássicos pudessem ler e gravar arquivos em pen drives. Há um vídeo demonstrando o periférico em funcionamento num MC1000 emulado numa placa de desenvolvimento Altera DE1. Como diz o Victor no final do vídeo, "depois de quase 30 anos, finalmente o MC1000 tem um sistema armazenamento de massa".

Nessa primeira versão do sistema operacional do BlueDrive, os comandos disponíveis são:

  • LOAD $ — Lista diretório atual.
  • TLOAD "ARQUIVO.BIN — Carrega e executa programa em linguagem de máquina.
  • LOAD "ARQUIVO.BAS — Carrega programa em BASIC.
  • SAVE "ARQUIVO.BAS — Salva programa em BASIC.
  • LOAD "SUBDIR — Muda para subdiretório.
  • LOAD "* — Muda para diretório raiz.

O formato de arquivo utilizado pelo BlueDrive é o dos arquivos .CAS gerados pelo utilitário para cassete MC1000CasTools: um cabeçalho (composto de nome, endereço de início e endereço de fim) seguido dos dados propriamente ditos. (Uma versão anterior da ferramente gerava esses arquivos com extensão .BIN.)

A implementação dos novos comandos envolve fornecer no periférico uma versão modificada da ROM, onde se examina se o primeiro caracter após um comando SAVE/LOAD/TLOAD é o caracter dólar ou aspas, executando as rotinas apropriadas em caso afirmativo, ou as rotinas originais para cassete em caso negativo.

O primeiro lote de periféricos para o micro real foi produzido em novembro de 2015.

Modificação de hardware necessária

Para funcionar corretamente o BlueDrive precisa de um sinal produzido na placa-mãe que não é disponibilizado pela porta de expansão do MC1000 — o sinal que faz com que o Z80 acesse a ROM a partir do endereço $0000 no momento da inicialização, embora ela normalmente só esteja acessível a partir de $C000. Então é necessário fazer uma intervenção no MC1000: Soldar um fio elétrico por baixo da placa-mãe ligando o pino 5 do chip U29 (SN74LS125AN) com o pino 35 da porta de expansão, que vem de fábrica não conectado, conforme a figura abaixo:

Novos comandos para uma versão futura

Os comandos da versão inicial do sistema operacional do BlueDrive são suficientes para utilizar o software disponível hoje para o MC1000. Mas para uma utilização mais "profissional", seria interessante poder carregar blocos avulsos de memória, por exemplo, para se carregar sprites e fases de um jogo a partir do programa em execução.

uma postagem no Locutório de Ensjo (blog pessoal de Emerson Costa) dedicada ao desenvolvimento de novos comandos para uma versão futura do sistema. Quem tiver sugestões a fazer pode usar o formulário de comentários do blog.

Informações adicionais

  • O BlueDrive não reconhece a troca de pen drives.
  • O MC1000 com BlueDrive só inicializa se houver um pen drive encaixado. Se não, ficará esperando.
  • O slot de cartão SD ao lado do BlueDrive atualmente não tem nenhuma função. Dependeria de reescrever o sistema operacional.
  • O pen drive deve ser formatado com uma partição FAT16 sem flags, sem Master Boot Record (MBR). Windows 7 até suporta FAT16, mas não formata. Uma alternativa é particionar o pen drive no Linux com GParted (GNOME Partition Editor). Convém lembrar que o tamanho de uma partição FAT16 é 4GB. Outro programa é o EaseUS Partition Master.

Ideias para projetos

Abaixo links para projetos existentes para outros computadores, para servir de inspiração.

Cartão de 80 colunas

Interface IDE

sábado, 11 de junho de 2022

Porta de expansão

Pinagem do conector (macho) da porta de expansão do MC1000, da esquerda para a direita:

Baixo Cima
~RD = 26 25 = ~IORQ
~WR = 27 24 = ~MRQ
~BUSAK = 28 23 = ~HALT
~WAIT = 29 22 = ~NMI
~BUSRQ = 30 21 = ~INT
~RESET = 31 20 = D1
~M1 = 32 19 = D0
+9V = 33 18 = ~ROMCS
DSB64 = 34 17 = NC
NC = 35 16 = NC
~RFSH = 36 15 = D7
A0 = 37 14 = D2
A1 = 38 13 = D6
A2 = 39 12 = D5
A3 = 40 11 = D3
A4 = 41 10 = D4
A5 = 42 09 = ϕ (CLOCK)
A6 = 43 08 = A15
A7 = 44 07 = A14
~ROMCE = 45 06 = A13
GND = 46 05 = A8
A9 = 47 04 = A12
CORTE = 48 03 = CORTE
A10 = 49 02 = A11
GND = 50 01 = +5V

A quase totalidade dos pinos estão conectados ao Z80, mas há três sinais próprios do circuito do MC1000:

  • DSB64 — Sinal de entrada. Quando alto, suprime a ativação da RAM interna do MC1000. A expansão de memória EM-1000 mantém este sinal sempre ativo, para que apenas ela sirva a RAM para o MC1000.
  • ~ROMCS — Sinal de entrada. Quando alto, suprime a ativação da ROM interna do MC1000. A placa de CP/M (caso exista) usa este sinal para atender o requisito do sistema operacional de que todo o espaço de endereçamento do Z80 deve estar associado a RAM.
  • ~ROMCE — Sinal de saída. Quando baixo, informa que a circuitaria interna do MC1000 levou em conta o valor do sinal ~ROMCS, o endereço de memória sendo solicitado e outros detalhes, e concluiu que irá ativar e acessar sua ROM interna. A expansão de memória EM-1000 usa este sinal para abster-se de ativar sua RAM ao mesmo tempo que a ROM interna do MC1000. Por isso o MC1000 com 64KiB de RAM normalmente só consegue usar 48KiB ($0000–$BFFF). Os 16 KiB restantes ($C000–$FFFF) são sobrepostos pela ativação da ROM.

Nota: Com a modificação de hardware necessária para utilização do BlueDrive, o pino 35, originalmente não conectado, passa a oferecer o sinal interno que torna a ROM acessível pelo Z80 em $0000 no momento da inicialização.


Em 01/12/2013, Claudio.H.Picolo sugeriu esta forma de fazer um conector para a porta de expansão do MC1000:

  1. Pegue um conector edge ("de borda") fêmea, bem estreito, de 50 vias.
  2. Serre as laterais.

sábado, 4 de junho de 2022

Variáveis do sistema

Divisão padrão da RAM (48 Kbytes) segundo o Manual do BASIC:

$0000–$00FF 0–255 Buffer de execução do programa DEBUG.
$0100–$01FF 256–511 Buffer de execução do Monitor.
$0200–$02FF 512–767 Buffer de linha.
$0300–$03D4 768–980 Buffer de execução do interpretador BASIC.
$03D5–$BCFF 981–48383 Programa fonte BASIC.
$BD00–$BFFF 48384–49151 Stack e matriz do interpretador BASIC.

Nota: Em modo de jogo, as quatro últimas áreas, relacionadas com o BASIC, não existem. Toda a área a partir de $0200 (START) está disponível para o código do jogo e seus dados.


Buffer de execução do programa DEBUG

$0001 / 1
Contém 0. Recebe 1 quando uma instrução SOUND do BASIC é executada e todos os canais estavam silenciosos. Zerado quando o BASIC silencia os canais de música.
$0002 / 2 (SNDSW)
Zerado quando a rotina INTRUP zera todos os canais ao final de uma música.
$0003 / 3 (BYTE E/S ou IOBYTE)
[[Manual de Referência]] (p.24):
No MONITOR, se você usar o subcomando D para exibir alguns dados, esses serão mostrados na tela, no entanto, como listá-los na impressora? Use o subcomando S para examinar o endereço 3; seu valor é 41H. Agora mude o seu conteúdo para qualquer outro dado e use o subcomando D novamente. Os dados aparecem todos no papel.
$000F / 15 (C40?80)
Flag de largura da tela:
  • 0 = 32 colunas
  • ≠ 0 = 80 colunas

[[Manual de Referência]] (p.12):

Chave de 32/80 colunas: quando o conteúdo deste buffer for zero, a tela mostrará 32 colunas, caso contrário o computador estará na modalidade de 80 colunas.

[[Manual de Referência]] (p.24):

Eis aqui o buffer da chave de exibição do vídeo para 32/80 colunas. Quando o conteúdo do endereço 000FH for 0, então a saída do console será em 32 colunas; se o valor for 1, o cartão de 80 colunas está instalado.

Logicamente, você pode mudar o valor de 0 para 1 mas, depois você terá que chamar a sub-rotina ISCN (C021H), caso contrário, a tela apresentará informações incompreensíveis.

$0038 / 56 (3 bytes)
Hook da rotina de interrupção periódica do Z80. Na inicialização é configurada com um salto para a rotina INTRUP ($C55F), responsável pelo tratamento da instrução SOUND e da música de fundo dos jogos.
$00F5 / 245 (MODBUF)
Número do [[modo de vídeo]] atual, segundo o VDG. O valor contido aqui é lançado na porta COL32 ($80) para habilitar a escrita na VRAM nos eventos de vídeo: limpeza de tela, intermitência do cursor, impressão de caracteres, plotagem de linhas, etc.
  • $01 / 1 = TEXT
  • $88 / 136 = GR
  • $9F / 159 = HGR
$00F6 / 246 (CLR)
Valor de COLOR (0–3).

[[Manual de Referência]] (p.24):

O código de cor de Baixa Resolução é armazenado aqui, com valores legais de 0 a 3.
$00F7 / 247 (2 bytes) (UPDBM)
Endereço da rotina para acender e/ou apagar o cursor. Contém $CB1D em caso de 32 colunas (atribuído pela rotina $C841), que inverte o caracter sob o cursor; ou $CB3F no caso de 80 colunas (atribuído na rotina $C7EC), que apenas posiciona o cursor.
$00F9 / 249 (2 bytes) (UPDBCM)
Endereço da rotina para apagar o cursor se ele estiver aceso. Contém $CB2D em caso de 32 colunas (atribuído pela rotina $C841), que chama a rotina apontada por UPDBM caso FSHCNT seja par; ou $CB3F em caso de 80 colunas (atribuído pela rotina $C7EC), que apenas posiciona o cursor.
$00FB / 251 (2 bytes) (STAR)
Início do bloco de memória a salvar para a fita.

[[Manual de Referência]] (p.25):

Este buffer tem dois bytes; quando você chamar a sub-rotina de entrada/saída por fita, coloque o endereço de início do bloco de dados salvo/carregado nesse buffer. O byte baixo em 00FBH e o byte alto em 00FCH.
$00FD / 253 (2 bytes) (ENDT)
Byte seguinte ao fim do bloco de memória a salvar para a fita.

[[Manual de Referência]] (p.25):

Ao salvar dados em fita cassete, coloque o endereço de fim do bloco de dados neste buffer antes de chamar a sub-rotina TAPOUT (C012H).
$00FF / 255 (BORDER)
Média entre os comprimentos dos pulsos curtos (bits "1") e longos (bits "0") lidos da fita durante o header de um arquivo. Esse valor serve como fronteira para diferenciar os dois bits facilmente.

Buffer de execução do Monitor

$0103 / 259 (PGM ou PGN ou MUSIC)
?
$0104 / 260 (PLAY)
"Tópico" de jogo atual.

[[Manual de Referência]] (p.25):

Número da jogada atual no procedimento de disputa de jogo.
$0105 / 261 (PLAYMX)
Quantidade de "tópicos" (modos, níveis, etc.) do jogo. Selecionam-se com <CTRL>+<H> e modificam o comportamento do jogo: cenário diferente, dificuldade diferente, um ou dois jogadores, etc. O ponto de entrada de execução de cada um dos tópicos é definido por uma sequência de instruções JP xxxx a partir do endereço $0200.

[[Manual de Referência]] (p.25):

Número máximo da jogada no jogo atual.
$0106 / 262 (HEAD)
  • $FF / 255 = Modo BASIC/MONITOR. A rotina de leitura de teclado KEY emite bip a cada tecla pressionada; a rotina SKEY? só reconhece uma única tecla pressionada. A rotina TAPIN retorna após a leitura do nome do arquivo (para permitir a comparação com o nome de arquivo desejado) e a rotina GET1 não inicia a execução do programa a partir de $0200 (comportamento do comando TLOAD).
  • ≠ $FF / 255 = "Modo de jogo". A rotina de leitura de teclado KEY não emite bip a cada tecla pressionada; a rotina SKEY? reconhece até quatro teclas pressionadas simultaneamente. A combinação de teclas <CTRL>+<H> chama a rotina NEXTGM para alternar automaticamente entre "tópicos de jogo". Os códigos retornados por algumas teclas e combinações são diferentes. Após a leitura do arquivo da fita, inicia-se a execução a partir do endereço $0200 (comportamento do comando TLOAD). O valor é 1 durante o comando TLOAD, e 0 depois.

[[Manual de Referência]] (p.25):

Este é um buffer frequentemente usado. Na seção sobre o teclado, entrada/saída de fita, temos que verificar esse buffer. O buffer HEAD tem dois valores: 0FFH ou não. Quando você estiver em BASIC ou MONITOR, o valor desse buffer é 0FFH; se estiver jogando, o valor é diferente mas você não pode examiná-lo. Quando você chamar uma sub-rotina de E/S de fita como TAPIN/TAPOUT, certifique-se de que o valor é 0FFH.
$0107 / 263 (2 bytes) (RANDOM)
Este valor é constantemente incrementado de $B2E7 (+45799 ou −19737) a cada leitura de teclado (SKEY?).

[[Manual de Referência]] (p.25):

Buffer gerador de número randômico; cada vez que se chama a sub-rotina SKEY?, esse buffer de dois bytes muda uma vez.
$0109 / 265 (2 bytes) (RCRDPT)
Endereço (+1) do último score armazenado na tabela de scores. Se RCRDPT = $011B (RECORD+16), a tabela está cheia.
$010B / 267 (16 bytes) (RECORD)
8 pares de scores (jogadores 1 e 2). Os valores de SCOREA e SCOREB são transferidos para esta tabela pela rotina LSCORE.
$0113 / 275 (2 bytes) (DLNG)
Largura da tela de texto. (Linha da tela, em bytes.)

[[Manual de Referência]] (p.25):

A sub-rotina de saída do console tem muitos buffers; este aqui é usado para armazenar o comprimento da tela. O buffer conterá 32/80 quando você estiver usando 32/80 colunas.
$0115 / 277 (YCORD)
Código ASCII do primeiro caracter impresso após uma sequência ESC + "=". Indica a linha onde se vai posicionar o cursor.
$0116 / 278 (XCORD)
Código ASCII do segundo caracter impresso após uma sequência ESC + "=". Indica a coluna onde se vai posicionar o cursor.
$011B / 283 (4 bytes) (KEY0)
Em modo BASIC/MONITOR (HEAD = $FF), a rotina SKEY? retorna em KEY0 o código ASCII da última tecla pressionada, e KEY? o copia para KEY0+1. Em "modo de jogo" (HEAD ≠ $FF), SKEY? retorna até 4 teclas pressionadas simultaneamente em KEY0–KEY0+3.

[[Manual de Referência]] (p.26):

Buffer temporário do código de tecla. Quando o computador varre o teclado e algumas teclas forem pressionadas, o código ASCII será armazenado temporariamente neste buffer. Assim, você pode obter o código de tecla diretamente daqui; em especial, quando HEAD não for 0FFH, pode haver 4 teclas pressionadas simultaneamente (verifique o registrador A após chamar KEY? (C009H) para verificar quantas teclas foram pressionadas.) Nesse caso, você terá que obter os códigos de tecla em KEY0...KEY+3.
$0120 / 288 (3 bytes) (JOB)
Primeiro hook chamado durante a leitura de teclado (SKEY?). Valor default: $C9 (RET) no primeiro byte.

[[Manual de Referência]] (p.26):

Ponto de entrada de sub-rotina definida pelo usuário. Este buffer de três bytes normalmente contém um código de retorno (0C9H). Em muitos jogos, nós o usamos para fazer a entrada na sub-rotina do contador de tempo. Logicamente, você pode usá-lo para fazer outras coisas. Cada vez que o teclado é varrido (sub-rotina SKEY?), esse ponto de entrada será chamado uma vez.
$0123 / 291 (SCOREA)
Placar atual do jogador 1.
$0124 / 292 (SCOREB)
Placar atual do jogador 2.
$0125 / 293 (SHAPE0)
Indica se foi detectada colisão durante a última execução da rotina SHAPOF.
  • $00 = Não houve colisão.
  • $01 = Houve colisão.
$0126 / 294 (KTIME)
A rotina NEXTGM registra aqui o tempo durante o qual a combinação de tecla <CTRL>+<H> é pressionado, para fazer uma pausa antes de mudar de tópico de jogo.
$0128 / 296 (PNTR)
Direcionamento da impressão:
  • $00 = Impressão na tela (default)
  • $02 = impressora e tela?
$012D / 301 (COSW)
Alguns flags de controle do modo texto:
  • Bit 0 ligado = "Lead-in". Estamos no meio de uma sequência de escape (ESC + "=" + dois outros caracteres) para posicionar o cursor. Este flag é ligado no momento da impressão do ESC e continua assim até a sequência terminar ou ser rompida (se o segundo caracter não for "=").
  • Bit 7 ligado = Já foi impresso "=" após o ESC. Aguardando mais dois caracteres.
  • Bit 6 ligado = Já foram impressos "=" e outro caracter (informando a linha na qual posicionar o cursor) após o ESC. Aguardando o último caracter (coluna do cursor).
  • Bit 1 ligado = Existe monitor de 80 colunas presente.

[[Manual de Referência]] (p.12):

Quando este buffer contiver o valor zero no bit 1, então o cartão de 80 colunas estará instalado.

NOTA: não mude os dados deste buffer.

[[Manual de Referência]] (p.26):

Chave de funções de saída do console. Seu mapa de bits é:
------------------
 ! ! ! ! ! ! ! ! !
------------------
 ! !         ! !-----> LEAD-IN
 ! !         !-------> Cartão de 80 colunas existente
 ! !
 ! !-----------------> Coordenadas Y do endereço direto do cursor.
 !-------------------> endereço direto do cursor.

Nós estudaremos este buffer detalhadamente mais tarde.

$012E / 302 (KEYSW)
Usado pelas rotina de leitura de teclado KEY e KEY?. Geralmente contém $00. Contém $FF enquanto uma tecla estiver sendo pressionada.
$012F / 303 (FSHCNT)
Estado atual da intermitência do cursor. É constantemente incrementado. Um número par indica cursor aceso.
$0130 / 304 (3 bytes) (JOBM)
Segundo hook chamado durante a rotina de leitura do teclado (SKEY?). Contém [$C9, ??, ??] (RET) durante os primeiros momentos da inicialização; depois [$C3, $E9, $C0] (JP $C0E9).

[[Manual de Referência]] (p.26):

Este é um outro ponto de entrada de sub-rotina programada, mas diferente de JOB; esta entrada é usada pelo MONITOR para fazer o cursor piscar. Você pode checar este buffer de 3 bits para ver se é uma instrução para pular. O único dado que você pode usar para recolocar o código (C3) é RETURN (C9), e o cursor não piscará mais.

Tenha cuidado para não trocar os conteúdos da JOBM+1 e JOBM+2.

$0133 / 307 (FLASHB)
Contador para intermitência do cursor. Valor continuamente decrementado a cada leitura de teclado (rotina SKEY?). Quando atinge 0, soma-se 1 a FSHCNT ($012F).
$0135 / 309 (TABLE ou NSA)
Inicializado com o valor de NAA + 4, aponta (inicialmente?) para a sequência de notas
$0137 / 311 (2 bytes) (NAA)

Aponta para os dados de música no canal A:

  • (1 byte) (nibble mais significativo) seleciona forma da envoltória (0–15); (nibble menos significativo) valor da amplitude fixa (0–15).
  • (2 bytes) período da envoltória
  • (1 byte) valor para registrador de controle do gerador de ruído (0–31)
  • Sequência de notas:
    • Se houver ruído:
      • (1 byte) valor para registrador de amplitude (0–31).
      • (1 byte) duração (vai para TEMPA).
    • Se houver tom:
      • (1 byte) (nibble mais significativo) oitava (1–8); (nibble menos significativo) nota (0–11)
      • (1 byte) duração (vai para TEMPA). Este valor suprime o byte de duração do ruído, se houver.
  • (1 byte) $FF termina a sequência; $EE repete a sequência.
$0139 / 313 (AVALUE)

2º parâmetro de TEMPO no canal 1 (0–3). No momento da execução do comando SOUND, esse valor é deslocado 4 bits à esquerda (na posição para INTRPA) e faz-se um OR com o valor $4D / %01001101 (valor para VOICEA=3, produção de tom).

Se AVALUE < 31 ou seu bit 0 = 0, o canal é silenciado, senão prosseguir com a configuração do canal ou execução da música.

  • bit 0: se 0, o canal é silenciado, senão prosseguir com a configuração do canal ou a execução da música.
  • bit 1: se 0, inicializa canal com base nos próximos bits e nos primeiros 4 bytes de NAA, inicia a primeira nota/ruído, e ativa o bit 1; senão prosseguir a execução da música.
  • bits 2,3: valor a carregar em VOICEA.
  • bits 4,5: valor a carregar em INTRPA/INTRPB/INTRPC acrescido de 1.
  • bits 6,7: se 1, produzir tom; se 2, produzir ruído; senão, ambos.
$013A / 314 (VOICEA)
Carrega-se aqui o valor dos bits 2,3 de AVALUE. Se VOICEA = 3, o controle da amplitude se dará pela envoltória, senão a amplitude será fixa. Ver NAA. Se VOICEA = 2, a amplitude decrescerá a cada decréscimo de TEMPA.
$013B / 315 (INTRPA)

Quantidade de interrupções para cada unidade de TEMPA.

Carrega-se aqui o valor dos bits 4 e 5 de AVALUE acrescido de 1 (1–4). Isto definirá o compasso da música, que pode ser executada em 4 velocidades diferentes.

Se o bit 7 de INTRPA for ativado (quando? por quem?) não haverá incremento de INTA na próxima interrupção.

$013C / 316 (TEMPA)

Contador de duração da nota (decrementado cada vez que INTA atinge INTRPA).

Inicializado com o valor do byte de duração na tabela NAA.

O valor é copiado para TONEA a cada interrupção no final da rotina INTRUP.

$013D / 317 (INTA)
Contador de interrupções (incrementado a cada interrupção até atingir o valor de INTRPA), quando então TEMPA é decrementado e INTA é zerado de novo.
$013E / 318 (NSB)
Início da configuração de música do canal B. Vide NSA.
$0140 / 320 (2 bytes) (NBB)
Vide NAA.
$0142 / 322 (BVALUE)
2º parâmetro de TEMPO no canal 2. Vide AVALUE.
$0143 / 323 (VOICEB)
Vide VOICEA.
$0144 / 324 (INTRPB)
Vide INTRPB.
$0145 / 325 (TEMPB)
Vide TEMPA.
$0146 / 326 (INTB)
Vide INTA.
$0147 / 327 (NSC)
Início da configuração de música do canal C. Vide NSA.
$0149 / 329 (2 bytes) (NCC)
Vide NAA.
$014B / 331 (CVALUE)
2º parâmetro de TEMPO no canal 3. Vide AVALUE.
$014C / 332 (VOICEC)
Vide VOICEA.
$014D / 333 (INTRPC)
Vide INTRPA.
$014E / 334 (TEMPC)
Vide TEMPA.
$014F / 335 (INTC)
Vide INTA.
$0150 / 336 (ENABLE)
Valor lançado ao registrador MIXER do AY-3-8910. Default = $7F (nenhum som).
$0151 / 337 (AMPLIT)
Número do registrador de amplitude do AY-3-8910 correspondente ao canal atual. Pode conter $08 (canal A), $09 (canal B) ou $0A (canal C).
$0152 / 338 (2 bytes) (REGIST)
Números dos registradores de tom do AY-3-8910 correspondentes ao canal atual. Pode conter [$00, $01] (canal A), [$02, $03] (canal B) ou [$04, $05] (canal C).
$0154 / 340 (DEFIN)
Valor a ser AND-ado com ENABLE para habilitar o tom do canal atual. Pode conter %11111110 / $FE (canal A), %11111101 / $FD (canal B) ou %11111011 / $FB (canal C).
$0155 / 341 (2 bytes) (ONAMP)
  • No primeiro byte: Máscara de bits a serem ativados em ENABLE para desligar o tom e o ruído do canal atual. Pode conter %00001001 / $09 (canal A), %00010010 / $12 (canal B) ou %00100100 / $24 (canal C).
  • No segundo byte: Valor a armazenar em AMPLIT (ver).
$0157 / 343 (LPLAY)
?
$0158 / 344 (MODEK)
Número do modo de vídeo segundo o MC6847 durante o acesso ao cassete: $01 = tela verde; $03 = tela vermelha.
$0159 / 345 (2 bytes) (LNHD)
Endereço na VRAM do início da linha atual do cursor.

[[Manual de Referência]] (p.28):

O LNHD guarda o endereço de início de cada linha.
$015B / 347 (2 bytes) (SNPTR)
Endereço na VRAM da posição atual do cursor.

[[Manual de Referência]] (p.28):

O SNPTR guarda a posição do cursor.
$015D / 349 (LCNT)
Coluna atual do cursor na tela de texto.

[[Manual de Referência]] (p.28):

O LCNT [guarda] o número da coluna.
$015E / 350 (CHECK)
(Indica se a rotina de geração de som está trabalhando em modo de jogo ou modo BASIC?) Inicializado com $5A / 90. Zerado após um TLOAD. O valor $5A / 90 causa uma pausa na música do jogo. (Em som BASIC, há um único registro de nota por canal (CHANA, CHANB, CHANC), e o valor $5A indica que não se deve avançar para o registro seguinte, pois não existe nenhum.)
$0163 / 355 (2 bytes) (DSNAM)
Endereço na VRAM de início da tela de texto:
  • $8000 em caso de 32 colunas
  • $2000 em caso de 80 colunas

[[Manual de Referência]] (p.28):

Buffer para guardar o endereço de início na VRAM 6847/6845 da janela atual da tela.
$0165 / 357 (2 bytes) (DENAM)
Endereço na VRAM do fim da tela de texto, somado de 1:
  • $8200 em caso de 32 colunas
  • $2780 em caso de 80 colunas

[[Manual de Referência]] (p.28):

Buffer para guardar o endereço de término na VRAM 6847/6845 da janela atual da tela. Você pode usar esse buffer para dividir a tela.
$0167 / 359 (HISCOR)
?
$0169 / 361 (TEMP)
?
$016C / 364 (RIGHTJ)
?
$016D / 365 (CHANA)

Registro preparado pelo comando SOUND para o canal 1, será apontado por NAA.

  • (1 byte) $0F / 15 (amplitude fixa)
  • (2 bytes) 1º parâmetro de TEMPO no canal 1 << 8 + $80 (período da envoltória)
  • (1 byte) $0F / 15 (valor para registrador de controle do gerador de ruído)
$0171 / 369 (TONEA-1)
Nota no canal 1.
$0172 / 370 (TONEA)

Duração da nota no canal 1.

O valor de TEMPA é copiado para cá a cada interrupção no final da rotina INTRUP.

$0173 / 371 (CHANB)

Registro preparado pelo comando SOUND para o canal 2, será apontado por NBB.

  • (1 byte) $0D / 13 (amplitude fixa)
  • (2 bytes) 1º parâmetro de TEMPO no canal 2 << 8 + $80 (período da envoltória)
  • (1 byte) $0F / 15 (valor para registrador de controle do gerador de ruído)
$0177 / 375 (TONEB-1)
Nota no canal 2.
$0178 / 376 (TONEB)
Duração da nota no canal 2.
$0179 / 377 (CHANC)

Registro preparado pelo comando SOUND para o canal 3, será apontado por NCC.

  • (1 byte) $0D / 13 (amplitude fixa)
  • (2 bytes) 1º parâmetro de TEMPO no canal 3 << 8 + $80 (período da envoltória)
  • (1 byte) $0F / 15 (valor para registrador de controle do gerador de ruído)
$017D / 381 (TONEC-1)
Nota no canal 3.
$017E / 382 (TONEC)
Duração da nota no canal 3.
$017F / 383 (14 bytes) (OBUF)
Nome do arquivo sendo lido da fita. Se o nome tiver menos de 14 bytes, um $0D segue o último caracter.

[[Manual de Referência]] (p.28):

Se você chamar TAPIN (0C00FH), essa sub-rotina lerá o nome-de-arquivo da fita cassete e armazenará o mesmo neste buffer, sendo o comprimento máximo do mesmo 14 bytes (incluindo o <RETURN>).

Suponha que você queira ler um arquivo da fita cassete onde foram guardados muitos arquivos. Você tem que comparar o nome-de-arquivo que você quer ler com este buffer. Se eles forem iguais, então chame o GET1 em seguida.

$018D / 397 (14 bytes) (FILNAM)
Nome do arquivo sendo salvo na fita. Se o nome tiver menos de 14 bytes, um caracter CR ($0D) segue o último caracter.

[[Manual de Referência]] (p.28):

Ao contrário de OBUF, usa-se este buffer de 14 bytes para armazenar o nome-de-arquivo cujo bloco de dados você quer guardar na fita cassete. O nome-de-arquivo deve terminar com <RETURN> ou ter 14 bytes de comprimento.

Buffer de linha

$0200 / 512 (256 bytes) ({INPBUF}, <LINE_BUFFER>)
Espaço onde se armazena uma linha de comando ou dados digitada pelo usuário.

Buffer de execução do interpretador BASIC

$0300 / 768 (77 bytes) ({WSP}, [WRKSPC])
O bloco $0300–$034D é copiado a partir de um bloco da ROM ($D792–$D7DF) no momento da inicialização.
; {WSP} [WRKSPC]
0300  C32DCF    JP      #CF2D
; BUSR:
; {USRLOC} [USR]
; Ponto de entrada da função USR.
0303  C3F6DE    JP      #DEF6 ; PIERRO
; OUTAUX:
; {PORTAD} [OUTSUB]
; Rotina auxiliar para OUT.
0306  D300      OUT     (#00),A; #0307:{PORTAD+1} [OTPORT]
0308  C9        RET
; {DIVVAR} [DIVSUP]
; Rotina auxiliar para DIV.
; Os valores #00 serão substituídos.
0309  D600      SUB     #00 ; #030A:{DVAR1} [DIV1]
030B  6F        LD      L,A
030C  7C        LD      A,H
030D  DE00      SBC     A,#00 ; #030E:{DVAR2} [DIV2]
030F  67        LD      H,A
0310  78        LD      A,B
0311  DE00      SBC     A,#00 ; #0312:{DVAR3} [DIV3]
0313  47        LD      B,A
0314  3E00      LD      A,#00 ; #0315:{DVAR4} [DIV4]
0316  C9        RET
; Dados auxiliares para RND().
; {RNDVR1} [SEED]
0317  00        DB      #00
; {RNDVR2}
0318  00        DB      #00
; {RNDVR3}
0319  00        DB      #00
031A  354ACA99  DB      #35,#4A,#CA,#99 ; -2.65145E+7
031E  391C7698  DB      #39,#1C,#76,#98 ; +1.61291E+7
0322  2295B398  DB      #22,#95,#B3,#98 ; -1.17691E+7
0326  0ADD4798  DB      #0A,#DD,#47,#98 ; +1.30983E+7
032A  53D19999  DB      #53,#D1,#99,#99 ; -2.01612E+7
032E  0A1A9F98  DB      #0A,#1A,#9F,#98 ; -1.04269E+7
0332  65BCCD98  DB      #65,#BC,#CD,#98 ; -1.34831E+7
0336  D6773E98  DB      #D6,#77,#3E,#98 ; +1.24825E+7
; {RNDV4} [LSTRND]
033A  52C74F80  DB      #52,#C7,#4F,#80 ; .811653
; INPAUX:
; [INPSUB]
; Rotina auxiliar para INP().
033E  DB00      IN      A,(#00) ; #033F:[INPORT]
0340  C9        RET
; {DUMMY} <TERMINAL_Y> [NULLS]
; Quantidade de caracteres ASCII NULL a serem impressos
; após um CR+LF.
; (O Altair BASIC tinha um comando "NULL" para definir este valor.)
0341  01        DB      #01
; {LINLEN} [LWIDTH]
; Limite máximo de POS(). Também recebe o valor de WIDTH.
0342  FF        DB      #FF
; Valor de WIDTH para "PRINT ,".
; {PRLISI} [COMMAN]
0343  FF        DB      #FF
; {OUTFLG} [CTLOFG]
; Suprime a impressão de caracteres quando <> 0.
0344  00        DB      #00
; {STDPTR} <STACK_TOP> [STRSPC]
; Base da pilha do Z80; Último endereço disponível
; para o BASIC antes da área de strings.
0345  3804      DB      #0438
; {CULINO} <CURRENT_LINE> [LINEAT]
; Número de linha BASIC em execução. #FFFF após execução.
0346  FEFF      DB      #FFFE
; {PSTBEG} <PROGRAM_BASE> [BASTXT]
; Endereço de início do programa BASIC.
0348  D503      DB      #03D5 ; {PRAM}
$033A / 826 (4 bytes) ({RNDV4}, [LSTRND])
Último número de ponto flutuante gerado pela função RND(). É o valor retornado por RND(0). Contém inicialmente $52,$C7,$4F,$80 (0,811635).
$0341 / 833 ({DUMMY}, <TERMINAL_Y>, [NULLS])
Quantidade (+1) de caracteres ASCII NULL ($00) a serem impressos após um CR+LF, provavelmente devido a alguma peculiaridade dos equipamentos de teletipo da época do Altair BASIC. O Altair BASIC tinha um comando NULL para definir o valor desta variável. Valor inicial = $01 (i.e., nenhum NULL).
$0342 / 834 ({LINLEN}, [LWIDTH])
Limite máximo do valor da função POS(). O default é $FF (255). (Recebe valor do comando WIDTH, assim como $0343.)
$0343 / 835 ({PRLISI}, [COMMAN])
Valor do comando WIDTH. [Width for commas.]
$0344 / 836 ({OUTFLG}, [CTLOFG])
Suprime impressão de caracteres se diferente de zero. Valor inicial = $00. Após um LOAD sem nome de arquivo (o programa executa automaticamente), contém $01. É preciso inclui um POKE 836,0 no início dos programas BASIC carregados sem nome de arquivo para garantir que os comandos PRINT funcionem.
$0345 / 837 (2 bytes) ({STDPTR}, <STACK_TOP>, [STRSPC])
Durante a inicialização, armazena $0438: endereço temporário para a base da pilha do Z80. Depois da inicialização, armazena o endereço do topo da RAM subtraído de $0300: O topo da área disponível para o programa BASIC e suas variáveis. ($3CFF em 16KB, $BCFF em 48KB.)
$0347 / 839 (2 bytes) ({CULINO}, <CURRENT_LINE>, [LINEAT])
Número de linha do programa BASIC em execução. Valor inicial = $FFFE.
$0349 / 841 (2 bytes) ({PSTBEG}, <PROGRAM_BASE>, [BASTXT])
Aponta a base da área disponível para o programa BASIC e suas variáveis. Valor inicial = $03D5.
$034E / 846 (2 bytes)
Durante a inicialização, armazena um endereço temporário para a base da pilha do Z80.
$0351 / 849 ({INPBUF+6}, [STACK])
Quantidade de caracteres no buffer de linha, + 1.
$0352 / 850
Flag NORMAL/INVERSE:
  • $00 = NORMAL (default)
  • ≠ $00 = INVERSE
$0353 / 851
?. Inicializado com $FF.
$0354 / 852
Flag de PLOT/UNPLOT (usado internamente pelos comandos):
  • $00 = UNPLOT
  • $01 = PLOT
$0357 / 855
Flag de trace:
  • $00 = TROF (default)
  • $01 = TRON
$0358 / 856
Modo de vídeo:
  • $00 = TEXT (default)
  • $01 = GR
  • $02 = HGR
$0359 / 857
Coordenada Y do último ponto plotado. Valor inicial: $00.
$035A / 858
Coordenada X do último ponto plotado. Valor inicial: $00.
$035B / 859 (2 bytes)
Número de linha atual gerada pelo comando AUTO.
$035D / 861 ({AUTOFG})
Flag de AUTO.
$035E / 862 (2 bytes)
Última linha a ser gerada pelo comando AUTO.
$0360 / 864
Flag de FAST/SLOW:
  • $00 = FAST (default)
  • $01 = SLOW
$0361 / 865
≠ 0 indica que o programa foi carregado sem nome e que deve ser automaticamente executado. Valor inicial: $00.
$038D / 909 ({EOINPB}, [BUFFER+72+1])
Fim do buffer de linha em outros BASICs. Inicializado ("marcado") com $00.
$038E / 910 ({CURPOS}, [CURPOS])
Valor da função POS().
$038F / 911 ({LOCCRE}, <DIM_OR_EVAL>, [LCRFLG])
≠ 0 indica DIMensionamento de matriz; = 0 indica apenas acesso. [Locate/Create flag.]
$0390 / 912 ({DATYPE}, [TYPE])
Usado para determinar o tipo de uma variável: 0 = numérico; 1 = string.
$0391 / 913 ({DSTMNT}, [DATFLG])
Durante a tokenização das palavras reservadas de uma linha, 0 indica que as palavras devem ser tokenizadas; assume o valor 1 para evitar a tokenização de strings não delimitadas por aspas após uma instrução DATA.
$0392 / 914 (2 bytes) ({MEMSIZ}, [LSTRAM])
Topo da área para alocação de strings. Valor inicial: Endereço do topo da RAM subtraído de $0100 ($3EFF em 16KB, $BEFF em 48KB.)
$0394 / 916 (2 bytes) ({SPTPTR}, [TMSTPT])
Aponta a próxima posição livre na pilha para registros de strings temporários. Valor inicial = $0396.
$0396 / 918 (12 bytes) ({LSPTBG}, [TMSTPL])
Base da pilha para registros de strings temporários (cabem 3 registros, 4 bytes cada). Uma expressão do tipo "A"+("B"+("C"+("D"))), que precisaria gerar quatro registros, produz erro "CC" (cadeia complexa).
$03A2 / 930 (4 bytes) ({STRDAT}, [TMPSTR])
Área para montagem de registro de string temporário:
  • $03A2 armazena o tamanho da string.
  • $03A4 (2 bytes) armazena o endereço de início da string.
$03A6 / 934 (2 bytes) ({SWAPTR}, [STRBOT])
Aponta o primeiro byte livre antes a área de alocação para strings. Quando uma nova string é alocada, seu valor é decrementado no tamanho da string. Valor inicial é o endereço do top da área (armazenado em $0392).
$03A8 / 936 (2 bytes) ({LBYTEX}, [CUROPR])
? {Index des zulletzt abge-arbeiteten bytes} [Current operator in EVAL]
$03AA / 938 ({DATPTR}), [DATLIN])
? {Zeilennummer des zuletzt gelesenen DATAstatements.} [Line of current DATA item.]
$03AC / 940 ({FORFLG}, [FORFLG])
Tipo do identificador:
  • $00 = variável.
  • $01 = matriz.
  • $64 = variável de controle de laço FOR. (?)
  • $80 = função do usuário (FN XX).
$03AD / 941 ({IPHFLG}, [LSTBIN])
Último byte inserido no buffer de linha.
$03AE / 942 ({RDFLAG}, <INPUT_OR_READ>, [READFG])
Instrução de leitura sendo executada:
  • $00 = INPUT
  • ≠ $00 = READ
$03AF / 943 (2 bytes) ({CUSTMT}, <PROG_PTR_TEMP>, [BRKLIN])
Aponta para o último byte antes da área de BASIC ($03D4). {Zeilennummer/Addresse des aktuellen statements} [Line of break].

No primeiro byte se armazena $FF para o comando LOAD* e $01 para o comando SAVE*.

$03B1 / 945 (2 bytes) ({NTOKPT}, [NXTOPR])
Eventualmente(?) guarda o ponto atual da interpretação do programa BASIC. [Next operator in EVAL.]
$03B3 / 947 (2 bytes) ({LLNOEX}, [ERRLIN])
Usado pelo comando CONT para retomar a execução do programa: Se ($03B5) = $00 então emite "NC ERRO" senão ($0347) ← ($03B3).
$03B5 / 949 (2 bytes) ({LBYTER}, [CONTAD])
? ($00 no primeiro byte)
$03B7 / 951 (2 bytes) ({SVARPT}, <VAR_BASE>, [PROGND])
Aponta o início da área de variáveis (após o programa BASIC).
$03B9 / 953 (2 bytes) ({DVARPT}, <VAR_ARRAY_BASE>, [VAREND])
Aponta o início da área de matrizes (após a área de variáveis).
$03BB / 955 (2 bytes) ({FSLPTR}, <VAR_TOP>, [ARREND])
Aponta a área livre após a área de matrizes.
$03BD / 957 (2 bytes) ({RDPTR}, <DATA_PROG_PTR>, [NXTDAT])
Ponteiro de leitura das linhas DATA. Valor inicial: Último byte antes da área de BASIC ($03D4), que contém o valor 0 justamente para esse fim.
  • Após uma instrução RESTORE, aponta para o byte 0 no fim da linha anterior à selecionada.
  • Após uma instrução READ, aponta para a vírgula ou byte 0 no fim da linha após o valor lido.
$03BF / 959 (2 bytes)
Aponta o registro no topo da pilha de registros de strings temporários, OU...
$03BF / 959 (4 bytes) ({WRA1}, <FACCUM>, [FPREG])
Registro de número de ponto flutuante:
  • $03BF armazena o byte menos significativo da mantissa.
  • $03C0 armazena o byte intermediário da mantissa.
  • $03C1 armazena byte mais significativo da mantissa (o 7º bit indica o sinal, 0 = positivo).
  • $03C2 armazena o expoente somado de 129. Se este byte for zero, os outros bytes são desconsiderados e o valor de ponto flutuante é tido como zero. ({WRA1+3}, [FPEXP])
Registro de string:
  • $03BF armazena o comprimento da string.
  • $03C0 não armazena nenhuma informação significativa (lixo).
  • $03C1 armazena o byte menos significativo do endereço do conteúdo da string.
  • $03C2 armazena o byte mais significativo do endereço do conteúdo da string.
$03C3 / 963 ({SGNORS}, <FTEMP_SIGN>, [SGNRES])
Usado para cálculo do sinal durante a montagem de registro de número de ponto flutuante. {Vorzeichen der operation} [Sign of result.]
$03C4 / 964 (? bytes) ({INTPRB}, [PBUFF])
Usado para montar a string baseada no número de ponto flutuante armazenado em $03BF.
$03D4 / 980 ({PRAM-1}, [PROGST])
Fim da área de variáveis do BASIC. Inicializado ("marcado") com $00.
$03D5 / 981 ({PRAM})
Posição padrão de início do programa BASIC.

"MC-1000", "MC 1000" ou "MC1000"?

No gabinete do computador, nos acessórios e nos materiais impressos (caixa, capas dos manuais, rótulos e capas das fitas, propagandas etc.) ...