From da8380a6e28015aa5acded67de24c8dc82523807 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 31 Jan 2022 12:55:51 -0500 Subject: [PATCH] prepare to fix loading old .dmp files --- src/engine/engine.cpp | 97 ++++++++++++++++++++++++++----------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index e8eb17e3..f0e9982c 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -4397,52 +4397,73 @@ bool DivEngine::addInstrumentFromFile(const char *path) { return false; } } else { // read as .dmp + // this is a ridiculous mess + unsigned char version=0; + unsigned char sys=0; try { reader.seek(0,SEEK_SET); - unsigned char version=reader.readC(); + version=reader.readC(); + } catch (EndOfFileException e) { + lastError="premature end of file"; + logE("premature end of file!\n"); + delete ins; + delete[] buf; + return false; + } - if (version>11) { - lastError="unknown sample version!"; + if (version>11) { + lastError="unknown instrument version!"; + delete ins; + delete[] buf; + return false; + } + + if (version>=10) { // 1.0 + try { + sys=reader.readC(); + + switch (sys) { + case 1: // YMU759 + ins->type=DIV_INS_FM; + break; + case 2: // Genesis + ins->type=DIV_INS_FM; + break; + case 3: // SMS + ins->type=DIV_INS_STD; + break; + case 4: // Game Boy + ins->type=DIV_INS_GB; + break; + case 5: // PC Engine + ins->type=DIV_INS_PCE; + break; + case 6: // NES + ins->type=DIV_INS_STD; + break; + case 7: case 0x17: // C64 + ins->type=DIV_INS_C64; + break; + case 8: // Arcade + ins->type=DIV_INS_FM; + break; + default: + lastError="unknown instrument type!"; + delete ins; + delete[] buf; + return false; + break; + } + } catch (EndOfFileException e) { + lastError="premature end of file"; + logE("premature end of file!\n"); delete ins; delete[] buf; return false; } + } - unsigned char sys=reader.readC(); - - switch (sys) { - case 1: // YMU759 - ins->type=DIV_INS_FM; - break; - case 2: // Genesis - ins->type=DIV_INS_FM; - break; - case 3: // SMS - ins->type=DIV_INS_STD; - break; - case 4: // Game Boy - ins->type=DIV_INS_GB; - break; - case 5: // PC Engine - ins->type=DIV_INS_PCE; - break; - case 6: // NES - ins->type=DIV_INS_STD; - break; - case 7: case 0x17: // C64 - ins->type=DIV_INS_C64; - break; - case 8: // Arcade - ins->type=DIV_INS_FM; - break; - default: - lastError="unknown instrument type!"; - delete ins; - delete[] buf; - return false; - break; - } - + try { bool mode=reader.readC(); if (mode==0 && ins->type==DIV_INS_FM) { ins->type=DIV_INS_STD;