diff tools/lib64fmts.c @ 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 9336bfb5b6d1
children aa427e68e114
line wrap: on
line diff
--- 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
     },