OS自作入門 / 2008/08/29 (Fri) / 編集 |
31 void init_palette(void)
32 { 33 static unsigned char table_rgb[16 * 3] = {
34 0x00, 0x00, 0x00, /* 0:黒 */
35 0xff, 0x00, 0x00, /* 1:明るい赤 */
(中略)
50 };
51 set_palette(0, 15, table_rgb);
でもって[OS-Wiki]VGAのビデオDAコンバータんとこにある「パレットのアクセスの手順」によると
57 void set_palette(int start, int end, unsigned char *rgb)
58 {
59 int i, eflags;
60 eflags = io_load_eflags(); /* 割り込み許可フラグの値を記録する */ 61 io_cli(); /* 許可フラグを0にして割り込み禁止にする */
62 io_out8(0x03c8, start);//パレット番号を設定
63 for (i = start; i <= end; i++) {
64 io_out8(0x03c9, rgb[0] / 4);//パレットの色を設定
65 io_out8(0x03c9, rgb[1] / 4);
66 io_out8(0x03c9, rgb[2] / 4);
67 rgb += 3;
68 }
69 io_store_eflags(eflags); /* 割り込み許可フラグを元に戻す */
70 return;
71 }
でパレットの設定ができるらしい、ちなみにio_out8()は「portに繋がっている装置にdataを出力する」というものらしい。 読み出しは0x03c7にパレット番号を書き込み、0x03c9を3回読み込むとRGBの順番で出力されるんだとか
この後
20 p = (char *) 0xa0000; /* 番地を代入 */
21
22 for (i = 0; i <= 0xffff; i++) {
23 p[i] = i & 0x0f;
24 }
とするとディスプレイに縞模様が出力されるらしい!なんでやねん!?
まぁ先日の記事を後で修正しておくので「なぜVRAMに書き込む事になるのか?」はそこ参照(大雑把にいうと「*(p+i)==p[i]」だから)、縞模様になるのはパレットで「色番号0は黒」とか設定してあるから「p[i] = i & 0x0f;(VRAM=色番号)」でVRAMに色番号0から15までを交互に代入することによって縞模様になる、たぶん。(変数名をvramにすればわかりやすいんじゃね?とか思ったがなぜpのままなんだろう?)
EFLAGSというのはさまざまなフラグが格納された特別なレジスタらしい、でもってio_cli()はこのEFLAGSの9ビットにある割り込みフラグ(IF:Interrupt flag)を0にする(つまり割り込みを禁止する)という関数なんだってさ
ちなみに16bitCPUではFLAGS、64bitCPUではRFLAGSと呼ばれるらしい
でもってめんどうなことにC言語では読み書きできないんだとか、、、よってアセンブラを使う事に、そのうえスタックを経由しないとだめらしい
73 _io_store_eflags: ; void io_store_eflags(int eflags);
74 MOV EAX,[ESP+4]
75 PUSH EAX
76 POPFD ; POP EFLAGS という意味
77 RET
ちなみに16bitCPUではFLAGS、64bitCPUではRFLAGSと呼ばれるらしい
でもってめんどうなことにC言語では読み書きできないんだとか、、、よってアセンブラを使う事に、そのうえスタックを経由しないとだめらしい
73 _io_store_eflags: ; void io_store_eflags(int eflags);
74 MOV EAX,[ESP+4]
75 PUSH EAX
76 POPFD ; POP EFLAGS という意味
77 RET
PR
トラックバック
URL :
コメント