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