Xpacket/XPLIB.PAS

2108 lines
47 KiB
Plaintext
Raw Permalink Normal View History

2019-05-15 00:31:19 +02:00
{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
<20> <20>
<20> X - P a c k e t <20>
<20> <20>
<20> <20>
<20> X P L I B . P A S Bestandteil der XPACT1.PAS <20>
<20> <20>
<20> Library - Unit mit oft ben<65>tigten Routinen <20>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}
Function Channel_ID (* Kanal : Byte) : Str5 *);
Var Bstr : String[5];
Begin
Bstr := TNC[K[Kanal]^.TncNummer]^.Ident;
if length(Bstr) > 0 then Bstr := Bstr + B1;
Channel_ID := Bstr;
End;
Procedure Warten;
Var KC : Sondertaste;
VC : Char;
Begin
Repeat Until _Keypressed;
_ReadKey(KC,VC);
End;
Procedure Triller;
Var i : Byte;
Begin
for i := 1 to 6 do
begin
Beep(600,50);
Beep(800,50);
end;
End;
PROCEDURE Warte (HdstlSec : WORD);
VAR wi : INTEGER;
wstd1, wmin1, wsec1, wsec1001 : Word;
wstd2, wmin2, wsec2, wsec1002 : Word;
wrsec, wrstd, wrmin, wrsec100 : word;
BEGIN
GETTIME (wstd1, wmin1, wsec1, wsec1001);
wrsec100 := 0;
wi := 0;
WHILE wrsec100 < HdstlSec DO
BEGIN
wi := wi + 1;
GETTIME (wstd2, wmin2, wsec2, wsec1002);
wrstd := wstd2 - wstd1;
wmin2 := wmin2 + (wrstd * 60);
wrmin := wmin2 - wmin1;
wsec2 := wsec2 + (wrmin * 60);
wrsec := wsec2 - wsec1;
wsec1002 := wsec1002 + (wrsec * 100);
wrsec100 := wsec1002 - wsec1001;
END;
END;
(*
Procedure Bimmel;
Const
Ton : array[1..8] of integer =
(670,530,595,400,400,595,670,530);
PauseT : array[1..8] of byte =
(40, 40, 40, 60, 40, 40, 40, 60);
PauseN : array[1..8] of byte =
(0, 0, 0, 60, 0, 0, 0, 0);
Var i : Byte;
kc: sondertaste;
vc:char;
Begin
I:=0;
while (i<8) and (not keypressed) do
begin
inc(i);
Sound_(Ton[i], PauseT[i]); Warte(PauseN[i]);
end;
if keypressed then _ReadKey(KC,VC);
End;
*)
Procedure Bimmel(kan:byte);
type
BimmelTon = Record
Ton, Lange : Word;
end;
Const BT2: array[0..8] of bimmelton =
((Ton:670; Lange:40), (Ton:530; Lange:40), (Ton:595; Lange:40),
(Ton:400; Lange:60), (Ton:0; Lange:60),
(Ton:400; Lange:40), (Ton:595; Lange:40), (Ton:670; lange:40),
(Ton:530; lange:60));
var BT: array[0..255] of bimmelton;
f: text;
s:string;
j,i:byte;
rem:boolean;
kc: sondertaste;
vc:char;
fst:file;
Begin
s:='';
s:=int_str(kan);
rem:=false;
{$IFDEF Sound}
if Konfig.WavOut then
begin
s:='RING'+s;
rem:=exists(Konfig.SpkVerz+s+'.wav');
if rem then WavStream:=WavStream+#2+EFillStr(8,B1,s)
else
begin
s:='RING';
rem:=exists(Konfig.SpkVerz+s+'.wav');
if rem then WavStream:=WavStream+#2+EFillStr(8,B1,s);
end;
end;
if Konfig.MidiOut then
begin
rem:=playmidi(konfig.spkverz+'RING'+s+'.MID');
if not rem then rem:=playmidi(konfig.spkverz+'RING.MID');
end;
{$ENDIF}
s:='';
if not rem then begin
fillchar(bt,sizeof(bt),0);
{$I-}
assign(f,Sys1Pfad+'RING.XP');
reset(f);
j:=0;
if ioresult=0 then
begin
while not eof(F) do
begin
Rem:=false;
readln(f, s);
if S[1]<>';' then
begin
BT[j].Ton := str_int(copy (s,1,pos(',',s)-1));
delete (s,1,pos(',',s));
BT[j].Lange := str_int(s);
inc(j);
end;
end;
close(F);
if ioresult=0 then i:=0;
end else for i:=0 to 8 do BT[i]:=BT2[i];
{$I+}
i:=0;
Repeat
if (BT[i].Lange>0) then
begin
if (BT[i].Ton)>0 then Sound_(BT[i].Ton,BT[i].Lange)
else warte(BT[i].Lange);
end else i:=254;
inc(i);
until (keypressed) or (i=255);
{ Folgende Zeile entfernt, damit beim Abbrechen von //ring und //bell kein
Tastendruck mehr verschluckt wird! //db1ras }
{ if keypressed then _ReadKey(KC,VC); }
end;
End;
Procedure StopWave_;
begin
{$IFDEF Sound}
if not Playing then
begin
if SoundBuffer<>NIL then StopWave;
WavFileOpen:=False;
end;
{$ENDIF}
end;
Procedure SprachWav;
var i:byte;
wavs:string;
begin
{$IFDEF Sound}
{Strip(Zeile);
for i:=1 to length(Zeile) do
begin}
wavs:='';
if playing then wavfileopen:=true;
if not playing then
begin
StopWAVE;
wavs:=Konfig.Spkverz+WavStream[1];
if WavStream[1]=#10 then Wavs:=Konfig.Spkverz+'10';
if WavStream[1]=#11 then Wavs:=Konfig.Spkverz+'11';
if WavStream[1]=#12 then Wavs:=Konfig.Spkverz+'12';
if WavStream[1]=#13 then Wavs:=Konfig.Spkverz+'13';
if WavStream[1]=#14 then Wavs:=Konfig.Spkverz+'14';
if WavStream[1]=#15 then Wavs:=Konfig.Spkverz+'15';
if wavstream[1]=#1 then {Connect-Bimmel}
begin
wavs:=Copy(WavStream,2,8);
KillEndBlanks(wavs);
delete(WavStream, 2,8);
wavs:=Konfig.SpkVerz+wavs;
end;
if wavstream[1]=#2 then {Disconnect}
begin
wavs:=Copy(WavStream,2,8);
KillEndBlanks(wavs);
delete(WavStream, 2,8);
wavs:=Konfig.SpkVerz+wavs;
end;
if wavstream[1]=#3 then {Reconnect}
begin
wavs:=Copy(WavStream,2,8);
KillEndBlanks(wavs);
delete(WavStream, 2,8);
wavs:=Konfig.SpkVerz+wavs;
end;
if wavstream[1]=#4 then {Bimmel}
begin
wavs:=Copy(WavStream,2,8);
KillEndBlanks(wavs);
delete(WavStream, 2,8);
wavs:=Konfig.SpkVerz+wavs;
end;
if wavstream[1]=#5 then {Weitercon-Bimmel}
begin
wavs:=Copy(WavStream,2,8);
KillEndBlanks(wavs);
delete(WavStream, 2,8);
wavs:=Konfig.SpkVerz+wavs;
end;
playwave(wavs +'.wav');
delete(wavstream, 1,1);
end;
{repeat until not Playing;
end;}
{$ENDIF}
end;
Procedure C_Bell;
type
BimmelTon = Record
Ton, Lange : Word;
end;
Const BT2: array[0..8] of bimmelton =
((Ton:1400; Lange:5), (Ton:1000; Lange:5), (Ton:1800; Lange:5),
(Ton:1400; Lange:5), (Ton:1000; Lange:5), (Ton:1800; Lange:5),
(Ton:1400; Lange:5), (Ton:1000; Lange:5), (Ton:1800; Lange:5));
var BT: array[0..255] of bimmelton;
f: text;
s:string;
j,i:byte;
rem:boolean;
kc: sondertaste;
vc:char;
fst:file;
Begin
s:=call;
strip(s);
rem:=false;
{$IFDEF Sound}
if Konfig.WavOut then
begin
rem:=exists(konfig.spkverz + s+'.WAV');
if rem then WavStream:=WavStream+#1+EFillStr(8,B1,s)
else
begin
s:='';
s:=int_str(kan);
s:='CBELL'+s;
rem:=exists(konfig.spkverz + s + '.WAV');
if rem then WavStream:=WavStream+#1+EFillStr(8,B1,s)
else
begin
s:='CBELL';
rem:=exists(konfig.spkverz+s+'.wav');
if rem then WavStream:=WavStream+#1+EFillStr(8,B1,s)
end;
end;
end;
If Konfig.MidiOut then
begin;
s:=call;
strip(s);
rem:=playmidi(konfig.spkverz+s+'.MID');
s:='';
s:=int_str(kan);
if not rem then rem:=playmidi(konfig.spkverz+'CBELL'+s+'.MID');
if not rem then rem:=playmidi(konfig.spkverz+'CBELL.MID');
end;
{$ENDIF}
if not rem then
begin
s:=call;
strip(s);
fillchar(bt,sizeof(bt),0);
{$I-}
assign(f,Sys1Pfad+s+'.CBL');
reset(f);
j:=0;
if ioresult=0 then
begin
while not eof(F) do
begin
Rem:=false;
readln(f, s);
if S[1]<>';' then
begin
BT[j].Ton := str_int(copy (s,1,pos(',',s)-1));
delete (s,1,pos(',',s));
BT[j].Lange := str_int(s);
inc(j);
end;
end;
close(F);
if ioresult=0 then i:=0;
end else for i:=0 to 8 do BT[i]:=BT2[i];
{$I+}
i:=0;
Repeat
if (BT[i].Lange>0) then
begin
if (BT[i].Ton)>0 then Sound_(BT[i].Ton,BT[i].Lange)
else warte(BT[i].Lange);
end else i:=254;
inc(i);
until (i=255);
{ Folgende Zeile entfernt, damit beim Connect kein Tastendruck mehr
verschluckt wird! //db1ras }
{ if keypressed then _ReadKey(KC,VC); }
end;
End;
(*
Var i : Byte;
Begin
if (Klingel) then
begin
for i := 1 to 3 do
begin
sound_(1400,5);
sound_(1000,5);
sound_(1800,5);
end;
end;
End;
*)
Procedure D_Bell; (* Klingel beim Disconnect *)
var rem:boolean;
var s:string[5];
Begin
s:='';
s:=int_str(kan);
rem:=false;
{$IFDEF Sound}
if Konfig.WavOut then
begin
s:='dbell'+s;
rem:=exists(Konfig.SpkVerz+s+'.wav');
if rem then WavStream:=WavStream+#2+EFillStr(8,B1,s)
else
begin
s:='DBELL';
rem:=exists(Konfig.SpkVerz+s+'.wav');
if rem then WavStream:=WavStream+#2+EFillStr(8,B1,s);
end;
end;
if Konfig.MidiOut then
begin
rem:=playmidi(konfig.spkverz+'DBELL'+s+'.MID');
if not rem then rem:=playmidi(konfig.spkverz+'DBELL.MID');
end;
{$ENDIF}
if not rem then
begin
sound_(1800,5); warte(5);
sound_(1400,5); warte(5);
sound_(1000,5); warte(5);
end;
End;
Procedure Daten_Bell;
Begin
sound_(1800,5);
sound_(1400,5);
sound_(1800,5);
End;
Function Datum (* : Str11 *);
Var Tag,
WoTag,
Monat,
Jahr : Word;
TagStr,
WoTagStr,
MonatStr,
JahrStr : String[2];
Dummy : String[8];
Begin
Dummy := Uhrzeit;
TagStr := SFillStr(2,'0',int_str(Tag_));
MonatStr := SFillStr(2,'0',int_str(Monat_));
JahrStr := copy(int_str(Jahr_),3,2);
WochenTag := ParmStr(WoTag_+1,B1,WeekDayStr);
WotagStr := copy(WochenTag,1,2);
Datum := WotagStr + B1 + TagStr + Pkt + MonatStr + Pkt + JahrStr;
End;
Procedure GetTime_ (* (Hr, Mn, Sk, Sk100 : Word) *) ;
var Flag:Boolean;
begin
if RTC then
begin
Repeat
Port[$70] := 10;
Until Port[$71] and $80 = 0;
Port[$70] := 11;
Flag := (Port[$71] and 4) = 0;
Port[$70] := 0; Sk := Port[$71];
Port[$70] := 2; Mn := Port[$71];
Port[$70] := 4; Hr := Port[$71];
if Flag then
begin
Sk := (Sk shr 4) * 10 + Sk and 15;
Mn := (Mn shr 4) * 10 + Mn and 15;
Hr := (Hr shr 4) * 10 + Hr and 15;
end;
end else GetTime(Hr,Mn,Sk,Sk100);
end;
Function Uhrzeit (* : Str8 *);
Var
Sek100,
UtcStd : Word;
Flag : Boolean;
Hstr : String[8];
LTCheck : Longint;
Begin
GetTime_(Stunde,Minute,Sekunde,Sek100);
{$IFNDEF no_Netrom} {//db1ras}
if (Konfig.MaxNodes>0) and (minute<>lminute) then
begin
lminute:=minute;
LTCheck := PackDT;
if ((LTCheck-LastLTCheck)>=150) and (not InNodeListe) then {alle 5 minuten pr<70>fen}
begin
LastLTCheck:=LTCheck;
NodesLifeTime;
end;
end;
{$ENDIF}
UtcStd := Stunde;
UtcStd := UtcStd + 24 + ZeitDiff;
While UtcStd > 23 do UtcStd := UtcStd - 24;
Hstr := SFillStr(2,'0',int_str(Stunde)) + DP +
SFillStr(2,'0',int_str(Minute)) + DP +
SFillStr(2,'0',int_str(Sekunde)) + DP;
UtcZeit := SFillStr(2,'0',int_str(UtcStd)) + copy(Hstr,3,6);
Uhrzeit := Hstr;
End;
Function GetCursorSize : Integer; (* Liefert Cursorgroesse (aus PCT von DD6CV) *)
Var r : Registers;
Begin
r.AH := $03;
intr($10,r);
GetCursorSize := r.CX;
End;
Procedure SetCursorSize(Size : Integer); (* Setzt Cursorgroesse (aus PCT von DD6CV) *)
Var r : Registers;
Begin
r.AH := $01;
r.CX := Size;
intr($10,r);
End;
Procedure Cursor_aus; (* Schaltet Cursor aus. (aus PCT von DD6CV) *)
Const CursorOffBit = 8192;
Begin
SetCursorSize(GetCursorSize or CursorOffBit);
Cursor_On := false;
End;
Procedure Cursor_ein; (* Schaltet Cursor ein. (aus PCT von DD6CV) *)
Const CursorOnMask = -8193;
Begin
SetCursorSize(GetCursorSize and CursorOnMask);
Cursor_On := true;
End;
Procedure Beep (* Ton,Laenge : Word*);
Begin
if Laenge > 0 then
begin
Sound_(Ton,Laenge div 14);
end;
End;
Procedure Fenster (* H:Byte *);
Var i,x,y : Byte;
Attr : Byte;
Begin
Attr := Attrib[3];
x := 1;
Teil_Bild_Loesch(7,h,Attr);
x := 40-(length(G^.Fstr[7]) DIV 2);
WriteRam(2,6,Attr,1,ConstStr('<27>',78));
WriteRam(2,h+1,Attr,1,ConstStr('<27>',78));
WriteRam(1,6,Attr,1,'<27>'); WriteRam(80,6,Attr,1,'<27>');
WriteRam(1,h+1,Attr,1,'<27>'); WriteRam(80,h+1,Attr,1,'<27>');
for i:=7 to h do
begin
if i<> 8 then
begin
WriteRam(1,i,Attr,1,'<27>');
WriteRam(80,i,Attr,1,'<27>');
end
else
begin
WriteRam(1,i,Attr,1,'<27>'); {'<27>');}
WriteRam(80,i,Attr,1,'<27>'); {'<27>');}
end;
end;
WriteRam(x,7,Attr,1,G^.Fstr[7]);
WriteRam(2,8,Attr,1,ConstStr('<27>',78)); {<7B>}
for i := 9 to 20 do WriteRam(G^.Fstx[i],i,Attr,1,G^.Fstr[i]);
End;
Procedure clrFenster;
Var i : Byte;
Begin
for i := 7 to 20 do G^.Fstr[i] := '';
for i := 7 to 20 do G^.Fstx[i] := 2;
End;
Procedure Status2;
Var AByte,
Beg,
Ende,
C,i,
Z,UT : Byte;
ch : Char;
Hstr : String[80];
Xstr : String[6];
Flag : Boolean;
Begin
if not OnlHelp then
begin
i := 0;
Repeat
Flag := not (i in [Portstufe+1..Portstufe+10]) and K[i]^.connected;
inc (i);
Until (i > maxLink) or Flag;
if Flag then ch := '*'
else ch := B1;
Hstr := ch;
Beg := PortStufe + 1;
Ende := Beg + 9;
if Ende > maxLink then Ende := maxLink;
for C := Beg to Ende do with K[C]^ do
begin
if (connected) then
begin
Xstr := Call;
Strip(Xstr);
end else
if Test then Xstr := 'T (' + int_str(TestMerk) + ')' else
begin
Xstr := ' '; {#7+#7;}
if c<10 then Xstr:=xstr+' ';
xstr:=xstr+int_str(C)+' '; {#7+#7};
end;
if Mo.MonActive then
begin
Xstr := CutStr(Mo.MonStr[1]);
strip(Xstr);
end;
if (C > 0) and (C = ConvHilfsPort) then Xstr := 'SYSOP';
Xstr := EFillStr(6,B1,Xstr);
Hstr := Hstr + KStatTr;
Hstr := Hstr + Xstr;
end;
Hstr := Hstr + KStatTr;
Hstr := EFillStr(80,B1,Hstr);
UT := K[show]^.UnStat;
WriteRam(1,UT,Attrib[15],1,Hstr);
if show = 0 then i := Unproto
else i := K[show]^.TncNummer;
WriteRam(73,UT,Attrib[30],1,SFillStr(8,B1,TNC[i]^.QRG_Akt));
Z := 0;
for C := Beg to Ende do
begin
inc(Z);
with K[C]^ do
begin
if (show = C)
then AByte := Attrib[17]
else if (NochNichtGelesen) then AByte := Attrib[8]
else if Mo.MonActive then AByte := Attrib[25]
else if connected then AByte := Attrib[16]
else AByte := Attrib[15];
WriteAttr((Z*6)+Z-4,UT,6,AByte,1);
end;
end;
if maxLink > 10 then for C := 1 to maxLink do with K[C]^ do
begin
if NochNichtGelesen and not (C in [(Portstufe+1)..(Portstufe+10)]) then
begin
Hstr := EFillStr(6,B1,'CH:' + int_str(C));
Z := C mod 10;
if Z = 0 then Z := 10;
i := show mod 10;
if i = 0 then i := 10;
if Z <> i then AByte := Attrib[8]
else AByte := Attrib[17];
WriteRam((Z*6)+Z-4,UT,AByte,1,Hstr);
end;
end;
end; {if not OnlHelp ... }
End;
Procedure Alarm;
Begin
if Klingel then Beep(G^.Alarm_Freq,G^.Alarm_Time);
End;
Procedure StatusOut (* Kanal,x,Nr,Attr : Byte ; Zeile : string ; StZ : Byte *);
Var N,Nx,i,Soz : Byte;
FlagZeil : String;
Begin
if Not OnlHelp then
begin
with K[Kanal]^ do
begin
N := (((NrStat[Nr]-1) * 40) + (2 * x) - 1);
Nx := (NrStat[Nr]-1) * 40 + 1;
if stz=1 then
begin
for i := 1 to ord(Zeile[0]) do
begin
StatZeile[N] := Zeile[i];
inc(N);
StatZeile[N] := chr(Attr);
inc(N);
end;
end;
if stz=2 then
begin
for i := 1 to ord(Zeile[0]) do
begin
FlagZeile[N] := Zeile[i];
inc(N);
FlagZeile[N] := chr(Attr);
inc(N);
end;
end;
if stz=3 then
begin
for i := 1 to ord(Zeile[0]) do
begin
FlagZeile2[N] := Zeile[i];
inc(N);
FlagZeile2[N] := chr(Attr);
inc(N);
end;
end;
if not ScreenSTBY then
begin
if (Kanal = show) and not DirScroll then
begin
if not Backscroll(show) { and (nr <>1)}
then
begin
move(StatZeile,Bild^[(ObStat-1)*160+1],160);
move(FlagZeile,Bild^[(ObStat)*160+1],160);
move(FlagZeile2,Bild^[(ObStat+1)*160+1],160);
end;
end;
end;
end;
end; {if not onlhelp ...}
End;
Procedure NodeConnect (* Kanal : Byte; Zeile : Str80 *);
Var i : Byte;
Bstr,
Hstr : String[80];
Begin
with K[Kanal]^ do
begin
Hstr := Zeile;
if length(Zeile) > 1 then NodeCmd := false;
Zeile := CutStr(Zeile);
if Zeile > '' then
begin
Bstr := InfoZeile(216);
while (Bstr > '') and not NodeCmd do
begin
if pos(Zeile,CutStr(Bstr)) = 1 then NodeCmd := true
else Bstr := RestStr(Bstr);
end;
if NodeCmd then ConnectMerk := Hstr;
end;
end;
End;
Function Exists (* name : Str80) : Boolean *);
Var Datei : Text;
ExFlagi : Boolean;
dummio : byte;
Begin
ExFlagi:=false;
if Name > '' then
begin
{$I-}
Assign(Datei,name);
Reset(Datei);
if IOResult = 0 then
begin
Exflagi:= true;
end else Exflagi:= false;
close(Datei);
dummio:=ioresult;
{$I+}
end else Exflagi:= false;
Exists:=ExFlagi;
End;
Procedure Teil_Bild_Loesch (* y,y1,Attr : Byte *); (* Zeilen von y bis y1 l<>schen *)
Begin
if not ScreenSTBY then
Asm les di, Bild
mov al, y
dec al
mov ah, 160
mul ah
add di, ax
mov al, y1
mov ah, 160
mul ah
sub ax, di
mov cx, ax
mov al, 32
mov ah, Attr { Attribut laden }
shr cx, 1
@Again:
mov [es:di], ax { Zeichen mit Attr <20>bertragen }
add di, 2
Loop @Again
end;
End;
Procedure InfoOut; (* Kanal,AL,NewPic : Byte; Zeile : Str80 *)
Var AMerk,
Tr,x,l : Byte;
Begin
if (not OnlHelp) and (not K[kanal]^.Mo.MonActive) then
begin
if length(Zeile) > 78 then Zeile[0] := Chr(78);
if (K[Kanal]^.Rx_Bin>0) or (K[kanal]^.SPlSave) or (K[kanal]^.xbin.rx) then K[Kanal]^.LstRXInfo:=Zeile
else K[Kanal]^.LstRXInfo:='';
if (K[Kanal]^.FileSend) or (K[kanal]^.xbin.tx) then K[Kanal]^.LstTXInfo:=Zeile else K[Kanal]^.LstTXInfo:='';
if (Kanal = show) and not BackScroll(Kanal) then
begin
if NewPic = 1 then Neu_Bild;
if Kanal > 0 then Tr := K[Kanal]^.QBeg
else Tr := K[Kanal]^.UnStat + 1;
if not HardCur and (length(Zeile) < 76) then Zeile := B1 + Zeile + B1;
if volle_Breite then Zeile := EFillStr(78,B1,Zeile);
l := length(Zeile);
x := (80 - l) div 2;
XL := x;
XR := x + l + 2;
WriteRam(x,Tr,15,1,'<27>' + ConstStr('<27>',l) + '<27>');
WriteRam(x,Tr+1,15,1,'<27>' + Zeile + '<27>');
WriteAttr(x+1,Tr+1,l,Attrib[3],1);
WriteRam(x,Tr+2,15,1,'<27>' + ConstStr('<27>',l) + '<27>');
if LastInfoFlag then
WriteRam(x+1,Tr,15,1,B1+int_str(LastInfoOut^.KA[LastInfoCount])+B1);
NowFenster := true;
if (not K[Kanal]^.FileSend) and (K[Kanal]^.RX_Bin<1)
and ((not K[kanal]^.xbin.rx) and (not K[kanal]^.xbin.tx)) then BoxZaehl := Box_Time
else BoxZaehl:=0;
NowCurBox := true;
if (AL = 1) and Klingel then Beep(G^.PopFreq,G^.PopFreqTime);
if not LastInfoFlag then
begin
for l := maxInfoOut-1 downto 1 do
begin
LastInfoOut^.IZ[l+1] := LastInfoOut^.IZ[l];
LastInfoOut^.KA[l+1] := LastInfoOut^.KA[l];
end;
LastInfoCount := 0;
LastInfoOut^.IZ[1] := Zeile;
LastInfoOut^.KA[1] := Kanal;
KillEndBlanks(LastInfoOut^.IZ[1]);
KillStartBlanks(LastInfoOut^.IZ[1]);
end;
set_Hardwarecursor(Kanal);
K[Kanal]^.MerkInfo := '';
end else K[Kanal]^.MerkInfo := Zeile;
end; {if not OnlHelp ... }
End;
Procedure max_path_ermitteln;
Var Hstr : String[80];
Begin
maxPath := 0;
FiResult := ResetTxt(G^.LinkFile);
Repeat
Readln(G^.LinkFile,Hstr);
if pos(DP,Hstr) > 0 then inc(maxPath);
Until Eof(G^.LinkFile);
FiResult := CloseTxt(G^.LinkFile);
End;
Procedure WriteAttr (* X_Pos,Y_Pos,Count,Attr,Aufruf : Byte *);
Begin
if not ScreenSTBY then
begin
if not ((Aufruf = 0) and BackScroll(show)) then
Asm xor ch, ch
mov cl, Count
cmp cl, 0
je @Ende
les di, Bild
mov al, Y_Pos
dec al
mov ah, 160
mul ah
add di, ax
mov al, X_Pos
shl al, 1
dec al
xor ah, ah
add di, ax
mov al, Attr { Attribut laden, }
@Again:
mov [es:di], al { und schreiben }
add di, 2
loop @Again
@Ende:
end;
end;
End;
Procedure WritePage (* Kanal,X_Pos,Y_Pos,Attr,Aufruf : Byte ; Zeile : Str80 *);
Var Attr1 : Byte;
Zeile2:string;
i,i2:byte;
itab:byte;
U_FArb_Green:Boolean;
Begin
zeile2:='';
itab:=8;
for i:=1 to length(zeile) do
begin {or (zeile[1]=^J)}
if (itab=0) or (zeile[i]=#13) then itab:=8;
dec(itab);
if kanal>0 then
begin
if zeile[i]<>#9 then Zeile2:=zeile2+zeile[i]
else
begin
zeile2:=zeile2+efillstr(itab,B1,'');
itab:=9;
end;
end else zeile2:=zeile;
end;
if not ScreenSTBY then
begin
if (Aufruf = 1) or (Kanal = show) then
begin
Attr1 := Attrib[1];
AusStr := Zeile2;
U_Farb_Green:=Not SoZeichen;
{ Asm mov si, Offset AusStr
xor ch, ch
mov cl, [ds:si]
test cl, $FF
jz @Ende
inc si
les di, Bild
mov al, Y_Pos
mov ah, 160
dec al
mul ah
mov di, ax
mov al, X_Pos
shl al, 1
dec al
dec al
xor ah, ah
add di, ax
cld
@Again:
mov ah, Attr
lodsb
cmp al, 32
jae @Weiter
test al, $FF
jz @Weiter
mov ah, Attr1
mov bl, WCTRL
test bl, $FF
jz @1
add al, 64
@1:
@Weiter:
mov [es:di], ax
add di, 2
Loop @Again
@Ende:}
Asm mov si, Offset AusStr
xor ch, ch
mov cl, [ds:si]
test cl, $FF
jz @Ende
inc si
les di, Bild
mov al, Y_Pos
mov ah, 160
dec al
mul ah
mov di, ax
mov al, X_Pos
shl al, 1
dec al
dec al
xor ah, ah
add di, ax
cld
@Again:
mov ah, Attr
lodsb
cmp al, 32
jae @Weiter
test al, $FF
jz @Weiter
mov bl, WCTRL
test bl, $FF
test U_FARB_GREEN, 1
jz @Weiter
mov ah, Attr1
add al, 64
jz @1
@1:
@Weiter:
mov [es:di], ax
add di, 2
Loop @Again
@Ende:
end;
end;
end;
End;
{
Procedure WritePage (* Kanal,X_Pos,Y_Pos,Attr : Byte ; Zeile : Str80 *);
var Attr1,i : Byte;
ch : char;
Position : Integer;
aktuell : Boolean;
Begin
if not ScreenSTBY then
begin
if (Aufruf = 1) or (Kanal = show) then
begin
Position := pred(Y_Pos) * 160 + pred(X_Pos shl 1);
for i := 1 to length(Zeile) do
Begin
ch := Zeile[i];
if ch < #32 then
begin
Attr1 := Attrib[1];
if WCTRL then ch := chr(ord(ch) + 64);
end else Attr1 := Attr;
Bild^[Position] := ch;
inc(Position);
Bild^[Position] := chr(Attr1);
inc(Position);
end;
end;
end;
End;
}
Procedure WriteRam (* X_Pos,Y_Pos,Attr,Aufruf : Byte; Zeile : Str80 *);
Begin
if not ScreenSTBY then
begin
if not ((Aufruf = 0) and BackScroll(show)) then
begin
AusStr := Zeile;
Asm mov si, Offset AusStr
xor ch, ch
mov cl, [ds:si]
test cl, $FF
jz @Ende
inc si
les di, Bild
mov al, Y_Pos
mov ah, 160
dec al
mul ah
mov di, ax
mov al, X_Pos
shl al, 1
sub al, 2
xor ah, ah
add di, ax
mov ah, Attr
cld
@Again:
lodsb
mov [es:di], ax
add di, 2
Loop @Again
@Ende:
end;
end;
end;
End;
{
Procedure WriteRam(X_Pos,Y_Pos,Attr,Aufruf : Byte ; Zeile : Str80);
var i : Byte;
ch : char;
ch1 : char;
Position : Integer;
Begin
if not ScreenSTBY then
begin
ch1 := chr(Attr);
Position := (pred(Y_Pos) * 160) + pred(X_Pos shl 1);
if not ((Aufruf = 0) and BackScroll(show)) then
begin
for i := 1 to ord(Zeile[0]) do
Begin
Bild^[Position] := Zeile[i];
Position := Succ(Position);
Bild^[Position] := ch1;
Position := Succ(Position);
end;
end;
end;
End;
}
Procedure WriteTxt (* X_Pos,Y_Pos,Attr : Byte; Zeile : Str80 *);
Begin
AusStr := Zeile;
Asm mov si, Offset AusStr
xor ch, ch
mov cl, [ds:si]
test cl, $FF
jz @Ende
inc si
les di, Bild
mov al, Y_Pos
mov ah, 160
dec al
mul ah
mov di, ax
mov al, X_Pos
shl al, 1
sub al, 2
xor ah, ah
add di, ax
mov ah, Attr
cld
@Again:
lodsb
mov [es:di], ax
add di, 2
Loop @Again
@Ende:
end;
End;
Procedure WriteBios (* Kanal,X_Pos,Y_Pos,Attr,Aufruf : Byte ; Zeile : Str80 *);
Var i : Byte;
r : Registers;
Begin
if not ScreenSTBY then
begin
if (Aufruf = 1) or (Kanal = show) then
begin
for i := 1 to length(Zeile) do if Zeile[i] in [#0..#31] then Zeile[i] := B1;
r.AH := $13;
r.AL := $00;
r.BH := $00;
r.BL := Attr;
r.CX := ord(Zeile[0]);
r.DH := Y_Pos - 1;
r.DL := X_Pos - 1;
r.ES := Seg(Zeile[1]);
r.BP := Ofs(Zeile[1]);
Intr($10,r);
end;
end;
End;
Function KanalFrei (* Kanal : Byte) : Byte *);
Var Free : Boolean;
i : Integer;
Begin
Free := false;
i := maxLink;
While not Free and (i > 0) do with K[i]^ do
begin
if not (Kanal_benutz or connected or Test or Mo.MonActive) and
(i <> ConvHilfsPort) and
((Kanal = 0) or (Kanal > 0) and (Kanal <> i)) then
begin
Free := true;
KanalFrei := i;
end else dec(i);
end;
if not Free then KanalFrei := 0;
End;
Function Line_convert (* Kanal, Art : Byte; Zeile : String) : String *);
Var i : Byte;
zh:char;
Begin
with K[Kanal]^ do
begin
if Umlaut = 2 then
begin
case Art of
1 : For i := 1 to length(Zeile) do
begin
zh:=#0;
case Zeile[i] of
'<27>' : zh := '[';
'<27>' : zh := BS ;
'<27>' : zh := ']';
'<27>' : zh := '{';
'<27>' : zh := '|';
'<27>' : zh := '}';
'<27>' : zh := '~';
'[' : zh := '<27>';
BS : zh := '<27>';
']' : zh := '<27>';
'{' : zh := '<27>';
'|' : zh := '<27>';
'}' : zh := '<27>';
'~' : zh := '<27>';
end;
if zh<>#0 then Zeile[i]:=zh;
end;
2 : For i := 1 to length(Zeile) do
begin
zh:=#0;
case Zeile[i] of
'[' : zh := '<27>';
BS : zh := '<27>';
']' : zh := '<27>';
'{' : zh := '<27>';
'|' : zh := '<27>';
'}' : zh := '<27>';
'~' : zh := '<27>';
'<27>' : zh := '[';
'<27>' : zh := BS ;
'<27>' : zh := ']';
'<27>' : zh := '{';
'<27>' : zh := '|';
'<27>' : zh := '}';
'<27>' : zh := '~';
end;
if zH<>#0 then Zeile[i]:=zh;
end;
end;
end
else if Umlaut = 3 then
begin
case Art of
1 : For i := 1 to length(Zeile) do
case Zeile[i] of
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
end;
2 : For i := 1 to length(Zeile) do
case Zeile[i] of
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
'<27>' : Zeile[i] := '<27>';
end;
end;
end;
end;
Line_convert := Zeile;
End;
Function InfoZeile; (* (Nr : Word) : String[80] *)
Var Hstr : String;
i,x : Word;
Begin
Hstr := '';
if nr<=maxmsgs then
begin
x := (MsgPos^[Nr+1] - MsgPos^[Nr]);
move(Msg^[MsgPos^[Nr]],Hstr[1],x);
Hstr[0] := chr(Byte(x));
end else InfoOut(show,0,1,'WRONG VERSION: MSGS.XP!!!');
InfoZeile := Platzhalter(Kanal2,Hstr);
End;
Procedure Neu_Bild;
Const ScrMax = NeuBildRam + 1;
RetMax = 60;
Type ScreenPtr = array[0..ScrMax] of Byte;
ReturnPtr = array[0..RetMax] of Word;
Var Zeilen,i : Integer;
Screen : ^ScreenPtr;
Return : ^ReturnPtr;
Procedure Picture(C,von,bis,Attr : Byte);
Var i1 : Integer;
Farb,
Z,J : Byte;
Groesse,
P : LongInt;
Hstr : String[80];
ch : char;
i : Word;
NotPtr : Pointer;
RetPtr : Pointer;
Begin
FillChar(Return^,SizeOf(Return^),0);
FillChar(Screen^,SizeOf(Screen^),0);
Return^[0] := ScrMax-1;
if use_EMS then EMS_Seite_einblenden(C,Scr);
if use_Vdisk then
begin
FiResult := ResetBin(ScrollFile,T);
with K[C]^ do
if NotPos + 1 < ScrMax then
begin
Seek(ScrollFile,Pos_im_Scr+(maxNotCh-ScrMax+NotPos));
BlockRead(ScrollFile,Screen^[0],ScrMax-NotPos-1,i);
Seek(ScrollFile,Pos_im_Scr);
BlockRead(ScrollFile,Screen^[ScrMax-NotPos-1],NotPos,i);
end else
begin
Seek(ScrollFile,Pos_im_Scr+(NotPos+1-ScrMax));
BlockRead(ScrollFile,Screen^[0],ScrMax-1,i);
end;
FiResult := CloseBin(ScrollFile);
end else
if use_XMS then
begin
with K[C]^ do if NotPos + 1 < ScrMax then
begin
XMS_to_Data(@Screen^[0],XMS_Handle,Pos_im_Scr+(maxNotCh-ScrMax+NotPos),ScrMax-NotPos-1);
XMS_to_Data(@Screen^[ScrMax-NotPos-1],XMS_Handle,Pos_im_Scr,NotPos);
end else XMS_to_Data(@Screen^[0],XMS_Handle,Pos_im_Scr+(NotPos+1-ScrMax),ScrMax-1);
end else
begin
with K[C]^ do if NotPos + 1 < ScrMax then
begin
move(NotCh[C]^[maxNotCh-ScrMax+NotPos],Screen^[0],ScrMax-NotPos-1);
move(NotCh[C]^[0],Screen^[ScrMax-NotPos-1],NotPos);
end else move(NotCh[C]^[NotPos+1-ScrMax],Screen^[0],ScrMax-1);
end;
Screen^[ScrMax-1] := 13;
NotPtr := @Screen^[ScrMax-2];
RetPtr := @Return^[0];
Asm cli
push DS
mov cx, ScrMax
dec cx
dec cx
xor bl, bl
lds si, RetPtr
les di, NotPtr
jmp @Again
@AddZ:
add si, 2
mov [ds:si], cx
dec cx
inc bl
cmp bl, RetMax
jae @Ende
@Again:
mov al, [es:di]
dec di
cmp al, 13
je @AddZ
Loop @Again
@Ende:
pop DS
mov Z, bl
sti
end;
(*
Z := 0;
for i := max-2 downto 0 do
begin
if (Screen^[i] = 13) and (Z < a) then
begin
inc(Z);
RET[Z] := i;
end;
end;
*)
if Zeilen <= Z then Z := Zeilen;
for i := 1 to Z do
begin
Hstr := '';
Farb := ord(Screen^[Return^[i]+1]);
if Farb = 254 then Farb := 13;
J := Return^[i-1] - Return^[i] - 2;
if J > 80 then J := 80;
move(Screen^[Return^[i]+2],Hstr[1],J);
Hstr[0] := chr(J);
Teil_Bild_Loesch(bis+1-i,bis+1-i,Farb);
WritePage(show,1,bis+1-i,Farb,0,Hstr);
end;
if (bis-Z) >= von then Teil_Bild_Loesch(von,bis-Z,Attr);
end;
Begin
NowFenster := false;
NowCurBox := false;
ScreenSTBY := false;
SetzeFlags(show);
Status2;
GetMem(Screen,SizeOf(Screen^));
GetMem(Return,SizeOf(Return^));
if show = 0 then
begin
Zeilen := maxZ - K[0]^.UnStat;
Picture(0,K[0]^.UnStat+1,maxZ,Attrib[29]);
TickerOut;
end else
begin
Zeilen := K[show]^.QEnd - K[show]^.QBeg + 1;
Picture(show,K[show]^.QBeg,K[show]^.QEnd,Attrib[18]);
Zeilen := maxZ - K[show]^.UnStat;
if Zeilen > 0 then Picture(0,K[show]^.UnStat+1,maxZ,Attrib[29]);
end;
FreeMem(Return,SizeOf(Return^));
FreeMem(Screen,SizeOf(Screen^));
Neu_BildVor(show);
Soft_Cursor(show);
if HardCur then
begin
JumpRxZaehl := 0;
JumpRxScr := true;
end;
notScroll := true;
if not BackScroll(show) and (K[show]^.MerkInfo > '') then
InfoOut(show,0,0,K[show]^.MerkInfo);
End;
Procedure SetzeFlags (* Kanal : Byte *);
Var S, S3 : String[80];
EigMail_:Boolean;
i:Byte;
kanstr:string;
Procedure mS (Hstr : string);
Begin
if length(S)+Length(Hstr)>58 then S3:=S3+Hstr
else S := S + Hstr;
End;
Begin
if not OnlHelp then
begin
with K[Kanal]^ do
begin
StatusOut(Kanal,1,1,Attrib[9],ConstStr(B1,60),2);
StatusOut(Kanal,42,1,Attrib[9],ConstStr(B1,18),1);
if (not Backscroll(show)) and (Kanal=show) then
StatusOut(Kanal,61,1,Attrib[9],ConstStr(B1,20),3);
StatusOut(Kanal,1,1,Attrib[9],ConstStr(B1,60),3);
S := '';
S3:= '';
if Kanal > 0 then
begin
{ms('SYS:'+int_str(SysArt)+'User:'+int_str(UserArt));}
{ mS('CTxt:'+int_str(TNC[TncNummer]^.CTEXT)+' '); }
if Einstiegskanal or AusstiegsKanal then
mS('*'+int_str(GegenKanal)+'* ');
if Kopieren > 0 then
mS('Copy>'+int_str(Kopieren)+' '); {AN: anzeige f<>r den kanal}
{VON dem kopiert wird}
if KopierenFm > 0 then
mS('Copy<'+int_str(KopierenFm)+' '); {VON: anzeige f<>r den kanal}
{AN DEN kopiert wird}
if FileSend then mS('FileTx ');
if RX_Bin > 0 then mS('FileRx ');
if SplSave then
mS('7+Save ')
else if SPlus then
mS('7+ ');
if BufExists then mS('Buff ');
if xbin.rx then ms('XBinRX ');
if xbin.tx then ms('XBinTX ');
if (XBin.An) and ((not XBin.RX) and (not Xbin.TX)) then ms('XBin ');
if AutoBin then mS('ABin ');
if RemAll then mS('RemSOp! ');
If SelfSysop then ms('SysOp! ');
if Ignore then mS('Ignore ');
if not BinOut then mS('NoBin ');
if SysopParm then mS('SOp? ');
if Auto then mS('Remote '); {Stimmt tats<74>chlich ....}
if Auto_CON then mS('c... ');
if Rx_Beep then mS('RxBeep ');
if Hold and not FileSend then mS('Hold ');
if CSelf in [5,6] then mS('Auto? ')
else if CSelf > 0 then mS('Auto ');
if Node then ms('Node ');
end else
{Kanal = 0}
begin
if CtrlBeep then mS('Beep ');
if PacOut then mS('PLen ');
if Time_stamp then mS('Time ');
{$IFNDEF no_Bake} {//db1ras}
if TNC[Unproto]^.Bake then mS('Bake ');
{$ENDIF}
if NoBinMon then mS('NoBin ');
{$IFNDEF no_Bake} {//db1ras}
if MailBake then ms('MFrms ');
{$ENDIF}
end;
if TopBox then mS('XPBox ');
if (_OnAct) and (OnAct='') then ms('OnAct ');
if (_OnAct) and (OnAct<>'') then ms('OnAct! ');
if RxComp then mS('RxComp('+int_str(RXKompRate)+'%) ');
if TxComp then mS('TxComp('+int_str(TXKompRate)+'%) ');
{if spcomp then ms('SP ');}
if not RX_Save and Save then mS('Save ');
if Umlaut > 0 then mS('Uml ');
if Echo > 0 then mS('Echo ');
if Klingel then mS('Bell ');
if Print then if Drucker then mS('PTR:A ')
else mS('PRT: ');
if G^.MakroLearn then mS('MakLearn ');
if Fwd then MS('MPoll ');
if VIPG THEN MS('VIP ');
if SoZeichen then MS ('<'+#5+'> ');
StatusOut(Kanal,2,1,Attrib[14],S,2);
StatusOut(Kanal,2,1,Attrib[14],S3,3);
s:='';
if ((connected) or (TEST)) then
begin
if (SystemErkannt=AutoSysName[0]) then
begin
Case SysArt of
3 :SystemErkannt:=AutoSysName[1];
{ 16:SystemErkannt:=AutoSysName[2]; Nicht einden - RMNC/PC-Unterschied!!}
17,
19:SystemErkannt:=AutoSysName[3];
1 :SystemErkannt:=AutoSysName[4];
18:SystemErkannt:=AutoSysName[5];
end;
end;
if SysArt in [1..6,14] then S:='B' else
if (SysArt in [7..13,15,16,18..20]) or (XPNodeC) then S:='N'
else if ((Userart>0) and (SysArt=0)) or (SysArt>0) then S:='T';
{ if sysart in [1,3,16..18,19] then S:=S+SystemErkannt; }
if sysart in [1,3,7,10,16..18,19] then S:=S+SystemErkannt; {//db1ras}
if (sysArt>0) and (SystemErkannt='') then S:=S+':'+SNam[SysArt];
if (sysArt=0) and (UserArt>0) then S:=S+':'+Unam[UserArt];
{ connect}
if (S='') and (System<>'') then S:='?:'+System;
end;
StatusOut(Kanal,43,1,Attrib[14],EfillStr(12,B1,S),1);
EigMail_:=false;
EigMail_:=EigMail;
if Kanal=0 then
begin
EigMail_:=false;
for I:=1 to maxLink do
begin
if K[i]^.EigMail then
EigMail_:=true;
end;
end;
S:='MAIL in '; {9}
if MailInBox then
begin
S:=S+'Ext';
if EigMail_ then S:=S+'&' else S:=S+' ';
end;
if EigMail_ then S:=S+'XP-';
S:=S+'Box!';
Versi:=Version;
if ((MailInBox) or (EigMail_)) and ((Not Backscroll(Kanal)) and (Kanal=show)) then
begin
StatusOut(Kanal,61,1,Attrib[10],s,3);
VErsi:=S;
end
else StatusOut(Kanal,61,1,Attrib[10],Version,3)
end;
end; {if not OnlHelp ... }
End;
Procedure ScreenFill; (* Bildschirm-Schoner *)
Var X,Y : Byte;
Begin
ScreenSTBY := false;
Teil_Bild_Loesch(1,maxZ,0);
ScreenSTBY := true;
Repeat
X := Random(70);
Until X in [1..70];
Repeat
Y := Random(maxZ);
Until Y in [1..maxZ];
WriteTxt(X,Y,Attrib[15],BSXP);
End;
Procedure Check_Eig_Mail (* von,bis : Byte *);
Var Hstr : String[9];
i : Byte;
Begin
for i := von to bis do with K[i]^ do
begin
Hstr := OwnCall;
strip(Hstr);
if Exists(Konfig.MailVerz + Hstr + MsgExt) then
begin
if pos(Hstr,Eig_Mail_Zeile) = 0
then Eig_Mail_Zeile := Eig_Mail_Zeile + B1 + Hstr;
EigMail := true;
end else EigMail := false;
end;
End;
Procedure EMS_Seite_einblenden (* Kanal : Byte; Art : Byte *);
Var i : Byte;
Begin
with K[Kanal]^ do
begin
if Art = Scr then for i := 0 to PagesAnz-1 do
EMS_Zuordnung(ScrHandle,i,PagesNot[i]);
if Art = Vor then EMS_Zuordnung(VorHandle,0,Kanal);
if EMS_Error <> 0 then Abbruch_XP(10,int_str(EMS_Error));
end;
End;
Procedure Open_Scroll (* Kanal : Byte *);
Begin
with K[Kanal]^ do
begin
FiResult := ResetBin(ScrollFile,T);
Seek(ScrollFile,Pos_im_Scr + NotPos);
end;
End;
Procedure Close_Scroll (* Kanal : Byte *);
Begin
with K[Kanal]^ do
begin
NotPos := FilePos(ScrollFile) - Pos_im_Scr;
FiResult := CloseBin(ScrollFile);
end;
End;
Function PhantasieCall; (* : str9 *)
Var ch : char;
Hstr : String[9];
Begin
Hstr := '';
While length(Hstr) < 7 do
begin
ch := #0;
While not (ch in ['A'..'Z']) do ch := chr(Random(Byte(90)));
Hstr := Hstr + ch;
end;
Hstr[4] := chr(Random(Byte(9)) + 48);
Hstr[7] := '-';
Hstr := Hstr + int_str(Random(Byte(15)));
PhantasieCall := Hstr;
End;
Procedure SetzeCursor (* X,Y : ShortInt *);
Begin
if not Cursor_on then Cursor_Ein;
X := Byte(X);
Y := Byte(Y);
if (CurX <> X) or (CurY <> Y) then GotoXY(X,Y);
CurX := X;
CurY := Y;
End;
Procedure InitCursor (* X,Y : ShortInt *);
Begin
if HardCur then SetzeCursor(X,Y);
End;
Procedure set_Hardwarecursor (* Kanal : Byte *);
Var i,i1,i2,i3 : Byte;
begin
if HardCur then with K[Kanal]^ do
begin
i := QBeg + 1;
i1 := 3;
i3 := QEnd;
if Kanal = 0 then
begin
i := UnStat + 2;
i1 := 1;
i3 := maxZ;
end;
if Braille80 then i2 := 80 else i2 := 1;
if NowCurBox and not NoCurJump
then SetzeCursor(XL,i)
else if not TNC_ReadOut then
begin
if (Kanal = 0) then SetzeCursor(1,UnStat);
end else if JumpRxScr and Win_Rout then
begin
if ShTab_Pressed then SetzeCursor(i1,ObStat)
else SetzeCursor(i2,i3);
end else
begin
if Cmd then SetzeCursor(X1C,Y1C+Vofs)
else SetzeCursor(X1V,Y1V+Vofs);
end;
end;
End;
Procedure SwitchChannel(Kanal : Byte);
Begin
if Kanal > 0 then PortStufe := ((Kanal-1) div 10) * 10;
show := Kanal;
K[Kanal]^.NochNichtGelesen := false;
K[Kanal]^.cmd:=false;
Neu_Bild;
with K[kanal]^ do
begin
if ((RX_Bin>0) or (SPlSave)) and (LstRXInfo<>'') then InfoOut(Kanal,0,1,LstRXInfo);
if (FileSend) and (LstTXInfo<>'') then InfoOut(Kanal,0,1,LstTXInfo);
end;
UserInStatus(kanal);
End;
Procedure SwitchKanal (* VC : Char *);
Var i,i1,i2 : Byte;
Flag : Boolean;
Begin
i := (ord(VC)-58);
i1 := show;
if maxLink > 10 then
begin
if i1 - PortStufe = i then
begin
if i1 + 10 <= maxLink then i1 := i1 + 10 else
begin
i1 := i;
if i1 = 0 then i1 := maxLink;
end;
end else
begin
i1 := i + PortStufe;
if i1 > maxLink then i1 := i;
end;
i2 := i1;
Repeat
if i2 + 10 <= maxLink then i2 := i2 + 10
else i2 := i;
Flag := K[i2]^.NochNichtGelesen;
Until Flag or (i2 = i1);
if Flag then i1 := i2;
end else i1 := i;
if i1 > maxLink then i1 := maxLink;
SwitchChannel(i1);
End;
Procedure SwitchMonitor;
Begin
if show > 0 then
begin
ShowMerk := show;
SwitchChannel(0);
end else SwitchChannel(ShowMerk);
End;
Function FreeStr (* Lw : char) : str11 *);
Begin
FreeStr := FormByte(int_str(DiskFree(ord(Lw)-64)));
End;
Function V24 (* Kanal : Byte) : Byte *);
Begin
V24 := TNC[K[Kanal]^.TncNummer]^.RS232;
End;
Procedure ReInstall;
Begin
V24_Close;
Port[$21] := Old_IntMask;
Port[$20] := $C7;
if use_EMS then EMS_Freigeben(ScrHandle);
if Vor_im_EMS then EMS_Freigeben(VorHandle);
if use_XMS then Free_XMS_Ram(XMS_Handle);
NormVideo;
ColorItensity(false);
TextMode(StartVideoMode);
ClrScr;
Cursor_ein;
End;
Procedure ColorItensity (* CFlag : Boolean *);
var r : Registers;
i : Byte;
Begin
if not Hercules then
begin
if CFlag then i := 0
else i := 1;
r.AX := $1003;
r.BL := i;
Intr($10,r);
end;
End;
Function ChAttr (* Attr : Byte ) : Byte *);
Begin
if Attr = 13 then ChAttr := 254 else ChAttr := Attr;
End;
Procedure Init_HardDrive;
Var r : Registers;
Begin
r.AH := $0D;
MsDos(r);
HD_Read := 0;
End;
Procedure New2BVec;
Begin
ES := Seg(TopString);
DI := Ofs(TopString);
End;
{Ueberprueft, ob XP schon geladen ist}
Procedure Check_Loaded;
Var r : Registers;
p : ^String;
Begin
r.ES := 0;
r.DI := 0;
Intr(TEI,r);
p := Ptr(r.ES,r.DI);
if (p <> nil) and (p^ = TopString) then
begin
Writeln(^G,'XPacket already loaded !');
Halt;
end;
End;
Procedure Exit_XP;
Begin
ExitProc := OrigExit;
ReInstall;
GotoXY(1,25);
Writeln(^G);
End;
Procedure PRG_Stoppen(Nr : Byte);
Begin
ExitProc := OrigExit;
Halt(Nr);
End;
Function BackScroll (* Kanal : Byte) : Boolean *);
Begin
with K[Kanal]^ do BackScroll := QsoScroll or BoxScroll or DirScroll;
End;
Procedure Call_DOS (* Zeile : Str128 *);
Begin
SetIntVec(TEI,@New2Bvec);
SetMemTop(Ptr(OvrHeapOrg,0));
SwapVectors;
Exec(GetEnv('COMSPEC'),Zeile);
SwapVectors;
SetMemTop(HeapEnd);
OvrClearBuf;
SetIntVec(TEI,Old2Bvec);
End;
Function AppendTxt (* Var f : Text) : Integer *);
Begin
{$I-} Append(f);
AppendTxt := IOResult;
{$I+}
End;
Function ResetTxt (* Var f : Text) : Integer *);
Begin
{$I-} Reset(f);
ResetTxt := IOResult;
{$I+}
End;
Function ResetBin (* Var f : File; Fpos : LongInt) : Integer *);
Begin
{$I-} Reset(f,Fpos);
ResetBin := IOResult;
{$I+}
End;
Function RewriteTxt (* Var f : Text) : Integer *);
Begin
{$I-} Rewrite(f);
RewriteTxt := IOResult;
{$I+}
End;
Function RewriteBin (* Var f : File; Fpos : LongInt) : Integer *);
Begin
{$I-} Rewrite(f,Fpos);
RewriteBin := IOResult;
{$I+}
End;
Function CloseTxt (* Var f : File) : Integer *);
Begin
{$I-} Close(f);
CloseTxt := IOResult;
{$I+}
End;
Function CloseBin (* Var f : File) : Integer *);
Begin
{$I-} Close(f);
CloseBin := IOResult;
{$I+}
End;
Function EraseTxt (* Var f : File) : Integer *);
Begin
{$I-} Erase(f);
EraseTxt := IOResult;
{$I+}
End;
Function EraseBin (* Var f : File) : Integer *);
Begin
{$I-} Erase(f);
EraseBin := IOResult;
{$I+}
End;
Procedure IdleDOS;
Var r : Registers;
Begin
r.AX := $1680;
Intr($2F,r);
End;
Procedure Verzoegern (* Wert : Word *);
Begin
Delay(Word(Round(Wert * DelayCor)));
End;
Procedure LockIntFlag (* Art : Byte *);
Begin
if LockInt then
begin
if Art = 0 then Inline($FA)
else Inline($FB);
end;
End;
Procedure Sound_ (* Tonh, Lang : Integer *);
begin
if (not quiet) then begin
Sound(TonH); warte(Lang); NoSound;
end;
end;