1 pontos por GN⁺ 2024-11-23 | 1 comentários | Compartilhar no WhatsApp
  • ChipWits, um dos primeiros jogos do Macintosh em 1984, teve seu código-fonte FORTH original para Mac e Commodore 64 lançado como open source em seu 40º aniversário
  • O objetivo da divulgação é preservar o legado do jogo e compartilhar como o desenvolvimento multiplataforma era feito em microcomputadores de 8 bits em 1984
  • Os dados foram recuperados de discos de 40 anos guardados por Doug Sharp; embora houvesse alguns setores defeituosos, a maioria dos discos pôde ser lida normalmente
  • Enquanto o código completo da versão para Mac tem cerca de 3.000 linhas de FORTH, a versão modernizada portada chega a 35.000 linhas de C#, destacando a concisão e as limitações do código da época
  • O projeto publicou no GitHub as imagens originais dos discos e o código extraído, e quer trabalhar com a comunidade na identificação do código-fonte mais recente, na documentação de como compilar e na extração dos sprites

Divulgação do código original de ChipWits

  • Para comemorar os 40 anos de ChipWits, o código-fonte FORTH original para Mac e Commodore 64 foi lançado como open source
  • O código original recuperado e as imagens dos discos estão organizados em chipwits/chipwits-forth
  • O objetivo da divulgação é a preservação do legado de ChipWits e o compartilhamento da experiência de desenvolvimento multiplataforma para microcomputadores de 8 bits em 1984
  • Pessoas familiarizadas com os sistemas originais podem participar da exploração e organização do código-fonte, e o projeto convida à colaboração por meio do ChipWits Discord Server

Por que escolher FORTH em 1984

  • ChipWits foi um dos primeiros jogos lançados para o Macintosh em 1984
  • Os coautores Doug Sharp e Mike Johnston projetaram ChipWits, seu primeiro jogo original, depois de portar jogos educacionais entre microcomputadores de 8 bits
  • O jogo é um jogo de programação de robôs influenciado por títulos de programação da época como Rocky’s Boots e Logo
  • O ambiente de desenvolvimento para Mac em 1984 era limitado, e a principal forma de desenvolver era comprar um Apple Lisa
    • O preço original do Apple Lisa era US$ 9.995, o que corresponde hoje a US$ 30.373
    • Como era um custo difícil de bancar para um estúdio indie, Doug e Mike desenvolveram usando o MacForth Plus, que rodava diretamente no Mac
  • Na época, havia variantes de FORTH em vários microcomputadores de 8 bits, o que fazia da linguagem uma escolha adequada pensando em ports futuros
  • O desenvolvimento começou em abril de 1984, e levou cerca de 7 meses até a primeira versão ser desenvolvida e publicada, ficando pronta para a temporada de Natal

Port para Commodore 64 e Apple II

  • A Epyx seria a publicadora de ChipWits, e o Commodore 64 era o maior mercado
  • A Epyx não tinha jogos para Mac, e como a Brainworks mirava o mercado educacional em que a Apple era forte na época, a Epyx publicou apenas a versão de Commodore 64
  • O port para C64 foi concluído em 1985 e escrito em Super Forth 64
  • O port para Commodore 64 foi desafiador porque precisava manter o design geral da interface do Mac
    • Foi necessário desenvolver um sistema de menus suspensos operado por joystick em vez de mouse
    • Foram adicionados gráficos coloridos e som com o chip SID
    • Tudo precisava caber em um disco de 165 KB em vez dos 400 KB do disco do Mac
    • Era preciso usar 64 KB de RAM e um processador mais lento, em vez dos 128 KB de RAM do Mac
  • Depois do sucesso da versão para Commodore 64, também foi feita uma versão para Apple II, escrita igualmente em uma variante de FORTH

