中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-24 16:43
47,811 主题排行 / 349,909 发帖 / 今日 0 篇 / 48,262 会员排行
DOS开发编程 & 发展交流 (开发室) » [原创]SDLPal DOS版发布
可打印版本  441 / 10
第1楼 palxex 发表于 2026-07-24 01:31
初级用户 发帖 19 积分 195
[原创]SDLPal DOS版发布
不太清楚这个帖是发开发区还是游戏区更应景,若有不便,还望版主挪下帖 :-)
相信大家应该都玩过《仙剑》。SDLPal 作为它的开源引擎重实现,能跑官方 DOS/98 原版资源,这些年也添了不少新功能。一晃十几年过去,从 Windows 出发,Linux、Android、macOS、iOS,还有各种掌机主机,基本都覆盖到了。但最让人意难平的是,作为起点的 DOS 平台却一直缺席。
去年暑假,我终于没忍住,以jayschwa的SDL2 DOS版为基础,自己动手开搞 DOS 移植。这个SDL2是 DJGPP 的,在 DOSBox 上通过 VBE2 能显示真彩画面,但一到实机就各种翻车。在 VirtualBox/QEMU 里折腾了好久总算把自己真机画面点亮了,还没来得及高兴,接下来的声音又难倒了我——DOS 驱动现代音频硬件本来就够头痛,SDL 的音频模型还依赖多线程,这在 DOS 下几乎是死路一条。
于是接下来,我选择绕开 SDL,先把原版那种“时钟 ISR 里发 OPL 指令”的老路走通。幸好前几年 SBEmu 和 VSBHDA 横空出世,现代系统上总算也能用这个办法了。用了相当久的业余时间,之前 SDLPal 中为软件合成做的 OPL 增强终于被我磕磕绊绊地backport到了硬件上(幸亏了PalMusicFan 设计、Louyihua 实现的单 OPL3 FM 立体声),顺便也给 Windows/Linux 加了直接利用硬件 OPL 的路径——比如 CMI8738 这张在 Win11 x64 下居然还有驱动的老声卡。macOS 本来也想顺便搞了,但苹果那边 x86 路线说停就停,只好作罢。
然后,一个意外惊喜砸过来了:AJenbo 搞定了 SDL3 的 DOS 后端并进了上游!不但补全了 VGA 模式,还把之前我觉得不可能的“多线程”(靠手搓协程实现的黑科技)和音频(通过 SoundBlaster API 直连 SBEmu/VSBHDA)都给补齐了。万事俱备,我赶紧把之前写好的那套 ISR hook 框架搬到 SDL3 上,适配了原版的VGA视频模式,又给 SDL3 提了几个补丁完善调色板动画之类的优化。
于是现在 SDLPal 终于能在 DOS 上跑了。配置嘛,从奔腾1到zen3 5600 都试过没问题(有模拟有实机)。更低或更高的配置也可能跑得动——就算没浮点协处理器的 CPU 都可以用 djgpp 的 emu387 顶着——但性能就不好说了。如果你是 UEFI Only、没有 CSM 的机器,也可以试试用 CSMWrap 来启动进 DOS——不过目前还没听说有人成功跑进sdlpal,欢迎挑战。
跟原版 DOS 仙剑比起来,主要有这些变化:
能用官方的 Win95 版资源在 DOS 上跑,这是开天辟地头一回(但AVI解码对奔腾1就有点过于费劲了,最低也得MMX166这个级别才能解得比较顺)。但毕竟是现代逆向移植,最低配置做不到原版的 386 级别。但好处是不再受 580K 常规内存限制——DJGPP 能用 4G 空间,就算常规内存只剩 100K(主要是 SB DMA 占的,用 realopl 还能再省 50K),照样全功能运行。不过前提是总内存要大于 12M。
显示方面,低端机上默认用原版 VGA 模式,对 98 版 AVI 做了兼容处理,每个视频预生成调色板和 LUT,但 VGA 下颜色还是差点意思,这个确实没办法。机器好一点的,可以在配置里关掉 DOSForceMode13h 切到 VESA 模式,这个模式下AVI可以原样呈现了;分辨率可以自己试,我最高试到 1080P,看 log 就知道你的显卡支持哪些(但DOS下IO瓶颈颇为严重,平时最好是别把LogLevel开到0,也就是Debug)。但有一点,DOS 下全是软渲染,分辨率越高 CPU 越累,而且除了AVI什么变化都不会有。至于其他平台上高分辨率上最大的优势GLSL支持——也研究了一下有没有可能通过mesa llvmpipe支持,但测试结果表示单核无SIMD环境还是别想这么多了(哪位兄台折腾出了DOS上的真多核并发的话务必知会我一声)
音乐方面,现在可以在OPL3上播放立体声版的原版RIX(原版是在OPL2模式里播的,左右声道一样)。REALOPL(OPLCore=REAL)是默认,有硬件 OPL 的老机器能跑,用 SBEmu/VSBHDA 的新机器也能跑。CMI8738 这张卡甚至可以直接免驱用高位 I/O 端口: 用 Craig Hart 的 PCI.exe 查出基址,加上偏移 0x50(CMI8738 的硬件手册有写),填进 RealOPLPort 就行。CPU 够劲的话,Nuked(最精确也最吃配置)/DBINT/DBFLT/MAME 这些 OPL 软合成器、Timidity/TinySoundFont 波表 MIDI、MP3/Ogg/Opus 背景音乐替换,都能跟其他平台一样用。不过DOS原版的MPU-401支持还没有,留待以后了(2026.8:已追加)
文字方面,用了基于 Unicode/Unifont 的通用字库,也支持 BDF 扩充。翻译上支持大部分非复杂排版语言,但目前只听说英文社区搞了一个语言包

