quinta-feira, 21 de novembro de 2019

Saiu Mini Battle Tank


E hoje é dia de novidades: foi lançado Mini Battle Tank, mais um jogo a aparecer na competição BASIC 2020, desta feita criado por Tomás Pérez, com música de  AsteroideZX.

Será mais um para analisar nos próximos dias, mas tenham em atenção que apenas corre em 128K.

Dirty Dozer


Nome: Dirty Dozer
Editora: NA
Autor: Miguetelo
Ano de lançamento: 2019
Género: Plataformas
Teclas: Não redefiníveis
Joystick: Kempstons, Sinclair
Memória: 48 / 128 K
Número de jogadores: 1

Miguetelo tem o condão de criar sempre jogos extremamente originais, juntando vários géneros, normalmente um misto de plataformas com puzzle. Isto já tinha acontecido com Robots Rumble, lançado há mais de um ano e que por uma unha negra não tinha obtido o galardão de Mega Jogo, ou até Double Bubble, de 2016. E Dirty Dozer não foge muito do figurino habitual dos seus jogos, pelo que quem já apreciava o seu estilo, como é o nosso caso, terá amplos motivos para encarar este novo desafio com grande expectativa. Será que estará à altura? Vamos ver...

Imaginem que pegam em Sokoban, juntem-lhe umas pitadas de platformer, mais umas pitadas de arcade, e voilá, têm Dirty Dozer. Um aparte, apenas: este foi dos jogos que mais dificuldade tivemos em definir o estilo. Considerámos que era um jogo de plataformas, mas se fosse puzzle ou de acção, não escandalizaria ninguém.


Convém também explicar de forma muito sintética em que consiste o Sokoban: é um quebra-cabeças no qual movimentamos cubos ou caixas, para serem colocadas em locais específicos. Pelo meio encontram-se muitos obstáculos, além de que apenas se pode movimentar uma caixa de cada vez, não podendo ficar entalada nas paredes, sendo assim necessário muita ginástica mental para se conseguir resolver a charada. Também isto se passa neste jogo, pois o objectivo final de cada um dos 22 níveis é com uma retro-escavadora (ou bulldozer, como preferirem, dai o título do jogo), colocar uma caixa no local indicado para o efeito.

No entanto, e ao contrário do magnífico SokoBAArn, por exemplo (mais um jogo inspirado no Sokoban), que apresenta quebra-cabeças para serem resolvidos de forma pausada, quase pé ante pé, isso não acontece em Dirty Dozer. Não que exista um tempo limite para se completar cada nível, mas porque surgem então os restantes elementos de arcada. Os primeiros níveis até são bastante pacíficos, mas a partir de certo ponto começam a aparecer os obstáculos móveis. Raios que patrulham os caminhos, e até os célebres tubos que esmaga quem passar por baixo (a fazer lembrar a saga Monty), são o pão nosso de cada dia nos níveis mais avançados. Mas existe pior, pois uns seres semelhantes a gárgulas disparam bolas de fogo que se nos atingem, teremos que recomeçar o nível com menos uma vida.


Além disso temos uma preocupação extra, não só teremos que seleccionar muito bem o caminho a fazer, para que a caixa não fique entalada em algum ponto que depois não possa ser movida, mas esta também não pode ser atingida por nenhum dos inimigos. Acreditem que não é fácil ter que controlar a retro-escavadora e a caixa ao mesmo tempo, sendo por vezes necessário fracções de segundo para se conseguir movimentar a caixa de forma segura, ao mesmo tempo conseguindo desviar a retro-escavadora dos inimigos.

Por outro lado, a retro-escavadora tem capacidade de destruir os blocos de tijolo. E terão que o fazer ainda antes de começar a movimentar a caixa, pois a grande maioria deles apenas têm como finalidade impedi-la de chegar ao local de destino. No entanto, ainda antes de começar a destruir-se tudo o que seja possível, convém delinear o caminho que se vai fazer, não vamos cair para algum ponto que depois não se consiga chegar à caixa. Como podem ver, problemas não vão faltar para quem aceitar este desafio.


Os cenários estão também muito bem engendrados por Miguetelo. Quase sempre o caminho mais curto não é o que deve ser tomado (não digam que esperavam outra coisa?), e em alguns dos níveis existem plataformas móveis e tele-transportadores que nos levam a pontos que doutra forma seriam inalcançáveis. Nota máxima neste aspecto para Miguetelo, que ainda por cima juntou cor com fartura, criando um espectáculo visual estupendo.

