static void apple525_seek_disk(mess_image *img, struct apple525_disk *disk, signed int step) { int track; int pseudo_track; apple525_save_current_track(img, FALSE); track = floppy_drive_get_current_track(img); 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) { floppy_drive_seek(img, pseudo_track/2 - floppy_drive_get_current_track(img)); disk->track_loaded = 0; } if (pseudo_track & 1) disk->tween_tracks = 1; else disk->tween_tracks = 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 void apple525_disk_set_lines(device_t *device,device_t *image, UINT8 new_state) { apple525_floppy_image_device *cur_disk; UINT8 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 -= floppy_drive_get_current_track(image) * 2; if (cur_disk->tween_tracks) phase--; phase %= 4; switch(phase) { case 1: apple525_seek_disk(image, +1); break; case 3: apple525_seek_disk(image, -1); break; } } }
/* Seek Track Zero bottom half */ static void mc6843_finish_STZ( device_t *device ) { mc6843_t* mc6843 = get_safe_token( device ); device_t* img = mc6843_floppy_image( device ); int i; /* seek to track zero */ for ( i=0; i<83; i++ ) { if (floppy_tk00_r(img) == CLEAR_LINE) break; floppy_drive_seek( img, -1 ); } LOG(( "%f mc6843_finish_STZ: actual=%i\n", device->machine().time().as_double(), floppy_drive_get_current_track( img ) )); /* update state */ mc6843->CTAR = 0; mc6843->GCR = 0; mc6843->SAR = 0; mc6843->STRB |= floppy_tk00_r(img) << 4; mc6843_cmd_end( device ); }
/* Seek bottom half */ static void mc6843_finish_SEK( device_t *device ) { mc6843_t* mc6843 = get_safe_token( device ); device_t* img = mc6843_floppy_image( device ); /* seek to track */ floppy_drive_seek( img, mc6843->GCR - mc6843->CTAR ); LOG(( "%f mc6843_finish_SEK: from %i to %i (actual=%i)\n", device->machine().time().as_double(), mc6843->CTAR, mc6843->GCR, floppy_drive_get_current_track( img ) )); /* update state */ mc6843->CTAR = mc6843->GCR; mc6843->SAR = 0; mc6843_cmd_end( device ); }