home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-387-Vol-3of3.iso / s / sltpu70a.zip / MODEM.PAS < prev    next >
Pascal/Delphi Source File  |  1992-04-24  |  9KB  |  346 lines

  1. {$F-} {$S-} {$A-}
  2.  
  3. Unit Modem;
  4.   { Searchlight BBS Modem Interface Unit }
  5.  
  6.   { Procedures and functions in this unit can be used by DOOR programs
  7.     to access Searchlight's serial port drivers directly. I/O, carrier
  8.     detect, disconnect, and buffer controls are included.         }
  9.  
  10.   { These procedures work only in conjunction with Searchlight 2.15C
  11.     and later versions. See MODEM.DOC for more information.       }
  12.  
  13. Interface
  14.   Uses DOS;
  15.  
  16. Type RSbaud = (B110,B150,B300,B600,B1200,B2400,B4800,B9600,B19200,B38400);
  17.      AnsiType = (GENERIC,PROCOMM,STANDARD);
  18.  
  19.      SLDataType = record         { Public Data Area }
  20.       PROGID: string[6];                { Program ID }
  21.       carrier: boolean;                 { carrier check enabled? }
  22.       writeprotect: boolean;            { disk write protection? }
  23.       aborttype: byte;                  { 0=no abort, 1=terminate, 2=reboot }
  24.  
  25.       rsact: boolean;                   { set if rs232 active }
  26.       ansi: boolean;                    { is user in ANSI mode? }
  27.       color: boolean;                   { does user have a color crt? }
  28.       directvid: boolean;               { system DirectVideo mode }
  29.  
  30.       curratt: byte;                    { current video attribute }
  31.       commtype: byte;                   { run parameter }
  32.       idletime: word;                   { idle limit (seconds) }
  33.       lastkey: boolean;                 { TRUE = last key from local kbd }
  34.  
  35.       OldVector: array[$00..$7F] of pointer;   { old user int vectors }
  36.       AnsiMode: AnsiType;               { user's ANSI mode }
  37.      end;
  38.  
  39.  
  40. Var DriverLoaded: boolean;             { Set if SLBBS drivers available }
  41.     SLData: ^SLDataType;               { Pointer to public data area }
  42.     AUXIn: text;                       { RS232 Input File }
  43.     AUXOut: text;                      { RS232 Output File }
  44.  
  45.  Function CarrierDetect: boolean;      { Check carrier status }
  46. Procedure Hangup;                      { Disconnect (hangup) }
  47.  Function RS232Avail: boolean;         { Check RS232 char available }
  48.  Function RS232In: char;               { Read RS232 char }
  49. Procedure RS232Out (c: char);          { Write RS232 char }
  50. Procedure PauseOutput;                 { Pause buffered output }
  51. Procedure RestartOutput;               { Restart output after pause }
  52. Procedure ClearInputBuffer;            { Clear input buffer }
  53. Procedure ClearOutputBuffer;           { Clear output buffer }
  54.  Function BufferEmpty: boolean;        { Check buffer empty condition }
  55.  
  56. Procedure WaitOut;                     { Wait for output buffer to clear }
  57.  
  58. Procedure RSinit (com: integer; speed: RSbaud; buffactor: integer; flow: boolean);
  59.   { Initialize RS232 port }
  60.  
  61. Procedure RSCleanup;
  62.   { Reset RS232 port }
  63.  
  64. Procedure ComToggle;
  65.   { Toggle BIOS I/O support on and off }
  66.  
  67.  
  68.  
  69. Implementation
  70.  
  71. Const RSInt = $7E;             { interrupt for modem functions }
  72.       SLBBSID = $736C;         { code for identifying SL interrupts }
  73.  
  74. Var regs: registers;           { registers for most operations }
  75.     rscom: integer;            { set to active com port via RSinit }
  76.     p,exitsave: pointer;
  77.  
  78.  
  79. { ----- Hardware Modem Controls ----- }
  80.  
  81. Function CarrierDetect: boolean;
  82.   { read carrier detect pin; true=carrier detected }
  83. Begin
  84.   if DriverLoaded then begin
  85.     regs.ax:=2;
  86.     Intr(RSInt,regs);
  87.     CarrierDetect:=(regs.bx=1);
  88.   end else CarrierDetect:=true;
  89. end;
  90.  
  91.  
  92. Procedure Hangup;
  93.   { disconnect from remote user (hang up) }
  94. Begin
  95.   if DriverLoaded then begin
  96.     SLData^.Aborttype:=0;   { Set abort type to 'none'. This is important. }
  97.     regs.ax:=3;
  98.     Intr(RSInt,regs);
  99.   end;
  100. end;
  101.  
  102.  
  103.  
  104. { ----- Modem I/O Functions ----- }
  105.  
  106. Function RS232Avail: boolean;
  107.   { test whether a character is available in the input buffer }
  108. Begin
  109.   if DriverLoaded then begin
  110.     regs.ax:=4;
  111.     Intr(RSInt,regs);
  112.     RS232Avail:=(regs.bx=1);
  113.   end else RS232Avail:=false;
  114. end;
  115.  
  116.  
  117. Function RS232In: char;
  118.   { read next character from input buffer }
  119. Begin
  120.   regs.ax:=5;
  121.   Intr(RSInt,regs);
  122.   RS232In:=char(lo(regs.bx));
  123. end;
  124.  
  125.  
  126. Procedure RS232Out (c: char);
  127.   { write character to output buffer }
  128. Begin
  129.   regs.ax:=6;
  130.   regs.bx:=byte(c);
  131.   Intr(RSInt,regs);
  132. end;
  133.  
  134.  
  135. Procedure PauseOutput;
  136.   { if output buffering is on, pauses buffered output }
  137. Begin
  138.   if DriverLoaded then begin
  139.     regs.ax:=7;
  140.     Intr(RSInt,regs);
  141.   end;
  142. end;
  143.  
  144.  
  145. Procedure RestartOutput;
  146.   { resume buffered output after pausing }
  147. Begin
  148.   if DriverLoaded then begin
  149.     regs.ax:=8;
  150.     Intr(RSInt,regs);
  151.   end;
  152. end;
  153.  
  154.  
  155. Procedure ClearInputBuffer;
  156.   { clears the input buffer }
  157. Begin
  158.   if DriverLoaded then begin
  159.     regs.ax:=9;
  160.     Intr(RSInt,regs);
  161.   end;
  162. end;
  163.  
  164.  
  165. Procedure ClearOutputBuffer;
  166.   { clears the output buffer }
  167. Begin
  168.   if DriverLoaded then begin
  169.     regs.ax:=10;
  170.     Intr(RSInt,regs);
  171.   end;
  172. end;
  173.  
  174.  
  175. Function BufferEmpty: boolean;
  176.   { check if output buffer is empty }
  177. Begin
  178.   if DriverLoaded then begin
  179.     regs.ax:=11;
  180.     Intr(RSInt,regs);
  181.     BufferEmpty:=(regs.bx=1);
  182.   end else BufferEmpty:=true;
  183. end;
  184.  
  185.  
  186. Procedure WaitOut;
  187.   { wait until output buffer is empty }
  188. Begin
  189.   if DriverLoaded then begin
  190.     regs.ax:=12;
  191.     Intr(RSInt,regs);
  192.   end;
  193. end;
  194.  
  195.  
  196.  
  197. { ----- File Handlers ----- }
  198.  
  199. {$F+}
  200. Function RsFlush (var f: textrec): integer;
  201. Begin
  202.   RsFlush:=0;
  203. end;
  204.  
  205. Function RsClose (var f: textrec): integer;
  206. Begin
  207.   f.mode:=fmClosed;
  208.   RsClose:=0;
  209. end;
  210.  
  211. Function RsInput (var f: textrec): integer;
  212. Begin
  213.   with f do begin
  214.     bufptr^[0]:=RS232In;
  215.     bufend:=1;
  216.     bufpos:=0;
  217.   end;
  218.   RsInput:=0;
  219. end;
  220.  
  221.  
  222. Function RsOutput (var f: textrec): integer;
  223. Begin
  224.   with f do begin
  225.     RS232Out(bufptr^[0]);
  226.     bufpos:=0;
  227.   end;
  228.   RsOutput:=0;
  229. end;
  230.  
  231.  
  232. Function RsOpen (var f: textrec): integer;
  233. Begin
  234.   if (f.mode=fmInput)
  235.     then f.InOutFunc:=@RsInput
  236.     else f.InOutFunc:=@RsOutput;
  237.   f.FlushFunc:=@RsFlush;
  238.   f.CloseFunc:=@RsClose;
  239.   RsOpen:=0;
  240. end;
  241.  
  242.  
  243. Procedure AssignAUX (var f: text);
  244. Begin
  245.   with Textrec(f) do
  246.   begin
  247.     mode:=fmClosed;
  248.     bufsize:=1;
  249.     bufptr:=@Buffer;
  250.     OpenFunc:=@RsOpen;
  251.     name[0]:=#0;
  252.   end;
  253. end;
  254.  
  255.  
  256.  
  257. { ----- RS232 Initialization & Cleanup Code ----- }
  258.  
  259. Procedure RSinit (com: integer; speed: RSbaud; buffactor: integer; flow: boolean);
  260.   { initialize port; required only if port not already active }
  261. Begin
  262.   if driverloaded then begin
  263.     RSCom:=com;        { save port number }
  264.     if (rscom<>0) then begin
  265.       regs.ax:=0;
  266.       regs.bx:=com;
  267.       regs.cx:=ord(speed);
  268.       regs.dx:=buffactor;
  269.       regs.si:=word(flow);
  270.       Intr(RSInt,regs);
  271.     end;
  272.   end else RSCom:=0;
  273. end;
  274.  
  275.  
  276. Procedure RSCleanup;
  277.   { un-initialize port. should be used only if RSinit was used. }
  278. Begin
  279.   if (rscom<>0) then begin
  280.     regs.ax:=1;
  281.     Intr(RSInt,regs);
  282.   end;
  283.   rscom:=0;
  284. end;
  285.  
  286.  
  287. { ----- Searchlight Control Functions ----- }
  288.  
  289. Function GetPublicPtr: Pointer;
  290.   { get pointer to the SLBBS public data area. Returns NIL if not available }
  291. var p: pointer;
  292. Begin
  293.   if driverloaded then begin
  294.     regs.ax:=$C7;
  295.     regs.cx:=$00;
  296.     Intr(RSInt,regs);
  297.     if (regs.cx=SLBBSID)
  298.       then GetPublicPtr:=Ptr(regs.ax,regs.bx)
  299.       else GetPublicPtr:=Nil;
  300.   end else GetPublicPtr:=Nil;
  301. end;
  302.  
  303.  
  304. Procedure ComToggle;
  305.   { toggle BIOS COM support on/off }
  306. var save: pointer;
  307. Begin
  308.   if SLData<>nil then        { make sure Searchlight is loaded }
  309.     if SLData^.rsact then begin
  310.       GetIntVec($10,save);                       { read address of INT $10 }
  311.       SetIntVec($10,SLData^.OldVector[$10]);     { restore saved address }
  312.       SLData^.OldVector[$10]:=save;              { store retrieved address }
  313.       GetIntVec($16,save);
  314.       SetIntVec($16,SLData^.OldVector[$16]);     { repeat for INT $16 }
  315.       SLData^.OldVector[$16]:=save;
  316.     end;
  317. end;
  318.  
  319.  
  320. {$F+}
  321. Procedure ModemExit;
  322.   { cleanup procedure }
  323. Begin
  324.   System.ExitProc:=Modem.ExitSave;
  325.   RSCleanup;
  326. end;
  327. {$F-}
  328.  
  329.  
  330.  
  331. Begin   { ----- Unit Initialization ----- }
  332.  
  333.   GetIntVec($79,p);                     { check if slbbs driver available }
  334.   DriverLoaded:=(longint(p)=SLBBSID);
  335.   SLData:=GetPublicPtr;                 { get public data area pointer }
  336.  
  337.   rscom:=0;
  338.   AssignAux(AUXIn);    { prepare file oriented i/o functions }
  339.   AssignAux(AUXOut);
  340.   reset(AUXIn);
  341.   rewrite(AUXOut);
  342.  
  343.   Modem.Exitsave:=System.Exitproc;     { install cleanup procedure }
  344.   System.Exitproc:=@ModemExit;
  345.  
  346. end.