致敬:
PalMusicFan——测试狂魔、灵感来源、精神支柱
SDL DOS补丁集合的全体作者
Vogons 上帮忙在实机测试的兄弟们
SDLPal全体开发者和贡献者
仙剑早期研究者
SBEmu / VSBHDA 开源项目
狂徒创作群
大宇资讯

使用方法:选择最新的build下载后,将解压后的sdlpal.exe放在pal.exe同层目录启动即可,游戏内正常退出后同目录会有配置文件sdlpal.cfg生成,后续按需要编辑使用即可(DOS版尚未实现配置的GUI修改)

推荐BGM:动力火车《终于明白》、Arika《Blan_》二选一
以此,告慰青春。
第2楼 AlexZhang 发表于 2026-08-09 14:31
系统支持 发帖 439 积分 1,025
不错的成果,加入精华
第3楼 070 发表于 2026-08-09 20:04
高级用户 发帖 218 积分 663 来自 福建
很不错啊,啥时候研究一下,看看能不能实现真正的多线程。
第4楼 AlexZhang 发表于 2026-08-14 05:53
系统支持 发帖 439 积分 1,025
Originally posted by 070 at 2026-8-9 05:04:
很不错啊,啥时候研究一下,看看能不能实现真正的多线程。

这个不大可能,DOS 里没有真的 pthread 等多线程的 semantics. 只可能有 cooperative threading.
第5楼 palxex 发表于 2026-08-14 13:58
初级用户 发帖 19 积分 195
Originally posted by AlexZhang at 2026-8-14 05:53:

这个不大可能,DOS 里没有真的 pthread 等多线程的 semantics. 只可能有 cooperative threading.

感谢版主加精哈。
关于 DOS下的真多线程,首要的问题其实感觉还不是API,而是多核驱动。多年以来这也是个毫无进展的老大难问题,不过最近看到几个新项目,感觉有点曙光了
第一个是这个给win98写的多核驱动: JHRobotics/smp.vxd 。98也是没有真多核驱动的,但这位大佬为了跑自己移植的软渲染器硬是把这个搞出来了,虽然原理我是七窍通了六窍:一窍不通。同一位作者还写了 JHRobotics/pthread9x ,将用户态也打通了,不过这部分未来应该还需要一个真正的dos port。
第二个是sbemu的vdpmi(尚未开源),作者在vogons提到未来其稳定并开源之后准备考虑直接支持vxd驱动,也就意味着有把前一个作者的驱动桥接过来使用的可能。
第6楼 AlexZhang 发表于 2026-08-14 18:57
系统支持 发帖 439 积分 1,025
Originally posted by palxex at 2026-8-13 22:58:

感谢版主加精哈。
关于 DOS下的真多线程,首要的问题其实感觉还不是API,而是多核驱动。多年以来这也是个毫无进展的老大难问题,不过最近看到几个新项目,感觉有点曙光了
第一个是这个给win98写的多核驱动: JHRobotics/smp.vxd 。98也是没有真多核驱动的,但这位大佬为了跑自己移植的软渲染器硬是把这个搞出来了,虽然原理我是七窍通了六窍:一窍不通。同一位作者还写了 JHRobotics/pthread9x ,将用户态也打通了,不过这部分未来应该还需要一个真正的dos port。
第二个是sbemu的vdpmi(尚未开源),作者在vogons提到未来其稳定并开源之后准备考虑直接支持vxd驱动,也就意味着有把前一个作者的驱动桥接过来使用的可能。

