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 I,$F9
IM2
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.

segunda-feira, 11 de novembro de 2019

Paracaidista Kerl!


Quem não se lembra de Da Da Da, celebrizado por Heman José em Portugal, embora o original pertença a um Trio alemão? É com esta música que se inicia uma nova brincadeira de Azimov em Basic, incluído no curso de Basic de AsteroideZX, já falado no blogue por diversas vezes. E se nunca ouviram falar neles, venham aqui ver Cosmito en Imperio Cobra, apostamos que ficarão rendidos a esta linguagem de programação.

Paracaidista Kerl! é um jogo muito simples no qual controlamos um pára-quedista que tem que descer até à porta de saída, no piso térreo. Até lá vai passando por diversas plataformas, as quais poderá tentar evitar, ou não, consoante o número de pára-quedas de reserva que tenha.

Exercício mais simples não há, mas o resultado é interessante, podendo aqui ser descarregado.

O teclado do ZX Spectrum

O teclado do ZX Spectrum do ponto de vista electrónico, é uma matriz com uns diodos entre linhas de endereços e de dados, ligada à ULA.


Esta matriz de teclado do ponto de vista de portas I/O está dividida em oito "half rows".


Cada "half-row" tem cinco bits / teclas. Um zero no bit correspondente à tecla, na porta dessa "half-row", significa que a tecla está pressionada.


Para ler o teclado, e testar  por S:

LD BC,$FDFE
IN A,(C)
AND % 00000010
JR Z,TECLA_PRESSIONADA

Note-se que pressionar (ou largar) uma tecla do teclado, não causa nenhum interrupt. O varrimento / polling das portas da matriz de teclado é feito no meio da rotina de interrupts invocada 50 vezes por segundo, ou directamente na aplicação.

Uma das particularidades de ser um desenho tão simples de electrónica, é que permite pressionar várias teclas ao mesmo tempo, e múltiplas teclas desde que não se esgote as cinco teclas de uma das "half row" (i.e. máximo de quatro teclas premidas por "half-row").

Note-se que num emulador nunca vamos conseguir ter tantas teclas premidas como na máquina original, devido a limitação do controlador de teclado da máquina hospedeira. A seguir, exemplo de rotina ASM que demonstra a pressão de teclas tal como a tabela acima.

código fonte ASM      binário em formato .TAP 

Existe no entanto, o efeito de "ghost keys" - que são essencialmente teclas fantasma geradas pelo curto-circuito de outras teclas premidas. Por exemplo, Caps shift + B + V criam como fantasma o output da tecla Space estar activada. Também o jogo Zynaps pausa quando as teclas 5,6,7,8 e 0 estão pressionadas.

Em cada interrupt, a rotina da ROM que é chamada está em $02FB, KEYBOARD.


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

Outra rotina útil da ROM para invocar com CALL nos nossos programas, é WAIT-KEY1, em $15DE, para esperar por uma tecla.

LD A,1 ; lower screen
CALL 5633 ; open channel
CALL $15DE ; WAIT-KEY1
RET

Para ler mais detalhes sobre o teclado, e rotinas em ASM, veja, em espanhol,  este link: Lectura del teclado en el Spectrum.

domingo, 10 de novembro de 2019

Popeye - Crack (MIA)

Os leitores já foram apresentados ao Rui Ribeiro, seja pela sequência de artigos técnicos que já escreveu para o Planeta Sinclair (aqui, aqui, aqui e aqui), seja por ter sido o autor do WSpecEM, primeiro emulador de ZX Spectrum para o Microsoft Windows, seja também por termos noticiado aqui, em primeira mão, a criação do seu novo emulador QtSpecEm. O que muitos leitores talvez desconheçam, é que o Rui foi também um prolífico cracker, bastante activo nos anos 90, como o nosso blogue irmão, o Planeta MS-DOS já havia descortinado neste post.

Mas eis que o Rui passou ao Planeta Sinclair, um ficheiro .z80 que sobreviveu ainda antes dessa época, quando começou a crackar jogos do ZX Spectrum. O snapshot em questão, contêm um crack do jogo Popeye, realizado no ano de 1987. Detalhe curioso: o jogo crackado fora preservado através do TAPE2TAP, um utilitário escrito pelo próprio Rui em assembly 80x86, e que permitia digitalizar programas em cassete, recorrendo a um cabo próprio ligado à porta paralela (da impressora) de um PC.

