예제 #1
0
int
fs_d81_bamfindfreeblock (uchar blocks[3][256], int *track, int *sector)
{
  /* find a free block on a D81 */

  int i;

  /* first 1/2 of the disk */
  for (*track = 39; *track > 0; (*track)--)
    if (blocks[1][10 + (*track) * 6])
    {
      /* free block here */
      for (i = 1; i < 6; i++)
	if (blocks[1][10 + (*track) * 6 + i])
	{
	  /* free sector here */
	  *sector = (i - 1) * 8 + firsthighbit (blocks[1][10 + (*track) * 6 + i]);
	  return (0);
	}
      /* directory error */
      set_error (71, 0, 0);
      return (-1);
    }

  /* second 1/2 of the disk */
  for (*track = 41; *track < 81; (*track)++)
    if (blocks[2][10 + (*track - 40) * 6])
    {
      /* free block here */
      for (i = 1; i < 6; i++)
	if (blocks[2][10 + (*track - 40) * 6 + i])
	{
	  /* free sector here */
	  *sector = (i - 1) * 8 + firsthighbit (blocks[2][10 + (*track - 40) * 6 + i]);
	  return (0);
	}
      /* directory error */
      set_error (71, 0, 0);
      return (-1);
    }

  *track = -1;
  *sector = -1;
  return (-1);
}
예제 #2
0
파일: fs_io_dhd.c 프로젝트: gardners/64net2
int
fs_dhd_bamfindfreeblock (uchar blocks[34][256], int *track, int *sector)
{
    /* find a free block on a DHD */

    int i, bn, ofs;

    for (*track = 1; *track <= blocks[2][8]; (*track)++)
    {
        bn = 2 + (*track / 8);
        ofs = 32 * (*track & 7);
        for (i = 0; i < 32; i++)
            if (blocks[bn][ofs + i])
            {
                /* free block here */
                *sector = i * 8 + 7 - firsthighbit (blocks[bn][ofs + i]);
                return (0);
            }
    }
    *track = -1;
    *sector = -1;
    return (-1);
}