“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
自制复古游戏主机:从零到可玩的家酿电子工程
一位软件工程师从零开始自制了一台具有复古风格(NES/SNES之间)的游戏主机,采用双单片机模拟PPU/VPU、Z80 CPU、PAL输出和SD卡加载游戏,展示了完整硬件与固件设计过程。
自制视频游戏主机:一位软件工程师的复古硬件之旅
引言
这篇文章是 Sérgio Vieira 分享的“家酿”(homebrew)视频游戏主机项目介绍。整个项目从零开始,没有使用现成的游戏芯片,而是用分立元件和微控制器搭建了一台独特的、可玩游戏的硬件主机。作者出生于80/90年代的葡萄牙,受第三、四代主机(NES、SNES、Master System、Mega Drive)的深刻影响,决定在业余时间自学电子学,打造属于自己的游戏机。
作者的背景:职业是软件工程师,几乎没有电子经验(除了组装电脑外),通过买书和套件自学。最终成功构建了这台主机,并在此文中详细解析了硬件架构、图形系统、CPU设计和固件实现。
设计目标与核心特性
作者在项目启动时设定了明确的设计目标,这些目标贯穿了整个项目:
- 无模拟:所有游戏必须在真实硬件上运行(不要求使用当年的老芯片,只要求性能恰好够用)。
- 专用复古CPU:采用 Zilog Z80。
- 模拟电视输出:输出 PAL 制式的模拟 RGB 信号。
- 音频能力:能够发出声音。
- 双控制器支持:支持两个游戏手柄。
- 滚动背景与精灵:必须支持马里奥式横版游戏所需的图形能力(以及更多类型)。
- SD卡存储游戏:不使用卡带,而用 SD 卡分发程序,便于从 PC 复制文件。卡带方案需要为每个程序制作额外的硬件——这不现实。
这个目标矩阵在后续的系统架构中几乎被逐条实现,非常值得留意。
视频信号:软件位冲 PPV 的诞生
视频信号是整个项目最先攻克的难点。那个时代的主机都使用完全不同的专用图形芯片,因此设计者并不想采用任何现成方案,而是希望拥有自有的图形特性。但因为无法流片,也不会 FPGA,作者选择用软件方式驱动一颗 20 MHz 的 8位微控制器(Atmega644)来生成 PAL 视频信号。
由于微控制器原生不支持 PAL 协议,他采用 bit banging 方式直接操纵引脚,模拟输出视频时序。视频信号格式为 8位 RGB332(R=3位,G=3位,B=2位),再通过被动 DAC(电阻网络)转换为模拟 RGB,最后通过 SCART 接口输入电视(那是葡萄牙非常普遍的电视输入方式)。
图:用 Atmega644 直接产生 PAL 信号,附有必要的时序控制。
图形系统:双缓冲与双 MCU 架构
为了不让视频信号生成处理器(他们称之为 VPU,Video Processing Unit)同时去计算图形,作者引入了 双缓冲 机制:
- PPU(Picture Processing Unit,图形处理单元):另一颗 Atmega1284(也是 20 MHz)负责生成图像内容,写入 VRAM1(或 VRAM2)。
- VPU:专门负责把 VRAM 中的图像数据依次推出到电视上。
每一帧(在 PAL 下为 1/25 秒或两个半帧)完成后,VPU 和 PPU 交换使用的 RAM 芯片。例如:此刻 PPU 写入 VRAM2,而 VPU 把 VRAM1 的内容输出;下一帧交换。
这带来一个复杂问题:PPU和VPU都需要访问RAM,而微控制器访问外部 RAM 是位敲定制的(没有内存控制器)。因此,这块视频板不得不加入大量 74系列逻辑芯片(计数器、行选择器、总线收发器等),以实现总线仲裁和 RAM 的高效存取。
因此视频板的硬件相当复杂,固件(尤其 PPU 端)为了每帧绘制出期望的图像效果,需要在极短时间中高效地运行。最初作者用纯汇编编写 PPU/VPU 程序,后来部分移植到 C,但仍保留了高度性能导向的代码。
图形规格:224×192、精灵、虚拟屏与属性表
最终 PPU 生成的画面为 224×192 像素,稍低于同代主机的 256×224。降低分辨率让作者可以在每帧绘制周期内塞入更多图形特效。
该图形芯片采用经典“复古”特征:
背景:
- 使用 8×8像素的字符/瓦片(tiles) 组成背景,屏幕背景为 28×24 块瓦片。
- 同时支持 4 个虚拟屏幕,每个均为 28×24 瓦片,彼此连续且环绕(可以平滑实现逐像素滚动和背景无缝更新)。
- 支持每行单独滚动方向/偏移,可产生有限的视差滚动或分屏效果。
精灵(Sprites):
- 最多渲染 64 个精灵,每个可为 8×8 或 16×16(1、2 或 4 个瓦片)级别的大小。
- 支持水平翻转、垂直翻转或双方向翻转。
Overlay 覆盖层:
- 背景之上可显示一片 28×6 瓦片 的覆盖区域,适合静态HUD栏,在背景滚动时不需要只靠精灵来显示游戏提示文字。
属性表(Attribute Table):
- 给每个瓦片赋一个 0~3 的属性值,然后 CPU 可以一次设置:将具有某属性的全部瓦片映射到某页,或一次性让它们的瓦片序号递增。
- 典型应用:马里奥游戏中“闪动的?砖块”或瀑布的动态水流——不需要 CPU 逐帧重写所有瓦片,只需下发指令即可。
CPU:为何是 Z80?以及IO空间的优势
有了图形板之后,作者开始连接主 CPU。他选择了传奇的 Zilog Z80。这是极具时代感的 CPU,但作者特别点出了硬件层的深层原因:
- Z80 有 16位存储空间(64KB)和 16位IO空间,二者独立。
- 同期的著名 6502 只有 16位寻址空间,需要将内存、外部设备(如显示芯片)映射在同一地址空间中。
- 因此 Z80 可最大程度利用 64KB 程序/数据内存,IO空间独立用于外部设备的访问。
CPU通过 EEPROM 启动并运行测试代码。另外作者制作了一个 IO 单片机(Atmega324,20MHz),通过 Z80 的 IO空间进行控制,并通过 RS232 连接 PC 调试,以验证 CPU 与线路的互通。该 IO 单片机将成为控制 SD 卡、游戏手柄以及未来音频等等外设的中枢。
架构总结与后续
文章发布了这个精心之作的第一部分总结,后面似乎还有细节待展开。而核心架构已经很清晰:
_CPU(Z80) ↔ EEPROM/内存 ↔ IO单片机(负责输入输出、SD卡、手柄) ↔ 视频板(PPU+VPU+VRAM双缓冲)_ → 电视。
这个系统没有仿真、没有现成的图形/声音芯片,而是以软件位传输的方式创新地实现了大量显示特性,并且配合 Z80 的强分离IO地址,构成了一个相当完整、深入的家酿游戏机系统。它可以真正在 PAL 电视上渲染滚动背景、精灵、覆盖层、属性变换,并读取 SD 卡中的游戏。
对一个原本只有编程能力的爱好者来说,这个项目的意义不只是“设备能跑”,而是从零消化了模拟电路、数字逻辑、信号时序和底层固件设计——把一本电子学教程变成了真实运行的游戏机。
原文链接:https://internalregister.github.io/2019/03/14/Homebrew-Console.html