Gebruikersavatar
ZVdP
Artikelen: 0
Berichten: 2.097
Lid geworden op: za 16 jul 2005, 23:45

8086 assembly

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
Gebruikersavatar
Rogier
Artikelen: 0
Berichten: 5.679
Lid geworden op: di 27 apr 2004, 13:40

Re: 8086 assembly

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.
Gebruikersavatar
ZVdP
Artikelen: 0
Berichten: 2.097
Lid geworden op: za 16 jul 2005, 23:45

Re: 8086 assembly

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
Gebruikersavatar
ZVdP
Artikelen: 0
Berichten: 2.097
Lid geworden op: za 16 jul 2005, 23:45

Re: 8086 assembly

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

Terug naar “Informatica en programmeren”