S3 TrioV+ i stary monitor - rozwiazanie

Autor: Jaroslaw Kowalski (jkowalsk_at_I_should_put_my_domain_in_etc_NNTP_INEWS_DOMAIN)
Data: Fri 29 Nov 1996 - 09:06:07 MET


Pare dni temu pisalem o swoich problemach z S3Trio 64V+ ze slabym monitorem.
Znalazlem wczoraj rozwiazanie, wiec jesli to kogos interesuje to niech poczyta
dalej.

Co prawda nigdy w zyciu nie potrzebowalem grzebac po rejestrach CRT karty
graficznej, ale ten jeden raz okazal sie zbawienny w skutkach: mam rozwiazanie
ktore dziala i to zadziwiajaco dobrze.

Polaryzacje ustawia sie (na szczescie) jednakowo dla wszystkich kart VGA
(przynajmniej tak mi sie wydaje). Sluzy do tego rejest Misc. Output Register
(0x3C2). Jest on Write-Only, daje sie go odczytac spod (0x3CC). Sprawe
rozwiazuje (przynajmniej w moim przypadku) ustawienie dwoch najstarszych bitow
(tzn. 6 i 7) w tym rejestrze.

Odpowiedni ciag instrukcji assemblera ktory cos takiego robi:

        mov dx, 3CCh
        in al, dx
        or al, 11000000b
        mov dx, 3C2h
        out dx, al

        I juz dziala. Zastosowalem cos takiego w malym rezydencie, ktory
przejmuje przerwanie biosu 10h i wykrywa wszystkie przelaczenia trybow,
zarowno bezposrednie jak i via VESA. Po wykryciu ze program chce ustawic
tryb 800 x 600 (x4, x8, x15, x16, x32) program pozwala mu to zrobic wywolujac
stary handler przerwania a nastepnie wykonuje ten powyzszy magiczny ciag
instrukcji. I juz!!!

        Problem pojawia sie pod Windoza, gdyz chyba Microsoft z jakiegos
powodu nie lubi BIOS'u i z pewnych powodow nie wywoluje przerwania 10h
tylko ustawia to sobie sam w jakis badziewny sposob. Oczywiscie moj handler
wtedy bierze w leb. Rozwiazalem to w sposob bardzo koderski i w zadnym wypadku
nie zgodny z regulami sztuki (chyba trzeba napisac VxD a ja nie wiem jak to
sie robi). Strzelilem sobie mianowicie w VC++ malutki programik (malutki jak
 malutki ale dlaczego kompilat zajmuje az 32KB ????) o nastepujacej tresci:

        int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
        {
                _outp(0x3C2, _inp(0x3CC) | (128 + 64));
                return 0;
        };

        Do tego dochodzi jeszcze dolaczenie naglowkow: conio.h i windows.h.
Programik ten uruchamiam w grupie Autostart i chodzi!!!!!. Tylko co jakis czas
rozsynchronizowuje sie w momencie przechodzenia do trybu DOS w okienku.
No to podczepilem go pod HOT-KEY i za kazdym razem kiedy cos sie chrzani
wywoluje go. Troche to bez sensu i moze byc wpieprzajace jak czlowiek czesto
wchodzi do DOS'u, niemniej jednak dziala i to calkiem skutecznie. Probowalem
tez innego rozwiazania opartego na komunikacie WM_TIMER Windozy bo chcialem
zeby mi sie sam ekran poprawial co 1/10 sekundy, ale cos sie walilo.

        Tutaj mam male zadanie-prosbe do wszelkich Win95 GURUs:

        Jesli ktos bylby tak dobry i napisal jakiegos przykladowego VxD'ka,
ktory przy kazdej reinicjalizacji grafiki wykonuje powyzszy kawalek kodu, to
bede bardzo wdzieczny.

        A co jesli nie lubisz/nie znasz Assemblera/C/C++ ??? Nie ma sprawy,
napisz do mnie, a przesle Ci caly kod zrodlowy i wykonywalny tych programikow.
Jest to TOTALLY FREEWARE. Programy mozna jesc, palic, odtwarzac publicznie :-)
kopiowac, sprzedawac, co kto lubi.

        Przesylam pozdrowienia i mam nadzieje ze program byl przydatny.
Czekam na komentarze na adres:

        Jaroslaw.Kowalski_at_students.mimuw.edu.pl

        Pozdrawiam



To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 12:57:41 MET DST