static void device_unload_floppy(mess_image *image) { struct mess_flopimg *flopimg; flopimg = image_lookuptag(image, FLOPPY_TAG); /* if we have one of our hacky unload procs, call it */ if (flopimg->unload_proc) flopimg->unload_proc(image); floppy_close(flopimg->floppy); flopimg->floppy = NULL; }
static void apple525_load_current_track(mess_image *image) { int len; struct apple525_disk *disk; disk = (struct apple525_disk *) image_lookuptag(image, APPLE525TAG); len = sizeof(disk->track_data); floppy_drive_read_track_data_info_buffer(image, 0, disk->track_data, &len); disk->track_loaded = 1; disk->track_dirty = 0; }
/* reads/writes a byte; write_value is -1 for read only */ static UINT8 apple525_process_byte(mess_image *img, int write_value) { UINT8 read_value; struct apple525_disk *disk; int spinfract_divisor; int spinfract_dividend; const struct IODevice *dev; disk = (struct apple525_disk *) image_lookuptag(img, APPLE525TAG); dev = image_device(img); spinfract_dividend = (int) device_get_info_int(&dev->devclass, DEVINFO_INT_APPLE525_SPINFRACT_DIVIDEND); spinfract_divisor = (int) device_get_info_int(&dev->devclass, DEVINFO_INT_APPLE525_SPINFRACT_DIVISOR); /* no image initialized for that drive ? */ if (!image_exists(img)) return 0xFF; /* check the spin count if reading*/ if (write_value < 0) { disk->spin_count++; disk->spin_count %= spinfract_divisor; if (disk->spin_count >= spinfract_dividend) return 0x00; } /* load track if need be */ if (disk->track_loaded == 0) apple525_load_current_track(img); /* perform the read */ read_value = disk->track_data[disk->position]; /* perform the write, if applicable */ if (write_value >= 0) { disk->track_data[disk->position] = write_value; disk->track_dirty = 1; } disk->position++; disk->position %= (sizeof(disk->track_data) / sizeof(disk->track_data[0])); /* when writing; save the current track after every full sector write */ if ((write_value >= 0) && ((disk->position % APPLE2_NIBBLE_SIZE) == 0)) apple525_save_current_track(img, FALSE); return read_value; }
static void apple525_save_current_track(mess_image *image, int unload) { int len; struct apple525_disk *disk; disk = (struct apple525_disk *) image_lookuptag(image, APPLE525TAG); if (disk->track_dirty) { len = sizeof(disk->track_data); floppy_drive_write_track_data_info_buffer(image, 0, disk->track_data, &len); disk->track_dirty = 0; } if (unload) disk->track_loaded = 0; }
static void apple525_disk_set_lines(mess_image *image, UINT8 new_state) { struct apple525_disk *cur_disk; UINT8 old_state; unsigned int phase; cur_disk = (struct apple525_disk *) image_lookuptag(image, APPLE525TAG); old_state = cur_disk->state; cur_disk->state = new_state; if ((new_state & 0x0F) > (old_state & 0x0F)) { phase = 0; switch((old_state ^ new_state) & 0x0F) { case 1: phase = 0; break; case 2: phase = 1; break; case 4: phase = 2; break; case 8: phase = 3; break; } phase -= floppy_drive_get_current_track(image) * 2; if (cur_disk->tween_tracks) phase--; phase %= 4; switch(phase) { case 1: apple525_seek_disk(image, cur_disk, +1); break; case 3: apple525_seek_disk(image, cur_disk, -1); break; } } }
static struct mess_cassetteimg *get_cassimg(mess_image *image) { return image_lookuptag(image, CASSETTE_TAG); }
static struct mess_flopimg *get_flopimg(mess_image *image) { return (struct mess_flopimg *) image_lookuptag(image, FLOPPY_TAG); }
void floppy_install_tracktranslate_proc(mess_image *image, int (*proc)(mess_image *image, floppy_image *floppy, int physical_track)) { struct mess_flopimg *flopimg; flopimg = image_lookuptag(image, FLOPPY_TAG); flopimg->tracktranslate_proc = proc; }
void floppy_install_unload_proc(mess_image *image, void (*proc)(mess_image *image)) { struct mess_flopimg *flopimg; flopimg = image_lookuptag(image, FLOPPY_TAG); flopimg->unload_proc = proc; }
static struct mess_hd *get_drive(mess_image *img) { return image_lookuptag(img, MESSHDTAG); }