VTech Socrates 方法初探
VTech Socrates 方法初探
标签: computer vtech vtech-socrates pickup homemade-hardware homemade-software reversing
我们之前在这个博客上已经玩过很多 VTech 的电脑了。通常,它们是功能有限的相对简朴的电脑,但他们在 80 年代末确实制造了一些非常有趣的东西。Socrates 是他们 1988 年推出的混合视频游戏机/电脑设计,今天我们将开始拆解它。
开箱检查[#](https://www.leadedsolder.com/2025/04/22/<#checking-it-out> "Link to the section "Checking it out"")
这些机器在 eBay 上出奇地便宜且数量充足。我怀疑,就像大多数“教育”电脑一样,他们制造了太多这些东西,并以非常低的价格出售,期望通过大量销售游戏卡带来持续的现金流入。经典的剃刀和刀片模式。因此,零售商店被允许在季节性促销中大幅削减价格,这淹没了市场。我在 eBay 上看到的大多数盒子上都贴着两三个价格标签,表明它们肯定不是以全价 MSRP 购买的。
正如你可能期望的那样,我的 Socrates 迟到了,非常脏,并且装在一个严重损坏的、太大的盒子里。幸运的是,Socrates 是用一些非常厚的塑料制成的。我花了很多时间用湿巾和浸泡在 Windex 中的纸巾擦拭它。我不希望键盘能用,因为顶部的贴纸是波浪形的,这表明它受到了水的损坏。
在照片中,我认为那个大蓝色东西是一个电源按钮。事实证明,它是一个窗口,可以透过它看到一个内部带有公头边缘连接器的扩展槽:
这显然是你放置扩展设备的地方,例如语音模块。我们稍后再谈。
系统的背面有 两个 同轴 RF 插孔。一个是“Antenna In”,另一个是“RF Out”。我猜他们认为这对最终用户来说比像大多数系统那样将切换器/分接头放在电脑外部更简单。这不会持续太久。
拆卸[#](https://www.leadedsolder.com/2025/04/22/<#disassembly> "Link to the section "Disassembly"")
“教育”,嗯?我学习的最佳方式是将东西拆开。这就是我被踢出军事博物馆的原因。还有杂货店。
这东西是用数量惊人的螺丝固定在一起的!外壳的顶部有一个粗略切割的孔,隐藏在贴纸下,就像 Precomputer 一样。
还有很多热熔胶和遮蔽胶带。我想说这是我拆开的第一台里面有遮蔽胶带的电脑,但是 NEC Bungo 文字处理器里面有很多,用于固定打印机的破损塑料。让我们称之为第一卷 工厂 遮蔽胶带。
用于键盘-IR-接收器帽的胶带下面有一个奇怪的生锈点。
我不认为这些电容器漏液了,不是在这个角度,但是天啊,那个生锈点非常可疑。我要对这些电容进行 ESR 测试吗?绝对不。我们有事情要做。
主板已移除,显示实际上没有那么多部件,这有助于解释低成本。东芝作为供应商占据主导地位,就像几年前我研究 VTech Precomputer 时一样。你可以在 Wikimedia 上看到 Socrates 主板的更好扫描图。
关键部件,从左到右:
- VTech 掩模 ROM。32 针,所以可能是 1Mbit;
- Zilog Z84C0004PSC 或 Toshiba TMPZ84C00AP CPU(CMOS Z80);
- 密集 QFP 门阵列 VTEL 27-0769,即 Toshiba TC17G032AF;
- 多个 Toshiba TMM41464AP-12 64K x 4 DRAM;
- Toshiba TMP42C40P1844 4 位微控制器,可能用于 IR 解码,因为它的位置;
- 大量无源元件,其中一些可能是用于生成彩色视频和音频的 DAC。
令人遗憾的是,这么多东西都集成到那个门阵列中,但这是一台廉价机器,大规模集成可以大大降低成本。
从边缘连接器上的“24”来看,我预计扩展端口是 24 针的。它是控制台顶部的 12 针...然后在底部有一个很大的接地块。主板 PCB 显示该连接器连接到“TO VOICE CARTRIDGE”。引脚如此之少,这可能用于简单的 I/O 设备,不太可能用作完整的通用扩展端口,但你永远不知道。
AV Mod[#](https://www.leadedsolder.com/2025/04/22/<#av-mod> "Link to the section "AV Mod"")
博客超级朋友 Johnny Blanchard of Re-Enthused 过去已经为这台机器设计了一个 AV mod,所以我向他询问了它。他向我保证这是一个非常简单的设计,所以我决定让它变得更加复杂。
Blanchard 先生的设计中承认的一个缺陷是视频输出非常暗淡。稍微放大一点从来没有伤害过任何人,为此,我使用了我的备用方案:TI THS7374 视频放大器。
为了给该视频放大器供电,我在发现 RF 模块通常从系统的其余部分接收未稳压的 12V 电压后,添加了一个 5 伏表面贴装 LDO。THS7374 真正想要 3.3 - 5V,而向它提供 12 伏电压会烧毁它。我从经验中知道这一点。
因为我想稍微炫耀一下,所以我最初使用了一个非常小巧、廉价的 LDO。清醒过来后,我意识到手工焊接它会非常烦人。选择了一个 SOT223 LDO 来替换它 - 并不是说我没有电路板空间 - 我做了一个测试打印,用于在外壳中对齐。一切都非常合适,所以我继续进行制造。
该 PCB 具有所有不良想法的特征,从以新的方式滥用商品连接器到直接使用胶带作为结构元件。
以下是我在这里犯下的一些电路板设计罪行:
- 面板安装 RCA 连接器穿过 PCB,然后它们的接地环焊接在焊盘上。
- 当我加热螺纹连接器时,螺纹连接器开始从锁紧螺母上松动,所以我也将连接器的本体焊接在焊盘上。嘿,这对 Apple 来说已经足够好了......太糟糕了,这是一种非常糟糕的应力释放。
- 为了与 PCB 接触,这些连接器的“信号”部分通过一根导线连接到系统的其余部分,该导线焊接在表面贴装焊盘上,可能是以最容易产生应力(和 RFI)的方式。我在这里做了一些我一生中最糟糕的焊接。我用热缩管包裹连接器,试图隐藏它,但只是让事情变得更糟。
- 我将电阻器 R2 标记为“可选”,但没有在说明中说明它的作用。它是输入视频的下拉电阻,但如果我包含 两个 可选的焊盘,用于实现分压器,可能会更有用。
- 外壳内部没有正向的物理安装座来固定该 PCB,因为它比旧的 RF 模块薄得多。为了解决这个问题,我用双面 3M 胶带将 PCB 楔入外壳背面,这可能不会长期保持,并且提供更糟糕的应力释放。我认为一个更明智的想法是通过外壳塑料(同样,非常厚)进行某种热固螺母连接,尽管将其与 PCB 对齐会很麻烦。热熔胶、RTV 或 3D 打印的对齐垫片也是“完成”此 mod 的一种选择,一旦它被证明是有效的。
对于我的惩罚,至少组装起来也很烦人。我出于偏执,将 RCA 插孔孔做得有点太大,因此在试图将其拧入一个对于螺母来说太大的孔中时,将东西居中需要额外的工作。乐泰胶会有很大帮助,但我只有在完成两个插孔的焊接后才想起我有它。
扁平电缆将所有电源和视频信息从机器的其余部分传输到 RF 调制器。RF 调制器通常很笨重,并且喜欢吸收热量。因此,我很难拆焊旧的扁平电缆。接地引脚(2 和 4)不想放弃它们的位置,并且引脚 3 在移除时严重磨损。固定 RF 屏蔽罩上电缆的所有热熔胶也开始融化,污染了焊料,并在我的车间里产生了一种令人作呕的气味。
在释放它之后,我花了相当多的时间试图将引脚 3 重新塑造成可以穿过新 PCB 的形状。那是我应该预料到的事情,并使用更大的孔和更好的引脚间距来使自己更容易。
最后,我们准备好了一个 AV mod。现在是时候找出这台肮脏的、未经测试的玩具电脑是否真的可以工作了。我决定完全跳过使用示波器,而是决定直接将其发送到电视机。
开机[#](https://www.leadedsolder.com/2025/04/22/<#power-up> "Link to the section "Power up"")
Socrates 采用 12 伏中心正极电源,所以我翻出了我用于多个项目的 RCA 通用电源。VTech 建议你使用一个能够提供 850mA 的电源。10W 对于一个主要由 Z80 和一些 ASIC 组成的系统来说感觉很多,但我不会给自己增加难度。我拿出了“2500mA”容量(我们之前已经证明它不是)的 RCA 通用电源,并在我的通用插头桶中翻找,直到找到一个足够紧密,不会掉出来的插头。
Samsung 910MP LCD 电视在所有复合视频方面都很糟糕,所以这可能不是最好的测试平台 - 很难判断这种环绕色度是系统的故障、我的 mod 的故障还是电视机的故障。也就是说,如果电视机爆炸了,我也不会哭。它没有爆炸,而是向我展示了这个看起来相对不错的视频。音频非常响亮和哔哔作响,感觉可以使用一两个音量限制电阻器。那可以是别人的项目。
哦,是的,小机器人。我们将学习和玩耍更多。
真正玩它[#](https://www.leadedsolder.com/2025/04/22/<#actually-play-it> "Link to the section "Actually Play It"")
要使用电脑,我必须将电池放入这个怪异的键盘/控制器组合设备中。Socrates 键盘使用红外线进行交互,并且仅使用红外线。
要为键盘供电,你需要以这种非常规的 Tetris 式配置插入四节 1.5V AA 电池:
在电气上,它没有区别,但感觉键盘是由太空外星人设计的。这个决定实际上可能是出于包装原因而做出的。我希望键盘深处的负极没有被旧电池腐蚀,因为我从外面看不到它,所以我插入了一组四节亚马逊碱性电池。
最初,我假设键盘背面的开关可以打开和关闭它。他们不会无缘无故地添加它。但是,无论我以哪种模式按下键,“传输数据”指示灯都会闪烁。
为了弄清楚开关的奥秘,我决定打开键盘并查看内部。小心!键盘有不同的螺丝长度,可能是为了补偿空心外壳的不均匀夹紧力。请务必注意哪个螺丝放在哪里。
不幸的是,键盘内部有这个看起来很脆弱的膜连接到 PCB。我的勇气用完了。据我所知,当系统未使用时,无法关闭键盘,并且它可能 使用电容器在按下按钮时提供瞬时电源,就像电视遥控器一样。当你不使用它时,你肯定需要取出电池。
我在网上找不到任何关于键盘 PCB 上的开关作用的信息,尽管我确信手册 - 据我所知,尚未扫描 - 必须解释它。也许它可以切换数据的两种编码,以弥补来自另一个 IR 源的背景干扰?
但这并非完全浪费:我能够从键盘背面推出粘滞且非常脏的游戏手柄。它们非常令人讨厌,但似乎仍然有效。让我们试试一个游戏。
环游世界[#](https://www.leadedsolder.com/2025/04/22/<#around-the-world-around-the-world> "Link to the section "Around the World, Around the World"")
据我所知,右侧控制器上的方向键很难按下,而左侧控制器上的方向键不幸地偏向于对角线运动。尽管如此,我还是能够设法启动游戏 Around The World1,一个包含许多子游戏的游戏卡。你只需要先坐下来观看这个看似无法跳过的标题屏幕动画,其中一架飞机缓慢降落,然后机器人(名为 Socrates?)出现。
我尝试了几种模式。有一种模式是你猜测各种手工绘制的地标复制品属于哪个大陆,我在这方面做得不好。由于某种原因,它似乎对澳大利亚的纪念碑有很强的偏见。
我在这个通用国家测验中做得好得多,它要求你找出哪个国家与某个事实有关,然后用方向键点击它。通常,我知道这个国家,但无法找到它在地图上是哪个模糊的涂鸦。我想知道自 1988 年以来,这个游戏发生了多少变化,随着苏联的解体以及所有这些。
也许如果我从小就玩这个游戏,我现在就会成为联合国的外交官。我敢打赌他们能负担得起 真正好的 旧电脑。不过,对你来说是个好消息:绝对没有人为我的外交买单。
让我们继续打开这个游戏卡,弄清楚它的工作原理。
盗版卡带[#](https://www.leadedsolder.com/2025/04/22/<#pirate-cartridge> "Link to the section "Pirate Cartridge"")
打开这个迷人的软盘形状的卡带时,我看到的第一件事是……另一个 RF 屏蔽罩。如果他们试图将掩模 ROM 与产生不必要的干扰隔离开来,他们就会非常偏执。
移除 RF 屏蔽罩后,ROM 就会暴露出来。像我们过去介绍的大多数其他 VTech 产品一样,这是一个东芝 TC531xxx 1Mbit 掩模 ROM。我们知道 如何从 VTech Precomputer 探索中转储这些 ROM,但 MAME 已经包含了这个 ROM,我现在不想拆焊它。
卡带 PCB 的底面没有提供任何惊喜:一个 36 针边缘连接器。看起来 PCB 确实为未来更大的 ROM 留下了一些孔,这是一种有点不寻常的做法,但它向我表明 VTech 对 Socrates 有更大的计划,并且希望节省 PCB 旋转的成本。就像他们在 Precomputer 上所做的那样,能够为多个设计重用 PCB 意味着他们可以通过批量购买来节省成本。
我花了半个小时使用廉价的数字卡尺测量外壳和 PCB。然后,我开始发出卡带的声音,使用 ROM 的已知引脚排列来猜测边缘连接器上的每个引脚的作用。
与 Precomputer 不同,我不想完全解码卡带插槽,而只是想让一些软件在系统上运行。欢迎其他人将来弄清楚所有控制信号并为卡带插槽构建扩展硬件。
引脚 | 功能
---|---
1 | 接地
2 | 未知
3 | 未知
4 | 未知
5 | 未知
6 | D2
7 | D1
8 | D0
9 | A0
10 | A1
11 | A10
12 | A4
13 | A5
14 | A6
15 | A7
16 | A12
17 | A16
18 | +5V
19 | A15
20 | A14
21 | A13
22 | A8
23 | A9
24 | A11
25 | A3
26 | A2
27 | D7
28 | D6
29 | D5
30 | D4
31 | D3
32 | 未知
33 | 未知
34 | 未知
35 | ROM_CE
36 | 未知
此引脚排列与 Precomputer 非常相似,这是完全合理的。如果我发现更多信息,我稍后会更新此引脚排列。请注意,此引脚排列未经测试。
在我寄走卡带进行制作之前,我决定至少尝试先在模拟器中运行我自己的代码。
拆解卡带的大脑[#](https://www.leadedsolder.com/2025/04/22/<#pulling-apart-the-cartridges-brains> "Link to the section "Pulling Apart the Cartridge’s Brains"")
看起来 Around the World 已经在 MAME 中转储了;Arcade Italia 网站有一个列表,你可以在 Internet Archive 上玩它。我不得不四处挖掘一段时间才能找到它;事实证明它不是一个 ROM,它在“软件列表”中。它在 aworld.zip
捆绑包中被列为 27-5013-00-0.u1
。
我针对 vbindiff
运行了所有 ROM,试图找到它们标题字节中的共同点。我希望找到一些固定的签名,告诉 Socrates 已安装卡带,以及从哪里跳转到代码中。我发现所有 ROM 在位置 0 和 2(分别为 $c3 和 $40)都有相同的字节。那中间的字节呢?我不知道……
通过阅读 MAME 驱动程序,我能够确定卡带映射到 $4000 和 $7fff 之间的内存中。当然,这个内存是库交换的,因为我们已经知道卡带至少有 1Mbit 大。我在 MAME 中打开了卡带 ROM,运行调试器和我的传统观察点指令:
wpset 4000, 3fff, r, 1, { printf "Read cart at %08x => %08x\n", wpaddr, wpdata; g }
这产生了一个很大的垃圾邮件日志,每次模拟器试图击中卡带时都会记录下来。从这个跟踪中,我发现所有卡带的行为都相同,直到某个点:
地址 | 读取…
---|---
$7ff0 | $aa
$7ff1 | $55
$7ff2 | $e7
$7ff3 | $18
$4000 | $c3
$4001 | 各不相同,更多信息如下
$4002 | $40
所以我们知道读取的前四个字节是某种签名。 $aa 和 $55 是“此地址上实际有一个设备”的常见标记字节,因为它们的二进制编码是交替的 1 和 0。 $e7 和 $18 也是如此,它们是彼此的补充。这不太像“签名”,更像是检查来自卡带的数据总线是否可靠,这表明已连接 ROM。我真的很喜欢 VTech 工程师的实用性。
在确认卡带的存在后,模拟器将跳转到从位置 $4001 定义的 偏移量 从卡带读取。例如,如果该字节读取 $e7,那么它将开始从 $40e7 读取更多数据。
我不确定这是否意味着它是在这些位置 执行代码,还是只是读取更多标题信息,所以我修改了我的观察点以包含程序计数器:
wpset 4000, 3fff, r, 1, { printf "PC = %08x: Read cart at %08x => %08x\n", pc, wpaddr, wpdata; g }
一旦我这样做了,我发现读取高内存值后,电脑已经跳转到 $4000…… $c3 是 Z80 无条件跳转的操作码,JP nn
,这也解释了 $40,因为它将构成目标地址的高字节。我真的要记住这些东西。
所以现在我们知道如何让 Socrates 从卡带运行 Z80 代码。我们如何为它构建东西?我的第一步是尝试弄清楚 BIOS 是否有一些辅助函数来打印字符串。很多卡带的 ROM 中都有看起来正常的 ASCII 字符串,所以我假设可以进行某种调用将它们打印到屏幕上。
看起来字符串以其长度为前缀,就像在 Pascal 中一样,所以“SELECT AN ACTIVITY”首先会有字节 $12。
寻找 Printf[#](https://www.leadedsolder.com/2025/04/22/<#finding-printf> "Link to the section "Finding Printf"")
由于我是在知道 MAME 中可用的复杂 Lua 脚本 之前做的,因此我发现仅使用调试器很难跟上页面切换。也许有一种简单的方法可以在调试器内部将“虚拟”地址映射到“真实”地址,但我尚未弄清楚。
在尝试了几种不同的 ROM,直到我可以找到一个页面切换孔“恰到好处”以同时映射字符串和 BIOS 调用之后,我发现打印例程似乎使用 $0d 作为字符串的终止符。 27-5045(“State to State”)在很早的时候就有几个字符串,看起来是从 $0d0 偏移量开始的。
我设法弄清楚了在打印到屏幕之前离开 ROM 并进入 BIOS 的调用站点位于 $2080,所以我在我的小表中写下了 $2080 可能是他们的 printf 等价物。但我仍然不知道 XY 位置是什么,或者字符串是如何传递给它的。
对于字符串指针,我注意到在调用 $2080 之前,调用代码正在将字符串写入 $f040 的缓冲区中。我决定在进入 $2080 时设置断点,然后使用 MAME 的内存查看器在让它继续之前编辑 $f040 的字符串。这奏效了:
最终,我能够捕获一些在 $43e8 尝试读取字符串长度的代码,然后使用 ldir
用字符串的内容填充内部缓冲区。标记 $0d 确实被用作缓冲区填充的终止符,这让我怀疑为什么他们有长度。
通过在列表中向后工作,我确定了一个指向 $f0a9 的指针以某种方式参与其中。它的内容在调用 $2080 之前立即被写入。通常,该值为 $c84a。我在它被写入之前立即设置了一个断点,并更改了馈入其中的寄存器的值。我的第一次尝试是将其更改为 $c000,这使得字符串出现在屏幕的最左侧。
经过更多调整后,我发现 $4444 将其设置为大致屏幕的中心。它似乎是“字符串左上角的像素地址”。最重要的是,字符串的颜色似乎是基于某种基于瓦片的调色板,因为将黑色字符串移出屏幕的底行会将其变为白色。
最终编写代码[#](https://www.leadedsolder.com/2025/04/22/<#writing-code-finally> "Link to the section "Writing Code, Finally"")
有了这些信息,现在似乎可以构建一个 hello world 卡带。我启动了我最喜欢的 z80 汇编器 zasm,并编写了一个快速程序来测试我的理论。
不幸的是,该程序只是有点奏效。模拟的 Socrates 确实加载了标题并跳转到运行代码中,但加载到内存中的卡带中存在奇怪的损坏。
如果我打开 MAME 内存查看器,你可以看到这里发生了什么。
在系统启动时,有很多东西加载到 $4000 到 $7fff 范围内的内存中,这些内存应该被卡带占用。
到我到达卡带的入口点时(记住,到目前为止只从卡带 ROM 中读取了上述四个字节),它现在看起来完全不同了,但只有前几个字节实际上看起来像我的程序:
这里有很多 $c3 和 $03 的废话,这似乎与 ROM 的开头相呼应。发生了什么?
我做了一个大胆的猜测,并查看了所有其他 ROM。 $c9 始终跟随从 ROM 读取的四个字节,但我本以为 MAME 会捕获到它,如果它很重要的话。尽管如此,我还是添加了它,并且……这使得事情变得更糟,因为现在卡带甚至无法加载。
困惑之下,我决定尝试使用 zasm .org
伪指令来填充它。我最终得到了一个 64K ROM,它不如零售游戏的 128kB ROM 大。现在我的代码完全加载到 MAME 中,看起来是正确的。我不确定这是否是 MAME 中的错误,Socrates 页面切换器的怪癖,还是 Socrates BIOS 本身中的错误,但对于一段时间来说,这绝对是令人毛骨悚然的事情,并且让我倒退了几天。让我们继续。
我的下一步是更改 ch1 和 ch2 的音量级别,因为当系统启动时,它们都被设置为未初始化的 SN76489 嗡嗡声。正如 MAME 驱动程序中所示,这只需要写入 $12 和 $13。谢谢,MAME 驱动程序!
现在,是时候尝试清除屏幕,然后打印一条消息了。弄清楚在哪里调用来打印消息很容易,因为我们可以观察字符串是否正在加载。但是如果我只是调用 $2080 例程,我没有看到屏幕上的任何变化(除了偶尔的几个石灰绿色像素,甚至可能是未初始化的内存。)需要通过零售卡带进行更多的单步调试。目前,我决定专注于用颜色填充屏幕,然后稍后进行打印。
经过更多的戳刺,我意识到很多卡带正在设置 RAM 页面切换模式 $04,然后写入 $8000 到 $ffff 来填充屏幕。该写入跨越两个页面($7fff 字节),这对我来说很有意义,所以我进行了货物崇拜。
![屏幕的上半部分是黄色的,下三分之一左右是粉红色的。](https://www.leadedsolder.com/assets