Popeye com vidas infinitas e tempo ilimitado.

O crack permite vidas e tempo ilimitados, além de funções extras como gravar e imprimir em qualquer ponto do jogo. Não terá sido o único jogo que o Rui alterou ou acrescentou funcionalidades, mas é o único que guardou até aos dias de hoje.

Usando o MONS3 (já referido aqui) para dissassemblar à mão, o Rui quebrou as proteções do turbo-loader, fez o unroll de rotinas de encriptação e código auto-modificável, criou a rotina a ser acrescentada ao ciclo principal do jogo, e ainda implementou um menu de arranque para perguntar se o jogador quer vidas infinitas.

Menu de arranque.

O Rui também criou o loader Basic do crack, o qual podemos ver na listagem abaixo. Podemos reparar que o código-máquina está na primeira linha de REM (uma técnica que alguns ainda poderão se lembrar terem usado), bem como a rotina original que foi usada para gravar em fita, ou o uso VAL para poupar espaço.


Loader BASIC:
    
   0 REM >NOT 2iu> STEP 2]t£i[17])[0][25]"^t[17]Z[0][25] RESTORE FOR LLIST #s#r GO SUB {=\ LLIST MERGE NOT MERGE e[0][0] PRINT > FLASH RETURN [31][31]88 OR RESTORE MERGE INVERSE RESTORE >© FLASH RETURN [31]8[23] INVERSE !D][17][17][0]CODE STEP CHR$ [4]INVERSE ![0]@[17][0][27]> COPY STEP CHR$ [4]> RETURN FLASH RETURN [31]8[9] NEXT [6]USR ![0]@ STEP SIN LET ![26]t<>[3]POPEYE.IMG[0][27][0]@!S] RESTORE NOT Uf
  10 CLEAR VAL "25500": LOAD ""CODE 
  20 CLS : POKE 00000,5: PRINT "Craked by RFFR (c) 1987"''"'1' to start game with infinite    lives, unlimited time, save     screens(S/S+SPACE) and print    screens(S/S+C/S)"'"Press another key to start game": PAUSE NOT PI: IF INKEY$=" COPY " THEN POKE VAL "23736",VAL "20": SAVE "POPEYE" LINE VAL "10": POKE VAL "23736",VAL "20": SAVE "POP.COD"CODE VAL "26000",VAL "27100": GO TO VAL "20"
  30 IF INKEY$="1" THEN RANDOMIZE USR (PEEK (VAL "23635")+PEEK (VAL "23636")*VAL "256"+VAL "5")
  40 RANDOMIZE USR VAL "26069"
  

Tendo o Rui já crackado vários jogos, este foi o primeiro com menu, e assinado por ele. O jogo com o crack pode ser obtido aqui. A rotina de código-máquina pode ser consultada abaixo.


Rotina inserida no ciclo principal do jogo:

5CF9 F5 PUSH AF

5CFA 3E 0E LD A,0E

5CFC 32 B6 65 LD (65B6),A
5CFF 3E 7F LD A,7F

5D03 1F RRA
5D01 DB FE IN A,(FE)
5D04 1F RRA

5D08 E5 PUSH HL
5D05 38 38 JR C,5D3F
5D07 C5 PUSH BC
5D09 D5 PUSH DE

5D0E DB FE IN A,(FE)
5D0A DD E5 PUSH IX
5D0C 3E 7F LD A,7F
5D10 1F RRA
5D11 38 17 JR C,5D2A

5D1B CD C2 04 CALL 04C2 ; CALL SA_BYTES
5D13 DD 21 44 5D LD IX,5D44
5D17 11 11 00 LD DE,0011
5D1A AF XOR A
5D1E DD 21 00 40 LD IX,4000

5D2A 3E FE LD A,FE
5D22 11 00 1B LD DE,1B00
5D25 3E FF LD A,FF
5D27 CD C2 04 CALL 04C2 ; CALL SA_BYTES
5D2C DB FE IN A,(FE)
5D2E 1F RRA

5D3A DD E1 POP IX
5D2F 38 09 JR C,5D3A
5D31 F3 DI
5D32 06 C0 LD B,C0
5D34 21 00 40 LD HL,4000
5D37 CD B2 0E CALL 0EB2 ; CALL COPY_1
5D3C D1 POP DE

