[ Passwd @ 19.11.2005. 14:57 ] @
(*********(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 ![]() 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] |