Escrevendo um jogo ZX Spectrum

Escrevendo um jogo ZX Spectrum

Como parte de nosso desafio de camisetas este ano no Pixels Camp, decidimos que uma das etapas exigiria que o caçador acessasse algum tipo de computador retrô no local, inserisse alguns códigos secretos e obtivesse as instruções para a próxima etapa , se bem sucedido.

Como alguns de vocês sabem, sou um otário para todas as coisas de 8 bits. Eu tinha várias máquinas Spectrum e C64 na minha juventude (ainda tenho algumas hoje) e nessa idade, eu era um pouco proficiente no código de montagem BASIC, Z80 e 6510. Lembro-me dos dias em que tudo o que tínhamos era uma ocasional revista de programação no quiosque e a ajuda de nossos amigos próximos do IRL. Não havia Internet, PDFs on-line, nada. O acesso à informação era caro e escasso.

Um dia, meus pais me ofereceram a Bíblia, o livro The Complete Spectrum ROM Disassembly. Eles não poderiam ter imaginado que estavam cometendo um grande erro e contribuindo fortemente para a formação do meu perfil agudo do INTP Myers Briggs.

Obviamente, eu basicamente desapareci do planeta por meses a fio. O mesmo aconteceu com o C64 e depois com o Amiga.

Avançando até hoje, por motivos que não consigo explicar nem concordar, a equipe da Bright Pixel há muito tempo revogou meu direito ao código. Eles argumentam coisas sem sentido, como problemas técnicos de dívida, riscos de refatoração, falta de testes e outras desculpas. Parece que eles preferem me ver gerenciando e administrando a empresa do que colocando meu talento tecnológico de última geração a serviço de nossos projetos. Vai saber.

Mas eles não conseguiram me impedir de codificar um jogo do ZX Spectrum, poderiam?

Não, eles não puderam.

Aqui está a história

Primeiro, precisávamos de um ZX Spectrum funcional. Tiramos a poeira de algumas máquinas que tínhamos na minha casa e no nosso museu de hardware. No total, inicialmente reunimos um ZX Spectrum 48K original, um Sinclair ZX Spectrum + e um poderoso ZX Spectrum 128K.

Quando os ligamos para ver se funcionavam, descobrimos que não funcionavam. Um poderia inicializar, mas tinha um teclado defeituoso, o outro não inicializava, e o outro reiniciava, mas precisava de algum ULA estranho aquecendo antes de funcionar corretamente (um problema comum em alguns modelos, que acabamos descobrindo).

Algumas sessões de faxineira mais tarde, depois de trocar as membranas do teclado, cortar e consertar suas fitas de conexão quebradas e aprender seus truques, finalmente conseguimos que o 48K e o 128K funcionassem plenamente.

Em seguida, melhor qualidade de imagem.

Precisamos nos livrar do sinal de RF e usar o vídeo composto. Hackear o 48K foi fácil, é um mod bem conhecido que requer apenas um ferro de solda, um cortador de fio e um pouco de paciência. O 128K foi ainda mais fácil. Acontece que o seu conector DIN possui um pino composto de vídeo disponível, tudo o que precisávamos fazer era soldar um simples cabo DIN para RC, e um vídeo nítido.

Carregando o programa

Agora, para carregar um programa no computador. Isso acabou sendo uma tarefa e tanto. Seus filhos não se lembrariam, mas, naquela época, a maioria dos programas e jogos era carregada em computadores de 8 bits, como o ZX Spectrum, usando fitas de áudio e tocadores de fita, como o da foto.

Carregar um jogo de cassetes era em si um desafio.

Primeiro, o cassete precisava estar em boas condições (a fita tende a se desmagnetizar e se deteriorar ao longo do tempo com muita facilidade, muitas vezes tivemos que copiar nossos jogos favoritos para cassetes de backup, apenas no caso); segundo, o toca-fitas precisava das configurações corretas de volume e pitch para funcionar bem com o modem do computador e, por último, o azimute do cabeçote do toca-fitas precisava ser calibrado corretamente. Se algum desses fatores falhasse, então obteríamos a infame mensagem “Erro de carregamento de fita de R, 0: 1” e seria necessário reiniciar o processo novamente. Nota lateral, um típico jogo de 48K levaria cerca de 5 a 10 minutos para carregar da fita.

