void bml3bus_device::set_irq_line(int state) { m_out_irq_func(state); }
void a2eauxslot_device::set_irq_line(int state) { m_out_irq_func(state); }
void mc146818_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { int year/*, month*/; if (id == TIMER_PERIODIC) { m_data[0x0c] |= 0xc0; if (!m_out_irq_func.isnull()) m_out_irq_func(CLEAR_LINE); return; } if (BCD_MODE) { m_data[0]=bcd_adjust(m_data[0]+1); if (m_data[0]>=0x60) { m_data[0]=0; m_data[2]=bcd_adjust(m_data[2]+1); if (m_data[2]>=0x60) { m_data[2]=0; m_data[4]=bcd_adjust(m_data[4]+1); // different handling of hours if (m_data[4]>=0x24) { m_data[4]=0; WEEK_DAY=bcd_adjust(WEEK_DAY+1)%7; DAY=bcd_adjust(DAY+1); //month=bcd_2_dec(MONTH); year=bcd_2_dec(YEAR); if (m_type!=MC146818_IGNORE_CENTURY) year+=bcd_2_dec(CENTURY)*100; else year+=2000; // save for julian_days_in_month calculation DAY=bcd_adjust(DAY+1); if (DAY>gregorian_days_in_month(MONTH, year)) { DAY=1; MONTH=bcd_adjust(MONTH+1); if (MONTH>0x12) { MONTH=1; YEAR=year=bcd_adjust(YEAR+1); if (m_type!=MC146818_IGNORE_CENTURY) { if (year>=0x100) { CENTURY=bcd_adjust(CENTURY+1); } } } } } } } } else { m_data[0]=m_data[0]+1; if (m_data[0]>=60) { m_data[0]=0; m_data[2]=m_data[2]+1; if (m_data[2]>=60) { m_data[2]=0; m_data[4]=m_data[4]+1; // different handling of hours //? if (m_data[4]>=24) { m_data[4]=0; WEEK_DAY=(WEEK_DAY+1)%7; year=YEAR; if (m_type!=MC146818_IGNORE_CENTURY) year+=CENTURY*100; else year+=2000; // save for julian_days_in_month calculation if (++DAY>gregorian_days_in_month(MONTH, year)) { DAY=1; if (++MONTH>12) { MONTH=1; YEAR++; if (m_type!=MC146818_IGNORE_CENTURY) { if (YEAR>=100) { CENTURY++;YEAR=0; } } else { YEAR%=100; } } } } } } } if (m_data[1] == m_data[0] && // m_data[3] == m_data[2] && // m_data[5] == m_data[4]) { // set the alarm interrupt flag AF m_data[0x0c] |= 0x20; } else { // clear the alarm interrupt flag AF m_data[0x0c] &= ~0x20; if ((m_data[0x0c] & 0x70) == 0) { // clear IRQF m_data[0x0c] &= ~0x80; } } // set the update-ended interrupt Flag UF m_data[0x0c] |= 0x10; // set the interrupt request flag IRQF // FIXME: should throw IRQ line as well if ((m_data[0x0b] & m_data[0x0c] & 0x30) != 0) { m_data[0x0c] |= 0x80; } // IRQ line is active low if (!m_out_irq_func.isnull()) m_out_irq_func((m_data[0x0c] & 0x80) ? CLEAR_LINE : ASSERT_LINE); m_updated = true; /* clock has been updated */ m_last_refresh = machine().time(); }