示例#1
0
文件: main.c 项目: StevenSunzh/FUZIX
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();
}
示例#2
0
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);
}
示例#3
0
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;
	}
}