简介

nand2tetris,顾名思义,从与非门搭建一个俄罗斯方块的游戏。它是一个课程,教大家如何从最基本的逻辑电路(与非门)构建一个复杂的操作系统,并完成一个俄罗斯方块的制作。
那么nand2badapple呢,就是我把目标改了一下,从逻辑电路做到一个可以播放badapple的小计算机。

nand2tetris课程

nand2tetris课程官网:https://www.nand2tetris.org
这是一个非常好的课程,可以很轻松地认识计算机的结构,并且有配套的练习、答案、模拟器等等。教材是一本书,中文译本名为《计算机系统要素:从零开始构建现代计算机》,相关的软件可以从上面的网站下载。1-5章为硬件部分,搭建一个迷你CPU、内存,6-12为软件部分,讲述代码的编译过程,如何将高级语言一部一部地编译成机器码。

nand2badapple项目

nand2tetris第9章的任务就是利用高级语言编一个程序,有一句话叫“有屏幕的地方就有badapple”,于是就想尝试一下。然而由于要显示的内容太多,而模拟的计算机内存太小(ROM只有32K),完全达不到播放一个完整的badapple的需求。因此最终是用它的高级控制方式,利用其测试程序完成屏幕显示的控制,就可以达到每隔几秒播放1帧的效果。
帧的生成步骤:
1 将mp4用ffmpeg转换为jpg图像序列,分辨率与最终屏幕相匹配
2 使用python读取jpg图像,获得其灰度,得到一个三维数组。
3 由于最终是个单色图像,只有黑和白,那么我使用的是随机化处理的方法。例如80%白的灰色像素点转换为单色时,有80%概率为白色,20%为黑色。这样可以使用黑白来模拟灰色的效果,实际上还有很多种处理方法。
4 把转换好的灰度图像,按照nand2tetris模拟器的坐标,绘制图像。
5 对于下一帧,只需要计算两帧之间的差值,反转变化了的像素点即可,不需要重新全部绘制一遍。
最后把播放过程录制下来并与音频相匹配,就成了。

视频预览: