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