歡迎光臨
每天分享高質量文章

微型計算機的始祖:Altair 8800 | Linux 中國

這之後的微型計算機基本都是在對 Altair 改進,使得它更易用。從某種意義上來說,它們只是更複雜的 Altair。Altair,一個野獸派的極簡作品,卻為之後的許多微型計算機打下了鋪墊。

— Sinclair Target


大眾電子Popular Electronics》的訂閱者們是個複雜的群體,該雜誌的編輯 Arthur Salsberg 不得不在 1974 年 12 月刊[1] 中的前言部分指出這點。此前,雜誌編輯組曾收到了對《如何搭建家庭媒體中心》文章的抱怨,稱這篇文章激勵了許多業餘電視愛好者走出去,削弱了專業修理人員存在的必要性,這對許多人的電視造成了極大傷害。Salsberg 認為,這個擔憂的產生可能是因為大家不清楚《大眾電子》讀者們的真實水平。他解釋道,據雜誌內部調查的資料顯示,52% 的訂閱者都是某方面的電子專家,並且其中的 150,000 人在最近 60 天之內都修過電視。此外,訂閱者們平均在電子產品上花費了 470 美金(2018 年則是 3578 美金),並且他們擁有萬用表、真空管伏特計、電子管測試儀、電晶體測試儀、射頻訊號產生器和示波器等必要裝置。“《大眾電子》的讀者們並不全都是新手。”Salsberg 總結道。

熟悉《大眾電子》的人居然會質疑它的訂閱者,這令我十分吃驚。不過最近 60 天我的確沒修過電視。我的電腦對我來說就是一塊鋁,我甚至沒把它拆開看過。1974 年 12 月的《大眾電子》刊登的像《駐波比是什麼以及如何處理它》和《對萬用表的測試》之類的特色文章,甚至連廣告都令人生畏。它們中有個看起來像某種立體聲系統的東西大膽地寫道“除了‘四通道單元(即內建的 SQ、RM 和 CD-4 解碼接收器)’,沒有任何音訊裝置是值得期待的”。這也表明瞭《大眾電子》的訂閱者一定對電子有很多深入的瞭解。

不過在 1975 年 1 月刊[2] 中,該雜誌為讀者們帶來了一些他們從沒見過的東西。在標題“突破性專案”下麵,雜誌的封面是一個大大的黑灰色盒子,其前面板上有一組複雜開關和燈。這便是 Altair 8800,“世界上首個有商業競爭力的小型機”,它的售價低於 400 美元。儘管 Altair 被宣傳作“小型機minicomputer”,但它實際上是首個商業上成功的新型計算機成員,它首先被稱為“微型計算機microcomputers”,最終被稱為 PC(個人計算機Personal Computer)。Altair 十分小巧而且很便宜,以至於它成為了當時家家戶戶都能用起的電腦。正如 Salsberg 所寫道,它在《大眾電子》上的出現意味著:“家用電腦的時代終於到來了。”

《大眾電子》1975 年 1 月刊的封面

此前,我曾寫過 關於 Altair 的文章[3],但我覺得 Altair 值得重新審視。與當時其它的計算機相比,它並不是一臺效能強勁的計算機(儘管它的成本要低得多),它也不是首個採用微處理器的通用計算機(在它之前已經至少有三個基於微處理器的計算機)。但是 Altair 是一種可供我們所有人使用的計算機。它是歷史上我們所擁有的裝置中首臺流行的計算機,而早於 Altair 計算機都是完全不同的機器,那些大型機和笨重的迷你計算機由穿孔卡程式設計並且很少與之直接互動。不過 Altair 也是臺極其簡單的計算機,它沒有附帶任何作業系統甚至是引導程式。除非你為它購買外圍裝置,否則 Altair 就是一臺裝配了 RAM、前面板只有一組開關和燈泡的機器。由於 Altair 操作簡單,使得重新理解基本的計算概念都成了十分簡單的事情,正如模擬訊號時代的人們第一次接觸到數字裝置一樣。

Roberts 和他的公司

Altair 是由一家名為微型儀器和遙測系統Micro Instrumentation and Telemetry Systems(MITS)的公司所設計製造,這家公司位於美國新墨西哥州的阿爾布開克。MITS 由一個叫 H. Edward Roberts 的人經營。在進入計算器市場之前,該公司已經開始製造模型火箭的遙測系統,該市場在 20 世紀 70 年代初期蓬勃發展。積體電路大大降低了計算器的成本,突然之間它就成了美國每個在職的專業人士的必需品。不幸的是,由於計算器市場競爭過於激烈,到了 1974 年初,MITS 便負債纍纍。

