From 77aaf2377613b66612dc15dd126d0d61414afd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felipe=20Corr=C3=AAa=20da=20Silva=20Sanches?= Date: Sun, 1 Nov 2020 07:59:35 -0300 Subject: [PATCH] -avr8: Fixed crash with pensebem / timer1 crash. [Felipe Sanches] --- src/devices/cpu/avr8/avr8.cpp | 124 +++++++++++++++++----------------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/src/devices/cpu/avr8/avr8.cpp b/src/devices/cpu/avr8/avr8.cpp index b98f2ec9bf1..b87ed6d0631 100644 --- a/src/devices/cpu/avr8/avr8.cpp +++ b/src/devices/cpu/avr8/avr8.cpp @@ -1430,7 +1430,7 @@ inline void avr8_device::timer1_tick() if (m_timer1_count == m_ocr1[reg]) { - if (reg == 0) + if (reg == AVR8_REG_A) { m_timer1_count = 0; increment = 0; @@ -1442,58 +1442,10 @@ inline void avr8_device::timer1_tick() break; case 1: /* Toggle OC1A on compare match */ - if (reg == 0) + if (reg == AVR8_REG_A) { LOGMASKED(LOG_TIMER1, "%s: timer1: Toggle OC1%c on match\n", machine().describe_context()); - write_gpio(AVR8_IO_PORTB, read_gpio(AVR8_REGIDX_PORTB) ^ (2 << reg)); - } - break; - - case 2: /* Clear OC1A/B on compare match */ - LOGMASKED(LOG_TIMER1, "%s: timer1: Clear OC1%c on match\n", machine().describe_context(), reg ? 'B' : 'A'); - write_gpio(AVR8_IO_PORTB, read_gpio(AVR8_REGIDX_PORTB) & ~(2 << reg)); - break; - - case 3: /* Set OC1A/B on compare match */ - LOGMASKED(LOG_TIMER1, "%s: timer1: Set OC1%c on match\n", machine().describe_context(), reg ? 'B' : 'A'); - write_gpio(AVR8_IO_PORTB, read_gpio(AVR8_REGIDX_PORTB) | (2 << reg)); - break; - } - - m_r[AVR8_REGIDX_TIFR1] |= s_ocf1[reg]; - update_interrupt(s_int1[reg]); - } - else if (m_timer1_count == 0) - { - if (reg == 0) - { - m_r[AVR8_REGIDX_TIFR1] &= ~AVR8_TIFR1_TOV1_MASK; - update_interrupt(AVR8_INTIDX_TOV1); - } - } - break; - - case WGM1_FAST_PWM_OCR: - if (m_timer1_count == m_ocr1[reg]) - { - if (reg == 0) - { - m_r[AVR8_REGIDX_TIFR1] |= AVR8_TIFR1_TOV1_MASK; - update_interrupt(AVR8_INTIDX_TOV1); - m_timer1_count = 0; - increment = 0; - } - - switch (m_timer1_compare_mode[reg] & 3) - { - case 0: /* Normal Operation; OC1A/B disconnected */ - break; - - case 1: /* Toggle OC1A on compare match */ - if (reg == 0) - { - LOGMASKED(LOG_TIMER1, "%s: timer1: Toggle OC1%c on match\n", machine().describe_context()); - write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ (2 << reg)); + write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ 2); } break; @@ -1513,7 +1465,55 @@ inline void avr8_device::timer1_tick() } else if (m_timer1_count == 0) { - if (reg == 0) + if (reg == AVR8_REG_A) + { + m_r[AVR8_REGIDX_TIFR1] &= ~AVR8_TIFR1_TOV1_MASK; + update_interrupt(AVR8_INTIDX_TOV1); + } + } + break; + + case WGM1_FAST_PWM_OCR: + if (m_timer1_count == m_ocr1[reg]) + { + if (reg == AVR8_REG_A) + { + m_r[AVR8_REGIDX_TIFR1] |= AVR8_TIFR1_TOV1_MASK; + update_interrupt(AVR8_INTIDX_TOV1); + m_timer1_count = 0; + increment = 0; + } + + switch (m_timer1_compare_mode[reg] & 3) + { + case 0: /* Normal Operation; OC1A/B disconnected */ + break; + + case 1: /* Toggle OC1A on compare match */ + if (reg == AVR8_REG_A) + { + LOGMASKED(LOG_TIMER1, "%s: timer1: Toggle OC1%c on match\n", machine().describe_context()); + write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ 2); + } + break; + + case 2: /* Clear OC1A/B on compare match */ + LOGMASKED(LOG_TIMER1, "%s: timer1: Clear OC1%c on match\n", machine().describe_context(), reg ? 'B' : 'A'); + write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] & ~(2 << reg)); + break; + + case 3: /* Set OC1A/B on compare match */ + LOGMASKED(LOG_TIMER1, "%s: timer1: Set OC1%c on match\n", machine().describe_context(), reg ? 'B' : 'A'); + write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] | (2 << reg)); + break; + } + + m_r[AVR8_REGIDX_TIFR1] |= s_ocf1[reg]; + update_interrupt(s_int1[reg]); + } + else if (m_timer1_count == 0) + { + if (reg == AVR8_REG_A) { m_r[AVR8_REGIDX_TIFR1] &= ~AVR8_TIFR1_TOV1_MASK; update_interrupt(AVR8_INTIDX_TOV1); @@ -1525,10 +1525,10 @@ inline void avr8_device::timer1_tick() break; case 1: /* Toggle OC1A at BOTTOM*/ - if (reg == 0) + if (reg == AVR8_REG_A) { LOGMASKED(LOG_TIMER1, "%s: timer1: Toggle OC1A at BOTTOM\n", machine().describe_context()); - write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ (2 << reg)); + write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ 2); } break; @@ -1554,10 +1554,10 @@ inline void avr8_device::timer1_tick() break; case 1: /* Toggle OC1A on compare match */ - if (reg == 0) + if (reg == AVR8_REG_A) { LOGMASKED(LOG_TIMER1, "%s: timer1: Toggle OC1%c on match\n", machine().describe_context()); - write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ (2 << reg)); + write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ 2); } break; @@ -1577,7 +1577,7 @@ inline void avr8_device::timer1_tick() } else if (m_timer1_count == 0) { - if (reg == 0) + if (reg == AVR8_REG_A) { m_r[AVR8_REGIDX_TIFR1] &= ~AVR8_TIFR1_TOV1_MASK; update_interrupt(AVR8_INTIDX_TOV1); @@ -1589,10 +1589,10 @@ inline void avr8_device::timer1_tick() break; case 1: /* Toggle OC1A at BOTTOM*/ - if (reg == 0) + if (reg == AVR8_REG_A) { LOGMASKED(LOG_TIMER1, "%s: timer1: Toggle OC1A at BOTTOM\n", machine().describe_context()); - write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ (2 << reg)); + write_gpio(AVR8_IO_PORTB, m_r[AVR8_REGIDX_PORTB] ^ 2); } break; @@ -1790,7 +1790,7 @@ void avr8_device::timer2_tick() break; case WGM02_FAST_PWM: - if (reg == 0) + if (reg == AVR8_REG_A) { if (count >= m_r[AVR8_REGIDX_OCR2A]) { @@ -1817,7 +1817,7 @@ void avr8_device::timer2_tick() case WGM02_FAST_PWM_CMP: if (count == ocr2[reg]) { - if (reg == 0) + if (reg == AVR8_REG_A) { m_r[AVR8_REGIDX_TIFR2] |= AVR8_TIFR2_TOV2_MASK; count = 0; @@ -1828,7 +1828,7 @@ void avr8_device::timer2_tick() } else if (count == 0) { - if (reg == 0) + if (reg == AVR8_REG_A) { m_r[AVR8_REGIDX_TIFR2] &= ~AVR8_TIFR2_TOV2_MASK; }