最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

不可思議的 Disk II 控制卡

2023-03-06 01:14 作者:某科學(xué)的小姚同志  | 我要投稿

2021年11月12日 | 分類:“位桶”系列,軟驅(qū)模擬,“黃石” 磁盤控制器| 作者:史蒂夫

原文:https://www.bigmessowires.com/2021/11/12/the-amazing-disk-ii-controller-card/

Apple II 的磁盤世界中,主要有兩種磁盤控制卡:原版 Disk II 控制器(及其克隆產(chǎn)品),以及其它種類。這兩類控制卡在市場上各有立足之地。上述的“其他種類”包括了蘋果的3.5英寸磁盤控制卡、Liron 卡、SCSI卡、IDE卡等等。這第二類控制卡為軟件讀寫塊、獲取驅(qū)動器狀態(tài)以及格式化磁盤等操作提供了一套標(biāo)準(zhǔn)的API(應(yīng)用程序接口),以此向軟件隱藏磁盤工作的細(xì)節(jié)。它們都非常聰明,采用了內(nèi)建機制來幫助處理那些底層細(xì)節(jié)。 Disk II 控制卡則大為不同,它沒有那樣的“智能”,而是強制軟件以一種虛擬的方式來處理基本的控制。盡管如此,它卻是當(dāng)年技術(shù)領(lǐng)域的一塊亮眼的寶石。

Apple II 計算機的最初型號并沒有集成對軟盤的支持,而 Disk II 控制卡則以低廉的成本、精巧的設(shè)計,為計算機擴(kuò)展了這項原本沒有的功能。這在很大程度上導(dǎo)致了 Apple II 計算機的流行。相比于同時代的其他控制卡產(chǎn)品,它更簡單、更便宜,也更加靈活,全方位碾壓了一眾競品。這是沃茲尼亞克創(chuàng)造精神的終極范例。

軟盤基礎(chǔ)知識

軟盤實際上就是一個表面覆蓋有磁性材料的塑料圓片。將軟盤插入到驅(qū)動器后,盤片就會以每分鐘300轉(zhuǎn)的速度旋轉(zhuǎn)起來。一個步進(jìn)電機帶動讀寫頭直線運動,從盤片中心移動到盤片的外圈。這種運動方式下,讀寫頭在盤片表面的軌跡是許許多多的同心圓。一串串由二進(jìn)制位1和0來表示的數(shù)據(jù)對應(yīng)不同的磁化狀態(tài),被存儲在這些圓上。

要如何從以上基本原理出發(fā),掌控字節(jié)、磁道和扇區(qū)這些更高層次的概念呢?邏輯數(shù)據(jù)中的眾多字節(jié)如何被編碼成特定的位模式,從而存儲在磁盤上?當(dāng)讀取磁盤時,這些二進(jìn)制位如何重組為字節(jié)?如何找到0號磁道,又如何尋找扇區(qū)之間的邊界?在20世紀(jì)70年代,以上問題的常見回答是使用許許多多的額外的硬件。這導(dǎo)致了磁盤控制器和驅(qū)動器本身結(jié)構(gòu)復(fù)雜且價格不菲。對于廉價的家庭計算機系統(tǒng),這樣做顯然會使得系統(tǒng)超出絕大多數(shù)家庭的經(jīng)濟(jì)承受能力。

在1977年末,蘋果公司著眼于尋找一種磁帶數(shù)據(jù)存儲的替代品。他們開始為 Apple II 計算機尋找和設(shè)計合適的軟磁盤驅(qū)動器方案。當(dāng)時蘋果公司還是一家名不見經(jīng)傳的小公司,Apple II 計算機也僅僅面世6個月。對于軟盤,沃茲尚且知之甚少。盡管如此,他接下了這個挑戰(zhàn)。

