; Amstrad SM2400 modem driver                       Version 0.05 20-Dec-1991
; (c) 1990/1991 Hugo Fiennes

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

  port_rxclear()
  port_txspeed(2400)
  port_rxspeed(2400)

  type "AT&F"+cr
  pause(100)
  port_rxclear()

  type "ATQ0V1E0X2S0=0F0&D2&C1"+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)
  type "ATO"+cr

  return(_processmessage(""))
  }

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

modem_dial (string number[40],integer how)
  {
  string dialtype[1],prefix[4]=""

  port_dtr(1)
  port_rts(1)
  port_rxclear()

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

  if (port_txspeed()==75 && port_rxspeed()==1200)
    {
    port_txspeed(1200)
    prefix="B23"
    }

  type "AT"+prefix+"D"+dialtype+number+cr

  return(_processmessage(""))
  }

modem_answer ()
  {
  string response[30]

  type "ATS0=1"+cr

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

  return(_processmessage(response))
  }

modem_errorcontrol (string option[10])
  {
  set(linklevel,none)
   
  if (comparei(option,"vasscom"))
    {
    set(linklevel,vasscom)
    return
    }

  if (comparei($left(option,3),"mnp"))
    {
    set(linklevel,mnp)
    return
    }
  return
  }

modem_standard (string option[10])
  {
  if (comparei(option,"v21"))
    {
    port_txspeed(300)
    port_rxspeed(300)
    return
    }
  if (comparei(option,"v23"))
    {
    port_txspeed(75)
    port_rxspeed(1200)
    return
    }
  if (comparei(option,"v22"))
    {
    port_txspeed(1200)
    port_rxspeed(1200)
    return
    }
  if (comparei(option,"v22bis"))
    {
    port_txspeed(2400)
    port_rxspeed(2400)
    return
    }
  prints "Modem standard "+option+" is not supported."+newline
  }

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

  if (len(already)==0)
    {
    ; Wait for message
    retcode=$modeminput(30,modem_replywait)
    if (len(retcode)==0 || compare($left(retcode,2),"AT")!=0)
      {
      retcode=$modeminput(30,modem_replywait)
      }
    }
  else
    {
    retcode=already
    }

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

  if (compare(retcode,"CONNECT"))
    {
    retcode="CONNECT 300"
    }
  if (compare($left(retcode,7),"CONNECT"))
    {
    integer baudrate,a=9
    string rate[5]

    ; Strip rate
    while(isdigit($mid(retcode,a)))
      {
      rate=rate+$mid(retcode,a)
      a=a+1
      }

    baudrate=val(rate)
    if (baudrate==1275 || baudrate==7512)
      {
      return(0)
      }
    port_txspeed(baudrate)
    port_rxspeed(baudrate)
    return(0)
    }

  modem_disconnect()
  return(1)
  }
