[ASM] Paleta kolorów w VESA

0

Czy ktoś mnie może oświecić jak załadować paletę kolorów wykorzystując VESĘ?
Przeglądałem przerwania i jedyne co mi pasuje do tego, to funkcja 4f09h. Wywołuję ją i zwracany jest kod 00h, czyli powinno wszystko grać, a jednak czy ją wywołam czy nie, to wyświetlana bitmapa wciąż jest pstrokata, jakby paleta nie została w ogóle załadowana :(
1012h też nie łapie.

0

Ale chodzi o palete 256 kolorow czy true color ??

0

256 kolorów. True Color to już palety nie potrzebuje :) Zresztą w 24-bit wszystko pięknie chodzi.

0

Jakoś sobie poradziłem wykorzystując porty. Rozwiązanie, jakby ktoś potrzebował kiedyś:

    mov si, offset Palette
    mov dx, 3C8h                             ;0 do 3c8h - ustawianie rejestrow DAC
    xor al, al
    out dx, al
    inc dl                                   ;wartosci kolejno kolorow R, G i B na 3c9h
    mov cx, 3*100h
    Pal:
      lodsb
      shr al, 2                              ;tylko 6-bitow do zapisu :( mamy 256 kolorow z 2^(6*6*6)
      out dx,al
    loop Pal

a paleta jest tego typu:

RGB STRUC
  R db ?
  G db ?
  B db ?
ENDS

Palette RGB 100h dup (?)       ;posluzy za palete
0

Dla pojedynczego rejestru przy użyciu portów vga:

procedure setrgb(nr,r,g,b:byte);
assembler;
asm
  mov   al,nr
  mov   dx,968
  out   dx,al
  mov   al,r
  mov   dx,969
  out   dx,al
  mov   al,g
  out   dx,al
  mov   al,b
  out   dx,al
end;

procedure getrgb(nr:byte;var r,g,b:byte);
assembler;
asm
  xor   al,al
  mov   dx,967
  out   dx,al
  mov   al,nr
  out   dx,al
  mov   dx,969
  in    al,dx
  les   di,[r]
  mov   byte ptr es:[di],al
  in    al,dx
  les   di,[g]
  mov   byte ptr es:[di],al
  in    al,dx
  les   di,[b]
  mov   byte ptr es:[di],al
end;

Dla rejestrów palety przy uzyciu przerwania 10h

  mov ax,1010h   ;vga service - setrgb
  xor bh,bh      ;bx- nr rejestru
  mov bl,[nr]    ;cd.
  mov ch,[g]
  mov cl,[b]
  mov dh,[r]
  int 10h

  mov ax,1015h   ;getrgb
  xor bh,bh
  mov bl,[nr]
  int 10h

  powrót:
  ch - green
  cl - blue
  dh - red

  mov ax,1012h  ; ustawienie bloku rejestrów koloru
  mov bx,[pierwszyrejestr]  ; np. 0 dla całej palety
  mov cx,[ilerejestrów]   ;np. 256 dla całej palety
  es:dx - adres ładowanego bufora
  int 10h

  mov ax,1017h  ; odczyt bloku rejestrów koloru
  mov bx,[pierwszyodczytany]
  mov cx,[ilerejestrów]
  es:dx - adres pod który zapisać rejestry
  int 10h

Bufor musi mieć rozmiar 3*cx po bajcie na każdy rejestr. Rozmieszczenie rejestrów: liniowo w kolejności : rgb.

Poza tym vesa to standard, który w żaden sposób nie dotyczy palety. Paletę dla trybów 16/256 kolorów obsługuje się jak dla kazdego innego trybu 16/256-o kolorowego.

// Sorki spóźniłem się, ale mimo wszystko zostawię :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1