2

CRTC を使用して行の高さを 2 ピクセルに変更することにより、IBM CGA で 160 x 100 の疑似グラフィック モードを実現できることは以前から知っていました。私はこれを数日間達成しようとしてきましたが、行き止まりになりました。

Intel® Open Source HD Graphics and Intel Iris™ Graphics Programmer's Reference Manual の45ページ (または PDF の 59 ページ) で、Maximum Scanline Register に書き込むことでこれを行うことができると主張しています。

00000001b の値、または 2 つのスキャンラインのコードをメモリ アドレス 3B5 に直接書き込もうとしました。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

このような低レベルのものにはまだあまり自信がありません。助けていただければ幸いです。

4

1 に答える 1

8

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

値 01 を I/O アドレス 3b5h に書き込むには、次のようなコードを使用します。

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 を介してアクセスされる唯一のレジスタではありません。このアドレスを使用するレジスタはいくつかあります。書き込みたいレジスタを選択するには、最初にそのインデックス値を I/O アドレス 3d4h の CGA CRT コントローラ インデックス レジスタに書き込むことによって選択する必要があります。これは、コードが次のようになる必要があることを意味します。

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 ビデオ カードをどれだけ正確にエミュレートするかに依存する場合があります。

于 2016-09-05T22:11:47.307 に答える