trunk/src/emu/machine/adc1213x.c
| r29628 | r29629 | |
| 59 | 59 | { |
| 60 | 60 | } |
| 61 | 61 | |
| 62 | | |
| 63 | 62 | //------------------------------------------------- |
| 64 | | // device_config_complete - perform any |
| 65 | | // operations now that the configuration is |
| 66 | | // complete |
| 67 | | //------------------------------------------------- |
| 68 | | |
| 69 | | void adc12138_device::device_config_complete() |
| 70 | | { |
| 71 | | // inherit a copy of the static data |
| 72 | | const adc12138_interface *intf = reinterpret_cast<const adc12138_interface *>(static_config()); |
| 73 | | if (intf != NULL) |
| 74 | | *static_cast<adc12138_interface *>(this) = *intf; |
| 75 | | |
| 76 | | // or initialize to defaults if none provided |
| 77 | | else |
| 78 | | { |
| 79 | | input_callback_r = NULL; |
| 80 | | } |
| 81 | | } |
| 82 | | |
| 83 | | //------------------------------------------------- |
| 84 | 63 | // device_start - device-specific startup |
| 85 | 64 | //------------------------------------------------- |
| 86 | 65 | |
| r29628 | r29629 | |
| 96 | 75 | m_end_conv = 0; |
| 97 | 76 | |
| 98 | 77 | /* resolve callbacks */ |
| 99 | | m_input_callback_r_func = input_callback_r; |
| 78 | m_ipt_read_cb.bind_relative_to(*owner()); |
| 100 | 79 | |
| 101 | 80 | /* register for state saving */ |
| 102 | 81 | save_item(NAME(m_cycle)); |
| r29628 | r29629 | |
| 144 | 123 | |
| 145 | 124 | void adc12138_device::convert(int channel, int bits16, int lsbfirst) |
| 146 | 125 | { |
| 147 | | int i; |
| 148 | 126 | int bits; |
| 149 | 127 | int input_value; |
| 150 | 128 | double input = 0; |
| r29628 | r29629 | |
| 159 | 137 | { |
| 160 | 138 | case 0x8: // H L L L - CH0 (single-ended) |
| 161 | 139 | { |
| 162 | | input = m_input_callback_r_func(this, 0); |
| 140 | input = m_ipt_read_cb(0); |
| 163 | 141 | break; |
| 164 | 142 | } |
| 165 | 143 | case 0xc: // H H L L - CH1 (single-ended) |
| 166 | 144 | { |
| 167 | | input = m_input_callback_r_func(this, 1); |
| 145 | input = m_ipt_read_cb(1); |
| 168 | 146 | break; |
| 169 | 147 | } |
| 170 | 148 | case 0x9: // H L L H - CH2 (single-ended) |
| 171 | 149 | { |
| 172 | | input = m_input_callback_r_func(this, 2); |
| 150 | input = m_ipt_read_cb(2); |
| 173 | 151 | break; |
| 174 | 152 | } |
| 175 | 153 | case 0xd: // H H L H - CH3 (single-ended) |
| 176 | 154 | { |
| 177 | | input = m_input_callback_r_func(this, 3); |
| 155 | input = m_ipt_read_cb(3); |
| 178 | 156 | break; |
| 179 | 157 | } |
| 180 | 158 | case 0xa: // H L H L - CH4 (single-ended) |
| 181 | 159 | { |
| 182 | | input = m_input_callback_r_func(this, 4); |
| 160 | input = m_ipt_read_cb(4); |
| 183 | 161 | break; |
| 184 | 162 | } |
| 185 | 163 | case 0xe: // H H H L - CH5 (single-ended) |
| 186 | 164 | { |
| 187 | | input = m_input_callback_r_func(this, 5); |
| 165 | input = m_ipt_read_cb(5); |
| 188 | 166 | break; |
| 189 | 167 | } |
| 190 | 168 | case 0xb: // H L H H - CH6 (single-ended) |
| 191 | 169 | { |
| 192 | | input = m_input_callback_r_func(this, 6); |
| 170 | input = m_ipt_read_cb(6); |
| 193 | 171 | break; |
| 194 | 172 | } |
| 195 | 173 | case 0xf: // H H H H - CH7 (single-ended) |
| 196 | 174 | { |
| 197 | | input = m_input_callback_r_func(this, 7); |
| 175 | input = m_ipt_read_cb(7); |
| 198 | 176 | break; |
| 199 | 177 | } |
| 200 | 178 | default: |
| r29628 | r29629 | |
| 216 | 194 | |
| 217 | 195 | m_output_shift_reg = 0; |
| 218 | 196 | |
| 219 | | for (i=0; i < bits; i++) |
| 197 | for (int i = 0; i < bits; i++) |
| 220 | 198 | { |
| 221 | | if (input_value & (1 << ((bits-1) - i))) |
| 199 | if (input_value & (1 << ((bits - 1) - i))) |
| 222 | 200 | { |
| 223 | 201 | m_output_shift_reg |= (1 << i); |
| 224 | 202 | } |
trunk/src/emu/machine/adc1213x.h
| r29628 | r29629 | |
| 15 | 15 | TYPE DEFINITIONS |
| 16 | 16 | ***************************************************************************/ |
| 17 | 17 | |
| 18 | | typedef double (*adc1213x_input_convert_func)(device_t *device, UINT8 input); |
| 18 | typedef device_delegate<double (UINT8 input)> adc1213x_ipt_convert_delegate; |
| 19 | #define ADC12138_IPT_CONVERT_CB(name) double name(UINT8 input) |
| 19 | 20 | |
| 20 | | struct adc12138_interface |
| 21 | | { |
| 22 | | adc1213x_input_convert_func input_callback_r; |
| 23 | | }; |
| 24 | | |
| 25 | 21 | /*************************************************************************** |
| 26 | 22 | MACROS / CONSTANTS |
| 27 | 23 | ***************************************************************************/ |
| 28 | 24 | |
| 29 | | class adc12138_device : public device_t, |
| 30 | | public adc12138_interface |
| 25 | class adc12138_device : public device_t |
| 31 | 26 | { |
| 32 | 27 | public: |
| 33 | 28 | adc12138_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 34 | 29 | adc12138_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); |
| 35 | 30 | ~adc12138_device() {} |
| 36 | 31 | |
| 32 | static void set_ipt_convert_callback(device_t &device, adc1213x_ipt_convert_delegate callback) { downcast<adc12138_device &>(device).m_ipt_read_cb = callback; } |
| 33 | |
| 37 | 34 | DECLARE_WRITE8_MEMBER( di_w ); |
| 38 | 35 | DECLARE_WRITE8_MEMBER( cs_w ); |
| 39 | 36 | DECLARE_WRITE8_MEMBER( sclk_w ); |
| r29628 | r29629 | |
| 43 | 40 | |
| 44 | 41 | protected: |
| 45 | 42 | // device-level overrides |
| 46 | | virtual void device_config_complete(); |
| 47 | 43 | virtual void device_start(); |
| 48 | 44 | virtual void device_reset(); |
| 49 | 45 | |
| 50 | 46 | void convert(int channel, int bits16, int lsbfirst); |
| 51 | 47 | |
| 52 | | adc1213x_input_convert_func m_input_callback_r_func; |
| 48 | adc1213x_ipt_convert_delegate m_ipt_read_cb; |
| 53 | 49 | |
| 54 | | private: |
| 50 | private: |
| 55 | 51 | // internal state |
| 56 | 52 | int m_cycle; |
| 57 | 53 | int m_data_out; |
| r29628 | r29629 | |
| 84 | 80 | |
| 85 | 81 | extern const device_type ADC12132; |
| 86 | 82 | |
| 87 | | #define MCFG_ADC12130_ADD(_tag, _config) \ |
| 88 | | MCFG_DEVICE_ADD(_tag, ADC12130, 0) \ |
| 89 | | MCFG_DEVICE_CONFIG(_config) |
| 90 | 83 | |
| 91 | | #define MCFG_ADC12132_ADD(_tag, _config) \ |
| 92 | | MCFG_DEVICE_ADD(_tag, ADC12132, 0) \ |
| 93 | | MCFG_DEVICE_CONFIG(_config) |
| 84 | #define MCFG_ADC1213X_IPT_CONVERT_CB(_class, _method) \ |
| 85 | adc12138_device::set_ipt_convert_callback(*device, adc1213x_ipt_convert_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 94 | 86 | |
| 95 | | #define MCFG_ADC12138_ADD(_tag, _config) \ |
| 96 | | MCFG_DEVICE_ADD(_tag, ADC12138, 0) \ |
| 97 | | MCFG_DEVICE_CONFIG(_config) |
| 98 | | |
| 99 | | |
| 100 | 87 | #endif /* __ADC1213X_H__ */ |
trunk/src/mame/drivers/nwk-tr.c
| r29628 | r29629 | |
| 238 | 238 | m_k056800(*this, "k056800"), |
| 239 | 239 | m_k001604(*this, "k001604"), |
| 240 | 240 | m_adc12138(*this, "adc12138"), |
| 241 | m_in0(*this, "IN0"), |
| 242 | m_in1(*this, "IN1"), |
| 243 | m_in2(*this, "IN2"), |
| 244 | m_dsw(*this, "DSW"), |
| 245 | m_analog1(*this, "ANALOG1"), |
| 246 | m_analog2(*this, "ANALOG2"), |
| 247 | m_analog3(*this, "ANALOG3"), |
| 248 | m_analog4(*this, "ANALOG4"), |
| 249 | m_analog5(*this, "ANALOG5"), |
| 241 | 250 | m_palette(*this, "palette") { } |
| 242 | 251 | |
| 243 | 252 | // TODO: Needs verification on real hardware |
| r29628 | r29629 | |
| 252 | 261 | required_device<k056800_device> m_k056800; |
| 253 | 262 | required_device<k001604_device> m_k001604; |
| 254 | 263 | required_device<adc12138_device> m_adc12138; |
| 264 | required_ioport m_in0, m_in1, m_in2, m_dsw, m_analog1, m_analog2, m_analog3, m_analog4, m_analog5; |
| 255 | 265 | required_device<palette_device> m_palette; |
| 256 | 266 | emu_timer *m_sound_irq_timer; |
| 257 | 267 | int m_fpga_uploaded; |
| r29628 | r29629 | |
| 271 | 281 | DECLARE_WRITE16_MEMBER(soundtimer_en_w); |
| 272 | 282 | DECLARE_WRITE16_MEMBER(soundtimer_count_w); |
| 273 | 283 | DECLARE_WRITE_LINE_MEMBER(voodoo_vblank_0); |
| 284 | ADC12138_IPT_CONVERT_CB(adc12138_input_callback); |
| 285 | |
| 274 | 286 | TIMER_CALLBACK_MEMBER(sound_irq); |
| 275 | 287 | DECLARE_DRIVER_INIT(nwktr); |
| 276 | 288 | virtual void machine_start(); |
| r29628 | r29629 | |
| 282 | 294 | |
| 283 | 295 | |
| 284 | 296 | |
| 285 | | |
| 286 | | |
| 287 | 297 | WRITE32_MEMBER(nwktr_state::paletteram32_w) |
| 288 | 298 | { |
| 289 | 299 | COMBINE_DATA(&m_generic_paletteram_32[offset]); |
| r29628 | r29629 | |
| 324 | 334 | { |
| 325 | 335 | if (ACCESSING_BITS_24_31) |
| 326 | 336 | { |
| 327 | | r |= ioport("IN0")->read() << 24; |
| 337 | r |= m_in0->read() << 24; |
| 328 | 338 | } |
| 329 | 339 | if (ACCESSING_BITS_16_23) |
| 330 | 340 | { |
| 331 | | r |= ioport("IN1")->read() << 16; |
| 341 | r |= m_in1->read() << 16; |
| 332 | 342 | } |
| 333 | 343 | if (ACCESSING_BITS_8_15) |
| 334 | 344 | { |
| 335 | | r |= ioport("IN2")->read() << 8; |
| 345 | r |= m_in2->read() << 8; |
| 336 | 346 | } |
| 337 | 347 | if (ACCESSING_BITS_0_7) |
| 338 | 348 | { |
| r29628 | r29629 | |
| 343 | 353 | { |
| 344 | 354 | if (ACCESSING_BITS_24_31) |
| 345 | 355 | { |
| 346 | | r |= ioport("DSW")->read() << 24; |
| 356 | r |= m_dsw->read() << 24; |
| 347 | 357 | } |
| 348 | 358 | } |
| 349 | 359 | return r; |
| r29628 | r29629 | |
| 689 | 699 | INPUT_PORTS_END |
| 690 | 700 | |
| 691 | 701 | |
| 692 | | static double adc12138_input_callback( device_t *device, UINT8 input ) |
| 702 | ADC12138_IPT_CONVERT_CB(nwktr_state::adc12138_input_callback) |
| 693 | 703 | { |
| 694 | 704 | int value = 0; |
| 695 | 705 | switch (input) |
| 696 | 706 | { |
| 697 | | case 0: value = device->machine().root_device().ioport("ANALOG1")->read(); break; |
| 698 | | case 1: value = device->machine().root_device().ioport("ANALOG2")->read(); break; |
| 699 | | case 2: value = device->machine().root_device().ioport("ANALOG3")->read(); break; |
| 700 | | case 3: value = device->machine().root_device().ioport("ANALOG4")->read(); break; |
| 701 | | case 4: value = device->machine().root_device().ioport("ANALOG5")->read(); break; |
| 707 | case 0: value = m_analog1->read(); break; |
| 708 | case 1: value = m_analog2->read(); break; |
| 709 | case 2: value = m_analog3->read(); break; |
| 710 | case 3: value = m_analog4->read(); break; |
| 711 | case 4: value = m_analog5->read(); break; |
| 702 | 712 | } |
| 703 | 713 | |
| 704 | 714 | return (double)(value) / 4095.0; |
| 705 | 715 | } |
| 706 | 716 | |
| 707 | | static const adc12138_interface nwktr_adc_interface = { |
| 708 | | adc12138_input_callback |
| 709 | | }; |
| 710 | | |
| 711 | | |
| 712 | 717 | void nwktr_state::machine_reset() |
| 713 | 718 | { |
| 714 | 719 | m_dsp->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| r29628 | r29629 | |
| 741 | 746 | MCFG_QUANTUM_TIME(attotime::from_hz(9000)) |
| 742 | 747 | |
| 743 | 748 | MCFG_M48T58_ADD( "m48t58" ) |
| 744 | | MCFG_ADC12138_ADD( "adc12138", nwktr_adc_interface ) |
| 745 | 749 | |
| 750 | MCFG_DEVICE_ADD("adc12138", ADC12138, 0) |
| 751 | MCFG_ADC1213X_IPT_CONVERT_CB(nwktr_state, adc12138_input_callback) |
| 752 | |
| 746 | 753 | MCFG_DEVICE_ADD("k033906_1", K033906, 0) |
| 747 | 754 | MCFG_K033906_VOODOO("voodoo") |
| 748 | 755 | |
trunk/src/mame/drivers/hornet.c
| r29628 | r29629 | |
| 341 | 341 | m_eeprom(*this, "eeprom"), |
| 342 | 342 | m_k037122_1(*this, "k037122_1"), |
| 343 | 343 | m_k037122_2(*this, "k037122_2" ), |
| 344 | | m_adc12138(*this, "adc12138") { } |
| 344 | m_adc12138(*this, "adc12138"), |
| 345 | m_in0(*this, "IN0"), |
| 346 | m_in1(*this, "IN1"), |
| 347 | m_in2(*this, "IN2"), |
| 348 | m_dsw(*this, "DSW"), |
| 349 | m_eepromout(*this, "EEPROMOUT"), |
| 350 | m_analog1(*this, "ANALOG1"), |
| 351 | m_analog2(*this, "ANALOG2"){ } |
| 345 | 352 | |
| 346 | 353 | // TODO: Needs verification on real hardware |
| 347 | 354 | static const int m_sound_timer_usec = 2800; |
| r29628 | r29629 | |
| 359 | 366 | optional_device<k037122_device> m_k037122_1; |
| 360 | 367 | optional_device<k037122_device> m_k037122_2; |
| 361 | 368 | required_device<adc12138_device> m_adc12138; |
| 369 | required_ioport m_in0, m_in1, m_in2, m_dsw, m_eepromout; |
| 370 | optional_ioport m_analog1, m_analog2; |
| 362 | 371 | |
| 363 | 372 | emu_timer *m_sound_irq_timer; |
| 364 | 373 | UINT8 m_led_reg0; |
| r29628 | r29629 | |
| 393 | 402 | DECLARE_WRITE_LINE_MEMBER(voodoo_vblank_1); |
| 394 | 403 | DECLARE_WRITE16_MEMBER(soundtimer_en_w); |
| 395 | 404 | DECLARE_WRITE16_MEMBER(soundtimer_count_w); |
| 405 | ADC12138_IPT_CONVERT_CB(adc12138_input_callback); |
| 396 | 406 | |
| 397 | 407 | DECLARE_DRIVER_INIT(hornet); |
| 398 | 408 | DECLARE_DRIVER_INIT(hornet_2board); |
| r29628 | r29629 | |
| 498 | 508 | READ8_MEMBER(hornet_state::sysreg_r) |
| 499 | 509 | { |
| 500 | 510 | UINT8 r = 0; |
| 501 | | static const char *const portnames[] = { "IN0", "IN1", "IN2" }; |
| 511 | |
| 502 | 512 | switch (offset) |
| 503 | 513 | { |
| 504 | 514 | case 0: /* I/O port 0 */ |
| 515 | r = m_in0->read(); |
| 516 | break; |
| 505 | 517 | case 1: /* I/O port 1 */ |
| 518 | r = m_in1->read(); |
| 519 | break; |
| 506 | 520 | case 2: /* I/O port 2 */ |
| 507 | | r = ioport(portnames[offset])->read(); |
| 521 | r = m_in2->read(); |
| 508 | 522 | break; |
| 509 | 523 | |
| 510 | 524 | case 3: /* I/O port 3 */ |
| r29628 | r29629 | |
| 522 | 536 | break; |
| 523 | 537 | |
| 524 | 538 | case 4: /* I/O port 4 - DIP switches */ |
| 525 | | r = ioport("DSW")->read(); |
| 539 | r = m_dsw->read(); |
| 526 | 540 | break; |
| 527 | 541 | } |
| 528 | 542 | return r; |
| r29628 | r29629 | |
| 555 | 569 | 0x02 = LAMP1 |
| 556 | 570 | 0x01 = LAMP0 |
| 557 | 571 | */ |
| 558 | | ioport("EEPROMOUT")->write(data, 0xff); |
| 572 | m_eepromout->write(data, 0xff); |
| 559 | 573 | mame_printf_debug("System register 0 = %02X\n", data); |
| 560 | 574 | break; |
| 561 | 575 | |
| r29628 | r29629 | |
| 932 | 946 | membank("bank5")->set_base(usr5); |
| 933 | 947 | } |
| 934 | 948 | |
| 935 | | static double adc12138_input_callback( device_t *device, UINT8 input ) |
| 949 | ADC12138_IPT_CONVERT_CB(hornet_state::adc12138_input_callback) |
| 936 | 950 | { |
| 937 | 951 | int value = 0; |
| 938 | 952 | switch (input) |
| 939 | 953 | { |
| 940 | | case 0: value = device->machine().root_device().ioport("ANALOG1")->read(); break; |
| 941 | | case 1: value = device->machine().root_device().ioport("ANALOG2")->read(); break; |
| 954 | case 0: value = (m_analog1) ? m_analog1->read() : 0; break; |
| 955 | case 1: value = (m_analog2) ? m_analog2->read() : 0; break; |
| 942 | 956 | } |
| 943 | 957 | |
| 944 | 958 | return (double)(value) / 2047.0; |
| 945 | 959 | } |
| 946 | 960 | |
| 947 | | static const adc12138_interface hornet_adc_interface = { |
| 948 | | adc12138_input_callback |
| 949 | | }; |
| 950 | | |
| 951 | 961 | static const voodoo_config hornet_voodoo_intf = |
| 952 | 962 | { |
| 953 | 963 | 2, // fbmem; |
| r29628 | r29629 | |
| 1009 | 1019 | |
| 1010 | 1020 | MCFG_M48T58_ADD( "m48t58" ) |
| 1011 | 1021 | |
| 1012 | | MCFG_ADC12138_ADD( "adc12138", hornet_adc_interface ) |
| 1022 | MCFG_DEVICE_ADD("adc12138", ADC12138, 0) |
| 1023 | MCFG_ADC1213X_IPT_CONVERT_CB(hornet_state, adc12138_input_callback) |
| 1013 | 1024 | MACHINE_CONFIG_END |
| 1014 | 1025 | |
| 1015 | 1026 | |