static DEVICE_LOAD(vc20_tape) { const char *cp; tape.type = 0; tape.on = 0; tape.noise = 0; tape.play = 0; tape.record = 0; tape.motor = 0; tape.data = 0; if (!file) return INIT_PASS; cp = image_filetype(image); if (!cp) return INIT_FAIL; if (mame_stricmp (cp, "wav") == 0) vc20_wav_open(image, file); else if (mame_stricmp (cp, "prg") == 0) vc20_prg_open(image, file); else return INIT_FAIL; return INIT_PASS; }
static int device_load_cassette(mess_image *image) { casserr_t err; int cassette_flags; struct mess_cassetteimg *tag; const struct IODevice *dev; const struct CassetteFormat **formats; const struct CassetteOptions *create_opts; const char *extension; int is_writable; tag = get_cassimg(image); /* figure out the cassette format */ dev = device_find(Machine->devices, IO_CASSETTE); formats = device_get_info_ptr(&dev->devclass, DEVINFO_PTR_CASSETTE_FORMATS); if (image_has_been_created(image)) { /* creating an image */ create_opts = (const struct CassetteOptions *) device_get_info_ptr(&dev->devclass, DEVINFO_PTR_CASSETTE_OPTIONS); err = cassette_create(image, &mess_ioprocs, &wavfile_format, create_opts, CASSETTE_FLAG_READWRITE|CASSETTE_FLAG_SAVEONEXIT, &tag->cassette); if (err) goto error; } else { /* opening an image */ do { is_writable = image_is_writable(image); cassette_flags = is_writable ? (CASSETTE_FLAG_READWRITE|CASSETTE_FLAG_SAVEONEXIT) : CASSETTE_FLAG_READONLY; extension = image_filetype(image); err = cassette_open_choices(image, &mess_ioprocs, extension, formats, cassette_flags, &tag->cassette); /* this is kind of a hack */ if (err && is_writable) image_make_readonly(image); } while(err && is_writable); if (err) goto error; } /* set to default state, but only change the UI state */ cassette_change_state(image, get_default_state(dev), CASSETTE_MASK_UISTATE); /* reset the position */ tag->position = 0.0; tag->position_time = timer_get_time(); return INIT_PASS; error: return INIT_FAIL; }
static int internal_floppy_device_load(mess_image *image, mame_file *file, int create_format, option_resolution *create_args) { floperr_t err; struct mess_flopimg *flopimg; const struct IODevice *dev; const struct FloppyFormat *floppy_options; int floppy_flags, i; const char *extension; /* look up instance data */ flopimg = get_flopimg(image); /* figure out the floppy options */ dev = image_device(image); floppy_options = device_get_info_ptr(&dev->devclass, DEVINFO_PTR_FLOPPY_OPTIONS); if (image_has_been_created(image)) { /* creating an image */ assert(create_format >= 0); err = floppy_create(file, &mess_ioprocs, &floppy_options[create_format], create_args, &flopimg->floppy); if (err) goto error; } else { /* opening an image */ floppy_flags = image_is_writable(image) ? FLOPPY_FLAGS_READWRITE : FLOPPY_FLAGS_READONLY; extension = image_filetype(image); err = floppy_open_choices(file, &mess_ioprocs, extension, floppy_options, floppy_flags, &flopimg->floppy); if (err) goto error; } /* if we can get head and track counts, then set the geometry accordingly */ if (floppy_callbacks(flopimg->floppy)->get_heads_per_disk && floppy_callbacks(flopimg->floppy)->get_tracks_per_disk) { floppy_drive_set_geometry_absolute(image, floppy_get_tracks_per_disk(flopimg->floppy), floppy_get_heads_per_disk(flopimg->floppy)); } return INIT_PASS; error: for (i = 0; i < sizeof(errmap) / sizeof(errmap[0]); i++) { if (err == errmap[i].ferr) image_seterror(image, errmap[i].ierr, errmap[i].message); } return INIT_FAIL; }
static int vc20_rom_id(mess_image *image) { unsigned char magic[] = {0x41, 0x30, 0x20, 0xc3, 0xc2, 0xcd}; /* A0 CBM at 0xa004 (module offset 4) */ unsigned char buffer[sizeof (magic)]; const char *cp; int retval; logerror("vc20_rom_id %s\n", image_filename(image)); retval = 0; image_fseek (image, 4, SEEK_SET); image_fread (image, buffer, sizeof (magic)); if (!memcmp (buffer, magic, sizeof (magic))) retval = 1; cp = image_filetype(image); if (cp) { if ((mame_stricmp (cp, "a0") == 0) || (mame_stricmp (cp, "20") == 0) || (mame_stricmp (cp, "40") == 0) || (mame_stricmp (cp, "60") == 0) || (mame_stricmp (cp, "bin") == 0) || (mame_stricmp (cp, "rom") == 0) || (mame_stricmp (cp, "prg") == 0)) retval = 1; } if (retval) logerror("rom %s recognized\n", image_filename(image)); else logerror("rom %s not recognized\n", image_filename(image)); return retval; }
static DEVICE_LOAD(cbm_rom) { int i; int size, j, read_; const char *filetype; int adr = 0; const struct IODevice *dev; for (i=0; (i<sizeof(cbm_rom) / sizeof(cbm_rom[0])) && (cbm_rom[i].size!=0); i++) ; if (i >= sizeof(cbm_rom) / sizeof(cbm_rom[0])) return INIT_FAIL; dev = cbm_rom_find_device(); size = image_length(image); filetype = image_filetype(image); if (filetype && !mame_stricmp(filetype, "prg")) { unsigned short in; image_fread (image, &in, 2); in = LITTLE_ENDIANIZE_INT16(in); logerror("rom prg %.4x\n", in); size -= 2; logerror("loading rom %s at %.4x size:%.4x\n", image_filename(image), in, size); cbm_rom[i].chip = (UINT8 *) image_malloc(image, size); if (!cbm_rom[i].chip) return INIT_FAIL; cbm_rom[i].addr=in; cbm_rom[i].size=size; read_ = image_fread (image, cbm_rom[i].chip, size); if (read_ != size) return INIT_FAIL; } else if (filetype && !mame_stricmp (filetype, "crt")) { unsigned short in; image_fseek(image, 0x18, SEEK_SET); image_fread(image, &cbm_c64_exrom, 1); image_fread(image, &cbm_c64_game, 1); image_fseek(image, 64, SEEK_SET); j = 64; logerror("loading rom %s size:%.4x\n", image_filename(image), size); while (j < size) { unsigned short segsize; unsigned char buffer[10], number; image_fread(image, buffer, 6); image_fread(image, &segsize, 2); segsize = BIG_ENDIANIZE_INT16(segsize); image_fread(image, buffer + 6, 3); image_fread(image, &number, 1); image_fread(image, &adr, 2); adr = BIG_ENDIANIZE_INT16(adr); image_fread(image, &in, 2); in = BIG_ENDIANIZE_INT16(in); logerror("%.4s %.2x %.2x %.4x %.2x %.2x %.2x %.2x %.4x:%.4x\n", buffer, buffer[4], buffer[5], segsize, buffer[6], buffer[7], buffer[8], number, adr, in); logerror("loading chip at %.4x size:%.4x\n", adr, in); cbm_rom[i].chip = (UINT8*) image_malloc(image, size); if (!cbm_rom[i].chip) return INIT_FAIL; cbm_rom[i].addr=adr; cbm_rom[i].size=in; read_ = image_fread(image, cbm_rom[i].chip, in); i++; if (read_ != in) return INIT_FAIL; j += 16 + in; } } else if (filetype) { if (mame_stricmp(filetype, "lo") == 0) adr = CBM_ROM_ADDR_LO; else if (mame_stricmp (filetype, "hi") == 0) adr = CBM_ROM_ADDR_HI; else if (mame_stricmp (filetype, "10") == 0) adr = 0x1000; else if (mame_stricmp (filetype, "20") == 0) adr = 0x2000; else if (mame_stricmp (filetype, "30") == 0) adr = 0x3000; else if (mame_stricmp (filetype, "40") == 0) adr = 0x4000; else if (mame_stricmp (filetype, "50") == 0) adr = 0x5000; else if (mame_stricmp (filetype, "60") == 0) adr = 0x6000; else if (mame_stricmp (filetype, "70") == 0) adr = 0x7000; else if (mame_stricmp (filetype, "80") == 0) adr = 0x8000; else if (mame_stricmp (filetype, "90") == 0) adr = 0x9000; else if (mame_stricmp (filetype, "a0") == 0) adr = 0xa000; else if (mame_stricmp (filetype, "b0") == 0) adr = 0xb000; else if (mame_stricmp (filetype, "e0") == 0) adr = 0xe000; else if (mame_stricmp (filetype, "f0") == 0) adr = 0xf000; else adr = CBM_ROM_ADDR_UNKNOWN; logerror("loading %s rom at %.4x size:%.4x\n", image_filename(image), adr, size); cbm_rom[i].chip = (UINT8*) image_malloc(image, size); if (!cbm_rom[i].chip) return INIT_FAIL; cbm_rom[i].addr=adr; cbm_rom[i].size=size; read_ = image_fread(image, cbm_rom[i].chip, size); if (read_ != size) return INIT_FAIL; } return INIT_PASS; }