为什么 FreeDOS 有 16 种颜色

为什么文本只有这么有限的调色板,为什么 FreeDOS 使用这些颜色和色调,而不是其他颜色?答案和技术领域的许多事物一样,都源于历史。
56 位读者喜欢这篇文章。
Compute like it's 1989

LSE 图书馆。由 Opensource.com 修改。CC BY-SA 4.0

如果您仔细观察过 FreeDOS,您可能已经注意到文本颜色范围有限——16 种文本颜色和 8 种背景颜色。这与 Linux 显示文本颜色的方式类似——您或许可以更改 Linux 终端中使用的文本颜色,但您仍然只能使用 16 种文本颜色和 8 种背景颜色。

terminal colors

DOS 文本有 16 种颜色和 8 种背景颜色

(Jim Hall, CC-BY SA 4.0)

为什么文本只有这么有限的调色板,为什么 FreeDOS 使用这些颜色和色调,而不是其他颜色?答案和技术领域的许多事物一样,都源于历史

PC 彩色的起源

为了解释为什么文本只有 16 种颜色,让我给您讲一个关于第一台 IBM 个人电脑的故事。故事的某些部分可能有些杜撰,但基本事实是接近的。

IBM 于 1981 年发布了 Personal Computer 5150(“IBM PC”)。PC 使用简单的显示器屏幕,以绿色显示文本。由于这种显示器只能使用一种颜色,因此被称为单色(“IBM 5151 单色显示器”,配备 IBM 单色显示适配器卡,或“MDA”)。

同年,IBM 发布了 PC 的更新版本,该版本拥有一项惊人的技术成就——彩色!新的 IBM 5153 彩色显示器依赖于新的 IBM 彩色图形适配器,或“CGA”。正是由于最初的 CGA,所有 DOS 文本都继承了它们的颜色。

但在我们深入探讨之前,我们首先需要了解一些关于颜色的知识。当我们谈论计算机屏幕上的颜色时,我们谈论的是混合三种色光——红色、绿色和蓝色——的不同值。您可以混合不同级别(或“亮度”)的红光、绿光和蓝光,以创建几乎任何颜色。仅混合红光和蓝光,您会得到品红色。混合蓝光和绿光,您会得到青色或水蓝色。均匀混合所有颜色,您会得到白色。没有任何色光,您会看到黑色(没有颜色)。

light colors

混合红光、绿光和蓝光以获得不同的颜色

(Jim Hall, CC-BY SA 4.0)

IBM 5153 彩色显示器通过点亮阴极射线管(“CRT”)上微小的红色、绿色和蓝色荧光点向用户呈现颜色。这些微小的点非常靠近地排列在一起,并且以红色、绿色和蓝色点三元组形成“像素”的模式排列。通过控制一次点亮哪些荧光点,IBM 5153 彩色显示器可以显示不同颜色的像素。

CRT pixels

每个红色、绿色和蓝色三元组都是一个像素

(Jim Hall, CC-BY SA 4.0)

顺便说一句,即使是现代显示器也使用红色、绿色和蓝色点的组合来表示颜色。现代计算机的不同之处在于,每个像素不是使用微小的荧光点,而是使用红色、绿色和蓝色 LED 灯的三元组——通常并排排列。计算机可以打开或关闭每个 LED 灯,以混合每个像素中的红色、绿色和蓝色。

LCD pixels

每个红色、绿色和蓝色三元组都是一个像素

(Jim Hall, CC-BY SA 4.0)

定义 CGA 颜色

IBM 工程师意识到,他们可以通过混合每个红色、绿色和蓝色像素来显示多种颜色。在最简单的情况下,您可以假设单个像素中的每个红色、绿色和蓝色点要么是“开”要么是“关”。正如任何计算机程序员都会告诉您的那样,您可以将“开”和“关”表示为二进制——1(1=开)和 0(0=关)。

用 1 或 0 表示红色、绿色和蓝色意味着您可以组合多达八种颜色,从 000(红色、绿色和蓝色都关闭)到 111(红色、绿色和蓝色都打开)。请注意,位模式像“RGB”一样,因此 RGB=001 是蓝色(只有蓝色打开),RGB=011 是青色(绿色和蓝色都打开)

  000 黑色
  001 蓝色
  010 绿色
  011 青色
  100 红色
  101 品红色
  110 黄色
  111 白色

