Previous 199869 Revisions Next

r19201 Wednesday 28th November, 2012 at 18:24:27 UTC by Angelo Salese
(MESS) fixed various bugs with Acorn Archimedes IRQs [Angelo Salese]
[src/mame/drivers]ertictac.c
[src/mame/machine]archimds.c

trunk/src/mame/drivers/ertictac.c
r19200r19201
4545
4646READ32_MEMBER(ertictac_state::ertictac_podule_r)
4747{
48   m_ioc_regs[IRQ_STATUS_B] &= ~ARCHIMEDES_IRQB_PODULE_IRQ;
48   archimedes_clear_irq_b(ARCHIMEDES_IRQB_PODULE_IRQ);
4949
5050   switch(offset)
5151   {
trunk/src/mame/machine/archimds.c
r19200r19201
4444{
4545   m_ioc_regs[IRQ_STATUS_A] |= mask;
4646
47   if (m_ioc_regs[IRQ_MASK_A] & mask)
48   {
47   if (m_ioc_regs[IRQ_STATUS_A] & m_ioc_regs[IRQ_MASK_A])
4948      machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, ASSERT_LINE);
50   }
49
50   if ((m_ioc_regs[IRQ_STATUS_A] & m_ioc_regs[IRQ_MASK_A]) == 0)
51      machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
52
5153}
5254
5355void archimedes_state::archimedes_request_irq_b(int mask)
5456{
5557   m_ioc_regs[IRQ_STATUS_B] |= mask;
5658
57   if (m_ioc_regs[IRQ_MASK_B] & mask)
59   if (m_ioc_regs[IRQ_STATUS_B] & m_ioc_regs[IRQ_MASK_B])
5860   {
5961      generic_pulse_irq_line(machine().device("maincpu")->execute(), ARM_IRQ_LINE, 1);
6062   }
r19200r19201
6466{
6567   m_ioc_regs[FIQ_STATUS] |= mask;
6668
67   if (m_ioc_regs[FIQ_MASK] & mask)
69   if (m_ioc_regs[FIQ_STATUS] & m_ioc_regs[FIQ_MASK])
6870   {
6971      generic_pulse_irq_line(machine().device("maincpu")->execute(), ARM_FIRQ_LINE, 1);
7072   }
r19200r19201
7880void archimedes_state::archimedes_clear_irq_b(int mask)
7981{
8082   m_ioc_regs[IRQ_STATUS_B] &= ~mask;
83   archimedes_request_irq_b(0);
8184}
8285
8386void archimedes_state::archimedes_clear_fiq(int mask)
8487{
8588   m_ioc_regs[FIQ_STATUS] &= ~mask;
89   archimedes_request_fiq(0);
8690}
8791
8892void archimedes_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
r19200r19201
533537      case IRQ_MASK_A:
534538         m_ioc_regs[IRQ_MASK_A] = data & 0xff;
535539
536         if(data & 0x80) //force an IRQ
537            archimedes_request_irq_a(ARCHIMEDES_IRQA_FORCE);
540         /* bit 7 forces an IRQ trap */
541         archimedes_request_irq_a((data & 0x80) ? ARCHIMEDES_IRQA_FORCE : 0);
538542
539543         if(data & 0x08) //set up the VBLANK timer
540544            m_vbl_timer->adjust(machine().primary_screen->time_until_pos(m_vidc_regs[0xb4]));
541545
542546         break;
543547
548      case IRQ_MASK_B:
549         m_ioc_regs[IRQ_MASK_B] = data & 0xff;
550
551         archimedes_request_irq_b(0);
552         break;
553
544554      case FIQ_MASK:
545555         m_ioc_regs[FIQ_MASK] = data & 0xff;
546556
547         if(data & 0x80) //force a FIRQ
548            archimedes_request_fiq(ARCHIMEDES_FIQ_FORCE);
549
557          /* bit 7 forces a FIRQ trap */
558         archimedes_request_fiq((data & 0x80) ? ARCHIMEDES_FIQ_FORCE : 0);
550559         break;
551560
552561      case IRQ_REQUEST_A:    // IRQ clear A
553562         m_ioc_regs[IRQ_STATUS_A] &= ~(data&0xff);
554563
555         // if that did it, clear the IRQ
556         //if (ioc_regs[IRQ_STATUS_A] == 0)
557         {
558            //printf("IRQ clear A\n");
559            machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, CLEAR_LINE);
560         }
564         // check pending irqs
565         archimedes_request_irq_a(0);
561566         break;
562567
563568      case T0_LATCH_LO:
r19200r19201
929934
930935         case 4:   /* sound start */
931936            //logerror("MEMC: SNDSTART %08x\n",data);
937            archimedes_clear_irq_b(ARCHIMEDES_IRQB_SOUND_EMPTY);
932938            m_vidc_sndstart = 0x2000000 | ((data>>2)&0x7fff)*16;
933            m_ioc_regs[IRQ_STATUS_B] &= ~ARCHIMEDES_IRQB_SOUND_EMPTY;
934939            break;
935940
936941         case 5: /* sound end */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team