OPUS是Microsoft内部开发人员用于Microsoft Word for Windows v1.1a的代码名-让我们从源代码编译它,看看它是否可以运行!Microsoft Word for Windows v1.1a版权所有©Microsoft 1989。
这篇博客记录了如何获取源代码,并将其转换成可以工作的Windows应用程序。编译器和开发工具在MS-DOS操作系统上运行,因为1989年没有可用的Windows开发工具。
注意:我将在本博客中通篇提及“DOS”。这意味着我说的是MicrosoftMS-DOS,尽管其中大部分同样适用于IBM PC-DOS和大多数其他DOS变体。
如果您是DOS操作系统的新手,我建议您使用Microsoft MS-DOS v6.22,这是DOS的1994年6月版本(最新发布的主要版本)的副本,并且有我们需要的所有工具(可能只有一个例外,我将在稍后介绍)。
理查德·布罗迪(Richard Brodie)等人于1982年开始开发名为Microsoft Word for DOS的文字处理器。理查德受雇于施乐帕洛阿尔托研究中心,因为他熟悉当时的未来主义文字处理机。
Word for DOS于1983年首次发布,并与MS-DOS的早期版本捆绑在一起。它使用(原始)图形,并支持鼠标的使用,但发布的评论褒贬不一。
用于DOS的Word v2.0于1985年发布,支持EGA图形,并具有拼写检查器。
Word v3.0 for DOS于1986年发布,支持Hercules显卡和附加打印机,哇!
Word V4.0 for DOS于1987年发布,支持VGA图形,具有文本和图形模式。
1989年对Word v5.5的升级增加了类似Windows/Mac的窗口和菜单,这是Word for Windows的前身,将于当年晚些时候发布。
第一个用于Microsoft Windows的所见即所得(WYSIWYG)字处理器的开发工作是在1988至1989年间完成的,最终由计算机历史博物馆发布了该版本。
阅读有关历史的更多信息,并从此处的计算机历史博物馆下载源代码:
是!。多么?。您可以使用老式PC或相对现代的PC,这些PC可以在(传统)BIOS模式下启动,也可以配置虚拟机管理程序来运行虚拟PC。您需要的所有工具都在上面链接的源代码转储中。它们都是在DOS下运行的,所以让我们来讨论一下这是如何工作的。
我将在Mac上使用VMware Fusion进行演示,但是您可以使用运行MS-DOS的任何合适的旧硬件或管理程序。一旦安装了DOS,您将需要检查有多少内存可用。这需要对DOS如何“看待”硬件有一个基本的了解。由于编译器似乎需要扩展内存,我将描述如何访问该类型的内存,以及如何配置DOS使其可供编译器使用。
此外,文件集相当大(对于DOS应用程序),所以我建议您可以通过创建源文件的CD-ROM映像来简化操作,这样它们就可以一次性复制到DOS机器上,但是这也需要设备驱动程序才能在DOS操作系统上工作,所以我在这里也会介绍这一点。
源代码很有趣,因为专有编译器需要一台至少有386处理器和4Mb RAM的计算机。这超出了当时许多个人电脑的规格,在当时肯定会被认为是“高端”的,因为大多数个人电脑都有1MB的内存,而典型的DOS应用程序只有640KB可用。其中,DOS本身使用大量内存,而应用程序使用剩下的内存。那么,我们的机器有多少内存呢?我们怎么才能给它更多呢?稍后会详细介绍这一点。
DOS需要内存管理的原因与其运行时所使用的CPU的历史记录密切相关。由于早期的许多程序都是用汇编/编译机器代码构建的,所以DOS操作系统与它运行的CPU紧密集成在一起。因此,它继承了这些CPU的限制,而这些CPU施加了奇怪的限制,因为每一代CPU都需要支持其之前所有CPU的代码库。
1979年,8位Intel8086/8088处理器可以寻址1024KB或1MB的RAM(8位数据总线、16位存储寄存器)。
1982年,16位英特尔80286处理器可以寻址高达16MB的随机存取存储器(16位数据总线,24位地址空间*)。
在1985年,32位的英特尔80386(以及后来的486)处理器(理论上)可以寻址高达4096MB或4 GB的内存**。
现代64位处理器具有40位、52位和64位可寻址存储器体系结构,因此它们可以支持1TB到4PB的RAM!
注*:24位地址空间相当于24×1字节的2次方=16,777,216字节或16MB。
注**:32位地址空间是32 x 1字节=4,294,967,296字节或4 GB的2次方,但由于当时RAM的主板限制(且成本极高),386台PC通常安装的地址空间远小于1 GB。
DOS和Windows的历史上充斥着由早期英特尔处理器体系结构管理的向后兼容性和内存管理限制造成的问题。
有五个可由DOS寻址的存储区。在引导时,可以使用CONFIG.SYS中调用的一个或两个设备驱动程序访问其中的每一个。HIMEM.SYS提供对扩展内存的访问,EMM386.EXE提供对扩展内存的访问。下面是这些内存类型的快速指南。
常规内存:0到640KB(或651,264)的内存是否也称为下部内存区(LMA)。
上部内存区:UMA是从640KB到1024KB或1MB的内存,也称为上部内存区(UMA),也称为上部内存块(UMB)。
扩展内存规范:XMS是从1MB到64MB的内存地址,但此规范还定义了UMA,因为如果没有HIMEM.SYS的支持,DOS无法访问UMA。
扩展内存规格:EMS使用在上部内存中定义的64KB页帧来提供对1MB以上内存的访问。使用NOEMS参数加载EMM386.EXE时,如果指定了AUTO参数或禁用了AUTO参数,DOS可以同时使用XMS和EMS。EMM386和其他内存管理器,模拟扩展内存区中的扩展内存,一点也不混乱!
高内存区:HMA为64KB,略高于1MB,DOS可以在引导时使用CONFIG.SYS中的DOS=HIGH将其自身加载到该区域。
传统内存是老式DOS应用程序驻留的地方。它们只能使用0-640Kb的内存,由于其中一些内存由DOS本身占用,因此它们在运行时可能只能访问不到500KB的RAM。这通常会限制在所谓的“实模式”下运行的应用程序,也就是说,16位应用程序仅限于传统内存。调用实数模式是因为实数内存地址被映射到应用程序中的可寻址内存。
这在短短几年内是可以接受的,直到640KB成为更复杂的应用程序(AKA游戏)的限制因素!新开发的Windows应用程序也需要更多内存,因此出现了扩展内存规范(XMS)。1MB以上的内存可由16位程序寻址。这是在286处理器中引入的,这些处理器实现了保护模式以访问高于这些DOS限制的内存,但也支持实模式下的传统内存访问,在需要时在模式之间切换。
您可以选择使用实际的软盘和USB软盘驱动器,从物理软盘创建软盘映像,或者从WinWorld等网站下载软盘映像。
您的物理机或虚拟机最少需要4MB的RAM,最多需要32MB,最多需要512MB的硬盘,上面有一个FAT16分区。如果硬盘物理上大于512MB,请将第一个分区的大小限制为您的DOS版本可以处理的最大大小。出于兼容性考虑,请将此第一个分区限制为512MB或更小。
如果机器具有上述最低规格,请从第一张DOS软盘启动。在版本5.0之后的版本中,将运行安装程序。按照说明选择目前的所有默认值。我们将在稍后的博客文章中试验安装选项。如果没有提示您安装,您通常可以在第一张磁盘上找到INSTALL.EXE应用程序,或者通过手动对硬盘分区来手动设置。请参阅下面名为“使引导盘成为可引导的…”一节。。
如果您在上一步中从软盘启动,但还没有可访问的硬盘,或者DOS的副本不包含安装程序,那么我们可以手动安装它。
从软盘运行FDISK,选择选项4并按Enter键查看现有分区结构。
如果存在现有分区,它应该显示FAT16文件系统中最多有511 MB,状态列应该通过在状态列中有一个“A”字符来显示它是否处于活动状态。
如果没有,我们将创建一个;按Escape键返回主菜单。
键入选项1,然后按Enter键。键入1并再次按Enter键以创建新的主分区。如果现有分区已在那里,它将发出警告。如果你很勇敢,你可以去掉它,重新创建一个,或者只使用已经存在的那个。
完成后,返回主菜单并选择选项2,使新分区处于活动状态,然后退出FDISK。回到DOS提示符下,我们需要格式化磁盘以使新分区可读,并且需要使用format命令上的“/s”开关将DOS引导系统传输到磁盘。“/v”选项将提示输入新的卷名。
按照提示操作,并为其指定有效的11个字符的卷名。这将创建引导盘,但在重新引导之前,请创建一个DOS目录。
在重新启动之前,创建一个默认的CONFIG.SYS和AUTOEXEC.BAT。没有文件编辑器吗?没问题,键入以下命令将文本从控制台复制到名为config.sys的文件中:
然后按Ctrl-Z退出并保存输出。这会将控制台(CON)的内容复制到磁盘。现在,您在C:驱动器的根目录中有一个CONFIG.SYS文件。
典型的MS-DOS是使用DOS在引导时读取的两个文件(COMMAND.COM本身除外)进行配置的。这些是(按照它们被访问的顺序)。
CONFIG.SYS包含引导时加载的设备驱动程序和配置选项的列表,它驻留在引导盘的根目录中。
AUTOEXEC.BAT在机器引导和加载CONFIG.SYS中的设备驱动程序后运行。这两个配置文件都必须存在于引导驱动器的根目录中;A:用于从软盘引导的系统,C:用于硬盘系统。
DOS在没有这些文件的情况下可以正常启动,但是大多数应用程序都会向它们添加配置选项,以确保它们运行或优化它们的运行方式。作为安装过程的一部分,较新版本的DOS也会尝试通过更改这些文件来进行自我配置。
在引导时加载HIMEM.SYS是不够的,我们需要配置EMM386.EXE或第三方扩展内存管理器。我们很快就会看到这些。首先,回顾英特尔架构的历史,因为它与我们使其正常工作所需的内存管理相关。
要配置对扩展内存的访问,我们将使用DOS编辑器编辑C:\CONFIG.SYS,如下所示:
如果找不到该文件,只需将新文件保存为C:\CONFIG.SYS即可。在第一行添加以下文本:
CONFIG.SYS中可能已经有其他条目,但请将该条目添加到第一行。完成后,按Alt-F访问文件菜单,按S保存,然后再次按Alt-F并按X退出。重新启动,您应该会看到内存测试,然后出现DOS提示符。“C>;”。
在DOS提示符下键入MEM命令,查看DOS应用程序现在有多少可用内存:
如您所见,DOS只有571KB用于应用程序的常规内存,但是它有几乎30MB的扩展内存(XMS),并且没有扩展内存(EMS)。
原因是我已经为这个虚拟机分配了32MB的RAM,您的硬件/虚拟机可能看起来不一样。
看起来我们需要访问扩展内存(EMS)才能让编译器运行,那么我们该怎么做呢?这就是EMM386.EXE的用武之地;该内存驱动程序随更高版本的DOS一起提供,以支持Microsoft Windows和其他内存密集型DOS应用程序,包括一些DOS游戏。
如果我们通过CONFIG.SYS加载内存管理驱动程序,我们可以看到它分配了多少RAM。您的config.sys应该在文件顶部有以下两行。可能还有其他条目,但前两行应按此顺序位于文件顶部。
将此屏幕截图与加载EMM386之前的屏幕截图进行比较,您可以看到检测到的常规内存是相同的,但我们现在可以运行的最大程序大小是612KB(高于571KB),因为我们使用DOS=HIGH将DOS加载到上层内存中。我们还仿真了扩展内存(XMS)范围内的扩展内存(EMS)。
这显示了扩展内存占用的连续内存区。每个“P”字符都是1KB,因此每行代表16KB的可分配空间。不应分配非16KB边界,因为它们不是连续的。
这是足够的常规内存和内存让我编译Word,但是您的空闲内存可能会因使用的DOS版本和如何配置而有所不同。
如果您需要更多常规内存和/或扩展内存,请尝试第三方扩展内存管理器,如QEMM、JEMM或UMBPCI,它们可能使用较少的常规内存,但仍提供兼容的扩展内存。
一些应用程序需要临时空间来存储文件和转储内存等,因此使用MD(Make Directory)命令为临时文件创建一个目录,然后使用set命令将TEMP环境变量指向该目录。
然后,通过将其添加到autoexec.bat来确保它是在引导时设置的,键入:
OPUS是Microsoft Word for Windows v1.1a的代号。提供的源代码包括C代码和汇编器、专有编译器、链接器、一些专有补丁工具、开发人员说明和文档。这些文件包含制作16位可执行文件所需的一切,该文件无需修改即可在Windows v2.x、Windows v3.x和OS/2 v2.x上运行。
您将需要至少612KB的常规内存以及至少4MB的扩展内存来编译此软件,因此您可能需要参考DOS配置指南来为此配置DOS。
我使用VMware Fusion和MS-DOS v6.22作为来宾操作系统创建了来宾操作系统,并在Windows XP下配置了DOS VDM,这在这两种环境中都有效。
这将允许您编译Microsoft Word v1.1a,但是除非您从build目录单独运行op1.bat,否则链接器通常会失败。我还没有弄清楚为什么在DOS…下会发生这种情况。然而,在Windows XP下,您不仅可以模拟DOS提示符,还可以模拟扩展和扩展的内存,并且它可以工作!那怎么做呢?
主机可以是Windows、Linux或MacOS,我用的是Mac,但这并不重要,解压缩文件并创建包含所有文件的ISO CD-ROM映像文件。
编译器需要在引导驱动器上运行,因此将它们全部放在C:\SRC中。由于它比一张或两张软盘大得多,所以我创建了一个CD-ROM映像,并将其挂载到我的VM中。如果您有物理硬件,也可以执行相同的操作,或者参见DOS配置指南,说明如何使用物理驱动器或ISO映像文件从DOS访问CD-ROM。
注意:这些步骤中的一些是从Beta Archive https://www.betaarchive.com/forum/论坛的评论中收集的。
为每个构建创建一个新的构建目录,并更新fast.ini以指向该新构建。
在编译之前,有两个文件需要修改以适合您的环境。我从Betaarchive的一篇论坛帖子中获得了这些设置中的大部分。转到Tools目录:
编辑mo1.bat,使其指向您的目录结构,而不是它们在源版本中指定的网络驱动器:
并更改以下行以适合您的文件路径,它们应以C:\SRC\opus开头:
更改任何其他PATH语句以匹配您的路径,它们可能具有C:以外的驱动器号,因此请将这些语句和路径更改为匹配,以便它们以=C:\SRC\opus\开头。
没有错误!?目标文件将放在C:\SRC\opus\BUILD1中,如果链接成功,则EXE文件将在C:\SRC\opus\program中找到。
如果您使用的是Windows XP(未来帖子中的配置说明),则成功如下所示:
如果遇到内存错误,可能没有足够的常规或扩展内存,或者在AUTOEXEC.BAT中省略了TEMP=语句,或者在CONFIG.SYS中省略了FILES=语句,或者在FAST2.INI中存在语法错误,请再次检查这些设置。
尝试从build目录运行mo1.bat。如果这起作用,可能是因为有足够的常规内存,但没有足够的连续扩展内存。
尝试在Windows XP下的DOS VDM中运行相同的构建过程,因为它似乎可以正确地将RAM分配给每种内存类型。虽然生成的EXE不能在Windows XP下运行,但它将生成将在Windows v2或v3计算机上运行的代码。请参阅Windows XP配置指南。
注意:运行编译后,mo1.bat文件将重置PATH环境变量,使其不再包含DOS目录。这意味着,除非您为每个命令指定DOS目录的完整路径,否则某些DOS命令可能不再起作用。将C:\dos添加到mo1.bat中的路径,或者只需重新启动即可恢复以前的设置。
总而言之,只需将C:\SRC\opus\Program中的所有文件复制到Windows v2.x或v3.x计算机并运行WINWORD.EXE。就是这样!
在某种程度上,我将使用此代码构建一组软盘来运行正确的安装,但目前这足以使其运行以用于测试目的。