问题标签 [watcom]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
dos - 用 DOS32/A 替换平面内存模式下的硬件中断
我有一个关于如何在平面内存模式下替换硬件中断的问题......
- 关于我的申请...
- 通过结合Watcom C和DOS32/A创建。
- 为在 DOS 模式下运行而编写(不在 OS 模式下)
- 使用 DOS32/A 现在我可以访问 >1M 内存并分配大内存以使用...(以平面内存模式运行!!!)
- 目前的问题...
- 我想为一张 PCI 卡写一个 ISR(中断服务程序)。因此我需要“替换”硬件中断。
- 前任。PCI 卡的中断线 = DOS 中的 0xE。这意味着该设备将通过 8259 的 IRQ 14 发出中断。
但是我没有如何实现我的目标,在平面模式下替换这个中断?
@resource 我发现... - 在 watcom C 的库中,有一个示例使用 _dos_getvect、_dos_setvect 和 _chain_intr 来挂钩 INT 0x1C...我测试了这段代码,发现没问题。但是当我将它应用于我的案例时:INT76(其中 IRQ 14 是 "INT 0x76" <- (14-8) + 0x70 )然后什么也没发生......
- 我检查了硬件中断是否生成,但我自己的 ISR 没有被调用......
我会失去什么吗?或者我可以使用任何功能来实现我的目标?
==================================================== ==============
[20120809] 我尝试使用DPMI调用0x204 和 0x205并发现MyISR()仍未被调用。我描述了我所做的如下,也许你们都可以给我一些建议!
1)使用内联汇编实现DPMI调用0x204和0x205并测试OK...
前任。使用 DPMI 0x204显示 16 个 IRQ 的中断向量,我得到 ( selector:offset ) 以下结果:8:1540 (INT8), 8:1544 (INT9),....., 8:1560 (INT70), 8 :1564 (INT71),..., 8: 157C (INT77)
前任。使用DPMI 0x205设置IRQ14(INT76)的中断向量,返回CF=0,表示成功
2)创建我自己的 ISR MyISR() 如下:
3)通过 DPMI 调用 0x205设置新的中断向量:
然后 sts = 0(CF=0) 表示成功!
- 这里有一件奇怪的事情是:我的应用程序在平面内存模型中运行,我认为 MyISR() 的选择器应该为 0...但是如果 DPMI 调用 0x205 的选择器 = 0,那么我得到 CF=1 和 AX = 0x8022,表示“无效的选择器”!
4)让硬件中断产生,证据是:
- PCI 设备配置寄存器 0x5 bit2(中断禁用)= 0
- PCI 设备配置寄存器 0x6 bit3(中断状态) = 1
- PCI 设备配置寄存器 0x3C/0x3D(中断线)= 0xE/0x2
- 在 DOS 中,中断模式是 PIC 模式(8259 模式)和基于引脚的(MSIE=0)
5)显示tick的值,发现还是“0” ...
因此我认为 MyISR() 没有被正确调用......
assembly - 如何在 DOS 扩展器或 DPMI 环境下进行 DMA 传输?
程序在 DOS 扩展器+DPMI 环境下运行时如何使用 DMA 传输?
我的意思是我们如何分配和获取分配的 dma 缓冲区的物理地址,以便将该物理地址提供给 DMA 控制器或PCI 总线主设备。
有两种可能:
DOS 扩展器或 DPMI 服务器/主机支持虚拟内存。例如铜锣湾。
DOS 扩展器或 DPMI 服务器/主机不支持虚拟内存,但启用了分页。例如DOS32a。
我正在使用Open Watcom C编译器。
运行时环境是:
FreeDOS + XMS(无 EMS/EMM386)+ DOS 扩展器(DOS32a)
对于 DJGPP,解决方案在这里
但是最后提到的解决方案,即通过 XMS,是否也可以与 DOS32a 一起使用?
DOS32a 文档说,在切换到保护模式之前,它会分配所有可用的扩展内存,然后我们的程序可以通过 DPMI 函数 501h 分配该内存。
注意:dma 缓冲区可以是 1MB 左右,所以我不能使用常规内存。
c - DOS中的“夏令时”
我time(NULL)
在 C 应用程序中使用该函数来获取自 1970 年以来的秒数。我注意到它返回的信息相差 1 小时。
然后我尝试使用 将结果转换为tm
结构localtime
,然后我注意到tm_isdst
正在设置该字段。
代码是这样的:
首先printf
,tempo
以一小时的差异打印。第二,它正在打印正确的值。
我正在操作系统中运行该应用程序Ms DOS 6.0
,并且该应用程序正在使用Watcom v1.3
.
信息从何Daylight Savings Time
而来?DOS 是否持有此信息?
c++ - 打开 Watcom 错误无法执行(wpp):没有这样的文件或目录*
所以我正在尝试使用 Open Watcom FORTRAN 创建一个 16 位 MSDOS 应用程序。
我创建了一个新项目并制作了一个简单的 hello world cpp 文件,但是当我尝试通过按 f4 进行构建时,它以错误的方式猛烈抨击我:
错误(E14):无法执行(wpp):没有这样的文件或目录
我用谷歌搜索了几次,但找不到任何问题的答案。
PS:我在命令行中使用带有 GUI 的 Watcom
*这从这里前面的讨论继续,没有回答
我如何编写一个可以在 msdos 上运行的 c++ 控制台 exe?
c - 设置编译器 在 Windows XP 中打开 watcom
我在我的操作系统 Win XP 上安装了编译器“Open watcom” ,我在 Virtual Box 下运行。
我在自动模式下安装了程序:完整包并自动更改了 autoexec 和配置文件,在安装过程中插入了所有需要的环境变量信息。
我无法为 DOS 16 位编译 C 项目,出现错误:
我尝试修改“system.init”文件并在 [386enh] 目录中插入“device=c:\watcom\binw\wdebug.386”(在与 open watcom 相关的站点之一的常见问题解答中建议),但是没有效果。
我需要帮助!我应该怎么做才能使 c 项目编译并解决 wdebug.386 的问题提前谢谢!
assembly - 编译 16 位汇编代码时出现打开 watcom 错误(找到多个起始地址)
我正在尝试从 open watcom IDE 中的 rootkit 武器库中编译一个 16 位汇编代码片段。它给出了错误“找到多个起始地址”。由于组装知识非常有限,我无法对其进行整理。这是代码:
请帮帮我。
dll - 使用 Open Watcom for Win32 控制台应用程序编译和链接 libxml2
我们有一个用 C 语言编写并使用 Open Watcom 编译的 Windows 32 位控制台应用程序。我们想在我们的应用程序中使用 libxml2 库。我们找到了 Win32 DLL 二进制文件,我们可以使用 Watcom 编译器将它们与我们的应用程序代码链接吗?
c - 如何确保特定代码片段之间不会产生中断?
我有一个关于代码片段之间的中断生成时间的问题......
@“示例”代码
@“示例”ISR 代码
- 需要注意的一点:硬件寄存器设置后,“完成”时其值为0!
我的问题是:如果在2和3之间产生中断,那么计数将增加一,因为步骤3尚未完成(值为 0)......如果交换2和3,那么计数可能不会加1,因为即使硬件寄存器为0(一段时间后,完成)全局变量为0!
我的第一个想法是:是否有可能2和3可以以某种方式“捆绑在一起”,并且在3完成之前不允许产生中断?
- 我使用 watcom c 并在 DOS 中测试...
c - 调用 fread 后出现奇怪的 printf 行为
我正在尝试设计一个将位图图像加载到内存中并最终显示它的函数。我正在使用 Watcom 16 位 C 编译器编译代码,目标设置为 DOS。我在 DOSBox 中运行程序。代码如下:
当你运行这个程序时,它会输出:"BMP width: %dpx\n" 但是换行符后面什么都没有?我觉得这非常奇怪。我已经确认没有任何操作失败或设置 errno 并且 px_height 实际上设置为它的适当值。你们中有人有过这种经历吗?
c++ - 纯DOS模式下的WriteFile?
正如我们所知,VCWriteFile()
将数据写入 OS 中指定的 I/O 设备(参见WriteFile)
我想知道纯dos中是否有这样的api用于此目的?(使用 Watcom C...)
然后我_dos_write()
在 watcom c 库参考页 197(参见_dos_write()
)中找到,它使用系统调用 0x40 将缓冲区指向的缓冲区中的 count 字节数据写入句柄指定的文件
计数是类型,这unsigned
意味着最大文件数将为 65535。
WriteFile()
我的问题是:是否有任何其他 api 可以在纯 DOS 中“一次”传输超过 65536 个字节(就像那样)?
Ps 这与 Windows 中的命令提示符无关!