Tryby graficzne Pascal/ASM

0

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 ?

0

Standard Vesa tryb 114h (800x600x65536), a o płynność musisz sam zadbać, jak zresztą zawsze.

0

A tu masz spis trybów.
http://www.ctyme.com/intr/rb-0275.htm

0

włąsnie tylko że ukłądy biosowe są raczej wolne, a to rysuje jakieś 10 liniejk/s....

0

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.

0

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.

0

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ń...

0
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

0

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).

0

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.

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