Minhas aplicações MSX

Aprendi a programar em Basic durante uma atividade extracurricular na minha escola primária (ARCE) nos últimos dois anos com Juan Carlos, um professor que veio de Salvador Batlle.

Mais tarde, comprei um computador MSX (um Sony Hit Bit 501P (Sony HB-501P)) e, juntamente com um amigo, exploramos as possibilidades da máquina, passando tardes inteiras digitando programas que vinham escritos em papel em algumas revistas MSX da época.

O próximo passo, depois de aceitar o desafio do meu professor de matemática, foi aprender a programar em linguagem de montagem MSX (processador Z-80).


Neste site, pretendo compartilhar algumas das melhores aplicações que programei naquela época em formato.cas:

  • Flute: Um programa para uma competição na minha escola secundária (IB Gabriel Ferrater), quando eu estava no primeiro ano do BUP (em BASIC).
  • Design: Um designer gráfico, para projetar os gráficos para os jogos que ele iria programar no futuro (no Assembler Z-80).
  • Zodia: Um jogo de naves espaciais, com rolagem vertical incluída (no Assembler Z-80).
  • Habla: Um aplicativo de texto em fala para espanhol. (Uma combinação de Z-80 Assembler e BASIC).
  • Tetris: Minha versão do popular jogo Tetris. (em Assembler Z-80).
  • Ristu: A semente do que era suposto ser um jogo de labirinto, inspirado em O Labirinto de Galious da Konami. Fiquei sem memória... (no Assembler Z-80).
  • Eu também compartilho os códigos-fonte dos aplicativos no Assembler, juntamente com o assembler Hisoft que eu comprei de volta no dia, e que eu compartilho entre os arquivos.cas no download (nem todos eles funcionam).


Também vou compartilhar algumas modificações que fiz no aplicativo de interface de linha de comando wav2cas, programado por Vincent van Dam.

Agora há uma função opcional para despejar o sinal processado por wav2cas para um csv, entre outros novos recursos.

Também compartilharei uma série de scripts complementares para trabalhar com.cas, ou com o novo.csv das amostras de sinal wav2cas:

  • histogram.py : Script para obter valores de histograma de amostras.
  • .
  • split_msx_tapes_into_singular_files.py : Divide arquivos.cas em arquivos.cas contendo arquivos individuais. Lida com tipos de arquivos casdir, além de arquivos de origem asm (HiSoft Assembler).
  • .
  • extract_msx_sources.py : Permite extrair um arquivo.txt com cada arquivo de origem de um arquivo.cas (ascii e asm). Não funciona muito bem, mas pode ser um começo.
  • .

Flute (1987)

Assista vídeo

Designer Gráfico (1989)

Assista vídeo

Zodia (1987-1989)

Assista vídeo

Sinthesizer (1991)

Assista vídeo

Tetris (1992)

Assista vídeo

Fala (1991)

Assista vídeo

Ristu (1990-1992)

Assista vídeo

Sessão com o montador

Assista vídeo

Descrição do programa

image
image

O programa Flauta foi criado para participar de uma competição de software na minha escola secundária (IB Gabriel Ferrater), quando eu estava no primeiro ano do ensino médio.

Destina-se a ser um aplicativo para revisar a posição do dedo para tocar cada nota em uma flauta.

O programa é uma desculpa para exibir uma interface de usuário no modo gráfico.

Você pode ver um vídeo do programa funcionando vídeo de demonstração

image
image

A ideia do designer gráfico (Disea) era ter uma ferramenta para ser capaz de projetar adequadamente os gráficos para os jogos que ele iria programar no futuro.

Está programado no Assembler Z-80.

Eu terminei de programá-lo depois de dois meses intensivos de desenvolvimento.

É o programa mais rentável que programei, graças à sua utilidade e ao número de vezes que o usei.

Com ele, você poderia projetar telas de apresentação, sprites e personagens de jogos.

Você pode ver um vídeo do programa funcionando vídeo de demonstração


Há também uma demonstração mostrando as melhores capturas de tela e gráficos que eu criei com ele: Vídeo dos melhores ecrãs

image
image

Programei o jogo de naves espaciais Zodia inspirado nos jogos de naves espaciais de rolagem da Konami.

Está programado no Assembler Z-80.

É dedicado ao meu professor de matemática (J. R. M. - José Ramón Molina), por me dar a ideia de aprender a montar.

O jogo está em SCREEN 1, com gráficos mais leves do que SCREEN 2.


Para te dar uma ideia de como eram as coisas...

Obviamente, em algum momento a pontuação alcançada pelo jogador teve que ser impressa...

Os números eram equivalentes a uint8 ou uint16

Para o placar, eu escolhi o tipo uint16 (não poderia exceder 65535)

Para imprimir os dígitos, o número teve que ser convertido para Base-10, o que eu fiz dividindo por 10 n vezes, tomando o moduli e quocientes.

Mas... o Z-80 não tinha instruções no Assembler para multiplicar ou dividir!! E agora?

Bem, é fácil... dividimos, subtraindo o divisor do dividendo N vezes, e aumentamos o quociente desde que o resultado não transborde...

