VGAのテキストモード

  • BIOSを使わずにテキストモードで文字を書きたい、という人のための情報。
  • OS-WikiのルールではどのOSにも関係ないことを書いてはいけないので、書くつもりはなかったのですが、必要な人がたまにいるようなので書くことにしました(by K, 2004.10.21)。半年くらい待ってもこの情報を利用するOSがOS-Wikiにこなければ、このページは消します。

とにかく文字を表示したい

  • まあだまされたと思って、0xb800:0x0000の1バイトに適当なキャラクターコードを、そして0xb800:0x0001の1バイトに適当な数値を書いてみてください(この適当な数値のbit0-3が文字色、bit4-7が背景色になる)。そして画面左上に注目してください。
  • 何を書くと何が出るのかが大体把握できたら、今度は0xb800:0x0002と0xb800:0x0003で同じことをやってみます。・・・それもできたら、今度はアドレスを少しずつ増やしてみればいいでしょう。これで、画面の好きな場所に好きな文字を出せるようになるはずです。
  • 上の内容はリアルモードのものです。もしプロテクトモードでも使いたかったら物理アドレス0xb8000以降をアクセスしてください。

発展

  • 画面消去は?
    • 画面全体を空白のキャラクタコード(0x20)で埋め尽くせばいいでしょう。
  • スクロールは?
    • 行を転送するんです。
  • カーソルが邪魔だ or カーソルを移動させたい
    • これはVGAのCRTコントローラをいじります。
    • まずカーソルをどこに移動させたいかを考えて、それが0xb800:0x0000から何バイト離れているかを考えます。そしてそれを2で割ります。そしてその値をAXに入れます。
    • そのあとは次の通り
      PUSH(AX); DX = 0x03d4; AL = 0x0e; OUT(DX, AX); POP(AX); AH = AL; AL = 0x0f; OUT(DX, AX);
    • 何をやっているのかというとVGAのCRTコントローラの、レジスタ[0x0e]と[0x0f]を書き換えています。詳細は、VGAのページを見てください。
    • この方法でカーソルを画面外に追放すれば(たとえば一番下の次の行とかにする)、カーソルがいなくなります(カーソルを追い出すだけなら、[0x0a]を使う方法もある)。
    • なお、[0x0a]と[0x0b]をいじれば、カーソルの形状もいじれます。

こめんと欄

  • カーソル制御の方法を希望します。よろしくお願いします。 -- TaTsu. 2004-10-22 (金) 12:29:04
  • C MAGAZINE(2004/07)に書いてあったと思うけど・・・ 元ネタどこだ・・・? -- 名無しさん 2004-10-22 (金) 13:59:38
  • 要望があったのでカーソル制御を書き足しました。 -- K 2004-10-22 (金) 14:40:41
  • 私もtextモードの資料きぼんしてますので消さないでくださーい。 -- MiSt 2004-10-23 (土) 20:07:54
  • やってみましたが、失敗してしまいました。ブート直後ではダメなのでしょうか?? -- 名無しさん 2006-03-13 (月) 23:35:32
  • QEMUでは、成功しました。 ( Lights計画?のブートセクタ中で使ってます。 ) -- Sero 2006-04-06 (木) 21:28:53
  • けさないでください -- とくめい 2006-09-06 (水) 11:48:54

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-09-19 (金) 13:23:01 (1912d)