comparison tools/lib64fmts.c @ 2151:0a7ebb7198e3

Few additional cleanups in the CDHM decoder, and mark the format support as not-broken anymore.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 04 Jun 2019 15:05:53 +0300
parents b4fbb90937f7
children 44d7e8e2483c
comparison
equal deleted inserted replaced
2150:b4fbb90937f7 2151:0a7ebb7198e3
983 int res; 983 int res;
984 DMGrowBuf tmp; 984 DMGrowBuf tmp;
985 Uint8 data, *dstBuf; 985 Uint8 data, *dstBuf;
986 const size_t baseAddr = 0x4000; 986 const size_t baseAddr = 0x4000;
987 const size_t dstSize = 0x8000 - baseAddr; 987 const size_t dstSize = 0x8000 - baseAddr;
988 size_t dstOffs, srcOffs; 988 size_t dstOffs, srcOffs, ncount;
989 989
990 // Allocate output buffer 990 // Allocate output buffer
991 if ((dstBuf = dmMalloc0(dstSize)) == NULL) 991 if ((dstBuf = dmMalloc0(dstSize)) == NULL)
992 { 992 {
993 return dmError(DMERR_MALLOC, 993 return dmError(DMERR_MALLOC,
994 "Could not allocate memory for RLE decoding buffer.\n"); 994 "Could not allocate memory for RLE decoding buffer.\n");
995 } 995 }
996 996
997 // Setup input buffer 997 // Setup input and output offsets
998 srcOffs = psrc->len - 1;
998 dstOffs = 0x7ff2 - baseAddr - 1; 999 dstOffs = 0x7ff2 - baseAddr - 1;
999 srcOffs = psrc->len - 1;
1000 1000
1001 while (dstOffs > 0 && srcOffs > 0) 1001 while (dstOffs > 0 && srcOffs > 0)
1002 { 1002 {
1003 // Get one byte of data
1003 data = psrc->data[srcOffs]; 1004 data = psrc->data[srcOffs];
1004
1005 1005
1006 // Current data byte tells us the mode 1006 // Current data byte tells us the mode
1007 if (data == 0) 1007 if (data == 0)
1008 { 1008 {
1009 // RLE run 1009 // RLE run
1012 res = dmError(DMERR_INVALID_DATA, 1012 res = dmError(DMERR_INVALID_DATA,
1013 "RLE: Invalid data/out of data for run sequence.\n"); 1013 "RLE: Invalid data/out of data for run sequence.\n");
1014 goto out; 1014 goto out;
1015 } 1015 }
1016 1016
1017 size_t ncount = psrc->data[--srcOffs]; 1017 ncount = psrc->data[--srcOffs];
1018 data = psrc->data[--srcOffs]; 1018 data = psrc->data[--srcOffs];
1019
1020 srcOffs--;
1021 1019
1022 if (dstOffs < ncount) 1020 if (dstOffs < ncount)
1023 goto finish; 1021 goto finish;
1024 1022
1025 dstOffs -= ncount; 1023 dstOffs -= ncount;
1026 ncount++; 1024
1027 for (size_t n = 0; n < ncount; n++) 1025 for (size_t n = 0; n < ncount + 1; n++)
1028 dstBuf[dstOffs + n] = data; 1026 dstBuf[dstOffs + n] = data;
1027
1028 srcOffs--;
1029 } 1029 }
1030 else 1030 else
1031 { 1031 {
1032 // Literal run of data bytes 1032 // Literal run of data bytes
1033 size_t ncount = data; 1033 ncount = data;
1034 if (srcOffs < ncount) 1034 if (srcOffs < ncount)
1035 ncount = srcOffs; 1035 ncount = srcOffs;
1036 1036
1037 if (dstOffs < ncount) 1037 if (dstOffs < ncount)
1038 ncount = dstOffs; 1038 ncount = dstOffs;
1039 1039
1040 srcOffs -= ncount; 1040 srcOffs -= ncount;
1041 dstOffs -= ncount - 1; 1041 dstOffs -= ncount - 1;
1042 1042
1043 for (size_t n = 0; n < ncount; n++) 1043 for (size_t n = 0; n < ncount; n++)
1044 { 1044 dstBuf[dstOffs + n] = psrc->data[srcOffs + n];
1045 data = psrc->data[srcOffs + n];
1046 dstBuf[dstOffs + n] = data;
1047 }
1048 } 1045 }
1049 } 1046 }
1050 1047
1051 finish: 1048 finish:
1052 1049
2263 NULL, NULL, 2260 NULL, NULL,
2264 { }, &dmC64CommonFormats[8] 2261 { }, &dmC64CommonFormats[8]
2265 }, 2262 },
2266 2263
2267 { 2264 {
2268 "cdhp", "Cosmos Designs Hires Manager (packed)", 0x4000, 0, DM_FMT_RD | DM_FMT_BROKEN, 2265 "cdhp", "Cosmos Designs Hires Manager (packed)", 0x4000, 0, DM_FMT_RD,
2269 fmtProbeCosmosDesignsHiresManager, 2266 fmtProbeCosmosDesignsHiresManager,
2270 fmtDecodeCosmosDesignsHiresManagerPacked, NULL, 2267 fmtDecodeCosmosDesignsHiresManagerPacked, NULL,
2271 { }, &dmC64CommonFormats[8] 2268 { }, &dmC64CommonFormats[8]
2272 }, 2269 },
2273 2270