Commit cefec4f5dc137427a92d927cb1d3347980f28d07

Authored by blueswir1
1 parent 78ae820c

FDC fix 10/10 (Hervé Poussineau):

- Replaces access to cur_drv field by macros.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4290 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 25 additions and 19 deletions
hw/fdc.c
@@ -49,6 +49,9 @@ do { printf("FLOPPY ERROR: %s: " fmt, __func__ , ##args); } while (0) @@ -49,6 +49,9 @@ do { printf("FLOPPY ERROR: %s: " fmt, __func__ , ##args); } while (0)
49 /********************************************************/ 49 /********************************************************/
50 /* Floppy drive emulation */ 50 /* Floppy drive emulation */
51 51
  52 +#define GET_CUR_DRV(fdctrl) ((fdctrl)->cur_drv)
  53 +#define SET_CUR_DRV(fdctrl, drive) ((fdctrl)->cur_drv = (drive))
  54 +
52 /* Will always be a fixed parameter for us */ 55 /* Will always be a fixed parameter for us */
53 #define FD_SECTOR_LEN 512 56 #define FD_SECTOR_LEN 512
54 #define FD_SECTOR_SC 2 /* Sector size code */ 57 #define FD_SECTOR_SC 2 /* Sector size code */
@@ -612,17 +615,18 @@ static void fdc_save (QEMUFile *f, void *opaque) @@ -612,17 +615,18 @@ static void fdc_save (QEMUFile *f, void *opaque)
612 fdctrl_t *s = opaque; 615 fdctrl_t *s = opaque;
613 uint8_t tmp; 616 uint8_t tmp;
614 int i; 617 int i;
  618 + uint8_t dor = s->dor | GET_CUR_DRV(s);
615 619
616 /* Controller state */ 620 /* Controller state */
617 qemu_put_8s(f, &s->sra); 621 qemu_put_8s(f, &s->sra);
618 qemu_put_8s(f, &s->srb); 622 qemu_put_8s(f, &s->srb);
  623 + qemu_put_8s(f, &dor);
619 qemu_put_8s(f, &s->tdr); 624 qemu_put_8s(f, &s->tdr);
620 qemu_put_8s(f, &s->dsr); 625 qemu_put_8s(f, &s->dsr);
621 qemu_put_8s(f, &s->msr); 626 qemu_put_8s(f, &s->msr);
622 qemu_put_8s(f, &s->status0); 627 qemu_put_8s(f, &s->status0);
623 qemu_put_8s(f, &s->status1); 628 qemu_put_8s(f, &s->status1);
624 qemu_put_8s(f, &s->status2); 629 qemu_put_8s(f, &s->status2);
625 - qemu_put_8s(f, &s->cur_drv);  
626 /* Command FIFO */ 630 /* Command FIFO */
627 qemu_put_buffer(f, s->fifo, FD_SECTOR_LEN); 631 qemu_put_buffer(f, s->fifo, FD_SECTOR_LEN);
628 qemu_put_be32s(f, &s->data_pos); 632 qemu_put_be32s(f, &s->data_pos);
@@ -665,13 +669,15 @@ static int fdc_load (QEMUFile *f, void *opaque, int version_id) @@ -665,13 +669,15 @@ static int fdc_load (QEMUFile *f, void *opaque, int version_id)
665 /* Controller state */ 669 /* Controller state */
666 qemu_get_8s(f, &s->sra); 670 qemu_get_8s(f, &s->sra);
667 qemu_get_8s(f, &s->srb); 671 qemu_get_8s(f, &s->srb);
  672 + qemu_get_8s(f, &s->dor);
  673 + SET_CUR_DRV(s, s->dor & FD_DOR_SELMASK);
  674 + s->dor &= ~FD_DOR_SELMASK;
668 qemu_get_8s(f, &s->tdr); 675 qemu_get_8s(f, &s->tdr);
669 qemu_get_8s(f, &s->dsr); 676 qemu_get_8s(f, &s->dsr);
670 qemu_get_8s(f, &s->msr); 677 qemu_get_8s(f, &s->msr);
671 qemu_get_8s(f, &s->status0); 678 qemu_get_8s(f, &s->status0);
672 qemu_get_8s(f, &s->status1); 679 qemu_get_8s(f, &s->status1);
673 qemu_get_8s(f, &s->status2); 680 qemu_get_8s(f, &s->status2);
674 - qemu_get_8s(f, &s->cur_drv);  
675 /* Command FIFO */ 681 /* Command FIFO */
676 qemu_get_buffer(f, s->fifo, FD_SECTOR_LEN); 682 qemu_get_buffer(f, s->fifo, FD_SECTOR_LEN);
677 qemu_get_be32s(f, &s->data_pos); 683 qemu_get_be32s(f, &s->data_pos);
@@ -1053,8 +1059,8 @@ static void fdctrl_stop_transfer (fdctrl_t *fdctrl, uint8_t status0, @@ -1053,8 +1059,8 @@ static void fdctrl_stop_transfer (fdctrl_t *fdctrl, uint8_t status0,
1053 cur_drv = get_cur_drv(fdctrl); 1059 cur_drv = get_cur_drv(fdctrl);
1054 FLOPPY_DPRINTF("transfer status: %02x %02x %02x (%02x)\n", 1060 FLOPPY_DPRINTF("transfer status: %02x %02x %02x (%02x)\n",
1055 status0, status1, status2, 1061 status0, status1, status2,
1056 - status0 | (cur_drv->head << 2) | fdctrl->cur_drv);  
1057 - fdctrl->fifo[0] = status0 | (cur_drv->head << 2) | fdctrl->cur_drv; 1062 + status0 | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl));
  1063 + fdctrl->fifo[0] = status0 | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl);
1058 fdctrl->fifo[1] = status1; 1064 fdctrl->fifo[1] = status1;
1059 fdctrl->fifo[2] = status2; 1065 fdctrl->fifo[2] = status2;
1060 fdctrl->fifo[3] = cur_drv->track; 1066 fdctrl->fifo[3] = cur_drv->track;
@@ -1077,13 +1083,13 @@ static void fdctrl_start_transfer (fdctrl_t *fdctrl, int direction) @@ -1077,13 +1083,13 @@ static void fdctrl_start_transfer (fdctrl_t *fdctrl, int direction)
1077 uint8_t kh, kt, ks; 1083 uint8_t kh, kt, ks;
1078 int did_seek = 0; 1084 int did_seek = 0;
1079 1085
1080 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1086 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1081 cur_drv = get_cur_drv(fdctrl); 1087 cur_drv = get_cur_drv(fdctrl);
1082 kt = fdctrl->fifo[2]; 1088 kt = fdctrl->fifo[2];
1083 kh = fdctrl->fifo[3]; 1089 kh = fdctrl->fifo[3];
1084 ks = fdctrl->fifo[4]; 1090 ks = fdctrl->fifo[4];
1085 FLOPPY_DPRINTF("Start transfer at %d %d %02x %02x (%d)\n", 1091 FLOPPY_DPRINTF("Start transfer at %d %d %02x %02x (%d)\n",
1086 - fdctrl->cur_drv, kh, kt, ks, 1092 + GET_CUR_DRV(fdctrl), kh, kt, ks,
1087 _fd_sector(kh, kt, ks, cur_drv->last_sect)); 1093 _fd_sector(kh, kt, ks, cur_drv->last_sect));
1088 switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) { 1094 switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) {
1089 case 2: 1095 case 2:
@@ -1218,7 +1224,7 @@ static int fdctrl_transfer_handler (void *opaque, int nchan, @@ -1218,7 +1224,7 @@ static int fdctrl_transfer_handler (void *opaque, int nchan,
1218 len = FD_SECTOR_LEN - rel_pos; 1224 len = FD_SECTOR_LEN - rel_pos;
1219 FLOPPY_DPRINTF("copy %d bytes (%d %d %d) %d pos %d %02x " 1225 FLOPPY_DPRINTF("copy %d bytes (%d %d %d) %d pos %d %02x "
1220 "(%d-0x%08x 0x%08x)\n", len, dma_len, fdctrl->data_pos, 1226 "(%d-0x%08x 0x%08x)\n", len, dma_len, fdctrl->data_pos,
1221 - fdctrl->data_len, fdctrl->cur_drv, cur_drv->head, 1227 + fdctrl->data_len, GET_CUR_DRV(fdctrl), cur_drv->head,
1222 cur_drv->track, cur_drv->sect, fd_sector(cur_drv), 1228 cur_drv->track, cur_drv->sect, fd_sector(cur_drv),
1223 fd_sector(cur_drv) * FD_SECTOR_LEN); 1229 fd_sector(cur_drv) * FD_SECTOR_LEN);
1224 if (fdctrl->data_dir != FD_DIR_WRITE || 1230 if (fdctrl->data_dir != FD_DIR_WRITE ||
@@ -1347,13 +1353,13 @@ static void fdctrl_format_sector (fdctrl_t *fdctrl) @@ -1347,13 +1353,13 @@ static void fdctrl_format_sector (fdctrl_t *fdctrl)
1347 fdrive_t *cur_drv; 1353 fdrive_t *cur_drv;
1348 uint8_t kh, kt, ks; 1354 uint8_t kh, kt, ks;
1349 1355
1350 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1356 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1351 cur_drv = get_cur_drv(fdctrl); 1357 cur_drv = get_cur_drv(fdctrl);
1352 kt = fdctrl->fifo[6]; 1358 kt = fdctrl->fifo[6];
1353 kh = fdctrl->fifo[7]; 1359 kh = fdctrl->fifo[7];
1354 ks = fdctrl->fifo[8]; 1360 ks = fdctrl->fifo[8];
1355 FLOPPY_DPRINTF("format sector at %d %d %02x %02x (%d)\n", 1361 FLOPPY_DPRINTF("format sector at %d %d %02x %02x (%d)\n",
1356 - fdctrl->cur_drv, kh, kt, ks, 1362 + GET_CUR_DRV(fdctrl), kh, kt, ks,
1357 _fd_sector(kh, kt, ks, cur_drv->last_sect)); 1363 _fd_sector(kh, kt, ks, cur_drv->last_sect));
1358 switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) { 1364 switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) {
1359 case 2: 1365 case 2:
@@ -1516,7 +1522,7 @@ static void fdctrl_handle_format_track (fdctrl_t *fdctrl, int direction) @@ -1516,7 +1522,7 @@ static void fdctrl_handle_format_track (fdctrl_t *fdctrl, int direction)
1516 { 1522 {
1517 fdrive_t *cur_drv; 1523 fdrive_t *cur_drv;
1518 1524
1519 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1525 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1520 cur_drv = get_cur_drv(fdctrl); 1526 cur_drv = get_cur_drv(fdctrl);
1521 fdctrl->data_state |= FD_STATE_FORMAT; 1527 fdctrl->data_state |= FD_STATE_FORMAT;
1522 if (fdctrl->fifo[0] & 0x80) 1528 if (fdctrl->fifo[0] & 0x80)
@@ -1557,14 +1563,14 @@ static void fdctrl_handle_sense_drive_status (fdctrl_t *fdctrl, int direction) @@ -1557,14 +1563,14 @@ static void fdctrl_handle_sense_drive_status (fdctrl_t *fdctrl, int direction)
1557 { 1563 {
1558 fdrive_t *cur_drv; 1564 fdrive_t *cur_drv;
1559 1565
1560 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1566 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1561 cur_drv = get_cur_drv(fdctrl); 1567 cur_drv = get_cur_drv(fdctrl);
1562 cur_drv->head = (fdctrl->fifo[1] >> 2) & 1; 1568 cur_drv->head = (fdctrl->fifo[1] >> 2) & 1;
1563 /* 1 Byte status back */ 1569 /* 1 Byte status back */
1564 fdctrl->fifo[0] = (cur_drv->ro << 6) | 1570 fdctrl->fifo[0] = (cur_drv->ro << 6) |
1565 (cur_drv->track == 0 ? 0x10 : 0x00) | 1571 (cur_drv->track == 0 ? 0x10 : 0x00) |
1566 (cur_drv->head << 2) | 1572 (cur_drv->head << 2) |
1567 - fdctrl->cur_drv | 1573 + GET_CUR_DRV(fdctrl) |
1568 0x28; 1574 0x28;
1569 fdctrl_set_fifo(fdctrl, 1, 0); 1575 fdctrl_set_fifo(fdctrl, 1, 0);
1570 } 1576 }
@@ -1573,7 +1579,7 @@ static void fdctrl_handle_recalibrate (fdctrl_t *fdctrl, int direction) @@ -1573,7 +1579,7 @@ static void fdctrl_handle_recalibrate (fdctrl_t *fdctrl, int direction)
1573 { 1579 {
1574 fdrive_t *cur_drv; 1580 fdrive_t *cur_drv;
1575 1581
1576 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1582 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1577 cur_drv = get_cur_drv(fdctrl); 1583 cur_drv = get_cur_drv(fdctrl);
1578 fd_recalibrate(cur_drv); 1584 fd_recalibrate(cur_drv);
1579 fdctrl_reset_fifo(fdctrl); 1585 fdctrl_reset_fifo(fdctrl);
@@ -1587,13 +1593,13 @@ static void fdctrl_handle_sense_interrupt_status (fdctrl_t *fdctrl, int directio @@ -1587,13 +1593,13 @@ static void fdctrl_handle_sense_interrupt_status (fdctrl_t *fdctrl, int directio
1587 1593
1588 #if 0 1594 #if 0
1589 fdctrl->fifo[0] = 1595 fdctrl->fifo[0] =
1590 - fdctrl->status0 | (cur_drv->head << 2) | fdctrl->cur_drv; 1596 + fdctrl->status0 | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl);
1591 #else 1597 #else
1592 /* XXX: status0 handling is broken for read/write 1598 /* XXX: status0 handling is broken for read/write
1593 commands, so we do this hack. It should be suppressed 1599 commands, so we do this hack. It should be suppressed
1594 ASAP */ 1600 ASAP */
1595 fdctrl->fifo[0] = 1601 fdctrl->fifo[0] =
1596 - FD_SR0_SEEK | (cur_drv->head << 2) | fdctrl->cur_drv; 1602 + FD_SR0_SEEK | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl);
1597 #endif 1603 #endif
1598 fdctrl->fifo[1] = cur_drv->track; 1604 fdctrl->fifo[1] = cur_drv->track;
1599 fdctrl_set_fifo(fdctrl, 2, 0); 1605 fdctrl_set_fifo(fdctrl, 2, 0);
@@ -1605,7 +1611,7 @@ static void fdctrl_handle_seek (fdctrl_t *fdctrl, int direction) @@ -1605,7 +1611,7 @@ static void fdctrl_handle_seek (fdctrl_t *fdctrl, int direction)
1605 { 1611 {
1606 fdrive_t *cur_drv; 1612 fdrive_t *cur_drv;
1607 1613
1608 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1614 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1609 cur_drv = get_cur_drv(fdctrl); 1615 cur_drv = get_cur_drv(fdctrl);
1610 fdctrl_reset_fifo(fdctrl); 1616 fdctrl_reset_fifo(fdctrl);
1611 if (fdctrl->fifo[2] > cur_drv->max_track) { 1617 if (fdctrl->fifo[2] > cur_drv->max_track) {
@@ -1665,7 +1671,7 @@ static void fdctrl_handle_drive_specification_command (fdctrl_t *fdctrl, int dir @@ -1665,7 +1671,7 @@ static void fdctrl_handle_drive_specification_command (fdctrl_t *fdctrl, int dir
1665 } else if (fdctrl->data_len > 7) { 1671 } else if (fdctrl->data_len > 7) {
1666 /* ERROR */ 1672 /* ERROR */
1667 fdctrl->fifo[0] = 0x80 | 1673 fdctrl->fifo[0] = 0x80 |
1668 - (cur_drv->head << 2) | fdctrl->cur_drv; 1674 + (cur_drv->head << 2) | GET_CUR_DRV(fdctrl);
1669 fdctrl_set_fifo(fdctrl, 1, 1); 1675 fdctrl_set_fifo(fdctrl, 1, 1);
1670 } 1676 }
1671 } 1677 }
@@ -1674,7 +1680,7 @@ static void fdctrl_handle_relative_seek_out (fdctrl_t *fdctrl, int direction) @@ -1674,7 +1680,7 @@ static void fdctrl_handle_relative_seek_out (fdctrl_t *fdctrl, int direction)
1674 { 1680 {
1675 fdrive_t *cur_drv; 1681 fdrive_t *cur_drv;
1676 1682
1677 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1683 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1678 cur_drv = get_cur_drv(fdctrl); 1684 cur_drv = get_cur_drv(fdctrl);
1679 if (fdctrl->fifo[2] + cur_drv->track >= cur_drv->max_track) { 1685 if (fdctrl->fifo[2] + cur_drv->track >= cur_drv->max_track) {
1680 cur_drv->track = cur_drv->max_track - 1; 1686 cur_drv->track = cur_drv->max_track - 1;
@@ -1690,7 +1696,7 @@ static void fdctrl_handle_relative_seek_in (fdctrl_t *fdctrl, int direction) @@ -1690,7 +1696,7 @@ static void fdctrl_handle_relative_seek_in (fdctrl_t *fdctrl, int direction)
1690 { 1696 {
1691 fdrive_t *cur_drv; 1697 fdrive_t *cur_drv;
1692 1698
1693 - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; 1699 + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK);
1694 cur_drv = get_cur_drv(fdctrl); 1700 cur_drv = get_cur_drv(fdctrl);
1695 if (fdctrl->fifo[2] > cur_drv->track) { 1701 if (fdctrl->fifo[2] > cur_drv->track) {
1696 cur_drv->track = 0; 1702 cur_drv->track = 0;