RGB - 0A000h Grafikmodus 320*200



  • hallo erstma ..
    also ich befinde mich im 13h Grafikmodus
    ( mov ax,13h ; Grafikmodus 13H
    int 10h )

    Eine Pixel schreibe ich direkt mit stosb an 0A000h
    das klappt auch wunderbar soweit ..
    nun oeffne ich aber ein Bitmap lese das RGB Array aus und moechte nun die Farbe des Pixels eben aus der Bitmap definieren ..
    Ich habe also 1Byte fuer gruen, 1Byte für rot und eins fuer blau

    nun bekommt der Pixel aber einen farbwert der nur 1Bytes ist.
    Wie berechne ich aus den 3Bytes RGB ein einziges Farbbyte? Oder sind diese Werte für die Pixel nur Offset auf eine Tabelle?
    Wie aendere ich diese Farbtabelle?



  • Hi.

    Bei 256-Farben-Bitmaps gibt es in der Paletten-Array 256*3 Farbeintraege (jeweils Rot-, Gruen- und Blauanteil, wenn ich mich nicht irre)
    Die ersten 3Byte werden dabei dem bytewert 00 in der Bitmaparray zugeordnet, die naechsten 3 dann 01 usw.
    Mit int 10h, ah=10h al=10h kannst Du die Palette der Grafikkarte veraendern und diese so durch die Palette im Bitmap ersetzen.



  • Du kannst auch direkt I/O-ports nehmen. Sende zuerst den index für die Farbtabelle, dann rot, dann grün, dann blau. Alles jeweils ein byte, Ports sind 3C8 und 3C9. Beispiel:

    ; Farbeintrag 15 ändern
    
    mov al,15
    mov dx,3C8h
    out dx,al
    inc dx    ; port auf 3c9 ändern
    mov al,44 ; rot
    out dx,al
    mov al,55 ; grün
    out dx,al
    mov al,66 ; blau
    out dx,al
    

    In Grafikmodus 13h reichen die RGB Werte übrigens nur von 0-63. Wenn du irgendwelche Bilddaten hast wo die RGB Wert von 0-255 gehen, kannst du immerhin annähern indem du durch 4 teilst (Rechtsshift mit 2).
    (Ich hatte mal ein Programm dass ein Windows Icon einlesen und ausgeben sollte).



  • super danke das war genau das was ich gesucht hab, nur leider funktioniert es immer noch nicht so ganz ...

    meine SetPalette Procedure setzt die neue Palette..

    mov   dx, 03C8h        ; Put the DAC read register in DX 
       mov   cx, 0FFh         ; fill from end 
    
    schloop:
       mov al, cl
       mov dx, 3c8h
       out dx,al
       inc dx
       mov   si, offset RGBQUAD    ; RGBQUAD in 8bit BMP -> BYTE blue; BYTE green; BYTE red   also genau verdreht + ein viertes 'resevered' BYTE als platzfueller
       add   si, cx
       add   si,2
       mov   al, [si]          ; Put the new RED value in AL
       shr   al,2
       out   dx, al           ; Send AL to port DX
       dec   si
       mov   al, [si]          ; Put the new GREEN value in AL
       shr   al,2
       out   dx, al           ; Send AL to port DX
       dec   si
       mov   al, [si]          ; Put the new BLUE value in AL
       shr   al,2
       out   dx, al           ; Send AL to port DX
    loop schloop
    

    .. weiss wird dann zB als dunkel grün dargestellt 😞

    stimmt etwas nicht mit meiner SetPalette funktion?



  • Si wird nicht so ganz richtig gesetzt.
    Du müsstest cx mit 4 multiplizieren, um die richtigen Paletteneinträge zu erwischen.
    gemeint war sowas:

    mov   si, offset RGBQUAD    ; RGBQUAD in 8bit BMP -> BYTE blue; BYTE green; BYTE red   also genau verdreht + ein viertes 'resevered' BYTE als platzfueller
    shl cx,2
    add   si, cx
    


  • Achja klar. Danke dass du mir draufhilfst 🙂

    Ein Problem haett ich da noch..
    Mein Programm bleibt wenns beenden soll einfach haengen und kehrt nicht zur Kommandozeile zurueck.

    Im Debugger kommt er genau bis
    ->

    xor bx,bx
    mov ax,4ch
    int 21h
    

    Beim Aufruf von INT 21H meldet sich manchmal der NTVDM manchmal beendet sich einfach td und wirft mich auf die komanndozeile !?
    Kanns sein dass ich bei den IN,OUT Geschichten irgendwas korregieren muss?
    Die alte Palette wieder herstellen etc?

    PS: Irgendwie stimmen meine Farben auch noch nicht 100%

    Ich hab mal nen Screenshot gemacht:
    http://www.higschissn.de/asm.gif

    (links in meinem Program, rechts im IrfanView)

    (edit)
    seltsam dass das tuerkis zB stimmt. Der hellgrüne Punkt auch jedoch das pink und dunklere grün nicht ,hmm

    Liegt das womoeglich einfach am 256Farben Modus? Die Bitmap ist allerdings auch 100% 256farben (8bit).

    [ Dieser Beitrag wurde am 14.01.2003 um 14:26 Uhr von jefff editiert. ]



  • Hallo Jifff
    ürgend wie steige ich net mehr dahinter was hier geschrieben wird ... liegt wohl daran , daß ich zu wenig in ASM schreibe 😉
    Wo nen zähler gefälscht wird gehte generel ind er der hose ...
    Also versuche es mal so :

    mov dx, 03C8h ; Put the DAC read register in DX
    mov cx, 0FFh ; fill from end

    schloop:
    push CX ;<<<< damit CX bei den nächsten durchlauf nicht x4 gerechnet is...
    mov al, cl
    mov dx, 3c8h
    out dx,al
    inc dx
    mov si, offset RGBQUAD ; RGBQUAD in 8bit BMP -> BYTE blue; BYTE green; BYTE red also genau verdreht + ein viertes 'resevered' BYTE als platzfueller
    shl cx,2
    add si, cx
    add si,2
    mov al, [si] ; Put the new RED value in AL
    shr al,2
    out dx, al ; Send AL to port DX
    dec si
    mov al, [si] ; Put the new GREEN value in AL
    shr al,2
    out dx, al ; Send AL to port DX
    dec si
    mov al, [si] ; Put the new BLUE value in AL
    shr al,2
    out dx, al ; Send AL to port DX
    pop cx ;<<< schreiben wir den orginal wert wieder ...
    loop schloop

    Mit den 3 Zeilen da zwischen solte die Pallete richtig dargestellt werden ,
    da CX zwar mal 4 gereechnet wurde , aber nicht zurück gesetzt wurde.

    Wenn Du das Program beendeste , soltete
    mov ax,03h
    int 10h
    noch in deine Programm am ende schreiben,erst mal den screen zurück setzen.
    Dan solte es auch keine probs mehr geben !

    Gruß Kato

    P.s: Sorry habe einfach aus Faulheit mal deinen SRC genommen !

    [ Dieser Beitrag wurde am 23.01.2003 um 12:01 Uhr von KC25m editiert. ]


Anmelden zum Antworten