如何正确地将文本插入内核的显存?
How to properly insert text into a kernel's video memory?
我知道这个标题很奇怪(我不知道如何解释它:|)但请耐心等待。
我正在 assembly
和 C
中制作 OS。我做了一个内核,有文本输入和输出。
我在打印或添加 space 栏事件时遇到问题;如果我打印 ' '
(space char) 它只会覆盖下一个字符(就像我们在文本编辑器中按下插入键,如果我们将光标移到字符后面 a|bc
并键入一个字符 ex.b
使其变为 b|bc
).
我希望它在字符之间插入字符并像往常一样向前移动字符 abbc
。我如何在 32 位保护模式下在 C 中执行此操作?
屏幕打印方式
location = video_memory + (cursor_y*80 + cursor_x); //video memory is the start of the buffer
*location = c | attribute; //location is the calculated location to put the char in the buffer and c is the char
cursor_x++;
这会覆盖下一个字符
我不确定你是如何实现它的,但我确定你在内存中的某个地方有一个字符串缓冲区。你需要做的是将缓冲区 end 开始的字符向前移动一个,然后你继续 backwards, 直到你到达光标的位置。在这里,您添加新字符并增加光标的位置。
再说一遍,代码和资料都不够,我只能给你一些帮助。这是一个小示范。
a|bc
用户按下 b
键。
a|bc
缓冲区的内存大小增加一个,空终止符先向前移动。
a|b c
后跟 c
.
a| bc
然后 b
.
ab|bc
现在新字符被放入缓冲区,光标增加一个。
希望对您有所帮助。
更新:
给出的代码还是少了一点;所以我假设:
location
的索引 returns a short
.
c
和 attribute
都是 short
的大小,虽然我更喜欢 chars
来保存 space.
cursor_y
和 cursor_x
都是 char
.
- 内核已经可以左右移动光标了。
putchar函数:
short *location = video_memory + (cursor_y*80 + cursor_x);
// If the upper part of the VGA entry isn't zero, then don't write over it!
if (*location & 0xFF00) {
short *temp = video_memory;
while (*temp & 0xFF00) temp += 1; // I'm not a fan of -- and ++ operators... Feel free to change them.
while ((temp+1) != location) {
*(temp+1) = *temp;
temp -= 1; // I'm not a fan of -- and ++ operators... Feel free to change them.
}
*location = c | attribute; // I'm informed that c and attributes are both shorts; although I'd prefer chars.
cursor_x++;
注意:这是一个非常粗糙且未经测试的测试示例,说明它是如何工作的.它可能无法解决您所有的问题,但它确实为您提供了一个基本示例。
我知道这个标题很奇怪(我不知道如何解释它:|)但请耐心等待。
我正在 assembly
和 C
中制作 OS。我做了一个内核,有文本输入和输出。
我在打印或添加 space 栏事件时遇到问题;如果我打印 ' '
(space char) 它只会覆盖下一个字符(就像我们在文本编辑器中按下插入键,如果我们将光标移到字符后面 a|bc
并键入一个字符 ex.b
使其变为 b|bc
).
我希望它在字符之间插入字符并像往常一样向前移动字符 abbc
。我如何在 32 位保护模式下在 C 中执行此操作?
屏幕打印方式
location = video_memory + (cursor_y*80 + cursor_x); //video memory is the start of the buffer
*location = c | attribute; //location is the calculated location to put the char in the buffer and c is the char
cursor_x++;
这会覆盖下一个字符
我不确定你是如何实现它的,但我确定你在内存中的某个地方有一个字符串缓冲区。你需要做的是将缓冲区 end 开始的字符向前移动一个,然后你继续 backwards, 直到你到达光标的位置。在这里,您添加新字符并增加光标的位置。
再说一遍,代码和资料都不够,我只能给你一些帮助。这是一个小示范。
a|bc
用户按下b
键。a|bc
缓冲区的内存大小增加一个,空终止符先向前移动。a|b c
后跟c
.a| bc
然后b
.ab|bc
现在新字符被放入缓冲区,光标增加一个。
希望对您有所帮助。
更新:
给出的代码还是少了一点;所以我假设:
location
的索引 returns ashort
.c
和attribute
都是short
的大小,虽然我更喜欢chars
来保存 space.cursor_y
和cursor_x
都是char
.- 内核已经可以左右移动光标了。
putchar函数:
short *location = video_memory + (cursor_y*80 + cursor_x);
// If the upper part of the VGA entry isn't zero, then don't write over it!
if (*location & 0xFF00) {
short *temp = video_memory;
while (*temp & 0xFF00) temp += 1; // I'm not a fan of -- and ++ operators... Feel free to change them.
while ((temp+1) != location) {
*(temp+1) = *temp;
temp -= 1; // I'm not a fan of -- and ++ operators... Feel free to change them.
}
*location = c | attribute; // I'm informed that c and attributes are both shorts; although I'd prefer chars.
cursor_x++;
注意:这是一个非常粗糙且未经测试的测试示例,说明它是如何工作的.它可能无法解决您所有的问题,但它确实为您提供了一个基本示例。