DOSBox-X
|
00001 /* Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009 Dean Beeler, Jerome Fisher 00002 * Copyright (C) 2011, 2012, 2013 Dean Beeler, Jerome Fisher, Sergey V. Mikayev 00003 * 00004 * This program is free software: you can redistribute it and/or modify 00005 * it under the terms of the GNU Lesser General Public License as published by 00006 * the Free Software Foundation, either version 2.1 of the License, or 00007 * (at your option) any later version. 00008 * 00009 * This program is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 * GNU Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public License 00015 * along with this program. If not, see <http://www.gnu.org/licenses/>. 00016 */ 00017 00018 #include <cstring> 00019 #include "ROMInfo.h" 00020 00021 namespace MT32Emu { 00022 00023 // Known ROMs 00024 static const ROMInfo CTRL_MT32_V1_04 = {65536, "5a5cb5a77d7d55ee69657c2f870416daed52dea7", ROMInfo::Control, "ctrl_mt32_1_04", "MT-32 Control v1.04", ROMInfo::Full, NULL, NULL}; 00025 static const ROMInfo CTRL_MT32_V1_05 = {65536, "e17a3a6d265bf1fa150312061134293d2b58288c", ROMInfo::Control, "ctrl_mt32_1_05", "MT-32 Control v1.05", ROMInfo::Full, NULL, NULL}; 00026 static const ROMInfo CTRL_MT32_V1_06 = {65536, "a553481f4e2794c10cfe597fef154eef0d8257de", ROMInfo::Control, "ctrl_mt32_1_06", "MT-32 Control v1.06", ROMInfo::Full, NULL, NULL}; 00027 static const ROMInfo CTRL_MT32_V1_07 = {65536, "b083518fffb7f66b03c23b7eb4f868e62dc5a987", ROMInfo::Control, "ctrl_mt32_1_07", "MT-32 Control v1.07", ROMInfo::Full, NULL, NULL}; 00028 static const ROMInfo CTRL_MT32_BLUER = {65536, "7b8c2a5ddb42fd0732e2f22b3340dcf5360edf92", ROMInfo::Control, "ctrl_mt32_bluer", "MT-32 Control BlueRidge", ROMInfo::Full, NULL, NULL}; 00029 00030 static const ROMInfo CTRL_CM32L_V1_00 = {65536, "73683d585cd6948cc19547942ca0e14a0319456d", ROMInfo::Control, "ctrl_cm32l_1_00", "CM-32L/LAPC-I Control v1.00", ROMInfo::Full, NULL, NULL}; 00031 static const ROMInfo CTRL_CM32L_V1_02 = {65536, "a439fbb390da38cada95a7cbb1d6ca199cd66ef8", ROMInfo::Control, "ctrl_cm32l_1_02", "CM-32L/LAPC-I Control v1.02", ROMInfo::Full, NULL, NULL}; 00032 00033 static const ROMInfo PCM_MT32 = {524288, "f6b1eebc4b2d200ec6d3d21d51325d5b48c60252", ROMInfo::PCM, "pcm_mt32", "MT-32 PCM ROM", ROMInfo::Full, NULL, NULL}; 00034 static const ROMInfo PCM_CM32L = {1048576, "289cc298ad532b702461bfc738009d9ebe8025ea", ROMInfo::PCM, "pcm_cm32l", "CM-32L/CM-64/LAPC-I PCM ROM", ROMInfo::Full, NULL, NULL}; 00035 00036 static const ROMInfo * const ROM_INFOS[] = { 00037 &CTRL_MT32_V1_04, 00038 &CTRL_MT32_V1_05, 00039 &CTRL_MT32_V1_06, 00040 &CTRL_MT32_V1_07, 00041 &CTRL_MT32_BLUER, 00042 &CTRL_CM32L_V1_00, 00043 &CTRL_CM32L_V1_02, 00044 &PCM_MT32, 00045 &PCM_CM32L, 00046 NULL}; 00047 00048 const ROMInfo* ROMInfo::getROMInfo(File *file) { 00049 size_t fileSize = file->getSize(); 00050 const char *fileDigest = file->getSHA1(); 00051 for (int i = 0; ROM_INFOS[i] != NULL; i++) { 00052 const ROMInfo *romInfo = ROM_INFOS[i]; 00053 if (fileSize == romInfo->fileSize && !strcmp(fileDigest, romInfo->sha1Digest)) { 00054 return romInfo; 00055 } 00056 } 00057 return NULL; 00058 } 00059 00060 void ROMInfo::freeROMInfo(const ROMInfo *romInfo) { 00061 (void) romInfo; 00062 } 00063 00064 static int getROMCount() { 00065 int count; 00066 for(count = 0; ROM_INFOS[count] != NULL; count++) { 00067 } 00068 return count; 00069 } 00070 00071 const ROMInfo** ROMInfo::getROMInfoList(unsigned int types, unsigned int pairTypes) { 00072 const ROMInfo **romInfoList = new const ROMInfo*[getROMCount() + 1]; 00073 const ROMInfo **currentROMInList = romInfoList; 00074 for(int i = 0; ROM_INFOS[i] != NULL; i++) { 00075 const ROMInfo *romInfo = ROM_INFOS[i]; 00076 if ((types & (1u << romInfo->type)) && (pairTypes & (1u << romInfo->pairType))) { 00077 *currentROMInList++ = romInfo; 00078 } 00079 } 00080 *currentROMInList = NULL; 00081 return romInfoList; 00082 } 00083 00084 void ROMInfo::freeROMInfoList(const ROMInfo **romInfoList) { 00085 delete[] romInfoList; 00086 } 00087 00088 const ROMImage* ROMImage::makeROMImage(File *file) { 00089 ROMImage *romImage = new ROMImage; 00090 romImage->file = file; 00091 romImage->romInfo = ROMInfo::getROMInfo(romImage->file); 00092 return romImage; 00093 } 00094 00095 void ROMImage::freeROMImage(const ROMImage *romImage) { 00096 ROMInfo::freeROMInfo(romImage->romInfo); 00097 delete romImage; 00098 } 00099 00100 00101 File* ROMImage::getFile() const { 00102 return file; 00103 } 00104 00105 const ROMInfo* ROMImage::getROMInfo() const { 00106 return romInfo; 00107 } 00108 00109 }