Exemple #1
0
//---------------------------------------------------------------------------
// 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
    }
  }
}
Exemple #2
0
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;
}