Quanto à música, esta é agradável, se bem que um pouco repetitiva, e confessamos que a tivemos que desligar, não por que ela não fosse boa, nada disso, simplesmente porque para um jogo que requer muita concentração, como é o caso de Dirty Dozer, qualquer melodia pode distrair-nos, fazendo desviar do objectivo principal.

Dirty Dozer é assim um dos grandes jogos de 2019, se não em tamanho, embora 22 níveis ainda dê para muita coisa, mas em termos de qualidade. É inovador, fazendo-nos lembrar alguns dos jogos de Denis Grachev (embora tenha sido criado com o AGD), e também de Dave Hughes, e tem o condão de nos agarrar até ao último nível. Pode aqui ser descarregado, e esperem também para breve a edição física contendo níveis extra. Iremos manter-vos informados quanto a isso.

quarta-feira, 20 de novembro de 2019

Cabeçalho (MIA)


O menu inicial de Cabeçalho é exemplificativo daquilo que se consegue fazer com este pequeno utilitário, bastante interessante, diga-se. Correndo o header de qualquer jogo ou programa, imediatamente é-nos dado o nome, linguagem de programação e o comprimento. Muito útil para quando se queria criar cópias com os copiadores e saber se existia memória suficiente.

O programa vinha num dos lotes do Vasco Gonçalves e pode aqui ser descarregado.

Labirinto (MIA)


Labirinto é a versão traduzida para português de Maze (também conhecido por Corridors of Fear), jogo lançado nos primeiros tempos do Spectrum, publicado com type-in pela Your Computer em 1983. Existem 1.001 jogos do género, sendo este apenas mais um que nada de novo trouxe ao panorama do Spectrum. Vale pela curiosidade, podendo aqui ser descarregado.

segunda-feira, 18 de novembro de 2019

Actualização do Spectrum Next


E aqui está, Henrique Olifiers acabou de comunicar o início da produção dos teclados Spectrum Next. Quer isso dizer que no final do mês começa a montagem das primeiras 1.000 unidades, que serão de seguida enviada para os backers. Só depois serão produzidos os restantes dois lotes de 1.000 unidades cada, dando tempo à SMS para enviá-los faseadamente.

Outra das novidades é que o modo 28MHz está de regresso. inteiramente compatível com a ULA e com o vídeo. O Next irá estar mais rápido que nunca...

Como emular o FDD no Fuse?


Esta é a questão que respondemos hoje, e graças ao Ricardo Reis. Mas antes vamos desvendar um pouco a história que levou a que sentíssemos a necessidade de emular o FDD.

Há cerca de um mês deparei-me com uma oportunidade irrecusável: adquirir um FDD + Interface, que já procurava há muito. Na altura ainda não o sabia, mas a vendedora tinha ainda em sua casa 23 disquetes com material pertencendo ao seu pai, Edmundo da Assunção, que de forma amadora criava programas em Basic. Palavra puxa palavra e a vendedora falou nas disquetes e em como ficaria contente se recuperássemos o seu conteúdo, pelo que também nos cedeu as mesmas. Infelizmente o FDD ainda não estava operacional (o Interface tinha queimado, possivelmente devido aos muitos anos sem ter sido usado), mas esteticamente o material encontrava-se impecável.

O Ricardo Reis tomou então em mãos a tarefa de preservação das disquetes, criando os ficheiros digitais (que já os temos). No entanto, como lê-los, não tendo uma FDD? E então, por portas e travessas, o Ricardo lá descobriu como o fazer nos emuladores e até criou um tutorial para o efeito, que agora partilhamos, para que todos consigam ler estes ficheiros.

Torna-se assim simples de transformar o Fuse numa unidade FDD, lendo os conteúdos das disquetes. A tarefa seguinte será transformá-las em ficheiros .tap, para que possam ser lidos em qualquer emulador. Não será possível fazê-lo em todos, mas aqueles que conseguirmos, serão partilhados com a comunidade (salvo os que têm material pessoal pertencente ao seu antigo dono). E desde já vos podemos assegurar que há muita coisa apetitosa nestas disquetes, com muitos MIA's e homebrew nacionais...

Para já, e enquanto não começamos a partilhar este material, poderão descarregar o excelente tutorial elaborado pelo Ricardo Reis, assim  como o sistema operativo TOS em formato .dsk, que poderá ser necessário para se poder usar o emulador em toda a sua glória.

