summaryrefslogtreecommitdiff
path: root/ae-protocol.md
diff options
context:
space:
mode:
Diffstat (limited to 'ae-protocol.md')
-rw-r--r--ae-protocol.md215
1 files changed, 171 insertions, 44 deletions
diff --git a/ae-protocol.md b/ae-protocol.md
index 91bd860..86f73bc 100644
--- a/ae-protocol.md
+++ b/ae-protocol.md
@@ -1,55 +1,182 @@
+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