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);
}
Beispiel #4
0
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;
    }
}
Beispiel #8
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;
}