trunk/src/mess/drivers/abc1600.c
| r19476 | r19477 | |
| 2 | 2 | |
| 3 | 3 | Luxor ABC 1600 |
| 4 | 4 | |
| 5 | | Skeleton driver |
| 6 | | */ |
| 7 | | |
| 8 | | /* |
| 9 | | |
| 10 | 5 | How to create HDD image: |
| 11 | 6 | ------------------------ |
| 12 | | chdman -createblankhd necd5126a.chd 615 4 17 512 |
| 7 | chdman createhd -chs 615,4,17 -ss 512 -o necd5126a.chd |
| 13 | 8 | |
| 14 | 9 | How to format HDD: |
| 15 | 10 | ------------------ |
| r19476 | r19477 | |
| 42 | 37 | sega19 0 task 0 |
| 43 | 38 | sega 000 segd 00 pga 008 pgd 4058 virtual 02c730 (should be 004730) |
| 44 | 39 | |
| 45 | | - floppy |
| 46 | | - internal floppy is really drive 2, but wd17xx.c doesn't like having NULL drives |
| 47 | 40 | - short/long reset (RSTBUT) |
| 48 | 41 | - CIO |
| 49 | 42 | - optimize timers! |
| r19476 | r19477 | |
| 262 | 255 | switch (A10_A9_A8) |
| 263 | 256 | { |
| 264 | 257 | case FLP: |
| 265 | | data = wd17xx_r(m_fdc, program, A2_A1); |
| 258 | data = m_fdc->gen_r(A2_A1); |
| 266 | 259 | break; |
| 267 | 260 | |
| 268 | 261 | case CRT: |
| r19476 | r19477 | |
| 516 | 509 | switch (A10_A9_A8) |
| 517 | 510 | { |
| 518 | 511 | case FLP: |
| 519 | | wd17xx_w(m_fdc, program, A2_A1, data); |
| 512 | m_fdc->gen_w(A2_A1, data); |
| 520 | 513 | break; |
| 521 | 514 | |
| 522 | 515 | case CRT: |
| r19476 | r19477 | |
| 1116 | 1109 | if (m_sysfs) |
| 1117 | 1110 | { |
| 1118 | 1111 | // floppy |
| 1119 | | m_dma0->rdy_w(!wd17xx_drq_r(m_fdc)); |
| 1112 | m_dma0->rdy_w(!m_fdc->drq_r()); |
| 1120 | 1113 | } |
| 1121 | 1114 | else |
| 1122 | 1115 | { |
| r19476 | r19477 | |
| 1278 | 1271 | if (LOG) logerror("FW0 %02x\n", data); |
| 1279 | 1272 | |
| 1280 | 1273 | // drive select |
| 1281 | | if (BIT(data, 0)) wd17xx_set_drive(m_fdc, 0); |
| 1282 | | if (BIT(data, 1)) wd17xx_set_drive(m_fdc, 1); |
| 1283 | | if (BIT(data, 2)) wd17xx_set_drive(m_fdc, 2); |
| 1274 | floppy_image_device *floppy = NULL; |
| 1275 | |
| 1276 | if (BIT(data, 0)) floppy = m_floppy0->get_device(); |
| 1277 | if (BIT(data, 1)) floppy = m_floppy1->get_device(); |
| 1278 | if (BIT(data, 2)) floppy = m_floppy2->get_device(); |
| 1279 | |
| 1280 | m_fdc->set_floppy(floppy); |
| 1284 | 1281 | |
| 1285 | 1282 | // floppy motor |
| 1286 | | floppy_mon_w(m_floppy, !BIT(data, 3)); |
| 1283 | if (floppy) floppy->mon_w(!BIT(data, 3)); |
| 1287 | 1284 | } |
| 1288 | 1285 | |
| 1289 | 1286 | |
| r19476 | r19477 | |
| 1311 | 1308 | if (LOG) logerror("FW1 %02x\n", data); |
| 1312 | 1309 | |
| 1313 | 1310 | // FDC master reset |
| 1314 | | wd17xx_mr_w(m_fdc, BIT(data, 0)); |
| 1311 | if (!BIT(data, 0)) m_fdc->reset(); |
| 1315 | 1312 | |
| 1316 | 1313 | // density select |
| 1317 | | wd17xx_dden_w(m_fdc, BIT(data, 1)); |
| 1314 | m_fdc->dden_w(BIT(data, 1)); |
| 1318 | 1315 | } |
| 1319 | 1316 | |
| 1320 | 1317 | |
| r19476 | r19477 | |
| 1613 | 1610 | data |= !m_sysfs << 6; |
| 1614 | 1611 | |
| 1615 | 1612 | // floppy interrupt |
| 1616 | | data |= wd17xx_intrq_r(m_fdc) << 7; |
| 1613 | data |= m_fdc->intrq_r() << 7; |
| 1617 | 1614 | |
| 1618 | 1615 | return data; |
| 1619 | 1616 | } |
| r19476 | r19477 | |
| 1707 | 1704 | //------------------------------------------------- |
| 1708 | 1705 | // wd17xx_interface fdc_intf |
| 1709 | 1706 | //------------------------------------------------- |
| 1710 | | |
| 1707 | /* |
| 1711 | 1708 | static LEGACY_FLOPPY_OPTIONS_START( abc1600 ) |
| 1712 | 1709 | LEGACY_FLOPPY_OPTION(abc1600, "dsk", "Luxor ABC 1600", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 1713 | 1710 | HEADS([2]) |
| r19476 | r19477 | |
| 1716 | 1713 | SECTOR_LENGTH([256]) |
| 1717 | 1714 | FIRST_SECTOR_ID([1])) |
| 1718 | 1715 | LEGACY_FLOPPY_OPTIONS_END |
| 1716 | */ |
| 1719 | 1717 | |
| 1720 | | static const floppy_interface abc1600_floppy_interface = |
| 1718 | static SLOT_INTERFACE_START( abc1600_floppies ) |
| 1719 | SLOT_INTERFACE( "525qd", FLOPPY_525_QD ) |
| 1720 | SLOT_INTERFACE_END |
| 1721 | |
| 1722 | void abc1600_state::fdc_intrq_w(bool state) |
| 1721 | 1723 | { |
| 1722 | | DEVCB_NULL, |
| 1723 | | DEVCB_NULL, |
| 1724 | | DEVCB_NULL, |
| 1725 | | DEVCB_NULL, |
| 1726 | | DEVCB_NULL, |
| 1727 | | FLOPPY_STANDARD_5_25_DSQD, |
| 1728 | | LEGACY_FLOPPY_OPTIONS_NAME(abc1600), |
| 1729 | | "floppy_5_25", |
| 1730 | | NULL |
| 1731 | | }; |
| 1724 | m_cio->pb7_w(state); |
| 1725 | } |
| 1732 | 1726 | |
| 1733 | | WRITE_LINE_MEMBER( abc1600_state::drq_w ) |
| 1727 | void abc1600_state::fdc_drq_w(bool state) |
| 1734 | 1728 | { |
| 1735 | 1729 | update_drdy0(); |
| 1736 | 1730 | } |
| 1737 | 1731 | |
| 1738 | | static const wd17xx_interface fdc_intf = |
| 1739 | | { |
| 1740 | | DEVCB_NULL, |
| 1741 | | DEVCB_DEVICE_LINE_MEMBER(Z8536B1_TAG, z8536_device, pb7_w), |
| 1742 | | DEVCB_DRIVER_LINE_MEMBER(abc1600_state, drq_w), |
| 1743 | | { FLOPPY_0, NULL, NULL, NULL } // TODO should be { NULL, NULL, FLOPPY_2, NULL } |
| 1744 | | }; |
| 1745 | 1732 | |
| 1746 | | |
| 1747 | 1733 | //------------------------------------------------- |
| 1748 | 1734 | // ABC99_INTERFACE( abc99_intf ) |
| 1749 | 1735 | //------------------------------------------------- |
| r19476 | r19477 | |
| 1851 | 1837 | // interrupt callback |
| 1852 | 1838 | m_maincpu->set_irq_acknowledge_callback(abc1600_int_ack); |
| 1853 | 1839 | |
| 1840 | // floppy callbacks |
| 1841 | m_fdc->setup_intrq_cb(wd_fdc_t::line_cb(FUNC(abc1600_state::fdc_intrq_w), this)); |
| 1842 | m_fdc->setup_drq_cb(wd_fdc_t::line_cb(FUNC(abc1600_state::fdc_drq_w), this)); |
| 1843 | |
| 1854 | 1844 | // allocate memory |
| 1855 | 1845 | m_segment_ram.allocate(0x400); |
| 1856 | 1846 | m_page_ram.allocate(0x400); |
| r19476 | r19477 | |
| 1932 | 1922 | MCFG_Z8536_ADD(Z8536B1_TAG, XTAL_64MHz/16, cio_intf) |
| 1933 | 1923 | MCFG_NMC9306_ADD(NMC9306_TAG) |
| 1934 | 1924 | MCFG_E0516_ADD(E050_C16PC_TAG, XTAL_32_768kHz) |
| 1935 | | MCFG_FD1797_ADD(SAB1797_02P_TAG, fdc_intf) |
| 1936 | | MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, abc1600_floppy_interface) |
| 1925 | MCFG_FD1797x_ADD(SAB1797_02P_TAG, XTAL_64MHz/64) |
| 1926 | MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":0", abc1600_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) |
| 1927 | MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":1", abc1600_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) |
| 1928 | MCFG_FLOPPY_DRIVE_ADD(SAB1797_02P_TAG":2", abc1600_floppies, "525qd", NULL, floppy_image_device::default_floppy_formats) |
| 1937 | 1929 | MCFG_ABC99_ADD(abc99_intf) |
| 1938 | 1930 | |
| 1939 | 1931 | MCFG_ABC1600BUS_SLOT_ADD("bus0i", bus0i_intf, abc1600bus_cards, NULL, NULL) |
trunk/src/mess/includes/abc1600.h
| r19476 | r19477 | |
| 6 | 6 | |
| 7 | 7 | #include "emu.h" |
| 8 | 8 | #include "cpu/m68000/m68000.h" |
| 9 | | #include "formats/basicdsk.h" |
| 10 | | #include "imagedev/flopdrv.h" |
| 11 | 9 | #include "machine/ram.h" |
| 12 | 10 | #include "machine/8530scc.h" |
| 13 | 11 | #include "machine/abc99.h" |
| r19476 | r19477 | |
| 15 | 13 | #include "machine/e0516.h" |
| 16 | 14 | #include "machine/lux4105.h" |
| 17 | 15 | #include "machine/nmc9306.h" |
| 18 | | #include "machine/wd17xx.h" |
| 16 | #include "machine/wd_fdc.h" |
| 19 | 17 | #include "machine/z80dart.h" |
| 20 | 18 | #include "machine/z80dma.h" |
| 21 | 19 | #include "machine/z8536.h" |
| r19476 | r19477 | |
| 69 | 67 | m_nvram(*this, NMC9306_TAG), |
| 70 | 68 | m_crtc(*this, SY6845E_TAG), |
| 71 | 69 | m_ram(*this, RAM_TAG), |
| 72 | | m_floppy(*this, FLOPPY_0), |
| 70 | m_floppy0(*this, SAB1797_02P_TAG":0"), |
| 71 | m_floppy1(*this, SAB1797_02P_TAG":1"), |
| 72 | m_floppy2(*this, SAB1797_02P_TAG":2"), |
| 73 | 73 | m_bus0i(*this, BUS0I_TAG), |
| 74 | 74 | m_bus0x(*this, BUS0X_TAG), |
| 75 | 75 | m_bus1(*this, BUS1_TAG), |
| r19476 | r19477 | |
| 86 | 86 | required_device<z80dart_device> m_dart; |
| 87 | 87 | required_device<scc8530_t> m_scc; |
| 88 | 88 | required_device<z8536_device> m_cio; |
| 89 | | required_device<fd1797_device> m_fdc; |
| 89 | required_device<fd1797_t> m_fdc; |
| 90 | 90 | required_device<e0516_device> m_rtc; |
| 91 | 91 | required_device<nmc9306_device> m_nvram; |
| 92 | 92 | required_device<mc6845_device> m_crtc; |
| 93 | 93 | required_device<ram_device> m_ram; |
| 94 | | required_device<legacy_floppy_image_device> m_floppy; |
| 94 | required_device<floppy_connector> m_floppy0; |
| 95 | required_device<floppy_connector> m_floppy1; |
| 96 | required_device<floppy_connector> m_floppy2; |
| 95 | 97 | required_device<abc1600bus_slot_device> m_bus0i; |
| 96 | 98 | required_device<abc1600bus_slot_device> m_bus0x; |
| 97 | 99 | required_device<abc1600bus_slot_device> m_bus1; |
| r19476 | r19477 | |
| 120 | 122 | |
| 121 | 123 | DECLARE_WRITE8_MEMBER( dmamap_w ); |
| 122 | 124 | DECLARE_WRITE_LINE_MEMBER( dbrq_w ); |
| 123 | | DECLARE_WRITE_LINE_MEMBER( drq_w ); |
| 124 | 125 | DECLARE_READ8_MEMBER( dma0_mreq_r ); |
| 125 | 126 | DECLARE_WRITE8_MEMBER( dma0_mreq_w ); |
| 126 | 127 | DECLARE_READ8_MEMBER( dma0_iorq_r ); |
| r19476 | r19477 | |
| 149 | 150 | |
| 150 | 151 | DECLARE_WRITE_LINE_MEMBER( nmi_w ); |
| 151 | 152 | |
| 153 | void fdc_intrq_w(bool state); |
| 154 | void fdc_drq_w(bool state); |
| 155 | |
| 152 | 156 | int get_current_task(offs_t offset); |
| 153 | 157 | offs_t get_segment_address(offs_t offset); |
| 154 | 158 | offs_t get_page_address(offs_t offset, UINT8 segd); |