|Re: [hatari-devel] Missing DMA sector count register emulation for ACSI transfers?|
[ Thread Index |
| More lists.tuxfamily.org/hatari-devel Archives
Le 01/09/2021 à 15:45, Christian Zietz a écrit :
I'm testing a (fairly exotic) harddisk driver that was bundled with DDD
(C) 1991 by K.R.
Digital Data Deicke
(Digital Data Deicke used to be a popular Atari distributor in Germany.)
... and I found it not to be working on Hatari. First, I thought that it
was perhaps relying on some non-standard behavior/commands of DDD
harddisks. But meanwhile I've come to the conclusion that there is a
detail missing in Hatari's emulation of ACSI disks.
After completion of a command, the driver reads the DMA status register
at address $FF8606. (Not to be confused with the status byte that is
read over the ACSI bus from the actual drive.) It masks the lower three
bits and checks for 1 (= 3'b001). But Hatari always returns a 3 (=
3'b011), here. Bit 0 means "no DMA error", bit 1 means "sector count
register is not zero". The equivalent lines of code are here:
However, it seems that the ACSI code in hdc.c never sets the DMA sector
count register to 0, which makes this particular disk driver fail. I've
tested (by means of a quick hack) that zeroing the sector count register
from Acsi_DmaTransfer() makes Hatari return the expected DMA status of
1, and makes the driver work.
I don't know very well that part in hdc.c, but it seems
Acsi_DmaTransfer() never checks SectorCount at all and doesn't update it
after enough bytes are read/written.
IMO Acsi_DmaTransfer() should be modified to use FDC_DMA_FIFO_Push()
when reading as it's already the case for FDC read accesses.
For write case it's harder to share code with fdc's FDC_DMA_FIFO_Pull(),
so it should at least check FDC_DMA.SectorCount>0 and decrement it
Unfortunately I don't use HD image that much, so I'd rather leave the
change to someone more familiar with this part (thomas maybe ?)