552
/***************************************************************************
553
INTERRUPT ENABLE AND VECTOR HELPERS
554
***************************************************************************/
556
/*-------------------------------------------------
557
interrupt_reset - reset the interrupt enable
559
-------------------------------------------------*/
561
static void interrupt_reset(running_machine &machine)
563
generic_machine_private *state = machine.generic_machine_data;
566
/* on a reset, enable all interrupts */
567
for (cpunum = 0; cpunum < ARRAY_LENGTH(state->interrupt_enable); cpunum++)
568
state->interrupt_enable[cpunum] = 1;
572
/*-------------------------------------------------
573
irq_pulse_clear - clear a "pulsed" IRQ line
574
-------------------------------------------------*/
576
static TIMER_CALLBACK( irq_pulse_clear )
578
device_t *device = (device_t *)ptr;
580
device_set_input_line(device, irqline, CLEAR_LINE);
584
/*-------------------------------------------------
585
generic_pulse_irq_line - "pulse" an IRQ line by
586
asserting it and then clearing it 1 cycle
588
-------------------------------------------------*/
590
void generic_pulse_irq_line(device_t *device, int irqline)
592
assert(irqline != INPUT_LINE_NMI && irqline != INPUT_LINE_RESET);
593
device_set_input_line(device, irqline, ASSERT_LINE);
595
cpu_device *cpudevice = downcast<cpu_device *>(device);
596
attotime target_time = cpudevice->local_time() + cpudevice->cycles_to_attotime(cpudevice->min_cycles());
597
device->machine().scheduler().timer_set(target_time - device->machine().time(), FUNC(irq_pulse_clear), irqline, (void *)device);
601
/*-------------------------------------------------
602
generic_pulse_irq_line_and_vector - "pulse" an
603
IRQ line by asserting it and then clearing it
604
1 cycle later, specifying a vector
605
-------------------------------------------------*/
607
void generic_pulse_irq_line_and_vector(device_t *device, int irqline, int vector)
609
assert(irqline != INPUT_LINE_NMI && irqline != INPUT_LINE_RESET);
610
device_set_input_line_and_vector(device, irqline, ASSERT_LINE, vector);
612
cpu_device *cpudevice = downcast<cpu_device *>(device);
613
attotime target_time = cpudevice->local_time() + cpudevice->cycles_to_attotime(cpudevice->min_cycles());
614
device->machine().scheduler().timer_set(target_time - device->machine().time(), FUNC(irq_pulse_clear), irqline, (void *)device);
619
/***************************************************************************
620
INTERRUPT GENERATION CALLBACK HELPERS
621
***************************************************************************/
623
/*-------------------------------------------------
625
-------------------------------------------------*/
627
INTERRUPT_GEN( nmi_line_pulse ) { if (interrupt_enabled(device)) device_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE); }
628
INTERRUPT_GEN( nmi_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, INPUT_LINE_NMI, ASSERT_LINE); }
631
/*-------------------------------------------------
633
-------------------------------------------------*/
635
INTERRUPT_GEN( irq0_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 0, HOLD_LINE); }
636
INTERRUPT_GEN( irq0_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 0); }
637
INTERRUPT_GEN( irq0_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 0, ASSERT_LINE); }
639
INTERRUPT_GEN( irq1_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 1, HOLD_LINE); }
640
INTERRUPT_GEN( irq1_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 1); }
641
INTERRUPT_GEN( irq1_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 1, ASSERT_LINE); }
643
INTERRUPT_GEN( irq2_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 2, HOLD_LINE); }
644
INTERRUPT_GEN( irq2_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 2); }
645
INTERRUPT_GEN( irq2_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 2, ASSERT_LINE); }
647
INTERRUPT_GEN( irq3_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 3, HOLD_LINE); }
648
INTERRUPT_GEN( irq3_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 3); }
649
INTERRUPT_GEN( irq3_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 3, ASSERT_LINE); }
651
INTERRUPT_GEN( irq4_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 4, HOLD_LINE); }
652
INTERRUPT_GEN( irq4_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 4); }
653
INTERRUPT_GEN( irq4_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 4, ASSERT_LINE); }
655
INTERRUPT_GEN( irq5_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 5, HOLD_LINE); }
656
INTERRUPT_GEN( irq5_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 5); }
657
INTERRUPT_GEN( irq5_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 5, ASSERT_LINE); }
659
INTERRUPT_GEN( irq6_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 6, HOLD_LINE); }
660
INTERRUPT_GEN( irq6_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 6); }
661
INTERRUPT_GEN( irq6_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 6, ASSERT_LINE); }
663
INTERRUPT_GEN( irq7_line_hold ) { if (interrupt_enabled(device)) device_set_input_line(device, 7, HOLD_LINE); }
664
INTERRUPT_GEN( irq7_line_pulse ) { if (interrupt_enabled(device)) generic_pulse_irq_line(device, 7); }
665
INTERRUPT_GEN( irq7_line_assert ) { if (interrupt_enabled(device)) device_set_input_line(device, 7, ASSERT_LINE); }
669
/***************************************************************************
670
WATCHDOG READ/WRITE HELPERS
671
***************************************************************************/
673
/*-------------------------------------------------
674
8-bit reset read/write handlers
675
-------------------------------------------------*/
677
WRITE8_HANDLER( watchdog_reset_w ) { watchdog_reset(space->machine()); }
678
READ8_HANDLER( watchdog_reset_r ) { watchdog_reset(space->machine()); return space->unmap(); }
680
WRITE8_MEMBER( driver_device::watchdog_reset_w ) { watchdog_reset(machine()); }
681
READ8_MEMBER( driver_device::watchdog_reset_r ) { watchdog_reset(machine()); return space.unmap(); }
684
/*-------------------------------------------------
685
16-bit reset read/write handlers
686
-------------------------------------------------*/
688
WRITE16_HANDLER( watchdog_reset16_w ) { watchdog_reset(space->machine()); }
689
READ16_HANDLER( watchdog_reset16_r ) { watchdog_reset(space->machine()); return space->unmap(); }
691
WRITE16_MEMBER( driver_device::watchdog_reset16_w ) { watchdog_reset(machine()); }
692
READ16_MEMBER( driver_device::watchdog_reset16_r ) { watchdog_reset(machine()); return space.unmap(); }
695
/*-------------------------------------------------
696
32-bit reset read/write handlers
697
-------------------------------------------------*/
699
WRITE32_HANDLER( watchdog_reset32_w ) { watchdog_reset(space->machine()); }
700
READ32_HANDLER( watchdog_reset32_r ) { watchdog_reset(space->machine()); return space->unmap(); }
702
WRITE32_MEMBER( driver_device::watchdog_reset32_w ) { watchdog_reset(machine()); }
703
READ32_MEMBER( driver_device::watchdog_reset32_r ) { watchdog_reset(machine()); return space.unmap(); }
707
517
/***************************************************************************
708
518
PORT READING HELPERS
715
525
repeated both in the upper and lower half
716
526
-------------------------------------------------*/
718
CUSTOM_INPUT( custom_port_read )
528
CUSTOM_INPUT_MEMBER( driver_device::custom_port_read )
720
530
const char *tag = (const char *)param;
721
return input_port_read(field.machine(), tag);
531
return ioport(tag)->read();
535
void generic_pulse_irq_line(device_t *device, int irqline, int cycles) { device->machine().driver_data()->generic_pulse_irq_line(device->execute(), irqline, cycles); }
536
void generic_pulse_irq_line_and_vector(device_t *device, int irqline, int vector, int cycles) { device->machine().driver_data()->generic_pulse_irq_line_and_vector(device->execute(), irqline, vector, cycles); }
538
INTERRUPT_GEN( nmi_line_pulse ) { device->machine().driver_data()->nmi_line_pulse(*device); }
539
INTERRUPT_GEN( nmi_line_assert ) { device->machine().driver_data()->nmi_line_assert(*device); }
541
INTERRUPT_GEN( irq0_line_hold ) { device->machine().driver_data()->irq0_line_hold(*device); }
542
INTERRUPT_GEN( irq0_line_pulse ) { device->machine().driver_data()->irq0_line_pulse(*device); }
543
INTERRUPT_GEN( irq0_line_assert ) { device->machine().driver_data()->irq0_line_assert(*device); }
545
INTERRUPT_GEN( irq1_line_hold ) { device->machine().driver_data()->irq1_line_hold(*device); }
546
INTERRUPT_GEN( irq1_line_pulse ) { device->machine().driver_data()->irq1_line_pulse(*device); }
547
INTERRUPT_GEN( irq1_line_assert ) { device->machine().driver_data()->irq1_line_assert(*device); }
549
INTERRUPT_GEN( irq2_line_hold ) { device->machine().driver_data()->irq2_line_hold(*device); }
550
INTERRUPT_GEN( irq2_line_pulse ) { device->machine().driver_data()->irq2_line_pulse(*device); }
551
INTERRUPT_GEN( irq2_line_assert ) { device->machine().driver_data()->irq2_line_assert(*device); }
553
INTERRUPT_GEN( irq3_line_hold ) { device->machine().driver_data()->irq3_line_hold(*device); }
554
INTERRUPT_GEN( irq3_line_pulse ) { device->machine().driver_data()->irq3_line_pulse(*device); }
555
INTERRUPT_GEN( irq3_line_assert ) { device->machine().driver_data()->irq3_line_assert(*device); }
557
INTERRUPT_GEN( irq4_line_hold ) { device->machine().driver_data()->irq4_line_hold(*device); }
558
INTERRUPT_GEN( irq4_line_pulse ) { device->machine().driver_data()->irq4_line_pulse(*device); }
559
INTERRUPT_GEN( irq4_line_assert ) { device->machine().driver_data()->irq4_line_assert(*device); }
561
INTERRUPT_GEN( irq5_line_hold ) { device->machine().driver_data()->irq5_line_hold(*device); }
562
INTERRUPT_GEN( irq5_line_pulse ) { device->machine().driver_data()->irq5_line_pulse(*device); }
563
INTERRUPT_GEN( irq5_line_assert ) { device->machine().driver_data()->irq5_line_assert(*device); }
565
INTERRUPT_GEN( irq6_line_hold ) { device->machine().driver_data()->irq6_line_hold(*device); }
566
INTERRUPT_GEN( irq6_line_pulse ) { device->machine().driver_data()->irq6_line_pulse(*device); }
567
INTERRUPT_GEN( irq6_line_assert ) { device->machine().driver_data()->irq6_line_assert(*device); }
569
INTERRUPT_GEN( irq7_line_hold ) { device->machine().driver_data()->irq7_line_hold(*device); }
570
INTERRUPT_GEN( irq7_line_pulse ) { device->machine().driver_data()->irq7_line_pulse(*device); }
571
INTERRUPT_GEN( irq7_line_assert ) { device->machine().driver_data()->irq7_line_assert(*device); }