diff options
Diffstat (limited to 'src/mame/drivers/dynax.cpp')
-rw-r--r-- | src/mame/drivers/dynax.cpp | 173 |
1 files changed, 63 insertions, 110 deletions
diff --git a/src/mame/drivers/dynax.cpp b/src/mame/drivers/dynax.cpp index c4bc96cc585..ede6a78500b 100644 --- a/src/mame/drivers/dynax.cpp +++ b/src/mame/drivers/dynax.cpp @@ -112,37 +112,27 @@ TODO: /* It runs in IM 0, thus needs an opcode on the data bus */ void dynax_state::sprtmtch_update_irq() { - int irq = (m_sound_irq ? 0x08 : 0) | ((m_vblank_irq) ? 0x10 : 0) | ((m_blitter_irq && m_blitter_irq_mask) ? 0x20 : 0) ; - m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ + m_mainirq->rst4_w(m_blitter_irq && m_blitter_irq_mask); } WRITE8_MEMBER(dynax_state::dynax_vblank_ack_w) { - m_vblank_irq = 0; - sprtmtch_update_irq(); + m_mainirq->rst2_w(0); } WRITE_LINE_MEMBER(dynax_state::blitter_ack_w) { m_blitter_irq_mask = state; - - // this must be acknowledged somewhere else if (!m_blitter_irq_mask) + { m_blitter_irq = 0; - - sprtmtch_update_irq(); + m_mainirq->rst4_w(0); + } } INTERRUPT_GEN_MEMBER(dynax_state::sprtmtch_vblank_interrupt) { - m_vblank_irq = 1; - sprtmtch_update_irq(); -} - -WRITE_LINE_MEMBER(dynax_state::sprtmtch_sound_callback) -{ - m_sound_irq = state; - sprtmtch_update_irq(); + m_mainirq->rst2_w(1); } @@ -153,42 +143,38 @@ WRITE_LINE_MEMBER(dynax_state::sprtmtch_sound_callback) /* It runs in IM 0, thus needs an opcode on the data bus */ void dynax_state::jantouki_update_irq() { - int irq = ((m_blitter_irq && m_blitter_irq_mask) ? 0x08 : 0) | ((m_blitter2_irq && m_blitter2_irq_mask) ? 0x10 : 0) | ((m_vblank_irq) ? 0x20 : 0) ; - m_maincpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ + m_mainirq->rst1_w(m_blitter_irq && m_blitter_irq_mask); + m_mainirq->rst2_w(m_blitter2_irq && m_blitter2_irq_mask); } WRITE8_MEMBER(dynax_state::jantouki_vblank_ack_w) { - m_vblank_irq = 0; - jantouki_update_irq(); + m_mainirq->rst4_w(0); } WRITE_LINE_MEMBER(dynax_state::jantouki_blitter_ack_w) { m_blitter_irq_mask = state; - - // this must be acknowledged somewhere else if (!m_blitter_irq_mask) + { m_blitter_irq = 0; - - jantouki_update_irq(); + m_mainirq->rst1_w(0); + } } WRITE_LINE_MEMBER(dynax_state::jantouki_blitter2_ack_w) { m_blitter2_irq_mask = state; - - // this must be acknowledged somewhere else if (!m_blitter2_irq_mask) + { m_blitter2_irq = 0; - - jantouki_update_irq(); + m_mainirq->rst2_w(0); + } } INTERRUPT_GEN_MEMBER(dynax_state::jantouki_vblank_interrupt) { - m_vblank_irq = 1; - jantouki_update_irq(); + m_mainirq->rst4_w(1); } @@ -196,28 +182,14 @@ INTERRUPT_GEN_MEMBER(dynax_state::jantouki_vblank_interrupt) Jantouki - Sound CPU ***************************************************************************/ -void dynax_state::jantouki_sound_update_irq() -{ - int irq = ((m_sound_irq) ? 0x08 : 0) | ((m_soundlatch_irq) ? 0x10 : 0) | ((m_sound_vblank_irq) ? 0x20 : 0) ; - m_soundcpu->set_input_line_and_vector(0, irq ? ASSERT_LINE : CLEAR_LINE, 0xc7 | irq); /* rst $xx */ -} - INTERRUPT_GEN_MEMBER(dynax_state::jantouki_sound_vblank_interrupt) { - m_sound_vblank_irq = 1; - jantouki_sound_update_irq(); + m_soundirq->rst4_w(1); } WRITE8_MEMBER(dynax_state::jantouki_sound_vblank_ack_w) { - m_sound_vblank_irq = 0; - jantouki_sound_update_irq(); -} - -WRITE_LINE_MEMBER(dynax_state::jantouki_sound_callback) -{ - m_sound_irq = state; - jantouki_sound_update_irq(); + m_soundirq->rst4_w(0); } @@ -879,16 +851,8 @@ ADDRESS_MAP_END READ8_MEMBER(dynax_state::jantouki_soundlatch_ack_r) { - return (m_soundlatch_ack) ? 0x80 : 0; -} - -WRITE8_MEMBER(dynax_state::jantouki_soundlatch_w) -{ - m_soundlatch_ack = 1; - m_soundlatch_full = 1; - m_soundlatch_irq = 1; - m_latch = data; - jantouki_sound_update_irq(); + machine().scheduler().synchronize(); + return m_soundlatch->pending_r() ? 0x80 : 0; } READ8_MEMBER(dynax_state::jantouki_blitter_busy_r) @@ -906,7 +870,7 @@ ADDRESS_MAP_START(dynax_state::jantouki_io_map) ADDRESS_MAP_GLOBAL_MASK(0xff) // AM_RANGE( 0x40, 0x41 ) AM_WRITENOP // CRT Controller AM_RANGE( 0x48, 0x48 ) AM_WRITE(jantouki_rombank_w) // BANK ROM Select - AM_RANGE( 0x49, 0x49 ) AM_WRITE(jantouki_soundlatch_w) // To Sound CPU + AM_RANGE( 0x49, 0x49 ) AM_DEVWRITE("soundlatch", generic_latch_8_device, write) // To Sound CPU AM_RANGE( 0x4a, 0x4a ) AM_READ(jantouki_soundlatch_ack_r) // Soundlatch status AM_RANGE( 0x4b, 0x4b ) AM_WRITE(dynax_blit2_dest_w) // Destination Layer 2 AM_RANGE( 0x4d, 0x4d ) AM_WRITE(dynax_blit_dest_w) // Destination Layer @@ -935,22 +899,9 @@ ADDRESS_MAP_END Jantouki - Sound CPU ***************************************************************************/ -WRITE8_MEMBER(dynax_state::jantouki_soundlatch_ack_w) -{ - m_soundlatch_ack = data; - m_soundlatch_irq = 0; - jantouki_sound_update_irq(); -} - -READ8_MEMBER(dynax_state::jantouki_soundlatch_r) -{ - m_soundlatch_full = 0; - return m_latch; -} - READ8_MEMBER(dynax_state::jantouki_soundlatch_status_r) { - return (m_soundlatch_full) ? 0 : 0x80; + return m_soundlatch->pending_r() ? 0 : 0x80; } ADDRESS_MAP_START(dynax_state::jantouki_sound_io_map) @@ -963,8 +914,8 @@ ADDRESS_MAP_START(dynax_state::jantouki_sound_io_map) AM_RANGE( 0x30, 0x30 ) AM_WRITE(adpcm_reset_w) // MSM5205 reset AM_RANGE( 0x40, 0x40 ) AM_WRITE(adpcm_data_w) // MSM5205 data AM_RANGE( 0x50, 0x50 ) AM_READ(jantouki_soundlatch_status_r) // Soundlatch status - AM_RANGE( 0x60, 0x60 ) AM_WRITE(jantouki_soundlatch_ack_w) // Soundlatch status - AM_RANGE( 0x70, 0x70 ) AM_READ(jantouki_soundlatch_r) // From Main CPU + AM_RANGE( 0x60, 0x60 ) AM_DEVWRITE("soundlatch", generic_latch_8_device, acknowledge_w) + AM_RANGE( 0x70, 0x70 ) AM_DEVREAD("soundlatch", generic_latch_8_device, read) // From Main CPU ADDRESS_MAP_END @@ -4094,14 +4045,10 @@ MACHINE_START_MEMBER(dynax_state,dynax) m_blitter_irq_mask = 1; m_blitter2_irq_mask = 1; - save_item(NAME(m_sound_irq)); - save_item(NAME(m_vblank_irq)); save_item(NAME(m_blitter_irq)); save_item(NAME(m_blitter_irq_mask)); save_item(NAME(m_blitter2_irq)); save_item(NAME(m_blitter2_irq_mask)); - save_item(NAME(m_soundlatch_irq)); - save_item(NAME(m_sound_vblank_irq)); save_item(NAME(m_input_sel)); save_item(NAME(m_dsw_sel)); @@ -4113,10 +4060,6 @@ MACHINE_START_MEMBER(dynax_state,dynax) save_item(NAME(m_resetkludge)); save_item(NAME(m_toggle)); save_item(NAME(m_toggle_cpu1)); - save_item(NAME(m_yarunara_clk_toggle)); - save_item(NAME(m_soundlatch_ack)); - save_item(NAME(m_soundlatch_full)); - save_item(NAME(m_latch)); save_item(NAME(m_rombank)); save_item(NAME(m_tenkai_p5_val)); save_item(NAME(m_tenkai_6c)); @@ -4130,12 +4073,8 @@ MACHINE_RESET_MEMBER(dynax_state,dynax) if (m_msm != nullptr) MACHINE_RESET_CALL_MEMBER(adpcm); - m_sound_irq = 0; - m_vblank_irq = 0; m_blitter_irq = 0; m_blitter2_irq = 0; - m_soundlatch_irq = 0; - m_sound_vblank_irq = 0; m_input_sel = 0; m_dsw_sel = 0; @@ -4147,10 +4086,6 @@ MACHINE_RESET_MEMBER(dynax_state,dynax) m_resetkludge = 0; m_toggle = 0; m_toggle_cpu1 = 0; - m_yarunara_clk_toggle = 0; - m_soundlatch_ack = 0; - m_soundlatch_full = 0; - m_latch = 0; m_rombank = 0; m_tenkai_p5_val = 0; m_tenkai_6c = 0; @@ -4188,15 +4123,19 @@ MACHINE_CONFIG_START(dynax_state::cdracula) MCFG_CPU_PROGRAM_MAP(cdracula_mem_map) MCFG_CPU_IO_MAP(cdracula_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) MCFG_MACHINE_START_OVERRIDE(dynax_state,dynax) MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) // MCFG_NVRAM_ADD_0FILL("nvram") // no battery + MCFG_DEVICE_ADD("mainirq", RST_POS_BUFFER, 0) + MCFG_RST_BUFFER_INT_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_DEVICE_ADD("mainlatch", LS259, 0) MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(dynax_state, flipscreen_w)) // Flip Screen - MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(dynax_state, jantouki_blitter_ack_w)) // Blitter IRQ Ack + MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(dynax_state, blitter_ack_w)) // Blitter IRQ Ack MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(dynax_state, blit_palbank_w)) // Layers Palettes (High Bit) /* video hardware */ @@ -4232,12 +4171,16 @@ MACHINE_CONFIG_START(dynax_state::hanamai) MCFG_CPU_PROGRAM_MAP(sprtmtch_mem_map) MCFG_CPU_IO_MAP(hanamai_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) MCFG_MACHINE_START_OVERRIDE(dynax_state,hanamai) MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_DEVICE_ADD("mainirq", RST_POS_BUFFER, 0) + MCFG_RST_BUFFER_INT_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_DEVICE_ADD("mainlatch", LS259, 0) MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(DEVWRITELINE("msm", msm5205_device, reset_w)) MCFG_DEVCB_INVERT // MSM5205 reset MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(dynax_state, adpcm_reset_kludge_w)) @@ -4269,7 +4212,7 @@ MACHINE_CONFIG_START(dynax_state::hanamai) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) MCFG_SOUND_ADD("ym2203", YM2203, 22000000 / 8) - MCFG_YM2203_IRQ_HANDLER(WRITELINE(dynax_state, sprtmtch_sound_callback)) + MCFG_YM2203_IRQ_HANDLER(DEVWRITELINE("mainirq", rst_pos_buffer_device, rst1_w)) MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW1")) MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW0")) MCFG_SOUND_ROUTE(0, "mono", 0.20) @@ -4296,6 +4239,7 @@ MACHINE_CONFIG_START(dynax_state::hnoridur) MCFG_CPU_PROGRAM_MAP(hnoridur_mem_map) MCFG_CPU_IO_MAP(hnoridur_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) MCFG_MACHINE_START_OVERRIDE(dynax_state,dynax) MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) @@ -4308,6 +4252,9 @@ MACHINE_CONFIG_START(dynax_state::hnoridur) MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_DEVICE_ADD("mainirq", RST_POS_BUFFER, 0) + MCFG_RST_BUFFER_INT_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_DEVICE_ADD("mainlatch", LS259, 0) // IC25 MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(dynax_state, flipscreen_w)) MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(dynax_state, layer_half_w)) @@ -4359,6 +4306,7 @@ MACHINE_CONFIG_START(dynax_state::hjingi) MCFG_CPU_PROGRAM_MAP(hjingi_mem_map) MCFG_CPU_IO_MAP(hjingi_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) MCFG_MACHINE_START_OVERRIDE(dynax_state,hjingi) MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) @@ -4371,6 +4319,9 @@ MACHINE_CONFIG_START(dynax_state::hjingi) MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_DEVICE_ADD("mainirq", RST_POS_BUFFER, 0) + MCFG_RST_BUFFER_INT_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_DEVICE_ADD("mainlatch", LS259, 0) MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(dynax_state, flipscreen_w)) MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(dynax_state, layer_half_w)) @@ -4424,12 +4375,16 @@ MACHINE_CONFIG_START(dynax_state::sprtmtch) MCFG_CPU_PROGRAM_MAP(sprtmtch_mem_map) MCFG_CPU_IO_MAP(sprtmtch_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", dynax_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) MCFG_MACHINE_START_OVERRIDE(dynax_state,hanamai) MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_DEVICE_ADD("mainirq", RST_POS_BUFFER, 0) + MCFG_RST_BUFFER_INT_CALLBACK(INPUTLINE("maincpu", 0)) + MCFG_DEVICE_ADD("mainlatch", LS259, 0) // UF12 on Intergirl MCFG_ADDRESSABLE_LATCH_Q1_OUT_CB(WRITELINE(dynax_state, flipscreen_w)) MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(dynax_state, coincounter_0_w)) @@ -4455,7 +4410,7 @@ MACHINE_CONFIG_START(dynax_state::sprtmtch) MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SOUND_ADD("ym2203", YM2203, 22000000 / 8) - MCFG_YM2203_IRQ_HANDLER(WRITELINE(dynax_state, sprtmtch_sound_callback)) + MCFG_YM2203_IRQ_HANDLER(DEVWRITELINE("mainirq", rst_pos_buffer_device, rst1_w)) MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSW0")) MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSW1")) MCFG_SOUND_ROUTE(0, "mono", 0.20) @@ -4531,22 +4486,6 @@ MACHINE_CONFIG_END Yarunara / Quiz TV Q&Q / Mahjong Angels ***************************************************************************/ -/* the old code here didn't work.. - what was it trying to do? - set an irq and clear it before its even taken? */ - -INTERRUPT_GEN_MEMBER(dynax_state::yarunara_clock_interrupt) -{ - m_yarunara_clk_toggle ^= 1; - - if (m_yarunara_clk_toggle == 1) - m_sound_irq = 0; - else - m_sound_irq = 1; - - sprtmtch_update_irq(); -} - MACHINE_CONFIG_START(dynax_state::yarunara) hnoridur(config); @@ -4554,7 +4493,6 @@ MACHINE_CONFIG_START(dynax_state::yarunara) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(yarunara_mem_map) MCFG_CPU_IO_MAP(yarunara_io_map) - MCFG_CPU_PERIODIC_INT_DRIVER(dynax_state, yarunara_clock_interrupt, 60) // RTC MCFG_DEVICE_MODIFY("bankdev") MCFG_DEVICE_PROGRAM_MAP(yarunara_banked_map) @@ -4568,6 +4506,7 @@ MACHINE_CONFIG_START(dynax_state::yarunara) /* devices */ MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768)) + MCFG_MSM6242_OUT_INT_HANDLER(DEVWRITELINE("mainirq", rst_pos_buffer_device, rst1_w)) MACHINE_CONFIG_END MACHINE_CONFIG_START(dynax_state::mjangels) @@ -4640,17 +4579,25 @@ MACHINE_CONFIG_START(dynax_state::jantouki) MCFG_CPU_PROGRAM_MAP(jantouki_mem_map) MCFG_CPU_IO_MAP(jantouki_io_map) MCFG_CPU_VBLANK_INT_DRIVER("top", dynax_state, jantouki_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) MCFG_CPU_ADD("soundcpu",Z80,22000000 / 4) /* 5.5MHz */ MCFG_CPU_PROGRAM_MAP(jantouki_sound_mem_map) MCFG_CPU_IO_MAP(jantouki_sound_io_map) MCFG_CPU_VBLANK_INT_DRIVER("top", dynax_state, jantouki_sound_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("soundirq", rst_pos_buffer_device, inta_cb) MCFG_MACHINE_START_OVERRIDE(dynax_state,jantouki) MCFG_MACHINE_RESET_OVERRIDE(dynax_state,dynax) MCFG_NVRAM_ADD_0FILL("nvram") + MCFG_DEVICE_ADD("mainirq", RST_POS_BUFFER, 0) + MCFG_RST_BUFFER_INT_CALLBACK(INPUTLINE("maincpu", 0)) + + MCFG_DEVICE_ADD("soundirq", RST_POS_BUFFER, 0) + MCFG_RST_BUFFER_INT_CALLBACK(INPUTLINE("soundcpu", 0)) + MCFG_DEVICE_ADD("mainlatch", LS259, 0) MCFG_ADDRESSABLE_LATCH_Q0_OUT_CB(WRITELINE(dynax_state, coincounter_0_w)) // Coin Counter MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(dynax_state, blit2_palbank_w)) // Layers Palettes (High Bit) @@ -4658,6 +4605,10 @@ MACHINE_CONFIG_START(dynax_state::jantouki) MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(dynax_state, jantouki_blitter_ack_w)) // Blitter IRQ Ack MCFG_ADDRESSABLE_LATCH_Q7_OUT_CB(WRITELINE(dynax_state, jantouki_blitter2_ack_w)) // Blitter 2 IRQ Ack + MCFG_GENERIC_LATCH_8_ADD("soundlatch") + MCFG_GENERIC_LATCH_DATA_PENDING_CB(DEVWRITELINE("soundirq", rst_pos_buffer_device, rst2_w)) + MCFG_GENERIC_LATCH_SEPARATE_ACKNOWLEDGE(true) + /* video hardware */ MCFG_PALETTE_ADD("palette", 512) MCFG_PALETTE_INIT_OWNER(dynax_state,sprtmtch) // static palette @@ -4688,7 +4639,7 @@ MACHINE_CONFIG_START(dynax_state::jantouki) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.20) MCFG_SOUND_ADD("ym2203", YM2203, 22000000 / 8) - MCFG_YM2203_IRQ_HANDLER(WRITELINE(dynax_state, jantouki_sound_callback)) + MCFG_YM2203_IRQ_HANDLER(DEVWRITELINE("soundirq", rst_pos_buffer_device, rst1_w)) MCFG_SOUND_ROUTE(0, "mono", 0.20) MCFG_SOUND_ROUTE(1, "mono", 0.20) MCFG_SOUND_ROUTE(2, "mono", 0.20) @@ -4742,6 +4693,8 @@ MACHINE_CONFIG_START(dynax_state::mjelctrn) MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(dynax_state, layer_half2_w)) // Q3, Q4 seem to be related to wrap around enable + MCFG_DEVICE_REMOVE("mainirq") + MCFG_SCREEN_MODIFY("screen") MCFG_SCREEN_VBLANK_CALLBACK(DEVWRITELINE("maincpu", tmpz84c015_device, trg0)) MCFG_DEVCB_INVERT |