trunk/src/mame/drivers/metro.c
| r29371 | r29372 | |
| 1699 | 1699 | Puzzlet |
| 1700 | 1700 | ***************************************************************************/ |
| 1701 | 1701 | |
| 1702 | #define MCFG_PUZZLET_IO_ADD(_tag) \ |
| 1703 | MCFG_DEVICE_ADD(_tag, PUZZLET_IO, 0) |
| 1704 | |
| 1705 | #define MCFG_PUZZLET_IO_DATA_CALLBACK(_devcb) \ |
| 1706 | devcb = &puzzlet_io_device::set_data_cb(*device, DEVCB2_##_devcb); |
| 1707 | |
| 1708 | class puzzlet_io_device : public device_t { |
| 1709 | public: |
| 1710 | puzzlet_io_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 1711 | |
| 1712 | DECLARE_WRITE_LINE_MEMBER( ce_w ); |
| 1713 | DECLARE_WRITE_LINE_MEMBER( clk_w ); |
| 1714 | |
| 1715 | template<class _Object> static devcb2_base &set_data_cb(device_t &device, _Object object) { return downcast<puzzlet_io_device &>(device).data_cb.set_callback(object); } |
| 1716 | |
| 1717 | protected: |
| 1718 | virtual void device_start(); |
| 1719 | virtual void device_reset(); |
| 1720 | |
| 1721 | private: |
| 1722 | devcb2_write_line data_cb; |
| 1723 | required_ioport port; |
| 1724 | int ce, clk; |
| 1725 | int cur_bit; |
| 1726 | UINT8 value; |
| 1727 | }; |
| 1728 | |
| 1729 | const device_type PUZZLET_IO = &device_creator<puzzlet_io_device>; |
| 1730 | |
| 1731 | |
| 1732 | puzzlet_io_device::puzzlet_io_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 1733 | : device_t(mconfig, PUZZLET_IO, "Puzzlet Coin/Start I/O", tag, owner, clock, "puzzlet_io", __FILE__), |
| 1734 | data_cb(*this), |
| 1735 | port(*this, ":IN0") |
| 1736 | { |
| 1737 | } |
| 1738 | |
| 1739 | void puzzlet_io_device::device_start() |
| 1740 | { |
| 1741 | data_cb.resolve_safe(); |
| 1742 | save_item(NAME(ce)); |
| 1743 | save_item(NAME(clk)); |
| 1744 | save_item(NAME(cur_bit)); |
| 1745 | save_item(NAME(value)); |
| 1746 | ce = 1; |
| 1747 | clk = 1; |
| 1748 | } |
| 1749 | |
| 1750 | void puzzlet_io_device::device_reset() |
| 1751 | { |
| 1752 | cur_bit = 0; |
| 1753 | value = 0xff; |
| 1754 | } |
| 1755 | |
| 1756 | WRITE_LINE_MEMBER(puzzlet_io_device::ce_w) |
| 1757 | { |
| 1758 | if(ce && !state) { |
| 1759 | value = port->read(); |
| 1760 | cur_bit = 0; |
| 1761 | } else if(!ce && state) |
| 1762 | data_cb(1); |
| 1763 | |
| 1764 | ce = state; |
| 1765 | } |
| 1766 | |
| 1767 | WRITE_LINE_MEMBER(puzzlet_io_device::clk_w) |
| 1768 | { |
| 1769 | if(clk && !state) { |
| 1770 | if(cur_bit == 8) |
| 1771 | data_cb(1); |
| 1772 | else { |
| 1773 | data_cb((value >> cur_bit) & 1); |
| 1774 | cur_bit++; |
| 1775 | } |
| 1776 | } |
| 1777 | clk = state; |
| 1778 | } |
| 1779 | |
| 1780 | |
| 1702 | 1781 | WRITE16_MEMBER(metro_state::puzzlet_irq_enable_w) |
| 1703 | 1782 | { |
| 1704 | 1783 | if (ACCESSING_BITS_0_7) |
| r29371 | r29372 | |
| 4530 | 4609 | MCFG_MACHINE_START_OVERRIDE(metro_state,metro) |
| 4531 | 4610 | MCFG_MACHINE_RESET_OVERRIDE(metro_state,metro) |
| 4532 | 4611 | |
| 4612 | /* Coins/service */ |
| 4613 | MCFG_PUZZLET_IO_ADD("coins") |
| 4614 | MCFG_PUZZLET_IO_DATA_CALLBACK(DEVWRITELINE("maincpu:sci1", h8_sci_device, rx_w)) |
| 4615 | MCFG_DEVICE_MODIFY("maincpu:sci1") |
| 4616 | MCFG_H8_SCI_TX_CALLBACK(DEVWRITELINE(":coins", puzzlet_io_device, ce_w)) |
| 4617 | MCFG_H8_SCI_CLK_CALLBACK(DEVWRITELINE(":coins", puzzlet_io_device, clk_w)) |
| 4618 | |
| 4533 | 4619 | /* video hardware */ |
| 4534 | 4620 | MCFG_SCREEN_ADD("screen", RASTER) |
| 4535 | 4621 | MCFG_SCREEN_REFRESH_RATE(58) |