我正在嘗試在 c 中創建一個內核,但我很難創建新行。例如,在螢屏上寫了一個句子后,我會添加一個新行。
這是我的示例代碼。我想將這些字串寫在兩個單獨的行上。那么如何將游標移動到新行?非常感謝您的幫助
static char* const VGA_MEMORY = (char*) 0xb8000;
static const int VGA_WIDTH = 80;
static const int VGA_HEIGHT = 25;
static unsigned int cursor_pos = 0;
unsigned int i = 0;
char* str = "HELLO WORLD";
char* str1 = "TEST !";
while (str[i]!='\0')
{
char ch = str[i];
VGA_MEMORY[cursor_pos] = ch;
VGA_MEMORY[cursor_pos 1] = 0x07;
cursor_pos = 2;
i = 1;
}
i = 0;
while (str[i]!='\0')
{
char ch = str1[i];
VGA_MEMORY[cursor_pos] = ch;
VGA_MEMORY[cursor_pos 1] = 0x07;
cursor_pos = 2;
i = 1;
}
預期輸出為:
HELLO WORLD
TEST !
uj5u.com熱心網友回復:
您只需轉到新行的第一個字符:VGA_WIDTH * line_number.
VGA 記憶體只是一個字符網格。控制代碼(所以新行)沒有意義,它們用于更高級別的協議,以移動到正確的位置。
注意:通常不是換行和其他控制代碼,而是其他符號。實際上VGA記憶體中的字符不是字符,而是活動字體的字符索引。
注意:在您的程式中,您必須有一個游標位置_x和_y(或_col/ _row),而不僅僅是一個整數。
uj5u.com熱心網友回復:
如果您寫入螢屏緩沖區,則沒有新行可寫。相反,您只需將游標移動到下一行:
cursor_pos = ((cursor_pos (VGA_WIDTH-1)*2) / (VGA_WIDTH*2)) * (VGA_WIDTH*2);
這只是將您的游標位置四舍五入到下一個倍數VGA_WIDTH*2
uj5u.com熱心網友回復:
那么如何將游標移動到新行?
絕對最小(最差)的方法如下:
i = 0;
while (str[i]!='\0') {
char ch = str1[i];
if(ch == '\n') {
cursor_pos = (cursor_pos / VGA_WIDTH 1) * VGA_WIDTH;
} else {
VGA_MEMORY[cursor_pos] = ch;
VGA_MEMORY[cursor_pos 1] = 0x07;
cursor_pos = 2;
}
i = 1;
}
這樣做的第一個問題是,如果游標已經在螢屏底部,它將以“超出范圍的索引”和超出幀緩沖區末尾的垃圾記憶體而告終。
要解決這個問題,您需要檢測條件(例如if(cursor_pos >= VGA_WIDTH * VGA_HEIGHT * 2) {)并決定要做什么 - 忽略所有新字符、環繞到螢屏頂部(例如cursor_pos = 0;)或滾動螢屏。
滾動螢屏可能看起來像:
i = 0;
while (str[i]!='\0') {
char ch = str1[i];
if(ch == '\n') {
cursor_pos = (cursor_pos / VGA_WIDTH 1) * VGA_WIDTH;
if(cursor_pos >= VGA_WIDTH * VGA_HEIGHT * 2) {
memmove(VGA_MEMORY, &VGA_MEMORY[VGA_WIDTH * 2], (VGA_HEIGHT - 1) * VGA_WIDTH * 2);
cursor_pos -= VGA_WIDTH * 2;
}
} else {
VGA_MEMORY[cursor_pos] = ch;
VGA_MEMORY[cursor_pos 1] = 0x07;
cursor_pos = 2;
}
i = 1;
}
這是相對可怕的——從 VGA 記憶體讀取速度很慢(最好在 RAM 中有緩沖區),這意味著無法再看到任何從螢屏頂部消失的文本。
解決這些問題的一種方法是將新字串附加到記憶體中的內核日志中,然后顯示日志中的最后(最多)VGA_HEIGHT 行;以便以后可以查看整個日志(和/或寫入磁盤)。memmove()這創造了用更快的“再次從記憶體中的日志列印所有內容,從更新的螢屏指標頂部開始”方法替換慢速的可能性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461305.html
