Am 06.02.2012 22:29, schrieb Hervé Poussineau: > The programmed rate has to be the same as the required rate for the > floppy format ; if that's not the case, the transfer should abort. > This check can be disabled by using the 'check_media_rate' property. > > Save media rate value only if media rate check is enabled. > > Signed-off-by: Hervé Poussineau <hpous...@reactos.org> > --- > hw/fdc.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- > 1 files changed, 50 insertions(+), 3 deletions(-) > > diff --git a/hw/fdc.c b/hw/fdc.c > index af007ae..d2a22fa 100644 > --- a/hw/fdc.c > +++ b/hw/fdc.c > @@ -62,12 +62,15 @@ > #define FD_SECTOR_SC 2 /* Sector size code */ > #define FD_RESET_SENSEI_COUNT 4 /* Number of sense interrupts on RESET */ > > +typedef struct FDCtrl FDCtrl; > + > /* Floppy disk drive emulation */ > typedef enum FDiskFlags { > FDISK_DBL_SIDES = 0x01, > } FDiskFlags; > > typedef struct FDrive { > + FDCtrl *fdctrl; > BlockDriverState *bs; > /* Drive status */ > FDriveType drive; > @@ -83,6 +86,7 @@ typedef struct FDrive { > uint16_t bps; /* Bytes per sector */ > uint8_t ro; /* Is read-only */ > uint8_t media_changed; /* Is media changed */ > + uint8_t media_rate; /* Data rate of medium */ > } FDrive; > > static void fd_init(FDrive *drv) > @@ -195,6 +199,7 @@ static void fd_revalidate(FDrive *drv) > drv->last_sect = last_sect; > drv->ro = ro; > drv->drive = drive; > + drv->media_rate = rate; > } else { > FLOPPY_DPRINTF("No disk in drive\n"); > drv->last_sect = 0; > @@ -206,8 +211,6 @@ static void fd_revalidate(FDrive *drv) > /********************************************************/ > /* Intel 82078 floppy disk controller emulation */ > > -typedef struct FDCtrl FDCtrl; > - > static void fdctrl_reset(FDCtrl *fdctrl, int do_irq); > static void fdctrl_reset_fifo(FDCtrl *fdctrl); > static int fdctrl_transfer_handler (void *opaque, int nchan, > @@ -303,6 +306,7 @@ enum { > }; > > enum { > + FD_SR1_MA = 0x01, /* Missing address mark */ > FD_SR1_NW = 0x02, /* Not writable */ > FD_SR1_EC = 0x80, /* End of cylinder */ > }; > @@ -549,6 +553,24 @@ static const VMStateDescription > vmstate_fdrive_media_changed = { > } > }; > > +static bool fdrive_media_rate_needed(void *opaque) > +{ > + FDrive *drive = opaque; > + > + return drive->fdctrl->check_media_rate; > +} > + > +static const VMStateDescription vmstate_fdrive_media_rate = { > + .name = "fdrive/media_rate", > + .version_id = 1, > + .minimum_version_id = 1, > + .minimum_version_id_old = 1, > + .fields = (VMStateField[]) { > + VMSTATE_UINT8(media_rate, FDrive), > + VMSTATE_END_OF_LIST() > + } > +};
Juan, Paolo, this is a subsection in a struct array. Does this work meanwhile or is it still broken? Kevin