; Dacom Quadplus                                    Version 1.01 22-Oct-1991
; (c) 1991 Hugo Fiennes

modem_initialise ()
  {
  integer oldtx=port_txspeed(),oldrx=port_rxspeed()

  port_rxclear()
  port_txspeed(4800)
  port_rxspeed(4800)

  type "ATQ0V1E0X4S0=0&D2&C1F1\N3\J1"+cr
  waitfor("OK",150)
  pause(20)
  type "AT&B0&M\Q2\T0B0\X2&W"+cr
  if (waitfor("OK",150))
    {
    port_txspeed(oldtx)
    port_rxspeed(oldrx)
    return(0)
    }

  port_txspeed(oldtx)
  port_rxspeed(oldrx)
  return(1)
  }

modem_shutdown ()
  {
  return(1)
  }

modem_connect ()
  {
  port_dtr(1)
  port_rts(1)
  port_txspeed(4800)
  port_rxspeed(4800)
  type "ATD"+cr

  return(_processmessage(""))
  }

modem_disconnect ()
  {
  type cr
  pause(10)
  port_rts(0)
  port_dtr(0)
  pause(50)
  port_dtr(1)
  port_rts(1)
  pause(10)
  type cr
  }

modem_dial (string number[40],integer how)
  {
  string dialtype[1],command[5]
  integer v23mode

  if (port_txspeed()==75)
    {
    port_txspeed(1200)
    port_rxspeed(1200)
    command="ATB9"
    v23mode=1
    }
  else
    {
    port_txspeed(4800)
    port_rxspeed(4800)
    command="ATB0"
    v23mode=0
    }

  port_dtr(1)
  port_rts(1)

  pause(10)
  port_rxclear()
  type command+cr
  waitfor("OK",100)
  pause(10)

  port_rxclear()
  if (how==0)
    {
    dialtype="P"
    }
  else
    {
    dialtype="T"
    }

  port_rxclear()
  type "ATD"+dialtype+number+cr
  if (v23mode)
    {
    ; V23 connects return no connect message
    return(_waitconnect())
    }

  return(_processmessage(""))
  }

modem_answer ()
  {
  string response[50]

  port_txspeed(4800)
  port_rxspeed(4800)
  type "ATS0=1"+cr

  repeat
    {
    response=$modeminput(50,modem_replywait)
    }
  until(strcmp($left(response,7),"CONNECT")==0)

  return(_processmessage(response))
  }

modem_errorcontrol (string option[10])
  {
  set(linklevel,none)

  if (comparei(option,"off"))
    {
    type("AT\N0"+cr)
    }

  if (comparei(option,"vasscom"))
    {
    type("AT\N0"+cr)
    set(linklevel,vasscom)
    }

  if (comparei($left(option,3),"mnp"))
    {
    integer level=val($mid(option,4,1))

    if ((level>=2) && (level<=5))
      {
      type("ATS34="+$str(level)+"\N3"+cr)
      }
    }

  waitfor("OK"+$chr(13)+$chr(10),100)
  pause(20)
  }

modem_standard (string option[10])
  {
  }

_processmessage (string already[50])
  {
  string retcode[50]

  if (len(already)==0)
    {
    ; Wait for message
    retcode=$modeminput(50,modem_replywait)
    if (len(retcode)==0)
      {
      retcode=$modeminput(50,modem_replywait)
      }
    }
  else
    {
    retcode=already
    }

  ; MNP responses start with a beep! Wierd!
  if (asc(retcode)==7)
    {
    retcode=$right(retcode,len(retcode)-1)
    }

  ; Check for NO DIALTONE/BUSY
  switch(retcode)
    {
    case$("BUSY")
      {
      return(2)
      }
    case$("NO DIALTONE")
      {
      return(3)
      }
    }

  if (compare($left(retcode,7),"CONNECT"))
    {
    prints retcode+newline
    return(0)
    }

  modem_disconnect()
  return(1)
  }

_waitconnect ()
  {
  integer start=time()

  while((time()-start)<modem_carrierwait)
    {
    if (port_dcd()!=0)
      {
      return(0)
      }
    else
      {
      pause(5)
      }
    }
  return(1)
  }
