将BBC微型计算机(1981年)转换为价值40,000美元的安全光盘刻录机



介绍



最著名的软盘安全性案例之一来自Dungeon Master。这款游戏于1987年12月发行,将复杂的物理光盘格式(模糊位)与内置于游戏过程中的秘密安全检查结合在一起。



我建议您阅读这篇文章该文章对软盘进行了很好的概述,然后详细介绍了Atari ST的Dungeon Master模糊位保护。还有一篇很棒的文章,详细介绍了有关Dungeon Master防御的故事。它包含地牢大师之一的名言:



« , , 40 . , ».


高价格的原因很可能是可靠创建模糊位所需的定时精度。早在世界上大多数国家以微秒为单位测量性能的时代,所需的精度以纳秒为单位进行测量。



BBC Micro在2 MHz处有一个6502处理器,并花费两个时钟周期(或1微秒)来执行其最简单的指令。是否有希望在这样的限制下写模糊位?让我们看看我们能走多远。这项工作将被称为“油水獭项目”。



为了让您有个时代精神,这里是一张3.5英寸软盘复制器的图片。它与复印机非常相似,只不过您是在磁盘中插入了磁盘而不是纸张,这是令人惊奇的!看起来Advanced World Products甚至可以卖给您这样的机器





BBC Micro自定义端口



BBC Micro以出色的可扩展性(包括使用所谓的“用户端口”)而闻名。该端口由工作在1 MHz6522多功能接口适配器控制。该端口本身具有8个数据引脚和2个控制引脚。这些接触提供了非常高的控制度。数据引脚可以单独配置为输入和输出,逻辑引脚电平可以设置为高或低。



为什么用户端口对我们很重要?我们将尝试直接通过它来控制磁盘驱动器。通过从方程式中删除软盘控制器,我们也许可以摆脱它,并获得对磁盘驱动器和正在传输的数据流的更直接控制。





用户端口到磁盘驱动器上



图显示了我将用户端口连接到磁盘驱动器的电缆。连接器是标准的,连接它们的电线只是跳线。我真诚地努力创造可以在“那些日子”制造的产品,因此我不使用任何其他电子产品。



电缆布置如下:





该图的主要优点是磁盘驱动器接口可能比人们想象的要简单。我们可以控制磁盘驱动器并仅通过8个引脚查询其重要状态。一切都非常简单。假设我们需要旋转驱动器,则足以给PB0和PB1一个低信号。如果要等待光盘旋转到轨道的开头,则需要查询PB6上的逻辑电平,直到我们看到信号电平从高变低为止。对于逐步运动,只需将逻辑电平设置为与“跳出”相反的“步入”,然后在触点“步阶”上执行低电平信号的脉动。



到目前为止,我们已经对该驱动器进行了基本控制,但是我们还没有记录任何内容。



电气问题



必须紧急解决电气问题,因为我遇到了这些问题。连接随机的组件对可以使它们工作,但是有时需要进行调整。以下是最初在驱动器的W / DATA引脚上观察到的电压范围:





我们正在尝试向FM频率为250 kHz的驱动器写入脉冲,



逻辑1的电压约为3.4 V,逻辑0的电压约为1.5 V,这是一个严重的问题!可接受的TTL电压电平已明确定义:



“如果TTL输入信号的电压相对于接地引脚为0 V至0.8 V,则为'低',而当其介于2 V与VCC(5 V)之间时,则为'高'。如果将0.8 V至2.0 V范围内的电压信号施加到TTL元素的输入,则该元素不会给出特定的答案,因此该信号被认为是“不确定的”。


1.5 V的逻辑0电压被认为是“未定义”的,不会引起任何作用。确实,我的驱动器没有用该信号记录任何东西。



通过从驱动器上卸下软盘驱动器电缆EOL解决了该问题这是我的驱动器的照片,其中EOL组件以红色概述:





这样可以很好地解决电压电平问题,然后一切正常。看起来除磁盘端口外,许多BBC Micro的端口都没有足够的功率来驱动EOL电缆。但是,等等-可能由于某些原因需要安装该电阻?是。删除它有两个技巧:



  • 注意电缆的长度。如果没有EOL电阻器,则较长的电缆容易出现信号失真。
  • 注意未连接电线上的电压水平。我在S / SEL执行器引脚(侧面选择)上观察到1.32V的电压。这是不正常的,因为此值也在TTL不确定范围内。驱动器将数据写入哪里?也许在顶部,也许在底部。也许根本没有!通过连接每条重要电缆并对其施加高或低信号,解决了该问题。


需要增加带宽



到目前为止,我们已经绕过的问题是:如何将信号发送到W / DATA引脚?这是“硬”联系。它具有高带宽和精确的时序要求。让我们停止幻想纳秒级的模糊位,然后尝试将简单的FM脉冲写入驱动器。



BBC Micro的大多数光盘都是以250 kHz编码的FM(又称DFM,又称单密度)。录制FM轨道实际上非常简单。有必要检查驱动器是否旋转以及记录盖是否打开。此后,每4微秒,要么我们执行W / DATA纹波到低,然后又回到高信号(位1),要么我们不执行(位0)。大多数情况下,每隔一位应为1(同步位以保持时序和同步)。



通过处理器控制W / DATA是一项绝望的任务。4微秒是8个处理器时钟周期;这绝对不足以加载一个字节,将其移位,将0写入然后将1写入用户端口的逻辑电平。一个简单的循环可能需要12毫秒以上的时间,这实在太多了。因此,要足够快地写入W / DATA,我们必须使用6522 VIA芯片的功能。



移位寄存器6522 VIA



我们任务最明显的候选人是移位寄存器。移位寄存器是一个8位寄存器。在相应模式下,加载移位寄存器将迫使芯片在用户端口引脚之一上顺序传输8位。太好了-这些位与主处理器并行处理,因此处理器可以安全地花费时间创建一组新的位以开始移位。



不幸的是,我无法使该电路正常工作。可能有可能很快运行的唯一移位模式是“系统时钟移位”。在西方设计中心6522规格有一个很好的概述:





VIA系统时钟为1 MHz,因此偏移时钟为500 kHz,输出位分辨率为250 kHz。这就足够了。但是,我还没有弄清楚如何使轮班时钟连续且平稳地工作。即使尝试了准确的时序来重新加载移位寄存器,移位时钟的引脚间隔始终看起来像这样:





事实证明,在足够快的单移位模式下进行我们的实验时,重新加载移位寄存器会导致在继续进行移位之前出现延迟。它不适合我们。



6522 VIA脉冲输出模式



6522的一个鲜为人知的功能是其“脉冲输出模式”。在所有6522变体的规范中均未对此进行描述,但是在MOS Technology规范中仅 对此进行简要介绍





最后,我们找到了准确描述其行为的规范。这种模式对我们来说非常有趣,因为VIA中的一次写操作承诺会导致两个单独的动作:将低逻辑信号施加到输出引脚,并且在1个时钟(1微秒)后,它会不费力地返回到高信号。这使我们可以用它来驱动250 kHz输出信号。处理器资源非常有限-循环不会以任何方式解决问题,但是线性代码块6502将能够应对,例如:



        \ &70 points to &FE60, aka. user 6522 VIA ORB register.
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        LDA (&70),Y        \ 8 cycles, do not pulse output
        STA (&70),Y        \ 8 cycles, pulse output
        ...


它将起作用。处理器为此具有足够的能力。8个时钟周期为4微秒,这是磁盘脉冲之间的最短时间。



不幸的是,这样的操作非常积极使用内存。每个已编码的FM位需要2个字节的6502行代码,每个有效数据位是两个FM位,因为每个其他位都是同步的。磁道的长度为3125字节,因此需要3125 * 8 * 2 * 2 == 100 kB的线路代码。 BBC Micro具有32KB的RAM,所以我们在这里很不走运。可以写入单个(小)扇区,包括功能强大的新磁盘保护机制。但是我们将无法写入大(1024字节)的扇区或完整磁道。这两项操作都需要正确写入大量光盘。而且,定时分辨率为1微秒,不足以记录更多复杂的保护和光盘表面。



鉴于这样的限制,我们很高兴能够设法使至少一些事情起作用,但是这种解决方案并不完全适合我们。



来自无前景的输出端口的帮助



幸运的是,我和Bitshifters Collective等聪明人交谈。 (去看看他们最新的演示《邪恶的影响!》)。在Slack上的一次对话中,汤姆·塞登(Tom Seddon)(b2仿真器的作者)建议...使用RGB端口输出(?)



视频到磁盘适配器电缆...您每天都不会在亚马逊上看到它。



起初,我笑了这个主意,但是我想得越多,对我来说就越有可能。 BBC Micro使用6845视频芯片进行计时。像6522,这是一个喜怒无常的处理器,但至少到Bitshifters演示,它利用6845毫不留情其特点有很好破译的感谢。我也反向工程给力的jsbeeb模拟器正确地模拟了Hitachi6845。让我们看一下该视频中上油的水獭的工作,然后告诉我们我们看到了什么:





得益于6845芯片的非常规配置,一切正常。6845以1 MHz运行,并且帧定时设置为以32微秒/每“帧” 32字节的速度提供一条光栅线。在每帧输出上,将覆盖6845的视频存储寄存器,以从可能不同的位置检索下一个32个字节。即,每32微秒从输出模式表中选择一个不同的输出模式。我们将RGB引脚配置为每微秒传输8个像素,每个输出模式为256个像素。这为我们提供了大量不同的可能输出模式。但是,由于我们正在记录32微秒的FM磁盘编码块,因此仅少数模式适合我们。在32微秒内,我们可以适应8个FM脉冲/位。 4位将被同步,通常都是1。4位将是数据位,并且它们只有16种组合。



例如,如果我们写入数据0x5的半字节,则32微秒的输出应如下所示:





视频数据的格式为00FFFFFFFFFFFFFF00FFFFFF00FFFFFF00FFFFFFFFFFFFFF00FFFFFF00FFFFFF。第一,第二,第四和第五个00是同步位。同步位之间是数据位模式0101或0x5。



CPU和内存限制得到很好的平衡。最终,该电路与我们尝试使用移位寄存器VIA的电路类似(如果可行):一些小型协处理器(视频芯片)处理FM位集的传输,并且中央处理器可以自由加载并提供下一个模式。内存要求非常合理。借助特殊的线性寻址模式,所需输出片段表(32毫秒)非常适合1024字节。整个曲目的搜索索引列表大约为12KB,因此所有内容都完全适合BBC Micro的32KB RAM。



BBC Micro / 6845的功能



最后一个字符/列6845



当然,要使其正常工作,您必须遇到一些“有趣”的怪癖。第一个是6845的功能,它使它为每个位图行的最后一个字符输出黑色。这是演示开发人员的诅咒,现在看来,光盘研究人员也是如此。这是最近一次演讲中的一张幻灯片,其中我演示了这个问题:





左侧是演示的效果,由“最后一个黑色字符/列”问题引起的垂直黑条破坏了。多条6845栅格线适合一次栅格遍历,不幸的是,黑色条纹无意间出现。使用光盘控制时,效果会更糟:将黑条替换为不需要的脉冲,然后将其写入光盘。



解决方案的图像如右图所示:传输到磁盘的波被简单地反转了。现在正常的做法是,最后一列始终为黑色(用橙色轮廓显示),因为在那里始终需要零。严格来说,这违反了某些磁盘驱动器对低W / DATA信号产生脉冲的时序要求。这是三菱M4852 / M4853那个时代的驱动器时序图





根据该方案,逻辑0应保持最高2100 ns。对于反相波形,期望3000 ns或更长。但是,我拥有的驱动器仅与下降的数据脉冲有关,而与它们的持续时间无关。这不足为奇。我可以采取一些技巧来避免6845的怪癖,并确保持续时间与规格一致,但是事实证明这是不必要的,因此我没有这样做。



DRAM



损坏DRAM衰减是一场噩梦。当我们无法及时更新DRAM时,就会发生这种情况。引用维基百科有关更新内存的文章



“此过程由电子存储电路在后台自动执行,并且用户看不见。”


