Máquina virtual no ESP8266 para executar jogos

VM escrita por uma mão incerta das ciências humanas no ambiente de programação do Arduino usando código rápido e bicicletas. E também há um compilador para ele a partir de uma linguagem semelhante a C, escrita em JavaScript usando os mesmos métodos. Sim Você já pode se apressar em comentários, jogar pedras. Bem, para aqueles que ainda estão interessados, convido você a continuar lendo.

Trolley de pão

Em geral, meu trabalho já foi um pouco coberto pela respeitada tormozedison aqui . Mas naquela época havia um protótipo esférico no vácuo. E agora eu tenho um dispositivo RomanS, que ele gentilmente me forneceu para experiências absolutamente gratuitas. Este dispositivo é chamado ESPboy. Difere de outros tipos de artesanato por seu slot de compactação e expansão usando o chip MCP23017. Aqui você pode aprender mais sobre ele.

Se alguém estiver interessado, como uma idéia tão estranha me veio à mente como uma máquina virtual em um microcontrolador, você pode lê-la sob o spoiler.

Antecedentes
Uma vez na escola, eu fui levado por um criador de jogos de ioiôs e, como muitos, fascinado por ele, não entendo o que. Essas demos mal escritas e mal desenhadas ainda podiam se gabar de amigos, mas na Internet estavam se afogando entre outras semelhantes. Percebi como era difícil escrever um jogo simples, sem mencionar um jogo sério em que você podia roubar as vacas. Mas o desejo de escrever jogos não foi perdido. Quando comprei um celular, descobri o Midlet Pascal e me diverti com ele por vários anos. Afinal, percebi que escrever um jogo para um dispositivo fraco é mais fácil do que para o seu irmão mais velho mais poderoso. Pelo menos, sempre se pode falar não de mãos tortas, mas dos recursos limitados da plataforma. No entanto, os jogadores de botão deram lugar aos sensores outra chance de conquistar o mundo foi perdida. No entanto, em algum momento eu percebi que poderia reviver meus sonhos usando um microcontrolador.

Comecei escrevendo um jogo no arduino uno, onde você iria sem ele. Então ela era minha única, e eu estava muito preocupado com o desempenho dela. Eu tentei piscar o mínimo possível. Mas o caminho do rake segue em pequenos passos. Cada edição pequena do código fazia com que ele piscasse novamente e novamente. E eu decidi escrever uma máquina virtual empilhada. Afinal, existem enormes dois kilobytes de RAM para bytes de código e dados a bordo. Mas quão lento era, mas por algum motivo faltava memória constantemente. Provavelmente, o ponto principal é que todas as minhas motos estavam com rodas quadradas e andavam devagar. Decidi escrever um emulador de chip 8 no Arduino Mega recém-chegado da China. Claro, então eu queria escrever um emulador de gameboy para ela, o primeiro playstation e um supercomputador mais fácil. Como resultado, entendi o principal. A máquina virtual chip-8 era muito simples, excessivamente simples. Tanto que, ao escrever seus jogos para multiplicação ou divisão, você teve que escrever uma sub-rotina lenta separada. Então você precisa escrever sua VM, se livrando de uma falha fatal. Nesse momento, vários outros esp8266 chegaram, com seu espaço em 160MHz.

Se lhe parece que uma máquina virtual é um desperdício de recursos, também reescrevi meu emulador de chip-8. Descobriu uma máquina virtual em uma máquina virtual em um microcontrolador. Você provavelmente pode ir além e escrever uma máquina de Turing no chip-8.

ESP Little Game Engine Especificações


Uma máquina virtual contém 16 registros de 16 bits cada, um registro zero é um ponteiro de pilha. Cada instrução é de byte duplo, algumas instruções contêm dois bytes de dados. Memória endereçável de 64 KB. No caso do ESP8266, 20 KB estão disponíveis. O programa pode ser baixado do SPIFFS e UART. Se desejar, você pode adicionar um download de um cartão de memória ou via Wi-Fi. Além das instruções aritméticas comuns e das instruções para mover dados, há instruções separadas para trabalhar com sprites, tela e som. Tamanho da tela 128 por 128 pixels. Com 16 cores por ponto, a tela ocupa 8 KB de memória, a mesma quantidade de buffer para desenhar sprites e partículas. Embora a biblioteca TFT_eSPI usada seja capaz de atualizar a tela mais de 60 vezes por segundo, tive que me limitar a 20 quadros por segundo. Caso contrário, não havia tempo de processador suficiente para a máquina virtual. Você pode desenhar blocos e 32 sprites de até 128x128 pixels, com a possibilidade de rotação e espelhamento. Para economizar memória, você pode usar imagens de um bit ou compactação RLE. A física é simplificada: detecção de colisões de sprites com sprites e ladrilhos, resolução de colisões, gravidade. A tela é atualizada linha por linha somente se uma linha tiver alterado pixels. A velocidade da VM, dependendo de quantas linhas são desenhadas no quadro, varia de 100 mil a 900 mil operações por segundo. Você pode usar telas coloridas diferentes, há um alongamento suave da imagem nas proporções desejadas.


