changeset 1775:4e4d54135baf

Refactor the c64 bitmap format definitions handling to be more flexible. Again.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 12 Jun 2018 17:12:48 +0300
parents 88354355b8e1
children aa427e68e114
files tools/64vw.c tools/gfxconv.c tools/lib64fmts.c tools/lib64gfx.c tools/lib64gfx.h
diffstat 5 files changed, 495 insertions(+), 431 deletions(-) [+]
line wrap: on
line diff
--- a/tools/64vw.c	Tue Jun 12 15:36:00 2018 +0300
+++ b/tools/64vw.c	Tue Jun 12 17:12:48 2018 +0300
@@ -61,7 +61,7 @@
         char buf[64];
         printf("%-6s| %-15s | %s%s\n",
             fmt->fext,
-            dmC64GetImageTypeString(buf, sizeof(buf), fmt->type, FALSE),
+            dmC64GetImageTypeString(buf, sizeof(buf), fmt->format->type, FALSE),
             fmt->name,
             fmt->flags & DM_FMT_BROKEN ? " [BROKEN]" : "");
     }
@@ -221,8 +221,8 @@
     bmap.constpal = TRUE;
     bmap.pal      = dmDefaultC64Palette;
 
-    if (fmt->convertFrom != NULL)
-        ret = fmt->convertFrom(&bmap, cimage, fmt);
+    if (fmt->format->convertFrom != NULL)
+        ret = fmt->format->convertFrom(&bmap, cimage, fmt);
     else
         ret = dmC64ConvertGenericBMP2Image(&bmap, cimage, fmt);
 
@@ -243,6 +243,7 @@
     size_t currIndex, prevIndex;
     int ret;
 
+    dmC64InitializeFormats();
     dmSetScaleFactor(2.0);
 
     dmInitProg("64vw", "Display some C64 bitmap graphics formats", "0.3", NULL, NULL);
@@ -275,7 +276,7 @@
     {
         forced = &dmC64ImageFormats[optForcedFormat];
         dmMsg(0, "Forced %s format image, type %d, %s\n",
-            forced->name, forced->type, forced->fext);
+            forced->name, forced->format->type, forced->fext);
     }
     else
         forced = NULL;
--- a/tools/gfxconv.c	Tue Jun 12 15:36:00 2018 +0300
+++ b/tools/gfxconv.c	Tue Jun 12 17:12:48 2018 +0300
@@ -176,7 +176,7 @@
             fmt->fext,
             (fmt->flags & DM_FMT_RD) ? 'R' : ' ',
             (fmt->flags & DM_FMT_WR) ? 'W' : ' ',
-            dmC64GetImageTypeString(buf, sizeof(buf), fmt->type, FALSE),
+            dmC64GetImageTypeString(buf, sizeof(buf), fmt->format->type, FALSE),
             fmt->name,
             fmt->flags & DM_FMT_BROKEN ? " [BROKEN]" : "");
     }
@@ -1620,6 +1620,7 @@
         optColors[i] = i;
 
     // Initialize list of additional conversion formats
+    dmC64InitializeFormats();
     nconvFormatList = ndmImageFormatList + nbaseFormatList;
     convFormatList = dmCalloc(nconvFormatList, sizeof(DMConvFormat));
 
@@ -1707,7 +1708,7 @@
         {
             forced = &dmC64ImageFormats[optForcedFormat];
             dmMsg(0, "Forced %s format image, type %d, %s\n",
-                forced->name, forced->type, forced->fext);
+                forced->name, forced->format->type, forced->fext);
         }
 
         res = dmC64DecodeBMP(&inC64Image,
@@ -1717,7 +1718,7 @@
         if (forced == NULL && inC64Fmt != NULL && res == DMERR_OK)
         {
             dmMsg(1, "Probed '%s' format image, type %d, %s\n",
-                inC64Fmt->name, inC64Fmt->type, inC64Fmt->fext);
+                inC64Fmt->name, inC64Fmt->format->type, inC64Fmt->fext);
 
             optInFormat = FFMT_BITMAP;
         }
--- a/tools/lib64fmts.c	Tue Jun 12 15:36:00 2018 +0300
+++ b/tools/lib64fmts.c	Tue Jun 12 17:12:48 2018 +0300
@@ -114,7 +114,7 @@
     int res;
     DMGrowBuf tmp;
     DMCompParams cfg;
-    const char *magicID = (fmt->type & D64_FMT_ILACE) ? "DRAZLACE! 1.0" : "DRAZPAINT 2.0";
+    const char *magicID = (fmt->format->type & D64_FMT_ILACE) ? "DRAZLACE! 1.0" : "DRAZPAINT 2.0";
 
     // Encode the data to temp buffer
     if ((res = dmC64EncodeGenericBMP(TRUE, &tmp, img, fmt)) != DMERR_OK)
@@ -856,26 +856,46 @@
 // unpacked versions of several formats. We'll reuse these here through
 // this common formats ops array, referred from dmC64ImageFormats[]
 //