Poderão aqui descarregar o tutorial, aqui poderão descarregar o sistema operativo, e poderão aqui vir buscar o manual do FDD, para começarem a entrar neste sistema operativo (caso não o dominem já).

domingo, 17 de novembro de 2019

Ficheiro agora completo


Em tempos tínhamos disponibilizado pela comunidade Ficheiro, a tradução feita pela Timex de VU-File. Agora, graças ao Miguel Lopes, que gentilmente nos cedeu todo o seu espólio de cassetes, conseguimos recuperar uma capa em condições, as instruções, bem como o lado B da cassete (também só tínhamos o lado A), que inclui o programa Países.

Este lançamento encontra-se agora completo, podendo aqui ser descarregado. O nosso agradecimento ao Miguel, ficando prometido mais novidades das suas cassetes no novo ano.

Paintball 2048


Nome: Paintball 2048
Editora: PCnonoGames
Autor: Sergio thEpOpE, Juan Jesús Ligero, Sergio Vaquer
Ano de lançamento: 2019
Género: Shoot'em'up
Teclas: Não redefiníveis
Joystick: Não
Memória: 48 K
Número de jogadores: 2

A PCNONO Games já nos tinha surpreendido no início do ano com Dead Zone, não tanto pelo jogo em si, mas pela temática envolvida. E desta vez volta a trazer um jogo bastante original para o Spectrum, pese embora algumas (muitas) fragilidades. Mas já lá iremos…

Estamos então no ano de 2048, e o desporto de paintball continua a manter as bases tradicionais (e presumimos que também ainda exista o TC 2048). No entanto foram introduzidas novas armas, nomeadamente minas, mísseis, escudos de protecção, e até chaves que permitem ir a locais que oferecem  as armas referidas. Além disso os pontos que vamos obtendo ao longo das batalhas conferem a possibilidade de se comprar também esses equipamentos. Existem assim muitas novidades relativamente ao jogo tradicional, contrariando até um pouco aquilo que é referido na apresentação de Paintball 2048 pela equipa responsável.

Paintball 2048 pode ser jogado no modo de um jogador contra o computador, no entanto foi projectado para dois jogadores “humanos” em simultâneo, e isso nota-se claramente assim que o carregamos. No fundo, um pouco o que acontecia com Glazx, também lançado este ano, embora aqui exista o modo de sobrevivência, caso queiramos então jogar contra a máquina. No entanto, neste caso o desafio (e diversão), é muito limitado…


Mas comecemos pelo modo de dois jogadores, sem dúvida o mais interessante. As duas equipas, de cinco jogadores cada, são colocadas no terreno. Existem também cinco diferentes cenários, recheados de obstáculos normais nos campos de paintball, tais como barreiras, paredes, etc., mas também alguns túneis que permitem aceder a vários pontos sem que se seja atingido pelas balas inimigas. Como não existe limite de balas, nem estas custam dinheiro como no desporto original, é conveniente termos dedo leve no gatilho. Vence a batalha quem conseguir eliminar toda a equipa adversária, ou em alternativa chegar à bandeira adversária. Cada batalha ganha concede um ponto (e dinheiro para gastar em armamento), e vence o jogo a primeira equipa a obter cinco pontos.

No entanto, o jogo tem algumas lacunas graves que afectam a sua jogabilidade, em especial no modo de sobrevivência. O principal problema é a inteligência artificial dos elementos não controlados por nós, incluindo os da equipa adversária no modo de dois jogadores. De facto, estes têm a tendência de andar caóticamente pelo cenário de jogo, disparando erraticamente para todo o lado. Basta estacionarmos num ponto onde não nos consigam atingir, disparando continuamente à espera que o inimigo entre na linha de fogo, para vencermos a batalha (mais tarde ou mais cedo). Se estivermos no modo de dois jogadores, o desafio pode prolongar-se ad aeternum, como facilmente se percebe. Assim, para que o desafio possa ser minimamente estimulante, será necessário haver um acordo tácito entre os dois jogadores de que não entrarão num sistema de anti-jogo, fazendo a analogia para desportos de equipa como o futebol. Nesse caso consegue-se optimizar  as potencialidades de Paintball 2048 e poderá tornar-se divertido, até, em especial quando temos um adversário à altura.


A sensação que temos com Paintaball 2048, e ao contrário do que aconteceu com Dead Zone, é que foi tudo feito um pouco à pressa, carecendo de alguma afinação e dos habituais testes, fundamental para se limar algumas arestas. Basta ver o ecrã inicial, onde nos é permitida a opção de escolher o teclado. Para isso carrega.se na tecla “Q”, a indicada no menu, para logo nos apercebermos que não faz o indicado. A tecla correcta será a “0”, sendo aquela que permite a escolha do teclado. Por estes pormenores se nota que tudo foi feito às três tabelas. Bastavam talvez alguns acrescentos (tempo limite de jogo, por exemplo, que evita os desafios ad aeternum), ou até uma melhor definição dos cenários, para o tornar bastante mais atractivo. 

Sem dúvida que o sistema de armamento diferenciado é uma excelente ideia, mas na prática pouco traz ao jogo, pois a arma standard continua sempre a ser mais eficaz, e se nos arriscamos a tentar ir aos pontos onde utilizamos as chaves, o mais provável é que o adversário vá directo à nossa bandeira, vencendo a batalha. Existem assim opções um pouco redundante, e até mesmo o próprio sistema de disparo não é o mais adequado, pois se estivermos a querer utilizar a chave ou uma das outras armas, não temos possibilidade de disparar a standard (e mais eficaz).

Parece-nos então que se desaproveitou uma boa ideia, e que com um pouco mais de maturidade, se conseguiria ter um desafio bastante melhor. Assim, tal como está, fica-se pela boa ideia e originalidade…

sábado, 16 de novembro de 2019

Laser (MIA)


Esta semana temos para vos apresentar o segundo jogo da autoria de José Oliveira para ZX81 que conseguimos preservar com a ajuda do Kelly Murta. Este post vem na sequência do anterior - Bala - que podem consultar aqui.

Essencialmente o conceito por detrás deste jogo é o mesmo, já que nos é dado um ponto aleatório no ecrã, onde teremos de tentar acertar indicando o ângulo a que queremos que seja disparado o laser.

Podem descarregar aqui Laser, não esquecendo, como já referimos no post anterior, de que precisam de um emulador específico para o ZX81. A nossa recomendação é o Eightyone, cujo link deixámos aquando da disponibilização de Bala. Relembramos ainda que precisam digitar "run" no emulador para entrar no jogo.

Tal como anteriormente, partilhamos convosco o código Basic original, caso tenham curiosidade em ver como foi construído este pequeno jogo:

   5 REM "LASER"
   7 LET P=0
  10 LET G=RND*35+10
  11 LET H=RND*36+2
  12 PLOT G,H
  15 GOSUB 100
  16 PLOT G,H
  20 FOR X=1 TO 46 STEP (1/(ABS Y+(Y=0)))*(ABS Y>1)+(ABS Y<=1)
  25 IF ABS (X*Y+20)>41 THEN GOTO 45
  30 PLOT X,Y*X+20
  35 IF ABS (H-X*Y-20)<2 THEN GOTO 150
  40 NEXT X
  50 GOTO 10
 100 PRINT AT 0,0;"QUAL O ANGULO ?"
 110 INPUT Y
 115 LET Y=TAN (Y*PI/180)
 116 CLS
 120 PRINT AT 20,15;P
 130 RETURN
 150 IF X<>(INT G) THEN GOTO 36
 151 PRINT "BUM"
 155 LET P=P+1
 160 GOSUB 120
 170 GOTO 10

A história secreta da Ultimate, por Rev Stuart Campbell


A Your Sinclair era a minha revista de eleição nos anos 80, e um dos seus colaboradores mais conhecidos foi Stuart Campbell. O punk de serviço da revista notabilizou-se pelas suas críticas cáusticas, muitas vezes a arrasar completamente os jogos, assim como pela famosa lista dos 100 melhores jogos, com Deathchase à cabeça. Mas também pelos seus enormes conhecimentos e experiência na matéria, criando um culto à sua volta, e que ainda se mantém até hoje (não é por acaso que é conhecido por Reverendo).

Ultimamente tem também andado mais activo, e feito até alguns trabalhos de investigação. O que apresentou muito recentemente anda à volta dos jogos nunca lançados pelos irmãos Stamper (Ultimate), e lança algumas questões bastante pertinentes.

Convidamo-vos a  verem o artigo aqui.

sexta-feira, 15 de novembro de 2019

A Capital: POKES & DICAS - 08 de Janeiro de 1988

