mirror of
https://github.com/alfishe/amiga-bootcamp.git
synced 2026-06-12 16:16:28 +00:00
Comprehensive technical documentation covering: - Hardware: OCS/ECS/AGA custom chip registers, Copper & Blitter deep dives - Boot sequence: cold boot through startup-sequence - Binary format: HUNK executable spec, relocation, debug info - Linking & ABI: .fd files, LVO tables, register calling conventions - Exec kernel: tasks, interrupts, memory, signals, semaphores - AmigaDOS: file I/O, FFS/OFS layout, CLI/Shell scripting - Graphics: planar bitmaps, Copper programming, HAM/EHB modes - Intuition: screens, windows, IDCMP, BOOPSI - Devices: trackdisk, SCSI, serial, timer, audio, keyboard - Libraries: utility, expansion, IFFParse, locale, ARexx - Networking: bsdsocket API, SANA-II, TCP/IP stack comparison - Toolchain: GCC, vasm/vlink, SAS/C, NDK, debugging - Reverse engineering: IDA/Ghidra setup, compiler fingerprints, case studies - CPU & MMU: 68040/060 emulation libs, PMMU, cache management - Driver development: SANA-II, Picasso96/RTG, AHI audio All files include breadcrumb navigation. No local paths or proprietary content.
3.2 KiB
3.2 KiB
Packet System — DosPacket, ACTION_* Codes
Overview
AmigaDOS filesystem handlers communicate via DosPackets — messages sent to the handler's MsgPort. Every file operation (Open, Read, Lock, etc.) is internally translated into an ACTION_* packet. Understanding packets is essential for writing custom handlers or intercepting filesystem calls.
struct DosPacket
/* dos/dosextens.h — NDK39 */
struct DosPacket {
struct Message *dp_Link; /* exec message (backlink) */
struct MsgPort *dp_Port; /* reply port */
LONG dp_Type; /* ACTION_* code */
LONG dp_Res1; /* primary result */
LONG dp_Res2; /* secondary result (error code) */
LONG dp_Arg1; /* argument 1 — type depends on dp_Type */
LONG dp_Arg2;
LONG dp_Arg3;
LONG dp_Arg4;
LONG dp_Arg5;
LONG dp_Arg6;
LONG dp_Arg7;
};
Common ACTION_* Codes
| Code | Dec | Action | Args |
|---|---|---|---|
ACTION_FINDINPUT |
1005 | Open for reading | Arg1=FileHandle, Arg2=Lock, Arg3=name(BSTR) |
ACTION_FINDOUTPUT |
1006 | Open for writing (create) | same |
ACTION_FINDUPDATE |
1004 | Open for r/w | same |
ACTION_READ |
82 | Read bytes | Arg1=FH_Arg1, Arg2=buf, Arg3=len |
ACTION_WRITE |
87 | Write bytes | Arg1=FH_Arg1, Arg2=buf, Arg3=len |
ACTION_SEEK |
1008 | Seek | Arg1=FH_Arg1, Arg2=pos, Arg3=mode |
ACTION_END |
1007 | Close file | Arg1=FH_Arg1 |
ACTION_LOCATE_OBJECT |
8 | Lock (obtain) | Arg1=dirLock, Arg2=name(BSTR), Arg3=mode |
ACTION_FREE_LOCK |
15 | UnLock | Arg1=lock |
ACTION_EXAMINE_OBJECT |
23 | Examine (stat) | Arg1=lock, Arg2=FIB(BPTR) |
ACTION_EXAMINE_NEXT |
24 | ExNext | Arg1=lock, Arg2=FIB(BPTR) |
ACTION_PARENT |
29 | ParentDir | Arg1=lock |
ACTION_DELETE_OBJECT |
16 | Delete | Arg1=lock, Arg2=name(BSTR) |
ACTION_RENAME_OBJECT |
17 | Rename | Arg1=fromLock, Arg2=fromName, Arg3=toLock, Arg4=toName |
ACTION_CREATE_DIR |
22 | CreateDir | Arg1=lock, Arg2=name(BSTR) |
ACTION_SET_PROTECT |
21 | SetProtection | Arg1=0, Arg2=lock, Arg3=name(BSTR), Arg4=bits |
ACTION_DISK_INFO |
25 | Info | Arg1=InfoData(BPTR) |
ACTION_IS_FILESYSTEM |
1027 | Query | (none) → Res1=DOSTRUE if filesystem |
Sending a Packet Manually
struct MsgPort *handler = ((struct FileLock *)BADDR(lock))->fl_Task;
struct StandardPacket sp;
sp.sp_Msg.mn_Node.ln_Name = (char *)&sp.sp_Pkt;
sp.sp_Pkt.dp_Link = &sp.sp_Msg;
sp.sp_Pkt.dp_Port = CreateMsgPort();
sp.sp_Pkt.dp_Type = ACTION_DISK_INFO;
sp.sp_Pkt.dp_Arg1 = MKBADDR(infodata);
PutMsg(handler, &sp.sp_Msg);
WaitPort(sp.sp_Pkt.dp_Port);
GetMsg(sp.sp_Pkt.dp_Port);
/* sp.sp_Pkt.dp_Res1 = result */
DeleteMsgPort(sp.sp_Pkt.dp_Port);
BSTR — BCPL Strings
Handler packets use BSTR for filenames: a BPTR to a length-prefixed string:
[len_byte][char_0][char_1]...[char_n]
len_byte= string length (max 255)- No null terminator
- Convert:
UBYTE *bstr = (UBYTE *)BADDR(bstr_bptr); int len = bstr[0]; char *name = &bstr[1];
References
- NDK39:
dos/dosextens.h,dos/dos.h - ADCD 2.1:
DoPkt, packet system - Amiga ROM Kernel Reference Manual: Devices — filesystem handler chapter