UNIT global; {$project vt}
{ globale Variablen und Typdeklarationen zum Programm VideoText }

INTERFACE;

CONST anzsubpage = 15;
      qlen = 15;      { max. Anzahl wartender Seitenaufträge }
      maxactive = 4;  { max. Anzahl gleichzeitig suchbarer Seiten im SAA 5246 }

TYPE p_onepage = ^onepage;
     onepage = RECORD
                 next,prev: p_onepage;
                 pg,sp: Integer;
                 chars: ARRAY [0..959] OF Byte;
                 cbits: Word;
               END;
     str80 = String[80];
     bigstring = String[256];
     zeiteintrag = RECORD tage,min,tics: Long; END;

VAR root,thispage: p_onepage;
    queue: ARRAY [1..qlen] OF RECORD
             pg,sp: Integer;
           END;
    queued: Integer;
    activejobs: ARRAY [0..maxactive-1] OF RECORD
        pg,sp: Integer;
        sp_count,sp_max,akt_sp: Integer;
        sp_check: ARRAY [0..anzsubpage] OF Boolean;
        lastaction: zeiteintrag;     { so 'ne Art DateStamp }
        wartezeit: Integer;
        holen,erledigt: Boolean;
        ist_UT: Byte;  { Bits für aging-Verfahren }
      END;
    thisjob: Integer; { zeigt auf einen wartenden (>0) oder aktiven Job (<0) }
    aktspeicher: Integer;   { der Speicher, in dem die VT-Uhr läuft }
    maxwait, burst,shuffle, busdelay: Integer;
    outputname: str80;
    AsciiRawIff: Integer;
    overwrite,protokoll: Boolean;
    stop: Boolean;
    lastkey: Char;

PROCEDURE add_time(delta: zeiteintrag; VAR zeit: zeiteintrag);
PROCEDURE sub_time(delta: zeiteintrag; VAR zeit: zeiteintrag);
FUNCTION diff_time(alt, neu: zeiteintrag): Long;

{ ---------------------------------------------------------------------- }

IMPLEMENTATION;

{ Rechnen mit Zeiteinträgen }

PROCEDURE add_time{(delta: zeiteintrag; VAR zeit: zeiteintrag)};
BEGIN
  IF zeit.tics + delta.tics>=3000 THEN Inc(zeit.min);
  zeit.tics := (zeit.tics + delta.tics) MOD 3000;
  IF zeit.min + delta.min>=1440 THEN Inc(zeit.tage);
  zeit.min := (zeit.min + delta.min) MOD 1440;
  zeit.tage := zeit.tage + delta.tage;
END;

PROCEDURE sub_time{(delta: zeiteintrag; VAR zeit: zeiteintrag)};
BEGIN
  IF zeit.tics - delta.tics<0 THEN Dec(zeit.min);
  zeit.tics := (zeit.tics - delta.tics + 3000) MOD 3000;
  IF zeit.min - delta.min<0 THEN Dec(zeit.tage);
  zeit.min := (zeit.min - delta.min + 1440) MOD 1440;
  zeit.tage := zeit.tage - delta.tage;
END;

FUNCTION diff_time{(alt, neu: zeiteintrag): Long};
{ liefert die Differenz zwischen zwei Zeitpunkten in Ticks (1/50-Sekunden) }
BEGIN
  diff_time := neu.tics - alt.tics + 3000 * ( (neu.min - alt.min)
               + 1440 * (neu.tage - alt.tage) );
END;

BEGIN  { Initialisierungen }
  thispage := Nil; root := Nil;
  aktspeicher := 0; thisjob := aktspeicher;
  overwrite := True; AsciiRawIff := 1; protokoll := False;
END.
