AT/IDE Task File Registers¶
The IDE/ATA task file is the standard PC/AT disk register set, exposed on the Amiga through the Gayle chip (A600/A1200 — see gayle.md) or directly on the A3000 SCSI/AT controller and the CDTV-CR.
This page documents the task file mapping for two distinct Amiga configurations:
- A300 / A600 / A1200 / CDTV — base address
$DA2000(the fast bus), via Gayle (or CDTV-CR) - A1000 / A1000+ jr/sr — base address
$DD2020(separate hardware)
Register map — A300 / A600 / A1200 / CDTV¶
All offsets from $DA2000. All registers 8-bit unless noted.
| Offset | Absolute | Name | Access | Description |
|---|---|---|---|---|
$0000 |
$DA2000 |
AT_Data |
RW (16-bit) | Data port (16-bit PIO data transfer) |
$0004 |
$DA2004 |
AT_Error |
R | Error register |
$0008 |
$DA2008 |
AT_SectorCnt |
RW | Sector count (0 = 256 sectors) |
$000C |
$DA200C |
AT_SectorNum |
RW | Sector to start (1-based!) |
$0010 |
$DA2010 |
AT_CylLow |
RW | Low byte of cylinder number |
$0014 |
$DA2014 |
AT_CylHigh |
RW | High byte of cylinder number |
$0018 |
$DA2018 |
AT_DriveHead |
RW | Drive and head number (drive bit + head) |
$001C |
$DA201C |
AT_Status |
R | Status register (read clears interrupt) |
$001C |
$DA201C |
AT_Command |
W | Command value (write starts the drive) |
$1000 |
$DA3000 |
AT_IntStatus |
R | Interrupt status bit, active LOW |
$1018 |
$DA3018 |
AT_AltStatus |
R | Alternate status (does not clear interrupt) |
$1018 |
$DA3018 |
AT_DeviceCtrl |
W | Device control — interrupt enable / reset |
$101C |
$DA301C |
AT_DriveAddress |
R | Drive address (PC-ish, not used) |
The IDE "slow" alias is kept for compatibility at IDE_Slow = $DA0000.
Register map — A1000 / A1000+ jr/sr¶
All offsets from $DD2020.
| Offset | Absolute | Name | Access | Description |
|---|---|---|---|---|
$0000 |
$DD2020 |
AT_Data |
RW (16-bit) | Data port |
$0006 |
$DD2026 |
AT_Error |
R | Error register |
$000A |
$DD202A |
AT_SectorCnt |
RW | Sector count |
$000E |
$DD202E |
AT_SectorNum |
RW | Sector to start (1-based) |
$0012 |
$DD2032 |
AT_CylLow |
RW | Low cylinder |
$0016 |
$DD2036 |
AT_CylHigh |
RW | High cylinder |
$001A |
$DD203A |
AT_DriveHead |
RW | Drive + head |
$001E |
$DD203E |
AT_Status |
R | Status (clears interrupt) |
$001E |
$DD203E |
AT_Command |
W | Command (starts drive) |
-$1000 |
$DD1020 |
AT_ModeReg0 |
RW | Mode register 0 |
-$1000+2 |
$DD1022 |
AT_ModeReg1 |
RW | Mode register 1 |
$1000 |
$DD3020 |
AT_IntStatus |
R | Interrupt status bit, active HIGH, longword in bit 31 |
$101A |
$DD303A |
AT_AltStatus |
R | Alternate status |
$101A |
$DD303A |
AT_DeviceCtrl |
W | Device control |
$101E |
$DD303E |
AT_DriveAddress |
R | Drive address |
Status register bits (AT_Status)¶
| Bit | Define | Meaning |
|---|---|---|
| 7 | AT_BSY |
Drive busy |
| 6 | AT_RDY |
Drive ready |
| 3 | AT_DRQ |
Data request ready |
| 1 | AT_IDX |
Index |
| 0 | AT_ERR |
Error |
Drive/Head register bits¶
| Bit | Define | Meaning |
|---|---|---|
| 4 | DH_SLAVE |
Set to access drive 1 (slave) |
Device Control register bits¶
| Bit | Define | Meaning |
|---|---|---|
| 1 | DC_INT_ENABLE |
Interrupt enable (1 = enable, 0 = disable) |
Error register bits¶
| Bit | Define | Meaning |
|---|---|---|
| 7 | ERR_BBK |
Bad block detected |
| 6 | ERR_UNC |
Uncorrectable data error |
| 4 | ERR_IDNF |
ID not found |
| 2 | ERR_ABRT |
Aborted command |
| 1 | ERR_TK0NF |
Track 0 not found |
| 0 | ERR_AMNF |
Address mark not found |
| 10 | ERR_SELFTEST |
Self-test failure (extension) |
| 9 | ERR_NOT_READY |
LUN doesn't respond (extension) |
| 8 | ERR_ADDR |
LBA out of range (extension) |
IDE command set (used by the Amiga driver)¶
| Code | Define | Command |
|---|---|---|
$10 |
AT_RECALIBRATE |
Recalibrate drive |
$20 |
AT_READ_SECTORS |
Read sectors |
$30 |
AT_WRITE_SECTORS |
Write sectors |
$40 |
AT_READ_VERIFY_SECTORS |
Read-verify (no data transfer) |
$50 |
AT_FORMAT |
Format track |
$70 |
AT_SEEK |
Seek to cylinder |
$90 |
AT_DIAGNOSTICS |
Run drive diagnostics |
$91 |
AT_INIT_PARAMETERS |
Initialize drive parameters |
$C4 |
AT_READ_MULTIPLE |
Read multiple sectors |
$C5 |
AT_WRITE_MULTIPLE |
Write multiple sectors |
$C6 |
AT_SET_MULTIPLE_MODE |
Set multiple-sector mode |
$EC |
AT_IDENTIFY_DRIVE |
Identify drive (returns 512-byte config block) |
Cross-references¶
gayle.md— Gayle chip registers that gate the IDE buscdtv-cr.md— CDTV-CR hardware register ($A40000) which sits on the same IDE bus on the CDTV../register-reference.md— master register index