home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / visionix / vserlu.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-12-28  |  13.2 KB  |  452 lines

  1.  
  2. {
  3.  ════════════════════════════════════════════════════════════════════════════
  4.  
  5.  Visionix Serial Communictions LOW Unit (VSER)
  6.    Version 0.5
  7.  Copyright 1991,92,93 Visionix
  8.  ALL RIGHTS RESERVED
  9.  
  10.  ────────────────────────────────────────────────────────────────────────────
  11.  
  12.  revision history in reverse chronological order:
  13.  
  14.  Initials  Date      Comment
  15.  
  16.  ────────  ────────  ────────────────────────────────────────────────────────
  17.  
  18.  lpg       03/16/93  Added Source Documentation
  19.  
  20.  mep       02/11/93  Cleaned up code for beta release
  21.  
  22.  jrt       02/08/93  Sync with beta 0.12 release
  23.  
  24.  jrt       11/21/92  Sync with beta 0.08
  25.  
  26.  jrt       09/01/92  First logged revision.
  27.  
  28.  ────────────────────────────────────────────────────────────────────────────
  29. }
  30.  
  31. (*-
  32.  
  33. [TEXT]
  34.  
  35. <Overview>
  36.  
  37. This unit implements various low-level serial communication types and
  38. constants.
  39.  
  40. <Interface>
  41.  
  42. -*)
  43.  
  44.  
  45. Unit VSerLu;
  46.  
  47. Interface
  48.  
  49. CONST
  50.  
  51.   {-------------------------}
  52.   { Serial Driver Functions }
  53.   {-------------------------}
  54.  
  55.   {- driver control        } {* = Added on 12/06/93 }
  56.  
  57.   sdfDriverNew        = $01;
  58.  
  59.   sdfDriverOff        = $02;
  60.   sdfDriverOn         = $03;
  61.  
  62.   sdfDriverDispose    = $04;
  63.  
  64.   sdfActivate         = $05;
  65.   sdfDeActivate       = $06;
  66.  
  67.   {- comm param            }
  68.  
  69.   sdfSetCommParam     = $10;
  70.   sdfGetCommParam     = $11;
  71.  
  72.   {- flow control          }
  73.  
  74.   sdfGetFlowConType   = $20;
  75.   sdfSetFlowConType   = $21;
  76.   sdfTurnSendOnOff    = $22;
  77.   sdfTurnReceiveOnOff = $23;
  78.   sdfGetFlowConChars  = $24;
  79.   sdfSetFlowconChars  = $25;
  80.  
  81.   {- Line information      }
  82.  
  83.   sdfGetLineControl   = $30; {*}
  84.   sdfGetLineStatus    = $31; {*}
  85.  
  86.   {- Modem information     }
  87.  
  88.   sdfGetModemControl  = $40; {*}
  89.   sdfGetModemStatus   = $41; {*}
  90.  
  91.   sdfGetBothStatus    = $42; {*}
  92.  
  93.   {- Line/Modem change     }
  94.  
  95.   sdfDTROnOff         = $50;
  96.   sdfBreakOnOff       = $51;
  97.   sdfRTSOnOff         = $52; {*}
  98.  
  99.   {- Buffer management     }
  100.  
  101.   sdfFlushOutBuff     = $60;
  102.   sdfPurgeOutBuff     = $61;
  103.   sdfPurgeInBuff      = $62;
  104.  
  105.   sdfGetOutBuffInfo   = $63; {*}
  106.   sdfSetOutBuffInfo   = $64; {*}
  107.   sdfGetInBuffInfo    = $65; {*}
  108.   sdfSetInBuffInfo    = $66; {*}
  109.  
  110.   {- Event procedures      }
  111.  
  112.   sdfEventProcNew     = $70;
  113.   sdfEventProcOff     = $71;
  114.   sdfEventProcOn      = $72;
  115.   sdfEventProcDispose = $73;
  116.   sdfEventProcMaskSet = $74; {*}
  117.  
  118.   {- Input/Output          }
  119.  
  120.   sdfWriteCh          = $80;
  121.   sdfWriteBlock       = $81;
  122.   sdfReadCh           = $82;
  123.   sdfReadBlock        = $83;
  124.   sdfPeekCh           = $84; {*}
  125.  
  126.   {-}
  127.  
  128.  
  129.  
  130.   {----------------------------------------}
  131.   { Modem Status Register status bits (AL) }
  132.   {----------------------------------------}
  133.  
  134.   MSRctsDelta = $01; { Clear To Send changed                                 }
  135.                      { Delta CTS - not reliable                              }
  136.   MSRdsrDelta = $02; { Data Set Ready changed                                }
  137.                      { Delta DSR - not reliable                              }
  138.   MSRriDelta  = $04; { Ring Indicate changed                                 }
  139.                      { Delta DCD - not reliable                              }
  140.   MSRcdDelta  = $08; { Carrier Detect changed                                }
  141.                      { always set to 1 upon return (DUMMY DCD)               }
  142.   MSRcts      = $10; { Clear To Send                                         }
  143.                      { CTS - DCE sets - do not xmit until true               }
  144.   MSRdsr      = $20; { Data Set Ready                                        }
  145.                      { DSR - modem is ready to be used                       }
  146.   MSRri       = $40; { Ring Indicate                                         }
  147.                      { RI - only on during active voltage signal             }
  148.   MSRcd       = $80; { Carrier Detect                                        }
  149.                      { DCD - data carrier detect                             }
  150.  
  151.   {---------------------------------------}
  152.   { Line Status Register status bits (AH) }
  153.   {---------------------------------------}
  154.  
  155.   LSRRcvReady = $01; { Received data ready                                   }
  156.                      { RDA  - input data is available in buffer              }
  157.   LSROverrun  = $02; { OverRun error                                         }
  158.                      { OVRN - the input buffer has been overrun              }
  159.   LSRParity   = $04; { Parity error                                          }
  160.                      { Reserved (Parity error in BIOS INT 14h)               }
  161.   LSRFrame    = $08; { Framing error                                         }
  162.                      { Reserved (Framing error in BIOS INT 14h)              }
  163.   LSRBreak    = $10; { Break detected                                        }
  164.                      { Reserved (Break detect in BIOS INT 14h)               }
  165.   LSRXhReady  = $20; { Transmit hold register empty                          }
  166.                      { THRE - room is available in output buffer             }
  167.   LSRXsReady  = $40; { Transmit shift register empty                         }
  168.                      { TSRE - output buffer is empty                         }
  169.   LSRTimeout  = $80; { Timeout (software implemented).  If true,             }
  170.                      { then none of the above 15 bits are valid.             }
  171.  
  172.   {-----------------------------}
  173.   { Modem Control Register bits }
  174.   {-----------------------------}
  175.  
  176.   MCRDtr      = $1; { Data terminal ready                                    }
  177.   MCRRts      = $2; { Request to send                                        }
  178.   MCROut1     = $4; { Out1: software implemented output                      }
  179.   MCROut2     = $8; { Out2: as Out1 with interrupts to system-bus            }
  180.   MCRLoop     = $10;{ Loopback test mode                                     }
  181.  
  182.   {----------------------------}
  183.   { Line Control Register bits }
  184.   {----------------------------}
  185.  
  186.   LCRdatabits = $1; { Bits/character (databits) - bits 1-0                   }
  187.   LCRstopbits = $4; { Stop bits of character                                 }
  188.   LCRparity   = $8; { Parity - bits 5-3                                      }
  189.   LCRbreak    = $20;{ Enable break status                                    }
  190.   LCRdivisor  = $40;{ Enable addressing of baudrate divisor registers        }
  191.  
  192.   {----------------------------------------}
  193.   { Interrupt Identification Register bits }
  194.   {----------------------------------------}
  195.  
  196.   IIRReady    = $1; { Interrupt waiting status                               }
  197.  
  198.   {---------------------------}
  199.   { Interrupt Enable Register }
  200.   {---------------------------}
  201.  
  202.   IEREnabRE   = $1; { Enable read (receive data) interrupt status            }
  203.   IEREnabWI   = $2; { Enable write (transmit empty) register interrupt       }
  204.   IEREnabLSR  = $4; { Enable line status interrupt                           }
  205.   IEREnabMSR  = $8; { Enable delta modem status interrupt                    }
  206.  
  207.   {------------------------------------------------------}
  208.   { Serial Registers - These are the offsets from IOPort }
  209.   {------------------------------------------------------}
  210.  
  211.   DLL = 0;  { Divisor Latch Least-significant-byte (LCR bit $80 on)          }
  212.   DLM = 1;  { Divisor Latch Most-significant-byte (LCR bit $80 on)           }
  213.   RBR = 0;  { Receiver Buffer Register (read)                                }
  214.   THR = 0;  { Transmitter Holding Register (write)                           }
  215.   IER = 1;  { Interrupt Enable Register                                      }
  216.   IIR = 2;  { Interrupt Identification Register (read only)                  }
  217.   LCR = 3;  { Line Control Register                                          }
  218.   MCR = 4;  { Modem Control Register  (see above)                            }
  219.   LSR = 5;  { Line Status Register  (see above)                              }
  220.   MSR = 6;  { Modem Status Register  (see above)                             }
  221.   SPR = 7;  { 8250 Scratch Pad Register                                      }
  222.  
  223.   {------------------------}
  224.   { MISCELLANOUS CONSTANTS }
  225.   {------------------------}
  226.  
  227.   IMR      = $21; { Port address of the Interrupt Mask Register              }
  228.  
  229. Type
  230.  
  231.   {------------------------------------}
  232.   { communications parameter structure }
  233.   {------------------------------------}
  234.  
  235.   TCommParam = RECORD
  236.  
  237.     BaudRate  : LONGINT;
  238.     Parity    : CHAR;
  239.     DataBits  : BYTE;
  240.     StopBits  : BYTE;
  241.  
  242.   END;
  243.  
  244.   PCommParam = ^TCommParam;
  245.  
  246.   {------------------------}
  247.   { Serial Event procedure }
  248.   {------------------------}
  249.  
  250.   TSerEventProc = Procedure( Event : LONGINT;
  251.                              Param1,Param2,Param3:LONGINT );
  252.  
  253.   PSerEventProc = ^TSerEventProc;
  254.  
  255.  
  256.   {--------------------}
  257.   { Serial buffer info }
  258.   {--------------------}
  259.  
  260.   TSerBuffInfo = RECORD
  261.  
  262.     Size       : LONGINT;
  263.     Used       : LONGINT;
  264.     Free       : LONGINT;
  265.  
  266.     Changeable : BOOLEAN;
  267.  
  268.   END;
  269.  
  270.   PSerBuffInfo = ^TSerBuffInfo;
  271.  
  272.  
  273.   {------------------------------------------------}
  274.   { Serial driver packet / serial driver procedure }
  275.   {------------------------------------------------}
  276.  
  277.   PSerDriverPacket = ^TSerDriverPacket;
  278.   TSerDriverProc   = Procedure( SDPacket : PSerDriverPacket );
  279.   PSerDriverProc   = ^TSerDriverProc;
  280.  
  281.   TSerDriverPacket = RECORD
  282.  
  283.     Func            : WORD;
  284.     IData           : POINTER;
  285.     SerDriverProc   : TSerDriverProc;
  286.     DriverInfo1     : LONGINT;
  287.     DriverInfo2     : LONGINT;
  288.     DriverInfo3     : LONGINT;
  289.  
  290.     CommParam       : PCommParam;
  291.     FlowConType     : INTEGER;
  292.     OnOff           : BOOLEAN;
  293.     Status          : LONGINT;
  294.     Error           : LONGINT;
  295.     Flags           : LONGINT;
  296.     Timeout         : LONGINT;
  297.  
  298.     BuffInfo        : TSerBuffInfo;
  299.  
  300.   { EventProc       : TSerEventProc;
  301.     EventMask       : WORD;
  302.     EventProcInfo   : POINTER;
  303.     EventProcHandle : TSerEventProcHandle; }
  304.  
  305.     Ch              : CHAR;
  306.     Buf             : POINTER;
  307.     Count           : LONGINT;
  308.     Result          : LONGINT;
  309.  
  310.     Val             : LONGINT;
  311.  
  312.   END;
  313.  
  314.   {----------------------}
  315.   { Event procedure list }
  316.   {----------------------}
  317.  
  318.   PSerEventProcList = ^TSerEventProcList;
  319.  
  320.   TSerEventProcList = RECORD
  321.  
  322.     EventProc       : TSerEventProc;
  323.     Next            : PSerEventProcList;
  324.  
  325.   END;
  326.  
  327.   {--------------------------}
  328.   { Serial channel structure }
  329.   {--------------------------}
  330.  
  331.   TSerChan = RECORD
  332.  
  333.     Sig              : WORD;
  334.     SerDriverProc    : TSerDriverProc;
  335.     SerDriverID      : POINTER;
  336.   { EventProcList    : ... }
  337.  
  338.     WriteFlags       : LONGINT;
  339.     WriteTimeout     : LONGINT;
  340.     ReadFlags        : LONGINT;
  341.     ReadTimeout      : LONGINT;
  342.     ErrorCh          : CHAR;
  343.  
  344.     SDP              : TSerDriverPacket;
  345.  
  346.   END;
  347.  
  348.   PSerChan = ^TSerChan;
  349.  
  350.  
  351.  
  352.   {---------------------------------------}
  353.   { Serial channel capabilities structure }
  354.   {---------------------------------------}
  355.  
  356.  
  357.   TSerCaps = RECORD
  358.  
  359.     CanDoEventProcs  : BOOLEAN;   { This serial channel supports EVENTS }
  360.     CanChangeInBuff  : BOOLEAN;   { INPUT buffer size can be changed    }
  361.     CanChangeOutBuff : BOOLEAN;   { OUTPUT buffer size can be changed   }
  362.     CanControlRTS    : BOOLEAN;   { RTS can be manually raised/lowered  }
  363.  
  364.   END;
  365.  
  366.   PSerCaps = ^TSerCaps;
  367.  
  368.  
  369. {────────────────────────────────────────────────────────────────────────────}
  370.  
  371. (*
  372. Procedure VSerLowBIOSInfo(             ComPort       : BYTE;
  373.                                    Var IOPort        : WORD;
  374.                                    Var IRQ           : BYTE;
  375.                                    Var IntNo         : BYTE    );
  376.  
  377. *)
  378.  
  379. Implementation
  380.  
  381. {────────────────────────────────────────────────────────────────────────────}
  382.  
  383. (*-
  384.  
  385. [FUNCTION]
  386.  
  387. Procedure VSerLowBIOSInfo(             ComPort       : BYTE;
  388.                                    Var IOPort        : WORD;
  389.                                    Var IRQ           : BYTE;
  390.                                    Var IntNo         : BYTE    );
  391.  
  392. [PARAMETERS]
  393.  
  394. ComPort     Communications Port Number
  395. IOPort      VAR Returned IO Port Number
  396. IRQ         VAR Returned IRQ Number
  397. IntNo       VAR Returned Interrupt Number
  398.  
  399. [RETURNS]
  400.  
  401. Function : None
  402. (VAR     : [IOPort] IO Port Number)
  403. (VAR     : [IRQ] Returned IRQ Number)
  404. (VAR     : [IntNo] Returned Interrupt Number)
  405.  
  406. [DESCRIPTION]
  407.  
  408. [SEE-ALSO]
  409.  
  410. [EXAMPLE]
  411.  
  412. -*)
  413.  
  414. (*
  415. Procedure VSerLowBIOSInfo(             ComPort       : BYTE;
  416.                                    Var IOPort        : WORD;
  417.                                    Var IRQ           : BYTE;
  418.                                    Var IntNo         : BYTE    );
  419.  
  420.  
  421. {$IFNDEF OS2}
  422. Var
  423.  
  424.   BIOSAsyncTable : Array[1..4] of WORD absolute $40:$00;
  425.  
  426. BEGIN
  427.  
  428.   {------------------------}
  429.   { Setup port information }
  430.   {------------------------}
  431.  
  432.   IOPort := BIOSAsyncTable[ComPort];
  433.   IRQ    := Hi(IOPort) + 1;
  434.   IntNo  := Hi(IOPort) + 9;
  435.  
  436. END; { VSerLowBIOSInfo }
  437. {$ELSE}
  438.  
  439. BEGIN
  440.  {!^!}
  441. END;
  442.  
  443. {$ENDIF}
  444.  
  445. *)
  446.  
  447. {────────────────────────────────────────────────────────────────────────────}
  448. {────────────────────────────────────────────────────────────────────────────}
  449. {────────────────────────────────────────────────────────────────────────────}
  450.  
  451. BEGIN
  452. END.