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 | 467 | uint8_t sra; |
| 468 | 468 | uint8_t srb; |
| 469 | 469 | uint8_t dor; |
| 470 | + uint8_t tdr; | |
| 470 | 471 | uint8_t dsr; |
| 471 | 472 | uint8_t msr; |
| 472 | 473 | uint8_t cur_drv; |
| 473 | - uint8_t bootsel; | |
| 474 | 474 | uint8_t status0; |
| 475 | 475 | uint8_t status1; |
| 476 | 476 | uint8_t status2; |
| ... | ... | @@ -606,13 +606,13 @@ static void fdc_save (QEMUFile *f, void *opaque) |
| 606 | 606 | /* Controller state */ |
| 607 | 607 | qemu_put_8s(f, &s->sra); |
| 608 | 608 | qemu_put_8s(f, &s->srb); |
| 609 | + qemu_put_8s(f, &s->tdr); | |
| 609 | 610 | qemu_put_8s(f, &s->dsr); |
| 610 | 611 | qemu_put_8s(f, &s->msr); |
| 611 | 612 | qemu_put_8s(f, &s->status0); |
| 612 | 613 | qemu_put_8s(f, &s->status1); |
| 613 | 614 | qemu_put_8s(f, &s->status2); |
| 614 | 615 | qemu_put_8s(f, &s->cur_drv); |
| 615 | - qemu_put_8s(f, &s->bootsel); | |
| 616 | 616 | /* Command FIFO */ |
| 617 | 617 | qemu_put_buffer(f, s->fifo, FD_SECTOR_LEN); |
| 618 | 618 | qemu_put_be32s(f, &s->data_pos); |
| ... | ... | @@ -651,13 +651,13 @@ static int fdc_load (QEMUFile *f, void *opaque, int version_id) |
| 651 | 651 | /* Controller state */ |
| 652 | 652 | qemu_get_8s(f, &s->sra); |
| 653 | 653 | qemu_get_8s(f, &s->srb); |
| 654 | + qemu_get_8s(f, &s->tdr); | |
| 654 | 655 | qemu_get_8s(f, &s->dsr); |
| 655 | 656 | qemu_get_8s(f, &s->msr); |
| 656 | 657 | qemu_get_8s(f, &s->status0); |
| 657 | 658 | qemu_get_8s(f, &s->status1); |
| 658 | 659 | qemu_get_8s(f, &s->status2); |
| 659 | 660 | qemu_get_8s(f, &s->cur_drv); |
| 660 | - qemu_get_8s(f, &s->bootsel); | |
| 661 | 661 | /* Command FIFO */ |
| 662 | 662 | qemu_get_buffer(f, s->fifo, FD_SECTOR_LEN); |
| 663 | 663 | qemu_get_be32s(f, &s->data_pos); |
| ... | ... | @@ -762,12 +762,15 @@ static void fdctrl_reset (fdctrl_t *fdctrl, int do_irq) |
| 762 | 762 | |
| 763 | 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 | 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 | 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 | 851 | /* Tape drive register : 0x03 */ |
| 849 | 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 | 856 | FLOPPY_DPRINTF("tape drive register: 0x%02x\n", retval); |
| 857 | 857 | |
| 858 | 858 | return retval; |
| ... | ... | @@ -867,7 +867,7 @@ static void fdctrl_write_tape (fdctrl_t *fdctrl, uint32_t value) |
| 867 | 867 | } |
| 868 | 868 | FLOPPY_DPRINTF("tape drive register set to 0x%02x\n", value); |
| 869 | 869 | /* Disk boot selection indicator */ |
| 870 | - fdctrl->bootsel = (value & FD_TDR_BOOTSEL) >> 2; | |
| 870 | + fdctrl->tdr = value & FD_TDR_BOOTSEL; | |
| 871 | 871 | /* Tape indicators: never allow */ |
| 872 | 872 | } |
| 873 | 873 | ... | ... |