Exemple #1
0
void fastloader_fc3_send_block(uint8_t *data) {
  uint32_t ticks;
  unsigned int byte, pair;

  fastloader_setup();
  disable_interrupts();

  /* start in one microsecond */
  reference_time = now() + 10;
  set_clock_at(0, 0, WAIT);

  /* Transmit data */
  ticks = 120;
  for (byte = 0; byte < 4; byte++) {
    uint8_t value = *data++;

    for (pair = 0; pair < 4; pair++) {
      set_clock_at(ticks, value & 1, NO_WAIT);
      set_data_at (ticks, value & 2, WAIT);
      value >>= 2;
      ticks += 120;
    }
    ticks += 20;
  }

  set_clock_at(ticks, 1, NO_WAIT);
  set_data_at (ticks, 1, WAIT);
  // Note: Hold time is in the C part

  enable_interrupts();
  fastloader_teardown();
}
Exemple #2
0
void turbodisk_buffer(uint8_t *data, uint8_t length) {
  unsigned int pair;
  uint32_t ticks;

  fastloader_setup();

  /* wait for handshake */
  while (IEC_DATA) ;
  set_clock(1);
  wait_data(1, NO_ATNABORT);

  ticks = 70;
  while (length--) {
    uint8_t byte = *data++;

    ticks += 120;
    for (pair = 0; pair < 4; pair++) {
      ticks += 240;
      set_clock_at(ticks, byte & 0x80, NO_WAIT);
      set_data_at (ticks, byte & 0x40, WAIT);
      ticks += 50;
      byte <<= 2;
    }
    ticks += 100;
  }

  ticks += 110;

  set_clock_at(ticks, 0, NO_WAIT);
  set_data_at( ticks, 1, WAIT);
  delay_us(5);

  fastloader_teardown();
}
Exemple #3
0
void uload3_send_byte(uint8_t byte) {
  fastloader_setup();
  disable_interrupts();

  /* initial handshake */
  set_data(0);
  while (IEC_CLOCK && IEC_ATN) ;
  if (!IEC_ATN)
    goto exit;

  /* wait for start signal */
  set_data(1);
  wait_clock(1, ATNABORT);
  if (!IEC_ATN)
    goto exit;

  /* transmit data */
  generic_load_2bit(&uload3_send_def, byte);

  /* exit with clock+data high */
  set_clock_at(480, 1, NO_WAIT);
  set_data_at (480, 1, WAIT);

 exit:
  enable_interrupts();
  fastloader_teardown();
}
Exemple #4
0
static uint8_t fc3_oldfreeze_send(const uint8_t byte,
                                  const generic_2bit_t *timingdef,
                                  unsigned int busytime) {
  fastloader_setup();
  disable_interrupts();

  /* clear busy */
  set_clock(1);
  set_data(1);
  delay_us(15);
  if (!IEC_ATN)
    goto exit;

  /* wait for start signal */
  wait_clock(1, ATNABORT);
  if (!IEC_ATN)
    goto exit;

  /* transmit data */
  generic_load_2bit(timingdef, byte);

  /* re-enable busy signal */
  set_clock_at(busytime, 1, NO_WAIT);
  set_data_at (busytime, 0, WAIT);
  delay_us(1); // a little settle time for clock

 exit:
  enable_interrupts();
  fastloader_teardown();
  return !IEC_ATN;
}
Exemple #5
0
uint8_t jiffy_send(uint8_t value, uint8_t eoi, uint8_t loadflags) {
  unsigned int loadmode = loadflags & 0x80;
  unsigned int skipeoi  = loadflags & 0x7f;

  fastloader_setup();
  disable_interrupts();

  /* Initial handshake */
  set_data(1);
  set_clock(1);
  delay_us(3);

  if (loadmode) {
    /* LOAD mode: start marker is data low */
    while (!IEC_DATA) ; // wait until data actually is high again
    wait_data(0, ATNABORT);
  } else {
    /* single byte mode: start marker is data high */
    wait_data(1, ATNABORT);
  }

  /* transmit data */
  generic_load_2bit(&jiffy_send_def, value);

  /* Send EOI info */
  if (!skipeoi) {
    if (eoi) {
      set_clock_at(520, 1, NO_WAIT);
      set_data_at (520, 0, WAIT);
    } else {
      /* LOAD mode also uses this for the final byte of a block */
      set_clock_at(520, 0, NO_WAIT);
      set_data_at (520, 1, WAIT);
    }

    /* wait until data is low */
    delay_us(3); // allow for slow rise time
    while (IEC_DATA && IEC_ATN) ;
  }

  /* hold time */
  delay_us(10);

  enable_interrupts();
  fastloader_teardown();
  return !IEC_ATN;
}
Exemple #6
0
/**
 * generic_load_2bit - generic 2-bit fastloader transmit
 * @def : pointer to fastloader definition struct
 * @byte: data byte
 *
 * This function implements generic 2-bit fastloader
 * transmission based on a generic_2bit_t struct.
 */
static __attribute__((unused)) void generic_load_2bit(const generic_2bit_t *def, uint8_t byte) {
  unsigned int i;

  byte ^= def->eorvalue;

  for (i=0;i<4;i++) {
    set_clock_at(def->pairtimes[i], byte & (1 << def->clockbits[i]), NO_WAIT);
    set_data_at (def->pairtimes[i], byte & (1 << def->databits[i]),  WAIT);
  }
}
Exemple #7
0
void turbodisk_byte(uint8_t value) {
  fastloader_setup();

  /* wait for handshake */
  while (IEC_DATA) ;
  set_clock(1);
  wait_data(1, NO_ATNABORT);

  /* transmit data */
  generic_load_2bit(&turbodisk_byte_def, value);

  /* exit with clock low, data high */
  set_clock_at(1470, 0, NO_WAIT);
  set_data_at( 1470, 1, WAIT);
  delay_us(5);

  fastloader_teardown();
}
Exemple #8
0
void ar6_1581_send_byte(uint8_t byte) {
  fastloader_setup();
  disable_interrupts();

  /* wait for handshake */
  set_clock(1);
  wait_data(1, NO_ATNABORT);

  /* transmit data */
  generic_load_2bit(&ar6_1581_send_def, byte);

  /* exit with clock low, data high */
  set_clock_at(375, 0, NO_WAIT);
  set_data_at( 375, 1, WAIT);

  /* short delay to make sure bus has settled */
  delay_us(10);

  enable_interrupts();
  fastloader_teardown();
}
Exemple #9
0
uint8_t ar6_1581p_get_byte(void) {
  uint8_t result;

  fastloader_setup();
  disable_interrupts();

  set_clock(1);

  /* wait for handshake */
  while (IEC_DATA) ;
  wait_data(1, NO_ATNABORT);

  /* receive data */
  result = generic_save_2bit(&ar6_1581p_get_def);

  /* exit with clock low */
  set_clock_at(530, 0, WAIT);

  enable_interrupts();
  fastloader_teardown();
  return result;
}
Exemple #10
0
static void set_clock(Clock *c, double pts, int serial)
{
	double time = av_gettime_relative() / 1000000.0;
	set_clock_at(c, pts, serial, time);
}