このページはOS-Wikiのページのコピーです。

bochsのページ  

bochs 2.1.1でサポートされる画面モード  

  • qemuもbochsのグラフィックルーチンが入っているので、まったく同じように扱える。
  • VGA
    modetypesizecolorpagesbuff-addr
    0x00text40x254bit80xb8000
    0x01text40x254bit80xb8000
    0x02text80x254bit80xb8000
    0x03text80x254bit80xb8000
    0x04graph320x2002bit10xb8000
    0x05graph320x2002bit10xb8000
    0x06graph640x2001bit10xb8000
    0x07text80x251bit10xb0000
    0x0dgraph320x2004bit80xa0000
    0x0egraph640x2004bit40xa0000
    0x0fgraph640x3501bit20xa0000
    0x10graph640x3504bit10xa0000
    0x11graph640x4801bit10xa0000
    0x12graph640x4804bit10xa0000
    0x13graph320x2008bit10xa0000
    0x6agraph800x6004bit10xa0000
    • テキストモードのとき、フォントデータは0xa0000~0xa1fffに納められている。1キャラクタあたり32バイトで、8x16のときは前半16バイトのみが使われる。
      • この件に対する註があるのでこめんと欄で確認のこと。
  • VESA (ver.2.0)
    modesizecolorwindowlinear
    0x0100640x4008bit
    0x0101640x4808bit×
    0x0102800x6004bit×
    0x0103800x6008bit
    0x01051024x7688bit
    0x0110640x48015bit
    0x0111640x48016bit
    0x0112640x48024bit
    0x0113800x60015bit
    0x0114800x60016bit
    0x0115800x60024bit
    0x01161024x76815bit
    0x01171024x76816bit
    0x01181024x76824bit
    0x0142640x48032bit
    0x0143800x60032bit
    0x01441024x76832bit
    0x0146320x2008bit×
    • windowの項目は、0x0101と0x0102が逆なんじゃないかと思わないでもない。
    • 15bitカラーモードのとき、このリザーブされている15bit目は常に0にすること。
    • 32bitカラーモードのとき、上位8bitは任意の値であってよい(無視される)。
    • VGABIOSのASKA版では、0x0112、0x0115、0x0118が32bitカラーで、0x0142、0x0143、0x0144が24bitカラーになる。

VESAファンクションを使わずに拡張グラフィックを使う方法  

  • メモリ
    • 物理アドレス0xe000_0000からの4MBがリニアアクセス用のVRAM
  • I/Oポート
    • 0x01ce:ここに16bitライトアクセスしてレジスタ番号を書き込む
    • 0x01cf:ここに16bitライトアクセスしてレジスタデータを書き込む
      • レジスタ0x0000と0x0004と0x0005に関してはリードもできるようだ
  • bochs拡張グラフィックの存在確認方法
    • レジスタ0x0000に0xb0c2をライトする
      • OUT_W(0x01ce, 0x0000);
      • OUT_W(0x01cf, 0xb0c2);
    • レジスタ0x0000をリードしてみる
      • OUT_W(0x01ce, 0x0000); /* これを省略しないこと */
      • IN_W(0x01cf);
    • 0xb0c2が読み出せたら存在していると判断
  • 画面モード切替方法
    • 以下の順序でレジスタをセットすると切り替えられる
    • レジスタ0x0004に0x0000を設定
    • レジスタ0x0001に解像度のxを設定(320, 640, 800, 1024のどれか)
    • レジスタ0x0002に解像度のyを設定(200, 400, 480, 600, 768のどれか)
    • もちろんこれらの組み合わせは上記のVESAモードに存在する正当なものである必要がある。
    • レジスタ0x0003にカラーのbit数を設定(8, 15, 16, 24, 32)
    • レジスタ0x0005に0x0000を設定
    • レジスタ0x0004に0x0001を設定
      • このときbit6を1にしてもよく、そうするとlinear指定したことになる
      • このときbit7を1にしてもよく、そうするとVRAMが初期化されない
    • これだけで切り替わる(VGAレジスタをいじって640x480に切り替えるのと比べると、格段に手間が少ない)。
  • リアルモードからのウィンドウアクセスのためのI/O
    • レジスタ0x0005にセットすればよい。64KB単位。これで0xa0000-0xaffffにマップされる。

こめんと欄  

  • bochs に限った話ではありませんが、テキストモードのフォントデータは map 2 です。アクセスするにはVGAのレジスタをいじる必要があります。0xa0000 にアクセスしただけでは書けません。 -- 名無しさん 2004-10-30 (土) 09:24:50
  • bochsのテキストモードはエミュレートが完全ではないようで、フォントを書いてもレジスタの設定によってはうまく動かないみたいです。 -- 名無しさん 2004-10-30 (土) 09:27:18
  • 情報ありがとうございます。 -- K 2004-10-30 (土) 11:43:02

[リロード]   [新規] [編集] [凍結解除] [差分] [添付]   [トップ] [一覧] [単語検索] [最終更新] [バックアップ]   [最終更新のRSS]
Last-modified: 2006/07/28 (金) 07:02:00 (6481d)