313 |
|
|
314 |
static void fdctrl_reset (fdctrl_t *fdctrl, int do_irq); |
static void fdctrl_reset (fdctrl_t *fdctrl, int do_irq); |
315 |
static void fdctrl_reset_fifo (fdctrl_t *fdctrl); |
static void fdctrl_reset_fifo (fdctrl_t *fdctrl); |
316 |
static int fdctrl_transfer_handler (void *opaque, target_ulong addr, int size); |
static int fdctrl_transfer_handler (void *opaque, int nchan, |
317 |
|
int dma_pos, int dma_len); |
318 |
static void fdctrl_raise_irq (fdctrl_t *fdctrl, uint8_t status); |
static void fdctrl_raise_irq (fdctrl_t *fdctrl, uint8_t status); |
319 |
static void fdctrl_result_timer(void *opaque); |
static void fdctrl_result_timer(void *opaque); |
320 |
|
|
909 |
} |
} |
910 |
|
|
911 |
/* handlers for DMA transfers */ |
/* handlers for DMA transfers */ |
912 |
static int fdctrl_transfer_handler (void *opaque, target_ulong addr, int size) |
static int fdctrl_transfer_handler (void *opaque, int nchan, |
913 |
|
int dma_pos, int dma_len) |
914 |
{ |
{ |
915 |
fdctrl_t *fdctrl; |
fdctrl_t *fdctrl; |
916 |
fdrive_t *cur_drv; |
fdrive_t *cur_drv; |
926 |
if (fdctrl->data_dir == FD_DIR_SCANE || fdctrl->data_dir == FD_DIR_SCANL || |
if (fdctrl->data_dir == FD_DIR_SCANE || fdctrl->data_dir == FD_DIR_SCANL || |
927 |
fdctrl->data_dir == FD_DIR_SCANH) |
fdctrl->data_dir == FD_DIR_SCANH) |
928 |
status2 = 0x04; |
status2 = 0x04; |
929 |
if (size > fdctrl->data_len) |
if (dma_len > fdctrl->data_len) |
930 |
size = fdctrl->data_len; |
dma_len = fdctrl->data_len; |
931 |
if (cur_drv->bs == NULL) { |
if (cur_drv->bs == NULL) { |
932 |
if (fdctrl->data_dir == FD_DIR_WRITE) |
if (fdctrl->data_dir == FD_DIR_WRITE) |
933 |
fdctrl_stop_transfer(fdctrl, 0x60, 0x00, 0x00); |
fdctrl_stop_transfer(fdctrl, 0x60, 0x00, 0x00); |
937 |
goto transfer_error; |
goto transfer_error; |
938 |
} |
} |
939 |
rel_pos = fdctrl->data_pos % FD_SECTOR_LEN; |
rel_pos = fdctrl->data_pos % FD_SECTOR_LEN; |
940 |
for (start_pos = fdctrl->data_pos; fdctrl->data_pos < size;) { |
for (start_pos = fdctrl->data_pos; fdctrl->data_pos < dma_len;) { |
941 |
len = size - fdctrl->data_pos; |
len = dma_len - fdctrl->data_pos; |
942 |
if (len + rel_pos > FD_SECTOR_LEN) |
if (len + rel_pos > FD_SECTOR_LEN) |
943 |
len = FD_SECTOR_LEN - rel_pos; |
len = FD_SECTOR_LEN - rel_pos; |
944 |
FLOPPY_DPRINTF("copy %d bytes (%d %d %d) %d pos %d %02x %02x " |
FLOPPY_DPRINTF("copy %d bytes (%d %d %d) %d pos %d %02x %02x " |
960 |
switch (fdctrl->data_dir) { |
switch (fdctrl->data_dir) { |
961 |
case FD_DIR_READ: |
case FD_DIR_READ: |
962 |
/* READ commands */ |
/* READ commands */ |
963 |
cpu_physical_memory_write(addr + fdctrl->data_pos, |
DMA_write_memory (nchan, fdctrl->fifo + rel_pos, |
964 |
fdctrl->fifo + rel_pos, len); |
fdctrl->data_pos, len); |
965 |
|
/* cpu_physical_memory_write(addr + fdctrl->data_pos, */ |
966 |
|
/* fdctrl->fifo + rel_pos, len); */ |
967 |
break; |
break; |
968 |
case FD_DIR_WRITE: |
case FD_DIR_WRITE: |
969 |
/* WRITE commands */ |
/* WRITE commands */ |
970 |
cpu_physical_memory_read(addr + fdctrl->data_pos, |
DMA_read_memory (nchan, fdctrl->fifo + rel_pos, |
971 |
fdctrl->fifo + rel_pos, len); |
fdctrl->data_pos, len); |
972 |
|
/* cpu_physical_memory_read(addr + fdctrl->data_pos, */ |
973 |
|
/* fdctrl->fifo + rel_pos, len); */ |
974 |
if (bdrv_write(cur_drv->bs, fd_sector(cur_drv), |
if (bdrv_write(cur_drv->bs, fd_sector(cur_drv), |
975 |
fdctrl->fifo, 1) < 0) { |
fdctrl->fifo, 1) < 0) { |
976 |
FLOPPY_ERROR("writting sector %d\n", fd_sector(cur_drv)); |
FLOPPY_ERROR("writting sector %d\n", fd_sector(cur_drv)); |
983 |
{ |
{ |
984 |
uint8_t tmpbuf[FD_SECTOR_LEN]; |
uint8_t tmpbuf[FD_SECTOR_LEN]; |
985 |
int ret; |
int ret; |
986 |
cpu_physical_memory_read(addr + fdctrl->data_pos, |
DMA_read_memory (nchan, tmpbuf, fdctrl->data_pos, len); |
987 |
tmpbuf, len); |
/* cpu_physical_memory_read(addr + fdctrl->data_pos, */ |
988 |
|
/* tmpbuf, len); */ |
989 |
ret = memcmp(tmpbuf, fdctrl->fifo + rel_pos, len); |
ret = memcmp(tmpbuf, fdctrl->fifo + rel_pos, len); |
990 |
if (ret == 0) { |
if (ret == 0) { |
991 |
status2 = 0x08; |
status2 = 0x08; |