跳转到内容

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 实现的阶段。

1.01 PC 的 BIOS 键盘功能。

[编辑 | 编辑源代码]

开机后,计算机在 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 按钮实现。

备注
  1. ^ BIOS 设置程序可能会激活其他一些键,具体取决于 BIOS 版本。这些键允许更改一些参数设置,包括防止显示 BIOS 徽标的设置。如果没有 BIOS 徽标,您将能够看到当前 BIOS 的消息。
  2. ^ a b 一些(基本上已经过时)的 BIOS 版本使用 F1、F2、F10、ESC 键或 F3-F2、Ctrl-Alt-S、Ctrl-Alt-Ins、Ctrl-Alt-Esc 键组合启动 BIOS 设置程序。
  3. 一些在 1990 年代开发的“增强型”键盘型号有一个额外的 TURBO 键。TURBO-F11 键组合切换键盘锁定 ON/OFF,而 TURBO-F12 键组合切换蜂鸣器声音锁定 ON/OFF。大多数现代键盘没有 TURBO 键。
  4. 对于通过键盘控制电源,许多键盘型号配备了三个特殊键:POWER、SLEEP 和 WAKE UP。这些键旨在由 BIOS 使用,但它们的功能被拦截,特别是被 Windows XP 和 Windows Vista 拦截。

1.02 DOS 加载程序的键盘功能

[编辑 | 编辑源代码]

在 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。

备注
  1. 在 MS-DOS 的 7.00 版本中,DOS 加载程序会激活 F4 键以启动先前 DOS 版本的加载。从 7.10 版本开始,此选项已废弃。

1.03 批处理文件执行期间的键盘功能。

[编辑 | 编辑源代码]

当 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)的交互式会话。

1.06 键盘布局和字符集。

[编辑 | 编辑源代码]

默认情况下,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 中显示。

华夏公益教科书