问题标签 [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.

0 投票
2 回答
1249 浏览

dos - 用 DOS32/A 替换平面内存模式下的硬件中断

我有一个关于如何在平面内存模式下替换硬件中断的问题......

  1. 关于我的申请...
    • 通过结合Watcom CDOS32/A创建。
    • 为在 DOS 模式下运行而编写(不在 OS 模式下)
    • 使用 DOS32/A 现在我可以访问 >1M 内存并分配大内存以使用...(以平面内存模式运行!!!)
  2. 目前的问题...
    • 我想为一张 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 设备配置寄存器 0x​​5 bit2(中断禁用)= 0
  • PCI 设备配置寄存器 0x​​6 bit3(中断状态) = 1
  • PCI 设备配置寄存器 0x​​3C/0x3D(中断线)= 0xE/0x2
  • 在 DOS 中,中断模式是 PIC 模式(8259 模式)和基于引脚的(MSIE=0)

5)显示tick的值,发现还是“0” ...

因此我认为 MyISR() 没有被正确调用......

0 投票
2 回答
1950 浏览

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 左右,所以我不能使用常规内存。

0 投票
1 回答
361 浏览

c - DOS中的“夏令时”

time(NULL)在 C 应用程序中使用该函数来获取自 1970 年以来的秒数。我注意到它返回的信息相差 1 小时。

然后我尝试使用 将结果转换为tm结构localtime,然后我注意到tm_isdst正在设置该字段。

代码是这样的:

首先printftempo以一小时的差异打印。第二,它正在打印正确的值。

我正在操作系统中运行该应用程序Ms DOS 6.0,并且该应用程序正在使用Watcom v1.3.

信息从何Daylight Savings Time而来?DOS 是否持有此信息?

0 投票
1 回答
891 浏览

c++ - 打开 Watcom 错误无法执行(wpp):没有这样的文件或目录*

所以我正在尝试使用 Open Watcom FORTRAN 创建一个 16 位 MSDOS 应用程序。

我创建了一个新项目并制作了一个简单的 hello world cpp 文件,但是当我尝试通过按 f4 进行构建时,它以错误的方式猛烈抨击我:

错误(E14):无法执行(wpp):没有这样的文件或目录

我用谷歌搜索了几次,但找不到任何问题的答案。
PS:我在命令行中使用带有 GUI 的 Watcom

*这从这里前面的讨论继续,没有回答
我如何编写一个可以在 msdos 上运行的 c++ 控制台 exe?

0 投票
2 回答
1962 浏览

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 的问题提前谢谢!

0 投票
2 回答
1299 浏览

assembly - 编译 16 位汇编代码时出现打开 watcom 错误(找到多个起始地址)

我正在尝试从 open watcom IDE 中的 rootkit 武器库中编译一个 16 位汇编代码片段。它给出了错误“找到多个起始地址”。由于组装知识非常有限,我无法对其进行整理。这是代码:

请帮帮我。

0 投票
0 回答
141 浏览

dll - 使用 Open Watcom for Win32 控制台应用程序编译和链接 libxml2

我们有一个用 C 语言编写并使用 Open Watcom 编译的 Windows 32 位控制台应用程序。我们想在我们的应用程序中使用 libxml2 库。我们找到了 Win32 DLL 二进制文件,我们可以使用 Watcom 编译器将它们与我们的应用程序代码链接吗?

0 投票
1 回答
114 浏览

c - 如何确保特定代码片段之间不会产生中断?

我有一个关于代码片段之间的中断生成时间的问题......

@“示例”代码

@“示例”ISR 代码

  • 需要注意的一点:硬件寄存器设置后,“完成”时其值为0!

我的问题是:如果在23之间产生中断,那么计数将增加一,因为步骤3尚未完成(值为 0)......如果交换23,那么计数可能不会加1,因为即使硬件寄存器为0(一段时间后,完成)全局变量为0!

我的第一个想法是:是否有可能23可以以某种方式“捆绑在一起”,并且在3完成之前不允许产生中断?

  • 我使用 watcom c 并在 DOS 中测试...
0 投票
2 回答
171 浏览

c - 调用 fread 后出现奇怪的 printf 行为

我正在尝试设计一个将位图图像加载到内存中并最终显示它的函数。我正在使用 Watcom 16 位 C 编译器编译代码,目标设置为 DOS。我在 DOSBox 中运行程序。代码如下:

当你运行这个程序时,它会输出:"BMP width: %dpx\n" 但是换行符后面什么都没有?我觉得这非常奇怪。我已经确认没有任何操作失败或设置 errno 并且 px_height 实际上设置为它的适当值。你们中有人有过这种经历吗?

0 投票
1 回答
159 浏览

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 中的命令提示符无关!