Pixel setzen, funktioniert nicht ganz.
-
Ausserdem hast du da x=200 und y=100, aber das nur nebenbei...
-
Gibt es ein schnelleres System, um was auf den Bildschirm zu bringen?
-
@Richter: Das ist assembler. Mehr speed bekommst du nicht. (wo ist auch das problem? Als ob das langsam wäre)
-
In ModeX kannst du direkt in den VRAM schreiben.
Der Offset war meines arg eingestaubten Wissens C000.
-
@randa:
Assembler ist aber nicht gleich Assembler.
Auch hier gibt es guten(=schnellen||kleinen) Assemblercode und schlechten(=langsam||gross).
Dieser Code zum Pixel-setzen ist zB. eher schlecht, da langsam.@SnorreDev:
In den VRam/FrameBuffer kannst du in jedem Grafikmodus schreiben.
Was meinst du, wie sonst die Pixel auf den Bildschirm gezaubert werden?
Der VRam ist bei VGA-Modi uebrigens bei A0000. Bei C0000 liegt idr. BIOS-Code.@Richter:
Pixel setzen via BIOS-Interrupt ist ziemlich langsam.
Wesentlich schneller geht's, wenn du direkt in den FrameBuffer schreibst.
Wie du nun darauf Zugriff bekommst haengt nun vom gesetzen Grafikmodus ab.
Beim Modus 12h ist das zB. eher kompliziert, da hier versucht wurde, 153600Byte (640*480 / 2) in 65535Byte (VGA) reinzuquetschen.
Um verschiedenfarbige Pixel zu setzen/auszulesen, musst du hier staendig zwischen 4 verschiedenen Speichermaps hin und her schalten.Der Code in den FAQ dazu ist aber wie ich sehe fehlerhaft.
Ich werde das bei Gelegenheit korrigieren.Derweil kann ich dir nur empfehlern, mit dem Mode 13h (320*200 Pixel bei 256Farben) zu arbeiten, das ist wesentlich einfacher.
Hier ist naemlich ein Pixel genau ein Byte im VRam.
==>Pixel Setzen:mov ax, 0013h int 10h ;Grafikmodus 13h mov ax, 0A000h mov ds, ax mov [byte ptr ds:0000h], 0Ah ;gruenen Pixel bei x=0;y=0 setzen
-
hier ist eine für mode12. mit TASM assemblieren:
.286 pix proc near USES ax bx cx dx es,Xc,Yc : word,COLOR : byte mov ax,0A000h mov es,ax mov bx,[Xc] mov ax,[Yc] mov cl,bl and cl,07h shr bx,3 shl ax,6 add bx,ax shr ax,2 add bx,ax mov dx,3CEh mov al,08h mov ah,80h shr ah,cl out dx,ax mov al,01h mov ah,0Fh out dx,ax xor al,al mov ah,[COLOR] out dx,ax mov cl,es:[bx] mov es:[bx],cl inc al xor ah,ah out dx,ax mov al,08h mov ah,0FFh out dx,ax ret pix endp .8086
-
@SnorreDev:
In den VRam/FrameBuffer kannst du in jedem Grafikmodus schreiben.
Was meinst du, wie sonst die Pixel auf den Bildschirm gezaubert werden?
Der VRam ist bei VGA-Modi uebrigens bei A0000. Bei C0000 liegt idr. BIOS-Code.Ok - bei der Adresse habe ich mich wohl vertan, obwohl ich mir sicher bin, er lag auf C000 und die Textmodi hingen auf B800, und konnte dort direkt die Textzeichen Platzieren aber was solls - ist wirklich schon lange her /* als es noch die Future Crew gab... */
Ich meinte mit dem Schreiben, dass ModeX Linear ist, was bei VESA Modes i.d.r. nicht der Fall ist, und man deshalb vielleicht doch besser ueber den Interrupt geht.
-
Hi
@SnorreDev: ModeX ist zwar ne schöne sache nur nicht ganz so einfach wie der Mode13 auch hier muss man sich ein wenig das hirn verrenken um ein pixel an der richtigen stelle zu setzen. beim modeX wird ja auch mit 4 plans gearbeitet die mehr oder weniger gleichzeitig aktiv sind. der vorteil der sich daraus ergibt ist das man auch die vollen 256k der vga karte ausnutzen kann. und mit mehreren virtuellen bildschiremen arbeiten kann. ( dubelpuffering )
gruss termite
-
Sorry, wenns nicht direkt mit dem Thema zusammenhängt, aber meint ihr nicht, dass OpenGL oder von mir aus DirectX schneller Zeichnen?
Bei einzelnen Pixel kann man sich vielleicht noch fragen, aber wer will schon nur Pixel zeichnen. Bei etwas Aufwändigeren Sachen (Vergrössern, Antialiaste {tolles wort} Linien etc..) wird eine 3D API wesentlich schneller sein.
-
ja da hast du wohl das thema verfehlt ... du kannst nich einfachso gl oder dx mit vga vergleichen, hat ja auch keiner gesagt, dass vga dx und gl ownt oder so.
btw, kann ich mir aber vorstellen, dass das setzen eines pixel bei vga schneller ist als das bei dx:
vga:
stosb
dx:
push
push
...
call
aber naja, vga und dx zu vergleichen ist sowieso quatsch.
-
jemand der dx benutzt um vga auflösung zu haben ist echt dumm. wär ja ein übertriebener overkill...