1974 年在計算機界是奇跡迭出的一年annus mirabilis1 一月的時候,惠普公司推出了世界首個可程式設計的手持計算器 HP-65。四月的時候,Intel 釋出了 Intel 8080,這是他們的第二款 8 位微處理器,它也是首款廣受歡迎的微處理器。接著,六月的時候,《無線電電子Radio Electronics》雜誌宣傳了一臺名為 Mark-8 的自製小型計算機,它使用了 Intel 在 1972 年推出的 Intel 8008 微處理器。Mark-8 是有史以來使用微處理器搭建的第三臺電腦,它的首次登場是在雜誌的封面上。2 Mark-8 在《無線電電子》上的出現促使了《大眾電子》尋找他們要自己宣傳的小型機專案。

《大眾電子》的訂閱者們其實早在 1974 年 12 月就透過郵件獲得了 1975 年 1 月刊的刊物。3所以 Altair 的宣佈為這個奇跡迭出的一年annus mirabilis畫上了圓滿的句號。Altair 的出現是十分重要的,因為此前從未有過向公眾提供的價格公道而又功能齊全的電腦。當時,作為最受歡迎的小型計算機之一的 PDP-8 要幾千美金才能買到。然而作為 Altair 核心的 Intel 8080 晶片幾乎能與 PDP-8 匹敵,甚至更強;8080 支援更廣泛的指令集,而且 Altair 可以擴充套件到 64 kb 記憶體,顯然強於僅有 4 kb 記憶體的 PDP-8。並且,Mark-8 也不是它的對手,因為它搭載的是隻能處理 16 kb 記憶體的 Intel 8008。在 Mark-8 必須由使用者按照說明書在印刷電路板上手動拼裝的情況下,Altair 在購買時就已經被組裝好了(不過由於後來 MITS 被大量訂單淹沒,最後真正能獲得 Altair 的方式也只有買套件拼裝了)。

對許多《大眾電子》的讀者來說,Altair 是他們瞭解數字計算的起點。1975 年 1 月刊上那篇介紹 Altair 的文章由 Roberts 和 Altair 的共同設計師 William Yates 所寫。Roberts 和 Yates 煞費苦心地用電工和無線電狂熱者們所熟悉的詞彙來介紹了數字硬體和計算機程式設計的基本概念。他們寫道:“一臺計算機其實由一塊可變的硬體。僅需修改儲存於記憶體之中的位組合形式,便可改變硬體裝置的種類。”同時,Roberts 和 Yates 認為程式設計的基本概念是“足夠簡單並能在較短時間內掌握,但是想要成為一個高效的程式員必須經驗豐富且富有創造力。”對此我十分認同。儘管該部分已經完全組裝好了,文章仍包含了用來講解 Intel 8080 的組成電路的詳細圖表。文章解釋了 CPU 和計算機記憶體單元的區別,堆疊指標的用法,和組合語言以及更高階的語言(例如 FORTRAN 和 BASIC)比起手動輸入機器碼所帶來的巨大優勢。

其實,《大眾電子》在 1975 年 1 月刊之前就出版過 Roberts 撰寫的系列文章。這一系列作為短期課程被收錄在“數字邏輯”專欄中。在 1974 年 12 月刊中,Roberts 為讀者們帶來了關於構建“超低成本計算機終端”的文章,文章中介紹了可以用於 8 位電腦中輸入值的八進位制鍵盤。在介紹這個鍵盤時,Roberts 解釋了電晶體到電晶體的邏輯工作原理,以及關於構建一種可以“記住”數字值的觸發器的方法。Roberts 承諾說,這個鍵盤可以在下個月即將公佈的 Altair 電腦中使用。

有多少《大眾電子》的讀者製作了這個鍵盤我們無從得知,但是那個鍵盤的確是個很有用的東西。如果沒有鍵盤和其它輸入裝置,我們只能透過撥動 Altair 面板上的開關來輸入值。Altair 的前面板上有一行 16 個開關被用來設定地址,而下方的 8 個則是用來操作計算機的。一行 16 個開關中最右邊的 8 個開關也能用來指定要儲存在記憶體中的值。這麼做不無道理,因為 Intel 8080 使用 16 位的值來定址 8 位的字。而前面板的這 16 個開關每一個都代表了一個位,當開關向上時代表 1,向下則代表 0。用這樣的方式與計算機互動是個啟示(一會兒我們就會講到),因為 Altair 的面板是真正的二進位制介面。這使得你可以盡可能地接觸到計算機物體。

