Tag: dos

如何在x86 DOS程序集中读取键盘输入而不“消耗”它?

我需要编写一种可以从C代码调用的键记录function。 这意味着ac程序将调用一个名为startlog的汇编函数,该函数将指示开始记录按下的键,直到调用一个名为endlog的函数。 日志应该像这样工作:写入任何键的ascii值而不干扰startlog和endlog之间的C代码,这意味着如果C代码也需要读取输入(让我们说通过scanf,它可以正常工作)。 我设法通过将中断向量第9个条目(键盘按下的中断)更改为我写的将值写入文件的函数来编写记录器,并且它工作正常。 但是C代码没有得到输入。 基本上我所做的是读取使用int 21h按下的键,但是在读取ascii值后它被“消耗”所以我需要一种方法来再次模拟按键或读取值而不“消耗”它以便下一次键读取它读取相同的键。 (我用英语描述了代码,因为它是冗长而笨拙的汇编代码)

在32位Open Watcom C中生成FAR跳转指令

我需要生成一个远跳指令来跳转到另一个ISR(中断服务程序)。 我正在开发一个32位FreeDOS应用程序。 在阅读了OW手册( cguide.pdf和clr.pdf )之后,我想出了两种无需 任何警告或错误即可成功编译的方法。 /* Code Snippet #1 */ #pragma aux old08 aborts ; void (__interrupt __far *old08)(void); // function pointer declaration void __interrupt __far new08(void) { /* Do some processing here … */ (*old08)(); /* OW will now generate a jump inst. instead of call*/ } 我想出的另一种方法是: /* Code Snippet #2 */ […]

替代fscanf()/ vscanf()函数系列以使用替代validation密钥或如何创建自定义语言布局?

我更喜欢C语言。我知道从stdin设置变量的唯一方法是使用fscanf() / vscanf()函数系列。 DOS操作系统正在嵌入式市场中复苏。 我使用的设备在程序上与DOS兼容,并使用具有80286指令集的NEC V30Mx。 问题是内置键盘没有输入键,而是使用输入0x1C00键代码的EXE键( Alt输入 ) 。 所以当我写这样的程序时: #include #include #include int main(void) { int res, number = 0; printf(“int value?”); res = scanf(“%d”, &number); printf(“The value is %d”, number); return; } 调用scanf()并在屏幕上显示“ int value? ”。 我可以写数字和超级字母。 但我无法validation输出,因为0x1C0D键代码没有任何特征,EXE键使用不同的键码。 当然C不知道键盘,但C标准库二进制文件寻找输入\n的0x1C0D键代码 。 那么是fscanf() / vscanf()函数系列的替代品,它是C标准库的一部分吗? 更新: 我认为dos下的大多数C标准库都使用软件实现来实现这一点。 我看到DOS调用读取文件,当然,使用数字0导致从标准输入读取。 所以我组装了这个例子 ,将它加载到计算器上,发现自己很惊讶制造商首选处理它的内置软件中的问题,而不是修复操作系统… :- ((我得到了相同的先前结果) 更新 我没想过但是由于评论,我忘了键盘语言做重键代码重映射。 […]

自定义内存分配器用于实模式DOS .COM(独立式) – 如何调试?

首先是一个小背景:在这篇博文上磕磕绊绊,我了解到有可能用GNU链接器创建DOS .COM文件,它甚至不是火箭科学。 使用clang和-m16开关(通过相应地为32位指令加前缀来创建实模式兼容的32位代码),这非常好。 所以我有想法尝试实现足够的运行时来获得我最近写的一个小诅咒游戏 ,编译成.COM并在实模式 DOS 下运行。 游戏足够小,所以压缩64KB的所有内容(文本,数据,bss,堆,堆栈)似乎是可行的。 当然,它使用malloc() 。 所以我不得不想出自己的实现。 这就是它的样子: typedef unsigned short size_t; /* from stddef.h */ typedef struct hhdr hhdr; struct hhdr { void *next; int free; }; extern char _heap; static char *hbreak = &_heap; static hhdr hhead = { &_heap, 0 }; static void *newchunk(size_t size) { char *stack; […]

在C中,如何写入特定的内存位置,例如video内存b800,在DOS(真实DOS,MS DOS 6.22)

在C中,如何写入特定的内存位置,例如video内存b800,在DOS(真实DOS,MS DOS 6.22) 我知道C没有内置任何内容来做到这一点,但可能有一些特定的平台,例如DOS特定的API函数可以。 一个小的演示程序,它会很棒。 我有Turbo C(TCC.EXE – 不是小编译器,Turbo C编译器) 我知道调试可以做到(例如我知道的一些-f b800:0 FA0 21 CE ) -f b800:0 FA0 21 CE (将一些感叹号写入命令行)。 但我想要一个C程序写入b800:0

如何从ASM堆栈中的C代码访问双指针

我有一个main.c函数,它有以下声明: int initarr(int**arr, int n, int (*initfunc)(int)); 然后我在c调用函数: success = initarr(&arr, n, getNum); 问题是,在汇编代码中,在MODEL SMALL ,上面函数中的第一个参数将作为WORD或DWORD存在于内存中? 换句话说,当我编写代码时,这会工作: PUSH BP MOV BP,SP PUSH DI MOV DI, WORD PTR[BP+4] ; DI will hold &arr. 现在DI将持有arr的地址。 如果是,如果是这样,我怎样才能访问arr [0]的值? PUSH BP MOV BP,SP PUSH DI PUSH BX MOV DI, WORD PTR[BP+4] MOV BX, WORD PTR[DI] BX会保存数组的地址吗? 我的意思是,第一个细胞的地址? 如果是这样,我现在如何访问arr [0]? […]

什么是DOS中字符表的内存地址?

DOS中字符表的地址是什么,我们可以通过操纵每个字符的像素来创建新的字体和符号? 我知道用BIOS中断来改变它,但是我只需要dos中字符表的内存地址来直接访问。

用于MS-DOS的C编译器

我已经在VirtualBox虚拟机上安装了MS-DOS 6.22,一切运行良好,这样做的目的是编译用C语言编写的程序,该程序显示和编辑(虚拟)RAM中的位。 但是,我需要一种在虚拟MS-DOS操作系统上安装C编译器的方法。

如何将c / c ++编译为ms-dos .com程序?

我使用Code :: Blocks与GNU GCC编译器。 我的问题是:有没有办法将c / c ++代码编译成ms-dos 16bit(.com)可执行格式? 我试图设置构建选项并在网上搜索编译器参数,但我找不到任何东西。

退格并删除DOS中getch()函数的问题

我在Windows平台Intel x86架构上使用Turbo C编译器。 在我的程序中,我正在从键盘扫描用户输入。 它是一个登录密码程序,它将用户名和密码作为用户输入。 对于我使用getchar()的用户名,如果用户按下退格键输入用户名,在键盘上,前一个字符被删除,就我自己而言,我的意思是我不需要写任何显式代码做这个。 但是对于密码我使用getch()并且对应于每次按键我在屏幕上显示*。 在这种情况下,如果用户按下键盘上的退格键,它不会删除前一个字符,而是将其作为另一个键击,并在屏幕上显示与其对应的*。 我从bios.h尝试了bioskey,尝试使用\ b来解决,没有工作。 任何建议或解决方法…… ????