这对于现代系统是正确的,但对于BBC Micro则不是。在BBC Micro上,DRAM升级是视频子系统的副作用。它利用标准屏幕模式在短时间内迭代绕过所有DRAM行的特性。您可能已经猜到了前进的方向-我们用于显示32微秒帧的特殊视频模式不是标准的屏幕模式。它不能保证将绕过所有DRAM线,因此会发生DRAM损坏! DRAM损坏不是开玩笑。由于计划外的DRAM损坏,我丢失了各种程序和光盘内容。让我笑一下,向您展示一个BASIC程序,该程序会在一瞬间造成DRAM自身损坏:





DRAM损坏的可悲之处在于,如果让您失望,您很容易丢失数据。



另一方面,如果您预计DRAM损坏,通常可以轻松解决它。对于上油的水獭,在6845处于异常状态的各种关键循环中。为了在每个周期中保存DRAM更新,可以手动增加从内存中接收数据的速度。



打开的机会



现在我们有了一个绕过软盘控制器的工作磁盘写系统,我们该怎么办?在上面的视频中,我们已经展示了其写入随机FM编码光盘的能力。



但是在这项研究中,我们非常幸运。由于VIA移位寄存器的缺点,我们不得不寻找一种具有视频输出引脚的解决方案,并且可以使用W / DATA引脚上更精细的时序分辨率。我们正在使用使用8 MHz像素时钟的BBC Micro计算机的MODE4。这意味着您可以通过以125 ns的分辨率切换写入脉冲来每125 ns输出黑色或白色像素...如果我们想在较大的表上花费更多的额外内存(我们拥有的内存),可以使用MODE0,它使用16 MHz像素时钟,提供62.5 ns的分辨率。我确保125ns对于测试的所有磁盘保护都足够好,但是很高兴我们还有一定的摆动空间。



长时间保护



我最喜欢的光盘保护是长时间保护。她在Amiga期间受欢迎...我认为BBC Micro从未使用过它。我喜欢长距离保护,因为它非常基础:软盘控制器对不同的写入速度具有很大的容忍度(因为磁盘驱动器以不同的速度旋转),但它只能以一种正确的速度进行写入。



对于长轨道,更复杂的保护是在一个轨道上写入两个扇区,其中一个扇区的写入速度更高。复制保护检查是读取这两个扇区所花费的时间。以较高速度写入的扇区应读取得更快。



上油的水獭可以录制这样的曲目吗?是的,非常简单。给定125 ns的输出分辨率,很容易创建多个类似于正常的输出表条目,但是每1微秒可减少125纳秒。这是创建远程保护并检查磁盘读取的视频:







用模糊位进行保护



也许是时候该回到我们开始的地方了:用模糊位进行保护。Oiled Otter可以在1981硬件上创建模糊位吗?我们试试吧。这是由上油的水獭系统的FUZZ命令写入一对扇区后读取结果的图像。





FUZZ指令写入0x8半字节,数据位以125 ns的增量逐渐被搁置。这类似于关于如何记录Dungeon Master的模糊位的描述。从屏幕截图中可以看到,很快就会以一种错误且不确定的方式读取0x88数据字节。但是方差并非像弱位一样是100%随机的-方差是0x8位是否写入得足够晚而有机会被遗漏。如果省略它,我们仍然可以看到这种疯狂的模式和逻辑。



上面给出的结果是模糊位原理在FM编码数据上的应用。在FM编码中,每个数据位与一个同步位交织。这导致一个事实,有时时钟位会潜入数据流中(在第一次运行中请参见字节0xFF-最有可能是时钟位)。地牢大师的防御将模糊位与MFM结合使用。这会导致更简单的情况,即模糊位在两个有效数据位编码之间移动,并且不触摸同步位!当然,Oiled Otter可以编写MFM,GCR和您可以想到的任何其他编码。所有这些只是一个基本原语的不同协议-能够随时以高分辨率将脉冲传输到驱动器的能力。



为了正确评估它,我们将提供示波器磁盘上模糊位的视图。最大值相当不均匀,并且当两个脉冲彼此非常接近(大约1微秒,通过任何标准编码太接近)时,驱动器识别出的磁化反转力甚至开始减弱。





完成任务



我们能够记录分辨率为125 ns的磁盘脉冲。这足以创建复杂的光盘保护,包括长磁道,弱位和模糊位。对于1981年具有1微秒最快命令执行速度的硬件来说,还不错!



也可以看看:






All Articles