Great article but it didn't have evgterhiny-I didn't find the kitchen sink! このページは[[OS-Wikiのページ:http://community.osdev.info/index.php?bochs]]のコピーです。 * bochsのページ [#qbe34a7c] *** bochs 2.1.1でサポートされる画面モード [#cfa2b7f4] -''qemu''もbochsのグラフィックルーチンが入っているので、まったく同じように扱える。 -VGA |mode|type|size|color|pages|buff-addr| |0x00|text|40x25|4bit|8|0xb8000| |0x01|text|40x25|4bit|8|0xb8000| |0x02|text|80x25|4bit|8|0xb8000| |0x03|text|80x25|4bit|8|0xb8000| |0x04|graph|320x200|2bit|1|0xb8000| |0x05|graph|320x200|2bit|1|0xb8000| |0x06|graph|640x200|1bit|1|0xb8000| |0x07|text|80x25|1bit|1|0xb0000| |0x0d|graph|320x200|4bit|8|0xa0000| |0x0e|graph|640x200|4bit|4|0xa0000| |0x0f|graph|640x350|1bit|2|0xa0000| |0x10|graph|640x350|4bit|1|0xa0000| |0x11|graph|640x480|1bit|1|0xa0000| |0x12|graph|640x480|4bit|1|0xa0000| |0x13|graph|320x200|8bit|1|0xa0000| |0x6a|graph|800x600|4bit|1|0xa0000| --テキストモードのとき、フォントデータは0xa0000~0xa1fffに納められている。1キャラクタあたり32バイトで、8x16のときは前半16バイトのみが使われる。 ---この件に対する註があるのでこめんと欄で確認のこと。 -VESA (ver.2.0) |mode|size|color|window|linear| |0x0100| 640x400| 8bit|○|○| |0x0101| 640x480| 8bit|×|○| |0x0102| 800x600| 4bit|○|×| |0x0103| 800x600| 8bit|○|○| |0x0105|1024x768| 8bit|○|○| |0x0110| 640x480|15bit|○|○| |0x0111| 640x480|16bit|○|○| |0x0112| 640x480|24bit|○|○| |0x0113| 800x600|15bit|○|○| |0x0114| 800x600|16bit|○|○| |0x0115| 800x600|24bit|○|○| |0x0116|1024x768|15bit|○|○| |0x0117|1024x768|16bit|○|○| |0x0118|1024x768|24bit|○|○| |0x0142| 640x480|32bit|○|○| |0x0143| 800x600|32bit|○|○| |0x0144|1024x768|32bit|○|○| |0x0146| 320x200| 8bit|×|○| --windowの項目は、0x0101と0x0102が逆なんじゃないかと思わないでもない。 --15bitカラーモードのとき、このリザーブされている15bit目は常に0にすること。 --32bitカラーモードのとき、上位8bitは任意の値であってよい(無視される)。 --VGABIOSのASKA版では、0x0112、0x0115、0x0118が32bitカラーで、0x0142、0x0143、0x0144が24bitカラーになる。 *** VESAファンクションを使わずに拡張グラフィックを使う方法 [#u79376be] -メモリ --物理アドレス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にマップされる。 * こめんと欄 [#v7c872b6] -bochs に限った話ではありませんが、テキストモードのフォントデータは map 2 です。アクセスするにはVGAのレジスタをいじる必要があります。0xa0000 にアクセスしただけでは書けません。 -- ''名無しさん'' SIZE(10){2004-10-30 (土) 09:24:50} -bochsのテキストモードはエミュレートが完全ではないようで、フォントを書いてもレジスタの設定によってはうまく動かないみたいです。 -- ''名無しさん'' SIZE(10){2004-10-30 (土) 09:27:18} -情報ありがとうございます。 -- ''K'' SIZE(10){2004-10-30 (土) 11:43:02} //#comment