【操作系统】30天自制操作系统--(13)高分辨率及键盘输入

        本章内容主要讲的是提高显示分辨率(汇编)和通过键盘码映射表实现键盘输入的显示。相对来说较为简单的一张内容,这边主要是起到一个补充讲解的作用。

一 高分辨率模式

        由于画面切换中我们要使用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点击窗口标题栏,就可以拖动窗口位置的功能,自己尝试做了一下,效果不是很理想,慢速拖动窗口时还能伴随鼠标移动,速度一快刷新就有问题了,这边暂且不表。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值