Commit 46d3233ba00f68e3d23a12d7428d8f53a66b12c9
1 parent
77370520
FDC fix 8/10 (Hervé Poussineau):
- Replaces bootsel field by the whole tdr register. It may be easier if we want to later add support for tapes. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4288 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
10 additions
and
10 deletions
hw/fdc.c
| @@ -467,10 +467,10 @@ struct fdctrl_t { | @@ -467,10 +467,10 @@ struct fdctrl_t { | ||
| 467 | uint8_t sra; | 467 | uint8_t sra; |
| 468 | uint8_t srb; | 468 | uint8_t srb; |
| 469 | uint8_t dor; | 469 | uint8_t dor; |
| 470 | + uint8_t tdr; | ||
| 470 | uint8_t dsr; | 471 | uint8_t dsr; |
| 471 | uint8_t msr; | 472 | uint8_t msr; |
| 472 | uint8_t cur_drv; | 473 | uint8_t cur_drv; |
| 473 | - uint8_t bootsel; | ||
| 474 | uint8_t status0; | 474 | uint8_t status0; |
| 475 | uint8_t status1; | 475 | uint8_t status1; |
| 476 | uint8_t status2; | 476 | uint8_t status2; |
| @@ -606,13 +606,13 @@ static void fdc_save (QEMUFile *f, void *opaque) | @@ -606,13 +606,13 @@ static void fdc_save (QEMUFile *f, void *opaque) | ||
| 606 | /* Controller state */ | 606 | /* Controller state */ |
| 607 | qemu_put_8s(f, &s->sra); | 607 | qemu_put_8s(f, &s->sra); |
| 608 | qemu_put_8s(f, &s->srb); | 608 | qemu_put_8s(f, &s->srb); |
| 609 | + qemu_put_8s(f, &s->tdr); | ||
| 609 | qemu_put_8s(f, &s->dsr); | 610 | qemu_put_8s(f, &s->dsr); |
| 610 | qemu_put_8s(f, &s->msr); | 611 | qemu_put_8s(f, &s->msr); |
| 611 | qemu_put_8s(f, &s->status0); | 612 | qemu_put_8s(f, &s->status0); |
| 612 | qemu_put_8s(f, &s->status1); | 613 | qemu_put_8s(f, &s->status1); |
| 613 | qemu_put_8s(f, &s->status2); | 614 | qemu_put_8s(f, &s->status2); |
| 614 | qemu_put_8s(f, &s->cur_drv); | 615 | qemu_put_8s(f, &s->cur_drv); |
| 615 | - qemu_put_8s(f, &s->bootsel); | ||
| 616 | /* Command FIFO */ | 616 | /* Command FIFO */ |
| 617 | qemu_put_buffer(f, s->fifo, FD_SECTOR_LEN); | 617 | qemu_put_buffer(f, s->fifo, FD_SECTOR_LEN); |
| 618 | qemu_put_be32s(f, &s->data_pos); | 618 | qemu_put_be32s(f, &s->data_pos); |
| @@ -651,13 +651,13 @@ static int fdc_load (QEMUFile *f, void *opaque, int version_id) | @@ -651,13 +651,13 @@ static int fdc_load (QEMUFile *f, void *opaque, int version_id) | ||
| 651 | /* Controller state */ | 651 | /* Controller state */ |
| 652 | qemu_get_8s(f, &s->sra); | 652 | qemu_get_8s(f, &s->sra); |
| 653 | qemu_get_8s(f, &s->srb); | 653 | qemu_get_8s(f, &s->srb); |
| 654 | + qemu_get_8s(f, &s->tdr); | ||
| 654 | qemu_get_8s(f, &s->dsr); | 655 | qemu_get_8s(f, &s->dsr); |
| 655 | qemu_get_8s(f, &s->msr); | 656 | qemu_get_8s(f, &s->msr); |
| 656 | qemu_get_8s(f, &s->status0); | 657 | qemu_get_8s(f, &s->status0); |
| 657 | qemu_get_8s(f, &s->status1); | 658 | qemu_get_8s(f, &s->status1); |
| 658 | qemu_get_8s(f, &s->status2); | 659 | qemu_get_8s(f, &s->status2); |
| 659 | qemu_get_8s(f, &s->cur_drv); | 660 | qemu_get_8s(f, &s->cur_drv); |
| 660 | - qemu_get_8s(f, &s->bootsel); | ||
| 661 | /* Command FIFO */ | 661 | /* Command FIFO */ |
| 662 | qemu_get_buffer(f, s->fifo, FD_SECTOR_LEN); | 662 | qemu_get_buffer(f, s->fifo, FD_SECTOR_LEN); |
| 663 | qemu_get_be32s(f, &s->data_pos); | 663 | qemu_get_be32s(f, &s->data_pos); |
| @@ -762,12 +762,15 @@ static void fdctrl_reset (fdctrl_t *fdctrl, int do_irq) | @@ -762,12 +762,15 @@ static void fdctrl_reset (fdctrl_t *fdctrl, int do_irq) | ||
| 762 | 762 | ||
| 763 | static inline fdrive_t *drv0 (fdctrl_t *fdctrl) | 763 | static inline fdrive_t *drv0 (fdctrl_t *fdctrl) |
| 764 | { | 764 | { |
| 765 | - return &fdctrl->drives[fdctrl->bootsel]; | 765 | + return &fdctrl->drives[(fdctrl->tdr & FD_TDR_BOOTSEL) >> 2]; |
| 766 | } | 766 | } |
| 767 | 767 | ||
| 768 | static inline fdrive_t *drv1 (fdctrl_t *fdctrl) | 768 | static inline fdrive_t *drv1 (fdctrl_t *fdctrl) |
| 769 | { | 769 | { |
| 770 | - return &fdctrl->drives[1 - fdctrl->bootsel]; | 770 | + if ((fdctrl->tdr & FD_TDR_BOOTSEL) < (1 << 2)) |
| 771 | + return &fdctrl->drives[1]; | ||
| 772 | + else | ||
| 773 | + return &fdctrl->drives[0]; | ||
| 771 | } | 774 | } |
| 772 | 775 | ||
| 773 | static fdrive_t *get_cur_drv (fdctrl_t *fdctrl) | 776 | static fdrive_t *get_cur_drv (fdctrl_t *fdctrl) |
| @@ -848,11 +851,8 @@ static void fdctrl_write_dor (fdctrl_t *fdctrl, uint32_t value) | @@ -848,11 +851,8 @@ static void fdctrl_write_dor (fdctrl_t *fdctrl, uint32_t value) | ||
| 848 | /* Tape drive register : 0x03 */ | 851 | /* Tape drive register : 0x03 */ |
| 849 | static uint32_t fdctrl_read_tape (fdctrl_t *fdctrl) | 852 | static uint32_t fdctrl_read_tape (fdctrl_t *fdctrl) |
| 850 | { | 853 | { |
| 851 | - uint32_t retval = 0; | 854 | + uint32_t retval = fdctrl->tdr; |
| 852 | 855 | ||
| 853 | - /* Disk boot selection indicator */ | ||
| 854 | - retval |= fdctrl->bootsel << 2; | ||
| 855 | - /* Tape indicators: never allowed */ | ||
| 856 | FLOPPY_DPRINTF("tape drive register: 0x%02x\n", retval); | 856 | FLOPPY_DPRINTF("tape drive register: 0x%02x\n", retval); |
| 857 | 857 | ||
| 858 | return retval; | 858 | return retval; |
| @@ -867,7 +867,7 @@ static void fdctrl_write_tape (fdctrl_t *fdctrl, uint32_t value) | @@ -867,7 +867,7 @@ static void fdctrl_write_tape (fdctrl_t *fdctrl, uint32_t value) | ||
| 867 | } | 867 | } |
| 868 | FLOPPY_DPRINTF("tape drive register set to 0x%02x\n", value); | 868 | FLOPPY_DPRINTF("tape drive register set to 0x%02x\n", value); |
| 869 | /* Disk boot selection indicator */ | 869 | /* Disk boot selection indicator */ |
| 870 | - fdctrl->bootsel = (value & FD_TDR_BOOTSEL) >> 2; | 870 | + fdctrl->tdr = value & FD_TDR_BOOTSEL; |
| 871 | /* Tape indicators: never allow */ | 871 | /* Tape indicators: never allow */ |
| 872 | } | 872 | } |
| 873 | 873 |