在现代浏览器中体验经典DOS游戏

在现代技术的帮助下,有机会重新体验那些曾经风靡一时的经典MS-DOS游戏。尽管有些项目可能因为各种原因被遗弃,但它们所激发的创新精神和对技术的热爱仍然激励着。例如,一个自2014年以来似乎被遗弃的项目,就让非常兴奋。这个项目的目标是能够在现代方式下玩到经典的MS-DOS游戏,而不需要启动任何模拟器。这个想法也让想起了另一个类似的、仍在进行中的项目——SDLPoP,它开发了一个基于SDL的《波斯王子》版本,主要是通过反汇编过程获得的知识。

简而言之,作者使用了交互式反汇编器(IDA)来生成原始《Alley Cat》可执行文件的汇编代码,然后使用另一个工具将汇编代码转换为其C等价物。尽管输出是以C语法编写的,但它仍然包含类似寄存器的变量和以十六进制命名的方法,因此仍然难以理解:

然而,这正是事情变得有趣的地方。作者没有花时间去理解逻辑并以更易读(和可维护的方式)重写代码,而是实现了一个微型的8086模拟器,用C编写,可以用来运行转换后的代码。汇编指令如pushpop也被写成了C方法:

通过这种方法,除了可能需要修复转换器没有做好的地方,比如自动翻译成C代码的模糊跳转,基本上不需要修改转换后的代码。图形调用然后被修改为更新一个集中的CGA帧缓冲区,声明为bitmap,以便在需要时绘制到屏幕上:

C++ CFrameBuffer() { HDC hDC; BITMAPINFO bitmapinfo; hDC=CreateCompatibleDC(NULL); bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitmapinfo.bmiHeader.biWidth = Width; bitmapinfo.bmiHeader.biHeight = -Height; /* top-down */ bitmapinfo.bmiHeader.biPlanes = 1; bitmapinfo.bmiHeader.biBitCount = 32; bitmapinfo.bmiHeader.biCompression = BI_RGB; bitmapinfo.bmiHeader.biSizeImage = 0; bitmapinfo.bmiHeader.biClrUsed = 256; bitmapinfo.bmiHeader.biClrImportant = 256; m_pBuffer = NULL; m_ourbitmap=CreateDIBSection(hDC,&bitmapinfo,DIB_RGB_COLORS,&m_pBuffer,0,0); m_pDC=CreateCompatibleDC(NULL); m_Old=SelectObject(m_pDC,m_ourbitmap); DeleteDC(hDC); FillMemory(m_pBuffer,sizeof(DWORD)*Width*Height,0xb0); }

PC扬声器功能也被转换为Visual C的Beep()函数。移植的C代码还加载了原始的.EXE文件到内存中,以模拟MS-DOS上.EXE文件的加载方式。使用类似的方法,代码随后被转换为JavaScript,以便在浏览器中执行。

不幸的是,尽管努力复制作者的进展,提供的C代码缺少了几个重要部分。JavaScript端口中存在一些函数,但在C代码中却没有,这表明上传的代码很可能是不完整的。JavaScript端口仍然可以显示介绍屏幕(可以在这里看到一个演示),但之后会挂起,因为它的开发从未完成。

虽然没有时间继续这个项目,但对将介绍屏幕移植到JavaScript所付出的努力印象深刻。毕竟,转换后的C函数是晦涩的,没有有意义的名称。然而,不认为这是一种有效的方法,因为最终的C代码只是将汇编指令转换为C,而不是可维护的。决定使用PCjs,这是一个基于JavaScript的PC模拟器,并构建了一个PC XT映像,可以在浏览器中启动Alley Cat,只需几秒钟就可以准备好玩。

这可以通过以下HTML代码实现:

<body style="font-family: Helvetica, Arial, sans-serif; display: none"> <div id="ibm5160" style="width: 50%; height: 50%;"> </div> </body>

以及以下机器配置文件:

<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="machine.xsl" ?> <machine id="ibm5160" type="pcx86" border="1" pos="center" background="default"> <name pos="center">Alley Cat in a web browser</name> <computer id="xt-cga-640k" name="IBM PC XT"/> <ram id="ramLow" addr="0x00000" test="false" size="0xa0000" comment="0xa0000 (640Kb) size overrides SW1|ROM BIOS memory test has been disabled"/> <rom id="romBIOS" addr="0xfe000" size="0x2000" file="XTBIOS-REV1.json"/> <video ref="ibm-cga-keygrid.xml"/> <cpu id="cpu8088" model="8088" pos="left" padLeft="8px" padBottom="8px"> </cpu> <fdc id="fdcNEC" autoMount='{A: {name: "AlleyCat", path: "alleycat.json"}}' pos="left"> </fdc> <keyboard ref="us83-softkeys.xml"/> <chipset id="chipset" model="5160" sw1="01001001"/> <serial id="com1" adapter="1"/> <serial id="com2" adapter="2"/> <mouse serial="com2"/> </machine>

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485