RӯNE CIEKAWE RZECZY

tym dziale bΩd▒ poruszane r≤┐ne ciekawe tematy, kt≤re trudno by│oby zaklasyfikowaµ do innych dzia│≤w. W du┐ej mierze dotycz▒ one spraw sprzΩtowych, kt≤re na innych stronach rzadko s▒ publikowane. WiΩkszo╢µ z nich mo┐na bezpiecznie wykorzystywaµ tylko w programach dosowskich, w≤wczas bΩdΩ to zaznaczaµ. BΩdziemy te┐ czΩsto zahaczaµ o asembler. Celem tego dzia│u jest przedstawienie mo┐liwo╢ci, jakich "go│y" Turbo Pascal nie daje. Wiedza tu zawarta nie jest co prawda ca│kiem aktualna, ale pozwala pogrzebaµ w naszych "kompach". Jest ona te┐ swego rodzaju FAQ.


Wy│▒czanie monitora - wiemy, ┐e monitor mo┐na prze│▒czyµ w stan u╢pienia, wi▒┐e siΩ to z oszczΩdno╢ci▒ energii. Ma│o kto jednak w praktyce to pr≤bowa│. Mo┐na to osi▒gn▒µ bardzo prosto. Wystarczy wywo│aµ przerwanie 10h z rejestrami ustawionymi nastΩpuj▒co:
AX=4F10h
BL=01h
BH=nowy stan monitora
DostΩpne stany monitora(ustawienia rejestru BH):
00h - on
01h - standby
02h - suspend
04h - off
Je╢li akcja zostanie wykonana pomy╢lnie, rejestr AH musi byµ r≤wny zero. Uwaga!!! U┐ywaµ tylko w programach DOS-owskich!!!


Inn▒ ciekaw▒ spraw▒ jest sprawdzanie obecno╢ci koprocesora. Robimy to tak┐e przy u┐yciu odpowiedniego przerwania. Tym razem jest to przerwanie o numerze 11h. Po jego wywo│aniu sprawdzamy pierwszy bit rejestru AX(liczymy je nie od jeden, ale od zera!). Je╢li jest on zapalony, to w komputerze jest koprocesor arytmetyczny, w przeciwie±stwie go nie ma. U┐ywaµ tylko w programach DOS-owskich.


Ukrywanie kursora tekstowego bardzo siΩ przydaje. U┐ywamy do tego przerwania 10h z nastΩpuj▒co ustawionymi rejestrami:
AH=1
CH=16
CL=0


Pokazywanie ma│ego, standardowego kursora te┐ musimy znaµ. Numer przerwania i rejestr AH jak poprzednio, ale CH=15 i CL=15


Pokazywanie du┐ego kursora realizujemy znowu tym samym przerwaniem i rejestrem AH, ale CH=1 i CL=16.


Drukowanie grafiki jest o dziwo tematem pomijanym na innych stronach, a przecie┐ przydatnym. Ot≤┐ na drukarkΩ trzeba wys│aµ nastΩpuj▒c▒ sekwencjΩ: ESC,K,n1,n2,b1..bn . Nale┐▒ siΩ wyja╢nienia. ESC to znak o kodzie ASCII 27. K to po prostu du┐a litera K. n1 i n2 to bajty wskazuj▒ce, ile bajt≤w grafiki chcemy wydrukowaµ. LiczbΩ tΩ obliczamy w ten spos≤b: n1+256*n2. b1..bn to bajty w kt≤rych zakodowali╢my grafikΩ. Drukowanie odbywa siΩ w trybie 480 punkt≤w na wiersz. W sam raz, aby wydrukowaµ standardowy ekran VGA. Jak mo┐na siΩ domy╢liµ, ka┐dy bajt to 8 bit≤w w pionie.
Przed drukowaniem trzeba ustaliµ jeszcze wysoko╢µ wiersza. Je╢li nie wiesz, jak to zrobiµ, napisz! Drukowanie powinno zadzia│aµ na drukarkach Epsona, IBMa i kompatybilnych. Osobi╢cie radzΩ wysy│aµ od razu ca│▒ stronΩ, a nie np. po jednym wierszu, bo wtedy kr≤cej czekamy.


Pomiar czasu w Turbo Pascalu jest mo┐liwy dziΩki procedurze gettime, ale nas interesuje zapewne wiΩksza dok│adno╢µ ni┐ do jednej sekundy. W tym celu deklarujemy dwie zmienne typu LONGINT, dajmy na to c1,c2 oraz jedn▒ typu REAL, dajmy na to r. RozpoczΩcie pomiaru czasu zaczyna siΩ instrukcj▒:

