Apple Disk II 控制器卡
摘要
本文详细介绍了 Apple Disk II 控制器卡的技术历史,阐述了史蒂夫·沃兹尼亚克创新的软件驱动设计及其对 Apple II 成功的影响。
暂无内容
查看缓存全文
缓存时间: 2026/07/01 23:02
# 神奇的 Disk II 控制器卡
来源:https://www.bigmessowires.com/2021/11/12/the-amazing-disk-ii-controller-card/
在 Apple II 磁盘的世界里,磁盘控制器卡主要分为两大类:原始的 Disk II 控制器(及其克隆),以及其他一切。两者各有其用武之地。“其他一切”类别包括 Apple 3.5 磁盘控制器卡、Liron 卡、SCSI 卡、IDE 卡等等。这些卡提供了一套标准 API,让软件能够读写块、获取驱动器状态、格式化磁盘,而无需软件了解磁盘的实际工作原理。这些卡内置了智能逻辑来处理底层细节。相比之下,原始的 Disk II 控制器卡则简单到极致,迫使软件几乎处理所有底层细节。然而,它在其时代是一项令人惊叹的技术。
早期 Apple II 型号没有内置软盘支持。Disk II 控制器被巧妙地设计出来,以极低的成本添加了这一缺失的支持,这也是 Apple II 电脑如此受欢迎的主要原因之一。这款磁盘控制器比当时任何竞争对手都更简单、更便宜、更灵活,并且全面更优。它是 Woz 式“能做到”技术的终极典范。
**软盘基础 101**
软盘只是一个带有磁性涂层的塑料圆盘。加载到驱动器中后,磁盘以大约 300 RPM 的速度旋转。一个步进电机将读/写头从磁盘中心线性移动到外缘。这种布局提供了几十个同心圆环,可以在上面存储连续的 1 和 0 数据流。
如何从这些基础概念过渡到字节、磁道和扇区这样的高级概念?逻辑数据字节是如何编码成磁盘上的位模式的?读取磁盘时,位是如何被分组成字节的?如何找到零磁道或扇区之间的边界?在 1970 年代,对这些问题的传统答案是需要额外的硬件,而且很多。这使得磁盘控制器和驱动器本身复杂且昂贵,对于廉价的家用电脑系统来说几乎遥不可及。
1977 年末,苹果公司开始寻求替代盒式磁带数据存储的方案,并开始研究 Apple II 的软盘驱动器选项。当时他们仍然是一家规模不大且未经证实的公司,Apple II 上市也才大约六个月。Woz 对软盘主题了解不多,但他同意接受挑战。
Woz 的方法是移除几乎所有控制磁盘的硬件,采用类似于位碰撞(bit-banging)的软件驱动方法。苹果公司找到了 5.25 英寸软盘驱动器的发明者 Shugart,并要求提供 Shugart SA400 驱动器的精简版,移除了大部分控制电子设备。它只是一个简单的机械装置,带有一个用于旋转磁盘的电机和一个用于移动读/写头的步进电机。传说中,整个 Disk II 硬件设计由 Woz 和 Randy Wigginton 在 1977 年圣诞节假期期间仅用几周时间构思并构建,包括编写第一个版本的 DOS,并且这个可工作的磁盘驱动器在 1978 年 1 月的 CES 上进行了演示。苹果工程师 Cliff Huston 和 Wendell Sander 提供了额外帮助。40 多年后,我仍然对这个小型团队如此迅速地让一切正常工作感到惊讶。
几年前,我向 Woz 询问了 Disk II 的开发情况,他这样说道:
> 我不知道我是如何想出那个不可思议的磁盘控制器的。我很擅长创作任何电子方面的东西,无论是模拟还是数字。我以前没有任何关于磁盘硬件或软件的经验,甚至没有上过相关课程。所以我的思考必须从零开始。我必须感知来自磁盘的数据,并根据时序做出关于 0 和 1 的决定。我在伯克利上过一门关于状态机的研究生课程(虽然我是本科生,但在大学里我只修所有与计算机相关的任何课程),我想到了如何使用两个简单廉价的芯片作为状态机来做这件事,有点像手工构建一个微小的微处理器。当时我只知道它能读写数据,但我以为我遗漏了许多磁盘控制器的组成部分,因为我不知道它们的功能。我这么以为是因为我的设计用了很少的部件。但最终,我的设计在某些方面做得更多,尤其是因为它位于计算机内部,并与可以改变其工作方式的软件绑定,这最终导致了更大的存储容量和更快的速度,这是使用普通磁盘无法实现的。此外,我从驱动器本身拆掉了大约 20 个芯片,并通过我自己的控制器绕过了它们,因为它们只是碍事的中介。我做得最好的工作,一次又一次,部分是由于没有钱,不得不学习如何使用最少的零件,也是由于我创造的每一件伟大的东西都是我以前从未做过的。
**Disk II 控制器巡礼**
Disk II 控制器卡基本上只是一个花哨的移位寄存器。它知道如何以每 4 微秒 1 位的固定速率读写位。该卡还有一个微型 256 字节 ROM,其中包含在计算机首次启动时运行的自举代码。这是一个最小的 6502 程序,仅具备足够的智能来定位磁道 0、扇区 0,将其加载到计算机内存中,然后执行它。磁盘控制的每一个其他方面都由软件处理。
该卡只包含八个简单的芯片。有一个 256 字节的 ROM 包含自举代码,以及第二个 256 字节的 ROM 用作状态机的一部分(稍后会详细介绍)。还有一个 74LS174 六路触发器为状态机提供输入。一个 74LS323 八位移位寄存器是整个设计的核心。一个 74LS259 可寻址锁存器用于存储电机和驱动器 1 或 2 选择的期望状态。还有一个 556 双定时器,以及一个 74LS05 六反相器和 74LS132 四输入与非门,用于提供一些必要的粘合逻辑。就是这样。这就是整个磁盘控制器。以下是原理图:
让我们逐一分析软盘 I/O 的挑战,并看看 Disk II 控制器设计如何解决它们。
**挑战 #1:字节帧同步。** 来自磁盘的数据是一个连续的 1 和 0 流,没有起始位或停止位。那么如何知道一个字节在哪里结束,下一个字节在哪里开始?Woz 的解决方案是要求写入磁盘的每个字节的最高有效位(MSB)为 1。在读取磁盘时,状态机从磁盘一次取一个位,将移位寄存器左移一位,并在右侧附加新位。它一直持续到最左边的位位置包含一个 1,此时状态机会说:“啊哈!这是一个完整的字节!”然后 CPU 存储该字节,过程重新开始。当 MSB 变为 1 后,状态机会清除移位寄存器,以便为下一个字节移入八位做好准备。
仅靠这个解决方案还不够。如果状态机从实际上是字节中间的位置开始读取位,它可能会错误地将字节中间的 1 位解释为 MSB 位置的 1 位。但这种方案确保如果状态机恰好一次正确获取了字节帧同步(无论是靠运气还是其他方法),那么从此之后它将保持正确。因此,挑战在于在开始读取磁盘数据之前找到一种保证帧同步正确的方法。
传统的解决方案是在每个扇区之前向磁盘写入一种特殊的 50 位模式,即所谓的同步字节。这些实际上根本不是字节,而是一个 10 位模式 1111111100 重复五次。这种模式有一个有趣的特性:无论字节帧同步最初在何处,只要遵循前面描述的状态机规则,最多重复五次该模式后,就会进入正确的同步。这个解决方案完全由软件驱动,仅仅是一种约定。硬件本身没有任何机制来保证正确的字节帧同步。还有其他确保帧同步的方法,Apple II 复制保护方案中出现的许多离奇丰富性就源于许多游戏中自定义 I/O 例程所采用的不同帧同步方法。
**挑战 #2:字节编码。** 如果写入磁盘的每个字节的 MSB 必须为 1,那么如何写入一个零字节,或者任何其他值小于 128 的字节?还有其他限制:写入磁盘的每个字节不能有超过两个连续的零位。如果有三个连续的零位,磁盘硬件无法可靠地读回数据。鉴于这两个要求,只有 66 个可能的 8 位值被允许写入磁盘。那么任意的 8 位值如何存储呢?
答案是将逻辑上的 8 位字节拆分,并将其位作为子组存储到多个磁盘字节中。这样做的标准方法是称为“6-and-2”的 GCR 编码方案。由于磁盘字节有 66 个可能值,并且有两个保留值,因此剩下 64 个可能的磁盘字节用于编码数据。64 是 2 的 6 次方,所以每个磁盘字节可以编码六位逻辑数据。一系列三个磁盘字节可以编码三个逻辑字节的前六位,最后一个第四磁盘字节可以编码这三个逻辑字节的后两位,连接在一起。这意味着存储在磁盘上的字节数是逻辑字节数的 4/3 倍,忽略标头、校验和和填充。
你可能会想,Disk II 控制器自举代码是如何完成扇区 0、磁道 0 的 GCR 解码的。乍一看,这似乎需要在 ROM 中存储一个 64 条目的反向查找表,而这已经占用了非常有限的 ROM 空间的四分之一。实际上,自举代码使用了一个更巧妙的方法,在 RAM 中动态构建了一个 256 条目的正向查找表 (https://6502disassembly.com/a2-rom/C600ROM.html),仅用了 30 字节的 6502 代码!
Apple II 软盘字节编码随着时间的推移而演变,导致扇区数和总磁盘容量的变化。第一个版本的 Disk II 控制器卡不允许向磁盘写入任何连续的零。这进一步限制了可能的磁盘字节数,并迫使使用效率较低的“5-and-3”编码方案。每磁道只能容纳 13 个扇区,导致总磁盘容量为 114 KB。Apple DOS 3.1 和 3.2 使用了 5-and-3 方案。最终,Woz 或他的一位团队成员意识到,通过对状态机进行一个小小的更改,就可以可靠地读取两个连续的零。只需要更改状态机 ROM 的内容,本质上就是修复了一个小错误,以使位时序测量更可靠。Disk II 控制器不需要任何硬件更改。从 DOS 3.3 开始引入了更高效的 6-and-2 方案,带来了我们现在熟悉的每磁道 16 扇区和 140K 磁盘。
与字节帧同步一样,整个编码方案纯粹是一种软件约定。硬件本身没有任何东西实现 6-and-2 或 5-and-3 或任何其他编码方法。扇区 0 磁道 0 必须使用 6-and-2 编码,因为这是 ROM 自举代码所期望的,但之后任何方式都可以。软件可以自由使用任何其他编码方案,许多受复制保护的程序使用新颖的编码方案来混淆其工作原理。
**挑战 #3:扇区化。** 一旦你将比特流正确帧同步为磁盘字节,并将磁盘字节正确解码为逻辑字节,你如何理解这些数据?这是一个环形缓冲区,那么如何知道数据的开始和结束?1970 年代的软盘通常使用在磁盘圆周上以规则间隔打的一个或多个小孔。在磁盘的防尘套上切一个小开口,以便在索引孔经过下方时露出它们。磁盘驱动器内部的硬件感应到当磁盘旋转时这些孔经过,这些信息用于确定新磁道或新扇区的开始位置。
很容易看出为什么这可能不受欢迎。感应孔的硬件增加了额外的复杂性和成本。而且,对于每个扇区都有一个孔的硬扇区软盘,扇区数量成为硬件设计的一部分,无法更改。苹果从 13 扇区格式转向 16 扇区格式,在硬扇区磁盘上是不可能的。
Disk II 设计采用软件驱动的方法进行扇区化。磁盘上的任何索引孔都被忽略。当它想在当前磁道上找到特定扇区时,计算机开始读取字节,忽略它看到的一切,直到找到三字节序列 D5 AA 96。这个签名标记了磁盘上新扇区的开始,它可能是整个 Apple II 秘传王国中最著名的字节序列。我办公室的墙上挂着一张 5.25 英寸软盘,上面有 Woz 亲笔签名的 D5 AA 96 问候语:
在这个签名之后是一个简短的扇区标头,其中包含扇区号等信息。如果这是计算机正在寻找的扇区号,那么它会读取后面的字节。如果不是正确的扇区,它会继续寻找另一个 D5 AA 96 来指示下一个扇区的开始,然后再次尝试。
这整个操作——你猜对了——纯粹是一种软件约定。D5 AA 96 签名、扇区标头、扇区长度以及其它一切都仅仅是约定。Disk II 控制器卡的硬件没有任何东西要求软件必须这样做,而有些软件采用了不同的方法。一个众所周知的例子是游戏《波斯王子》,它使用了一种称为 RWTS18 (https://fabiensanglard.net/prince_of_persia/pop_boot.php) 的自定义方案,该方案针对读取而非写入进行了优化,每磁道使用六个 768 字节的扇区,而不是标准的十六个 256 字节的扇区。
**挑战 #4:查找磁道。** 到目前为止,我们只讨论了磁盘上一个同心圆环中的数据。这些圆环通常被称为磁道,但正如我们将看到的,构成一个磁道的精确定义有时可能会很模糊。那么如何在磁道之间切换,或者找到特定磁道?到底有多少磁道?Disk II 及其控制器硬件没有回答这些问题。相反,这一切(跟我一起说)都是由软件驱动的。
在磁盘介质上,并没有“磁道”这种东西——它只是一个没有特征的圆形磁性介质区域。当读/写头保持在一个固定的径向位置,磁盘在下方旋转并写入位时,就创建了磁道。然后磁头向内或向外移动到新的径向位置,并写入新的磁道。
磁头移动由步进电机控制,直接受软件控制。步进电机由四个电磁铁组成,软件可以在任何时刻打开或关闭其中任何一个。一系列永磁体连接在一个齿轮上,该齿轮移动读/写头,通过按正确顺序激活电磁铁,它们可以吸引或排斥永磁体并移动磁头。如果步进电磁铁 0 已接通,然后电磁铁 1 接通而电磁铁 0 断开,磁头将移动一个小的径向距离。然后,如果电磁铁 2 接通而电磁铁 1 断开,磁头将沿相同方向进一步移动。
你能将磁道间距安排到多近?事实证明,通常需要两次这样的磁头移动,才能将磁头移动足够的距离,使一个磁道不会干扰其相邻磁道。如果你试图写入磁道
相似文章
让Apple II成为严肃商用机的卡片
深入探究Videx VideoTerm——这款80列卡片将Apple II转变为严肃商用机,以及通过A2FPGA项目实现的现代FPGA仿真,重点关注硬件架构和MC6845 CRT控制器。
给老师的Apple(II)
这篇文章讲述了Apple II在1980年成功后,苹果联合创始人史蒂夫·沃兹尼亚克和史蒂夫·乔布斯各自不同的发展道路,着重描述了沃兹尼亚克从公司隐退,以及乔布斯雄心勃勃但存在缺陷的Apple III研发尝试。
将Swift引入Apple II
一位开发者创建了SwiftII,这是一个为Apple II打造的Swift风格迷你开发环境,包含REPL、文件浏览器和文本编辑器,为复古硬件带来了现代编程体验。
苹果并未革新电源供应,真正革新的是新晶体管(2012)
这篇文章驳斥了史蒂夫·乔布斯关于Apple II的开关电源具有革命性的说法,将真正的创新追溯到20世纪60年代末和70年代的晶体管进步。
BeBox:BeOS 硬件、照片以及与苹果的未竟交易
一篇关于 BeBox 硬件和 BeOS 的怀旧回顾,详细记述了作者在 20 世纪 90 年代末使用该设备的经历,以及 Be Inc. 与苹果交易失败的历史背景。