5D3D E1 POP HL
5D3E C1 POP BC
5D3F F1 POP AF
5D40 21 1A 74 LD HL,741A

5D43 C9 RET

Speccy Invaders criado com Basic compilado


A competição BASIC 2020 continua a trazer-nos novos jogos, por vezes propostas surpreendentes, como é o caso de Speccy Invaders. O nome diz tudo, não é mais que um clone de Space Invaders para o nosso Spectrum, criado em BASIC compilado, e que até apresenta uma velocidade interessante.

Iremos fazer uma análise detalhado de Speccy Invaders nos próximos dias, mas até lá poderão vir aqui à página da competição descarregar o jogo.

sábado, 9 de novembro de 2019

Educação Musical (TC 2068) (MIA)


Conforme referimos, Educação Musical também teve uma versão específica para o 2068, que curiosamente corre no modo ZX Spectrum. Curioso também é o facto do tempo de carregamento ser inferior em cinco segundos a essa versão, embora não tenhamos conseguido detectar diferenças ao nível do programa.

A versão de Educação Musical para o TC 2068 poderá aqui ser descarregada, tendo-nos sido disponibilizada pelo Vasco Gonçalves.

Educação Musical (MIA)


Vamos lá ver se somos completamente duros de ouvido, moucos mesmo, ou se por outros lado somos futuros Beethoven. É esta a proposta da Timex, neste programa lançado em 1983 para o ZX Spectrum.

Educação Musical é mais um programa educacional pertencendo à longa lista da Timex, nalguns casos traduções directas, noutros programas originais. Este teve também direito a uma versão para o TC 2068, embora possa ser carregado no modo ZX Spectrum.

Poderão aqui ir buscar Educação Musical, cortesia de um contributor anónimo.

sexta-feira, 8 de novembro de 2019

Targ


Agora está na moda pegar em jogos antigos, fazer-lhe pequenas modificações, nomeadamente a nível gráfico, e lançá-los. E desta vez, através dos fóruns da Spectrum Computing, cada vez mais a página de referência do Spectrum, demos com esta versão que já se encontra até um pouco datada (tem mais de um ano). Gogol, nome com origens russas, usou como base de referência Mole Rat! de Dave Hughes (2012). E até se deu ao luxo de criar uma capa para quem o quiser passar para cassete.

Do que vimos, a jogabilidade é engraçada. Puro jogo de arcada que merece uma espreitadela, podendo aqui ser descarregado.

A Capital: POKES & DICAS - 31 de Dezembro de 1987

Terminamos o ano de 1987 com chave de ouro no que diz respeito às análises de jogos.

Comecemos com o brilhante Dark Sceptre, do Mike Singleton, um misto de acção e aventura imersiva em que nos embrenhamos numa infinidade de cenários místicos. Passamos para o Solomon's Key, um jogo fantástico baseado no Arcade da Tecmo, de 1986, mas que o Daniel Lima não achou muita piada, ou talvez não tenha tido muito tempo para jogá-lo, a julgar pela minúscula crítica que fez ao Bosconian. Finalizamos com a sequela ao Trap Door, que não sendo muito diferente do original oferece um novo desafio ao jogador.

   

João Paulo Neto da Cruz, da Póvoa do Varzim, volta a dar mais um ar da sua graça com um dos seus fantásticos desenhos.


Destacamos, para finalizar, a programação do  Linha a linha, que tem algumas rotinas interessantes para programadores.


Não deixem de ler o suplemento, desta semana, através da nossa Dropbox

quinta-feira, 7 de novembro de 2019

TuT-TuT


Nome: TuT-TuT
Editora: NA
Autor: David Stephenson
Ano de lançamento: 2019
Género: Labirinto
Teclas: Não redefiníveis
Joystick: Não
Memória: 48 K
Número de jogadores: 1

Há uma semana tínhamos dado conta de um novo jogo para o ZX81, TuT-TuT. e por sinal muito interessante. E agora sai o seu irmão mais velho, que é como quem diz, a versão para o ZX Spectrum. Mas o seu autor, David Stephenson, faz mais, juntamente com o jogo, disponibiliza a listagem em Basic, acompanhada de uma extensa explicação sobre o que cada variável faz, para aqueles que querem aprender um pouco mais sobre esta linguagem de programação que ganhou nos últimos tempos nova vida (ver a competição BASIC 2020, por exemplo). E as incríveis novidades para o ZX81 não irão ficar por aqui, mantenham-se atentos a Planeta Sinclair nos próximos tempos...