c1:=longint(memw[$0040:$006E])*65535+longint(memw[$0040:$006C]);

NastΩpnie wykonujemy jakie╢ operacje. Gdy chcemy dowiedzieµ siΩ, ile czasu up│ynΩ│o od rozpoczΩcia pomiaru, wykonujemy instrukcjΩ:

c2:=longint(memw[$0040:$006E])*65535+longint(memw[$0040:$006C]);
r:=(c2-c1)/18.2;

Teraz w zmiennej rzeczywistej r zapisana jest liczba sekund miΩdzy rozpoczΩciem a zako±czeniem pomiaru.
Uwaga! Ten spos≤b nie dzia│a, gdy pomiar zaczniemy jednego dnia, a sko±czymy drugiego. Je╢li chcesz wiedzieµ, dlaczego, napisz!


Sprawdzanie klawiszy alt, ctrl, shift, caps lock, num lock, scroll lock, ins nie jest niestety mo┐liwe za pomoc▒ standardowo dostΩpnych procedur. Trzeba tu skorzystaµ z dw≤ch bajt≤w w pamiΩci, kt≤re informuj▒ nas o tych klawiszach i np. o stanie kontrolki CAPS LOCK.

Pierwszy z tych bajt≤w ma adres $0040:$0017 i jego bity maj▒ nastΩpuj▒ce znaczenie:
KlawiszInsCaps LockNum LockScroll LockAltCtrlShift lewyShift prawy
Nr bitu76543210
Znaczenie bit≤wtryb w│▒czony lub wy│▒czonyklawisz wci╢niΩty lub zwolniony


Drugi z tych bajt≤w ma adres $0040:$0018 i jego bity maj▒ nastΩpuj▒ce znaczenie:
KlawiszInsCaps LockNum LockScroll LockLewy AltLewy Ctrl
Nr bitu76543210
Znaczenie bit≤wKlawisz wci╢niΩty lub zwolniony


Znak w prawym dolnym rogu ekranu tekstowego, a raczej trudno╢ci z jego wy╢wietleniem przy u┐yciu standardowych instrukcji WRITE/WRITELN, spedzaj▒ sen z powiek wielu pocz▒tkuj▒cym programistom w DOS-ie. OgraniczΩ siΩ do trybu C080, bo jest najczΩ╢ciej u┐ywany. W trybie tym w celu wy╢wietlenia tego┐ znaku wykonujemy instrukcjΩ:

mem[segb800:3998]:=ord(znak); {znak-zmienna typu char}

W innych jΩzykach jedyn▒ zmian▒ jest odpowiedni wyb≤r dostΩpu do pamiΩci obrazu.


Paleta kolor≤w daje siΩ │atwo modyfikowaµ przez u┐ycie odpowiednich port≤w (w trybach 8- i mniej bitowych). Najpierw wysy│amy na port 3C8h bajt okre╢laj▒cy numer zmienianego koloru, a potem trzykrotnie po jednym bajcie na port 3C9h informacje o barwach sk│adowych. Kolejno╢µ barw: czerwona, zielona, niebieska. Odczyt podobnie, tylko ┐e numer odczytywanego koloru wysy│amy nie na port 3C8h lecz 3C7h, a z portu 3C9h odczytujemy, a nie wysy│amy warto╢ci. Kolejno╢µ barw sk│adowych ta sama. Jako przyk│ad radzΩ pobawiµ siΩ w Turbo Pascalu takim oto programikiem:

program paleta;
uses crt;
var i:byte;
begin
	textmode(c80);
	textattr:=0;
	clrscr;
	repeat
		for i:=0 to 63 do begin
			port[$3C8]:=0;
			port[$3c9]:=i;
			port[$3c9]:=0;
			port[$3c9]:=i;
			delay(10);
		end;
	until keypressed;
	textmode(lastmode);
end.

Mam nadziejΩ, ┐e rozumiesz o co chodzi. Je╢li masz w▒tpliwo╢ci - napisz. Ten trik z palet▒ jest doskona│y np. przy wygaszaniu, rozja╢nianiu ekranu czy przej╢ciach miΩdzy barwami. Oczywi╢cie dzia│a te┐ w trybie graficznym, co pozwala na przyk│ad wy╢wietlaµ bitmapy z jej w│asnymi zestawami kolor≤w.


Baner reklamowy: