alex@thouky.co.uk
)
Copyright © Alexander Thoukydides.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".
The latest version of this document will normally be available from http://www.thouky.co.uk/software/psifs/plp.html.
Revision | Date | Author | Description |
---|---|---|---|
1.18 | 18-Jul-07 | Alexander Thoukydides | Added standard names and other uses for the CRC algorithm. |
1.17 | 22-Aug-02 | Alexander Thoukydides | Corrected details of Connection Termination Frame and Disconnection Frame. |
1.16 | 31-Mar-02 | Alexander Thoukydides | Corrected some details of the WPRT print data format and NCP_GET_MACHINE_INFO parameters. |
1.15 | 02-Mar-02 | Alexander Thoukydides | Added some details of the WPRT print data format. |
1.14 | 05-Feb-02 | Alexander Thoukydides | Added information on the WPRT server. |
1.13 | 30-Jun-01 | Alexander Thoukydides | Replaced CRC table with algorithm to generate it. Improved the GENCSERV server description. |
1.12 | 27-Jun-01 | Alexander Thoukydides | Added more details of Ericsson R380 variant. |
1.11 | 17-Jun-01 | Alexander Thoukydides | Added some details of Ericsson R380 variant. Improved clipboard and CRC descriptions. |
1.10 | 10-Jun-01 | Alexander Thoukydides | Modified clipboard description to fit the rest of the document better. |
1.09 | 10-Jun-01 | Fritz Elfert | Added description of Clipboard server and clipboard data. |
1.08 | 08-Jun-01 | Alexander Thoukydides | Corrected sense parameter for RFSV16_FSEEK and RFSV32_SEEK_FILE . |
1.07 | 30-Jan-01 | Alexander Thoukydides | Corrected parameters for RFSV32_READ_WRITE_FILE and added description of missing RFSV16_FDIRREAD parameter. |
1.06 | 09-Oct-00 | Alexander Thoukydides | Added note that the EPOC variant of the data link layer is multi-windowed. |
1.05 | 28-Jul-00 | Alexander Thoukydides | Added command line length parameter to NCP_GET_CMD_LINE response. |
1.04 | 02-Jun-00 | Alexander Thoukydides | Released under version 1.1 of the GNU Free Documentation License. |
1.03 | 21-Apr-00 | Alexander Thoukydides | Corrected HTML Updated email address. Added URL for latest version of this document. |
1.02 | 23-Jan-00 | Alexander Thoukydides | Added details for NCP_SET_TIME and NCP_GET_MACHINE_INFO . |
1.01 | 22-Dec-99 | Alexander Thoukydides | Added descriptions for most RFSV server commands. |
1.00 | 09-Dec-99 | Alexander Thoukydides | First draft. No descriptions for RFSV server commands. |
All trademarks are acknowledged.
Due to the diverse and incomplete nature of these sources, the description here probably contains both errors and omissions. Please send any corrections or additions to the author for inclusion in future revisions.
OSI layer | EPOC name | Description | |
---|---|---|---|
7 | Application | n/a | |
6 | Presentation | LINK , RPCS , RFSV etc | Multiple servers, each providing a related set of services |
5 | Session | NCP | Multiplexing of multiple client-server communications channels with flow control |
4 | Transport | n/a | |
3 | Network | n/a | |
2 | Data link | Link | Synchronization, error detection and recovery |
1 | Physical | RS-232 |
0x00
) byte unless otherwise described.
The DTR and RTS handshaking lines are both raised when the PLP is enabled and dropped when it is subsequently disabled. However, only the DSR line should be monitored to detect activity.
Any baud rate supported by both devices may be used. The data format is 8 data bits, 1 stop bit, and no parity checking.
This layer is sometimes referred to as LINK, but that leads to confusion with one of the higher level servers having the same name.
Bytes | 1 | 1 | 1 | 1 | n | 1 | 1 | 2 | |
---|---|---|---|---|---|---|---|---|---|
Data | SYN | DLE | STX | Cont | Seq | Data | DLE | ETX | CRC |
The Cont and Seq fields are combined into a single byte, with the Cont in the high nibble, and Seq in the low nibble. If the Seq value is greater than 7 then the most significant bit of the Seq nibble is set and an additional byte is inserted into the frame (EPOC variant only):
Bytes | 1 | 1 | 1 | 1 | 1 | n | 1 | 1 | 2 | |
---|---|---|---|---|---|---|---|---|---|---|
Data | SYN | DLE | STX | Cont | ( Seq & 7) | 8 | Seq >> 3 | Data | DLE | ETX | CRC |
The length of the Data field (n) can vary from 0 to 300 bytes before byte stuffing. The session layer (NCP) is responsible for splitting and recombining longer messages to fit within this limit.
The 16 bit Cyclic Redundancy Check (CRC) is transmitted with the most significant byte followed by the least significant byte.
Note that the Ericsson R380 implementation uses ETB instead of SYN for the start of frame character. It also has a larger maximum frame size, with the length of the Data field (n) varying up to 2048 bytes before byte stuffing.
Name | Value | Description |
---|---|---|
STX | 0x02 | Start of frame |
ETX | 0x03 | End of frame |
EOT | 0x04 | A stuffed ETX character |
DLE | 0x10 | Field delimiter within a frame |
DC1 | 0x11 | Not protocol characters, but stuffed (Ericsson R380) |
DC3 | 0x13 | |
SYN | 0x16 | Synchronize start of frame |
ETB | 0x17 | Synchronize start of frame (Ericsson R380) |
To prevent control characters within the frame body from being misinterpreted, a system of byte stuffing is employed. This replaces characters within the Cont/Seq and Data fields as follows:
Raw character | Stuffed character sequence | Variants | ||
---|---|---|---|---|
Name | Value | Names | Values | |
DLE | 0x10 | DLE DLE | 0x10 0x10 | SIBO and EPOC |
ETX | 0x03 | DLE EOT | 0x10 0x04 | EPOC |
DC1 | 0x11 | DLE Space | 0x10 0x20 | Ericsson R380 only |
DC3 | 0x13 | DLE ! | 0x10 0x21 |
The reverse process is performed by the receiver.
The following C code calculates a lookup table to allow efficient calculation of this CRC:
const unsigned int polynomial = 0x1021; |
The following line can then be used to add a byte (value
) to a 16 bit CRC (old_crc
) to give the new 16 bit CRC (new_crc
):
new_crc = (old_crc << 8) ^ table[((old_crc >> 8) ^ value) & 0xff]; |
Timer | Period |
---|---|
Re-transmission | Baud rate dependant |
Inactivity | Application dependant |
The re-transmission timeout is used to trigger the re-transmission of unacknowledged frames. To optimise the timeout for the operating conditions, it is calculated by summing the following three components:
Component | Description |
---|---|
Baud Rate Bits Factor | The estimated time required to transmit the number of bits in a frame at the current baud rate. A suitable timeout is given by (13200 / baud) seconds. |
Round Trip Time Factor | A running estimate of the additional time to receive an acknowledgement from the remote device. A constant offset of 0.2 seconds is probably adequate for simpler implementations. |
Backoff Factor | An additional timeout dependant on the number of re-transmissions that have taken place. This factor may be omitted in a simple implementation. |
The Baud Rate Bits Factor is most significant at low baud rates, but the Round Trip Time Factor is more significant at higher baud rates.
The inactivity timer period may be adjusted to suit the application. If no detection of an idle connection is required then it can be completely disabled, otherwise a timeout of 60 seconds is recommended.
Although two different timer events are required, they may both be implemented using a single timer since only one timer can be active at any time.
Cont | Seq | Name | Description |
---|---|---|---|
0 | Sequence number of last valid Data_Pdu received | Ack_Pdu | Used to complete handshaking during connection phase, and to acknowledge Data_Pdu frames. |
1 | 0 | Disc_Pdu | Used to terminate a connection. |
1 | Disc_Req_Pdu | First disconnect in a handshaked disconnection. Not currently used. | |
2 | 0 | Req_Pdu | Used during connection phase to request a connection. |
1 ... 3 (use 1 ) | Req_Req_Pdu | First request in connection establishment. EPOC variant of protocol only. | |
4 ... 6 (use 4 ) | Req_Con_Pdu | Responding request in connection establishment. EPOC variant of protocol only. | |
3 | Next sequence number | Data_Pdu | Data frame. |
Only the Data_Pdu
and Req_Con_Pdu
frames contain Data fields.
The Data_Pdu
and Ack_Pdu
both contain a sequence number. This is used to allow acknowledgements to be matched to the corresponding data frame. Each device maintains its own sequence number that is incremented for each Data_Pdu
, modulo either 8 for the SIBO variant or 2048 for the EPOC variant. More details are given in the following sections.
Both client-server and peer to peer connections are supported. The peer to peer connection sequence is a symmetrical version of the client-server sequence, with both devices processing all of the PDUs.
From client | From server | Description |
---|---|---|
Req_Pdu | Connection requested by client | |
Req_Pdu | Connection accepted by server | |
Ack_Pdu | Connection established |
The peer to peer connection sequence is very similar:
From device 1 | From device 2 | Description |
---|---|---|
Req_Pdu | Req_Pdu | Both devices request a connection |
Ack_Pdu | Ack_Pdu | Both devices accept the connection |
In both cases the sequence numbers should be initialised to 0, and the Ack_Pdu
sent with a Seq field of 0. However, if the received Ack_Pdu
contains a non-zero Seq field then the sequence number should be seeded from the supplied value.
From client | From server | Description |
---|---|---|
Req_Req_Pdu | Connection requested by client | |
Req_Con_Pdu | Connection request confirmed by server | |
Ack_Pdu | Connection established |
The peer to peer connection sequence is very similar:
From device 1 | From device 2 | Description |
---|---|---|
Req_Req_Pdu | Req_Req_Pdu | Both devices request a connection |
Req_Con_Pdu | Req_Con_Pdu | Both devices confirm the connection request |
Ack_Pdu | Ack_Pdu | Both devices accept the connection |
The Data field of the Req_Con_Pdu
frames contain a 4 byte magic number. This is a pseudo-random value generated independently by each device. If the magic numbers match then a peer to peer connection is rejected because it indicates that the device is attempting to connect to itself. To avoid the risk of the same pseudo-random number sequence being generated by both devices, it is advisable to include an additional unique element, such as the value of a clock.
In both cases the sequence numbers should be initialised to 0, and the Ack_Pdu
sent with a Seq field of 0. However, if the received Ack_Pdu
contains a non-zero Seq field then the sequence number should be seeded from the supplied value.
If the Ack_Pdu
is not received within the re-transmission timeout, then the Req_Req_Pdu
may be re-transmitted up to 4 times before aborting the connection attempt.
A Req_Req_Pdu
frame can always be used to initiate a connection; a device that supports the EPOC variant of the protocol will then reply with a Req_Con_Pdu
frame, but if the other device only supports the SIBO variant then it will treat it as a Req_Pdu
and reply with an Ack_Pdu
. Hence, the protocol variant is indicated by whether a Req_Con_Pdu is received prior to the Ack_Pdu
.
Similarly, if the other device initiates the connection, then the protocol variant can be detected from whether a Req_Pdu
or Req_Req_Pdu
is received.
The EPOC variant of the data link layer is multi windowed, i.e. more than one acknowledgement can be outstanding at any time. The default configuration will send up to 8 Data_Pdu
frames before waiting for an acknowledgement.
The data transfer sequence is the same for both the SIBO and EPOC variants. Either device may initiate a data transfer, providing that there are not too many outstanding acknowledgements for the previous transfers.
From device 1 | From device 2 | Description |
---|---|---|
Data_Pdu | Data sent | |
Ack_Pdu | Data acknowledged |
The only other difference between the SIBO and EPOC variants, as described earlier, is the range of sequence numbers used; the value is modulo 8 for the SIBO variant and modulo 2048 for the EPOC variant. The sequence number is incremented prior to sending the Data_Pdu
.
An Ack_Pdu
should always be sent in response to a received Data_Pdu
, even if the sequence number does not match the expected value. However, the Seq field of the Ack_Pdu
should be set to the value from the last valid Data_Pdu
received, not necessarily that of the Data_Pdu
being responded to.
If the Ack_Pdu
is not received within the re-transmission timeout, or if an Ack_Pdu
is received with a different sequence number from that sent in the Data_Pdu
, then the Data_Pdu
may be re-transmitted up to 8 times before the link is disconnected. The sequence number must not be incremented when re-transmitting a Data_Pdu
.
A disconnection may also occur if the serial cable is physically disconnected, so the DSR handshaking line should also be monitored as described earlier. Additionally, if the inactivity timeout is exceeded without any frames being received then a disconnection should be assumed.
From device 1 | From device 2 | Description |
---|---|---|
Disc_Pdu | Initiator requests a disconnection |
Note that there is no reply to the Disc_Pdu
, so the disconnection must be assumed to have succeeded.
From device 1 | From device 2 | Description |
---|---|---|
Disc_Req_Pdu | Initiator requests a disconnection | |
Disc_Pdu | Disconnection confirmed |
Even if this enhanced disconnection sequence is supported, the original SIBO disconnection sequence must still be supported. In particular, if the Disc_Pdu
is not received within the re-transmission timeout then a Disc_Pdu
frame should be sent and the disconnection assumed to have succeeded.
This is not intended to be the definitive implementation, but should help to clarify the operation of the protocol. In particular, only single windowed behaviour is supported, but this does not present interoperability with systems that do support multi-windowed operation; it just reduces that maximum achievable transfer rate.
State | Description |
---|---|
Idle_State | Disconnected |
Idle_Req_State | Req_Req_Pdu sent, awaiting Req_Con_Pdu response |
Idle_Ack_State | Req_Con_Pdu sent, awaiting Ack_Pdu response |
Data_State | Connected, no acknowledgement pending |
Data_Ack_State | Data_Pdu sent, awaiting Ack_Pdu acknowledgement |
Event | Source | Description |
---|---|---|
Ack_Rx | Received frame | Ack_Pdu (acknowledge) received |
Disc_Rx | Disc_Pdu or Disc_Req_Pdu (disconnect) received | |
Req_Rx | Req_Pdu (connection request) received | |
Req_Req_Rx | Req_Req_Pdu (handshaked connection request) received | |
Req_Con_Rx | Req_Con_Pdu (handshaked connection accepted) received | |
Data_Rx | Data_Pdu (data) received | |
Connect | Local client | Connection requested |
Disconnect | Disconnection requested | |
Write | Data to transmit | |
Timeout | Timer | Re-transmission timer or inactivity timer expired |
Note that only a single timer event is used; both the re-transmission and inactivity timeouts are implemented using a single timer.
Only the SIBO disconnection sequence is implemented, so Disc_Pdu
and Disc_Req_Pdu
are treated identically.
Variable | Description | Default |
---|---|---|
Enabled | Is the link enabled | FALSE |
Variant | The protocol variant: SIBO or EPOC | SIBO |
Retries | Number of retries remaining | 0 |
Seq_Tx | Last sequence number for transmitted data frames | 0 |
Seq_Rx | Last sequence number for received data frames | 0 |
Magic | Magic number for this device | Pseudo-random |
The function Inc(
x)
is defined to return the next sequence number after x, modulo the appropriate value.
The Reset()
function sets all of the variables, except for Enabled
, back to the defaults given in the above table. This should select a different pseudo-random number for Magic
. It also starts the re-transmission timer.
Event | Condition | Action | Next state |
---|---|---|---|
Ack_Rx | Always | No action | Idle_State |
Disc_Rx | Always | No action | Idle_State |
Req_Rx | Enabled | Variant = SIBO Send Req_Con with Magic as dataStart re-transmission timer Retries = 4 | Idle_Ack_State |
else | No action | Idle_State | |
Req_Req_Rx | Enabled | Variant = EPOC Send Req_Con with Magic as dataStart re-transmission timer Retries = 4 | Idle_Ack_State |
else | No action | Idle_State | |
Req_Con_Rx | Always | No action | Idle_State |
Data_Rx | Always | No action | Idle_State |
Connect | Always | Enabled = TRUE | Idle_State |
Disconnect | Always | Enabled = FALSE | Idle_State |
Write | Always | Error - not connected | Idle_State |
Timeout | Enabled | Send Req_Req_Pdu Start re-transmission timer | Idle_Req_State |
else | No action | Idle_State |
Event | Condition | Action | Next state |
---|---|---|---|
Ack_Rx | Enabled | Seq_Tx = sequence numberSeq_Rx = 0 Start inactivity timer Connection established | Data_State |
else | No action | Idle_Req_State | |
Disc_Rx | Always | Reset() | Idle_State |
Req_Rx | Enabled | Variant = SIBO SeqTx = 0 Seq_Rx = 0 Send Ack_Pdu with sequence number Seq_Rx Start inactivity timer Connection established | Data_State |
else | No action | Idle_Req_State | |
Req_Req_Rx | Enabled | Variant = EPOC Send Req_Con with Magic as dataStart re-transmission timer Retries = 4 | Idle_Ack_State |
else | No action | Idle_Req_State | |
Req_Con_Rx | Always | No action | Idle_Req_State |
Data_Rx | Always | No action | Idle_Req_State |
Connect | Always | Error - already enabled | Idle_Req_State |
Disconnect | Always | Enabled = FALSE Send Disc_Pdu Reset() | Idle_State |
Write | Always | Error - not connected | Idle_Req_State |
Timeout | Enabled | Try next baud rate if attempting auto-baud rate identification Send Req_Req_Pdu Start re-transmission timer | Idle_Req_State |
else | Reset() | Idle_State |
Event | Condition | Action | Next state |
---|---|---|---|
Ack_Rx | Enabled | Seq_Tx = sequence numberSeq_Rx = 0 Start inactivity timer Connection established | Data_State |
else | No action | Idle_Ack_State | |
Disc_Rx | Always | Reset() | Idle_State |
Req_Rx | Enabled | Variant = SIBO SeqTx = 0 Seq_Rx = 0 Send Ack_Pdu with sequence number Seq_Rx Start inactivity timer Connection established | Data_State |
else | No action | Idle_Ack_State | |
Req_Req_Rx | Enabled | Variant = EPOC Send Req_Con with Magic as dataStart re-transmission timer Retries = 4 | Idle_Ack_State |
else | No action | Idle_Ack_State | |
Req_Con_Rx | Enabled and ( magic number != Magic) | Variant = EPOC Seq_Tx = 0 Seq_Rx = 0 Send Ack_Pdu with sequence number Seq_Rx Start inactivity timer Connection established | Data_State |
else | No action | Idle_Ack_State | |
Data_Rx | Always | No action | Idle_Ack_State |
Connect | Always | Error - already enabled | Idle_Ack_State |
Disconnect | Always | Enabled = FALSE Send Disc_Pdu Reset() | Idle_State |
Write | Always | Error - not connected | Idle_Ack_State |
Timeout | Enabled and (0 < Retries) | Retries = Retries - 1 Send Req_Con with Magic as data | Idle_Ack_State |
else | Reset | Idle_State |
Event | Condition | Action | Next state |
---|---|---|---|
Ack_Rx | Always | No action | Data_State |
Disc_Rx | Always | Reset() Connection terminated | Idle_State |
Req_Rx | Always | Reset() Connection terminated | Idle_State |
Req_Req_Rx | Always | Reset() Connection terminated | Idle_State |
Req_Con_Rx | Always | Reset() Connection terminated | Idle_State |
Data_Rx | sequence number == Inc(Seq_Rx) | Seq_Rx = Inc(Seq_Rx) Send Ack_Pdu with sequence number Seq_Rx Start inactivity timer | Data_State |
else | Send Ack_Pdu with sequence number Seq_Rx | Data_State | |
Connect | Always | Error - already enabled | Data_State |
Disconnect | Always | Enabled = FALSE Send Disc_Pdu Reset() Connection terminated | Idle_State |
Write | Always | Seq_Tx = Inc(Seq_Tx) Send Data_Pdu with sequence number Seq_Tx Start re-transmission timer Retries = 8 | Data_Ack_State |
Timeout | Always | Send Disc_Pdu Reset() Connection terminated | Idle_State |
Event | Condition | Action | Next state |
---|---|---|---|
Ack_Rx | sequence number == Seq_Tx | Start inactivity timer | Data_State |
else | No action | Data_Ack_State | |
Disc_Rx | Always | Reset() Connection terminated | Idle_State |
Req_Rx | Always | Reset() Connection terminated | Idle_State |
Req_Req_Rx | Always | Reset() Connection terminated | Idle_State |
Req_Con_Rx | Always | Reset() Connection terminated | Idle_State |
Data_Rx | sequence number == Inc(Seq_Rx) | Seq_Rx = Inc(Seq_Rx) Send Ack_Pdu with sequence number Seq_Rx Start re-transmission timer | Data_Ack_State |
else | Send Ack_Pdu with sequence number Seq_Rx | Data_Ack_State | |
Connect | Always | Error - already enabled | Data_Ack_State |
Disconnect | Always | Enabled = FALSE Send Disc_Pdu Reset() Connection terminated | Idle_State |
Write | Always | Error - connection busy | Data_Ack_State |
Timeout | 0 < Retries | Retries = Retries - 1 Send Data_Pdu with sequence number Seq_Tx Start re-transmission timer | Data_Ack_State |
else | Send Disc_Pdu Reset() Connection terminated | Idle_State |
From host | From R380 | Description |
---|---|---|
0x41 0x54 0x2a 0x45 0x53 0x59 0x4e 0x3d 0x31 0x0d | Request PLP mode: AT*ESYN=1 | |
0x41 0x54 0x2a 0x45 0x53 0x59 0x4e 0x3d 0x31 0x0d | Echo command: AT*ESYN=1 | |
0x0d 0x0a 0x4f 0x4b 0x0d 0x0a | Acknowledge command: OK | |
0x11 0x11 | Start PLP operation |
A peer to peer PLP connection is then established as described above.
Req_Req_Pdu
the Erisson R380 sends a single DC1 character and returns to "AT" mode.
LINK
channel used to register additional servers. Other channels are dynamically allocated as required.
Bytes | 1 | 1 | 1 | n |
---|---|---|---|---|
Data | Destination channel | Source channel | Frame type | Data |
The channel pair (Source channel and Destination channel) specifies a connection between two processes. PDUs for channel 0 are expedited; they must be delivered and processed before any PDUs for other channels.
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | 0x00 | Channel | 0x01 |
Block transmission of frames to the specified Channel until an XON frame is received. All channels default to being unblocked.
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | 0x00 | Channel | 0x02 |
Unblock transmission of frames to the specified Channel. This reverses the effect on an XOFF frame.
Bytes | 1 | 1 | 1 | n |
---|---|---|---|---|
Data | 0x00 | Client channel | 0x03 | Server name |
A client is requesting connection to the server called Server name. A Connect Response frame is always sent in reply.
The maximum length of the server name field is 16 characters, including the NUL terminator.
Bytes | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|
Data | 0x00 | Server channel | 0x04 | Client channel | Status code |
This is the reply sent in response to a Connect frame. The source channel is set to the server's channel if the connection was successful, or 0 for the control channel otherwise. The Status code is zero (E_SIBO_NONE
) for a successful connection, or non-zero (E_SIBO_FILE_NXIST
) if the server cannot be found.
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | 0x00 | Server channel | 0x05 |
The specified server has disconnected all clients.
Bytes | 1 | 1 | 1 | 1 | 4 |
---|---|---|---|---|---|
Data | 0x00 | 0x00 | 0x06 | Version | ID |
This is the first frame that is sent by an invocation of NCP when a connection has been established. It enables the NCP and servers to adapt to the capabilities of the other device.
The following Version numbers are currently used:
Version | Description |
---|---|
0x02 | SIBO (old) |
0x03 | SIBO (new) |
0x06 | EPOC (ER3) |
0x10 | EPOC (ER5) |
For maximum compatibility it is recommended that 6 be used if the data link layer has identified the EPOC variant of the protocol, and 2 be used otherwise. The behaviour of servers should be controlled by the received version number.
The ID is a unique identifier for the current NCP process. It does not appear to be used for anything, so it is probably sufficient to generate a pseudo-random number.
Bytes | 1 | 1 | 1 | 1 |
---|---|---|---|---|
Data | 0x00 | Client channel | 0x07 | Server channel |
The specified client has disconnected from the specified server.
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | 0x00 | Channel | 0x08 |
The NCP has shut down.
Bytes | 1 | 1 | 1 | n |
---|---|---|---|---|
Data | Destination channel | Source channel | 0x01 | Data |
A Complete frame serves as either the final frame in a series of Partial frames which make a single large frame, or as a single frame which fits into the data link layer's frame size.
Bytes | 1 | 1 | 1 | n |
---|---|---|---|---|
Data | Destination channel | Source channel | 0x02 | Data |
A Partial frame is sent as one of a series that should be re-assembled to form a larger frame.
From device 1 | From device 2 |
---|---|
NCP Information frame | NCP Information frame |
Connect frame for LINK.* | Connect frame for LINK.* |
Connect frame for other servers | Connect frame for other servers |
Connect Response frames | Connect Response frames |
Due to the asynchronous nature of the protocol, the Connect Response frames may occur at any time after the corresponding Connect frame has been sent. Also, with the exception of the LINK.*
connection, the Connect frames may be sent at any time to connect to additional servers.
From disconnecting device |
---|
Disconnection frames and Connection Termination frames for each connection |
NCP Termination frame |
Note that no confirmations are received; it is the responsibility of the data link layer to ensure that the frames are communicated without errors. Connect frames received during this sequence should be ignored; the remote device may attempt to re-establish terminated connections.
LINK
server is closely associated with the NCP; it is always connected before any other servers, always uses channel 1, and allows allows additional servers to be registered. The name "LINK.*
" is used in the Connect frame to start the LINK
server.
LINK
only supports a single command.
Bytes | 1 | 2 | n |
---|---|---|---|
Data | 0x00 | Operation ID | Server name |
or:
Bytes | 1 | 2 | n | 1 | 1 | 4 |
---|---|---|---|---|---|---|
Data | 0x00 | Operation ID | Server name | Major version | Minor version | Build |
Reply:
Bytes | 1 | 2 | 2 | 2 | n |
---|---|---|---|---|---|
Data | 0x01 | Operation ID | Status code | ??? | Server name |
This command is used to register a server for connection using a Connect frame. It should normally be tried after a connection has been unsuccessfully attempted.
The Operation ID is a unique identifier used to verify that commands and replies match. A different value within the range 0 to 65535 should be generated for each command, and the reply checked to confirm that it contains the same value.
The Server name in the command is the name of the required server, but without any extension specified. If the reply contains a valid Server name (at least 4 characters long and not containing any control characters) then that should be used as the name within the Connect frame, otherwise ".*
" should be appended to the name specified in the command.
The second form of the command allows a minimum version of the server to be specified. The two forms behave identically if the Version and Build are both set to 0.
A typical sequence of operations would be:
From client | From server |
---|---|
Connect frame for SYS$RPCS.* | |
Connect Response frame indicating failure | |
Link Register command for SYS$RPCS | |
Link Register response specifying SYS$RPCS.* | |
Connect frame for SYS$RPCS.* | |
Connect Response frame indicating success |
RPCS
server provides Remote Command Services. This supports general operations, such as launching and terminating processes. The name "SYS$RPCS.*
" is used in the Connect frame to start the RPCS
server. However, as mentioned above, it may be necessary to use the Link Register command to register the server first. On some SIBO devices, the RPCS
server is not present by default, and is normally downloaded as M:\SYS$RPCS.IMG
by either RCOM or PsiWin.
Note that the Ericsson R380 uses the name "SYS$RPCSU.*
" instead, where the additional "U
" in the name indicates that Unicode strings are used.
RPCS
command frames generate a response frame. The first byte of the response is a result code; this is always a SIBO status code, even with the EPOC variant of the protocol. However, the SIBO variant uses the SIBO character set for any text strings, and the EPOC variant uses the EPOC character set.
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | 0x00 | Major version | Minor version |
Reply:
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | Status code | Major version | Minor version |
Exchange NCP version numbers.
All existing implementations use a Major version of 1, with the Minor version varying between 1 and 30.
Bytes | 1 | 128 | 1 | n |
---|---|---|---|---|
Data | 0x01 | Program name | Arguments length | Arguments |
Reply:
Bytes | 1 |
---|---|
Data | Status code |
Start a copy of Program name with the specified Arguments.
If the Program name is shorter than 128 characters then it is padded to 128 characters with 0 bytes, otherwise the field is extended as required. The Arguments length field specifies the length of the Arguments string, excluding the terminator character.
Bytes | 1 | 1 |
---|---|---|
Data | 0x02 | Drive letter |
Reply:
Bytes | 1 | Repeated fields: | |
---|---|---|---|
ni | mi | ||
Data | Status code | Program name | Arguments |
List the programs with open files on the specified drive.
The EPOC variant lists all applications, regardless of which drive they are using. The result is a list of Program name and Argument pairs; one for each open program.
Bytes | 1 | n |
---|---|---|
Data | 0x03 | Program name |
Reply:
Bytes | 1 |
---|---|
Data | Status code |
Attempt to terminate the specified process.
This may result in the application opening a dialogue box to allow any modifications to be saved. NCP_PROG_RUNNING can be used to detect when the process has been stopped.
Bytes | 1 | n |
---|---|---|
Data | 0x04 | Program name |
Reply:
Bytes | 1 |
---|---|
Data | Status code |
Check whether the specified process is running.
This returns E_SIBO_NONE
if the process is running, or E_SIBO_FILE_NXIST
otherwise.
Bytes | 1 | n |
---|---|---|
Data | 0x05 | Device name |
Reply:
Bytes | 1 | 2 | 2 |
---|---|---|---|
Data | Status code | Handle | Count |
Initiate formatting a drive.
This is a slow process, so NCP_FORMAT_READ should be called Count times with the returned Handle to progress the format.
Bytes | 1 | 2 |
---|---|---|
Data | 0x06 | Handle |
Reply:
Bytes | 1 |
---|---|
Data | Status code |
Continue formatting a drive.
The Handle returned by NCP_FORMAT_OPEN must be passed to specify the operation to progress.
Bytes | 1 | n |
---|---|---|
Data | 0x07 | Device name |
Reply:
Bytes | 1 | 4 |
---|---|---|
Data | Status code | Unique ID |
Read the Unique ID for the specified removable device.
Bytes | 1 |
---|---|
Data | 0x08 |
Reply:
Bytes | 1 | n |
---|---|---|
Data | Status code | Owner information (not NUL terminated) |
Read the user information.
The returned Owner information is plain text; any formatting is stripped.
Bytes | 1 |
---|---|
Data | 0x09 |
Reply:
Bytes | 1 | 2 |
---|---|---|
Data | Status code | Machine type |
Read the type of the remote machine.
The following Machine type numbers are currently used:
Machine type | Description |
---|---|
0x00 | Unknown |
0x01 | PC |
0x02 | MC |
0x03 | HC |
0x04 | Series 3 |
0x05 | Series 3a, 3c, or 3mx |
0x06 | Workabout |
0x07 | Sienna |
0x08 | Series 3c |
0x20 | Series 5 |
0x21 | WinC |
Be careful; some of these values are untested.
Bytes | 1 | n |
---|---|---|
Data | 0x0a | Process name |
Reply:
Bytes | 1 | n |
---|---|---|
Data | Status code | Program name |
Bytes | 1 | n | 1 | m |
---|---|---|---|---|
Data | Status code | Program name | m | Command line (not NUL terminated) |
Bytes | 1 | n | 256 - n | m | 40 - m |
---|---|---|---|---|---|
Data | Status code | Program name | m | Command line | ??? |
Read the Command line for Process name.
The first form of the reply is used if there is no open file. The other two forms are used by the EPOC and SIBO variants respectively.
Bytes | 1 | n |
---|---|---|
Data | 0x0b | File name |
Reply:
Bytes | 1 | n |
---|---|---|
Data | Status code | Process name |
Find the Process name of the program using the named file.
Bytes | 1 |
---|---|
Data | 0x64 |
Reply:
Bytes | 1 | 4 | 1 | 1 | 2 | 8 | 16 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 88 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Data | Status code | Machine type | Major ROM version | Minor ROM version | ROM build | Reserved | Machine name | Display width | Display height | Machine UID low | Machine UID high | Time low | Time high | Country code | UTC offset | DST | DST zone | Main battery inserted low | Main battery inserted high | Main battery status | Main battery used low | Main battery used high | Main battery current | Main battery used power | Main battery voltage | Main battery max voltage | Backup battery status | Backup battery voltage | Backup battery maximum voltage | External power | External power used low | External power used high | ??? | RAM size | ROM size | RAM maximum free | RAM free | RAM disk size | Registry size | ROM reprogrammable | Language | Reserved |
This command is only supported by the EPOC variant of the protocol.
See NCP_GET_MACHINE_TYPE for a description of the possible Machine type values.
The Major ROM version, Minor ROM version, and ROM build fields combine to give the version number of the operating system. This is typically displayed with the Major ROM version followed by a decimal point, Minor ROM version using two digits, and finally the ROM build in brackets. All values are displayed in decimal.
The Machine name is a string giving a textual description of the machine type and revision.
The Display width and Display height indicate the size of the LCD in pixels.
The Machine UID low and Machine UID high fields combine to form a 64 bit unique identifier for this machine.
See NCP_SET_TIME for a description of the Time low, Time high, Country code, UTC offset, DST and DST zone values.
The Main battery inserted low and Main battery inserted high fields combine to form a 64 bit date specifying when the main batteries were inserted, specified as the number of micro-seconds since 00:00 on 1st January 1.
Main battery status gives the condition of the main batteries. See RFSV32_VOLUME for a description of the possible values.
The Main battery used low and Main battery used high fields combine to form a 64 bit value giving the number of micro-seconds that the main battery has been used.
Main battery current is the main battery current in milli-amps.
Main battery used power is the integrated main battery usage in mA-seconds.
Main battery voltage and Main battery max voltage give the current and maximum main battery voltages in milli-volts.
Backup battery status gives the condition of the backup batteries. See RFSV32_VOLUME for a description of the possible values.
Backup battery voltage and Backup battery maximum voltage give the current and maximum backup battery voltages in milli-volts.
The External power field indicates whether the machine is operating on external power.
The External power used low and External power used high fields combine to form a 64 bit value giving the number of micro-seconds that the machine has been operating on external power.
RAM size and ROM size give the total size of ROM and RAM fitted.
RAM maximum free and RAM free give the maximum and current free RAM in bytes.
RAM disk sizeis the current size of the internal RAM disk in bytes.
Registry size is the current size of the registry in bytes.
The ROM reprogrammable field indicates whether the ROM can be modified.
The Language may be one of the following:
Language | Description |
---|---|
0x00 | Test |
0x01 | UK English |
0x02 | French |
0x03 | German |
0x04 | Spanish |
0x05 | Italian |
0x06 | Swedish |
0x07 | Danish |
0x08 | Norwegian |
0x09 | Finnish |
0x0A | American English |
0x0B | Swiss French |
0x0C | Swiss German |
0x0D | Portuguese |
0x0E | Turkish |
0x0F | Icelandic |
0x10 | Russian |
0x11 | Hungarian |
0x12 | Dutch |
0x13 | Belgian Flemish |
0x14 | Australian English |
0x15 | Belgian French |
0x16 | Austrian German |
0x17 | New Zealand English |
0x18 | International French |
0x19 | Czech |
0x1A | Slovak |
0x1B | Polish |
0x1C | Slovenian |
0x1D | Taiwan Chinese |
0x1E | Hong Kong Chinese |
0x1F | RPC Chinese |
0x20 | Japanese |
0x21 | Thai |
Bytes | 1 | 2 |
---|---|---|
Data | 0x65 | Handle |
Reply:
Bytes | 1 |
---|---|
Data | Status code |
Close a previously opened resource Handle. This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | ??? |
---|---|---|
Data | 0x66 | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | ??? |
---|---|---|
Data | 0x67 | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | ??? |
---|---|---|
Data | 0x68 | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | ??? |
---|---|---|
Data | 0x69 | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | ??? |
---|---|---|
Data | 0x6a | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | 4 | 4 | 4 | 4 | 4 | 4 |
---|---|---|---|---|---|---|---|
Data | 0x6b | Time low | Time high | Country code | UTC offset | DST | DST zone |
Reply:
Bytes | 1 |
---|---|
Data | Status code |
Set the clock. This command is only supported by the EPOC variant of the protocol.
The Time low and Time high fields combine to form a 64 bit date, specified as the number of micro-seconds since 00:00 on 1st January 1 in the home time zone.
The Country code indicates the country of the home time zone. This is 0 for most countries, but should probably be the international dial code.
The UTC offset is the number of seconds offset of the home time zone from UTC.
The DST consists of a combination of the following flags, specifying which zones daylight saving time is active:
DST zone | Description |
---|---|
0x00000000 | None |
0x00000001 | European |
0x00000002 | Northern |
0x00000004 | Southern |
0x40000000 | Home |
The DST zone is a single flag, from those listed above, specifying which DST zone the home time zone is part of.
The easiest way to use this command is to read the various time zone and DST fields using NCP_GET_MACHINE_INFO and just change the Time low and Time high fields to the new time.
Bytes | 1 | ??? |
---|---|---|
Data | 0x6c | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | ??? |
---|---|---|
Data | 0x6d | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | ??? |
---|---|---|
Data | 0x6e | ??? |
Reply:
Bytes | 1 | ??? |
---|---|---|
Data | Status code | ??? |
This command is only supported by the EPOC variant of the protocol.
Bytes | 1 | 1 |
---|---|---|
Data | 0x6f | Drive letter |
Reply:
Bytes | 1 | 2 |
---|---|---|
Data | Status code | Handle |
Start a query to read the files open on the specified drive. This command is only supported by the EPOC variant of the protocol.
NCP_QUERY_READ should be called repeatedly with the returned Handle to read the details, and NCP_CLOSE_HANDLE should be called to close the Handle when finished.
Bytes | 1 | 2 |
---|---|---|
Data | 0x70 | Handle |
Reply:
Bytes | 1 | Repeated fields: | |
---|---|---|---|
ni | mi | ||
Data | Status code | Program name | Arguments |
List the programs with open files on the specified drive. This command is only supported by the EPOC variant of the protocol.
NCP_QUERY_OPEN should be used to obtain the Handle. The result is a list of Program name and Argument pairs; one for each open program. This should be called repeatedly until no further details are returned.
Bytes | 1 |
---|---|
Data | 0xff |
Reply:
Bytes | 1 |
---|---|
Data | Status code |
Quit the RPCS
server.
It is not necessary to use this command; use of the Connection Termination frame is adequate.
RFSV
server provides Remote File Services. This provides a remote interface that behaves similarly to local file accesses; files must be opened before they can be read or written, and a sequential file pointer is maintained for each open file. A current directory is also maintained, allowing use of relative file names.
The name "SYS$RFSV.*
" is used in the Connect frame to start the RFSV
server. The Ericsson R380 uses the name "SYS$RFSVU.*
" instead, where the additional "U
" in the name indicates that Unicode strings are used.
The version number specified in the NCP Information frame selects the RFSV
version; a value of 6 or higher is required to use the EPOC variant, otherwise the SIBO variant is used.
RFSV
command frames have the following general format:
Bytes | 2 | 2 | n |
---|---|---|---|
Data | Reason code | n | Request data |
The maximum length of Request data is 852 bytes, leading to a maximum command frame size of 856 bytes.
All RFSV
reply frames have the following general format:
Bytes | 2 | 2 | 2 | n |
---|---|---|---|---|
Data | 0x2a | n + 2 | Status code | Reply data |
The Status code is a SIBO status code.
The maximum length of Reply data is 852 bytes, leading to a maximum reply frame size of 858 bytes. To make allowance for possibly buggy implementations, it is recommended that at most 640 bytes of data are read or written to a file in a single operation, but all received frames up to the maximum size of 858 bytes should be accepted.
The SIBO character set is used for any text strings.
Bytes | 2 | 2 | 2 | n |
---|---|---|---|---|
Data | 0x00 | Frame length | Mode | File name |
Reply:
Bytes | 2 | 2 | 2 | 2 |
---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Handle |
Open File name for reading or writing via the returned Handle.
The Mode consists of one of the following operations:
Mode | Description |
---|---|
0x0000 | Open an existing file |
0x0001 | Create a new file |
0x0002 | Create a new file, or truncate an existing file to zero length |
0x0003 | Append to an existing file |
0x0004 | Create a new file with a unique name |
combined with one of these stream types:
Mode | Description |
---|---|
0x0000 | Open as a binary stream |
0x0010 | Open as a text stream |
0x0020 | Open as a binary record |
0x0030 | Open as a directory record |
0x0040 | Open as a format |
0x0050 | Open as a device list |
0x0060 | Open as a node list |
and any of the following flags:
Mode | Description |
---|---|
0x0100 | Open for read and write access |
0x0200 | Open for random access |
0x0400 | Open for sharing |
RFSV16_FCLOSE must be used to close the Handle when it is no longer required.
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x02 | Frame length | Handle |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Close the Handle previously opened using RFSV16_FOPEN or RFSV16_OPENUNIQUE.
Bytes | 2 | 2 | 2 | 2 |
---|---|---|---|---|
Data | 0x04 | Frame length | Handle | Length |
Reply:
Bytes | 2 | 2 | 2 | n |
---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Data |
Read Length bytes from the file identified by Handle.
The reply contains the Length bytes of data read.
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x06 | Frame length | Handle |
Reply:
Bytes | 2 | 2 | 2 | 2 | Repeated fields: | |||||
---|---|---|---|---|---|---|---|---|---|---|
2 | 2 | 4 | 4 | 4 | ni | |||||
Data | 0x2a | Frame length | Status code | Buffer length | Version | Attributes | Size | Modified | Reserved | File name |
Read entries from the directory specified by Handle.
The reply contains details of entries from the specified directory. To read all of the directory entries this operation should be repeated until the returned Status code is E_SIBO_FILE_EOF
.
The Buffer length is the length of the repeated fields, i.e. Frame length - 4.
The Attrubutes consists of a combination of the following flags:
Attribute | Description |
---|---|
0x0001 | Writeable |
0x0002 | Hidden |
0x0004 | System |
0x0008 | Volume label |
0x0010 | Directory |
0x0020 | Modified |
0x0100 | Readable |
0x0200 | Executable |
0x0400 | Stream |
0x0800 | Text |
The Size is simply the length of the file in bytes.
The Modified date is specified as the number of seconds since 13:00 on 1st January 1970. This is always a multiple of two.
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x08 | Frame length | Handle |
Reply:
Bytes | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 4 | n | 2 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Version | Media type | Removable | Size | Free | Volume label | Battery status | Reserved |
Read information about the device specified by Handle.
The Media type consists of a type:
Media type | Description |
---|---|
0x0000 | Not a known type |
0x0001 | Floppy disk |
0x0002 | Hard disk |
0x0003 | Flash disk |
0x0004 | RAM |
0x0005 | ROM |
0x0006 | Write protected |
combined with any of the following flags:
Media type | Description |
---|---|
0x0800 | Formattable |
0x1000 | Dual density |
0x2000 | Internal |
0x4000 | Dynamic |
0x8000 | Compressible |
The Removable flag is non-zero for a removable device, or zero otherwise.
Size and Free give the total size and the remaining free space on the device.
The Battery status may be one of the following:
Media type | Description |
---|---|
0 | Dead |
1 | Very low |
2 | Low |
3 | Good |
Bytes | 2 | 2 | 2 | n |
---|---|---|---|---|
Data | 0x0a | Frame length | Handle | Data |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Write Data to the file identified by Handle.
The number of bytes is not explicitly specified; this is inferred from the size of the frame.
Bytes | 2 | 2 | 2 | 4 | 2 |
---|---|---|---|---|---|
Data | 0x0c | Frame length | Handle | Seek offset | Sense |
Reply:
Bytes | 2 | 2 | 2 | 4 |
---|---|---|---|---|
Data | 0x2a | Frame length | Status code | New offset |
Reposition the sequential file pointer for the file specified by Handle.
The interpretation of the signed New offset value depends on the Sense specified:
Sense | Description |
---|---|
0x0001 | Absolute position from the start of the file |
0x0002 | Offset from the current position |
0x0003 | Offset from the end of the file |
0x0004 | Read the current position without changing it |
0x0005 | Set |
0x0006 | Rewind |
The value of the sequential file pointer after the seek is returned as New offset.
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x0e | Frame length | Handle |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Flush to disk any cached data for the file specified by Handle.
Bytes | 2 | 2 | 2 | 4 |
---|---|---|---|---|
Data | 0x10 | Frame length | Handle | Size |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Set the length of the file specified by Handle to Size bytes.
Bytes | 2 | 2 | n | m |
---|---|---|---|---|
Data | 0x12 | Frame length | Source name | Destination name |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Rename Source name to Destination name.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x14 | Frame length | File name |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Delete File name.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x16 | Frame length | File name |
Reply:
Bytes | 2 | 2 | 2 | 2 | 2 | 4 | 4 | 4 |
---|---|---|---|---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Version | Attributes | Size | Modified | Reserved |
Read details about File name.
See RFSV16_FDIRREAD for a description of the returned values.
Bytes | 2 | 2 | 2 | 2 | n |
---|---|---|---|---|---|
Data | 0x18 | Frame length | Set | Mask | File name |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Set the Mask attributes of File name to the state specified by Set.
See RFSV16_FDIRREAD for a description of the possible attribute values.
If both the Set and Mask values are both specified as 0x0008
, indicating a volume label, then this changes the volume label. As an example, if File name is C:\FOOBAR
then it will set the volume label for drive C:
to FOOBAR
.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x1a | Frame length | File name |
Reply:
Bytes | 2 | 2 | 2 | n |
---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Parsed name |
Parse File name to give Parsed name.
This can be used to remove wildcards from a file name.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x1c | Frame length | Directory name |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Create a new directory called Directory name.
Bytes | 2 | 2 | 2 | n |
---|---|---|---|---|
Data | 0x1e | Frame length | Mode | File name |
Reply:
Bytes | 2 | 2 | 2 | 2 | n |
---|---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Handle | Opened name |
Open File name for reading or writing via the returned Handle.
See RFSV16_FOPEN for a description of the possible Mode values.
The actual name of the file opened is returned as Opened name. This is useful when requesting a unique file to be opened.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x20 | Frame length | Device name |
Reply:
Bytes | 2 | 2 | 2 | 2 | 2 | 2 | 4 | 4 | n | 2 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Version | Media type | Removable | Size | Free | Volume label | Battery status | Reserved |
Read the status of the device specified by Device name.
See RFSV16_FDEVICEREAD for details of the returned values.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x22 | Frame length | File name |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Check if File name specifies a valid path.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x24 | Frame length | File system |
Reply:
Bytes | 2 | 2 | 2 | 2 | 2 | 2 |
---|---|---|---|---|---|---|
Data | 0x2a | Frame length | Status code | Version | Type | Formattable |
Read the status of the specified File system.
Bytes | 2 | 2 | n |
---|---|---|---|
Data | 0x26 | Frame length | Directory name |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Change the current directory to Directory name.
Bytes | 2 | 2 | 4 | n |
---|---|---|---|---|
Data | 0x28 | Frame length | Modified | File name |
Reply:
Bytes | 2 | 2 | 2 |
---|---|---|---|
Data | 0x2a | Frame length | Status code |
Set the Modified date of File name.
The date is specified as number of seconds since 13:00 on 1st January 1970.
RFSV
command frames have the following general format:
Bytes | 2 | 2 | n |
---|---|---|---|
Data | Reason code | Operation ID | Request data |
All RFSV
reply frames have the following general format:
Bytes | 2 | 2 | 4 | n |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Reply data |
The Operation ID is a unique identifier used to verify that commands and replies match. A different value within the range 0 to 65535 should be generated for each command, and the reply checked to confirm that it contains the same value.
The Status code is an EPOC status code.
The maximum frame size is not well defined, but to avoid potential incompatibilities it is recommended that at most 2048 bytes of data are read or written to a file in a single operation, but all received frames up to a maximum size of 2079 bytes should be accepted.
Strings are usually passed as a 2 byte length followed by the data using the EPOC character set. Strings are not NUL terminated. The most significant bit of the length field may be set to indicate Unicode strings.
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x01 | Operation ID | Handle |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Close the Handle previously opened using RFSV32_OPEN_DIR, RFSV32_OPEN_FILE, RFSV32_TEMP_FILE, RFSV32_CREATE_FILE, RFSV32_REPLACE_FILE or RFSV32_OPEN_DIR_UID.
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x10 | Operation ID | Attributes | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Handle |
Open a Handle to read files that match the wildcarded File name.
RFSV32_READ_DIR should be used to read the list of matching files. The description for that command also details the possible Attributes that may be specified.
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x12 | Operation ID | Handle |
Reply:
Bytes | 2 | 2 | 4 | Repeated fields: | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 to 3 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | ni | 0 to 3 | mi | ||||
Data | 0x11 | Operation ID | Status code | Alignment | Short name length | Attributes | Size | Modified low | Modified high | UID 1 | UID 2 | UID 3 | Long name length | Long name | Alignment | Short name |
Read directory entries specified by the Handle previously opened using RFSV32_OPEN_DIR.
The reply contains details of entries from the specified directory. To read all of the directory entries this operation should be repeated until the returned Status code is E_EPOC_EOF
.
Two names are returned for each file. The Long name is the actual name of the file, and the Short name is the SIBO compatible version. Unlike the other commands, the lengths of these strings are specified by 4 byte values. If the Short name length is 0 then the Short name field is omitted, and both names should be treated as being identical.
The Attributes consist of a combination of the following flags:
Attribute | Description |
---|---|
0x0001 | Read only |
0x0002 | Hidden |
0x0004 | System |
0x0010 | Directory |
0x0020 | Archive |
0x0040 | Volume label |
0x0080 | Normal |
0x0100 | Temporary |
0x0800 | Compressed |
The Size is simply the length of the file in bytes.
The Modified low and Modified high fields combine to form a 64 bit modification date, specified as the number of micro-seconds since 00:00 on 1st January 1.
The UID 1, UID 2 and UID 3 fields are the first three words of the file, and indicate the type of data it contains. These fields are only valid if bit 28 (0x10000000
) of the Attributes was passed to RFSV32_OPEN_DIR. The UIDs for some of the standard applications are:
Application | UID 1 | UID 2 | UID 3 |
---|---|---|---|
Word | 0x10000037 | 0x1000006D | 0x1000007F |
Sheet | 0x10000037 | 0x1000006D | 0x10000088 |
Record | 0x10000037 | 0x1000006D | 0x1000007E |
OPL | 0x10000037 | 0x1000006D | 0x10000085 |
Data | 0x10000050 | 0x1000006D | 0x10000086 |
Agenda | 0x10000050 | 0x1000006D | 0x10000084 |
Sketch | 0x10000037 | 0x1000006D | 0x1000007D |
The two Alignment fields ensure that the offset for the start of the following field is a multiple of 4 bytes.
Bytes | 2 | 2 |
---|---|---|
Data | 0x13 | Operation ID |
Reply:
Bytes | 2 | 2 | 4 | 26 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Drive list |
Read the status of all drives.
A single byte is returned for each drive letter A:
to Z:
.
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x14 | Operation ID | Drive |
Reply:
Bytes | 2 | 2 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | n |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Media type | Battery status | Drive attributes | Media attributes | UID | Size low | Size high | Free low | Free high | Volume label length | Volume label |
Read information about a single device.
The Drive is the number of the device, from 0 for A:
to 25 for Z:
.
The Media type may be one of the following:
Media type | Description |
---|---|
0 | Not present |
1 | Not a known type |
2 | Floppy disk |
3 | Hard disk |
4 | CD-ROM |
5 | RAM |
6 | Flash disk |
7 | ROM |
8 | Remote |
The Battery status may be one of the following:
Battery status | Description |
---|---|
0 | Dead |
1 | Very low |
2 | Low |
3 | Good |
The Drive attributes consists of the following flags:
Drive attribute | Description |
---|---|
0x01 | Local |
0x02 | ROM |
0x04 | Redirected |
0x08 | Substituted |
0x10 | Internal |
0x20 | Removable |
The Media attributes consists of the following flags:
Media attribute | Description |
---|---|
0x01 | Variable size |
0x02 | Dual density |
0x04 | Formattable |
0x08 | Write protected |
The Size low and Size high fields combine to give the 64 bit total size, and the Free low and Free high fields combine to give the 64 bit remaining free space on the device.
Unlike the other commands, the length of the Volume label string is specified by the 4 byte Volume label length.
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x15 | Operation ID | Drive | Volume label |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Set the Volume label of a device.
The Drive is the number of the device, from 0 for A:
to 25 for Z:
.
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x16 | Operation ID | Mode | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Handle |
Open File name for reading or writing via the returned Handle.
The Mode consists of one of the following sharing types:
Mode | Description |
---|---|
0x0000 | Exclusive access |
0x0001 | Share for read access |
0x0002 | Share for any access |
combined with one of these stream types:
Mode | Description |
---|---|
0x0000 | Open as a binary stream |
0x0020 | Open as a text stream |
and any of the following flags:
0X0200 | Open for read and write access |
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x17 | Operation ID | Mode | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 | 2 + n |
---|---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Handle | Opened name |
Create a new file with a unique file name for reading or writing via the returned Handle.
See RFSV32_OPEN_FILE for a description of the possible Mode values.
The actual name of the file opened is returned as Opened name.
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x18 | Operation ID | Handle | Length |
Reply:
Bytes | 2 | 2 | 4 | n |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Data |
Read Length bytes from the file identified by Handle.
The reply contains the Length bytes of data read.
Bytes | 2 | 2 | 4 | n |
---|---|---|---|---|
Data | 0x19 | Operation ID | Handle | Data |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Write Data to the file identified by Handle.
The number of bytes is not explicitly specified; this is inferred from the size of the frame.
Bytes | 2 | 2 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x1a | Operation ID | Seek offset | Handle | Sense |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | New offset |
Position the sequential file pointer for the file specified by Handle.
The interpretation of the signed New offset value depends on the Sense specified:
Sense | Description |
---|---|
0x0001 | Absolute position from the start of the file |
0x0002 | Offset from the current position |
0x0003 | Offset from the end of the file |
0x0004 | Read the current position without changing it |
0x0005 | Set |
0x0006 | Rewind |
The value of the sequential file pointer after the seek is returned as New offset.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x1b | Operation ID | File name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Delete File name.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x1c | Operation ID | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | n | 0 to 3 | m |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Short name length | Attributes | Size | Modified low | Modified high | UID 1 | UID 2 | UID 3 | Long name length | Long name | Alignment | Short name |
Read details about File name.
See RFSV32_READ_DIR for a description of the returned values.
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x1d | Operation ID | Handle |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Flush to disk any cached data for the file specified by Handle.
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x1e | Operation ID | Handle | Size |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Set the length of the file specified by Handle to Size bytes.
Bytes | 2 | 2 | 2 + n | 2 + m |
---|---|---|---|---|
Data | 0x1f | Operation ID | Source name | Destination name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Rename Source name to Destination name.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x20 | Operation ID | Directory name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Create a new directory called Directory name.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x21 | Operation ID | Directory name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Delete the directory called Directory name.
Bytes | 2 | 2 | 4 | 4 | 2 + n |
---|---|---|---|---|---|
Data | 0x22 | Operation ID | Set | Clear | File name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Set the Set attributes and clear the Clear attributes of File name.
See RFSV32_READ_DIR for a description of the possible attribute values.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x23 | Operation ID | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Attributes |
Read the attributes for File name.
See RFSV32_READ_DIR for a description of the possible attribute values.
Bytes | 2 | 2 | 4 | 4 | 2 + n |
---|---|---|---|---|---|
Data | 0x24 | Operation ID | Modified low | Modified high | File name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Set the modification date of File name.
The Modified low and Modified high fields combine to form a 64 bit modification date, specified as the number of micro-seconds since 00:00 on 1st January 1.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x25 | Operation ID | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Modified low | Modified high |
Read the modification date of File name.
The Modified low and Modified high fields combine to form a 64 bit modification date, specified as the number of micro-seconds since 00:00 on 1st January 1.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x26 | Operation ID | Directory name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Change the current directory to Directory name.
Bytes | 2 | 2 |
---|---|---|
Data | 0x27 | Operation ID |
Reply:
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Directory name |
Read the current directory.
Bytes | 2 | 2 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x28 | Operation ID | Length | Destination handle | Source handle |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Copied |
Copy Length bytes from the file identified by Source handle to Destination handle.
The reply contains the Copied number of bytes.
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x29 | Operation ID | Mode | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Handle |
Create a new file called File name for reading or writing via the returned Handle.
See RFSV32_OPEN_FILE for a description of the possible Mode values.
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x2a | Operation ID | Mode | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Handle |
Create a new file called File name, overwriting any existing file of the same name, for reading or writing via the returned Handle.
See RFSV32_OPEN_FILE for a description of the possible Mode values.
Bytes | 2 | 2 | 2 + n |
---|---|---|---|
Data | 0x2b | Operation ID | File name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Check if File name exists.
Bytes | 2 | 2 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x2d | Operation ID | Length | Offset | Handle |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Lock Length bytes starting from Offset of the file identified by Handle to prevent shared access.
RFSV32_UNLOCK should be used to unlock the file.
Bytes | 2 | 2 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x2e | Operation ID | Length | Offset | Handle |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Unlock Length bytes starting from Offset of the file identified by Handle to allow shared access.
This reverses the action of RFSV32_LOCK.
Bytes | 2 | 2 | 4 | 4 | 4 | 2 + n |
---|---|---|---|---|---|---|
Data | 0x2f | Operation ID | UID 1 | UID 2 | UID 3 | File name |
Reply:
Bytes | 2 | 2 | 4 | 4 |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Hande |
Open a Handle to read files that match the wildcarded File name and UID specification.
RFSV32_READ_DIR should be used to read the list of matching files. The description for that command also describes the UID 1, UID 2 and UID 3 fields.
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x30 | Operation ID | Drive |
Reply:
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x11 | Operation ID | Status code | Volume label |
Read the volume label of a device.
The Drive is the number of the device, from 0 for A:
to 25 for Z:
.
Bytes | 2 | 2 | 4 | 2 + n |
---|---|---|---|---|
Data | 0x31 | Operation ID | Drive | Volume label |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Set the Volume label of a device.
The Drive is the number of the device, from 0 for A:
to 25 for Z:
.
Bytes | 2 | 2 | 2 + n | 2 + m |
---|---|---|---|---|
Data | 0x32 | Operation ID | Source file name | Destination file name |
Reply:
Bytes | 2 | 2 | 4 |
---|---|---|---|
Data | 0x11 | Operation ID | Status code |
Replace Destination file name with Source file name.
ClipBdServer
handles notification about changes to the C:\System\Data\Clpboard.cbd
file that is used to hold the clipboard contents on EPOC devices. This enables CopyAnywhere style functionality to be implemented.
The server is registered using a Link Register command with a parameter of CLIPSVR.RSY
. The name ClipBdServer
is then used in the Connect frame to start the server.
ClipBdServer
implements very few commands:
Bytes | 1 | 2 |
---|---|---|
Data | 0x00 | Version |
Reply:
Bytes | 1 | 2 |
---|---|---|
Data | 0x00 | Version |
Initialise the ClipBdServer
. This should be performed before any other operation.
The Version in both the command and reply is currently always 0x0100
.
Bytes | 1 |
---|---|
Data | 0x04 |
Reply (delayed until the clipboard has changed):
Bytes | 1 |
---|---|
Data | 0x00 |
Wait for the clipboard file to be changed.
Only a single reply will be sent each time that this command is issued. Hence, it must be re-issued after a reply has been received.
Note that the reply is sent for any change to the clipboard file, even if that change was via the PLP connection. Hence, it may be necessary to discard replies if the clipboard is being changed remotely.
Bytes | 1 | 1 |
---|---|---|
Data | 0x08 | 0x00 |
Reply:
Bytes | 1 |
---|---|
Data | 0x08 |
Notify the EPOC device that the clipboard has been modified via the PLP connection. The new clipboard contents can then be pasted into EPOC applications as usual.
Attempting to use this without first modifying the clipboard file results in the server disconnecting.
Bytes | 4 | 4 | 4 | 4 | 4 | 1 | 4 | 4 | 4 | n |
---|---|---|---|---|---|---|---|---|---|---|
Data | UID 1 | UID 2 | UID 3 | UID 4 | Section table offset | Section table length | Section type | Section offset | String length | Data |
The UID 1, UID 2 and UID 3 fields indicate that the file contains clipboard data, and always have the values 0x10000037
, 0x1000003b
and 0x00000000
respectively.
The UID 4 field is a checksum of the preceding fields and always has the value 0x4739d53b
for clipboard files.
The Section table offset points to the file offset of the byte containing the Section table length. If the section table is directly appended to the main header, this results in a value of 0x00000014
.
The Section table length specifies the number of 4 byte words in the section table. Each entry in the section table comprises of a 4 byte Section type and a 4 byte Section offset. Hence, a clipboard file containing just a single text section has a Section table length of 0x02
.
The Section type is 0x10000033
for text.
The Section offset points to the start of the section content. This is 0x0000001d
if the main header is immediately followed by the section table, and that is immediately followed by the section data.
The String length is located at the start of the text section contents and specifies the length of the text string in bytes.
The Data section contains the text string followed by a 0x00
byte. The terminating NUL character is not included in the String length field.
EPOC Code | Description | |
---|---|---|
6 | 0x06 | New paragraph |
7 | 0x07 | New line |
8 | 0x08 | Hard page break |
9 | 0x09 | Tab |
10 | 0x0a | Unbreakable tab |
11 | 0x0b | Hard hyphen |
12 | 0x0c | Soft hyphen |
15 | 0x0f | Visible space |
16 | 0x10 | Hard space |
WPRT
server allows EPOC device to print via the attached device. It provides relatively simple transfer of printer data grouped by page.
The server is registered using a Link Register command with a parameter of SYS$WPRT
. The name "SYS$WPRT.*
" is then used in the Connect frame to start the server.
WPRT
command frames generate a response frame.
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | 0x00 | Major version | Minor version |
Reply:
Bytes | 1 | 1 | 1 |
---|---|---|---|
Data | Status code | Major version | Minor version |
Exchange WPRT
version numbers.
The Status code is an EPOC status code, indicating whether the specified version number was acceptable.
All existing implementations have the Major version and the Minor version set to 2 and 0 respectively.
This commands should be used once, immediately after the connction to the server has been established.
Bytes | 1 |
---|---|
Data | 0xf0 |
Reply:
Bytes | 1 | 1 | 4 | n |
---|---|---|---|---|
Data | Last packet | Last page | Page length | Data |
Bytes | 1 | n |
---|---|---|
Data | Last packet | Data |
Read printer data.
The first form of the reply is used for the first packet of a page, and the second form is used for all other packets.
The Last packet fields indicate whether the packet is the last one in a particular print job:
Last packet | Description |
---|---|
0x2A | Not the last packet |
0xFF | This packet contains end of print job |
The Last page field is only present in the first packet for a particular page. It indicates whether the current page is the last in the print job:
Last packet | Description |
---|---|
0x2A | Not the last page |
0xFF | This page is last of print job |
The Page length field is also only present in the first packet for a particular page. It specifies the length in bytes of the data associate with the current page, i.e. the cumulative length of the Data field in the current reply and successive replies corresponding to the same page.
The Data field contains the byte stream of printer data. The maximum supported packet length is 2048 bytes, corresponding to a maximum length for this field of 2042 or 2047 bytes for the two reply formats respectively.
Bytes | 1 |
---|---|
Data | 0xf1 |
Cancel the current print job.
The reply returns any data already pending, in the same format as for WPRT_DATA.
Bytes | 1 |
---|---|
Data | 0xff |
Terminate the WPRT
server.
No reply is sent.
The start of a print job is indicated by a fake page consisting of the following fifteen bytes:
Bytes | 15 |
---|---|
Data | 0x2a 0x2a 0x09 0x00 0x00 0x00 0x82 0x2e 0x00 0x00 0xc6 0x41 0x00 0x00 0x00 |
This sequence is the only way to detect that a previous job has been cancelled.
All other pages begin with the following eight bytes:
Bytes | 8 |
---|---|
Data | 0xe8 0x03 0x00 0x00 0xe8 0x03 0x00 0x00 |
This is followed by a sequence of primitives, identified by their first byte. Unless otherwise specified, all measurements are in twips (1/1440 inch), with positions specified relative to the top-left corner of the page. Strings are not NUL terminated.
Bytes | 1 | 4 |
---|---|---|
Data | 0x00 | Section |
Start of a major section of the page.
The least significant two bits of the Section field encode the section being started:
Section & 0x03 | Description |
---|---|
0x00 | Header |
0x01 | Body |
0x02 | Footer |
0x03 |
The remainder of the Section field, i.e. Section >> 2
, is the current page number.
s the both the type of section being started and the current page number.
This primitive resets the graphics context to the default settings of:
0x20
, i.e. pen and brush colours are used unmodified.
Bytes | 1 |
---|---|
Data | 0x01 |
End of the page.
Bytes | 1 | 1 |
---|---|---|
Data | 0x03 | Mode |
Set the drawing mode.
Mode specifies how the pen and brush colours are combined with the current "screen" colour. It can be one of the following values:
Mode | Description | Action |
---|---|---|
0x01 | Use the inverse of the current screen colour (ignoring the pen and brush colours) | ~screen |
0x02 | Bitwise xor the pen and brush colours with the current screen colour | colour ^ screen |
0x03 | Invert the pen and brush colours and bitwise xor with the current screen colour | ~colour ^ screen |
0x04 | Bitwise or the pen and brush colours with the current screen colour | colour | screen |
0x05 | Bitwise or the pen and brush colours with the inverse of the current screen colour | colour | ~screen |
0x08 | Bitwise and the pen and brush colours with the current screen colour | colour & screen |
0x09 | Bitwise and the pen and brush colours with the inverse of the current screen colour | colour & ~screen |
0x14 | Invert the pen and brush colours and bitwise or with the current screen colour. | ~colour | screen |
0x15 | Invert the pen and brush colours and bitwise or with the inverse of the current screen colour | ~colour | ~screen |
0x18 | Invert the pen and brush colours and bitwise and with the current screen colour | ~colour & screen |
0x19 | Invert the pen and brush colours and bitwise and with the inverse of the current screen colour | ~colour & ~screen |
0x20 | Use both the pen and brush colour as they are | colour |
0x30 | Invert the pen and brush colours | ~colour |
The default mode is 0x20
, and in practice this is almost always the mode used. It should also be used for line and shape drawing when a wide pen is selected, to avoid undesired effects at line joins.
Bytes | 1 | 4 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x04 | Left | Top | Right | Bottom |
Set a clipping rectangle.
The Left, Top, Right and Bottom fields specify the rectangle to which following text and graphics primitives should be clipped.
The default clipping rectangle covers the whole page, and is restored by the WPRT_START and WPRT_CANCEL_CLIPPING_RECT primitives.
Bytes | 1 |
---|---|
Data | 0x05 |
Cancel the clipping rectangle.
This primitive resets any clipping rectange set by WPRT_SET_CLIPPING_RECT; clipping reverts back to the whole page.
Bytes | 1 | 1 | 4 |
---|---|---|---|
Data | 0x06 | 0x00 | Boolean |
The purpose of this primitive is not known.
The Boolean field appears to always have the value 0x00000000
or 0x00000001
, suggesting that it is enabling or disabling some feature.
Bytes | 1 | 1 or 2 | n | 1 | 2 | 4 | 4 | 4 |
---|---|---|---|---|---|---|---|---|
Data | 0x07 | Length | Font face | Screen font | Base size | Style | Actual size | Baseline |
Set the font face and style.
The Length field specifies the length in bytes of the following Font face string. This may be encoded as either one or two bytes, as indicated by the least significant bit:
Length & 0x01 | Bytes | Value |
---|---|---|
0 | 1 | ( n << 2) | 2 |
1 | 2 | ( n << 3) | 5 |
The Font face specifies the name of the font.
The Screen font is the number of the bitmap font used to render text on screen:
Screen font | Font face | Description |
---|---|---|
0x00 | Swiss | Used for bullets, same as 0x02 |
0x01 | Arial | Proportional, sans serif |
0x02 | Courier New | Monospaced |
0x03 | Times New Roman | Proportional, serif |
The Base size is the font size before any superscript or subscript effects have been applied.
The Style consists of a combination of the following flags:
Style | Description |
---|---|
0x00000001 | Italic |
0x00000002 | Bold |
0x00000004 | Superscript |
0x00000008 | Subscript |
The Actual size pecifies the actual size of the font after any superscript or subscript effects have been applied. This is typically either 100% or 60% of the Base size.
The Baseline field indicates the offset of the font baseline with respect to the normal baseline position. This is positive for subscript or negative for superscript.
The font is used for all subsequently draw text. The default is no font selected.
Bytes | 1 |
---|---|
Data | 0x08 |
Discard the current font.
This indicates that the font selected by a preceding WPRT_USE_FONT is no longer required.
Bytes | 1 | 1 |
---|---|---|
Data | 0x09 | Enable |
Control underlining.
The Enable parameter sets the state of underlining for all subsequently draw text:
Enable | Description |
---|---|
0x00 | Underlining disabled |
0x01 | Underlining enabled |
Bytes | 1 | 1 |
---|---|---|
Data | 0x0a | Enable |
Control strikethrough.
The Enable parameter sets the state of strikethrough for all subsequently drawn text:
Enable | Description |
---|---|
0x00 | Strikethrough disabled |
0x01 | Strikethrough enabled |
Bytes | 1 | 4 | 4 |
---|---|---|---|
Data | 0x0b | ??? | ??? |
Start a new line of text.
This primitive is always preceded by WPRT_CARRIAGE_RETURN, and does not appear to affect the rendering process.
Bytes | 1 | 4 | 4 |
---|---|---|---|
Data | 0x0c | 0x00 0x00 0x00 0x00 | 0x00 0x00 0x00 0x00 |
Return to the left margin.
This primitive is always followed by WPRT_LINE_FEED, and does not appear to affect the rendering process.
Bytes | 1 | 1 | 1 | 1 |
---|---|---|---|---|
Data | 0x0d | Red | Green | Blue |
Set the pen colour.
The Red, Green and Blue fields specify the corresponding components of the colour. The following grey scale values are usually used:
Red | Green | Blue | Description |
---|---|---|---|
0x00 | 0x00 | 0x00 | Black |
0x55 | 0x55 | 0x55 | Dark grey |
0xaa | 0xaa | 0xaa | Light grey |
0xff | 0xff | 0xff | White |
The pen colour is used in accordance with the current drawing mode to draw lines, the outlines of filled shapes, and text. The default pen colour is black.
Bytes | 1 | 1 |
---|---|---|
Data | 0x0e | Style |
Set the pen style.
The Style parameter sets the line drawing style for the pen:
Style | Description | Pattern |
---|---|---|
0x00 | The pen does not draw | |
0x01 | A solid line | ----------- |
0x02 | A dotted line | . . . . . . |
0x03 | A dashed line | - - - - - - |
0x04 | A line of alternating dashes and dots | - . - . - . |
0x05 | A line of alternating single dashes and pairs of dots | - . . - . . |
The default pen style is 0x01
, and in practice this is almost always the style used.
The dotted and dashed lines are only used for straight lines (including the outline of straight-sided filled shapes). They may be rendered as thin lines, regardless of the current pen thickness. The pattern should be continued for all consecutively drawn straight lines.
The pen style is used to draw lines and the outlines of filled shapes.
Bytes | 1 | 4 | 4 |
---|---|---|---|
Data | 0x0f | Width | Height |
Set the pen size.
The Width and Height specify the line drawing size for the pen in screen pixels. For printing, a scale factor of 10 twips per pixel gives acceptable results.
The default pen size is a single pixel. Lines with a thickness greater than one pixel should be rendered with rounded ends, using drawing mode 0x20
(regardless of the current drawing mode).
The pen thickness is used to draw lines and the outlines of filled shapes. A thickness of zero does not draw.
Bytes | 1 | 1 | 1 | 1 |
---|---|---|---|---|
Data | 0x10 | Red | Green | Blue |
Set the brush colour.
The Red, Green and Blue fields specify the corresponding components of the colour. See WPRT_SET_PEN_COLOUR for a list of the common grey scale values.
The brush colour is used in accordance with the current drawing mode for filling shapes and the background of text boxes. The default brush colour is white.
Bytes | 1 | 1 |
---|---|---|
Data | 0x11 | Style |
Set the brush style.
The Style parameter sets the fill drawing style for the brush:
Style | Description |
---|---|
0x00 | Null brush (no effect) |
0x01 | Solid brush |
0x02 | Patterned brush |
0x03 | Vertical hatch brush |
0x04 | Diagonal hatch brush (bottom left to top right) |
0x05 | Horizontal hatch brush |
0x06 | Rearward diagonal hatch brush (top left to bottom right) |
0x07 | Square cross hatch (horizontal and vertical) |
0x08 | Diamond cross hatch (both diagonals) |
The default brush style is 0x00
, which results in only the outline of fillable shapes being drawn.
Bytes | 1 | 4 | 4 |
---|---|---|---|
Data | 0x17 | Left | Top |
The purpose of this primitive is not known.
The Left and Top fields appear to have the same value as the corresponding fields in the preceding WPRT_SET_CLIPPING_RECT primitive.
Bytes | 1 | 4 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x19 | Horizontal start | Vertical start | Horizontal end | Vertical end |
Draw a straight line between two points.
The Horizontal start and Vertical start fields specify the position of one end of the line.
The Horizontal end and Vertical end fields specify the position of the other end of the line.
The line should be rendered using the current pen settings.
Bytes | 1 | 4 | 4 |
---|---|---|---|
Data | 0x1b | 0x00 0x00 0x00 0x00 | ??? |
The purpose of this primitive is not known.
Bytes | 1 | 4 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x1f | Left | Top | Right | Bottom |
Draw and fill an ellipse.
The Left, Top, Right and Bottom fields specify the position of the bounding rectangle that the ellipse fits within. If the pen is larger than a single pixel then the size of the ellipse is correspondingly reduced; the thick outline fits entirely within the bounding box.
The interior of the ellipse should be filled based on the current brush settings, and the outline drawn using the current pen settings.
Bytes | 1 | 4 | 4 | 4 | 4 |
---|---|---|---|---|---|
Data | 0x20 | Left | Top | Right | Bottom |
Draw and fill a rectangle.
The Left, Top, Right and Bottom fields specify the position of corresponding sides of the rectangle.
The interior of the rectangle should be filled based on the current brush settings, and the outline drawn using the current pen settings.
Bytes | 1 | 4 | Repeated fields: | 1 | |
---|---|---|---|---|---|
4 | 4 | ||||
Data | 0x23 | Vertices | Horizontal | Vertical | Fill rule |
Draw and fill a polygon.
The Vertices value specifies the number of coordinate pairs that follow.
The Vertical and Horizontal field pairs each specify the location of a single vertex.
The Fill rule specifies how the polygon should be filled:
Fill rule | Description |
---|---|
0x00 | Only fill areas with odd winding numbers |
0x01 | Fill areas with window numbers greater than zero |
The interior of the polygon, as defined by the specified winding rule, should be filled based on the current brush settings. The outline of the polygon should be drawn using the current pen settings.
Bytes | 1 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | n |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Data | 0x25 | Left | Top | Right | Bottom | Data length | Data offset | Pixel width | Pixel height | Raw width | Raw height | Display mode | 0x00 0x00 0x00 0x00 | 0x00 0x00 0x00 0x00 | Encoding | Pixel data |
Draw a bitmap in a rectangle.
The Left, Top, Right and Bottom fields specify the rectangle that the bitmap should be stretched to fit.
The Data length is the number of the bytes from the start of this field to the end of the Pixel data, i.e n + 0x28
.
The Data offset is the offset in bytes from the start of the Data length field to the start of the Pixel data, i.e. 0x28
.
The Pixel width and Pixel height values are the size of the bitmap in dots.
The Raw width and Raw height fields are usually zero, but may be used to indicate the original size of the bitmap.
The Display mode indicates the palette and number of bits of Pixel data for each dot in the bitmap:
Encoding | Description |
---|---|
0x00000000 | Uncompressed |
0x00000001 | Run Length Encoded (RLE) |
0x00000000 | None |
0x00000001 | 1bpp, black and white |
0x00000002 | 2bpp, 4 greys |
0x00000003 | 4bpp, 16 greys |
0x00000004 | 8bpp, 256 greys |
0x00000005 | 4bpp, 16 colours |
0x00000006 | 8bpp, 256 colours |
0x00000007 | 16bpp, 64k colours |
0x00000008 | 32bpp, 16M colours |
0x00000009 | RGB |
0x0000000a | 4k colours |
The Encoding indicates whether the Pixel data is compressed:
Encoding | Description |
---|---|
0x00000000 | Uncompressed |
0x00000001 | Run Length Encoded (RLE) |
The Pixel data contains the colour information for each dot within the bitmap.
If RLE compression has been used, as indicated by the Encoding, then this is organised as a sequence of marker/data pairs. A marker byte indicates the interpretation of the following data bytes:
Marker | Description |
---|---|
0x00 to 0x7f | Single data byte follows, to be repeated Marker + 1 times |
0x80 to 0xff | 0x100 - Marker bytes of uncompressed data follow |
The Pixel data (after RLE decompression if required) is organised as a sequence of rows, from the top to the bottom of the image. Each row contains the colour of the pixels, packed as indicated by Display mode, with the least significant bits of each byte being the left-most pixel. Each row is padded with dummy pixels to be an exact multiple of 4 bytes long.
The bitmap data does not appear to include any palette information. For 1bpp black and white bitmaps the pixel values map to:
Pixel | Red | Green | Blue | Description |
---|---|---|---|---|
0 | 0x00 | 0x00 | 0x00 | Black |
1 | 0xff | 0xff | 0xff | White |
For 2bpp grey bitmaps the pixel values map to:
Pixel | Red | Green | Blue | Description |
---|---|---|---|---|
0 | 0x00 | 0x00 | 0x00 | Black |
1 | 0x55 | 0x55 | 0x55 | Dark grey |
2 | 0xaa | 0xaa | 0xaa | Light grey |
3 | 0xff | 0xff | 0xff | White |
Bytes | 1 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | n | 4 | 4 | 4 | 4 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Data | 0x26 | Left | Top | Right | Bottom | Data length | Data offset | Pixel width | Pixel height | Raw width | Raw height | Display mode | 0x00 0x00 0x00 0x00 | 0x00 0x00 0x00 0x00 | Encoding | Pixel data | Source left | Source top | Source right | Source bottom |
Draw a bitmap in a rectangle from a source rectangle.
This is identical to WPRT_DRAW_BITMAP_RECT, other than the addition of sixteen extra bytes at the end. See the description of that primitive for an explanation of the common fields.
The Source left, Source top, Source right and Source bottom fields specify the rectangular section of the bitmap, specified in pixels from the top-left corner, that should be stretched to fit the destination rectangle.
Bytes | 1 | 1 or 2 | n | 4 | 4 |
---|---|---|---|---|---|
Data | 0x27 | Length | Text | Left | Baseline |
Plot a text label.
The Length field specifies the length in bytes of the following Text string. See WPRT_USE_FONT for a description of the encoding used.
The Text field is the text to be plotted.
The Left and Baseline fields specify the start position of the text baseline.
The text should be plotted using the current font and pen settings. The background should not be filled.
Bytes | 1 | 1 or 2 | n | 4 | 4 | 4 | 4 | 4 | 1 | 4 |
---|---|---|---|---|---|---|---|---|---|---|
Data | 0x28 | Length | Text | Left | Top | Right | Bottom | Baseline | Alignment | Margin |
Plot a text label.
The Length field specifies the length in bytes of the following Text string. See WPRT_USE_FONT for a description of the encoding used.
The Text field is the text to be plotted.
The Left, Top, Right and Bottom fields specify the rectangle that the text should be justified within.
The Baseline field is believed to encode the baseline position. However, acceptable results can be achieved by placing the baseline at a quarter of the way up the box, offset by the Baseline field of the WPRT_USE_FONT primitive.
The Alignment can be one of the following values:
Alignment | Description |
---|---|
0x00 | Left align |
0x01 | Centre align |
0x02 | Right align |
The Margin field specifies an offset for the justification position. This is measured from the left edge, except for right aligned text where is it measured from the right edge.
The rectangle should be filled using the current brush settings, or white if no brush colour has been selected. If a null brush is selected the the background should not be filled; the rectangle is for alignment only. The text should be plotted using the current font and pen settings, clipped to inside the rectangle.
The server is registered using a Link Register command with a parameter of gencserv.rsy
. The name SYS$GENCSERV.*
is then used in the Connect frame to start the server.
Note that the server appears always to use NCP channel 0xFC
or 0xFD
. Attempting to connect using the channel it has allocated fails.
The details of the GENCSERV
commands are poorly understood, so are presented here as the byte sequences that are sent and received within the NCP data frames. Note that sending the commands in the wrong sequence can cause the phone to crash, requiring the battery to be removed and refitted. This is likely to trigger a warning that the file system may be corrupt and should be reformatted.
Bytes | 1 | 2 |
---|---|---|
Data | 0x00 | 0x01 0x01 |
Reply:
Bytes | 4 |
---|---|
Data | 0x00 0x02 0x00 0x0b |
This is the first command send during initialisation.
Bytes | 1 | 23 |
---|---|---|
Data | 0x01 | 0x0b 0x63 0x00 0x6d 0x00 0x63 0x00 0x73 0x00 0x65 0x00 0x33 0x00 0x32 0x00 0x2e 0x00 0x64 0x00 0x6c 0x00 0x6c 0x00 |
Reply:
Bytes | 9 |
---|---|
Data | 0x00 0x2a 0x18 0x00 0x10 0x95 0x17 0x00 0x10 |
This is the third command sent during initialisation.
Bytes | 1 |
---|---|
Data | 0x02 |
Reply:
Bytes | 1 |
---|---|
Data | 0x00 |
This is the fourth and final command sent during finalisation.
Bytes | 1 |
---|---|
Data | 0x04 |
Reply:
Bytes | 1 |
---|---|
Data | 0x00 |
This is the second command sent during initialisation.
0x03
byte followed by a reason code, and then nine bytes of constant data:
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | Reason code | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x00 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
Reply:
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x00 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
This is the fourth command sent during initialisation.
Bytes | 1 | 1 | 9 | n |
---|---|---|---|---|
Data | 0x03 | 0x06 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | vCards |
Reply:
Bytes | 1 | 1 | 9 | n |
---|---|---|---|---|
Data | 0x03 | 0x06 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | vCards |
Delete entries.
The vCards field of the command should contain one or more vCards consisting of just the VERSION and UID fields of the entries to delete. These can be discovered by first reading the entry using GENCSERV_READ.
The reply contains a copy of the data from the command.
Bytes | 1 | 1 | 9 | n |
---|---|---|---|---|
Data | 0x03 | 0x07 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | vCards |
Reply:
Bytes | 1 | 1 | 9 | 4 | Repeated field: |
---|---|---|---|---|---|
4 | |||||
Data | 0x03 | 0x07 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Count | Index |
Add new entries.
The vCards field contains one or more vCards to be added.
The Count field gives the number of entries actually added.
The Index fields give the indeces of the new entries; one for each entry added.
Bytes | 1 | 1 | 9 | n |
---|---|---|---|---|
Data | 0x03 | 0x08 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | vCards |
Reply:
Bytes | 1 | 1 | 9 | 4 | Repeated field: |
---|---|---|---|---|---|
4 | |||||
Data | 0x03 | 0x08 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Count | Index |
Modify existing entries.
The vCards field contains one or more vCards to be modified. These must contain the UID fields from the existing vCards, as returned by GENCSERV_READ.
The Count field gives the number of entries modified.
The Index fields give the indeces of the modified entries; one for each entry that was changed.
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x09 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
Reply:
Bytes | 1 | 1 | 13 |
---|---|---|---|
Data | 0x03 | 0x09 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
This is the third command sent during finalisation.
Bytes | 1 | 1 | 9 | 4 | Repeated field: |
---|---|---|---|---|---|
4 | |||||
Data | 0x03 | 0x0e | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Count | Index |
Reply:
Bytes | 1 | 1 | 9 | n |
---|---|---|---|---|
Data | 0x03 | 0x0e | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | vCards |
Read entries.
The Count field specifies the number of entries to read.
The Index fields give the indices of the entries to read. The available entries can be found using GENCSERV_INDEX.
The vCards field contains the vCards read.
Bytes | 1 | 1 | 9 | 4 | 4 | 4 | 4 | 4 | 4 |
---|---|---|---|---|---|---|---|---|---|
Data | 0x03 | 0x0f | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Year | Month | Day | Hour | Minute | Second |
Reply:
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x0f | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Changes |
Read the number of changes since a particular time.
The Year, Month, Day, Hour, Minute and Second fields specify the time to check against. This would normally be set to the time that the host last synchronized entries with the phone.
The Changes field gives the number of modifications that have been made since the specified time.
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x10 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | 0x14 0x00 0x00 0x00 |
Reply:
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x10 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Done |
This is the seventh command sent during initialisation.
The Ready field is returned as zero when the phone is ready. The sequence of commands GENCSERV_INIT_5, GENCSERV_INIT_7 and GENCSERV_RESET should be repeated in sequence until this happens.
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x11 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Type |
Reply:
Bytes | 1 | 1 | 9 | 4 | Repeated field: |
---|---|---|---|---|---|
4 | |||||
Data | 0x03 | 0x11 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | Count | Index |
List entries.
The Type field specifies the type of entries to return:
Type | Description |
---|---|
0x00000000 | Current |
0x00000003 | Deleted |
The vCards field contains one or more vCards to be modified. These must contain the UID fields from the existing vCards, as returned by GENCSERV_READ.
The Count field gives the number of entries of the specified type.
The Index fields give the indeces of the entries; one for each entry found.
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x12 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
Reply:
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x12 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | 0x00 0x00 0x00 0x00 |
This is the second command sent during finalisation.
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x15 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
Reply:
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x15 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | 0x00 0x00 0x00 0x00 |
This is the fifth command sent during initialisation.
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x19 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
Reply:
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x19 | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
This is the eighth command send during initialisation.
Bytes | 1 | 1 | 9 |
---|---|---|---|
Data | 0x03 | 0x1c | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 |
Reply (initialisation):
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x1c | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | 0xb4 0x04 0x00 0x00 |
Command (finalisation):
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x1c | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | 0x14 0x00 0x00 0x00 |
Reply (finalisation):
Bytes | 1 | 1 | 9 | 4 |
---|---|---|---|---|
Data | 0x03 | 0x1c | 0x01 0x00 0x01 0x00 0x00 0x01 0x00 0x00 0x00 | 0xb8 0x04 0x00 0x00 |
This is the ninth command sent during initialisation, and the first command sent during finalisation.
Adding a new entry with GENCSERV_ADD does not require the indices to be read first.
Different codes are used by SIBO and EPOC, although the NCP always uses the SIBO codes. The following tables indicate the closest mapping between the two sets of codes.
SIBO code | SIBO name | EPOC equivalent |
---|---|---|
0 | E_SIBO_NONE | E_EPOC_NONE |
-1 | E_SIBO_GEN_FAIL | E_EPOC_GENERAL |
-2 | E_SIBO_GEN_ARG | E_EPOC_ARGUMENT |
-3 | E_SIBO_GEN_OS | E_EPOC_GENERAL |
-4 | E_SIBO_GEN_NSUP | E_EPOC_NOT_SUPPORTED |
-5 | E_SIBO_GEN_UNDER | E_EPOC_UNDERFLOW |
-6 | E_SIBO_GEN_OVER | E_EPOC_OVERFLOW |
-7 | E_SIBO_GEN_RANGE | E_EPOC_TOTAL_LOSS_OF_PRECISION |
-8 | E_SIBO_GEN_DIVIDE | E_EPOC_DIVIDE_BY_ZERO |
-9 | E_SIBO_GEN_INUSE | E_EPOC_IN_USE |
-10 | E_SIBO_GEN_NOMEMORY | E_EPOC_NO_MEMORY |
-11 | E_SIBO_GEN_NOSEGMENTS | E_EPOC_NO_MEMORY |
-12 | E_SIBO_GEN_NOSEM | E_EPOC_NO_MEMORY |
-13 | E_SIBO_GEN_NOPROC | E_EPOC_NO_MEMORY |
-14 | E_SIBO_GEN_OPEN | E_EPOC_ALREADY_EXISTS |
-15 | E_SIBO_GEN_NOTOPEN | E_EPOC_NOT_FOUND |
-16 | E_SIBO_GEN_IMAGE | E_EPOC_CORRUPT |
-17 | E_SIBO_GEN_RECEIVER | E_EPOC_GENERAL |
-18 | E_SIBO_GEN_DEVICE | E_EPOC_BAD_DRIVER |
-19 | E_SIBO_GEN_FSYS | E_EPOC_DISMOUNTED |
-20 | E_SIBO_GEN_START | E_EPOC_NOT_READY |
-21 | E_SIBO_GEN_NOFONT | E_EPOC_GENERAL |
-22 | E_SIBO_GEN_TOOWIDE | E_EPOC_TOO_BIG |
-23 | E_SIBO_GEN_TOOMANY | E_EPOC_TOO_BIG |
-32 | E_SIBO_FILE_EXIST | E_EPOC_ALREADY_EXISTS |
-33 | E_SIBO_FILE_NXIST | E_EPOC_NOT_FOUND |
-34 | E_SIBO_FILE_WRITE | E_EPOC_WRITE |
-35 | E_SIBO_FILE_READ | E_EPOC_ACCESS_DENIED |
-36 | E_SIBO_FILE_EOF | E_EPOC_EOF |
-37 | E_SIBO_FILE_FULL | E_EPOC_DISK_FULL |
-38 | E_SIBO_FILE_NAME | E_EPOC_BAD_NAME |
-39 | E_SIBO_FILE_ACCESS | E_EPOC_ACCESS_DENIED |
-40 | E_SIBO_FILE_LOCKED | E_EPOC_LOCKED |
-41 | E_SIBO_FILE_DEVICE | E_EPOC_NOT_READY |
-42 | E_SIBO_FILE_DIR | E_EPOC_PATH_NOT_FOUND |
-43 | E_SIBO_FILE_RECORD | E_EPOC_BAD_NAME |
-44 | E_SIBO_FILE_RDONLY | E_EPOC_ACCESS_DENIED |
-45 | E_SIBO_FILE_INV | E_EPOC_CORRUPT |
-46 | E_SIBO_FILE_PENDING | E_EPOC_NOT_READY |
-47 | E_SIBO_FILE_VOLUME | E_EPOC_BAD_NAME |
-48 | E_SIBO_FILE_CANCEL | E_EPOC_CANCEL |
-50 | E_SIBO_FILE_DISC | E_EPOC_DISCONNECTED |
-51 | E_SIBO_FILE_CONNECT | E_EPOC_COULD_NOT_CONNECT |
-52 | E_SIBO_FILE_RETRAN | E_EPOC_TIMED_OUT |
-53 | E_SIBO_FILE_LINE | E_EPOC_COMMS_LINE_FAIL |
-54 | E_SIBO_FILE_INACT | E_EPOC_TIMED_OUT |
-55 | E_SIBO_FILE_PARITY | E_EPOC_COMMS_PARITY |
-56 | E_SIBO_FILE_FRAME | E_EPOC_COMMS_FRAME |
-57 | E_SIBO_FILE_OVERRUN | E_EPOC_COMMS_OVERRUN |
-58 | E_SIBO_MDM_CONFAIL | E_EPOC_GENERAL |
-59 | E_SIBO_MDM_BUSY | E_EPOC_GENERAL |
-60 | E_SIBO_MDM_NOANS | E_EPOC_GENERAL |
-61 | E_SIBO_MDM_BLACKLIST | E_EPOC_GENERAL |
-62 | E_SIBO_FILE_NOTREADY | E_EPOC_NOT_READY |
-63 | E_SIBO_FILE_UNKNOWN | E_EPOC_UNKNOWN |
-64 | E_SIBO_FILE_DIRFULL | E_EPOC_DIR_FULL |
-65 | E_SIBO_FILE_PROTECT | E_EPOC_ACCESS_DENIED |
-66 | E_SIBO_FILE_CORRUPT | E_EPOC_CORRUPT |
-67 | E_SIBO_FILE_ABORT | E_EPOC_ABORT |
-68 | E_SIBO_FILE_ERASE | E_EPOC_GENERAL |
-69 | E_SIBO_FILE_INVALID | E_EPOC_CORRUPT |
EPOC code | EPOC name | SIBO equivalent |
---|---|---|
0 | E_EPOC_NONE | E_SIBO_NONE |
-1 | E_EPOC_NOT_FOUND | E_SIBO_FILE_NXIST |
-2 | E_EPOC_GENERAL | E_SIBO_GEN_FAIL |
-3 | E_EPOC_CANCEL | E_SIBO_FILE_CANCEL |
-4 | E_EPOC_NO_MEMORY | E_SIBO_GEN_NOMEMORY |
-5 | E_EPOC_NOT_SUPPORTED | E_SIBO_GEN_NSUP |
-6 | E_EPOC_ARGUMENT | E_SIBO_GEN_ARG |
-7 | E_EPOC_TOTAL_LOSS_OF_PRECISION | E_SIBO_GEN_RANGE |
-8 | E_EPOC_BAD_HANDLE | E_SIBO_FILE_NXIST |
-9 | E_EPOC_OVERFLOW | E_SIBO_GEN_OVER |
-10 | E_EPOC_UNDERFLOW | E_SIBO_GEN_UNDER |
-11 | E_EPOC_ALREADY_EXISTS | E_SIBO_FILE_EXIST |
-12 | E_EPOC_PATH_NOT_FOUND | E_SIBO_FILE_DIR |
-13 | E_EPOC_DIED | E_SIBO_GEN_FAIL |
-14 | E_EPOC_IN_USE | E_SIBO_GEN_INUSE |
-15 | E_EPOC_SERVER_TERMINATED | E_SIBO_GEN_FAIL |
-16 | E_EPOC_SERVER_BUSY | E_SIBO_GEN_TOOMANY |
-17 | E_EPOC_COMPLETION | E_SIBO_GEN_FAIL |
-18 | E_EPOC_NOT_READY | E_SIBO_FILE_NOTREADY |
-19 | E_EPOC_UNKNOWN | E_SIBO_FILE_UNKNOWN |
-20 | E_EPOC_CORRUPT | E_SIBO_FILE_CORRUPT |
-21 | E_EPOC_ACCESS_DENIED | E_SIBO_FILE_ACCESS |
-22 | E_EPOC_LOCKED | E_SIBO_FILE_LOCKED |
-23 | E_EPOC_WRITE | E_SIBO_FILE_WRITE |
-24 | E_EPOC_DISMOUNTED | E_SIBO_GEN_FSYS |
-25 | E_EPOC_EOF | E_SIBO_FILE_EOF |
-26 | E_EPOC_DISK_FULL | E_SIBO_FILE_FULL |
-27 | E_EPOC_BAD_DRIVER | E_SIBO_GEN_DEVICE |
-28 | E_EPOC_BAD_NAME | E_SIBO_FILE_NAME |
-29 | E_EPOC_COMMS_LINE_FAIL | E_SIBO_FILE_LINE |
-30 | E_EPOC_COMMS_FRAME | E_SIBO_FILE_FRAME |
-31 | E_EPOC_COMMS_OVERRUN | E_SIBO_FILE_OVERRUN |
-32 | E_EPOC_COMMS_PARITY | E_SIBO_FILE_PARITY |
-33 | E_EPOC_TIMEOUT | E_SIBO_FILE_RETRAN |
-34 | E_EPOC_COULD_NOT_CONNECT | E_SIBO_FILE_CONNECT |
-35 | E_EPOC_COULD_NOT_DISCONNECT | E_SIBO_FILE_DISC |
-36 | E_EPOC_DISCONNECTED | E_SIBO_FILE_DISC |
-37 | E_EPOC_BAD_LIBRARY_ENTRY_POINT | E_SIBO_GEN_FAIL |
-38 | E_EPOC_BAD_DESCRIPTOR | E_SIBO_GEN_FAIL |
-39 | E_EPOC_ABORT | E_SIBO_FILE_ABORT |
-40 | E_EPOC_TOO_BIG | E_SIBO_FILE_FULL |
-41 | E_EPOC_DIVIDE_BY_ZERO | E_SIBO_GEN_DIVIDE |
-42 | E_EPOC_BAD_POWER | E_SIBO_GEN_FAIL |
-43 | E_EPOC_DIR_FULL | E_SIBO_FILE_DIRFULL |
Code | SIBO | EPOC | |||||||
---|---|---|---|---|---|---|---|---|---|
Character | To EPOC | Character | To SIBO | ||||||
0 | 0x00 | NUL (non-printable) | 0 | 0x00 | NUL (non-printable) | 0 | 0x00 | ||
1 | 0x01 | SOH (non-printable) | 1 | 0x01 | SOH (non-printable) | 1 | 0x01 | ||
2 | 0x02 | STX (non-printable) | 2 | 0x02 | STX (non-printable) | 2 | 0x02 | ||
3 | 0x03 | ETX (non-printable) | 3 | 0x03 | ETX (non-printable) | 3 | 0x03 | ||
4 | 0x04 | EOT (non-printable) | 4 | 0x04 | EOT (non-printable) | 4 | 0x04 | ||
5 | 0x05 | ENQ (non-printable) | 5 | 0x05 | ENQ (non-printable) | 5 | 0x05 | ||
6 | 0x06 | ACK (non-printable) | 6 | 0x06 | ACK (non-printable) | 6 | 0x06 | ||
7 | 0x07 | BEL (non-printable) | 7 | 0x07 | BEL (non-printable) | 7 | 0x07 | ||
8 | 0x08 | BS (non-printable) | 8 | 0x08 | BS (non-printable) | 8 | 0x08 | ||
9 | 0x09 | HT (non-printable) | 9 | 0x09 | HT (non-printable) | 9 | 0x09 | ||
10 | 0x0a | NL (non-printable) | 10 | 0x0a | NL (non-printable) | 10 | 0x0a | ||
11 | 0x0b | VT (non-printable) | 11 | 0x0b | VT (non-printable) | 11 | 0x0b | ||
12 | 0x0c | NP (non-printable) | 12 | 0x0c | NP (non-printable) | 12 | 0x0c | ||
13 | 0x0d | CR (non-printable) | 13 | 0x0d | CR (non-printable) | 13 | 0x0d | ||
14 | 0x0e | SO (non-printable) | 14 | 0x0e | SO (non-printable) | 14 | 0x0e | ||
15 | 0x0f | SI (non-printable) | 15 | 0x0f | SI (non-printable) | 15 | 0x0f | ||
16 | 0x10 | DLE (non-printable) | 16 | 0x10 | DLE (non-printable) | 16 | 0x10 | ||
17 | 0x11 | DC1 (non-printable) | 17 | 0x11 | DC1 (non-printable) | 17 | 0x11 | ||
18 | 0x12 | DC2 (non-printable) | 18 | 0x12 | DC2 (non-printable) | 18 | 0x12 | ||
19 | 0x13 | DC3 (non-printable) | 19 | 0x13 | DC3 (non-printable) | 19 | 0x13 | ||
20 | 0x14 | DC4 (non-printable) | 20 | 0x14 | DC4 (non-printable) | 20 | 0x14 | ||
21 | 0x15 | NAK (non-printable) | 21 | 0x15 | NAK (non-printable) | 21 | 0x15 | ||
22 | 0x16 | SYN (non-printable) | 22 | 0x16 | SYN (non-printable) | 22 | 0x16 | ||
23 | 0x17 | ETB (non-printable) | 23 | 0x17 | ETB (non-printable) | 23 | 0x17 | ||
24 | 0x18 | CAN (non-printable) | 24 | 0x18 | CAN (non-printable) | 24 | 0x18 | ||
25 | 0x19 | EM (non-printable) | 25 | 0x19 | EM (non-printable) | 25 | 0x19 | ||
26 | 0x1a | SUB (non-printable) | 26 | 0x1a | SUB (non-printable) | 26 | 0x1a | ||
27 | 0x1b | ESC (non-printable) | 27 | 0x1b | ESC (non-printable) | 27 | 0x1b | ||
28 | 0x1c | FS (non-printable) | 28 | 0x1c | FS (non-printable) | 28 | 0x1c | ||
29 | 0x1d | GS (non-printable) | 29 | 0x1d | GS (non-printable) | 29 | 0x1d | ||
30 | 0x1e | RS (non-printable) | 30 | 0x1e | RS (non-printable) | 30 | 0x1e | ||
31 | 0x1f | US (non-printable) | 31 | 0x1f | US (non-printable) | 31 | 0x1f | ||
32 | 0x20 | Space | 32 | 0x20 | Space | 32 | 0x20 | ||
33 | 0x21 | ! | Exclamation mark | 33 | 0x21 | ! | Exclamation mark | 33 | 0x21 |
34 | 0x22 | " | Quotation mark | 34 | 0x22 | " | Quotation mark | 34 | 0x22 |
35 | 0x23 | # | Number sign | 35 | 0x23 | # | Number sign | 35 | 0x23 |
36 | 0x24 | $ | Dollar sign | 36 | 0x24 | $ | Dollar sign | 36 | 0x24 |
37 | 0x25 | % | Percent sign | 37 | 0x25 | % | Percent sign | 37 | 0x25 |
38 | 0x26 | & | Ampersand | 38 | 0x26 | & | Ampersand | 38 | 0x26 |
39 | 0x27 | ' | Apostrophe | 39 | 0x27 | ' | Apostrophe | 39 | 0x27 |
40 | 0x28 | ( | Left parenthesis | 40 | 0x28 | ( | Left parenthesis | 40 | 0x28 |
41 | 0x29 | ) | Right parenthesis | 41 | 0x29 | ) | Right parenthesis | 41 | 0x29 |
42 | 0x2a | * | Asterisk | 42 | 0x2a | * | Asterisk | 42 | 0x2a |
43 | 0x2b | + | Plus sign | 43 | 0x2b | + | Plus sign | 43 | 0x2b |
44 | 0x2c | , | Comma | 44 | 0x2c | , | Comma | 44 | 0x2c |
45 | 0x2d | - | Hyphen-minus | 45 | 0x2d | - | Hyphen-minus | 45 | 0x2d |
46 | 0x2e | . | Full stop | 46 | 0x2e | . | Full stop | 46 | 0x2e |
47 | 0x2f | / | Solidus | 47 | 0x2f | / | Solidus | 47 | 0x2f |
48 | 0x30 | 0 | Digit zero | 48 | 0x30 | 0 | Digit zero | 48 | 0x30 |
49 | 0x31 | 1 | Digit one | 49 | 0x31 | 1 | Digit one | 49 | 0x31 |
50 | 0x32 | 2 | Digit two | 50 | 0x32 | 2 | Digit two | 50 | 0x32 |
51 | 0x33 | 3 | Digit three | 51 | 0x33 | 3 | Digit three | 51 | 0x33 |
52 | 0x34 | 4 | Digit four | 52 | 0x34 | 4 | Digit four | 52 | 0x34 |
53 | 0x35 | 5 | Digit five | 53 | 0x35 | 5 | Digit five | 53 | 0x35 |
54 | 0x36 | 6 | Digit six | 54 | 0x36 | 6 | Digit six | 54 | 0x36 |
55 | 0x37 | 7 | Digit seven | 55 | 0x37 | 7 | Digit seven | 55 | 0x37 |
56 | 0x38 | 8 | Digit eight | 56 | 0x38 | 8 | Digit eight | 56 | 0x38 |
57 | 0x39 | 9 | Digit nine | 57 | 0x39 | 9 | Digit nine | 57 | 0x39 |
58 | 0x3a | : | Colon | 58 | 0x3a | : | Colon | 58 | 0x3a |
59 | 0x3b | ; | Semicolon | 59 | 0x3b | ; | Semicolon | 59 | 0x3b |
60 | 0x3c | < | Less-than sign | 60 | 0x3c | < | Less-than sign | 60 | 0x3c |
61 | 0x3d | = | Equals sign | 61 | 0x3d | = | Equals sign | 61 | 0x3d |
62 | 0x3e | > | Greater-than sign | 62 | 0x3e | > | Greater-than sign | 62 | 0x3e |
63 | 0x3f | ? | Question mark | 63 | 0x3f | ? | Question mark | 63 | 0x3f |
64 | 0x40 | @ | Commercial at | 64 | 0x40 | @ | Commercial at | 64 | 0x40 |
65 | 0x41 | A | Latin capital letter A | 65 | 0x41 | A | Latin capital letter A | 65 | 0x41 |
66 | 0x42 | B | Latin capital letter B | 66 | 0x42 | B | Latin capital letter B | 66 | 0x42 |
67 | 0x43 | C | Latin capital letter C | 67 | 0x43 | C | Latin capital letter C | 67 | 0x43 |
68 | 0x44 | D | Latin capital letter D | 68 | 0x44 | D | Latin capital letter D | 68 | 0x44 |
69 | 0x45 | E | Latin capital letter E | 69 | 0x45 | E | Latin capital letter E | 69 | 0x45 |
70 | 0x46 | F | Latin capital letter F | 70 | 0x46 | F | Latin capital letter F | 70 | 0x46 |
71 | 0x47 | G | Latin capital letter G | 71 | 0x47 | G | Latin capital letter G | 71 | 0x47 |
72 | 0x48 | H | Latin capital letter H | 72 | 0x48 | H | Latin capital letter H | 72 | 0x48 |
73 | 0x49 | I | Latin capital letter I | 73 | 0x49 | I | Latin capital letter I | 73 | 0x49 |
74 | 0x4a | J | Latin capital letter J | 74 | 0x4a | J | Latin capital letter J | 74 | 0x4a |
75 | 0x4b | K | Latin capital letter K | 75 | 0x4b | K | Latin capital letter K | 75 | 0x4b |
76 | 0x4c | L | Latin capital letter L | 76 | 0x4c | L | Latin capital letter L | 76 | 0x4c |
77 | 0x4d | M | Latin capital letter M | 77 | 0x4d | M | Latin capital letter M | 77 | 0x4d |
78 | 0x4e | N | Latin capital letter N | 78 | 0x4e | N | Latin capital letter N | 78 | 0x4e |
79 | 0x4f | O | Latin capital letter O | 79 | 0x4f | O | Latin capital letter O | 79 | 0x4f |
80 | 0x50 | P | Latin capital letter P | 80 | 0x50 | P | Latin capital letter P | 80 | 0x50 |
81 | 0x51 | Q | Latin capital letter Q | 81 | 0x51 | Q | Latin capital letter Q | 81 | 0x51 |
82 | 0x52 | R | Latin capital letter R | 82 | 0x52 | R | Latin capital letter R | 82 | 0x52 |
83 | 0x53 | S | Latin capital letter S | 83 | 0x53 | S | Latin capital letter S | 83 | 0x53 |
84 | 0x54 | T | Latin capital letter T | 84 | 0x54 | T | Latin capital letter T | 84 | 0x54 |
85 | 0x55 | U | Latin capital letter U | 85 | 0x55 | U | Latin capital letter U | 85 | 0x55 |
86 | 0x56 | V | Latin capital letter V | 86 | 0x56 | V | Latin capital letter V | 86 | 0x56 |
87 | 0x57 | W | Latin capital letter W | 87 | 0x57 | W | Latin capital letter W | 87 | 0x57 |
88 | 0x58 | X | Latin capital letter X | 88 | 0x58 | X | Latin capital letter X | 88 | 0x58 |
89 | 0x59 | Y | Latin capital letter Y | 89 | 0x59 | Y | Latin capital letter Y | 89 | 0x59 |
90 | 0x5a | Z | Latin capital letter Z | 90 | 0x5a | Z | Latin capital letter Z | 90 | 0x5a |
91 | 0x5b | [ | Left square bracket | 91 | 0x5b | [ | Left square bracket | 91 | 0x5b |
92 | 0x5c | \ | Reverse solidus | 92 | 0x5c | \ | Reverse solidus | 92 | 0x5c |
93 | 0x5d | ] | Right square bracket | 93 | 0x5d | ] | Right square bracket | 93 | 0x5d |
94 | 0x5e | ^ | Circumflex accent | 94 | 0x5e | ^ | Circumflex accent | 94 | 0x5e |
95 | 0x5f | _ | Low line | 95 | 0x5f | _ | Low line | 95 | 0x5f |
96 | 0x60 | ` | Grave accent | 96 | 0x60 | ` | Grave accent | 96 | 0x60 |
97 | 0x61 | a | Latin small letter A | 97 | 0x61 | a | Latin small letter A | 97 | 0x61 |
98 | 0x62 | b | Latin small letter B | 98 | 0x62 | b | Latin small letter B | 98 | 0x62 |
99 | 0x63 | c | Latin small letter C | 99 | 0x63 | c | Latin small letter C | 99 | 0x63 |
100 | 0x64 | d | Latin small letter D | 100 | 0x64 | d | Latin small letter D | 100 | 0x64 |
101 | 0x65 | e | Latin small letter E | 101 | 0x65 | e | Latin small letter E | 101 | 0x65 |
102 | 0x66 | f | Latin small letter F | 102 | 0x66 | f | Latin small letter F | 102 | 0x66 |
103 | 0x67 | g | Latin small letter G | 103 | 0x67 | g | Latin small letter G | 103 | 0x67 |
104 | 0x68 | h | Latin small letter H | 104 | 0x68 | h | Latin small letter H | 104 | 0x68 |
105 | 0x69 | i | Latin small letter I | 105 | 0x69 | i | Latin small letter I | 105 | 0x69 |
106 | 0x6a | j | Latin small letter J | 106 | 0x6a | j | Latin small letter J | 106 | 0x6a |
107 | 0x6b | k | Latin small letter K | 107 | 0x6b | k | Latin small letter K | 107 | 0x6b |
108 | 0x6c | l | Latin small letter L | 108 | 0x6c | l | Latin small letter L | 108 | 0x6c |
109 | 0x6d | m | Latin small letter M | 109 | 0x6d | m | Latin small letter M | 109 | 0x6d |
110 | 0x6e | n | Latin small letter N | 110 | 0x6e | n | Latin small letter N | 110 | 0x6e |
111 | 0x6f | o | Latin small letter O | 111 | 0x6f | o | Latin small letter O | 111 | 0x6f |
112 | 0x70 | p | Latin small letter P | 112 | 0x70 | p | Latin small letter P | 112 | 0x70 |
113 | 0x71 | q | Latin small letter Q | 113 | 0x71 | q | Latin small letter Q | 113 | 0x71 |
114 | 0x72 | r | Latin small letter R | 114 | 0x72 | r | Latin small letter R | 114 | 0x72 |
115 | 0x73 | s | Latin small letter S | 115 | 0x73 | s | Latin small letter S | 115 | 0x73 |
116 | 0x74 | t | Latin small letter T | 116 | 0x74 | t | Latin small letter T | 116 | 0x74 |
117 | 0x75 | u | Latin small letter U | 117 | 0x75 | u | Latin small letter U | 117 | 0x75 |
118 | 0x76 | v | Latin small letter V | 118 | 0x76 | v | Latin small letter V | 118 | 0x76 |
119 | 0x77 | w | Latin small letter W | 119 | 0x77 | w | Latin small letter W | 119 | 0x77 |
120 | 0x78 | x | Latin small letter X | 120 | 0x78 | x | Latin small letter X | 120 | 0x78 |
121 | 0x79 | y | Latin small letter Y | 121 | 0x79 | y | Latin small letter Y | 121 | 0x79 |
122 | 0x7a | z | Latin small letter Z | 122 | 0x7a | z | Latin small letter Z | 122 | 0x7a |
123 | 0x7b | { | Left curly bracket | 123 | 0x7b | { | Left curly bracket | 123 | 0x7b |
124 | 0x7c | | | Vertical line | 124 | 0x7c | | | Vertical line | 124 | 0x7c |
125 | 0x7d | } | Right curly bracket | 125 | 0x7d | } | Right curly bracket | 125 | 0x7d |
126 | 0x7e | ~ | Tilde | 126 | 0x7e | ~ | Tilde | 126 | 0x7e |
127 | 0x7f | DEL (non-printable) | 127 | 0x7f | DEL (non-printable) | 127 | 0x7f | ||
128 | 0x80 | Ç | Latin capital letter C with cedilla | 199 | 0xc7 | Euro sign | 176 | 0xb0 | |
129 | 0x81 | ü | Latin small letter U with diaeresis | 252 | 0xfc | (undefined) | 177 | 0xb1 | |
130 | 0x82 | é | Latin small letter E with acute | 233 | 0xe9 | Single low-9 quotation mark | 178 | 0xb2 | |
131 | 0x83 | â | Latin small letter A with circumflex | 226 | 0xe2 | Latin small letter F with hook | 159 | 0x9f | |
132 | 0x84 | ä | Latin small letter A with diaeresis | 228 | 0xe4 | Double low-9 quotation mark | 180 | 0xb4 | |
133 | 0x85 | à | Latin small letter A with grave | 224 | 0xe0 | Horizontal ellipsis | 185 | 0xb9 | |
134 | 0x86 | å | Latin small letter A with ring above | 229 | 0xe5 | Dagger | 5 | 0x05 | |
135 | 0x87 | ç | Latin small letter C with cedilla | 231 | 0xe7 | Double dagger | 187 | 0xbb | |
136 | 0x88 | ê | Latin small letter E with circumflex | 234 | 0xea | Modifier letter circumflex accent | 188 | 0xbc | |
137 | 0x89 | ë | Latin small letter E with diaeresis | 235 | 0xeb | Per mille sign | 191 | 0xbf | |
138 | 0x8a | è | Latin small letter E with grave | 232 | 0xe8 | Latin capital letter S with caron | 192 | 0xc0 | |
139 | 0x8b | ï | Latin small letter I with diaeresis | 239 | 0xef | Single left-pointing angle quotation mark | 193 | 0xc1 | |
140 | 0x8c | î | Latin small letter I with circumflex | 238 | 0xee | Latin capital ligature oe | 194 | 0xc2 | |
141 | 0x8d | ì | Latin small letter I with grave | 236 | 0xec | (undefined) | 195 | 0xc3 | |
142 | 0x8e | Ä | Latin capital letter A with diaeresis | 196 | 0xc4 | Latin capital letter Z with caron | 197 | 0xc5 | |
143 | 0x8f | Å | Latin capital letter A with ring above | 197 | 0xc5 | (undefined) | 200 | 0xc8 | |
144 | 0x90 | É | Latin capital letter E with acute | 201 | 0xc9 | (undefined) | 201 | 0xc9 | |
145 | 0x91 | æ | Latin small ligature AE | 230 | 0xe6 | Left single quotation mark | 202 | 0xca | |
146 | 0x92 | Æ | Latin capital ligature AE | 198 | 0xc6 | Right single quotation mark | 203 | 0xcb | |
147 | 0x93 | ô | Latin small letter O with circumflex | 244 | 0xf4 | Left double quotation mark | 204 | 0xcc | |
148 | 0x94 | ö | Latin small letter O with diaeresis | 246 | 0xf6 | Right double quotation mark | 206 | 0xce | |
149 | 0x95 | ò | Latin small letter O with grave | 242 | 0xf2 | Bullet | 254 | 0xfe | |
150 | 0x96 | û | Latin small letter U with circumflex | 251 | 0xfb | En dash | 213 | 0xd5 | |
151 | 0x97 | ù | Latin small letter U with grave | 249 | 0xf9 | Em dash | 205 | 0xcd | |
152 | 0x98 | ÿ | Latin small letter Y with diaeresis | 255 | 0xff | Small tilde | 217 | 0xd9 | |
153 | 0x99 | Ö | Latin capital letter O with diaeresis | 214 | 0xd6 | Trade mark sign | 218 | 0xda | |
154 | 0x9a | Ü | Latin capital letter U with diaeresis | 220 | 0xdc | Latin small letter S with caron | 219 | 0xdb | |
155 | 0x9b | ø | Latin small letter O with stroke | 248 | 0xf8 | Single right-pointing angle quotation mark | 220 | 0xdc | |
156 | 0x9c | £ | Pound sign | 163 | 0xa3 | Latin small ligature oe | 179 | 0xb3 | |
157 | 0x9d | Ø | Latin capital letter O with stroke | 216 | 0xd8 | (undefined) | 223 | 0xdf | |
158 | 0x9e | × | Multiplication sign | 215 | 0xd7 | Latin small letter Z with caron | 240 | 0xf0 | |
159 | 0x9f | Latin small letter F with hook | 131 | 0x83 | Latin capital letter Y with diaeresis | 242 | 0xf2 | ||
160 | 0xa0 | á | Latin small letter A with acute | 225 | 0xe1 | No-break space | 255 | 0xff | |
161 | 0xa1 | í | Latin small letter I with acute | 237 | 0xed | ¡ | Inverted exclamation mark | 173 | 0xad |
162 | 0xa2 | ó | Latin small letter O with acute | 243 | 0xf3 | ¢ | Cent sign | 189 | 0xbd |
163 | 0xa3 | ú | Latin small letter U with acute | 250 | 0xfa | £ | Pound sign | 156 | 0x9c |
164 | 0xa4 | ñ | Latin small letter N with tilde | 241 | 0xf1 | ¤ | Currency sign | 207 | 0xcf |
165 | 0xa5 | Ñ | Latin capital letter N with tilde | 209 | 0xd1 | ¥ | Yen sign | 190 | 0xbe |
166 | 0xa6 | ª | Feminine ordinal indicator | 170 | 0xaa | ¦ | Broken bar | 221 | 0xdd |
167 | 0xa7 | º | Masculine ordinal indicator | 186 | 0xba | § | Section sign | 245 | 0xf5 |
168 | 0xa8 | ¿ | Inverted question mark | 191 | 0xbf | ¨ | Diaeresis | 249 | 0xf9 |
169 | 0xa9 | ® | Registered sign | 174 | 0xae | © | Copyright sign | 184 | 0xb8 |
170 | 0xaa | ¬ | Not sign | 172 | 0xac | ª | Feminine ordinal indicator | 166 | 0xa6 |
171 | 0xab | ½ | Vulgar fraction one half | 189 | 0xbd | « | Left-pointing double angle quotation mark | 174 | 0xae |
172 | 0xac | ¼ | Vulgar fraction one quarter | 188 | 0xbc | ¬ | Not sign | 170 | 0xaa |
173 | 0xad | ¡ | Inverted exclamation mark | 161 | 0xa1 | | Soft hyphen | 196 | 0xc4 |
174 | 0xae | « | Left-pointing double angle quotation mark | 171 | 0xab | ® | Registered sign | 169 | 0xa9 |
175 | 0xaf | » | Right-pointing double angle quotation mark | 187 | 0xbb | ¯ | Macron | 238 | 0xee |
176 | 0xb0 | Light shade | 128 | 0x80 | ° | Degree sign | 248 | 0xf8 | |
177 | 0xb1 | Medium shade | 129 | 0x81 | ± | Plus-minus sign | 241 | 0xf1 | |
178 | 0xb2 | Dark shade | 130 | 0x82 | ² | Superscript two | 253 | 0xfd | |
179 | 0xb3 | Box drawings light vertical | 156 | 0x9c | ³ | Superscript three | 252 | 0xfc | |
180 | 0xb4 | Box drawings light vertical and left | 132 | 0x84 | ´ | Acute accent | 239 | 0xef | |
181 | 0xb5 | Á | Latin capital letter A with acute | 193 | 0xc1 | µ | Micro sign | 230 | 0xe6 |
182 | 0xb6 | Â | Latin capital letter A with circumflex | 194 | 0xc2 | ¶ | Pilcrow sign | 244 | 0xf4 |
183 | 0xb7 | À | Latin capital letter A with grave | 192 | 0xc0 | · | Middle dot | 250 | 0xfa |
184 | 0xb8 | © | Copyright sign | 169 | 0xa9 | ¸ | Cedilla | 247 | 0xf7 |
185 | 0xb9 | Box drawings double vertical and left | 133 | 0x85 | ¹ | Superscript one | 251 | 0xfb | |
186 | 0xba | Box drawings double vertical | 5 | 0x05 | º | Masculine ordinal indicator | 167 | 0xa7 | |
187 | 0xbb | Box drawings double down and left | 135 | 0x87 | » | Right-pointing double angle quotation mark | 175 | 0xaf | |
188 | 0xbc | Box drawings double up and left | 136 | 0x88 | ¼ | Vulgar fraction one quarter | 172 | 0xac | |
189 | 0xbd | ¢ | Cent sign | 162 | 0xa2 | ½ | Vulgar fraction one half | 171 | 0xab |
190 | 0xbe | ¥ | Yen sign | 165 | 0xa5 | ¾ | Vulgar fraction three quarters | 243 | 0xf3 |
191 | 0xbf | Box drawings light down and left | 137 | 0x89 | ¿ | Inverted question mark | 168 | 0xa8 | |
192 | 0xc0 | Box drawings light up and right | 138 | 0x8a | À | Latin capital letter A with grave | 183 | 0xb7 | |
193 | 0xc1 | Box drawings light up and horizontal | 139 | 0x8b | Á | Latin capital letter A with acute | 181 | 0xb5 | |
194 | 0xc2 | Box drawings light down and horizontal | 140 | 0x8c | Â | Latin capital letter A with circumflex | 182 | 0xb6 | |
195 | 0xc3 | Box drawings light vertical and right | 141 | 0x8d | Ã | Latin capital letter A with tilde | 199 | 0xc7 | |
196 | 0xc4 | Box drawings light horizontal | 173 | 0xad | Ä | Latin capital letter A with diaeresis | 142 | 0x8e | |
197 | 0xc5 | Box drawings light vertical and horizontal | 142 | 0x8e | Å | Latin capital letter A with ring above | 143 | 0x8f | |
198 | 0xc6 | ã | Latin small letter A with tilde | 227 | 0xe3 | Æ | Latin capital letter AE | 146 | 0x92 |
199 | 0xc7 | Ã | Latin capital letter A with tilde | 195 | 0xc3 | Ç | Latin capital letter C with cedilla | 128 | 0x80 |
200 | 0xc8 | Box drawings double up and right | 143 | 0x8f | È | Latin capital letter E with grave | 212 | 0xd4 | |
201 | 0xc9 | Box drawings double down and right | 144 | 0x90 | É | Latin capital letter E with acute | 144 | 0x90 | |
202 | 0xca | Box drawings double up and horizontal | 145 | 0x91 | Ê | Latin capital letter E with circumflex | 210 | 0xd2 | |
203 | 0xcb | Box drawings double down and horizontal | 146 | 0x92 | Ë | Latin capital letter E with diaeresis | 211 | 0xd3 | |
204 | 0xcc | Box drawings double vertical and right | 147 | 0x93 | Ì | Latin capital letter I with grave | 222 | 0xde | |
205 | 0xcd | Box drawings double horizontal | 151 | 0x97 | Í | Latin capital letter I with acute | 214 | 0xd6 | |
206 | 0xce | Box drawings double vertical and horizontal | 148 | 0x94 | Î | Latin capital letter I with circumflex | 215 | 0xd7 | |
207 | 0xcf | ¤ | Currency sign | 164 | 0xa4 | Ï | Latin capital letter I with diaeresis | 216 | 0xd8 |
208 | 0xd0 | ð | Latin small letter ETH | 240 | 0xf0 | Ð | Latin capital letter ETH | 209 | 0xd1 |
209 | 0xd1 | Ð | Latin capital letter ETH | 208 | 0xd0 | Ñ | Latin capital letter N with tilde | 165 | 0xa5 |
210 | 0xd2 | Ê | Latin capital letter E with circumflex | 202 | 0xca | Ò | Latin capital letter O with grave | 227 | 0xe3 |
211 | 0xd3 | Ë | Latin capital letter E with diaeresis | 203 | 0xcb | Ó | Latin capital letter O with acute | 224 | 0xe0 |
212 | 0xd4 | È | Latin capital letter E with grave | 200 | 0xc8 | Ô | Latin capital letter O with circumflex | 226 | 0xe2 |
213 | 0xd5 | Latin small letter dotless I | 150 | 0x96 | Õ | Latin capital letter O with tilde | 229 | 0xe5 | |
214 | 0xd6 | Í | Latin capital letter I with acute | 205 | 0xcd | Ö | Latin capital letter O with diaeresis | 153 | 0x99 |
215 | 0xd7 | Î | Latin capital letter I with circumflex | 206 | 0xce | × | Multiplication sign | 158 | 0x9e |
216 | 0xd8 | Ï | Latin capital letter I with diaeresis | 207 | 0xcf | Ø | Latin capital letter O with stroke | 157 | 0x9d |
217 | 0xd9 | Box drawings light up and left | 152 | 0x98 | Ù | Latin capital letter U with grave | 235 | 0xeb | |
218 | 0xda | Box drawings light down and right | 153 | 0x99 | Ú | Latin capital letter U with acute | 233 | 0xe9 | |
219 | 0xdb | Full block | 154 | 0x9a | Û | Latin capital letter U with circumflex | 234 | 0xea | |
220 | 0xdc | Lower half block | 155 | 0x9b | Ü | Latin capital letter U with diaeresis | 154 | 0x9a | |
221 | 0xdd | ¦ | Broken bar | 166 | 0xa6 | Ý | Latin capital letter Y with acute | 237 | 0xed |
222 | 0xde | Ì | Latin capital letter I with grave | 204 | 0xcc | Þ | Latin capital letter THORN | 232 | 0xe8 |
223 | 0xdf | Upper half block | 157 | 0x9d | ß | Latin small letter sharp S | 225 | 0xe1 | |
224 | 0xe0 | Ó | Latin capital letter O with acute | 211 | 0xd3 | à | Latin small letter A with grave | 133 | 0x85 |
225 | 0xe1 | ß | Latin small letter sharp S | 223 | 0xdf | á | Latin small letter A with acute | 160 | 0xa0 |
226 | 0xe2 | Ô | Latin capital letter O with circumflex | 212 | 0xd4 | â | Latin small letter A with circumflex | 131 | 0x83 |
227 | 0xe3 | Ò | Latin capital letter O with grave | 210 | 0xd2 | ã | Latin small letter A with tilde | 198 | 0xc6 |
228 | 0xe4 | õ | Latin small letter O with tilde | 245 | 0xf5 | ä | Latin small letter A with diaeresis | 132 | 0x84 |
229 | 0xe5 | Õ | Latin capital letter O with tilde | 213 | 0xd5 | å | Latin small letter A with ring above | 134 | 0x86 |
230 | 0xe6 | µ | Micro sign | 181 | 0xb5 | æ | Latin small letter AE | 145 | 0x91 |
231 | 0xe7 | þ | Latin small letter THORN | 254 | 0xfe | ç | Latin small letter C with cedilla | 135 | 0x87 |
232 | 0xe8 | Þ | Latin capital letter THORN | 222 | 0xde | è | Latin small letter E with grave | 138 | 0x8a |
233 | 0xe9 | Ú | Latin capital letter U with acute | 218 | 0xda | é | Latin small letter E with acute | 130 | 0x82 |
234 | 0xea | Û | Latin capital letter U with circumflex | 219 | 0xdb | ê | Latin small letter E with circumflex | 136 | 0x88 |
235 | 0xeb | Ù | Latin capital letter U with grave | 217 | 0xd9 | ë | Latin small letter E with diaeresis | 137 | 0x89 |
236 | 0xec | ý | Latin small letter Y with acute | 253 | 0xfd | ì | Latin small letter I with grave | 141 | 0x8d |
237 | 0xed | Ý | Latin capital letter Y with acute | 221 | 0xdd | í | Latin small letter I with acute | 161 | 0xa1 |
238 | 0xee | ¯ | Macron | 175 | 0xaf | î | Latin small letter I with circumflex | 140 | 0x8c |
239 | 0xef | ´ | Acute accent | 180 | 0xb4 | ï | Latin small letter I with diaeresis | 139 | 0x8b |
240 | 0xf0 | | Soft hyphen | 158 | 0x9e | ð | Latin small letter ETH | 208 | 0xd0 |
241 | 0xf1 | ± | Plus-minus sign | 177 | 0xb1 | ñ | Latin small letter N with tilde | 164 | 0xa4 |
242 | 0xf2 | Double low line | 159 | 0x9f | ò | Latin small letter O with grave | 149 | 0x95 | |
243 | 0xf3 | ¾ | Vulgar fraction three quarters | 190 | 0xbe | ó | Latin small letter O with acute | 162 | 0xa2 |
244 | 0xf4 | ¶ | Pilcrow sign | 182 | 0xb6 | ô | Latin small letter O with circumflex | 147 | 0x93 |
245 | 0xf5 | § | Section sign | 167 | 0xa7 | õ | Latin small letter O with tilde | 228 | 0xe4 |
246 | 0xf6 | ÷ | Division sign | 247 | 0xf7 | ö | Latin small letter O with diaeresis | 148 | 0x94 |
247 | 0xf7 | ¸ | Cedilla | 184 | 0xb8 | ÷ | Division sign | 246 | 0xf6 |
248 | 0xf8 | ° | Degree sign | 176 | 0xb0 | ø | Latin small letter O with stroke | 155 | 0x9b |
249 | 0xf9 | ¨ | Diaeresis | 168 | 0xa8 | ù | Latin small letter U with grave | 151 | 0x97 |
250 | 0xfa | · | Middle dot | 183 | 0xb7 | ú | Latin small letter U with acute | 163 | 0xa3 |
251 | 0xfb | ¹ | Superscript one | 185 | 0xb9 | û | Latin small letter U with circumflex | 150 | 0x96 |
252 | 0xfc | ³ | Superscript three | 179 | 0xb3 | ü | Latin small letter U with diaeresis | 129 | 0x81 |
253 | 0xfd | ² | Superscript two | 178 | 0xb2 | ý | Latin small letter Y with acute | 236 | 0xec |
254 | 0xfe | Black square | 149 | 0x95 | þ | Latin small letter THORN | 231 | 0xe7 | |
255 | 0xff | No-break space | 160 | 0xa0 | ÿ | Latin small letter Y with diaeresis | 152 | 0x98 |
Copyright © 2000 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.
We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.
A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.
The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License.
The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License.
A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only.
The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.
You may also lend copies, under the same conditions stated above, and you may publicly display copies.
If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.
If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.
It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.
If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.
You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties - for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.
You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.
The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.
The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.
In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements."
You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.
If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate.
Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.
Copyright (c) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License".
If you have no Invariant Sections, write "with no Invariant Sections" instead of saying which ones are invariant. If you have no Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.