quinta-feira, 23 de julho de 2020

Matrix - Raining Code para o ZX81

Portei  para o ZX81(linha que no Brasil foi representada pelo TK-85, CP-200, etc) o programa que havia escrito para o MSX. Uma boa parte teve que ser reescrita, principalmente porque na versão para MSX eu utilizei o modo gráfico ("screen 2"). O algoritmo de animação, de um modo geral, é o mesmo, respeitadas as limitações da maquininha.

Para inciar o programa, digite RUN. Para interromper a execução, tecle NEW LINE.

Download: matrix.p





terça-feira, 14 de julho de 2020

Blackjack para o ZX81

A ideia


Ok, eu sei, "mais um blackjack para o ZX81", mas enfim... A ideia era fazer o programa em BASIC e apenas inserir umas rotinas em assembler para deixar mais bonito e fluído. E, o mais importante, aprender com o processo.

E nesta minha primeira aventura em programar para o ZX81 (no Brasil, TK-85, CP-200, etc), realmente aprendi bastante sobre essa maquininha, suas limitações práticas de hardware, a estrutura da memória, o uso da pilha de cálculo e até as limitações, ao programador, no uso do Z80 (que comento mais ao final).

Por razões óbvias, abandonei minha ideia inicial (besta) de fazer tudo direto no emulador do ZX81, utilizando o MSX para montar as rotinas em linguagem de máquina. Acabei usando o Pasmo como assembler, e o Appmake (do pacote z88dk) para gerar o arquivo ".p".  Depois eu integro ao resto do programa BASIC usando um ótimo utilitário do próprio  ZX81 (Toolkit, da Artic).

O processo


Fiz questão de completar todo o programa em BASIC mesmo, até para conhecer as peculiaridades do Sinclair BASIC, pegar intimidade com a máquina e ver até onde chegavam as otimizações. Quando não tinha mais jeito, passei a resolver com assembler.

Pra quem não conhece o ZX81 e seus clones da vida (TK82, TK83, TK85 e CP-200 aqui no Brasil), pode soar estranho utilizar rotinas em código de máquina para um jogo tão simples. Acontece que as limitações do Sinclair BASIC e o do próprio hardware exigem que partes do programa, que rodariam tranquilamente em qualquer BASIC interpretado da época, devam ser feitas em linguagem de máquina no ZX81.

Assim, desde o início, percebi que a rotina de embaralhamento das cartas e, para minha surpresa, a atualização dos valores do "caixa" e da "aposta" na tela, teriam que ser feitas em linguagem de máquina.

Uma rotina de embaralhamento adequada simula um baralho real e permite ao jogador contar cartas durante as partidas, o que dá uma profundidade extra ao gameplay. A solução em linguagem de máquina foi bastante simples e a sua execução é praticamente instantânea.

Agora, a atualização dos valores de aposta e caixa me deu algum trabalho, quero dizer, muito mais pelo estudo que demandou do que pela solução em si. Pensei inicialmente que o problema estava no cálculo dos valores em BASIC, mas não. O que acontece é que, para imprimir um número na tela, o computador converte o valor em uma string de caracteres. E é essa conversão, feita pela ROM do ZX81, que leva uma eternidade. Então tive que fazer uma rotina própria de conversão, capturando os valores das variáveis do BASIC, para depois imprimir o resultado diretamente na tela. Como resultado, a rotina ficou bastante rápida. Nesse aprendizado, percorri todos os livros que dispunha (físicos e virtuais), mas foi o Mario Schaefer (Usando Linguagem de Máquina - Aplicações em Assembly Z80) quem me deu a dica, mas não a solução. Esta, eu fui encontrar apenas nos rolos de pergaminho de Toni Baker.

O resto foi trivial, tratando mais da parte cosmética, além de otimizações menores.

O que é executado em linguagem de máquina


  • A limpeza de tela (tanto em fundo preto, como em fundo branco). A rotina do CLS do BASIC é lenta demais, na minha opinião;
  • A impressão e a animação de parte da tela inicial;
  • O embaralhamento das cartas (como num baralho real) e a animação das cartas na tela; 
  • A decodificação do valor e naipe das cartas para o BASIC ;
  • A atualização dos valores do caixa e aposta na tela;
  • A impressão das cartas. Eu até gostava da velocidade de impressão das cartas no BASIC, que conferiam uma certa dramaticidade, mas no final achei que não estava mais combinando com o ritmo do resto do jogo;
  • A leitura de teclas dentro da rotina de aposta, que possibilitou um processamento mais rápido dos valores retornados no BASIC;
  • A tela final do jogo, quando o  jogador "quebra a banca" ao ganhar mais de $ 30.000.


