Changeset 78040 in vbox
- Timestamp:
- Apr 8, 2019 12:18:05 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevFdc.cpp
r77043 r78040 65 65 /* #define DEBUG_FLOPPY */ 66 66 67 #ifndef VBOX 68 #ifdef DEBUG_FLOPPY 69 #define FLOPPY_DPRINTF(fmt, args...) \ 70 do { printf("FLOPPY: " fmt , ##args); } while (0) 71 #endif 72 #else /* !VBOX */ 73 # ifdef LOG_ENABLED 74 # define FLOPPY_DPRINTF(...) Log(("floppy: " __VA_ARGS__)) 75 # else 76 # define FLOPPY_DPRINTF(...) do { } while (0) 77 # endif 78 #endif /* !VBOX */ 79 80 #ifndef VBOX 81 #define FLOPPY_ERROR(fmt, args...) \ 82 do { printf("FLOPPY ERROR: %s: " fmt, __func__ , ##args); } while (0) 83 #else /* VBOX */ 84 # define FLOPPY_ERROR RTLogPrintf 85 #endif /* VBOX */ 86 87 #ifdef VBOX 67 #ifdef LOG_ENABLED 68 # define FLOPPY_DPRINTF(...) Log(("floppy: " __VA_ARGS__)) 69 #else 70 # define FLOPPY_DPRINTF(...) do { } while (0) 71 #endif 72 73 #define FLOPPY_ERROR RTLogPrintf 74 88 75 typedef struct fdctrl_t fdctrl_t; 89 #endif /* VBOX */90 76 91 77 /********************************************************/ … … 105 91 FDRIVE_DRV_288 = 0x01, /* 2.88 MB 3"5 drive */ 106 92 FDRIVE_DRV_120 = 0x02, /* 1.2 MB 5"25 drive */ 107 FDRIVE_DRV_NONE = 0x03 /* No drive connected */ 108 #ifdef VBOX 109 , FDRIVE_DRV_FAKE_15_6 = 0x0e /* Fake 15.6 MB drive. */ 110 , FDRIVE_DRV_FAKE_63_5 = 0x0f /* Fake 63.5 MB drive. */ 111 #endif 93 FDRIVE_DRV_NONE = 0x03, /* No drive connected */ 94 FDRIVE_DRV_FAKE_15_6 = 0x0e, /* Fake 15.6 MB drive. */ 95 FDRIVE_DRV_FAKE_63_5 = 0x0f /* Fake 63.5 MB drive. */ 112 96 } fdrive_type_t; 113 97 … … 130 114 */ 131 115 typedef struct fdrive_t { 132 #ifndef VBOX133 BlockDriverState *bs;134 #else /* VBOX */135 116 /** Pointer to the owning device instance. */ 136 117 R3PTRTYPE(PPDMDEVINS) pDevIns; … … 152 133 /** The LED for this LUN. */ 153 134 PDMLED Led; 154 #endif155 135 /* Drive status */ 156 136 fdrive_type_t drive; … … 176 156 { 177 157 /* Drive */ 178 #ifndef VBOX179 drv->drive = FDRIVE_DRV_NONE;180 #else /* VBOX */181 158 if (fInit) { 182 159 /* Fixate the drive type at init time if possible. */ … … 210 187 } /* else: The BIOS (and others) get the drive type via the CMOS, so 211 188 don't change it after the VM has been constructed. */ 212 #endif /* VBOX */213 189 drv->perpendicular = 0; 214 190 /* Disk */ … … 361 337 { FDRIVE_DRV_144, 8, 40, 1, FDRIVE_RATE_300K, "320 kB 3\"1/2", }, 362 338 { FDRIVE_DRV_144, 8, 40, 0, FDRIVE_RATE_300K, "160 kB 3\"1/2", }, 363 #ifdef VBOX/* For larger than real life floppy images (see DrvBlock.cpp). */339 /* For larger than real life floppy images (see DrvBlock.cpp). */ 364 340 /* 15.6 MB fake floppy disk (just need something big). */ 365 341 { FDRIVE_DRV_FAKE_15_6, 63, 255, 1, FDRIVE_RATE_1M, "15.6 MB fake 15.6", }, … … 407 383 { FDRIVE_DRV_FAKE_63_5, 14, 80, 1, FDRIVE_RATE_250K, "1.12 MB fake 63.5", }, 408 384 { FDRIVE_DRV_FAKE_63_5, 9, 80, 0, FDRIVE_RATE_250K, "360 kB fake 63.5", }, 409 #endif410 385 /* end */ 411 386 { FDRIVE_DRV_NONE, (uint8_t)-1, (uint8_t)-1, 0, (fdrive_rate_t)0, NULL, }, … … 421 396 422 397 FLOPPY_DPRINTF("revalidate\n"); 423 #ifndef VBOX424 if (drv->bs != NULL && bdrv_is_inserted(drv->bs)) {425 ro = bdrv_is_read_only(drv->bs);426 bdrv_get_geometry_hint(drv->bs, &nb_heads, &max_track, &last_sect);427 #else /* VBOX */428 398 if ( drv->pDrvMedia 429 399 && drv->pDrvMount … … 431 401 ro = drv->pDrvMedia->pfnIsReadOnly (drv->pDrvMedia); 432 402 nb_heads = max_track = last_sect = 0; 433 #endif /* VBOX */434 403 if (nb_heads != 0 && max_track != 0 && last_sect != 0) { 435 404 FLOPPY_DPRINTF("User defined disk (%d %d %d)", 436 405 nb_heads - 1, max_track, last_sect); 437 406 } else { 438 #ifndef VBOX 439 bdrv_get_geometry(drv->bs, &nb_sectors); 440 #else /* VBOX */ 441 { 442 uint64_t size2 = drv->pDrvMedia->pfnGetSize (drv->pDrvMedia); 443 nb_sectors = size2 / FD_SECTOR_LEN; 444 } 445 #endif /* VBOX */ 407 uint64_t size2 = drv->pDrvMedia->pfnGetSize (drv->pDrvMedia); 408 nb_sectors = size2 / FD_SECTOR_LEN; 446 409 match = -1; 447 410 first_match = -1; … … 473 436 last_sect = parse->last_sect; 474 437 drv->drive = parse->drive; 475 #ifdef VBOX476 438 drv->media_rate = parse->rate; 477 #endif478 439 FLOPPY_DPRINTF("%s floppy disk (%d h %d t %d s) %s\n", parse->str, 479 440 nb_heads, max_track, last_sect, ro ? "ro" : "rw"); … … 503 464 static void fdctrl_reset(fdctrl_t *fdctrl, int do_irq); 504 465 static void fdctrl_reset_fifo(fdctrl_t *fdctrl); 505 #ifndef VBOX506 static int fdctrl_transfer_handler (void *opaque, int nchan,507 int dma_pos, int dma_len);508 #else /* VBOX: */509 466 static DECLCALLBACK(uint32_t) fdctrl_transfer_handler (PPDMDEVINS pDevIns, 510 467 void *opaque, … … 512 469 uint32_t dma_pos, 513 470 uint32_t dma_len); 514 #endif /* VBOX */515 471 static void fdctrl_raise_irq(fdctrl_t *fdctrl, uint8_t status0); 516 472 static fdrive_t *get_cur_drv(fdctrl_t *fdctrl); … … 686 642 #define FD_FORMAT_CMD(state) ((state) & FD_STATE_FORMAT) 687 643 688 #ifdef VBOX689 644 /** 690 645 * Floppy controller state. … … 692 647 * @implements PDMILEDPORTS 693 648 */ 694 #endif695 649 struct fdctrl_t { 696 #ifndef VBOX697 fdctrl_t *fdctrl;698 #endif699 650 /* Controller's identification */ 700 651 uint8_t version; 701 652 /* HW */ 702 #ifndef VBOX703 int irq;704 int dma_chann;705 #else706 653 uint8_t irq_lvl; 707 654 uint8_t dma_chann; 708 #endif709 655 uint32_t io_base; 710 656 /* Controller state */ 711 #ifndef VBOX712 QEMUTimer *result_timer;713 #else714 657 struct TMTIMER *result_timer; 715 #endif716 658 uint8_t sra; 717 659 uint8_t srb; … … 745 687 fdrive_t drives[MAX_FD]; 746 688 uint8_t reset_sensei; 747 #ifdef VBOX748 689 /** Pointer to device instance. */ 749 690 PPDMDEVINS pDevIns; … … 755 696 /** Status LUN: The Partner of ILeds. */ 756 697 PPDMILEDCONNECTORS pLedsConnector; 757 #endif758 698 }; 759 699 … … 827 767 return; 828 768 FLOPPY_DPRINTF("Reset interrupt\n"); 829 #ifdef VBOX830 769 PDMDevHlpISASetIrq (fdctrl->pDevIns, fdctrl->irq_lvl, 0); 831 #else832 qemu_set_irq(fdctrl->irq, 0);833 #endif834 770 fdctrl->sra &= ~FD_SRA_INTPEND; 835 771 } … … 839 775 if (!(fdctrl->sra & FD_SRA_INTPEND)) { 840 776 FLOPPY_DPRINTF("Raising interrupt...\n"); 841 #ifdef VBOX842 777 PDMDevHlpISASetIrq (fdctrl->pDevIns, fdctrl->irq_lvl, 1); 843 #else844 qemu_set_irq(fdctrl->irq, 1);845 #endif846 778 fdctrl->sra |= FD_SRA_INTPEND; 847 779 } … … 870 802 fdctrl->sra = 0; 871 803 fdctrl->srb = 0xc0; 872 #ifdef VBOX873 804 if (!fdctrl->drives[1].pDrvMedia) 874 #else875 if (!fdctrl->drives[1].bs)876 #endif877 805 fdctrl->sra |= FD_SRA_nDRV2; 878 806 fdctrl->cur_drv = 0; … … 1083 1011 static int fdctrl_media_changed(fdrive_t *drv) 1084 1012 { 1085 #ifdef VBOX1086 1013 return drv->dsk_chg; 1087 #else1088 int ret;1089 1090 if (!drv->bs)1091 return 0;1092 ret = bdrv_media_changed(drv->bs);1093 if (ret) {1094 fd_revalidate(drv);1095 }1096 return ret;1097 #endif1098 1014 } 1099 1015 … … 1103 1019 uint32_t retval = 0; 1104 1020 1105 #ifdef VBOX1106 1021 /* The change line signal is reported by the currently selected 1107 1022 * drive. If the corresponding motor on bit is not set, the drive … … 1110 1025 if (fdctrl_media_changed(get_cur_drv(fdctrl)) 1111 1026 && (fdctrl->dor & (0x10 << fdctrl->cur_drv))) 1112 #else1113 if (fdctrl_media_changed(drv0(fdctrl))1114 || fdctrl_media_changed(drv1(fdctrl))1115 #if MAX_FD == 41116 || fdctrl_media_changed(drv2(fdctrl))1117 || fdctrl_media_changed(drv3(fdctrl))1118 #endif1119 )1120 #endif1121 1027 retval |= FD_DIR_DSKCHG; 1122 1028 if (retval != 0) … … 1211 1117 fdctrl->data_dir = FD_DIR_READ; 1212 1118 if (!(fdctrl->msr & FD_MSR_NONDMA)) { 1213 #ifdef VBOX1214 1119 PDMDevHlpDMASetDREQ (fdctrl->pDevIns, fdctrl->dma_chann, 0); 1215 #else1216 DMA_release_DREQ(fdctrl->dma_chann);1217 #endif1218 1120 } 1219 1121 fdctrl->msr |= FD_MSR_RQM | FD_MSR_DIO; … … 1280 1182 * the currently inserted medium, the operation has to fail. 1281 1183 */ 1282 #ifdef VBOX1283 1184 if ((fdctrl->dsr & FD_DSR_DRATEMASK) != cur_drv->media_rate) { 1284 1185 FLOPPY_DPRINTF("data rate mismatch (fdc=%d, media=%d)\n", … … 1290 1191 return; 1291 1192 } 1292 #endif1293 1193 /* Set the FIFO state */ 1294 1194 fdctrl->data_dir = direction; … … 1317 1217 int dma_mode; 1318 1218 /* DMA transfer are enabled. Check if DMA channel is well programmed */ 1319 #ifndef VBOX1320 dma_mode = DMA_get_channel_mode(fdctrl->dma_chann);1321 #else1322 1219 dma_mode = PDMDevHlpDMAGetChannelMode (fdctrl->pDevIns, fdctrl->dma_chann); 1323 #endif1324 1220 dma_mode = (dma_mode >> 2) & 3; 1325 1221 FLOPPY_DPRINTF("dma_mode=%d direction=%d (%d - %d)\n", … … 1336 1232 * recall us... 1337 1233 */ 1338 #ifndef VBOX1339 DMA_hold_DREQ(fdctrl->dma_chann);1340 DMA_schedule(fdctrl->dma_chann);1341 #else1342 1234 PDMDevHlpDMASetDREQ (fdctrl->pDevIns, fdctrl->dma_chann, 1); 1343 1235 PDMDevHlpDMASchedule (fdctrl->pDevIns); 1344 #endif1345 1236 return; 1346 1237 } else { … … 1433 1324 int dma_mode; 1434 1325 /* DMA transfer are enabled. Check if DMA channel is well programmed */ 1435 #ifndef VBOX1436 dma_mode = DMA_get_channel_mode(fdctrl->dma_chann);1437 #else1438 1326 dma_mode = PDMDevHlpDMAGetChannelMode (fdctrl->pDevIns, fdctrl->dma_chann); 1439 #endif1440 1327 dma_mode = (dma_mode >> 2) & 3; 1441 1328 FLOPPY_DPRINTF("dma_mode=%d direction=%d (%d - %d)\n", … … 1449 1336 * recall us... 1450 1337 */ 1451 #ifndef VBOX1452 DMA_hold_DREQ(fdctrl->dma_chann);1453 DMA_schedule(fdctrl->dma_chann);1454 #else1455 1338 PDMDevHlpDMASetDREQ (fdctrl->pDevIns, fdctrl->dma_chann, 1); 1456 1339 PDMDevHlpDMASchedule (fdctrl->pDevIns); 1457 #endif1458 1340 return; 1459 1341 } else { … … 1481 1363 } 1482 1364 1483 #ifdef VBOX1484 1365 /* Block driver read/write wrappers. */ 1485 1366 … … 1517 1398 } 1518 1399 1519 #endif1520 1521 1400 /* handlers for DMA transfers */ 1522 #ifdef VBOX1523 1401 static DECLCALLBACK(uint32_t) fdctrl_transfer_handler (PPDMDEVINS pDevIns, 1524 1402 void *opaque, … … 1526 1404 uint32_t dma_pos, 1527 1405 uint32_t dma_len) 1528 #else1529 static int fdctrl_transfer_handler (void *opaque, int nchan,1530 int dma_pos, int dma_len)1531 #endif1532 1406 { 1533 1407 RT_NOREF(pDevIns, dma_pos); 1534 1408 fdctrl_t *fdctrl; 1535 1409 fdrive_t *cur_drv; 1536 #ifdef VBOX1537 1410 int rc; 1538 1411 uint32_t len = 0; 1539 1412 uint32_t start_pos, rel_pos; 1540 #else1541 int len, start_pos, rel_pos;1542 #endif1543 1413 uint8_t status0 = 0x00, status1 = 0x00, status2 = 0x00; 1544 1414 … … 1554 1424 if (dma_len > fdctrl->data_len) 1555 1425 dma_len = fdctrl->data_len; 1556 #ifndef VBOX1557 if (cur_drv->bs == NULL)1558 #else /* !VBOX */1559 1426 if (cur_drv->pDrvMedia == NULL) 1560 #endif1561 1427 { 1562 1428 if (fdctrl->data_dir == FD_DIR_WRITE) … … 1568 1434 } 1569 1435 1570 #ifdef VBOX 1571 if (cur_drv->ro) 1436 if (cur_drv->ro) 1437 { 1438 if (fdctrl->data_dir == FD_DIR_WRITE || fdctrl->data_dir == FD_DIR_FORMAT) 1572 1439 { 1573 if (fdctrl->data_dir == FD_DIR_WRITE || fdctrl->data_dir == FD_DIR_FORMAT) 1574 { 1575 /* Handle readonly medium early, no need to do DMA, touch the 1576 * LED or attempt any writes. A real floppy doesn't attempt 1577 * to write to readonly media either. */ 1578 fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, FD_SR1_NW, 1579 0x00); 1580 Assert(len == 0); 1581 goto transfer_error; 1582 } 1440 /* Handle readonly medium early, no need to do DMA, touch the 1441 * LED or attempt any writes. A real floppy doesn't attempt 1442 * to write to readonly media either. */ 1443 fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, FD_SR1_NW, 1444 0x00); 1445 Assert(len == 0); 1446 goto transfer_error; 1583 1447 } 1584 #endif 1585 1448 } 1586 1449 1587 1450 rel_pos = fdctrl->data_pos % FD_SECTOR_LEN; … … 1599 1462 len < FD_SECTOR_LEN || rel_pos != 0)) { 1600 1463 /* READ & SCAN commands and realign to a sector for WRITE */ 1601 #ifdef VBOX1602 1464 rc = blk_read(cur_drv, fd_sector(cur_drv), fdctrl->fifo, 1); 1603 1465 if (RT_FAILURE(rc)) 1604 #else1605 if (bdrv_read(cur_drv->bs, fd_sector(cur_drv),1606 fdctrl->fifo, 1) < 0)1607 #endif1608 1466 { 1609 1467 FLOPPY_DPRINTF("Floppy: error getting sector %d\n", … … 1616 1474 case FD_DIR_READ: 1617 1475 /* READ commands */ 1618 #ifdef VBOX1619 1476 { 1620 1477 uint32_t read; … … 1625 1482 AssertMsgRC (rc2, ("DMAWriteMemory -> %Rrc\n", rc2)); 1626 1483 } 1627 #else1628 DMA_write_memory (nchan, fdctrl->fifo + rel_pos,1629 fdctrl->data_pos, len);1630 #endif1631 /* cpu_physical_memory_write(addr + fdctrl->data_pos, */1632 /* fdctrl->fifo + rel_pos, len); */1633 1484 break; 1634 1485 case FD_DIR_WRITE: 1635 1486 /* WRITE commands */ 1636 #ifdef VBOX1637 1487 { 1638 1488 uint32_t written; … … 1646 1496 rc = blk_write(cur_drv, fd_sector(cur_drv), fdctrl->fifo, 1); 1647 1497 if (RT_FAILURE(rc)) 1648 #else1649 DMA_read_memory (nchan, fdctrl->fifo + rel_pos,1650 fdctrl->data_pos, len);1651 if (bdrv_write(cur_drv->bs, fd_sector(cur_drv),1652 fdctrl->fifo, 1) < 0)1653 #endif1654 1498 { 1655 1499 FLOPPY_ERROR("writing sector %d\n", fd_sector(cur_drv)); … … 1658 1502 } 1659 1503 break; 1660 #ifdef VBOX1661 1504 case FD_DIR_FORMAT: 1662 1505 /* FORMAT command */ … … 1689 1532 } 1690 1533 break; 1691 #endif1692 1534 default: 1693 1535 /* SCAN commands */ … … 1695 1537 uint8_t tmpbuf[FD_SECTOR_LEN]; 1696 1538 int ret; 1697 #ifdef VBOX1698 1539 uint32_t read; 1699 1540 int rc2 = PDMDevHlpDMAReadMemory (fdctrl->pDevIns, nchan, tmpbuf, 1700 1541 fdctrl->data_pos, len, &read); 1701 1542 AssertMsg(RT_SUCCESS(rc2), ("DMAReadMemory -> %Rrc2\n", rc2)); NOREF(rc2); 1702 #else1703 DMA_read_memory (nchan, tmpbuf, fdctrl->data_pos, len);1704 #endif1705 1543 ret = memcmp(tmpbuf, fdctrl->fifo + rel_pos, len); 1706 1544 if (ret == 0) { … … 1747 1585 uint32_t retval = 0; 1748 1586 unsigned pos; 1749 #ifdef VBOX1750 1587 int rc; 1751 #endif1752 1588 1753 1589 cur_drv = get_cur_drv(fdctrl); … … 1766 1602 return 0; 1767 1603 } 1768 #ifdef VBOX1769 1604 rc = blk_read(cur_drv, fd_sector(cur_drv), fdctrl->fifo, 1); 1770 1605 if (RT_FAILURE(rc)) 1771 #else1772 if (bdrv_read(cur_drv->bs, fd_sector(cur_drv), fdctrl->fifo, 1) < 0)1773 #endif1774 1606 { 1775 1607 FLOPPY_DPRINTF("error getting sector %d\n", … … 1802 1634 fdrive_t *cur_drv; 1803 1635 uint8_t kh, kt, ks; 1804 #ifdef VBOX1805 1636 int ok = 0, rc; 1806 #endif1807 1637 1808 1638 SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); … … 1850 1680 } 1851 1681 memset(fdctrl->fifo, 0, FD_SECTOR_LEN); 1852 #ifdef VBOX1853 1682 if (cur_drv->pDrvMedia) { 1854 1683 rc = blk_write(cur_drv, fd_sector(cur_drv), fdctrl->fifo, 1); … … 1861 1690 } 1862 1691 if (ok) { 1863 #else1864 if (cur_drv->bs == NULL ||1865 bdrv_write(cur_drv->bs, fd_sector(cur_drv), fdctrl->fifo, 1) < 0) {1866 FLOPPY_ERROR("formatting sector %d\n", fd_sector(cur_drv));1867 fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK, 0x00, 0x00);1868 } else {1869 #endif1870 1692 if (cur_drv->sect == cur_drv->last_sect) { 1871 1693 fdctrl->data_state &= ~FD_STATE_FORMAT; … … 1996 1818 fdctrl->msr &= ~FD_MSR_RQM; 1997 1819 cur_drv->head = (fdctrl->fifo[1] >> 2) & 1; 1998 #ifdef VBOX1999 1820 TMTimerSetMillies(fdctrl->result_timer, 1000 / 50); 2000 #else2001 qemu_mod_timer(fdctrl->result_timer,2002 qemu_get_clock(vm_clock) + (get_ticks_per_sec() / 50));2003 #endif2004 1821 } 2005 1822 … … 2123 1940 cur_drv = get_cur_drv(fdctrl); 2124 1941 fdctrl_reset_fifo(fdctrl); 2125 #ifdef VBOX 1942 2126 1943 /* The seek command just sends step pulses to the drive and doesn't care if 2127 1944 * there's a medium inserted or if it's banging the head against the drive. … … 2132 1949 /* Raise Interrupt */ 2133 1950 fdctrl_raise_irq(fdctrl, FD_SR0_SEEK | GET_CUR_DRV(fdctrl)); 2134 #else2135 if (fdctrl->fifo[2] > cur_drv->max_track) {2136 fdctrl_raise_irq(fdctrl, FD_SR0_ABNTERM | FD_SR0_SEEK);2137 } else {2138 cur_drv->track = fdctrl->fifo[2];2139 /* Raise Interrupt */2140 fdctrl_raise_irq(fdctrl, FD_SR0_SEEK);2141 }2142 #endif2143 1951 } 2144 1952 … … 2306 2114 if (pos == FD_SECTOR_LEN - 1 || 2307 2115 fdctrl->data_pos == fdctrl->data_len) { 2308 #ifdef VBOX2309 2116 blk_write(cur_drv, fd_sector(cur_drv), fdctrl->fifo, 1); 2310 #else2311 bdrv_write(cur_drv->bs, fd_sector(cur_drv),2312 fdctrl->fifo, 1);2313 #endif2314 2117 } 2315 2118 /* Switch from transfer mode to status mode … … 2359 2162 } 2360 2163 /* READ_ID can't automatically succeed! */ 2361 #ifdef VBOX2362 2164 if (!cur_drv->max_track) { 2363 2165 FLOPPY_DPRINTF("read id when no disk in drive\n"); … … 2375 2177 } 2376 2178 else 2377 #endif2378 2179 fdctrl_stop_transfer(fdctrl, 0x00, 0x00, 0x00); 2379 2180 } 2380 2181 2381 2382 #ifdef VBOX2383 2182 2384 2183 /* -=-=-=-=-=-=-=-=- Timer Callback -=-=-=-=-=-=-=-=- */ … … 2977 2776 AssertMsgFailed(("Memory mapped floppy not support by now\n")); 2978 2777 return VERR_NOT_SUPPORTED; 2979 #if 02980 FLOPPY_ERROR("memory mapped floppy not supported by now !\n");2981 io_mem = cpu_register_io_memory(0, fdctrl_mem_read, fdctrl_mem_write);2982 cpu_register_physical_memory(base, 0x08, io_mem);2983 #endif2984 2778 } 2985 2779 else … … 3094 2888 }; 3095 2889 3096 #endif /* VBOX */3097 3098 2890 /* 3099 2891 * Local Variables:
Note:
See TracChangeset
for help on using the changeset viewer.