fdc.c (3b35d4542c8537a9269f6372df531ced6c960084) fdc.c (a9262f551eba44d4d0f9e396d7124c059a93e204)
1/*
2 * QEMU Floppy disk emulator (Intel 82078)
3 *
4 * Copyright (c) 2003, 2007 Jocelyn Mayer
5 * Copyright (c) 2008 Hervé Poussineau
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal

--- 1614 unchanged lines hidden (view full) ---

1623 FLOPPY_DPRINTF("copy %d bytes (%d %d %d) %d pos %d %02x "
1624 "(%d-0x%08x 0x%08x)\n", len, dma_len, fdctrl->data_pos,
1625 fdctrl->data_len, GET_CUR_DRV(fdctrl), cur_drv->head,
1626 cur_drv->track, cur_drv->sect, fd_sector(cur_drv),
1627 fd_sector(cur_drv) * FD_SECTOR_LEN);
1628 if (fdctrl->data_dir != FD_DIR_WRITE ||
1629 len < FD_SECTOR_LEN || rel_pos != 0) {
1630 /* READ & SCAN commands and realign to a sector for WRITE */
1/*
2 * QEMU Floppy disk emulator (Intel 82078)
3 *
4 * Copyright (c) 2003, 2007 Jocelyn Mayer
5 * Copyright (c) 2008 Hervé Poussineau
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal

--- 1614 unchanged lines hidden (view full) ---

1623 FLOPPY_DPRINTF("copy %d bytes (%d %d %d) %d pos %d %02x "
1624 "(%d-0x%08x 0x%08x)\n", len, dma_len, fdctrl->data_pos,
1625 fdctrl->data_len, GET_CUR_DRV(fdctrl), cur_drv->head,
1626 cur_drv->track, cur_drv->sect, fd_sector(cur_drv),
1627 fd_sector(cur_drv) * FD_SECTOR_LEN);
1628 if (fdctrl->data_dir != FD_DIR_WRITE ||
1629 len < FD_SECTOR_LEN || rel_pos != 0) {
1630 /* READ & SCAN commands and realign to a sector for WRITE */
1631 if (blk_pread(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
1632 BDRV_SECTOR_SIZE, 0) < 0) {
1631 if (blk_pread(cur_drv->blk, fd_offset(cur_drv), BDRV_SECTOR_SIZE,
1632 fdctrl->fifo, 0) < 0) {
1633 FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
1634 fd_sector(cur_drv));
1635 /* Sure, image size is too small... */
1636 memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
1637 }
1638 }
1639 switch (fdctrl->data_dir) {
1640 case FD_DIR_READ:

--- 10 unchanged lines hidden (view full) ---

1651 fdctrl_stop_transfer(fdctrl,
1652 FD_SR0_ABNTERM | FD_SR0_SEEK, FD_SR1_NW,
1653 0x00);
1654 goto transfer_error;
1655 }
1656
1657 k->read_memory(fdctrl->dma, nchan, fdctrl->fifo + rel_pos,
1658 fdctrl->data_pos, len);
1633 FLOPPY_DPRINTF("Floppy: error getting sector %d\n",
1634 fd_sector(cur_drv));
1635 /* Sure, image size is too small... */
1636 memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
1637 }
1638 }
1639 switch (fdctrl->data_dir) {
1640 case FD_DIR_READ:

--- 10 unchanged lines hidden (view full) ---

1651 fdctrl_stop_transfer(fdctrl,
1652 FD_SR0_ABNTERM | FD_SR0_SEEK, FD_SR1_NW,
1653 0x00);
1654 goto transfer_error;
1655 }
1656
1657 k->read_memory(fdctrl->dma, nchan, fdctrl->fifo + rel_pos,
1658 fdctrl->data_pos, len);
1659 if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv),
1660 fdctrl->fifo, BDRV_SECTOR_SIZE, 0) < 0) {
1659 if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv), BDRV_SECTOR_SIZE,
1660 fdctrl->fifo, 0) < 0) {
1661 FLOPPY_DPRINTF("error writing sector %d\n",
1662 fd_sector(cur_drv));
1663 fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
1664 goto transfer_error;
1665 }
1666 break;
1667 case FD_DIR_VERIFY:
1668 /* VERIFY commands */

--- 66 unchanged lines hidden (view full) ---

1735 assert(fdctrl->msr & FD_MSR_NONDMA);
1736 if (pos == 0) {
1737 if (fdctrl->data_pos != 0)
1738 if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) {
1739 FLOPPY_DPRINTF("error seeking to next sector %d\n",
1740 fd_sector(cur_drv));
1741 return 0;
1742 }
1661 FLOPPY_DPRINTF("error writing sector %d\n",
1662 fd_sector(cur_drv));
1663 fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
1664 goto transfer_error;
1665 }
1666 break;
1667 case FD_DIR_VERIFY:
1668 /* VERIFY commands */

