static void scsiDeviceStartStopUnit(SCSIDEVICE* scsi) { FileProperties* disk = &propGetGlobalProperties()->media.disks[scsi->diskId]; switch (scsi->cdb[4]) { case 2: // Eject if (diskPresent(scsi->diskId)) { disk->fileName[0] = 0; disk->fileNameInZip[0] = 0; updateExtendedDiskName(scsi->diskId, disk->fileName, disk->fileNameInZip); boardChangeDiskette(scsi->diskId, NULL, NULL); SCSILOG1("hdd %d eject\n", scsi->scsiId); } break; case 3: // Insert if (!diskPresent(scsi->diskId)) { *disk = scsi->disk; updateExtendedDiskName(scsi->diskId, disk->fileName, disk->fileNameInZip); boardChangeDiskette(scsi->diskId, disk->fileName, disk->fileNameInZip); SCSILOG1("hdd %d insert\n", scsi->scsiId); } break; } scsi->motor = scsi->cdb[4] & 1; SCSILOG2("hdd %d motor: %d\n", scsi->scsiId, scsi->motor); }
static void diskInsert(RomMapperNoWind* rm, int driveId, int driveNo) { NoWindProperties* prop = &propGetGlobalProperties()->nowind; FileProperties* disk = &propGetGlobalProperties()->media.disks[diskGetHdDriveId(driveId, driveNo)]; int diskHasPartitionTable = 0; FILE* f; UInt8 header[512]; f = fopen(disk->fileName, "rb"); if (f == NULL) { rm->deviceId[driveNo] = -1; return; } rm->deviceId[driveNo] = deviceIdAlloc(); if (rm->deviceId[driveNo] < 0) { fclose(f); return; } if (fread(header, 1, sizeof(header), f) != 0) { diskHasPartitionTable = header[510] == 0x55 && header[511] == 0xaa; } fclose(f); if (diskHasPartitionTable) { if (nowindusb_set_harddisk_image) { nowindusb_set_harddisk_image(rm->deviceId[driveNo], prop->partitionNumber, prop->ignoreBootFlag != 0, disk->fileName); } } else { if (nowindusb_set_image) { nowindusb_set_image(rm->deviceId[driveNo], disk->fileName); } } }
void themeClassicTitlebarUpdate(HWND wnd) { char title[1024]={0}; char title_old[1024]={0}; char baseName[128]; Properties* pProperties = propGetGlobalProperties(); if (!GetWindowText(wnd,(LPTSTR)title_old,1024)||!strlen(pProperties->emulation.machineName)) return; sprintf(title," blueMSX - %s",pProperties->emulation.machineName); if (createSaveFileBaseName(baseName, pProperties, 0)) { strcat(title," - "); strcat(title,baseName); } if (strcmp(title,title_old)) SetWindowText(wnd,title); }
ArchMidi* archMidiOutCreate(int device) { Properties* pProperties = propGetGlobalProperties(); char* propName = device == 0 ? pProperties->sound.MidiOut.name : pProperties->sound.MidiOut.name; ArchMidi* archMidi = (ArchMidi*)calloc(1, sizeof(ArchMidi)); if (device != 0) { return archMidi; } if (midi.out.current[device] == NULL) { int i; for (i = 0; i < midi.out.count; i++) { if (strcmp(midi.out.dev[i].idString, propName) == 0) { if (midiOutOpen((HMIDIOUT*)&midi.out.dev[i].handle, midi.out.dev[i].id, 0, 0 ,0) == MMSYSERR_NOERROR) { midi.out.current[device] = &midi.out.dev[i]; } break; } } if (midi.out.current[device] == NULL && midi.out.count > 0) { if (midiOutOpen((HMIDIOUT*)&midi.out.dev[0].handle, midi.out.dev[0].id, 0, 0 ,0) == MMSYSERR_NOERROR) { midi.out.current[device] = &midi.out.dev[0]; } strcpy(propName, midi.out.dev[0].idString); } if (midi.out.current[device] != NULL) { midiOutGetVolume((HMIDIOUT)midi.out.current[device]->handle, &midi.out.current[device]->origVolume); } archMidiEnable(midi.enabled); // Clear history memset(midi.out.history.data, 0, sizeof(midi.out.history.data)); } if (midi.out.current[device] != NULL) { midi.out.current[device]->refCount++; } archMidi->devInfo = midi.out.current[device]; return archMidi; }
int romMapperNoWindCreate(int driveId, const char* filename, UInt8* romData, int size, int slot, int sslot, int startPage) { NoWindProperties* prop = &propGetGlobalProperties()->nowind; DeviceCallbacks callbacks = { destroy, reset, saveState, loadState }; RomMapperNoWind* rm; int i; rm = (RomMapperNoWind*)malloc(sizeof(RomMapperNoWind)); rm->deviceHandle = deviceManagerRegister(ROM_NOWIND, &callbacks, rm); slotRegister(slot, sslot, startPage, 6, (SlotRead)read, (SlotRead)peek, (SlotWrite)write, destroy, rm); if (filename == NULL) { filename = "nowind.rom"; } rm->amdFlash = amdFlashCreate(AMD_TYPE_1, 0x80000, 0x10000, 0, romData, size, sramCreateFilenameWithSuffix(filename, "", ".rom"), 0); rm->slot = slot; rm->sslot = sslot; rm->startPage = startPage; #ifdef USE_NOWIND_DLL if (++nowindLoaded == 1) { nowindLoadDll(); if (nowindusb_startup) nowindusb_startup(); } if (nowindusb_attribute) { nowindusb_attribute(ATTR_ENABLE_DOS2, prop->enableDos2 != 0); nowindusb_attribute(ATTR_ENABLE_OTHER_DISKROMS, prop->enableOtherDiskRoms != 0); nowindusb_attribute(ATTR_ENABLE_PHANTOM_DRIVES, prop->enablePhantomDrives != 0); } if (nowindusb_set_debug_callback) { nowindusb_set_debug_callback(debugCb); } for (i = 0; i < 4; i++) { diskInsert(rm, driveId, i); } #endif reset(rm); return 1; }
static int scsiDeviceDiskChanged(SCSIDEVICE* scsi) { FileProperties* pDisk; int changed = diskChanged(scsi->diskId); if (changed) { scsi->motor = 1; pDisk = &propGetGlobalProperties()->media.disks[scsi->diskId]; if (scsi->changeCheck2) { scsi->changeCheck2 = 0; if (scsi->inserted && (strcmp(scsi->disk.fileName, pDisk->fileName) == 0) && (strcmp(scsi->disk.fileNameInZip, pDisk->fileNameInZip) == 0)) { SCSILOG("Disk change invalidity\n\n"); return 0; } } scsi->changed = 1; scsi->disk = *pDisk; scsi->inserted = 1; SCSILOG1("hdd %d: disk change\n", scsi->scsiId); SCSILOG1("filename: %s\n", scsi->disk.fileName); SCSILOG1(" zip: %s\n", scsi->disk.fileNameInZip); } else { if (scsi->inserted & !diskPresent(scsi->diskId)) { scsi->inserted = 0; scsi->motor = 0; scsi->changed = 1; changed = 1; } } if (changed && (scsi->mode & MODE_UNITATTENTION)) { scsi->reset = 1; } return changed; }
void scsiDeviceReset(SCSIDEVICE* scsi) { if (scsi->deviceType == SDT_CDROM) { archCdromHwReset(scsi->cdrom); } scsi->changed = 0; scsi->keycode = 0; scsi->sector = 0; scsi->length = 0; scsi->motor = 1; scsi->changeCheck2 = 1; // the first use always scsi->reset = (scsi->mode & MODE_UNITATTENTION) ? 1 : 0; scsi->disk = propGetGlobalProperties()->media.disks[scsi->diskId]; scsi->inserted = (strlen(scsi->disk.fileName) > 0); if (scsi->inserted) { SCSILOG1("hdd %d: \n", scsi->scsiId); SCSILOG1("filename: %s\n", scsi->disk.fileName); SCSILOG1(" zip: %s\n", scsi->disk.fileNameInZip); } else if ((scsi->mode & MODE_NOVAXIS) && scsi->deviceType != SDT_CDROM) { scsi->enabled = 0; } }
int tapeInsert(char *name, const char *fileInZipFile) { FILE* file; Properties* pProperties = propGetGlobalProperties(); if (ramImageBuffer != NULL) { file = fopen(tapePosName, "w"); if (file != NULL) { char buffer[32]; sprintf(buffer, "POS:%d", ramImagePos); fwrite(buffer, 1, 32, file); fclose(file); } if (*tapeName && tapeRdWr) { tapeSave(tapeName, tapeFormat); } free(ramImageBuffer); ramImageBuffer = NULL; } *tapeName = 0; if(!name) { return 1; } // Create filename for tape position file sprintf(tapePosName, "%s" DIR_SEPARATOR "%s", tapeBaseDir, stripPath(name)); if (fileInZipFile == NULL) { strcpy(tapeName, name); } else { strcat(tapePosName, stripPath((char*)fileInZipFile)); } strcat(tapePosName, ".pos"); ramImagePos = 0; // Load and verify tape position file = fopen(tapePosName, "rb"); if (file != NULL) { char buffer[32] = { 0 }; fread(buffer, 1, 31, file); sscanf(buffer, "POS:%d", &ramImagePos); fclose(file); } if (fileInZipFile != NULL) { ramImageBuffer = zipLoadFile(name, fileInZipFile, &ramImageSize); if (ramImagePos > ramImageSize) { ramImagePos = ramImageSize; } } else { file = fopen(name,"rb"); if (file != NULL) { // Load file into RAM buffer fseek(file, 0, SEEK_END); ramImageSize = ftell(file); fseek(file, 0, SEEK_SET); ramImageBuffer = malloc(ramImageSize); if (ramImageBuffer != NULL) { if (ramImageSize != fread(ramImageBuffer, 1, ramImageSize, file)) { free(ramImageBuffer); ramImageBuffer = NULL; } } fclose(file); } } if (rewindNextInsert&&pProperties->cassette.rewindAfterInsert) ramImagePos=0; rewindNextInsert=0; if (ramImageBuffer != NULL) { UInt8* ptr = ramImageBuffer + ramImageSize - 17; int cntFMSXDOS = 0; int cntFMSX98 = 0; int cntSVICAS = 0; while (ptr >= ramImageBuffer) { if (!memcmp(ptr, hdrFMSXDOS, sizeof(hdrFMSXDOS))) { cntFMSXDOS++; } if (!memcmp(ptr, hdrFMSX98, sizeof(hdrFMSX98))) { cntFMSX98++; } if (!memcmp(ptr, hdrSVICAS, sizeof(hdrSVICAS))) { cntSVICAS++; } ptr--; } if (cntSVICAS > cntFMSXDOS && cntSVICAS > cntFMSX98) { tapeFormat = TAPE_SVICAS; tapeHeader = hdrSVICAS; tapeHeaderSize = sizeof(hdrSVICAS); } else if (cntFMSXDOS >= cntFMSX98) { tapeFormat = TAPE_FMSXDOS; tapeHeader = hdrFMSXDOS; tapeHeaderSize = sizeof(hdrFMSXDOS); } else { tapeFormat = TAPE_FMSX98AT; tapeHeader = hdrFMSX98; tapeHeaderSize = sizeof(hdrFMSX98); } } if (ramImagePos > ramImageSize) { ramImagePos = ramImageSize; } return ramImageBuffer != NULL; }