static int iec_close_sequential(vdrive_t *vdrive, unsigned int secondary) { bufferinfo_t *p = &(vdrive->buffers[secondary]); unsigned int track = 0, sector = 0; if (p->readmode & (CBMDOS_FAM_WRITE | CBMDOS_FAM_APPEND)) { /* * Flush bytes and write slot to directory */ if (vdrive->image->read_only || VDRIVE_IMAGE_FORMAT_4000_TEST) { vdrive_command_set_error(vdrive, CBMDOS_IPE_WRITE_PROTECT_ON, 0, 0); return SERIAL_ERROR; } #ifdef DEBUG_DRIVE log_debug("DEBUG: flush."); #endif /* Flush remained of file */ iec_write_sequential(vdrive, p, p->bufptr); /* Set the file as closed */ p->slot[SLOT_TYPE_OFFSET] |= 0x80; /* Closed */ /* is this a save and replace? */ if (p->needsupdate) { /* remember the original track and sector */ track = p->slot[SLOT_FIRST_TRACK]; sector = p->slot[SLOT_FIRST_SECTOR]; /* move over the replacement track and sector */ p->slot[SLOT_FIRST_TRACK] = p->slot[SLOT_REPLACE_TRACK]; p->slot[SLOT_FIRST_SECTOR] = p->slot[SLOT_REPLACE_SECTOR]; /* set replacement track and sector to 0 */ p->slot[SLOT_REPLACE_TRACK] = 0; p->slot[SLOT_REPLACE_SECTOR] = 0; } /* Update the directory entry (block count, closed) */ vdrive_iec_update_dirent(vdrive, secondary); /* if we have a track and sector saved */ if (track) { /* remove the original file */ vdrive_dir_free_chain(vdrive, track, sector); } /* Update BAM */ vdrive_bam_write_bam(vdrive); /* Free up the slot */ lib_free(p->slot); } /* Release buffers */ vdrive_free_buffer(p); return SERIAL_OK; }
void vdrive_dir_remove_slot(vdrive_t *vdrive, BYTE *slot) { unsigned int tmp; int t, s; /* Find slot. */ for (tmp = 0; (tmp < 16) && slot[SLOT_NAME_OFFSET + tmp] != 0xa0; tmp++); vdrive_dir_find_first_slot(vdrive, (char *)&slot[SLOT_NAME_OFFSET], tmp, slot[SLOT_TYPE_OFFSET] & 0x07); /* If slot found, remove. */ if (vdrive_dir_find_next_slot(vdrive)) { /* Free all sector this file is using. */ t = (int) vdrive->Dir_buffer[vdrive->SlotNumber * 32 + SLOT_FIRST_TRACK]; s = (int) vdrive->Dir_buffer[vdrive->SlotNumber * 32 + SLOT_FIRST_SECTOR]; vdrive_dir_free_chain(vdrive, t, s); /* Free side sectors. */ t = (int) vdrive->Dir_buffer[vdrive->SlotNumber * 32 + SLOT_SIDE_TRACK]; s = (int) vdrive->Dir_buffer[vdrive->SlotNumber * 32 + SLOT_SIDE_SECTOR]; vdrive_dir_free_chain(vdrive, t, s); /* Update bam */ vdrive_bam_write_bam(vdrive); /* Update directory entry */ vdrive->Dir_buffer[vdrive->SlotNumber * 32 + SLOT_TYPE_OFFSET] = 0; disk_image_write_sector(vdrive->image, vdrive->Dir_buffer, vdrive->Curr_track, vdrive->Curr_sector); } }
void vdrive_dir_remove_slot(vdrive_dir_context_t *dir) { int t, s; vdrive_t *vdrive = dir->vdrive; /* Free all sector this file is using. */ t = (int) dir->buffer[dir->slot * 32 + SLOT_FIRST_TRACK]; s = (int) dir->buffer[dir->slot * 32 + SLOT_FIRST_SECTOR]; vdrive_dir_free_chain(vdrive, t, s); /* Free side sectors. */ t = (int) dir->buffer[dir->slot * 32 + SLOT_SIDE_TRACK]; s = (int) dir->buffer[dir->slot * 32 + SLOT_SIDE_SECTOR]; vdrive_dir_free_chain(vdrive, t, s); /* Update bam */ vdrive_bam_write_bam(vdrive); /* Update directory entry */ dir->buffer[dir->slot * 32 + SLOT_TYPE_OFFSET] = 0; vdrive_write_sector(vdrive, dir->buffer, dir->track, dir->sector); }