2016-09-05 7 views
1

私は、CRTCを使用して行の高さを2ピクセルに変更することで、IBM CGAで擬似160 x 100グラフィックスモードを実現できることをしばらく知っていました。私は数日間、これを成し遂げようとしてきました。x86アセンブリで160x100モードを達成する

Intel® Open Source HD Graphics and Intel Iris™ Graphics Programmer's Reference Manual私はこれを最大スキャンラインレジスタに書き込むことで、45ページ(またはPDFの59ページ)でこれを行うことができます。

メモリアドレス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 

を私はまだこのような低レベルのものと非常に自信を持っていないですし、任意の助けをいただければ幸いです。

+2

DOSBOXでCGAグラフィックスアダプタを設定しましたか? – fuz

+0

DOSBoxはエミュレータ/仮想マシンです。コード内で実行されるコードはマシン全体を表示しますが、その動作はDOSBoxソフトウェアによって完全に決定され、DOSBoxが実行されているホストのハードウェアによっては決定されません。インテルマニュアルは、VGA/CGAに関するドキュメントの有用なソースかもしれませんが、インテル固有の機能や動作はDOSBoxでは発生しないことに注意してください。実際のIntel HWをプログラミングしたい場合は、裸のハードウェアでコードを起動することができます。多くのx86リンクについては、[x86タグwiki](http://stackoverflow.com/tags/x86/info)も参照してください(直接関連性はありません)。 –

+0

擬似160x100グラフィックスモードを取得する簡単な方法は、標準の80x50 VGAテキストモードと2x2ブロック文字のカスタムフォントを使用することです。もう1つの方法は、VGAの320x200グラフィックスモードを使用し、ピクセルを描くときにピクセルの幅と高さを倍にすることです。 –

答えて

6

あなたは3b5hのアドレスに書いていません。あなたは3b50hのアドレスに書いています。アドレス3b5hを書いたければ、ESを0でロードしてからmov BYTE [es:3b5h], 01のようにしますが、これはあなたがやりたいことではありません。あなたがリンクしているマニュアルに記載されているアドレス3b5hは、「I/Oアドレス」です。つまり、完全に異なるアドレス空間に存在し、特殊なINおよびOUT命令を使用してアクセスする必要があります。ここで使用することができますOUT instructionの唯一の形式です

mov dx, 3b5h 
mov al, 01 
out dx, al 

注:あなたはこのようなコードを使用したい3b5h I/Oアドレスに値01を書き込むには

。そのI/Oアドレスに書き込むデータを提供するには、DXレジスタを使用してアドレスを指定し、ALレジスタを使用する必要があります。

それ以外の場合は正しくありません。リンクしたマニュアルで説明されているように、I/Oアドレス3b5hはMDAデータポートで、CGAデータポートはI/Oアドレス3d5hです。最後に、「最大走査線レジスタ」はI/Oアドレス3d5hを介してアクセスされる唯一のレジスタではない。このアドレスを使用するいくつかの異なるレジスタがあります。書き込みたいレジスタを選択するには、最初にI/Oアドレス3d4hのCGA CRTコントローラインデックスレジスタにインデックス値を書き込んでセレクションする必要があります。 VGAは、最大スキャンラインの登録に他のパラメータを追加すると、これはまだ、右ではないかもしれないこと

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 

注:これはあなたのコードはこのように見える必要があることを意味します。これらの値を保持する必要があるかもしれませんが、レジスタは読み取り専用なので実際のCGAハードウェアでは不可能です。実際のCGAビデオカードをエミュレートして、コードを実行しているものがどれくらい正確であるかによって異なります。

+0

あなたのコードはうまく組み立てられていて、正しい仕事をしました。ありがとう! – jbobesto

+0

@CollisionDetection:答えがあなたの問題を解決したときに感謝の言葉を残さずに、上/下の矢印の下にあるチェックボックスをクリックする必要があります。 –

+0

それは私の最初のSOの質問です、私はまだ物事のハングを取得していると仮定します。 – jbobesto

関連する問題