/* Update the Pending Register. This will trigger an interrupt if a bit is * set. */ static void stm32_exti_change_EXTI_PR_bit(Stm32Exti *s, unsigned pos, unsigned new_bit_value) { unsigned old_bit_value; assert((new_bit_value == 0) || (new_bit_value == 1)); assert(pos < EXTI_LINE_COUNT); old_bit_value = GET_BIT_VALUE(s->EXTI_PR, pos); /* Only continue if the PR bit is actually changing value. */ if(new_bit_value != old_bit_value) { /* If the bit is being reset, the corresponding Software Interrupt Event * Register bit is automatically reset. */ if(!new_bit_value) { RESET_BIT(s->EXTI_SWIER, pos); } /* Update the IRQ for this EXTI line. Some lines share the same * NVIC IRQ. */ if(pos <= 4) { /* EXTI0 - EXTI4 each have their own NVIC IRQ */ qemu_set_irq(s->irq[pos], new_bit_value); } else if(pos <= 9) { /* EXTI5 - EXTI9 share an NVIC IRQ */ qemu_set_irq(s->irq[5], new_bit_value); } else if(pos <= 15) { /* EXTI10 - EXTI15 share an NVIC IRQ */ qemu_set_irq(s->irq[6], new_bit_value); } else if(pos == 16) { /* PVD IRQ */ qemu_set_irq(s->irq[7], new_bit_value); } else if(pos == 17) { /* RTCAlarm IRQ */ qemu_set_irq(s->irq[8], new_bit_value); } else if(pos == 18) { /* OTG_FS_WKUP IRQ */ qemu_set_irq(s->irq[9], new_bit_value); } else if(pos == 19) { /* ETH_WKUP IRQ */ qemu_set_irq(s->irq[10], new_bit_value); } else if(pos == 20) { /* OTG_HS_WKUP IRQ */ qemu_set_irq(s->irq[11], new_bit_value); } else if(pos == 21) { /* TAMP_STAMP IRQ */ qemu_set_irq(s->irq[12], new_bit_value); } else if(pos == 22) { /* RTC_WKUP IRQ */ qemu_set_irq(s->irq[13], new_bit_value); } else { assert(false); } /* Update the register. */ CHANGE_BIT(s->EXTI_PR, pos, new_bit_value); } }
/* Update a Trigger Selection Register (both the Rising and Falling TSR * registers are handled by this routine). */ static void update_TSR_bit(Stm32Exti *s, uint32_t *tsr_register, unsigned pos, unsigned new_bit_value) { assert((new_bit_value == 0) || (new_bit_value == 1)); assert(pos < EXTI_LINE_COUNT); if(new_bit_value != GET_BIT_VALUE(*tsr_register, pos)) { /* According to the documentation, the Pending register is cleared when * the "sensitivity of the edge detector changes. Is this right??? */ stm32_exti_change_EXTI_PR_bit(s, pos, 0); } CHANGE_BIT(*tsr_register, pos, new_bit_value); }
static void set_mode(byte on_off) { dat i; for (i=0; i<=nPar; i++) /* DEC private modes set/reset */ if (DState & ESques) switch (Par[i]) { case 1: /* Cursor keys send ^[Ox/^[[x */ CHANGE_BIT(TTY_ALTCURSKEYS, on_off); *Flags |= TTY_NEEDREFOCUS; break; case 3: /* 80/132 mode switch unimplemented */ break; case 5: /* Inverted screen on/off */ CHANGE_BIT(TTY_INVERTSCR, on_off); update_eff(); invert_screen(); break; case 6: /* Origin relative/absolute */ CHANGE_BIT(TTY_RELORIG, on_off); goto_axy(0,0); break; case 7: /* Autowrap on/off */ CHANGE_BIT(TTY_AUTOWRAP, on_off); break; case 8: /* Autorepeat on/off */ break; case 9: /* new style */ CHANGE_BIT(TTY_REPORTMOUSE, on_off); CHANGE_BIT(TTY_REPORTMOUSE2, tfalse); Act(ChangeField,Win) (Win, TWS_window_Attrib, WINDOW_WANT_MOUSE_MOTION|WINDOW_WANT_MOUSE, on_off ? WINDOW_WANT_MOUSE : 0); break; case 25: /* Cursor on/off */ Act(ChangeField,Win) (Win, TWS_window_Flags, WINDOWFL_CURSOR_ON, on_off ? WINDOWFL_CURSOR_ON : 0); *Flags |= TTY_UPDATECURSOR; break; case 999: /* new style, report also motions */ CHANGE_BIT(TTY_REPORTMOUSE, on_off); CHANGE_BIT(TTY_REPORTMOUSE2, on_off); Act(ChangeField,Win) (Win, TWS_window_Attrib, WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION, on_off ? WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION : 0); break; case 1000: /* classic xterm style */ CHANGE_BIT(TTY_REPORTMOUSE, tfalse); CHANGE_BIT(TTY_REPORTMOUSE2, on_off); Act(ChangeField,Win) (Win, TWS_window_Attrib, WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION, on_off ? WINDOW_WANT_MOUSE|WINDOW_WANT_MOUSE_MOTION : 0); break; /* ANSI modes set/reset */ } else switch (Par[i]) { case 3: /* Monitor (display ctrls) */ CHANGE_BIT(TTY_DISPCTRL, on_off); break; case 4: /* Insert Mode on/off */ CHANGE_BIT(TTY_INSERT, on_off); break; case 20: /* Lf, Enter == CrLf/Lf */ CHANGE_BIT(TTY_CRLF, on_off); break; } }