home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / NEWS / 554 / JUIN / EASYFOS.PAS < prev    next >
Pascal/Delphi Source File  |  1993-10-07  |  18KB  |  581 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 724 of 726                                                               
  3. From : John Fulton                         1:355/515.0          27 Jun 93  18:17 
  4. To   : Jim Coyle                                                                 
  5. Subj : Fossil Unit <1/3>                                                      
  6. ────────────────────────────────────────────────────────────────────────────────
  7. On 24 Jun 93 15:58:00, Jim Coyle Was philosiphizing
  8. To Eric Givler The following|*:
  9.  
  10. EG>  e) Also found someone interested in helping!
  11. JC> 
  12. JC> I might be interested in helping! I wrote my own BBS from the Telegard 2.5i
  13. JC> source and its getting pretty big. Has almost all of the stuff Renegade has
  14. JC> (if you are familure with the two). I don't run it though. Right now I am 
  15. JC> looking for some good fossil routines, ya know where I might be able to get
  16. JC> some? I could write my own if I have the format.
  17.  
  18. All of the fossil specs are included with X00... It's pretty simple to write 
  19. one, and I have one here that I wrote. It's pretty basic, and there are a lot 
  20. of functions supported by the fossil that I left out because at the time, I 
  21. didn't need them. But it should give you a general overview of how a fossil is
  22. written, and mine is VERY clearly documented in the source. I hate it when
  23. others post source but never any specs on the routines. Takes weeks to figure
  24. it out <G>..
  25.                             O  /
  26. ----------------------------->< CUT ---------------------------------------
  27.                             O  \}
  28. Unit EasyFos;
  29.  
  30. {        Easy Fossil v1.0 by John Fulton June 1, 1993
  31.       Copyright (c) 1993 John Fulton. All Rights Reserved.}
  32.  
  33. INTERFACE
  34. Function InitializeFossil(ComPort:Word):Boolean;
  35.   {Function InitializeFossil must be run first to detect if
  36.    a fossil driver exists, and if so, to initialize it. If the
  37.    fossil exists, and if the initialization was successful, then
  38.    it returns True, else it returns False}
  39. Procedure SetBaudRate(ComPort:Word;Baud:Word;Parity:Char;
  40.                       CharLength:Byte;StopBits:Byte);
  41.   {Procedure SetBaudRate takes ComPort number (in each procedure and 
  42.    function, I subtract 1 from this figure to get the actual fossil
  43.    Port number, so if you want COM1, then enter 1, not 0), Baud rates
  44.    300,1200,2400,4800,9600,19200, and 38400 (these baud reats are limited
  45.    not by my programming, but by the fossil driver itself, probally in
  46.    the next revision, support for 300, and 1200 will be dropped for
  47.    2 higher baud rates), Parity as a Charaster either N,n,O,o,E,or e,
  48.    Character length from 5-8, and Stopbits either 1 or 2. Most common
  49.    operation is N,8,1 (or n,8,1).}
  50. Function CarrierDetect(ComPort:Word):Boolean;
  51.   {Returns True if a carrier is detected, False if not.}
  52. Procedure SendCharWait(ComPort:Word;CharToSend:Char);
  53.   {Sends a character into the fossil buffer to be transmitted. If
  54.    there is no room in the buffer, then the procedure waits until
  55.    it can send it. DANGEROUS with Flow control on, See Flow Procedure.}
  56. Function SendChar(ComPort:Word;CharToSend:Char):Boolean;
  57.   {Sends a character into the fossil buffer. If the buffer is full,
  58.    then it returns immediatly with False. If able to transmit the character
  59.    then it returns True.}
  60. Function CharAvail(ComPort:Word):Boolean;
  61.   {Returns True is a character is in the buffer waiting to be recieved.
  62.    False if not.}
  63. Function GetChar(ComPort:Word):Char;
  64.   {Retrives a character from the Fossil Buffer. If no character Available,
  65.    then the Function waits for one. DANGEROUS with Flow control on, See
  66.    Flow Procedure.}
  67. Procedure UnInitializeFossil(ComPort:Word); 
  68.   {UnInitializes the Fossil driver for that particular COM port. Does
  69.    NOT drop DTR, so will not hang up.}
  70. Procedure LowerDTR(ComPort:Word);
  71.   {Lower the Data Terminal Ready on the modem. On most modems, will cause
  72.    carrier to drop.}
  73. Procedure RaiseDTR(ComPort:Word);
  74.   {Raises the Data Terminal Ready. This is required before any communications
  75.    can occur between the modem, and computer.}
  76. Function Hangup(Comport:Word):Boolean;
  77.   {Will drop DTR, and then reraise it. If there still is a carrier, then
  78.    it will send +++, wait for a second, and then send ATH0. If
  79.    there is still a carrier, then the function returns False.}
  80. Procedure SendString(ComPort:Word;StrToSend:String;CRLF:Boolean); 
  81.    {This will send a string of characters (up to 255 characters) and if
  82.     True is passed to the CRLF varible, the Procedure will add a
  83.     Carrige Return, and a Line Feed on the end of the String. Using
  84.     the SendCharWait Procedure. So IF CRLF is set to TRUE, then there
  85.     is a hazard if Flow control is turned on. See the Flow Procedure.
  86.     If you wish, you could just append a #13#10 to the end of your
  87.     string. I didn't do that just in case if you had a 255 character
  88.     string.}
  89. Procedure GetString(ComPort:Word;StrToGet:String;Count:Word); 
  90.    {Will retrive up to Count amount of characters from the fossil buffer.
  91.     if you specify more characters than the buffer holds, then it will send
  92.     all available characters, and pass control back to the program. It will
  93.     NOT wait for more characters. You can specify up to over 64000 because
  94.     the varible Count is a word, BUT since a String haold a MAXIMUM of 255
  95.     characters, IF you specify over 255, it Will over-write parts of memory,
  96.     AND is potentially dangerous if a piece of your code is there when it
  97.     over-writes. In this case, I have specified, that IF you have specified
  98.     over 255, I have written it to only do 255.}
  99. Procedure WaitForEmptyOutBuffer(ComPort:Word);
  100.    {This Procedure will cause your program to pause until ALL data being
  101.     sent is cleared out of the Fossil buffer. DANGEROUS with Flow control
  102.     on, See Flow Procedure.}
  103. Procedure PurgeOutBuffer(ComPort:Word);
  104.    {This Procedure IMMEDIATLY purges all characters remaining in the Outbound
  105.     transmit buffer, and immediatly returns control back to the program.
  106.     Can be used with Flow control. All characters in buffer will be lost.}
  107. Procedure PurgeInBuffer(ComPort:Word);
  108.    {This Procedure IMMEDIATLY purgues all incoming characters from the
  109.     Inbound recieve buffer, and immediatly returns control back to the 
  110. program.
  111.     This one again can be used with flow, and all incoming characters are 
  112. lost}
  113. Procedure WatchdogOn(ComPort:Word);
  114.    {Turns Watchdog on on the fossil driver. If the fossil detects a carrier
  115.     loss while Watchdog is on, it will reboot the computer. Great for use in
  116.     conjunction with non-carrier detecting doors}
  117. Procedure WatchdogOff(ComPort:Word);
  118.    {Releases Watchdog carrier detection}
  119. Procedure Flow(ComPort:Word; SoftR,SoftT,Hard:Boolean);
  120.    {Flow control is used for high speed modems to tell each other
  121.     to slow down when too much data is being sent over the lines.
  122.  
  123.     Flow control is dangerous to use is certain instances, so it must at
  124.     some times be turned off.
  125.  
  126.     Set SoftR to True to enables the sending of an XOFF when the recieving
  127.       buffer is near full.
  128.     Set SoftT to True to enable detection of XOFF while sending data.
  129.     Set Hard to True to enable CTS/RTS flow control which handles both sending
  130.       and recieving flow control. CTS on transmit, and RTS on recieve
  131.  
  132.     Flow is mostly used during disk writes, and should be shut off 
  133.     totally before certain procedures where if software flow (XON/XOFF)
  134.     is used, it might hang the transfer. They are marked for you in
  135.     thier descriptions as DANGEROUS.
  136.  
  137.     It should be safe to just use Hard flow control alone, as this flow is
  138.     dictated by the modems, and cannot be affected by the data being
  139.     transfered. I never was able to transmit data fast enough to run into
  140.     this problem, so am not positive as to the truth of this.}
  141. Procedure ColdBoot;
  142.   {Will attempt to ColdBoot the computer. May not work on some systems.}
  143. Procedure WarmBoot;
  144.   {Will attempt to WarmBoot the computer. May not work on some systems.}
  145. Procedure StartBreak(ComPort:Word);
  146.   {Starts sending a Break signal. This resets all flow control restraints
  147.    you must Stop the Break signal with either StopBreak, InitializeFossil,
  148.    or UnInitializeFossil procedures}
  149. Procedure StopBreak(ComPort:Word);
  150.   {Stops sending the Break Signal}
  151. Procedure SendBreak(ComPort:Word);
  152.   {Sends a 350 millisecond Break signal}
  153. Function GetStatus(ComPort:Word):Word;
  154.   {Returns a Word containg the status of the specified port. The Word
  155.    Contains the following information:
  156.  
  157.    Bit 0 if 1 then input data is available in buffer
  158.    Bit 1 if 1 then input buffer overrun
  159.    Bit 2 N/A
  160.    Bit 3 N/A
  161.    Bit 4 N/A
  162.    Bit 5 if 1 then room is available in output buffer
  163.    Bit 6 if 1 then output buffer is empty
  164.    Bit 7 N/A
  165.  
  166.    Bit 0 N/A
  167.    Bit 1 N/A
  168.    Bit 2 N/A
  169.    Bit 3 is always 1 (enables programs to use it for carrier for null modem)
  170.    Bit 4 N/A
  171.    Bit 5 N/A
  172.    Bit 6 N/A
  173.    Bit 7 if 1 then Carrier Detect
  174.  
  175.    The first set is the High bit (0000 0000 1111 1111) the second is the
  176.    low bit (1111 1111 0000 0000). Hope you can figure it out, and hope
  177.    you enjoy my fossil routines. 75% of the coding is in assembler for
  178.    speed.}
  179.  
  180. CONST
  181.   ParityOdd  = $08; {0000 1000 \ }
  182.   ParityEven = $18; {0001 1000  > Parity, used during Baud Rate 
  183. Initialization}
  184.   ParityNone = $00; {0000 0000 / }
  185.  
  186.   Char5  = $00; {0000 0000 \ }
  187.   Char6  = $01; {0000 0001  \Used during Baud Rate Initialization. Sets }
  188.   Char7  = $02; {0000 0010  /the modem's character bits                 }
  189.   Char8  = $03; {0000 0011 / }
  190.  
  191.   StopBit1 = $00; {0000 0000  Stop bits, what else?                }
  192.   StopBit2 = $04; {0000 0100  Used during Baud Rate Initialization }
  193.  
  194.   B300    = $40; {0100 0000 \   }
  195.   B600    = $60; {0110 0000  \  }
  196.   B1200   = $80; {1000 0000   \ }
  197.   B2400   = $A0; {1010 0000    \ The Baud reat bits needed for initialization 
  198. }
  199.   B4800   = $C0; {1100 0000    / of the baud rate                             
  200. }
  201.   B9600   = $F0; {1110 0000   / }
  202.   B19200  = $00; {0000 0000  /  }
  203.   B38400  = $20; {0010 0000 /   }
  204.   CDS     = $80; {1000 0000  Carrier Detect Signal Bit used by Status bits }
  205.   OutRoom = $20; {0001 0000  Used in conjunction with the Status Bits,
  206.                              Detects if there is room in the output buffer
  207.                              to send more info into the buffer}
  208.   CA      = $01; {0000 0001  Used in conjunction with the Status Bits,
  209.                              Detects if there is a character waiting to be
  210.                              recieved}
  211.  
  212.   SoftFlowR= $08; {0000 1000 Enables a watch for XOFF while sending data}
  213.   SoftFlowT= $01; {0000 0001 Enables a send of XOFF when buffer near full}
  214.   HardFlow = $02; {0000 0010 Enables CTS/RTS which handles both}
  215.  
  216. IMPLEMENTATION 
  217. Uses CRT;
  218.  
  219. Function InitializeFossil(ComPort:Word):Boolean;
  220. VAR
  221.   Result : Word;
  222. BEGIN
  223.   ASM
  224.     Sub ComPort,1
  225.     Mov DX,ComPort
  226.     Int 14h
  227.     Mov Result,AX
  228.   END;
  229.   InitializeFossil := Result = $1954;
  230. END;
  231.  
  232. Procedure SetBaudRate(ComPort:Word;Baud:Word;Parity:Char;
  233.                       CharLength:Byte;StopBits:Byte);
  234. VAR
  235.   Parameters  : Byte;
  236. BEGIN 
  237.   CASE Baud of 
  238.     300   : Parameters := B300;
  239.     600   : Parameters := B600;
  240.     1200  : Parameters := B1200;
  241.     2400  : Parameters := B2400;
  242.     4800  : Parameters := B4800;  
  243.     9600  : Parameters := B9600;  
  244.     19200 : Parameters := B19200;
  245.     38400 : Parameters := B38400;
  246.   End; 
  247.   CASE Parity of
  248.     'N','n' : Parameters := Parameters OR ParityNone;
  249.     'E','e' : Parameters := Parameters OR ParityEven;
  250.     'O','o' : Parameters := Parameters OR ParityOdd;
  251.   END;
  252.   CASE CharLength of
  253.     5 : Parameters := Parameters OR Char5;
  254.     6 : Parameters := Parameters OR Char6;
  255.     7 : Parameters := Parameters OR Char7;
  256.     8 : Parameters := Parameters OR Char8;
  257.   END;
  258.   CASE StopBits of
  259.     1 : Parameters := Parameters OR StopBit1;
  260.     2 : Parameters := Parameters OR StopBit2;
  261.   END;
  262.   ASM
  263.     Sub ComPort,1
  264.     Mov AH,00h
  265.     Mov AL,Parameters
  266.     Mov DX,ComPort
  267.     Int 14h
  268.   END;
  269. END;
  270.  
  271. Function CarrierDetect(ComPort:Word) : Boolean;
  272. VAR
  273.   Status : Byte;
  274. BEGIN
  275.   ASM
  276.     Sub ComPort,1
  277.     Mov DX,ComPort
  278.     Mov AH,03h
  279.     Int 14h
  280.     Mov Status,AL
  281.   END;
  282.   CarrierDetect := (Status AND CDS) = CDS;
  283. END;
  284.  
  285. Procedure SendCharWait(ComPort:Word;CharToSend:Char);
  286. VAR
  287.   CharOrdinal : Byte;
  288. BEGIN
  289.   CharOrdinal := Ord(CharToSend);
  290.   ASM
  291.     Sub ComPort,1
  292.     Mov DX,ComPort
  293.     Mov AL,CharOrdinal
  294.     Mov AH,01h
  295.     Int 14h
  296.   END;
  297. END;
  298.  
  299. Function SendChar(ComPort:Word;CharToSend:Char):Boolean;
  300. VAR
  301.   CharOrdinal   : Byte;
  302.   Success       : Word;
  303. BEGIN
  304.   CharOrdinal := Ord(CharToSend);
  305.   ASM
  306.     Sub ComPort,1
  307.     Mov DX,ComPort
  308.     Mov AL,CharOrdinal
  309.     Mov AH,0Bh
  310.     Int 14h
  311.     Mov Success,AX
  312.   END;
  313.   If Success >= 1 then
  314.     SendChar := True
  315.   ELSE
  316.     SendChar := False;
  317. END;
  318.  
  319. Function CharAvail(ComPort:Word):Boolean;
  320. VAR
  321.   Status : Byte;
  322. BEGIN
  323.   ASM
  324.     Sub ComPort,1
  325.     Mov DX,ComPort
  326.     Mov AH,03h
  327.     Int 14h
  328.     Mov Status,AH
  329.   END;
  330.   CharAvail := (Status AND CA) = CA;
  331. END;
  332.  
  333. Function GetChar(ComPort:Word):Char;
  334. VAR
  335.   CharRecieved : Byte;
  336. BEGIN
  337.   ASM
  338.     Sub ComPort,1
  339.     Mov DX,ComPort
  340.     Mov AH,02h
  341.     Int 14h
  342.     Mov CharRecieved,AL
  343.   END;
  344.   GetChar := Chr(CharRecieved);
  345. END;
  346.  
  347. Procedure UnInitializeFossil(ComPort:Word); Assembler;
  348. ASM
  349.   Sub ComPort,1
  350.   Mov DX,ComPort
  351.   Mov AH,05
  352.   Int 14h
  353. END;
  354.  
  355. Procedure LowerDTR(ComPort:Word); Assembler;
  356. ASM
  357.   Sub ComPort,1
  358.   Mov DX,ComPort
  359.   Mov AH,06h
  360.   Mov AL,00h
  361.   Int 14h
  362. END;
  363.  
  364. Procedure RaiseDTR(ComPort:Word); Assembler;
  365. ASM
  366.   Sub ComPort,1
  367.   Mov DX,ComPort
  368.   Mov AH,06h
  369.   Mov AL,01h
  370.   Int 14h
  371. END;
  372.  
  373. Function Hangup(Comport:Word):Boolean;
  374. VAR
  375.   Status : Byte;
  376. BEGIN
  377.   LowerDTR(Comport);
  378.   delay (600);
  379.   RaiseDTR(Comport);
  380.   ASM
  381.     Sub ComPort,1
  382.     Mov DX,ComPort
  383.     Mov AH,03h
  384.     Int 14h
  385.     Mov Status,AL
  386.   END;
  387.   If ((Status AND CDS) = CDS) Then
  388.     BEGIN
  389.       Flow(ComPort+1,False,False,False);
  390.       SendString(Comport+1,'+++',False);
  391.       delay(1000);
  392.       SendString(Comport+1,'ATH0',True);
  393.       delay(1000);
  394.       ASM
  395.         Mov DX,ComPort
  396.         Mov AH,03h
  397.         Int 14h
  398.         Mov Status,AL
  399.       END;
  400.     END;
  401.   HangUp := not ((Status AND CDS) = CDS)
  402. END;
  403.  
  404. Procedure SendString(ComPort:Word;StrToSend:String;CRLF:Boolean);
  405. VAR 
  406.   StrSeg,
  407.   StrOfs,
  408.   StrLgn : Word; 
  409. BEGIN
  410.   StrLgn := Length(StrToSend);
  411.   StrSeg := Seg(StrToSend);
  412.   StrOfs := Ofs(StrToSend)+1;
  413.   ASM
  414.     Sub ComPort,1
  415.     Mov DX,ComPort
  416.     Mov CX,StrLgn
  417.     Mov ES,StrSeg
  418.     Mov DI,StrOfs
  419.     Mov AH,19h
  420.     Int 14h
  421.   END;
  422.   If CRLF Then
  423.     BEGIN
  424.       SendCharWait(ComPort+1,#13);
  425.       SendCharWait(ComPort+1,#10);
  426.     END;
  427. END; 
  428.  
  429. Procedure GetString(ComPort:Word;StrToGet:String;Count:Word); 
  430. VAR 
  431.   StrSeg,
  432.   StrOfs,
  433.   CharsGot  : Word; 
  434. BEGIN
  435.   If Count > 255 then Count := 255;
  436.   StrSeg := Seg(StrToGet);
  437.   StrOfs := Ofs(StrToGet)+1;
  438.   ASM
  439.     Sub ComPort,1
  440.     Mov DX,ComPort
  441.     Mov CX,Count
  442.     Mov ES,StrSeg
  443.     Mov DI,StrOfs
  444.     Mov AH,18h
  445.     Int 14h
  446.     Mov CharsGot,AX
  447.   END;
  448.   StrToGet[0] := Chr(CharsGot);
  449. END; 
  450.  
  451. Procedure WaitForEmptyOutBuffer(ComPort:Word); Assembler;
  452. ASM
  453.   Sub ComPort,1
  454.   Mov AH,08h
  455.   Mov DX,ComPort
  456.   Int 14h
  457. END;
  458.  
  459. Procedure PurgeOutBuffer(ComPort:Word); Assembler;
  460. ASM
  461.   Sub ComPort,1
  462.   Mov AH,09h
  463.   Mov DX,ComPort
  464.   Int 14h
  465. END;
  466.  
  467. Procedure PurgeInBuffer(ComPort:Word); Assembler;
  468. ASM
  469.   Sub ComPort,1
  470.   Mov DX,ComPort
  471.   Mov AH,0Ah
  472.   Int 14h
  473. END;
  474.  
  475. Procedure WatchdogOn(ComPort:Word); Assembler;
  476. ASM
  477.   Sub ComPort,1
  478.   Mov DX,ComPort
  479.   Mov AL,01h
  480.   Mov AH,14h
  481.   Int 14h
  482. END;
  483.  
  484. Procedure WatchdogOff(ComPort:Word); Assembler;
  485. ASM
  486.   Sub ComPort,1
  487.   Mov DX,ComPort
  488.   Mov AL,00h
  489.   Mov AH,14h
  490.   Int 14h
  491. END;
  492.  
  493. Procedure Flow(ComPort:Word; SoftR,SoftT,Hard:Boolean);
  494. VAR
  495.   FlowBit : Byte;
  496. BEGIN
  497.   FlowBit := $F0; {High nibble toggled all on for compatibility with certain
  498.                    Fossil Drivers}
  499.   If SoftT then FlowBit := FlowBit + SoftFlowT;
  500.   If SoftR then FlowBit := FlowBit + SoftFlowR;
  501.   If Hard  then FlowBit := FlowBit + HardFlow;
  502.   ASM
  503.     Sub ComPort,1
  504.     Mov DX,ComPort
  505.     Mov AL,FlowBit
  506.     Mov AH,0Fh
  507.     Int 14h
  508.   END;
  509. END;
  510.  
  511. Procedure ColdBoot; Assembler;
  512. ASM
  513.   Mov AL,00h
  514.   Mov AH,17h
  515.   Int 14h
  516. END;
  517.  
  518. Procedure WarmBoot; Assembler;
  519. ASM
  520.   Mov AL,01h
  521.   Mov AH,17h
  522.   Int 14h
  523. END;
  524.  
  525. Procedure StartBreak(ComPort:Word); Assembler;
  526. ASM
  527.   Sub ComPort,1
  528.   Mov DX,ComPort
  529.   Mov AH,1Ah
  530.   Mov AL,01h
  531.   Int 14h
  532. END;
  533.  
  534. Procedure StopBreak(ComPort:Word); Assembler;
  535. ASM
  536.   Sub ComPort,1
  537.   Mov DX,ComPort
  538.   Mov AH,1Ah
  539.   Mov AL,00h
  540.   Int 14h
  541. END;
  542.  
  543. Procedure SendBreak(ComPort:Word);
  544. BEGIN
  545.   StartBreak(ComPort);
  546.   Delay(350);
  547.   StopBreak(ComPort);
  548. END;
  549.  
  550. Function GetStatus(ComPort:Word):Word;
  551. VAR
  552.   Status:Word;
  553. BEGIN
  554.   ASM
  555.     Sub ComPort,1
  556.     Mov DX,ComPort
  557.     Mov AH,03h
  558.     Int 14h
  559.     Mov Status,AX
  560.   END;
  561.   GetStatus := Status;
  562. END;
  563.  
  564. BEGIN
  565.   Writeln('       Easy Fossil written by John Fulton. June 1, 1993.');
  566.   Writeln('      Copyright (c) 1993 John Fulton. All Rights Reserved.');
  567.   Writeln('            This message removed with registration.');
  568.   Delay(500);
  569. END.
  570.  
  571.                               O  /
  572. ------------------------------->< CUT --------------------------------------
  573.                               O  \
  574.  
  575. Finally finished... You can probally remove the delay at the end... I was 
  576. planning on distributing it, but with as many better fossil units out there. I
  577. probally wouldn't get much for it, and I don't have the time to revamp it and 
  578. make it better. I had planned on making it all in ASM, but have other projects
  579. to work on... Hope you enjoy it, and hope it'll help you create your own.. You
  580. can modify and use this one, and don't worry about putting my name in it. I 
  581. have many other things that are better quality..