Entramos em 1988, um ano que irá ser brilhante e com alguns dos títulos mais emblemáticos do sistema, como poderás constatar ao longo dos próximos meses. Infelizmente conforme o ano for avançando iremos ter mais "hiatus" semanais de suplementos em falta. Caso tenhas alguns dos que não estão disponíveis, não deixes de nos contactar a fim de serem preservados.

A nível de jogos, como não seria de esperar, os títulos em destaque ainda são do final de 1987.

Freddy Hardest e Nebulus são os jogos TOP deste suplemento. Sendo o primeiro um dos grandes sucessos da Dinamic, que fez bastante furor em Potugal, tendo tido destaque na rubrica Ponto por Ponto, da RTP 1. Nebulus é também um título muito curioso da Hewson, apesar de não ter sido um campeão de vendas, mas é um dos jogos com um dos melhores efeitos gráficos no ZX Spectrum, no que diz respeito à rotação tridimensional da torre onde decorre a ação. Caso não conheçam é um jogo que vale a pena experimentar.


Os mapas dos leitores continuam a merecer destaque, quer seja pela qualidade ou pela originalidade. Mas infelizmente nem todos têm o talento do nosso conhecido João Cruz, como é o caso do Tiago Brites de Almeida, e o seu mapa, quase imperceptível, do Howard the Duck.


No espaço Linha a linha... temos um excelente utilitário a ser programado, que serve para observar e/ou modificar a informação contida no header de qualquer programa.

Não perca o suplemento desta semana na nossa Dropbox.

Demo de Black & White


aqui tínhamos dado conta que Black & White estaria para sair brevemente. E agora, ainda antes do lançamento final, a equipa Pat Morita disponibilizou uma demo para aguçar o apetite à malta. E resultou, pois este vai ser seguramente um dos melhores jogos de 2019.

Podem vir aqui descarregar a demo, enquanto não sai a versão completa...

O beeper do Spectrum

O ZX Spectrum 48K apenas tem um altifalante simples, de 20mW, 40 ohms.


Não tem um chipset para fazer controle complexo de som. O som é apenas gerado por 1 bit. O altifalante é activado com o bit a 0, e desactivado com o bit a 1.  É necessário alternar o bit a 0 e 1 para gerar frequências (sons).

Enquanto se fala com o altifalante (ou se conta ciclos T), a CPU fica "presa", por o ZX Spectrum não ter um chipset dedicado para controlar o som.

Um OUT para a porta da ULA $FE controla o altifalante no bit 4.


Saliente-se que no carregamento de cassetes, o som que se ouve é por ao nível de hardware, quer o EAR, quer o MIC, estarem conectados ao speaker. O som não é enviado ao speaker por software.

Ao nível de código máquina, ou se pode falar directamente com o altifalante, ou invocar a rotina da ROM para gerar frequências 03B5: THE 'BEEPER' SUBROUTINE

A rotina da ROM, monopoliza a CPU enquanto gera som, e desliga os interrupts.

As frequências em Hz de notas musicais são as seguintes:


Para usar a rotina BEEPER, sendo f em Hz e t segundos, a rotina BEEPER da ROM espera como argumentos:

HL = atraso do loop
DE = número de iterações para o ciclo de geração de som

HL = INT (( t * 6689 / 4 ) - 30.125 )
DE = INT ( f * t )

Portanto, para tocar a nota C, durante 1 seg:

HL = INT (( 1 * 6689 / 4 ) - 30.125 ) = 1642
DE = INT ( 216.63 * 1 ) = 262

Sendo assim:

LD HL,1462
LD DE, 262
CALL $03B5
RET

A própria rotina da ROM, é um bom exemplo como se controla directamente o BEEPER:

Input

DE
 Number of passes to make through the sound generation loop
HL 
Loop delay parameter

BEEPER
03B5
DI
Disable the interrupt for the duration of a 'beep'.
03B6
LD A,L
Save L temporarily.
03B7
SRL L
Each '1' in the L register is to count 4 T states, but take INT (L/4) and count 16 T states instead.
03B9
SRL L
03BB
CPL
Go back to the original value in L and find how many were lost by taking 3-(A mod 4).
03BC
AND $03
03BE
LD C,A
03BF
LD B,$00
03C1
LD IX,$03D1
The base address of the timing loop.
03C5
ADD IX,BC
Alter the length of the timing loop. Use an earlier starting point for each '1' lost by taking INT (L/4).
03C7
LD A,($5C48)
Fetch the present border colour from BORDCR and move it to bits 2, 1 and 0 of the A register.
03CA
AND $38
03CC
RRCA
03CD
RRCA
03CE
RRCA
03CF
OR $08
Ensure the MIC output is 'off'.
Now enter the sound generation loop. DE complete passes are made, i.e. a pass for each cycle of the note.
The HL register holds the 'length of the timing loop' with 16 T states being used for each '1' in the L register and 1024 T states for each '1' in the H register.

03D1
NOP
Add 4 T states for each earlier entry point that is used.
03D2
NOP
03D3
NOP
03D4
INC B
The values in the B and C registers will come from the H and L registers - see below.
03D5
INC C
BE_H_L_LP
03D6
DEC C
The 'timing loop', i.e. BC*4 T states. (But note that at the half-cycle point, C will be equal to L+1.)
03D7
JR NZ,BE_H_L_LP
03D9
LD C,$3F
03DB
DEC B
03DC
JP NZ,BE_H_L_LP
The loudspeaker is now alternately activated and deactivated.
03DF
XOR $10
Flip bit 4.
03E1
OUT ($FE),A
Perform the 'OUT' operation, leaving the border unchanged.
03E3
LD B,H
Reset the B register.
03E4
LD C,A
Save the A register.
03E5
BIT 4,A
Jump if at the half-cycle point.
03E7
JR NZ,BE_AGAIN
After a full cycle the DE register pair is tested.
03E9
LD A,D
Jump forward if the last complete pass has been made already.
03EA
OR E
03EB
JR Z,BE_END
03ED
LD A,C
Fetch the saved value.
03EE
LD C,L
Reset the C register.
03EF
DEC DE
Decrease the pass counter.
03F0
JP (IX)
Jump back to the required starting location of the loop.
The parameters for the second half-cycle are set up.
BE_AGAIN
03F2
LD C,L
Reset the C register.
03F3
INC C
Add 16 T states as this path is shorter.
03F4
JP (IX)
Jump back.
Upon completion of the 'beep' the maskable interrupt has to be enabled.
BE_END
03F6
EI
Enable interrupt.
03F7
RET
Finally return.


Nota: embora se use $FE para controlar a ULA, a ULA responde a todos as portas de I/O pares. (i.e. a ULA é activada com portas de I/O com o bit 0 a 0).

O chipset AY só foi introduzido no modelo 128K.

Hz são Hertzs (ciclos por segundo).

Note-se que devido à contenção nos primeiros 16KB de RAM, rotinas que controlem directamente o beeper não devem estar nesta àrea de RAM.

Para rotinas de assembly para gerar som, ver Short beeper routines , Beep the ZX Spectrum e Loudspeaker Sound Effects.

quinta-feira, 14 de novembro de 2019

Speccy Invaders


Nome: Speccy Invaders
Editora: Purples Studios
Autor: IceVA
Ano de lançamento: 2019
Género: Shoot'em'up
Teclas: Não redefiníveis
Joystick: Não
Memória: 48 K
Número de jogadores: 1

A competição BASIC 2020 continua a bombar a todo o vapor. E é mesmo disso que se trata, bombas e tiros, num novo clone de Space Invaders. Aliás, quem nos conhece sabe o carinho que temos por este jogo, na nossa opinião um dos melhores shoot'em'ups a aparecer para qualquer plataforma (vejam a review que deixámos a InvAGDers, por exemplo). Por vezes a simplicidade é tudo o que é necessário para se criar um jogo viciante e divertido, e essa ideia aplica-se a Speccy Invaders.

Os aliens estão a atacar a Terra STOP
Resiste e impede a invasão STOP
Elimina a NAVE-MÃE um MÍSSIL EXTRA STOP
Cada 5000 pontos VIDA EXTRA STOP

Instruções telegráficas é também tudo o que necessitamos para o conseguirmos jogar convenientemente. Isso e ter dedo leve no gatilho e muita destreza para nos desviarmos dos tiros dos alienígenas, que a partir de certo ponto (nível 20), disparam quase continuamente.


Os primeiros níveis são bastante pausados. Um tiro aqui, outro ali, os próprios alienígenas vão se movendo como autênticas tartarugas, e apenas um aselha não consegue impedir a invasão. Convém tentar acertar na nave-mãe, pois decerto irão reparar que também a nossa arma parece estar encravada, disparando quase ao ritmo com que os alienígenas se movem, mas de cada vez que temos um tiro certeiro na nave que vai aparecendo periodicamente no cimo do ecrã, é acrescentado um míssil à nossa arma, querendo isso dizer que ficaremos com uma cadência de tiro maior. E se nos primeiros níveis, com melhor ou pior performance, conseguimos desenvencilharmo-nos nos invasores, em níveis mais avançados é fundamental termos os mísseis extras, doutra forma rapidamente os inimigos chegam ao Planeta Terra.

