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 */ |
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; |
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; |
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 */ |
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 || |