C64 Dead Test 字体
摘要
对 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
```
相似文章
Hacker News Top
设计师 Jens Kutilek 记录了复刻 IBM Selectric Composer 字体背后的数学与历史研究,深入探讨了这款标志性 1960 年代打字机所采用的单位间距系统及其工程设计约束。该项目涉及对 IBM 9 单位字形宽度系统的逆向工程——这一系统被 Selectric Composer 的可更换"高尔夫球"字球所采用。
Fabien Sanglard
对超级任天堂卡带的详细技术分析,涵盖 CIC 复制保护、ROM 容量分布、带电池备份的 SRAM 以及 Super FX 等增强处理器。
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
一款为8位微控制器和微型OLED屏幕手工打造的5×5像素字体,仅占用350字节。
Hacker News Top
本文介绍了几种现代像素字体,包括 Analog Mono、Coral Pixels、Two Slice 和 Geist Pixel,讨论了它们的设计特色以及对 1990 年代亚像素渲染技术的怀旧情怀。