BYTE *vdrive_dir_find_next_slot(vdrive_dir_context_t *dir) { static BYTE return_slot[32]; vdrive_t *vdrive = dir->vdrive; #ifdef DEBUG_DRIVE log_debug("DIR: vdrive_dir_find_next_slot start (t:%d/s:%d) #%d", dir->track, dir->sector, dir->slot); #endif /* * Loop all directory blocks starting from track 18, sector 1 (1541). */ do { /* * Load next(first) directory block ? */ dir->slot++; if (dir->slot >= 8) { int status; /* end of current directory? */ if (dir->buffer[0] == 0) { break; } dir->slot = 0; dir->track = (unsigned int)dir->buffer[0]; dir->sector = (unsigned int)dir->buffer[1]; status = vdrive_read_sector(vdrive, dir->buffer, dir->track, dir->sector); if (status != 0) { return NULL; /* error */ } } if (vdrive_dir_name_match(&dir->buffer[dir->slot * 32], dir->find_nslot, dir->find_length, dir->find_type)) { memcpy(return_slot, &dir->buffer[dir->slot * 32], 32); return return_slot; } } while (1); #ifdef DEBUG_DRIVE log_debug("DIR: vdrive_dir_find_next_slot (t:%d/s:%d) #%d", dir->track, dir->sector, dir->slot); #endif /* * If length < 0, create new directory-entry if possible */ if (dir->find_length < 0) { int i, sector; BYTE *dirbuf; sector = dir->sector + vdrive_dir_get_interleave(vdrive->image_format); for (i = 0; i < vdrive_get_max_sectors(vdrive, dir->track); i++) { dirbuf = find_next_directory_sector(dir, dir->track, sector); if (dirbuf != NULL) { return dirbuf; } sector++; if (sector >= vdrive_get_max_sectors(vdrive, dir->track)) { sector = 0; } } } return NULL; }
BYTE *vdrive_dir_find_next_slot(vdrive_t *vdrive) { static BYTE return_slot[32]; #ifdef DEBUG_DRIVE log_debug("DIR: vdrive_dir_find_next_slot start (t:%d/s:%d) #%d", vdrive->Curr_track, vdrive->Curr_sector, vdrive->SlotNumber); #endif /* * Loop all directory blocks starting from track 18, sector 1 (1541). */ do { /* * Load next(first) directory block ? */ vdrive->SlotNumber++; if (vdrive->SlotNumber >= 8) { int status; /* end of current directory? */ if (vdrive->Dir_buffer[0] == 0) { break; } vdrive->SlotNumber = 0; vdrive->Curr_track = (int)vdrive->Dir_buffer[0]; vdrive->Curr_sector = (int)vdrive->Dir_buffer[1]; status = disk_image_read_sector(vdrive->image, vdrive->Dir_buffer, vdrive->Curr_track, vdrive->Curr_sector); if (status != 0) { return NULL; /* error */ } } if (vdrive_dir_name_match(&vdrive->Dir_buffer[vdrive->SlotNumber * 32], vdrive->find_nslot, vdrive->find_length, vdrive->find_type)) { memcpy(return_slot, &vdrive->Dir_buffer[vdrive->SlotNumber * 32], 32); return return_slot; } } while (1); #ifdef DEBUG_DRIVE log_debug("DIR: vdrive_dir_find_next_slot (t:%d/s:%d) #%d", vdrive->Curr_track, vdrive->Curr_sector, vdrive->SlotNumber); #endif /* * If length < 0, create new directory-entry if possible */ if (vdrive->find_length < 0) { int i, sector; BYTE *dirbuf; sector = vdrive->Curr_sector + vdrive_dir_get_interleave(vdrive->image_format); for (i = 0; i < vdrive_get_max_sectors(vdrive, vdrive->Curr_track); i++) { dirbuf = find_next_directory_sector(vdrive, vdrive->Curr_track, sector); if (dirbuf != NULL) { return dirbuf; } sector++; if (sector >= vdrive_get_max_sectors(vdrive, vdrive->Curr_track)) { sector = 0; } } } return NULL; }