//--------------------------------------------------------------------------- // Serial Port //--------------------------------------------------------------------------- void agenda_serial_replace(int) { if (UpdateBaud) RS232_CalculateBaud(bool(mfp_reg[MFPR_UCR] & BIT_7),mfp_get_timer_control_register(3),true); if (SerialPort.AreBytesToCome()){ SerialPort.NextByte(); if ((mfp_reg[MFPR_RSR] & BIT_0) /*Recv enable*/ && (mfp_reg[MFPR_TSR] & b00000110)!=b00000110 /*Loopback*/ && (mfp_reg[MFPR_RSR] & BIT_6)==0 /*No overrun*/){ if ((mfp_reg[MFPR_RSR] & BIT_7 /*Buffer Full*/)==0){ rs232_recv_byte=SerialPort.ReadByte(); rs232_recv_overrun=0; }else{ rs232_recv_overrun=true; } mfp_reg[MFPR_RSR]&=BYTE(~(BIT_2 /*Char in progress*/ | BIT_3 /*Break*/ | BIT_4 /*Frame Error*/ | BIT_5 /*Parity Error*/)); mfp_reg[MFPR_RSR]|=BIT_7 /*Buffer Full*/; mfp_interrupt(MFP_INT_RS232_RECEIVE_BUFFER_FULL,ABSOLUTE_CPU_TIME); } if (SerialPort.AreBytesToCome()){ mfp_reg[MFPR_RSR]|=BYTE(BIT_2); // Character in progress agenda_add(agenda_serial_replace,rs232_hbls_per_word,0); }else{ mfp_reg[MFPR_RSR]&=BYTE(~BIT_2); // Character in progress } } }
static interrupt68_t * mfpio_interrupt(io68_t * const io, const cycle68_t cycle) { mfp_io68_t * const mfpio = (mfp_io68_t * const)io; const bogoc68_t bogoc = cpu2bogo(io,cycle); interrupt68_t * const inter = mfp_interrupt(&mfpio->mfp, bogoc); if (inter) { assert(inter->cycle < bogoc); inter->cycle = bogo2cpu(io,inter->cycle); assert(inter->cycle < cycle); } return inter; }