30日でできるOS自作入門 5日目
p.97「0x0ff4とかの番地がいったいどこから出てきたのか?」「asmhead.nasに数字を合わせただけ」asmhead.nasってもともとなんだっけ?
→3日目までharibote.nasだったもの。
p.62を見てみる。
haribote.nas
CYLS EQU 0x0ff0 ; ブートセクタが設定する
LEDS EQU 0x0ff1
VMODE EQU 0x0ff2 ; 色数に関する情報。何ビットカラーか?
SCRNX EQU 0x0ff4 ; 解像度のX
SCRNY EQU 0x0ff6 ; 解像度のY
VRAM EQU 0x0ff8 ; グラフィックバッファの開始番地
;(中略)
MOV BYTE [VMODE],8 ; 画面モードをメモする(C言語が参照する)
MOV WORD [SCRNX],320
MOV WORD [SCRNY],200
MOV DWORD [VRAM],0x000a0000
なぜVMODE以降から番地を2つおきに確保しているのか?
→1つの番地当たり1Byte=8bitなので、1つの番地で表せる最大値は 11111111(2)=255
解像度はx方向が320で255を超えてしまうため、2Byteのメモリを確保する必要がある。
実際、その後の代入文ではMOV WORD
を使用している。
VRAMの0x000a0000はBIOSによって決められている値。
0x0ff4の出どころは分かったけど、その元になった0x0ff0っていったい?
ipl10.nas
MOV [0x0ff0],CH ;IPLがどこまで読んだのかメモ
→p.63「メモリマップによるとこのへんも誰にも使われていないようでしたので」
筆者が適当に決めてCYLS
の値をメモした番地。
p.98「このかたまりは合計12バイトです」charは1Byte、shortは2Byteだから9Byteじゃないの?
bootpack.c
struct BOOTINFO{
char cyls, leds, vmode, reserve;
short scrnx, scrny;
char *vram;
};
→p.76に記載がある。
「char *p;でもshort *p;でもint *p;でも、変数pは4バイトの変数です」
「この変数pは『番地』を記憶するための変数だからです」
ポインタは4Byteの変数なので12Byteで正しい。
「番地(vram)」は4Byteの変数として管理されている。その番地に入っている「値(*vram)」は1Byteの変数(char)として管理されている。