转到内核用 C语言写东西,速度就快了,先实现画图:
/* graphics.c 图形函数 四彩 2015-12-12 */ #include "../kernel/include/graphics.h" // 图形函数相关全局参数 static unsigned short *pVideo, Color = 0; static unsigned short Screen_X, Screen_Y; static unsigned char BytePerPix; /* 画一条线 */ void line(unsigned x0, unsigned y0, unsigned x1, unsigned y1) { int x, y; if(x0 == x1) for(y = y0; y <= y1; y++) pVideo[Screen_X * y + x] = Color; else if(x0 < x1) for(x = x0; x <= x1; x++) { y = ((x - x0) * y1 + (x1 - x) * y0) / (x1 - x0); pVideo[Screen_X * y + x] = Color; } else // if(x0 > x1) for(x = x1; x <= x0; x++) { y = ((x0 - x) * y1 + (x - x1) * y0) / (x0 - x1); pVideo[Screen_X * y + x] = Color; } } /* 画一个方框并填色 */ void rectangle(unsigned x0, unsigned y0, unsigned x1, unsigned y1) { unsigned x, y; for(y = y0; y <= y1; y++) for(x = x0; x <= x1; x++) pVideo[Screen_X * y + x] = Color; } // 初始化图形参数 void InitGraphics(GRAPHICS_PARAM *ptGraphics) { pVideo = (unsigned short *)ptGraphics->dwPhyAddrOfVideo; Screen_X = ptGraphics->wScreenX; Screen_Y = ptGraphics->wScreenY; BytePerPix = ptGraphics->bBitsPerPixel; } // 设置颜色 void SetColor(unsigned color) { Color = color; } unsigned GetColor() { return Color; } unsigned GetScreenX() { return Screen_X; } unsigned GetScreenY() { return Screen_Y; }
kernel 做了调整,图形相关定义、函数调整到图形模块里去了。这个头文件还把图形函数引出来(这里定义的颜色可是费老劲收集到的):
/* graphics.h 图形出函数 四彩 2015-12-12 */ #ifndef _GRAPHICS_H #define _GRAPHICS_H typedef struct tag_Graphics_Param { unsigned dwPhyAddrOfVideo; // 显存基址 unsigned short wScreenX; // 分辨率 X unsigned short wScreenY; // 分辨率 Y unsigned char bBitsPerPixel; // 颜色数 } GRAPHICS_PARAM; // RGB565 合成 16 位色宏 // r = 红(高 5 位,0 ~ 31),g = 绿(中 6 位,0 ~ 63),b = 蓝(低 5 位, 0 ~ 31) #define RGB565(r, g, b) (unsigned short)(((r) << 11) | ((g) << 5) | (b)) // 基本色 #define COLOR16_BLACK 0b0000000000000000 #define COLOR16_WHITE 0b1111111111111111 #define COLOR16_RED 0b1111100000000000 // 红 #define COLOR16_GREEN 0b0000011111100000 // 绿 #define COLOR16_BLUE 0b0000000000011111 // 蓝 #define COLOR16_YELLOW (COLOR16_RED | COLOR16_GREEN) // 黄 #define COLOR16_MAGENTA (COLOR16_RED | COLOR16_BLUE) // 洋红 #define COLOR16_CYAN (COLOR16_GREEN | COLOR16_BLUE) // 青 // 常见 RGB565 合成色 // 红色系 #define COLOR16_DARKRED RGB565(17, 0, 0) // 暗红 // 绿色系 #define COLOR16_PALEGREEN RGB565(19, 62, 19) // 淡绿 #define COLOR16_GREENYELLOW RGB565(21, 63, 5) // 黄绿 // 蓝色系 #define COLOR16_LIGHTBLUE RGB565(21, 54, 28) // 亮蓝 #define COLOR16_MEDIUMBLUE RGB565( 0, 0, 25) // 中蓝 #define COLOR16_DARKBLUE RGB565( 0, 0, 17) // 暗蓝 #define COLOR16_BABYBLUE RGB565(28, 63, 31) // 浅蓝 #define COLOR16_SKYBLUE RGB565(16, 51, 29) // 天蓝 #define COLOR16_LIGHTSKYBLUE RGB565(16, 51, 31) // 亮天蓝 #define COLOR16_DEEPSKYBLUE RGB565( 0, 41, 31) // 暗天蓝 // 黄色系 // 橙色系 #define COLOR16_ORANGE RGB565(31, 41, 0) // 橙 // 灰色系 #define COLOR16_GRAY RGB565(16, 32, 16) // 灰 #define COLOR16_LIGHTGRAY RGB565(26, 52, 26) // 亮灰 #define COLOR16_DARKGRAY RGB565(21, 42, 21) // 暗灰 // 紫色系 #define COLOR16_PURPLE RGB565(16, 0, 16) // 紫 #define COLOR16_LIGHTVIOLET RGB565(29, 32, 29) // 亮紫 #define COLOR16_MEDIUMPURPLE RGB565(18, 28, 27) // 中紫 #define COLOR16_DARKVIOLET RGB565(18, 0, 26) // 暗紫 // 褐色系 #define COLOR16_BROWN RGB565(20, 10, 5) // 棕褐 // 设置部分 void InitGraphics(GRAPHICS_PARAM *ptGraphics); void SetColor(unsigned color); // 取参数部分 unsigned GetColor(); unsigned GetScreenX(); unsigned GetScreenY(); // 绘图部分 void line(unsigned x0, unsigned y0, unsigned x1, unsigned y1); void rectangle(unsigned x0, unsigned y0, unsigned x1, unsigned y1); #endif
kernel 增加了一个简单的界面
/* kernel.c 内核 whoozit 2012-12-12 */ #include "../lib/include/stddef.h" #include "../lib/include/string.h" #include "../kernel/include/PMode.h" #include "../kernel/include/graphics.h" // 存放全局变量的物理地址(const.inc 中的 SEGMENTOFGPARAM * 0x10) #define PHYADDROFGPARAM 0x500 // 全局变量结构 typedef struct tag_Global_param { unsigned int dwMemorySize; GRAPHICS_PARAM tGraphics; } GLOBAL_PARAM; // 引用汇编指令函数 extern void asm_hlt(); void c_main() { unsigned i, j; unsigned short Screen_X, Screen_Y; char string[80], number[33]; GLOBAL_PARAM g_Param; // 初始化 GDT 表 InitGdt(); // 取全局变量 memcpy((void *)&g_Param, (void *)(PHYADDROFGPARAM), sizeof(GLOBAL_PARAM)); // 初始化图形参数 InitGraphics(&(g_Param.tGraphics)); Screen_X = GetScreenX(); Screen_Y = GetScreenY(); // 画界面 SetColor(COLOR16_DEEPSKYBLUE); rectangle(0, 0, Screen_X - 1, Screen_Y - 1); SetColor(COLOR16_LIGHTGRAY); rectangle(0, Screen_Y - 28, Screen_X - 1, Screen_Y - 28); rectangle(0, Screen_Y - 26, Screen_X - 1, Screen_Y - 1); SetColor(COLOR16_WHITE); rectangle(0, Screen_Y - 27, Screen_X - 1, Screen_Y - 27); rectangle(3, Screen_Y - 24, 59, Screen_Y - 24); rectangle(2, Screen_Y - 24, 2, Screen_Y - 4); rectangle(2, Screen_Y - 3, 59, Screen_Y - 3); rectangle(60, Screen_Y - 24, 60, Screen_Y - 3); rectangle(Screen_X - 47, Screen_Y - 3, Screen_X - 4, Screen_Y - 3); rectangle(Screen_X - 3, Screen_Y - 24, Screen_X - 3, Screen_Y - 3); SetColor(COLOR16_DARKGRAY); rectangle(3, Screen_Y - 4, 59, Screen_Y - 4); rectangle(59, Screen_Y - 23, 59, Screen_Y - 5); rectangle(Screen_X - 47, Screen_Y - 24, Screen_X - 4, Screen_Y - 24); rectangle(Screen_X - 47, Screen_Y - 23, Screen_X - 47, Screen_Y - 4); while(1) asm_hlt(); }
Makefile 里增加了图形文件(一个.c、一个.h)的编译,其他文件没有变化。运行效果图: