changeset 2238:5db6e0b63b35

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.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 15 Jun 2019 06:43:36 +0300
parents 26f1bae40fb6
children adb0480f6ebd
files tools/64vw.c tools/lib64fmts.c tools/lib64gfx.c tools/lib64gfx.h tools/lib64util.c
diffstat 5 files changed, 57 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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");
--- 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 },
             }
         },
--- 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;
 
--- 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
--- 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"