trunk/src/mame/drivers/zr107.c
| r29630 | r29631 | |
| 191 | 191 | m_k056800(*this, "k056800"), |
| 192 | 192 | m_k056832(*this, "k056832"), |
| 193 | 193 | m_workram(*this, "workram"), |
| 194 | m_in0(*this, "IN0"), |
| 195 | m_in1(*this, "IN1"), |
| 196 | m_in2(*this, "IN2"), |
| 197 | m_in3(*this, "IN3"), |
| 198 | m_in4(*this, "IN4"), |
| 199 | m_out4(*this, "OUT4"), |
| 200 | m_eepromout(*this, "EEPROMOUT"), |
| 201 | m_analog1(*this, "ANALOG1"), |
| 202 | m_analog2(*this, "ANALOG2"), |
| 203 | m_analog3(*this, "ANALOG3"), |
| 194 | 204 | m_palette(*this, "palette") { } |
| 195 | 205 | |
| 196 | 206 | required_device<cpu_device> m_maincpu; |
| r29630 | r29631 | |
| 200 | 210 | required_device<k056800_device> m_k056800; |
| 201 | 211 | optional_device<k056832_device> m_k056832; |
| 202 | 212 | optional_shared_ptr<UINT32> m_workram; |
| 213 | required_ioport m_in0, m_in1, m_in2, m_in3, m_in4, m_out4, m_eepromout, m_analog1, m_analog2, m_analog3; |
| 203 | 214 | required_device<palette_device> m_palette; |
| 204 | 215 | |
| 205 | 216 | UINT32 *m_sharc_dataram; |
| r29630 | r29631 | |
| 229 | 240 | UINT32 screen_update_jetwave(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 230 | 241 | INTERRUPT_GEN_MEMBER(zr107_vblank); |
| 231 | 242 | WRITE_LINE_MEMBER(k054539_irq_gen); |
| 243 | ADC083X_INPUT_CB(adc0838_callback); |
| 232 | 244 | |
| 233 | 245 | protected: |
| 234 | 246 | virtual void machine_start(); |
| r29630 | r29631 | |
| 316 | 328 | READ8_MEMBER(zr107_state::sysreg_r) |
| 317 | 329 | { |
| 318 | 330 | UINT32 r = 0; |
| 319 | | static const char *const portnames[] = { "IN0", "IN1", "IN2", "IN3", "IN4" }; |
| 320 | 331 | |
| 321 | 332 | switch (offset) |
| 322 | 333 | { |
| 323 | 334 | case 0: /* I/O port 0 */ |
| 335 | r = m_in0->read(); |
| 336 | break; |
| 324 | 337 | case 1: /* I/O port 1 */ |
| 338 | r = m_in1->read(); |
| 339 | break; |
| 325 | 340 | case 2: /* I/O port 2 */ |
| 341 | r = m_in2->read(); |
| 342 | break; |
| 326 | 343 | case 3: /* System Port 0 */ |
| 344 | r = m_in3->read(); |
| 345 | break; |
| 327 | 346 | case 4: /* System Port 1 */ |
| 328 | | r = ioport(portnames[offset])->read(); |
| 347 | r = m_in4->read(); |
| 329 | 348 | break; |
| 330 | | |
| 331 | 349 | case 5: /* Parallel data port */ |
| 332 | 350 | break; |
| 333 | 351 | } |
| r29630 | r29631 | |
| 361 | 379 | 0x02 = EEPCLK |
| 362 | 380 | 0x01 = EEPDI |
| 363 | 381 | */ |
| 364 | | ioport("EEPROMOUT")->write(data & 0x07, 0xff); |
| 382 | m_eepromout->write(data & 0x07, 0xff); |
| 365 | 383 | m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? CLEAR_LINE : ASSERT_LINE); |
| 366 | 384 | mame_printf_debug("System register 0 = %02X\n", data); |
| 367 | 385 | break; |
| r29630 | r29631 | |
| 382 | 400 | if (data & 0x40) /* CG Board 0 IRQ Ack */ |
| 383 | 401 | m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); |
| 384 | 402 | set_cgboard_id((data >> 4) & 3); |
| 385 | | ioport("OUT4")->write(data, 0xff); |
| 403 | m_out4->write(data, 0xff); |
| 386 | 404 | mame_printf_debug("System register 1 = %02X\n", data); |
| 387 | 405 | break; |
| 388 | 406 | |
| r29630 | r29631 | |
| 675 | 693 | |
| 676 | 694 | /* ADC0838 Interface */ |
| 677 | 695 | |
| 678 | | static double adc0838_callback( device_t *device, UINT8 input ) |
| 696 | ADC083X_INPUT_CB(zr107_state::adc0838_callback) |
| 679 | 697 | { |
| 680 | 698 | switch (input) |
| 681 | 699 | { |
| 682 | 700 | case ADC083X_CH0: |
| 683 | | return (double)(5 * device->machine().root_device().ioport("ANALOG1")->read()) / 255.0; |
| 701 | return (double)(5 * m_analog1->read()) / 255.0; |
| 684 | 702 | case ADC083X_CH1: |
| 685 | | return (double)(5 * device->machine().root_device().ioport("ANALOG2")->read()) / 255.0; |
| 703 | return (double)(5 * m_analog2->read()) / 255.0; |
| 686 | 704 | case ADC083X_CH2: |
| 687 | | return (double)(5 * device->machine().root_device().ioport("ANALOG3")->read()) / 255.0; |
| 705 | return (double)(5 * m_analog3->read()) / 255.0; |
| 688 | 706 | case ADC083X_CH3: |
| 689 | 707 | return 0; |
| 690 | 708 | case ADC083X_COM: |
| r29630 | r29631 | |
| 791 | 809 | MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) |
| 792 | 810 | |
| 793 | 811 | MCFG_DEVICE_ADD("adc0838", ADC0838, 0) |
| 794 | | MCFG_ADC083X_INPUT_CALLBACK(adc0838_callback) |
| 812 | MCFG_ADC083X_INPUT_CB(zr107_state, adc0838_callback) |
| 795 | 813 | MACHINE_CONFIG_END |
| 796 | 814 | |
| 797 | 815 | |
| r29630 | r29631 | |
| 855 | 873 | MCFG_SOUND_ROUTE(1, "rspeaker", 0.75) |
| 856 | 874 | |
| 857 | 875 | MCFG_DEVICE_ADD("adc0838", ADC0838, 0) |
| 858 | | MCFG_ADC083X_INPUT_CALLBACK(adc0838_callback) |
| 876 | MCFG_ADC083X_INPUT_CB(zr107_state, adc0838_callback) |
| 859 | 877 | MACHINE_CONFIG_END |
| 860 | 878 | |
| 861 | 879 | /*****************************************************************************/ |
trunk/src/mame/drivers/ksys573.c
| r29630 | r29631 | |
| 451 | 451 | DECLARE_WRITE8_MEMBER( dmx_output_callback ); |
| 452 | 452 | DECLARE_WRITE8_MEMBER( mamboagg_output_callback ); |
| 453 | 453 | DECLARE_WRITE8_MEMBER( punchmania_output_callback ); |
| 454 | ADC083X_INPUT_CB(analogue_inputs_callback); |
| 454 | 455 | |
| 455 | 456 | void cdrom_dma_read( UINT32 *ram, UINT32 n_address, INT32 n_size ); |
| 456 | 457 | void cdrom_dma_write( UINT32 *ram, UINT32 n_address, INT32 n_size ); |
| r29630 | r29631 | |
| 1680 | 1681 | /* punch mania */ |
| 1681 | 1682 | |
| 1682 | 1683 | |
| 1683 | | static double punchmania_inputs_callback( device_t *device, UINT8 input ) |
| 1684 | ADC083X_INPUT_CB(konami573_cassette_xi_device::punchmania_inputs_callback) |
| 1684 | 1685 | { |
| 1685 | | ksys573_state *state = device->machine().driver_data<ksys573_state>(); |
| 1686 | | |
| 1686 | ksys573_state *state = machine().driver_data<ksys573_state>(); |
| 1687 | 1687 | double *pad_position = state->m_pad_position; |
| 1688 | 1688 | int pads = state->m_pads->read(); |
| 1689 | 1689 | for( int i = 0; i < 6; i++ ) |
| r29630 | r29631 | |
| 1719 | 1719 | |
| 1720 | 1720 | static MACHINE_CONFIG_FRAGMENT( punchmania_cassette_install ) |
| 1721 | 1721 | MCFG_DEVICE_MODIFY( "adc0838" ) |
| 1722 | | MCFG_ADC083X_INPUT_CALLBACK( punchmania_inputs_callback ) |
| 1722 | MCFG_ADC083X_INPUT_CB( konami573_cassette_xi_device, punchmania_inputs_callback ) |
| 1723 | 1723 | MACHINE_CONFIG_END |
| 1724 | 1724 | |
| 1725 | 1725 | |
| r29630 | r29631 | |
| 1987 | 1987 | |
| 1988 | 1988 | /* ADC0834 Interface */ |
| 1989 | 1989 | |
| 1990 | | static double analogue_inputs_callback( device_t *device, UINT8 input ) |
| 1990 | ADC083X_INPUT_CB(ksys573_state::analogue_inputs_callback) |
| 1991 | 1991 | { |
| 1992 | | ksys573_state *state = device->machine().driver_data<ksys573_state>(); |
| 1993 | | |
| 1994 | 1992 | switch( input ) |
| 1995 | 1993 | { |
| 1996 | 1994 | case ADC083X_CH0: |
| 1997 | | return (double)( 5 * state->m_analog0->read() ) / 255.0; |
| 1995 | return (double)( 5 * m_analog0->read() ) / 255.0; |
| 1998 | 1996 | case ADC083X_CH1: |
| 1999 | | return (double)( 5 * state->m_analog1->read() ) / 255.0; |
| 1997 | return (double)( 5 * m_analog1->read() ) / 255.0; |
| 2000 | 1998 | case ADC083X_CH2: |
| 2001 | | return (double)( 5 * state->m_analog2->read() ) / 255.0; |
| 1999 | return (double)( 5 * m_analog2->read() ) / 255.0; |
| 2002 | 2000 | case ADC083X_CH3: |
| 2003 | | return (double)( 5 * state->m_analog3->read() ) / 255.0; |
| 2001 | return (double)( 5 * m_analog3->read() ) / 255.0; |
| 2004 | 2002 | case ADC083X_AGND: |
| 2005 | 2003 | return 0; |
| 2006 | 2004 | case ADC083X_VREF: |
| r29630 | r29631 | |
| 2076 | 2074 | MCFG_M48T58_ADD( "m48t58" ) |
| 2077 | 2075 | |
| 2078 | 2076 | MCFG_DEVICE_ADD( "adc0834", ADC0834, 0 ) |
| 2079 | | MCFG_ADC083X_INPUT_CALLBACK( analogue_inputs_callback ) |
| 2077 | MCFG_ADC083X_INPUT_CB( ksys573_state, analogue_inputs_callback ) |
| 2080 | 2078 | MACHINE_CONFIG_END |
| 2081 | 2079 | |
| 2082 | 2080 | // Variants with additional digital sound board |
trunk/src/mame/drivers/konamigx.c
| r29630 | r29631 | |
| 102 | 102 | #include "sound/k056800.h" |
| 103 | 103 | #include "sound/k054539.h" |
| 104 | 104 | #include "includes/konamigx.h" |
| 105 | | #include "machine/adc083x.h" |
| 106 | 105 | #include "rendlay.h" |
| 107 | 106 | |
| 108 | 107 | #define GX_DEBUG 0 |
| r29630 | r29631 | |
| 463 | 462 | bit 0: eeprom data |
| 464 | 463 | */ |
| 465 | 464 | |
| 466 | | ioport("EEPROMOUT")->write(odata, 0xff); |
| 465 | m_eepromout->write(odata, 0xff); |
| 467 | 466 | |
| 468 | 467 | konamigx_wrport1_0 = odata; |
| 469 | 468 | } |
| r29630 | r29631 | |
| 708 | 707 | |
| 709 | 708 | /* National Semiconductor ADC0834 4-channel serial ADC emulation */ |
| 710 | 709 | |
| 711 | | static double adc0834_callback( device_t *device, UINT8 input ) |
| 710 | ADC083X_INPUT_CB(konamigx_state::adc0834_callback) |
| 712 | 711 | { |
| 713 | 712 | switch (input) |
| 714 | 713 | { |
| 715 | 714 | case ADC083X_CH0: |
| 716 | | return (double)(5 * device->machine().root_device().ioport("AN0")->read()) / 255.0; // steer |
| 715 | return (double)(5 * m_an0->read()) / 255.0; // steer |
| 717 | 716 | case ADC083X_CH1: |
| 718 | | return (double)(5 * device->machine().root_device().ioport("AN1")->read()) / 255.0; // gas |
| 717 | return (double)(5 * m_an1->read()) / 255.0; // gas |
| 719 | 718 | case ADC083X_VREF: |
| 720 | 719 | return 5; |
| 721 | 720 | } |
| r29630 | r29631 | |
| 725 | 724 | |
| 726 | 725 | READ32_MEMBER(konamigx_state::le2_gun_H_r) |
| 727 | 726 | { |
| 728 | | int p1x = ioport("LIGHT0_X")->read()*290/0xff+20; |
| 729 | | int p2x = ioport("LIGHT1_X")->read()*290/0xff+20; |
| 727 | int p1x = m_light0_x->read()*290/0xff+20; |
| 728 | int p2x = m_light1_x->read()*290/0xff+20; |
| 730 | 729 | |
| 731 | 730 | return (p1x<<16)|p2x; |
| 732 | 731 | } |
| 733 | 732 | |
| 734 | 733 | READ32_MEMBER(konamigx_state::le2_gun_V_r) |
| 735 | 734 | { |
| 736 | | int p1y = ioport("LIGHT0_Y")->read()*224/0xff; |
| 737 | | int p2y = ioport("LIGHT1_Y")->read()*224/0xff; |
| 735 | int p1y = m_light0_y->read()*224/0xff; |
| 736 | int p2y = m_light1_y->read()*224/0xff; |
| 738 | 737 | |
| 739 | 738 | // make "off the bottom" reload too |
| 740 | 739 | if (p1y >= 0xdf) p1y = 0; |
| r29630 | r29631 | |
| 1700 | 1699 | MCFG_CPU_PROGRAM_MAP(gx_type1_map) |
| 1701 | 1700 | |
| 1702 | 1701 | MCFG_DEVICE_ADD("adc0834", ADC0834, 0) |
| 1703 | | MCFG_ADC083X_INPUT_CALLBACK(adc0834_callback) |
| 1702 | MCFG_ADC083X_INPUT_CB(konamigx_state, adc0834_callback) |
| 1704 | 1703 | MACHINE_CONFIG_END |
| 1705 | 1704 | |
| 1706 | 1705 | static MACHINE_CONFIG_DERIVED( racinfrc, konamigx ) |
| r29630 | r29631 | |
| 1714 | 1713 | MCFG_CPU_PROGRAM_MAP(gx_type1_map) |
| 1715 | 1714 | |
| 1716 | 1715 | MCFG_DEVICE_ADD("adc0834", ADC0834, 0) |
| 1717 | | MCFG_ADC083X_INPUT_CALLBACK(adc0834_callback) |
| 1716 | MCFG_ADC083X_INPUT_CB(konamigx_state, adc0834_callback) |
| 1718 | 1717 | MACHINE_CONFIG_END |
| 1719 | 1718 | |
| 1720 | 1719 | static MACHINE_CONFIG_DERIVED( gxtype3, konamigx ) |
trunk/src/mame/includes/konamigx.h
| r29630 | r29631 | |
| 1 | 1 | #include "sound/k056800.h" |
| 2 | 2 | #include "sound/k054539.h" |
| 3 | 3 | #include "cpu/tms57002/tms57002.h" |
| 4 | #include "machine/adc083x.h" |
| 4 | 5 | #include "video/k054156_k054157_k056832.h" |
| 5 | 6 | #include "video/k053246_k053247_k055673.h" |
| 6 | 7 | #include "video/k055555.h" |
| r29630 | r29631 | |
| 29 | 30 | m_k056800(*this, "k056800"), |
| 30 | 31 | m_k054539_1(*this,"k054539_1"), |
| 31 | 32 | m_k054539_2(*this,"k054539_2"), |
| 33 | m_an0(*this, "AN0"), |
| 34 | m_an1(*this, "AN1"), |
| 35 | m_light0_x(*this, "LIGHT0_X"), |
| 36 | m_light0_y(*this, "LIGHT0_Y"), |
| 37 | m_light1_x(*this, "LIGHT1_X"), |
| 38 | m_light1_y(*this, "LIGHT1_Y"), |
| 39 | m_eepromout(*this, "EEPROMOUT"), |
| 32 | 40 | m_gfxdecode(*this, "gfxdecode"), |
| 33 | 41 | m_screen(*this, "screen"), |
| 34 | 42 | m_palette(*this, "palette") |
| r29630 | r29631 | |
| 52 | 60 | optional_device<k056800_device> m_k056800; |
| 53 | 61 | optional_device<k054539_device> m_k054539_1; |
| 54 | 62 | optional_device<k054539_device> m_k054539_2; |
| 63 | optional_ioport m_an0, m_an1, m_light0_x, m_light0_y, m_light1_x, m_light1_y, m_eepromout; |
| 55 | 64 | required_device<gfxdecode_device> m_gfxdecode; |
| 56 | 65 | required_device<screen_device> m_screen; |
| 57 | 66 | required_device<palette_device> m_palette; |
| r29630 | r29631 | |
| 119 | 128 | TIMER_CALLBACK_MEMBER(dmaend_callback); |
| 120 | 129 | TIMER_CALLBACK_MEMBER(boothack_callback); |
| 121 | 130 | TIMER_DEVICE_CALLBACK_MEMBER(konamigx_hbinterrupt); |
| 131 | ADC083X_INPUT_CB(adc0834_callback); |
| 122 | 132 | |
| 123 | 133 | void _gxcommoninitnosprites(running_machine &machine); |
| 124 | 134 | void _gxcommoninit(running_machine &machine); |
trunk/src/emu/machine/adc083x.c
| r29630 | r29631 | |
| 98 | 98 | { |
| 99 | 99 | clear_sars(); |
| 100 | 100 | |
| 101 | /* resolve callbacks */ |
| 102 | m_input_callback.bind_relative_to(*owner()); |
| 103 | |
| 101 | 104 | /* register for state saving */ |
| 102 | 105 | save_item( NAME(m_cs) ); |
| 103 | 106 | save_item( NAME(m_clk) ); |
| r29630 | r29631 | |
| 178 | 181 | int negative_channel = ADC083X_AGND; |
| 179 | 182 | double positive = 0; |
| 180 | 183 | double negative = 0; |
| 181 | | double gnd = m_input_callback( this, ADC083X_AGND ); |
| 182 | | double vref = m_input_callback( this, ADC083X_VREF ); |
| 184 | double gnd = m_input_callback(ADC083X_AGND); |
| 185 | double vref = m_input_callback(ADC083X_VREF); |
| 183 | 186 | |
| 184 | 187 | if( type() == ADC0831 ) |
| 185 | 188 | { |
| r29630 | r29631 | |
| 225 | 228 | |
| 226 | 229 | if( positive_channel != ADC083X_AGND ) |
| 227 | 230 | { |
| 228 | | positive = m_input_callback( this, positive_channel ) - gnd; |
| 231 | positive = m_input_callback(positive_channel) - gnd; |
| 229 | 232 | } |
| 230 | 233 | |
| 231 | 234 | if( negative_channel != ADC083X_AGND ) |
| 232 | 235 | { |
| 233 | | negative = m_input_callback( this, negative_channel ) - gnd; |
| 236 | negative = m_input_callback(negative_channel) - gnd; |
| 234 | 237 | } |
| 235 | 238 | |
| 236 | 239 | result = (int) ( ( ( positive - negative ) * 255 ) / vref ); |
trunk/src/emu/machine/adc083x.h
| r29630 | r29631 | |
| 15 | 15 | TYPE DEFINITIONS |
| 16 | 16 | ***************************************************************************/ |
| 17 | 17 | |
| 18 | | typedef double (*adc083x_input_callback)(device_t *device, UINT8 input); |
| 18 | typedef device_delegate<double (UINT8 input)> adc083x_input_delegate; |
| 19 | #define ADC083X_INPUT_CB(name) double name(UINT8 input) |
| 19 | 20 | |
| 20 | | #define MCFG_ADC083X_INPUT_CALLBACK(input_callback) \ |
| 21 | | adc083x_device::set_input_callback(*device, input_callback); |
| 21 | #define MCFG_ADC083X_INPUT_CB(_class, _method) \ |
| 22 | adc083x_device::set_input_callback(*device, adc083x_input_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); |
| 22 | 23 | |
| 23 | 24 | /*************************************************************************** |
| 24 | 25 | CONSTANTS |
| r29630 | r29631 | |
| 46 | 47 | adc083x_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); |
| 47 | 48 | |
| 48 | 49 | // static configuration helpers |
| 49 | | static void set_input_callback(device_t &device, adc083x_input_callback input_callback) { downcast<adc083x_device &>(device).m_input_callback = input_callback; } |
| 50 | static void set_input_callback(device_t &device, adc083x_input_delegate input_callback) { downcast<adc083x_device &>(device).m_input_callback = input_callback; } |
| 50 | 51 | |
| 51 | 52 | DECLARE_WRITE_LINE_MEMBER( cs_write ); |
| 52 | 53 | DECLARE_WRITE_LINE_MEMBER( clk_write ); |
| r29630 | r29631 | |
| 81 | 82 | INT32 m_bit; |
| 82 | 83 | INT32 m_output; |
| 83 | 84 | |
| 84 | | adc083x_input_callback m_input_callback; |
| 85 | adc083x_input_delegate m_input_callback; |
| 85 | 86 | }; |
| 86 | 87 | |
| 87 | 88 | class adc0831_device : public adc083x_device |