我是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.这应该放在屏幕的左上角.
我已经考虑了屏幕可能滚动的可能性,因此在执行时会立即以两种方式删除我的角色.要解决此问题,我尝试过:
我可以读取并打印我写入内存的值,所以它显然仍然在内存中,但无论出于何种原因,我都没有在屏幕上显示任何内容.我显然做错了,但我不知道会出现什么问题.如果需要任何其他细节,请询问.感谢您提供任何可能的帮助.
我正在使用ncurses编写应用程序,并希望在其中使用方框图字符,特别是u / 2550和u / 2551(到目前为止)。我有for循环设置,可根据我在其他地方确定的屏幕尺寸在终端的两侧绘制条形图。
无论出于何种原因,要水平绘制任何unicode字符(在屏幕底部,但可以在任何行上进行此操作),它将从精细打印字符到打印垃圾'P'。这有点难以解释,所以我有一些图片显示了当我先绘制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 ++。
这与盒子绘制功能或特定的终端功能无关,终端完全支持所有宽字符,并且可以在终端的其他部分中使用。这将根据我连续绘制的数量而发生,其他框字符也会发生。