OS自作入門 / 2008/09/01 (Mon) / 編集 |
FIFOは言わずもがなのFirst In First Outね
ようはキーボードから受け取ったデータを実際に使用するまでいったん保存しておかないといけないわけで、そのためにFIFOでバッファを作っとく(LIFOじゃない理由も言わずもがな)
キーボードからの割り込みはPICについて調べてもらうとして、以下はキーボードからの割り込みによって呼び出される関数(inthandler21)の説明
ようはキーボードから受け取ったデータを実際に使用するまでいったん保存しておかないといけないわけで、そのためにFIFOでバッファを作っとく(LIFOじゃない理由も言わずもがな)
キーボードからの割り込みはPICについて調べてもらうとして、以下はキーボードからの割り込みによって呼び出される関数(inthandler21)の説明
- PICに返事をする キーボードはIRQ1なので0x61という返事を送ればいい
- キーボードからのデータを取得 0x0060というところにおいてある値のbit0-6がキーコードらしい、詳細は[OS-Wiki](AT)keyboard
- キーボードからのデータをバッファに保存
-
実装はどう考えてもソースを見た方がわかりやすい
//bootpack.h
#define PIC0_OCW2 0x0020
struct FIFO8 {
unsigned char *buf;
int p, q, size, free, flags;//書き込み位置,読み込み位置,サイズ,バッファの空き,フラグ
};
登録方法は省略して書き込むとこね
//int.c
#define PORT_KEYDAT 0x0060
struct FIFO8 keyfifo;
void inthandler21(int *esp) {
unsigned char data;
/* IRQ-01受付完了をPICに通知 */
io_out8(PIC0_OCW2, 0x61);
data = io_in8(PORT_KEYDAT);
fifo8_put(&keyfifo, data);
return;
}
なるほどね、おれが以前作ったのよりずっといいなこのFIFO(当たり前かw)、今後参考にしよう。
PR
OS自作入門 / 2008/08/30 (Sat) / 編集 |
GDT(Global (segment) Descriptor Table):大域セグメント記述子表
セグメントの情報(下の三つ)を書いたテーブル- セグメントの開始位置(base)
- セグメントの属性(access)
- セグメントの大きさ(limit)
ここでめんどくさいこと発生、構造体をみるとlimitが20bitしか用意されてない、これだとセグメントの大きさが最大1MBしか指定できない、、、
というわけで「Gビット」というフラグが使われる、これが1だとlimitをbyte単位ではなくpage単位(4KB)だと判断してくれる
アクセス権(全部で16bitある)の上位4bitは拡張アクセス権、「GD00」という構造になっている、ちなみにDはセグメントのモードで1だと32bit、0だと16bit
アクセス権の9~12bitは0、アクセス権の下位8bitは以下、
- 0x00:未使用のDescripter Table
- 0x92:システム専用、読み書き可能だが実行不可
- 0x9a:システム専用、実行と読み込みが可能、書き込み不可
- 0xf2:アプリケーション用、読み書き可能だが実行不可
- 0x9a:アプリケーション用、実行と読み込みが可能、書き込み不可
OS自作入門 / 2008/08/30 (Sat) / 編集 |
まぁ省略しすぎて読んでも意味が分からないかもしれないけど、、、
fontを作成(8x16)
........
...**...
...**...
...**...
...**...
..*..*..
..*..*..
..*..*..
..*..*..
.******.
.*....*.
.*....*.
.*....*.
***..***
........
........
↓
バイナリ化
↓
_hankaku:
DB バイナリ化したデータたくさん
(保存位置はASCIIコードに準処しておくと便利)
C言語からアクセスするには
extern char hankaku[サイズ]
あとは「hankaku + 'A' * 16」とかでメモリ中のAのフォント位置を指定できるので、0のとこは黒、1のとこは白になるようにVRAMに書き込む(putfont_asc()、putfont8を参照)
ようはAAを描く->バイナリ化して保存しとく->使うときに呼び出してVRAMを使って(ドット絵みたいに)画面に表示、マウスカーソルとかも似た感じ
まぁソースコードと見比べればこれくらいのメモで思い出せるだろう、、、
fontを作成(8x16)
........
...**...
...**...
...**...
...**...
..*..*..
..*..*..
..*..*..
..*..*..
.******.
.*....*.
.*....*.
.*....*.
***..***
........
........
↓
バイナリ化
↓
_hankaku:
DB バイナリ化したデータたくさん
(保存位置はASCIIコードに準処しておくと便利)
C言語からアクセスするには
extern char hankaku[サイズ]
あとは「hankaku + 'A' * 16」とかでメモリ中のAのフォント位置を指定できるので、0のとこは黒、1のとこは白になるようにVRAMに書き込む(putfont_asc()、putfont8を参照)
ようはAAを描く->バイナリ化して保存しとく->使うときに呼び出してVRAMを使って(ドット絵みたいに)画面に表示、マウスカーソルとかも似た感じ
まぁソースコードと見比べればこれくらいのメモで思い出せるだろう、、、