Copyright (c) Hyperion Entertainment and contributors.
Difference between revisions of "AmigaDOS Packets"
Steven Solie (talk | contribs) (Created page with "Packet passing handles all communication performed by AmigaDOS between processes. The function diagram below shows how packets fit in with the other components of the Amiga op...") |
Steven Solie (talk | contribs) |
||
Line 35: | Line 35: | ||
commands to a process's MsgPort. The StandardPacket structure contains an |
commands to a process's MsgPort. The StandardPacket structure contains an |
||
Exec Message structure and an AmigaDOS DOSPacket structure: |
Exec Message structure and an AmigaDOS DOSPacket structure: |
||
+ | |||
+ | struct StandardPacket |
||
+ | { struct Message sp_Msg; |
||
+ | struct DOSPacket sp_Pkt; |
||
+ | }; |
||
+ | |||
+ | This structure must be longword-aligned, and initialized to link the |
||
+ | Message and DOSPacket sections to each other: |
||
+ | |||
+ | packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt); |
||
+ | packet->sp_Pkt.dp_Link = &(packet->sp_Msg); |
||
+ | |||
+ | Packets must also be initialized with a ReplyPort which can be created |
||
+ | with the amiga.lib function CreatePort(): |
||
+ | |||
+ | if (replyport = (struct MsgPort *) CreatePort(NULL, 0)) |
||
+ | packet->sp_Pkt.dp_Port = replyport; |
||
+ | |||
+ | The DOSPacket portion of the StandardPacket structure is used to pass the |
||
+ | packet type and arguments, and to receive the results of the packet. The |
||
+ | argument types, number of arguments, and results vary for different packet |
||
+ | types and are documented with each packet description. A DOSPacket must be |
||
+ | longword-aligned and has the following general structure: |
||
+ | |||
+ | {| class="wikitable" |
||
+ | ! Type |
||
+ | ! Name |
||
+ | ! Description |
||
+ | |- |
||
+ | | struct Message* |
||
+ | | dp_Link |
||
+ | | Pointer back to Exec message structure |
||
+ | |- |
||
+ | | struct Message* |
||
+ | | dp_Port |
||
+ | | Reply port for the packet. Must be filled in each send |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Type |
||
+ | | Packet type |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Res1 |
||
+ | | For filesystem calls this is the result that would have been returned by the function; eg. Write("W") returns actual length written. |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Res2 |
||
+ | | For filesystem calls this is what would have been returned by IoErr() |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Arg1 |
||
+ | | Argument [1] (depends on packet type) |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Arg2 |
||
+ | | Argument 2 (depends on packet type) |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Arg3 |
||
+ | | Argument 3 (depends on packet type) |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Arg4 |
||
+ | | Argument 4 (depends on packet type) |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Arg5 |
||
+ | | Argument 5 (depends on packet type) |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Arg6 |
||
+ | | Argument 6 (depends on packet type) |
||
+ | |- |
||
+ | | LONG |
||
+ | | dp_Arg7 |
||
+ | | Argument 7 (depends on packet type) |
||
+ | |} |
Revision as of 17:12, 27 April 2012
Packet passing handles all communication performed by AmigaDOS between processes. The function diagram below shows how packets fit in with the other components of the Amiga operating system.
+--------------+ | User Process +-----------------------+ +-------+------+ | | | | | Function Calls | | | \|/ | +---------+--------+ | | AmigaDOS Open(), | | | Close(), etc. | | +---------+--------+ | | | | | +-Packets---+--------+ +-----Packets--------+ | | | | | | \|/ \|/ \|/ \|/ \|/ \|/ +----+----+ +----+----+ +-+--+--+-+ +----+----+ +----+----+ | FFS/OFS | | FFS/OFS | | FFS/OFS | | CON: | | CON: | | DH0: | | DF0: | | DF1: | | Window1 | | Window2 | | Handler | | Handler | | Handler | | Handler | | Handler | | Process | | Process | | Process | | Process | | Process | +----+----+ +-------+-+ +----+----+ +----+----+ +----+----+ | | | | | \|/ \|/ \|/ \|/ \|/ +----+--------+ +--+--------+----+ +----+-----------+----+ |Hddisk.device| |Trackdisk.device| | Console.device | +-------------+ +----------------+ +---------------------+
A StandardPacket (defined in <dos/dosextens.h>) is used to send packet commands to a process's MsgPort. The StandardPacket structure contains an Exec Message structure and an AmigaDOS DOSPacket structure:
struct StandardPacket { struct Message sp_Msg; struct DOSPacket sp_Pkt; };
This structure must be longword-aligned, and initialized to link the Message and DOSPacket sections to each other:
packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt); packet->sp_Pkt.dp_Link = &(packet->sp_Msg);
Packets must also be initialized with a ReplyPort which can be created with the amiga.lib function CreatePort():
if (replyport = (struct MsgPort *) CreatePort(NULL, 0)) packet->sp_Pkt.dp_Port = replyport;
The DOSPacket portion of the StandardPacket structure is used to pass the packet type and arguments, and to receive the results of the packet. The argument types, number of arguments, and results vary for different packet types and are documented with each packet description. A DOSPacket must be longword-aligned and has the following general structure:
Type | Name | Description |
---|---|---|
struct Message* | dp_Link | Pointer back to Exec message structure |
struct Message* | dp_Port | Reply port for the packet. Must be filled in each send |
LONG | dp_Type | Packet type |
LONG | dp_Res1 | For filesystem calls this is the result that would have been returned by the function; eg. Write("W") returns actual length written. |
LONG | dp_Res2 | For filesystem calls this is what would have been returned by IoErr() |
LONG | dp_Arg1 | Argument [1] (depends on packet type) |
LONG | dp_Arg2 | Argument 2 (depends on packet type) |
LONG | dp_Arg3 | Argument 3 (depends on packet type) |
LONG | dp_Arg4 | Argument 4 (depends on packet type) |
LONG | dp_Arg5 | Argument 5 (depends on packet type) |
LONG | dp_Arg6 | Argument 6 (depends on packet type) |
LONG | dp_Arg7 | Argument 7 (depends on packet type) |