2017-12-20 13 views
-1

私は1つのピクセルの色を取得しようとしています(私はEmu8086で13hグラフィックモードを使用しています)、そのためには割り込み10hの関数0Dhを使用しています。しかし、それは全く一貫していません。それはピクセルの正しい色を与えることができず、私に00(黒)を与えます。INT 10h関数0Dh inconsistent

私はCXがモード13hで倍増していることを知っています。しかし、私はその問題が私が描いた形(2つの塗り潰した長方形)であることが非常に疑わしいです。

どのような問題があるようですか?また、どのようにして1つのピクセルの色を一貫して得ることができますか?

The shape

.MODEL SMALL 
.DATA 

X DW ? 
Y DW ? 
T DW ? 
linecounter dw ? 

LastX DW ? 
LastY DW ? 

PixelClr DB ? 
.CODE 
.STARTUP 


MOV AH, 00 
MOV AL, 13h 
INT 10h 

MOV X, 85 
MOV Y, 93 
MOV linecounter, 75 

Square4Top: 
MOV BH, 0 
MOV CX, X 
MOV DX, Y 
MOV T, 7 
MOV AH, 0Ch 
MOV AL, 01h 

DrawSquare4Top: 
INT 10h 

INC CX 
INC DX 
DEC T 
CMP T, 0 
JNZ DrawSquare4Top 

INC X 
DEC Y 
DEC linecounter 
CMP linecounter, 0 
JNZ Square4Top 



MOV X, 61 
MOV Y, 93 
MOV linecounter, 50 

Square5Top1: 
MOV BH, 0 
MOV CX, X 
MOV DX, Y 
MOV T, 7 
MOV AH, 0Ch 
MOV AL, 0Bh 

DrawSquare5Top1: 
INT 10h 

INC CX 
INC DX 
DEC T 
CMP T, 0 
JNZ DrawSquare5Top1 

INC X 
DEC Y 
DEC linecounter 
CMP linecounter, 0 
JNZ Square5Top1 



;;; 
;;; INITIALIZE MOUSE 
;;; 


MOV AX, 0 
INT 33h 

MOV AX, 1 
INT 33h 

MOV AX, 2 
INT 33h 

MouseAgain: 
MOV AX, 3 
INT 33h 

CMP BX, 1 
JNZ MouseAgain  
MOV AH, 0Dh 
MOV BH, 00 
SHR CX, 1 
INT 10h 
MOV PixelClr, AL 

JMP MouseAgain 

END 
+0

色がゼロではない場合( 'test al、al' 'jz MouseAgain'' mov ah、4Ch'' int 21h')、アプリが最終的に終了した後に(tasm + dosbox、私はemu8086を所有していません)(私は 'hide cursor call'を削除しました。dosbox VGAは320x200モードでは驚くほど素敵な" hw "矢印を持っています。 。ところで、あなたのスクリーンショットは塗りつぶされた形を示していますが、DOSBoxでは「チェッカー」の塗りつぶしで表示されます。つまり、次のピクセルはすべて黒ですので、カラーピクセルをクリックするのはさらに難しくなります。 – Ped7g

+0

簡単な方法:ピクセルを読み取った後、読み取った色にもう一度設定します。画像は変わるべきではありません。その場合、値のスケーリング、マウスピクセル<->のスクリーンピクセルなどの値のスケーリングの理由がわかります – Tommylee2k

答えて

1

あなたが実際に私達にあなたのコードを示していないので、それはあなたが間違ってやっていることを伝えるために少し難しいです!

しかし、あなたは、少なくともあなたが割り込みを呼び出す前すべて関連のレジスタを(hereを参照)に設定されていることを確認する必要があります。もちろん、あなたがが実際に画面のほとんどが黒で、特に以来、そこに黒画素を見ても、

AH = 0Dh 
BH = page number 
CX = column 
DX = row 

そして:これは、すべてのことをいいます。私は、以下の「グラフィック」の代わりにyxのようなもの、あなただけの形状の外のピクセルを見ているかどうかをチェックすることだろう。

 /\ 
    /\ 
    x/ /
    /y/
//
//
//
\/
\/ 

あなたが埋めるかどうかを確認することはかなり簡単にする必要があることあなたの長方形を描く前に白い画面を全画面に表示し、白くなっても黒くなっているかを確認してください。

+0

Hey there。関連するすべてのレジスタをチェックしました。同じ問題です。コードのスニペットは次のとおりです:https://gist.github.com/anonymous/261f9ed74b7bda7d6357f581c3bd3d54 基本的に、コードは2つの図形を描画して開始し、マウスを初期化します。マウスの左ボタンをクリックすると、マウスポインタの座標が使用されますそこで画素の色をチェックし、その画素の色を変数に保存する。 ****注:**私は0Dhにピクセル座標を使用し、列と行は使用しません(恐ろしく失敗しました)。 – YoZo

+0

@YoZo、あなたのコードには何も見えない*明らかに*間違っていると、int33から戻ってきた実際の 'cx/dx'を保存して、それらが有効であるかどうかを確認することができます。また、色が何であっても画面全体が黒くなっているかどうかをテストするために、画面全体を白に再設定します。 – paxdiablo

+0

@YoZoあなたのコードには 'ds'の設定はありませんが、データセグメントとコードセグメントが同じではない' .model small'(つまりEXEファイル)を使用しています。おそらく、デバッガで間違ったメモリ値をチェックしていて、 'ds:PixelClr'(実際の' ds'、つまり実際の値)を試してみてください。 ...編集:ああ待って、たぶんそれは 'に隠されています。STARTUP' directive/macro/whatever * that * is ... – Ped7g

関連する問題