General information
===================

   When programming RiscIPX, you will find it most convenient if you
   have a spare machine to run a sniffer.  I have a simple sniffer
   written in BBC basic for the RiscPC on my NWClient page
      http://www.falstaff.demon.co.uk/nwclient.html

   For best results, you will need documentation for MbufManager,
   which is part of the Acorn DCI4 specification.  You will need
   to get friendly with Acorn (now Element 14) in order to get
   that document.


RiscIPX SWI entry points
========================

   IPX_Accept (&cf05)
   ------------------
   Reserved for SPX, not actually implemented.

   Usage: SYS "IPX_Accept",sk%,... TO err
          err - error code or zero if no error


   IPX_AddRoute (&cf10)
   --------------------
   Adds a route to the specified network number.  RiscIPX will then
   send all packets destined for that network to the specified MAC address.
   You can examine the currently set routes using *IPXroute.

   Usage: SYS "IPX_AddRoute",network%,node%
          network% - network address to set route to
          node%    - six-byte MAC address of the node that will forward
                     the packets to the network


   IPX_AtoIPX (&cf15)
   ------------------
   Convert a human-readable IPX address string to a twelve-byte
   structure.  Any fields not specified by the user are unchanged
   in the address% structure, so initialize that before calling.

   Usage: SYS "IPX_AtoIPX",address%,string$ TO err
          address% - twelve-byte buffer to store full IPX address
                     (four bytes network, six bytes node, two bytes port)
          string$  - ASCII representation of IPX address
          err      - error code or zero if no error


   IPX_Bind (&cf03)
   ----------------
   Used to specify a local port number and packet type to listen on
   for packets.  Any packets sent on the network to our node address
   and of the specified type and the correct port number will be
   received on the socket.

   Usage: SYS "IPX_Bind",sk%,pt,port TO err
          sk%  - socket handle
          pt   - packet types to accept, or 0 for any type
          port - port
          err  - error code or zero if no error


   IPX_Close (&cf01)
   -----------------
   Close the socket, discarding any packets already received but
   not removed from the receive queue.

   Usage: SYS "IPX_Close",sk%
          sk% - socket handle


   IPX_Connect (&cf06)
   -------------------
   Used to specify the remote address that a socket is associated with,
   and the packet type used for transmissions.  The address is the one
   that any packet passed to IPX_Send will be sent to, and is also the
   qualifier for any incoming packets.  This means that any socket
   connected to a remote IPX address will only receive packets from that
   address.

   Usage: SYS "IPX_Connect",sk%,pt,address%
          sk%      - socket handle
          pt       - packet type used on transmission
          address% - twelve-byte structure containing the address of the
                     remote station.  This structure can have the port
                     and network values zero to indicate any port and
                     network, and have the node set to ffffffffffff to
                     indicate any node.


   IPX_Count (&cf14)
   -----------------
   Calculate the number of bytes required if the specified data was
   packed using the format specified in format$.

   Usage: SYS "IPX_Count",format$,data% TO len
          format$ - packing format string (described at IPX_Pack)
          data%   - structured data to be packed
          len     - length of data, or error code if negative


   IPX_DeleteRoute (&cf11)
   -----------------------
   Delete the route to the specified network.  You can examine the
   currently set routes using *IPXroute.

   Usage: SYS "IPX_DeleteRoute",network%
          network% - network number


   IPX_GetLocalNet (&cf0e)
   -----------------------
   Get the network number for the network you are connected to.
   You can be connected to four local network numbers at the same
   time, one for each frame type.

   Usage: SYS "IPX_GetLocalNet",frame TO network%
          frame    - frame type to read network number for:
                        FRAMETYPE_8022 (1) - Ethernet 802.2
                        FRAMETYPE_8023 (2) - Ethernet 802.2
                        FRAMETYPE_SNAP (3) - Ethernet SNAP
                        FRAMETYPE_E2   (4) - Ethernet II
          network% - network number, or 0 if unknown or none set


   IPX_Listen (&cf04)
   ------------------
   Reserved for SPX, not actually implemented.

   Usage: SYS "IPX_Listen",sk%,... TO err
          err - error code or zero if no error


   IPX_Lookup (&cf0f)
   ------------------
   Look up a route to the specified network.  If the network is
   not known, then RiscIPX will send out RIP requests to any
   servers or routers listening (might be slow).  Not normally
   used in application software.

   Usage: SYS "IPX_Lookup",network% TO rt%
          network% - network number
          rt%      - route ID, or 0 if no route found


   IPX_Pack (&cf12)
   ----------------
   Pack the data using the specified format string into an mbuf
   for transmission.  This is mainly needed to allow for bytesex
   swapping and alignment restrictions in the data.

   Usage: SYS "IPX_Pack",mbuf%,data%,format$ TO err
          mbuf%   - mbuf handle returned by the MbufManager
          data%   - some structured data that you want to transmit
          format$ - formatting string that describes how to pack
                    data into the mbuf.  Format characters understood by
                    the pack/unpack/count functions:
                    'A' : address (32+48+16 bit, long aligned, same as L6bW)
                    'b' : byte
                    'c' : counted string (with one-byte length preceding the string)
                    'e' : align to next address in *data that is a multiple of (count+1)
                    'k' : constant (next byte in format string)
                    'L' : long (big-endian, 32 bit, long aligned)
                    'l' : long (little-endian, 32 bit, long aligned)
                    'n' : set count (an int) from the structure, but does not
                          have any packed data
                    's' : fixed length string (zero padded to multiplier count,
                          or truncated). The structure holds a string pointer;
                          Unpack stores the string in the strings buffer
                    'W' : word (big-endian, 16 bit, word aligned)
                    'w' : word (little-endian, 16 bit, word aligned)
                    'z' : zero byte
                    '*' : previous byte, word or long (must be less than 1536) 
                          specifies multiplier count of next item.  BUG: if count
                          is zero, then the next formatting byte is skipped (only
                          a problem if you use *w *W *l *L followed by aligned data)
                    '0'..'9' : one or two digits to specify multiplier count of next item
          err     - number of result bytes in mbuf, or error code if negative 


   IPX_ReceiveHandler (&cf02)
   --------------------------
   Set function to be called whenever a packet has been received on a
   particular socket.  The handler is called with an mbuf in R0, a pointer
   to the unpacked IPX header in R1, a user data pointer in R2 and the
   frame type identifier in R3.  The function must preserve R4-R11, and
   will not have R10 and R11 set up as needed for the C library.  If the
   handler function returns nonzero, then the packet is added to the
   receive queue, if it returns zero it must have deallocated the mbuf.

   Usage: SYS "IPX_ReceiveHandler",sk%,handler%,data% TO err
          sk%      - socket ID
          handler% - address of function to call
          data%    - user data pointer, passed to handler function
          err      - error code or zero if no error


   IPX_Recv (&cf07)
   ----------------
   This function is the most easy way of receiving data from an IPX
   socket, but due to the extra copying involved it is not the fastest.
   It takes a packet from the receive queue for the socket, copies the
   data from the mbuf to user data space and then deallocates the mbuf.
   If the receive queue is empty, IPX_Recv will not wait but return
   an error immedately.

   Usage: SYS "IPX_Recv",sk%,buffer%,length TO err
          sk%     - socket ID
          buffer% - address of buffer to store received data
          length  - length of buffer
          err     - error code or zero if no error


   IPX_RecvMbuf (&cf09)
   --------------------
   Take a packet from the receive queue, if any available.  It is
   the responsibility of the user to deallocate the mbuf.  Note that
   the packet will contain the Ethernet driver header information
   (32 bytes, in the first mbuf of the chain) as well as the IPX
   header.  The IPX header varies with the frame type used.

   Usage: SYS "IPX_RecvMbuf",sk% TO mbuf%
          sk%   - socket ID
          mbuf% - mbuf structure for the data, or 0 if no packet in queue


   IPX_Send (&cf08)
   ----------------
   Transmit the data in the buffer to the address specified in the
   IPX_Connect call.  This call internally uses IPX_SendMbuf, and
   therefore inherits all of its behaviour.

   Usage: SYS "IPX_Send",sk%,data%,length TO err
          sk%     - socket ID
          data%   - address of buffer containing data to transmit
          length  - length of buffer
          err     - error code or zero if no error


   IPX_SendMbuf (&cf0a)
   --------------------
   Transmit the data in the mbuf to the address specified in the
   IPX_Connect call.  If the node was not set in IPX_Connect, then
   this will result in a broadcast message to all nodes on the
   network.  This function will do an IPX_Lookup on the destination
   network, which may involve sending out RIP requests before
   sending the data proper.

   Usage: SYS "IPX_SendMbuf",sk%,mbuf% TO err
          sk%     - socket ID
          mbuf%   - mbuf containing data to transmit
          err     - error code or zero if no error


   IPX_SendPack (&cf0c)
   --------------------
   Pack the data from the buffer into an mbuf, then transmit the data
   to the address specified in the IPX_Connect call.  This call internally
   uses IPX_SendMbuf, and therefore inherits all of its behaviour.

   Usage: SYS "IPX_SendPack",sk%,data%,format$ TO err
          sk%     - socket ID
          data%   - structured data to be packed
          format$ - packing format string (described at IPX_Pack)
          err     - error code or zero if no error


   IPX_SendUnsafe (&cf0b)
   ----------------------
   Like IPX_Send, this transmits the data in the buffer to the address
   specified in the IPX_Connect call.  It does not make a copy of the
   data, which therefore must remain static and available to the
   Ethernet driver for an unspecified time; in particular, the driver
   may need access to the data after IPX_SendUnsafe returns.  If in
   doubt, use IPX_Send.  This call internally uses IPX_SendMbuf, and
   therefore inherits all of its behaviour.

   Usage: SYS "IPX_SendUnsafe",sk%,data%,length TO err
          sk%     - socket ID
          data%   - address of buffer containing data to transmit
          length  - length of buffer
          err     - error code or zero if no error


   IPX_SetLocalNet (&cf0d)
   -----------------------
   Sets the local network for the given frame type.  This would normally
   not be necessary, unless there are no other machines using IPX on
   the network.  In particular, any environment using a NetWare server
   will have the local network set for all frame types that it uses.

   Usage: SYS "IPX_SetLocalNet",frame,network% TO err
          frame    - frame type to set network number for
          network% - network number, or 0 if unknown or none set


   IPX_Socket (&cf00)
   ------------------
   Create a socket with all default values.

   Usage: SYS "IPX_Socket" TO sk%
          sk% - socket ID or 0 if no socket was created


   IPX_Unpack (&cf13)
   ------------------
   Unpacks data from an mbuf into a user-specified buffer.

   Usage: SYS "IPX_Unpack",mbuf%,buffer%,format$,strings% TO err
          mbuf%    - mbuf containing data to unpack
          buffer%  - buffer for the structured data
          format$  - unpacking format string (described at IPX_Pack)
          strings% - buffer for any strings in the structure, or 0
                     if you don't need it (i.e. no 's' in format)
          err      - error code or zero if no error


   &cf3f
   -----
   This SWI is used internally by NWClient to get direct access to
   the functions provided by the SWIs, plus a few more (like malloc
   and free from RMA).  Apart from the version number, the return
   values from this call are only guaranteed to be of any meaning to
   NWClient, and it will check the version number because the returned
   information can (and does) vary from version to version.

   Usage: SYS "XOS_SWINumberFromString",,"IPX_Socket" TO swi;V
          IF (V AND 1)=0 THEN SYS swi OR &2003f,0 TO version;V
          IF V AND 1 THEN version=-1

          version - RiscIPX version number * 100
                    or -1 if not loaded or very old version


