trunk/src/mame/drivers/gticlub.c
| r29600 | r29601 | |
| 248 | 248 | m_dsp2(*this, "dsp2"), |
| 249 | 249 | m_k056800(*this, "k056800"), |
| 250 | 250 | m_adc1038(*this, "adc1038"), |
| 251 | m_analog0(*this, "AN0"), |
| 252 | m_analog1(*this, "AN1"), |
| 253 | m_analog2(*this, "AN2"), |
| 254 | m_analog3(*this, "AN3"), |
| 251 | 255 | m_eeprom(*this, "eeprom"), |
| 252 | 256 | m_palette(*this, "palette") { } |
| 253 | 257 | |
| r29600 | r29601 | |
| 261 | 265 | optional_device<cpu_device> m_dsp2; |
| 262 | 266 | required_device<k056800_device> m_k056800; |
| 263 | 267 | required_device<adc1038_device> m_adc1038; |
| 268 | required_ioport m_analog0, m_analog1, m_analog2, m_analog3; |
| 264 | 269 | required_device<eeprom_serial_93cxx_device> m_eeprom; |
| 265 | 270 | required_device<palette_device> m_palette; |
| 266 | 271 | |
| r29600 | r29601 | |
| 293 | 298 | INTERRUPT_GEN_MEMBER(gticlub_vblank); |
| 294 | 299 | TIMER_CALLBACK_MEMBER(sound_irq); |
| 295 | 300 | |
| 301 | ADC1038_INPUT_CB(adc1038_input_callback); |
| 302 | |
| 296 | 303 | UINT32 screen_update_gticlub(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 297 | 304 | UINT32 screen_update_hangplt(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 298 | 305 | |
| r29600 | r29601 | |
| 750 | 757 | } |
| 751 | 758 | |
| 752 | 759 | |
| 753 | | static int adc1038_input_callback( device_t *device, int input ) |
| 760 | ADC1038_INPUT_CB(gticlub_state::adc1038_input_callback) |
| 754 | 761 | { |
| 755 | 762 | int value = 0; |
| 756 | 763 | switch (input) |
| 757 | 764 | { |
| 758 | | case 0: value = device->machine().root_device().ioport("AN0")->read(); break; |
| 759 | | case 1: value = device->machine().root_device().ioport("AN1")->read(); break; |
| 760 | | case 2: value = device->machine().root_device().ioport("AN2")->read(); break; |
| 761 | | case 3: value = device->machine().root_device().ioport("AN3")->read(); break; |
| 765 | case 0: value = m_analog0->read(); break; |
| 766 | case 1: value = m_analog1->read(); break; |
| 767 | case 2: value = m_analog2->read(); break; |
| 768 | case 3: value = m_analog3->read(); break; |
| 762 | 769 | case 4: value = 0x000; break; |
| 763 | 770 | case 5: value = 0x000; break; |
| 764 | 771 | case 6: value = 0x000; break; |
| r29600 | r29601 | |
| 768 | 775 | return value; |
| 769 | 776 | } |
| 770 | 777 | |
| 771 | | static const adc1038_interface gticlub_adc1038_intf = |
| 772 | | { |
| 773 | | 1, |
| 774 | | adc1038_input_callback |
| 775 | | }; |
| 776 | | |
| 777 | | static const adc1038_interface thunderh_adc1038_intf = |
| 778 | | { |
| 779 | | 0, |
| 780 | | adc1038_input_callback |
| 781 | | }; |
| 782 | | |
| 783 | | |
| 784 | 778 | MACHINE_RESET_MEMBER(gticlub_state,gticlub) |
| 785 | 779 | { |
| 786 | 780 | m_dsp->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| r29600 | r29601 | |
| 926 | 920 | MCFG_MACHINE_START_OVERRIDE(gticlub_state,gticlub) |
| 927 | 921 | MCFG_MACHINE_RESET_OVERRIDE(gticlub_state,gticlub) |
| 928 | 922 | |
| 929 | | MCFG_ADC1038_ADD("adc1038", gticlub_adc1038_intf) |
| 923 | MCFG_DEVICE_ADD("adc1038", ADC1038, 0) |
| 924 | MCFG_ADC1038_INPUT_CB(gticlub_state, adc1038_input_callback) |
| 925 | MCFG_ADC1038_GTIHACK(1) |
| 930 | 926 | |
| 931 | 927 | MCFG_DEVICE_ADD("k056230", K056230, 0) |
| 932 | 928 | MCFG_K056230_CPU("maincpu") |
| r29600 | r29601 | |
| 966 | 962 | static MACHINE_CONFIG_DERIVED( thunderh, gticlub ) |
| 967 | 963 | |
| 968 | 964 | MCFG_DEVICE_REMOVE("adc1038") |
| 969 | | MCFG_ADC1038_ADD("adc1038", thunderh_adc1038_intf) |
| 965 | MCFG_DEVICE_ADD("adc1038", ADC1038, 0) |
| 966 | MCFG_ADC1038_INPUT_CB(gticlub_state, adc1038_input_callback) |
| 970 | 967 | |
| 971 | 968 | MCFG_DEVICE_REMOVE("k056230") |
| 972 | 969 | MCFG_DEVICE_ADD("k056230", K056230, 0) |
| r29600 | r29601 | |
| 977 | 974 | static MACHINE_CONFIG_DERIVED( slrasslt, gticlub ) |
| 978 | 975 | |
| 979 | 976 | MCFG_DEVICE_REMOVE("adc1038") |
| 980 | | MCFG_ADC1038_ADD("adc1038", thunderh_adc1038_intf) |
| 977 | MCFG_DEVICE_ADD("adc1038", ADC1038, 0) |
| 978 | MCFG_ADC1038_INPUT_CB(gticlub_state, adc1038_input_callback) |
| 981 | 979 | |
| 982 | 980 | MCFG_DEVICE_REMOVE("k001604_1") |
| 983 | 981 | MCFG_DEVICE_ADD("k001604_1", K001604, 0) |
| r29600 | r29601 | |
| 1044 | 1042 | MCFG_MACHINE_START_OVERRIDE(gticlub_state,gticlub) |
| 1045 | 1043 | MCFG_MACHINE_RESET_OVERRIDE(gticlub_state,hangplt) |
| 1046 | 1044 | |
| 1047 | | MCFG_ADC1038_ADD("adc1038", thunderh_adc1038_intf) |
| 1045 | MCFG_DEVICE_ADD("adc1038", ADC1038, 0) |
| 1046 | MCFG_ADC1038_INPUT_CB(gticlub_state, adc1038_input_callback) |
| 1048 | 1047 | |
| 1049 | 1048 | MCFG_DEVICE_ADD("k056230", K056230, 0) |
| 1050 | 1049 | MCFG_K056230_CPU("maincpu") |
trunk/src/emu/machine/adc1038.c
| r29600 | r29601 | |
| 14 | 14 | const device_type ADC1038 = &device_creator<adc1038_device>; |
| 15 | 15 | |
| 16 | 16 | adc1038_device::adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 17 | | : device_t(mconfig, ADC1038, "ADC1038", tag, owner, clock, "adc1038", __FILE__) |
| 17 | : device_t(mconfig, ADC1038, "ADC1038", tag, owner, clock, "adc1038", __FILE__), |
| 18 | m_gticlub_hack(0) |
| 18 | 19 | { |
| 19 | 20 | } |
| 20 | 21 | |
| 21 | 22 | //------------------------------------------------- |
| 22 | | // device_config_complete - perform any |
| 23 | | // operations now that the configuration is |
| 24 | | // complete |
| 25 | | //------------------------------------------------- |
| 26 | | |
| 27 | | void adc1038_device::device_config_complete() |
| 28 | | { |
| 29 | | // inherit a copy of the static data |
| 30 | | const adc1038_interface *intf = reinterpret_cast<const adc1038_interface *>(static_config()); |
| 31 | | if (intf != NULL) |
| 32 | | *static_cast<adc1038_interface *>(this) = *intf; |
| 33 | | |
| 34 | | // or initialize to defaults if none provided |
| 35 | | else |
| 36 | | { |
| 37 | | input_callback_r = NULL; |
| 38 | | } |
| 39 | | } |
| 40 | | |
| 41 | | //------------------------------------------------- |
| 42 | 23 | // device_start - device-specific startup |
| 43 | 24 | //------------------------------------------------- |
| 44 | 25 | |
| 45 | 26 | void adc1038_device::device_start() |
| 46 | 27 | { |
| 47 | | m_input_callback_r_func = input_callback_r; |
| 28 | m_input_cb.bind_relative_to(*owner()); |
| 48 | 29 | |
| 49 | 30 | save_item(NAME(m_cycle)); |
| 50 | 31 | save_item(NAME(m_clk)); |
| r29600 | r29601 | |
| 98 | 79 | m_cycle = 0; |
| 99 | 80 | |
| 100 | 81 | /* notice that m_adr is always < 7! */ |
| 101 | | m_adc_data = m_input_callback_r_func(this, m_adr); |
| 82 | m_adc_data = m_input_cb(m_adr); |
| 102 | 83 | } |
| 103 | 84 | } |
| 104 | 85 | |
| r29600 | r29601 | |
| 131 | 112 | m_cycle = 0; |
| 132 | 113 | |
| 133 | 114 | /* notice that m_adr is always < 7! */ |
| 134 | | m_adc_data = m_input_callback_r_func(this, m_adr); |
| 115 | m_adc_data = m_input_cb(m_adr); |
| 135 | 116 | |
| 136 | 117 | m_sars ^= 1; |
| 137 | 118 | return m_sars; |
trunk/src/emu/machine/adc1038.h
| r29600 | r29601 | |
| 10 | 10 | #ifndef __ADC1038_H__ |
| 11 | 11 | #define __ADC1038_H__ |
| 12 | 12 | |
| 13 | | |
| 14 | | |
| 15 | 13 | /*************************************************************************** |
| 16 | 14 | TYPE DEFINITIONS |
| 17 | 15 | ***************************************************************************/ |
| 18 | 16 | |
| 19 | | typedef int (*adc1038_input_read_func)(device_t *device, int input); |
| 17 | typedef device_delegate<int (int input)> adc1038_input_delegate; |
| 18 | #define ADC1038_INPUT_CB(name) int name(int input) |
| 20 | 19 | |
| 21 | | struct adc1038_interface |
| 22 | | { |
| 23 | | int m_gticlub_hack; |
| 24 | | adc1038_input_read_func input_callback_r; |
| 25 | | }; |
| 26 | | |
| 27 | | |
| 28 | 20 | /*************************************************************************** |
| 29 | 21 | MACROS / CONSTANTS |
| 30 | 22 | ***************************************************************************/ |
| 31 | 23 | |
| 32 | | class adc1038_device : public device_t, |
| 33 | | public adc1038_interface |
| 24 | class adc1038_device : public device_t |
| 34 | 25 | { |
| 35 | 26 | public: |
| 36 | 27 | adc1038_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 37 | 28 | ~adc1038_device() {} |
| 38 | 29 | |
| 30 | static void set_input_callback(device_t &device, adc1038_input_delegate callback) { downcast<adc1038_device &>(device).m_input_cb = callback; } |
| 31 | static void set_gti_club_hack(device_t &device, int hack) { downcast<adc1038_device &>(device).m_gticlub_hack = hack; } |
| 32 | |
| 39 | 33 | DECLARE_READ_LINE_MEMBER( do_read ); |
| 40 | 34 | DECLARE_READ_LINE_MEMBER( sars_read ); |
| 41 | 35 | DECLARE_WRITE_LINE_MEMBER( di_write ); |
| r29600 | r29601 | |
| 43 | 37 | |
| 44 | 38 | protected: |
| 45 | 39 | // device-level overrides |
| 46 | | virtual void device_config_complete(); |
| 47 | 40 | virtual void device_start(); |
| 48 | 41 | virtual void device_reset(); |
| 49 | 42 | |
| 50 | | adc1038_input_read_func m_input_callback_r_func; |
| 51 | | |
| 52 | | private: |
| 43 | private: |
| 53 | 44 | // internal state |
| 54 | 45 | int m_cycle; |
| 55 | 46 | int m_clk; |
| r29600 | r29601 | |
| 58 | 49 | int m_data_out; |
| 59 | 50 | int m_adc_data; |
| 60 | 51 | int m_sars; |
| 52 | |
| 53 | int m_gticlub_hack; |
| 54 | adc1038_input_delegate m_input_cb; |
| 61 | 55 | }; |
| 62 | 56 | |
| 63 | 57 | extern const device_type ADC1038; |
| 64 | 58 | |
| 65 | 59 | |
| 66 | | #define MCFG_ADC1038_ADD(_tag, _config) \ |
| 67 | | MCFG_DEVICE_ADD(_tag, ADC1038, 0) \ |
| 68 | | MCFG_DEVICE_CONFIG(_config) |
| 60 | #define MCFG_ADC1038_INPUT_CB(_class, _method) \ |
| 61 | adc1038_device::set_input_callback(*device, adc1038_input_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 69 | 62 | |
| 63 | #define MCFG_ADC1038_GTIHACK(_hack) \ |
| 64 | adc1038_device::set_gti_club_hack(*device, _hack); |
| 70 | 65 | |
| 66 | |
| 71 | 67 | #endif /* __ADC1038_H__ */ |