绘制字母
- 字母的二进制表示
static char fontA[16] = {
0x00, 0x18, 0x18, 0x18,0x18,0x24,0x24,0x24,
0x24, 0x7e, 0x42, 0x42,0x42, 0xe7, 0x00, 0x00
};
- 绘制方法
void showFont8(char *vram, int xsize, int x, int y, char c, char* font) {
int i;
char d;
for (i = 0; i < 16; i++) {
d = font[i];
if ((d & 0x80) != 0) {vram[(y+i)*xsize + x + 0] = c;}
if ((d & 0x40) != 0) {vram[(y+i)*xsize + x + 1] = c;}
if ((d & 0x20) != 0) {vram[(y+i)*xsize + x + 2] = c;}
if ((d & 0x10) != 0) {vram[(y+i)*xsize + x + 3] = c;}
if ((d & 0x08) != 0) {vram[(y+i)*xsize + x + 4] = c;}
if ((d & 0x04) != 0) {vram[(y+i)*xsize + x + 5] = c;}
if ((d & 0x02) != 0) {vram[(y+i)*xsize + x + 6] = c;}
if ((d & 0x01) != 0) {vram[(y+i)*xsize + x + 7] = c;}
}
}
- 调用函数绘制字母
showFont8(vram, xsize, 20, 20, COL8_FFFFFF, fontA);
绘制所有字母
- 生成字母表,这个感觉比较机械,主要是吧01组成的一个整列转换成数组,我们直接拿结果过来用就可以了。
- 这里要注意的是 inlcude 要记得放在haribote.nasm中的[SECTION .s16]部分。不然会出问题。
- c语言中调用汇编的变量,可以使用extern char 的方式。
- 调用方法:
showFont8(vram, xsize, 8, 8, COL8_FFFFFF, systemFont + 'A'*16);
showFont8(vram, xsize, 16, 8, COL8_FFFFFF, systemFont + 'B'*16);
showFont8(vram, xsize, 24, 8, COL8_FFFFFF, systemFont + 'C'*16);
showFont8(vram, xsize, 32, 8, COL8_FFFFFF, systemFont + '1'*16);
showFont8(vram, xsize, 48, 8, COL8_FFFFFF, systemFont + '2'*16);
showFont8(vram, xsize, 64, 8, COL8_FFFFFF, systemFont + '3'*16);
绘制字符串
乘热打铁,输出一个字符串的方法如下:
void showString(char* vram, int xsize, int x, int y, char color, unsigned char *s ) {
for (; *s != 0x00; s++) {
showFont8(vram, xsize, x, y,color, systemFont+ *s * 16);
x += 8;
}
}
最终结果如下:
绘制鼠标
- 把鼠标表示的字符串转换成二进制的透明图,这里需要在主程序中申请一段内存传进来。
void init_mouse_cursor(char* mouse, char bc) {
static char cursor[16][16] = {
"**************..",
"*OOOOOOOOOOO*...",
"*OOOOOOOOOO*....",
"*OOOOOOOOO*.....",
"*OOOOOOOO*......",
"*OOOOOOO*.......",
"*OOOOOOO*.......",
"*OOOOOOOO*......",
"*OOOO**OOO*.....",
"*OOO*..*OOO*....",
"*OO*....*OOO*...",
"*O*......*OOO*..",
"**........*OOO*.",
"*..........*OOO*",
"............*OO*",
".............***"
};
int x, y;
for (y = 0; y < 16; y++) {
for (x = 0; x < 16; x++) {
if (cursor[y][x] == '*') {
mouse[y*16 + x] = COL8_000000;
}
if (cursor[y][x] == 'O') {
mouse[y*16 + x] = COL8_FFFFFF;
}
if (cursor[y][x] == '.') {
mouse[y*16 + x] = bc;
}
}
}
}
- 移动已经初始化好的内存,里面存放着鼠标对应的图片
void putblock(char* vram, int vxsize, int pxsize,int pysize, int px0, int py0, char* buf, int bxsize) {
int x, y;
for (y = 0; y < pysize; y++)
for (x = 0; x < pxsize; x++) {
vram[(py0+y) * vxsize + (px0+x)] = buf[y * bxsize + x];
}
}
- 需要注意的是,在这里申请堆内存,最好是直接用stiatc。
static char mcursor[256];
- 删除之前调用绘制字符串的代码,最终效果如下: