LowLevel-Grafik

mhribernik

Erfahrenes Mitglied
Hallo!

Ich habe vor kurzem angefangen mich mit Assembler zu beschäftigen. Nun habe ich mal versucht ein kleines, simples OS zu entwickeln. Es ist nix aufwändiges, nur eine Übung, die Hardware besser zu verstehen.

Doch nun stehe ich vor einem Problem.
Wie kann ich mittels int 13h (Grafikinterrupt) einzelne Pixel auf dem Bildschirm einfärben?

Geht das?


Ich bin dankbar für jede Antwort.
mfg. Marko
 
Hi,
also zu allererst: du verwechselst da den MODUS 13h mit dem INT10h ;)

Du musst also dein Grafiksystem über den Interrupt 10h in den Modus 13h schalten. Das sieht dann so aus:
Code:
MOV AX,0013h ;wir benutzen Funktion 00 in AH um in den Modus 13h in AL zu 
INT 10h ;schalten

Dann kannst du entweder die Pixel über das Bios setzen, oder du schreibst einfach die Farbwerte an die Speicheradressen ab A000:0000h, da beginnt nämlich das GrafikRAM. Die ebengenannte Adresse ist der Pixel in der linken, oberen Bildschirmecke. Wenn du einen Punkt gezielt setzen willst, mit x- und y-Koordinaten, kannst du folgende Formel verwenden:
Offset = Y * 320 + X (gilt in der Form nur für Modus 13h mit 320 x 200 Punkten)

Viel Spaß beim weitercoden
TheAlchimist
 
Hab gar nicht erwartet, das jemals noch eine Antwort kommt!

DANKE!


Nun noch eine weitere Frage:

Wie bring ich die Farbwerte an die Adresse raus?


mfg.
Marko
 
Zuletzt bearbeitet:
Hallo!

Das mit den Farbwerten läuft ungefähr so:
Code:
MOV AX,0A000h
MOV ES,AX

MOV AL, farbwert
MOV DI, wo_die_Farbe_hinsoll

MOV [ES:DI],AL
Ich geb keine Garantie dass es so läuft, hab ich mir kurz vor 24Uhr aus den Fingern gesogen ;)

Zur Erklärung: Die ersten Beiden Zeilen laden ES mit dem Segment für den Grafikspeicher, eben A000h (bei einigen Assemblern muss das erste Zeichen eine Ziffer sein, deshalb 0A000h ;) )

Dann laden wir den 8-bit Farbwert nach AL
In DI laden wir den Offset, d. H. Die eigentlichen Koordinaten, wo der Punkt hin soll. Den Wert bekommst du mit der Formel OFFSET = Y * 320 + X raus.

Mit der letzten Zeile schreibst du den Farbwert dann dahin, wo der entsprechende Pixel eingefärbt werden soll.

Viel Spaß beim ausprobieren

TheAlchimist
 
Hab jetzt etwas rumgespielt. Habs zu folgendem Code gebracht:

Code:
MOV AX, 0A000h
MOV ES,AX
MOV AH,00h
MOV AL,13h
int 10h

MOV AL, 16
MOV DI, 646

MOV [ES:DI],AL


Ich bekomm folgende Fehlermeldung: operator ignored ":" <- Damit meint er den Doppelpunkt bei [ES:DI],AL

Wo liegt der Fehler? Könnte man das irgendwie mit MOVSD lösen? Wie?


Mit freundlichen Grüßen,
Marko Hribernik


PS. Wie funktioniert das mit den Farbwerten? Muss ich da erst noch eine Palette machen?
 
Also meine Assembler-Zeit liegt ja schon ein paar Jahre zurueck, aber hiess es nicht
Code:
MOV ES:[DI],AL
oder so aehnlich?

Bin nicht sicher, aber ich mein irgendwie sowas war da.
Ich guck mal durch meine alten Sourcen, da find ich sicher noch was dazu.

Nachtrag: Ja, so sollte es richtig sein.
Hier mal ein Prozedur die ich damals fuer Pascal gebastelt hatte.
Code:
PROCEDURE PutPix(segment,x,y: WORD; color: BYTE); ASSEMBLER;
ASM
 mov es,segment
 mov di,y
 mov bx,di
 shl di,8
 shl bx,6
 add di,bx
 add di,x
 mov al,color
 mov es:[di],al
END;
 
Was soll ich euch beiden denn schon sagen....?


DANKE!
Klappt echt toll!

Mit freundlicen Grüßen,
Marko Hribernik
 
Hi, kleine Anmerkung noch am Rande zu [ES:DI] bzw. ES:[DI]:

Die ES:[DI]-Variante wird von TASM, MASM und kompatiblen benutzt
[ES:DI] dagegen von NASM.

MfG TheAlchimist
 
Zuletzt bearbeitet:
Gut zu wissen.
Ich hatte damals mit TASM gearbeitet, und dem in Turbo Pascal 7 integrierten Assembler, welcher wohl groesstenteils dem TASM entsprechen duerfte.

Mir ist auch schon aufgefallen, dass ich meine uralten .asm-Files nicht einfach durch den NASM jagen kann, weiss aber nicht mehr genau was da gemeckert wurde. Naja, nicht so wichtig, ich mach eigentlich eh nichts mehr mit Assembler.
 

Neue Beiträge

Zurück