Try sector count=1
Joe
  On Dec 6, 2015, at 3:57 PM, Oliver Lehmann <lehmann
at ans-netz.de> wrote:
 Hi,
 I've built a Harddisk-Controller-Emulator for my system which accesses
 a IDE (PATA) harddisk with an ATMega in PIO mode. It works like a charm
 except for one WD harddisk. The harddisk itself works fine with MS-DOS
 6.22 and FreeBSD but refuses to work with my ATMega.
 On reading or writing a sector, right after the command is issued, the
 error bit is set in the status register, and the error register indicates
 an ABRT.
 # ABRT:
 # indicates the requested  command has been aborted  due to a
 # drive status error (such as not ready or write fault) or because
 # the command is invalid.
 Right after power up and after the disk got ready, I issue the IDENTIFY
 command and read the data back which works perfectly. After that I
 read sector 0 and this fails.
 I use LBA since the harddisk states that is supportes LBA. Nevertheless
 I also tried accessing the harddisk with CHS mode and got the same error.
 I tested other harddisks which support either CHS+LBA or CHS only. All
 of them work perfectly.
 What happens after powerup to read block 0 of the disk in LBA mode:
 - Setup AVR ports and so on
 - wait until RDY gets high
 - wait until BSY gets low
 - issue a Drive/Head register Command with value 0
 - wait until BSY gets low
 - issue a Command Register Command with value 0xEC (identify device)
 - *read data*
 - process and print out data
 - wait until BSY gets low
 - issue a Sector Count register Command with value 0
 - issue a Sector Number register Command with value 0
 - issue a Cylinder Low register Command with value 0
 - issue a Cylinder High register Command with value 0
 - issue a Drive/Head register Command with 0 + 0xE0 (LBA, Drive 0)
 - issue a Command Register Command with value 0x20 (Read Sector)
 - *read data*
 *read data*:
 - wait until BSY gets low
 - check ERR bit in the Status register <- set on cmd 0x20 here
 - wait until DRQ gets high
 - issue a Data register Command with no data
 - put /RD on low
 - read 512 bytes of data
 - put /RD on high
 - check ERR bit in the Status register
 Issuing a Command works always like setting /CS0, /CS1, /DA0, /DA1,
 /DA2 to low, and then set the needed signals to high so the desired
 command is indicated.
 When data has to be transfered with this command, the lower 8 bits
 are put then onto the port, /WR is set to low afterwards, 3 nop()
 are done and /WR is set back to high.
 Does anyone see an error what could make the drive behave like I said?
 - ATA IDENTIFY works, and the drives data can be read
 - after a read or write sector command is issued, the status register
 directly goes 0xd0 (busy) and with the 2nd fetch 0x59 (not busy, drq
 set, err set)
 Regards, Oliver