- OFRAK Tetris é um jogo no estilo Tetris no navegador em que instruções ARM caem, e em vez de encaixar blocos, você posiciona instruções para criar o fluxo de execução de um programa
- Os gadgets de instrução que caem são rotacionados e depois fixados, e apenas as instruções fixadas que estão no topo da tela são executadas
- A pontuação é armazenada no endereço de memória apontado por R12, e é possível acompanhar o estado observando R0~R12, LR, PC, SP e o dump de memória
- Quando o tempo acaba, ocorre um acesso inválido à memória ou um salto para um endereço incorreto, aparece Game over e a execução é encerrada
- Com opções como execução em passo único, alternância de música, instruções lógicas, modo infinito, intervalo entre quedas e tamanho máximo do gadget, é possível ajustar a dificuldade e a forma de execução
Tetris conduzido por instruções ARM
- OFRAK Tetris é um jogo no estilo Tetris em que gadgets compostos por instruções ARM caem
- O usuário rotaciona as instruções que estão caindo e depois as fixa à esquerda para criar o fluxo de execução
-
Regras de execução
- As instruções caem de cima para baixo
- O usuário rotaciona e fixa as instruções
- Entre as instruções fixadas, apenas a instrução no topo é executada
Estado da execução visível na tela
- A instrução atualmente em execução e seu endereço são exibidos juntos
- Ex.:
add PC, PC, #61 - Ex.:
00010000,00010004,00010008
- Ex.:
- É possível acompanhar os resultados da execução observando os registradores e o estado da memória
- Os valores de R0~R12, LR, PC e SP são exibidos
- A área de memória é mostrada com endereços hexadecimais e valores preenchidos com zero
- A pontuação aparece como
Score: 0
Armazenamento da pontuação e condições de fim de jogo
- A pontuação é armazenada no endereço de memória apontado por R12
- O jogo termina quando ocorre qualquer uma das situações abaixo
- O tempo acaba
- Há acesso a memória inválida
- Há um salto para um endereço incorreto
- A tela de encerramento mostra
Game over.e uma área para inserir a pontuação máxima
Controles e configurações
- Os controles padrão incluem execução em passo único, fixar gadget, rotacionar registradores, reproduzir/pausar música e mostrar/ocultar explicações
- Também há configuração de key bindings para gamepad
-
Single Step
-
Toggle Music
-
Lock In
-
Rotate Instructions Up / Down / Left / Right
- Toggle Game Instructions
- Nas configurações do jogo, é possível ajustar as condições de execução e a dificuldade
- Score multiplier
- Enable Logical Instructions
- Infinite mode
- Seconds between drops
- Maximum gadget size
-
Evento presencial na DEF CON
- Usuários que estiverem na DEF CON podem visitar a mesa da Red Balloon Security para jogar Tetris no Car Hacking Village
- Quem conseguir uma pontuação suficientemente alta receberá um prêmio
1 comentários
Comentários no Hacker News
Do ponto de vista de um programador com pouquíssima experiência trabalhando com assembly, é uma ferramenta incrível para aprender.
Eu deixei uma cheat sheet aberta em outra aba para ver o que cada instrução fazia.
Só fiquei um pouco decepcionado porque o primeiro segfault fez a pontuação máxima aparecer como -4,8 bilhões :-P
Muito legal! Até agora, minha maior pontuação foi 65612.
Como feedback, quando abri o menu de ajuda não ficou claro como fechá-lo; parece que só dá para apertar
?de novo.Gostei da música do Goblin, e também da interface para brincar com as instruções e da diferenciação por cores.
Um modo sandbox em que fosse possível ver antecipadamente o efeito da execução das instruções e modificar o programa depois que o jogo terminasse seria bastante útil para quem está aprendendo assembly ARM.
Depois de passar algumas horas jogando enquanto fazia este jogo, minha velocidade de leitura de assembly ARM definitivamente aumentou.
Não consegui deixar de rir ao ver “a pontuação é armazenada na memória no endereço apontado por R12”.
Obrigado por compartilhar; me deu saudade da DEFCON. Talvez eu só consiga ir no ano que vem.
Eu estava com a página aberta antes da resposta, então não vi as respostas até atualizar.
Até agora, encontrei duas boas estratégias.
A primeira é espalhar o PC pelo maior número possível de registradores, somar esses registradores o máximo de vezes possível e depois armazenar a soma no endereço 0 ou na posição onde fica a pontuação.
A segunda é ler para um registrador, como inteiro, uma instrução montada a partir de um valor antigo do PC; como ela normalmente aparece como negativa, uso subtração para torná-la não negativa e então a armazeno na posição da pontuação.
Fico curioso para saber quais estratégias outras pessoas tentaram.
O conceito é muito legal, mas meu entendimento de assembly é baixo demais :)
Diz que a pontuação fica armazenada em R12, mas não entendo por que a pontuação é 16 se R12 é 0.
https://imgur.com/a/RY5jhTu
Neste caso, é o endereço 0, ou seja, o início do segmento de dados.
O registrador da pontuação está em amarelo, e a região de memória correspondente para a qual esse registrador aponta — isto é, os bytes reais da pontuação — também aparece em amarelo.
Sou familiarizado com computadores e conheço um pouco de assembly básico, mas, uau, não entendi absolutamente nada disso.
De forma mais ampla, também tenho interesse em ideias de como tornar o jogo mais claro.
Sei que um manual explicando as instruções ajudaria, mas outras ideias também são bem-vindas.
Uma bela UI/UX brutalista.
Antes de experimentar, cliquei em “About” e uma nova página abriu dizendo: “Ao continuar usando este site, você concorda com o uso de cookies”.
Parece uma violação da GDPR. Recusar cookies precisa ser tão fácil quanto aceitá-los.
Especialmente porque esses cookies nem parecem ser necessários para o funcionamento do site.
“O serviço usa cookies e tecnologias semelhantes, como pixel tags, web beacons, clear GIFs e JavaScript, para permitir que nossos servidores reconheçam seu navegador, entendam quando você visita e usa nossos serviços, analisem tendências, entendam nossa base de usuários e operem e melhorem nossos serviços … Também podemos complementar as informações que coletamos com informações recebidas de terceiros, inclusive cookies colocados no seu dispositivo por terceiros.”
https://ofrak.com/privacy/#tracking-tools-and-opt-out
Dizer, no fim da página, para apagar cookies nas configurações do navegador não é uma solução aceitável.
https://www.cnil.fr/en/refusing-cookies-should-be-easy-accep...
Fiquei curioso sobre como compilar o jogo.
Dei uma olhada em https://ofrak.com/docs/environment-setup.html, mas não encontrei nada específico sobre o jogo de Tetris.
Talvez eu tenha deixado passar algo.
Gostei muito do conceito.
A chave para conseguir uma pontuação alta parece ser escrever 0 no PC.
Isso porque o código binário da nova instrução é “adicionado” à área de memória mostrada à direita, e depois você pode manipular R12 para maximizar a pontuação.
Isso porque todas as instruções têm 4 bytes e o bit mais significativo é sempre 1.
Algumas vezes cheguei a cerca de 2 bilhões, mas a média é bem baixa ;)