Se já tínhamos gostado da versão para o ZX81 (a preto e branco e sem som, naturalmente - ou talvez não, mais não dizemos, vão descobrir em breve o que queremos dizer com isto), desta ainda mais gostámos. Além do mais, o seu autor até nos presenteou com uma história toda catita passada no Egipto que merece a pena ser contada.

O ano é 1921 e encontramo-nos no Vale dos Reis, estando a chegar ao fim a temporada de escavações. Estas não correram assim tão bem este ano, pois não se encontraram vestígios de faraós desconhecidos. No entanto, nos últimos tempos, coisas muito estranhas começaram a acontecer, havendo relatos de múmias a estrangular os invasores dos túmulos locais. Nós, como um verdadeiro aventureiro e egiptólogo que se preze, não nos deixamos impressionar com estas histórias da carochinha e resolvemos investigar por conta própria. E aqui começa a aventura...


Tut-Tut é então um quebra-cabeça composto por 15 níveis. Para completar cada um deles, teremos que recolher as diversas chaves que permitem abrir portas (atenção à cor das chaves), mover blocos e encontrar a saída que permite avançar para o labirinto seguinte. No entanto as dificuldades não se ficam por encontrar a ordem correcta com que se deve recolher as chaves, ou os locais para onde se se movem os blocos. Ao longo do labirinto, cada um deles com um nome diferente, mas sempre bastante sugestivo, existem guardiões que se nos apanham, levam-nos ao ponto de partida, só que agora com menos oxigénio. Sim, existe um tempo limite para se completar cada nível, e este é representado pela barra de oxigénio, que vai diminuindo à medida que o tempo avança.

Os inimigos vão se movimentando, norma geral, em movimentos padronizados, no entanto, se entramos no seu campo de visão, perseguem-nos. Felizmente que nas paredes existem cavidades que nos permitem sair da sua vista e ficarmos seguros durante algum tempo. Mas em breve nos temos que colocar ao caminho, implicando a maior parte das vezes ir a pontos que sabemos que iremos ser perseguidos, mas que doutra forma não conseguiríamos ter acesso às chaves. Ou seja, temos mesmo que promover esta perseguição dos nossos inimigos. O que vale é que as múmias são lentas, ou pelo menos mais lentas que nós.


Mas lentidão, e apesar de ter sido criado em Basic, não é uma das fragilidades de TuT-TuT. Apesar do labirinto ser gerado linha a linha, demorando algum tempo entre o fim do nível anterior e o começo do próximo, a acção é depois bastante fluída, quase não se notando a linguagem que a originou. Aliás, é rápido o suficiente para nos deixar em sobressalto constante a tentar fugir dos perseguidores.

Os sprites e gráficos são básicos, e o som ainda mais, fazendo definitivamente lembrar os type-ins que surgiram nos anos 80 nas muitas revistas da especialidade que existiam na altura. No entanto, os cenários são imaginativos e convidam sempre a tentar completar cada labirinto para ver que tesouros se escondem mais à frente.

Assim, a nota com que avaliamos este jogo, reflecte não só o desafio em si, mas também o carácter educacional do mesmo, com a inclusão do código-fonte, assim como a consequente explicação e detalhe. Congratulamos o autor pela sua ideia, e convidamo-vos a virem aqui descobrir mais sobre TuT-TuT, quem sabe não venham a descobrir um verdadeiro tesouro dos faraós...

Rescate en Marte


Nome: Rescate en Marte
Editora: NA
Autor: Jose Manuel Gris
Ano de lançamento: 2019
Género: Acção
Teclas: Não redefiníveis
Joystick: Não
Memória: 48 K
Número de jogadores: 1

Quem disse que o Basic era uma linguagem de programação morta? Nós não, seguramente, e os lançamentos que têm aparecido nos últimos tempos criados exclusivamente com recurso a essa linguagem confirmam que está viva e bem viva. Ao contrário de alguns dos colonos do planeta Marte, que já passaram para o lado de lá...

Assim, em 1950 Marte foi colonizada por seres humanos. Mas mais de trinta anos após a primeira aproximação ao planeta vermelho, em 1982, os colonos são atacados por uma raça marciana desconhecida e muito agressiva, que emerge das profundezas do planeta, disposta a eliminar qualquer vida humana invasora. A nossa missão é fugir do planeta vermelho e resgatar todos os colonos vivos que encontrarmos no caminho (também encontraremos alguns mortos, mas esses esqueçam-nos).


