小编Amp*_*era的帖子

无法写入C中的屏幕内存

我是C的新手,它是继Java之后的第二种高级编程语言.我已经掌握了大部分基础知识,但无论出于何种原因,我无法将单个字符写入屏幕内存.

该程序使用Turbo C for DOS编译,运行速度为120mhz的Am486-DX4-100.该显卡是使用Trio32芯片的非常标准的VLB Diamond Multimedia Stealth SE.

对于操作系统,我运行的PC-DOS 2000加载了ISO代码页.我正在使用标准的MDA/CGA/EGA/VGA 80列文本模式运行.

这是我编写的程序:

#include <stdio.h>

int main(void) {
    unsigned short int *Video = (unsigned short int *)0xB8000;
    *Video = 0x0402;
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如我所说,我对C很新,所以如果我的错误显而易见,我道歉,我无法找到一个可以理解的如何做到这一点的可靠来源.

据我所知,在x86平台上的实模式下,文本模式的屏幕内存从0xB8000开始.每个字符存储在两个字节中,一个用于字符,一个用于背景/前景.我的想法是将值0x0402(应该是一个红色的笑脸)写入0xB8000.这应该放在屏幕的左上角.

我已经考虑了屏幕可能滚动的可能性,因此在执行时会立即以两种方式删除我的角色.要解决此问题,我尝试过:

  • 使用循环重复写入此值
  • 再写下来吧.

我可以读取并打印我写入内存的值,所以它显然仍然在内存中,但无论出于何种原因,我都没有在屏幕上显示任何内容.我显然做错了,但我不知道会出现什么问题.如果需要任何其他细节,请询问.感谢您提供任何可能的帮助.

c x86 real-mode turbo-c x86-16

43
推荐指数
2
解决办法
3667
查看次数

将宽字符写入某些屏幕位置时,ncurses出现异常情况

我正在使用ncurses编写应用程序,并希望在其中使用方框图字符,特别是u / 2550和u / 2551(到目前为止)。我有for循环设置,可根据我在其他地方确定的屏幕尺寸在终端的两侧绘制条形图。

无论出于何种原因,要水平绘制任何unicode字符(在屏幕底部,但可以在任何行上进行此操作),它将从精细打印字符到打印垃圾'P'。这有点难以解释,所以我有一些图片显示了当我先绘制6个字符然后绘制7个或更多字符时发生的情况。

6个字符

7个字符

负责绘制这些字符的代码部分是这样的,请注意,最后一个for循环是绘制这些字符的原因,并且迭代器的作用远不只是7,但它在这里和其他任何地方都可以完成。

void drawBorder(){ //draw the border graphics
                attron(COLOR_PAIR(3));
        for(int i = 1; i < screenSizeY - 1; i++){ //draw left side
                mvaddwstr(i, 0, L"?");
        }
        for(int i = 1; i < screenSizeY - 1; i++){ //draw right side
                mvaddwstr(i, screenSizeX - 1, L"\u2551");
        }
        for(int i = 0; i < 7; i++){ //draw bottom
                mvaddwstr(screenSizeY - 1, i, L"\u2550");
        }
                attroff(COLOR_PAIR(3));
}
Run Code Online (Sandbox Code Playgroud)

我链接到ncursesw软件包,并且具有正确设置的语言环境。以竖线绘制的其他字符也可以,但此处不行。我正在使用在Alacritty终端会话中的Linux上运行的,用g ++编译的C ++。

这与盒子绘制功能或特定的终端功能无关,终端完全支持所有宽字符,并且可以在终端的其他部分中使用。这将根据我连续绘制的数量而发生,其他框字符也会发生。

c++ linux unicode terminal ncurses

3
推荐指数
1
解决办法
225
查看次数

标签 统计

c ×1

c++ ×1

linux ×1

ncurses ×1

real-mode ×1

terminal ×1

turbo-c ×1

unicode ×1

x86 ×1

x86-16 ×1