# HG changeset patch # User Matti Hamalainen # Date 1559649953 -10800 # Node ID 0a7ebb7198e30ca2d769d071cf45d90dddb40c81 # Parent b4fbb90937f792fafa02a986fe74fb364720df05 Few additional cleanups in the CDHM decoder, and mark the format support as not-broken anymore. diff -r b4fbb90937f7 -r 0a7ebb7198e3 tools/lib64fmts.c --- a/tools/lib64fmts.c Tue Jun 04 15:00:58 2019 +0300 +++ b/tools/lib64fmts.c Tue Jun 04 15:05:53 2019 +0300 @@ -985,7 +985,7 @@ Uint8 data, *dstBuf; const size_t baseAddr = 0x4000; const size_t dstSize = 0x8000 - baseAddr; - size_t dstOffs, srcOffs; + size_t dstOffs, srcOffs, ncount; // Allocate output buffer if ((dstBuf = dmMalloc0(dstSize)) == NULL) @@ -994,15 +994,15 @@ "Could not allocate memory for RLE decoding buffer.\n"); } - // Setup input buffer + // Setup input and output offsets + srcOffs = psrc->len - 1; dstOffs = 0x7ff2 - baseAddr - 1; - srcOffs = psrc->len - 1; while (dstOffs > 0 && srcOffs > 0) { + // Get one byte of data data = psrc->data[srcOffs]; - // Current data byte tells us the mode if (data == 0) { @@ -1014,23 +1014,23 @@ goto out; } - size_t ncount = psrc->data[--srcOffs]; + ncount = psrc->data[--srcOffs]; data = psrc->data[--srcOffs]; - srcOffs--; - if (dstOffs < ncount) goto finish; dstOffs -= ncount; - ncount++; - for (size_t n = 0; n < ncount; n++) + + for (size_t n = 0; n < ncount + 1; n++) dstBuf[dstOffs + n] = data; + + srcOffs--; } else { // Literal run of data bytes - size_t ncount = data; + ncount = data; if (srcOffs < ncount) ncount = srcOffs; @@ -1041,10 +1041,7 @@ dstOffs -= ncount - 1; for (size_t n = 0; n < ncount; n++) - { - data = psrc->data[srcOffs + n]; - dstBuf[dstOffs + n] = data; - } + dstBuf[dstOffs + n] = psrc->data[srcOffs + n]; } } @@ -2265,7 +2262,7 @@ }, { - "cdhp", "Cosmos Designs Hires Manager (packed)", 0x4000, 0, DM_FMT_RD | DM_FMT_BROKEN, + "cdhp", "Cosmos Designs Hires Manager (packed)", 0x4000, 0, DM_FMT_RD, fmtProbeCosmosDesignsHiresManager, fmtDecodeCosmosDesignsHiresManagerPacked, NULL, { }, &dmC64CommonFormats[8]