Commit 46d3233ba00f68e3d23a12d7428d8f53a66b12c9

Authored by blueswir1
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