E quando é que o jogo termina? Pelo que nos apercebemos, apenas termina quando se perdem todas as vidas (perde-se uma vida quando se é atingido por um disparo inimigo), ou quando a invasão acontece, isto é, independentemente do número de vidas que temos, se os alienígenas chegam ao ponto em que a nossa nave se encontra, é Game Over.


Speccy Invaders é então o jogo perfeito para se tentar bater recordes. Não tendo fim, ou pelo menos assim o parece, o principal objectivo é fazer a maior pontuação possível. A partir do nível 20 a velocidade torna-se frenética (nem parece programado em Basic) e torna-se frustrante chegar até esse ponto sem se ter perdido uma vida, e de repente perder-se todas num ápice, ou pior, acontecer como em cima (nível 22), em que somos invadidos ainda com imensas vidas em carteira.

Curiosamente, e mesmo sendo programado em Basic compilado, os sprites têm uma dimensão interessante, não interferindo com a velocidade da acção. E até o som é engraçado, contribuindo ainda mais para uma experiência gratificante.

Speccy Invaders talvez não venha a ser o vencedor da competição BASIC 2020, dado a complexidade de algumas das propostas já apresentadas, mas sem dúvida que ninguém irá dar o tempo por perdido a jogá-lo. É viciante, é aditivo, e é sem dúvida uma proposta vencedora, independentemente da posição que venha a ter no concurso.

quarta-feira, 13 de novembro de 2019

Equipamentos de Comunicações (MIA)


Curioso este pequeno programa que se encontrava nas cassetes do Vasco Gonçalves. Não pelo programa em si, que mais não é que uma base de dados criada especificamente para arquivo de equipamentos de comunicações (tal como o nome indica), mas porque aparentemente era utilizada pela corveta NRP António Enes. Seria assim interessante saber mais sobre as origens deste programa, pelo que se alguém tiver informação adicional, por favor contacte-nos.

Poderão aqui descarregar o programa.

Pequenos programas e rotinas (parte 2)


Depois de na semana passada termos disponibilizado uma colecção de pequenos programas e rotinas feitas por programadores nacionais, segue-se a mesma coisa, mas por programadores estrangeiros. Nada de terrivelmente interessante, muito pelo contrário, mas encontra-se agora aqui preservado para quem os queira descarregar.

terça-feira, 12 de novembro de 2019

20. Target Renegade

Recuperado Spraeng Skolen


Desta vez foi o próprio autor, Allan Høiberg, a recuperar um jogo que criou em 1984: Spraeng Skolen. Høiberg conseguiu criar um snapshot e partilhou com a comunidade, e não fica atrás de muita coisa criada nesses primeiros tempos do Spectrum.

A ideia é colocar e deflagrar bombas em locais estratégicos. Ainda não tivemos tempo de levar o jogo até ao fim, mas iremos de certeza fazê-lo.

Quem quiser experimentar, pode descarregar aqui Spraeng Skolen.

Interrupts no Z80A/ZX Spectrum

Neste artigo, falaremos dos interrupts do Z80A, mas do ponto de vista do ZX Spectrum, já que a arquitectura de hardware, e a ROM têm influência no comportamento destas funcionalidades.

Um interrupt, pelo menos ao nível do Z80, é basicamente a recepção de um sinal externo em que a CPU, recebendo e aceitando, interrompe o que está fazer, guarda o endereço de execução no stack, e salta para uma "subrotina".


O processador Z80 tem dois tipos de interrupts: não mascaráveis (NMI) e mascaráveis.

As NMI (Non-Maskable Interrupts) são interrupts que não podem ser ignoradas, e chamam a subrotina em $0066; a NMI não funciona sem hardware adicional, devido a um bug na ROM. São activadas com o pino NMI do Z80.


RESET
0066
PUSH AF
Save the current values held in these registers.

0067
PUSH HL

0068
LD HL,($5CB0)
The two bytes of NMIADD must both be zero for the reset to occur.

006B
LD A,H

006C
OR L

006D
JR NZ,$0070
Note: this should have been 'JR Z'!

