Merge pull request #1 from gooofy/master
[fuse-aexplorer.git] / ae-protocol.md
index 91bd860d72824ec042d390ff282b8ca148649288..86f73bcd94ea80c8703f0534ab43e397d4a59f80 100644 (file)
+Overview
+========
+
+The AE protocol works by exchanging messages between the Amiga and the Client (e.g. an IBM PC).
+
+Each message consists of a header and optionally payload data. Both parts carry CRC32 checksums
+to ensure data integrity. 
+
+Message header
+--------------
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| 2              | Msg (see below)              |
+| 2              | Payload length               |
+| 4              | Sequence                     |
+| 4              | CRC32                        |
+
+Payload (if any)
+----------------
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| n              | Payload                      |
+| 4              | CRC32                        |
+
+Each message is acknowledged by the receiving side by a 4-Byte "PkOk" response if the checksum matches, "PkRs" otherwise.
+
+Recovery from checksum errors: on "PkRs" non-ack, the sending side re-sends the whole message until "PkOk" is received.
+FIXME: is this correct?
+
 Message types
-==============
-
-     Msg ID | Sending side | Description
-    --------|--------------|----------------------------------
-         00 | Ami/PC       | Ask for next block
-         01 | Ami/PC       | Transfer cancelled
-         02 | Ami/PC       | Initialisation / Init response
-         03 | Ami/?        | Multipart header
-         04 | Amiga        | EOF (no payload)
-         05 | Amiga        | Next data block
-
-         08 | Amiga        | File already exists (when trying to write with 0x66)
-        09 | Amiga        | Size ? (response to 0x6c)
-         0a | Amiga        | Close response
-         0b | Amiga        | Format response?
-
-         64 | PC           | List directory
-         65 | PC           | File read
-         66 | PC           | File/folder write
-         67 | PC           | File/folder delete (recursively)
-         68 | PC           | File rename (name changes) (works on drives, too?)
-         69 | PC           | File move (path changes)
-         6a | PC           | File copy
-         6b | PC           | Set attributes and comment
-         6c | PC           | Request size on disk (?)
-         6d | PC           | Close file
-         6e | PC           | Format disk (needs Kickstart 2.0 or newer)
-         6f | PC           | New folder
-
-
-
-
-Request details
-================
-
-64 - List a directory
-----------------------
+=============
 
-### TODO ###
+| Msg  | ID                | Sending side | Description                                               |
+| ---- | ----------------- | ------------ | --------------------------------------------------------- |
+| 0x00 | MSG_NEXT_PART     | Amiga/Client | Ask for next block                                        |
+| 0x01 |                   | Amiga/Client | Transfer cancelled                                        |
+| 0x02 | MSG_INIT          | Amiga/Client | Initialisation / Init response                            |
+| 0x03 | MSG_MPARTH        | Amiga/?      | Multipart header                                          |
+| 0x04 | MSG_EOF           | Amiga        | EOF (no payload)                                          |
+| 0x05 | MSG_BLOCK         | Amiga        | Next data block                                           |
+|      |                   |              |                                                           |
+| 0x08 | MSG_EXISTS        | Amiga        | File already exists (when trying to write with 0x66)      |
+| 0x09 |                   | Amiga        | Size ? (response to 0x6c)                                 |
+| 0x0a | MSG_ACK_CLOSE     | Amiga        | Close response                                            |
+| 0x0b |                   | Amiga        | Format response?                                          |
+|      |                   |              |                                                           |
+| 0x64 | MSG_DIR           | Client       | List directory                                            |
+| 0x65 | MSG_FILE_SEND     | Client       | File read                                                 |
+| 0x66 | MSG_FILE_RECV     | Client       | File/folder write                                         |
+| 0x67 |                   | Client       | File/folder delete (recursively)                          |
+| 0x68 |                   | Client       | File rename (name changes) (works on drives, too?)        |
+| 0x69 |                   | Client       | File move (path changes)                                  |
+| 0x6a |                   | Client       | File copy                                                 |
+| 0x6b |                   | Client       | Set attributes and comment                                |
+| 0x6c |                   | Client       | Request size on disk (?)                                  |
+| 0x6d | MSG_FILE_CLOSE    | Client       | Close file                                                |
+| 0x6e |                   | Client       | Format disk (needs Kickstart 2.0 or newer)                |
+| 0x6f |                   | Client       | New folder                                                |
 
+Message details
+===============
 
-65 - Read a file
------------------
+0x00 MSG_NEXT_PART - Ask for next block
+---------------------------------------
 
-### TODO ###
+Payload: none
 
+Expected repsonse: MSG_BLOCK or MSG_EOF
 
-66 - Write a file
-------------------
 
-### TODO ###
+0x03 MSG_MPARTH - Multipart header
+----------------------------------
+
+Payload: 
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| 4              | length                       |
+
+Expected response: 0x00 MSG_NEXT_PART
+
+0x04 MSG_EOF
+------------
+
+Payload: none
+
+Expected response: 0x6d MSG_FILE_CLOSE
+
+0x05 MSG_BLOCK - Next data block
+--------------------------------
+
+Payload:
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| 4              | offset                       |
+| n              | data                         |
+
+Expected response: 0x00 MSG_NEXT_PART
+
+0x64 MSG_DIR - List a directory (Client -> Amiga)
+-------------------------------------------------
+
+Payload:
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| n              | path                         |
+| 1              | 0                            |
+| 1              | 1 FIXME ??                   |
+
+Expected response: 0x03 MSG_MPARTH if path exists, MSG_EOF otherwise
+
+Multipart data will be polled in chunks using MSG_NEXT_PART. This data is structured as follows:
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| 4              | number of entries            |
+| n              | dir entries                  |
+
+Each dir entry is structured as follows:
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| 4              | len (29+n+m)                 |
+| 4              | size                         |
+| 4              | used                         |
+| 2              | type (0: file, 0x8000: dir)  |
+| 2              | attributes                   |
+|                |   S: 0x40                    |
+|                |   P: 0x20                    |
+|                |   A: 0x10                    |
+|                |   R: 0x08                    |
+|                |   W: 0x04                    |
+|                |   E: 0x02                    |
+|                |   D: 0x01                    |
+| 4              | date                         |
+| 4              | time                         |
+| 4              | ctime                        |
+| 1              | type2 FIXME: ???             |
+| n              | name\0                       |
+| m              | comment\0                    |
+
+
+0x65 MSG_FILE_SEND - Read a file
+--------------------------------
+
+Payload: filename\0
+
+Expected response: 0x08 MSG_EXISTS if file cannot be opened, 0x03 MSG_MPARTH otherwise
+
+
+0x66 MSG_FILE_RECV - Write a file (Client -> Amiga)
+---------------------------------------------------
+
+Payload:
+
+| Bytes          | Content                      |
+| -------------- | ---------------------------- |
+| 4              | header size                  |
+| 4              | file size                    |
+| 4              | FIXME ??                     |
+| 4              | attributes                   |
+|                |   S: 0x40                    |
+|                |   P: 0x20                    |
+|                |   A: 0x10                    |
+|                |   R: 0x08                    |
+|                |   W: 0x04                    |
+|                |   E: 0x02                    |
+|                |   D: 0x01                    |
+| 4              | date (hours since 1/1/78)    |
+| 4              | time (mins since midnight)   |
+| 4              | ctime                        |
+| 1              | file type FIXME: encoding?   |
+| header_size-29 | file name                    |
+
+Expected response: 0x00 MSG_NEXT_PART if file does not exist (yet), 0x08 MSG_EXISTS otherwise
 
 
 67 - Delete file/folder