O que aprendi nessa aventura


  • Toda a estrutura de memória do ZX81;
  • A estrutura das linhas do BASIC na memória;
  • Local e forma de armazenamento de variáveis na memória;
  • A utilização da pilha de cálculo e rotinas de cálculo do ZX81 em linguagem de máquina;

Aprendi também que "coisas terríveis irão acontecer" (crash) na execução de uma rotina em linguagem de máquina no ZX81 se você:

  • Utilizar EX AF,AF';
  • Não devolver a pilha de cálculo na mesma posição que a encontrou no início da rotina LM;
  • Ao voltar ao BASIC, não devolver HL' com o mesmo valor que entrou na rotina em LM;
  • Num cross-assembler, inserir dados em ASCII e mandar imprimir no ZX81. Isto é óbvio, mas como sou distraído, gastei uns bons minutos debugando a rotina em assembler para chegar à conclusão que ela, em si, estava correta. O problema eram os dados em ASCII, que devem ser convertidos previamente para os valores utilizados pelo ZX81.

Agradecimentos


Agradeço a Sandro Lemos pelo apoio moral, dicas de onde encontrar utilitários para o ZX81 e pelo beta-testing. Agradeço igualmente ao Daniel Afarelli, também pelo apoio moral e pelo beta-testing.





Download: blackjack.p

domingo, 3 de novembro de 2019

Matrix - Raining Code no MSX

Implementação do efeito "raining code" no MSX, em assembler, utilizando a "screen 2". Para retornar ao Basic, tecle ESC.

Programa montado no Mega Assembler 1.0a.

Update 15.10.2020

Fiz algumas alterações e ajustes no programa .bin. Agora o programa inicia com mensagens no "terminal".

Também fiz uma versão para MSX-DOS (matrix.com). Para isso, desta vez utilizei o Gen80. No final, a adaptação foi mais simples do que imaginei. Digo, "mais simples" depois de pronto, porque levei um tempinho pra descobrir como fazer. Leiam os manuais! Agradeço a ideia da versão DOS, dada por Xavi Sorinas. ¡Muchas gracias, Xavi! 

As duas versões estão em imagens de disco separadas, dentro do pacote compactado.

Download: Matrix - Raining Code


O vídeo é da primeira versão, mas dá pra ter uma ideia de como funciona:

 

terça-feira, 17 de setembro de 2019

Taipan Clássico para MSX

Taipan é um jogo de comércio e estratégia que se passa nos mares do extremo oriente, em meados do século XIX, quando o comércio de seda e ópio era amplamente explorado por navios de bandeira britânica.

É baseado no romance Tai-Pan, de James Clavell (o mesmo autor de Shogun), que retrata o ambiente comercial na região, a relação da coroa britânica com a China e a fundação e desenvolvimento de Hong Kong como colônia britânica.

A versão original do Taipan foi escrita totalmente em BASIC para o TRS-80 (model III), em 1979, por Art Canfil. Ao que parece, esta primeira versão não foi lançada comercialmente mas, ainda assim, foi amplamente difundida e pode ser facilmente encontrada nos sites especializados dessa plataforma. No Brasil a linha TRS-80 era representada principalmente pelos micros CP-500 e CP-300, da Prológica.

Em 1982, uma versão do jogo para Apple II foi escrita por Ronald J. Berg, da Mega-micro Computers, e publicada pela Avalache Production. Esta versão acrescentou alguns elementos e tem um melhor gameplay do que a versão original, além do que, conta com alguns efeitos poucos sonoros e gráficos de alta resolução (ainda que monocromáticos). O autor escreveu a maior parte do código em BASIC (Applesoft), mas também fez uso de diversas rotinas em linguagem de máquina.

Desenvolvimento da versão MSX


O Taipan foi um dos primeiros jogos que eu vi em um computador. No caso, era um TK85, clone nacional do ZX81, que possuía uma versão simplificada do jogo, em português. Ainda que limitado naquela versão, achava o jogo sensacional por permitir que o jogador saísse navegando pelos mares da China, enfrentando tempestades, para comprar e vender mercadorias. 

