Tryb 12h - pomocy...

0

Wszędzie pełno bibliotek, procedur, książek o grafice w trybie 13h, a ja chciałbym skorzystać z trybu 12h (640x480x16). Nie potrafię jednak przerobić tej procedury żeby mi "chodziło":

procedure PutPixel (x, y : Word; Color : Byte);
begin
  Mem[$A000:(y shl 8) + (y shl 6) + x] := Color;
end;

Jakby ktoś nie wiedział to rysuje ona pixel w trybie 13h :P.

Czy ktoś wie jak to przerobić albo napisać od nowa w assemblerze? Bo naprawdę nie mam ochoty na grafikę BGI.

0

(y shl 8) + (y shl 6) + x = 320y+x
Ty potrzebujesz 640
y+x. Ale tutaj korzystasz jedynie z 16 kolorow, wiec prawdopodobnie w kazdym bajcie masz do zapisania 2 kolory. Dlatego trzeba:

pom := Mem[$A000:(640*y+x) div 2];
Mem[$A000:(640*y+x) div 2] := pom or Color;

Przy czym Color musialoby zajmowac odpowiednie nibble.
Jednym slowem bardzo wolna metoda :)

Proponuje skorzystac z trybow VESA. Obecnie juz praktycznie wszystkie karty obsluguja tryb VESA (jak masz winde to musza :) ).
Tam masz duuuze rozdzielczosci i duzo kolorow. Juz VESA 1.0 umozliwia 1280x1024x256 (a w VESA 2.0 1600x1200x64K!!!)

0

Ja się wtrącę, bo mam podobne pytanie:

Czy tryby VESA różnią się czymś w obsłudze od starszych odpowiedników (oczywiście oprócz tego że tryby zaczynają się od 100h)

0

Ja się wtrącę, bo mam podobne pytanie:

Czy tryby VESA różnią się czymś w obsłudze od starszych odpowiedników (oczywiście oprócz tego że tryby zaczynają się od 100h)

I tak i nie :)
Generalnie obsluga jest taka sama. Z tym, ze chyba zaden z trybow VESA nie miesci calej mapy obrazu w jednym bloku 64KB wiec trzeba przelaczac sie pomiedzy bankami. Ale nie stanowi to wiekszego problemu. Aby zapalic piksel trzeba wyliczyc jego offset:
offset := (y*SzerokoscEkranu+x)*LiczbaBajtowNaPiksel
Poniewaz mamy dostep w danym momencie jedynie do 64KB pamieci karty, to rozdzielamy nasz offset na:

  1. bank := offset shr 16; (czyli starsze slowo)
  2. oraz offset w danym segmencie: offset := offset and $ffff
    Teraz wystarczy tylko przelaczyc bank:
    mov ax, 4f05h
    mov bx, 0
    mov dx, bank
    int 10h
    i zapisac pod $a000:offset nasz kolor.

Z calej operacji najbardziej czasochlonne jest przelaczanie banku, ale zazwyczaj, jezeli zrobi sie sprawdzanie czy istnieje potrzeba zmiany banku, dokonuje sie jej tylko kilka razy przy pojedynczym wyswietlaniu.
Z powodu chrakterystyki podzialu na banki wyswietlanie obrazu po wierszach jest znacznie szybsze niz po kolumnach, ale to wlasnie po wierszach najczesciej sie wyswietla :)

W razie problemow z VESA sluze pomoca.

0

Fajna ta twoja procedura tylko... nie działa. W poziome wszystko gra, tylko w pionie dziwne rzeczy się dzieją a ponad to piksel jest zawsze biały. Ale wiesz co, chyba sobie daruje ten tryb. Poszukam sobie czegoś o vesa, tylko powiedz czy sterowniki vesa będą działać pod dosem (takim prawdziwym dosem, bez zainstalowanego windowsa).

0

Standard vesa jest implementowany sprzętowo, nie systemowo. System może go emulować lub kożysać z niego, Ale większośc dzisiejszych grafik ma to w standardzie (właściwie nie znam żadnej aktualnie produkowanej, które tego nie obsługuje).

0

Cześć :)
Jest świetna biblioteka obsługująca karty Vesa i wykorzystująca pamięć
XMS. Pracująca w trybach wysokiej rozdzielczości, ponadto obsługa myszki, fonty, animacja (pliki *mig) itd. Nazwa biblioteki GSvga.tpu
Bardzo szybka jak na pascalowską bibliotekę :)
Oryginalna stronka o adresie www.gr0g.prv.pl nie istnieje - ale na pewno
znajdziesz tą bibliotekę na każdej witrynce posiadającej dział Pascal
Jeżeli chodzi o cyt:

...tylko powiedz czy sterowniki vesa będą działać pod dosem (takim prawdziwym dosem, bez zainstalowanego windowsa).

to procedury odnośnie grafiki bezpośrednio pobierają dane z karty graficznej i do szczęścia im Windows nie potrzebny. :)

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