Nie wiedziałem zabardzo gdzie to napisać, ale jest tu:
jak ustawić w Pascalu rozdzielczość choćby 800x600 16/24 bit tak, aby grafika działała płynnie ?
Nie wiedziałem zabardzo gdzie to napisać, ale jest tu:
jak ustawić w Pascalu rozdzielczość choćby 800x600 16/24 bit tak, aby grafika działała płynnie ?
Standard Vesa tryb 114h (800x600x65536), a o płynność musisz sam zadbać, jak zresztą zawsze.
A tu masz spis trybów.
http://www.ctyme.com/intr/rb-0275.htm
włąsnie tylko że ukłądy biosowe są raczej wolne, a to rysuje jakieś 10 liniejk/s....
Da sie szybko ale tu jest wlasnie problem. Jezeli chcesz szybką grafe o duzej rozdzielczosci mozesz wykorzystac standard VESA (<ort>opuznienie </ort>wystepuje przy wywolywaniu biosu, a to trzeba robic tylko kilka razy na jedno calkowite <ort>odswierzenie </ort>ekranu). Problem jest w tym ze trzeba robic buforowanie ekranu - rysujesz wsyztsko w pamieci a <ort>puzniej </ort>walisz na ekran. Wszytsko byloby pieknie gdyby nie to ze dos obsluguje tylko do 640kb pamieci (w praktyce mniej), tak wiec <ort>conajwyzej </ort>wystarczy tego na jeden bufor 640*480 8bit. Mozna to omninąc stosując tryb rozszerzony lub standardy EMS,XMS itp.
Więc nie używaj biosu. Korzystając z vesy odpal grafikę , a resztę rób inaczej. Przecież można pobrać własciwości trybu (płaty pamięci, okna, banki) i dalej robić to wszystko, co potrzeba pomijając bios.
dobra mam tak...
asm
mov ax, 4F02h
mov bx, 115h
Int 10h
mov ah,0ch // pixel ??
asm.
ale teraz jak ustawić kolory ?? Sorki ale mojqa znajomość asm wynosi 1 dzień...
uses crt;
procedure tryb;
begin
asm
mov ax, $4f02
mov bx, $114
int $10
end;
end;
var
bank:word;
i,g:Integer;
procedure pixel(x,y:longint;c:byte);
var
offset:longint;
bankTMP:word;
begin
offset:=x+y shl 9+y shl 7;
bankTMP:=offset shr 16;
if bankTMP<>bank then
begin
bank:=bankTMP;
asm
xor bx, bx
mov ax, $4f05
mov dx, bank
int $10
end;
end;
mem[$a000:offset]:=c;
end;
procedure szum;
var a,b:integer;
begin
repeat
for a:=0 to 800 do begin
for b:=0 to 600 do pixel(a,b,20+random(10));
end;
until keypressed;
end;
begin
tryb;
asm
mov ax, $4f05
mov bx, 00
mov dx, bank
int $10
end;
szum;
readkey;
end.
dobra powiedzmy że mam coś takiego (może ktoś mi wytłumaczy ten bank pamięci ?) a teraz jak używać większej ilości koorów tj tych 16bit'ów
Troszkę nie na temat trzeba zacząć, żeby zrozumieć ideę banków...
Ano po pierwsze szyna adresowa procka dla trybu rzeczywistego to 20 bitów, stąd możliwość adresowania w tym trybie tylko do granicy 1MB (2^20 bajtów=1MB - proste). A adres liniowy który powstaje z 32-bitowego wskażnika to segment shl 4 + offset. A zatem zapis $00ab:$cdef będzie dla tego trybu odpowiednikiem np. $0cde:$0abf, a odpowiednio adres liniowy to $00c(a+d)(b+e)f (jako schemat, bez liczenia przeniesień). Stąd pierwszy wniosek: adres $a000:$0000 znajduje sie w przestrzeni adrsowej poniżej 1MB (wbrew pozorom).
Po drugie. Ogrniczenie przestrzeni adresowej do tego 1MB (IBM tworząc AT powinien był rozszerzać szynę, a nie tworzyć tryb zgodności z XT :/ ale to juz historia i nie da się tego cofnąć) powoduję spory tłok w tejże przestrzeni. Stąd okna.
Okna to adres przestrzeni dla trybu rzeczywistego, leżące powyżej 640kB i poniżej granicy 1MB, do których mapuje sie obszary leżące poza tą granicą lub też obszary pamięci innych urządzeń (np. grafika). Mechanizmy te wykorzystuje i np. EMS i VESA. Dla VESA okno i bank moga miec róźny rozmiar, te dane wyciąga się z int 10h ax=4f0fh. Rozmiar pamięci, który zajmuje obraz to linelength (wyciągnięte z tych danych)* ilośc linii, albo dxdybytesperpixel (8006002)=... odpowiednio. Więc jesli chcesz wyjśc poza pierwszy bank, to trzeba nimi wachlować w obszarze okna (dokładnie jak w ems).
Co do ilości kolorów... Nie wiem, czy zależy to od ilości płatów, może wystarczy użyc po prostu memw[] zamiast mem[], albo zrobić sobie tablice wordów wskazującą na $a000:0 (obojętne, czy będzie to wskaźnik, czy referencja przez absolute). Jeśli natomiast zależy to od ilości płató pamięci... Pobawić się trzeba portami.
http://4programmers.net/Forum/viewtopic.php?id=49026 jakby co to jest to podobny wątek.
// Btw. Jeśli masz bp7 (bpw.exe i/lub bp.exe) to możesz używać DPMI (Dos Protected Mode Interface). Masz wtedy troszke większe mozliwości jeśli chodzi o pamięć. Tylko, że na nic zda się wtedy absolute $a000:0, trzeba uzyć wskaźników (i selektora sega000 - zmienna predefiniowana).
Właśnie flabra, ale trzeba dodac że taka grafika choć wygodniejsza bo dająca większy obszar pamięci będzie działała wolniej. Łatwo sie o tym przekonać porównując choćby szybkość rysowania w sterownikach bgi dla trybu rzeczywistego i chronionego (ale tego 16 bitowego). Kiedyś się tym bawiłem i wydaje mi się że najszybsze i jednocześnie najwygodniejsze rozwiązanie daje daje tryb 32 bitowy i odwzorowanie liniowe vram->ram. A daje to biblioteka grx dla djgpp ,ktora istnieje rowniez w srodowisku pascala 32-bitowego.
P.S. To co napisalem to przez siegiecie do pamieci sprzed ladnych kliku lat wiec moze cos pomylilem.