Que brega!

Bem, é assim que as coisas eram...


Há um vídeo que mostra o pergaminho completo (com alguns erros): Vídeo de rolo completo


Você pode ver um vídeo do programa funcionando vídeo de demonstração

image

Depois de terminar o ensino médio, eu queria tentar minhas habilidades de programação em linguagem de montagem novamente.

O objetivo era programar um sintetizador adaptado ao chip de som MSX (com três vozes, e aplicando efeitos de reverb (mudando rapidamente (manualmente) a frequência emitida para cada nota pressionada) e desligando a nota quando a chave foi lançada.

O estado das três teclas do sintetizador pressionadas ao mesmo tempo (as três vozes do chip) foi lembrado.

Eu também queria fazer uso das freqências associadas a cada nota, que encontrei codificada em uma área da ROM MSX durante uma pesquisa.

Para realizar a busca, eu continuei, simplesmente conhecendo a frequência da nota A ((fork de ajuste) 400 Hz, e aplicando um fator de raiz-doze de 2 (2 (1/12)) (uma oitava, doze semitons)).

E, em seguida, procurando os elementos correspondentes na ROM, com números de tipo uint16.


Você pode ver um vídeo do programa funcionando vídeo de demonstração

image

Durante o verão entre meu último ano do ensino médio e meu primeiro ano da Teleco (1991), trabalhei intensamente como garçom no Bar Argente's em Salou.

Peguei o ônibus de ida e volta, e no caminho de volta, antes de voltar para casa, eu pararia por um arcade para jogar alguns jogos do fabuloso Tetris...

Depois de mais de 60 jogos desse jogo, eu me tornei um especialista, e eu amei encontrar esse jogo quando o destino me levou por acaso a um lugar onde havia máquinas de arcade.


Em 1992, decidi programar minha versão do Tetris, no Assembler Z-80 e no tempo recorde de três dias.

Naquela época, eu já havia flertado um pouco com a digitalização dos sons (da fita MSX), e na tela de espera do jogo, uma música é tocada através do alto-falante. (o emulador openMSX emula perfeitamente esse detalhe).


Você pode ver um vídeo do programa funcionando vídeo de demonstração

image

Não me lembro quando me deparei pela primeira vez com a possibilidade de digitalizar sons da fita MSX.

Mas lembro-me de que nem sabia em que frequência estava a fazer a amostragem... apenas coloquei um loop de atraso entre amostras para digitalização, e o mesmo loop de atraso para reprodução através do alto-falante.

Descobri que quando esse atraso era muito grande, o som não se reproduzia bem. Mais tarde, aprendi através da teoria da amostragem que esse efeito era conhecido como aliasing.


De uma série de televisão que eu gostei, tive a ideia de que um computador poderia "pronunciar" uma frase escolhida pelo usuário.

Então, com o novo brinquedo da digitalização, eu me propus a obter todos os fonemas digitalizando minha própria voz.

O próximo passo seria passar pelas letras de uma frase, separá-la em fonemas e emitir cada fonema por sua vez.

Sim, um pouco pegajoso... mas não deu mais...

Programei as regras da fonética espanhola em um aplicativo Assembler Z-80, com a interação com o usuário, pedindo a sentença em BASIC.


Com o emulador openMSX você pode emular perfeitamente a execução desse pequeno programa.


Você pode ver um vídeo do programa funcionando vídeo de demonstração

image

Bem, depois de passar incontáveis horas jogando The Maze of Galious, decidi criar um jogo de labirinto inspirado por ele, e com uma aparência visual muito semelhante (com minhas limitações).

O programa foi novamente no Assembler Z-80.

Eu criei as telas (em uma matriz de tela de 14 x 12) com base em blocos de caracteres 4x4 que foram combinados como um quebra-cabeça.

Assim, uma tela ocupava 5 x 8 40 bytes, embora uma ocupação de memória fixa tivesse que ser adicionada para definir os 4 x 4 blocos.


Eu resgatei várias implementações para mover o personagem ao redor do mundo, embora a mais completa ('PERFEC'), eu não consegui fazê-lo funcionar no emulador.

Acho que isso tem a ver com o fato de que o código-fonte em montagem ocupava muito espaço e entrava em conflito com os dados da área BASIC, e o montador, nessas condições, se recusou a montar o programa.

Lembro-me de que um dia eu tive que fazer o truque de mover a área de memória BASIC mais alto (com algumas cutucadas maravilhosas que eu não me lembro mais).

E sem eles, não há como fazer essa implementação funcionar (embora esse código-fonte tenha sido extraído corretamente nos.cas).


Você pode ver um vídeo do programa funcionando vídeo de demonstração

image

O montador é uma parte fundamental do desenvolvimento no Assembler Z-80.

Eu comprei o devpack do hisoft e aproveitei ao máximo, fazendo uso intensivo dele.

Havia também um monitor, mas eu nunca soube como fazê-lo funcionar...


No vídeo você pode ver um exemplo de uma sessão com o montador vídeo de demonstração

Vídeos

Downloads