5 键盘输入(2)(harib11g)
到了这一步,我们希望也能输入“B”和“C”等字符。那么,我们来动手写程序。
首先我们创建以下程序:
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 == 0x1e + 256) {
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, "A", 1);
}
if (i == 0x30 + 256) {
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, "B", 1);
}
if (i == 0x2e + 256) {
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, "C", 1);
}
if (i == 0x20 + 256) {
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, "D", 1);
}
if (i == 0x12 + 256) {
putfonts8_asc_sht(sht_win, 40, 28, COL8_000000, COL8_C6C6C6, "E", 1);
}
} else if (512 <= i && i <= 767) { /* 鼠标数据 */
如果我们像上面这样写程序,仅仅是字母(26个)和数字(10个),就得写36个if语句。这样做的话,程序可就变长了。这不太好,必须要想出一个好办法。
■■■■■
因此又创建了如下程序。怎么样?
本次的HariMain节选
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) { /* 鼠标数据 */
之所以笔者把keytable[ ]设定为static char,是因为希望程序被编译为汇编语言的时候,static char能编译成DB指令。设定调色板的时候也是如此,大家还记得吗?
现在我们来解释这个程序的运行机制。比如说keytable[0x1e]对应的是“A”。而“A”的字符代码是0x41。如果i == 0x1e + 256的话,keytable[i - 256]就是“A”,所以s[0]也就是“A”了。
同理,“B”、“C”、“Z”以及“5”等也应该可以显示了。
■■■■■
让我们确认一下吧。运行“make run”。不错,很顺利呀。
按下“G”键
运行“make run”后,按下“@”等键,却显示出“W”。大家也许会想“唉?怎么回事儿?”,这是因为当“@”被按下的时候,HariMain接收到了0x11(请确认左上方的显示内容),这不是HariMain的bug,而是QEMU的问题(我想这可能是因为日语键盘还没有得到充分支持吧)。还有其他几个键,按下以后会显示出奇怪的字符。这些好像都是QEMU的问题。
如果读者还是觉得不放心,可以在真机上确认。运行肯定会很顺利的。