发布于 

30天自制操作系统(14)

DAY14_高分辨率及键盘输入

1. 继续测试性能

  • 之前我们通过“消除位移处理”缩短时间,对于很多“位移”情况,改进才能看到效果。所以我们使用大量的定时器,然后对性能进行比较。

2.提高分辨率(1)

  • 由于画面切换中我们要使用BIOS,所以就需要改写asmhead.nas的“画面模式设定”部分了。
; 设定画面模式
MOV BX,0x4101 ; VBE的640x480x8bi彩色
MOV AX,0x4f02
INT 0x10
MOV BYTE [VMODE],8 ; 记下画面模式(参考C语言)
MOV WORD [SCRNX],640
MOV WORD [SCRNY],480
MOV DWORD [VRAM],0xe0000000

3.提高分辨率(2)

  • 将程序改写,使在真机上运行

4.键盘输入(1)

  • 按照下表,在键盘按键的基础上加上0x80就可以得到键弹起时的数值
    14.1

5.键盘输入(2)

  • 问题:每一个按键都需要一个if,程序会变长,我们进行修改:
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', '.'
};
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);
}
}
} else if (512 <= i && i <= 767) { /* 鼠标数据 */

6.追记内容(1)

==在窗口中添加一些画,改变鼠标和字符的显示位置以及颜色。按下BackSpace,还可以改写已经输入的字符==

7.追记内容(2)

==使用鼠标移动窗口==
添加的程序

if ((mdec.btn & 0x01) != 0) { 
/* 按下左键、移动sht_win */
sheet_slide(sht_win, mx - 80, my - 8);
/* 到这里结束! */ }

  • 即使窗口跑到了画面外,也没有问题。因为我们已经针对鼠标指针提前采取了对策,这就如
    同图层跑到了画面外面也可以动起来一样。