Então, quando ganhei meu primeiro computador, sonhava em programar minha própria versão do Taipan, que não existia para o CP-400. Infelizmente, nunca cheguei a ter um nível de programação suficiente (na época, entre 85 e 88) para desenvolver o jogo.

Já com o MSX (a partir de 88), decobri, depois de um tempo, que havia para ele uma versão do Taipan (Ocean, 1986). Só que era muito diferente do Taipan que conhecia, razão pela qual o jogo não me agradou.

Anos se passaram, e recentemente topei com uma versão web do jogo (de Jay Link), acompanhada de várias informações interessantes. Foi assim que descobri sobre a versão para Apple II. A partir daí comecei a jogar num emulador on-line e me surpreendi com a qualidade e jogabilidade da versão Apple. Eu me diverti bastante.

Então resolvi juntar as coisas: como tinha recomeçado a programar para o MSX, seria um projeto interessante fazer a versão do Apple para aquela plataforma. Pensei que seria uma tarefa simples e rápida.

Entretanto, escrever o jogo deu muito mais trabalho do que eu imaginei, principalmente por uma questão de gestão de memória que eu, por um erro de projeção, absolutamente ignorei ao iniciar a programação. Testar e acertar a jogabilidade (gameplay) foi algo que também me tomou bastante tempo, uma vez que fiz questão de caprichar o máximo que pudesse neste quesito. No final das contas, consegui incluir todos os elementos que planejei, adicionando cores, efeitos sonoros e música à versão do Apple II e até algum texto original do TRS-80 que havia sido suprimido naquela versão.

Toda a programação foi realizada utilizando o MSX-BASIC e o Mega Assembler, a maior parte do tempo emulados na versão Linux do openMSX. Utilizo o mesmo setup para desenvolvimento, tanto o real quanto o emulado: Expert 1.1, Mega Assembler 1.0a (cartucho) e interface de disco DDX 3.0f. Pode dar mais trabalho, mas tenho prazer o tempo todo em que estou imerso no ambiente MSX. Não tenho a mesma sensação ao utilizar um cross-assembler no PC (aliás, não tenho sensação alguma). Penso que é o prazer da caminhada que vale, não apenas o resultado final. 

Particularidades da versão MSX


  • O jogo roda em qualquer máquina com 64kB de memória RAM, desde que esta esteja em um único slot ou subslot;
  • Procurei fazer o jogo o mais universal possível, mas acabei por fazer a distribuição por imagem de disquete, para facilitar o carregamento das instruções on-line. Ainda assim, tecnicamente, o Taipan Classic pode ser carregado via fita cassete;
  • No jogo, não há necessidade de pressionar ENTER após digitar uma opção. Isso agiliza bastante o jogo;
  • Na tela principal, utilize a tecla ESC para retornar ao menu imediatamente superior ao que você se encontra. Por exemplo, se você selecionou navegar, mas se arrependeu e quer comprar ou vender mais alguma coisa, pode retornar teclando ESC;
  • Na tela principal, sempre que o jogo estiver esperando que você digite uma opção ou valor, é possível mudar o tema de cores de fundo/frente pressionando a tecla SELECT. Há 8 temas disponíveis;
  • O jogo acaba quando você fica milionário e não há opção para continuar;
  • Apesar da tradução para português, tentei manter o texto do jogo o mais próximo possível do original, presente nas versões TRS-80 e Apple II;
  • Da mesma forma, o texto das instruções do jogo (e o ASCII art lá encontrado) também é, em sua maior parte, tradução dos originais das versões TRS-80 e Apple II, com exceção das particularidades da versão MSX;
  • Acrescentei na versão MSX o texto dos eventos de variação de preço da versão TRS-80, que havia ficado de fora da versão do Apple;
  • Por razões óbvias, não implementei o bug dos "juros negativos" presente na versão do Apple II. Bug é bug, e não feature.

 

Tributo 

 

Coincidindo este ano de 2019 com os 40 anos de lançamento da versão original, fica aqui minha homenagem e agradecimento (in memorian), a Art Canfil, por ter criado esse jogo simples e brilhante.

Video com a música de abertura:

Gameplay (comércio/navegação/batalha):


Download: Taipan - Classic  [última atualização 18.09.19, 20:38]

Obs.: Considero ser ainda uma versão beta, portanto peço a gentileza de que os bugs sejam reportados para o email deste blog.

quarta-feira, 21 de agosto de 2019

