Metropoli BBS
VIEWER: term32.pas MODE: TEXT (CP437)
{█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█}
{█                                                       █}
{█      Virtual Pascal Examples. Version 1.10            █}
{█        Communication via device driver                █}
{█        The Art Of OS/2, Chapter 8,                    █}
{█      ─────────────────────────────────────────────────█}
{█      Copyright (c) 1992-1996 by Arthur Panov          █}
{█      VP/2 Version Copyright (C) 1996 fPrint UK Ltd    █}
{█                                                       █}
{▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀}

Program Term32;

{$M 16384}
{$PMTYPE VIO}
{$Cdecl-,Optimize+,Frame+,G3+,R-,SmartLink+,V+,X+}

{$D TERM example - Copyright (c) 1992-1995 by Arthur Panov}

Uses
  Use32, Crt, Dos, VPUtils, Os2Def, Os2Base;

{$IFDEF VPDEMO}
  {&Dynamic VP11Demo.Lib}
{$ENDIF}

Const
  STACK_SIZE   = 8192;
  BPS          = 9600;
  KBD_HANDLE   = 0;
  VIO_HANDLE   = 0;

Const
  LineCtrl : Record
    dataBits : Byte;
    parity   : Byte;
    stopBits : Byte;
  end = ( databits:8; Parity:0; StopBits: 0 );  { 8,N,1 }

Var
  idcbInfo : DcbInfo;
  hCom     : hFile;                    { COM handle   }
  inBuffer : Array[0..255] of Byte;    { input buffer }

{***************************************************************}
{*  Thread to read characters from COM1 and write to screen    *}
{***************************************************************}

Function ComThread( P : Pointer ) : Longint;
Var
  i           : ULong;
  ulBytesRead : ULong;
  rc          : ApiRet;

begin
  ulBytesRead := 0;
  rc := 0;
  while rc = 0 do
    begin
      rc := DosRead( hCom,
                     inBuffer,
                     1,
                     ulBytesRead );

      if ulBytesRead <> 0 then
        begin
          for i := 0 to ulBytesRead-1 do
            inBuffer[i] := inBuffer[i] and $7f;
          VioWrtTTY( @inBuffer,
                     ulBytesRead,
                     VIO_HANDLE);
        end;
     end;

   Writeln;
   Write  (' Could not read from COM1');
   Writeln('killing the LISTEN thread.');
   Writeln;
end;

{***************************************************************}
{*  main                                                       *}
{***************************************************************}

Const
  ulAction     : ApiRet = 0;
  rc           : ApiRet = 0;
  ulBaudRate   : ULong  = BPS;
  ulParmLen    : ULong  = 0;
  ComThreadId  : Tid    = 0;
  ulKbdChar    : ULong  = 0;

Var
  ulBytesWritten : ULong;

begin
  Writeln;
  Writeln(' Each keystroke is echoed to COM1, 9600,8,N,1');
  Writeln(' Ctrl-C or Ctrl-Brk to exit...');
  Writeln;

  { Open and initialize COM1                                     }

  if DosOpen( 'COM1',
              hCom,
              ulAction,
              0,
              0,
              1,
              $12,
              nil ) <> 0 then
    begin
      Writeln('COM1 not available or COM$.SYS not loaded');
      Halt(1);
    end;

  { Set data rate to 9600bps and line format to N81              }

  ulParmLen := sizeof( ulBaudRate );

  rc := DosDevIOCtl( hCom,
                     IOCTL_ASYNC,
                     ASYNC_SETBAUDRATE,
                     @ulBaudRate,
                     ulParmLen,
                     @ulParmLen,
                     nil,
                     0,
                     nil );

  ulParmLen := sizeof( lineCtrl );

  rc := DosDevIOCtl( hCom,
                     IOCTL_ASYNC,
                     ASYNC_SETLINECTRL,
                     @lineCtrl,
                     ulParmLen,
                     @ulParmLen,
                     nil,
                     0,
                     nil );

  { Set device control block parameters                          }

  ulParmLen := sizeof( DCBINFO );

  rc := DosDevIOCtl( hCom,
                     IOCTL_ASYNC,
                     ASYNC_GETDCBINFO,
                     nil,
                     0,
                     nil,
                     @idcbInfo,
                     ulParmLen,
                     @ulParmLen );

  With idcbInfo do
    begin
      usWriteTimeout := 6000;

      {************************************************************}
      {* 60 second write timeout                                  *}
      {************************************************************}

      usReadTimeout := 6000;

      {************************************************************}
      {* 60 second readtimeout                                    *}
      {************************************************************}

      fbCtlHndShake := MODE_DTR_CONTROL;

      {************************************************************}
      {* enable DTR                                               *}
      {************************************************************}

      fbFlowReplace := MODE_RTS_CONTROL;

      {************************************************************}
      {* enable RTS                                               *}
      {************************************************************}

      fbTimeout := MODE_WAIT_READ_TIMEOUT;
    end;

  {************************************************************}
  {* wait-for-something reads                                 *}
  {************************************************************}

  ulParmLen := sizeof( DCBINFO );

  rc := DosDevIOCtl( hCom,
                     IOCTL_ASYNC,
                     ASYNC_SETDCBINFO,
                     @idcbInfo,
                     ulParmLen,
                     @ulParmLen,
                     nil,
                     0,
                     nil );

  { Create a thread to monitor the serial port                   }

  ComThreadId := VPBeginThread( ComThread,
                                Stack_Size,
                                nil );

  { Monitor the keyboard and output typed characters
    Hit Ctrl-C to exit (primitive termination)                   }

  while rc = 0 do
    begin
      ulKbdChar := ord(Readkey);
      rc := DosWrite( hCom,
                      ulKbdChar,
                      1,
                      ulBytesWritten );
   end;

  Writeln;
  Writeln( ' Could not write to COM1, killing the MAIN thread.');
  Writeln;
  Halt( rc );
end.


[ RETURN TO DIRECTORY ]