沃茲的方案是移除所有對于控制磁盤不必要的硬件,使用一種軟件驅(qū)動的,類似“位拆裂”(bit-banging)的方式替代(譯者注:嵌入式MCU開發(fā)者常用的在普通GPIO上使用軟件模擬控制器就是一種“位拆裂”技術(shù))。 蘋果找到了5.25英寸軟盤驅(qū)動器的發(fā)明者舒加特(Shugart)公司,請他們定制了自家SA400驅(qū)動器的閹割版本。他們移除了其中大部分控制電路,基本上只剩下簡單的機械機構(gòu)、一個轉(zhuǎn)動盤片的主軸電機、以及移動讀寫頭的尋道步進(jìn)電機。傳奇拉開大幕。Disk II 系統(tǒng)的硬件設(shè)計被確定下來。沃茲和蘭迪·威金頓(Randy Wigginton)在1977年圣誕節(jié)假期期間用了幾周的時間搭建了整個系統(tǒng),并完成了第一版磁盤操作系統(tǒng)(DOS)的編寫。能正常工作的的磁盤驅(qū)動器被拿到了1978年1月的CES(國際消費類電子產(chǎn)品展覽會)上展示。期間,蘋果的工程師克里夫·休斯頓(Cliff Huston)和溫戴爾·桑德(Wendell Sander)提供了一些幫助。40多年后的今天,我仍然驚嘆于這個小團(tuán)隊居然在如此短的時間里就讓磁盤系統(tǒng)運行了起來。

幾年前我就 Disk II 系統(tǒng)的研發(fā)采訪了沃茲本人,他說道:

我不清楚當(dāng)時自己是如何想到這個精妙絕倫的磁盤控制器設(shè)計的。我擅長創(chuàng)造電子方面的東西,無論是模擬的還是數(shù)字的。我先前沒有關(guān)于磁盤軟硬件的任何經(jīng)驗,甚至在課堂上都沒有了解。當(dāng)時我的一切想法不得不從零開始。我需要使用磁頭探測磁盤上的數(shù)據(jù),然后使用探測到的0和1根據(jù)時序來做決策。

我之前在伯克利上過一門本科生課程,這門課講了狀態(tài)機相關(guān)知識,以及使用兩片簡單且低成本的芯片做一個狀態(tài)機的思路,最終實現(xiàn)一個手工制作的極簡的微處理器。順帶一提,雖然是本科生,我只上過一切大學(xué)的一切和計算機相關(guān)的本科生課程(并不包括電子等專業(yè))。我需要承認(rèn)的是,在當(dāng)時我剛剛了解到讀寫數(shù)據(jù)的需求,卻因為對磁盤控制器行為的不了解,遺漏了很多設(shè)計上必須考慮的因素。我的設(shè)計非常簡陋,用了非常少的部件,這很明顯是沒有經(jīng)驗。不過到最后,我的設(shè)計確實也作出了許多積極的貢獻(xiàn)。尤其重要的一點是,這款磁盤控制器用在計算機上,因此不得不牽扯到軟件,而軟件的工作方式又是靈活多變的,通過軟件修改很容易做到更大容量的存儲和更快的速度,這對于普通(完全基于硬件的)磁盤系統(tǒng)來說難以做到。除此之外,我將大約20片芯片從驅(qū)動器本體中拿掉,再使用我的控制卡設(shè)計避免使用它們。我的設(shè)計中這些芯片完全就是礙事的“中間人”。

多年來我最得意的工作,都是在資金不足的條件下學(xué)習(xí)使用最少的部件來實現(xiàn)功能促成的,并且應(yīng)當(dāng)歸功于“前無古人”的創(chuàng)新精神。

Disk II 控制器揭秘

Disk II 控制卡基本上就是一個新穎的移位寄存器。它知道如何以每4 us一個二進(jìn)制位的固定速率從/向磁盤上讀/寫位。 控制卡還包含一片256字節(jié)大小的只讀存儲器(ROM),在其中存放著計算機冷啟動后會首先執(zhí)行到的引導(dǎo)代碼。這是一段極其短小的6502程序,卻能完成定位0磁道、0扇區(qū)并將此處的數(shù)據(jù)讀進(jìn)內(nèi)存并執(zhí)行的任務(wù)。此后,更復(fù)雜的磁盤控制的工作全權(quán)交給加載進(jìn)RAM的程序負(fù)責(zé)。

