[解決済み] x86アセンブリで160x100モードを実現する
質問
IBM CGAでCRTCを使って行の高さを2ピクセルに変更することで、擬似的に160×100のグラフィックモードが実現できることは以前から知っていたのですが。数日前からこれを実現しようとしているのですが、行き詰まっています。
その インテル® オープンソース HD グラフィックスと インテル® Iris™ グラフィックス・プログラマーズ・リファレンス・マニュアル claim 45ページ(PDFでは59ページ)のMaximum Scanline Registerに書き込めばできる、あるいはそこから解釈しています。
メモリアドレス3B5に直接、00000001bという値、つまり2スキャンラインのコードで書き込んでみたのですが、どうでしょうか?これは、私がDOSBoxでそれをテストしたとき、全く何もしませんでした。
もしよろしければ、私が書いたNASMでアセンブルするコードを見てみてください。
BITS 16
xor bx,bx
mov ax, 3b5h
mov es, ax
mov ah, 00000001b
mov BYTE [es:bx], ah ; write 00000001b to 0x03b5:0000, right?
cli
hlt
私はこのような低レベルのものにまだあまり自信がないので、何か手助けがあればありがたいです。
どのように解決するのですか?
3b5hではなく、3b50hのアドレスに書き込んでいるのですね。もし、3b5hを書き込みたいのであれば、ESに0をロードして、次のようにします。
mov BYTE [es:3b5h], 01
しかし、それはあなたがしたいことでもありません。リンク先のマニュアルにある3b5hというアドレスはquot;I/Oアドレスで、全く別のアドレス空間に存在し、アクセスするには専用のINとOUT命令を使う必要があるということです。
I/Oアドレス3b5hに値01を書き込むには、次のようなコードになります。
mov dx, 3b5h
mov al, 01
out dx, al
の唯一の形式であることに注意してください。 OUT命令 を使用することができます。DXレジスタでアドレスを指定し、ALレジスタでそのI/Oアドレスに書き込むデータを提供する必要があります。
ただし、これも正しくない。リンク先のマニュアルにあるように、I/Oアドレス3b5hはMDAデータポートで、CGAデータポートはI/Oアドレス3d5hにあります。最後に、I/Oアドレス3d5hからアクセスされるレジスタは、"Maximum Scanline Register"だけではありません。このアドレスを使用するレジスタは数種類あります。どのレジスタに書き込むかは、まず、I/Oアドレス3d4hのCGA CRT Controller Index Registerにインデックス値を書き込んで選択する必要があります。つまり、以下のようなコードになります。
mov dx, 3d4h ; CGA CRTC Index Register
mov al, 09h ; Maximum Scan Line Reigster
out dx, al
mov dx, 3d5h ; CGA CRTC Data Port
mov al, 01 ; 2 scan lines
out dx, al
VGAは最大走査線レジスタに他のパラメータを追加するので、これはまだ正しくないかもしれないことに注意してください。これらの値を保持する必要があるかもしれませんが、実際のCGAハードウェアでは、レジスタが読み取り専用であるため、それは不可能です。実際のCGAビデオカードをエミュレートするコードの精度にもよりますが。
関連
-
[解決済み] MIPSのコードのこの部分で、oriはどのように使われているのですか?
-
[解決済み] CPUのParity Flagは何のためにあるのですか?
-
[解決済み] アセンブリ言語で数字をプリントアウトする?
-
[解決済み] アセンブリのNEG
-
[解決済み] アセンブリで文字列の長さを表示する方法
-
[解決済み] アセンブリMIPS。配列の初期化および合計
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] .NETアセンブリがx86またはx64用にビルドされたかどうかを判断するにはどうすればよいですか?
-
[解決済み】マルチコアアセンブラとはどのようなものですか?
-
[解決済み] gcc を使ってインテル構文のアセンブリコードを生成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】JNZとCMPのアセンブリ命令
-
[解決済み] callq命令とは何ですか?
-
[解決済み] popまたはadd esp、4 ? その差は何ですか?
-
[解決済み] MIPSのコードのこの部分で、oriはどのように使われているのですか?
-
[解決済み] CPUのParity Flagは何のためにあるのですか?
-
[解決済み] アセンブリ言語 新規ライン
-
[解決済み] x86アセンブリで160x100モードを実現する
-
[解決済み] アセンブリMIPS。配列の初期化および合計
-
[解決済み] テストのポイント %eax %eax [重複]。
-
[解決済み] x86アセンブリの角括弧の意味は何ですか?