本章内容主要讲的是提高显示分辨率(汇编)和通过键盘码映射表实现键盘输入的显示。相对来说较为简单的一张内容,这边主要是起到一个补充讲解的作用。
一 高分辨率模式
由于画面切换中我们要使用BIOS,所以就需要改写asmhead.nas的画面模式设定部分(参考链接【操作系统】30天自制操作系统--(3)C语言写内存与简单的画面显示):
可以修改为:
; 设定画面的模式
MOV BX,0x4101 ; VBE的640x480x8bi彩色
MOV AX,0x4f02
INT 0x10
MOV BYTE [VMODE],8 ; 记录画面的模式
MOV WORD [SCRNX],640
MOV WORD [SCRNY],480
MOV DWORD [VRAM],0xe0000000
二 键盘输入
键盘码映射表如下(其中,表中的值表示按下键的数值,在此基础上加上0x80就是改键弹起时的数值,例如“A”键按下是1E,弹起是9E):
那么,我们可以编写键盘码映射表:
static char keytable[0x54] = {
0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '^', 0, 0,
'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '@', '[', 0, 0, 'A', 'S',
'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', ':', 0, 0, ']', 'Z', 'X', 'C', 'V',
'B', 'N', 'M', ',', '.', '/', 0, '*', 0, ' ', 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, '7', '8', '9', '-', '4', '5', '6', '+', '1',
'2', '3', '0', '.'
};
接收缓冲区键盘的数值,作为keytable的下标就可以显示出按下了什么键,使用很方便:
if (256 <= i && i <= 511) {
// 键盘数据
sprintf(s, "%02X", i - 256);
putfonts8_asc_sht(sht_back, 0, 16, COL8_FFFFFF, COL8_008484, s, 2);
if (i < 256 + 0x54) {
if (keytable[i - 256] != 0) {
s[0] = keytable[i - 256];
s[1] = 0;
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, s, 1);
}
}
}
三 鼠标移动窗口
这边的新增代码只有四句话,放到接收到鼠标缓冲区数据的分支中去,即可实现鼠标左键点击到哪边,窗口就跳跃到哪边显示:
if ((mdec.btn & 0x01) != 0) {
// 按下左键,移动 sheet_win
sheet_slide(sht_win, mx - 80, my - 8);
}
但是,遗憾的是,目前并没有完成类似于WINDOWS点击窗口标题栏,就可以拖动窗口位置的功能,自己尝试做了一下,效果不是很理想,慢速拖动窗口时还能伴随鼠标移动,速度一快刷新就有问题了,这边暂且不表。