控制卡包含了8片簡單的芯片。一片256字節(jié)的ROM用于存儲引導(dǎo)代碼。另一片256字節(jié)的ROM被用作狀態(tài)機的一部分(查表得到狀態(tài)轉(zhuǎn)移,稍后會詳細(xì)介紹)。另外有一片六D觸發(fā)器 74LS174 為狀態(tài)機提供輸入(時序邏輯中當(dāng)前狀態(tài)的鎖存)。一片八位的移位寄存器(串-并互轉(zhuǎn)) 74LS323 是整個設(shè)計的核心。 一片八位可尋址鎖存器(八位獨立輸出,但只有一位輸入,使用三位地址線來尋址八個一位的觸發(fā)器) 74LS259 用于存儲電機所需的狀態(tài)和1號-2號驅(qū)動器選擇信號。除此之外還有一片雙定時器 556(提供4 us的位時間基準(zhǔn)),一片六反相器 74LS05 和 一片四雙輸入與非門 74LS132 提供了其他必須的膠合邏輯(即組合邏輯,起到粘合邏輯電路各部分的作用)。整張卡只有這些芯片。下面是原理圖:

讓我們來看一看磁盤I/O系統(tǒng)設(shè)計中的若干挑戰(zhàn),并了解 Disk II 控制器的設(shè)計是如何逐一擊破這些難題的吧。

挑戰(zhàn)一:字節(jié)的定界/成幀問題

來自磁盤的數(shù)據(jù)是由一連串二進(jìn)制0和1組成的流,在其中是不包括起始位和停止位的。 我們該如何找出某一字節(jié)的結(jié)束和下一字節(jié)的開始的位置呢?沃茲的解決方案強制規(guī)定寫入磁盤的每一個字節(jié)的最高有效位(MSB)必須為二進(jìn)制的1。在讀取磁盤的過程中,狀態(tài)機一次吞掉讀來的一個比特,之后將移位寄存器中的內(nèi)容向右移動一位,再把新讀取的那個比特拼接在最右邊。如此往復(fù),直到移位寄存器最左邊的那一位變成二進(jìn)制的1才停下來,這指示狀態(tài)機一個完整的字節(jié)被讀取到了。CPU會取走并存儲讀到的這一字節(jié)數(shù)據(jù),這樣狀態(tài)機就可以重復(fù)以上過程來繼續(xù)控制磁盤讀取。狀態(tài)機在移位寄存器的最高有效位變成1后會將移位寄存器清零,以準(zhǔn)備移入接下來的一個字節(jié)中的八個比特。

然而,這種方案并不是完備的。如果狀態(tài)機碰巧從某一個字節(jié)的中間開始閱讀,它就會將字節(jié)中段的一個二進(jìn)制數(shù)據(jù)位1誤當(dāng)做最高有效位強制規(guī)定的那個1。但是此方案可以保證的是,如果狀態(tài)機在某種機緣巧合或是其他機制下正確組裝了一個字節(jié),那么接下來的字節(jié)都將是正確的。現(xiàn)在,問題就轉(zhuǎn)變?yōu)樵O(shè)計一種能在磁盤讀操作開始前保證字節(jié)成幀無誤的機制。

針對于此,一種常見的做法是向磁盤中每個扇區(qū)數(shù)據(jù)的前面寫入一串被稱為“同步字節(jié)”的,由50個二進(jìn)制位組成的特殊序列。 “同步字節(jié)”有別于常規(guī)字節(jié),它是由10位序列“1111111100”重復(fù)五次構(gòu)成的。這個10位的序列有個有趣的特性,那就是按照以上所述的字節(jié)組裝機制,無論字節(jié)組裝的起始位置定在哪里,總能在這個10位序列重復(fù)出現(xiàn)至多五次后找到正確的字節(jié)起始位置。這個經(jīng)典到被作為慣例的方法完全是基于軟件實現(xiàn)的。硬件不包含確保字節(jié)成幀正確性的機制。當(dāng)然,字節(jié)正確成幀的方法遠(yuǎn)遠(yuǎn)不止有這一種,在一些游戲中,開發(fā)者通過自編輸入輸出子程序,實現(xiàn)了豐富而多樣的字節(jié)成幀方案,Apple II 那些五花八門的磁盤防拷貝機制應(yīng)運而生。

譯者注:這種特殊的“同步字節(jié)”設(shè)計的基本思想是什么呢?觀察發(fā)現(xiàn),這個10位序列是由一個全1的字節(jié)(十六進(jìn)制表示為FF)加上兩個0構(gòu)成的??梢运伎家幌碌谝环N情況,如果起始時讀取的位恰好是兩個0中的某一個,上面的狀態(tài)機設(shè)計會使得0從移位寄存器的最高有效位“溜走”,讀到的字節(jié)不含有0,是FF。并且,五個字節(jié)都讀到FF,第五個10位序列的最后兩個0同樣會“溜走”,有效數(shù)據(jù)第一個字節(jié)的最高有效位1會順勢進(jìn)入移位寄存器,這就完成了同步(字節(jié)對準(zhǔn))。而第二種情況,如果起始時讀到的是FF部分中某個1,兩個0必定出現(xiàn)在移位寄存器里的那個字節(jié)中。“同步字節(jié)”以10位為一個循環(huán)周期,而移位寄存器中的字節(jié)以8位為一個循環(huán)周期,二者每周期中的比特數(shù)并不相同,一快一慢產(chǎn)生“追趕”的效果,類比編程中常用技巧“快慢指針”,導(dǎo)致了連續(xù)讀若干個字節(jié),讀到的數(shù)據(jù)也不盡相同?!白汾s”效果其實相當(dāng)于一字節(jié)長度的滑動窗口在10位的同步序列單元上滑動,由最小公倍數(shù)的關(guān)系,狀態(tài)機在進(jìn)行最多5輪的讀字節(jié)操作后,滑動窗口必定“追上”或者說“套住”FF的部分,完成同步,轉(zhuǎn)化為第一種情況。

挑戰(zhàn)二:字節(jié)的編碼問題

如果強制了字節(jié)的最高有效位為1,那么原來的全0字節(jié)該如何寫入呢?那些小于128的數(shù)值是不是也不能表示了?此外,我們必須要保證寫入磁盤的每個字節(jié)中不能出現(xiàn)多于2個的連續(xù)的比特0。比如說,如果有連續(xù)的3個比特0,磁盤驅(qū)動器的硬件將無法可靠地讀回數(shù)據(jù)。鑒于以上兩條限制,一個字節(jié)的8位天然形成的256種可能的取值中,只有66種可行的取值被允許寫入磁盤。 我們該怎樣將一個任意的8位數(shù)存入磁盤呢?

答案是將邏輯上8位長的字節(jié)拆開,將拆開后的位分組放入多個物理字節(jié)里。一種標(biāo)準(zhǔn)做法是使用叫做“6-2編碼”的成組編碼模式(GCR)。在約束下,66種可寫入磁盤的數(shù)值中,選擇兩個值(AAD5)作為保留值,其余64個可以拿來編碼數(shù)據(jù)。64是2的6次方,這表明有6個邏輯比特可以被編入一個磁盤上存儲的物理字節(jié)。連續(xù)三個物理字節(jié)被拿來編碼連續(xù)三個邏輯字節(jié)各自的前六個比特,第四個物理字節(jié)用來編碼這三個邏輯字節(jié)最后兩位拼接在一起表示的六比特數(shù)據(jù)。在不考慮可能存在的頭結(jié)構(gòu)、校驗和以及填充的情況下,磁盤上存儲的物理字節(jié)數(shù)量是表示有效數(shù)據(jù)的邏輯字節(jié)數(shù)量的4/3倍。

您可能好奇 Disk II 磁盤控制器的引導(dǎo)代碼是怎樣實現(xiàn)0磁道、0扇區(qū)中成組編碼數(shù)據(jù)的解碼的。最直接的想法可能是在ROM中存儲一個有64個表項的反向查找表。不過,這會直接占據(jù)本就非常有限的ROM空間的四分之一。實際上,引導(dǎo)代碼使用了一個更加討巧的方法,那就是在運行的過程中在內(nèi)存中實時地構(gòu)建一個具有256個表項的正向查找表(點擊查看匯編代碼清單),構(gòu)建查找表的6502代碼只占用了30個字節(jié)的空間!

Apple II 軟盤的字節(jié)編碼方案迭代了多次,這導(dǎo)致磁盤扇區(qū)數(shù)和總?cè)萘侩S之發(fā)生變化。初版的 Disk II 磁盤控制器不允許任何形式的連續(xù)比特0被寫入磁盤中。這進(jìn)一步限制了磁盤所能容納的字節(jié)數(shù),迫使我們采用一種更為低效的“5-3編碼”的編碼模式。每個磁道只能容納13個扇區(qū),這樣整張磁盤的容量就是114 KB。Apple DOS 3.1 和 3.2 就采納了“5-3編碼”。 最終沃茲或是他的團(tuán)隊成員意識到對狀態(tài)機做一些微小改動,就可以可靠地讀出連續(xù)兩個比特0。需要做的只是改變狀態(tài)機ROM中的內(nèi)容,修復(fù)一個關(guān)鍵的小漏洞,使得對位時序的測量更加精準(zhǔn)可靠。這并不需要對 Disk II 控制卡做任何硬件上的修改。更加高效的“6-2編碼”從 Apple DOS 的 3.3 版本被引入,帶來了16扇區(qū)磁道和更大的140K整盤容量,這正是現(xiàn)在我們所熟悉的情況。

