PDP-11為迪吉多電腦於1970到1980年代所銷售的一系列16位元迷你電腦,這個產品線總計銷售約600,000部,是迪吉多最成功的產品線之一。PDP-11是迪吉多電腦的PDP-8系列的後續機種。PDP-11有着許多創新的特色,而且比起其前代機種更容易撰寫程式。當32位元的後續擴充機型VAX-11推出時,PDP-11已經廣受程式設計師的喜愛。這兩個機型後續的市場,則多由IBM PC、蘋果二號與太陽電腦的工作站電腦等個人電腦所取代。
![Thumb](http://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Pdp-11-40.jpg/640px-Pdp-11-40.jpg)
PDP-11系列的特色
PDP-11深受程式設計師喜愛的原因,主要是在於其高度正規化指令集的設計,使得程式設計師可以容易地分別記住所有的運算碼,以及指定運算子的方法。如此一來,給定運算子的方法(或稱之為定址模式)便可以很容易地預測,這樣子就不用去背一堆例外條件,或是特別受限的定址方式。
PDP-11所使用的指令集結構影響了C語言的語法。例如在c語言中,有着暫存器定址模式的增值與減值語法 ++i與i--。如果i與j都是暫存器變數,那麼*(--i) = *(j++)這樣子的表示式就可以編譯為單一機械碼指令。由於對單精確與雙精確浮點數沒有不同的運算碼,也造成C語言中缺乏單精確浮點數運算的運算模式。
就某種邏輯來看,指令集中的定址模式可以視為一種"基底",而指令集中的運算碼則為另一個基底。每個雙引數指令可以分為兩個6位元的引數識別(分別包含了一個3位元的暫存器號碼,和一個3位元的定址模式碼)與一個4位元的運算碼。而單引數指令,則有一個6位元的引數識別和一個10位元的運算碼。所有的運算碼都可以使用任何的定址模式,雙引數指令還可以分別組合使用。在八個暫存器(編號0到7)當中,有七個是一般用途的T暫存器可作為平常運算使用,不過暫存器6則是某些指令下作為硬件識別堆疊指標之用。暫存器7則是程式計數器,是處理器執行程式碼的地址標記。這項創新與一些定址模式,提供了暫存器內容定址,絕對地址定址與相對地址定址。
16位元字元組是以小端序即低位元在前的方式儲存的。而32位元字元組則通常是以一種不常見的混合序格式儲存。由於PDP-11的風行,這種格式也被參照為pdp-資料次序(PDP-endian)。
PDP-11與其他早期電腦最大的差異點,在於沒有專用的輸出入匯流排。PDP-11只有一個稱作為Unibus的記憶體匯流排。所有外部的裝置,都分別對應到不同的記憶體地址,所以不需要特殊的I/O指令。而其中斷系統的設計,也刻意的簡單化,以確保沒有任何的中斷程式會被遺漏。外部的裝置可以從單一的輸入線到四條優先度線路之一,發出中斷要求。而處理器可以從階層式的接受線路來回應中斷要求。(階層式的架構,是由一系列的邏輯門所構成,來接受一系列按照優先順序的事件。就一般來說,第一個邏輯門的要求會優先被接受。而階層式的要求,是按照裝置的優先度來處理的。)
而就PDP-11的設計來說,這代表中斷要求被接受的順序,是根據實際上硬件在匯流排上與處理器的接近程度來決定的。當處理器回應的時候,外部裝置會將其向量地址放在匯流排上,這是一個4位元的記憶體。之後處理器會從向量位置表讀取到狀態暫存器與程式計數器。 而新的狀態暫存器會暫時取消掉其他的中斷要求,來避免中斷的重複發生。而取出的程式暫存器,則是指向中斷處理程式的起始地址。中斷處理程式將會先處裏這個硬件的要求,完成後再重新接受其他的中斷要求。最後,一個特別的RTI程式(自中斷回復)會將處理器回復到發生中斷之前的狀態。(這也可能是一個優先權較低的中斷處理程式)一個值得注意的是,處理器會避免遺漏掉中斷要求,假使中斷沒有被回應,將仍然會被保留着到之後循環。假使程式不正常的啟動了,處理器會發生一個特別的逾時錯誤,用戶將會得知這個硬件的錯誤。
最後,由於PDP-11的設計,只需要半專業的人員來進行生產組裝。產品在尺寸精確上的要求,並不是非常要緊的。PDP-11的背版使用繞線連接的方式,也就是內部的印刷電路板插入背版上的接頭。這個接頭上的端子以導線纏繞於上的方式來連接,端子可以切開導線的絕緣層,與導線金屬的部份形成氣密連接。這種類似型式的接頭也可於電信模組上見到。
LSI-11
LSI-11是第一個使用大型集成電路技術製造的PDP-11機型。整個處理器包含了四個由威騰(Western Digital)所製造的大型集成電路晶片。而其匯流排是一個類似Unibus的Q-Bus,不同點在於地址與資料以多工的方式來共用資料線,而Unibus則是使用分別的線路。而且另一個不同點在於其I/O裝置的定址方式,可以容納到22位元寬的實體位址(Unibus只有18位元的寬度),並且有支援阻斷式(block mode)的運作。
處理器的微碼包含了一個除錯器,可以經由標準的RS-232終端機來操作。這在當時是一項創舉,因為微碼是計算機最基本的一個部份,也是最關鍵的控制單元。假使無法運作,便稱不上是一個計算機。除錯器提供了一個檢驗處理器中暫存器、記憶體與輸出入裝置的方法。因此,只要處理器可以運作,便能夠檢驗與修正計算機的內部狀態。這個內建的除錯器,省卻了昂貴與不方便操作的一大堆在面板上的開關與燈號,那是傳統上唯一能夠與快掛掉的電腦溝通的方式。
其微碼包含了一個通用的開機啟動程式,相容於所有DEC的磁碟裝置。
這兩項創新使得LSI-11總是可以開始運作。當其無法從大型磁碟啟動時,會嘗試由其軟碟啟動。而當硬件開始運作後,便可以從熟悉的終端機來使用。
PDP-11的式微
PDP-11最基本的設計是非常優良的,而且也一直有更新加入新的技術。然而,PDP-11還是必須面對其16位元的架構是有極限的,這是沒有辦法透過校調或是擴充來克服的。雖然有些機型可以支援更大的實體記憶體定址,但所有的應用程式仍然被侷限在一個16位元的虛擬定址空間而只能夠使用64K的記憶體。當1980年代超大型集成電路的技術使得記憶體晶片能夠更便宜,但是PDP-11的軟件仍然無法享受到更大的記憶體所帶來的便利。
DEC在PDP-11的下一代處理器為VAX(是"Virtual Address Extension (to the PDP-11)"的縮寫)克服了這些問題,但最初只針對高階市場來進行推廣。而英特爾的8086與8088提供了一個四位元的擴充"節"在其16位元的定址上,使得定址空間提升到1M而不需要更改為32位元的設計。這對當時逐漸擴充的IBM個人電腦相容機市場來說,已經是足夠的了。雖然在能夠支援更大節定址空間的80286與擁有32位元定址空間的80386推出前,就有到達1M的需求。
當工程師轉移到有更大的定址空間的架構時,支援32位元的運算也開始在如摩托羅拉68000和英特爾80386等後續的微處理器晶片上提供了。最後這些晶片的經濟規模大到一個程度後,PDP-11就相對而言不夠划算。DEC的一個DEC Professional系列,也就因此在市場上失敗了,同時兩個之後的DEC個人電腦系列也面臨相同的命運。
DEC最後在1997年中止了PDP-11的機型,並且把其相關的設計與作業系統授權賣給了一家愛爾蘭公司Mentec。這家公司是負責生產LSI-1的Q-Bus機板與個人電腦的ISA架構機板。
到了1990年末,DEC與大部分美國東北部六州(New England)的迷你電腦商,都在UNIX與windows伺服器的興起下,逐漸衰敗。
架構細節
以下內容可參考PDP-11處理器手冊 (詳見Gordon Bell's 1969年版(頁面存檔備份,存於互聯網檔案館))。
(R為通用暫存器,有0至7號;(R)為暫存器的內容)
- 0.暫存器 - 數值來自或存入暫存器中:OPR R ; R含有參數
- 1.暫存器指定地址 - 暫存器用來指定讀寫的記憶體地址:OPR (R) ; R存有地址
- 2.自動增值:OPR (R)+ ; R記憶體地址上的數值增加(R)
- 3.自動增值指定地址:OPR @(R)+ ; R存有地址,其內容 (R)加2
- 4.自動減值:OPR -(R);記憶體地址R上的數值 (R)減少
- 5.自動減值指定地址:OPR @-(R);記憶體地址R上的數值 (R)減2
- 6.索引:OPR X(R) ; (R)+X為記憶體地址,在指令的第二字元
- 7.索引指定地址:OPR @X(R) ; (R)+X為指令的第二字元記憶體地址的地址
程式計數器(program counter,簡稱PC)亦可以用來作為一般暫存器使用,因此有以下的定址模式,可參照前面的通用暫存器:
- 2.直接定值:OPR #N;引數包含在指令中
- 3.絕對地址:OPR @#A;絕對地址包含在指令中
- 6.相對定址:OPR A ; PC+2+X為記憶體地址。PC+2為更新後的PC
- 7.相對參考定址:OPR @A ; PC+2+X為記憶體地址。PC+2為更新後的PC
- 單引數指令 - 指令的長度為雙字元組,一部分用來指定動作,稱之為"運算碼"(OP-Code)或"運算元"。而第二部份則用來指定引數(運算子)的地址。
15 | 6 | 5 | 3 | 2 | 0 | ||||||||||
運算碼 | 模式 | 暫存器 |
- CLR(清除), COM(取一的補碼), INC(增值), DEC(減值), NEG(取二的補碼之負數), TST(測試), ASR(數學位元右移), ASL(數學位元左移), ROR(向右位元轉動), ROL(向左位元轉動), SWAB(字元置換), ADC(加法進位), SBC(減法進位), SXT(擴張正負號)。
- 雙引數指令 - 指令雙字元組的一部分用來指定動作,而其餘的部份則用來指定兩個引數的地址。
15 | 12 | 11 | 9 | 8 | 6 | 5 | 3 | 2 | 0 | ||||||
運算碼 | 模式 | 暫存器 | 模式 | 暫存器 |
- MOV(資料搬移), ADD, SUB(加減法), BIT(位元測試), BIC(位元清除), BIS(改動位元), XOR(異或運算)。
- 程式控制指令 - 指令雙字元組的第一部分用來指定動作,而第二部份則用來指定要執行的程式碼地址。
15 | 8 | 7 | 0 | ||||||||||||
運算碼 | 位移值 |
- BR(無條件分支), BNE(非零值時分支), BEQ(數值為零時分支), BPL(正數時分支), BMI(負數值時分支), BVC(溢位清除時分支), BVS(發生溢位時分支), BCC(進位清除時分支), BCS(發生進位時分支)。
- BLE(分支if <= 0), BGE(分支if >= 0), BLT(分支if < 0), BGT(分支if > 0,正負號比較)
- BLO(小於時分支), BHI(大於時分支), BLOS(小於或等於時分支), BHIS(大於或等於時分支,無正負號比較)
- SOB(暫存器減一後為零時分支)。
- 跳躍與子程式指令
- JMP(跳躍), JSR(跳入副程式), RTS(自副程式跳回主程式)
- EMT(模擬器錯誤時觸發), TRAP, BPT(中斷點觸發), IOT(輸出入錯誤時觸發), RTI & RTT(自副程式跳回時觸發)
- 其他指令
- HALT, WAIT(等候中斷觸發), RESET(重設UNIBUS), MTPD(移至前一個資料空間), MTPI(移至前一個指令空間), MFPD(移自前一個資料空間), MFPI(移自前一個指令空間), MTPS(移至處理器狀態字元組), MFPS(移自處理器狀態字元組)
- 條件碼操作
- CLC, CLV, CLZ, CLN, CCC(清除相關的條件碼), SEC, SEV, SEZ, SEN, SCC(設置相關的條件碼)
- 處理器狀態字元組(processor status word - 簡稱PSW)的狀態碼共有四種:
- N負數
- Z零值
- V溢位
- C進位
- "擴充指令集"(EIS),在11/35/40和11/03為選購,在更新的處理器則為內建功能
- MUL, DIV暫存器組的整數相乘與相除
- ASH, ASHC算數碼元位移暫存器或暫存器組,正數碼移向左,負數向右
- "浮點數指令集"(FIS),在11/35/40和11/03為選購
- FADD, FSUB, FMUL, FDIV堆疊地址上的單精數運算,由暫存器定址
- "浮點數處理器"(FPP),在11/45和大部分該系列的機種為選購
- 完整的浮點數運算,包含單精數與倍精數運算子,以浮點狀態暫存器指定精確度
- 單精浮點數運算的資料格式為IEEE 754格式的基礎:正負位元,8位元指數,23位元底數與第24位元隱藏用
- 商用指令集 (CIS), 11/23/24為選購微碼,11/44為附加模組與11/74的其中一版
- 支援COBOL與Dibol的多種字串與十進位數相關指令
匯編語言範例
![Thumb](http://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Papertape.jpg/640px-Papertape.jpg)
以下是一個完整的"Hello, world!"巨集匯編語言程式,可以在組譯後於RT-11執行:
.TITLE HELLO WORLD .MCALL .TTYOUT,.EXIT HELLO:: MOV #MSG,R1;字串起始地址 1$: MOVB (R1)+,R0;迴圈取得下一個字元 BEQ DONE;遇到字串結尾跳出 .TTYOUT;輸出至TTY BR 1$;迴圈結尾 DONE: .EXIT
MSG: .ASCIZ /Hello, world!/ .END HELLO
假設檔名為HELLO.MAC,RT-11的組譯,連結與執行的指令為:
.MACRO HELLO ERRORS DETECTED: 0
.LINK HELLO
.R HELLO Hello, world! .
(RT-11的命令提示字元為".")而更複雜的MACRO-11程式,以下是兩個隨意選自Kevin Murrell's KPUN.MAC(頁面存檔備份,存於互聯網檔案館)與Farba Research's JULIAN程式。更進階的PDP-11函式庫程式碼可免費從Metalab(頁面存檔備份,存於互聯網檔案館)和Trailing Edge(頁面存檔備份,存於互聯網檔案館)來查閱。
這些程式也可以在PDP-11模擬器上運行。Bob Supnik所寫的名為SIMH模擬器,可以優秀地模擬PDP-11與許多其他的架構,同時包含了軟件套件與原生作業系統(包含RT-11)。
PDP-11的機種
PDP-11處理器依據其原始設計,以及I/O匯流排的種類,可以歸類為以下幾種系列。在這些類別當中,大部份都有兩種以上的版本,其中一種為OEM代工的機型,另一種則是提供給最終用戶。
![Thumb](http://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/PDP-11-70-DDS570.jpg/320px-PDP-11-70-DDS570.jpg)
下列機種使用Unibus作為其擴充匯流排:
- PDP-11(後稱為PDP-11/20)和PDP-11/15 -- 原始,無微程式的處理器,由Jim O'Loughlin所設計。
- PDP-11/35和11/40 -- 微程式化的/20後續機型,由Jim O'Loughlin所帶領的團隊設計的。
- PDP-11/45,11/50,和11/55 -- 更快的微程式化的處理器,並且可以使用半導體記憶體或是核心記憶體。
- PDP-11/70 -- 11/45的擴充機型,經由獨立記憶體匯流排支援4 MB實體記憶體與2 KB緩衝記憶體,並藉由Massbus提供更快的I/O裝置連結。
- PDP-11/05和11/10 -- 11/20的精減版。
- PDP-11/34和11/04 -- 11/35和11/05的後續精減版。PDP-11/09和11/39機型只有DEC內部檔案記載,並沒有生產銷售。PDP-11/34的概念是由Bob Armstrong提出的。
- PDP-11/44 -- 11/34的擴充型,增加了緩衝記憶體和 浮點運算單元為標準功能。這一型並有一個特別的序列埠終端且支援4 MB實體記憶體。設計團隊由John Sofio所帶領。
- PDP-11/60 -- 有用戶可程式化微控制碼的PDP-11,這是由Jim O'Loughlin所帶領的另一組團隊所設計的。
- PDP-11/24 - 最早使用超大形集成電路PDP-11和Unibus,使用"Fonz-11" (F11)晶片組
- PDP-11/84 - 使用超大形集成電路"Jaws-11" (J11)晶片組
- PDP-11/94 - J11為基礎,比11/84更快
下列機種使用Q-Bus作為其擴充匯流排:
- PDP-11/03(也稱為LSI-11/03)-- 第一個大型集成電路(LSI)技術的PDP-11,使用威騰(Western Digital)生產的晶片組。
- PDP-11/23 -- 第二代大型集成電路(F-11),早期只支援248KB記憶體,但可以修改支援到4MB記憶體。
- PDP-11/23+/MicroPDP-11/23 -- 11/23改良版,在處理器卡上提供更多功能(實際上為四倍大小)
- MicroPDP-11/73 -- 第二代大型集成電路PDP,這個系統使用"Jaws-11" (J-11)晶片組。
- MicroPDP-11/53 -- 較慢的11/73有內建記憶體
- MicroPDP-11/83 -- 更快的11/73有內部記憶體連結(PMI)
- MicroPDP-11/93 -- 更快的11/83,最終DEC Q-Bus PDP-11機型。
- Mentec M100 -- Mentec重新設計的11/93,使用J-11晶片組時脈為19.66MHz,含4個內建序列埠,1-4MB內建記憶體,FPU為選購。
- Mentec M11 -- 處理器升級子板,最後的微碼PDP-11架構,指令集是由Mentec設計的。使用TI 8832 ALU和德州儀器Texas Instruments製造的TI 8818微序列器。
- Quickware QED-993 -- 高效能PDP-11/93處理器升級子板
- PDT-11/110
- PDT-11/130
- PDT-11/150
PDT為桌上型系統,以"智能終端機"來銷售。其中/110與/130使用VT100終端機模式。
- PRO-325
- PRO-350
- PRO-380
DEC Professional系列為桌上型個人電腦,作為對抗IBM早期基於8088與80286個人電腦的競爭機種。這些機型配備有5 1/4"軟碟機與硬碟機,而325則是沒有配備硬碟的機型。中央處理器為LSI-11產品線,以P/OS為作業系統,這是以RSX-11M+為基礎的選單式系統。由於設計上刻意避免與PDP-11機種的軟件相容性,其市場上最後失敗的命運並不令人意外。
- PDP-11/27 -- Jaws-11機型的實作,計劃採用VAXBI Bus作為I/O匯流排。
- PDP-11/68 -- PDP-11/60的後續機型,支援4 MB的實體記憶體。
- PDP-11/74 -- PDP-11/70擴充為多處理器的機型。最多可以使用四顆處理器,但是電纜線也會因此多到難以管理。另一個11/74的變形則是可以支援多處理器與內建商用指令集。有相當數量的11/74原型機(包含數種不同的子機型)生產出來以及至少二路的多處理器系統提供給客戶作為外部測試(beta test)使用。但是實際上自始至終這個機型都沒有正式的進行銷售過。一套四路的多處理器系統由RSX-11作業系統的開發團隊所維護,作為測試使用。而一套單處理器的版本則作為PDP-11工程一般時程分割之用。11/74之所以沒有上市,主要是由於剛好與新的32位元產品與VAX 11/780這個第一個VAX機型的上市撞期。謠言流傳與陰謀論者[永久失效連結]認為11/74被取消的原因,是由於其效能相較於11/780系列要來得更佳:鑑於行銷的考量,推出效能更好的的PDP-11機型將會影響並減緩客戶轉移到新的VAX機型的速度。然而,在該領域中維護產品的能力才是主要的原因。要說是陰謀論也好,DEC始終無法成功地將其所有的客戶從PDP-11轉移到VAX系列,這個主要的原因不是在於效能好壞,而是在於PDP-11優良的即時回應能力。
![Thumb](http://upload.wikimedia.org/wikipedia/commons/2/29/GT40_Lunar_Lander.jpg)
- GT40 -- 使用PDP-11/05的向量圖形終端機
- GT44 -- 使用PDP-11/40的向量圖形終端機
- H-11 -- Heathkit代製版的LSI-11/03
- VT103 -- VT100使用LSI-11背版
- VT173 -- 使用PDP-11/03的頂級終端機系列
- MINC-11 -- 使用PDP-11/03或11/23的實驗室系統
- C.mmp -- 來自卡內基美隆大學的多處理器系統
由於PDP-11相當風行的緣故,在當時遭受禁運的東歐社會主義國家有許多未經授權的相容機被生產出來。有些甚至與DEC的PDP-11各系列接腳相容,而可以與原廠產品共用週邊裝置與軟件。這些包含了:
作業系統
PDP-11有數種可用的作業系統
迪吉多電腦:
協力廠商:
- ANDOS
- MKDOS
- MONECS
- CSIDOS
- TRIPOS
- MUMPS
- Unix(有許多版本,包含Version 7 Unix與2BSD)
- DEMOS(蘇聯)
- TSX-Plus
外部連結
- PDP-11的FAQ
- 保留PDP-11系列的16位元迷你電腦(頁面存檔備份,存於互聯網檔案館)
- 另一個PDP-11愛好者網站(頁面存檔備份,存於互聯網檔案館)
- 俄國PDP-11相容機(頁面存檔備份,存於互聯網檔案館)(俄語網站)。
- 蘇聯計算機歷史博物館
- Gordon Bell與Bill Strecker於1975年發表的論文:我們從PDP-11學到了什麼(頁面存檔備份,存於互聯網檔案館)
- Gordon Bell的網站(頁面存檔備份,存於互聯網檔案館)可以找到更多的論文與連結。
- PDP-11後端程式(頁面存檔備份,存於互聯網檔案館)(程式範本產生器)支援可重定位ANSI Little C編譯器
- Mentec,PDP-11系統軟件目前的所有者(除IAS外)