PDP-11

**PDP-11** 為迪吉多電腦於 1970 到 1980 年代所銷售的一系列 16 位元迷你電腦，這個產品線總計銷售約 600,000 部，是迪吉多最成功的產品線之一。PDP-11 是迪吉多電腦的 PDP-8 系列的後續機種。PDP-11 有著許多創新的特色，而且比起其前代機種更容易撰寫程式。當 32 位元的後續擴充機型 VAX-11 推出時，PDP-11 已經廣受程式設計師的喜愛。這兩個機型後續的市場，則多由 IBM PC、蘋果二號與昇陽電腦的工作站電腦等個人電腦所取代。

## 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

### PDP-11 指令

* 單引數指令 - 指令的長度為雙字元組，一部分用來指定動作，稱之為 "運算碼"（OP-Code）或 "運算元"。而第二部份則用來指定引數（運算子）的位址。
* * CLR（清除）, COM（取一的補數）, INC（增值）, DEC（減值）, NEG（取二的補數之負數）, TST（測試）, ASR（數學位元右移）, ASL（數學位元左移）, ROR（向右位元轉動）, ROL（向左位元轉動）, SWAB（字元置換）, ADC（加法進位）, SBC（減法進位）, SXT（擴張正負號）。
* 雙引數指令 - 指令雙字元組的一部分用來指定動作，而其餘的部份則用來指定兩個引數的位址。
* * MOV（資料搬移）, ADD, SUB（加減法）, BIT（位元測試）, BIC（位元清除）, BIS（改動位元）, XOR（互斥或運算）。
* 程式控制指令 - 指令雙字元組的第一部分用來指定動作，而第二部份則用來指定要執行的程式碼位址。
* * 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 的多種字串與十進位數相關指令

## 組合語言範例

以下是一個完整的 "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 代工的機型，另一種則是提供給最終使用者。

### Unibus 的機種

下列機種使用 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 的機種

下列機種使用 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 優良的即時回應能力。

### 特殊用途版本

* 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 各系列接腳相容，而可以與原廠產品共享週邊裝置與軟體。這些包含了：

* SM-4，SM-1420，SM-1600，Electronics BK-0010，DVK，UKNC（蘇聯）
* SM-4，SM-1420，IZOT-1016 與週邊裝置（保加利亞）。
* SM-1420（東德）
* Mera（波蘭）
* SM-4（匈牙利）
* 獨立裝置（羅馬尼亞）

## 作業系統

PDP-11 有數種可用的作業系統

迪吉多電腦：

* DOS/BATCH
* IAS
* P/OS
* RSX-11
* CAPS-11
* RT-11
* RSTS/E
* Ultrix-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 外）