trunk/src/mess/drivers/adam.c
| r18838 | r18839 | |
| 287 | 287 | |
| 288 | 288 | TODO: |
| 289 | 289 | |
| 290 | - floppy |
| 291 | - slot interface |
| 292 | - printer |
| 293 | - SPI |
| 294 | - sound (PSG RDY -> Z80 WAIT) |
| 295 | |
| 290 | 296 | http://drushel.cwru.edu/atm/atm.html |
| 291 | 297 | http://rich.dirocco.org/Coleco/adam/ADAM.htm |
| 292 | 298 | http://users.stargate.net/~drushel/pub/coleco/twwmca/index.html |
| 293 | 299 | |
| 294 | | - fc75 GET_STATUS |
| 295 | | - fbe7 MMR_MAC |
| 296 | | - febe MMR_TR_REC |
| 297 | | - ff0f MMR_TR_TCU |
| 298 | | |
| 299 | | ****************************************************************************/ |
| 300 | | |
| 301 | | /* |
| 302 | | |
| 303 | | TODO: |
| 304 | | |
| 305 | | - sound (PSG RDY -> Z80 WAIT) |
| 306 | | - floppy ROM dump |
| 307 | | - printer |
| 308 | | - SPI |
| 309 | | |
| 310 | 300 | */ |
| 311 | 301 | |
| 312 | | |
| 313 | | #include "emu.h" |
| 314 | | #include "cpu/z80/z80.h" |
| 315 | | #include "cpu/m6800/m6800.h" |
| 316 | | #include "formats/basicdsk.h" |
| 317 | | #include "formats/adam_cas.h" |
| 318 | | #include "imagedev/cartslot.h" |
| 319 | | #include "imagedev/cassette.h" |
| 320 | | #include "imagedev/flopdrv.h" |
| 321 | | #include "machine/coleco.h" |
| 322 | | #include "machine/ram.h" |
| 323 | | #include "machine/wd17xx.h" |
| 324 | | #include "sound/sn76496.h" |
| 325 | | #include "video/tms9928a.h" |
| 326 | 302 | #include "includes/adam.h" |
| 327 | 303 | |
| 328 | 304 | |
| r18838 | r18839 | |
| 1159 | 1135 | |
| 1160 | 1136 | bit description |
| 1161 | 1137 | |
| 1162 | | 0 some kind of optic sensor |
| 1138 | 0 disk in place |
| 1163 | 1139 | 1 |
| 1164 | 1140 | 2 FDC DRQ |
| 1165 | 1141 | 3 |
| r18838 | r18839 | |
| 1170 | 1146 | |
| 1171 | 1147 | */ |
| 1172 | 1148 | |
| 1173 | | UINT8 data = 0; |
| 1149 | UINT8 data = 0x01; |
| 1174 | 1150 | |
| 1175 | 1151 | // floppy data request |
| 1176 | 1152 | data |= wd17xx_drq_r(m_fdc) << 2; |
| r18838 | r18839 | |
| 1290 | 1266 | // TIMER_DEVICE_CALLBACK_MEMBER( paddle_tick ) |
| 1291 | 1267 | //------------------------------------------------- |
| 1292 | 1268 | |
| 1293 | | TIMER_DEVICE_CALLBACK_MEMBER(adam_state::paddle_tick) |
| 1269 | TIMER_DEVICE_CALLBACK_MEMBER( adam_state::paddle_tick ) |
| 1294 | 1270 | { |
| 1295 | 1271 | // TODO: improve irq behaviour (see drivers/coleco.c) |
| 1296 | 1272 | if (coleco_scan_paddles(machine(), &m_joy_status0, &m_joy_status1)) |
| r18838 | r18839 | |
| 1368 | 1344 | // AM_RANGE(0x5f, 0x5f) Optional Modem Control Status |
| 1369 | 1345 | AM_RANGE(0x60, 0x60) AM_MIRROR(0x1f) AM_READWRITE(mioc_r, mioc_w) |
| 1370 | 1346 | AM_RANGE(0x80, 0x80) AM_MIRROR(0x1f) AM_WRITE(paddle_w) |
| 1371 | | AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x1e) AM_DEVREADWRITE("tms9928a", tms9928a_device, vram_read, vram_write) |
| 1372 | | AM_RANGE(0xa1, 0xa1) AM_MIRROR(0x1e) AM_DEVREADWRITE("tms9928a", tms9928a_device, register_read, register_write) |
| 1347 | AM_RANGE(0xa0, 0xa0) AM_MIRROR(0x1e) AM_DEVREADWRITE(TMS9928A_TAG, tms9928a_device, vram_read, vram_write) |
| 1348 | AM_RANGE(0xa1, 0xa1) AM_MIRROR(0x1e) AM_DEVREADWRITE(TMS9928A_TAG, tms9928a_device, register_read, register_write) |
| 1373 | 1349 | AM_RANGE(0xc0, 0xc0) AM_MIRROR(0x1f) AM_WRITE(joystick_w) |
| 1374 | 1350 | AM_RANGE(0xe0, 0xe0) AM_MIRROR(0x1f) AM_DEVWRITE(SN76489A_TAG, sn76489a_device, write) |
| 1375 | 1351 | AM_RANGE(0xe0, 0xe0) AM_MIRROR(0x1d) AM_READ(input1_r) |
| r18838 | r18839 | |
| 1632 | 1608 | // TMS9928a_interface tms9928a_interface |
| 1633 | 1609 | //------------------------------------------------- |
| 1634 | 1610 | |
| 1635 | | WRITE_LINE_MEMBER(adam_state::adam_vdp_interrupt) |
| 1611 | WRITE_LINE_MEMBER( adam_state::adam_vdp_interrupt ) |
| 1636 | 1612 | { |
| 1637 | 1613 | if (state && !m_vdp_nmi) |
| 1638 | 1614 | { |
| 1639 | | machine().device(Z80_TAG)->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 1615 | m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 1640 | 1616 | } |
| 1641 | 1617 | |
| 1642 | 1618 | m_vdp_nmi = state; |
| 1643 | 1619 | } |
| 1644 | 1620 | |
| 1645 | | static TMS9928A_INTERFACE(adam_tms9928a_interface) |
| 1621 | static TMS9928A_INTERFACE(vcd_intf) |
| 1646 | 1622 | { |
| 1647 | | "screen", |
| 1623 | SCREEN_TAG, |
| 1648 | 1624 | 0x4000, |
| 1649 | | DEVCB_DRIVER_LINE_MEMBER(adam_state,adam_vdp_interrupt) |
| 1625 | DEVCB_DRIVER_LINE_MEMBER(adam_state, adam_vdp_interrupt) |
| 1650 | 1626 | }; |
| 1651 | 1627 | |
| 1652 | 1628 | //------------------------------------------------- |
| r18838 | r18839 | |
| 1723 | 1699 | { |
| 1724 | 1700 | if (state && !m_dma) |
| 1725 | 1701 | { |
| 1726 | | UINT8 *ram = m_ram->pointer(); |
| 1727 | | |
| 1728 | 1702 | if (!m_bwr) |
| 1729 | 1703 | { |
| 1730 | 1704 | //logerror("Master 6801 write to %04x data %02x\n", m_ba, m_data_in); |
| 1731 | 1705 | |
| 1732 | | ram[m_ba] = m_data_in; |
| 1706 | m_ram->pointer()[m_ba] = m_data_in; |
| 1733 | 1707 | } |
| 1734 | 1708 | else |
| 1735 | 1709 | { |
| 1736 | | m_data_out = ram[m_ba]; |
| 1710 | m_data_out = m_ram->pointer()[m_ba]; |
| 1737 | 1711 | |
| 1738 | 1712 | //logerror("Master 6801 read from %04x data %02x\n", m_ba, m_data_out); |
| 1739 | 1713 | |
| r18838 | r18839 | |
| 1760 | 1734 | |
| 1761 | 1735 | void adam_state::machine_start() |
| 1762 | 1736 | { |
| 1763 | | // register for state saving |
| 1737 | // state saving |
| 1764 | 1738 | save_item(NAME(m_mioc)); |
| 1765 | 1739 | save_item(NAME(m_game)); |
| 1766 | 1740 | save_item(NAME(m_adamnet)); |
| r18838 | r18839 | |
| 1830 | 1804 | MCFG_CPU_IO_MAP(master6801_io) |
| 1831 | 1805 | MCFG_CPU_CONFIG(master6801_intf) |
| 1832 | 1806 | |
| 1807 | // keyboard |
| 1833 | 1808 | MCFG_CPU_ADD(M6801_KB_TAG, M6801, XTAL_4MHz) |
| 1834 | 1809 | MCFG_CPU_PROGRAM_MAP(kb6801_mem) |
| 1835 | 1810 | MCFG_CPU_IO_MAP(kb6801_io) |
| 1836 | 1811 | |
| 1812 | // digital data pack |
| 1837 | 1813 | MCFG_CPU_ADD(M6801_DDP_TAG, M6801, XTAL_4MHz) |
| 1838 | 1814 | MCFG_CPU_PROGRAM_MAP(ddp6801_mem) |
| 1839 | 1815 | MCFG_CPU_IO_MAP(ddp6801_io) |
| 1816 | MCFG_CASSETTE_ADD(CASSETTE_TAG, adam_cassette_interface) |
| 1817 | MCFG_CASSETTE_ADD(CASSETTE2_TAG, adam_cassette_interface) |
| 1840 | 1818 | |
| 1819 | // printer |
| 1841 | 1820 | MCFG_CPU_ADD(M6801_PRN_TAG, M6801, XTAL_4MHz) |
| 1842 | 1821 | MCFG_CPU_PROGRAM_MAP(printer6801_mem) |
| 1843 | 1822 | MCFG_CPU_IO_MAP(printer6801_io) |
| 1844 | 1823 | MCFG_DEVICE_DISABLE() |
| 1845 | 1824 | |
| 1825 | // floppy |
| 1846 | 1826 | MCFG_CPU_ADD(M6801_FDC_TAG, M6801, XTAL_4MHz) |
| 1847 | 1827 | MCFG_CPU_PROGRAM_MAP(fdc6801_mem) |
| 1848 | 1828 | MCFG_CPU_IO_MAP(fdc6801_io) |
| 1849 | | MCFG_DEVICE_DISABLE() |
| 1829 | MCFG_WD2793_ADD(WD2793_TAG, fdc_intf) |
| 1830 | MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, adam_floppy_interface) |
| 1850 | 1831 | |
| 1832 | // serial port interface |
| 1851 | 1833 | MCFG_CPU_ADD(M6801_SPI_TAG, M6801, XTAL_4MHz) |
| 1852 | 1834 | MCFG_DEVICE_DISABLE() |
| 1853 | 1835 | |
| 1854 | 1836 | // video hardware |
| 1855 | | MCFG_TMS9928A_ADD( "tms9928a", TMS9928A, adam_tms9928a_interface ) |
| 1856 | | MCFG_TMS9928A_SCREEN_ADD_NTSC( "screen" ) |
| 1857 | | MCFG_SCREEN_UPDATE_DEVICE( "tms9928a", tms9928a_device, screen_update ) |
| 1837 | MCFG_TMS9928A_ADD(TMS9928A_TAG, TMS9928A, vcd_intf) |
| 1838 | MCFG_TMS9928A_SCREEN_ADD_NTSC(SCREEN_TAG) |
| 1839 | MCFG_SCREEN_UPDATE_DEVICE(TMS9928A_TAG, tms9928a_device, screen_update) |
| 1858 | 1840 | |
| 1859 | 1841 | // sound hardware |
| 1860 | 1842 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| r18838 | r18839 | |
| 1864 | 1846 | |
| 1865 | 1847 | // devices |
| 1866 | 1848 | MCFG_TIMER_DRIVER_ADD_PERIODIC("paddles", adam_state, paddle_tick, attotime::from_msec(20)) |
| 1867 | | MCFG_WD2793_ADD(WD2793_TAG, fdc_intf) |
| 1868 | | MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, adam_floppy_interface) |
| 1869 | | MCFG_CASSETTE_ADD(CASSETTE_TAG, adam_cassette_interface) |
| 1870 | | MCFG_CASSETTE_ADD(CASSETTE2_TAG, adam_cassette_interface) |
| 1871 | 1849 | |
| 1872 | 1850 | // cartridge |
| 1873 | 1851 | MCFG_CARTSLOT_ADD("cart") |
| 1874 | 1852 | MCFG_CARTSLOT_EXTENSION_LIST("rom,col,bin") |
| 1875 | 1853 | MCFG_CARTSLOT_NOT_MANDATORY |
| 1876 | | MCFG_CARTSLOT_INTERFACE("coleco_cart") |
| 1854 | MCFG_CARTSLOT_INTERFACE("coleco_cart") |
| 1877 | 1855 | |
| 1878 | 1856 | // ROM expansion |
| 1879 | 1857 | MCFG_CARTSLOT_ADD("xrom") |
| 1880 | 1858 | MCFG_CARTSLOT_EXTENSION_LIST("rom,bin") |
| 1881 | 1859 | MCFG_CARTSLOT_NOT_MANDATORY |
| 1860 | MCFG_CARTSLOT_INTERFACE("adam_xrom") |
| 1882 | 1861 | |
| 1883 | 1862 | // internal ram |
| 1884 | 1863 | MCFG_RAM_ADD(RAM_TAG) |
| r18838 | r18839 | |
| 1888 | 1867 | // software lists |
| 1889 | 1868 | MCFG_SOFTWARE_LIST_ADD("colec_cart_list", "coleco") |
| 1890 | 1869 | MCFG_SOFTWARE_LIST_ADD("adam_cart_list", "adam_cart") |
| 1870 | //MCFG_SOFTWARE_LIST_ADD("xrom_list", "adam_xrom") |
| 1891 | 1871 | MCFG_SOFTWARE_LIST_ADD("cass_list", "adam_cass") |
| 1892 | 1872 | MCFG_SOFTWARE_LIST_ADD("flop_list", "adam_flop") |
| 1893 | 1873 | MACHINE_CONFIG_END |
| r18838 | r18839 | |
| 1933 | 1913 | ROM_LOAD( "printer.u2", 0x000, 0x800, CRC(e8db783b) SHA1(32b40679749ad0317c2c9ee9ca619fad6d850ce7) ) |
| 1934 | 1914 | |
| 1935 | 1915 | ROM_REGION( 0x1000, M6801_FDC_TAG, 0 ) |
| 1936 | | ROM_LOAD( "floppy disk drive", 0x0000, 0x1000, NO_DUMP ) |
| 1916 | ROM_LOAD( "320ta.u10", 0x0000, 0x1000, CRC(dcd865b3) SHA1(dde583e0d18ce4406e9ea44ab34d083e73ee30e2) ) // 320KB DSDD |
| 1917 | ROM_LOAD( "pmhdfdc.u10", 0x0000, 0x1000, CRC(fed4006c) SHA1(bc8dd00dd5cde9500a4cd7dc1e4d74330184472a) ) // PowerMate High-Density |
| 1918 | ROM_LOAD( "ad31_reva.u10", 0x0000, 0x1000, CRC(4b0b7143) SHA1(1cb68891c3af80e99efad7e309136ca37244f060) ) // Coleco original 160KB SSDD |
| 1937 | 1919 | |
| 1938 | 1920 | ROM_REGION( 0x800, M6801_SPI_TAG, 0 ) |
| 1939 | 1921 | ROM_LOAD( "spi.bin", 0x000, 0x800, CRC(4ba30352) SHA1(99fe5aebd505a208bea6beec5d7322b15426e9c1) ) |
| r18838 | r18839 | |
| 1945 | 1927 | // SYSTEM DRIVERS |
| 1946 | 1928 | //************************************************************************** |
| 1947 | 1929 | |
| 1948 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 1949 | | COMP( 1982, adam, 0, coleco, adam, adam, driver_device, 0, "Coleco", "Adam", GAME_NOT_WORKING ) |
| 1930 | // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS |
| 1931 | COMP( 1982, adam, 0, coleco, adam, adam, driver_device, 0, "Coleco", "Adam", GAME_NOT_WORKING ) |