Pokaż wyniki od 1 do 3 z 3
  1. #1
    Anonymous
    Gość


    Twoja ocena: Yes No

    Grafika w Turbo Pascal' u :):):)

    Mam kompa (Semptron 2800+, 512Ram, Radeona 9200SERIES, Z Windem XPSP1 itp). No i oczywiście zajmuję się programowaniem w TP7.01. Zazwyczaj piszę jakieś gry, czy programy graficzne. No i mam pewien problem. Gdy piszę grę, lub cokolwiek co wykorzystuję kartę kraficzną mogęużywać (najbardziej korzystnego) trybu VGA(320x200x256), oraz (nieco gorszego) trybu z biblioteki Borlandowskiej BGI, czyli no powiedzmy 800x600x256. Ten ostatni nie oferuje zbyt szybkich procedur i nie wykazuje zbytniej płynności. Wiem, że Pascal może wyciągnąć o wiele więcej np. 640x480x16k czy nawet ...x...x32k. Czy ktoś ma biblioteki (z opisami po polsku) obsługujące tzw. tryby VESA lub inne mniej konwencjonalne. Byłbym bardzo wdzięczny. Albo (o ile jest to możliwe) jakieś procedury obsługujące stery karty. Byle co, nawet linki do stronek (polskich).

    P.S. Z góry dziękuję. A, jeszcze jedno, procedurki tylko i wyłącznie asemblerowskie pod T.P.7.00 lub 7.01.

  2. #2


    Twoja ocena: Yes No

    Ja chyba kiedyś na necie znalazłem takie biblioteki, ale raczej odnalezienie ich przeze mnie w najbliższym czasie (o ile mam je gdzieś na CD) jest niemożliwe.

    Musisz dobrze poszukać po google, to coś znajdziesz

    PS. Jak znajdziesz, to daj linka

  3. #3
    Gość


    Twoja ocena: Yes No

    Wiesz, znalazem, ale nie biblioteki, tylko jaki tekst dotyczcy wysokich trybw... Oto on:

    Dla praktykw: Programowanie kart graficznych

    Tryby wysokokolorowe SVGA

    Mariusz Paka

    Sterownik graficzny SVGA, zgodny ze standardem VESA 1.2, dowolnego
    producenta udost©pnia uytkownikowi tryby wysokokolorowe, w ktrych
    rozdzielczo† obrazu mieci si© w granicach od 320x200 do 1280x1024, przy
    dost©pnoci 32768, 65536 lub 16777216(!) kolorw jednoczenie. Niezalenie
    od tego, czy karta jest zgodna ze standardem VESA, czy te nie - ilo†
    kolorw oraz rozdzielczo† obrazu zaley gwnie od iloci pami©ci
    zainstalowanej na karcie. Korzystajc ze sterownika z obsadzonymi 500KB
    pami©ci (najbardziej popularny) mona otrzyma† obraz o rodzielczoci 320x200
    w: 32K, 64K, 16M kolorw oraz wi©kszo† trybw 256-kolorowych. Aby jednak
    uzyska† wi©ksz rozdzielczo† i ilo† kolorw, karta powinna mie†
    zainstalowane przynajmniej 1MB pami©ci RAM.

    Jak atwo policzy†, aby wywietli† obraz o rozdzielczoci 320x200 w 32768
    lub 65536 kolorach (jeden punkt na ekranie zajmuje dwa bajty w pami©ci
    karty) porzeba 125KB pami©ci. W trybie o tej samej rozdzielczoci, przy
    dost©pnoci 16.7 milionw kolorw (kady punkt zajmuje trzy bajty) potrzeba
    187.5 KB. Jak wida†, aby przechowa† ten obraz nie wystarcz 64KB RAM-u
    komputera zarezerwowane dla karty graficznej (0A000h-0AFFFFh), nie mwic
    ju o innych trybach, gdzie przy wi©kszej rozdzielczoci ilo† potrzebnej
    pami©ci jest jeszcze wi©ksza. Producenci kart graficznych rozwizali ten
    problem umieszczajc dane opisujce obraz w pami©ci karty, czynic przy tym
    z pami©ci obrazu tzw. tzw. okno, przez ktre mona uzyska†
    dost©p do kolejnych fragmentw pami©ci RAM karty zwanych
    bankami (zobacz GIF'a). Banki mog mie† rozmiar 32KB lub 64KB (drugi wariant
    jest cz©ciej spotykany) i przedstawiaj kolejne fragmenty ekranu poczynajc
    od gry do dou.

    Omawiany wczeniej obraz (320x200x32768) jest podzielony na dwa banki, w
    pierwszym s zawarte dane opisujce pierwsze 102 linie, w drugim natomiast
    pozostae 98. Okno moe by† zarwno zapisywane jak i odczytywane, jego
    zawarto† jest taka sama jak zawarto† aktualnie wybranego banku.

    Tryby wysokokolorowe SVGA rni si© zasadniczo od 256-kolorowych. Nie ma
    tutaj palety, a kolor jest uzyskiwany na ekranie na podstawie danych
    zapisanych bezporednio w pami©ci karty. Format danych opisujcych kolor
    punktu w poszczeglnych trybach przedstawia ponisza tabela.

    Kolor 15-bitowy Kolor 16-bitowy Kolor 24-bitowy Skadowa
    0-4 0-4 0-7 niebieska
    5-9 5-10 8-15 zielona
    10-14 11-15 16-24 czerwona
    15 - - nie wykorzystany

    Karty graficzne zgodne ze standardem VESA 1.2 umoliwiaj korzystanie z
    szeregu funkcji dost©pnych pod przerwaniem 10h. Zadaniem tych funkcji jest:
    wczanie trybw graficznych SVGA (4F02h), odczytywanie informacji o trybach
    (4F01h) oraz o samych kartach SVGA (4F00h), sterowanie bankami (4F05h),
    zmiana lub odczytanie rozmiaru pami©ci zajmowanej przez lini© (4F06h).
    Wszystkie funkcje VESA, gdy s uwzgl©dnione, zwracaj w rejestrze AL warto†
    rwn 4Fh. Gdy nie wystpi bd AH zawiera 0, w przeciwnym razie 1. Funkcje
    te s do† "wolne", jednak, gdy nie posiadamy specjalnego opisu rejestrw
    karty, uywanie ich jest konieczne.

    Karta graficzna, mimo e jest zgodna ze standardem VESA, wcale nie musi
    udost©pnia† uytkownikowi wszytkich standardowych trybw. W celu uzyskania
    numerw trybw dost©pnych na danej SVGA musimy skorzysta† w funkcji 4F00h
    (AX=4F00h), dodatkowo na wejciu funkcja spodziewa si© otrzyma† w rejestrach
    ESI adres 256-bajtowej tablicy na odczytane informacje. Format odczytanych
    informacji wyglda nast©pujco:

    Adres Rozmiar Opis
    00h 4 bajty sygnatura = 'VESA'
    04h sowo numer wersji standardu
    06h podwjne sowo adres typu segmentffset na nazw© producenta karty
    0Ah 4 bajty moliwoci karty
    0Eh podwjne sowo adres typu segmentffset na tablic© dost©pnych
    trybw SVGA
    12h 238 bajtw zarezerwowane.

    Wszystkie pola tablicy maj wielko† sowa, natomiast list© trybw koczy
    warto† 0FFFFh. Dokadniejsze informacje na temat funkcji 4F00h oraz bufora
    z informacjami mona znale«† w [1]. Znajc ju list© trybw jakie oferuje
    nasza karta moemy dodatkowo odczyta† pewne informacje dotyczce konkretnego
    trybu. Mona to uczyni† za pomoc funkcji 4F01h. W rejestrze CX naley
    umieci† numer interesujcego nas trybu, rejestry ESI powinny wskazywa†
    adres 256-bajtowej tablicy na odczytane informacje, ktrej format wyglda
    nast©pujco:

    Adres Rozmiar Opis

    00h sowo Atrybuty trybu. Znaczenie bitw:
    bit 0, tryb dost©pny
    bit 1, dost©pna informacja o trybie
    bit 2, funkcje obsugiwane przez BIOS
    bit 3, rwny 1, gdy tryb kolorowy
    bit 4, rwny 1, gdy tryb graficzny
    02h bajt Atrybuty okna A. Znaczenie bitw:
    bit 0, okno dost©pne
    bit 1, okno jest odczytywalne
    bit 2, okno jest zapisywalne
    03h, bajt, Atrybuty okna B (analogicznie jak dla A)
    04h, sowo, Granulacja adresowania okien (w KB)
    06h, sowo, Rozmiar okna (w KB)
    08h, sowo, Pocztek segmentu okna A
    0Ah, sowo, Pocztek segmentu okna B
    0Ch, podwjne sowo, Adres funkcji pozycjonowania okien
    10h, sowo, Liczba bajtw przypadajcych na jedn lini©

    Dalsze informacje s dost©pne, gdy jest ustawiony bit 1 w polu Atrybuty trybu.

    12h, sowo, Szeroko† ekranu
    14h, sowo, Wysoko† ekranu
    16h, bajt, Szeroko† znaku
    17h, bajt, Wysoko† znaku
    18h, bajt, Liczba paszczyzn bitowych
    19h, bajt, Liczba bitw przypadajca na jeden punkt
    1Ah, bajt, Zarezerwowany
    1Bh, bajt, Rodzaj modelu pami©ci. Znaczenie wartoci:
    1 - graficzny CGA
    2 - graficzny Hercules
    3 - 16-kolorowy EGA
    4 - spakowane piksle
    5 - tryb 256-kolorowy
    6 - bezporednie 15/16/24 bity
    7 - model koloru YUV
    8-255 - zarezerwowane.
    1Ch, bajt, Rozmiar banku (KB)
    1Dh, bajt, Liczba stron wizyjnych
    1Eh, bajt, Zarezerwowany
    1Fh, bajt, Rozmiar czerwonej maski
    20h, bajt, Pozycja czerwonej maski
    21h, bajt, Rozmiar zielonej maski
    22h, bajt, Pozycja zielonej maski
    23h, bajt, Rozmiar niebieskiej maski
    24h, bajt, Pozycja niebieskiej maski
    25h, bajt, Zarezerwowany rozmiar maski
    26h, bajt, Zarezerwowana pozycja maski
    27h, bajt, Informacja o trybie pracy bezporedniej
    28h, bajt, Zarezerwowany
    29h, 216 bajtw, Zarezerwowane

    Prezentowana dalej procedura, odpowiednik pascalowskiej PutPixel, zostaa
    napisana w asemblerze procesora 286, natomiast bya testowana na karcie S3 w
    trybie o numerze 112h (640x480 przy dost©pnych 16M kolorw). Nic jednak nie
    stoi na przeszkodzie, aby zostaa zaadoptowana do pracy z innymi trybami
    wysokokolorowymi (informacje o nich mona zdoby† korzystajc z wyej
    opisanych funkcji BIOS).

    W nagwku procedury PostawPunkt znajduj si© zmienne zawierajce:
    wsprz©dn X i Y punktu oraz trzy bajty opisujce kolor tego punktu
    (skadowe: niebieska, zielona, czerwona). W pocztkowej fazie wykonania
    procedury procesor aduje do ES adres okna w pami©ci koputera.

    { 1 } procedure PostawPunkt (X, Y: Integer; R, G, B: Byte); assembler;
    { 2 } asm
    { 3 } push es
    { 4 } push 0A000h
    { 5 } pop es

    W dalszej cz©ci nast©puje obliczenie numeru banku oraz pooenia punktu w
    tym banku. Adres punktu na ekranie jest liczony przy uyciu prostego wzoru:

    Adr = 2048*Y+3*X.

    Mnoenie X przez 3, polega na przesuni©ciu X o 1 bit w lewo, co odpowiada
    mnoeniu przez 2, i dodaniu do otrzymanej liczby wartoci X.

    { 6 } mov bx, [X]
    { 7 } mov cx, bx
    { 8 } shl bx, 1
    { 9 } add bx, cx { bx = X*3 }

    Liczba 2048 jest iloci pami©ci zajmowanej przez jedn lini© obrazu. Moe
    si© jednak zdarzy†, e karty rnych producentw b©d, w tych samych
    trybach, uywa† rnej iloci pami©ci dla lini. Informacje, ile RAM-u karty
    zajmuje jedna linia, mona odczyta† z bufora z informacjami o trybach. W
    przypadku, gdy liczba ta byaby inna ni 2048 naley zmieni† wiersze
    procedury o numerach 11, 12 na 'mov di, [LiczbaBajtowNaLinie]' i 'mul
    di' oraz zrezygnowa† z wierszy o numerach 13-15. LiczbaBajtowNaLinie jest to
    zmienna okreslajca ile bajtw zajmuje jedna linia na ekranie. Mnoenie
    dowolnej liczby przez 2048 odpowiada przesuni©ciu wszystkich bitw tej
    liczby 11 razy w lewo; jest to dziaanie bardziej efektywne, ni uycie
    rozkazu 'mul'. Po wykonaniu przesuni©cia najmniej znaczcy bit liczby
    zajmuje pozycj© 11, najbardziej znaczcy - 27, rejestr jest natomiast 16-
    bitowy. Wynika std, e owe 11 bitw, ktre "wyszy" poza rejestr s
    bezpowrotnie tracone. Aby temu zaradzi† naley przesuni©cie to wykona† w
    nast©pujcy sposb.

    Zakadamy, e liczba, na ktrej ma by† wykonana omawiana operacja znajduje
    si© w rejestrze AX. Starsza cz©† rejestru AX i cz©† modszej po
    przesuni©ciu na pewno znajdzie si© poza rejestrem, wi©c jest kopiowana do
    rejstru DX (AX=DX). Modsza cz©† AX, jest natomiast kopiowana do AH
    (przesuni©cie o 8 bitw w lewo) i dodatkowo przesuwana o 3 pozycje w lewo -
    co w sumie daje 11 bitw. W DX znajduje si© zawarto† AX co odpowiadaoby
    przesuni©ciu AX o 16 bitw. Aby wi©c w DX zjadowaa si© zawarto† AX
    przesuni©ta o 11 bitw, naley DX przesun† o 5 bitw w prawo. Zawarto† AX
    po wykonaniu mnoenia tym sposobem znajduje si© w rejestrach DX@AX (tak samo
    jak po wykonaniu rozkazu 'mul').

    { 10 } mov ax, [Y]
    { 11 } mov dx, ax
    { 12 } xchg ah, al
    { 13 } xor al, al
    { 14 } shl ah, 3
    { 15 } shr dx, 5 { dx@ax = 2048*Y }

    Teraz w zasadzie pozostaje tylko dodanie do siebie uzyskanych wczeniej
    iloczynw (2048*Y i 3*X).

    { 16 } xchg ax, di
    { 17 } add di, bx

    Poniewa podczas powyszego sumowania mogo wystpi† przeniesienie w
    modszej cz©ci liczby Adr, std konieczne jest uzupenienie procedury o
    lini© 18.

    { 18 } adc dx, 0 { di@dx = Y*2048+X*3 }

    Aby nasza procedura dziaaa nieco efektywniej naley utwoy† zmienn, ktra
    b©dzie przechowywa† numer aktualnie wybranego banku, tu zmienna ta nosi
    nazw© NrBanku. Ponisze dwie instrukcje sprawdzaj czy zawarto† NrBanku
    jest taka sama jak zawarto† rejestry DL. W przypadku, gdy rwno† jest
    speniona, pomijana jest cz©† procedury w ktrej nast©puje zmiana banku
    (wiersze 21-23).

    { 19 } cmp dl, [NrBanku]
    { 20 } je @PP_BrakZmianyBanku

    Dla poprawnego dziaania procedury niezb©dna jest jeszcze jedna informacja,
    tj. adres funkcji pozycjonowania okna. Adres ten mona odczyta† z bufora z
    informacjami o trybach. Poniewa wywoanie tej funkcji b©dzie typu 'far',
    naley jej adres umieci† w zmiennej typu POINTER. Tu zmienna ta nosi nazw©
    AdrFunZmianyOkien, a jej zawarto† jest wypeniana tu przed wczeniem
    trybu graficznego. Parametry wywoania funkcji s takie same jak dla funkcji
    BIOS o numerze 4F05h. W rejestrze BH naley umieci† zero, w celu wybrania
    banku lub jedynk© dla odczytania aktualnego numeru banku. W BL naley poda†
    numer okna (0 dla okna A). Rejestr DX, w zalenoci od uytej funkcji,
    powinien zawiera† numer nowego banku (BL = 0) lub zawiera odczytany numer
    aktualnego (BL = 1). Jeszcze jedna uwaga dotyczca wywoania funkcji.
    Czytelnicy chccy wykorzysta† opisan procedur© bezporednio z poziomu
    assemblera powinni lini© 23 procedury zmieni† na nast©pujc: call [dword
    ptr AdrFunZmianyOkien]. W tym przypadku AdrFunZmianyOkien powinna by†
    zmienn o rozmiarze podwjnego sowa (deklaracja DD).

    { 21 } mov [NrBanku], dl
    { 22 } xor bx, bx
    { 23 } call AdrFunZmianyOkien

    W tej fazie wykonania procedury rejestry ESI zawieraj adres w pami©ci
    komputera pod ktry naley zapisa† dane opisujce punkt. Operacj© t©
    wykonuje cz©† procedury zawarta w wierszach o numerach 24-30. Procedur©
    koczy cz©† odtwarzajca zawarto† rejestru ES sprzed wywoania PostawPunkt
    (wiersz 32).

    { 24 } @PP_BrakZmianyBanku:
    { 25 } mov al, [B]
    { 26 } stosb
    { 27 } mov al, [G]
    { 28 } stosb
    { 29 } mov al, [R]
    { 30 } stosb
    { 31 } @KoniecPostawPunkt:
    { 32 } pop es
    { 33 } end;

    Aby dostosowa† procedur© do pracy w trybach z kolorem 15 i 16-bitowym
    naley: usun† linie 27-30, zmieni† lini© 25 na 'mov ax, K' oraz lini© 26
    na 'stosw'. K jest zmienn zawierajc liczb© okrelajc kolor punktu.
    Jeeli kolor jest zapisany w postaci RGB, to naley wczeniej dane go
    opisujce odpowiednio "zoy†". W zasadzie mona zrezygnowa† z zapisu koloru
    w postaci RGB co poprawi efektywno† procedury. W takim przypadku kolor
    powinien by† zapisany w postaci liczby, zalenie od trybu, 15 lub 16-
    bitowej.

    Funkcja WlaczTrybGraficzny, wcza tryb graficzny o podanym numerze, oraz
    wypenia zmienn AdrFunZmianyOkien. Dla poprawnego jej dziaania naley
    zadeklarowa† tablic© o rozmiarze 256 bajtw, o nazwie DaneVESA.

    function WlaczTrybGraficzny (Tryb: Word): ShortInt; assembler;

    asm
    { Pobranie adresu funkcji zmiany banku }
    mov di, offset DaneVESA
    mov ax, 4F01h
    mov cx, 112h
    int 10h
    xchg si, di
    add si, 12
    lodsw
    mov word ptr AdrFunZmianyOkien, ax
    lodsw
    mov word ptr AdrFunZmianyOkien+2, ax
    { Wlaczenie trybu graficznego }
    mov ax, 4F02h
    mov bx, [Tryb]
    int 10h
    xchg al, ah { al zawiera kod ewen. b©du }
    end;

    Na koniec chciabym zaprezentowa† przykadowy program wykorzystujcy
    standard VESA. Suy on do odczytywania informacji o wszytkich trybach SVGA,
    jakie udost©pnia dana karta graficzna. W skad programu wchodz nast©pujce
    procedury: PobierzInformacjeOKarcie, PobierzInformacjeOTrybach, Word2Hex
    (ktra suy do zamiany liczby o rozmiarze sowa na jej odpowiednik w
    systemie szestnastkowym), oraz WypiszDaneOTrybie. Zasada dziaania programu
    jest nast©pujca:

    1. Odczytanie nazwy producenta karty oraz listy trybw SVGA, udost©pnianych
    przez kart© (PobierzInformacjeOKarcie),

    2. Odczytanie informacji o poszczeglnych trybach.

    Literatura:

    1. Krzysztof abanowski "Programowanie kart graficznych", Wydawnictwo Lupus
    1994

    program OdczytanieParametrowTrybowVESA12; { $G+ }
    uses Crt;
    type
    DaneVesa = record
    AtrybutyTrybu: Word;
    AtrybutyOknaA,
    AtrybutyOknaB :Byte;
    GranAdresOkien,
    RozmiarOkna,
    PoczSegOknaA,
    PoczSegOknaB,
    PAdresFPozOkna1,
    PAdresFPozOkna2: Word;
    LiczbaBajtowNaLinie,
    SzerokoscEkranu,
    WysokoscEkranu: Word;
    SzerokoscZnaku,
    WysokoscZnaku,
    LiczbaPlaszczyzn,
    LBitowNaPixel,
    Zarezerwowane0,
    RodzajModeluPamieci,
    RozmiarBanku,
    LiczbaStronWizyjnych,
    Zarezerwowane1,
    R_RozmiarMaski,
    R_PozycjaMaski,
    G_RozmiarMaski,
    G_PozycjaMaski,
    B_RozmiarMaski,
    B_PozycjaMaski,
    Z_RozmiarMaski,
    Z_PozycjaMaski,
    InfOTrybiePracyBezposred,
    Zarezerwowane2: Byte;
    Zarezerwowane: array [1..215] of Byte;
    end;

    DaneKarty = record
    VESASygnatura: array [1..4] of Char;
    NrWersjiVESA,
    PProducentKarty1,
    PProducentKarty2: Word;
    MozliwosciKarty: array [1..4] of Byte;
    PListaTrybow1,
    PListaTrybow2: Word;
    Zarezerwowane: array [1..238] of Byte;
    end;

    var
    Znak: Char;
    DV: DaneVesa;
    DK: DaneKarty;

    procedure PobierzInformacjeOKarcie; assembler;
    asm
    mov di, offset DK
    mov ax, 4F00h
    int 10h
    end;

    procedure PobierzInformacjeOTrybach (Tryb: Word); assembler;
    asm
    push es
    push ds
    pop es
    mov di, offset DV
    mov ax, 4F01h
    mov cx, [Tryb]
    int 10h
    pop es
    end;

    function Word2Hex (Slowo: Word): String;
    var
    Lo1, Lo2, Hi1, Hi2: Byte;
    Z1, Z2, Z3, Z4: Char;
    begin
    Lo1 := Slowo and $F;
    Lo2 := (Slowo shr 4) and $F;
    Hi1 := (Slowo shr 8) and $F;
    Hi2 := (Slowo shr 12) and $F;
    if Lo1 <= 9 then Z1 := Chr (Lo1+48)
    else Z1 := Chr (Lo1+55);
    if Lo2 <= 9 then Z2 := Chr (Lo2+48)
    else Z2 := Chr (Lo2+55);
    if Hi1 <= 9 then Z3 := Chr (Hi1+48)
    else Z3 := Chr (Hi1+55);
    if Hi2 <= 9 then Z4 := Chr (Hi2+48)
    else Z4 := Chr (Hi2+55);
    Word2Hex := Z4+Z3+Z2+Z1
    end;

    procedure WypiszDaneOTrybie (NrTrybu: Word);
    begin
    ClrScr;
    with DV do
    begin
    Writeln ('Tryb ', Word2Hex (NrTrybu), 'h');
    Write ('Atrybuty trybu: tryb dost&#169;pny');
    if AtrybutyTrybu and 2 = 2 then
    Write (', dost&#169;pna dodatkowa informacja');
    if AtrybutyTrybu and 4 = 4 then
    Write (', funkcje obsugiwane przez BIOS');
    if AtrybutyTrybu and 8 = 8 then
    Write (', tryb kolorowy')
    else
    Write (', tryb nie kolorowy');
    if AtrybutyTrybu and 16 = 16 then
    Write (', graficzny')
    else
    Write (', tekstowy');
    Writeln;
    Writeln;
    if AtrybutyOknaA and 1 = 1 then
    begin
    Write ('Atrybuty okna A : ');
    if AtrybutyOknaA and 2 = 2 then
    Write ('okno jest odczytywalne, ');
    if AtrybutyOknaA and 4 = 4 then
    Write ('zapisywalne');
    Writeln
    end
    else Writeln ('Okno A jest niedost&#169;pne.');
    if AtrybutyOknaB and 1 = 1 then
    begin
    Write ('Atrybuty okna B : ');
    if AtrybutyOknaA and 2 = 2 then
    Write ('okno jest odczytywalne, ');
    if AtrybutyOknaA and 4 = 4 then
    Write ('zapisywalne');
    Writeln
    end
    else Writeln ('Okno B jest niedost&#169;pne.');
    Writeln ('Granulacja adresowania okien (w KB) : ',
    Word2Hex (GranAdresOkien), 'h');
    Writeln ('Rozmiar okna (w KB) : ',
    RozmiarOkna);
    Writeln ('Pocztek segmentu okna A : ',
    Word2Hex (PoczSegOknaA), 'h');
    Writeln ('Pocztek segmentu okna B : ',
    Word2Hex (PoczSegOknaB), 'h');
    Writeln ('Adres funkcji pozycjonowania okna : ',
    Word2Hex (PAdresFPozOkna2), 'h:',
    Word2Hex (PAdresFPozOkna1), 'h');
    Writeln ('Liczba bajtow zajmowanych przez linie: ',
    LiczbaBajtowNaLinie);
    Writeln ('Rozdzielczo† : ',
    SzerokoscEkranu, 'x', WysokoscEkranu);
    Writeln ('Liczba bitow przypadajaca na punkt : ',
    LBitowNaPixel);
    Write ('Rodzaj modelu pamieci : ');

    case RodzajModeluPamieci of
    0 : Writeln ('brak danych');
    1 : Writeln ('graficzny CGA');
    2 : Writeln ('graficzny Hercules');
    3 : Writeln ('16-kolorowy EGA');
    4 : Writeln ('spakowane piksle');
    5 : Writeln ('tryb 256 kolorowy, ale nie CHAIN4');
    6 : Writeln ('bezposrednie 15/16/24 bity');
    7 : Writeln ('model koloru YUV');
    8..255: Writeln ('zarezerwowane');
    end; { case }

    Writeln ('Rozmiar banku (w KB) : ',
    RozmiarBanku);
    Writeln ('Liczba stron wizyjnych : ',
    LiczbaStronWizyjnych)
    end; { with }
    Writeln;
    Writeln ('Nacinij dowolny klawisz.');
    Znak := ReadKey
    end;

    begin
    ClrScr;
    PobierzInformacjeOKarcie;
    Write ('Producent karty : ');
    while Mem [DK.PProducentKarty2K.PProducentKarty1] <> 0 do
    begin
    Write (Chr (Mem [DK.PProducentKarty2K.PProducentKarty1]));
    Inc (DK.PProducentKarty1)
    end;
    Writeln;
    Writeln ('Numer wersji standardu VESA: ', DK.NrWersjiVESA);
    Writeln ('Nacinij dowolny klawisz.');
    Znak := ReadKey;
    while MemW [DK.PListaTrybow2K.PListaTrybow1] <> $FFFF do
    begin
    PobierzInformacjeOTrybach (MemW [DK.PListaTrybow2K.PListaTrybow1]);
    WypiszDaneOTrybie (MemW [DK.PListaTrybow2K.PListaTrybow1]);
    Inc (DK.PListaTrybow1, 2)
    end
    end.


    --------------------------------------------------------------------------
    NO I JESZCZE JEDEN PROGRAMIX DO PASCALA:
    --------------------------------------------------------------------------



    program OdczytanieParametrowTrybowVESA12; { $G+ }
    uses Crt;
    type
    DaneVesa = record
    AtrybutyTrybu: Word;
    AtrybutyOknaA,
    AtrybutyOknaB :Byte;
    GranAdresOkien,
    RozmiarOkna,
    PoczSegOknaA,
    PoczSegOknaB,
    PAdresFPozOkna1,
    PAdresFPozOkna2: Word;
    LiczbaBajtowNaLinie,
    SzerokoscEkranu,
    WysokoscEkranu: Word;
    SzerokoscZnaku,
    WysokoscZnaku,
    LiczbaPlaszczyzn,
    LBitowNaPixel,
    Zarezerwowane0,
    RodzajModeluPamieci,
    RozmiarBanku,
    LiczbaStronWizyjnych,
    Zarezerwowane1,
    R_RozmiarMaski,
    R_PozycjaMaski,
    G_RozmiarMaski,
    G_PozycjaMaski,
    B_RozmiarMaski,
    B_PozycjaMaski,
    Z_RozmiarMaski,
    Z_PozycjaMaski,
    InfOTrybiePracyBezposred,
    Zarezerwowane2: Byte;
    Zarezerwowane: array [1..215] of Byte;
    end;

    DaneKarty = record
    VESASygnatura: array [1..4] of Char;
    NrWersjiVESA,
    PProducentKarty1,
    PProducentKarty2: Word;
    MozliwosciKarty: array [1..4] of Byte;
    PListaTrybow1,
    PListaTrybow2: Word;
    Zarezerwowane: array [1..238] of Byte;
    end;

    var
    Znak: Char;
    DV: DaneVesa;
    DK: DaneKarty;

    procedure PobierzInformacjeOKarcie; assembler;
    asm
    mov di, offset DK
    mov ax, 4F00h
    int 10h
    end;

    procedure PobierzInformacjeOTrybach (Tryb: Word); assembler;
    asm
    push es
    push ds
    pop es
    mov di, offset DV
    mov ax, 4F01h
    mov cx, [Tryb]
    int 10h
    pop es
    end;

    function Word2Hex (Slowo: Word): String;
    var
    Lo1, Lo2, Hi1, Hi2: Byte;
    Z1, Z2, Z3, Z4: Char;
    begin
    Lo1 := Slowo and $F;
    Lo2 := (Slowo shr 4) and $F;
    Hi1 := (Slowo shr 8) and $F;
    Hi2 := (Slowo shr 12) and $F;
    if Lo1 <= 9 then Z1 := Chr (Lo1+48)
    else Z1 := Chr (Lo1+55);
    if Lo2 <= 9 then Z2 := Chr (Lo2+48)
    else Z2 := Chr (Lo2+55);
    if Hi1 <= 9 then Z3 := Chr (Hi1+48)
    else Z3 := Chr (Hi1+55);
    if Hi2 <= 9 then Z4 := Chr (Hi2+48)
    else Z4 := Chr (Hi2+55);
    Word2Hex := Z4+Z3+Z2+Z1
    end;

    procedure WypiszDaneOTrybie (NrTrybu: Word);
    begin
    ClrScr;
    with DV do
    begin
    Writeln ('Tryb ', Word2Hex (NrTrybu), 'h');
    Write ('Atrybuty trybu: tryb dost&#169;pny');
    if AtrybutyTrybu and 2 = 2 then
    Write (', dost&#169;pna dodatkowa informacja');
    if AtrybutyTrybu and 4 = 4 then
    Write (', funkcje obsugiwane przez BIOS');
    if AtrybutyTrybu and 8 = 8 then
    Write (', tryb kolorowy')
    else
    Write (', tryb nie kolorowy');
    if AtrybutyTrybu and 16 = 16 then
    Write (', graficzny')
    else
    Write (', tekstowy');
    Writeln;
    Writeln;
    if AtrybutyOknaA and 1 = 1 then
    begin
    Write ('Atrybuty okna A : ');
    if AtrybutyOknaA and 2 = 2 then
    Write ('okno jest odczytywalne, ');
    if AtrybutyOknaA and 4 = 4 then
    Write ('zapisywalne');
    Writeln
    end
    else Writeln ('Okno A jest niedost&#169;pne.');
    if AtrybutyOknaB and 1 = 1 then
    begin
    Write ('Atrybuty okna B : ');
    if AtrybutyOknaA and 2 = 2 then
    Write ('okno jest odczytywalne, ');
    if AtrybutyOknaA and 4 = 4 then
    Write ('zapisywalne');
    Writeln
    end
    else Writeln ('Okno B jest niedost&#169;pne.');
    Writeln ('Granulacja adresowania okien (w KB) : ',
    Word2Hex (GranAdresOkien), 'h');
    Writeln ('Rozmiar okna (w KB) : ',
    RozmiarOkna);
    Writeln ('Pocztek segmentu okna A : ',
    Word2Hex (PoczSegOknaA), 'h');
    Writeln ('Pocztek segmentu okna B : ',
    Word2Hex (PoczSegOknaB), 'h');
    Writeln ('Adres funkcji pozycjonowania okna : ',
    Word2Hex (PAdresFPozOkna2), 'h:',
    Word2Hex (PAdresFPozOkna1), 'h');
    Writeln ('Liczba bajtow zajmowanych przez linie: ',
    LiczbaBajtowNaLinie);
    Writeln ('Rozdzielczo† : ',
    SzerokoscEkranu, 'x', WysokoscEkranu);
    Writeln ('Liczba bitow przypadajaca na punkt : ',
    LBitowNaPixel);
    Write ('Rodzaj modelu pamieci : ');

    case RodzajModeluPamieci of
    0 : Writeln ('brak danych');
    1 : Writeln ('graficzny CGA');
    2 : Writeln ('graficzny Hercules');
    3 : Writeln ('16-kolorowy EGA');
    4 : Writeln ('spakowane piksle');
    5 : Writeln ('tryb 256 kolorowy, ale nie CHAIN4');
    6 : Writeln ('bezposrednie 15/16/24 bity');
    7 : Writeln ('model koloru YUV');
    8..255: Writeln ('zarezerwowane');
    end; { case }

    Writeln ('Rozmiar banku (w KB) : ',
    RozmiarBanku);
    Writeln ('Liczba stron wizyjnych : ',
    LiczbaStronWizyjnych)
    end; { with }
    Writeln;
    Writeln ('Nacinij dowolny klawisz.');
    Znak := ReadKey
    end;

    begin
    ClrScr;
    PobierzInformacjeOKarcie;
    Write ('Producent karty : ');
    while Mem [DK.PProducentKarty2K.PProducentKarty1] <> 0 do
    begin
    Write (Chr (Mem [DK.PProducentKarty2K.PProducentKarty1]));
    Inc (DK.PProducentKarty1)
    end;
    Writeln;
    Writeln ('Numer wersji standardu VESA: ', DK.NrWersjiVESA);
    Writeln ('Nacinij dowolny klawisz.');
    Znak := ReadKey;
    while MemW [DK.PListaTrybow2K.PListaTrybow1] <> $FFFF do
    begin
    PobierzInformacjeOTrybach (MemW [DK.PListaTrybow2K.PListaTrybow1]);
    WypiszDaneOTrybie (MemW [DK.PListaTrybow2K.PListaTrybow1]);
    Inc (DK.PListaTrybow1, 2)
    end
    end.




    To wszystko. Odpisz jak co bbdzie nie tak, lub Ty co znajdziesz... Nara

Informacje o temacie

Users Browsing this Thread

Aktualnie 1 użytkownik(ów) przegląda ten temat. (0 zarejestrowany(ch) oraz 1 gości)

Podobne wątki

  1. Odpowiedzi: 12
    Ostatni post / autor: 07-07-09, 12:01
  2. Turbo Pascal + WinXP SP2
    By Siriah in forum OPROGRAMOWANIE
    Odpowiedzi: 9
    Ostatni post / autor: 18-01-05, 23:15

Zakładki

Zakładki

Uprawnienia

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  

Jak czytać DI?

Powered by  
ATMAN EcoSerwer