[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 01/11] fdc: take side count into account
From: |
Hervé Poussineau |
Subject: |
[Qemu-devel] [PATCH v4 01/11] fdc: take side count into account |
Date: |
Mon, 6 Feb 2012 22:29:02 +0100 |
Floppies can be simple or double-sided. However, current code
was only taking the common case into account (ie 2 sides).
This repairs single-sided floppies, which where totally broken
before this patch : for track > 0, wrong sector number was
calculated, and data was read/written at wrong place on
underlying device.
Fortunately, only some 360 kB floppies are single-sided, so
this bug was probably not seen much.
Signed-off-by: Hervé Poussineau <address@hidden>
---
hw/fdc.c | 17 +++++++++++------
1 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/hw/fdc.c b/hw/fdc.c
index f575a2c..cd479f0 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -95,16 +95,19 @@ static void fd_init(FDrive *drv)
drv->max_track = 0;
}
+#define NUM_SIDES(drv) ((drv)->flags & FDISK_DBL_SIDES ? 2 : 1)
+
static int fd_sector_calc(uint8_t head, uint8_t track, uint8_t sect,
- uint8_t last_sect)
+ uint8_t last_sect, uint8_t num_sides)
{
- return (((track * 2) + head) * last_sect) + sect - 1;
+ return (((track * num_sides) + head) * last_sect) + sect - 1;
}
/* Returns current position, in sectors, for given drive */
static int fd_sector(FDrive *drv)
{
- return fd_sector_calc(drv->head, drv->track, drv->sect, drv->last_sect);
+ return fd_sector_calc(drv->head, drv->track, drv->sect, drv->last_sect,
+ NUM_SIDES(drv));
}
/* Seek to a new position:
@@ -135,7 +138,7 @@ static int fd_seek(FDrive *drv, uint8_t head, uint8_t
track, uint8_t sect,
drv->max_track, drv->last_sect);
return 3;
}
- sector = fd_sector_calc(head, track, sect, drv->last_sect);
+ sector = fd_sector_calc(head, track, sect, drv->last_sect, NUM_SIDES(drv));
ret = 0;
if (sector != fd_sector(drv)) {
#if 0
@@ -1019,7 +1022,8 @@ static void fdctrl_start_transfer(FDCtrl *fdctrl, int
direction)
ks = fdctrl->fifo[4];
FLOPPY_DPRINTF("Start transfer at %d %d %02x %02x (%d)\n",
GET_CUR_DRV(fdctrl), kh, kt, ks,
- fd_sector_calc(kh, kt, ks, cur_drv->last_sect));
+ fd_sector_calc(kh, kt, ks, cur_drv->last_sect,
+ NUM_SIDES(cur_drv)));
switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) {
case 2:
/* sect too big */
@@ -1289,7 +1293,8 @@ static void fdctrl_format_sector(FDCtrl *fdctrl)
ks = fdctrl->fifo[8];
FLOPPY_DPRINTF("format sector at %d %d %02x %02x (%d)\n",
GET_CUR_DRV(fdctrl), kh, kt, ks,
- fd_sector_calc(kh, kt, ks, cur_drv->last_sect));
+ fd_sector_calc(kh, kt, ks, cur_drv->last_sect,
+ NUM_SIDES(cur_drv)));
switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) {
case 2:
/* sect too big */
--
1.7.8.3
- [Qemu-devel] [PATCH v4 00/11] Misc fixes for floppy emulation, Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 01/11] fdc: take side count into account,
Hervé Poussineau <=
- [Qemu-devel] [PATCH v4 02/11] fdc: set busy bit when starting a command, Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 03/11] fdc: most control commands do not generate interrupts, Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 04/11] fdc: handle read-only floppies (abort early on write commands), Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 05/11] fdc: add CCR (Configuration Control Register) write register, Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 10/11] fdc: fix seek command, which shouldn't check tracks, Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 11/11] fdc: DIR (Digital Input Register) should return status of current drive..., Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 06/11] block: add a transfer rate for floppy types, Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 07/11] pc: add 1.1 machine type, Hervé Poussineau, 2012/02/06
- [Qemu-devel] [PATCH v4 09/11] fdc: check if media rate is correct before doing any transfer, Hervé Poussineau, 2012/02/06