キーコードを取得する

1
2
3
4
io_out8(PIC0_OCW2, 0x61);	/* IRQ-01受付完了をPICに通知 */

#define PORT_KEYDAT 0x0060
data = io_in8(PORT_KEYDAT);

OCW(Operation Command Word)は動作時にPICを制御するコマンドのこと。今回の場合EOI(End of Interrupt)コマンドは01100???の形式で???にIRQ番号が入る。EOIコマンドはOCW2に伝えることになっているらしい。0x0060を読み取ることでキーコードを取得できる。

バッファ作成

ある長さのバッファを用意しておいて、読み書きそれぞれのポインタを保持しておき最後まで行ったら最初に戻すと、データをずらす必要がなくなるというのはなるほどな~と思った。

マウス

マウス制御回路とマウス自体を初期化しなければならない。キーボード制御回路の中にマウス制御回路が入っているので、キーボード制御回路を扱ってマウス関連の操作ができる。この制御回路はCPUほど速くないので、CPUが待ってやる必要がある。

1
2
io_out8(PIC1_OCW2, 0x64);	//スレーブの12-8=4番目
io_out8(PIC0_OCW2, 0x62); //スレーブはマスタの2番につながっている

制御装置が同じだからマウスかキーボードかは割り込み番号(どの関数が呼ばれたか)で判断する

1
data = io_in8(PORT_KEYDAT);

動作確認

Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
TARGET=os.img
SYSFILE=haribote.sys
FONT_SRC=font

FONT_OBJ=$(FONT_SRC).o

default:$(TARGET)

$(TARGET): ipl10.o $(SYSFILE)
mformat -f 1440 -C -B $< -i $(TARGET) ::
mcopy $(SYSFILE) -i $(TARGET) ::

$(SYSFILE): asmhead.o bootpack.hrb
cat $^ > [email protected]

# fifo.oを追記・myclib.cにsprintf関数が入っている
bootpack.hrb:$(FONT_OBJ) myclib.o fifo.o int.o graphic.o dsctbl.o naskfunc.o bootpack.o
ld -m elf_i386 -T os.ld $^ -o [email protected]

%.o: %.c
gcc -w -c -m32 -nostdlib -fno-pie $*.c -o $*.o

%.o: %.nas
nasm $*.nas -o $*.o

naskfunc.o: naskfunc.nas
nasm -f elf $< -o [email protected]

$(FONT_OBJ):
objcopy -I binary -O elf32-i386 -B i386 --redefine-sym _binary_font_start=hankaku $(FONT_SRC) [email protected]

clean:
rm *.bin *.sys *.img *.o

run:
qemu-system-x86_64 -fda .\$(TARGET)

pre:
nkf --overwrite *.nas *.c
sed -i s/0x7dfe-\\$$/0x01fe-\(\\$$\-\\$$\\$$\)/ ipl10.nas
sed -i -E 's/( |\t|^)_/\1/g' naskfunc.nas
sed -i s/^\\[/\;\\[/ naskfunc.nas asmhead.nas

自作のsprintfでは%d %xしか用意していないので出力部分を修正し、背景クリアの部分もちゃんと消えるように調整した。

参考文献