显然就根本没有多核驱动嘛,你要想玩儿的话,完全可以 bringup 起来第二个核心不把他当 SMP去用。

DOS doesn't care, 甚至你可以 bringup 的时候 suck the brain out from DOS, 把 DOS 扔到 v86 模式里去(EMM386/QEMM 本来已经做了这种事情)

你还可使用 ACRN 一类静态分区 hypervisor,cpu0 给 DOS, cpu1 点起来 Linux?
第7楼 palxex 发表于 2026-08-15 10:02
初级用户 发帖 19 积分 195
底层相关的讨论就不继续参加了,知识储备不够,旁观大佬吧
昨天的版本加入了AIL32 DIGPAK支持(只支持watcom编译版),现在可以在原版不支持的其他老声卡上进行MIDI合成了,暂时只测试了SBPro和AWE64(更新:已通过dosbox-x测试了GUS和MT-32也正常工作;通过86box确认spkr XMID正常工作)
涉及的配置改变:
MIDISynth=AIL32(之前实现的MPU-401支持占掉了其他平台都在用的native)
MIDIClient=AIL32驱动dll文件名(注意实模式的ADV驱动不行)
SoundBank=GTL音色库文件名(创新给的AWE官方AIL32 DIGPAK驱动似乎把它无视了?放什么都行,合成效果没有任何变化;GUS的驱动看说明是让用户单独加载patches,可能也不依赖这里的配置;但也有一些驱动缺了这个就不干活)
相关下载:
AIL2原始开源包(有一堆编译好的驱动)http://www.thegleam.com/ke5fx/misc/AIL2.ZIP
PX播放器(有一些现成的音色分配文件)https://www.vogons.org/viewtopic.php?t=37630
现代重打包 https://github.com/Wohlstand/ail32-sandbox
DJGPP移植 https://github.com/volkertb/ail32-djgpp
目前找到的两个闭源AIL32驱动,其他人手头有的话请多多跟帖哈:
https://www.vogonsdrivers.com/files/downloader.php?fileid=51
http://files.retropc.se/hardware/SOUND/GRAVIS/UPD/GAIL3214.zip
第8楼 crazii 发表于 2026-08-20 21:45
初级用户 发帖 10 积分 22
支持一下!
搜驱动搜到了这里,想不到还有人哈。
多线程我感觉就算了哈,DOS程序单核就够用。
VDPMI现在兼容性还不行,VXD支持不知道要什么时候了。我现在也没有太多精力去维护。
目前我打算把ALSA全部移植到SBEMU,不过也没太多时间去做,看情况吧。
第9楼 crazii 发表于 2026-08-20 21:52
初级用户 发帖 10 积分 22
另外,GEMINI分析的很有道理,在vdpmi里加入vmm模拟层这个想法目前我还只停留在想法阶段,但是理论上是可行的,不过在行为上完全兼容windows的vmm估计很难,到时候我会试验一下可行性。目前的想法是只做简单粗糙的模拟,够SBEMU用就行了。
第10楼 AlexZhang 发表于 2026-08-20 23:05
系统支持 发帖 439 积分 1,025
Originally posted by crazii at 2026-8-20 06:45:
支持一下!
搜驱动搜到了这里,想不到还有人哈。
多线程我感觉就算了哈,DOS程序单核就够用。
VDPMI现在兼容性还不行,VXD支持不知道要什么时候了。我现在也没有太多精力去维护。
目前我打算把ALSA全部移植到SBEMU,不过也没太多时间去做,看情况吧。


alsa port to sbemu 应该不是很难,这个算是机械性劳动,用比较好的 models 是可以完成的比较好的。我怀疑 opus 5 一两天能移植到能用的程度。

我的个人经验是,dosbox-x 配合 Claude code (dosbox-x 的 serial output 作为 debugging harness) 是比较好用的。
第11楼 palxex 发表于 2026-08-23 00:21
初级用户 发帖 19 积分 195
Originally posted by crazii at 2026-8-20 21:52:
另外,GEMINI分析的很有道理,在vdpmi里加入vmm模拟层这个想法目前我还只停留在想法阶段,但是理论上是可行的,不过在行为上完全兼容windows的vmm估计很难,到时候我会试验一下可行性。目前的想法是只做简单粗糙的模拟,够SBEMU用就行了。

非常期待vdpmi支持vxd并开源的那一天。跑在dpmi下的dos程序本质上是用户态程序,有什么底层需求都得请求DPMI开发者添加。如果能完成vmm模拟,即使做不到兼容所有vxd驱动(能做到当然最好),至少也给没有完整dpmi开发能力的用户添加了一整个新的扩展面。至于应用嘛,user will find the way
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023