Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[Tutorijal] Sistemsko Programiranje!

[es] :: Pascal / Delphi / Kylix :: [Tutorijal] Sistemsko Programiranje!

[ Pregleda: 2513 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Passwd

Član broj: 54624
Poruke: 640
*.adsl.net.t-com.hr.



Profil

icon [Tutorijal] Sistemsko Programiranje!19.11.2005. u 14:57 - pre 225 meseci
(*********(Sistemsko Programiranje u Pascalu)**********)

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 sa upotrebom samo osnovnih Turbo Pascal Unita (TPU) a to su crt i dos.
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.



***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.


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.




***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.



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.



***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]
 
Odgovor na temu

Passwd

Član broj: 54624
Poruke: 640
*.adsl.net.t-com.hr.



Profil

icon Re: [Tutorijal] Sistemsko Programiranje!19.11.2005. u 17:07 - pre 225 meseci
***MODEM***
Kao sto vam obecah, napisat cemo jedan primjer za rad sa modemom..
Znaci modem se prikljucuje na serijski port racunala i povezuje se s modemom na drugom kraju tel. zice.Modem je nastao od rijeci MOdulacija/DEModulacija, odnosno njegov rad sa signalima koji putuju kroz telefonske linije..
Najbolje da skratimo pricu i da se primimo koda

Code:


Program ModemProg;

uses crt,dos;

type ModemRec=record
          COMPort,
          BPS,
          Data,
          Stop:integer;
          Paritet:char;
          Telefon:string;
              end;

Const GDSeg:integer = 0;
      MaxSprem=1024;
      CR=#13;
      ESC=#27;
      
      DPort=$03F8;
      IER=$03F9;
      LCR=$03FB;
      MCR=$03FC;
      LSR=$03FD;
      MSR=$03FE;
      IERPoc=$03ef;
      MCRPoc=$0B;
      MSRPoc=$80;
      IC8259=$21;

var  Modem:ModemRec;
     Vektor:Pointer;
     Registri:Registers;
     Spremnik: array [1..MaxSprem] of Char;
     i,Zn_u_sprem,Sprem_rep,Sprem_poc:word;
     Pomak:Char;

procedure CistiSpremnik;
begin
Sprem_rep:=1;
Sprem_poc:=1;
Zn_u_sprem:=0;
FillChar(Spremnik,SizeOf(Spremnik),0);
end;


procedure Parametri;
begin
With Modem do
  begin
  ComPort:=1;
  Write('Telefonski broj:');
  Readln(Telefon);
  end;
end;

procedure ComPrek;
interrupt;
begin
Inline($FB);
if (Zn_u_Sprem<MaxSprem) then
 begin
 Spremnik[Sprem_poc]:=Char(Port[DPort]);
 if  (Sprem_poc<maxsprem) then
     inc(sprem_poc)
     else
       sprem_poc:=1;
     inc(Zn_u_Sprem);
     end;

InLine($FA); Port[$20]:=20;

end;

procedure SetSer14H;
var Param_ser:byte;
begin
Param_ser:=$83;
with registri do
  begin
  DX:=Modem.ComPort-1;
  AH:=0;
  AL:=Param_ser;
  Flags:=0;
  Intr($14,Registri);
  end;
end;

procedure PostaviPrek;
var Bt:byte;
begin
  GDSeg:=DSeg;
  CistiSpremnik;
  GetIntVec($0c, Vektor);
  SetIntVec($0c,@ComPrek);

  Bt:=Port[IC8259];
  Bt:=Bt and $0EF;
  Port[IC8259]:=Bt;
  Bt:=Port[LCR];
  Bt:=Bt and $7F;

Port[LCR]:=Bt;
Port[IER]:=IERPoc;
Port[MCR]:=$08 or MSRPoc;
Port[$20]:=$20;
end;

function UzmiZnak:char;
begin
if Zn_u_sprem>0 then
begin
UzmiZnak:=Spremnik[Sprem_rep];
if Sprem_rep<MaxSprem then
   inc(Sprem_rep)
else
Sprem_rep:=1;
Dec(Zn_u_sprem);
end;
end;


function DosaoSignal:boolean;
var z:char;
    t:integer;
begin
DosaoSignal:=false;
T:=40;

while (Port[MSR] and $80) <> $80 do
begin
  if KeyPressed then
 begin
  z:=readkey;
  if z=ESC then exit;
  end;

 if (Zn_U_Sprem>0) then
  begin
  z:=uzmiZnak;
  Write(Z);
  if z=cr then writeln;
  end;
  if t=0 then exit;
 else
 begin
 dec(t);
  delay(1000);
end;
end;

DosaoSignal:=true;
end;


procedure SaljiZnak(Bt:byte);
begin
while (Port[Lsr] and $20) do
 begin
 end;
Port[DPort]:=Bt;
end;

procedure SaljiNiz(St:string);
var i:integer;
begin
for i:=1 to length(St) do
SaljiZnak(ord[St[i]]);
SaljiZnak(ord(CR));
end;


procedure ResetPrek;
var Bt:byte;
begin
SaljiNiz('ACTO');
Bt:=Port[IC8259];
Bt:=Bt or $10;
Port[IC8259]:=Bt;

Bt:=Port[lcr];
bt:=bt and #7F;

Port[lcr]:=bt;
Port[ier]:=0;
Port[mcr]:=0;

Port[$20]:=$20;

SetIntVec($0C,Vektor);

Intr($21,Registri);
end;


function Poziv(broj:string):boolean;
var st:string;
begin
st:='ATDT'+broj;
SaljiNiz(st);
delay(400);
if DosaoSignal then Poziv:=true
else begin
    writeln('Neuspjesan poziv!');
    SaljiNiz('ATCO');
    Poziv:=false;
    end;
end;

procedure PostaviModem;
begin
SaljiNiz('ATCO');
Delay(1000);
SaljiNiz('ATZ');
Delay(1000);
Saljiniz('ATF1');
Delay(1000);
SaljiNiz('ATEO');
Delay(1000);
SaljiNiz('ATV1');
Delay(1000);
Saljiniz('ATQO');
Delay(1000);
end;


procedure komunikacija;
var zu,zv:char;
begin
cistispremnik;

repeat
if(zn_u_spre>0) then
  begin
  zu:=UzmiZnak;
  if ZU in [#32..#127] then
  begin
  write(ZU)
  else
  if (zu=cr) then writeln;
  end;

if KeyPressed then
begin
zv:=readkey;
if (zv<>ESC) then
  begin
  SaljiZnak(ord(ZV));
  if zr=cr then writeln
   else writeln(zv);
  end;
end;
until zv=ESC;
end;

begin
clrscr;
Parametri;
SetSer14H;

PostaviPrek;
PostaviModem;

if Poziv(Modem.Telefon) then
   Komunikacija;

SaljiNiz('ATZ');
Delay(1000);
ResetPrek;

end.




Hm..nadam se da znate da se ovaj kod moze iskoristit kao expolit, za ************ modema [pogodite sami zasto]..
Nadam se da likovi koji su pljuvali po Pascalu lagano mijenjaju misljenje..
U iducem postu ocekujete nove primjere za modem, primjere za zvucnike i ostale hardwareske komponente..
Takodjer cete dobiti detaljne upute za rad sa XMS funkcijama!
A do tada uzivajte ubijajuci se u kodu


***MODEM***

[Ovu poruku je menjao Passwd dana 19.11.2005. u 18:08 GMT+1]

[Ovu poruku je menjao Passwd dana 19.11.2005. u 18:09 GMT+1]
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: [Tutorijal] Sistemsko Programiranje!02.12.2005. u 08:39 - pre 224 meseci
Odlican text... nemoj sad da stajes Oni koji koriste pascal ce sigurno koristiti neke od ovih funkcija. Ostalo je jos dosta da se pise... rad sa tastaturom (cuveno paljenje i kasenje led lampica koje svi vole ), rad sa extended memorijim, rad sa super vga modovima u grafici, graficki prikaz misa, menjanje oblika kursora, rad sa zvukom... i jos svasta
Jos jednom, bas dobar text
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: [Tutorijal] Sistemsko Programiranje!

[ Pregleda: 2513 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.