C64 Dead Test 字体

Hacker News Top 新闻

摘要

对 C64 Dead Test 诊断卡中使用的独特字体的详细探索,包括其字符集、一个彩蛋以及可下载的字符 ROM。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/24 06:37

# (Now Go Bang!) C64 Dead Test 字体 来源:https://www.masswerk.at/nowgobang/2026/c64-dead-test-font 2026年5月24日深入解析 C64“Dead Test”诊断卡带的字体,包括一个彩蛋、实现细节,以及一些可供下载的 Commodore 8 位字符 ROM。 标题插图 最近在网络上粗略浏览时,发现了一个令人惊讶的结果:显然没有任何关于 *C64 Dead Test* 卡带标志性字体的文档——没有字符表,没有读出数据,没有任何值得一提的内容。这是一个可耻的遗漏,我们在此尝试补救一次。(顺便说一句,同样的字体也实现在更高级的 Rev. 586200 诊断卡带中,Commodore 部件号 326070-01,即使用测试夹具的那一款,以及用于 SX64 的类似 Rev. 588220。) ## 卡带字体 C64“Dead Test”诊断卡带 Rev. 718220(Commodore 部件号 314139-03)以自带特殊字体而闻名,该字体嵌入在其 ROM 中,因此不使用 C64 内置的字符 ROM,实际上不需要任何内置 ROM 正常工作(故得名“Dead Test”),因为它作为一个独立的软件包出现。(我们稍后会看到它是如何实现的。)其显示字体有些特殊,据我所知,没有在其他地方使用过,也许正因如此,任何见过它的人都能够立即识别。 这就是“Dead Test”卡带的显示效果: C64 Dead Test 诊断卡带截图(处理过) 运行中的 C64 Dead Test 诊断卡带截图。 来源:zimmers.net (https://zimmers.net/) (经过处理以呈现 CRT 外观;N.L.) 作为提醒,以下是 C64 使用的正常字体(此处为上/图形字符集): 按屏幕代码 0-127 范围的 C64 上/图形字符图。 C64 上/图形字符,按屏幕代码 0-127 范围。 Dead Test 卡带仅实现了其中的 58 个字符(屏幕代码 $00–$39),没有任何反显字符: 按屏幕代码的 C64 Dead Test 诊断卡带实现的字符图。 C64 Dead Test 诊断卡带实现的字符,按屏幕代码。 细心的读者可能会注意到,这只实现了大写字母、数字以及少量标点和数学运算符。$1B–$1F([£]↑←)直接取自正常字符集,$28–$2F(()*+,−./)也是如此。一个额外的空白占据了正常字符集中 $00 处“@”字符的位置(对于诊断卡带来说是一个聪明的举动,但这个特性实际上从未被使用过),而边框字符 ╭╮╰╯─│ 实现在 $22–$27 范围内,我们通常在那里找到 "#$%&'。然后还有一个神秘的、C 形状的字符位于 $21(通常是感叹号!),它在 ROM 中的任何地方都没有被引用,既不是操作数,也不是在数据段中。 (如果你尝试显示任何其他屏幕代码,则会显示填充模式 $AA,即 10101010 的细垂直条纹,如“▥”,但在卡带上不会发生这种情况。) 视觉上,这是另一种 ComputerTM 字体,由矩形块状风格化的方正字符形状组成(如果分辨率允许,还有点圆角)。还有其他的,比如用于 PET 的“901447m”字符 ROM: 用于 Commodore PET 的 901447m 字符 ROM 样本。 用于 Commodore PET 的未知来源“901447m”字符 ROM 样本。 显然,这些字体都受到了 MICR(磁性墨水字符识别)字符集 E-13B 的启发,该字符集仅包含 14 个字形:数字 0-9 和 4 个附加标记: MICR(磁性墨水字符识别)集 E-18B MICR(磁性墨水字符识别)集 E-18B。 Dead Test 字体的数字实际上相当接近地表示了这一点,只是数字“3”的形状略有不同,看起来更方正: C64 Dead Test 诊断卡带渲染的数字。 C64 Dead Test 诊断卡带渲染的数字。 字母字符(A–Z)与此风格一致,倾向于在顶部居中的 6 × 7 像素框内展开,而字符“M”和“W”则向右扩展到更宽的 7 × 7 框中。 诚然,薄的单像素垂直笔画在消费级 CRT 彩色电视机上表现不佳,但如果你是一名维修技术人员或专业现场维修人员,可以使用此卡带,那么你可能也拥有一台专业显示器(并伴随着一种与众不同的舒适感)。 ## 一个意外的、不合时宜的彩蛋 正是与 MICR E-18B 字体的这种紧密关系,让我们更接近于神秘字符 #0x21 的真实性质——这个字符永远不会被显示,因为它在卡带的代码中任何地方都没有被引用: C64 Dead Test 诊断卡带屏幕代码 #0x21。 那么,这是什么?一个略微畸形的或高度风格化的字符“C”?也许是“鸡嘴”标志的一部分,缺少了另一半? 不!——它是 MICR 集中的“转接”符号,用作银行路由代码的分隔符! MICR(磁性墨水字符识别)集 E-18B 的“转接”符号。 MICR 集 E-18B 的“转接”符号。 这是对 MICR 集的明确致敬,是一个隐藏的字体彩蛋!(而且它占据感叹号的位置,这非常公平且合适。) ## 实现 一个有些被低估的事实是,C64 实际上是二合一的机器:我们亲切地称之为 Commodore 64 的架构,以及 Commodore Max。 Commodore 宣传册“Introducing the Commodore Max MachineTM.” (1982) Commodore 宣传册*“Introducing the Commodore Max MachineTM\.”*(1982 年),第 2 和 3 页,共 18 页。 →在新窗口/标签页中打开 (https://www.masswerk.at/nowgobang/images/commodore-max.jpg)。·来源:archive.org (https://archive.org/details/commodore-max-machine/page/n1/mode/2up)。 Commodore Max,在日本称为 Commodore Max Machine,在美国也称为 Commodore Ultimax,在德国称为 VC-10(已宣布但从未发布),是 1982 年推出并于同年停产的短暂尝试的低预算家用电脑,包含许多 C64 核心组件。Commodore Max 配备了 SID、VIC II、MOS 6510 和一个 CIA,以及仅 4K(或 2K,取决于来源*——我认为是 2K 可用内存,$0000–$01FF 保留给零页和处理器堆栈,$0400–$07FF 保留给显存,总共 4K 可寻址 RAM,范围 $0000 到 $0FFF*),没有用户端口和一个薄膜键盘。关键是,Commodore Max 不包含任何 ROM,完全依赖卡带 ROM。 C64 在处理卡带时有一个巧妙的技巧:卡带/扩展端口上有两个引脚/信号:`_GAME` 和 `_XROM`,用于根据连接到机器的卡带类型进行配置。如果 `_GAME` 为低电平且 `_XROM` 为高电平(正常),C64 会进入 *Ultimax* 模式,用于 Commodore Max(Ultimax)卡带。 C64 卡带端口 Commodore C64 的卡带/扩展端口。 Ultimax 模式将 C64 配置为以下内存映射: ``` $0000-$0FFF .... RAM (4K) $1000-$3FFF .... - $4000-$7FFF .... - $8000-$9FFF .... ROML (8K) $A000-$BFFF .... - $C000-$CFFF .... - $D000-$DFFF .... I/O $E000-$FFFF .... ROMH (8K) ``` 就像在 Commodore Max 上一样,现在只有 4K 可寻址 RAM($0000–$0FFF)和两个可寻址的 8K ROM 存储体(`ROML` 在 $8000–$9FFF,`ROMH` 在 $E000–$FFFF)。$D000–$DFFF 的 I/O 区域方便地保持与标准 C64 模式相同。正如我们所见,内置的 C64 ROM(包括字符 ROM)被切换出去了。此外,`ROMH` 关键地包含了 6510 系统向量,包括指定起始地址的 `RESET` 向量。因此,卡带完全独立运行。(输出信号 `_ROML` 和 `_ROMH` 选择寻址哪个卡带 ROM 区域。对于一个 8K 卡带,这是 $E000–$FFFF 处的 `ROMH`,它包括启动所需的系统向量。) 相当多的早期 C64 游戏卡带,如 *Omega Race*,实际上是 Ultimax 卡带,得益于这种兼容模式,它们在 C64 上运行得一样好。 Dead Test 卡带使用同样的技巧来绕过 C64 的内置 ROM:它是一个 8K Ultimax 卡带,ROM 代码位于 $E000–$FFFF,起始地址(复位向量)为 $E000。 字体(即字符矩阵)从 $EAD8 开始实现,剩余的卡带空间填充为 $AA: →跳过列表 (https://www.masswerk.at/nowgobang/2026/c64-dead-test-font#skip_font) ``` 58 个字符矩阵(屏幕代码 $00-$39) 屏幕代码 $00 EAD8: 00 ; ........ EAD9: 00 ; ........ EADA: 00 ; ........ EADB: 00 ; ........ EADC: 00 ; ........ EADD: 00 ; ........ EADE: 00 ; ........ EADF: 00 ; ........ 屏幕代码 $01 EAE0: 7E ; .******. EAE1: 42 ; .*....*. EAE2: 42 ; .*....*. EAE3: 7E ; .******. EAE4: 46 ; .*...**. EAE5: 46 ; .*...**. EAE6: 46 ; .*...**. EAE7: 00 ; ........ 屏幕代码 $02 EAE8: 7E ; .******. EAE9: 62 ; .**...*. EAEA: 62 ; .**...*. EAEB: 7E ; .******. EAEC: 62 ; .**...*. EAED: 62 ; .**...*. EAEE: 7E ; .******. EAEF: 00 ; ........ 屏幕代码 $03 EAF0: 7E ; .******. EAF1: 42 ; .*....*. EAF2: 40 ; .*...... EAF3: 40 ; .*...... EAF4: 40 ; .*...... EAF5: 42 ; .*....*. EAF6: 7E ; .******. EAF7: 00 ; ........ 屏幕代码 $04 EAF8: 7E ; .******. EAF9: 42 ; .*....*. EAFA: 42 ; .*....*. EAFB: 62 ; .**...*. EAFC: 62 ; .**...*. EAFD: 62 ; .**...*. EAFE: 7E ; .******. EAFF: 00 ; ........ 屏幕代码 $05 EB00: 7E ; .******. EB01: 60 ; .**..... EB02: 60 ; .**..... EB03: 78 ; .****... EB04: 70 ; .***.... EB05: 70 ; .***.... EB06: 7E ; .******. EB07: 00 ; ........ 屏幕代码 $06 EB08: 7E ; .******. EB09: 60 ; .**..... EB0A: 60 ; .**..... EB0B: 78 ; .****... EB0C: 70 ; .***.... EB0D: 70 ; .***.... EB0E: 70 ; .***.... EB0F: 00 ; ........ 屏幕代码 $07 EB10: 7E ; .******. EB11: 42 ; .*....*. EB12: 40 ; .*...... EB13: 6E ; .**.***. EB14: 62 ; .**...*. EB15: 62 ; .**...*. EB16: 7E ; .******. EB17: 00 ; ........ 屏幕代码 $08 EB18: 42 ; .*....*. EB19: 42 ; .*....*. EB1A: 42 ; .*....*. EB1B: 7E ; .******. EB1C: 62 ; .**...*. EB1D: 62 ; .**...*. EB1E: 62 ; .**...*. EB1F: 00 ; ........ 屏幕代码 $09 EB20: 10 ; ...*.... EB21: 10 ; ...*.... EB22: 10 ; ...*.... EB23: 18 ; ...**... EB24: 18 ; ...**... EB25: 18 ; ...**... EB26: 18 ; ...**... EB27: 00 ; ........ 屏幕代码 $0A EB28: 04 ; .....*.. EB29: 04 ; .....*.. EB2A: 04 ; .....*.. EB2B: 06 ; .....**. EB2C: 06 ; .....**. EB2D: 66 ; .**..**. EB2E: 7E ; .******. EB2F: 00 ; ........ 屏幕代码 $0B EB30: 42 ; .*....*. EB31: 44 ; .*...*.. EB32: 48 ; .*..*... EB33: 7E ; .******. EB34: 66 ; .**..**. EB35: 66 ; .**..**. EB36: 66 ; .**..**. EB37: 00 ; ........ 屏幕代码 $0C EB38: 40 ; .*...... EB39: 40 ; .*...... EB3A: 40 ; .*...... EB3B: 60 ; .**..... EB3C: 60 ; .**..... EB3D: 60 ; .**..... EB3E: 7E ; .******. EB3F: 00 ; ........ 屏幕代码 $0D EB40: 43 ; .*....** EB41: 67 ; .**..*** EB42: 5B ; .*.**.** EB43: 43 ; .*....** EB44: 43 ; .*....** EB45: 43 ; .*....** EB46: 43 ; .*....** EB47: 00 ; ........ 屏幕代码 $0E EB48: E2 ; ***...*. EB49: D2 ; **.*..*. EB4A: CA ; **..*.*. EB4B: C6 ; **...**. EB4C: C2 ; **....*. EB4D: C2 ; **....*. EB4E: C2 ; **....*. EB4F: 00 ; ........ 屏幕代码 $0F EB50: 7E ; .******. EB51: 42 ; .*....*. EB52: 42 ; .*....*. EB53: 46 ; .*...**. EB54: 46 ; .*...**. EB55: 46 ; .*...**. EB56: 7E ; .******. EB57: 00 ; ........ 屏幕代码 $10 EB58: 7E ; .******. EB59: 42 ; .*....*. EB5A: 42 ; .*....*. EB5B: 7E ; .******. EB5C: 60 ; .**..... EB5D: 60 ; .**..... EB5E: 60 ; .**..... EB5F: 00 ; ........ 屏幕代码 $11 EB60: 7E ; .******. EB61: 42 ; .*....*. EB62: 42 ; .*....*. EB63: 62 ; .**...*. EB64: 6A ; .**.*.*. EB65: 66 ; .**..**. EB66: 7E ; .******. EB67: 00 ; ........ 屏幕代码 $12 EB68: 7E ; .******. EB69: 42 ; .*....*. EB6A: 42 ; .*....*. EB6B: 7E ; .******. EB6C: 68 ; .**.*... EB6D: 64 ; .**..*.. EB6E: 62 ; .**...*. EB6F: 00 ; ........ 屏幕代码 $13 EB70: 7E ; .******. EB71: 42 ; .*....*. EB72: 40 ; .*...... EB73: 7E ; .******. EB74: 02 ; ......*. EB75: 62 ; .**...*. EB76: 7E ; .******. EB77: 00 ; ........ 屏幕代码 $14 EB78: 7E ; .******. EB79: 18 ; ...**... EB7A: 18 ; ...**... EB7B: 18 ; ...**... EB7C: 18 ; ...**... EB7D: 18 ; ...**... EB7E: 18 ; ...**... EB7F: 00 ; ........ 屏幕代码 $15 EB80: 62 ; .**...*. EB81: 62 ; .**...*. EB82: 62 ; .**...*. EB83: 62 ; .**...*. EB84: 62 ; .**...*. EB85: 62 ; .**...*. EB86: 3C ; ..****.. EB87: 00 ; ........ 屏幕代码 $16 EB88: 62 ; .**...*. EB89: 62 ; .**...*. EB8A: 62 ; .**...*. EB8B: 62 ; .**...*. EB8C: 62 ; .**...*. EB8D: 24 ; ..*..*.. EB8E: 18 ; ...**... EB8F: 00 ; ........ 屏幕代码 $17 EB90: C2 ; **....*. EB91: C2 ; **....*. EB92: C2 ; **....*. EB93: C2 ; **....*. EB94: DA ; **.**.*. EB95: E6 ; ***..**. EB96: C2 ; **....*. EB97: 00 ; ........ 屏幕代码 $18 EB98: 62 ; .**...*. EB99: 62 ; .**...*. EB9A: 24 ; ..*..*.. EB9B: 18 ; ...**... EB9C: 24 ; ..*..*.. EB9D: 62 ; .**...*. EB9E: 62 ; .**...*. EB9F: 00 ; ........ 屏幕代码 $19 EBA0: 62 ; .**...*. EBA1: 62 ; .**...*. EBA2: 62 ; .**...*. EBA3: 34 ; ..**.*.. EBA4: 18 ; ...**... EBA5: 18 ; ...**... EBA6: 18 ; ...**... EBA7: 00 ; ........ 屏幕代码 $1A EBA8: 7F ; .******* EBA9: 03 ; ......** EBAA: 06 ; .....**. EBAB: 08 ; ....*... EBAC: 10 ; ...*.... EBAD: 60 ; .**..... EBAE: 7F ; .******* EBAF: 00 ; ........ 屏幕代码 $1B EBB0: 3C ; ..****.. EBB1: 30 ; ..**.... EBB2: 30 ; ..**.... EBB3: 30 ; ..**.... EBB4: 30 ; ..**.... EBB5: 30 ; ..**.... EBB6: 3C ; ..****.. EBB7: 00 ; ........ 屏幕代码 $1C EBB8: 0E ; ....***. EBB9: 10 ; ...*.... EBBA: 30 ; ..**.... EBBB: FE ; *******. EBBC: 30 ; ..**.... EBBD: 60 ; .**..... EBBE: FF ; ******** EBBF: 00 ; ........ 屏幕代码 $1D EBC0: 3C ; ..****.. EBC1: 0C ; ....**.. EBC2: 0C ; ....**.. EBC3: 0C ; ....**.. EBC4: 0C ; ....**.. EBC5: 0C ; ....**.. EBC6: 3C ; ..****.. EBC7: 00 ; ........ 屏幕代码 $1E EBC8: 00 ; ........ EBC9: 18 ; ...**... EBCA: 3C ; ..****.. EBCB: 7E ; .******. EBCC: 18 ; ...**... EBCD: 18 ; ...**... EBCE: 18 ; ...**... EBCF: 18 ; ...**... 屏幕代码 $1F EBD0: 00 ; ........ EBD1: 10 ; ...*.... EBD2: 30 ; ..**.... EBD3: 7F ; .******* EBD4: 7F ; .******* EBD5: 30 ; ..**.... EBD6: 10 ; ...*.... EBD7: 00 ; ........ 屏幕代码 $20 EBD8: 00 ; ........ EBD9: 00 ; ........ EBDA: 00 ; ........ EBDB: 00 ; ........ EBDC: 00 ; ........ EBDD: 00 ; ........ EBDE: 00 ; ........ EBDF: 00 ; ........ 屏幕代码 $21 EBE0: 0E ; ....***. EBE1: 0E ; ....***. EBE2: 60 ; .**..... EBE3: 60 ; .**..... EBE4: 60 ; .**..... EBE5: 60 ; .**..... EBE6: 0E ; ....***. EBE7: 0E ; ....***. 屏幕代码 $22 ```

