Evo, za sve one koji misle da je Pascal jezik za djecu, i za sve one koji se srame reci da programiraju u programskom jeziku Pascal..napisao sam ovaj tutorijal kako bi pokazali ljudima sta sve Pascal moze i da je daleko od jezika za djecu..

Takodjer je namjenjen djeci koja su naucila da napisu printf("Hello world\n"); u C-u misle da je C bog (i da su s time haxori) i da mogu ponizavati Pascal!
Necemo se baviti onim bas osnovnim stvarima i funkcijama (nemam bas vremena za pisanje tutorijala), vec malo drukcijim stvarima, koje bolje mozemo nazvati sistemskim programiranjem.
Pokusat cu ne ici jaakooo u sirinu, vec bolje svaki dio zahvatiti pa koliko bude vremena..za sve koje zele pomoc u pisanju ovog tutorijala neka mi se jave na PP ili neka dodju na irc.balcan.net na kanal #programming, ne samo u vezi tutorijala nego ukoliko se zele baviti ovakvim stvarima

Prvo neke osnove o registrima procesora:
Registar Grupa
AX Opca namjena
BX Opca namjena
CX Opca namjena
DX Opca namjena
------------------------------
CS Segment-registar
DS Segmenst-registar
ES Segment-registar
SS Segment-registar
------------------------------
SP Register pomaka
BP Register pomaka
SI Register pomaka
DI Register pomaka
IP Register pomaka
FR Register pomaka
REGISTRI OPCE NAMJENE:
Privremeno spremanje rezultata ili privremena pohrana vrijednosti osnovna je namjena ovih registara (AX,BX,CX,DX).
Programiranje upotrebom DOS i BIOS funkcija zapravo je punjenje ovih registara odgovarajucim vrijednostima i poziv serisa koji na temelju tih vrijednosti izvrsavaju odgovarajuce funkcije.
SEGMENTNI REGISTRI
Segmentni registri obavljaju najveci dio posla vezanog uz ispravno adresiranje memorijskih lokacija. Njihove 16-bitne vrijednosti predstavljaju bazne adrese memorijskih segmenata od po 64k.
Segmentni registri:
CS-tekuci segment koda (sadrzi adresu segmenta koji sadrzi izvrsni kod programa sto se trenutno izvodi)
DS-tekuci segment podataka (sadrzi adresu segmenta u kojem se nalaze podaci za taj program)
ES-registar dodatnog segmenta (ES dodatno podrzava DS registar sadrzavajuci adresu dodatnog segmenta u kojem se cesto nalaze podaci)
SS-stog (stack) segment-registar (sadrzi adresu programskog stoga (stacka) koji se koristi za privremeno spremanje podataka)
REGISTRI POMAKA
SP-pokazivac na stog
BP-pokazivac na osnovni segment
SI-pokazivac na polazni podatak
DI-pokazivac na ciljni podatak
IP-pokazivac na instrukciju
REGISTER ZASTAVICA
Dijelimo ih na:
*statusne zastavice
*kontrolne zastavice
Statusne zastavice (flagovi) su:
1.CF - carry flag
2.PF - parity flag
3.AF - aux carry flag
4.OF - overflow flag
5.SF - sign flag
6.ZF - zero flag
Te zastavice signaliziraju stanje zadnje izvrsene instrukcije.
Zastavice se postavljaju i ciste (1 i 0) automatski s tim da je dozvoljeno i programsko manipuliranje njihovim vrijednostima.
Kontrolne (upravljacke) zastavice:
1.DF - direction flag
2.TF - trap flag
3.IF - interrupt flag
Ponesto o memoriji:
Dijelimo ju na:
1.ROM-read only memory-memorija dostupna samo za citanje koja sadrzi BIOS
2.RAM-random access memory-dostupna za citanje i pisanje
3.extended memorija-produzena memorija,dostupna procesorima klase 286 i vise
4.expanded memorija-prosirena memorija,dodatna memorija kojoj se ne pristupa ditektno vec putem pogonskog programa za upravljanje prosirenom memorijom
Posto smo sada vec spomenili bar osnovne stvari za razumijevanje daljnih stvari, vjerujem da bi sada mogli prijeci na konkretne stvari:
Da bismo mogli raditi kvalitetne programe, vjerovatno nije dovoljno koristenje tipkovnice i monitora, vec i misa,printera,serijskih uredjaja, modema, te savrseno koristenje memorije..
U nastavku cemo obraditi gotovo svaki dio hardwarea (za sad bar sa jednim primjerom) kako se moze koristiti!
***MIS***
Mnogi su se vec zapitali kako "uvesti" mis u onaj crni ruzni prozor

Napisimo primjer koji ce pokazati mis u nasem programu i moci se kretati po cijelom dijelu prozora i usput pritiskom na tipku (lijevu, desnu) prokazati koordinate gdje se mis nalazi i prikazati ascii kod pritisnute tipke.
Code:
program MouseKey;
uses crt,dos;
var x,y:integer;
Lijevi,Desni:boolean;
regs:registers;
tipka:char;
function Mis_instaliran:boolean;
begin
regs.ax:=$0000;
intr($33,regs);
Mis_instaliran:=(regs.ax=$FFFF);
end;
procedure Pokazi_misa;
begin
regs.ax:=$0001;
intr($33,regs);
end;
procedure Skarij_misa;
begin
regs.ax:=$0002;
intr($33,regs);
end;
procedure Ocitaj_misa(var x_koor,y_koor:integer;var Lijevi, Desni:boolean);
begin
regs.ax:=$0003;
intr($33,regs);
x_koor:=regs.cx;
y_koor:=regs.dx;
Lijevi:=((regs.bx and 1)=1);
Desni:=((regs.bx and 2)=2);
end;
procedure Postavi_misa(x_koor,y_koor:integer);
begin
regs.ax:=$0004;
regs.cx:=x_koor;
regs.dx:=y_koor;
intr($33,regs);
end;
procedure Postavi_hor_ogranicenja(x_min,x_max:integer);
begin
regs.ax:=$0007;
regs.cx:=x_min;
regs.dx:=x_max;
intr($33,regs);
end;
procedure Postavi_vert_ogranicenja(y_min,y_max:integer);
begin
regs.ax:=$0008;
regs.cx:=y_min;
regs.dx:=y_max;
intr($33,regs);
end;
begin
clrscr;
if Mis_instaliran then
begin
Postavi_misa(40*8,12*8);
Pokazi_misa;
repeat
Ocitaj_misa(x,y,Lijevi,Desni);
if Lijevi or Desni then
write(chr(13),(x div 8):5,(y div 8):5)
else
if keypressed then
begin
tipka:=readkey;
write(chr(13),ord(tipka):10);
end;
until tipka=#27;
clrscr;
end else writeln('Mis nije instaliran!');
end.
program MouseKey;
uses crt,dos;
var x,y:integer;
Lijevi,Desni:boolean;
regs:registers;
tipka:char;
function Mis_instaliran:boolean;
begin
regs.ax:=$0000;
intr($33,regs);
Mis_instaliran:=(regs.ax=$FFFF);
end;
procedure Pokazi_misa;
begin
regs.ax:=$0001;
intr($33,regs);
end;
procedure Skarij_misa;
begin
regs.ax:=$0002;
intr($33,regs);
end;
procedure Ocitaj_misa(var x_koor,y_koor:integer;var Lijevi, Desni:boolean);
begin
regs.ax:=$0003;
intr($33,regs);
x_koor:=regs.cx;
y_koor:=regs.dx;
Lijevi:=((regs.bx and 1)=1);
Desni:=((regs.bx and 2)=2);
end;
procedure Postavi_misa(x_koor,y_koor:integer);
begin
regs.ax:=$0004;
regs.cx:=x_koor;
regs.dx:=y_koor;
intr($33,regs);
end;
procedure Postavi_hor_ogranicenja(x_min,x_max:integer);
begin
regs.ax:=$0007;
regs.cx:=x_min;
regs.dx:=x_max;
intr($33,regs);
end;
procedure Postavi_vert_ogranicenja(y_min,y_max:integer);
begin
regs.ax:=$0008;
regs.cx:=y_min;
regs.dx:=y_max;
intr($33,regs);
end;
begin
clrscr;
if Mis_instaliran then
begin
Postavi_misa(40*8,12*8);
Pokazi_misa;
repeat
Ocitaj_misa(x,y,Lijevi,Desni);
if Lijevi or Desni then
write(chr(13),(x div 8):5,(y div 8):5)
else
if keypressed then
begin
tipka:=readkey;
write(chr(13),ord(tipka):10);
end;
until tipka=#27;
clrscr;
end else writeln('Mis nije instaliran!');
end.
***MIS***
***MONITOR***
Ponesto o video-adapterima:
MDA(Monochrome Display Adapeter)
-podrzava samo jedan nacin rada:text mod s 80 stupaca 25 redaka
CGA(Color Graphics Adapter)
-podrzavao je tekst rezoluciju s 80 stupaca i 25 redaka i graficke nacine rada s rezolucijama 320*200 s cetiri boje i 640*200 sa dvije boje
HGC(Hercules Graphics Card)
-donio je sa sobom kombinaciju grafickih mogucnosti CGA adaptera i dobre osobine MDA adaptera
EGA(Extended Graphics Adapter)
-koristi set VLSI (Very Scale of Intergration) cipova
-kompatibilan sa MDA i CGA adapterima
-rezolucija do 640*350 s istovremenim prikazom 16 iz moguce palete od 32 boje
-na samoj kartici se nalazi vlastiti EGA BIOS
VGA(Video Graphics Array)
-generira analogne a ne digitalne signale na monitor i time je bio u mogucnosti poslati 256 kB razlicitih boja
SVGA(Super VGA)
-podrzava visoke rezolucije (do 1024*76

-graficki procesor uzrokuje znacajno ubrzanje citavog video-sistema
Pristup video sistemu moguc je na tri nacina:
1.upotrebom DOS funkcija-najsporiji i najograniceniji
2.upotrebom BIOS funkcija putem prekida 10H
3.direktno preko hardwarea
Predjimo na mali primjer koji ce iscrtavati piksele za vise adaptera:
Code:
uses dos,crt;
var regs:registers;
procedure PostaviMod(GrMod:byte);
begin
regs.ah:=0;
regs.al:=GrMod;
intr($10, regs);
end;
procedure CrtajPiksel;
begin
regs.ah:=$0C;
regs.bh:=0;
regs.dx:=random(200);
regs.ch:=random(320);
regs.al:=random(4);
intr($10, regs);
end;
begin
PostaviMOd(5);
while not KeyPressed do CrtajPiksel;
PostaviMod(4);
end.
uses dos,crt;
var regs:registers;
procedure PostaviMod(GrMod:byte);
begin
regs.ah:=0;
regs.al:=GrMod;
intr($10, regs);
end;
procedure CrtajPiksel;
begin
regs.ah:=$0C;
regs.bh:=0;
regs.dx:=random(200);
regs.ch:=random(320);
regs.al:=random(4);
intr($10, regs);
end;
begin
PostaviMOd(5);
while not KeyPressed do CrtajPiksel;
PostaviMod(4);
end.
Evo sada primjera za skrolanje "prozora" i sakrivanje kursora (te ponovno vracanje)
Code:
program Primjer_za_Grafiku;
uses dos,crt;
var regs:registers;
i:integer;
procedure ScrollWinUP(x1,y1,x2,y2,n:byte);
begin
regs.ah:=$06;
regs.al:=n;
regs.bh:=textattr;
regs.ch:=y1;
regs.cl:=x1;
regs.dh:=y2-1;
regs.dl:=x2-1;
intr($10,regs);
end;
procedure ScrollWinDOWN(x1,y1,x2,y2,n:byte);
begin
regs.ah:=$07;
regs.al:=n;
regs.bh:=textattr;
regs.ch:=y1;
regs.cl:=x1;
regs.dh:=y2-1;
regs.dl:=x2-1;
intr($10,regs);
end;
procedure SetCursorON;
begin
regs.ah:=$01;
regs.ch:=7;
regs.cl:=8;
intr($10,regs);
end;
procedure SetCursorOFF;
begin
regs.ah:=$01;
regs.ch:=$20;
intr($10,regs);
end;
begin
clrscr;
for i:=1 to 1680 do write(chr(32+random(96)));
writeln;
writeln('Skrolamo prozor 20,5,30,20 za 5 gore');
delay(3000);
for i:=1 to 5 do
begin
ScrollWinUP(20,5,30,20,1);
delay(1000);
end;
writeln('Skrolamo prozor 20,5,30,20 za 5 dolje');
delay(3000);
for i:=1 to 5 do
begin
ScrollWinDOWN(40,5,50,20,1);
delay(1000);
end;
writeln(#13,'Skrivamo kursor!'); ClrEOL;
SetCursorOFF;
delay(3000);
writeln(#13,'Vracamo kursor!'); ClrEOL;
delay(3000);
SetCursorON;
delay(1000);
end.
program Primjer_za_Grafiku;
uses dos,crt;
var regs:registers;
i:integer;
procedure ScrollWinUP(x1,y1,x2,y2,n:byte);
begin
regs.ah:=$06;
regs.al:=n;
regs.bh:=textattr;
regs.ch:=y1;
regs.cl:=x1;
regs.dh:=y2-1;
regs.dl:=x2-1;
intr($10,regs);
end;
procedure ScrollWinDOWN(x1,y1,x2,y2,n:byte);
begin
regs.ah:=$07;
regs.al:=n;
regs.bh:=textattr;
regs.ch:=y1;
regs.cl:=x1;
regs.dh:=y2-1;
regs.dl:=x2-1;
intr($10,regs);
end;
procedure SetCursorON;
begin
regs.ah:=$01;
regs.ch:=7;
regs.cl:=8;
intr($10,regs);
end;
procedure SetCursorOFF;
begin
regs.ah:=$01;
regs.ch:=$20;
intr($10,regs);
end;
begin
clrscr;
for i:=1 to 1680 do write(chr(32+random(96)));
writeln;
writeln('Skrolamo prozor 20,5,30,20 za 5 gore');
delay(3000);
for i:=1 to 5 do
begin
ScrollWinUP(20,5,30,20,1);
delay(1000);
end;
writeln('Skrolamo prozor 20,5,30,20 za 5 dolje');
delay(3000);
for i:=1 to 5 do
begin
ScrollWinDOWN(40,5,50,20,1);
delay(1000);
end;
writeln(#13,'Skrivamo kursor!'); ClrEOL;
SetCursorOFF;
delay(3000);
writeln(#13,'Vracamo kursor!'); ClrEOL;
delay(3000);
SetCursorON;
delay(1000);
end.
***MONITOR***
***PRINTER***
DOS print program:
Code:
uses dos;
var regs:registers;
begin
{Najjdenostavnije moguce-salje se znak u DL registru na printer;
uobicajeno LPT1, osim ako standardni printerski izlaz nije preusmjeren}
regs.ah:=$05;
regs.dl:=50;
MsDos(regs);
end.
uses dos;
var regs:registers;
begin
{Najjdenostavnije moguce-salje se znak u DL registru na printer;
uobicajeno LPT1, osim ako standardni printerski izlaz nije preusmjeren}
regs.ah:=$05;
regs.dl:=50;
MsDos(regs);
end.
BIOS print program:
Code:
uses dos;
function ProvjeriPRN:Boolean;
var regs:registers;
begin
regs.ah:=$02;
regs.dx:=0;
intr($17,regs);
ProvjeriPRN:=(regs.ah AND $80)=$80;
end;
begin
if ProvjeriPRN then
writeln('Spreman za ispis!')
else
writeln('Provjerite printer!');
readln;
end.
uses dos;
function ProvjeriPRN:Boolean;
var regs:registers;
begin
regs.ah:=$02;
regs.dx:=0;
intr($17,regs);
ProvjeriPRN:=(regs.ah AND $80)=$80;
end;
begin
if ProvjeriPRN then
writeln('Spreman za ispis!')
else
writeln('Provjerite printer!');
readln;
end.
***PRINTER***
Nastavit ce se...
U nastavku ocekujte jos po koji primjer za mis, monitor, printer i nove primjere za zvucnike i modeme (pozivanje broja, resetiranje modema...)!
Veliki pozdrav cijelom #programming kanalu te Srkiju(Srki_82), Strog-u, IcyImpact-u,Peci...!
[Ovu poruku je menjao Passwd dana 19.11.2005. u 16:06 GMT+1]
[Ovu poruku je menjao Passwd dana 20.11.2005. u 11:29 GMT+1]