O jogo é composto por 10 níveis (começamos no décimo, até atingirmos o primeiro), e a cada nível corresponde um ecrã diferente. Para conseguirmos avançar, temos que resgatar três colonos dispersos pelo cenário, mas sempre em locais pouco recomendáveis, pejados de nativos do planeta vermelho. Isto porque além do veículo de resgate que controlamos não poder bater nas paredes ou em qualquer obstáculo, os marcianos deslocam-se com uma rapidez estonteante (trabalho notável de Jose Manuel, mesmo estando perante Basic compilado), e se esses nos tocam, perdemos mais uma vida. Vá lá que o autor foi generoso nesse aspecto, mas por outro lado, que raio de veículo que ele nos colocou na mão que nem resiste ao impacto com um marciano?

E o autor conseguiu ainda dificultar-nos mais a tarefa: alguns dos marcianos disparam sobre nós, e o veículo tem uma reserva de combustível muito limitada (75 unidades). Vá lá que nos cenários existem vários pontos de abastecimento (marcados com um"E"), e a eles temos que nos deslocar com muita regularidade, mesmo que para isso fiquemos sujeitos aos disparos inimigos. Se o depósito de combustível chegar a zero, mais uma vida se perde, pelo que é absolutamente fulcral planear muito bem o caminho que se pretende fazer, sendo o mais curto muitas vezes o único possível. Escusado será dizer que os marcianos estão colocados estrategicamente para nos apanharem na curva, isto é, naqueles pontos que temos que obrigatoriamente passar para ir ao reabastecimento ou para resgatar os nossos camaradas.


Os cenários são vermelhos, como seria de se esperar, e os sprites são bastante razoáveis, não faltando sequer o marciano verde. Tendo em conta que tudo foi programado em Basic, mais uma vez se nota o cuidado e esmero que Jose Manuel dedicou a este seu projecto. Já ao nível do som, é o possível, não deixando ninguém deslumbrado (se é que alguém esperaria isso).

Por vezes o sistema de colisão parece falhar, pois aconteceu-nos passar por um marciano sem que algo nos acontecesse, e noutras vezes fomos atingidos por um disparo quando este ainda estava a alguma distância. Talvez o problema esteja na temporização ou velocidade de processamento, de qualquer forma isto são apenas pequenas vicissitudes que não retiram a vontade de chegar ao fim.

Rescate en Marte foi assim um desafio ambicioso por parte de Jose Manuel, num estilo de jogo que poderia não se adequar totalmente à linguagem de programação com que foi criado. Mas o resultado é bastante satisfatório, sendo mais interessante que muitos produtos criados em código máquina. Se pensavam ter aqui um exercício pausado, esqueçam isso, Rescate en Marte é frenético... 

quarta-feira, 6 de novembro de 2019

Pequenos programas e rotinas recuperados


São quase cinco dezenas de programas, nem todos acabados, que recuperámos de cassetes pertencentes ao Vasco Gonçalves e ao Nuno Miguel. Encontram-se os mais variados géneros, mas destacamos aqueles relacionados com a matemática, que sem dúvida deverão ter sido úteis para os estudantes da altura.

Poderão vir aqui descarregar estes pequenos programas e rotinas feitos por portugueses.

Desvendando o véu sobre "Em Busca dos Tesouros"

escrevemos sobre a nova editora Bitnamic Software, um esforço luso-brasileiro, que tem como objectivo lançar jogos produzidos em Portugal e no Brasil para plataformas retro, e dessa forma, incentivar a veia criativa das nossas comunidades e homenagear os seus criadores.

Também já mostramos um vídeo do "gameplay" do Em Busca dos Tesouros, o título de estreia da Bitnamic, e remasterização da versão original de 1987, incrementado com efeitos sonoros e uma música brilhante!

Hoje a Bitnamic abriu um pouco o véu e apresentou a caixa que irá fazer parte do conjunto de luxo a ser lançado no próximo dia 14 de Dezembro.

A caixa do relançamento de "Em Busca dos Tesouros"
Acreditamos que em breve teremos mais revelações sobre este lançamento!

A ULA do ZX Spectrum