006F
JP (HL)
Jump to START.
NO_RESET
0070
POP HL
Restore the current values to these registers and return.

0071
POP AF

0072
RETN

A interrupção não-mascarável BUSRQ não tem utilidade na arquitectura do ZX Spectrum e raramente é mencionada.

As mascaráveis são activadas 50 vezes por segundo, com a ULA a enviar um sinal ao pino INTR do Z80.  Note-se que o envio deste sinal coincide no ZX Spectrum 48K com o inicio do varrimento do ecrã pela ULA.

As interrupções mascaráveis podem ser ignoradas pelo software fazendo DI anteriormente e EI de novo para as aceitar. Têm três modos de funcionamento no Z80:
  • IM0
  • IM1
  • IM2
O modo IM0, é compatível com o Intel 8080, executando os opcodes presentes no bus de dados, e é raramente, se nunca, usado no ambiente ZX Spectrum. Dado ao desenho de hardware (bus em descanso em $FF), normalmente, o modo IM0 porta-se como o modo IM1.

Em IM0 e IM1, chegando um interrupt, é equivalente a um RST $38. Isto executa a rotina da ROM em $0038, MASK_INT, que incrementa variáveis de contar tempo (FRAMES), e chama a rotina da ROM de varrimento de teclado.


MASK_INT
0038
PUSH AF
Save the current values held in these registers.

0039
PUSH HL

003A
LD HL,($5C78)
The lower two bytes of the frame counter (FRAMES) are incremented every 20 ms. (U.K.) The highest byte of the frame counter is only incremented when the value of the lower two bytes is zero.

003D
INC HL

003E
LD ($5C78),HL

0041
LD A,H

0042
OR L

0043
JR NZ,KEY_INT

0045
INC (IY+$40)
KEY_INT
0048
PUSH BC
Save the current values held in these registers.

0049
PUSH DE

004A
CALL KEYBOARD
Now scan the keyboard.

004D
POP DE
Restore the values.

004E
POP BC

004F
POP HL

0050
POP AF

0051
EI
The maskable interrupt is enabled before returning.

0052
RET

Também podemos activar o modo IM2 por software. Neste modo, o registo I tem de ser previamente carregado com um valor. Como por defeito, o bus de Spectrum em modo descanso sem nenhum hardware tem o valor $FF, sendo activado uma interrupt, o endereço da rotina de tratamento desta interrupt vai ser obtido de dois bytes (uma word), em RAM apontada por I no byte alto e $FF no byte baixo.

por exemplo:

LD A,$F9
LD A,I
IM  2
RET

tendo em $F9FF o valor $F800, a rotina de interrupts em modo dois vai estar em $F800.

ORG $F800

:---- rotina pretendida
JP $0038

Tópicos "avançados"

Internamente ao Z80 existem dois flip-flops que guardam e são afectados pelos estados dos interrupts. São conhecidos por IFF1 (interrupt switch) e IFF2 (copy). A tabela de estados deles é esta:


O byte menos significativo associado ao registo I no processamento da interrupt IM2 nem sempre é $FF na presença de outros periféricos extras no bus do Spectrum. Jogos comerciais que usam o IM2 normalmente têm isso em conta. Criam buffers com 256 bytes com o mesmo valor, ou apontam para uma área da ROM que tem os mesmos valores. Um truque conhecido, é apontar o I para a zona ROM "SPARE" que a partir de $386E até $3CFF é preenchida com $FF; por exemplo, I a $39, e sendo assim o apontador para IM2 $FFFF e $0000.  $0000 vai ter sempre o byte $F3.

O registo IY deve estar no valor original se se invocar rotinas da ROM (a ROM espera ter o IY com o valor $5C3A).

O Z80 toma cuidados para não acontecer um interrupt imediatamente a seguir a um DI (se for NMI), ou imediatamente a seguir a um EI. A única excepção a esta regra de poder acontecer um interrupt na instrução imediata a EI, é ter uma instrução HLT, que espera por um interrupt.

Um evento de recepção de interrupts, desliga as interrupts e incrementa o registo R.

Veja Interrupt Behaviour of the Z80 CPU  para mais detalhes.

Nota adicional: o Z80 também tem um pino de sinal WAIT, que estende o corrente ciclo de bus para alem de 1 ciclo T. É destinado a ser usado por periféricos. No caso do desenho da ULA do Spectrum, preferiram optar por não o usar para controlar o Z80.