11日目が終わった。
ここまででしみじみと感じるのだが、やはり本を目で追うだけでなく、
たとえ理解できなくてもソースコードを手打ちするのは大いに意義がある。
人間には、タイプミスの一つや二つは余裕で紛れ込んでしまう。
そのために誘発されたバグの原因を探るため、自ずからソースコードを
努力して理解するものだ。
Twitterをご覧になっていた方は目にしたのではないかと思う。
これ、背景の下の方にウィンドウが少し表示されているので、おそらく
背景用バッファbuf_backの領域にウィンドウ用バッファbuf_winが重複してしまった
ために上書きされているのではないかと思って原因を探っていたところ…
dword mem_alloc_4k(MEMORY_MANAGE *man, dword size) {
dword a;
size = (size + 0xff) & 0xfffff000;
a = mem_alloc(man, size);
return a;
}
memory.cの135行目、本来ならば「size = (size +
0xfff) & 0xfffff000;」となるはずなのだが…
これではsizeの(16進数において)下から3桁目が強制的に切り捨てられる。
よって、メモリを確保したつもりなのに、実は領域が少し足りていなかった状態になってしまう。
そして、mem_alloc関数の仕組みとOS起動後のメモリの開放の仕方によって、
最初に確保したbuf_backの次に確保されるbuf_winには、
buf_backの最後尾アドレスからのメモリが当てられる。
そのため、メモリ領域が重複してしまっていたのだ。
動作しなければ原因を意地でも特定する。特定できたら、なぜそれでは動作しないかを考える。
こうすることでコードを読む力もコーディング力も上昇するのではないかと思う。