This is attach.c in view mode; [Download] [Up]
/* * attach.c - File system attach management. * * Written by * Andreas Boose (boose@unixserv.rz.fh-hannover.de) * * This file is part of VICE, the Versatile Commodore Emulator. * See README for copyright notice. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307 USA. * */ #include "vice.h" #include "resources.h" #include "drive.h" #include "attach.h" static int file_system_device_enabled[4]; static int set_file_system_device8(resource_value_t v); static int set_file_system_device9(resource_value_t v); static int set_file_system_device10(resource_value_t v); static int set_file_system_device11(resource_value_t v); static resource_t resources[] = { { "FileSystemDevice8", RES_INTEGER, (resource_value_t) 1, (resource_value_t *) &file_system_device_enabled[0], set_file_system_device8 }, { "FileSystemDevice9", RES_INTEGER, (resource_value_t) 1, (resource_value_t *) &file_system_device_enabled[1], set_file_system_device9 }, { "FileSystemDevice10", RES_INTEGER, (resource_value_t) 1, (resource_value_t *) &file_system_device_enabled[2], set_file_system_device10 }, { "FileSystemDevice11", RES_INTEGER, (resource_value_t) 1, (resource_value_t *) &file_system_device_enabled[3], set_file_system_device11 }, { NULL } }; /* ------------------------------------------------------------------------- */ static drive_attach_func_t attach_hooks[4]; static drive_detach_func_t detach_hooks[4]; int file_system_init_resources(void) { return resources_register(resources); } /* Warning: this must be called /before/ `file_system_init()'. */ int file_system_set_hooks(int unit, int (*attach_func)(DRIVE *), int (*detach_func)(DRIVE *)) { if (unit < 8 || unit > 11) return -1; attach_hooks[unit - 8] = attach_func; detach_hooks[unit - 8] = detach_func; return 0; } void file_system_init(void) { int i; for (i = 0; i < 4; i++) { initialize_1541(i + 8, ((file_system_device_enabled[0] ? DT_FS : DT_DISK) | DT_1541), attach_hooks[i], detach_hooks[i], NULL); } } static int set_file_system_device8(resource_value_t v) { serial_t *p; DRIVE *floppy; file_system_device_enabled[0] = (int) v; p = serial_get_device(8); floppy = (DRIVE *)p->info; if (floppy != NULL) { if (floppy->ActiveFd < 0) { p->inuse = 0; initialize_1541(8, (file_system_device_enabled[0] ? DT_FS : DT_DISK) | DT_1541, attach_hooks[0], detach_hooks[0], floppy); } } return 0; } static int set_file_system_device9(resource_value_t v) { serial_t *p; DRIVE *floppy; file_system_device_enabled[1] = (int) v; p = serial_get_device(9); floppy = (DRIVE *)p->info; if (floppy != NULL) { if (floppy->ActiveFd < 0) { p->inuse = 0; initialize_1541(9, (file_system_device_enabled[1] ? DT_FS : DT_DISK) | DT_1541, attach_hooks[1], detach_hooks[1], floppy); } } return 0; } static int set_file_system_device10(resource_value_t v) { serial_t *p; DRIVE *floppy; file_system_device_enabled[2] = (int) v; p = serial_get_device(10); floppy = (DRIVE *)p->info; if (floppy != NULL) { if (floppy->ActiveFd < 0) { p->inuse = 0; initialize_1541(10, (file_system_device_enabled[2] ? DT_FS : DT_DISK) | DT_1541, attach_hooks[2], detach_hooks[2], floppy); } } return 0; } static int set_file_system_device11(resource_value_t v) { serial_t *p; DRIVE *floppy; file_system_device_enabled[3] = (int) v; p = serial_get_device(11); floppy = (DRIVE *)p->info; if (floppy != NULL) { if (floppy->ActiveFd < 0) { p->inuse = 0; initialize_1541(11, (file_system_device_enabled[3] ? DT_FS : DT_DISK) | DT_1541, attach_hooks[3], detach_hooks[3], floppy); } } return 0; } /* ------------------------------------------------------------------------- */ int file_system_attach_disk(int unit, const char *filename) { serial_t *p; DRIVE *floppy; p = serial_get_device(unit); floppy = (DRIVE *)p->info; if ((floppy == NULL) || ((floppy->type & DT_FS) == DT_FS)) { p->inuse = 0; initialize_1541(unit, DT_DISK | DT_1541, attach_hooks[unit - 8], detach_hooks[unit - 8], floppy); } if (serial_select_file(DT_DISK | DT_1541, unit, filename) < 0) { file_system_detach_disk(unit); return -1; } else { return 0; } } void file_system_detach_disk(int unit) { if (unit < 0) { serial_remove(8); set_file_system_device8((resource_value_t) file_system_device_enabled[0]); serial_remove(9); set_file_system_device9((resource_value_t) file_system_device_enabled[1]); serial_remove(10); set_file_system_device10((resource_value_t) file_system_device_enabled[2]); serial_remove(11); set_file_system_device11((resource_value_t) file_system_device_enabled[3]); } else { serial_remove(unit); switch(unit) { case 8: set_file_system_device8((resource_value_t) file_system_device_enabled[0]); break; case 9: set_file_system_device9((resource_value_t) file_system_device_enabled[1]); break; case 10: set_file_system_device10((resource_value_t) file_system_device_enabled[2]); break; case 11: set_file_system_device11((resource_value_t) file_system_device_enabled[3]); break; } } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.