-const DMC64EncDecOpList dmC64CommonFormatOps[] =
+DMC64ImageCommonFormat dmC64CommonFormats[] =
 {
-        { // #0: Koala Paint type memory layout
+    { // #0: Koala Paint type memory layout
+        D64_FMT_MC,
+        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        NULL, NULL,
+        NULL,
+        {
             { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
             { DO_COPY     , DS_SCREEN_RAM  , 0x1f40, 0,  0, NULL, NULL },
             { DO_COPY     , DS_COLOR_RAM   , 0x2328, 0,  0, NULL, NULL },
             { DO_SET_MEM  , DS_BGCOL       , 0x2710, 0,  0, NULL, NULL },
             { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
+        }
+    },
+
+    { // #1: UNUSED
+    },
 
-        { // #1: UNUSED
-        },
-
-        { // #2: Art Studio etc. Hires
+    { // #2: Art Studio etc. Hires
+        D64_FMT_HIRES,
+        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        NULL, NULL,
+        NULL,
+        {
             { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
             { DO_COPY     , DS_SCREEN_RAM  , 0x1f40, 0,  0, NULL, NULL },
             { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
+        }
+    },
 
-        { // #3: FunPaint II
+    { // #3: FunPaint II
+        D64_FMT_MC | D64_FMT_FLI | D64_FMT_ILACE,
+        C64_SCR_WIDTH, C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        NULL, NULL,
+        fmtGetPixelFunPaint2,
+        {
             DEF_SCREEN_RAMS_8(0x0000, 0, 0x400),
             { DO_COPY     , DS_BITMAP_RAM  , 0x2000, 0,  0, NULL, NULL },
             { DO_COPY     , DS_EXTRA_DATA  , 0x3f40, 0,  100, NULL, NULL },
@@ -885,17 +905,31 @@
             { DO_COPY     , DS_EXTRA_DATA  , 0x8328, 1,  100, NULL, NULL },
             { DO_DEC_FUNC , 0              , 0x2742, 0,  1, fmtTruePaintGetLaceType, NULL },
             { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
+        }
+    },
 
-        { // #4: DrazPaint 1.x & 2
+    { // #4: DrazPaint 1.x & 2
+        D64_FMT_MC,
+        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        NULL, NULL,
+        NULL,
+        {
             { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
             { DO_COPY     , DS_BITMAP_RAM  , 0x0800, 0,  0, NULL, NULL },
             { DO_COPY     , DS_SCREEN_RAM  , 0x0400, 0,  0, NULL, NULL },
             { DO_SET_MEM  , DS_BGCOL       , 0x2740, 0,  0, NULL, NULL },
             { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
+        }
+    },
 
-        { // #5: DrazLace 1.0
+    { // #5: DrazLace 1.0
+        D64_FMT_MC | D64_FMT_ILACE,
+        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        NULL, NULL,
+        NULL,
+        {
             { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
             { DO_COPY     , DS_BITMAP_RAM  , 0x0800, 0,  0, NULL, NULL },
             { DO_COPY     , DS_SCREEN_RAM  , 0x0400, 0,  0, NULL, NULL },
@@ -904,9 +938,16 @@
             { DO_DEC_FUNC , 0              , 0x2742, 0,  1, fmtDrazLaceGetLaceType, NULL },
             { DO_ENC_FUNC , 0              , 0x2742, 0,  1, NULL, fmtDrazLaceSetLaceType },
             { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
+        }
+    },
 
-        { // #6: TruePaint
+    { // #6: TruePaint
+        D64_FMT_MC | D64_FMT_ILACE,
+        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        NULL, NULL,
+        fmtGetPixelTruePaint,
+        {
             { DO_COPY     , DS_SCREEN_RAM  , 0x0000, 0,  0, NULL, NULL },
             { DO_SET_MEM  , DS_BGCOL       , 0x03e8, 0,  0, NULL, NULL },
             { DO_COPY     , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
@@ -915,587 +956,590 @@
             { DO_COPY     , DS_COLOR_RAM   , 0x4800, 0,  0, NULL, NULL },
             { DO_DEC_FUNC , 0              , 0x0000, 0,  0, fmtTruePaintGetLaceType, NULL },
             { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
+        }
+    },
 
-        { // #7: ECI Graphic Editor Hires FLI
+    { // #7: ECI Graphic Editor Hires FLI
+        D64_FMT_HIRES | D64_FMT_FLI,
+        C64_SCR_WIDTH, C64_SCR_HEIGHT,
+        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        fmtConvertECIBMP2Image, NULL,
+        fmtGetPixelECI,
+        {
             { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
             DEF_SCREEN_RAMS_8(0x2000, 0, 0x400),
             { DO_COPY     , DS_BITMAP_RAM  , 0x4000, 1,  0, NULL, NULL },
             DEF_SCREEN_RAMS_8(0x6000, 8, 0x400),
             { DO_DEC_FUNC , 0              , 0     , 0,  0, fmtECIGetLaceType, NULL },
             { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
+        }
+    },
+
+    { // #8: Cosmos Designs Hires Manager
+        D64_FMT_HIRES | D64_FMT_FLI,
+        C64_SCR_WIDTH, C64_SCR_HEIGHT, // Actually 296 x 192 (=24*8)
+        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        NULL, NULL,
+        fmtGetPixelCrestHIFLIorCDHM,
+        {
+            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+            DEF_SCREEN_RAMS_8(0x2000, 0, 0x400),
+            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+        }
+    },
 };
 
 
 //
 // Array with data for supported formats
 //
-const DMC64ImageFormat dmC64ImageFormats[] =
+DMC64ImageFormat dmC64ImageFormats[] =
 {
     {
-        D64_FMT_MC, "d2p", "DrazPaint 1.4/2.0 (packed)", 0x5800, 0, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "d2p", "DrazPaint 1.4/2.0 (packed)", 0x5800, 0, DM_FMT_RDWR,
         fmtProbeDrazPaint20Packed,
         fmtDecodeDrazPaintPacked, fmtEncodeDrazPaintPacked,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[4]
+        { }, &dmC64CommonFormats[4]
     },
 
     {
-        D64_FMT_MC, "drp", "DrazPaint (unpacked)", 0x5800, 10051, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "drp", "DrazPaint (unpacked)", 0x5800, 10051, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[4]
+        { }, &dmC64CommonFormats[4]
     },
 
     {
-        D64_FMT_MC | D64_FMT_ILACE, "dlp", "DrazLace 1.0 (packed)", 0x5800, 0, DM_FMT_RDWR,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "dlp", "DrazLace 1.0 (packed)", 0x5800, 0, DM_FMT_RDWR,
         fmtProbeDrazLace10Packed,
         fmtDecodeDrazPaintPacked, fmtEncodeDrazPaintPacked,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[5]
+        { }, &dmC64CommonFormats[5]
     },
 
     {
-        D64_FMT_MC | D64_FMT_ILACE, "drl", "DrazLace 1.0 (unpacked)", 0x5800, 18242, DM_FMT_RDWR,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "drl", "DrazLace 1.0 (unpacked)", 0x5800, 18242, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[5]
+        { }, &dmC64CommonFormats[5]
+    },
+
+    {
+        "bdp5", "Boogie Down Paint 5 (packed)", 0x5000, 0, DM_FMT_RDWR,
+        fmtProbeBDP5Packed,
+        fmtDecodeBDP5Packed, fmtEncodeBDP5Packed,
+        { }, &dmC64CommonFormats[0] // Memory format is same as Koala
     },
 
     {
-        D64_FMT_MC, "bdp5", "Boogie Down Paint 5 (packed)", 0x5000, 0, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        fmtProbeBDP5Packed,
-        fmtDecodeBDP5Packed, fmtEncodeBDP5Packed,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[0] // Memory format is same as Koala
-    },
-
-    {
-        D64_FMT_MC, "vid", "Vidcom 64 (unpacked)", 0x5800, 10050, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "vid", "Vidcom 64 (unpacked)", 0x5800, 10050, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_BGCOL       , 0x07e8, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0800, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x0400, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_BGCOL       , 0x07e8, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0800, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x0400, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            },
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "p64", "Picasso 64 (unpacked)", 0x1800, 10050, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "p64", "Picasso 64 (unpacked)", 0x1800, 10050, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_BGCOL       , 0x07fe, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0800, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x0400, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_BGCOL       , 0x07fe, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0800, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x0400, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            },
         },
         NULL
     },
 
     {
-        D64_FMT_MC | D64_FMT_ILACE, "mci", "Truepaint (unpacked)", 0x9c00, 19434, DM_FMT_RD,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "mci", "Truepaint (unpacked)", 0x9c00, 19434, DM_FMT_RD,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        fmtGetPixelTruePaint,
-        { }, &dmC64CommonFormatOps[6]
+        { }, &dmC64CommonFormats[6]
     },
 
     {
-        D64_FMT_MC | D64_FMT_ILACE, "mcip", "Truepaint (packed)", 0x0801, 0, DM_FMT_RD,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "mcip", "Truepaint (packed)", 0x0801, 0, DM_FMT_RD,
         fmtProbeTruePaintPacked,
         fmtDecodeTruePaintPacked, NULL,
+        { }, &dmC64CommonFormats[6]
+    },
+
+    {
+        "kla", "Koala Paint (unpacked)", 0x6000, 10003, DM_FMT_RDWR,
+        NULL,
         NULL, NULL,
-        fmtGetPixelTruePaint,
-        { }, &dmC64CommonFormatOps[6]
+        { }, &dmC64CommonFormats[0]
     },
 
     {
-        D64_FMT_MC, "kla", "Koala Paint (unpacked)", 0x6000, 10003, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        NULL,
-        NULL, NULL,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[0]
+        "klp", "Koala Paint (packed)", 0x6000, 0, DM_FMT_RDWR,
+        fmtProbeKoalaPaintPacked,
+        fmtDecodeKoalaPaintPacked, fmtEncodeKoalaPaintPacked,
+        { }, &dmC64CommonFormats[0]
     },
 
     {
-        D64_FMT_MC, "klp", "Koala Paint (packed)", 0x6000, 0, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        fmtProbeKoalaPaintPacked,
-        fmtDecodeKoalaPaintPacked, fmtEncodeKoalaPaintPacked,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[0]
-    },
-
-    {
-        D64_FMT_MC, "aas", "Advanced Art Studio (unpacked)", 0x2000, 10018, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "aas", "Advanced Art Studio (unpacked)", 0x2000, 10018, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x1f40, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_BGCOL       , 0x2329, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x2338, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x1f40, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_BGCOL       , 0x2329, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x2338, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            },
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "ims", "Image System MC (unpacked)", 0x3c00, 10218, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "ims", "Image System MC (unpacked)", 0x3c00, 10218, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_BGCOL       , 0x23ff, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x2400, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_BGCOL       , 0x23ff, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x2400, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "mil", "MIL (unpacked)", 0x18dc, 10022, DM_FMT_RDWR | DM_FMT_BROKEN,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "mil", "MIL (unpacked)", 0x18dc, 10022, DM_FMT_RDWR | DM_FMT_BROKEN,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_SCREEN_RAM  , 20 + 0   , 0,  0, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 20 + 1000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_BITMAP_RAM  , 20 + 2000, 0,  0, NULL, NULL },
-            // XXX TODO: Unknown where the background color is set, so default to 0x01
-            //{ DO_SET_MEM  , DS_BGCOL       , 0x23ff, 0,  0, NULL, NULL },
-            { DO_SET_OP   , DS_BGCOL       , 0x01  , 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_SCREEN_RAM  , 20 + 0   , 0,  0, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 20 + 1000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_BITMAP_RAM  , 20 + 2000, 0,  0, NULL, NULL },
+                // XXX TODO: Unknown where the background color is set, so default to 0x01
+                //{ DO_SET_MEM  , DS_BGCOL       , 0x23ff, 0,  0, NULL, NULL },
+                { DO_SET_OP   , DS_BGCOL       , 0x01  , 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "cdu", "CDU-Paint (unpacked)", 0x7eef, 10277, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "cdu", "CDU-Paint (unpacked)", 0x7eef, 10277, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000 + 0x111, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x1f40 + 0x111, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x2328 + 0x111, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_BGCOL       , 0x2710 + 0x111, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000 + 0x111, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x1f40 + 0x111, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x2328 + 0x111, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_BGCOL       , 0x2710 + 0x111, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "rbp", "Rainbow Painter (unpacked)", 0x5c00, 10242, DM_FMT_RDWR | DM_FMT_BROKEN,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "rbp", "Rainbow Painter (unpacked)", 0x5c00, 10242, DM_FMT_RDWR | DM_FMT_BROKEN,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_SCREEN_RAM  , 0x0000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x2400, 0,  0, NULL, NULL },
-            // XXX TODO: Not sure if the background color is hardcoded ..
-            { DO_SET_OP   , DS_BGCOL       , 0x00  , 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_SCREEN_RAM  , 0x0000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x2400, 0,  0, NULL, NULL },
+                // XXX TODO: Not sure if the background color is hardcoded ..
+                { DO_SET_OP   , DS_BGCOL       , 0x00  , 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "sar", "Saracen Paint (unpacked)", 0x7800, 10219, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "sar", "Saracen Paint (unpacked)", 0x7800, 10219, DM_FMT_RDWR,
         fmtProbeSaracenPaint,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_SCREEN_RAM  , 0x7800 - 0x7800, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_BGCOL       , 0x7bf0 - 0x7800, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_BITMAP_RAM  , 0x7c00 - 0x7800, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x9c00 - 0x7800, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_SCREEN_RAM  , 0x7800 - 0x7800, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_BGCOL       , 0x7bf0 - 0x7800, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_BITMAP_RAM  , 0x7c00 - 0x7800, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x9c00 - 0x7800, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "blp", "Blazing Paddles (unpacked)", 0xA000, 10242, DM_FMT_RDWR | DM_FMT_BROKEN,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "blp", "Blazing Paddles (unpacked)", 0xA000, 10242, DM_FMT_RDWR | DM_FMT_BROKEN,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
-            // XXX TODO: Background color is wrong, this offset/addr is from codebase64 docs
-            { DO_SET_MEM  , DS_BGCOL       , 0x1f80, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x2000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x2400, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+                // XXX TODO: Background color is wrong, this offset/addr is from codebase64 docs
+                { DO_SET_MEM  , DS_BGCOL       , 0x1f80, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x2000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x2400, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "pmg", "Paint Magic crippled MC (unpacked)", 0x3f8e, 9332, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "pmg", "Paint Magic crippled MC (unpacked)", 0x3f8e, 9332, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x4000 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x6000 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_COLOR_RAM   , 0x5f43 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_BGCOL       , 0x5f44 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-            { DO_SET_MEM  , DS_D020        , 0x5f40 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x4000 + 0x72 - 0x4000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x6000 + 0x72 - 0x4000, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_COLOR_RAM   , 0x5f43 + 0x72 - 0x4000, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_BGCOL       , 0x5f44 + 0x72 - 0x4000, 0,  0, NULL, NULL },
+                { DO_SET_MEM  , DS_D020        , 0x5f40 + 0x72 - 0x4000, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "ami", "Amica Paint (packed)", 0x4000, 0, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "ami", "Amica Paint (packed)", 0x4000, 0, DM_FMT_RDWR,
         fmtProbeAmicaPaintPacked,
         fmtDecodeAmicaPaintPacked, fmtEncodeAmicaPaintPacked,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[0]
+        { }, &dmC64CommonFormats[0]
     },
 
     {
-        D64_FMT_MC, "rpm", "Run Paint (unpacked)", 0x6000, 10006, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "rpm", "Run Paint (unpacked)", 0x6000, 10006, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[0]
+        { }, &dmC64CommonFormats[0]
     },
 
     {
-        D64_FMT_MC, "ipc", "Interpaint MC (unpacked)", 0x4000, 10003, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "ipc", "Interpaint MC (unpacked)", 0x4000, 10003, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[0]
+        { }, &dmC64CommonFormats[0]
     },
 
     {
-        D64_FMT_HIRES, "art", "Art Studio (unpacked)", 0x2000, 9009, DM_FMT_RD,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "art", "Art Studio (unpacked)", 0x2000, 9009, DM_FMT_RD,
         NULL,
         NULL, NULL,
-        NULL, NULL,
+        { }, &dmC64CommonFormats[2]
+    },
+
+    {
+        "iph", "Interpaint (unpacked)", 0x4000, 9002, DM_FMT_RD,
         NULL,
-        { }, &dmC64CommonFormatOps[2]
+        NULL, NULL,
+        { }, &dmC64CommonFormats[2]
     },
 
     {
-        D64_FMT_HIRES, "iph", "Interpaint (unpacked)", 0x4000, 9002, DM_FMT_RD,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "dd", "Doodle (unpacked)", 0x1c00, 9218, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
-        { }, &dmC64CommonFormatOps[2]
-    },
-
-    {
-        D64_FMT_HIRES, "dd", "Doodle (unpacked)", 0x1c00, 9218, DM_FMT_RDWR,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
-        NULL,
-        NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_SCREEN_RAM  , 0x0000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_HIRES,
+            C64_SCR_WIDTH   , C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_SCREEN_RAM  , 0x0000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_HIRES, "mon", "Monomagic (unpacked)", 0x2000, 8194, DM_FMT_RDWR,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "mon", "Monomagic (unpacked)", 0x2000, 8194, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0, 0, NULL, NULL },
-            { DO_SET_OP   , DS_SCREEN_RAM  , 0xCF  , 0, 0, NULL, NULL },
-            // Default colors used by MM are --^^
-            { DO_LAST     , 0              , 0     , 0, 0, NULL, NULL },
+            D64_FMT_HIRES,
+            C64_SCR_WIDTH   , C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0, 0, NULL, NULL },
+                { DO_SET_OP   , DS_SCREEN_RAM  , 0xCF  , 0, 0, NULL, NULL },
+                // Default colors used by MM are --^^
+                { DO_LAST     , 0              , 0     , 0, 0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_HIRES, "hir", "Plain hires (unpacked)", 0x2000, 8002, DM_FMT_RDWR,
-        C64_SCR_WIDTH   , C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+        "hir", "Plain hires (unpacked)", 0x2000, 8002, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0, 0, NULL, NULL },
-            { DO_SET_OP   , DS_SCREEN_RAM  , 0xF0  , 0, 0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0, 0, NULL, NULL },
+            D64_FMT_HIRES,
+            C64_SCR_WIDTH   , C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0, 0, NULL, NULL },
+                { DO_SET_OP   , DS_SCREEN_RAM  , 0xF0  , 0, 0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0, 0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC | D64_FMT_FLI, "bfli", "Big FLI (unpacked)", 0x3bff, 33795, DM_FMT_RD | DM_FMT_BROKEN,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT * 2,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "bfli", "Big FLI (unpacked)", 0x3bff, 33795, DM_FMT_RD | DM_FMT_BROKEN,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        fmtGetPixelBFLI,
         {
-            { DO_COPY     , DS_COLOR_RAM   , 0x0001, 0,  0, NULL, NULL },
-            DEF_SCREEN_RAMS_8(0x0401, 0, 0x400),
-            { DO_COPY     , DS_BITMAP_RAM  , 0x2401, 0,  0x1fff, NULL, NULL },
-            DEF_SCREEN_RAMS_8(0x4401, 8, 0x400),
-            { DO_COPY     , DS_BITMAP_RAM  , 0x6401, 1,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC | D64_FMT_FLI,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT * 2,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            fmtGetPixelBFLI,
+            {
+                { DO_COPY     , DS_COLOR_RAM   , 0x0001, 0,  0, NULL, NULL },
+                DEF_SCREEN_RAMS_8(0x0401, 0, 0x400),
+                { DO_COPY     , DS_BITMAP_RAM  , 0x2401, 0,  0x1fff, NULL, NULL },
+                DEF_SCREEN_RAMS_8(0x4401, 8, 0x400),
+                { DO_COPY     , DS_BITMAP_RAM  , 0x6401, 1,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC | D64_FMT_FLI, "bml", "Blackmail FLI (unpacked)", 0x3b00, 17474, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+        "bml", "Blackmail FLI (unpacked)", 0x3b00, 17474, DM_FMT_RDWR,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        fmtGetPixelBlackMailFLI,
         {
-            { DO_COPY     , DS_EXTRA_DATA  , 0x0000, 0,  200, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x0100, 0,  0, NULL, NULL },
-            DEF_SCREEN_RAMS_8(0x0500, 0, 0x400),
-            { DO_COPY     , DS_BITMAP_RAM  , 0x2500, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
-        },
-        NULL
-    },
-
-    {
-        D64_FMT_MC | D64_FMT_FLI, "fli", "FLI Designer (unpacked)", 0, 17409, DM_FMT_RD,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        fmtProbeFLIDesigner,
-        NULL, NULL,
-        NULL, NULL,
-        fmtGetPixelFLIDesigner,
-        {
-            { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
-            DEF_SCREEN_RAMS_8(0x0400, 0, 0x400),
-            { DO_COPY     , DS_BITMAP_RAM  , 0x2400, 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC | D64_FMT_FLI,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            fmtGetPixelBlackMailFLI,
+            {
+                { DO_COPY     , DS_EXTRA_DATA  , 0x0000, 0,  200, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x0100, 0,  0, NULL, NULL },
+                DEF_SCREEN_RAMS_8(0x0500, 0, 0x400),
+                { DO_COPY     , DS_BITMAP_RAM  , 0x2500, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_HIRES | D64_FMT_FLI,
-        "eci", "ECI Graphic Editor 1.0 (unpacked)", 0x4000, 32770, DM_FMT_RD,
-        C64_SCR_WIDTH, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
-        NULL,
+        "fli", "FLI Designer (unpacked)", 0, 17409, DM_FMT_RD,
+        fmtProbeFLIDesigner,
         NULL, NULL,
-        fmtConvertECIBMP2Image, NULL,
-        fmtGetPixelECI,
-        { }, &dmC64CommonFormatOps[7]
-    },
-
-    {
-        D64_FMT_HIRES | D64_FMT_FLI,
-        "ecp", "ECI Graphic Editor 1.0 (packed)", 0x4000, 0, DM_FMT_RD,
-        C64_SCR_WIDTH, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
-        fmtProbeECIPacked,
-        fmtDecodeECIPacked, NULL,
-        fmtConvertECIBMP2Image, NULL,
-        fmtGetPixelECI,
-        { }, &dmC64CommonFormatOps[7]
-    },
-
-    {
-        D64_FMT_MC, "xx1", "Unknown $2000 format (unpacked)", 0x2000, 10242, DM_FMT_RDWR,
-        C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        NULL,
-        NULL, NULL,
-        NULL, NULL,
-        NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , 0x2000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x2400, 0,  0, NULL, NULL },
-            { DO_SET_OP   , DS_BGCOL       , 0x00  , 0,  0, NULL, NULL },
-            { DO_SET_OP   , DS_EXTRA_DATA  , 10240 , 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC | D64_FMT_FLI,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            fmtGetPixelFLIDesigner,
+            {
+                { DO_COPY     , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
+                DEF_SCREEN_RAMS_8(0x0400, 0, 0x400),
+                { DO_COPY     , DS_BITMAP_RAM  , 0x2400, 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC, "xx2", "Unknown $2000 format (unpacked)", 0x2000, 0, DM_FMT_RDWR,
-        XX2_WIDTH_CH * 4, XX2_HEIGHT_CH * 8,
-        XX2_WIDTH_CH    , XX2_HEIGHT_CH,
-        fmtProbeFormatXX2,
-        fmtDecodeFormatXX2, NULL,
+        "eci", "ECI Graphic Editor 1.0 (unpacked)", 0x4000, 32770, DM_FMT_RDWR,
+        NULL,
         NULL, NULL,
+        { }, &dmC64CommonFormats[7]
+    },
+
+    {
+        "ecp", "ECI Graphic Editor 1.0 (packed)", 0x4000, 0, DM_FMT_RD,
+        fmtProbeECIPacked,
+        fmtDecodeECIPacked, NULL,
+        { }, &dmC64CommonFormats[7]
+    },
+
+    {
+        "xx1", "Unknown $2000 format (unpacked)", 0x2000, 10242, DM_FMT_RDWR,
         NULL,
+        NULL, NULL,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  XX2_BSIZE, NULL, NULL },
-            { DO_COPY     , DS_SCREEN_RAM  , XX2_BSIZE, 0,  XX2_SIZE, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , XX2_BSIZE + XX2_SIZE, 0,  XX2_SIZE, NULL, NULL },
-            { DO_SET_OP   , DS_BGCOL       , 11    , 0,  0, NULL, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            C64_SCR_WIDTH / 2, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , 0x2000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x2400, 0,  0, NULL, NULL },
+                { DO_SET_OP   , DS_BGCOL       , 0x00  , 0,  0, NULL, NULL },
+                { DO_SET_OP   , DS_EXTRA_DATA  , 10240 , 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_MC | D64_FMT_FLI | D64_FMT_ILACE,
-        "fp2", "FunPaint II (unpacked)", 0x3ff0, 33694, DM_FMT_RD,
-        C64_SCR_WIDTH, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        fmtProbeFunPaint2,
-        fmtDecodeFunPaint2, fmtEncodeFunPaint2Unpacked,
-        NULL, NULL,
-        fmtGetPixelFunPaint2,
-        { }, &dmC64CommonFormatOps[3]
-    },
-
-    {
-        D64_FMT_MC | D64_FMT_FLI | D64_FMT_ILACE,
-        "fp2p", "FunPaint II (packed)", 0x3ff0, 0, DM_FMT_RD,
-        C64_SCR_WIDTH, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        NULL,
-        fmtDecodeFunPaint2, fmtEncodeFunPaint2Packed,
-        NULL, NULL,
-        fmtGetPixelFunPaint2,
-        { }, &dmC64CommonFormatOps[3]
-    },
-
-    {
-        D64_FMT_MC | D64_FMT_FLI | D64_FMT_ILACE,
-        "gun", "GunPaint (unpacked)", 0x4000, 0, DM_FMT_RD,
-        C64_SCR_WIDTH, C64_SCR_HEIGHT,
-        C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
-        fmtProbeGunPaint,
-        NULL, NULL,
-        NULL, NULL,
-        fmtGetPixelGunPaint,
+        "xx2", "Unknown $2000 format (unpacked)", 0x2000, 0, DM_FMT_RDWR,
+        fmtProbeFormatXX2,
+        fmtDecodeFormatXX2, NULL,
         {
-            DEF_SCREEN_RAMS_8(0x0000, 0, 0x400),
-            { DO_COPY     , DS_BITMAP_RAM  , 0x2000, 0,  0, NULL, NULL },
-            { DO_COPY     , DS_EXTRA_DATA  , 0x3f4f, 0,  177, NULL, NULL },
-            { DO_COPY     , DS_COLOR_RAM   , 0x4000, 0,  0, NULL, NULL },
-            DEF_SCREEN_RAMS_8(0x4400, 8, 0x400),
-            { DO_COPY     , DS_BITMAP_RAM  , 0x6400, 1,  0, NULL, NULL },
-            { DO_COPY     , DS_EXTRA_DATA  , 0x47e8, 1,  20, NULL, NULL },
-            { DO_DEC_FUNC , 0              , 0x2742, 0,  1, fmtTruePaintGetLaceType, NULL },
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_MC,
+            XX2_WIDTH_CH * 4, XX2_HEIGHT_CH * 8,
+            XX2_WIDTH_CH    , XX2_HEIGHT_CH,
+            NULL, NULL,
+            NULL,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  XX2_BSIZE, NULL, NULL },
+                { DO_COPY     , DS_SCREEN_RAM  , XX2_BSIZE, 0,  XX2_SIZE, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , XX2_BSIZE + XX2_SIZE, 0,  XX2_SIZE, NULL, NULL },
+                { DO_SET_OP   , DS_BGCOL       , 11    , 0,  0, NULL, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
 
     {
-        D64_FMT_HIRES | D64_FMT_FLI,
+        "fp2", "FunPaint II (unpacked)", 0x3ff0, 33694, DM_FMT_RDWR,
+        fmtProbeFunPaint2,
+        fmtDecodeFunPaint2, fmtEncodeFunPaint2Unpacked,
+        { }, &dmC64CommonFormats[3]
+    },
+
+    {
+        "fp2p", "FunPaint II (packed)", 0x3ff0, 0, DM_FMT_RDWR,
+        NULL,
+        fmtDecodeFunPaint2, fmtEncodeFunPaint2Packed,
+        { }, &dmC64CommonFormats[3]
+    },
+
+    {
+        "gun", "GunPaint (unpacked)", 0x4000, 0, DM_FMT_RD,
+        fmtProbeGunPaint,
+        NULL, NULL,
+        {
+            D64_FMT_MC | D64_FMT_FLI | D64_FMT_ILACE,
+            C64_SCR_WIDTH, C64_SCR_HEIGHT,
+            C64_SCR_CH_WIDTH , C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            fmtGetPixelGunPaint,
+            {
+                DEF_SCREEN_RAMS_8(0x0000, 0, 0x400),
+                { DO_COPY     , DS_BITMAP_RAM  , 0x2000, 0,  0, NULL, NULL },
+                { DO_COPY     , DS_EXTRA_DATA  , 0x3f4f, 0,  177, NULL, NULL },
+                { DO_COPY     , DS_COLOR_RAM   , 0x4000, 0,  0, NULL, NULL },
+                DEF_SCREEN_RAMS_8(0x4400, 8, 0x400),
+                { DO_COPY     , DS_BITMAP_RAM  , 0x6400, 1,  0, NULL, NULL },
+                { DO_COPY     , DS_EXTRA_DATA  , 0x47e8, 1,  20, NULL, NULL },
+                { DO_DEC_FUNC , 0              , 0x2742, 0,  1, fmtTruePaintGetLaceType, NULL },
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
+        },
+        NULL
+    },
+
+    {
         "chi", "Crest Hires FLI Designer (unpacked)", 0x4000, 16386, DM_FMT_RD,
-        C64_SCR_WIDTH, 14 * 8,
-        C64_SCR_CH_WIDTH , 14,
         NULL,
         NULL, NULL,
-        NULL, NULL,
-        fmtGetPixelCrestHIFLIorCDHM,
         {
-            { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
-            DEF_SCREEN_RAMS_8(0x2000, 0, 0x400),
-            { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            D64_FMT_HIRES | D64_FMT_FLI,
+            C64_SCR_WIDTH, C64_SCR_HEIGHT,    // Actually 296 x 112 (=14*8)
+            C64_SCR_CH_WIDTH, C64_SCR_CH_HEIGHT,
+            NULL, NULL,
+            fmtGetPixelCrestHIFLIorCDHM,
+            {
+                { DO_COPY     , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+                DEF_SCREEN_RAMS_8(0x2000, 0, 0x400),
+                { DO_LAST     , 0              , 0     , 0,  0, NULL, NULL },
+            }
         },
         NULL
     },
--- a/tools/lib64gfx.c	Tue Jun 12 15:36:00 2018 +0300
+++ b/tools/lib64gfx.c	Tue Jun 12 17:12:48 2018 +0300
@@ -52,7 +52,7 @@
 {
     char typeStr[64], typeStr2[64];
 
-    dmC64GetImageTypeString(typeStr, sizeof(typeStr), fmt->type, TRUE);
+    dmC64GetImageTypeString(typeStr, sizeof(typeStr), fmt->format->type, TRUE);
 
     if (fmt != NULL)
     {
@@ -89,9 +89,9 @@
             "Width x Height      : %d x %d [%d x %d]\n"
             "CHwidth x CHheight  : %d x %d [%d x %d]\n",
             img->width, img->height,
-            fmt->width, fmt->height,
+            fmt->format->width, fmt->format->height,
             img->chWidth, img->chHeight,
-            fmt->chWidth, fmt->chHeight);
+            fmt->format->chWidth, fmt->format->chHeight);
     }
     else
     {
@@ -100,8 +100,8 @@
             "Width x Height      : %d x %d\n"
             "CHwidth x CHheight  : %d x %d\n",
             typeStr,
-            fmt->width, fmt->height,
-            fmt->chWidth, fmt->chHeight);
+            fmt->format->width, fmt->format->height,
+            fmt->format->chWidth, fmt->format->chHeight);
     }
 }
 
@@ -205,11 +205,11 @@
         return NULL;
 
     // Initialize image information
-    img->type        = fmt->type;
-    img->width       = fmt->width;
-    img->height      = fmt->height;
-    img->chWidth     = fmt->chWidth;
-    img->chHeight    = fmt->chHeight;
+    img->type        = fmt->format->type;
+    img->width       = fmt->format->width;
+    img->height      = fmt->format->height;
+    img->chWidth     = fmt->format->chWidth;
+    img->chHeight    = fmt->format->chHeight;
     img->nbanks      = dmC64ImageGetNumBanks(fmt);
 
     // Allocate banks
@@ -734,11 +734,11 @@
     {
         case DS_SCREEN_RAM:
         case DS_COLOR_RAM:
-            *size = fmt->chHeight * fmt->chWidth;
+            *size = fmt->format->chHeight * fmt->format->chWidth;
             break;
 
         case DS_BITMAP_RAM:
-            *size = fmt->chHeight * fmt->chWidth * 8;
+            *size = fmt->format->chHeight * fmt->format->chWidth * 8;
             break;
 
         case DS_CHAR_DATA:
@@ -790,11 +790,11 @@
         return DMERR_NULLPTR;
 
     // Clear the image structure, set basics
-    img->type      = fmt->type;
-    img->width     = fmt->width;
-    img->height    = fmt->height;
-    img->chWidth   = fmt->chWidth;
-    img->chHeight  = fmt->chHeight;
+    img->type      = fmt->format->type;
+    img->width     = fmt->format->width;
+    img->height    = fmt->format->height;
+    img->chWidth   = fmt->format->chWidth;
+    img->chHeight  = fmt->format->chHeight;
     img->nbanks    = dmC64ImageGetNumBanks(fmt);
 
     // Perform decoding
@@ -935,7 +935,7 @@
                     case D64_CHCFG_LINEAR:
                         for (int bank = 0; bank < img->nbanks; bank++)
                         {
-                            for (int offs = 0; offs < fmt->chHeight * fmt->chWidth; offs++)
+                            for (int offs = 0; offs < fmt->format->chHeight * fmt->format->chWidth; offs++)
                                 img->screen[bank].data[offs] = offs & 0xff;
                         }
                         break;
@@ -968,7 +968,7 @@
     }
 
     // Sanity check certain things ..
-    if ((fmt->type & D64_FMT_ILACE) && img->laceType == D64_ILACE_NONE)
+    if ((fmt->format->type & D64_FMT_ILACE) && img->laceType == D64_ILACE_NONE)
     {
         return dmError(DMERR_INTERNAL,
             "Format '%s' (%s) has interlace flag set, but interlace type is not set.\n",
@@ -1178,10 +1178,10 @@
     dmMemset(dst->data, 0, dst->size);
 
     // Check pixel getter function
-    if (fmt->getPixel != NULL)
-        getPixel = fmt->getPixel;
+    if (fmt->format->getPixel != NULL)
+        getPixel = fmt->format->getPixel;
     else
-        getPixel = (fmt->type & D64_FMT_MC) ? fmtGetGenericMCPixel : fmtGetGenericSCPixel;
+        getPixel = (fmt->format->type & D64_FMT_MC) ? fmtGetGenericMCPixel : fmtGetGenericSCPixel;
 
     // Resolution interlaced pics need to halve the source width
     int rwidth = src->width;
@@ -1313,8 +1313,8 @@
     dst->pal      = dmDefaultC64Palette;
 
     // Convert
-    if (fmt->convertFrom != NULL)
-        res = fmt->convertFrom(dst, src, fmt);
+    if (fmt->format->convertFrom != NULL)
+        res = fmt->format->convertFrom(dst, src, fmt);
     else
         res = dmC64ConvertGenericBMP2Image(dst, src, fmt);
 
@@ -1392,8 +1392,8 @@
         return DMERR_MALLOC;
 
     // Convert
-    if (fmt->convertTo != NULL)
-        res = fmt->convertTo(dst, src, fmt);
+    if (fmt->format->convertTo != NULL)
+        res = fmt->format->convertTo(dst, src, fmt);
     else
         res = dmC64ConvertGenericImage2BMP(dst, src, fmt);
 
@@ -1474,3 +1474,14 @@
     else
         return DM_PROBE_SCORE_FALSE;
 }
+
+
+void dmC64InitializeFormats(void)
+{
+    for (int i = 0; i < ndmC64ImageFormats; i++)
+    {
+        DMC64ImageFormat *fmt = &dmC64ImageFormats[i];
+        if (fmt->format == NULL)
+            fmt->format = &fmt->formatDef;
+    }
+}
--- a/tools/lib64gfx.h	Tue Jun 12 15:36:00 2018 +0300
+++ b/tools/lib64gfx.h	Tue Jun 12 17:12:48 2018 +0300
@@ -186,9 +186,23 @@
 typedef DMC64EncDecOp DMC64EncDecOpList[D64_MAX_ENCDEC_OPS];
 
 
+typedef struct
+{
+    int  type;   // Type flags, see D64_FMT_*
+    int  width, height; // Width and height in pixels
+    int  chWidth, chHeight; // Width and height in charblocks
+
+    int  (*convertFrom)(DMImage *, const DMC64Image *, const DMC64ImageFormat *fmt);
+    int  (*convertTo)(DMC64Image *, const DMImage *, const DMC64ImageFormat *fmt);
+
+    DMC64GetPixelFunc getPixel;
+
+    DMC64EncDecOpList encdecOps;
+} DMC64ImageCommonFormat;
+
+
 typedef struct _DMC64ImageFormat
 {
-    int  type;   // Type flags, see D64_FMT_*
     char *fext;  // Filename extension
     char *name;  // Format description/name
 
@@ -197,20 +211,12 @@
 
     int  flags;  // DM_FMT_* flags, see libgfx.h
 
-    int width, height; // Width and height in pixels
-    int chWidth, chHeight; // Width and height in charblocks
-
-    int  (*probe)(const Uint8 *buf, const size_t len, const struct _DMC64ImageFormat *fmt);
+    int  (*probe)(const Uint8 *buf, const size_t len, const DMC64ImageFormat *fmt);
 
-    int  (*decode)(DMC64Image *img, const DMGrowBuf *buf, const struct _DMC64ImageFormat *fmt);
-    int  (*encode)(DMGrowBuf *buf, const DMC64Image *img, const struct _DMC64ImageFormat *fmt);
+    int  (*decode)(DMC64Image *img, const DMGrowBuf *buf, const DMC64ImageFormat *fmt);
+    int  (*encode)(DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageFormat *fmt);
 
-    int  (*convertFrom)(DMImage *, const DMC64Image *, const struct _DMC64ImageFormat *fmt);
-    int  (*convertTo)(DMC64Image *, const DMImage *, const struct _DMC64ImageFormat *fmt);
-
-    DMC64GetPixelFunc getPixel;
-
-    const DMC64EncDecOpList encdecOps, *encdecOpsRef;
+    DMC64ImageCommonFormat formatDef, *format;
 } DMC64ImageFormat;
 
 
@@ -273,13 +279,14 @@
 // Global variables
 //
 extern DMColor           dmDefaultC64Palette[C64_NCOLORS];
-extern const DMC64ImageFormat  dmC64ImageFormats[];
+extern DMC64ImageFormat  dmC64ImageFormats[];
 extern const int         ndmC64ImageFormats;
 
 
 //
 // Miscellaneous functions
 //
+void      dmC64InitializeFormats(void);
 int       dmC64ProbeBMP(const Uint8 *buf, const size_t len, const DMC64ImageFormat **fmt);
 
 char *    dmC64GetImageTypeString(char *buf, const size_t len, const int type, const BOOL lng);
@@ -323,6 +330,7 @@
 
 void      dmSetupRLEBuffers(DMGrowBuf *dst, DMGrowBuf *src, const DMCompParams *cfg);
 void      dmFinishRLEBuffers(DMGrowBuf *dst, DMGrowBuf *src, const DMCompParams *cfg);
+
 int       dmGenericRLEOutputRun(DMGrowBuf *dst, const DMCompParams *cfg, const Uint8 data, const unsigned int count);
 int       dmEncodeGenericRLESequence(DMGrowBuf *dst, const Uint8 data, const unsigned int count, const DMCompParams *cfg);
 
@@ -384,8 +392,7 @@
 
 static inline const DMC64EncDecOp * fmtGetEncDecOp(const DMC64ImageFormat *fmt, const int index)
 {
-    // Ooh .. look at that beaauuuutiful deref ..
-    return fmt->encdecOpsRef != NULL ? &(* (fmt->encdecOpsRef))[index] : &fmt->encdecOps[index];
+    return &fmt->format->encdecOps[index];
 }