/[qemu]/qemu/hw/fdc.c
ViewVC logotype

Diff of /qemu/hw/fdc.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.14 by bellard, Sun Oct 10 17:51:13 2004 UTC revision 1.15 by bellard, Sun Nov 7 18:04:02 2004 UTC
# Line 313  static void fd_reset (fdrive_t *drv) Line 313  static void fd_reset (fdrive_t *drv)
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    
# Line 908  static void fdctrl_start_transfer_del (f Line 909  static void fdctrl_start_transfer_del (f
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;
# Line 924  static int fdctrl_transfer_handler (void Line 926  static int fdctrl_transfer_handler (void
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);
# Line 935  static int fdctrl_transfer_handler (void Line 937  static int fdctrl_transfer_handler (void
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 "
# Line 958  static int fdctrl_transfer_handler (void Line 960  static int fdctrl_transfer_handler (void
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));
# Line 977  static int fdctrl_transfer_handler (void Line 983  static int fdctrl_transfer_handler (void
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;

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26