2017-12-20 12 views
-1

Ich versuche, die Farbe eines einzelnen Pixels (ich verwende 13h Grafikmodus in Emu8086), dafür benutze ich Funktion 0Dh von Interrupt 10h. Aber es ist überhaupt nicht konsistent. Es gibt nicht die richtige Farbe des Pixels und gibt mir 00 (schwarz).INT 10h Funktion 0Dh inkonsistent

Ich bin mir bewusst, dass CX im Modus 13h verdoppelt wird. Aber ich vermute sehr, dass das Problem die Form ist, die ich gezeichnet habe (zwei gefüllte Rechtecke), die zufällig 45 Grad gegen den Uhrzeigersinn heißt.

Was scheint das Problem zu sein? Und wie bekommt man die Farbe eines einzelnen Pixels konsistent?

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

Ich habe Ihre Quelle geändert, um zu beenden, wenn die Farbe ungleich Null ist ('test al, al'' jz MouseAgain' 'mov ah, 4Ch'' int 21h') und nach einigen hektischen Klicken endete die App schließlich (tasm + dosbox, Ich besitze keine emu8086) (Ich habe auch den 'hide cursor call' entfernt, die Dosbox VGA hat überraschend schönen" hw "Pfeil für den 320x200 Modus, mit vernünftiger Zeichnung, obwohl ich nicht sicher bin, welche Koordinate als Cursorposition zurückgegeben wird) . Übrigens zeigt Ihr Screenshot die gefüllten Formen, aber in Dosbox sehe ich sie mit "karierten" Füllungen, d. H. Jedes nächste Pixel ist schwarz, so dass es noch schwieriger ist, auf farbige Pixel zu klicken. – Ped7g

+0

einfacher Weg zu überprüfen: nach dem Lesen des Pixels, stellen Sie es wieder auf die Farbe, die Sie gelesen haben. Das Bild sollte sich nicht ändern. Wenn dies der Fall ist, können Sie eine Ahnung bekommen, warum (Wert Skalierung, Mapping Maus Pixel <-> Bildschirm Pixel oder was auch immer) – Tommylee2k

Antwort

1

Es ist ein bisschen schwer zu sagen, was Sie falsch, da tun eigentlich haben Sie nicht uns Ihren Code angezeigt!

Allerdings sollten Sie zumindest sicher, dass Sie alle relevanten Register eingestellt haben (siehe here), bevor der Interrupt-Aufruf. Das bedeutet, alle:

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

Und natürlich, Sie können tatsächlich dort an einem schwarzen Pixel suchen, zumal die meisten der Bildschirm schwarz ist. Ich würde überprüfen, ob Sie an einem Pixel suchen, die gerade außerhalb der Form ist, so etwas wie x statt y im folgenden „Grafik“:

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

, die ziemlich einfach sein sollte zu überprüfen, ob Sie die füllen ganzen Bildschirm mit Weiß, bevor Sie Ihre Rechtecke zeichnen, und sehen, ob Sie weiß zurückkommen oder immer noch schwarz werden.

+0

Hey da. Ich habe alle relevanten Register überprüft, dasselbe Problem. Hier ist ein Ausschnitt des Codes: https://gist.github.com/anonymous/261f9ed74b7bda7d6357f581c3bd3d54 Grundsätzlich beginnt der Code durch Zeichnen der beiden Formen, initialisiert die Maus, wenn die linke Maustaste geklickt wird, dauert es die Koordinaten des Mauszeigers und überprüft die Pixelfarbe dort und speichert die Pixelfarbe in einer Variablen. ** HINWEIS: ** Ich biete Funktion 0Dh mit den Pixel-Koordinaten, nicht Spalten und Zeilen (Ich versuchte, es scheitert schrecklich). – YoZo

+0

@YoZo, kann nichts * offensichtlich * falsch mit Ihrem Code sehen, möchten Sie vielleicht die tatsächliche 'cx/dx' speichern Sie von int33 zurück, um zu sehen, ob sie gültig scheinen. Außerdem wiederhole ich, setze den gesamten Bildschirm für einen Test auf weiß, um zu sehen, ob er schwarz zurückkehrt, egal welche Farbe er hat. – paxdiablo

+0

@YoZo Ich sehe 'ds' in Ihrem Code nicht, aber Sie verwenden' .model small' (d. H. EXE-Datei), wobei Datensegment und Codesegment nicht identisch sind. Vielleicht prüfen Sie den falschen Speicherwert im Debugger, versuchen Sie 'ds: PixelClr' (ich meine echten' ds', Ihren tatsächlichen Wert). ... EDIT: Oh warte, vielleicht ist das in 'versteckt.STARTUP' Direktive/Makro/was auch immer * das * ist ... – Ped7g