但这只是最简单的情况。一位特别聪明的 IBM 工程师意识到,只需添加一位,就可以将颜色数量从八种翻倍到十六种。因此,我们可以使用像 iRGB 这样的位模式,而不是像 RGB 这样的位模式。我们将这个额外的“i”位称为“强度”位,因为如果我们将“强度”位设置为 1(开),那么我们将以全亮度点亮红色、绿色和蓝色荧光点;如果“强度”位为 0(关),我们可以使用一些中等亮度。

通过这个简单的修复,CGA 现在可以显示十六种颜色了!为了简单起见,IBM 工程师将高强度颜色称为常规颜色名称的“亮”版本。“红色”与“亮红色”配对,“品红色”与“亮品红色”配对。

  0000 黑色   1000 亮黑色
  0001 蓝色   1001 亮蓝色
  0010 绿色   1010 亮绿色
  0011 青色   1011 亮青色
  0100 红色   1100 亮红色
  0101 品红色   1101 亮品红色
  0110 黄色   1110 亮黄色
  0111 白色   1111 亮白色

哎呀!等等!这实际上不是十六种颜色。如果您注意到 iRGB=0000(黑色)和 iRGB=1000(亮黑色),它们都是相同的黑色。没有什么颜色可以“亮”,所以它们都只是普通的黑色。这意味着我们只有十五种颜色,而不是我们希望的十六种。

但是 IBM 有聪明的工程师为他们工作,他们意识到如何解决这个问题以获得十六种颜色。IBM 实际上并没有实现直接的 RGB 到 iRGB,而是实现了一种修改后的 iRGB 方案。通过这种更改,IBM 为每个荧光点设置了四个亮度级别:完全关闭、三分之一亮度、三分之二亮度和全亮度。如果“强度”位关闭,那么每个红色、绿色和蓝色荧光点将以三分之二亮度点亮。如果您将“强度”位打开,则 RGB 颜色中的任何零都将以三分之一亮度点亮,而 RGB 颜色中的任何一都将以全亮度点亮。

让我用另一种方式向您描述,使用 Web 颜色代码表示。如果您熟悉 HTML 颜色空间,您可能知道可以使用 #RGB 表示颜色,其中 RGB 表示红色、绿色和蓝色值的组合,每个值介于十六进制值 0 到 F 之间。因此,使用 IBM 修改后的 iRGB 定义,iRGB=0001 是 #00a(蓝色),iRGB=1001 是 #55f(亮蓝色),因为对于高强度颜色,RGB=001 中的所有零都以三分之一亮度(大约在 0 到 F 刻度上的“5”左右)点亮,而 RGB=001 中的所有一都以三分之二亮度(大约在 0 到 F 刻度上的“A”左右)点亮。

  0000 黑色   1000 亮黑色
  0001 蓝色   1001 亮蓝色
  0010 绿色   1010 亮绿色
  0011 青色   1011 亮青色
  0100 红色   1100 亮红色
  0101 品红色   1101 亮品红色
  0110 黄色   1110 亮黄色
  0111 白色   1111 亮白色

有了这些颜色,我们终于完成了!我们拥有从 iRGB=0000(黑色)到 iRGB=1111(亮白色)以及介于两者之间的每种颜色的全光谱。就像彩虹的颜色一样,这很美丽。

但是,不。等等。这里有些不对劲。我们实际上还无法复制彩虹的所有颜色。我们在小学学到的方便的助记符是 ROYGBIV,以帮助我们记住彩虹的颜色从红色、橙色、黄色、绿色、蓝色、靛蓝色和紫色。我们修改后的 iRGB 颜色方案包括红色、黄色、绿色和蓝色——我们可以“伪造”靛蓝色和“紫色”。但我们缺少橙色。哎呀!

rainbow

美丽的彩虹 - 但不幸的是,它包含橙色

(Paweł Fijałkowski, 公共领域)