Alguns dos jogos escritos por mim podem ser vistos aqui .

Ao mesmo tempo que o VM para ESP8266, escrevi um emulador de JavaScript para o navegador. Para não editar o bytecode manualmente, foi adicionado um assembler simples, com base na minha experiência com o assembler para o MOS6502. Então eu decidi adicionar um idioma de nível superior. No entanto, minha principal tarefa foi escrever rapidamente jogos simples, e não um código de assembly de depuração longo. Pareceu-me que escrever seu compilador seria mais fácil do que adicionar LLVM. E escrevi em JavaScript, porque sei que não é tão ruim quanto em outros idiomas. No momento, ele está longe de oferecer suporte aos padrões C e, ao compilar, é possível encontrar facilmente um erro incompreensível em um local incompreensível. Mas é rápido, porque leva menos de 2000 linhas.

E agora à pergunta, por que escrevi tudo isso aqui. Agora você já pode escrever e executar jogos. No entanto, a perfeição ainda está longe. Se alguém quiser me ajudar a finalizar o ESP LGE ou escrever meu próprio jogo, ficarei muito feliz. Se você achou minha ideia interessante e deseja saber mais, terei prazer em responder às suas perguntas. Eu aviso, o código do Arduino é bastante difícil de ler. Em parte porque sou autodidata. Em parte devido ao fato de eu tentar reduzir o número de chamadas de função para aumentar a velocidade do trabalho. Como resultado, muitas funções contêm enormes passos de código. Portanto, não permita que mulheres grávidas e crianças sejam exibidas na tela. Gradualmente, tentarei corrigir isso e melhorar a legibilidade.

E para quem leu, um exemplo de jogo. São necessários menos de cem linhas e menos de 1 KB na forma compilada.

int stickCount; char key,previouseKey,takenSticks; void redraw(){ int i; //   setcolor(2); //   for(i = 0; i < stickCount; i++) line(22 + i * 6, 74, 22 + i * 6, 84); //   setcolor(11); //  for(i = stickCount; i < 15; i++) line(22 + i * 6, 74, 22 + i * 6, 84); //     setcolor(1); //   delayredraw(); } void playersMove(){ //    ,     .  while(key == previouseKey){ key = getkey(); } while(key != KEY_LEFT && key != KEY_DOWN && key != KEY_RIGHT){ key = getkey(); } if(key & KEY_LEFT){ takenSticks = 1; }else if(key & KEY_DOWN){ takenSticks = 2; }else{ takenSticks = 3; } printf("%d, ", takenSticks); stickCount -= takenSticks; previouseKey = key; } void computersMove(){ if(stickCount % 4){ //   ,    takenSticks = stickCount % 4; }else{ //      takenSticks = 1 + random(1); } stickCount -= takenSticks; printf("%d, ", takenSticks); } void game(){ // stickCount = 15; clearscreen(); //       gotoxy(8,0); puts(""); gotoxy(2,1); puts(" 1,2  3 .  ,   . :\n"); // 27,25  26   printf(" %c 1 %c 2 %c 3", 27, 25, 26); gotoxy(0,12); redraw(); while(1){ playersMove(); if(stickCount <= 0){ gotoxy(3,8); puts(" "); return; } redraw(); computersMove(); redraw(); if(stickCount <= 0){ gotoxy(3,8); puts(" "); return; } } } void main(){ while(1){ game(); //  settimer(1,1000); while(gettimer(1)){} while(getkey() == 0){} previouseKey = key; } } 

Você pode testá-lo imediatamente. Siga o link, clique em compilar e, em seguida, execute. Se você quiser saber mais sobre as possibilidades do IDE, leia o tutorial . Obrigado pela atenção.

Source: https://habr.com/ru/post/pt459714/


All Articles