--- 66 unchanged lines hidden (view full) ---

1735 assert(fdctrl->msr & FD_MSR_NONDMA);
1736 if (pos == 0) {
1737 if (fdctrl->data_pos != 0)
1738 if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) {
1739 FLOPPY_DPRINTF("error seeking to next sector %d\n",
1740 fd_sector(cur_drv));
1741 return 0;
1742 }
1743 if (blk_pread(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
1744 BDRV_SECTOR_SIZE, 0)
1743 if (blk_pread(cur_drv->blk, fd_offset(cur_drv), BDRV_SECTOR_SIZE,
1744 fdctrl->fifo, 0)
1745 < 0) {
1746 FLOPPY_DPRINTF("error getting sector %d\n",
1747 fd_sector(cur_drv));
1748 /* Sure, image size is too small... */
1749 memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
1750 }
1751 }
1752

--- 62 unchanged lines hidden (view full) ---

1815 case 1:
1816 fdctrl->status0 |= FD_SR0_SEEK;
1817 break;
1818 default:
1819 break;
1820 }
1821 memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
1822 if (cur_drv->blk == NULL ||
1745 < 0) {
1746 FLOPPY_DPRINTF("error getting sector %d\n",
1747 fd_sector(cur_drv));
1748 /* Sure, image size is too small... */
1749 memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
1750 }
1751 }
1752

--- 62 unchanged lines hidden (view full) ---

1815 case 1:
1816 fdctrl->status0 |= FD_SR0_SEEK;
1817 break;
1818 default:
1819 break;
1820 }
1821 memset(fdctrl->fifo, 0, FD_SECTOR_LEN);
1822 if (cur_drv->blk == NULL ||
1823 blk_pwrite(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
1824 BDRV_SECTOR_SIZE, 0) < 0) {
1823 blk_pwrite(cur_drv->blk, fd_offset(cur_drv), BDRV_SECTOR_SIZE,
1824 fdctrl->fifo, 0) < 0) {
1825 FLOPPY_DPRINTF("error formatting sector %d\n", fd_sector(cur_drv));
1826 fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
1827 } else {
1828 if (cur_drv->sect == cur_drv->last_sect) {
1829 fdctrl->data_state &= ~FD_STATE_FORMAT;
1830 /* Last sector done */
1831 fdctrl_stop_transfer(fdctrl, 0x00, 0x00, 0x00);
1832 } else {

--- 406 unchanged lines hidden (view full) ---

2239 /* For DMA requests, RQM should be cleared during execution phase, so
2240 * we would have errored out above. */
2241 assert(fdctrl->msr & FD_MSR_NONDMA);
2242
2243 /* FIFO data write */
2244 if (pos == FD_SECTOR_LEN - 1 ||
2245 fdctrl->data_pos == fdctrl->data_len) {
2246 cur_drv = get_cur_drv(fdctrl);
1825 FLOPPY_DPRINTF("error formatting sector %d\n", fd_sector(cur_drv));
1826 fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);
1827 } else {
1828 if (cur_drv->sect == cur_drv->last_sect) {
1829 fdctrl->data_state &= ~FD_STATE_FORMAT;
1830 /* Last sector done */
1831 fdctrl_stop_transfer(fdctrl, 0x00, 0x00, 0x00);
1832 } else {

--- 406 unchanged lines hidden (view full) ---

2239 /* For DMA requests, RQM should be cleared during execution phase, so
2240 * we would have errored out above. */
2241 assert(fdctrl->msr & FD_MSR_NONDMA);
2242
2243 /* FIFO data write */
2244 if (pos == FD_SECTOR_LEN - 1 ||
2245 fdctrl->data_pos == fdctrl->data_len) {
2246 cur_drv = get_cur_drv(fdctrl);
2247 if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv), fdctrl->fifo,
2248 BDRV_SECTOR_SIZE, 0) < 0) {
2247 if (blk_pwrite(cur_drv->blk, fd_offset(cur_drv), BDRV_SECTOR_SIZE,
2248 fdctrl->fifo, 0) < 0) {
2249 FLOPPY_DPRINTF("error writing sector %d\n",
2250 fd_sector(cur_drv));
2251 break;
2252 }
2253 if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) {
2254 FLOPPY_DPRINTF("error seeking to next sector %d\n",
2255 fd_sector(cur_drv));
2256 break;

--- 137 unchanged lines hidden ---
2249 FLOPPY_DPRINTF("error writing sector %d\n",
2250 fd_sector(cur_drv));
2251 break;
2252 }
2253 if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) {
2254 FLOPPY_DPRINTF("error seeking to next sector %d\n",
2255 fd_sector(cur_drv));
2256 break;

--- 137 unchanged lines hidden ---