現(xiàn)代計(jì)算機(jī)開機(jī)後,會(huì)執(zhí)行一段固化在只讀存儲(chǔ)器(ROM)中的程序。
這段程序叫做“Basic Input Output System”,簡稱“BIOS”,中文含義是“基本輸入輸出系統(tǒng)”。
BIOS主要有三個(gè)功能:硬件自檢、設(shè)置CMOS裡的參數(shù),以及加載操作系統(tǒng)。
很多人都會(huì)把BIOS和CMOS搞混。
事實(shí)上,COMS只是一個(gè)存儲(chǔ)器的型號(hào),在計(jì)算機(jī)中,一般用於保存基本的硬件參數(shù)。
CMOS斷電後,裡面存儲(chǔ)的內(nèi)容就會(huì)消失,因此一般會(huì)在主板上,安裝一塊鈕釦電池,專門用來給CMOS供電……
現(xiàn)在LED陣列上顯示的,就是BIOS自檢沒有通過,所給出的錯(cuò)誤信息。
【Keyboard/Interface Error 】
【Press F1 to Resume】
這兩行的意思很簡單,就是在提醒用戶:你沒有鍵盤,或者鍵盤壞了……
江寒看到這一幕,卻十分欣喜。
能看到這個(gè)錯(cuò)誤提示,意味著內(nèi)存、CPU等主要部件,都通過了自檢程序的校驗(yàn)。
接下來,只要給這臺(tái)計(jì)算機(jī)再搭載一個(gè)鍵盤,就可以愉快地玩耍啦。
那麼,如何搞到鍵盤呢?
如果不想費(fèi)事的話,其實(shí)可以在商品列表中買一個(gè)。
價(jià)格並不貴,最便宜的型號(hào),只需要100多萬積分就能買一個(gè)。
與動(dòng)輒幾千萬、幾個(gè)億的顯示器相比,這點(diǎn)積分根本就不算什麼。
但可惜的是,江寒手頭有點(diǎn)緊張,買完主要硬件後,剩餘的積分連最便宜的鍵盤也買不起了。
好吧,鍵盤這個(gè)玩意,其實(shí)結(jié)構(gòu)非常簡單。
江寒稍微思考了一下,就決定自己DIY一個(gè)。
既能節(jié)約學(xué)以致用積分,順便還能學(xué)到一點(diǎn)東西……
江寒先回到現(xiàn)實(shí),拿起筆記本,在網(wǎng)上查找了起來。
很快,他就收集到了許多關(guān)於鍵盤的文獻(xiàn)。
在極客社區(qū)裡,DIY鍵盤只是入門級(jí)別的小東西。
原理簡單、電路簡單、結(jié)構(gòu)……
如果不追求手感的話,結(jié)構(gòu)也是很簡單的。
江寒細(xì)心研究了一下,很快就吃透了機(jī)械鍵盤的原理和實(shí)現(xiàn)方式,連電路結(jié)構(gòu)都默背了下來。
隨後,他就再次進(jìn)入虛擬空間,買了一些空白圖紙,把鍵盤的各部分電路,都畫了出來。
然後把圖紙回收掉,再去圖紙列表裡,花費(fèi)了一點(diǎn)積分,讓系統(tǒng)幫忙自動(dòng)構(gòu)建了出來。
有了電路後,剩下的部分就簡單了。
買幾塊硬塑板,製造一個(gè)小箱子,當(dāng)做鍵盤的外殼,再買一堆按鈕開關(guān),來代替按鍵……
江寒很快就搞定了鍵盤的主體結(jié)構(gòu)。
接下來,他就將電路封裝進(jìn)了箱子裡,然後將每個(gè)按鈕開關(guān),都用細(xì)導(dǎo)線連接到了電路的IO部分。
這樣,一個(gè)山寨氣息濃烈的箱式鍵盤,到此就基本大功告成了。
江寒將鍵盤的輸出線,連接到了主板的AT接口上,然後重啓了一下286計(jì)算機(jī)。
隨著“滴”的一聲,自檢順利地通過了,沒有再出現(xiàn)和鍵盤有關(guān)的錯(cuò)誤提示。
這說明鍵盤本身沒有任何問題,無論是質(zhì)量上的,還是設(shè)計(jì)上的。
江寒欣然一笑。
今天的運(yùn)氣還算不錯(cuò),第一次做鍵盤就取得了成功。
當(dāng)然,他也沒忘了在心裡感謝一下,那些在網(wǎng)上共享資料的,都是好人哪……
可惜的是,江寒並沒有高興太久。
計(jì)算機(jī)通過了BIOS自檢後,LED上的畫面繼續(xù)滾動(dòng),但很快又停了下來。
【operating system not found】
看到這個(gè)提示,江寒不由得嘆了口氣。
這個(gè)提示的意思是:“找不到操作系統(tǒng)。”
自己花了那麼多積分,纔買來的20MB大容量硬盤,居然連個(gè)DOS都不給預(yù)裝。
上哪說理去?
對(duì)於計(jì)算機(jī)來說,沒有操作系統(tǒng),可以說寸步難行。
那麼,怎麼解決這個(gè)問題呢?
江寒思索了起來。
萬事開頭難。
щщщ ⊙ttκa n ⊙c○ 先不說自己有沒有能力,自行編寫一個(gè)操作系統(tǒng)。
就算真能克服種種困難,把操作系統(tǒng)寫出來,也得有辦法加載到硬盤中去才行。
震驚商城裡倒是也能買到各種操作系統(tǒng)的源代碼。
但購買點(diǎn)數(shù)夠不夠,只是一方面。
同樣的問題,買來之後怎麼寫入到硬盤裡。
在計(jì)算機(jī)沒有安裝任何操作系統(tǒng)時(shí),如何將程序?qū)懭氲接脖P呢?
江寒想起一個(gè)很久以前聽過的笑話。
如果你買了一臺(tái)全新的裸機(jī),手頭上又沒有系統(tǒng)安裝盤,你可以這樣做:
找一部電話機(jī),最好是帶按鍵的,除了0和1,其他的按鈕全都?jí)牡粢矡o所謂。
然後找一根電話線,插在電話上,另一頭用打火機(jī)燒一下,擼掉多餘的包皮,接在硬盤的數(shù)據(jù)線接口上。
接下來,就可以用電話上的0和1兩個(gè)鍵,輸入機(jī)器碼編寫操作系統(tǒng)、調(diào)試運(yùn)行了。
看,很簡單吧?
那麼問題來了:如果連BIOS都沒有,根本無法驅(qū)動(dòng)硬盤,又該怎麼辦呢?
也好辦。
首先,找一個(gè)螺絲刀,把硬盤拆開,再找一根針,在硬盤的盤片上戳。
這樣硬盤裡就被寫上數(shù)據(jù)了……
當(dāng)然,以上純屬扯淡。
真正的裸機(jī)編程,肯定要比這個(gè)複雜一些。
比如,可以仿照之前操作“雨菲一型”的辦法,設(shè)計(jì)一組開關(guān)。
先切斷存儲(chǔ)器和數(shù)據(jù)總線的鏈接,然後操作開關(guān),就可以在內(nèi)存中寫入機(jī)器指令了。
要不然,做一臺(tái)紙帶機(jī),用在紙帶上打孔的方式,來代替手動(dòng)按開關(guān),將程序輸入到電腦裡,也是可行的。
但這些辦法做起來都太費(fèi)事了。
如果有更簡單的辦法,又何必這麼麻煩呢?
江寒重啓了一下286,然後在自檢的過程中,按住了“DELETE”鍵。
這樣,自檢結(jié)束後,就跳過了系統(tǒng)自舉階段,進(jìn)入了BIOS的設(shè)置程序中。
BIOS設(shè)置界面非常簡單,江寒很快在其中找到了一個(gè)關(guān)於ROM BASIC的選項(xiàng)。
80286是一款十分古老的處理器,只集成了13萬個(gè)晶體管,最大主頻僅有20MHz。
但就是這麼落後的機(jī)器,卻包含了一些十分有意思的功能。
在這種早期主板的ROM芯片中,常常會(huì)固化一個(gè)BASIC解釋程序。
當(dāng)相關(guān)的選項(xiàng)開啓時(shí),如果系統(tǒng)啓動(dòng)時(shí)找不到可引導(dǎo)的系統(tǒng),將會(huì)進(jìn)入ROM BASIC解釋程序。
而不像後來的先進(jìn)計(jì)算機(jī)那樣,只給出一個(gè)錯(cuò)誤信息,之後就什麼也幹不了了。
這個(gè)選項(xiàng)默認(rèn)處於“關(guān)閉”狀態(tài),江寒將其設(shè)置爲(wèi)“開啓”,然後按“F10”保存、退出。
系統(tǒng)重新啓動(dòng),很快屏幕上就出現(xiàn)了“ IBM Personal Computer Basic 1.0”、“ copyright 1981”字樣。
屏幕中還出現(xiàn)了一個(gè)一閃一閃的“_”,這就是提示符光標(biāo)了。
屏幕的最下方,還有一行命令提示:“1、list,2、load,3、run……
現(xiàn)在就可以利用這個(gè)不到10KB的BASIC解釋程序,來乾點(diǎn)什麼了。
這個(gè)BASIC語言解釋器,可以說相當(dāng)簡陋,很多功能都沒有內(nèi)建,連浮點(diǎn)運(yùn)算都不支持。
但厲害的是,卻可以通過IO指令,直接讀取端口和內(nèi)存,以及調(diào)用一些系統(tǒng)中斷。
這就給了用戶很大的操作空間。
江寒先退出虛擬空間,去CSDN上找了幾份關(guān)於ROM BASIC的教程,並下載了一份MSDOS3.31的軟盤鏡像文件。
沒錯(cuò),對(duì)於80286來說,跑太高版本的DOS,還是有些力不從心的。
而DOS3.31的功能和複雜度,剛好處於一個(gè)微妙的平衡點(diǎn)。
既不像6.22那樣,佔(zhàn)用太多可用內(nèi)存;又不會(huì)像更早期的版本那樣太過簡陋,能幹的事情太少。……
接下來,江寒就把MSDOS3.31對(duì)軟盤鏡像解壓了一下,然後用一款非常牛掰的、能支持DOS軟件的反彙編工具,對(duì)安裝程序進(jìn)行了靜態(tài)分析。
再結(jié)合網(wǎng)上找來的那些資料,他很快就理解了MSDOS的運(yùn)行機(jī)制,並搞清楚了硬盤主引導(dǎo)記錄(MBR)的格式。
接下來,江寒就回到了虛擬空間,然後在ROM BASIC裡,編寫了一段程序。
這段程序執(zhí)行時(shí),會(huì)調(diào)用BIOS的INT13H中斷,對(duì)磁盤進(jìn)行讀寫。
雖然做起來很麻煩,但至少突破了最大的阻礙,可以把數(shù)據(jù)寫入硬盤了……