Videomodus wechseln und pixel malen.



  • blub33 schrieb:

    also die vesa lib versehe ich irgendwie net...

    BTW: Von welcher "vesa lib" sprichst du eigentlich? 😕



  • wieviele gibt es denn eigentlich? Welche brauche ich denn um grafik auszugeben und gibts zu der lib ein tut?

    @todo:
    deine zip ist defekt. 😞



  • blub33 schrieb:

    wieviele gibt es denn eigentlich?

    Pure "VESA"-Libs gibt es auch einige...
    Einige in DOS-Extender integriert, Allegro unterstuetzt das IMHO auch...
    Und dann gibt es da mit Sicherheit noch hunderte kleinerer Codeschnippsel...

    blub33 schrieb:

    Welche brauche ich denn um grafik auszugeben...

    Aeh... Keine? 😕
    Sobald deine Grafikkarte VESA unterstuetzt, kannst du auch genausogut direkt selbst loslegen - sooo umstaendlich ist das VESA-Interface schliesslich auch wieder nicht. 😮

    BTW:
    Wenn du mit den Spezifikationen auf VESA.org Probleme hast, koenntest du auch eine Zusammenfassung hernehmen => Das ist fuer den Einstieg IMHO auch sehr gut geeignet.
    Enthaelt allerdings wirklich nur die absoluten Basics - Damit kannst du nur im RealMode arbeiten...



  • aso die lib ist auf der GraKa drauf! Wusste ich net, läuft vesa auch im PM oder nur im RM?



  • Ab VBE2.0 (AFAIK) ist auch eine Unterstuetzung fuer den PM implementiert - mit linearem Framebuffer-Zugriff und allem drum und dran. 😋
    Im PM funktioniert das ganze dann aber natuerlich nicht mehr ueber den int 10h... - weitere Infos dazu kannst du entweder bei VESA.org bekommen, oder vielleicht nochmal die OS-Dev/Hardware Links in den Assembler FAQ durchsuchen.
    Google ist auch nicht schlecht. :p



  • blub33 schrieb:

    @todo:
    deine zip ist defekt. 😞

    stimmt, aber nicht ganz, die ersten paar dateien sind fehlerhaft, die interessanten sachen müssten aber trotzdem entpackbar sein... (winrar) werd ich gleich mal fixen... liegt bestimmt an geocities...

    mein OS läuft nur im RM, PM-Experimente sind aber (in etxra-files) trotzdem dabei



  • hi,

    hast du die File schon gefixed? Denn ich hab sie grade nochmal runtergeladen, geht nicht. ich bekomme nix extrahiert. kannst du eine selbstextrahierende exe machen? vieleicht liegts ja am Format was dein WinRAR erstellt hat und mein WinACE nicht lesen kann.



  • sorry, hab ich noch nicht geschafft und momentan bin ich bei verwandten, da macht sich das schlecht mitm hochladen 🙂 montag wirds, bestimmt! 🙂
    an winrar liegts nicht, ich konnte die runtergeladene file auch nicht komplett enntpacken, das ding auf meiner lokalen festplatte ging aber...



  • scheiß geocities... bekomms nicht hochgeladen, naja hier ist der code, der intressant ist. muss man noch anpassen, d.h. die funktionen public machen, ich hatte das vorher als dynamischen treiber verwendet und deswegen sind da nur die pointer auf die entsprechenden funktionen am anfang. eine version für 640x480 (die auch beim box-zeichnen usw. auf diese auflösung optimiert ist) hab ich auch noch da.

    ; -------------------------------------------------------------------------
    ; TS SVGA-Driver 1.0 for mode 0x103 (800x600x256 colors)
    ; -------------------------------------------------------------------------
    ;
    ; Copyright (c) 2002 by Tobias Doerffel/TodoSystems
    ; All rights reserved.
    ;
    ; note: this code is partly based on the qb-program SVGA.BAS from ???
    ;
    ; -------------------------------------------------------------------------
    
    .Model Tiny
    .386
    .Code
    Start:
    DW _svga_set_mode - Start
    DW _get_width - Start
    DW _get_height - Start
    DW _get_colors - Start
    DW _svga_set_pal - Start
    DW _svga_set_pixel - Start
    DW _svga_get_pixel - Start
    DW _svga_filled_box - Start
    DW _svga_h_line - Start
    DW _svga_v_line - Start
    DW 2
    _bank   DW 0
    
    ; -------------------------------------------------------------------------
    ; void _svga_set_mode (int mode);
    ; -------------------------------------------------------------------------
    ;
    ; sets the given svga-mode: the following modes can be set:
    ;
    ; (100h=640x400x256) (works but with errors)
    ; 101h=640x480x256  works fine
    ; (102h=800x600x16) (doesn't work)
    ; 103h=800x600x256  works fine too
    ; (104h=1024x768x16) (doesn't work)
    ; 105h=1024x768x256  not tested yet
    ;
    ; Important: no support for 16-color modes!!!
    ;
    ; -------------------------------------------------------------------------
    
    _svga_set_mode Proc
      Push Bp
      Mov  Bp,Sp
      Mov  Ax,04F02h
      Mov  Bx,103h
      Int  10h
      Pop  Bp
      RetF
    _svga_set_mode EndP
    
    _get_width Proc
      Mov  Ax,799
      RetF
    _get_width EndP
    
    _get_height Proc
      Mov  Ax,599
      RetF
    _get_height EndP
    
    _get_colors Proc
      Mov  Ax,256
      RetF
    _get_colors EndP
    
    _svga_set_pal Proc
    
      Push Bp
      Mov  Bp,Sp
    
      Mov  Dx,03C8h
      Mov  Al,Byte Ptr [Bp+6]
      Out  Dx,Al
      Inc  Dx
      Mov  Al,Byte Ptr [Bp+8]
      Out  Dx,Al
      Mov  Al,Byte Ptr [Bp+10]
      Out  Dx,Al
      Mov  Al,Byte Ptr [Bp+12]
      Out  Dx,Al
    
      Pop  Bp
    
      RetF
    
    _svga_set_pal EndP
    
    ; -------------------------------------------------------------------------
    ; void _svga_set_pixel (int x, int y, int color, int T);
    ; -------------------------------------------------------------------------
    ;
    ; sets a pixel at the given coordinate
    ;  x: 0 to max. x-resolution
    ;  y: 0 to max. y-resolution
    ;  color: 0 to 255
    ;  T: 0 = NORMAL, 8 = AND, 16 = OR, 24 = XOR
    ;
    ; -------------------------------------------------------------------------
    
    _svga_set_pixel Proc
      Push  Bp
      Mov   Bp,Sp
      Mov   Ax,0A000h
      Mov   Es,Ax
    
      MovZX EAx,Word Ptr [Bp+8]
      MovZX EBx,Word Ptr [Bp+6]
    
      iMul  EAx,DWord Ptr 800
      Add   EAx,EBx
      Mov   Bx,Ax
      ShR   EAx,16
      Cmp   Ax,_bank
      JE    skip_bank_switch_sp
      Mov   _bank,Ax
    
      Mov   Dx,Ax
      Mov   Ax,04F05h
      Mov   Fs,Bx
      Xor   Bx,Bx
      Int   010h
      Mov   Bx,Fs
    
    skip_bank_switch_sp:
    
      Mov   Al,Byte Ptr [Bp+10]
      Mov   Cl,Byte Ptr [Bp+12]
      Or    Cl,Cl
      JE    normal_pixel_set
      Mov   Dl,Al
      Mov   Al,Byte Ptr Es:[Bx]
      Cmp   Cl,24
      JE    xor_pixel_set
      Cmp   Cl,8
      JE    and_pixel_set
      Or    Al,Dl
      Jmp   Short normal_pixel_set
    and_pixel_set:
      And   Al,Dl
      Jmp   Short normal_pixel_set
    xor_pixel_set:
      Xor   Al,Dl
    normal_pixel_set:
      Mov   Byte Ptr Es:[Bx],Al
      Pop   Bp
      RetF
    _svga_set_pixel EndP
    
    ; -------------------------------------------------------------------------
    ; int _svga_get_pixel (int x, int y);
    ; -------------------------------------------------------------------------
    ;
    ; gets the color of a pixel at the given coordinate
    ;  x: 0 to max. x-resolution
    ;  y: 0 to max. y-resolution
    ;
    ; -------------------------------------------------------------------------
    
    _svga_get_pixel Proc
      Push Bp
      Mov  Bp,Sp
      Mov  Ax,0A000h
      Mov  Es,Ax
    
      MovZX EAx,Word Ptr [Bp+8]
      IMul  EAx,DWord Ptr 800
      MovZX EBx,Word Ptr [Bp+6]
      Add   EAx,EBx
      Mov   Bx,Ax
      ShR   EAx,16
      Cmp   Ax,_bank
      JE    skip_bank_switch_gp
      Mov   _bank,Ax
    
      Mov   Dx,Ax
      Mov   Ax,04F05h
      Mov   Fs,Bx
      Xor   Bx,Bx
      Int   010h
      Mov   Bx,Fs
    
    skip_bank_switch_gp:
    
      MovZX Ax,Byte Ptr Es:[Bx]
    
      Pop   Bp
      RetF
    
    _svga_get_pixel EndP
    
    ; -------------------------------------------------------------------------
    ; void _svga_filled_box (int x1, int y1, int x2, int y2, int color);
    ; -------------------------------------------------------------------------
    ;
    ; draws a filled box from (x1,y1) to (x2,y2) with the given color
    ;  x1: 0 to max. x-resolution, smaller than x2
    ;  y1: 0 to max. y-resolution, smaller than y2
    ;  x1: 0 to max. x-resolution, greater than x1
    ;  y1: 0 to max. y-resolution, greater than y1
    ;  color: 0 to 255
    ;
    ; -------------------------------------------------------------------------
    
    _svga_filled_box Proc
      Push  Bp
      Mov   Bp,Sp
      Push  Si
      Push  Di
      Mov   Ax,Word Ptr 0A000h
      Mov   Es,Ax
    
      MovZX EAx,Word Ptr [Bp+8]
      iMul  EAx,800
      MovZX EDi,Word Ptr [Bp+6]
      Mov   Bx,Word Ptr [Bp+10]
      Sub   Bx,Di
      Mov   Word Ptr tmp,Bx
      Add   EAx,EDi
      Mov   ECx,EAx
      Mov   Gs,Word Ptr [Bp+14]
      MovZX EAx,Word Ptr [Bp+12]
      iMul  EAx,800
      Add   EAx,EDi
      Mov   ESi,EAx
      Mov   Bp,Word Ptr _bank
    
    for_y:
      Mov   EBx,ECx
      MovZX EDi,Word Ptr tmp
      Add   EDi,EBx
    
    for_x:
      Mov   EAx,EBx
      ShR   EAx,16
      Cmp   Ax,Bp
      JE    skip_bank_switch
      Mov   Bp,Ax      
      Mov   Dx,Ax
      Mov   Ax,04F05h
      Mov   Fs,Bx
      Xor   Bx,Bx
      Int   010h
      Mov   Bx,Fs
    
    skip_bank_switch:
    
      Mov   Ax,Gs
      Mov   Es:[Bx],Al
      Inc   EBx
      Cmp   EBx,EDi
      JBE   for_x
      Add   ECx,800
      Cmp   ECx,ESi
      JBE   for_y
      Mov   Word Ptr _bank,Bp
      Pop   Di
      Pop   Si
      Pop   Bp
      RetF
      tmp DW ?
    _svga_filled_box EndP
    
    _svga_h_line Proc
    
      Push  Bp
      Mov   Bp,Sp
      Push  Di
      Push  Si
      Mov   Ax,0A000h
      Mov   Es,Ax
    
      MovZX EAx,Word Ptr [Bp+8]
      iMul  EAx,DWord Ptr 800
      Mov   EBx,EAx
    
      MovZX EDi,Word Ptr [Bp+6]
      Add   EBx,EDi
      MovZX EDi,Word Ptr [Bp+10]
      Add   EDi,EAx
    
      Mov   Si,Word Ptr [Bp+12]
      Mov   Gs,Word Ptr [Bp+14]
      Mov   Bp,Word Ptr _bank
    
    for_x_hl:
      Mov  EAx,EBx
      ShR  EAx,16
      Cmp  Ax,Bp
      JE   skip_bank_switch_hl
      Mov  Bp,Ax
    
      Mov  Dx,Ax
      Mov  Ax,04F05h
      Mov  Fs,Bx
      Xor  Bx,Bx
      Int  010h
      Mov  Bx,Fs
    
    skip_bank_switch_hl:
    
      Mov  Ax,Si
      Mov  Cx,Gs
      Or   Cl,Cl
      JE   normal_h_line
      Mov  Dl,Al
      Mov  Al,Byte Ptr Es:[Bx]
      Cmp  Cl,24
      JE   xor_h_line
      Cmp  Cl,8
      JE   and_h_line
      Or   Al,Dl
      Jmp  Short normal_h_line
    and_h_line:
      And  Al,Dl
      Jmp  Short normal_h_line
    xor_h_line:
      Xor  Al,Dl
    normal_h_line:
      Mov  Byte Ptr Es:[Bx],Al
      Inc  EBx
      Cmp  EBx,EDi
      JBE  for_x_hl
    
      Mov  _bank,Bp
    
      Pop  Si
      Pop  Di
      Pop  Bp
    
      RetF
    
    _svga_h_line EndP
    
    _svga_v_line Proc
    
      Push  Bp
      Mov   Bp,Sp
      Push  Di
      Push  Si
      Mov   Ax,0A000h
      Mov   Es,Ax
    
      MovZX EAx,Word Ptr [Bp+8]
      IMul  EAx,DWord Ptr 800
      Mov   EBx,EAx
    
      MovZX EDi,Word Ptr [Bp+6]
      Add   EBx,EDi
    
      MovZX EAx,Word Ptr [Bp+10]
      IMul  EAx,DWord Ptr 800
      Add   EDi,EAx
    
      Mov   Si,Word Ptr [Bp+12]
      Mov   Gs,Word Ptr [Bp+14]
      Mov   Bp,_bank
    
    for_y_vl:
      Mov  EAx,EBx
      ShR  EAx,16
      Cmp  Ax,Bp
      JE   skip_bank_switch_vl
      Mov  Bp,Ax
    
      Mov  Dx,Ax
      Mov  Ax,04F05h
      Mov  Fs,Bx
      Xor  Bx,Bx
      Int  010h
      Mov  Bx,Fs
    
    skip_bank_switch_vl:
    
      Mov  Ax,Si
      Mov  Cx,Gs
      Or   Cl,Cl
      JE   normal_v_line
      Mov  Dl,Al
      Mov  Al,Byte Ptr Es:[Bx]
      Cmp  Cl,24
      JE   xor_v_line
      Cmp  Cl,8
      JE   and_v_line
      Or   Al,Dl
      Jmp  Short normal_v_line
    and_v_line:
      And  Al,Dl
      Jmp  Short normal_v_line
    xor_v_line:
      Xor  Al,Dl
    normal_v_line:
      Mov  Byte Ptr Es:[Bx],Al
    
      Add  EBx,800
      Cmp  EBx,EDi
      JBE  for_y_vl
    
      Mov  _bank,Bp
    
      Pop  Si
      Pop  Di
      Pop  Bp
    
      RetF
    
    _svga_v_line EndP
    
    ; -------------------------------------------------------------------------
    ; END OF FILE
    ; -------------------------------------------------------------------------
    
    End Start
    


  • @todo:
    Beim Ueberfliegen faellt mir so auf, dass du
    1. Einfach davon ausgehst, dass jeder Grafik-controller den Modus 800x600x8 auf 103h hat -> das kann aber (vor allem bei aelteren Modellen - falls diese einen solchen Modus ueberhaupt unterstuetzen :D) mal schoen anders aussehen.
    2. die Palette via VGA-Register veraenderst, ohne geprueft zu haben, ob der Controller ueberhaupt VGA-Kompatibel ist 😕

    Naja, ich weiss ja nicht, wie der Code ansonsten eingebunden ist, und wie das alles sonst geregelt ist => nur so ein paar Verbesserungshinweise. 🙂


Anmelden zum Antworten