简介
当前我们系统的分辨率是320*200, 这种分辨率太小导致显示效果不好!
目标
;设置屏幕色彩模式
mov bx,0x4101
mov ax,0x4f02
int 0x10
同320200中断调用号一样,只需要修改传递的参数即可调整显示分辨率。不过显存地址由0xa0000 变为 0xe0000000。
指定分辨率有以下几种方式:
bx = 0x4101 表示分辨率为 640480
bx = 0x4103 表示分辨率为800600
bx = 0x4105 表示分辨率为1024768
bx=0x4107 表示分辨率为1280*1024
上面的显示形式都是8位色彩模式。
1.os.c
修改init_main 函数显存信息如下
_vram.addr = (unsigned char *)0xe0000000;
_vram.screenW = 640;
_vram.screenH = 480;
再修改以前320×200的相关代码。运行效果如下图:
键盘响应改进
键盘扫描码转换为可输出的Ascii字符,转换成功返回非0。
unsigned char scanCode2Ascii(int code){
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', '.'
};
return keytable[code];
}
修改键盘终端响应操作如下:
//断码 = 通码 + 0x80
if(_keybufInfo.len>0){
io_cli();
char data = fifo8_get(&_keybufInfo);
if(data == 0x1c){
memId++;
if(memId==memCount){
memId=0;
}
showMemInfo(memDes+memId,memId);
}
else if(scanCode2Ascii(data)!=0 && (unsigned char)data<0x80){
int len = 0;
_tempArr[len++] = scanCode2Ascii(data);
_tempArr[len++] = 0;
showString(_shtctl,_shtMsg,140,44,COL8_FFFFFF,COL8_C6C6C6,_tempArr);
}
io_sti();
运行并按A键效果如下:
其中部分非字母按键是有问题的!不过现在不影响相关操作,先跳过!