为了解决这个问题,聪明的 IBM 工程师对 RGB=110 进行了最后一次修复。高强度颜色 (iRGB=1110) 以全亮度点亮红色和绿色荧光点以产生黄色。但在低强度颜色 (iRGB=0110) 下,他们以三分之二亮度点亮红色,以三分之一亮度点亮绿色。这使 iRGB=0110 变成橙色——尽管后来它被称为“棕色”,因为 IBM 不得不在某个地方搞砸标准名称。

  0000 黑色   1000 亮黑色
  0001 蓝色   1001 亮蓝色
  0010 绿色   1010 亮绿色
  0011 青色   1011 亮青色
  0100 红色   1100 亮红色
  0101 品红色   1101 亮品红色
  0110 棕色   1110 黄色
  0111 白色   1111 亮白色

这就是 CGA——以及扩展的 DOS——获得十六种颜色的方式!如果您好奇,这也是为什么有“亮黑色”颜色的原因,即使它只是一种灰色。

表示颜色(位和字节)

但您可能想知道:如果 DOS 可以显示十六种文本颜色,为什么它只能显示八种背景颜色?为此,我们需要快速了解一下计算机如何将颜色信息传递给 CGA 卡。

简而言之,CGA 卡期望每个字符的文本颜色和背景颜色都编码在一个字节数据包中。那是八位。那么这八位来自哪里呢?

我们刚刚了解了 iRGB(四位)如何生成十六种颜色。文本颜色使用 iRGB,或四位。背景颜色仅限于八种低强度颜色(RGB 或三位)。加起来只有七位。那么缺少的第八位在哪里?

最后一位被保留用于 DOS 时代最重要的用户界面元素——闪烁文本。虽然今天的闪烁文本可能令人讨厌,但在 1980 年代初期,闪烁文本是表示关键信息(例如错误消息)的友好方式。

将这个“闪烁”位添加到三个背景颜色位 (RGB) 和四个文本颜色位 (iRGB) 中,就构成八位或一个字节!计算机喜欢以完整字节计数,这使其成为将颜色(和闪烁)信息打包到计算机的便捷方式。

因此,表示颜色(和闪烁)的完整字节是 Bbbbffff,其中 ffff 是文本颜色的 iRGB 位模式(从 0 到 15),bbb 是低强度背景颜色的 RGB 位模式(从 0 到 7),而 B 是“闪烁”位。

十六种文本颜色和八种背景颜色的限制一直延续至今。当然,DOS 受限于此调色板,但即使像 GNOME 终端这样的 Linux 终端模拟器仍然受限于十六种文本颜色和八种背景颜色。当然,Linux 终端可能允许您更改使用的特定颜色,但您仍然仅限于十六种文本颜色和八种背景颜色。为此,您可以感谢 DOS 和最初的 IBM PC。不用客气!

接下来阅读什么

FreeDOS 入门

它看起来像复古计算,但它是一个现代操作系统,您可以用来完成工作。

(通讯员)
2021 年 6 月 1 日
标签
photo of Jim Hall
Jim Hall 是一位开源软件倡导者和开发人员,最著名的是他在 GNOME 中的可用性测试以及作为 FreeDOS 的创始人 + 项目协调员。

2 条评论

很棒的文章。一些有趣的附加信息。

IBM 的原始单色显示适配器也为每个字符使用 8 位属性值。闪烁位仍然使文本闪烁。最低有效的前景色位(CGA 的蓝色位)使文本带有下划线。

大多数 VGA 适配器(不清楚是来自 IBM 还是后来的附加组件)都允许您将屏幕配置为支持 MDA 样式的下划线。如果您在不切换到完整的 MDA 样式显示(IBM 的卡从未支持过,但许多第三方卡支持)的情况下执行此操作,那么蓝色文本最终会带有下划线。不是很有用,但这就是发生的事情。

此外,可以调整视频卡中的寄存器(绝对适用于 VGA。我认为也适用于 EGA 和 CGA)以禁用闪烁,这使您可以使用所有 16 种颜色作为背景。

最后,应该注意的是,橙色和棕色实际上是相同的颜色。这只是关于亮度以及您如何感知它的观看环境的问题。此视频比任何文本都能更好地演示这个想法:https://youtu.be/wh4aWZRtTwU

感谢您的精彩评论,David!我完全忘记了带下划线的文本。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.