Color Poker (TRS-Color)

Em 1988, eu lá com meus 13 pra 14 anos, depois de longa campanha finalmente convenci meus pais sobre as vantagens do MSX em relação ao CP-400, que eu tinha desde 85. Mas a condição, obviamente, era vender o CP-400 para ajudar a comprar um Expert, também usado.

Eu topei, sem problema. Gostava do meu amigo CP-400, de tantos anos, mas o MSX era uma máquina muito superior. A reação da minha mãe, por outro lado, foi de decepção. Ela me perguntou: "E meu jogo?".

Ela se referia ao Color Poker, que havia sido publicado na revista Micro Sistemas nº 62. Eu o havia digitado nas férias de verão de 86/87 e ela, pra dizer o mínimo, simplesmente adorava jogar. Volta e meia me pedia pra carregar o jogo. Eu saia de casa por qualquer motivo, voltava horas depois, e ela ainda estava lá, cada vez mais "rica" na jogatina. "Pena que o dinheiro é de mentira!", dizia ela, dando risada. Várias vezes eu tive que, constrangido, pedir licença para ela (o micro ficava no meu quarto) só para depois ouvir "Peraí que eu já ganhei uma grana preta! Não dá pra desligar agora e perder todo esse dinheiro". Vê se pode.

A solução para ganhar o apoio dela na troca dos micros foi dizer a ela: "Pô mãe, com o MSX eu vou fazer um jogo de pôquer 10 vezes melhor pra você". Ela parou e ficou me olhando, desconfiada da minha promessa. De fato, ela tinha razão pra desconfiar. Já com o MSX, eu me lembro de ter mostrado algum outro jogo de pôquer que arrumei, tentando substituir o "dela". Mas ela dizia que não era igual e não tinha graça. Ela queria que fosse igualzinho. Eu até cheguei a ensaiar fazer uma conversão da listagem, mas cheguei à conclusão, na época, que era mais fácil reescrever o jogo do zero. E acabou que, claro, nunca fiz o bendito. De quando em quando eu escutava "E meu jogo hein? Fiquei a ver navios...". Confesso, engambelei minha mãe nessa história.

"Fast Forward" para 2016. Eu havia abandonado a programação desde 92, quando resolvi mudar de carreira e abandonar o curso de engenharia da computação que iniciara um ano antes. Era janeiro, eu estava de férias... Eis que um belo dia, viajando pela internet, me deparo com o fantástico site Datassette. Entrei no site, entrei nas revistas, mergulhei nas páginas, fui transportado em espírito para os anos 80: as matérias, as propagandas, as listagens... Então eu vi, numa das Micro Sistemas que eu tive, lá estava a listagem do Color Poker. "Aaahhhh... vou digitar isto aqui!". Descobri um emulador de TRS-Color para Linux (xroar), compilei, funcionou, mandei ver. Com um prazer enorme, gastei mais alguns dias, enquanto redescobria o Color Basic, corrigindo e melhorando o programa da listagem original. 

Assim, quase 30 anos depois, cheguei na casa da minha mãe com um pendrive e instalei no computador dela o xroar e o Color Poker. Ela só tinha que clicar num ícone para o carregamento automático do jogo. Programa na tela verde do TRS emulado, perguntei a ela: "Então, lembra disto aqui?". Ela, "Nooooossaaa, o meu jogo de pôquer! Que legal!". 

Promessa cumprida, ela agora tem mais uma opção entre o Mahjong e o Aisleriot da vida. Às vezes ela chega pra mim e me fala: "Hoje quebrei a banca no pôquer! Pena que o dinheiro não é de verdade!", e dá risada.

Compartilho aqui o programa digitado, de autoria de Weltman Andrade de Carvalho. Minha lista com a descrição das alterações (umas 20) está num arquivo texto, dentro do pacote, que inclui imagens de disco (.dsk) e de fita (.cas) do programa. Com todo respeito ao Sr. Weltman, os sons do programa estão bem melhores agora.

E essa foi, resumidamente, a história da minha volta à programação, ou melhor, o meu início na retroprogramação, que eu devo à imersão nostálgica proporcionada pelo Datassette e, claro, à minha mãe.

Download: Color Poker - TRS-Color
 





Matrix - Raining Code para o ZX81

Portei  para o ZX81(linha que no Brasil foi representada pelo TK-85, CP-200, etc) o programa que havia escrito para o MSX. Uma boa parte tev...