FAQ.Podstawy.Pascal v1.0 15-03-2000
Autor: Adam B/laszczyk
Nie biorę odpowiedzialności za to co sobie lub komputerowi zrobisz po
przeczytaniu tego tekstu, ani po odpaleniu któregokolwiek z programów.
FAQ.Podstawy.Pascal powstał w wyniku spontanicznego przypływu energii jego
Autora, celem wyjaśnienia wszystkim zainteresowanym o co biega w popularnym
języku Pascal. Docelowo tekst ten jest przeznaczony dla początkujących
programistów, ale rozróżniających już co to jest zmienna, stała, czy moduł
(unit).
Mam nadzieję, że całość się z czasem rozrośnie.
Jeśli znalazłeś tu jakiś błąd daj mi znać na poniższy adres.
Dane kontaktowe:
Adam Błaszczyk
ICQ 66078153
WWW: http://free.polbox.pl/p/pyro [pirotechnika] uaktualniona
12-1-1999
Intencją moją nie było zastąpienie istniejącego FAQ polskiej grupy
pascalowej
pl.comp.lang.pascal a raczej jego dopełnienie. Całość można rozpowszechniać,
modyfikować etc. itd. itp. w jakiejkolwiek postaci.
Nie ma tu żadnej formalności, ani jakiegoś porządku. Starałem się zawrzeć tu
wszystko to o czym powinni wiedzieć początkujący programiści.
Uwaga moja koncentruje się tutaj na języku Pascal dostępnym w popularnym,
choć
dość leciwym, pakiecie firmy Borland. W całości można odnaleźć konkretne
rozwiązanie programowe. Nie zawsze są one najlepsze, ale całość piszę "na
szybko" i korzystam na bieżąco z moich własnych archiwów, stąd jakość
programów
przykładowych jest zmienna.
Spis treści:
- FAQ.Ring0
- FAQ.Introdukcja
- FAQ.W_czym_programować
- FAQ.Konkrety.gotowe_rozwiązania
--Parametry programu
--Konwersja liczby dziesiętnej na 16-kową
--Czytanie i rozpoznawanie znaków z klawiatury:
--Czytanie i rozpoznawanie Scancodów klawiszy:
--Zmiana wartości R,G,B dla podanego koloru
--Kopiowanie plików:
--Zamiana znaków w stringu na duże
--Przeszukiwanie katalogu:
--Przeszukiwanie całego dysku:
--Najszybsze włączenie trybu 13h bez jawnego użycia ASM
--Odwracanie ekranu 'do góry nogami'
--Dokładny pomiar czasu (do setnych):
--Uruchamianie komendy/polecenia DOS/programu z wnętrza programu
FAQ.Ring0
---------
Niekomercyjne zastosowania języków/skryptów+ skala trudności nauki:
ASM - prosty, warto znać, ale programowanie w ASMie tylko dla fanów i dla
zabawy
Pascal - dobry do nauki, ale za bardzo przestarzały - w zasadzie
strukturalny
obiektowe rozszerzenia (np. Turbo Vision) niezbyt ciekawe
64K dla buforów to niestety zbyt duże ograniczenie, żeby się z tym
borykać
C - łatwy, trzeba znać, żeby brnąć w C++, a także w programowanie w Unixie
(w
zasadzie cały UNIX to jedno wielkie 'C'
nadaje się do pisania skryptów CGI
(pod DOS warto zająć się Watcom C czyli znane wszystkim DOS4GW)
Java - trudny, ale ma zajebiste możliwości, obiektowy,
bezapelacyjnie warto się za niego zabrać,
bo obecnie to #1 na scenie
C++ - trudny, obiektowy, ale w ma zajebiste możliwości
Delphi - Visual dla Pascala, nie znam na tyle, żeby dać jakąś sensowną
opinię
Perl - łatwy, jest super do oprogramowywania CGI
Modula - łatwy, dla fanów, podobne do pascala, ale nie znam jakichś
poważnych
zastosowań
Lisp - pochlastany, dla fanów, tylko wybrane zastosowania (rozb. wyrażenie
regularne?)
Smalltalk - totalnie obiektowy, pochlastany, dla fanów
Reasumując proste języki strukturalne sa proste do nauki, ale przestarzałe.
Wskazane jest więc rozwijanie warsztatu pod kątem programowania obiektowego
....
FAQ.Introdukcja:
----------------
Komputerek który chcesz oprogramować zwykle posiada pewne zasoby. Szumnym
tym
mianem określamy wszystko to co mamy do dyspozycji pisząc program, a więc w
szczególności pamięć operacyjną, procesor itd. itp.
Pisząc program w Pascalu musimy mieć stale na uwadze, iż zasoby te, mamy
dość
ograniczone z wielu względów.
Sama znajomość Pascala nie przesądza o tym, iż będziemy dobrym koderem.
Aby w pełni wykorzystać siłę języka należy znać przynajmniej w zarysach
mechanizmy jakie rządzą maszynką, którą się bawisz.
Dobrym przewodnikiem po flakach PC-ta, systemu DOS, asemblerze będą książki:
flaki pamięci, DOS:
"DOS 5.0 od środka"
Leonid Bułhak, Ryszard Goczyński, Michał Tuszyński
"Mapa pamięci IBM/PC w przykładach w Pascalu i asemblerze"
- książka moich dwóch kumpli Maćka Sokołowskiego i Arka Andrusza
dość leciwa, ale wciąż aktualna
flaki kart graficznych (operacje na portach/BIOS):
"Sterowniki graficzne - Sterownik graficzny VGA"
Natalia Kowalczyk, Damian Krzemiński
"Karty graficzne"
Ryszard Jarża
flaki asembler, przerwania, tryby procesora, wirusy:
"Asembler 8086/88"
Eugeniusz Wróbel
"Asembler 8086/20286 - Pod zegarem"
Marek Kotowski
"Mikroprocesory 80286, 80386, i486"
Ryszard Goczyński, Michał Tuczyński
"Anatomia PC"
Piotr Metzger
"Jak pisać wirusy"
Andrzej Dudek
"Wirusy -pisanie wirusów i antywirusów"
Adam Błaszczyk - tak, tak, to moja książka
FAQ.W_czym_programować:
--------------------------------
1. jak lubisz, to w z integrowanym środowisku Borland Pascala,
2. dobra metoda to użycie zewn. kompilatora, zintegrowanego z rozszerzeniem
PAS
w DOS Navigatorze - ten ostatni polecam, ponieważ jest to świetny program
łączący w sobie kupę przemyślanych i użytecznych opcji, o których nie
pomyśleli w BP - np. schowek współużywalny z Windowsami, a także pionowe
bloki
FAQ.Konkrety.gotowe_rozwiązania:
--------------------------------
Parametry programu
------------------
parametry programu to to wszystko co podajemy jako opcje do programu:
Dostęp do ich z programu mamy za pośrednictwem poniższych funkcji:
paramstr(0) nazwa naszego programu
(uwaga: to jest prawda tylko, gdy wywołujemy program normalnie, czyli
np.
z DOS/Windows, ale nie gdy 'odpalamy' go w BP za pomocą CTRL-F9)
paramstr(1) 1-szy par. programu z linii poleceń
paramstr(2) 2-szy par. programu z linii poleceń
ParamCount - ilość parametrów w linii poleceń
{START}
var
i : Byte;
begin
Writeln('Nazwa programu: ', ParamStr(0));
Writeln('Ilość Parametrów: ', ParamCount);
if i=0
then
WriteLn('Uruchom mnie z parametrami np.',#10#13#9,ParamStr(0),' a b c d e
f')
else
for i:=1 to ParamCount do
Writeln('Parametr [',chr(i+48-1),']:=',ParamStr(i));
end.
{END}
Konwersja liczby dziesiętnej na 16-kową
---------------------------------------
zmiana systemu z dziesiętnego na 16-kowy jest trywialna
zadany bajt dzielimy na dwie połówki
bajt b = xxxxyyyy bitowo
xxxx=1-sza za pomocą 'b shr 4' (równoznaczne z 'b div 4', ale szybsze)
yyyy=2-ga za pomocą 'b and 15' czyli 'b and 00001111' bitowo
{START}
function HexB(B:Byte):String;
const
hc:string[16]='0123456789ABCDEF';
begin
hexB:='$'+hc[1+B shr 4]+hc[1+B and 15];
end;
begin
Writeln('Postac szesnastkowa liczby 100:=',HexB(100));
end.
{END}
Czytanie i rozpoznawanie znaków z klawiatury:
---------------------------------------------
zwykłe znaki reprezentowane sa przez jeden znak w buforze klawiatury
rozszerzone np. kursory przez dwa - wtedy pierwszy znak jest równy #0
a drugi zawiera właściwy kod klawisza
{START}
uses Crt; { funkcja ReadKey pochodzi z modulu CRT }
var
c : Char;
begin
repeat
c:=ReadKey; { czytamy znak }
if c=#0 { jesli znak rozszerzony to c=#0 }
then
begin
c:=ReadKey;
writeln('#0#',ord(c));
end
else
writeln('#',ord(c));
until c=#27;
end.
{END}
Czytanie i rozpoznawanie Scancodów klawiszy:
--------------------------------------------
ScanCode to znak 'widziany' bezpośrednio po naciśnięciu go na klawiaturze,
a dostępny w porcie [$60]
port ten obsługiwany jest przez przerwanie 09, a te z kolei konwertuje
kod na widziany później przez przerwanie programowe 16h kod (a więc np. dla
funkcji Readkey)
obsługa klawiatury na poziomie przerwania 09 pozwala zastosować w naszym
progu
klawisze o przeróżnych kombinacjach, a niedostępnych za pomocą int 16h np.
kombinacje ALT-SHIFT-Spacja, CTRL-ALT-F12 itp., a także reagowanie na
naciśnięcie i puszczenie klawisza (bit 7 czyli wartość 128 odczytana z portu
$60
zORowana z kodem klawisza określa fakt wciśnięcia/puszczenia tegoż klawisza)
W programie: ESC [ScanCode ESC to 1] przerywa zabawę ...
{START}
begin
while port[$60]<1 do WriteLn(port[$60]);
end.
{END}
Zmiana wartości R,G,B dla podanego koloru
-----------------------------------------
Każdy kolor składa się z trzech pól R,G,B, będących składowymi kolorów R-Red
(czerwony), G-Green(zielony), B-Blue (niebieski)
Poprzez manipulację tymi składowymi można uzyskać dowolną (no prawie) barwę
poniższy program zmienia standardowy szary kolor tekstu na czerwony
{START}
procedure Pal(Col,R,G,B : Byte); assembler;
asm
mov dx,3c8h
mov al,[col]
out dx,al
inc dx
mov al,[r]
out dx,al
mov al,[g]
out dx,al
mov al,[b]
out dx,al
end;
begin
{ parametry: R G B}
Pal(7, $FF, $00, $00);
end.
{END}
Kopiowanie plików:
------------------
Uwag procedurka nadpisuje plik docelowy, brak kontroli IO
{START}
procedure CopyFile(skad, dokad:String);
const
MaxBuf = 65535;
var
F,G:file;
K:word;
Buf:pointer;
begin
GetMem(Buf,MaxBuf);
Assign(F,Skad);
Reset(F,1);
Assign(G,Dokad);
ReWrite(G,1);
repeat
BlockRead(f,Buf^,MaxBuf,K);
BlockWrite(g,Buf^,K);
until K<MaxBuf;
Close(F);
Close(G);
FreeMem(Buf,MaxBuf);
end;
begin
if ParamCount<2
then Writeln ('Wywolaj mnie z 2-ma nazwami plikow [skad] [dokad]')
else CopyFile(ParamStr(1),ParamStr(2));
end.
{END}
Zamiana znaków w stringu na duże
--------------------------------
{START}
function UpStr(s:string):string;
var
i:
...
więcej »