aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2019-10-26 10:34:13 -0700
committerPaul Gilbert2019-10-26 11:13:30 -0700
commitd9c8237042c626a205ff5f59bcdbfe9ea31599d6 (patch)
treee32d463ec0944dba1543e355ccf187928e65a459 /engines
parent51471940a9043cfd9a0b1c0846490f556de283c0 (diff)
downloadscummvm-rg350-d9c8237042c626a205ff5f59bcdbfe9ea31599d6.tar.gz
scummvm-rg350-d9c8237042c626a205ff5f59bcdbfe9ea31599d6.tar.bz2
scummvm-rg350-d9c8237042c626a205ff5f59bcdbfe9ea31599d6.zip
GLK: LEVEL9: Hook up new detection
Diffstat (limited to 'engines')
-rw-r--r--engines/glk/level9/detection.cpp173
-rw-r--r--engines/glk/level9/detection.h4
-rw-r--r--engines/glk/level9/detection_tables.h777
3 files changed, 478 insertions, 476 deletions
diff --git a/engines/glk/level9/detection.cpp b/engines/glk/level9/detection.cpp
index 3b3228ed0e..93e8143b3c 100644
--- a/engines/glk/level9/detection.cpp
+++ b/engines/glk/level9/detection.cpp
@@ -25,6 +25,7 @@
#include "glk/level9/level9_main.h"
#include "glk/level9/os_glk.h"
#include "glk/blorb.h"
+#include "glk/detection.h"
#include "common/debug.h"
#include "common/file.h"
#include "common/md5.h"
@@ -62,14 +63,14 @@ const L9V1GameInfo &Scanner::v1Game() const {
return L9_V1_GAMES[_l9V1Game];
}
-long Scanner::scan(byte *StartFile, uint32 size) {
+long Scanner::scan(byte *startFile, uint32 size) {
byte *Chk = (byte *)malloc(size + 1);
byte *Image = (byte *)calloc(size, 1);
uint32 i, num, Size, MaxSize = 0;
int j;
uint16 d0 = 0, l9, md, ml, dd, dl;
uint32 Min, Max;
- long Offset = -1;
+ long offset = -1;
bool JumpKill, DriverV4;
if ((Chk == nullptr) || (Image == nullptr)) {
@@ -78,25 +79,25 @@ long Scanner::scan(byte *StartFile, uint32 size) {
Chk[0] = 0;
for (i = 1; i <= size; i++)
- Chk[i] = Chk[i - 1] + StartFile[i - 1];
+ Chk[i] = Chk[i - 1] + startFile[i - 1];
for (i = 0; i < size - 33; i++) {
- num = L9WORD(StartFile + i) + 1;
+ num = L9WORD(startFile + i) + 1;
/*
Chk[i] = 0 +...+ i-1
Chk[i+n] = 0 +...+ i+n-1
Chk[i+n] - Chk[i] = i + ... + i+n
*/
if (num > 0x2000 && i + num <= size && Chk[i + num] == Chk[i]) {
- md = L9WORD(StartFile + i + 0x2);
- ml = L9WORD(StartFile + i + 0x4);
- dd = L9WORD(StartFile + i + 0xa);
- dl = L9WORD(StartFile + i + 0xc);
+ md = L9WORD(startFile + i + 0x2);
+ ml = L9WORD(startFile + i + 0x4);
+ dd = L9WORD(startFile + i + 0xa);
+ dl = L9WORD(startFile + i + 0xc);
if (ml > 0 && md > 0 && i + md + ml <= size && dd > 0 && dl > 0 && i + dd + dl * 4 <= size) {
/* v4 files may have acodeptr in 8000-9000, need to fix */
for (j = 0; j < 12; j++) {
- d0 = L9WORD(StartFile + i + 0x12 + j * 2);
+ d0 = L9WORD(startFile + i + 0x12 + j * 2);
if (j != 11 && d0 >= 0x8000 && d0 < 0x9000) {
if (d0 >= 0x8000 + LISTAREASIZE) break;
} else if (i + d0 > size) break;
@@ -104,15 +105,15 @@ long Scanner::scan(byte *StartFile, uint32 size) {
/* list9 ptr must be in listarea, acode ptr in data */
if (j < 12 /*|| (d0>=0x8000 && d0<0x9000)*/) continue;
- l9 = L9WORD(StartFile + i + 0x12 + 10 * 2);
+ l9 = L9WORD(startFile + i + 0x12 + 10 * 2);
if (l9 < 0x8000 || l9 >= 0x8000 + LISTAREASIZE) continue;
Size = 0;
Min = Max = i + d0;
DriverV4 = 0;
- if (ValidateSequence(StartFile, Image, i + d0, i + d0, &Size, size, &Min, &Max, false, &JumpKill, &DriverV4)) {
+ if (ValidateSequence(startFile, Image, i + d0, i + d0, &Size, size, &Min, &Max, false, &JumpKill, &DriverV4)) {
if (Size > MaxSize && Size > 100) {
- Offset = i;
+ offset = i;
MaxSize = Size;
_gameType = DriverV4 ? L9_V4 : L9_V3;
}
@@ -123,17 +124,17 @@ long Scanner::scan(byte *StartFile, uint32 size) {
free(Chk);
free(Image);
- return Offset;
+ return offset;
}
-long Scanner::ScanV2(byte *StartFile, uint32 size) {
+long Scanner::ScanV2(byte *startFile, uint32 size) {
byte *Chk = (byte *)malloc(size + 1);
byte *Image = (byte *)calloc(size, 1);
uint32 i, Size, MaxSize = 0, num;
int j;
uint16 d0 = 0, l9;
uint32 Min, Max;
- long Offset = -1;
+ long offset = -1;
bool JumpKill;
if ((Chk == nullptr) || (Image == nullptr)) {
@@ -142,13 +143,13 @@ long Scanner::ScanV2(byte *StartFile, uint32 size) {
Chk[0] = 0;
for (i = 1; i <= size; i++)
- Chk[i] = Chk[i - 1] + StartFile[i - 1];
+ Chk[i] = Chk[i - 1] + startFile[i - 1];
for (i = 0; i < size - 28; i++) {
- num = L9WORD(StartFile + i + 28) + 1;
- if (i + num <= size && ((Chk[i + num] - Chk[i + 32]) & 0xff) == StartFile[i + 0x1e]) {
+ num = L9WORD(startFile + i + 28) + 1;
+ if (i + num <= size && ((Chk[i + num] - Chk[i + 32]) & 0xff) == startFile[i + 0x1e]) {
for (j = 0; j < 14; j++) {
- d0 = L9WORD(StartFile + i + j * 2);
+ d0 = L9WORD(startFile + i + j * 2);
if (j != 13 && d0 >= 0x8000 && d0 < 0x9000) {
if (d0 >= 0x8000 + LISTAREASIZE) break;
} else if (i + d0 > size) break;
@@ -156,17 +157,17 @@ long Scanner::ScanV2(byte *StartFile, uint32 size) {
/* list9 ptr must be in listarea, acode ptr in data */
if (j < 14 /*|| (d0>=0x8000 && d0<0x9000)*/) continue;
- l9 = L9WORD(StartFile + i + 6 + 9 * 2);
+ l9 = L9WORD(startFile + i + 6 + 9 * 2);
if (l9 < 0x8000 || l9 >= 0x8000 + LISTAREASIZE) continue;
Size = 0;
Min = Max = i + d0;
- if (ValidateSequence(StartFile, Image, i + d0, i + d0, &Size, size, &Min, &Max, false, &JumpKill, nullptr)) {
+ if (ValidateSequence(startFile, Image, i + d0, i + d0, &Size, size, &Min, &Max, false, &JumpKill, nullptr)) {
#ifdef L9DEBUG
printf("Found valid V2 header at %ld, code size %ld", i, Size);
#endif
if (Size > MaxSize && Size > 100) {
- Offset = i;
+ offset = i;
MaxSize = Size;
}
}
@@ -174,10 +175,10 @@ long Scanner::ScanV2(byte *StartFile, uint32 size) {
}
free(Chk);
free(Image);
- return Offset;
+ return offset;
}
-long Scanner::ScanV1(byte *StartFile, uint32 size) {
+long Scanner::ScanV1(byte *startFile, uint32 size) {
byte *Image = (byte *)calloc(size, 1);
uint32 i, Size;
int Replace;
@@ -195,11 +196,11 @@ long Scanner::ScanV1(byte *StartFile, uint32 size) {
}
for (i = 0; i < size; i++) {
- if ((StartFile[i] == 0 && StartFile[i + 1] == 6) || (StartFile[i] == 32 && StartFile[i + 1] == 4)) {
+ if ((startFile[i] == 0 && startFile[i + 1] == 6) || (startFile[i] == 32 && startFile[i + 1] == 4)) {
Size = 0;
Min = Max = i;
Replace = 0;
- if (ValidateSequence(StartFile, Image, i, i, &Size, size, &Min, &Max, false, &JumpKill, nullptr)) {
+ if (ValidateSequence(startFile, Image, i, i, &Size, size, &Min, &Max, false, &JumpKill, nullptr)) {
if (Size > MaxCount && Size > 100 && Size < 10000) {
MaxCount = Size;
//MaxMin = Min;
@@ -219,19 +220,19 @@ long Scanner::ScanV1(byte *StartFile, uint32 size) {
/* V1 dictionary detection from L9Cut by Paul David Doherty */
for (i = 0; i < size - 20; i++) {
- if (StartFile[i] == 'A') {
- if (StartFile[i + 1] == 'T' && StartFile[i + 2] == 'T' && StartFile[i + 3] == 'A' && StartFile[i + 4] == 'C' && StartFile[i + 5] == 0xcb) {
+ if (startFile[i] == 'A') {
+ if (startFile[i + 1] == 'T' && startFile[i + 2] == 'T' && startFile[i + 3] == 'A' && startFile[i + 4] == 'C' && startFile[i + 5] == 0xcb) {
dictOff1 = i;
- dictVal1 = StartFile[dictOff1 + 6];
+ dictVal1 = startFile[dictOff1 + 6];
break;
}
}
}
for (i = dictOff1; i < size - 20; i++) {
- if (StartFile[i] == 'B') {
- if (StartFile[i + 1] == 'U' && StartFile[i + 2] == 'N' && StartFile[i + 3] == 'C' && StartFile[i + 4] == 0xc8) {
+ if (startFile[i] == 'B') {
+ if (startFile[i + 1] == 'U' && startFile[i + 2] == 'N' && startFile[i + 3] == 'C' && startFile[i + 4] == 0xc8) {
dictOff2 = i;
- dictVal2 = StartFile[dictOff2 + 5];
+ dictVal2 = startFile[dictOff2 + 5];
break;
}
}
@@ -241,7 +242,7 @@ long Scanner::ScanV1(byte *StartFile, uint32 size) {
for (i = 0; i < sizeof L9_V1_GAMES / sizeof L9_V1_GAMES[0]; i++) {
if ((L9_V1_GAMES[i].dictVal1 == dictVal1) && (L9_V1_GAMES[i].dictVal2 == dictVal2)) {
_l9V1Game = i;
- (*_dictData) = StartFile + dictOff1 - L9_V1_GAMES[i].dictStart;
+ (*_dictData) = startFile + dictOff1 - L9_V1_GAMES[i].dictStart;
}
}
}
@@ -249,7 +250,7 @@ long Scanner::ScanV1(byte *StartFile, uint32 size) {
free(Image);
if (MaxPos > 0 && _aCodePtr) {
- (*_aCodePtr) = StartFile + MaxPos;
+ (*_aCodePtr) = startFile + MaxPos;
return 0;
}
@@ -463,7 +464,7 @@ bool Scanner::CheckCallDriverV4(byte *Base, uint32 Pos) {
}
#ifdef FULLSCAN
-void Scanner::fullScan(byte *StartFile, uint32 size) {
+void Scanner::fullScan(byte *startFile, uint32 size) {
byte *Image = (byte *)calloc(size, 1);
uint32 i, Size;
int Replace;
@@ -471,13 +472,13 @@ void Scanner::fullScan(byte *StartFile, uint32 size) {
uint32 MaxPos = 0;
uint32 MaxCount = 0;
uint32 Min, Max, MaxMin, MaxMax;
- int Offset;
+ int offset;
bool JumpKill, MaxJK;
for (i = 0; i < size; i++) {
Size = 0;
Min = Max = i;
Replace = 0;
- if (ValidateSequence(StartFile, Image, i, i, &Size, size, &Min, &Max, FALSE, &JumpKill, nullptr)) {
+ if (ValidateSequence(startFile, Image, i, i, &Size, size, &Min, &Max, FALSE, &JumpKill, nullptr)) {
if (Size > MaxCount) {
MaxCount = Size;
MaxMin = Min;
@@ -495,16 +496,16 @@ void Scanner::fullScan(byte *StartFile, uint32 size) {
}
printf("%ld %ld %ld %ld %s", MaxPos, MaxCount, MaxMin, MaxMax, MaxJK ? "jmp killed" : "");
/* search for reference to MaxPos */
- Offset = 0x12 + 11 * 2;
- for (i = 0; i < size - Offset - 1; i++) {
- if ((L9WORD(StartFile + i + Offset)) + i == MaxPos) {
+ offset = 0x12 + 11 * 2;
+ for (i = 0; i < size - offset - 1; i++) {
+ if ((L9WORD(startFile + i + offset)) + i == MaxPos) {
printf("possible v3,4 Code reference at : %ld", i);
- /* startdata=StartFile+i; */
+ /* startdata=startFile+i; */
}
}
- Offset = 13 * 2;
- for (i = 0; i < size - Offset - 1; i++) {
- if ((L9WORD(StartFile + i + Offset)) + i == MaxPos)
+ offset = 13 * 2;
+ for (i = 0; i < size - offset - 1; i++) {
+ if ((L9WORD(startFile + i + offset)) + i == MaxPos)
printf("possible v2 Code reference at : %ld", i);
}
free(Image);
@@ -585,7 +586,6 @@ gln_game_tableref_t GameDetection::gln_gameid_identify_game() {
static const uint16 GLN_CRC_POLYNOMIAL = 0xa001;
uint16 GameDetection::gln_get_buffer_crc(const void *void_buffer, size_t length, size_t padding) {
-
const char *buffer = (const char *)void_buffer;
uint16 crc;
size_t index;
@@ -683,15 +683,26 @@ void GameDetection::gln_gameid_game_name_reset() {
/*----------------------------------------------------------------------*/
void Level9MetaEngine::getSupportedGames(PlainGameList &games) {
- for (const PlainGameDescriptor *pd = LEVEL9_GAME_LIST; pd->gameId; ++pd) {
- games.push_back(*pd);
+ const char *prior_id = nullptr;
+
+ for (const gln_game_table_t *pd = GLN_GAME_TABLE; pd->name; ++pd) {
+ if (prior_id == nullptr || strcmp(pd->gameId, prior_id)) {
+ PlainGameDescriptor gd;
+ gd.gameId = pd->gameId;
+ gd.description = pd->name;
+ games.push_back(gd);
+
+ prior_id = pd->gameId;
+ }
}
}
GameDescriptor Level9MetaEngine::findGame(const char *gameId) {
- for (const PlainGameDescriptor *pd = LEVEL9_GAME_LIST; pd->gameId; ++pd) {
- if (!strcmp(gameId, pd->gameId))
- return *pd;
+ for (const gln_game_table_t *pd = GLN_GAME_TABLE; pd->gameId; ++pd) {
+ if (!strcmp(gameId, pd->gameId)) {
+ GameDescriptor gd(pd->gameId, pd->name, 0);
+ return gd;
+ }
}
return PlainGameDescriptor();
@@ -704,42 +715,64 @@ bool Level9MetaEngine::detectGames(const Common::FSList &fslist, DetectedGames &
if (file->isDirectory())
continue;
Common::String filename = file->getName();
- if (!filename.hasSuffixIgnoreCase(".l9"))
+ if (!filename.hasSuffixIgnoreCase(".l9") && !filename.hasSuffixIgnoreCase(".dat"))
continue;
- // Open up the file and calculate the md5
+ // Open up the file so we can get it's size
Common::File gameFile;
if (!gameFile.open(*file))
continue;
- Common::String md5 = Common::computeStreamMD5AsString(gameFile, 5000);
- size_t _fileSize = gameFile.size();
- gameFile.seek(0);
- bool isBlorb = Blorb::isBlorb(gameFile, ID_ADRI);
+ size_t fileSize = gameFile.size();
+ if (fileSize > 0xffff) {
+ // Too big to possibly be a Level 9 game
+ gameFile.close();
+ continue;
+ }
+
+ // Read in the game data
+ Common::Array<byte> data;
+ data.resize(fileSize);
+ gameFile.read(&data[0], fileSize);
gameFile.close();
- if (!isBlorb && Blorb::hasBlorbExt(filename))
+ // Check if it's a valid Level 9 game
+ byte *startFile = &data[0];
+ Scanner scanner;
+ int offset = scanner.scanner(&data[0], fileSize) < 0;
+ if (offset < 0)
continue;
- // Check for known games
- const GlkDetectionEntry *p = LEVEL9_GAMES;
- while (p->_gameId && (md5 != p->_md5 || _fileSize != p->_filesize))
- ++p;
-
- if (!p->_gameId) {
- const PlainGameDescriptor &desc = LEVEL9_GAME_LIST[0];
- gameList.push_back(GlkDetectedGame(desc.gameId, desc.description, filename, md5, _fileSize));
- } else {
- PlainGameDescriptor gameDesc = findGame(p->_gameId);
- gameList.push_back(GlkDetectedGame(p->_gameId, gameDesc.description, p->_extra, filename, p->_language));
- }
+ // Check for the specific game
+ byte *startData = startFile + offset;
+ GameDetection detection(startData, fileSize);
+
+ const gln_game_tableref_t game = detection.gln_gameid_identify_game();
+ if (!game)
+ continue;
+
+ // Found the game, add a detection entry
+ DetectedGame gd = DetectedGame(game->gameId, game->name, Common::UNK_LANG,
+ Common::kPlatformUnknown, game->extra);
+ gd.addExtraEntry("filename", filename);
+ gameList.push_back(gd);
}
return !gameList.empty();
}
void Level9MetaEngine::detectClashes(Common::StringMap &map) {
- // No implementation
+ const char *prior_id = nullptr;
+
+ for (const gln_game_table_t *pd = GLN_GAME_TABLE; pd->name; ++pd) {
+ if (prior_id == nullptr || strcmp(pd->gameId, prior_id)) {
+ prior_id = pd->gameId;
+
+ if (map.contains(pd->gameId))
+ error("Duplicate game Id found - %s", pd->gameId);
+ map[pd->gameId] = "";
+ }
+ }
}
} // End of namespace Level9
diff --git a/engines/glk/level9/detection.h b/engines/glk/level9/detection.h
index 89bd8540f7..ae876b9bc5 100644
--- a/engines/glk/level9/detection.h
+++ b/engines/glk/level9/detection.h
@@ -37,7 +37,9 @@ struct gln_game_table_t {
const size_t length; ///< Datafile length in bytes
const byte checksum; ///< 8-bit checksum, last datafile byte
const uint16 crc; ///< 16-bit CRC, L9cut-internal
- const char *const name; ///< Game title and platform
+ const char *const gameId; ///< Game Id
+ const char *const name; ///< Game title
+ const char *const extra; ///< Disk number, platform, etc.
};
typedef const gln_game_table_t *gln_game_tableref_t;
diff --git a/engines/glk/level9/detection_tables.h b/engines/glk/level9/detection_tables.h
index eb8ae7d412..b43deff1ad 100644
--- a/engines/glk/level9/detection_tables.h
+++ b/engines/glk/level9/detection_tables.h
@@ -31,408 +31,382 @@ namespace Glk {
namespace Level9 {
/**
- * The following game database is obtained from L9cut's l9data_d.h, and
- * lets us find a game's name from its data CRC. Entries marked "WANTED" in
- * l9data_d.h, and file commentary, have been removed for brevity, and the
- * file has been reformatted (patchlevel data removed).
+ * The following game database is modified for ScummVM based on the data obtained
+ * from L9cut's l9data_d.h, and lets us find a game's name from its data CRC.
+ * Entries marked "WANTED" in l9data_d.h, and file commentary, have been removed for brevity,
+ * and the file has been reformatted (patchlevel data removed).
*
* The version of l9data_d.h used is 050 (22 Oct 2002).
*/
static const gln_game_table_t GLN_GAME_TABLE[] = {
- {0x5323, 0xb7, 0x8af7, "Adventure Quest (Amstrad CPC/Spectrum)"},
-
- {0x630e, 0x8d, 0x7d7d, "Dungeon Adventure (Amstrad CPC)"},
- {0x630e, 0xbe, 0x3374, "Dungeon Adventure (MSX)"},
-
- {0x5eb9, 0x30, 0xe99a, "Lords of Time (Amstrad CPC)"},
- {0x5eb9, 0x5d, 0xc098, "Lords of Time (MSX)"},
- {0x5eb9, 0x6e, 0xc689, "Lords of Time (Spectrum)"},
-
- {0x5fab, 0x5c, 0xa309, "Snowball (Amstrad CPC)"},
- {0x5fab, 0x2f, 0x8aa2, "Snowball (MSX)"},
-
- {0x60c4, 0x28, 0x0154, "Return to Eden (Amstrad CPC/Commodore 64[v1])"},
- {0x6064, 0x01, 0x5b3c, "Return to Eden (BBC[v1])"},
- {0x6064, 0x95, 0x510c, "Return to Eden (Commodore 64[v2])"},
- {0x6064, 0xda, 0xe610, "Return to Eden (Commodore 64[v2] *corrupt*)"},
- {0x6064, 0xbd, 0x73ec, "Return to Eden (Atari *corrupt*)"},
- {0x6047, 0x6c, 0x17ab, "Return to Eden (BBC[v2])"},
- {0x5ca1, 0x33, 0x1c43, "Return to Eden (Spectrum[v1])"},
- {0x5cb7, 0x64, 0x0790, "Return to Eden (Spectrum[v2])"},
- {0x5cb7, 0xfe, 0x3533, "Return to Eden (MSX)"},
-
- {0x34b3, 0x20, 0xccda, "Erik the Viking (BBC/Commodore 64)"},
- {0x34b3, 0x53, 0x8f00, "Erik the Viking (Spectrum)"},
- {0x34b3, 0xc7, 0x9058, "Erik the Viking (Amstrad CPC)"},
-
- {0x63be, 0xd6, 0xcf5d, "Emerald Isle (Atari/Commodore 64/Amstrad CPC/Spectrum)"},
- {0x63be, 0x0a, 0x21ed, "Emerald Isle (MSX *corrupt*)"},
- {0x378c, 0x8d, 0x3a21, "Emerald Isle (BBC)"},
-
- {0x506c, 0xf0, 0xba72, "Red Moon (BBC/Commodore 64/Amstrad CPC/MSX)"},
- {0x505d, 0x32, 0x2dcf, "Red Moon (Spectrum)"},
-
- {0x772b, 0xcd, 0xa503, "Worm in Paradise (Spectrum 128)"},
- {0x546c, 0xb7, 0x9420, "Worm in Paradise (Spectrum 48)"},
- {0x6d84, 0xf9, 0x49ae, "Worm in Paradise (Commodore 64 *corrupt*)"},
- {0x6d84, 0xc8, 0x943f, "Worm in Paradise (Commodore 64 *fixed*)"},
- {0x6030, 0x47, 0x46ad, "Worm in Paradise (Amstrad CPC)"},
- {0x5828, 0xbd, 0xe7cb, "Worm in Paradise (BBC)"},
-
- {0x7410, 0x5e, 0x60be, "Price of Magik (Spectrum 128)"},
- {0x5aa4, 0xc1, 0x10a0, "Price of Magik (Spectrum 48[v1])"},
- {0x5aa4, 0xc1, 0xeda4, "Price of Magik (Spectrum 48[v2])"},
- {0x6fc6, 0x14, 0xf9b6, "Price of Magik (Commodore 64)"},
- {0x5aa4, 0xc1, 0xbbf4, "Price of Magik (Amstrad CPC)"},
- {0x5671, 0xbc, 0xff35, "Price of Magik (BBC)"},
-
- {0x76f4, 0x5e, 0x1fe5, "Colossal Adventure /JoD (Amiga/PC)"},
- {0x76f4, 0x5a, 0xcf4b, "Colossal Adventure /JoD (ST)"},
- {0x6e60, 0x83, 0x18e0, "Adventure Quest /JoD (Amiga/PC)"},
- {0x6e5c, 0xf6, 0xd356, "Adventure Quest /JoD (ST)"},
- {0x6f0c, 0x95, 0x1f64, "Dungeon Adventure /JoD (Amiga/PC/ST)"},
-
- {0x6f70, 0x40, 0xbd91, "Colossal Adventure /JoD (MSX)"},
-
- {0x6f6e, 0x78, 0x28cd, "Colossal Adventure /JoD (Spectrum 128)"},
- {0x6970, 0xd6, 0xa820, "Adventure Quest /JoD (Spectrum 128)"},
- {0x6de8, 0x4c, 0xd795, "Dungeon Adventure /JoD (Spectrum 128)"},
-
- {0x6f4d, 0xcb, 0xe8f2, "Colossal Adventure /JoD (Amstrad CPC128[v1]/Spectrum +3)"},
- {0x6f6a, 0xa5, 0x8dd2, "Colossal Adventure /JoD (Amstrad CPC128[v2])"},
- {0x6968, 0x32, 0x0c01, "Adventure Quest /JoD (Amstrad CPC128/Spectrum +3)"},
- {0x6dc0, 0x63, 0x5d95, "Dungeon Adventure /JoD (Amstrad CPC128/Spectrum +3)"},
-
- {0x5e31, 0x7c, 0xaa54, "Colossal Adventure /JoD (Amstrad CPC64)"},
- {0x5b50, 0x66, 0x1800, "Adventure Quest /JoD (Amstrad CPC64)"},
- {0x58a6, 0x24, 0xb50f, "Dungeon Adventure /JoD (Amstrad CPC64)"},
-
- {0x6c8e, 0xb6, 0x9be3, "Colossal Adventure /JoD (Commodore 64)"},
- {0x63b6, 0x2e, 0xef38, "Adventure Quest /JoD (Commodore 64)"},
- {0x6bd2, 0x65, 0xa41f, "Dungeon Adventure /JoD (Commodore 64)"},
-
- {0x5b16, 0x3b, 0xe2aa, "Colossal Adventure /JoD (Atari)"},
- {0x5b58, 0x50, 0x332e, "Adventure Quest /JoD (Atari)"},
- {0x593a, 0x80, 0x7a34, "Dungeon Adventure /JoD (Atari)"},
-
- {0x5a8e, 0xf2, 0x7cca, "Colossal Adventure /JoD (Spectrum 48)"},
- {0x5ace, 0x11, 0xdc12, "Adventure Quest /JoD (Spectrum 48)"},
- {0x58a3, 0x38, 0x8ce4, "Dungeon Adventure /JoD (Spectrum 48)"},
-
- {0x7b31, 0x6e, 0x2e2b, "Snowball /SD (Amiga/ST)"},
- {0x7d16, 0xe6, 0x5438, "Return to Eden /SD (Amiga/ST)"},
- {0x7cd9, 0x0c, 0x4df1, "Worm in Paradise /SD (Amiga/ST)"},
-
- {0x7b2f, 0x70, 0x6955, "Snowball /SD (Mac/PC/Spectrum 128)"},
- {0x7b2f, 0x70, 0x6f6c, "Snowball /SD (Amstrad CPC/Spectrum +3)"},
- {0x7d14, 0xe8, 0xfbab, "Return to Eden /SD (PC)"},
- {0x7cff, 0xf8, 0x6044, "Return to Eden /SD (Amstrad CPC/Spectrum +3)"},
- {0x7cf8, 0x24, 0x9c1c, "Return to Eden /SD (Mac)"},
- {0x7c55, 0x18, 0xdaee, "Return to Eden /SD (Spectrum 128)"},
- {0x7cd7, 0x0e, 0x4feb, "Worm in Paradise /SD (Amstrad CPC/Mac/PC/Spectrum 128/Spectrum +3)"},
-
- {0x7363, 0x65, 0xa0ab, "Snowball /SD (Commodore 64)"},
- {0x772f, 0xca, 0x8602, "Return to Eden /SD (Commodore 64)"},
- {0x788d, 0x72, 0x888a, "Worm in Paradise /SD (Commodore 64)"},
-
- {0x6bf8, 0x3f, 0xc9f7, "Snowball /SD (Atari)"},
- {0x60f7, 0x68, 0xc2bc, "Return to Eden /SD (Atari)"},
- {0x6161, 0xf3, 0xe6d7, "Worm in Paradise /SD (Atari)"},
-
- {0x67a3, 0x9d, 0x1d05, "Snowball /SD (Apple ][)"},
- {0x639c, 0x8b, 0x06e2, "Return to Eden /SD (Apple ][)"},
- {0x60dd, 0xf2, 0x5bb8, "Worm in Paradise /SD (Apple ][)"},
-
- {0x6541, 0x02, 0x2e6c, "Snowball /SD (Spectrum 48)"},
- {0x5f43, 0xca, 0x828c, "Return to Eden /SD (Spectrum 48)"},
- {0x5ebb, 0xf1, 0x4dec, "Worm in Paradise /SD (Spectrum 48)"},
-
- {0x8333, 0xb7, 0xe2ac, "Adrian Mole I, pt. 1 (Commodore 64)"},
- {0x844d, 0x50, 0x5353, "Adrian Mole I, pt. 2 (Commodore 64)"},
- {0x8251, 0x5f, 0x862a, "Adrian Mole I, pt. 3 (Commodore 64)"},
- {0x7a78, 0x5e, 0x6ea3, "Adrian Mole I, pt. 4 (Commodore 64)"},
-
- {0x7c6f, 0x0f, 0xba24, "Adrian Mole I, pt. 1 (Amstrad CPC)"},
-
- {0x72fa, 0x8b, 0x6f12, "Adrian Mole I, pt. 1 (Spectrum)"},
- {0x738e, 0x5b, 0x7e3d, "Adrian Mole I, pt. 2 (Spectrum)"},
- {0x7375, 0xe5, 0x3f3e, "Adrian Mole I, pt. 3 (Spectrum)"},
- {0x78d5, 0xe3, 0xcd7d, "Adrian Mole I, pt. 4 (Spectrum)"},
-
- {0x3a31, 0xe5, 0x0bdb, "Adrian Mole I, pt. 1 (BBC)"},
- {0x37f1, 0x77, 0xd231, "Adrian Mole I, pt. 2 (BBC)"},
- {0x3900, 0x1c, 0x5d9a, "Adrian Mole I, pt. 3 (BBC)"},
- {0x3910, 0xac, 0x07f9, "Adrian Mole I, pt. 4 (BBC)"},
- {0x3ad6, 0xa7, 0x95d2, "Adrian Mole I, pt. 5 (BBC)"},
- {0x38a5, 0x0f, 0xdefc, "Adrian Mole I, pt. 6 (BBC)"},
- {0x361e, 0x7e, 0xfd9f, "Adrian Mole I, pt. 7 (BBC)"},
- {0x3934, 0x75, 0xe141, "Adrian Mole I, pt. 8 (BBC)"},
- {0x3511, 0xcc, 0xd829, "Adrian Mole I, pt. 9 (BBC)"},
- {0x38dd, 0x31, 0x2534, "Adrian Mole I, pt. 10 (BBC)"},
- {0x39c0, 0x44, 0x89df, "Adrian Mole I, pt. 11 (BBC)"},
- {0x3a12, 0x8f, 0xc2bd, "Adrian Mole I, pt. 12 (BBC)"},
-
- {0x7931, 0xb9, 0xc51b, "Adrian Mole II, pt. 1 (Commodore 64/Amstrad CPC)"},
- {0x7cdf, 0xa5, 0x43e3, "Adrian Mole II, pt. 2 (Commodore 64/Amstrad CPC)"},
- {0x7a0c, 0x97, 0x4bea, "Adrian Mole II, pt. 3 (Commodore 64/Amstrad CPC)"},
- {0x7883, 0xe2, 0xee0e, "Adrian Mole II, pt. 4 (Commodore 64/Amstrad CPC)"},
-
- {0x6841, 0x4a, 0x94e7, "Adrian Mole II, pt. 1 (Spectrum)"},
- {0x6bc0, 0x62, 0xab3d, "Adrian Mole II, pt. 2 (Spectrum)"},
- {0x692c, 0x21, 0x2015, "Adrian Mole II, pt. 3 (Spectrum)"},
- {0x670a, 0x94, 0xa2a6, "Adrian Mole II, pt. 4 (Spectrum)"},
-
- {0x593a, 0xaf, 0x30e9, "Adrian Mole II, pt. 1 (BBC)"},
- {0x57e6, 0x8a, 0xc41a, "Adrian Mole II, pt. 2 (BBC)"},
- {0x5819, 0xcd, 0x1ba0, "Adrian Mole II, pt. 3 (BBC)"},
- {0x579b, 0xad, 0xa723, "Adrian Mole II, pt. 4 (BBC)"},
-
- {0x765d, 0xcd, 0xfc02, "The Archers, pt. 1 (Commodore 64)"},
- {0x6e58, 0x07, 0xbffc, "The Archers, pt. 2 (Commodore 64)"},
- {0x7e98, 0x6a, 0x95e5, "The Archers, pt. 3 (Commodore 64)"},
- {0x81e2, 0xd5, 0xb278, "The Archers, pt. 4 (Commodore 64)"},
-
- {0x6ce5, 0x58, 0x46de, "The Archers, pt. 1 (Spectrum)"},
- {0x68da, 0xc1, 0x3b8e, "The Archers, pt. 2 (Spectrum)"},
- {0x6c67, 0x9a, 0x9a6a, "The Archers, pt. 3 (Spectrum)"},
- {0x6d91, 0xb9, 0x12a7, "The Archers, pt. 4 (Spectrum)"},
-
- {0x5834, 0x42, 0xcc9d, "The Archers, pt. 1 (BBC)"},
- {0x56dd, 0x51, 0xe582, "The Archers, pt. 2 (BBC)"},
- {0x5801, 0x53, 0xf2ef, "The Archers, pt. 3 (BBC)"},
- {0x54a4, 0x01, 0xc0ab, "The Archers, pt. 4 (BBC)"},
-
- {0x579e, 0x97, 0x9faa, "Lords of Time /T&M GD (BBC)"},
- {0x5500, 0x50, 0xca75, "Red Moon /T&M GD (BBC)"},
- {0x579a, 0x2a, 0x9373, "Price of Magik /T&M GD (BBC)"},
-
- {0x4fd2, 0x9d, 0x799a, "Lancelot, pt. 1 GD (BBC)"},
- {0x4dac, 0xa8, 0x86ed, "Lancelot, pt. 2 GD (BBC)"},
- {0x4f96, 0x22, 0x30f8, "Lancelot, pt. 3 GD (BBC)"},
-
- {0x55ce, 0xa1, 0xba12, "Scapeghost, pt. 1 GD (BBC)"},
- {0x54a6, 0xa9, 0xc9f3, "Scapeghost, pt. 2 GD (BBC)"},
- {0x51bc, 0xe3, 0x89c3, "Scapeghost, pt. 3 GD (BBC)"},
-
- {0x46ec, 0x64, 0x2300, "Knight Orc, pt. 1 GD (Amstrad CPC/Spectrum +3)"},
- {0x6140, 0x18, 0x4f66, "Knight Orc, pt. 2 GD (Amstrad CPC/Spectrum +3)"},
- {0x640e, 0xc1, 0xfc69, "Knight Orc, pt. 3 GD (Amstrad CPC/Spectrum +3)"},
-
- {0x5ff0, 0xf8, 0x3a13, "Gnome Ranger, pt. 1 GD (Amstrad CPC/Spectrum +3)"},
- {0x6024, 0x01, 0xaaa9, "Gnome Ranger, pt. 2 GD (Amstrad CPC/Spectrum +3)"},
- {0x6036, 0x3d, 0x6c6c, "Gnome Ranger, pt. 3 GD (Amstrad CPC/Spectrum +3)"},
-
- {0x69fe, 0x56, 0xecfb, "Lords of Time /T&M GD (Amstrad CPC/Spectrum +3)"},
- {0x6888, 0x8d, 0x7f6a, "Red Moon /T&M GD (Amstrad CPC/Spectrum +3)"},
- {0x5a50, 0xa9, 0xa5fa, "Price of Magik /T&M GD (Amstrad CPC/Spectrum +3)"},
-
- {0x5c7a, 0x44, 0x460e, "Lancelot, pt. 1 GD (Amstrad CPC/Spectrum +3)"},
- {0x53a2, 0x1e, 0x2fae, "Lancelot, pt. 2 GD (Amstrad CPC/Spectrum +3)"},
- {0x5914, 0x22, 0x4a31, "Lancelot, pt. 3 GD (Amstrad CPC/Spectrum +3)"},
-
- {0x5a38, 0xf7, 0x876e, "Ingrid's Back, pt. 1 GD (Amstrad CPC/Spectrum +3)"},
- {0x531a, 0xed, 0xcf3f, "Ingrid's Back, pt. 2 GD (Amstrad CPC/Spectrum +3)"},
- {0x57e4, 0x19, 0xb354, "Ingrid's Back, pt. 3 GD (Amstrad CPC/Spectrum +3)"},
-
- {0x5cbc, 0xa5, 0x0dbe, "Scapeghost, pt. 1 GD (Amstrad CPC/Spectrum +3)"},
- {0x5932, 0x4e, 0xb2f5, "Scapeghost, pt. 2 GD (Amstrad CPC/Spectrum +3)"},
- {0x5860, 0x95, 0x3227, "Scapeghost, pt. 3 GD (Amstrad CPC/Spectrum +3)"},
-
- {0x74e0, 0x92, 0x885e, "Knight Orc, pt. 1 GD (Spectrum 128)"},
- {0x6dbc, 0x97, 0x6f55, "Knight Orc, pt. 2 GD (Spectrum 128)"},
- {0x7402, 0x07, 0x385f, "Knight Orc, pt. 3 GD (Spectrum 128)"},
-
- {0x52aa, 0xdf, 0x7b5b, "Gnome Ranger, pt. 1 GD (Spectrum 128)"},
- {0x6ffa, 0xdb, 0xdde2, "Gnome Ranger, pt. 2 GD (Spectrum 128)"},
- {0x723a, 0x69, 0x039b, "Gnome Ranger, pt. 3 GD (Spectrum 128)"},
-
- {0x6f1e, 0xda, 0x2ce0, "Lords of Time /T&M GD (Spectrum 128)"},
- {0x6da0, 0xb8, 0x3802, "Red Moon /T&M GD (Spectrum 128)"},
- {0x6108, 0xdd, 0xefe7, "Price of Magik /T&M GD (Spectrum 128)"},
-
- {0x768c, 0xe8, 0x8fc6, "Lancelot, pt. 1 GD (Spectrum 128)"},
- {0x76b0, 0x1d, 0x0fcd, "Lancelot, pt. 2 GD (Spectrum 128)"},
- {0x765e, 0x4f, 0x3b73, "Lancelot, pt. 3 GD (Spectrum 128)"},
-
- {0x76a0, 0x3a, 0xb803, "Ingrid's Back, pt. 1 GD (Spectrum 128)"},
- {0x7674, 0x0b, 0xe92f, "Ingrid's Back, pt. 2 GD (Spectrum 128)"},
- {0x765e, 0xba, 0x086d, "Ingrid's Back, pt. 3 GD (Spectrum 128)"},
-
- {0x762e, 0x82, 0x8848, "Scapeghost, pt. 1 GD (Spectrum 128)"},
- {0x5bd6, 0x35, 0x79ef, "Scapeghost, pt. 2 GD (Spectrum 128)"},
- {0x6fa8, 0xa4, 0x62c2, "Scapeghost, pt. 3 GD (Spectrum 128)"},
-
- {0xbb93, 0x36, 0x6a05, "Knight Orc, pt. 1 (Amiga)"},
- {0xbb6e, 0xad, 0x4d40, "Knight Orc, pt. 1 (ST)"},
- {0xc58e, 0x4a, 0x4e9d, "Knight Orc, pt. 2 (Amiga/ST)"},
- {0xcb9a, 0x0f, 0x0804, "Knight Orc, pt. 3 (Amiga/ST)"},
-
- {0xbb6e, 0xa6, 0x9753, "Knight Orc, pt. 1 (PC)"},
- {0xc58e, 0x43, 0xe9ce, "Knight Orc, pt. 2 (PC)"},
- {0xcb9a, 0x08, 0x6c36, "Knight Orc, pt. 3 (PC)"},
-
- {0x898a, 0x43, 0xfc8b, "Knight Orc, pt. 1 (Apple ][)"},
- {0x8b9f, 0x61, 0x7288, "Knight Orc, pt. 2 (Apple ][)"},
- {0x8af9, 0x61, 0x7542, "Knight Orc, pt. 3 (Apple ][)"},
-
- {0x8970, 0x6b, 0x3c7b, "Knight Orc, pt. 1 (Commodore 64 Gfx)"},
- {0x8b90, 0x4e, 0x098c, "Knight Orc, pt. 2 (Commodore 64 Gfx)"},
- {0x8aea, 0x4e, 0xca54, "Knight Orc, pt. 3 (Commodore 64 Gfx)"},
-
- {0x86d0, 0xb7, 0xadbd, "Knight Orc, pt. 1 (Spectrum 48)"},
- {0x8885, 0x22, 0xe293, "Knight Orc, pt. 2 (Spectrum 48)"},
- {0x87e5, 0x0e, 0xdc33, "Knight Orc, pt. 3 (Spectrum 48)"},
-
- {0xb1a9, 0x80, 0x5fb7, "Gnome Ranger, pt. 1 (Amiga/ST)"},
- {0xab9d, 0x31, 0xbe6d, "Gnome Ranger, pt. 2 (Amiga/ST)"},
- {0xae28, 0x87, 0xb6b6, "Gnome Ranger, pt. 3 (Amiga/ST)"},
-
- {0xb0ec, 0xc2, 0x0053, "Gnome Ranger, pt. 1 (ST[v1])"},
- {0xaf82, 0x83, 0x19f7, "Gnome Ranger, pt. 2 (ST[v1])"},
-
- {0xb1aa, 0xad, 0xaf47, "Gnome Ranger, pt. 1 (PC)"},
- {0xb19e, 0x92, 0x8f96, "Gnome Ranger, pt. 1 (ST[v2])"},
- {0xab8b, 0xbf, 0x31e6, "Gnome Ranger, pt. 2 (PC/ST[v2])"},
- {0xae16, 0x81, 0x8741, "Gnome Ranger, pt. 3 (PC/ST[v2])"},
-
- {0xad41, 0xa8, 0x42c5, "Gnome Ranger, pt. 1 (Commodore 64 TO)"},
- {0xa735, 0xf7, 0x2e08, "Gnome Ranger, pt. 2 (Commodore 64 TO)"},
- {0xa9c0, 0x9e, 0x0d70, "Gnome Ranger, pt. 3 (Commodore 64 TO)"},
-
- {0x908e, 0x0d, 0x58a7, "Gnome Ranger, pt. 1 (Commodore 64 Gfx)"},
- {0x8f6f, 0x0a, 0x411a, "Gnome Ranger, pt. 2 (Commodore 64 Gfx)"},
- {0x9060, 0xbb, 0xe75d, "Gnome Ranger, pt. 3 (Commodore 64 Gfx)"},
-
- {0x8aab, 0xc0, 0xde5f, "Gnome Ranger, pt. 1 (Spectrum 48)"},
- {0x8ac8, 0x9a, 0xc89b, "Gnome Ranger, pt. 2 (Spectrum 48)"},
- {0x8a93, 0x4f, 0x10cc, "Gnome Ranger, pt. 3 (Spectrum 48)"},
-
- {0xb57c, 0x44, 0x7779, "Lords of Time /T&M (PC)"},
- {0xa69e, 0x6c, 0xb268, "Red Moon /T&M (PC)"},
- {0xbac7, 0x7f, 0xddb2, "Price of Magik /T&M (PC)"},
-
- {0xb579, 0x89, 0x3e89, "Lords of Time /T&M (ST)"},
- {0xa698, 0x41, 0xcaca, "Red Moon /T&M (ST)"},
- {0xbac4, 0x80, 0xa750, "Price of Magik /T&M (ST)"},
-
- {0xb576, 0x2a, 0x7239, "Lords of Time /T&M (Amiga)"},
- {0xa692, 0xd1, 0x6a99, "Red Moon /T&M (Amiga)"},
- {0xbaca, 0x3a, 0x221b, "Price of Magik /T&M (Amiga)"},
-
- {0xb563, 0x6a, 0x0c5c, "Lords of Time /T&M (Mac)"},
- {0xa67c, 0xb8, 0xff41, "Red Moon /T&M (Mac)"},
- {0xbab2, 0x87, 0x09f5, "Price of Magik /T&M (Mac)"},
-
- {0xb38c, 0x37, 0x9f8e, "Lords of Time /T&M (Commodore 64 TO)"},
- {0xa4e2, 0xa6, 0x016d, "Red Moon /T&M (Commodore 64 TO)"},
- {0xb451, 0xa8, 0x2682, "Price of Magik /T&M (Commodore 64 TO)"},
-
- {0x9070, 0x43, 0x45d4, "Lords of Time /T&M (Commodore 64 Gfx)"},
- {0x903f, 0x6b, 0x603e, "Red Moon /T&M (Commodore 64 Gfx)"},
- {0x8f51, 0xb2, 0x6c9a, "Price of Magik /T&M (Commodore 64 Gfx)"},
-
- {0x8950, 0xa1, 0xbb16, "Lords of Time /T&M (Spectrum 48)"},
- {0x8813, 0x11, 0x22de, "Red Moon /T&M (Spectrum 48)"},
- {0x8a60, 0x2a, 0x29ed, "Price of Magik /T&M (Spectrum 48)"},
-
- {0xb260, 0xe5, 0xc5b2, "Lords of Time /T&M (PC/ST *USA*)"},
- {0xa3a4, 0xdf, 0x6732, "Red Moon /T&M (PC/ST *USA*)"},
- {0xb7a0, 0x7e, 0x2226, "Price of Magik /T&M (PC/ST *USA*)"},
-
- {0xb257, 0xf8, 0xfbd5, "Lords of Time /T&M (Amiga *USA*)"},
- {0xa398, 0x82, 0xd031, "Red Moon /T&M (Amiga *USA*)"},
- {0xb797, 0x1f, 0x84a9, "Price of Magik /T&M (Amiga *USA*)"},
-
- {0x8d78, 0x3a, 0xba6e, "Lords of Time /T&M (Commodore 64 Gfx *USA*)"},
- {0x8d56, 0xd3, 0x146a, "Red Moon /T&M (Commodore 64 Gfx *USA*)"},
- {0x8c46, 0xf0, 0xcaf6, "Price of Magik /T&M (Commodore 64 Gfx *USA*)"},
-
- {0xc0cf, 0x4e, 0xb7fa, "Lancelot, pt. 1 (Amiga/PC/ST)"},
- {0xd5e9, 0x6a, 0x4192, "Lancelot, pt. 2 (Amiga/PC/ST)"},
- {0xbb8f, 0x1a, 0x7487, "Lancelot, pt. 3 (Amiga/PC/ST)"},
-
- {0xc0bd, 0x57, 0x6ef1, "Lancelot, pt. 1 (Mac)"},
- {0xd5d7, 0x99, 0x770b, "Lancelot, pt. 2 (Mac)"},
- {0xbb7d, 0x17, 0xbc42, "Lancelot, pt. 3 (Mac)"},
-
- {0xb4c9, 0x94, 0xd784, "Lancelot, pt. 1 (Commodore 64 TO)"},
- {0xb729, 0x51, 0x8ee5, "Lancelot, pt. 2 (Commodore 64 TO)"},
- {0xb702, 0xe4, 0x1809, "Lancelot, pt. 3 (Commodore 64 TO)"},
-
- {0x8feb, 0xba, 0xa800, "Lancelot, pt. 1 (Commodore 64 Gfx)"},
- {0x8f6b, 0xfa, 0x0f7e, "Lancelot, pt. 2 (Commodore 64 Gfx)"},
- {0x8f71, 0x2f, 0x0ddc, "Lancelot, pt. 3 (Commodore 64 Gfx)"},
-
- {0x8ade, 0xf2, 0xfffb, "Lancelot, pt. 1 (Spectrum 48)"},
- {0x8b0e, 0xfb, 0x0bab, "Lancelot, pt. 2 (Spectrum 48)"},
- {0x8ab3, 0xc1, 0xcb62, "Lancelot, pt. 3 (Spectrum 48)"},
-
- {0xbba4, 0x94, 0x0871, "Lancelot, pt. 1 (Amiga/PC *USA*)"},
- {0xd0c0, 0x56, 0x8c48, "Lancelot, pt. 2 (Amiga/PC *USA*)"},
- {0xb6ac, 0xc6, 0xaea0, "Lancelot, pt. 3 (Amiga/PC *USA*)"},
-
- {0x8afc, 0x07, 0x8321, "Lancelot, pt. 1 (Commodore 64 Gfx *USA*)"},
- {0x8aec, 0x13, 0x6791, "Lancelot, pt. 2 (Commodore 64 Gfx *USA*)"},
- {0x8aba, 0x0d, 0x5602, "Lancelot, pt. 3 (Commodore 64 Gfx *USA*)"},
-
- {0xd19b, 0xad, 0x306d, "Ingrid's Back, pt. 1 (PC)"},
- {0xc5a5, 0xfe, 0x3c98, "Ingrid's Back, pt. 2 (PC)"},
- {0xd7ae, 0x9e, 0x1878, "Ingrid's Back, pt. 3 (PC)"},
-
- {0xd188, 0x13, 0xdc60, "Ingrid's Back, pt. 1 (Amiga)"},
- {0xc594, 0x03, 0xea95, "Ingrid's Back, pt. 2 (Amiga)"},
- {0xd79f, 0xb5, 0x1661, "Ingrid's Back, pt. 3 (Amiga)"},
-
- {0xd183, 0x83, 0xef72, "Ingrid's Back, pt. 1 (ST)"},
- {0xc58f, 0x65, 0xf337, "Ingrid's Back, pt. 2 (ST)"},
- {0xd79a, 0x57, 0x49c5, "Ingrid's Back, pt. 3 (ST)"},
-
- {0xb770, 0x03, 0x9a03, "Ingrid's Back, pt. 1 (Commodore 64 TO)"},
- {0xb741, 0xb6, 0x2aa5, "Ingrid's Back, pt. 2 (Commodore 64 TO)"},
- {0xb791, 0xa1, 0xd065, "Ingrid's Back, pt. 3 (Commodore 64 TO)"},
-
- {0x9089, 0xce, 0xc5e2, "Ingrid's Back, pt. 1 (Commodore 64 Gfx)"},
- {0x908d, 0x80, 0x30c7, "Ingrid's Back, pt. 2 (Commodore 64 Gfx)"},
- {0x909e, 0x9f, 0xdecc, "Ingrid's Back, pt. 3 (Commodore 64 Gfx)"},
-
- {0x8ab7, 0x68, 0xee57, "Ingrid's Back, pt. 1 (Spectrum 48)"},
- {0x8b1e, 0x84, 0x2538, "Ingrid's Back, pt. 2 (Spectrum 48)"},
- {0x8b1c, 0xa8, 0x9262, "Ingrid's Back, pt. 3 (Spectrum 48)"},
-
- {0xbeab, 0x2d, 0x94d9, "Scapeghost, pt. 1 (Amiga)"},
- {0xc132, 0x14, 0x7adc, "Scapeghost, pt. 1 (Amiga *bak*)"},
- {0xbe94, 0xcc, 0x04b8, "Scapeghost, pt. 1 (PC/ST)"},
- {0x99bd, 0x65, 0x032e, "Scapeghost, pt. 2 (Amiga/PC/ST)"},
- {0xbcb6, 0x7a, 0x7d4f, "Scapeghost, pt. 3 (Amiga/PC/ST)"},
-
- {0x9058, 0xcf, 0x9748, "Scapeghost, pt. 1 (Commodore 64 Gfx)"},
- {0x8f43, 0xc9, 0xeefd, "Scapeghost, pt. 2 (Commodore 64 Gfx)"},
- {0x90ac, 0x68, 0xb4a8, "Scapeghost, pt. 3 (Commodore 64 Gfx)"},
-
- {0x8a21, 0xf4, 0xd9e4, "Scapeghost, pt. 1 (Spectrum 48)"},
- {0x8a12, 0xe3, 0xc2ff, "Scapeghost, pt. 2 (Spectrum 48)"},
- {0x8a16, 0xcc, 0x4f3b, "Scapeghost, pt. 3 (Spectrum 48)"},
-
- {0x3ebb, 0x00, 0xf6dc, "Champion of the Raj (English) 1/2 GD (Amiga)"},
- {0x0fd8, 0x00, 0xf250, "Champion of the Raj (English) 2/2 GD (Amiga)"},
-
- {0x3e8f, 0x00, 0x5599, "Champion of the Raj (English) 1/2 GD (ST)"},
-
- {0x3e4f, 0x00, 0xb202, "Champion of the Raj (English) 1/2 GD (PC)"},
- {0x14a3, 0x00, 0xa288, "Champion of the Raj (English) 2/2 GD (PC)"},
-
- {0x1929, 0x00, 0xd4b2, "Champion of the Raj (demo), 1/2 GD (ST)"},
- {0x40e0, 0x02, 0x080d, "Champion of the Raj (demo), 2/2 GD (ST)"},
-
- {0x4872, 0x00, 0x9515, "Champion of the Raj (German) 1/2 GD (Amiga)"},
- {0x11f5, 0x00, 0xbf39, "Champion of the Raj (German) 2/2 GD (Amiga)"},
-
- {0x4846, 0x00, 0xd9c1, "Champion of the Raj (German) 1/2 GD (ST)"},
- {0x11f5, 0x00, 0x7aa4, "Champion of the Raj (German) 2/2 GD (ST)"},
-
- {0x110f, 0x00, 0x4b57, "Champion of the Raj (French) 2/2 GD (ST)"},
-
- {0x0000, 0x00, 0x0000, nullptr}
+ {0x8333, 0xb7, 0xe2ac, "adrianmole1", "Adrian Mole I", "pt. 1/Commodore 64"},
+ {0x844d, 0x50, 0x5353, "adrianmole1", "Adrian Mole I", "pt. 2/Commodore 64"},
+ {0x8251, 0x5f, 0x862a, "adrianmole1", "Adrian Mole I", "pt. 3/Commodore 64"},
+ {0x7a78, 0x5e, 0x6ea3, "adrianmole1", "Adrian Mole I", "pt. 4/Commodore 64"},
+
+ {0x7c6f, 0x0f, 0xba24, "adrianmole1", "Adrian Mole I", "pt. 1/Amstrad CPC"},
+
+ {0x72fa, 0x8b, 0x6f12, "adrianmole1", "Adrian Mole I", "pt. 1/Spectrum"},
+ {0x738e, 0x5b, 0x7e3d, "adrianmole1", "Adrian Mole I", "pt. 2/Spectrum"},
+ {0x7375, 0xe5, 0x3f3e, "adrianmole1", "Adrian Mole I", "pt. 3/Spectrum"},
+ {0x78d5, 0xe3, 0xcd7d, "adrianmole1", "Adrian Mole I", "pt. 4/Spectrum"},
+
+ {0x3a31, 0xe5, 0x0bdb, "adrianmole1", "Adrian Mole I", "pt. 1/BBC"},
+ {0x37f1, 0x77, 0xd231, "adrianmole1", "Adrian Mole I", "pt. 2/BBC"},
+ {0x3900, 0x1c, 0x5d9a, "adrianmole1", "Adrian Mole I", "pt. 3/BBC"},
+ {0x3910, 0xac, 0x07f9, "adrianmole1", "Adrian Mole I", "pt. 4/BBC"},
+ {0x3ad6, 0xa7, 0x95d2, "adrianmole1", "Adrian Mole I", "pt. 5/BBC"},
+ {0x38a5, 0x0f, 0xdefc, "adrianmole1", "Adrian Mole I", "pt. 6/BBC"},
+ {0x361e, 0x7e, 0xfd9f, "adrianmole1", "Adrian Mole I", "pt. 7/BBC"},
+ {0x3934, 0x75, 0xe141, "adrianmole1", "Adrian Mole I", "pt. 8/BBC"},
+ {0x3511, 0xcc, 0xd829, "adrianmole1", "Adrian Mole I", "pt. 9/BBC"},
+ {0x38dd, 0x31, 0x2534, "adrianmole1", "Adrian Mole I", "pt. 10/BBC"},
+ {0x39c0, 0x44, 0x89df, "adrianmole1", "Adrian Mole I", "pt. 11/BBC"},
+ {0x3a12, 0x8f, 0xc2bd, "adrianmole1", "Adrian Mole I", "pt. 12/BBC"},
+
+ {0x7931, 0xb9, 0xc51b, "adrianmole2", "Adrian Mole II", "pt. 1/Commodore 64/Amstrad CPC"},
+ {0x7cdf, 0xa5, 0x43e3, "adrianmole2", "Adrian Mole II", "pt. 2/Commodore 64/Amstrad CPC"},
+ {0x7a0c, 0x97, 0x4bea, "adrianmole2", "Adrian Mole II", "pt. 3/Commodore 64/Amstrad CPC"},
+ {0x7883, 0xe2, 0xee0e, "adrianmole2", "Adrian Mole II", "pt. 4/Commodore 64/Amstrad CPC"},
+
+ {0x6841, 0x4a, 0x94e7, "adrianmole2", "Adrian Mole II", "pt. 1/Spectrum"},
+ {0x6bc0, 0x62, 0xab3d, "adrianmole2", "Adrian Mole II", "pt. 2/Spectrum"},
+ {0x692c, 0x21, 0x2015, "adrianmole2", "Adrian Mole II", "pt. 3/Spectrum"},
+ {0x670a, 0x94, 0xa2a6, "adrianmole2", "Adrian Mole II", "pt. 4/Spectrum"},
+
+ {0x593a, 0xaf, 0x30e9, "adrianmole2", "Adrian Mole II", "pt. 1/BBC"},
+ {0x57e6, 0x8a, 0xc41a, "adrianmole2", "Adrian Mole II", "pt. 2/BBC"},
+ {0x5819, 0xcd, 0x1ba0, "adrianmole2", "Adrian Mole II", "pt. 3/BBC"},
+ {0x579b, 0xad, 0xa723, "adrianmole2", "Adrian Mole II", "pt. 4/BBC"},
+
+ {0x765d, 0xcd, 0xfc02, "thearchers", "The Archers", "pt. 1/Commodore 64"},
+ {0x6e58, 0x07, 0xbffc, "thearchers", "The Archers", "pt. 2/Commodore 64"},
+ {0x7e98, 0x6a, 0x95e5, "thearchers", "The Archers", "pt. 3/Commodore 64"},
+ {0x81e2, 0xd5, 0xb278, "thearchers", "The Archers", "pt. 4/Commodore 64"},
+
+ {0x6ce5, 0x58, 0x46de, "thearchers", "The Archers", "pt. 1/Spectrum"},
+ {0x68da, 0xc1, 0x3b8e, "thearchers", "The Archers", "pt. 2/Spectrum"},
+ {0x6c67, 0x9a, 0x9a6a, "thearchers", "The Archers", "pt. 3/Spectrum"},
+ {0x6d91, 0xb9, 0x12a7, "thearchers", "The Archers", "pt. 4/Spectrum"},
+
+ {0x5834, 0x42, 0xcc9d, "thearchers", "The Archers", "pt. 1/BBC"},
+ {0x56dd, 0x51, 0xe582, "thearchers", "The Archers", "pt. 2/BBC"},
+ {0x5801, 0x53, 0xf2ef, "thearchers", "The Archers", "pt. 3/BBC"},
+ {0x54a4, 0x01, 0xc0ab, "thearchers", "The Archers", "pt. 4/BBC"},
+
+ {0x5323, 0xb7, 0x8af7, "adventurequest", "Adventure Quest", "Amstrad CPC/Spectrum"},
+ {0x6e60, 0x83, 0x18e0, "adventurequest", "Adventure Quest /JoD", "Amiga/PC"},
+ {0x6e5c, 0xf6, 0xd356, "adventurequest", "Adventure Quest /JoD", "ST"},
+ {0x6970, 0xd6, 0xa820, "adventurequest", "Adventure Quest /JoD", "Spectrum 128"},
+ {0x6968, 0x32, 0x0c01, "adventurequest", "Adventure Quest /JoD", "Amstrad CPC128/Spectrum +3"},
+ {0x5b50, 0x66, 0x1800, "adventurequest", "Adventure Quest /JoD", "Amstrad CPC64"},
+ {0x63b6, 0x2e, 0xef38, "adventurequest", "Adventure Quest /JoD", "Commodore 64"},
+ {0x5b58, 0x50, 0x332e, "adventurequest", "Adventure Quest /JoD", "Atari"},
+ {0x5ace, 0x11, 0xdc12, "adventurequest", "Adventure Quest /JoD", "Spectrum 48"},
+
+ {0x3ebb, 0x00, 0xf6dc, "championraj", "Champion of the Raj", "English 1/2 GD/Amiga"},
+ {0x0fd8, 0x00, 0xf250, "championraj", "Champion of the Raj", "English 2/2 GD/Amiga"},
+
+ {0x3e8f, 0x00, 0x5599, "championraj", "Champion of the Raj", "English 1/2 GD/ST"},
+
+ {0x3e4f, 0x00, 0xb202, "championraj", "Champion of the Raj", "English 1/2 GD/PC"},
+ {0x14a3, 0x00, 0xa288, "championraj", "Champion of the Raj", "English 2/2 GD/PC"},
+
+ {0x1929, 0x00, 0xd4b2, "championraj", "Champion of the Raj", "demo, 1/2 GD/ST"},
+ {0x40e0, 0x02, 0x080d, "championraj", "Champion of the Raj", "demo, 2/2 GD/ST"},
+
+ {0x4872, 0x00, 0x9515, "championraj", "Champion of the Raj", "German 1/2 GD/Amiga"},
+ {0x11f5, 0x00, 0xbf39, "championraj", "Champion of the Raj", "German 2/2 GD/Amiga"},
+
+ {0x4846, 0x00, 0xd9c1, "championraj", "Champion of the Raj", "German 1/2 GD/ST"},
+ {0x11f5, 0x00, 0x7aa4, "championraj", "Champion of the Raj", "German 2/2 GD/ST"},
+
+ {0x110f, 0x00, 0x4b57, "championraj", "Champion of the Raj", "French 2/2 GD/ST"},
+
+ {0x76f4, 0x5e, 0x1fe5, "colossaladvjod", "Colossal Adventure /JoD", "Amiga/PC"},
+ {0x76f4, 0x5a, 0xcf4b, "colossaladvjod", "Colossal Adventure /JoD", "ST"},
+ {0x6f70, 0x40, 0xbd91, "colossaladvjod", "Colossal Adventure /JoD", "MSX"},
+ {0x6f6e, 0x78, 0x28cd, "colossaladvjod", "Colossal Adventure /JoD", "Spectrum 128"},
+ {0x6f4d, 0xcb, 0xe8f2, "colossaladvjod", "Colossal Adventure /JoD", "Amstrad CPC128[v1]/Spectrum +3"},
+ {0x6f6a, 0xa5, 0x8dd2, "colossaladvjod", "Colossal Adventure /JoD", "Amstrad CPC128[v2]"},
+ {0x5e31, 0x7c, 0xaa54, "colossaladvjod", "Colossal Adventure /JoD", "Amstrad CPC64"},
+ {0x6c8e, 0xb6, 0x9be3, "colossaladvjod", "Colossal Adventure /JoD", "Commodore 64"},
+ {0x5b16, 0x3b, 0xe2aa, "colossaladvjod", "Colossal Adventure /JoD", "Atari"},
+ {0x5a8e, 0xf2, 0x7cca, "colossaladvjod", "Colossal Adventure /JoD", "Spectrum 48"},
+
+ {0x630e, 0x8d, 0x7d7d, "dungeonadv", "Dungeon Adventure", "Amstrad CPC"},
+ {0x630e, 0xbe, 0x3374, "dungeonadv", "Dungeon Adventure", "MSX"},
+ {0x6de8, 0x4c, 0xd795, "dungeonadvjod", "Dungeon Adventure /JoD", "Spectrum 128"},
+ {0x6dc0, 0x63, 0x5d95, "dungeonadvjod", "Dungeon Adventure /JoD", "Amstrad CPC128/Spectrum +3"},
+ {0x58a6, 0x24, 0xb50f, "dungeonadvjod", "Dungeon Adventure /JoD", "Amstrad CPC64"},
+ {0x6bd2, 0x65, 0xa41f, "dungeonadvjod", "Dungeon Adventure /JoD", "Commodore 64"},
+ {0x593a, 0x80, 0x7a34, "dungeonadvjod", "Dungeon Adventure /JoD", "Atari"},
+ {0x58a3, 0x38, 0x8ce4, "dungeonadvjod", "Dungeon Adventure /JoD", "Spectrum 48"},
+ {0x6f0c, 0x95, 0x1f64, "dungeonadvjod", "Dungeon Adventure /JoD", "Amiga/PC/ST"},
+
+ {0x63be, 0xd6, 0xcf5d, "emeraldisle", "Emerald Isle", "Atari/Commodore 64/Amstrad CPC/Spectrum"},
+ {0x63be, 0x0a, 0x21ed, "emeraldisle", "Emerald Isle", "MSX *corrupt*"},
+ {0x378c, 0x8d, 0x3a21, "emeraldisle", "Emerald Isle", "BBC"},
+
+ {0x34b3, 0x20, 0xccda, "eriktheviking", "Erik the Viking", "BBC/Commodore 64"},
+ {0x34b3, 0x53, 0x8f00, "eriktheviking", "Erik the Viking", "Spectrum"},
+ {0x34b3, 0xc7, 0x9058, "eriktheviking", "Erik the Viking", "Amstrad CPC"},
+
+ {0x5ff0, 0xf8, 0x3a13, "gnomeranger", "Gnome Ranger", "pt. 1 GD/Amstrad CPC/Spectrum +3"},
+ {0x6024, 0x01, 0xaaa9, "gnomeranger", "Gnome Ranger", "pt. 2 GD/Amstrad CPC/Spectrum +3"},
+ {0x6036, 0x3d, 0x6c6c, "gnomeranger", "Gnome Ranger", "pt. 3 GD/Amstrad CPC/Spectrum +3"},
+
+ {0x52aa, 0xdf, 0x7b5b, "gnomeranger", "Gnome Ranger", "pt. 1 GD/Spectrum 128"},
+ {0x6ffa, 0xdb, 0xdde2, "gnomeranger", "Gnome Ranger", "pt. 2 GD/Spectrum 128"},
+ {0x723a, 0x69, 0x039b, "gnomeranger", "Gnome Ranger", "pt. 3 GD/Spectrum 128"},
+
+ {0xb1a9, 0x80, 0x5fb7, "gnomeranger", "Gnome Ranger", "pt. 1/Amiga/ST"},
+ {0xab9d, 0x31, 0xbe6d, "gnomeranger", "Gnome Ranger", "pt. 2/Amiga/ST"},
+ {0xae28, 0x87, 0xb6b6, "gnomeranger", "Gnome Ranger", "pt. 3/Amiga/ST"},
+
+ {0xb0ec, 0xc2, 0x0053, "gnomeranger", "Gnome Ranger", "pt. 1/ST[v1]"},
+ {0xaf82, 0x83, 0x19f7, "gnomeranger", "Gnome Ranger", "pt. 2/ST[v1]"},
+
+ {0xb1aa, 0xad, 0xaf47, "gnomeranger", "Gnome Ranger", "pt. 1/PC"},
+ {0xb19e, 0x92, 0x8f96, "gnomeranger", "Gnome Ranger", "pt. 1/ST[v2]"},
+ {0xab8b, 0xbf, 0x31e6, "gnomeranger", "Gnome Ranger", "pt. 2/PC/ST[v2]"},
+ {0xae16, 0x81, 0x8741, "gnomeranger", "Gnome Ranger", "pt. 3/PC/ST[v2]"},
+
+ {0xad41, 0xa8, 0x42c5, "gnomeranger", "Gnome Ranger", "pt. 1/Commodore 64 TO"},
+ {0xa735, 0xf7, 0x2e08, "gnomeranger", "Gnome Ranger", "pt. 2/Commodore 64 TO"},
+ {0xa9c0, 0x9e, 0x0d70, "gnomeranger", "Gnome Ranger", "pt. 3/Commodore 64 TO"},
+
+ {0x908e, 0x0d, 0x58a7, "gnomeranger", "Gnome Ranger", "pt. 1/Commodore 64 Gfx"},
+ {0x8f6f, 0x0a, 0x411a, "gnomeranger", "Gnome Ranger", "pt. 2/Commodore 64 Gfx"},
+ {0x9060, 0xbb, 0xe75d, "gnomeranger", "Gnome Ranger", "pt. 3/Commodore 64 Gfx"},
+
+ {0x8aab, 0xc0, 0xde5f, "gnomeranger", "Gnome Ranger", "pt. 1/Spectrum 48"},
+ {0x8ac8, 0x9a, 0xc89b, "gnomeranger", "Gnome Ranger", "pt. 2/Spectrum 48"},
+ {0x8a93, 0x4f, 0x10cc, "gnomeranger", "Gnome Ranger", "pt. 3/Spectrum 48"},
+
+ {0x5a38, 0xf7, 0x876e, "ingridsback", "Ingrid's Back", "pt. 1 GD/Amstrad CPC/Spectrum +3"},
+ {0x531a, 0xed, 0xcf3f, "ingridsback", "Ingrid's Back", "pt. 2 GD/Amstrad CPC/Spectrum +3"},
+ {0x57e4, 0x19, 0xb354, "ingridsback", "Ingrid's Back", "pt. 3 GD/Amstrad CPC/Spectrum +3"},
+
+ {0x76a0, 0x3a, 0xb803, "ingridsback", "Ingrid's Back", "pt. 1 GD/Spectrum 128"},
+ {0x7674, 0x0b, 0xe92f, "ingridsback", "Ingrid's Back", "pt. 2 GD/Spectrum 128"},
+ {0x765e, 0xba, 0x086d, "ingridsback", "Ingrid's Back", "pt. 3 GD/Spectrum 128"},
+
+ {0xd19b, 0xad, 0x306d, "ingridsback", "Ingrid's Back", "pt. 1/PC"},
+ {0xc5a5, 0xfe, 0x3c98, "ingridsback", "Ingrid's Back", "pt. 2/PC"},
+ {0xd7ae, 0x9e, 0x1878, "ingridsback", "Ingrid's Back", "pt. 3/PC"},
+
+ {0xd188, 0x13, 0xdc60, "ingridsback", "Ingrid's Back", "pt. 1/Amiga"},
+ {0xc594, 0x03, 0xea95, "ingridsback", "Ingrid's Back", "pt. 2/Amiga"},
+ {0xd79f, 0xb5, 0x1661, "ingridsback", "Ingrid's Back", "pt. 3/Amiga"},
+
+ {0xd183, 0x83, 0xef72, "ingridsback", "Ingrid's Back", "pt. 1/ST"},
+ {0xc58f, 0x65, 0xf337, "ingridsback", "Ingrid's Back", "pt. 2/ST"},
+ {0xd79a, 0x57, 0x49c5, "ingridsback", "Ingrid's Back", "pt. 3/ST"},
+
+ {0xb770, 0x03, 0x9a03, "ingridsback", "Ingrid's Back", "pt. 1/Commodore 64 TO"},
+ {0xb741, 0xb6, 0x2aa5, "ingridsback", "Ingrid's Back", "pt. 2/Commodore 64 TO"},
+ {0xb791, 0xa1, 0xd065, "ingridsback", "Ingrid's Back", "pt. 3/Commodore 64 TO"},
+
+ {0x9089, 0xce, 0xc5e2, "ingridsback", "Ingrid's Back", "pt. 1/Commodore 64 Gfx"},
+ {0x908d, 0x80, 0x30c7, "ingridsback", "Ingrid's Back", "pt. 2/Commodore 64 Gfx"},
+ {0x909e, 0x9f, 0xdecc, "ingridsback", "Ingrid's Back", "pt. 3/Commodore 64 Gfx"},
+
+ {0x8ab7, 0x68, 0xee57, "ingridsback", "Ingrid's Back", "pt. 1/Spectrum 48"},
+ {0x8b1e, 0x84, 0x2538, "ingridsback", "Ingrid's Back", "pt. 2/Spectrum 48"},
+ {0x8b1c, 0xa8, 0x9262, "ingridsback", "Ingrid's Back", "pt. 3/Spectrum 48"},
+
+ {0x46ec, 0x64, 0x2300, "knightorc", "Knight Orc", "pt. 1 GD/Amstrad CPC/Spectrum +3"},
+ {0x6140, 0x18, 0x4f66, "knightorc", "Knight Orc", "pt. 2 GD/Amstrad CPC/Spectrum +3"},
+ {0x640e, 0xc1, 0xfc69, "knightorc", "Knight Orc", "pt. 3 GD/Amstrad CPC/Spectrum +3"},
+
+ {0x74e0, 0x92, 0x885e, "knightorc", "Knight Orc", "pt. 1 GD/Spectrum 128"},
+ {0x6dbc, 0x97, 0x6f55, "knightorc", "Knight Orc", "pt. 2 GD/Spectrum 128"},
+ {0x7402, 0x07, 0x385f, "knightorc", "Knight Orc", "pt. 3 GD/Spectrum 128"},
+
+ {0xbb93, 0x36, 0x6a05, "knightorc", "Knight Orc", "pt. 1/Amiga"},
+ {0xbb6e, 0xad, 0x4d40, "knightorc", "Knight Orc", "pt. 1/ST"},
+ {0xc58e, 0x4a, 0x4e9d, "knightorc", "Knight Orc", "pt. 2/Amiga/ST"},
+ {0xcb9a, 0x0f, 0x0804, "knightorc", "Knight Orc", "pt. 3/Amiga/ST"},
+
+ {0xbb6e, 0xa6, 0x9753, "knightorc", "Knight Orc", "pt. 1/PC"},
+ {0xc58e, 0x43, 0xe9ce, "knightorc", "Knight Orc", "pt. 2/PC"},
+ {0xcb9a, 0x08, 0x6c36, "knightorc", "Knight Orc", "pt. 3/PC"},
+
+ {0x898a, 0x43, 0xfc8b, "knightorc", "Knight Orc", "pt. 1/Apple ]["},
+ {0x8b9f, 0x61, 0x7288, "knightorc", "Knight Orc", "pt. 2/Apple ]["},
+ {0x8af9, 0x61, 0x7542, "knightorc", "Knight Orc", "pt. 3/Apple ]["},
+
+ {0x8970, 0x6b, 0x3c7b, "knightorc", "Knight Orc", "pt. 1/Commodore 64 Gfx"},
+ {0x8b90, 0x4e, 0x098c, "knightorc", "Knight Orc", "pt. 2/Commodore 64 Gfx"},
+ {0x8aea, 0x4e, 0xca54, "knightorc", "Knight Orc", "pt. 3/Commodore 64 Gfx"},
+
+ {0x86d0, 0xb7, 0xadbd, "knightorc", "Knight Orc", "pt. 1/Spectrum 48"},
+ {0x8885, 0x22, 0xe293, "knightorc", "Knight Orc", "pt. 2/Spectrum 48"},
+ {0x87e5, 0x0e, 0xdc33, "knightorc", "Knight Orc", "pt. 3/Spectrum 48"},
+
+ {0x4fd2, 0x9d, 0x799a, "lancelot", "Lancelot", "pt. 1 GD/BBC"},
+ {0x4dac, 0xa8, 0x86ed, "lancelot", "Lancelot", "pt. 2 GD/BBC"},
+ {0x4f96, 0x22, 0x30f8, "lancelot", "Lancelot", "pt. 3 GD/BBC"},
+
+ {0x5c7a, 0x44, 0x460e, "lancelot", "Lancelot", "pt. 1 GD/Amstrad CPC/Spectrum +3"},
+ {0x53a2, 0x1e, 0x2fae, "lancelot", "Lancelot", "pt. 2 GD/Amstrad CPC/Spectrum +3"},
+ {0x5914, 0x22, 0x4a31, "lancelot", "Lancelot", "pt. 3 GD/Amstrad CPC/Spectrum +3"},
+
+ {0x768c, 0xe8, 0x8fc6, "lancelot", "Lancelot", "pt. 1 GD/Spectrum 128"},
+ {0x76b0, 0x1d, 0x0fcd, "lancelot", "Lancelot", "pt. 2 GD/Spectrum 128"},
+ {0x765e, 0x4f, 0x3b73, "lancelot", "Lancelot", "pt. 3 GD/Spectrum 128"},
+
+ {0xc0cf, 0x4e, 0xb7fa, "lancelot", "Lancelot", "pt. 1/Amiga/PC/ST"},
+ {0xd5e9, 0x6a, 0x4192, "lancelot", "Lancelot", "pt. 2/Amiga/PC/ST"},
+ {0xbb8f, 0x1a, 0x7487, "lancelot", "Lancelot", "pt. 3/Amiga/PC/ST"},
+
+ {0xc0bd, 0x57, 0x6ef1, "lancelot", "Lancelot", "pt. 1/Mac"},
+ {0xd5d7, 0x99, 0x770b, "lancelot", "Lancelot", "pt. 2/Mac"},
+ {0xbb7d, 0x17, 0xbc42, "lancelot", "Lancelot", "pt. 3/Mac"},
+
+ {0xb4c9, 0x94, 0xd784, "lancelot", "Lancelot", "pt. 1/Commodore 64 TO"},
+ {0xb729, 0x51, 0x8ee5, "lancelot", "Lancelot", "pt. 2/Commodore 64 TO"},
+ {0xb702, 0xe4, 0x1809, "lancelot", "Lancelot", "pt. 3/Commodore 64 TO"},
+
+ {0x8feb, 0xba, 0xa800, "lancelot", "Lancelot", "pt. 1/Commodore 64 Gfx"},
+ {0x8f6b, 0xfa, 0x0f7e, "lancelot", "Lancelot", "pt. 2/Commodore 64 Gfx"},
+ {0x8f71, 0x2f, 0x0ddc, "lancelot", "Lancelot", "pt. 3/Commodore 64 Gfx"},
+
+ {0x8ade, 0xf2, 0xfffb, "lancelot", "Lancelot", "pt. 1/Spectrum 48"},
+ {0x8b0e, 0xfb, 0x0bab, "lancelot", "Lancelot", "pt. 2/Spectrum 48"},
+ {0x8ab3, 0xc1, 0xcb62, "lancelot", "Lancelot", "pt. 3/Spectrum 48"},
+
+ {0xbba4, 0x94, 0x0871, "lancelot", "Lancelot", "pt. 1/Amiga/PC *USA*"},
+ {0xd0c0, 0x56, 0x8c48, "lancelot", "Lancelot", "pt. 2/Amiga/PC *USA*"},
+ {0xb6ac, 0xc6, 0xaea0, "lancelot", "Lancelot", "pt. 3/Amiga/PC *USA*"},
+
+ {0x8afc, 0x07, 0x8321, "lancelot", "Lancelot", "pt. 1/Commodore 64 Gfx *USA*"},
+ {0x8aec, 0x13, 0x6791, "lancelot", "Lancelot", "pt. 2/Commodore 64 Gfx *USA*"},
+ {0x8aba, 0x0d, 0x5602, "lancelot", "Lancelot", "pt. 3/Commodore 64 Gfx *USA*"},
+
+ {0x5eb9, 0x30, 0xe99a, "lordsoftime", "Lords of Time", "Amstrad CPC"},
+ {0x5eb9, 0x5d, 0xc098, "lordsoftime", "Lords of Time", "MSX"},
+ {0x5eb9, 0x6e, 0xc689, "lordsoftime", "Lords of Time", "Spectrum"},
+ {0x579e, 0x97, 0x9faa, "lordsoftimetmgd", "Lords of Time /T&M GD", "BBC"},
+ {0x69fe, 0x56, 0xecfb, "lordsoftimetmgd", "Lords of Time /T&M GD", "Amstrad CPC/Spectrum +3"},
+ {0x6f1e, 0xda, 0x2ce0, "lordsoftimetmgd", "Lords of Time /T&M GD", "Spectrum 128"},
+ {0xb57c, 0x44, 0x7779, "lordsoftimetm", "Lords of Time /T&M", "PC"},
+ {0xb579, 0x89, 0x3e89, "lordsoftimetm", "Lords of Time /T&M", "ST"},
+ {0xb576, 0x2a, 0x7239, "lordsoftimetm", "Lords of Time /T&M", "Amiga"},
+ {0xb563, 0x6a, 0x0c5c, "lordsoftimetm", "Lords of Time /T&M", "Mac"},
+ {0xb38c, 0x37, 0x9f8e, "lordsoftimetm", "Lords of Time /T&M", "Commodore 64 TO"},
+ {0x9070, 0x43, 0x45d4, "lordsoftimetm", "Lords of Time /T&M", "Commodore 64 Gfx"},
+ {0x8950, 0xa1, 0xbb16, "lordsoftimetm", "Lords of Time /T&M", "Spectrum 48"},
+ {0xb260, 0xe5, 0xc5b2, "lordsoftimetm", "Lords of Time /T&M", "PC/ST *USA*"},
+ {0xb257, 0xf8, 0xfbd5, "lordsoftimetm", "Lords of Time /T&M", "Amiga *USA*"},
+ {0x8d78, 0x3a, 0xba6e, "lordsoftimetm", "Lords of Time /T&M", "Commodore 64 Gfx *USA*"},
+
+ {0x7410, 0x5e, 0x60be, "princeofmagik", "Price of Magik", "Spectrum 128"},
+ {0x5aa4, 0xc1, 0x10a0, "princeofmagik", "Price of Magik", "Spectrum 48[v1]"},
+ {0x5aa4, 0xc1, 0xeda4, "princeofmagik", "Price of Magik", "Spectrum 48[v2]"},
+ {0x6fc6, 0x14, 0xf9b6, "princeofmagik", "Price of Magik", "Commodore 64"},
+ {0x5aa4, 0xc1, 0xbbf4, "princeofmagik", "Price of Magik", "Amstrad CPC"},
+ {0x5671, 0xbc, 0xff35, "princeofmagik", "Price of Magik", "BBC"},
+ {0x6108, 0xdd, 0xefe7, "princeofmagiktmgd", "Price of Magik /T&M GD", "Spectrum 128"},
+ {0x579a, 0x2a, 0x9373, "princeofmagiktmgd", "Price of Magik /T&M GD", "BBC"},
+ {0x5a50, 0xa9, 0xa5fa, "princeofmagiktmgd", "Price of Magik /T&M GD", "Amstrad CPC/Spectrum +3"},
+ {0xbac7, 0x7f, 0xddb2, "princeofmagiktm", "Price of Magik /T&M", "PC"},
+ {0xbac4, 0x80, 0xa750, "princeofmagiktm", "Price of Magik /T&M", "ST"},
+ {0xbaca, 0x3a, 0x221b, "princeofmagiktm", "Price of Magik /T&M", "Amiga"},
+ {0xbab2, 0x87, 0x09f5, "princeofmagiktm", "Price of Magik /T&M", "Mac"},
+ {0xb451, 0xa8, 0x2682, "princeofmagiktm", "Price of Magik /T&M", "Commodore 64 TO"},
+ {0x8f51, 0xb2, 0x6c9a, "princeofmagiktm", "Price of Magik /T&M", "Commodore 64 Gfx"},
+ {0x8a60, 0x2a, 0x29ed, "princeofmagiktm", "Price of Magik /T&M", "Spectrum 48"},
+ {0xb7a0, 0x7e, 0x2226, "princeofmagiktm", "Price of Magik /T&M", "PC/ST *USA*"},
+ {0xb797, 0x1f, 0x84a9, "princeofmagiktm", "Price of Magik /T&M", "Amiga *USA*"},
+ {0x8c46, 0xf0, 0xcaf6, "princeofmagiktm", "Price of Magik /T&M", "Commodore 64 Gfx *USA*"},
+
+ {0x506c, 0xf0, 0xba72, "redmoon", "Red Moon", "BBC/Commodore 64/Amstrad CPC/MSX"},
+ {0x505d, 0x32, 0x2dcf, "redmoon", "Red Moon", "Spectrum"},
+ {0x6da0, 0xb8, 0x3802, "redmoontmgd", "Red Moon /T&M GD", "Spectrum 128"},
+ {0x6888, 0x8d, 0x7f6a, "redmoontmgd", "Red Moon /T&M GD", "Amstrad CPC/Spectrum +3"},
+ {0x5500, 0x50, 0xca75, "redmoontmgd", "Red Moon /T&M GD", "BBC"},
+ {0xa69e, 0x6c, 0xb268, "redmoontm", "Red Moon /T&M", "PC"},
+ {0xa698, 0x41, 0xcaca, "redmoontm", "Red Moon /T&M", "ST"},
+ {0xa692, 0xd1, 0x6a99, "redmoontm", "Red Moon /T&M", "Amiga"},
+ {0xa67c, 0xb8, 0xff41, "redmoontm", "Red Moon /T&M", "Mac"},
+ {0xa4e2, 0xa6, 0x016d, "redmoontm", "Red Moon /T&M", "Commodore 64 TO"},
+ {0x903f, 0x6b, 0x603e, "redmoontm", "Red Moon /T&M", "Commodore 64 Gfx"},
+ {0x8813, 0x11, 0x22de, "redmoontm", "Red Moon /T&M", "Spectrum 48"},
+ {0xa3a4, 0xdf, 0x6732, "redmoontm", "Red Moon /T&M", "PC/ST *USA*"},
+ {0xa398, 0x82, 0xd031, "redmoontm", "Red Moon /T&M", "Amiga *USA*"},
+ {0x8d56, 0xd3, 0x146a, "redmoontm", "Red Moon /T&M", "Commodore 64 Gfx *USA*"},
+
+ {0x60c4, 0x28, 0x0154, "returntoeden", "Return to Eden", "Amstrad CPC/Commodore 64[v1]"},
+ {0x6064, 0x01, 0x5b3c, "returntoeden", "Return to Eden", "BBC[v1]"},
+ {0x6064, 0x95, 0x510c, "returntoeden", "Return to Eden", "Commodore 64[v2]"},
+ {0x6064, 0xda, 0xe610, "returntoeden", "Return to Eden", "Commodore 64[v2] *corrupt*"},
+ {0x6064, 0xbd, 0x73ec, "returntoeden", "Return to Eden", "Atari *corrupt*"},
+ {0x6047, 0x6c, 0x17ab, "returntoeden", "Return to Eden", "BBC[v2]"},
+ {0x5ca1, 0x33, 0x1c43, "returntoeden", "Return to Eden", "Spectrum[v1]"},
+ {0x5cb7, 0x64, 0x0790, "returntoeden", "Return to Eden", "Spectrum[v2]"},
+ {0x5cb7, 0xfe, 0x3533, "returntoeden", "Return to Eden", "MSX"},
+ {0x7d16, 0xe6, 0x5438, "returntoedensd", "Return to Eden /SD", "Amiga/ST"},
+ {0x7d14, 0xe8, 0xfbab, "returntoedensd", "Return to Eden /SD", "PC"},
+ {0x7cff, 0xf8, 0x6044, "returntoedensd", "Return to Eden /SD", "Amstrad CPC/Spectrum +3"},
+ {0x7cf8, 0x24, 0x9c1c, "returntoedensd", "Return to Eden /SD", "Mac"},
+ {0x7c55, 0x18, 0xdaee, "returntoedensd", "Return to Eden /SD", "Spectrum 128"},
+ {0x772f, 0xca, 0x8602, "returntoedensd", "Return to Eden /SD", "Commodore 64"},
+ {0x60f7, 0x68, 0xc2bc, "returntoedensd", "Return to Eden /SD", "Atari"},
+ {0x639c, 0x8b, 0x06e2, "returntoedensd", "Return to Eden /SD", "Apple ]["},
+ {0x5f43, 0xca, 0x828c, "returntoedensd", "Return to Eden /SD", "Spectrum 48"},
+
+ {0x55ce, 0xa1, 0xba12, "scapeghost", "Scapeghost", "pt. 1 GD/BBC"},
+ {0x54a6, 0xa9, 0xc9f3, "scapeghost", "Scapeghost", "pt. 2 GD/BBC"},
+ {0x51bc, 0xe3, 0x89c3, "scapeghost", "Scapeghost", "pt. 3 GD/BBC"},
+
+ {0x5cbc, 0xa5, 0x0dbe, "scapeghost", "Scapeghost", "pt. 1 GD/Amstrad CPC/Spectrum +3"},
+ {0x5932, 0x4e, 0xb2f5, "scapeghost", "Scapeghost", "pt. 2 GD/Amstrad CPC/Spectrum +3"},
+ {0x5860, 0x95, 0x3227, "scapeghost", "Scapeghost", "pt. 3 GD/Amstrad CPC/Spectrum +3"},
+
+ {0x762e, 0x82, 0x8848, "scapeghost", "Scapeghost", "pt. 1 GD/Spectrum 128"},
+ {0x5bd6, 0x35, 0x79ef, "scapeghost", "Scapeghost", "pt. 2 GD/Spectrum 128"},
+ {0x6fa8, 0xa4, 0x62c2, "scapeghost", "Scapeghost", "pt. 3 GD/Spectrum 128"},
+
+ {0xbeab, 0x2d, 0x94d9, "scapeghost", "Scapeghost", "pt. 1/Amiga"},
+ {0xc132, 0x14, 0x7adc, "scapeghost", "Scapeghost", "pt. 1/Amiga *bak*"},
+ {0xbe94, 0xcc, 0x04b8, "scapeghost", "Scapeghost", "pt. 1/PC/ST"},
+ {0x99bd, 0x65, 0x032e, "scapeghost", "Scapeghost", "pt. 2/Amiga/PC/ST"},
+ {0xbcb6, 0x7a, 0x7d4f, "scapeghost", "Scapeghost", "pt. 3/Amiga/PC/ST"},
+
+ {0x9058, 0xcf, 0x9748, "scapeghost", "Scapeghost", "pt. 1/Commodore 64 Gfx"},
+ {0x8f43, 0xc9, 0xeefd, "scapeghost", "Scapeghost", "pt. 2/Commodore 64 Gfx"},
+ {0x90ac, 0x68, 0xb4a8, "scapeghost", "Scapeghost", "pt. 3/Commodore 64 Gfx"},
+
+ {0x8a21, 0xf4, 0xd9e4, "scapeghost", "Scapeghost", "pt. 1/Spectrum 48"},
+ {0x8a12, 0xe3, 0xc2ff, "scapeghost", "Scapeghost", "pt. 2/Spectrum 48"},
+ {0x8a16, 0xcc, 0x4f3b, "scapeghost", "Scapeghost", "pt. 3/Spectrum 48"},
+
+ {0x5fab, 0x5c, 0xa309, "snowball", "Snowball", "Amstrad CPC"},
+ {0x5fab, 0x2f, 0x8aa2, "snowball", "Snowball", "MSX"},
+ {0x7b31, 0x6e, 0x2e2b, "snowballsd", "Snowball /SD", "Amiga/ST"},
+ {0x7b2f, 0x70, 0x6955, "snowballsd", "Snowball /SD", "Mac/PC/Spectrum 128"},
+ {0x7b2f, 0x70, 0x6f6c, "snowballsd", "Snowball /SD", "Amstrad CPC/Spectrum +3"},
+ {0x7363, 0x65, 0xa0ab, "snowballsd", "Snowball /SD", "Commodore 64"},
+ {0x6bf8, 0x3f, 0xc9f7, "snowballsd", "Snowball /SD", "Atari"},
+ {0x67a3, 0x9d, 0x1d05, "snowballsd", "Snowball /SD", "Apple ]["},
+ {0x6541, 0x02, 0x2e6c, "snowballsd", "Snowball /SD", "Spectrum 48"},
+
+ {0x772b, 0xcd, 0xa503, "worminparadise", "Worm in Paradise", "Spectrum 128"},
+ {0x546c, 0xb7, 0x9420, "worminparadise", "Worm in Paradise", "Spectrum 48"},
+ {0x6d84, 0xf9, 0x49ae, "worminparadise", "Worm in Paradise", "Commodore 64 *corrupt*"},
+ {0x6d84, 0xc8, 0x943f, "worminparadise", "Worm in Paradise", "Commodore 64 *fixed*"},
+ {0x6030, 0x47, 0x46ad, "worminparadise", "Worm in Paradise", "Amstrad CPC"},
+ {0x5828, 0xbd, 0xe7cb, "worminparadise", "Worm in Paradise", "BBC"},
+ {0x7cd9, 0x0c, 0x4df1, "worminparadise", "Worm in Paradise /SD", "Amiga/ST"},
+ {0x7cd7, 0x0e, 0x4feb, "worminparadisesd", "Worm in Paradise /SD", "Amstrad CPC/Mac/PC/Spectrum 128/Spectrum +3"},
+ {0x788d, 0x72, 0x888a, "worminparadisesd", "Worm in Paradise /SD", "Commodore 64"},
+ {0x6161, 0xf3, 0xe6d7, "worminparadisesd", "Worm in Paradise /SD", "Atari"},
+ {0x60dd, 0xf2, 0x5bb8, "worminparadisesd", "Worm in Paradise /SD", "Apple ]["},
+ {0x5ebb, 0xf1, 0x4dec, "worminparadisesd", "Worm in Paradise /SD", "Spectrum 48"},
+
+ {0x0000, 0x00, 0x0000, nullptr, nullptr, nullptr}
};
/**
@@ -803,13 +777,6 @@ const L9V1GameInfo L9_V1_GAMES[] = {
0x15, 0x6c, 284, -0x00f0, 0x0000, -0x0050, -0x0050, -0x0050, 0x0300, 0x1930, 0x3c17, /* Snowball */
};
-// TODO: The list of Level 9 games and detection entries needs to be filled out
-const PlainGameDescriptor LEVEL9_GAME_LIST[] = {
- { "level9", "Level 9 IF Game" },
-
- { nullptr, nullptr }
-};
-
const GlkDetectionEntry LEVEL9_GAMES[] = {
DT_END_MARKER
};