int vdrive_attach_image(disk_image_t *image, unsigned int unit, vdrive_t *vdrive) { vdrive->unit = unit; disk_image_attach_log(image, 0, unit); switch(image->type) { case DISK_IMAGE_TYPE_D64: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D67: vdrive->image_format = VDRIVE_IMAGE_FORMAT_2040; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D71: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1571; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D81: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1581; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D80: vdrive->image_format = VDRIVE_IMAGE_FORMAT_8050; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D82: vdrive->image_format = VDRIVE_IMAGE_FORMAT_8250; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_G64: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = 35; break; case DISK_IMAGE_TYPE_X64: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = image->tracks; break; default: return -1; } /* Initialise format constants */ vdrive_set_disk_geometry(vdrive); vdrive->image = image; if (vdrive_bam_read_bam(vdrive)) { #ifdef CELL_DEBUG printf("ERROR: Cannot access BAM.\n"); #endif return -1; } return 0; }
static int vdrive_command_initialize(vdrive_t *vdrive) { vdrive_close_all_channels(vdrive); if ((vdrive->image_format == VDRIVE_IMAGE_FORMAT_1581) || (vdrive->image_format == VDRIVE_IMAGE_FORMAT_4000)) { /* reset BAM/Dir/Partition to root */ vdrive_set_disk_geometry(vdrive); } /* Update BAM in memory. */ if (vdrive->image != NULL) { vdrive_bam_read_bam(vdrive); } return CBMDOS_IPE_OK; }
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; }
/* Temporary hack. */ int vdrive_bam_reread_bam(unsigned int unit) { return vdrive_bam_read_bam(file_system_get_vdrive(unit)); }
int vdrive_attach_image(disk_image_t *image, unsigned int unit, vdrive_t *vdrive) { vdrive->unit = unit; switch(image->type) { case DISK_IMAGE_TYPE_D64: disk_image_attach_log(image, vdrive_log, unit, "D64"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D67: disk_image_attach_log(image, vdrive_log, unit, "D67"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_2040; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D71: disk_image_attach_log(image, vdrive_log, unit, "D71"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_1571; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D81: disk_image_attach_log(image, vdrive_log, unit, "D81"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_1581; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D80: disk_image_attach_log(image, vdrive_log, unit, "D80"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_8050; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_D82: disk_image_attach_log(image, vdrive_log, unit, "D82"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_8250; vdrive->num_tracks = image->tracks; break; case DISK_IMAGE_TYPE_G64: disk_image_attach_log(image, vdrive_log, unit, "G64"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = 35; break; case DISK_IMAGE_TYPE_X64: disk_image_attach_log(image, vdrive_log, unit, "X64"); vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = image->tracks; break; default: return -1; } /* Initialise format constants */ vdrive_set_disk_geometry(vdrive); vdrive->image = image; if (vdrive_bam_read_bam(vdrive)) { log_error(vdrive_log, "Cannot access BAM."); return -1; } return 0; }
int vdrive_attach_image(disk_image_t *image, unsigned int unit, vdrive_t *vdrive) { vdrive->unit = unit; disk_image_attach_log(image, vdrive_log, unit); switch (image->type) { case DISK_IMAGE_TYPE_D64: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = image->tracks; vdrive->bam_size = 0x100; break; case DISK_IMAGE_TYPE_D67: vdrive->image_format = VDRIVE_IMAGE_FORMAT_2040; vdrive->num_tracks = image->tracks; vdrive->bam_size = 0x100; break; case DISK_IMAGE_TYPE_D71: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1571; vdrive->num_tracks = image->tracks; vdrive->bam_size = 0x200; break; case DISK_IMAGE_TYPE_D81: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1581; vdrive->num_tracks = image->tracks; vdrive->bam_size = 0x300; break; case DISK_IMAGE_TYPE_D80: vdrive->image_format = VDRIVE_IMAGE_FORMAT_8050; vdrive->num_tracks = image->tracks; vdrive->bam_size = 0x500; break; case DISK_IMAGE_TYPE_D82: vdrive->image_format = VDRIVE_IMAGE_FORMAT_8250; vdrive->num_tracks = image->tracks; vdrive->bam_size = 0x500; break; case DISK_IMAGE_TYPE_G64: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = 35; /* FIXME: it can be more */ vdrive->bam_size = 0x100; break; case DISK_IMAGE_TYPE_P64: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = 35; /* FIXME: it can be more */ vdrive->bam_size = 0x100; break; case DISK_IMAGE_TYPE_X64: vdrive->image_format = VDRIVE_IMAGE_FORMAT_1541; vdrive->num_tracks = image->tracks; vdrive->bam_size = 0x100; break; case DISK_IMAGE_TYPE_D1M: case DISK_IMAGE_TYPE_D2M: case DISK_IMAGE_TYPE_D4M: vdrive->image_format = VDRIVE_IMAGE_FORMAT_4000; vdrive->num_tracks = image->tracks - 1; vdrive->bam_size = 0x2100; break; default: return -1; } DBG(("vdrive_attach_image image type:%d vdrive format:%d num_tracks:%d bam_size:%d", image->type, vdrive->image_format, vdrive->num_tracks, vdrive->bam_size)); /* Initialise format constants */ vdrive_set_disk_geometry(vdrive); vdrive->image = image; vdrive->bam = lib_malloc(vdrive->bam_size); if (vdrive_bam_read_bam(vdrive)) { log_error(vdrive_log, "Cannot access BAM."); return -1; } return 0; }