A ULA é a alma do ZX Spectrum e é a cola que une a CPU, RAM e ROM. É um chipset especificamente desenhado para diminuir a contagem de chips da máquina (e diminuir o custo).

A ULA é responsável por:
  • converter os dados em RAM numa imagem TV;
  • controlar o clock da CPU;
  • gerir o acesso à memória da CPU;
  • descodificar o teclado;
  • gerir a interfaces com as cassetes;
  • controlar o altifalante.
A ULA do ZX Spectrum é um chip customizado para o ZX Spectrum da Ferranti, Uncommitted Logic Array (ULA). Foi usada pela primeira vez no ZX81, e foi melhorado o seu desenho para o ZX Spectrum, principalmente em desacoplar o Z80A do processo de geração de vídeo.

A ULA partilha os primeiros 16KB de RAM com a CPU, tendo precedência sobre o Z80.


Para produzir a imagem na TV, a ULA tem de estar sincronizada com o feixe electrónico da TV. Durante o varrimento, a ULA varre também o conteúdo da RAM nas posições de pixels/atributos e consulta a cor do border nos ciclos em que está a desenhar o border. A disposição de pixel e cores foi já objecto de um anterior artigo.

O varrimento do ecrã é efectuado 50 vezes por segundo, sendo o varrimento iniciado ao mesmo tempo que o Z80A recebe um sinal de interrupt. Quanto ao FLASH, a ULA muda-o  a uma rate de 1.56Hz, ou seja, mudando-o a cada 32 frames, ou seja a cada 0.639 segundos.

A ULA suspende a CPU, cortando temporariamente os impulsos de CLCK passados ao Z80, como referimos num artigo anterior, se este tenta aceder a RAM nos 16KB inferiores enquanto esta está a ler memória no varrimento do ecrã. (memory contention). Existe também o efeito de "snow effect".

A ULA é também responsável pela interface com a matriz do teclado.



Note-se ao ler um half-row do teclado que o porto baixo é o da ULA, e o porto alto o da tabela.

No Spectrum, a ULA é endereçada em qualquer porto par (i.e. bit 0 do address bus a 0), ou oficialmente no port $FE. O porto da ULA tem também diferente significado, conforme seja usado para leitura. ou escrita:


Existem ULAs com comportamento diferentes, e com modos de vídeo mais avançados, quer em clones, quer em emulação.

A ULA foi durante muito tempo um mistério, mas foi reverse engineered recentemente, do qual resultou um projecto de um Spectrum montado com electrónica discreta, conhecido como Harlequin.
Desse projecto, também saiu um livro bastante interessante, "The ZX Spectrum ULA: How to design a Microcomputer".

Vamos desenvolver vários dos temas tangencialmente abordados aqui, em próximos artigos.

terça-feira, 5 de novembro de 2019

21. Academy

Z80 assembly: imprimir números inteiros em ZX Spectrum

Para imprimir números inteiros, não é preciso escrever uma rotina de raiz em ZX-Spectrum.
Apresentamos dois métodos a usar a ROM:

1) Usando as rotinas do stack de floating point da ROM:


; HL = NUMBER ;
PRINT_DEC:
CALL $2D2B ; Store BC in calculator stack
JP $1A30 ; Print top of calculator stack

Para usar esta rotina, então, como exemplo:


LD BC,30000
CALL PRINT_DEC

RET

2) Usando puramente inteiros

Vamos (ab)usar e estender a rotina da ROM para imprimir número de linhas BASIC. No entanto, como esta rotina só imprime números até 9999, vamos ter que acrescentar código nosso, e entrar a meio da rotina.

Para tal, vamos ter que escrever código que encaixe na ROM, e coloque no stack HL e DE, como o faz a rotina de entrada normal por OUT-NUM-1.

Fazemos então:



; ; PRINT 16 BIT SIGNED NUMBER
; HL = NUMBER ;
PRINT_DEC:
PUSH DE
PUSH HL
LD E,$20 ; SPACES
LD BC,$D8F0 ; -10000 SIGNED INTEGER
CALL $192A ; routine OUT-SP-NO ;outputs space or number
JP $1A30 ; jumps to OUT-NUM-3

Para usar esta rotina, então, como exemplo:



LD HL,30000
CALL PRINT_DEC

RET

Nota: os inteiros em Z80 representam números na range -32768 / + 32767