void platform_interrupt(void) { uint8_t st0 = uart0_status; uint8_t st1 = uart1_status; uint8_t ts = timer_status; uint8_t d; if (ts & 0x80) timer_command = 0; /* Ack the timer */ if (st0 & 0x81) { uart0_status = st0 & 0xFC; if (st0 & 0x80) { /* RX data */ d = uart0_data; tty_inproc(1, d); } if (st0 & 0x01) /* TX idle */ tty_outproc(1); } if (st1 & 0x81) { uart1_status = st1 & 0xFC; if (st0 & 0x80) { /* RX data */ d = uart1_data; tty_inproc(2, d); } if (st1 & 0x01) /* TX idle */ tty_outproc(2); } if (ts & 0x80) timer_interrupt(); }
void tty_pollirq_sio1(void) { static uint8_t old_ca, old_cb; uint8_t ca, cb; uint8_t progress; /* Check for an interrupt */ SIOC_C = 0; if (!(SIOC_C & 2)) return; /* FIXME: need to process error/event interrupts as we can get spurious characters or lines on an unused SIO floating */ do { progress = 0; SIOC_C = 0; // read register 0 ca = SIOC_C; /* Input pending */ if ((ca & 1) && !fullq(&ttyinq[3])) { progress = 1; tty_inproc(3, SIOC_D); } /* Break */ if (ca & 2) SIOC_C = 2 << 5; /* Output pending */ if ((ca & 4) && (sleeping & 8)) { tty_outproc(3); sleeping &= ~8; SIOC_C = 5 << 3; // reg 0 CMD 5 - reset transmit interrupt pending } /* Carrier changed */ if ((ca ^ old_ca) & 8) { if (ca & 8) tty_carrier_raise(3); else tty_carrier_drop(3); } SIOD_C = 0; // read register 0 cb = SIOD_C; if ((cb & 1) && !fullq(&ttyinq[4])) { tty_inproc(4, SIOD_D); progress = 1; } if ((cb & 4) && (sleeping & 16)) { tty_outproc(4); sleeping &= ~16; SIOD_C = 5 << 3; // reg 0 CMD 5 - reset transmit interrupt pending } if ((cb ^ old_cb) & 8) { if (cb & 8) tty_carrier_raise(4); else tty_carrier_drop(4); } } while(progress); }
void tty_pollirq_acia(void) { uint8_t ca; ca = ACIA_C; if (ca & 1) { tty_inproc(1, ACIA_D); } if ((ca & 2) && sleeping) { tty_outproc(1); sleeping = 0; } }