Pixel setzen, funktioniert nicht ganz.



  • 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...


Anmelden zum Antworten