/* 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; }
/* reads/writes a byte; write_value is -1 for read only */ static UINT8 apple525_process_byte(device_t *img, int write_value) { UINT8 read_value; apple525_floppy_image_device *disk; int spinfract_divisor; int spinfract_dividend; apple525_floppy_image_device *config = get_device(img); device_image_interface *image = dynamic_cast<device_image_interface *>(img); disk = get_device(img); spinfract_dividend = config->get_dividend(); spinfract_divisor = config->get_divisor(); /* no image initialized for that drive ? */ if (!image->exists()) 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 %= ARRAY_LENGTH(disk->track_data); /* 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; }