static void disklabel_delete(device_instance *instance) { disklabel *label = device_instance_data(instance); device_instance_delete(label->raw_disk); zfree(label); }
static void hw_disk_instance_delete(device_instance *instance) { hw_disk_instance *data = device_instance_data(instance); DITRACE(disk, ("delete - instance=%ld\n", (unsigned long)device_instance_to_external(instance))); free(data); }
static int disklabel_seek(device_instance *instance, unsigned_word pos_hi, unsigned_word pos_lo) { disklabel *label = device_instance_data(instance); if (pos_lo >= label->sector_length || pos_hi != 0) return -1; label->pos = pos_lo; return 0; }
static int hw_eeprom_instance_seek(device_instance *instance, unsigned_word pos_hi, unsigned_word pos_lo) { hw_eeprom_instance *data = device_instance_data(instance); if (pos_lo >= data->eeprom->sizeof_memory) device_error(data->me, "seek value 0x%lx out of range\n", (unsigned long)pos_lo); data->pos = pos_lo; return 0; }
static int hw_pal_instance_write_callback(device_instance *instance, const void *buf, unsigned_word len) { int i; const char *chp = buf; hw_pal_device *hw_pal = device_instance_data(instance); DITRACE(pal, ("write - %s (%ld)", (const char*)buf, (long int)len)); for (i = 0; i < len; i++) write_hw_pal(hw_pal, chp[i]); sim_io_flush_stdoutput(); return i; }
static int hw_eeprom_instance_read(device_instance *instance, void *buf, unsigned_word len) { hw_eeprom_instance *data = device_instance_data(instance); int i; if (data->eeprom->state != read_reset) DITRACE(eeprom, ("eeprom not idle during instance read\n")); for (i = 0; i < len; i++) { ((unsigned8*)buf)[i] = data->eeprom->memory[data->pos]; data->pos = (data->pos + 1) % data->eeprom->sizeof_memory; } return len; }
static int hw_disk_instance_seek(device_instance *instance, unsigned_word pos_hi, unsigned_word pos_lo) { hw_disk_instance *data = device_instance_data(instance); if (pos_hi != 0) device_error(device_instance_device(instance), "seek - extended addressing unimplemented"); DITRACE(disk, ("seek - instance=%ld pos_hi=%ld pos_lo=%ld\n", (unsigned long)device_instance_to_external(instance), (long)pos_hi, (long)pos_lo)); data->pos = pos_lo; return 0; }
static int hw_eeprom_instance_write(device_instance *instance, const void *buf, unsigned_word len) { hw_eeprom_instance *data = device_instance_data(instance); int i; if (data->eeprom->state != read_reset) DITRACE(eeprom, ("eeprom not idle during instance write\n")); for (i = 0; i < len; i++) { data->eeprom->memory[data->pos] = ((unsigned8*)buf)[i]; data->pos = (data->pos + 1) % data->eeprom->sizeof_memory; } dump_eeprom(data->me, data->eeprom); return len; }
static int disklabel_write(device_instance *instance, const void *buf, unsigned_word len) { disklabel *label = device_instance_data(instance); int nr_written; if (label->pos + len > label->sector_length) len = label->sector_length - label->pos; if (device_instance_seek(label->raw_disk, 0, label->sector_begin + label->pos) < 0) return -1; nr_written = device_instance_write(label->raw_disk, buf, len); if (nr_written > 0) label->pos += nr_written; return nr_written; }
static int hw_disk_instance_read(device_instance *instance, void *buf, unsigned_word len) { hw_disk_instance *data = device_instance_data(instance); DITRACE(disk, ("read - instance=%ld len=%ld\n", (unsigned long)device_instance_to_external(instance), (long)len)); if ((data->pos + len) < data->pos) return -1; /* overflow */ if (fseek(data->disk->image, data->pos, SEEK_SET) < 0) return -1; if (fread(buf, len, 1, data->disk->image) != 1) return -1; data->pos = ftell(data->disk->image); return len; }
static void hw_eeprom_instance_delete(device_instance *instance) { hw_eeprom_instance *data = device_instance_data(instance); free(data); }