-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathkernel.c
175 lines (138 loc) · 3.21 KB
/
kernel.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include "io.h"
// 显存起始地址
#define 视频地址 0xb8000
// 屏幕最大行数和列数
#define 最大行数 25
#define 最大列数 80
// 白色文本黑色背景属性字节
#define 白色在黑色上 0x0f
// 打印单个字符到指定位置
void 打印字符(char character, int 列, int 行, char 属性字节);
// 在指定位置打印字符串
void 在指定位置打印(const char *消息, int 列, int 行);
// 打印字符串到屏幕
void 打印(const char *消息);
// 清空屏幕
void 清空屏幕();
// 获取键盘输入
char 获取按键();
// 终端功能
void 终端();
// 内核主函数
void 内核主函数()
{
清空屏幕();
打印("欢迎使用 RedOS!\n");
打印("启动终端...\n\n");
终端();
while (1);
}
// 终端功能
void 终端()
{
char 输入[256];
int 索引 = 0;
打印("RedOS> ");
while (1)
{
char 按键 = 获取按键();
if (按键 == "\n")
{
输入[索引] = "\0";
打印("\n");
// 简单的回显功能
if (strcmp(输入, "clear") == 0)
{
清空屏幕();
}
else
{
打印(输入);
打印("\n");
}
索引 = 0;
打印("RedOS ");
}
else
{
输入[索引++] = 按键;
char 字符串[2] = {按键, "\0"};
打印(字符串);
}
}
}
// 获取按键输入
char 获取按键()
{
char c = 0;
while ((c = inb(0x60)) == 0);
if (c > 0) return c;
return "\0";
}
// 打印字符串到屏幕
void 打印(const char *消息)
{
在指定位置打印(消息, -1, -1);
}
// 在指定位置打印字符串
void 在指定位置打印(const char *消息, int 列, int 行)
{
int 偏移量;
if (列 >= 0 && 行 >= 0)
{
偏移量 = 行 * 最大列数 + 列;
}
else
{
偏移量 = -1;
}
while (*消息)
{
打印字符(*消息++, 列, 行, 白色在黑色上);
if (列 >= 0 && 行 >= 0)
{
列++;
if (列 >= 最大列数)
{
列 = 0;
行++;
}
}
}
}
// 打印单个字符到指定位置
void 打印字符(char 字符, int 列, int 行, char 属性字节)
{
unsigned char *显存 = (unsigned char *)视频地址;
if (!属性字节)
{
属性字节 = 白色在黑色上;
}
if (列 >= 0 && 行 >= 0)
{
int 偏移量 = 行 * 最大列数 + 列;
显存[偏移量 * 2] = 字符;
显存[偏移量 * 2 + 1] = 属性字节;
}
else
{
int 偏移量 = 0;
while (显存[偏移量 * 2] != 0)
{
偏移量++;
}
显存[偏移量 * 2] = 字符;
显存[偏移量 * 2 + 1] = 属性字节;
}
}
// 清空屏幕
void 清空屏幕()
{
for (int 行 = 0; 行 < 最大行数; 行++)
{
for (int 列 = 0; 列 < 最大列数; 列++)
{
打印字符(" ", 列, 行, 白色在黑色上);
}
}
}