Springen naar inhoud

8086 assembly


  • Log in om te kunnen reageren

#1

ZVdP

    ZVdP


  • >1k berichten
  • 2097 berichten
  • VIP

Geplaatst op 18 november 2009 - 18:38

Ik probeer een beetje vertrouwd te geraken met assembly voor een project door een bitmap weer te geven op het scherm met video mode 12h (640*480*16).

Er treedt echter een probleem op wanneer ik 2 afbeeldingen boven elkaar plot. In plaats van over de eerste afbeelding te schrijven worden de kleuren gecombineerd, bv blauw over rood geeft geen blauw, maar magenta.

Op deze pagina wordt vanalles uitgelegd over VGA, en meer specifiek in 'Data Rotate Register (Index 03h)' over hoe de nieuwe data gecombineerd moet worden met de oude (replace,and,or,xor).

Ik dacht dat het hier waarschijnlijk aan zou kunnen liggen, en heb geprobeerd om dit op replace te krijgen.
Maar zonder resultaat; de kleuren worden nog steeds gemengd.

Zelfs de write mode(0,1,2,3) wijzigen veranderde niets aan de afbeelding.

;stel write mode 0 in
mov dx,03CEh
in al,dx
and al,11111100b
out dx,al

;stel logical operation in op vervanging (=00)
mov ax,0003h
out dx,ax

Ik vermoed dat ik iets over het hoofd zie, maar weet niet wat.
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Rogier

    Rogier


  • >5k berichten
  • 5679 berichten
  • VIP

Geplaatst op 18 november 2009 - 19:32

Hoe plot je precies een afbeelding naar je scherm? Ik heb het idee dat je een of andere teken/plot functie gebruikt. Beter rag je gewoon botweg de pixeldata rechtstreeks naar je videomem, dat is sneller en makkelijker :eusa_whistle:

Of als je dat al doet, maar dit probleem treedt toch op, moet je misschien even kijken of je wel alle bitplanes overschrijft. Een hoop videomodi werken niet met normale pixeldata, maar met bitplanes waarin je bit 0, 1, 2 enz van iedere pixel apart moet schrijven (naar verschillende adressen).
In theory, there's no difference between theory and practice. In practice, there is.

#3

ZVdP

    ZVdP


  • >1k berichten
  • 2097 berichten
  • VIP

Geplaatst op 18 november 2009 - 20:36

Of als je dat al doet, maar dit probleem treedt toch op, moet je misschien even kijken of je wel alle bitplanes overschrijft. Een hoop videomodi werken niet met normale pixeldata, maar met bitplanes waarin je bit 0, 1, 2 enz van iedere pixel apart moet schrijven (naar verschillende adressen).


Ik heb hetzelfde gedaan als hier (maar dan natuurlijk in een 2 loopjes voor een hele bitmap)
klik (Zoek naar 'Defining colour in Mode 012' en verder)

Om de kleur in te stellen doe ik:
mov dx,03C4h
mov al,2 ;map mask register
out dx,ax
(met in ah de gewenste 4-bit kleur)

Blijkbaar heeft deze map mask register iets te maken met die bitplanes.
klik
bit3 : Map 3 Enable
bit2 : Map 2 Enable
bit1 : Map 1 Enable
bit0 : Map 0 Enable

Ik zie wel niet echt in hoe je hiermee nu juist de kleur definieert.

Om te plotten doe ik:mov es:[di],0FFh (1byte),
nadat ik de juiste mask heb ingesteld om hierin 1 bit te selecteren (in het videogeheugen bij 12h is er 1bit/pixel)
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian

#4

ZVdP

    ZVdP


  • >1k berichten
  • 2097 berichten
  • VIP

Geplaatst op 25 november 2009 - 20:20

Het lag inderdaad aan de bitplanes.

Ik dacht eerst dat ik de kleur wegschreef naar de VGA, maar dit is eigenlijk de mask voor welke bitplanes geactiveerd moeten worden.

Dus als ik in eerste instantie deze mask op 1100 heb gezet, en vervolgens een pixel plot, wordt deze pixel gekopieerd naar planes 2 en 3.
Als ik daarna de mask op 0011 zet en een pixel plot wordt dze pixel gekopieerd naar planes 0 en 1.
Maar ik had geen rekening gehouden met het feit dat bij de tweede plot de data in planes 2 en 3 ongewijzigd blijft.
Dus resultaat: ik krijg hetzelfde alsof ik 1 pixel plot met mask 1111.

Ik moest dus enkel voor elke plot de mask op 1111 zetten, en 0 als pixel schrijven. De vorige pixel eerst verwijderen vooralleer de volgende te plotten dus.
"Why must you speak when you have nothing to say?" -Hornblower
Conserve energy: Commute with a Hamiltonian





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures