Survive — Ainda nos sprites

survive-5_putsprite_teste

Finalmente consegui algum tempo e também inspiração para prosseguir com o “desenvolvimento em forma de narrativa” do Survive. Na publicação anterior expliquei o funcionamento e as idiossincrasias dos sprites do MSX e fiz um protótipo em C de uma rotina para funcionar como se fosse o comando PUT SPRITE do MSX-BASIC.

Bem, agora é a vez de implementar esta mesma rotina em assembly de Z80.

Um PUT SPRITE em assembly

A rotina em assembly para posicionar “corretamente” um sprite na tela do MSX, a partir do que foi esboçado em C, ficou assim:

Minha ideia foi criar algo que não precisasse de uma área específica da RAM para guardar parte dos dados e que fosse suficientemente genérica para ser aplicada em qualquer programa ou arquitetura — lembrando que não é só o MSX que tem Z80 e um VDP compatível com os da família TMS99xx da Texas Instruments.

Utilização

Para chamá-la você precisa colocar os seguintes valores nos registradores do Z80:

  • B — a camada do sprite;
  • HL — a coordenada X do sprite;
  • A — a coordenada Y do sprite;
  • D — a cor do sprite e
  • E — o padrão do sprite.

Ela não retorna parâmetro algum — exceto pelo sprite na tela, claro… Dah! — e os valores dos registradores AF, BC, DE e HL são alterados (ler: não são mais aquilo que você colocou).

Duas constantes controlam seu funcionamento em tempo de montagem:

  • SPR_MOD — Com valor 0 tratará os sprites como se tivessem o tamanho de 8×8 e com valor 1 em 16×16. Nota, ainda é preciso alterar o tamanho dos sprite nos registradores do VDP e
  • FIX_Y — Com valor 0 fará como o MSX-BASIC e colocará o sprite na linha seguinte da indicada e com valor 1 o colocará exatamente na linha (originalmente) desejada.

Sim, a mesma “regra” do exemplo em C só não segui os valores exatos.

Rotina de teste

Lembra aquele exemplo digitado diretamente no MSX-BASIC? Ele funcionou tão bem ao seu propósito que fiz algo parecido:

Só aproveitei para posicionar corretamente os sprites no centro da tela — posição 120 e não 112… 🙂

Macros

A “grande” novidade é o uso de macro nas linhas 75 a 77 para poupar a trabalheira de a todo instante digitar (e acabar errando algo) a sequência de carga de parâmetros da função, como pode ser visto nas linhas 79 a 84. A ideia é imitar a sintaxe usada PUT SPRITE no MSX-BASIC:

____put_sprite «Camada»,«Posição X», «Posição Y»,«Cor»,«Padrão»

Até é possível usar como parâmetro algo como ____put_sprite 0,(inimigoX),(inimigoY),2,1 pois o montador usará as instruções ld hl,(inimigoX) e ld a,(inimigoY) e assim usar posições da memória ao invés de valores estáticos — creio que agora ficou explicado o motivo de optar por HL e A nas colocar as coordenadas, não? 🙂

Montando e testando

Para montar e executar o programa basta usar:

$ pasmo -d -v putSpriteTest.asm putSpriteTest.rom
$ openmsx putSpriteTest.rom

Mas se quiser pode copiá-lo e testar em um MSX real. 🙂

E agora?

Com uma rotina razoavelmente decente para desenhar os sprites na tela concluída é a vez de implementá-la no código do jogo e então finalmente chegar na parte mais importante dos jogos de ação : saber quando um encostou no outro e tratar corretamente o evento.

Até!

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s