# HG changeset patch # User Matti Hamalainen # Date 1560570216 -10800 # Node ID 5db6e0b63b359ed3ee84954afa1e00767ed97233 # Parent 26f1bae40fb6674c1791b7493dd94ef4e3b85de6 Change again how the interlace type information is stored. Now store it in DMC64Image::extraInfo[] where it actually makes sense. Also add index for FLI type. diff -r 26f1bae40fb6 -r 5db6e0b63b35 tools/64vw.c --- a/tools/64vw.c Sat Jun 15 06:26:07 2019 +0300 +++ b/tools/64vw.c Sat Jun 15 06:43:36 2019 +0300 @@ -245,7 +245,9 @@ bmap.width = surf->w; bmap.height = surf->h; - mixedPalette = (cimage->fmt->type & D64_FMT_ILACE) && cimage->laceType == D64_ILACE_COLOR; + mixedPalette = (cimage->fmt->type & D64_FMT_ILACE) && + cimage->extraInfo[D64_EI_ILACE_TYPE] == D64_ILACE_COLOR; + if ((res = dmC64SetImagePalette(&bmap, spec, mixedPalette)) != DMERR_OK) { dmErrorMsg("Could not create copy of palette.\n"); diff -r 26f1bae40fb6 -r 5db6e0b63b35 tools/lib64fmts.c --- a/tools/lib64fmts.c Sat Jun 15 06:26:07 2019 +0300 +++ b/tools/lib64fmts.c Sat Jun 15 06:43:36 2019 +0300 @@ -395,7 +395,7 @@ { (void) fmt; - img->laceType = buf->data[op->offs] ? D64_ILACE_RES : D64_ILACE_COLOR; + img->extraInfo[D64_EI_ILACE_TYPE] = buf->data[op->offs] ? D64_ILACE_RES : D64_ILACE_COLOR; return DMERR_OK; } @@ -404,7 +404,7 @@ const DMC64Image *img, const DMC64ImageCommonFormat *fmt) { (void) fmt; - buf->data[op->offs] = (img->laceType == D64_ILACE_RES) ? 1 : 0; + buf->data[op->offs] = (img->extraInfo[D64_EI_ILACE_TYPE] == D64_ILACE_RES) ? 1 : 0; return DMERR_OK; } @@ -1660,6 +1660,7 @@ { DO_COPY , DS_COLOR_RAM , 0x0100, 0, 0, 0, NULL, NULL, DF_NORMAL }, DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0500, 0, 0x400, 0, DF_NORMAL), { DO_COPY , DS_BITMAP_RAM , 0x2500, 0, 0, 0, NULL, NULL, DF_NORMAL }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8, 0, 0, D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0, 0, NULL, NULL, DF_NORMAL }, } }, @@ -1693,7 +1694,8 @@ DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x43e8, 8, 0x400, 0, DF_NORMAL), { DO_COPY , DS_BITMAP_RAM , 0x63e8, 1, 0 , 0, NULL, NULL, DF_NORMAL }, { DO_COPY , DS_EXTRA_DATA , 0x8328, 0, 100 , 100, NULL, NULL, DF_NORMAL }, - { DO_SET_OP , DS_ILACE_TYPE , D64_ILACE_RES, 0 , 0 , 0, NULL, NULL, DF_DECODE }, + { DO_SET_OP , DS_EXTRA_INFO , D64_ILACE_RES, 0 , 0 , D64_EI_ILACE_TYPE, NULL, NULL, DF_DECODE }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8, 0, 0, D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0 , 0, NULL, NULL, DF_NORMAL }, } }, @@ -1746,7 +1748,7 @@ { DO_COPY , DS_BITMAP_RAM , 0x2400, 1, 0, 0, NULL, NULL, DF_NORMAL }, { DO_COPY , DS_SCREEN_RAM , 0x4400, 1, 0, 0, NULL, NULL, DF_NORMAL }, { DO_COPY , DS_COLOR_RAM , 0x4800, 0, 0, 0, NULL, NULL, DF_NORMAL }, - { DO_SET_OP , DS_ILACE_TYPE , D64_ILACE_RES, 0 , 0 , 0, NULL, NULL, DF_DECODE }, + { DO_SET_OP , DS_EXTRA_INFO , D64_ILACE_RES, 0 , 0 , D64_EI_ILACE_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0, 0, NULL, NULL, DF_NORMAL }, } }, @@ -1763,7 +1765,8 @@ DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0, 0x400, 0, DF_NORMAL), { DO_COPY , DS_BITMAP_RAM , 0x4000, 1, 0, 0, NULL, NULL, DF_NORMAL }, DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x6000, 8, 0x400, 0, DF_NORMAL), - { DO_SET_OP , DS_ILACE_TYPE , D64_ILACE_COLOR, 0 , 0 , 0, NULL, NULL, DF_DECODE }, + { DO_SET_OP , DS_EXTRA_INFO , D64_ILACE_COLOR, 0 , 0 , D64_EI_ILACE_TYPE, NULL, NULL, DF_DECODE }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8, 0, 0, D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0, 0, NULL, NULL, DF_NORMAL }, } }, @@ -1778,6 +1781,7 @@ { { DO_COPY , DS_BITMAP_RAM , 0x0000, 0, 0, 0, NULL, NULL, DF_NORMAL }, DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0, 0x400, 0, DF_NORMAL), + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8, 0, 0, D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0, 0, NULL, NULL, DF_NORMAL }, } }, @@ -1793,6 +1797,7 @@ { DO_COPY , DS_COLOR_RAM , 0x0000, 0, 0, 0, NULL, NULL, DF_NORMAL }, DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0400, 0, 0x400, 0, DF_NORMAL), { DO_COPY , DS_BITMAP_RAM , 0x2400, 0, 0, 0, NULL, NULL, DF_NORMAL }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8, 0, 0, D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0, 0, NULL, NULL, DF_NORMAL }, } }, @@ -1824,6 +1829,7 @@ { DO_COPY , DS_EXTRA_DATA , 0x03e8, 15 , 2 , 0, NULL, NULL, DF_DECODE }, // 2 sprite colors { DO_COPY , DS_EXTRA_DATA , 0x0000, 14 , 0x3e00, 0, NULL, NULL, DF_DECODE }, // Lazily copy whole data for sprite data { DO_COPY , DS_BITMAP_RAM , 0x2000, 0 , 0 , 0, NULL, NULL, DF_NORMAL }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8, 0, 0, D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0 , 0 , 0, NULL, NULL, DF_NORMAL }, } }, @@ -2279,6 +2285,7 @@ { DO_COPY , DS_BITMAP_RAM , 0x2401, 0, 0x2000, 0, NULL, NULL, DF_NORMAL }, DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x4401, 8, 0x400, 0x400, DF_NORMAL), { DO_COPY , DS_BITMAP_RAM , 0x6401, 1, 0x2000, 0, NULL, NULL, DF_NORMAL }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8, 0, 0, D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0 , 0, NULL, NULL, DF_NORMAL }, } }, @@ -2429,7 +2436,8 @@ // GunPaint does not store the last 3 d021 values .. so set them to black // XXX TODO: According to some, the last 4 should be same .. { DO_SET_MEM , DS_EXTRA_DATA , 0 , 0, 3 , 20+177, NULL, NULL, DF_NORMAL }, - { DO_SET_OP , DS_ILACE_TYPE , D64_ILACE_RES, 0 , 0 , 0, NULL, NULL, DF_DECODE }, + { DO_SET_OP , DS_EXTRA_INFO , D64_ILACE_RES , 0, 0 , D64_EI_ILACE_TYPE, NULL, NULL, DF_DECODE }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8 , 0, 0 , D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_FUNC , 0 , 0 , 0, 0 , 0, NULL, fmtEncodeGunPaint, DF_NORMAL }, { DO_LAST , 0 , 0 , 0, 0 , 0, NULL, NULL, DF_NORMAL }, } @@ -2455,6 +2463,7 @@ { DO_COPY , DS_SCREEN_RAM , 0x0c00, 1, 0, 0, NULL, NULL, DF_NORMAL }, { DO_COPY , DS_BITMAP_RAM , 0x1000, 0, 0, 0, NULL, NULL, DF_NORMAL }, { DO_COPY , DS_EXTRA_DATA , 0x2f40, 0, D64_SCR_HEIGHT / 4, 0, NULL, NULL, DF_NORMAL }, + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8 , 0, 0 , D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0, 0, NULL, NULL, DF_NORMAL }, } }, @@ -2479,6 +2488,7 @@ { DO_SET_MEM_LO , DS_D022 , 0x9581 - 0x4800, 0, 0, 0, NULL, NULL, DF_NORMAL }, // Sprite color { DO_SET_MEM_LO , DS_COLOR_RAM , 0x9582 - 0x4800, 0, 0, 0, NULL, NULL, DF_NORMAL }, { DO_COPY , DS_EXTRA_DATA , 0x5ac0 - 0x4800, 0, D64_SPR_SIZE * 235, 0, NULL, NULL, DF_NORMAL }, // Sprite data + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8 , 0, 0 , D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0, 0, NULL, NULL, DF_NORMAL }, } }, @@ -2499,6 +2509,7 @@ { { DO_COPY , DS_BITMAP_RAM , 0x0000, 0, 0 , 0, NULL, NULL, DF_NORMAL }, DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0, 0x400, 0, DF_NORMAL), + { DO_SET_OP , DS_EXTRA_INFO , D64_FLI_8 , 0, 0 , D64_EI_FLI_TYPE, NULL, NULL, DF_DECODE }, { DO_LAST , 0 , 0 , 0, 0 , 0, NULL, NULL, DF_NORMAL }, } }, diff -r 26f1bae40fb6 -r 5db6e0b63b35 tools/lib64gfx.c --- a/tools/lib64gfx.c Sat Jun 15 06:26:07 2019 +0300 +++ b/tools/lib64gfx.c Sat Jun 15 06:43:36 2019 +0300 @@ -1043,7 +1043,7 @@ case DS_D022: case DS_D023: case DS_D024: - case DS_ILACE_TYPE: + case DS_EXTRA_INFO: switch (op->type) { case DO_COPY: @@ -1077,7 +1077,7 @@ case DS_D022: img->d022 = value; break; case DS_D023: img->d023 = value; break; case DS_D024: img->d024 = value; break; - case DS_ILACE_TYPE: img->laceType = value; break; + case DS_EXTRA_INFO: img->extraInfo[op->offs2] = value; break; } break; @@ -1125,8 +1125,8 @@ } // Sanity check certain things .. - if ((fmt->format->type & D64_FMT_ILACE) && img->laceType == D64_ILACE_NONE) - { + if ((fmt->format->type & D64_FMT_ILACE) && + img->extraInfo[D64_EI_ILACE_TYPE] == D64_ILACE_NONE) { return dmError(DMERR_INTERNAL, "Format '%s' (%s) has interlace flag set, but interlace type is not set.\n", fmt->name, fmt->fext); @@ -1251,7 +1251,7 @@ case DS_D022: case DS_D023: case DS_D024: - case DS_ILACE_TYPE: + case DS_EXTRA_INFO: switch (op->subject) { case DS_D020: value = img->d020; break; @@ -1260,7 +1260,7 @@ case DS_D022: value = img->d022; break; case DS_D023: value = img->d023; break; case DS_D024: value = img->d024; break; - case DS_ILACE_TYPE: value = img->laceType; break; + case DS_EXTRA_INFO: value = img->extraInfo[op->offs2]; break; } switch (op->type) { @@ -1279,6 +1279,7 @@ case DO_SET_OP: // Do nothing in this case + // XXX TODO: what about DS_EXTRA_INFO? break; default: @@ -1451,7 +1452,9 @@ return DMERR_MALLOC; // Set palette information - mixed = (src->fmt->type & D64_FMT_ILACE) && src->laceType == D64_ILACE_COLOR; + mixed = (src->fmt->type & D64_FMT_ILACE) && + src->extraInfo[D64_EI_ILACE_TYPE] == D64_ILACE_COLOR; + if ((res = dmC64SetImagePalette(dst, spec, mixed)) != DMERR_OK) return res; diff -r 26f1bae40fb6 -r 5db6e0b63b35 tools/lib64gfx.h --- a/tools/lib64gfx.h Sat Jun 15 06:26:07 2019 +0300 +++ b/tools/lib64gfx.h Sat Jun 15 06:43:36 2019 +0300 @@ -17,13 +17,17 @@ #endif +// Max defines +#define D64_MAX_EXTRA_DATA 16 +#define D64_MAX_EXTRA_INFO 64 + + // Bitmap constants #define D64_SCR_WIDTH 320 #define D64_SCR_HEIGHT 200 #define D64_SCR_CH_WIDTH (D64_SCR_WIDTH/8) #define D64_SCR_CH_HEIGHT (D64_SCR_HEIGHT/8) -#define D64_MAX_EXTRA_DATA 16 -#define D64_MAX_EXTRA_INFO 64 + // C64 video screen pixel aspect ratio on PAL #define D64_SCR_PAR_XY (0.9365f) @@ -73,6 +77,13 @@ }; +// Different types of interlace +enum +{ + D64_FLI_8 = 8, +}; + + // Charmode screen memory configuration enum { @@ -88,6 +99,9 @@ D64_EI_CHAR_CASE = 0, D64_EI_CHAR_MODE, D64_EI_CHAR_CUSTOM, + + D64_EI_FLI_TYPE, + D64_EI_ILACE_TYPE, }; @@ -132,7 +146,7 @@ DS_D023, DS_D024, - DS_ILACE_TYPE, + DS_EXTRA_INFO, DS_LAST }; @@ -187,9 +201,7 @@ typedef struct _DMC64Image { DMC64ImageCommonFormat *fmt; - int laceType, // Interlace type (D64_ILACE_*) - nblocks, // Number of internal blocks used - nbanks; // Number of videobanks used + int nblocks; // Number of internal blocks used // Bitmaps, color RAM, screen, etc. blocks * nblocks // Not all of them may be allocated @@ -220,7 +232,7 @@ int type; // Operation type (DO_*) int subject; // Operation "subject" (DS_*) - size_t offs; // Offset in "memory" + int offs; // Offset in "memory" int bank; // Bank number or extradata index size_t size; // Size of data (0 for "default") size_t offs2; // Offset in data-block diff -r 26f1bae40fb6 -r 5db6e0b63b35 tools/lib64util.c --- a/tools/lib64util.c Sat Jun 15 06:26:07 2019 +0300 +++ b/tools/lib64util.c Sat Jun 15 06:43:36 2019 +0300 @@ -57,7 +57,7 @@ if (img->fmt->type & D64_FMT_ILACE) { char *tmps; - switch (img->laceType) + switch (img->extraInfo[D64_EI_ILACE_TYPE]) { case D64_ILACE_COLOR: tmps = "color"; break; case D64_ILACE_RES: tmps = "resolution"; break; @@ -68,6 +68,13 @@ indent, tmps); } + if (img->fmt->type & D64_FMT_FLI) + { + fprintf(fh, + "%sFLI type : %d\n", + indent, img->extraInfo[D64_EI_FLI_TYPE]); + } + fprintf(fh, "%sWidth x Height : %d x %d\n" "%sCHwidth x CHheight : %d x %d\n"