Avaliação após o lançamento e execução do original

  • ChipWits recebeu várias análises e prêmios após o lançamento
  • O MacUser Editor’s Choice 1986 Award definiu ChipWits como “a introdução mais divertida aos conceitos de programação” e elogiou sua linguagem baseada em ícones e seu design educacional
  • A Macazine previu que ChipWits se tornaria um título cult entre usuários de Macintosh e crianças
  • A MacWorld avaliou que, se você gosta de programação, vai gostar de ChipWits
  • A Creative Computing deixou uma resenha com uma cena de alguém xingando um robô de desenho às 4h30 da manhã
  • Em 2008, a Maclife.com selecionou ChipWits como um dos Top 10 Apple II / Mac Games de todos os tempos
  • As versões originais estão sendo preparadas para rodar em emuladores no navegador por meio dos projetos open source Emularity e Apple2js

Recuperação de discos de 40 anos

  • Enquanto trabalhava em uma nova versão de ChipWits, Doug Sharp encontrou os discos originais que havia guardado
  • Os disquetes de 3,5 polegadas e os floppies de 5,25 polegadas ficaram armazenados em casa por 40 anos, mas a maioria pôde ser lida sem setores defeituosos
  • Para recuperar os discos de Commodore 64, foi usado um 1541 Commodore 64 Disk Drive comprado no eBay
    • Os dados foram lidos em um PC moderno por meio de um adaptador USB XoomFloppy
  • Os disquetes Mac de 3,5 polegadas não podiam ser lidos do modo padrão por drives modernos por causa da disposição proprietária de setores do Mac
    • O Mac usava um layout próprio de setores para aumentar a capacidade do disco até 800 KB
    • Um PowerMac G3 WallStreet foi usado como sistema-ponte por ter drive de 3,5 polegadas e pilha de rede, mas como o suporte a 400 KB foi desativado no MacOS mais recente, ele só conseguia ler discos de 800 KB
    • Depois, por sugestão de um fã, foi usado o controlador de hardware customizado GreaseWeazle para controlar drives USB, e esse método funcionou corretamente
  • Todos os discos foram convertidos em imagens bloco a bloco e organizados no repositório do GitHub
    • Os nomes dos arquivos usam os rótulos dos discos
    • Quando setores defeituosos eram detectados, era adicionado bad no início do nome do arquivo
    • Para facilitar a leitura em computadores modernos, os blocos foram extraídos com scripts em Python e reformatados como arquivos ASCII UTF-8
    • O PETSCII, codificação de caracteres proprietária do Commodore 64, foi convertido para ASCII

O que o código FORTH revela sobre o desenvolvimento

  • As imagens completas dos discos originais e o código podem ser vistos em chipwits/chipwits-forth
  • Todo o código de ChipWits para Mac tem cerca de 3.000 linhas de FORTH
  • O port modernizado já chega a 35.000 linhas de C#, o que evidencia a concisão do código FORTH original
  • O texto separado Forth Code for Electrocrabs in 1984 ChipWits Deciphered analisa uma “screen” de código FORTH que controla os electrocrabs
  • FORTH é uma linguagem baseada em pilha, semelhante à Reverse Polish Notation
    • Em vez de 1 + 1, escreve-se 1 1 +
    • Em vez de if random(3) == 1, usa-se 3 irnd 1 = if

