UNIT FossilP; { see demo at end of code } INTERFACE Uses Dos, Crt; { Phone, PXEngine, PxMsg; Config;} Type FossilInfo = Record MaxFunc :Byte; {Max func number supported} Revision :Byte; {Fossil revision supported} MajVer :Byte; {Major version} MinVer :Byte; {Minor version} Ident :PChar; {Null terminated ID string} IBufr :Word; {size of input buffer} IFree :Word; {number of bytes left in buffer} OBufr :Word; {size of output buffer} OFree :Word; {number of bytes left in buffer} SWidth :Byte; {width of screen} SHeight :Byte; {height of screen} Baud :Byte; {ACTUAL baud rate, computer to modem} End; FossilInfo2 = Record StrucSize :Word; {Structure size in bytes} MajVer :Byte; {Major version} MinVer :Byte; {Minor version} Ident :PChar; {Null terminated ID string} IBufr :Word; {size of input buffer} IFree :Word; {number of bytes left in buffer} OBufr :Word; {size of output buffer} OFree :Word; {number of bytes left in buffer} SWidth :Byte; {width of screen} SHeight :Byte; {height of screen} Baud :Byte; {ACTUAL baud rate, computer to modem} End; Procedure ModemSetting(Baud, DataBit: Integer; Party: Char; StopBit: Integer); Function FReadKey:Word; Procedure FossilInt(var R:Registers); Procedure GetFossilInfo(var FosRec:FossilInfo2; Port:Word); Procedure InitFossil(var FosInf:FossilInfo; Port:Word); Procedure DeInitFossil(Port:Word); Function FIsKeyPressed:Word; Function FossilReadChar(Port:Word):Byte; Function FossilIsCharReady(Port:Word):Word; Function FossilSendChar(Port:Word; Char:byte):Word; Procedure Init; Procedure FossilSendStr(S:String; Port:Word); Procedure DialNo(Port:Word); Procedure Run; Procedure Done; Procedure WriteAnsi; Procedure HangUp; Procedure DialRec(Port:Word); IMPLEMENTATION { Fossil Functions } Procedure FossilInt(var R:Registers); begin Intr($14,R); End; Procedure ModemSetting(Baud, DataBit: Integer; Party: Char; StopBit: Integer); Var Out : Integer; R : Registers; Port: Word; Begin Out := 0; Case Baud Of 0 :Exit; 100 :Out := Out + 000 + 00 + 00; 150 :Out := Out + 000 + 00 + 32; 300 :Out := Out + 000 + 64 + 00; 1200 :Out := Out + 128 + 00 + 00; 2400 :Out := Out + 128 + 00 + 32; 4800 :Out := Out + 128 + 64 + 00; 9600 :Out := Out + 128 + 64 + 32; End; Case DataBit Of 5 :Out := Out + 0 + 0; 6 :Out := Out + 0 + 1; 7 :Out := Out + 2 + 0; 8 :Out := Out + 2 + 1; End; Case Party Of 'N' :Out := Out + 00 + 0; 'O', 'o' :Out := Out + 00 + 8; 'n' :Out := Out + 16 + 0; 'E', 'e' :Out := Out + 16 + 8; End; Case StopBit Of 1 :Out := Out + 0; 2 :Out := Out + 4; End; R.AH:=0; R.AL:=Out; R.DX:=Port; FossilInt(R); End; Procedure GetFossilInfo(var FosRec:FossilInfo2; Port:Word); Var R: Registers; Begin R.AH:=$1B; {Function number 1bh} R.CX:=SizeOf(FosRec); {size of user info} R.DX:=Port; {port number} R.ES:=Seg(FosRec); {segment of info buf} R.DI:=Ofs(FosRec); {offset of info buf} FossilInt(R); End; Procedure InitFossil(var FosInf:FossilInfo; Port:Word); Var R :Registers; Z :FossilInfo2; Begin R.AH:=$04; R.DX:=Port; FossilInt(R); if R.AX=$1954 then begin {AX should countain 1954h if fossil is loaded} FosInf.MaxFunc :=R.BL; FosInf.Revision:=R.BH; GetFossilInfo(Z,Port); with FosInf do begin MajVer:= Z.MajVer; MinVer:= Z.MinVer; Ident := Z.Ident; IBufr := Z.IBufr; IFree := Z.IFree; OBufr := Z.OBufr; OFree := Z.OFree; SWidth:= Z.SWidth; SHeight:=Z.SHeight; Baud := Z.Baud; End; End Else FosInf.MaxFunc:=0; {MaxFunc contains 0 if fossil is not found} End; Procedure DeInitFossil(Port:Word); var R: Registers; Begin R.AH:=$05; R.DX:=Port; FossilInt(R); End; Function FIsKeyPressed:Word; var R:Registers; Begin R.AH:=$0D; FossilInt(R); FIsKeyPressed := R.AX; End; Function FReadKey:Word; var R:Registers; Begin R.AH:=$0E; FossilInt(R); FReadKey := R.AX; End; Function FossilReadChar(Port:Word):Byte; var R :Registers; Begin R.AH:=$02; R.DX:=Port; FossilInt(R); FossilReadChar := R.AL End; Function FossilIsCharReady(Port:Word):Word; var R :Registers; Begin R.AH:=$0C; R.DX:=Port; FossilInt(R); FossilIsCharReady := R.AX; End; Function FossilSendChar(Port:Word; Char:byte):Word; var R :Registers; Begin R.AH:=$01; R.DX:=Port; R.AL:=Char; FossilInt(R); FossilSendChar := R.AX; End; Const CurPort :Word = 1; {current COM port of modem} ExitKey=$2d00; {ALT-X} DialKey=$2000; {ALT-D} DialPref:String ='ATDT'; DialSuf :String =#13; Var Z :FossilInfo; Procedure Init; Begin Write('Modem Port(0=COM1):'); ReadLn(CurPort); InitFossil(Z,CurPort); if Z.MaxFunc=0 then begin WriteLn('ERROR:No FOSSIL driver found!'); Sound(400); Delay(500); NoSound; Halt(1); End; WriteLn('Fossil: Rev ',Z.Revision,' ',Z.Ident); End; Procedure FossilSendStr(S:String; Port:Word); Var I:Byte; Begin for I:=1 to byte(S[0]) do FossilSendChar(Port,byte(S[I])); End; Procedure DialNo(Port:Word); Const SufixDial = 'ATDT'; var TelNo:String; Begin WriteLn; Write('Number to dial:'); ReadLn(TelNo); if TelNo<>'' then begin TelNo := SufixDial+TelNo+DialSuf; FossilSendStr(TelNo,Port); end; end; Procedure DialRec(Port:Word); var SufixDial : String; Num : Integer; BBSName : String; BBSNumber : String; Password : String; Speed : Integer; TelNo : String; Begin Writeln('TelNo is ',TelNo); TelNo := 'ATDT'+TelNo+DialSuf; FossilSendStr(TelNo,Port); End; Procedure Run; var Key :Word; Done:Boolean; Begin Done := False; Repeat If FossilIsCharReady(1)<>$FFFF Then Begin Write(Chr(FossilReadChar(CurPort))); End; If FIsKeyPressed<>$FFFF Then Begin Key:=FReadKey; Case Key Of ExitKey:Done:=True; DialKey:DialNo(CurPort); Else FossilSendChar(CurPort,Lo(Key)); End; End; Until Done; End; Procedure WriteAnsi; Var R : registers; Begin R.AH := $13; R.AL := ORD(FossilreadChar(CurPort)); Intr($14, R); End; Procedure HangUp; Begin FossilSendSTR('+++',CurPort); FossilSendSTR('ATH0'+#13, CurPort); End; Procedure Done; Begin DeInitFossil(CurPort); End; End. { -------------------------------- DEMO PROGRAM --------------------- } {$M 65520,65520,65520} Program AnsiEmu; Uses Dos, Crt, FossilP; Const CurPort :Word=1; ExitKey = $2d00; {ALT-X} DialKey = $2000; {ALT-D} HangUpKey = $2300; {ALT-H} DownLoadKey = $2004; {CTRL+D} UpLoadKey = $1615; {CTRL+U} ChangeSetUp = $2100; {ALT+F} Menuu = $2E00; {ALT+C} PgUp = $4900; {PageUp} PgDown = $5100; {PageDown} ReadPhon = $1900; {ALT+P} DialPref :String='ATDT'; DialSuf :String=#13; Var Key : Word; Done : Boolean; AnsiM : Char; {ZMODEM'iga download} Procedure DownLoadZ; Begin SwapVectors; Exec(GetEnv('COMSPEC'), '/C' + 'c:\gsz.exe port 2 rz'); SwapVectors; End; Procedure UpLoadZ; Var FileName : String; Begin Write('Millist faili tahad Uppida: '); Readln(FileName); SwapVectors; Exec(GetEnv('COMSPEC'), '/C' + 'c:\gsz.exe port 2 sz '+FileName); SwapVectors; End; Procedure FirstKey; Var Vastus : Byte; Begin ClrScr; TextColor(red); Writeln('Millist Protocolli kasutad: '); Writeln; Writeln('1. Zmodem'); Writeln('2. Puma '); Writeln('3. SeaLink'); Writeln; Write('Vastus: '); Readln(Vastus); Case Vastus of 1 : DownLoadZ; End; {End Case} TextColor(White); End; Procedure DownLoad; Begin SwapVectors; Exec(GetEnv('COMSPEC'), '/C' + 'c:\gsz.exe port 2 rz'); SwapVectors; End; Procedure UpLoad; Var FileName : String; Begin Write('Enter Filename to UpLoad: '); Readln(FileName); SwapVectors; Exec(GetEnv('COMSPEC'), '/C' + 'c:\gsz.exe port 2 sz '+FileName); SwapVectors; End; Begin ClrScr; TextColor(White); Init; Done:=False; Repeat If FossilIsCharReady(1)<>$FFFF then begin {Write(Chr(FossilReadChar(CurPort)));} WriteAnsi; {If ANSI loaded then color else BW} End; if FIsKeyPressed<>$FFFF then begin Key:=FReadKey; case Key of ExitKey : Done:=True; DialKey : DialNo(CurPort); HangUpKey : HangUp; DownLoadKey: DownLoadZ; UpLoadKey : UpLoadZ; PgDown : FirstKey; {DownLoadSeaLink;} PgUp : UpLoad; Else FossilSendChar(CurPort, Lo(Key)); End; End; Until Done; Writeln('The End :-)'); {PXDone;} TextColor(White); End.