儘管在當下 Altair 的介面對我們來說完全不像是人用的,不過在那個時代卻並不罕見。比如 PDP-8 的面板上有個類似的但更漂亮的二進位制輸入裝置,而且它被塗上了吸引人的黃色和橙色,不過講真,它真的應該捲土重來。然而 PDP-8 經常與紙帶閱讀器或電傳打字機配合使用,這使得程式輸入更加容易。這些 I/O 裝置價格高昂,這意味著 Altair 的使用者們大都會被那個前面板攔住。正如你可能想象的那樣,透過這一堆開關輸入一個大型程式是個苦差事。不過幸運的是,Altair 可以與盒式記錄器連線,這樣一來載入程式就不是什麼難事了。Bill Gates 和 Paul Allen 在 MITS 的授權下為 Altair 編寫了一個 BASIC 語言版本,併在 1975 年中期發行,這成為了微軟有史以來的首次商業嘗試。此後,那些買得起電傳打字機的使用者就能 透過紙帶來將 BASIC 載入 Altair[4] 了,並能使得使用者能夠透過文字與 Altair 互動。之後,BASIC 便成為了學生們最愛的入門程式語言,併成了早期小型機時代的標準介面。

z80pack

多虧了網路上一些人,特別是 Udo Munk 的努力,你可以在你的計算機上執行 Altair 的模擬器。這個模擬器是在 Zilog Z80 CPU 的虛擬套件上構建的,這個 CPU 可以執行 Intel 8080 的軟體。Altair 模擬器允許你像 Altair 的早期使用者們一樣撥動前面板上的開關。儘管點選這些開關的感覺不如撥動真實開關的觸覺,但是使用 Altair 模擬器仍是一個能讓你感受二進位制人機互動效率有多低的途徑,至少在我看來這非常簡明直觀。

z80pack 是 Udo Munk 開發的 Z80 模擬器套件,你可以在 z80pack 的官網上找到它的下載連結。我在 上一篇介紹 Altair 的文章中[3] 寫到過在 macOS 上使用它的詳細過程。如果你能編譯 FrontPanel 庫和 altairsim 可執行程式,你應該能直接執行 altairsim 並看到這個視窗:

模擬器中的 Altair 面板

在新版的 z80pack 中(比如我正在使用的 1.36 版本),你可以使用一個叫 Tarbell boot ROM 的功能,我覺得這是用來載入磁碟映象的。經我測試,這意味著你不能寫入到 RAM 中的前幾個字。在編輯 /altairsim/conf/system.conf 之後,你可以構建帶有一個 16 頁 RAM 且沒有 ROM 或引導載入器的 Altair。除此之外,你還可以用這個配置檔案來擴大執行模擬器的視窗大小,不得不說這還是挺方便的。

Altair 的面板看起來令人生畏,不過事實上並沒有我們想象中的這麼可怕。Altair 說明書[5] 對解釋開關和指示燈起到了很大的作用,這個 YouTube 影片[6] 也是如此。若想輸入和執行一個簡易的程式,你只需要瞭解一點點東西。Altair 右上方標簽為 D0 到 D7 的指示燈代表當前定址的字的內容。標簽為 A0 到 A15 的指示燈表示當前的地址。地址指示燈下的 16 個開關可以用來設定新地址;當 “EXAMINE” 開關被向上推動時,資料指示燈才會更新以顯示新地址上的內容。用這個功能,你便能“觀察”到記憶體中所有的資訊了。你也可以將 “EXAMINE” 推下來“EXAMINE NEXT”位置,以自動檢查下一個位置上的資訊,這使得檢視連續的資訊更容易了。

要將位組合方式儲存到記憶體資訊中,請使用最右邊的 8 個標簽為 0 到 7 的開關。然後,請向上推動 “DEPOSIT” 按鈕。

在《大眾電子》 的 1975 年 2 月刊[7] 中,Roberts 和 Yates 引導使用者輸入一小段程式來確保他們的 Altair 正常工作。這個程式從記憶體中讀取兩個整型資料並相加之後將和存回記憶體中。這個小程式僅由 6 條指令組成,但是這 6 條指令涉及了 14 個字的記憶體,所以要正確地輸入它們需要一點時間。這個示例程式也被寫入了 Altair 的說明書,原文如下:

< 如顯示不全,請左右滑動 >
Address Mnemonic Bit Pattern Octal Equivalent
0 LDA 00 111 010 0 7 2
1 (address) 10 000 000 2 0 0
2 (address) 00 000 000 0 0 0
3 MOV B, A 01 000 111 1 0 7
4 LDA 00 111 010 0 7 2
5 (address) 10 000 001 2 0 1
6 (address) 00 000 000 0 0 0
7 ADD B 10 000 000 2 0 0
8 STA 00 110 010 0 6 2
9 (address) 10 000 010 2 0 2
10 (address) 00 000 000 0 0 0
11 JMP 11 000 011 3 0 3
12 (address) 00 000 000 0 0 0
13 (address) 00 000 000 0 0 0

如果你透過開關來將上表的這些值輸入到 Altair,最終會得到一個程式,它會讀取記憶體 128 中的值,並將其與 129 中的值相加,最終將其儲存至 130 中。伴隨每條取一個地址的指令的地址,它們最開始會給出最低有效位,這便是第二個位元組總會被清零的原因了(沒有高於 255 的地址)。在輸入這個程式併在 128 和 129 中輸入了一些值之後,你可以向下短暫推動 “RUN” ,之後再將它推到 “STOP” 位置。因為程式迴圈執行,以一秒內執行上千次的速度反覆地新增並儲存那些值。並且最後得到的值總是相同的,如果你停止該程式並檢視 130 的內容,你應該能找到正確答案。

我不知道普通的 Altair 使用者是否使用過彙編程式,不過 z80pack 包括了一個:z80asm,意思是適用於 Z80 的彙編程式Z80 assembly,所以它使用了一組不同的助記符。不過因為 Z80 是被設計來相容為 Intel 8080 寫的軟體的,所以即使助記符不一樣,它們的操作碼也是相同的。你可以直接將 z80asm 彙編碼裝載進 Altair:

  1.        ORG  0000H
  2. START:  LD   A,(80H)   ;Load from address 128.
  3.        LD   B,A       ;Move loaded value from accumulator (A) to reg B.
  4.        LD   A,(81H)   ;Load from address 129.
  5.        ADD  A,B       ;Add A and B.
  6.        LD   (82H),A   ;Store A at address 130.
  7.        JP   START     ;Jump to start.

編譯之後,你可以呼叫彙編程式來將其轉換為 Intel HEX 檔案:

  1. $ ./z80asm -fh -oadd.hex add.asm

我們用帶有 h 引數的 -f 標識來定義輸出的 HEX 檔案。你可以用 -x 標識來傳遞 HEX 檔案,從而使得 Altair 能夠載入該程式:

  1. $ ./altairsim -x add.hex

這會在記憶體中自動設定前 14 個字,就和你透過開關手動輸入這些值一樣。你可以直接使用 “RUN” 按鈕來替代以前那些繁瑣的步驟,這是如此的簡單!

我不覺得有很多 Altair 使用者以這種方式來編寫軟體。Altair BASIC 釋出後,使得 BASIC 成為了 Altair 程式設計最簡單的方法。z80pack 同時也包括了一些不同版本 Altair BASIC 的 HEX 檔案;在模擬器中,你可以用這個方式載入 4.0 版本的 4K BASIC:

  1. $ ./altairsim -x basic4k40.hex

當你開啟模擬器並按下 “RUN” 按鈕之後,你就會看到 BASIC 開始執行了,同時它會在終端中與你互動。它首先會提示你輸入你的記憶體可用量,我們輸入 4000 位元組。隨後,在顯示 “OK” 提示符之前,它會問你幾個問題,Gates 和 Allen 用這個“OK”來代替標準的 “READY” 並以此節省記憶體。在這之後,你便可以使用 BASIC 了:

  1. OK
  2. PRINT 3 + 4
  3. 7

雖然執行 BASIC 只有 4kb 的記憶體並沒有給你足夠的空間,但你可以看到它是如何從使用前面板邁出了重要的一步。

很顯然,Altair 遠不及如今的家用電腦和膝上型電腦,並且比它晚十多年釋出的 Mac 電腦看上去也是對這個簡樸的 Altair 電腦的巨大飛躍。但是對第一批購買並親手組裝了 Altair 的《大眾電子》的讀者們來說,Altair 才是他們擁有的第一個真正的全功能電腦,而這一切只用了 400 美金低價和一半的書櫃空間。對那時只能用 一疊卡片[8] 或一捲磁帶來與計算機互動的人們來說,Altair 是個令人眼前一亮的玩意。這之後的微型計算機基本都是在對 Altair 改進,使得它更易用。從某種意義上來說,它們只是更複雜的 Altair。Altair,一個野獸派的極簡作品,卻為之後的許多微型計算機打下了鋪墊。

如果你覺得這篇文章寫的不錯,你可以在推特上關註 @TwoBitHistory[9] 或訂閱 RSS feed[10]來獲得我們文章的更新提醒。文章每兩周就會更新一次!


1. Paul E. Ceruzzi, A History of Modern Computing (Cambridge, Mass: MIT Press, 2003), 226. 
2. “Mark-8 Minicomputer,” Byran’s Old Computers, accessed July 21, 2018, http://bytecollector.com/mark_8.htm
3. Paul E. Ceruzzi, A History of Modern Computing (Cambridge, Mass: MIT Press, 2003), 226. 

via: https://twobithistory.org/2018/07/22/dawn-of-the-microcomputer.html

作者:Sinclair Target[13] 選題:lujun9972 譯者:zhs852 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