はりぼて日記
2007 | 01 | 02 | 03 | 04 | 05 | 07 | 08 | 10
2006 | 11 | 12
12月 22 (金曜日) 2006
17:24
五日目2
 
五日目 〜2。

うーむ。構造体そのものはそんなわけで解っている。structを使って定義し、HariMain内で宣言して使えるようにすると・・・

 struct BOOTINFO *binfo;

・・・え”?
*binfo? binfoじゃなくて? *? え〜???? ひええぇぇぇ!!! わっかんね〜!!(泣

       ・
       ・
       ・
・・・ぁ〜  あ〜 あぁ〜!なるほどそういうことか!
前後の読み込みが足りなかった。なるほど。これは、「俗にいう変数宣言」じゃないんだ。極論すれば、「メモリのアドレスに名前をつけて扱いやすくしたい」というだけのことなのか!。勘違いしてた。

ええと、まず、一個前のソースでやってるよね。つまり、

 binfo_scrnx = (short *) 0x0ff4;

とか。これはどういう意味かって言うと、書き方が特殊なので「あれれ?」と思ったけどなんのことはない。

「メモリ番地 0x0ff4〜0x0ff5(2バイト分)を、binfo_scrnxっていう名前でアクセスできるようにしてくれ」

ってだけのことじゃマイカ。例の「型キャスト&省略」タイプの書き方なのでわからんかった。キャストや省略を無視して書けば、

short *binfo_scrnx;
binfo_scrnx = 0x0ff4;

と、こうしているだけなんですなぁ。なるほどなるほど。

で!!!!

同じようなことを構造体で一まとめにしてやっちゃおうってわけね。なるほど〜。

ちょっと変則的だけど、私はこんなふうに理解してみた。
たとえば、

 struct BOOTINFO binfo;

と普通に「binfo構造体」を定義する。その場合、定義どおりに、あるどこかのメモリ番地にbinfo用のエリアが予約される。(これはたぶん、毎回不定のはず。)じゃ、たとえば解りやすく、0x1000に割り当てられたとしよう。そうすると、

0x1000  char cyls
0x1001  char leds
0x1002  char vmode
0x1003  char reserve
0x1004  shor scrnx
0x1005    〃
0x1006  shor scrny
0x1007    〃
0x1008  char *vram  (ポインタすなわちメモリアドレス用なので4バイト)
0x1009    〃
0x1010    〃
0x1011    〃

っとまあ、こういう感じになるわけだ。

・・・・・で!!!!!

この、毎回ちがうアドレスに設定される binfo構造体の開始アドレスを、0x0ff0 に強制的に設定したいわけ。(0x0ff0〜12バイトの部分には、asmhead.nasによってグラフィック関係の値がすでにセットされているので)そのための方法が、

 struct BOOTINFO binfo;

じゃなくて、

 struct BOOTINFO *binfo;
 binfo = 0x0ff0;

になるわけだ!(例によって型キャストとかはちょっと省略してある)なるほどなるほど〜!!!  シンプルに分解したら、やっと解ったぞ!
 
30日を過ぎたBlogにはコメントできません。

Referer  (4)
(1) 2 3 4 5 6 7 8 9 10 » 

PopnupBlog V3 Denali created by Bluemoon inc.