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:
Klawisz | Ins | Caps Lock | Num Lock | Scroll Lock | Alt | Ctrl | Shift lewy | Shift prawy |
Nr bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Znaczenie bit≤w | tryb w│▒czony lub wy│▒czony | klawisz wci╢niΩty lub zwolniony |
Klawisz | Ins | Caps Lock | Num Lock | Scroll Lock | Lewy Alt | Lewy Ctrl | ||
Nr bitu | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Znaczenie bit≤w | Klawisz 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.