home *** CD-ROM | disk | FTP | other *** search
- { toto je pro tiskárnu, men¿í ⌐ádkování (30)}
- unit unfront;
-
- interface uses unhejb;
- const
- __pracuje_se = $01; { pracueje se s prvky seznamu ( za⌐azuje nebo vy⌐azuje ) }
- __na_int = $02; { fronta sedi na interruptu }
- __maka = $04; { probiha makej - fronta se zpracovava }
- __volat_puvodni = $08; { bude se volat puvodni rutina }
-
- type
- pom_uk_fronta = ^typ_co_se_hejbe;
- typ_co_se_hejbe = record
- pohyb : ptr_typ_hejbaci;
- dalsi : pom_uk_fronta;
- predchozi : pom_uk_fronta;
- end;
-
-
- typ_hejb_fronta = object
- constructor init;
- destructor zrus;
-
- function hejbe_se : boolean;
- { zjistí, zda se nêjakÿ objekt hÿbe }
- procedure makej;
- { posune v¿echny objekty, které se mají hÿbat po cestê o 1 krok }
-
- procedure set_pomalost( _pomalost : word);
- procedure zarad_prvek(var kterej : typ_hejbaci_zaklad);
- procedure stop_vsechny;
- procedure __vyhod_prvek(kterej : pom_uk_fronta);
- { zastaví v¿echny objekty na jejich dráze }
- procedure rozbeh_vsechny;
- { rozebêhne v¿echny objekty na dané dráze }
- procedure dodelej_pohyb;
- { dokonçí pohyb v¿ech prvkû v seznamu }
- { if makat -> opakuje proceduru makej }
- procedure dodelej_pohyb_na_pocet(kolik : word);
- function pocet : word;
- procedure vypis;
- private
- seznam : pom_uk_fronta;
- __stav : byte;
- pomalost : word;
- end;
-
- typ_hejb_fronta_intr = object(typ_hejb_fronta)
- constructor init(ktere_intr : byte; volat_puvodni : boolean);
- destructor zrus;
-
- procedure on;
- procedure off;
- function je_intr : boolean;
- procedure makej;
-
- private
- num_intr : byte;
- stare_intr : pointer;
- nove_intr : pointer;
- procedure _makej;
-
- end;
-
- const
- _stand_pomalost : word = 50;
- procedure set_pomalost( _pomalost : word);
-
- implementation
- uses crt, dos;
- type
- typ_pole_bytu = array[0..65534]of byte;
-
- procedure set_pomalost( _pomalost : word);
- begin
- _stand_pomalost := _pomalost;
- end;
-
- procedure typ_hejb_fronta.zarad_prvek(var kterej : typ_hejbaci_zaklad);
- var x : pom_uk_fronta;
- begin
- new(x); {zarazeni objektu do seznamu aktivnich}
- x^.pohyb := @kterej;
- if seznam <> nil then
- begin
- x^.dalsi := seznam;
- x^.predchozi := seznam^.predchozi;
- seznam^.predchozi^.dalsi := x;
- seznam^.predchozi := x;
- end
- else
- begin
- x^.dalsi := x;
- x^.predchozi := x;
- seznam := x;
- end;
- end;
-
- procedure typ_hejb_fronta.__vyhod_prvek(kterej : pom_uk_fronta);
- begin
- if kterej = seznam then {ru¿í se první prvek}
- if kterej = kterej^.dalsi
- then seznam := nil {v seznamu byl jen jeden prvek}
- else seznam := seznam^.dalsi; {v seznamu bylo vic prvku}
- __stav := __stav or __pracuje_se;
- kterej^.predchozi^.dalsi := kterej^.dalsi;
- kterej^.dalsi^.predchozi := kterej^.predchozi;
- __stav := __stav and not __pracuje_se;
- dispose(kterej);
- end;
-
- procedure typ_hejb_fronta.makej;
- { projede seznam vsech objektu, ktere se maji hybat (hejbobj)}
- { a se vsemi objekty provede 1 krok}
- var obj, objpuv, objdalsi, posledni : pom_uk_fronta;
- pom_co : ptr_typ_hejbaci;
- begin
- __stav := __stav or __maka;
- { gotoxy(40,1); write( 'avail: ', memavail, ' ');}
- if (seznam <> nil) and ((__stav and __pracuje_se) = 0) then
- begin
- posledni := seznam^.predchozi;
- objpuv := seznam^.predchozi;
- objdalsi := seznam;
- repeat
- obj := objdalsi;
- pom_co := obj^.pohyb;
- pom_co^.stav := pom_co^.stav or __zpracovava_se;
-
- objdalsi := obj^.dalsi;
- if pom_co^.krok = 255
- then __vyhod_prvek(obj);
- pom_co^.stav := pom_co^.stav and (not __zpracovava_se);
- until obj = posledni;
- end;
- __stav := __stav and not __maka;
- end;
-
- procedure typ_hejb_fronta.set_pomalost( _pomalost : word);
- begin
- pomalost := _pomalost;
- end;
-
- procedure typ_hejb_fronta.dodelej_pohyb;
- begin
- while hejbe_se do
- begin
- makej;
- delay(pomalost);
- end;
- end;
-
- procedure typ_hejb_fronta.dodelej_pohyb_na_pocet(kolik : word);
- begin
- while pocet <> kolik do
- begin
- makej;
- delay(pomalost);
- end;
- end;
-
- function typ_hejb_fronta.hejbe_se : boolean;
- begin
- hejbe_se := seznam <> nil
- end;
- { ************************************************************************* }
- { ************************************************************************* }
-
- const pocinstr = 43;
- constructor typ_hejb_fronta_intr.init(ktere_intr : byte; volat_puvodni : boolean);
- type typstroj = array[0..pocinstr-1]of byte;
- const strojak : typstroj = ($50, $53, $51, $52, $56, $57, $1e, $06, $55, {push}
- $89, $e5, {mov bp, sp}
- $b8, $99, $99, {mov ax, dseg 12}
- $8e, $d8, {mov ds, ax}
- $bf, $99, $99, {mov di, segself 17}
- $57, {push di}
- $bf, $99, $99, {mov di, ofsself 21}
- $57, {push di}
- $9a, $99, $99, $99, $99,{call far makej 25}
- $c9, {leave}
- $07, $1f, $5f, $5e, $5a, $59, $5b, $58,{pop}
- $ea, 99, 99, 99, 99 {jmp far stare_intr 39}
- { $cf {iret});
- var i : integer;
- makej_ptr : pointer;
-
- begin
- typ_hejb_fronta.init;
- num_intr := ktere_intr;
-
- makej_ptr := @typ_hejb_fronta_intr._makej;
-
- getmem(nove_intr, pocinstr);
- for i := 0 to pocinstr-1 do
- typ_pole_bytu(nove_intr^)[i] := strojak[i];
-
- asm
- les di, self
- les di, es:[di].nove_intr
- mov ax, seg @data
- mov es:[di+12], ax
- mov ax, word ptr self+2
- mov es:[di+17], ax
- mov ax, word ptr self
- mov es:[di+21], ax
-
- mov ax, word ptr makej_ptr
- mov es:[di+25], ax
- mov ax, word ptr makej_ptr+2
- mov es:[di+27], ax
- end;
- if volat_puvodni
- then __stav := __stav or (__volat_puvodni)
- else __stav := __stav and (not __volat_puvodni)
- end;
-
- procedure typ_hejb_fronta_intr.on;
- var stare : pointer;
- begin
- { zapni_timer;}
- if (__stav and __na_int) = 0 then
- begin
- getintvec(num_intr, stare_intr);
- stare := stare_intr;
- if (__stav and __volat_puvodni) <> 0 then
- asm { stara rutina se bude volat, zapsat jeji adresu za jmp far }
- les di, self
- les di, es:[di].nove_intr
-
- mov ax, word ptr stare;
- mov es:[di+39], ax
- mov ax, word ptr stare+2
- mov es:[di+41], ax
- end
- else asm { nebude se volat stara rutina, zapise se rti místo jmp far }
- les di, self
- les di, es:[di].nove_intr
-
- mov byte ptr es:[di+38], $cf {rti}
- end;
-
-
- __stav := __stav or __na_int;
- setintvec(num_intr, nove_intr);
- end;
- end;
-
- destructor typ_hejb_fronta_intr.zrus;
- begin
- freemem(nove_intr, pocinstr);
- off;
- end;
-
- procedure typ_hejb_fronta_intr.makej;
- begin
- if (__stav and __na_int) <> 0
- then asm int num_intr end
- else typ_hejb_fronta.makej;
- end;
-
- procedure typ_hejb_fronta_intr._makej;
- begin
- if ((__stav and __maka) = 0) and
- ((__stav and __pracuje_se) = 0) then
- begin
- __stav := __stav or __maka;
- typ_hejb_fronta.makej;
- __stav := __stav and (not __maka)
- end
- { else begin gotoxy(1,1); writeln('znova'); end;}
- end;
-
-
-
- procedure typ_hejb_fronta_intr.off;
- begin
- if (__stav and __na_int) <> 0 then
- begin
- setintvec(num_intr, stare_intr);
- __stav := __stav and (not __na_int);
- end;
- end;
-
- function typ_hejb_fronta_intr.je_intr : boolean;
- begin
- je_intr := (__stav and __na_int) <> 0
- end;
-
- constructor typ_hejb_fronta.init;
- begin
- pomalost := _stand_pomalost;
- __stav := 0;
- seznam := nil;
- end;
-
- destructor typ_hejb_fronta.zrus;
- begin
- end;
-
- procedure typ_hejb_fronta.stop_vsechny;
- var obj : pom_uk_fronta;
- begin
- obj := seznam;
- if obj <> nil then
- repeat
- obj^.pohyb^.stav := (not __pohyb ) and obj^.pohyb^.stav;
- obj := obj^.dalsi
- until obj = seznam;
- end;
-
- procedure typ_hejb_fronta.rozbeh_vsechny;
- var obj : pom_uk_fronta;
- begin
- obj := seznam;
- if obj <> nil then
- repeat
- obj^.pohyb^.stav := obj^.pohyb^.stav or __pohyb;
- obj := obj^.dalsi
- until obj = seznam;
- end;
-
- function typ_hejb_fronta.pocet : word;
- var obj : pom_uk_fronta;
- pompoc : word;
- begin
- obj := seznam;
- pompoc := 0;
- if obj <> nil then
- repeat
- inc(pompoc);
- obj := obj^.dalsi
- until obj = seznam;
- pocet := pompoc;
- end;
-
- procedure typ_hejb_fronta.vypis;
- var obj : pom_uk_fronta;
- begin
- obj := seznam;
- gotoxy(1,1);
- if obj <> nil then
- repeat
- writeln(seg(obj^):4,':',ofs(obj^):4);
- obj := obj^.dalsi
- until obj = seznam;
- end;
-
-
- end.
-