MS-DOS 7 系統程式設計入門 / PC 鍵盤
第 1 章 讓我們熟悉鍵盤
對於所有類似 DOS 的作業系統,主要輸入方式是鍵盤。每次按鍵都會觸發至少一個預載入(駐留)軟體模組的執行。有時這種執行不會顯露出來,但更常見的是它會導致相應字元在螢幕上出現。一些鍵(“熱鍵”)可能被賦予更復雜的任務。定義按鍵任務的駐留軟體模組由以下任何一種方式載入到記憶體中:
- BIOS(基本輸入輸出系統);
- 來自 IO.SYS 檔案的 DOS 載入程式(僅在載入期間活動);
- 來自 DOS 核心的 CON 裝置(控制檯)驅動程式;
- 命令直譯器(通常為 COMMAND.COM)。
本章不描述其他“熱鍵”功能,這些功能可能由其他 TSR(TSR = 終止並駐留)實用程式或檔案管理器分配:Norton Commander、Volkov Commander 等。TSR 由於載入較晚,因此會攔截一些原始鍵盤功能(大多數檔案管理器也是如此),或者用部分(非精確)模擬進行替換。檔案管理器提供的命令列與原始 DOS 的命令列不相同:大部分原始鍵盤功能被攔截並失效。
以下文字描述了最常見的“增強型”鍵盤的功能,該鍵盤通常有 101 到 108 個鍵。按鍵功能的演變過程按其在載入 MS-DOS 7 時啟用的順序顯示。假設的最終階段是命令直譯器 COMMAND.COM 實現的階段。
開機後,計算機在 BIOS 系統控制下啟動。BIOS 載入 INT 09 處理程式(8.01-09),因此能夠感知透過 IRQ 1 線傳送的鍵盤控制器呼叫。每個按鍵都會被感知,但只有少數按鍵和按鍵組合會觸發特定響應。常見的 BIOS 版本將特殊任務分配給以下按鍵和按鍵組合:
| Ctrl-Alt-Delete – 啟動“熱”重啟。 | ||
| Delete | – | 啟動 BIOS 設定程式,該程式允許設定 BIOS 的引數。[注 1][注 2]此功能在約 2 秒後停用,因此您必須在計算機啟動時一直按住“Delete”鍵。 |
| Pause/Break(或 Ctrl-Break) – 導致臨時停止,直到按下任何其他鍵,從而有機會閱讀螢幕訊息。 | ||
| Shift-PrtScr – 透過 LPT1 埠將當前螢幕傳送到印表機。印表機必須處於準備狀態,並且必須能夠正確響應(這在 USB 連線的印表機或“專為 Windows 設計的”印表機上不起作用)。 | ||
BIOS 的鍵盤功能沒有統一標準,因此它們可能略有不同。例如,American Megatrends 的第 8 版 BIOS 提供輔助 PC 載入選單,可以透過 F8 鍵呼叫。然而,一些 BIOS 的鍵盤功能已成為事實上的標準,特別是 DELETE 鍵[注 2]和 CTRL-ALT-DELETE 鍵組合的功能。
BIOS 設定的鍵盤功能可以像任何軟體實現的功能一樣在稍後停用。特別是,Shift-PrtScr 按鍵組合通常被顯示卡的嵌入式軟體停用。其他 BIOS 的功能可能會因 INT 09 被攔截,或因軟體崩潰而導致中斷表(從 0000:0000h 到 0000:0400h)或 BIOS 記憶體區域(A.01-1)中的資料受損而失敗。因此,某些 PC 中最重要的重啟功能是由硬體複製的,可以透過 RESET 按鈕實現。
- 備註
- ^ BIOS 設定程式可能會啟用其他一些鍵,具體取決於 BIOS 版本。這些鍵允許更改一些引數設定,包括防止顯示 BIOS 徽標的設定。如果沒有 BIOS 徽標,您將能夠看到當前 BIOS 的訊息。
- ^ a b 一些(基本上已經過時)的 BIOS 版本使用 F1、F2、F10、ESC 鍵或 F3-F2、Ctrl-Alt-S、Ctrl-Alt-Ins、Ctrl-Alt-Esc 鍵組合啟動 BIOS 設定程式。
- 一些在 1990 年代開發的“增強型”鍵盤型號有一個額外的 TURBO 鍵。TURBO-F11 鍵組合切換鍵盤鎖定 ON/OFF,而 TURBO-F12 鍵組合切換蜂鳴器聲音鎖定 ON/OFF。大多數現代鍵盤沒有 TURBO 鍵。
- 對於透過鍵盤控制電源,許多鍵盤型號配備了三個特殊鍵:POWER、SLEEP 和 WAKE UP。這些鍵旨在由 BIOS 使用,但它們的功能被攔截,特別是被 Windows XP 和 Windows Vista 攔截。
在 PC 載入過程中的某個時刻,BIOS 徽標會被作業系統的徽標取代。這種徽標更改表示 BIOS 載入任務的結束。從那一刻起,控制權就轉移到了作業系統的載入程式。
Windows-95/98 和 MS-DOS 7 作業系統都具有相同的初級載入程式,它作為 IO.SYS 檔案的一部分包含在內。載入程式的任務從讀取儲存在 MSDOS.SYS 檔案(5.01-01)中的引數開始。然後,根據這些引數,DOS 載入程式會暫時啟用一些額外的“熱鍵”和按鍵組合:
| F5 | – | 將後續載入轉換為使用 WINDOWS 的 GUI(圖形使用者介面)和預設設定的安全模式,忽略配置檔案(CONFIG.SYS 和 AUTOEXEC.BAT)中的命令。 |
| SHIFT-F5 | – | 將後續載入轉換為“僅命令列”模式,包括所有驅動程式,但沒有 WINDOWS 的 GUI。實際上,這是載入 MS-DOS 7。 |
| F6 | – | 將後續載入轉換為安全模式(與 F5 相同)並新增網路支援。 |
| F8 | – | 呼叫顯示 WINDOWS 的標準啟動選單,並停止進一步的程序,直到使用者做出選擇。在 MS-DOS 8 中,CTRL 鍵複製 F8 鍵的功能。 |
| SHIFT-F8 | – | 將配置檔案的執行轉換為逐步模式;這允許根據使用者的選擇跳過某些操作。 |
MSDOS 7 和 MSDOS 8 中列出的按鍵功能與以前的 DOS 版本中實現的功能不同。配置檔案 MSDOS.SYS(5.01-01)中指定的引數(BOOTDELAY、BOOTKEYS、BOOTMULTI)可能會影響上述“熱鍵”的啟用。當然,當 MS-DOS 7 用作獨立作業系統,並且 GUI 軟體在物理上不可訪問時,無法執行 WINDOWS 的 GUI 載入。
在顯示啟動選單時,DOS 載入程式會啟用鍵盤的通用部分中的游標鍵(上、下)、ENTER 鍵和數字鍵(0-9)。NUMLOCK 鍵也被啟用;當 NUMLOCK 設定為 ON 時,可以使用數字(最右側)小鍵盤透過數字選擇選單項。做出選擇後,所有選單鍵都會停用。如果所選選單項不暗示其他操作,則 DOS 載入程式將開始解釋來自 CONFIG.SYS 配置檔案(示例參見 9.01-01)的命令。
在逐步確認期間,可以透過 Y(是)、N(否)、ENTER(= 是)和 A 鍵(A = 對所有後續行表示是)做出選擇。正常的(非逐步)執行不會對螢幕產生任何影響,因為此時將顯示視窗徽標。但是,可以透過在 MSDOS.SYS 檔案(5.01-01)中設定“Logo=0”引數來抑制徽標顯示。然後,您將在螢幕上看到正在載入的驅動程式的快速滾動訊息。為了能夠仔細檢查這些訊息,您可以使用 PAUSE/BREAK 按鍵組合或 CTRL-S 按鍵組合來暫停載入過程。然後,在按下任何其他鍵後,載入過程將恢復。
DOS 載入程式解釋了 CONFIG.SYS 配置檔案中的所有行後,會停用其所有“熱鍵”,並將控制權轉移到命令直譯器 COMMAND.COM。
- 備註
- 在 MS-DOS 的 7.00 版本中,DOS 載入程式會啟用 F4 鍵以啟動先前 DOS 版本的載入。從 7.10 版本開始,此選項已廢棄。
當 DOS 配置過程尚未完成時,對 PC 的控制權將交給主命令直譯器。COMMAND.COM 的第一個任務是解釋最後一個配置檔案 AUTOEXEC.BAT(示例見 9.01-02)中的命令列。在解釋過程中,COMMAND.COM 相當自給自足,但同時使用者的角色並沒有降至零。如果視窗徽標顯示被關閉,那麼使用者可以監控當前訊息。此外,命令直譯器會保持一些“熱鍵”的啟用狀態,這些熱鍵允許使用者暫停或停止批處理命令檔案的解釋。
暫停和停止執行都會啟動一系列複雜的呼叫(有關詳細資訊,請參見 8.01-95),包括 DOS 核心的駐留模組以及 PC 的 BIOS 安裝的模組。因此,一些“熱鍵”的精確操作可能會取決於 BIOS 版本。然而,在所有 AT 相容的計算機中,啟用的“熱鍵”都是相同的。
Break/Pause 鍵提供臨時停止,允許讀取訊息,但沒有機會終止批處理檔案的執行:任何隨後的按鍵都會恢復執行。使用者可以使用“熱”鍵組合 CTRL-C、CTRL-BREAK 和 ALT-03(後兩位數字“03”必須透過最右側的數字鍵盤輸入)來終止批處理檔案的執行。這些按鍵組合的作用取決於命令直譯器啟動的方式。當 COMMAND.COM 使用 /K 或 /P 引數(6.04)永久啟動時,上述按鍵組合會停止執行並顯示一個提示
"Terminate batch job? Y/N"
從而提供一個明確的選擇。但如果 COMMAND.COM 使用 /C 引數(6.04)啟動以執行單一任務(如 TSR shell 內),則 CTRL-C、CTRL-BREAK 和 ALT-03 按鍵組合會立即終止批處理檔案解釋,不提供恢復的機會。
CTRL-S 按鍵組合提供臨時停止,但(與 BREAK 鍵不同)始終提供選擇。您可以透過按下除 CTRL-C、CTRL-BREAK、ALT-03 和 CTRL-2 之外的任何鍵來恢復執行。CTRL-C、CTRL-BREAK 和 ALT-03 的作用取決於 COMMAND.COM 的啟動方式,正如上面所述。CTRL-2 的作用類似,但只有在執行已透過 CTRL-S 暫停時才會生效。正常的批處理解釋不會受 CTRL-2 按鍵組合的影響。
可以透過同一個批處理檔案中 CTTY NUL 命令(見 3.07)來停用中斷批處理檔案解釋的鍵盤功能。但這種技巧僅在特殊情況下才適用(9.03-02 中有示例)。
完成對 AUTOEXEC.BAT 檔案中命令的解釋後,命令直譯器 COMMAND.COM 預設情況下應將控制權傳遞給 Windows 的 GUI 載入程式——WIN.COM 檔案。但如果
- 找不到 WIN.COM 檔案(例如,在可啟動軟盤上);
- 啟動時已按下 SHIFT-F5 鍵組合(1.02);
- 在 Windows 的啟動選單中選擇了“僅命令列”選項;
- 在 MSDOS.SYS 檔案(5.01-01)中指定了“
BootGUI=0”引數; - DOS 命令被賦予了
SINGLE引數。[注 1 到 4.08]
在任何列出的情況下,都將載入 MS-DOS 7 而不是 Windows 作業系統,命令直譯器 COMMAND.COM 開始接受來自鍵盤的命令,並在螢幕上顯示其提示符,從那一刻起它將以完全不同的方式與鍵盤互動。
1.04 鍵盤輸入命令和文字行。
[edit | edit source]當 COMMAND.COM 顯示其命令列時,它會透過 CON 裝置驅動程式接受輸入。後者允許根據記憶體中駐留的鍵盤佈局表輸入字元、數字和特殊符號。符號可以透過相應的鍵或 ASCII 十進位制符號的數字輸入。後者應在按住 ALT 鍵的同時透過數字鍵盤輸入。每個後續字元都會追加到當前命令列,並將當前行和內部記憶體緩衝區(其中自動儲存前一行)的當前位置指標加 1。
用文字鍵輸入的符號的選擇取決於 SHIFT 和 CAPSLOCK 鍵的狀態。按下 CAPSLOCK 會將鍵盤切換到字母大寫選擇模式或反向模式。按下 SHIFT 會將鍵盤暫時切換到字母大寫選擇模式,直到鬆開 SHIFT 鍵。此外,DOS 提供了一些有限的機會來編輯當前命令列(1.05)。
所有提到的功能對輸入文字行也同樣適用。從命令列輸入到文字行輸入的轉換是由對 CON 裝置驅動程式的明確請求發起的,例如,使用以下命令
COPY CON Filename.txt
其中 FILENAME.TXT 是用於儲存文字的任意檔名。
COPY 命令不是一個獨立的實用程式;它是直譯器 COMMAND.COM 的內部命令(3.06)。文字行輸入也可以透過其他實用程式實現,這些實用程式能夠以相同的方式訪問 CON 裝置驅動程式。
文字輸入和命令列輸入之間的區別在於,當用戶透過 ENTER 鍵或等效的 CTRL-M 按鍵組合確認文字輸入完成時,輸入的行會發生什麼。文字行被寫入內部緩衝區,在那裡替換前一行,然後開啟一個新的行供輸入。每個文字行的末尾用位元組 0Dh 0Ah 標記,並且以這種形式追加到記憶體區域(用於文字儲存)中之前的所有行。COMMAND.COM 直譯器允許將此文字傳送到指定的檔案或選定的通道(有關詳細資訊,請參見 3.06)。可以透過 F6-ENTER、CTRL-Z-ENTER 或 ALT-26-ENTER 鍵組合從文字輸入返回到命令列輸入。在最後一個組合中,數字必須透過最右側的數字鍵盤輸入。
當 ENTER 鍵表示輸入一個命令列時,該行也會寫入內部行緩衝區,就像文字行一樣,但後續事件會有所不同。在緩衝區中,對該行進行解析以提取命令名稱並區分它是內部命令還是獨立的實用程式。在解析過程中,MS-DOS 7 將大寫字母和小寫字母視為相同。搜尋獨立的實用程式(2.02-02),從其介質讀取它們並準備執行。執行終止後,控制權將返回到命令直譯器。後者在新的一行中顯示其提示符,並開始等待下一個命令列輸入。如果解析行中的主要物件是命令檔案的檔名,則命令直譯器會開始從此檔案讀取命令並逐行解釋它們。當最後一個命令列的執行終止時,命令直譯器將返回到等待來自鍵盤的命令列輸入。
當然,命令列的具體內容取決於其所針對的命令直譯器,這將是本書第 2 章及其後的章節中將要討論的主題。
1.05 用於行編輯的功能鍵。
[edit | edit source]毫無疑問,最“熱”的輸入鍵是 ENTER 鍵。但還有一些其他的“熱”鍵,它們負責編輯和控制功能,在以前的計算機世代中有著悠久的歷史。DOS 中的兩個互動式命令直譯器——COMMAND.COM 和 DEBUG.EXE——都繼承了這些功能。其中一些似乎很基礎,但一些仍然被廣泛使用。
BACKSPACE 鍵(左箭頭)將當前行和內部記憶體緩衝區中的當前位置指標減 1。內部記憶體緩衝區的內容保持不變,但當前行中的最後一個字元看起來消失了;實際上,這個字元被準備用來用後續按鍵覆蓋。游標鍵中的左箭頭、數字鍵盤中的左箭頭、CTRL-H 和 ALT-08 按鍵組合的作用完全相同。
CTRL-2、CTRL-C、CTRL-BREAK 和 ALT-03——所有這些按鍵組合都會清除當前行的內容,並開啟一個新的空行以供重新輸入。所有先前的文字輸入都會丟失。
CTRL-ENTER、CTRL-J 和 ALT-10 按鍵組合會換行當前輸入行,並提供在下一行繼續輸入的機會。這樣就能在通常寬 80 個字元的螢幕上看到整行(預設情況下最長 128 個字元)。換行後的命令列將始終被接受,就好像它是一個連續的行一樣。
CTRL-G 和 ALT-07 按鍵組合插入程式碼 07h“Beep”。它在文字行和命令列中沒有任何作用,但如果傳送到螢幕,它會產生一個令人不快的蜂鳴聲。
CTRL-P 和 ALT-16 按鍵組合會將資料輸出從螢幕切換到印表機,反之亦然。當印表機未準備好、未連線或未連線到預設埠(LPT1)時,這很危險。在任何此類情況下,都會呼叫 INT 24(8.02-84),並顯示“中止、重試?”提示,但“中止”選項不會重置輸出狀態(這似乎是一個錯誤)。為了恢復到正常的命令列,您必須再次按下 CTRL-P,否則提示會無限期地重複。
DEL(DELETE)鍵會將內部記憶體緩衝區中的指標加 1。這看起來像是緩衝區中的前一行向左移動了一位。如果隨後執行復制到當前行的操作,前一行中的一個字元將被跳過。以前,此功能稱為“SKIP1”。
ESC、CTRL-ESC、CTRL-[ 和 ALT-27 按鍵組合會取消當前行並開啟一個新的行。以前,此功能稱為“VOID”。內部記憶體緩衝區的內容保持不變。已取消的命令列在螢幕上用反斜槓“\”標記,但反斜槓本身不會導致“VOID”操作:您可以正常輸入它。
F1 鍵會將當前行追加一個字元,該字元從內部記憶體緩衝區中儲存的前一行的相同位置複製而來。以前,此功能稱為“COPY1”。數字鍵盤中的右箭頭鍵和右箭頭游標鍵的作用完全相同。
F2 鍵按下會導致暫停,等待輸入一個字元。如果輸入的字元在內部記憶體緩衝區中前一行剩餘部分中不存在,則 F2 鍵按下會被中止;但如果字元存在,則從內部緩衝區複製輸入字元之前的多個字元,並附加到當前行。以前此功能稱為“COPYUP”。
F3 鍵按下會用內部記憶體緩衝區中的字元填充行的空缺,從而複製前一個命令列。如果當前行已經包含多個符號,則只有內部記憶體緩衝區中剩餘部分的字元將被附加到當前行已存在的字元部分。以前此功能稱為“COPYALL”。
F4 鍵按下隻影響內部記憶體緩衝區。按下 F4 會導致暫停,等待輸入一個字元。如果輸入的字元在內部記憶體緩衝區剩餘部分中不存在,則 F4 鍵按下會被中止;但如果字元存在,則記憶體緩衝區中前面的字元會被刪除。這看起來就像內部緩衝區的內容向左移動,直到輸入的字元在當前行中與游標處於相同位置。F4 功能以前稱為 SKIPUP,它使您可以跳過前一行的一部分,使其不會被 F1 或 F3 鍵按下複製到當前行。
F5 鍵按下會將當前行復制到內部記憶體緩衝區,在螢幕上用“@”符號關閉複製的行,並開啟一個要重新鍵入的下一行(空)命令列。所描述的操作不是由“@”符號本身引起的,因此後者可以以通常的方式使用。
F7 和 ALT-00 插入程式碼 00h,用符號對 ^@ 標記。程式碼 00h 會中斷命令列的解析:00h 之後的字元會被忽略。但 00h 不會中斷文字輸入:程式碼 00h 本身以及所有後續字元將保留在儲存的文字中。
INS(插入)鍵按下會切換一個位(參見 A.02-3,0040:0017),該位控制內部記憶體緩衝區中當前位置指標的增量。如果您已經複製了前一行的一部分,然後停止增量,輸入一些新字元,然後複製前一行剩餘部分,結果將看起來像新字元插入到前一行的相鄰字元之間。要恢復正常增量,您需要再次按下 INS 鍵。
CTRL-I、ALT-09 和 TAB 鍵插入水平製表符 09h 的程式碼,該程式碼由顯示過程擴充套件為 8 個空格。將文字儲存到檔案時,製表符符號不會擴充套件。一些文字編輯程式可以將 09h 程式碼擴充套件為其他數量的空格。
列出的原始鍵功能通常會被 TSR(終止並駐留)程式攔截,這些程式可以在以後載入。TSR 外殼(Norton Commander、Volkov Commander 等)通常會攔截 INS、DEL、F1-F7 以及其他幾個鍵,使它們失效或以其他方式啟用(參見 6.25 的示例)。但是,原始命令列編輯功能始終保持活動狀態,用於文字行的輸入以及 DEBUG(6.05)的互動式會話。
預設情況下,MS-DOS 7 使用美國英語(US)字元集,由內碼表 437 表示,但提供根據國家需求替換它的機會。此機會的實現涉及更改鍵盤和顯示設定的多個操作。Microsoft 建議以下操作序列
- 透過載入 COUNTRY.SYS 檔案(5.02-01,9.01-01 中的示例)中的資料來更改名稱限制和其他設定;
- 透過載入 DISPLAY.SYS 驅動程式(5.02-02,9.01-01 中的示例)來為附加內碼表準備記憶體位置;
- 啟動 MODE.COM 實用程式以載入內碼表並使其中一個內碼表處於活動狀態(6.18,9.01-02 中的示例);
- 啟動 KEYB.COM 驅動程式以載入替代鍵盤佈局(參見 5.02-04,9.01-02 中的示例);
- 載入 NLSFUNC.EXE 驅動程式(5.02-03)以啟用在已準備好的內碼表和國家資料集之間切換。
WINDOWS-95 作業系統版本中的國家內碼表打包到四個資料檔案:EGA.CPI、EGA2.CPI、EGA3.CPI、ISO.CPI。每個國家內碼表包含兩個字元集中的 256 個字元:美國英語集(字元 32-127)和國家集(字元超過第 128 個)。因此,在任何國家語言和英語語言之間切換不需要交換內碼表,可以在任何單個國家內碼表中執行。這對於目前使用 MS-DOS 7 解決的所有有限的任務都足夠了。由於這個原因,內碼表交換已不再使用。
在不同的字元集(在一個內碼表內)之間切換是使用“熱”鍵完成的,由 KEYB.COM(5.02-04)或任何其他鍵盤驅動程式(例如 KEYRUS.COM,參見 5.02-05)安排。特別是,KEYB.COM 啟用 CTRL-rightSHIFT 鍵組合以切換到國家字元集,啟用 CTRL-leftSHIFT 鍵組合以切換回通用英語字元集。KEYRUS.COM 允許啟用各種鍵組合,包括上述組合。
Microsoft 提供了打包在特殊鍵盤資料檔案 KEYBOARD.SYS、KEYBRD2.SYS、KEYBRD3.SYS 中的鍵盤佈局表。其中,KEYBOARD.SYS 是唯一支援打字機形式的鍵盤佈局的鍵盤資料檔案。有關為特定國家選擇適當的鍵盤佈局(以及適當的內碼表)的詳細資訊,請參見附錄 A.02-2。Microsoft 專有國家適配的實現示例在文章 9.01-01 和 9.01-02 中顯示。儘管 Microsoft 的鍵盤檔案和內碼表包含全球大部分地區的國家資料,但它們不再受 Microsoft 支援,也不再開放更新。因此,迄今為止,已經為 DOS 開發了至少 5 個其他鍵盤驅動程式。本書中只描述了其中一個替代方案——KEYRUS.COM 驅動程式(5.02-05)。與大多數其他鍵盤驅動程式相反,KEYRUS.COM 是一個開放專案,提供建立新鍵盤佈局和對內碼表進行校正的方法。不幸的是,Microsoft 的鍵盤資料檔案和內碼表的格式不能被 KEYRUS.COM 接受。KEYRUS.COM 國家適配的示例在文章 9.04-01 和 9.09-01 中顯示。