diff options
Diffstat (limited to 'src/devices/machine/appldriv.cpp')
-rw-r--r-- | src/devices/machine/appldriv.cpp | 336 |
1 files changed, 0 insertions, 336 deletions
diff --git a/src/devices/machine/appldriv.cpp b/src/devices/machine/appldriv.cpp deleted file mode 100644 index 1d207a9ab0b..00000000000 --- a/src/devices/machine/appldriv.cpp +++ /dev/null @@ -1,336 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:R. Belmont -/********************************************************************* - - appldriv.c - - Apple 5.25" floppy drive emulation (to be interfaced with applefdc.c) - -*********************************************************************/ -#include "emu.h" -#include "appldriv.h" -#include "imagedev/flopdrv.h" -#include "formats/ap2_dsk.h" - -// our parent's device is the Disk II card (Apple II) or main driver (Mac, IIgs) -// either way, get the drive from there. -#define PARENT_FLOPPY_0 "^floppy0" -#define PARENT_FLOPPY_1 "^floppy1" -#define PARENT_FLOPPY_2 "^floppy2" -#define PARENT_FLOPPY_3 "^floppy3" - -static inline apple525_floppy_image_device *get_device(device_t *device) -{ - assert(device != nullptr); - assert(device->type() == FLOPPY_APPLE); - - return downcast<apple525_floppy_image_device *>(device); -} - -static int apple525_enable_mask = 1; - -legacy_floppy_image_device *apple525_get_subdevice(device_t *device, int drive) -{ - switch(drive) { - case 0 : return device->subdevice<legacy_floppy_image_device>(PARENT_FLOPPY_0); - case 1 : return device->subdevice<legacy_floppy_image_device>(PARENT_FLOPPY_1); - case 2 : return device->subdevice<legacy_floppy_image_device>(PARENT_FLOPPY_2); - case 3 : return device->subdevice<legacy_floppy_image_device>(PARENT_FLOPPY_3); - } - return nullptr; -} - -device_t *apple525_get_device_by_type(device_t *device, int ftype, int drive) -{ - int i; - int cnt = 0; - for (i=0;i<4;i++) { - legacy_floppy_image_device *disk = apple525_get_subdevice(device, i); - if (disk->floppy_get_drive_type()==ftype) { - if (cnt==drive) { - return disk; - } - cnt++; - } - } - return nullptr; -} - -void apple525_set_enable_lines(device_t *device, int enable_mask) -{ - apple525_enable_mask = enable_mask; -} - -/* ----------------------------------------------------------------------- */ - -static void apple525_load_current_track(device_t *image) -{ - int len; - apple525_floppy_image_device *disk; - - disk = get_device(image); - len = sizeof(disk->track_data); - - disk->floppy_drive_read_track_data_info_buffer(0, disk->track_data, &len); - disk->track_loaded = 1; - disk->track_dirty = 0; -} - -static void apple525_save_current_track(device_t *image, int unload) -{ - int len; - apple525_floppy_image_device *disk; - - disk = get_device(image); - - if (disk->track_dirty) - { - len = sizeof(disk->track_data); - disk->floppy_drive_write_track_data_info_buffer(0, disk->track_data, &len); - disk->track_dirty = 0; - } - if (unload) - disk->track_loaded = 0; -} - -static void apple525_seek_disk(apple525_floppy_image_device *img, signed int step) -{ - int track; - int pseudo_track; - apple525_floppy_image_device *disk; - - disk = get_device(img); - - apple525_save_current_track(img, false); - - track = img->floppy_drive_get_current_track(); - pseudo_track = (track * 2) + disk->tween_tracks; - - pseudo_track += step; - if (pseudo_track < 0) - pseudo_track = 0; - else if (pseudo_track/2 >= APPLE2_TRACK_COUNT) - pseudo_track = APPLE2_TRACK_COUNT*2-1; - - if (pseudo_track/2 != track) - { - img->floppy_drive_seek(pseudo_track/2 - img->floppy_drive_get_current_track()); - disk->track_loaded = 0; - } - - if (pseudo_track & 1) - disk->tween_tracks = 1; - else - disk->tween_tracks = 0; -} - -static void apple525_disk_set_lines(device_t *device,device_t *image, uint8_t new_state) -{ - apple525_floppy_image_device *cur_disk; - uint8_t old_state; - unsigned int phase; - - cur_disk = get_device(image); - - 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 -= cur_disk->floppy_drive_get_current_track() * 2; - if (cur_disk->tween_tracks) - phase--; - phase %= 4; - - switch(phase) - { - case 1: - apple525_seek_disk(cur_disk, +1); - break; - case 3: - apple525_seek_disk(cur_disk, -1); - break; - } - } -} - -int apple525_get_count(device_t *device) -{ - int cnt = 0; - if ((device->subdevice("^" FLOPPY_0)!=nullptr) && (device->subdevice<legacy_floppy_image_device>("^" FLOPPY_0)->floppy_get_drive_type() == FLOPPY_TYPE_APPLE) && (get_device(device->subdevice(PARENT_FLOPPY_0))!=nullptr)) cnt++; - if ((device->subdevice("^" FLOPPY_1)!=nullptr) && (device->subdevice<legacy_floppy_image_device>("^" FLOPPY_1)->floppy_get_drive_type() == FLOPPY_TYPE_APPLE) && (get_device(device->subdevice(PARENT_FLOPPY_1))!=nullptr)) cnt++; - if ((device->subdevice("^" FLOPPY_2)!=nullptr) && (device->subdevice<legacy_floppy_image_device>("^" FLOPPY_2)->floppy_get_drive_type() == FLOPPY_TYPE_APPLE) && (get_device(device->subdevice(PARENT_FLOPPY_2))!=nullptr)) cnt++; - if ((device->subdevice("^" FLOPPY_3)!=nullptr) && (device->subdevice<legacy_floppy_image_device>("^" FLOPPY_3)->floppy_get_drive_type() == FLOPPY_TYPE_APPLE) && (get_device(device->subdevice(PARENT_FLOPPY_3))!=nullptr)) cnt++; - - return cnt; -} - -void apple525_set_lines(device_t *device, uint8_t lines) -{ - int i, count; - device_t *image; - - count = apple525_get_count(device); - for (i = 0; i < count; i++) - { - if (apple525_enable_mask & (1 << i)) - { - image = apple525_get_device_by_type(device, FLOPPY_TYPE_APPLE, i); - if (image) - apple525_disk_set_lines(device,image, lines); - } - } -} - -/* reads/writes a byte; write_value is -1 for read only */ -static uint8_t apple525_process_byte(device_t *img, int write_value) -{ - uint8_t 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; -} - -static device_t *apple525_selected_image(device_t *device) -{ - int i,count; - - count = apple525_get_count(device); - - for (i = 0; i < count; i++) - { - if (apple525_enable_mask & (1 << i)) - return apple525_get_device_by_type(device, FLOPPY_TYPE_APPLE, i); - } - return nullptr; -} - -uint8_t apple525_read_data(device_t *device) -{ - device_t *image; - image = apple525_selected_image(device); - return image ? apple525_process_byte(image, -1) : 0xFF; -} - -void apple525_write_data(device_t *device,uint8_t data) -{ - device_t *image; - image = apple525_selected_image(device); - if (image) - apple525_process_byte(image, data); -} - -int apple525_read_status(device_t *device) -{ - int i, count, result = 0; - device_image_interface *image; - - count = apple525_get_count(device); - - for (i = 0; i < count; i++) - { - if (apple525_enable_mask & (1 << i)) - { - image = dynamic_cast<device_image_interface *>(apple525_get_device_by_type(device, FLOPPY_TYPE_APPLE, i)); - if (image && image->is_readonly()) - result = 1; - } - } - return result; -} - -// device type definition -DEFINE_DEVICE_TYPE(FLOPPY_APPLE, apple525_floppy_image_device, "floppy_apple", "Apple Disk II") - -//------------------------------------------------- -// apple525_floppy_image_device - constructor -//------------------------------------------------- - -apple525_floppy_image_device::apple525_floppy_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : legacy_floppy_image_device(mconfig, FLOPPY_APPLE, tag, owner, clock) -{ -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void apple525_floppy_image_device::device_start() -{ - legacy_floppy_image_device::device_start(); - floppy_set_type(FLOPPY_TYPE_APPLE); - - state = 0; - tween_tracks = 0; - track_loaded = 0; - track_dirty = 0; - position = 0; - spin_count = 0; - memset(track_data, 0, sizeof(track_data)); -} - -image_init_result apple525_floppy_image_device::call_load() -{ - image_init_result result = legacy_floppy_image_device::call_load(); - floppy_drive_seek(-999); - floppy_drive_seek(+35/2); - return result; -} - -void apple525_floppy_image_device::call_unload() -{ - apple525_save_current_track(this, true); - - legacy_floppy_image_device::call_unload(); -} |