/[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.17 by bellard, Mon Jan 3 23:28:27 2005 UTC revision 1.18 by bellard, Sun Mar 13 09:43:36 2005 UTC
# Line 94  typedef struct fdrive_t { Line 94  typedef struct fdrive_t {
94      uint8_t ro;               /* Is read-only           */      uint8_t ro;               /* Is read-only           */
95  } fdrive_t;  } fdrive_t;
96    
 #ifdef TARGET_SPARC  
 /* XXX: suppress those hacks */  
 #define DMA_read_memory(a,b,c,d)  
 #define DMA_write_memory(a,b,c,d)  
 void DMA_register_channel (int nchan,  
                            DMA_transfer_handler transfer_handler,  
                            void *opaque)  
 {  
 }  
 #define DMA_hold_DREQ(a)  
 #define DMA_release_DREQ(a)  
 #define DMA_get_channel_mode(a) (0)  
 #define DMA_schedule(a)  
 #endif  
   
97  static void fd_init (fdrive_t *drv, BlockDriverState *bs)  static void fd_init (fdrive_t *drv, BlockDriverState *bs)
98  {  {
99      /* Drive */      /* Drive */
# Line 423  static uint32_t fdctrl_read (void *opaqu Line 408  static uint32_t fdctrl_read (void *opaqu
408      uint32_t retval;      uint32_t retval;
409    
410      switch (reg & 0x07) {      switch (reg & 0x07) {
411    #ifdef TARGET_SPARC
412        case 0x00:
413            // Identify to Linux as S82078B
414            retval = fdctrl_read_statusB(fdctrl);
415            break;
416    #endif
417      case 0x01:      case 0x01:
418          retval = fdctrl_read_statusB(fdctrl);          retval = fdctrl_read_statusB(fdctrl);
419          break;          break;
# Line 577  static void fdctrl_reset_irq (fdctrl_t * Line 568  static void fdctrl_reset_irq (fdctrl_t *
568    
569  static void fdctrl_raise_irq (fdctrl_t *fdctrl, uint8_t status)  static void fdctrl_raise_irq (fdctrl_t *fdctrl, uint8_t status)
570  {  {
571    #ifdef TARGET_SPARC
572        // Sparc mutation
573        if (!fdctrl->dma_en) {
574            fdctrl->state &= ~FD_CTRL_BUSY;
575            fdctrl->int_status = status;
576            return;
577        }
578    #endif
579      if (~(fdctrl->state & FD_CTRL_INTR)) {      if (~(fdctrl->state & FD_CTRL_INTR)) {
580          pic_set_irq(fdctrl->irq_lvl, 1);          pic_set_irq(fdctrl->irq_lvl, 1);
581          fdctrl->state |= FD_CTRL_INTR;          fdctrl->state |= FD_CTRL_INTR;
# Line 980  static int fdctrl_transfer_handler (void Line 979  static int fdctrl_transfer_handler (void
979          len = dma_len - fdctrl->data_pos;          len = dma_len - fdctrl->data_pos;
980          if (len + rel_pos > FD_SECTOR_LEN)          if (len + rel_pos > FD_SECTOR_LEN)
981              len = FD_SECTOR_LEN - rel_pos;              len = FD_SECTOR_LEN - rel_pos;
982          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 "
983                         "(%d-0x%08x 0x%08x)\n", len, size, fdctrl->data_pos,                         "(%d-0x%08x 0x%08x)\n", len, dma_len, fdctrl->data_pos,
984                         fdctrl->data_len, fdctrl->cur_drv, cur_drv->head,                         fdctrl->data_len, fdctrl->cur_drv, cur_drv->head,
985                         cur_drv->track, cur_drv->sect, fd_sector(cur_drv),                         cur_drv->track, cur_drv->sect, fd_sector(cur_drv),
986                         fd_sector(cur_drv) * 512, addr);                         fd_sector(cur_drv) * 512);
987          if (fdctrl->data_dir != FD_DIR_WRITE ||          if (fdctrl->data_dir != FD_DIR_WRITE ||
988              len < FD_SECTOR_LEN || rel_pos != 0) {              len < FD_SECTOR_LEN || rel_pos != 0) {
989              /* READ & SCAN commands and realign to a sector for WRITE */              /* READ & SCAN commands and realign to a sector for WRITE */
# Line 1045  static int fdctrl_transfer_handler (void Line 1044  static int fdctrl_transfer_handler (void
1044              FLOPPY_DPRINTF("seek to next sector (%d %02x %02x => %d) (%d)\n",              FLOPPY_DPRINTF("seek to next sector (%d %02x %02x => %d) (%d)\n",
1045                             cur_drv->head, cur_drv->track, cur_drv->sect,                             cur_drv->head, cur_drv->track, cur_drv->sect,
1046                             fd_sector(cur_drv),                             fd_sector(cur_drv),
1047                             fdctrl->data_pos - size);                             fdctrl->data_pos - len);
1048              /* XXX: cur_drv->sect >= cur_drv->last_sect should be an              /* XXX: cur_drv->sect >= cur_drv->last_sect should be an
1049                 error in fact */                 error in fact */
1050              if (cur_drv->sect >= cur_drv->last_sect ||              if (cur_drv->sect >= cur_drv->last_sect ||

Legend:
Removed from v.1.17  
changed lines
  Added in v.1.18

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