Implementação de jogo em 1984 vista em exemplos de código

  • O código de movimentação do robô na versão para Mac não separa um loop de renderização por quadro como no desenvolvimento moderno de jogos
    • Lógica do jogo e renderização gráfica ficam misturadas dentro de código imperativo
    • A animação é implementada renderizando pixels diretamente dentro do loop
    • Mover para um bloco vazio, bater na parede ou tocar em uma bomba é tratado com poucas palavras de código
    • A definição ?boom decide até mesmo se o jogo termina ao tocar em uma bomba
    • Dependendo da posição do robô, soma-se 0 à pontuação para forçar o redesenho da exibição de pontos, que pode ter sido apagada pela passagem do robô
  • A definição dos sprites da versão de Commodore 64 mostra como código e dados de assets ficavam misturados
    • O código-fonte FORTH não era salvo em arquivos, mas em unidades numeradas chamadas screen, carregadas na ordem necessária
    • Os sprites monocromáticos do C64 tinham 24×21 pixels, e apenas 8 sprites podiam ser usados por tela
    • Ao escolher sprites de 4 cores, a resolução caía para 12×21, e os pixels passavam a ter o dobro da largura
    • O personagem ChipWit é renderizado sobrepondo vários sprites, em um método semelhante à animação em cel de desenhos vintage
    • Essa escolha consumia mais sprites disponíveis no ChipWit, mas permitia imagens mais nítidas e animações por partes
  • A tabela de pontuação dos itens na versão para Mac comprime os dados para caber em uma screen
    • Uma notação como ( 110584 dws) é o carimbo de data da screen; 110584 significa 5 de novembro de 1984, e dws se refere a Douglass Walter Sharp
    • Essa screen parece ser uma das últimas modificadas antes do lançamento final, e a última screen alterada é de 8 de novembro
    • d, é definido para armazenar o valor multiplicado por 10, permitindo representar 150 pontos como 15 d
    • Esse método ajudava a manter o alinhamento da tabela e fazê-la caber em uma screen, além de possivelmente facilitar o ajuste dos valores de pontuação durante o balanceamento final antes do lançamento

Reboot e trabalho da comunidade

  • Separadamente da divulgação da versão FORTH original, a equipe também está trabalhando em uma versão modernizada de ChipWits
  • A versão reboot quer manter a diversão e o rigor de ciência da computação do original, ao mesmo tempo em que melhora vários aspectos, da curva de aprendizado até um leaderboard global competitivo
  • Ao adicionar ChipWits à wishlist na Steam, será possível receber aviso quando a versão final for lançada
  • Os objetivos imediatos das issues atuais no GitHub relacionadas ao código FORTH original são os seguintes
    • confirmar se todo o código-fonte relevante foi extraído das imagens brutas dos discos
    • corrigir problemas de alinhamento em alguns arquivos-fonte
      • alguns têm largura de 40 caracteres, outros de 64
    • identificar quais discos contêm o código-fonte mais recente
    • documentar como compilar a partir do código no Mac e no C64
    • extrair sprites e imagens brutas dos discos e convertê-los em arquivos .png
  • O objetivo final é uma versão de ChipWits em FORTH mantida pela comunidade para PCs modernos