相似文章

重现 IBM Selectric Composer 字体(2023) --- 在寻找比普通打字机字体更精致的字体时,我发现自己深入研究了 IBM Selectric Composer 的历史——这是一台 20 世纪 60 年代末至 70 年代的排版机器,凭借其精良的字体和比例间距功能,曾广泛用于专业出版领域。 ## 背景 IBM Selectric Composer 是 IBM Selectric 打字机系列的一个特殊变体,专为专业排版而设计。它使用可互换的"字球"(typeball,也称为"golf ball"),能够产生比普通打字机更接近专业印刷品质的输出效果。这台机器支持多种字体和字号,并具备比例间距功能,使其输出的文档看起来更接近专业排版。 ## 字体特点 Selectric Composer 的字体具有以下几个显著特点: - **比例间距**:不同字符占用不同宽度,而非等宽 - **多种字号**:支持从 7 到 12 点不等的字号 - **多种字体风格**:包括衬线体、无衬线体等多种风格 - **专业品质**:输出质量介于普通打字机和专业照相排版之间 ## 数字化复原工作 复原这些字体的过程涉及以下几个步骤: 1. **收集样本**:从历史文档、用户手册和档案资料中收集原始字体样本 2. **扫描与清理**:对样本进行高分辨率扫描,并清理图像中的噪点和瑕疵 3. **矢量化**:将光栅图像转换为矢量轮廓 4. **调整与优化**:对字符进行细致的调整,确保一致性和可用性 5. **添加元数据**:为字体文件添加适当的元数据和字距调整信息 ## 技术挑战 复原过程中遇到了几个主要的技术挑战: - 原始样本质量参差不齐,许多文档经过多次复印,质量有所降低 - 比例间距信息需要从原始文档中重新推算 - 某些字符(尤其是标点符号和特殊字符)的样本极为稀少 - 需要在忠实还原原始设计与提高现代可用性之间取得平衡 ## 成果 经过数月的工作,成功复原了多款 Selectric Composer 字体的数字版本,这些字体现已可供免费下载使用。这些字体为设计师和排版爱好者提供了一种独特的历史风格选择,同时也为保存这段印刷史上的重要遗产做出了贡献。 ## 结语 这个项目不仅是一次技术练习,更是对印刷历史的一次致敬。IBM Selectric Composer 在专业出版领域扮演了重要角色,帮助无数人制作出超越普通打字机水平的专业文档。通过将这些字体数字化,我们得以将这段历史延续下去,让现代设计师也能感受到那个时代独特的排版美学。