Hoje, no entanto, não usamos mais gravadores ou cassetes. Em vez disso, decodificamos e “reproduzimos” arquivos TZX (um formato de arquivo comum para preservar fitas de computador do ZX Spectrum e C64) ou simplesmente reproduzimos um arquivo de áudio WAV, de um computador moderno ou uma saída de som de um celular diretamente para o modem ZX Spectrum. jack de entrada, o que significa que não precisamos mais nos preocupar com a qualidade da fita ou com o azimute.

Nós temos que nos preocupar com outras coisas. Um é o dos terminais de fita, que precisam ser mono, não os que estão disponíveis atualmente, e o outro ainda é o volume e o tom do áudio. Para encurtar a história, a maioria dos telefones celulares que experimentamos não funcionou. O volume estava muito baixo ou o cabo mono não funcionava com a tomada do telefone.

Nós tentamos um Raspberry Pi para o trabalho, mas também não funcionou. O volume estava muito baixo e, pior, a qualidade de som PWM do BCM2835 era terrível (o RPi não tem um DAC. Ele usa o PWM alimentado em um filtro passa-baixa para produzir áudio analógico) e o ZX Spectrum não gostou.

Depois de passar algum tempo mexendo com configurações diferentes, finalmente conseguimos um certo:

Raspberry Pi com um adaptador de som USB para melhor qualidade, volume maxed, usando a ferramenta playtape, dos utilitários de fita2wav, para reproduzir arquivos TZX diretamente para a saída de som.
Conectado a uma mesa de mistura de pré-amplificador com cabos estéreo e mono adequados.
Conectado ao conector de entrada “ear” do ZX Spectrum.
Conectado a um monitor 1084S-D1 (o melhor monitor de computador analógico já feito, mãos livres) em vídeo composto.

ZX 48K + Raspberry Pi + Pré-amplificador

ZX Spectrum 128K conectado ao 1084S usando Video Composite, via seu conector DIN
Codificando o programa
Minha primeira abordagem para escrever o programa ZX Spectrum foi usar o ZX80Asm e usar o código de máquina de baixo nível até o fim, mas rapidamente percebi que esse caminho exigiria mais de uma semana para me atualizar e fazer as coisas.

Então eu encontrei o ZXBasic, um compilador Sinclair ZX Spectrum BASIC para sistemas modernos onde você pode usar tanto uma linguagem BASIC melhorada quanto um assembly Z80 embutido onde faz sentido, gerar um binário compilado e otimizado e empacotá-lo em um arquivo TZX pronto para usar. Muito legal. Comunidade ativa também.

Eu também encontrei o Colorator, um editor gráfico que permite importar arquivos PNG, pintá-los e depois exportar para arquivos de tela SCR do ZX Spectrum.

Isa levou a mordida e projetou os gráficos de 8 bits, um logotipo genérico do Pixels Camp e duas telas inspiradas em Lost.

Eu tive que revisitar como funciona o layout de tela do ZX Spectrum e escrever uma pequena ferramenta para converter os arquivos SCR em buffers que eu poderia usar para alimentar as sub-rotinas de montagem rápida para desenhar e pintar a tela; isso me levou um tempo, mas foi divertido. Baixo nível é divertido.

Agora que eu tinha todas as peças no lugar, juntá-las e codificar o resto da lógica era fácil.

Você pode encontrar o código, os recursos e um arquivo TZX em funcionamento, que pode ser alimentado em um emulador ou em uma máquina real, neste repositório do Github.

Você também pode ler mais sobre o nosso desafio Pixels Camp v3.0 T-shirt aqui.

O resultado final, em execução no Pixels Camp
Espero que tenham gostado deste artigo. Fazer isso foi nostálgico e divertido; isso me lembrou dos bons e velhos tempos em que a programação exigia a compreensão dos componentes internos da máquina, até os chips de silício, instruções da CPU, registros, interrupções e mapas de memória. Eu sinto falta disso.

Se eu encontrar tempo, posso aceitar o desafio e ir para um jogo C64 em seguida.