Beispiel #1
0
/**
 * createentry - create a single directory entry in buf
 * @dent  : directory entry to be added
 * @buf   : buffer to be used
 * @format: entry format
 *
 * This function creates a directory entry for dent in the selected format
 * in the given buffer.
 */
static void createentry(cbmdirent_t *dent, buffer_t *buf, dirformat_t format) {
  uint8_t i;
  uint8_t *data = buf->data;

  if(format == DIR_FMT_CMD_LONG)
    i=63;
  else if(format == DIR_FMT_CMD_SHORT)
    i=41;
  else
    i=31;

  buf->lastused  = i;
  /* Clear the line */
  memset(data, ' ', i);
  /* Line end marker */
  data[i] = 0;

  /* Next line pointer, 1571-compatible =) */
  if (dent->remainder != 0xff)
    /* store remainder in low byte of link pointer          */
    /* +2 so it is never 0 (end-marker) or 1 (normal value) */
    *data++ = dent->remainder+2;
  else
    *data++ = 1;
  *data++ = 1;

  *data++ = dent->blocksize & 0xff;
  *data++ = dent->blocksize >> 8;

  /* Filler before file name */
  data++;
  if (dent->blocksize < 100)
    data++;
  if (dent->blocksize < 10)
    data++;
  *data++ = '"';

  /* copy and adjust the filename - C783 */
  memcpy(data, dent->name, CBM_NAME_LENGTH);
  for (i=0;i<=CBM_NAME_LENGTH;i++)
    if (dent->name[i] == 0x22 || dent->name[i] == 0 || i == 16) {
      data[i] = '"';
      while (i<=CBM_NAME_LENGTH) {
        if (data[i] == 0)
          data[i] = ' ';
        else
          data[i] &= 0x7f;
        i++;
      }
    }

  /* Skip name and final quote */
  data += CBM_NAME_LENGTH+1;

  if (dent->typeflags & FLAG_SPLAT)
    *data = '*';

  /* File type */
  memcpy_P(data+1, filetypes + TYPE_LENGTH * (dent->typeflags & EXT_TYPE_MASK),
           (format & DIR_FMT_CMD_SHORT) ? 1 : TYPE_LENGTH);

  /* RO marker */
  if (dent->typeflags & FLAG_RO)
    data[4] = '<';

  if(format & DIR_FMT_CMD_LONG) {
    data += 7;
    data = appendnumber(data,dent->date.month);
    *data++ = '/';
    data = appendnumber(data,dent->date.day);
    *data++ = '/';
    data = appendnumber(data,dent->date.year % 100) + 3;
    data = appendnumber(data,(dent->date.hour>12?dent->date.hour-12:dent->date.hour));
    *data++ = '.';
    data = appendnumber(data,dent->date.minute) + 1;
    *data++ = (dent->date.hour>11?'P':'A');
    *data++ = 'M';
    while (*data)
      *data++ = 1;
  } else if(format == DIR_FMT_CMD_SHORT) {
    /* Add date/time stamp */
    data+=3;
    data = appendnumber(data,dent->date.month);
    *data++ = '/';
    data = appendnumber(data,dent->date.day) + 1;
    data = appendnumber(data,(dent->date.hour>12?dent->date.hour-12:dent->date.hour));
    *data++ = '.';
    data = appendnumber(data,dent->date.minute) + 1;
    *data++ = (dent->date.hour>11?'P':'A');
    while(*data)
      *data++ = 1;
  } else {
    /* Extension: Hidden marker */
    if (dent->typeflags & FLAG_HIDDEN)
      data[5] = 'H';
  }
}
Beispiel #2
0
void set_error_ts(uint8_t errornum, uint8_t track, uint8_t sector) {
  uint8_t *msg = error_buffer;
  uint8_t i = 0;

  current_error = errornum;
  buffers[ERRORBUFFER_IDX].data     = error_buffer;
  buffers[ERRORBUFFER_IDX].lastused = 0;
  buffers[ERRORBUFFER_IDX].position = 0;
  memset(error_buffer,0,sizeof(error_buffer));

  msg = appendnumber(msg,errornum);
  *msg++ = ',';

  if (errornum == ERROR_STATUS) {
    switch(sector) {
    case 0:
    default:
      *msg++ = 'E';
      msg = appendnumber(msg, file_extension_mode);
      msg = appendbool(msg, 0, globalflags & EXTENSION_HIDING);

      msg = appendbool(msg, '*', globalflags & POSTMATCH);

      *msg++ = 'I';
      msg = appendnumber(msg, image_as_dir);

      *msg++ = ':';
      *msg++ = 'R';
      ustrcpy(msg, rom_filename);
      msg += ustrlen(rom_filename);

      break;
    case 1: // Drive Config
      *msg++ = 'D';
      while(i < 8) {
        if(map_drive(i) != 0x0f) {
          *msg++ = ':';
          msg = appendnumber(msg,i);
          *msg++ = '=';
          msg = appendnumber(msg,map_drive(i));
        }
        i++;
      }
      break;
    }

  } else if (errornum == ERROR_LONGVERSION || errornum == ERROR_DOSVERSION) {
    /* Start with the name and version number */
    while ((*msg++ = pgm_read_byte(versionstr+i++))) ;

    /* Append the long version if requested */
    if (errornum == ERROR_LONGVERSION) {
      i = 0;
      msg--;
      while ((*msg++ = toupper((int)pgm_read_byte(longverstr+i++)))) ;
    }

    msg--;
  } else {
    msg = appendmsg(msg,messages,errornum);
  }
  *msg++ = ',';

  msg = appendnumber(msg,track);
  *msg++ = ',';

  msg = appendnumber(msg,sector);
  *msg = 13;

  buffers[ERRORBUFFER_IDX].lastused = msg - error_buffer;

}
Beispiel #3
0
void set_error_ts(uint8_t errornum, uint8_t track, uint8_t sector) {
  uint8_t *msg = error_buffer;
  uint8_t i = 0;

  current_error = errornum;
  buffers[ERRORBUFFER_IDX].data     = error_buffer;
  buffers[ERRORBUFFER_IDX].lastused = 0;
  buffers[ERRORBUFFER_IDX].position = 0;
  memset(error_buffer,0,sizeof(error_buffer));

  msg = appendnumber(msg,errornum);
  *msg++ = ',';

  if (errornum == ERROR_STATUS) {
    switch(sector) {
    case 0:
    default:
      *msg++ = 'E';
      msg = appendnumber(msg, file_extension_mode);
      msg = appendbool(msg, 0, globalflags & EXTENSION_HIDING);

      msg = appendbool(msg, '*', globalflags & POSTMATCH);

      *msg++ = 'I';
      msg = appendnumber(msg, image_as_dir);

      *msg++ = ':';
      *msg++ = 'R';
      ustrcpy(msg, rom_filename);
      msg += ustrlen(rom_filename);

      break;
    case 1: // Drive Config
      *msg++ = 'D';
      while(i < 8) {
        if(map_drive(i) != 0x0f) {
          *msg++ = ':';
          msg = appendnumber(msg,i);
          *msg++ = '=';
          msg = appendnumber(msg,map_drive(i));
        }
        i++;
      }
      break;
    }

  } else if (errornum == ERROR_LONGVERSION || errornum == ERROR_DOSVERSION) {
    /* Start with the name and version number */
    while ((*msg++ = pgm_read_byte(versionstr+i++))) ;

    /* Append the long version if requested */
    if (errornum == ERROR_LONGVERSION) {
      i = 0;
      msg--;
      while ((*msg++ = toupper((int)pgm_read_byte(longverstr+i++)))) ;
    }

    msg--;
  } else {
    msg = appendmsg(msg,messages,errornum);
  }
  *msg++ = ',';

  msg = appendnumber(msg,track);
  *msg++ = ',';

  msg = appendnumber(msg,sector);
  *msg = 13;

  if (errornum >= 20 && errornum != ERROR_DOSVERSION) {
    // FIXME: Compare to E648
    // NOTE: 1571 doesn't write the BAM and closes some buffers if an error occured
    led_state |= LED_ERROR;
  } else {
    led_state &= (uint8_t)~LED_ERROR;
    set_error_led(0);
  }
  buffers[ERRORBUFFER_IDX].lastused = msg - error_buffer;

  /* Send message without the final 0x0d */
  display_errorchannel(msg - error_buffer, error_buffer);
}