我个人开发出了一个“WINSail” 软件,其完全是免费的一套软件,完整的
“库文件”、“头文件”“说明书”和“源代码”可在"www.FirstSail.B2B.Cn中下载得到。
它基于DOS系统,用Borland C++3.1语言,在Large大模式下开发出来的软件开发包。虽然说完整的软件包大约只有450K左右,却能在DOS下生成的程序具有与WIN9x完全相同的界面,拥有Group、Label、Edit、ComboBox、Button、Radio、Check、ListBox、Grid、ScrollBar、Desktop、ToolsBar、StatusBar、Menu、PopuMenu、Window、Dialog、ICON、Bitmap、示波器等界面元素,支持鼠标,控件的操作99.9%与Windows兼容!可加载运行脚本对话框;支持Socket套接字编程;具有完整窗口图形界面的最小应用只有150K左右,可在只有1M的电子盘中运行;具有0.5uS微秒精确度的delay函数。可以说 DOS + WinSail >= Windows CE
“WinSail工业控制开发系统”目前支持:
(1) “WinSail”的API与“C++ For DOS”函数库“共存”,特别是与C语言的图形函数BGI共存。
(2) 支持具有优先级的多任务,同时可达到50个任务。(注:可配置脚本文件来不需要多任务支持,使程序运行于单任务中) 。
(3) 支持数据库,生成的文件与Foxpro 2.6库兼容,可在微软Office的Excel中直接打开。
(4) 使用16*16的简体、繁体中文字库、8*16的英文字库,支持TrueType字库。
(5) “对话框”能在Visual C++预先做好界面,然后通过转换软件,能使Windows的对话框界面变成“WinSail”系统的对话框的界面代码源文件或脚本文件,充分利用Visual的优越性,使DOS平台的应用程序界面开发“不再难”!!!!!
(6) 支持600*480*16、600*400*256、800*600*256、1024*768*256多种分辩率。
(7) 支持Group、Label、Edit、ComboBox、Button、Radio、Check、ListBox、Grid、ScrollBar、Desktop、ToolsBar、StatusBar、Menu、PopuMenu、Window、Dialog、ICON、Bitmap、MessageBox、示波器、多元纵坐标示波器等界面元素。
(8) 支持扩展内存--XMS、扩充内存EMS的内存访问。
(9) 支持文本注册表--INI文件的读写,在写键值时,可保证在键值后面的“注释内容”仍然还存在。
(10) 支持面向对象的I/O访问,屏蔽底层I/O口。
(11) 具有COMM口通讯接口,支持多种校验位,包括“没有校验位”、“奇校验位”、“偶校验位”、“校验位永为1”、“校验位永为0”。后两种校验方式多用在多机通讯中区别“地址”和“数据”。
(12) 支持条形码显示。包括EAN_8、UPC_A、UPC_E、EAN_13(商品码)、ISBN、ISSN、39、128、Codabar、交叉25码
(13) 窗口支持“用I/O口定义的虚拟键盘”、“窗口定时器”、“空闲时调用某函数”、“窗口刷新时调用某函数”等多种回调函数。
(14) 多种常用数学运算,包括“低通”、“高通”、“带通”、“带阻”滤波器系数的产生(可加矩形窗、三角形窗、汉宁窗、海明窗、布莱克窗、Sin(x)/x窗、余弦窗、凯塞窗),滤波、插值、拟合、微积分、相关分析、FFT、DFT等。
(15) 统计进程SPC和直方图、测量的可靠性和重复性GageR&R报表。
(16) 支持“Bitmap”、“ICON”图像文件的显示、“Wav”声音文件的播放。
(17) 支持“普通示波器”和“多纵坐标示波器”。
(18) 支持Socket 套接字编程。
“库文件”、“头文件”“说明书”和“源代码”可在"www.FirstSail.B2B.Cn中下载得到。
它基于DOS系统,用Borland C++3.1语言,在Large大模式下开发出来的软件开发包。虽然说完整的软件包大约只有450K左右,却能在DOS下生成的程序具有与WIN9x完全相同的界面,拥有Group、Label、Edit、ComboBox、Button、Radio、Check、ListBox、Grid、ScrollBar、Desktop、ToolsBar、StatusBar、Menu、PopuMenu、Window、Dialog、ICON、Bitmap、示波器等界面元素,支持鼠标,控件的操作99.9%与Windows兼容!可加载运行脚本对话框;支持Socket套接字编程;具有完整窗口图形界面的最小应用只有150K左右,可在只有1M的电子盘中运行;具有0.5uS微秒精确度的delay函数。可以说 DOS + WinSail >= Windows CE
“WinSail工业控制开发系统”目前支持:
(1) “WinSail”的API与“C++ For DOS”函数库“共存”,特别是与C语言的图形函数BGI共存。
(2) 支持具有优先级的多任务,同时可达到50个任务。(注:可配置脚本文件来不需要多任务支持,使程序运行于单任务中) 。
(3) 支持数据库,生成的文件与Foxpro 2.6库兼容,可在微软Office的Excel中直接打开。
(4) 使用16*16的简体、繁体中文字库、8*16的英文字库,支持TrueType字库。
(5) “对话框”能在Visual C++预先做好界面,然后通过转换软件,能使Windows的对话框界面变成“WinSail”系统的对话框的界面代码源文件或脚本文件,充分利用Visual的优越性,使DOS平台的应用程序界面开发“不再难”!!!!!
(6) 支持600*480*16、600*400*256、800*600*256、1024*768*256多种分辩率。
(7) 支持Group、Label、Edit、ComboBox、Button、Radio、Check、ListBox、Grid、ScrollBar、Desktop、ToolsBar、StatusBar、Menu、PopuMenu、Window、Dialog、ICON、Bitmap、MessageBox、示波器、多元纵坐标示波器等界面元素。
(8) 支持扩展内存--XMS、扩充内存EMS的内存访问。
(9) 支持文本注册表--INI文件的读写,在写键值时,可保证在键值后面的“注释内容”仍然还存在。
(10) 支持面向对象的I/O访问,屏蔽底层I/O口。
(11) 具有COMM口通讯接口,支持多种校验位,包括“没有校验位”、“奇校验位”、“偶校验位”、“校验位永为1”、“校验位永为0”。后两种校验方式多用在多机通讯中区别“地址”和“数据”。
(12) 支持条形码显示。包括EAN_8、UPC_A、UPC_E、EAN_13(商品码)、ISBN、ISSN、39、128、Codabar、交叉25码
(13) 窗口支持“用I/O口定义的虚拟键盘”、“窗口定时器”、“空闲时调用某函数”、“窗口刷新时调用某函数”等多种回调函数。
(14) 多种常用数学运算,包括“低通”、“高通”、“带通”、“带阻”滤波器系数的产生(可加矩形窗、三角形窗、汉宁窗、海明窗、布莱克窗、Sin(x)/x窗、余弦窗、凯塞窗),滤波、插值、拟合、微积分、相关分析、FFT、DFT等。
(15) 统计进程SPC和直方图、测量的可靠性和重复性GageR&R报表。
(16) 支持“Bitmap”、“ICON”图像文件的显示、“Wav”声音文件的播放。
(17) 支持“普通示波器”和“多纵坐标示波器”。
(18) 支持Socket 套接字编程。
Gemini 解答
这是一套在 2000 年代初典型的面向工业控制(IPC / 工控机)场景的 16 位 DOS GUI 与运行库方案(WinSail)。其核心思路是基于 Borland C++ 3.1(BC31)构建一套仿 Windows/MFC 编程风格的轻量级开发框架,以兼顾 DOS 的高实时性与 Windows 风格的交互界面。以下对其关键技术实现、运行机制及技术局限进行分析与纠正。
1. 内存模型与实模式限制
- 编译模型:工程采用 BC31 的
Large内存模型(代码与数据指针默认均为 32 位far指针,每个代码/数据段限制为 64KB)。由于整个框架运行在 16 位 x86 实模式下,受 640KB 常规内存限制极为严重。- 数据缓冲机制:原帖提到 TCP/IP 协议栈的数据包及部分资源被放置在 XMS(扩展内存)中,这是 16 位实模式应用突破 640KB 限制的典型做法。实模式下访问 XMS 依赖
HIMEM.SYS提供的 INT 2Fh(AX=4310h 获取驱动入口地址),通过 Block Move(功能号 0Bh)在常规内存与扩展内存之间来回拷贝数据,会产生一定的 CPU 拷贝开销。- 代码中
_strlen的拼写错误:第 21 楼示例代码中声明的extern unsigned _strlen = 60u * 1024u;实际应为_stklen(Borland C++ 的堆栈长度控制变量)。在 Large 模型下,默认堆栈较小,复杂 GUI 回调及中断重入极易引发堆栈溢出,因此需显式将_stklen扩大到 60KB 左右。
2. 多任务与中断调度机制
- 调度原理:内核通过挂接 INT 08h(硬件时钟中断,IRQ0),重设 8253/8254 PIT(可编程定时计数器)Channel 0 的计数初值为 2048(原始值为 65536)。时钟频率由约 $18.2\text{ Hz}$(周期约 $54.925\text{ ms}$)提升至约 $586\text{ Hz}$(周期约 $1.71\text{ ms}$,即帖中所述的 $55/32\text{ ms}$)。
- DOS 重入问题与“DOS 忙”检查:DOS 内核(INT 21h)本身是单重入的。抢占式多任务切换必须配合以下两个底层机制:
- InDOS 标志位:通过 INT 21h / AH=34h 获取 InDOS 标志的内存指针。当
*InDOS != 0时,表明 DOS 正处于系统调用中,调度器禁止切换任务上下文。- Error Mode 标志位(Critical Error Flag):发生 INT 24h 严重错误时同样不可重入。
- 定时器链保护:修改 PIT 频率后,由于原本依赖 18.2Hz 的 BIOS 时钟服务(如系统时间更新、软驱停转延时)会被加速,框架必须对原始 INT 08h 进行分频调用(每 32 次自定义时钟中断仅调用一次原始 BIOS INT 08h),否则会导致系统时间异常飞快。
3. 图形子系统与分辨率支持
- 显示驱动架构:工程包含
EgavgaF.Obj和SVga_Dev.h。EgavgaF.Obj是 Borland BGI(Borland Graphics Interface)的标准驱动目标文件;而对于 800×600×256 或 1024×768×256 分辨率,则跳过了传统 BGI,直接通过 VESA VBE(Video BIOS Extensions, INT 10h AH=4Fh)设置显示模式并进行 Bank Switching(换页机制,通过 64KB 窗口映射 0xA0000 显存)。- Windows 2000 下的限制原因:原帖提到在 Windows 2000 NTVDM(虚拟 DOS 机)下只能运行 640×480×16 色。这是因为 Windows NT 内核(NT4/2000/XP)的 NTVDM 完全虚拟化了显卡底层,移除了对全屏自定义 VESA Bank 切换及非标准 VGA 寄存器(如 Twk16/ModeX)的直接硬件访问权限,仅对标准的 VGA Mode 12h(640×480 16色)提供稳定的软件仿真。
4. 0.5 微秒延时精度的工程边界
- 原帖宣称具有“0.5uS 微秒精确度的 delay 函数”。在实模式 DOS 下,由于时钟中断(PIT)中断周期无法达到微秒级,此类微秒/亚微秒级延时通常通过以下两种方式之一实现:
- 直接读取 PIT 计数器:向端口
0x43写入锁定命令(Latch Command),读取 Channel 0 计数值(基准频率约 $1.19318\text{ MHz}$,计数周期约 $0.838\text{ \mu s}$),达不到精确的 $0.5\text{ \mu s}$。- TSC 时间戳计数器:在 80386 编译模式下如果直接内嵌汇编调用 Pentium 引入的
RDTSC指令(读取 CPU 周期数),理论上在主频大于 2MHz 的机器上能达到亚微秒级精度。但在 DOS 实模式下,如果未关闭可屏蔽中断(CLI),延时期间发生的中断处理会严重破坏实际延时精度。
5. 网络协议栈实现基础
- Packet Driver 标准:系统依赖网卡 Packet Driver(即遵循 FTP Software 的 PC/TCP Packet Driver 规范,挂接在 INT 60h ~ 0x80h 之间的软件中断)。
- 协议栈设计:在 DOS 实模式下运行轻量级 TCP/IP(如早期基于 PC/TCP、WATTCP 改造的协议栈),由于没有操作系统原生线程支持,底层依靠轮询(Polling)或 Packet Driver 的接收中断回调处理报文。因实模式栈空间极度受限,复杂的 TCP 滑动窗口与乱序重组通常会被精简。
6. VC++ 对话框资源转换机制(MakeDlg)
MakeDlg.Exe并不是直接执行 Windows 二进制,而是解析 VC++ 项目生成的.rc(资源脚本文件)与Resource.h纯文本文件。- 它读取
DIALOG/DIALOGEX定义段中的控件坐标(Dialog Units,需按字体宽高比转换为像素点)、控件类型(PUSHBUTTON,EDITTEXT,COMBOBOX等)及样式标志,并将其映射生成为 WinSail 框架对应的 C++ 控件构造代码(如CCustomCtrl)或自定义的二进制/文本布局脚本供运行时动态解析。这种设计大幅降低了纯代码手写 DOS 界面布局的难度。





