xv6-publicのkbd.cに関する質問です。
36行目から44行目の以下の部分において、
shiftとCAPSLOCKの同時押し時にcが小文字の範囲内に存在した場合はcから、
ASCIIコード表の大文字、小文字間の差を差し引く事でcを大文字運用できる様にし、
cが大文字の範囲内に存在した場合はcに、
大文字、小文字間の差を足し合わせる事でcを大文字運用できる様に変更する。
というのは分かるのですが、何故そもそもcで小文字を利用しているのか、
大文字を利用しているのかを判別出来るのかが分からないです。
つまりcharcode[shift & (CTL | SHIFT)][data];の部分の意味が分かりません
お手数をおかけしますがどなたかご教授頂けないでしょうか。
OSのソースコードを全て載せる事は出来ないので以下のサイトからご面倒ですが確認頂ければと存じます。
リンク内容
c = charcode[shift & (CTL | SHIFT)][data]; if(shift & CAPSLOCK){ if('a' <= c && c <= 'z') c += 'A' - 'a'; else if('A' <= c && c <= 'Z') c += 'a' - 'A'; } return c; }
念の為、下記にkbd.cをそのまま載せておきます。
#include "types.h" #include "x86.h" #include "defs.h" #include "kbd.h" int kbdgetc(void) { static uint shift; static uchar *charcode[4] = { normalmap, shiftmap, ctlmap, ctlmap }; uint st, data, c; st = inb(KBSTATP); if((st & KBS_DIB) == 0) return -1; data = inb(KBDATAP); if(data == 0xE0){ shift |= E0ESC; return 0; } else if(data & 0x80){ // Key released data = (shift & E0ESC ? data : data & 0x7F); shift &= ~(shiftcode[data] | E0ESC); return 0; } else if(shift & E0ESC){ // Last character was an E0 escape; or with 0x80 data |= 0x80; shift &= ~E0ESC; } shift |= shiftcode[data]; shift ^= togglecode[data]; c = charcode[shift & (CTL | SHIFT)][data]; if(shift & CAPSLOCK){ if('a' <= c && c <= 'z') c += 'A' - 'a'; else if('A' <= c && c <= 'Z') c += 'a' - 'A'; } return c; } void kbdintr(void) { consoleintr(kbdgetc); }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/23 12:29
2020/06/23 12:35