NWClient SWI entry points
=========================

   NWClient_Attach (&cf40)
   -----------------------
   Attaches the RiscPC to a file server.

   Usage: SYS "NWClient_Attach",name$,mode TO server%;V
          name$   - name of tree or server, or IPX node address
          mode    - 0 for tree name
                    1 for server name
                    2 for IPX address (e.g. "12345678:aabbccddeeff:0451")
          server% - server ID (or error if V flag set)


   NWClient_Close (&cf47)
   ----------------------
   Close a file on the file server (mostly for debugging).

   Usage: SYS "NWClient_Close",file% TO ;V
          file% - file descriptor returned from NWClient_Open


   NWClient_Detach (&cf41)
   -----------------------
   Detaches the RiscPC from a file server

   Usage: SYS "NWClient_Detach",server% TO ;V
          server% - server ID returned from NWClient_Attach


   NWClient_Dismount (&cf45)
   -------------------------
   Dismounts a discname from the NetWare volume and directory.

   Usage: SYS "NWClient_Dismount",mt% TO ;V
          mt% - mount ID returned from NWClient_Mount or NWClient_MountList


   NWClient_Login (&cf42)
   ----------------------
   Logs in as a specified user to the file server the RiscPC is attached to.

   Usage: SYS "NWClient_Login",user$,pass$ TO ;V
          user$ - user name or file server name followed by a slash and
                  then the user name (server name is necessary if attached
                  to more than one server)
          pass$ - password for this user


   NWClient_Logout (&cf43)
   -----------------------
   Logs out from a file server.

   Usage: SYS "NWClient_Logout",server% TO ;V
          server% - server ID returned from NWClient_Attach


   NWClient_Mount (&cf44)
   ----------------------
   Mounts a file server volume:directory to a discname usable by RiscOS.

   Usage: SYS "NWClient_Mount",local$,remote$,attrib TO mt%;V
          local$  - RiscOS disc name for the mount
          remote$ - NetWare server/volume:path name
          attrib  - Mount flags: bits 0 and 1 freely usable,
                                 bit 2 if you don't want long file names
          mt%     - mount ID (or error if V flag set)


   NWClient_MountList (&cf4b)
   --------------------------
   Retrieve information about the mounted discs.

   Usage: SYS "NWClient_MountList",mt% TO mt%,local%,remote%,attrib%,count%;V
          mt%(in)  - previous mount ID, or 0 for start of list
          mt%(out) - updated mount ID value, if 0 then end of list,
                     otherwise a valid mount ID
          local%   - pointer to the discname of the mount
          remote%  - pointer to the file server volume:path of the mount
          attrib%  - Mount flags: bits 0 and 1 as set by NWClient_Mount
                                  bit 2 if long file names *enabled*


   NWClient_NCP (&cf4c)
   --------------------
   Allows you to experiment with direct function calls to the file
   server.  Don't use unless you have backups!

   Usage: SYS "NWClient_NCP",server%,function,request%,reqfmt$,reply%,rplfmt$,strings% TO r0;V
          server%  - file server to send request to
          function - (major) number of function to call, e.g. &48 for read
          request% - properly formatted request variables (C structure)
          reqfmt$  - RiscIPX-style formatting string to pack structure
          reply%   - buffer for NCP reply
          rplfmt$  - RiscIPX-style formatting string for expected result
          strings% - buffer for strings specified in rplfmt$


   NWClient_Open (&cf46)
   ---------------------
   Open a file on the file server for access without using the RiscOS
   file system (mostly for debugging).

   Usage: SYS "NWClient_Open",mt%,name$,mode TO file%;V
          mt%   - mount ID, or 0 in which case name$ should have a full path
          name$ - file name relative to the mount point
          mode  - NetWare open mode
          file% - file descriptor


   NWClient_Read (&cf48)
   ---------------------
   Read data from a file on the file server (mostly for debugging).

   Usage: SYS "NWClient_Read",file%,buffer%,offset,length TO read;V
          file%   - file descriptor returned from NWClient_Open
          buffer% - buffer in memory for data
          offset  - offset from start of file from which to read
          length  - number of bytes to read
          read    - actual number of bytes read


   NWClient_ServerList (&cf4d)
   ---------------------------
   Retrieve information about the servers you are attached to.

   Usage: SYS "NWClient_ServerList",fs% TO fs%,server%,user%,flags%;V
          fs%(in)  - previous server ID, or 0 for start of list
          fs%(out) - updated server ID value, if 0 then end of list,
                     otherwise a valid server ID
          server%  - pointer to the name of the file server
          user%    - pointer to the user name if logged in, 0 otherwise
          flags%   - Server flags


   NWClient_Setpass (&cf4a)
   ------------------------
   Usage: SYS "NWClient_Setpass",user$,oldpass$,newpass$ TO ;V
          user$    - name of user to change, or 0 for current
          oldpass$ - current password
          newpass$ - new password you want to change to


   NWClient_Write (&cf49)
   ----------------------
   Write data to a file on the file server (mostly for debugging).

   Usage: SYS "NWClient_Write",file%,buffer%,offset,length TO written;V
          file%   - file descriptor returned from NWClient_Open
          buffer% - buffer in memory that contains data
          offset  - offset from start of file from which to write
          length  - number of bytes to write
          written - actual number of bytes written

   &cf7f
   -----
   This SWI is provided to determine the NWClient module version.

   Usage: SYS "XOS_SWINumberFromString",,"NWClient_Login" TO swi;V
          IF (V AND 1)=0 THEN SYS swi OR &2003f,0 TO version;V
          IF V AND 1 THEN version=-1

          version - NWClient version number * 100
                    or -1 if not loaded or version before 1.61


