ESP8266上的虚拟机可运行游戏

VM在Arduino编程环境中由人为的不确定因素使用quickcode和bikes编写。 还有一个类似C语言的编译器,使用相同的方法用JavaScript编写。 是的 您已经可以急于发表评论,扔石头。 好吧,对于仍然有兴趣的人,我邀请您继续阅读。

面包车

总的来说, 这里受人尊敬的tormozedison已经涵盖了我的工作。 但是当时有一个球形的真空原型。 现在我有了RomanS设备,他非常乐意为我免费提供实验。 该设备称为ESPboy。 它使用MCP23017芯片的紧凑性和扩展插槽与其他工艺不同。 在这里您可以了解有关他的更多信息。

如果有人对如何想到微控制器上的虚拟机这种奇怪的想法感兴趣,那么可以在破坏者的下面阅读它。

背景知识
上学后,我被一名游戏制作者从yoyogames带走,并且像许多人一样迷上了yoyogames,不知道是什么。 这些弯曲的,编写得不好的演示仍然可以为朋友吹嘘,但是在互联网上,他们却淹没在类似的演示中。 我意识到自己写一个简单的游戏是多么困难,更不用说严肃的游戏了。 但是写游戏的欲望并没有消失。 当我拿到手机时,我发现了Midlet Pascal,并玩了好几年。 毕竟,我意识到为弱小的设备编写游戏比让其强大的老大哥容易。 至少,人们总是不会谈论歪手,而是谈论平台的有限功能。 然而,按钮玩家让位给传感器的另一个征服世界的机会被错过了。 不过,在某个时候,我意识到我可以使用微控制器恢复梦想。

我从在arduino uno下编写游戏开始,如果没有它你会去哪里。 那时她是我唯一的一个,我非常担心她的表现。 我试图尽可能少地闪烁。 但是耙子的路很短。 对代码的每次小小的修改都会使其一次又一次地闪烁。 我决定写一个堆叠的虚拟机。 毕竟,板上有两千字节的RAM用于存储字节和代码的数据。 但是它的速度很慢,但是由于某种原因一直缺乏记忆。 可能的重点是,我所有的自行车都是方形车轮,行驶缓慢。 然后我决定在刚从中国来的Arduino Mega上编写一个Chip-8仿真器。 当然,那时候我想为她,第一个Playstation和一些超级计算机编写一个Gameboy模拟器。 结果,我了解了主要内容。 芯片8虚拟机非常简单,但过于简单。 如此之多,以至于在编写用于乘法或除法的游戏时,必须编写一个单独的慢子程序。 因此,您需要编写VM,摆脱致命的漏洞。 这时,又有一些esp8266上市,它们的空间为160MHz。

如果您觉得虚拟机浪费资源,那么我也为此重写了我的8芯片仿真器。 原来,虚拟机位于微控制器上的虚拟机中。 您可能可以走得更远,并在8芯片上编写图灵机。

ESP小游戏引擎规格


虚拟机包含16个寄存器,每个寄存器16位,零寄存器是堆栈指针。 每个指令都是双字节的,有些指令包含两个字节的数据。 可寻址内存64KB。 对于ESP8266,可用空间为20KB。 该程序可以从SPIFFS和UART下载。 如果需要,您可以从存储卡或通过WiFi添加下载。 除了通常的算术指令和移动数据指令外,还有用于处理精灵,屏幕和声音的单独指令。 屏幕尺寸128 x 128像素。 每个点16种颜色时,屏幕占用8KB内存,与绘制子画面和粒子的缓冲区数量相同。 尽管我使用的TFT_eSPI库能够每秒更新屏幕60次以上,但我不得不将自身限制为每秒20帧。 否则,虚拟机的处理器时间不足。 您可以绘制大小为128x128像素的图块和32个精灵,并可以旋转和镜像。 为了节省内存,您可以使用单位图像或RLE压缩。 简化了物理过程:检测小精灵与小精灵和图块的碰撞,碰撞分辨率,重力。 仅当行已更改像素时,才逐行更新屏幕。 VM速度取决于每秒绘制多少行,每秒的操作数为10万至90万。 您可以使用不同的彩色屏幕,可以将图像柔和地拉伸到所需的比例。


我在这里写的一些游戏可以在这里查看。

在将ESP8266用作VM的同时,我为浏览器编写了一个JavaScript模拟器。 为了不手动编辑字节码,根据我对MOS6502的汇编器的经验,添加了一个简单的汇编器。 然后,我决定添加一种高级语言。 尽管如此,我的主要任务是快速编写简单的游戏,而不是编写冗长的调试汇编代码。 在我看来,编写编译器要比添加LLVM容易。 我用JavaScript编写了代码,因为我知道它不如其他语言那么糟糕。 目前,他还远不支持C标准,并且在编译时,您很容易在无法理解的地方遇到无法理解的错误。 但这很快,因为它需要少于2000行。

现在,我为什么在这里写下所有这些。 现在您已经可以编写和运行游戏了。 但是,完美仍然遥不可及。 如果有人想帮助我确定ESP LGE或编写我自己的游戏,那么我会很高兴。 如果您认为我的想法很有趣,并且想了解更多,那么我很乐意回答您的问题。 我警告您,Arduino的代码很难阅读。 部分原因是我自学成才。 部分原因是我试图减少函数调用次数以提高工作速度。 结果,许多函数都包含了巨大的代码足迹。 因此,请勿让孕妇和儿童进入屏幕。 我将逐步解决此问题并提高可读性。

对于那些阅读过的人来说,这是一个游戏的例子。 它以少于一百行且少于1KB的形式编译。

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; } } 

您可以立即对其进行测试 。 单击链接,然后单击“编译”,然后运行。 如果您想进一步了解IDE的功能,可以阅读教程 。 谢谢您的关注。

Source: https://habr.com/ru/post/zh-CN459714/


All Articles