1 comentários

 
GN⁺ 2024-11-23
Comentários do Hacker News
  • Há um texto explicando por que ChipWits foi criado em FORTH em 1984
    https://chipwits.com/2023/04/08/forth-programming-language-g...

    • ChipWits foi um dos primeiros jogos que joguei em 1984, no Apple Macintosh, meu primeiro computador quando eu tinha 6 anos
      Obrigado por terem criado um jogo de que eu gostava; também baixei a nova demo e o adicionei à minha lista de desejos no Steam
  • Forth é uma linguagem que eu queria aprender há alguns anos
    Nos computadores antigos, se você queria programas rápidos, a opção era assembly; se não se importasse que fossem lentos, usava BASIC. Acho curioso que Forth pareça bastante de alto nível, mas ainda assim tenha ficado como uma linguagem de “velocidade intermediária”

    • Por muito tempo, Forth foi, junto com C, uma linguagem padrão para desenvolvimento de hardware e drivers, e ainda é usada em vários lugares
      É uma linguagem baseada em pilha
      https://www.forth.com/starting-forth/
    • É possível comprar um computador de placa única que executa Forth nativamente
      Basta conectar um cabo USB ao computador e abrir um programa de terminal para começar na hora, o que é ótimo para mergulhar totalmente na linguagem
      Mas produtos vindos da Austrália podem levar meses para chegar, então é melhor procurar primeiro um fornecedor mais próximo
      Outra boa forma é aprender como em 1984: rodar um emulador de Commodore 64, Apple ][ ou parecido em um computador moderno e colocar nele um ambiente de desenvolvimento Forth
      A documentação da época foi escrita para iniciantes completos, então é muito fácil de acompanhar, e há muitos PDFs escaneados gratuitos na internet
    • Acho que criar seu próprio interpretador Forth de brinquedo é uma boa maneira de aprender a linguagem
      Foi fácil e divertido, mas até certo ponto é tão absurdamente fácil que, para algumas pessoas, pode parecer básico demais, ou aumentar a tentação de ir além de uma implementação de brinquedo
    • Forth é muito rápido e pode ser mais rápido até do que assembly escrito de forma ingênua, mas não é de modo algum uma linguagem de alto nível
      É preciso gerenciar a pilha manualmente, o que dá bastante trabalho, e criar o próprio FORTH é divertido. Não precisa necessariamente ser em assembly; no passado, já criei em C++ uma linguagem de script parecida com Forth
    • Os antigos computadores domésticos de 8 bits foram projetados pensando em adolescentes e crianças, e talvez também tenham tido influência de Alan Kay
      BASIC significava “Beginner's All-purpose Symbolic Instruction Code”, então combinava bem
      O Amstrad CPC 6128 também oferecia, em um disco separado, uma implementação de Logo, um dialeto de Lisp voltado à educação, e aquelas listas associadas realmente me impressionaram quando eu era criança
      Na época, “open source” não era um conceito comum, e compiladores e interpretadores de várias linguagens eram ferramentas comerciais profissionais
      [1] https://en.wikipedia.org/wiki/Amstrad_CPC#Other_languages
      [2] https://en.wikipedia.org/wiki/An_Open_Letter_to_Hobbyists
  • Parece muito legal
    Relacionado a isso, também existe http://tumbleforth.hardcoded.net/, e acho bem interessante. Se alguém já chegou até o fim, tenho curiosidade de saber como foi a experiência

    • Avancei cerca de metade em uma semana em que o trabalho estava tranquilo, e isso me lembrou das aulas de hardware na faculdade
      Fez eu pensar sobre computação de outra forma
      Ainda sou jovem e tenho muito a aprender, mas olhando para trás, parece que antes certas abstrações eram escolhidas por causa das limitações de hardware, e que nos “ramos evolutivos” das linguagens de programação atuais se acumularam muitas abstrações que não envelheceram bem, criando várias camadas de tralha sustentando o peso. É parecido com outros projetos de engenharia
      O Collapse OS pode não ser prático hoje, mas há uma sensação de libertação em se livrar de várias camadas de abstração. Parece uma forma de curtir computação ao estilo dos anos 1960 sem uma experiência de desenvolvimento horrível
      Meu projeto fantasioso atual é acompanhar essas coisas, compilar o Dusk OS em uma máquina virtual, depois migrar para uma máquina física, escrever em C um interpretador Scheme para o Dusk OS e então expandi-lo à vontade
      Antes de chegar lá, há alguns rios a atravessar. Implementei um interpretador Scheme em Python em algumas horas e gastei mais algumas horas melhorando o scanner/tokenizer. Agora estou lendo Crafting Interpreters para ver como implementar um interpretador Scheme em C. Depois de criar o interpretador em C, pretendo voltar a este guia e mergulhar de cabeça no DuskOS
    • Acabei de começar a olhar; obrigado por compartilhar
      Já gostei do jeito como o autor escreve
      Por exemplo:

      Much terser than the C version right?
      This little assembler crash course gives us a better understanding of what is compiled by the C compiler, but not how it compiles it. We don't know how it's ran either. To know that, we'd have to dig through software that weighs millions of lines of code. Maybe you'd have the patience to do it, I don't, so let's continue tumbling down the rabbit hole. We'll go bare metal and then build an operating system of our own, with a C compiler of our own. It's simpler this way.
      What’s a linker? Aw, forget about it, it’s another piece of overcomplicated software that has convinced the world that it’s essential. We won’t need one in what’s coming.

    • Virgil Dupras, autor da série Tumble Forth, também está criando o DuskOS, um sistema operacional escrito inteiramente em um Forth customizado
      A produção constante e enorme dele é impressionante. Não concordo totalmente com a filosofia do Collapse, mas a lista de e-mails do DuskOS tem exatamente o volume de tráfego ideal para acompanhar só lendo
      Depois de ver o trabalho do Virgil, experimentei um pouco de Forth, e no ano passado passei um tempo descompilando manualmente o SmithForth[1]
      É surpreendente como é pouca a linguagem assembly necessária para fazer o bootstrap da linguagem. Dá para entender perfeitamente como o Forth consegue oferecer um REPL em ambientes embarcados, e isso parece muito mais divertido do que o ciclo de desenvolvimento comum de que se ouve falar
      [0]:https://duskos.org/
      [1]:https://dacvs.neocities.org/SF/
    • No começo, foi uma reação de empolgação ao ver algo real baseado em Forth
      Depois li a página da Wikipedia e o post do blog sobre ChipWits, e o jogo original parece realmente muito legal. O logo no manual da Wikipedia também é ótimo
      Recentemente eu vinha montando uma lista de jogos antigos/novos com elementos de quebra-cabeça e programação, e pretendo incluí-lo nela. Talvez eu jogue logo depois de terminar o “jogo” de assembly ketman. Na verdade, é meio duvidoso chamar aquilo de jogo
      Espero que o novo ChipWits se saia muito bem
  • O ValForth, da Valpar, foi uma das primeiras implementações FORTH multiplataforma no ecossistema do Atari ST e tinha extensões inteligentes para jogos
    https://www.atarimagazines.com/rom/issue1/jumping_forth.php
    Como o artigo diz, também havia o FORTH da Elcomp nos 8 bits, além de livros como https://www.atarimania.com/documents/FORTH-on-the-Atari-Lear.... “Starting FORTH”, de Leo Brodie, ainda é uma excelente introdução
    Todos nós aprendemos BASIC, mas essas linguagens alternativas mostravam que realmente existiam metáforas totalmente diferentes para programar dispositivos
    Para uma criança dos anos 80, isso ampliava muito os horizontes

  • Forth parece ser uma daquelas linguagens difíceis de ler depois que você escreve uma vez, como Perl
    É fácil escrever e criar coisas nela, mas, se você voltar ao código cerca de um ano depois, parece que não vai conseguir entender o que ele faz
    Ainda assim, é realmente rápida e eficiente

    • Acho totalmente injusto que Perl tenha essa reputação
      Acabei de abrir aleatoriamente um programa em Perl bem grande, no qual eu não mexia havia mais de 3 anos, e dei uma passada pelo código-fonte; não tive nenhum problema para entender o que ele fazia
      Não acho que código Perl seja mais difícil de reler do que o da maioria das outras linguagens de programação. A dificuldade depende principalmente de quão proficiente o desenvolvedor é naquela linguagem e de quanto tempo faz desde a última vez que escreveu código nela
      Se você está muito enferrujado na linguagem, ou se nunca teve muita proficiência nela para começo de conversa, fica difícil revisitar código antigo em qualquer linguagem
      Claro que é ainda mais difícil quando o código não é seu, e a qualidade com que ele foi escrito também pesa muito. Há muito código lixo em qualquer linguagem, e, se ele já era lixo desde o início, não melhora com o tempo
    • Pessoalmente, sinto o contrário
      Acho que Forth é difícil de escrever, mas fácil de ler
  • Joguei muito no Commodore 64 quando era criança
    Era um jogo único, interessante e divertido

    • No novo jogo, mantivemos praticamente intacta a jogabilidade do original
      Não quero fazer spam no Hacker News, mas, se você jogou o original, eu adoraria ouvir sua reação ao reboot: https://chipwits.com
  • Quando eu era criança, eu queria muito ter esse jogo
    Isso me faz sentir bem velho

  • Fico curioso para saber em que foi escrita a versão moderna de ChipWits

    • Segundo o texto, é em C#, e a quantidade de código é pelo menos 10 vezes maior
      Eu adorava esse jogo. Também tinha um pacote Forth para o C64, mas nunca associei que esse jogo tivesse sido feito com ele
    • Unity e C#
  • Comprei Human Resource Machine e me diverti bastante com ele, pelo menos até ficar difícil demais
    Parece o mesmo conceito de ChipWits, ou seja, programação baseada em pilha transformada em jogo
    Fico curioso para saber como eles se comparam, se alguém tiver jogado os dois