3: 2007-11-23 (金) 00:32:44 |
現: 1970-01-01 (木) 18:00:00 |
- | えとえと、''VGA''という単語そのものはいろいろと意味がありそうですが、ここでは640x480x16色のモードのことということで・・・ | |
| | | |
- | *プレーン方式 [#yc14dbaf] | |
- | VGAはどうもこのプレーン方式というものらしい。つまり、ひとつのドットがひとつの値というのではなく、プレーンという何枚かあるセル(はりぼて風に言えば''下じき''かな?)があり、そこにおのおのデータを書き込むことでひとつのドットの色を表現しているらしい | |
- | | |
- | 赤・緑・青・輝度 の4枚らしい。 | |
- | | |
- | で、たとえば、画面上で Xが5、Yが0という場所に点を一個打ちたいとする。 | |
- | | |
- | これが320x200x256やVESAの高解像度等、単純にVRAMのあるアドレスに値を書けば反映される。 | |
- | | |
- | ・VRAMは0xa0000から始まる | |
- | ・X(横)が5、Y(縦)は0だから、単純に0xa0000から6番目、0xa0004番地。 | |
- | ・ここに0x8(色番号)とか書きこめばそこにドットが書かれる | |
- | | |
- | しかしVGAの場合は1ドット=1ビットとなる。なので、同じように点を書くとすると・・・ | |
- | (ちょっと色などはおいて置く) | |
- | | |
- | ・VRAMは0xa000から始まる | |
- | ・X(横)が5、Y(縦)は0だから、単純に0xa0000から6番目、0xa0005番地ではない! | |
- | ・左から6個目に点なので、0x40 (0000100000000000)。 | |
- | ・この値を0xa0000に書くと点が書かれる | |
- | | |
- | こういう方式になるようだ。 | |
- | | |
- | 当然これだけじゃ、0と1なので、白・黒など二色しか色は表現できない。 | |
- | | |
- | そこで他のプレーン?にも書き込みを行い、それらを重ね合わせた結果、赤なり緑なりの | |
- | 色が表現される・・・・のかな???? | |
- | | |
- | 1番プレーン〜4番プレーン(仮称)におのおのデータを書くらしいのはわかった。 | |
- | では、具体的に2番プレーンに書き込むにはどうしたらいいのだろう??? | |
- | | |
- | 最初、1番プレーンは0xa0000〜0xaFFFF、2番プレーンは0xb0000〜0xbffffとかいう感じではないかと思っていたが、どうも違うらしい。 | |
- | | |
- | AT互換機のVGAのプレーンは、どうも全て同じ番地のようだ!!!!???? | |
- | | |
- | ・・・っということは、多分、書き込む前になにかしら命令を出して、プレーンを切り替えるというような作業が必要なんじゃないかな??? | |
- | | |
- | | |
- | COLOR(red){むずかしくてキツいが、OS-Wikiの該当ベージをことあるごとに読み込んでいます・・・} | |
- | | |
- | | |
- | ラッチかぁ・・・どうもこれがカギみたいだなぁ・・・ | |
- | | |
- | **臭う・・・臭うぞ!? [#b2de89ee] | |
- | クサイのはこれである。シーケンサーという部分の | |
- | [0x02] Map Mask (プレーンごとの書き込み許可) | |
- | という所。ここはどうも、各プレーンへの書き込みを許認可しているようだ。そんなわけで、こういうことをしてみるとプレーン0〜3まで書き込めないか?? | |
- | //マップマスクの実験 | |
- | io_out8(0x03c4, 0x0002); //00000000 | |
- | for ( i = 0; i <= 512*1; i=i++) | |
- | { | |
- | p[i] = 0x6; | |
- | } | |
- | | |
- | io_out8(0x03c4, 0x0102); //00000001 | |
- | for ( i = 0; i <= 512*1; i=i++) | |
- | { | |
- | p[i] = 0x6; | |
- | } | |
- | | |
- | io_out8(0x03c4, 0x0202); //00000010 | |
- | for ( i = 0; i <= 512*1; i=i++) | |
- | { | |
- | p[i] = 0x6; | |
- | } | |
- | | |
- | io_out8(0x03c4, 0x0302); //00000011 | |
- | for ( i = 0; i <= 512*1; i=i++) | |
- | { | |
- | p[i] = 0x6; | |
- | } | |
- | | |
- | うーーーん・・・なにも変化がない・・・ | |