我們看到在字節(jié)編碼問題上,上述方案完全是由軟件實現(xiàn)的,并沒有必要設(shè)計任何硬件來實現(xiàn)“6-2編碼”“5-3編碼”或是其他的編碼方案。0磁道的0扇區(qū)必須采用“6-2編碼”來寫入,這是ROM中固化的引導(dǎo)代碼所需要的編碼模式。在引導(dǎo)后,我們就可以使用任何自定義的字節(jié)編碼方案了。軟件可以自由選擇編碼模式,很多帶有防拷貝功能的軟件也通過使用新穎的字節(jié)編碼來“混淆”被保護(hù)的部分。

挑戰(zhàn)三:扇區(qū)的劃分問題

我們將來自驅(qū)動器的比特流正確組裝形成物理字節(jié),再將物理字節(jié)正確解碼得到邏輯字節(jié),我們該如何理解這里得到的數(shù)據(jù)呢?沒錯,同一磁道得到的邏輯字節(jié)序列正如同一個環(huán)形緩沖區(qū)。對于首尾連接的字節(jié)流,我們該如何找到數(shù)據(jù)的起始?20世紀(jì)70年代的軟盤通常在盤面的圓周上等間隔打出一個或多個用來索引的小孔。軟盤防塵套被切開一個窗口,當(dāng)盤面的小孔從下方經(jīng)過時便會從窗口漏出。磁盤驅(qū)動器內(nèi)部的硬件能檢測在盤片旋轉(zhuǎn)時,小孔何時經(jīng)過窗口。小孔經(jīng)過窗口的信息被用來找出新的磁道或新的扇區(qū)的起始位置。

我們很容易理解為何這種方式?jīng)]有被采用。檢測孔的硬件引入了額外的復(fù)雜性并增加了成本。如果使用了每個扇區(qū)都打孔的“硬扇區(qū)”方案,扇區(qū)的數(shù)目就成為了硬件設(shè)計的一部分而不再可變。 蘋果將13扇區(qū)格式改為16扇區(qū)格式的行為在“硬扇區(qū)”設(shè)計下也不再可行。

Disk II 磁盤系統(tǒng)采用了一種軟件驅(qū)動的扇區(qū)分劃設(shè)計。盤面上的任何索引孔都將被無視。當(dāng)需要在當(dāng)前磁道找到特定扇區(qū)時,計算機便開始讀取字節(jié),丟棄收到的一切數(shù)據(jù),直到找到三字節(jié)序列D5 AA 96。這個三字節(jié)的“簽名”標(biāo)志著磁盤上一個新扇區(qū)的起始。這或許是一眾 Apple II 秘辛中最被人津津樂道的序列。在我的辦公室墻上掛著一片5.25英寸軟盤,上面就有沃茲親筆簽下的D5 AA 96

在這個三字節(jié)的“簽名”后有一個短小的扇區(qū)頭,其中含有最為重要的扇區(qū)號信息。如果扇區(qū)號與計算機正在尋找的扇區(qū)匹配,就會繼續(xù)讀取之后的字節(jié)。如果不是正在查詢的扇區(qū),則繼續(xù)尋找下一個指示扇區(qū)起始的“簽名”D5 AA 96,并再次做扇區(qū)號比對嘗試。

總而言之,和上文一樣,這也是個純軟件實現(xiàn)的方法。無論是D5 AA 96這個“簽名”,扇區(qū)頭結(jié)構(gòu),還是扇區(qū)的長度之類的東西,都僅僅是一種基于軟件的協(xié)定。并且 ,Disk II 控制器硬件并不會限制軟件使用某種特定的方法來處理這些難題,因此很多軟件也采取了非同尋常的方法。一個廣為人知的案例是游戲《波斯王子》(Prince of Persia),它使用了一種被叫做 RWTS18 的自定義方案,以損失寫性能的方式對讀操作進(jìn)行針對性優(yōu)化。同時,它每個磁道有6個768字節(jié)的扇區(qū),和標(biāo)準(zhǔn)的6個256字節(jié)扇區(qū)的做法也是不同的。