Error codes
===========

   All error codes returned from RiscIPX are negative.  NWClient
   mostly returns proper RiscOS kernel errors, with the error code
   field set appropriately.
   The IPX_ error codes are specific to RiscIPX and NWClient.

   IPX_NO_PACKETS_READY          = -257
   IPX_INVALID_ADDRESS           = -258
   IPX_NOT_ATTACHED              = -259
   IPX_CANNOT_BIND               = -261
   IPX_UNIMPLEMENTED             = -265
   IPX_NO_ROUTE_TO_NETWORK       = -269
   IPX_NOT_ENOUGH_MEMORY         = -273
   IPX_TRANSMIT_ERROR            = -277
   IPX_NO_SOCKET                 = -281
   IPX_PACK_INVALID              = -285
   IPX_PACK_NO_SPACE             = -289
   IPX_PACK_MULTIPLIER           = -293

   The NCP_ error codes are defined by Novell NetWare.  Note that several
   errors have the same value, the context will usually give an indication
   what error has been intended.  Not very clever, really.

   NCP_INSUFFICIENT_SPACE          = -&01
   NCP_BUFFER_TOO_SMALL            = -&77
   NCP_VOL_FLAG_NOT_SET            = -&78
   NCP_NO_ITEMS_FOUND              = -&79
   NCP_CONN_ALREADY_TEMP           = -&7a
   NCP_CONN_ALREADY_LOGGED_IN      = -&7b
   NCP_CONN_NOT_AUTHENTICATED      = -&7c
   NCP_CONN_NOT_LOGGED_IN          = -&7d
   NCP_NCP_BOUNDARY_CHECK_FAILED   = -&7e
   NCP_LOCK_WAITING                = -&7f
   NCP_LOCK_FAIL                   = -&80
   NCP_FILE_IN_USE                 = -&80
   NCP_FILE_NO_HANDLES             = -&81
   NCP_FILE_NO_OPEN_PRIV           = -&82
   NCP_DISK_IO_ERROR               = -&83
   NCP_FILE_NO_CREATE_PRIV         = -&84
   NCP_FILE_NO_CREATE_DEL_PRIV     = -&85
   NCP_FILE_EXISTS_READ_ONLY       = -&86
   NCP_FILE_WILD_CARDS_IN_NAME     = -&87
   NCP_FILE_INVALID_HANDLE         = -&88
   NCP_FILE_NO_SRCH_PRIV           = -&89
   NCP_FILE_NO_DEL_PRIV            = -&8a
   NCP_FILE_NO_RENAME_PRIV         = -&8b
   NCP_FILE_NO_MOD_PRIV            = -&8c
   NCP_FILE_SOME_IN_USE            = -&8d
   NCP_FILE_NONE_IN_USE            = -&8e
   NCP_FILE_SOME_READ_ONLY         = -&8f
   NCP_FILE_NONE_READ_ONLY         = -&90
   NCP_FILE_SOME_RENAMED_EXIST     = -&91
   NCP_FILE_NONE_RENAMED_EXIST     = -&92
   NCP_FILE_NO_READ_PRIV           = -&93
   NCP_FILE_NO_WRITE_PRIV          = -&94
   NCP_FILE_READ_ONLY              = -&94
   NCP_FILE_DETACHED               = -&95
   NCP_SERVER_OUT_OF_MEMORY        = -&96
   NCP_DIR_TARGET_INVALID          = -&86
   NCP_DISK_NO_SPOOL_SPACE         = -&97
   NCP_VOL_INVALID                 = -&98
   NCP_DIR_FULL                    = -&99
   NCP_VOL_RENAMING_ACROSS         = -&9a
   NCP_DIRHANDLE_INVALID           = -&9b
   NCP_PATH_INVALID                = -&9c
   NCP_TRUSTEES_NO_MORE            = -&9c
   NCP_DIRHANDLE_NO_MORE           = -&9d
   NCP_FILE_NAME_INVALID           = -&9e
   NCP_DIR_ACTIVE                  = -&9f
   NCP_DIR_NOT_EMPTY               = -&a0
   NCP_DIR_IO_ERROR                = -&a1
   NCP_FILE_IO_LOCKED              = -&a2
   NCP_TTS_RANSACTION_RESTARTED    = -&a3
   NCP_DIR_RENAME_INVALID          = -&a4
   NCP_FILE_OPENCREAT_MODE_INVALID = -&a5
   NCP_ALREADY_IN_USE              = -&a6
   NCP_RESOURCE_TAG_INVALID        = -&a7
   NCP_ACCESS_DENIED               = -&a8
   NCP_DATA_STREAM_INVALID         = -&be
   NCP_NAME_SPACE_INVALID          = -&bf
   NCP_ACCTING_NO_PRIV             = -&c0
   NCP_ACCTING_NO_BALANCE          = -&c1
   NCP_ACCTING_NO_CREDIT           = -&c2
   NCP_ACCTING_TOO_MANY_HOLDS      = -&c3
   NCP_ACCTING_DISABLED            = -&c4
   NCP_LOGIN_LOCKOUT               = -&c5
   NCP_CONSOLE_NO_PRIV             = -&c6
   NCP_Q_IO_FAILURE                = -&d0
   NCP_Q_NONE                      = -&d1
   NCP_Q_NO_SERVER                 = -&d2
   NCP_Q_NO_RIGHTS                 = -&d3
   NCP_Q_FULL                      = -&d4
   NCP_Q_NO_JOB                    = -&d5
   NCP_Q_NO_JOB_RIGHTS             = -&d6
   NCP_PASSWORD_UNENCRYPTED        = -&d6
   NCP_Q_IN_SERVICE                = -&d7
   NCP_PASSWORD_NOT_UNIQUE         = -&d7
   NCP_Q_NOT_ACTIVE                = -&d8
   NCP_PASSWORD_TOO_SHORT          = -&d8
   NCP_Q_STN_NOT_SERVER            = -&d9
   NCP_LOGIN_NO_CONN               = -&d9
   NCP_LOGIN_MAX_EXCEEDED          = -&d9
   NCP_Q_HALTED                    = -&da
   NCP_LOGIN_UNAUTHORIZED_TIME     = -&da
   NCP_LOGIN_UNAUTHORIZED_STATION  = -&db
   NCP_Q_MAX_SERVERS               = -&db
   NCP_ACCT_DISABLED               = -&dc
   NCP_PASSWORD_INVALID            = -&de
   NCP_PASSWORD_EXPIRED            = -&df
   NCP_LOGIN_NO_CONN_AVAIL         = -&e0
   NCP_E_NO_MORE_USERS             = -&e7
   NCP_BIND_NOT_ITEM_PROP          = -&e8
   NCP_BIND_WRITE_TO_GROUP_PROP    = -&e8
   NCP_BIND_MEMBER_ALREADY_EXISTS  = -&e9
   NCP_BIND_NO_SUCH_MEMBER         = -&ea
   NCP_BIND_NOT_GROUP_PROP         = -&eb
   NCP_BIND_NO_SUCH_SEGMENT        = -&ec
   NCP_BIND_PROP_ALREADY_EXISTS    = -&ed
   NCP_BIND_OBJ_ALREADY_EXISTS     = -&ee
   NCP_BIND_NAME_INVALID           = -&ef
   NCP_BIND_WILDCARD_INVALID       = -&f0
   NCP_BIND_SECURITY_INVALID       = -&f1
   NCP_BIND_OBJ_NO_READ_PRIV       = -&f2
   NCP_BIND_OBJ_NO_RENAME_PRIV     = -&f3
   NCP_BIND_OBJ_NO_DELETE_PRIV     = -&f4
   NCP_BIND_OBJ_NO_CREATE_PRIV     = -&f5
   NCP_BIND_PROP_NO_DELETE_PRIV    = -&f6
   NCP_BIND_PROP_NO_CREATE_PRIV    = -&f7
   NCP_BIND_PROP_NO_WRITE_PRIV     = -&f8
   NCP_BIND_PROP_NO_READ_PRIV      = -&f9
   NCP_NO_FREE_CONN_SLOTS          = -&f9
   NCP_NO_MORE_SERVER_SLOTS        = -&fa
   NCP_TEMP_REMAP_ERROR            = -&fa
   NCP_PARAMETERS_INVALID          = -&fb
   NCP_BIND_NO_SUCH_PROP           = -&fb
   NCP_NCP_NOT_SUPPORTED           = -&fb
   NCP_INET_PACKET_REQ_CANCELED    = -&fc
   NCP_SERVER_UNKNOWN              = -&fc
   NCP_MSG_Q_FULL                  = -&fc
   NCP_BIND_NO_SUCH_OBJ            = -&fc
   NCP_LOCK_COLLISION              = -&fd
   NCP_CONN_NUM_INVALID            = -&fd
   NCP_PACKET_LEN_INVALID          = -&fd
   NCP_UNKNOWN_REQ                 = -&fd
   NCP_BIND_LOCKED                 = -&fe
   NCP_TRUSTEE_NOT_FOUND           = -&fe
   NCP_DIR_LOCKED                  = -&fe
   NCP_SEM_INVALID_NAME_LEN        = -&fe
   NCP_PACKET_NOT_DELIVERABLE      = -&fe
   NCP_SOCKET_TABLE_FULL           = -&fe
   NCP_SPOOL_DIR_ERROR             = -&fe
   NCP_LOGIN_DISABLED_BY_SUPER     = -&fe
   NCP_TIMEOUT_FAILURE             = -&fe
   NCP_FILE_EXISTS                 = -&ff
   NCP_FILE_NAME                   = -&ff
   NCP_HARD_FAILURE                = -&ff
   NCP_IO_BOUND                    = -&ff
   NCP_MUST_FORCE_DOWN             = -&ff
   NCP_NO_SPOOL_FILE               = -&ff
   NCP_NO_TRUSTEE_CHANGE_PRIV      = -&ff
   NCP_TARGET_NOT_ACCEPTING_MSGS   = -&ff
   NCP_TARGET_NOT_LOGGED_IN        = -&ff
   NCP_NO_FILES_FOUND              = -&ff
   NCP_BAD_SPOOL_PRINTER           = -&ff
   NCP_BAD_RECORD_OFFSET           = -&ff
   NCP_DRIVE_INVALID_NUM           = -&ff
   NCP_SEM_INVALID_INIT_VAL        = -&ff
   NCP_SEM_INVALID_HANDLE          = -&ff
   NCP_NO_RESPONSE_FROM_SERVER     = -&ff
   NCP_NO_OBJ_OR_BAD_PASSWORD      = -&ff
   NCP_PATH_NOT_LOCATABLE          = -&ff
   NCP_Q_FULL_ERROR                = -&ff
   NCP_REQ_NOT_OUTSTANDING         = -&ff
   NCP_SOCKET_ALREADY_OPEN         = -&ff
   NCP_LOCK_ERROR                  = -&ff


Copyright
=========
   !NWClient and the RiscIPX and NWClient modules are Copyright
   1998-1999 by Frank A. Vorstenbosch (nwclient@falstaff.demon.co.uk)
   but can be redistributed freely.  For questions or bug reports,
   email nwclient@falstaff.demon.co.uk.

----- EOF -----
