static int vdrive_internal_format_disk_image(const char *filename, const char *disk_name) { vdrive_t *vdrive; const char *format_name; int status = 0; format_name = (disk_name == NULL) ? " " : disk_name; /* FIXME: Pass unit here. */ machine_drive_flush(); vdrive = vdrive_internal_open_fsimage(filename, 0); if (vdrive == NULL) return -1; if (vdrive_command_format(vdrive, format_name) != CBMDOS_IPE_OK) status = -1; if (vdrive_internal_close_disk_image(vdrive) < 0) return -1; return status; }
image_contents_t *diskcontents_block_read(vdrive_t *vdrive) { image_contents_t *contents; BYTE buffer[256]; int retval; image_contents_file_list_t *lp; machine_drive_flush(); if (vdrive == NULL) return NULL; retval = vdrive_bam_read_bam(vdrive); if (retval < 0) { vdrive_internal_close_disk_image(vdrive); return NULL; } contents = image_contents_new(); memcpy(contents->name, vdrive->bam + vdrive->bam_name, IMAGE_CONTENTS_NAME_LEN); contents->name[IMAGE_CONTENTS_NAME_LEN] = 0; memcpy(contents->id, vdrive->bam + vdrive->bam_id, IMAGE_CONTENTS_ID_LEN); contents->id[IMAGE_CONTENTS_ID_LEN] = 0; contents->blocks_free = (int)vdrive_bam_free_block_count(vdrive); vdrive->Curr_track = vdrive->Dir_Track; vdrive->Curr_sector = vdrive->Dir_Sector; lp = NULL; contents->file_list = NULL; circular_check_init(); while (1) { BYTE *p; int j; retval = vdrive_read_sector(vdrive, buffer, vdrive->Curr_track, vdrive->Curr_sector); if (retval != 0 || circular_check(vdrive->Curr_track, vdrive->Curr_sector)) { /*image_contents_destroy(contents);*/ vdrive_internal_close_disk_image(vdrive); circular_check_free(); return contents/*NULL*/; } for (p = buffer, j = 0; j < 8; j++, p += 32) if (p[SLOT_TYPE_OFFSET] != 0) { image_contents_file_list_t *new_list; int i; new_list = lib_malloc(sizeof(image_contents_file_list_t)); new_list->size = ((int)p[SLOT_NR_BLOCKS] + ((int)p[SLOT_NR_BLOCKS + 1] << 8)); for (i = 0; i < IMAGE_CONTENTS_FILE_NAME_LEN; i++) new_list->name[i] = p[SLOT_NAME_OFFSET + i]; new_list->name[IMAGE_CONTENTS_FILE_NAME_LEN] = 0; new_list->name[i] = 0; sprintf((char *)new_list->type, "%c%s%c", (p[SLOT_TYPE_OFFSET] & CBMDOS_FT_CLOSED ? ' ' : '*'), cbmdos_filetype_get(p[SLOT_TYPE_OFFSET] & 0x07), (p[SLOT_TYPE_OFFSET] & CBMDOS_FT_LOCKED ? '<' : ' ')); new_list->next = NULL; if (lp == NULL) { new_list->prev = NULL; contents->file_list = new_list; lp = contents->file_list; } else { new_list->prev = lp; lp->next = new_list; lp = new_list; } } if (buffer[0] == 0) break; vdrive->Curr_track = (int)buffer[0]; vdrive->Curr_sector = (int)buffer[1]; } vdrive_internal_close_disk_image(vdrive); circular_check_free(); return contents; }