譯者注:為什么要使用D5 AA 96作為“簽名”呢?細(xì)心的讀者可以發(fā)現(xiàn),AAD5是上文所述的“6-2編碼”的保留值,不用來表示有效數(shù)據(jù)。

挑戰(zhàn)四:尋道問題

到目前為止,我們僅僅討論了存儲在磁盤某一個同心圓環(huán)上的數(shù)據(jù)。這些圓環(huán)被稱為磁道,不過一條磁道應(yīng)該包括哪些部分可能還尚不明晰。如此一來該如何在磁道間切換,或是定位某一個特定的磁道呢?盤片上總共有多少條磁道?Disk II 的硬件不會回答這些問題。這一切,全 ?部 ?都 ?是 軟件驅(qū)動的。

在磁盤這種介質(zhì)上,實際上并不存在看得見摸得著的磁道。磁盤本身就是一個普普通通的磁介質(zhì)圓片。當(dāng)讀寫頭保持在一個固定的徑向位置,盤片旋轉(zhuǎn)起來,比特被寫入的時候,磁道就形成了。磁頭內(nèi)外移動來到一個新的徑向位置,再寫入一個新的磁道。

讀寫頭的移動受到一個步進(jìn)電機的驅(qū)動,而這個步進(jìn)電機是由軟件直接控制的。步進(jìn)電機內(nèi)部由4個電磁鐵組成,在任何一個時刻軟件都可以將它們之中的任意一個或幾個加電或者掉電。一組永磁鐵依附在驅(qū)動讀寫頭運動的齒輪邊緣。通過以正確的順序激活電磁鐵,就可以吸引或排斥永磁鐵,使得磁頭移動起來。如果步進(jìn)電機的零號電磁鐵打開,接下來一號電磁鐵也打開,最后零號電磁鐵關(guān)閉,磁頭就能移動一個很小的徑向距離(稱為一步)。此后,如果二號電磁鐵打開,再關(guān)閉一號電磁鐵,磁頭將會繼續(xù)沿同一個方向運動。

磁道之間究竟可以排布地多近呢?實際上,需要使得磁頭向同一方向移動兩步,以確保磁頭移動了足夠遠(yuǎn)的距離,不至于造成新磁道與鄰近磁道的干擾。如果嘗試將磁頭僅移動一步就讀寫新數(shù)據(jù),磁介質(zhì)上鄰近磁道的磁化區(qū)域就會彼此混合,造成記錄內(nèi)容的混亂。因此,磁頭動作兩步通常被等同為一條磁道,動作一步相當(dāng)于移動了半條磁道。四分之一磁道同樣是可能的,只不過大部分軟件并不會使用到。如果零號電磁鐵加電,同時一號電磁鐵也加電,磁頭就會移動四分之一條磁道(半步)。此時如果關(guān)閉零號電磁鐵,磁頭會繼續(xù)向同方向移動四分之一個磁道。

定位0磁道的手段就很暴力了。磁盤控制器并不知道當(dāng)前磁頭位于哪一條磁道,因此軟件必須連續(xù)激活步進(jìn)電機驅(qū)動磁頭向0磁道的方向移動。最后,磁頭將到達(dá)0磁道的位置,并卡在那里無法繼續(xù)移動。然而,軟件會繼續(xù)激活步進(jìn)電機,驅(qū)動磁頭頂在機械限位塊上,產(chǎn)生 Apple II 軟驅(qū)啟動時那令人熟悉的刺耳聲音。在移動80個半步之后,可以保證磁頭一定位于0磁道處。在此之后,軟件就需要密切追蹤磁頭的每一步移動,記錄下磁頭當(dāng)前所處的位置,來幫助進(jìn)行相對的尋道動作。如果讀寫期間軟件發(fā)現(xiàn)了令其困惑的情況,比如在其認(rèn)為是第20條磁道的位置卻讀到了另一條磁道的數(shù)據(jù),軟件通常會進(jìn)行重校準(zhǔn)操作,即把磁頭移回0磁道,緊接著再步進(jìn)回到其所讀寫的磁道處。這時,軟驅(qū)會發(fā)出咔咔聲,一些資深 Apple II 用戶會將其視為磁盤損壞的征兆。

