trunk/src/mess/drivers/bbc.c
| r29601 | r29602 | |
| 764 | 764 | MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w)) |
| 765 | 765 | |
| 766 | 766 | /* adc */ |
| 767 | | MCFG_UPD7002_ADD("upd7002", bbc_uPD7002) |
| 767 | MCFG_DEVICE_ADD("upd7002", UPD7002, 0) |
| 768 | MCFG_UPD7002_GET_ANALOGUE_CB(bbc_state, BBC_get_analogue_input) |
| 769 | MCFG_UPD7002_EOC_CB(bbc_state, BBC_uPD7002_EOC) |
| 768 | 770 | |
| 769 | 771 | /* printer */ |
| 770 | 772 | MCFG_CENTRONICS_ADD("centronics", centronics_printers, "image") |
| r29601 | r29602 | |
| 821 | 823 | MCFG_VIA6522_IRQ_HANDLER(WRITELINE(bbc_state, bbcb_via_user_irq_w)) |
| 822 | 824 | |
| 823 | 825 | /* adc */ |
| 824 | | MCFG_UPD7002_ADD("upd7002", bbc_uPD7002) |
| 826 | MCFG_DEVICE_ADD("upd7002", UPD7002, 0) |
| 827 | MCFG_UPD7002_GET_ANALOGUE_CB(bbc_state, BBC_get_analogue_input) |
| 828 | MCFG_UPD7002_EOC_CB(bbc_state, BBC_uPD7002_EOC) |
| 825 | 829 | |
| 826 | 830 | /* printer */ |
| 827 | 831 | MCFG_CENTRONICS_ADD("centronics", centronics_printers, "image") |
| r29601 | r29602 | |
| 965 | 969 | MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(bbc_state, write_acia_clock)) |
| 966 | 970 | |
| 967 | 971 | /* adc */ |
| 968 | | MCFG_UPD7002_ADD("upd7002", bbc_uPD7002) |
| 972 | MCFG_DEVICE_ADD("upd7002", UPD7002, 0) |
| 973 | MCFG_UPD7002_GET_ANALOGUE_CB(bbc_state, BBC_get_analogue_input) |
| 974 | MCFG_UPD7002_EOC_CB(bbc_state, BBC_uPD7002_EOC) |
| 969 | 975 | |
| 970 | 976 | /* system via */ |
| 971 | 977 | MCFG_DEVICE_ADD("via6522_0", VIA6522, 1000000) |
trunk/src/mess/machine/bbc.c
| r29601 | r29602 | |
| 1153 | 1153 | BBC Joystick Support |
| 1154 | 1154 | **************************************/ |
| 1155 | 1155 | |
| 1156 | | static UPD7002_GET_ANALOGUE(BBC_get_analogue_input) |
| 1156 | UPD7002_GET_ANALOGUE(bbc_state::BBC_get_analogue_input) |
| 1157 | 1157 | { |
| 1158 | | switch(channel_number) |
| 1158 | switch (channel_number) |
| 1159 | 1159 | { |
| 1160 | 1160 | case 0: |
| 1161 | | return ((0xff-device->machine().root_device().ioport("JOY0")->read())<<8); |
| 1161 | return ((0xff - m_joy0->read()) << 8); |
| 1162 | 1162 | case 1: |
| 1163 | | return ((0xff-device->machine().root_device().ioport("JOY1")->read())<<8); |
| 1163 | return ((0xff - m_joy1->read()) << 8); |
| 1164 | 1164 | case 2: |
| 1165 | | return ((0xff-device->machine().root_device().ioport("JOY2")->read())<<8); |
| 1165 | return ((0xff - m_joy2->read()) << 8); |
| 1166 | 1166 | case 3: |
| 1167 | | return ((0xff-device->machine().root_device().ioport("JOY3")->read())<<8); |
| 1167 | return ((0xff - m_joy3->read()) << 8); |
| 1168 | 1168 | } |
| 1169 | 1169 | |
| 1170 | 1170 | return 0; |
| 1171 | 1171 | } |
| 1172 | 1172 | |
| 1173 | | static UPD7002_EOC(BBC_uPD7002_EOC) |
| 1173 | UPD7002_EOC(bbc_state::BBC_uPD7002_EOC) |
| 1174 | 1174 | { |
| 1175 | | via6522_device *via_0 = device->machine().device<via6522_device>("via6522_0"); |
| 1176 | | via_0->write_cb1(data); |
| 1175 | m_via6522_0->write_cb1(data); |
| 1177 | 1176 | } |
| 1178 | 1177 | |
| 1179 | | const upd7002_interface bbc_uPD7002 = |
| 1180 | | { |
| 1181 | | BBC_get_analogue_input, |
| 1182 | | BBC_uPD7002_EOC |
| 1183 | | }; |
| 1184 | | |
| 1185 | | |
| 1186 | 1178 | /*************************************** |
| 1187 | 1179 | BBC 2C199 Serial Interface Cassette |
| 1188 | 1180 | ****************************************/ |
trunk/src/mess/includes/bbc.h
| r29601 | r29602 | |
| 48 | 48 | m_via6522_1(*this, "via6522_1"), |
| 49 | 49 | m_upd7002(*this, "upd7002"), |
| 50 | 50 | m_i8271(*this, "i8271"), |
| 51 | m_joy0(*this, "JOY0"), |
| 52 | m_joy1(*this, "JOY1"), |
| 53 | m_joy2(*this, "JOY2"), |
| 54 | m_joy3(*this, "JOY3"), |
| 51 | 55 | m_region_maincpu(*this, "maincpu"), |
| 52 | 56 | m_region_user1(*this, "user1"), |
| 53 | 57 | m_region_user2(*this, "user2"), |
| r29601 | r29602 | |
| 152 | 156 | DECLARE_WRITE_LINE_MEMBER(write_dcd_serial); |
| 153 | 157 | DECLARE_WRITE_LINE_MEMBER(write_cts_serial); |
| 154 | 158 | DECLARE_INPUT_CHANGED_MEMBER( trigger_reset ); |
| 155 | | |
| 156 | 159 | DECLARE_WRITE_LINE_MEMBER(bbc_i8271_interrupt); |
| 157 | 160 | |
| 161 | UPD7002_GET_ANALOGUE(BBC_get_analogue_input); |
| 162 | UPD7002_EOC(BBC_uPD7002_EOC); |
| 163 | |
| 158 | 164 | int exp_rom_load(device_image_interface &image, int index); |
| 159 | 165 | DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbc_exp_rom ); |
| 160 | 166 | DECLARE_DEVICE_IMAGE_LOAD_MEMBER( bbcm_cart ); |
| r29601 | r29602 | |
| 176 | 182 | optional_device<via6522_device> m_via6522_1; |
| 177 | 183 | optional_device<upd7002_device> m_upd7002; |
| 178 | 184 | optional_device<i8271_device> m_i8271; |
| 185 | required_ioport m_joy0, m_joy1, m_joy2, m_joy3; |
| 179 | 186 | |
| 180 | 187 | required_memory_region m_region_maincpu; |
| 181 | 188 | required_memory_region m_region_user1; |
| r29601 | r29602 | |
| 417 | 424 | extern const i8271_interface bbc_i8271_interface; |
| 418 | 425 | extern const wd17xx_interface bbc_wd17xx_interface; |
| 419 | 426 | |
| 420 | | /* tape support */ |
| 421 | | |
| 422 | | extern const upd7002_interface bbc_uPD7002; |
| 423 | | |
| 424 | 427 | #endif /* BBC_H_ */ |
trunk/src/emu/machine/upd7002.c
| r29601 | r29602 | |
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | //------------------------------------------------- |
| 25 | | // device_config_complete - perform any |
| 26 | | // operations now that the configuration is |
| 27 | | // complete |
| 28 | | //------------------------------------------------- |
| 29 | | |
| 30 | | void upd7002_device::device_config_complete() |
| 31 | | { |
| 32 | | // inherit a copy of the static data |
| 33 | | const upd7002_interface *intf = reinterpret_cast<const upd7002_interface *>(static_config()); |
| 34 | | if (intf != NULL) |
| 35 | | *static_cast<upd7002_interface *>(this) = *intf; |
| 36 | | |
| 37 | | // or initialize to defaults if none provided |
| 38 | | else |
| 39 | | { |
| 40 | | get_analogue_func = NULL; |
| 41 | | eoc_func = NULL; |
| 42 | | } |
| 43 | | } |
| 44 | | |
| 45 | | //------------------------------------------------- |
| 46 | 25 | // device_start - device-specific startup |
| 47 | 26 | //------------------------------------------------- |
| 48 | 27 | |
| 49 | 28 | void upd7002_device::device_start() |
| 50 | 29 | { |
| 30 | m_get_analogue_cb.bind_relative_to(*owner()); |
| 31 | m_eoc_cb.bind_relative_to(*owner()); |
| 32 | |
| 51 | 33 | // register for state saving |
| 52 | 34 | save_item(NAME(m_status)); |
| 53 | 35 | save_item(NAME(m_data1)); |
| r29601 | r29602 | |
| 99 | 81 | |
| 100 | 82 | // call the EOC function with EOC from status |
| 101 | 83 | // eoc_r(0) this has just been set to 0 |
| 102 | | if (eoc_func) (eoc_func)(this,0); |
| 84 | if (!m_eoc_cb.isnull()) m_eoc_cb(0); |
| 103 | 85 | m_conversion_counter=0; |
| 104 | 86 | } |
| 105 | 87 | break; |
| r29601 | r29602 | |
| 153 | 135 | |
| 154 | 136 | // call the EOC function with EOC from status |
| 155 | 137 | // eoc_r(0) this has just been set to 1 |
| 156 | | if (eoc_func) eoc_func(this, 1); |
| 138 | if (!m_eoc_cb.isnull()) m_eoc_cb(1); |
| 157 | 139 | |
| 158 | 140 | /* the uPD7002 works by sampling the analogue value at the start of the conversion |
| 159 | 141 | so it is read hear and stored until the end of the A to D conversion */ |
| 160 | 142 | |
| 161 | 143 | // this function should return a 16 bit value. |
| 162 | | m_digitalvalue = get_analogue_func(this, m_status & 0x03); |
| 144 | m_digitalvalue = m_get_analogue_cb(m_status & 0x03); |
| 163 | 145 | |
| 164 | 146 | m_conversion_counter++; |
| 165 | 147 | |
trunk/src/emu/machine/upd7002.h
| r29601 | r29602 | |
| 15 | 15 | TYPE DEFINITIONS |
| 16 | 16 | ***************************************************************************/ |
| 17 | 17 | |
| 18 | | typedef int (*upd7002_get_analogue_func)(device_t *device, int channel_number); |
| 19 | | #define UPD7002_GET_ANALOGUE(name) int name(device_t *device, int channel_number ) |
| 18 | typedef device_delegate<int (int channel_number)> upd7002_get_analogue_delegate; |
| 19 | #define UPD7002_GET_ANALOGUE(name) int name(int channel_number) |
| 20 | 20 | |
| 21 | | typedef void (*upd7002_eoc_func)(device_t *device, int data); |
| 22 | | #define UPD7002_EOC(name) void name(device_t *device, int data ) |
| 21 | typedef device_delegate<void (int data)> upd7002_eoc_delegate; |
| 22 | #define UPD7002_EOC(name) void name(int data) |
| 23 | 23 | |
| 24 | 24 | |
| 25 | | struct upd7002_interface |
| 26 | | { |
| 27 | | upd7002_get_analogue_func get_analogue_func; |
| 28 | | upd7002_eoc_func eoc_func; |
| 29 | | }; |
| 30 | | |
| 31 | 25 | /*************************************************************************** |
| 32 | 26 | MACROS |
| 33 | 27 | ***************************************************************************/ |
| 34 | 28 | |
| 35 | | class upd7002_device : public device_t, |
| 36 | | public upd7002_interface |
| 29 | class upd7002_device : public device_t |
| 37 | 30 | { |
| 38 | 31 | public: |
| 39 | 32 | upd7002_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 40 | 33 | ~upd7002_device() {} |
| 41 | 34 | |
| 42 | | DECLARE_READ8_MEMBER ( eoc_r ); |
| 43 | | DECLARE_READ8_MEMBER ( read ); |
| 44 | | DECLARE_WRITE8_MEMBER ( write ); |
| 35 | static void set_get_analogue_callback(device_t &device, upd7002_get_analogue_delegate callback) { downcast<upd7002_device &>(device).m_get_analogue_cb = callback; } |
| 36 | static void set_eoc_callback(device_t &device, upd7002_eoc_delegate callback) { downcast<upd7002_device &>(device).m_eoc_cb = callback; } |
| 45 | 37 | |
| 38 | DECLARE_READ8_MEMBER(eoc_r); |
| 39 | DECLARE_READ8_MEMBER(read); |
| 40 | DECLARE_WRITE8_MEMBER(write); |
| 41 | |
| 46 | 42 | protected: |
| 47 | 43 | // device-level overrides |
| 48 | | virtual void device_config_complete(); |
| 49 | 44 | virtual void device_start(); |
| 50 | 45 | virtual void device_reset(); |
| 51 | 46 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| r29601 | r29602 | |
| 84 | 79 | only then at the end of the second conversion will the conversion complete function run */ |
| 85 | 80 | int m_conversion_counter; |
| 86 | 81 | |
| 82 | upd7002_get_analogue_delegate m_get_analogue_cb; |
| 83 | upd7002_eoc_delegate m_eoc_cb; |
| 84 | |
| 87 | 85 | enum |
| 88 | 86 | { |
| 89 | 87 | TIMER_CONVERSION_COMPLETE |
| r29601 | r29602 | |
| 97 | 95 | DEVICE CONFIGURATION MACROS |
| 98 | 96 | ***************************************************************************/ |
| 99 | 97 | |
| 100 | | #define MCFG_UPD7002_ADD(_tag, _intrf) \ |
| 101 | | MCFG_DEVICE_ADD(_tag, UPD7002, 0) \ |
| 102 | | MCFG_DEVICE_CONFIG(_intrf) |
| 98 | #define MCFG_UPD7002_GET_ANALOGUE_CB(_class, _method) \ |
| 99 | upd7002_device::set_get_analogue_callback(*device, upd7002_get_analogue_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 103 | 100 | |
| 101 | #define MCFG_UPD7002_EOC_CB(_class, _method) \ |
| 102 | upd7002_device::set_eoc_callback(*device, upd7002_eoc_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 104 | 103 | |
| 105 | 104 | #endif /* UPD7002_H_ */ |