Hacker News Top

设计师 Jens Kutilek 记录了复刻 IBM Selectric Composer 字体背后的数学与历史研究,深入探讨了这款标志性 1960 年代打字机所采用的单位间距系统及其工程设计约束。该项目涉及对 IBM 9 单位字形宽度系统的逆向工程——这一系统被 Selectric Composer 的可更换"高尔夫球"字球所采用。

超级任天堂卡带内部揭秘

Fabien Sanglard

对超级任天堂卡带的详细技术分析,涵盖 CIC 复制保护、ROM 容量分布、带电池备份的 SRAM 以及 Super FX 等增强处理器。

Soul Player C64 – 在 1 MHz Commodore 64 上运行的真正 Transformer

Hacker News Top

# gizmo64k/soulplayer-c64 来源:[https://github.com/gizmo64k/soulplayer-c64](https://github.com/gizmo64k/soulplayer-c64) # Soul Player C64 **一款在 1 MHz Commodore 64 上运行的真实 Transformer。** ``` .-------. | O O | | V | |..|---|..| # SOUL PLAYER C64 2.5万个参数。 2 层网络。 真实的 Transformer。 从软盘加载运行。 你> 嗨 C64> 你好!这声音不错。真神奇! ``` 一个 2 层仅解码器(Decoder-Only)Transformer —— 与 ChatGPT、Claude 和 Gemini 背后的架构相同 —— 采用手写 6502/

几个有趣的现代像素字体

Hacker News Top

本文介绍了几种现代像素字体,包括 Analog Mono、Coral Pixels、Two Slice 和 Geist Pixel,讨论了它们的设计特色以及对 1990 年代亚像素渲染技术的怀旧情怀。