一般來說,一張磁盤上會存儲35條磁道,但這也僅僅是個慣例。實際情況隨著驅(qū)動器的不同而不同,并且是由讀寫頭的最大和最小的線性位置所決定的。有時也能見到多達(dá)40條磁道的非標(biāo)準(zhǔn)磁盤。

帶有防拷貝機制的 Apple II 游戲常常會使用一些關(guān)于磁道步進(jìn)的有趣技巧。一個簡單的技巧是將磁道定位在距離0磁道奇數(shù)個半步長的位置上。磁道間至少要相隔兩個半步長,但沒有規(guī)定磁道間距不可以是三個半步長。因此,可以見到某些游戲的磁盤將數(shù)據(jù)存儲在第0、1、2.5和第4條磁道上。這將擾亂那些只能在整數(shù)磁道上讀寫的磁盤拷貝軟件。

一種更加高級的技巧是在相鄰僅僅半步的磁道上寫入數(shù)據(jù),但每個磁道只使用半個圓周,這樣磁化區(qū)域間將不會重合并互相影響。比如,第2條磁道只有從十二點鐘到六點鐘方向的一半寫有數(shù)據(jù),第2.5條磁道則只在從六點鐘回到十二點鐘的另一半上寫有數(shù)據(jù)。以這種方法寫入的數(shù)據(jù)很容易讀出,但如果沒有特別編寫的子程序,則很難寫入,使得磁盤的拷貝變得困難很多。

對引導(dǎo)代碼的反匯編

對256字節(jié)的引導(dǎo)子程序的反匯編和分析過程非常精彩。在開機以后一無所有的境地,這段代碼需要直接控制“軟開關(guān)”來移動步進(jìn)電機和讀取移位寄存器。它需要以正確的順序激活步進(jìn)電磁鐵來使磁頭抵達(dá)0磁道,并開始讀取字節(jié)。它還需要識別出D5 AA 96的“簽名”,并檢查是否讀出合適的扇區(qū)。它必須使用運行時構(gòu)建的GCR解碼表來轉(zhuǎn)換物理字節(jié),執(zhí)行“6-2編碼”的解碼來將四個物理字節(jié)重建為三個邏輯字節(jié),將整個扇區(qū)讀入內(nèi)存緩沖區(qū),并執(zhí)行跳轉(zhuǎn)把控制權(quán)交給剛剛讀入的代碼。然而實現(xiàn)這一切僅僅用了256字節(jié)的引導(dǎo)代碼!

沃茲完成以上工作時還留有五個字節(jié)的節(jié)余,大概只用了100行的6502匯編代碼。然而由于ROM空間的限制,一些特性沒有被實現(xiàn)。Disk II 控制器的引導(dǎo)代碼沒有檢查0扇區(qū)數(shù)據(jù)的校驗和,在后期的磁盤控制器上這個問題被“修復(fù)”了,卻造成了一些游戲的不兼容問題。錯誤處理也沒有被實現(xiàn),啟動代碼將會一直嘗試裝載0扇區(qū)。這也解釋了為什么插有 Disk II 擴(kuò)展卡的 Apple II 電腦在沒有磁盤插入驅(qū)動器或是插入損壞的磁盤時,系統(tǒng)啟動過程會卡死,而不是像Apple IIc 或是 IIgs 電腦那樣顯示對用戶友好的錯誤信息。

Disk II 控制器的硬件設(shè)計

以上討論聚焦于 Disk II 控制器的行為,卻沒有探討更多準(zhǔn)確的實現(xiàn)細(xì)節(jié),也沒有解釋八片芯片的工作方式。對于想要透徹、深入地了解其實現(xiàn)的朋友,我建議閱讀吉姆·薩瑟(Jim Sather)編著的《理解Apple II》一書的第九章。其中闡述了有關(guān)磁介質(zhì)的磁通量分布等有關(guān)磁盤的更多信息。

