- int tm = (Pico32x.regs[0x30 / 2] & 0x0f00) >> 8;
- if (tm == 0)
- return; // TODO: verify
-
- if (new_line)
- Pico32x.pwm_irq_sample_cnt += pwm_line_samples;
- if (Pico32x.pwm_irq_sample_cnt >= (tm << 16)) {
- Pico32x.pwm_irq_sample_cnt -= tm << 16;
- Pico32x.sh2irqs |= P32XI_PWM;
- p32x_update_irls();
+ int tm, cnt, i;
+
+ if (PicoOpt & POPT_EN_PWM)
+ {
+ tm = (Pico32x.regs[0x30 / 2] & 0x0f00) >> 8;
+ if (tm != 0) {
+ if (line_call)
+ Pico32x.pwm_irq_sample_cnt += pwm_line_samples;
+ if (Pico32x.pwm_irq_sample_cnt >= (tm << 16)) {
+ Pico32x.pwm_irq_sample_cnt -= tm << 16;
+ Pico32x.sh2irqs |= P32XI_PWM;
+ p32x_update_irls(!line_call);
+ }
+ }
+ }
+
+ if (!line_call)
+ return;
+
+ for (i = 0; i < 2; i++) {
+ void *pregs = Pico32xMem->sh2_peri_regs[i];
+ if (PREG8(pregs, 0x80) & 0x20) { // TME
+ cnt = PREG8(pregs, 0x81);
+ cnt += timer_line_ticks[i];
+ if (cnt >= 0x100) {
+ int level = PREG8(pregs, 0xe3) >> 4;
+ int vector = PREG8(pregs, 0xe4) & 0x7f;
+ elprintf(EL_32X, "%csh2 WDT irq (%d, %d)", i ? 's' : 'm', level, vector);
+ sh2_internal_irq(&sh2s[i], level, vector);
+ }
+ cnt &= 0xff;
+ PREG8(pregs, 0x81) = cnt;
+ }