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
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ę :-)