狀態(tài)機的設(shè)計非常有趣,除了薩瑟的書以外,我并沒有見到有人描述過它。如果您還記得很早以前在課堂上學(xué)習(xí)過的關(guān)于摩爾型和米勒型時序邏輯電路的知識,那么就可以識別出沃茲的工作。狀態(tài)機的ROM僅僅是一個查找表,它的輸入為當(dāng)前狀態(tài)、讀/寫模式、移位寄存器的最高有效位和來自磁盤的下一個比特,輸出是下一個狀態(tài)以及一組控制信號。根據(jù)控制信號的不同,狀態(tài)機可能執(zhí)行將移位寄存器中的值進(jìn)行移位操作并附加一位0或1,清空移位寄存器,或是從數(shù)據(jù)總線將數(shù)據(jù)并行裝入移位寄存器的操作。

狀態(tài)的編碼是精心挑選的,使得狀態(tài)編碼中的位可以被同時用作控制。比如說,當(dāng)向磁盤中寫入數(shù)據(jù)時,寫入磁頭的位同時也是當(dāng)前狀態(tài)編號的最高有效位。當(dāng)從磁盤讀取數(shù)據(jù)時,選取狀態(tài)序列的原則是將對應(yīng)于比特1的位輸入脈沖嵌入一個4us的位時間窗口,并且當(dāng)持續(xù)1.5個位時間窗口(即6us)沒有接收到輸入脈沖時就插入一個比特0。在我的名為“黃石”的基于FPGA的磁盤控制器中,我用一百行的Verilog代碼實現(xiàn)了與之等價的功能,而沃茲使用了一片256字節(jié)的ROM和一個六位觸發(fā)器。

總結(jié)

“軟件驅(qū)動的”這個詞匯在這里一遍又一遍地出現(xiàn),它是 Disk II 控制器設(shè)計的精髓。這讓我們可以使用最小化的硬件實現(xiàn)靈活的設(shè)計,但也使軟件變得非常復(fù)雜?,F(xiàn)代的軟件設(shè)計者往往會對這種做法嗤之以鼻,他們更想看到這種復(fù)雜性被一套標(biāo)準(zhǔn)接口隱藏,軟件只需要關(guān)心諸如“讀31號塊”這樣的動作即可,這也正是其他的 Apple II 磁盤控制器的工作方式。當(dāng)與 Disk II 控制器配合工作時,那些軟件如DOS 3.3、ProDOS和大多數(shù)游戲,都需要大量的額外代碼來操控步進(jìn)電機,定位扇區(qū),執(zhí)行GCR解碼,無所不包。雖然有些瘋狂,但的確管用。

如果您讀到了這里,您或許對 BMOW Floppy Emu 這款磁盤模擬器感興趣。對老 Apple II 電腦、麥金塔電腦或是 Lisa 電腦的收藏者來說,它將會對運行從網(wǎng)上下載的軟件非常有幫助,并可以在古董電腦和現(xiàn)代電腦間交換文件。它可以把數(shù)百個磁盤鏡像存儲在TF卡里,使用特殊的硬件來模仿不同種類的Apple軟驅(qū)和硬盤。在 這里可以獲取到關(guān)于它的更多信息。

十多年以來,我花了很多時間找尋關(guān)于Apple磁盤驅(qū)動器設(shè)計的各方面資料,這真是一個奇妙的旅程。 幾年前我常常以為我完全理解了它工作的方式,但現(xiàn)如今我才知道當(dāng)時的我一無所知。我現(xiàn)在相信把一切都規(guī)劃好了。不過自然,我的理解可能仍然存在未能認(rèn)識到的不足之處。在這里我有錯誤解釋什么東西嗎?又或者忘記提到哪些重要的事物?請在評論區(qū)多多指教!

不可思議的 Disk II 控制卡的評論 (共 條)

分享到微博請遵守國家法律
无棣县| 吴旗县| 汽车| 静乐县| 嘉义县| 建平县| 曲靖市| 西盟| 会昌县| 浮山县| 花莲县| 无极县| 高青县| 历史| 古丈县| 弥渡县| 安仁县| 洛扎县| 合阳县| 津南区| 合肥市| 墨玉县| 措勤县| 红河县| 太仓市| 雅江县| 桓台县| 桐梓县| 工布江达县| 湖南省| 太湖县| 尼玛县| 中阳县| 名山县| 莱芜市| 遂平县| 哈密市| 嘉祥县| 甘泉县| 高要市| 灌南县|