Mercurial > hg > dmlib
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 |