changeset 2196:28871f500e84

Add new "flags" field to DMC64EncDecOp, defined by DF_* that can be used to specify additional control over the operator blocks.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 13 Jun 2019 22:07:16 +0300
parents 868b68c188e5
children 23dd0e0fe25d
files tools/lib64fmts.c tools/lib64gfx.c tools/lib64gfx.h
diffstat 3 files changed, 247 insertions(+), 217 deletions(-) [+]
line wrap: on
line diff
--- a/tools/lib64fmts.c	Thu Jun 13 22:02:04 2019 +0300
+++ b/tools/lib64fmts.c	Thu Jun 13 22:07:16 2019 +0300
@@ -1645,18 +1645,18 @@
 // Helper macros for defining screen memory layouts
 // common for several FLI type image formats
 //
-#define DEF_REPEAT_BLOCK(dtype, start, oindex, bindex, osize, bsize) \
-    { DO_COPY, (dtype), (start) + ((osize) * (oindex)), (bindex), (bsize), 0, NULL, NULL }
-
-#define DEF_REPEAT_BLOCK_8(dtype, start, sindex, osize, bsize) \
-    DEF_REPEAT_BLOCK((dtype), (start), 0, ((sindex) + 0), (osize), (bsize)), \
-    DEF_REPEAT_BLOCK((dtype), (start), 1, ((sindex) + 1), (osize), (bsize)), \
-    DEF_REPEAT_BLOCK((dtype), (start), 2, ((sindex) + 2), (osize), (bsize)), \
-    DEF_REPEAT_BLOCK((dtype), (start), 3, ((sindex) + 3), (osize), (bsize)), \
-    DEF_REPEAT_BLOCK((dtype), (start), 4, ((sindex) + 4), (osize), (bsize)), \
-    DEF_REPEAT_BLOCK((dtype), (start), 5, ((sindex) + 5), (osize), (bsize)), \
-    DEF_REPEAT_BLOCK((dtype), (start), 6, ((sindex) + 6), (osize), (bsize)), \
-    DEF_REPEAT_BLOCK((dtype), (start), 7, ((sindex) + 7), (osize), (bsize))
+#define DEF_REPEAT_BLOCK(dtype, start, oindex, bindex, osize, bsize, oflags) \
+    { DO_COPY, (dtype), (start) + ((osize) * (oindex)), (bindex), (bsize), 0, NULL, NULL, (oflags) }
+
+#define DEF_REPEAT_BLOCK_8(dtype, start, sindex, osize, bsize, oflags) \
+    DEF_REPEAT_BLOCK((dtype), (start), 0, ((sindex) + 0), (osize), (bsize), (oflags)), \
+    DEF_REPEAT_BLOCK((dtype), (start), 1, ((sindex) + 1), (osize), (bsize), (oflags)), \
+    DEF_REPEAT_BLOCK((dtype), (start), 2, ((sindex) + 2), (osize), (bsize), (oflags)), \
+    DEF_REPEAT_BLOCK((dtype), (start), 3, ((sindex) + 3), (osize), (bsize), (oflags)), \
+    DEF_REPEAT_BLOCK((dtype), (start), 4, ((sindex) + 4), (osize), (bsize), (oflags)), \
+    DEF_REPEAT_BLOCK((dtype), (start), 5, ((sindex) + 5), (osize), (bsize), (oflags)), \
+    DEF_REPEAT_BLOCK((dtype), (start), 6, ((sindex) + 6), (osize), (bsize), (oflags)), \
+    DEF_REPEAT_BLOCK((dtype), (start), 7, ((sindex) + 7), (osize), (bsize), (oflags))
 
 
 //
@@ -1674,11 +1674,11 @@
         NULL, NULL,
         NULL,
         {
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_COLOR_RAM   , 0x2328, 0,  0,   0, NULL, NULL },
-            { DO_SET_MEM_LO , DS_BGCOL       , 0x2710, 0,  0,   0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x2328, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_SET_MEM_LO , DS_BGCOL       , 0x2710, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1690,11 +1690,11 @@
         NULL, NULL,
         fmtGetPixelBlackMailFLI,
         {
-            { DO_COPY       , DS_EXTRA_DATA  , 0x0000, 0,  200,   0, NULL, NULL },
-            { DO_COPY       , DS_COLOR_RAM   , 0x0100, 0,  0,   0, NULL, NULL },
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0500, 0, 0x400, 0),
-            { DO_COPY       , DS_BITMAP_RAM  , 0x2500, 0,  0,   0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_EXTRA_DATA  , 0x0000, 0,  200,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x0100, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0500, 0, 0x400, 0, DF_NORMAL),
+            { DO_COPY       , DS_BITMAP_RAM  , 0x2500, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1706,9 +1706,9 @@
         NULL, NULL,
         NULL,
         {
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1720,15 +1720,15 @@
         NULL, NULL,
         fmtGetPixelFunPaint2,
         {
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0000, 0, 0x400, 0),
-            { DO_COPY       , DS_BITMAP_RAM  , 0x2000, 0,  0  , 0, NULL, NULL },
-            { DO_COPY       , DS_EXTRA_DATA  , 0x3f48, 0,  100, 0, NULL, NULL },
-            { DO_COPY       , DS_COLOR_RAM   , 0x4000, 0,  0  , 0, NULL, NULL },
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x43e8, 8, 0x400, 0),
-            { DO_COPY       , DS_BITMAP_RAM  , 0x63e8, 1,  0  , 0, NULL, NULL },
-            { DO_COPY       , DS_EXTRA_DATA  , 0x8328, 0,  100, 100, NULL, NULL },
-            { DO_FUNC       , 0              , 0     , 0,  1  , 0, fmtTruePaintGetLaceType, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0  , 0, NULL, NULL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0000, 0, 0x400, 0, DF_NORMAL),
+            { DO_COPY       , DS_BITMAP_RAM  , 0x2000, 0,  0  , 0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_EXTRA_DATA  , 0x3f48, 0,  100, 0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x4000, 0,  0  , 0, NULL, NULL, DF_NORMAL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x43e8, 8, 0x400, 0, DF_NORMAL),
+            { DO_COPY       , DS_BITMAP_RAM  , 0x63e8, 1,  0  , 0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_EXTRA_DATA  , 0x8328, 0,  100, 100, NULL, NULL, DF_NORMAL },
+            { DO_FUNC       , 0              , 0     , 0,  1  , 0, fmtTruePaintGetLaceType, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0  , 0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1740,11 +1740,11 @@
         NULL, NULL,
         NULL,
         {
-            { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-            { DO_SET_MEM_LO , DS_BGCOL       , 0x2740, 0,  0,   0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_SET_MEM_LO , DS_BGCOL       , 0x2740, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1756,13 +1756,13 @@
         NULL, NULL,
         fmtGetPixelDrazLace,
         {
-            { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-            { DO_SET_MEM_LO , DS_BGCOL       , 0x2740, 0,  0,   0, NULL, NULL },
-            { DO_FUNC       , 0              , 0x2742, 0,  1,   0, fmtDrazLaceGetLaceType, fmtDrazLaceSetLaceType },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x2800, 1,  0,   0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_SET_MEM_LO , DS_BGCOL       , 0x2740, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_FUNC       , 0              , 0x2742, 0,  1,   0, fmtDrazLaceGetLaceType, fmtDrazLaceSetLaceType, DF_NORMAL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x2800, 1,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1774,14 +1774,14 @@
         NULL, NULL,
         fmtGetPixelTruePaint,
         {
-            { DO_COPY       , DS_SCREEN_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-            { DO_SET_MEM_LO , DS_BGCOL       , 0x03e8, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x2400, 1,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_SCREEN_RAM  , 0x4400, 1,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_COLOR_RAM   , 0x4800, 0,  0,   0, NULL, NULL },
-            { DO_FUNC       , 0              , 0x0000, 0,  0,   0, fmtTruePaintGetLaceType, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_SCREEN_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_SET_MEM_LO , DS_BGCOL       , 0x03e8, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x2400, 1,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_SCREEN_RAM  , 0x4400, 1,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x4800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_FUNC       , 0              , 0x0000, 0,  0,   0, fmtTruePaintGetLaceType, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1793,12 +1793,12 @@
         fmtConvertECIBMP2Image, NULL,
         fmtGetPixelECI,
         {
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0, 0x400, 0),
-            { DO_COPY       , DS_BITMAP_RAM  , 0x4000, 1,  0,   0, NULL, NULL },
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x6000, 8, 0x400, 0),
-            { DO_FUNC       , 0              , 0     , 0,  0,   0, fmtECIGetLaceType, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0, 0x400, 0, DF_NORMAL),
+            { DO_COPY       , DS_BITMAP_RAM  , 0x4000, 1,  0,   0, NULL, NULL, DF_NORMAL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x6000, 8, 0x400, 0, DF_NORMAL),
+            { DO_FUNC       , 0              , 0     , 0,  0,   0, fmtECIGetLaceType, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1810,9 +1810,9 @@
         NULL, NULL,
         fmtGetPixelCrestHIFLIorCDHM,
         {
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0,  0x400, 0),
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0,  0x400, 0, DF_NORMAL),
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1824,10 +1824,10 @@
         NULL, NULL,
         fmtGetPixelFLIDesigner,
         {
-            { DO_COPY      , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0400, 0, 0x400, 0),
-            { DO_COPY      , DS_BITMAP_RAM  , 0x2400, 0,  0,   0, NULL, NULL },
-            { DO_LAST      , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY      , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0400, 0, 0x400, 0, DF_NORMAL),
+            { DO_COPY      , DS_BITMAP_RAM  , 0x2400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST      , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1839,9 +1839,9 @@
         NULL, NULL,
         NULL,
         {
-            { DO_COPY       , DS_SCREEN_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+            { DO_COPY       , DS_SCREEN_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
         }
     },
 
@@ -1853,12 +1853,12 @@
         NULL, NULL,
         fmtGetPixelCrestSHFLI,
         {
-            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM,  0x0000, 0 , 0x0400, 0),
-            DEF_REPEAT_BLOCK_8(DS_EXTRA_DATA,  0x03f8, 0 , 0x0400, 8), // Sprite pointers for each bank
-            { DO_COPY       , DS_EXTRA_DATA  , 0x03e8, 15, 2     ,   0, NULL, NULL },  // 2 sprite colors
-            { DO_COPY       , DS_EXTRA_DATA  , 0x0000, 14, 0x3e00,   0, NULL, NULL },  // Lazily copy whole data for sprite data
-            { DO_COPY       , DS_BITMAP_RAM  , 0x2000, 0 , 0     ,   0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0 , 0     ,   0, NULL, NULL },
+            DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM,  0x0000, 0  , 0x0400,   0x0400, DF_NORMAL),
+            DEF_REPEAT_BLOCK_8(DS_EXTRA_DATA,  0x03f8, 0  , 0x0400,   8, DF_DECODE), // Sprite pointers for each bank
+            { DO_COPY       , DS_EXTRA_DATA  , 0x03e8, 15 , 2     ,   0, NULL, NULL, DF_DECODE },  // 2 sprite colors
+            { DO_COPY       , DS_EXTRA_DATA  , 0x0000, 14 , 0x3e00,   0, NULL, NULL, DF_DECODE },  // Lazily copy whole data for sprite data
+            { DO_COPY       , DS_BITMAP_RAM  , 0x2000, 0  , 0     ,   0, NULL, NULL, DF_NORMAL },
+            { DO_LAST       , 0              , 0     , 0  , 0     ,   0, NULL, NULL, DF_NORMAL },
         }
     },
 };
@@ -1916,11 +1916,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x07e8, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x07e8, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             },
         },
         NULL
@@ -1938,11 +1938,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x07fe, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x07fe, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             },
         },
         NULL
@@ -1988,12 +1988,12 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_D020        , 0x2328, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x2329, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x2338, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_D020        , 0x2328, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x2329, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x2338, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             },
         },
         NULL
@@ -2011,11 +2011,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x23ff, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x2400, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x23ff, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x2400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2033,13 +2033,17 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_SCREEN_RAM  , 20 + 0     , 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 20 + 1000  , 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_BITMAP_RAM  , 20 + 2000  , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_SCREEN_RAM  , 20 + 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 20 + 1000  , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_BITMAP_RAM  , 20 + 2000  , 0,  0,   0, NULL, NULL, DF_NORMAL },
                 // XXX TODO: Unknown where the background color is set, so default to 0x00
-                { DO_SET_OP     , DS_BGCOL       , 0x00       , 0,  0,   0, NULL, NULL },
-                { DO_FUNC       , 0              , 0          , 0,  0,   0, NULL, fmtEncodeMicroIllustrator },
-                { DO_LAST       , 0              , 0          , 0,  0,   0, NULL, NULL },
+                { DO_SET_OP     , DS_BGCOL       , 0x00       , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 20 + 0x3e8 , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 20 + 0x3e9 , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 20 + 0x3ea , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 20 + 0x3eb , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_FUNC       , 0              , 0          , 0,  0,   0, NULL, fmtEncodeMicroIllustrator, DF_NORMAL },
+                { DO_LAST       , 0              , 0          , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2057,11 +2061,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000 + 0x111, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x1f40 + 0x111, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x2328 + 0x111, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x2710 + 0x111, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000 + 0x111, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x1f40 + 0x111, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x2328 + 0x111, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x2710 + 0x111, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2079,12 +2083,12 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_SCREEN_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL, DF_NORMAL },
                 // XXX TODO: Not sure if the background color is hardcoded ..
-                { DO_SET_OP     , DS_BGCOL       , 0x00  , 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_SET_OP     , DS_BGCOL       , 0x00  , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2102,11 +2106,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_SCREEN_RAM  , 0x7800 - 0x7800, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x7bf0 - 0x7800, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_BITMAP_RAM  , 0x7c00 - 0x7800, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x9c00 - 0x7800, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x7800 - 0x7800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x7bf0 - 0x7800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x7c00 - 0x7800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x9c00 - 0x7800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2124,13 +2128,13 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
                 // Both d020 and bgcolor confirmed by tests
-                { DO_SET_MEM_LO , DS_D020        , 0x1f7f, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x1f80, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x2000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_SET_MEM_LO , DS_D020        , 0x1f7f, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x1f80, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x2000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2148,12 +2152,12 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x4000 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x6000 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_D020        , 0x5f40 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_COLOR_RAM   , 0x5f43 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x5f44 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x4000 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x6000 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_D020        , 0x5f40 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_COLOR_RAM   , 0x5f43 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x5f44 + 0x72 - 0x4000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2171,12 +2175,12 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x2000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_D020        , 0x27fe, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x27ff, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x2000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_D020        , 0x27fe, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x27ff, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2243,10 +2247,10 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0, 0,   0, NULL, NULL },
-                { DO_SET_OP     , DS_SCREEN_RAM  , 0xCF  , 0, 0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_OP     , DS_SCREEN_RAM  , 0xCF  , 0, 0,   0, NULL, NULL, DF_NORMAL },
                 // Default colors used by MM are --^^
-                { DO_LAST       , 0              , 0     , 0, 0,   0, NULL, NULL },
+                { DO_LAST       , 0              , 0     , 0, 0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2264,9 +2268,9 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0, 0,   0, NULL, NULL },
-                { DO_SET_OP     , DS_SCREEN_RAM  , 0xF0  , 0, 0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0, 0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_OP     , DS_SCREEN_RAM  , 0xF0  , 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0, 0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2284,9 +2288,9 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0, 0,   0, NULL, NULL },
-                { DO_SET_OP     , DS_SCREEN_RAM  , 0x0F  , 0, 0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0, 0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_OP     , DS_SCREEN_RAM  , 0x0F  , 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0, 0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2304,12 +2308,12 @@
             NULL, NULL,
             fmtGetPixelBFLI,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0001, 0,  0x400 ,   0, NULL, NULL },
-                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x0401, 0, 0x400, 0),
-                { DO_COPY       , DS_BITMAP_RAM  , 0x2401, 0,  0x2000,   0, NULL, NULL },
-                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x4401, 8, 0x400, 0x400),
-                { DO_COPY       , DS_BITMAP_RAM  , 0x6401, 1,  0x2000,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0     ,   0, NULL, NULL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x0001, 0,  0x400 ,   0, NULL, NULL, DF_NORMAL },
+                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x0401, 0, 0x400, 0, DF_NORMAL),
+                { DO_COPY       , DS_BITMAP_RAM  , 0x2401, 0,  0x2000,   0, NULL, NULL, DF_NORMAL },
+                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x4401, 8, 0x400, 0x400, DF_NORMAL),
+                { DO_COPY       , DS_BITMAP_RAM  , 0x6401, 1,  0x2000,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0     ,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2369,12 +2373,12 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x2328, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x2710, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_D020        , 0x2711, 0,  0,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x1f40, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x2328, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x2710, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_D020        , 0x2711, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2392,11 +2396,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY      , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_COPY      , DS_SCREEN_RAM  , 0x2000, 0,  0,   0, NULL, NULL },
-                { DO_COPY      , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL },
-                { DO_SET_OP    , DS_BGCOL       , 0x00  , 0,  0,   0, NULL, NULL },
-                { DO_LAST      , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY      , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY      , DS_SCREEN_RAM  , 0x2000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY      , DS_COLOR_RAM   , 0x2400, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_OP    , DS_BGCOL       , 0x00  , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST      , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2414,11 +2418,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY      , DS_BITMAP_RAM  , 0x0000, 0,  XX2_BSIZE,   0, NULL, NULL },
-                { DO_COPY      , DS_SCREEN_RAM  , XX2_BSIZE, 0,  XX2_SIZE,   0, NULL, NULL },
-                { DO_COPY      , DS_COLOR_RAM   , XX2_BSIZE + XX2_SIZE, 0,  XX2_SIZE,   0, NULL, NULL },
-                { DO_SET_OP    , DS_BGCOL       , 11    , 0,  0,   0, NULL, NULL },
-                { DO_LAST      , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY      , DS_BITMAP_RAM  , 0x0000, 0,  XX2_BSIZE,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY      , DS_SCREEN_RAM  , XX2_BSIZE, 0,  XX2_SIZE,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY      , DS_COLOR_RAM   , XX2_BSIZE + XX2_SIZE, 0,  XX2_SIZE,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_OP    , DS_BGCOL       , 11    , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST      , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2450,18 +2454,18 @@
             NULL, NULL,
             fmtGetPixelFunPaint2, // The format is essentially same as FP2
             {
-                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x0000, 0, 0x400, 0),
-                { DO_COPY       , DS_BITMAP_RAM  , 0x2000, 0,  0  , 0, NULL, NULL },
-                { DO_COPY       , DS_EXTRA_DATA  , 0x3f4f, 0,  177, 0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x4000, 0,  0  , 0, NULL, NULL },
-                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x4400, 8, 0x400, 0),
-                { DO_COPY       , DS_BITMAP_RAM  , 0x6400, 1,  0  , 0, NULL, NULL },
+                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x0000, 0, 0x400, 0, DF_NORMAL),
+                { DO_COPY       , DS_BITMAP_RAM  , 0x2000, 0,  0  , 0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_EXTRA_DATA  , 0x3f4f, 0,  177, 0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x4000, 0,  0  , 0, NULL, NULL, DF_NORMAL },
+                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x4400, 8, 0x400, 0, DF_NORMAL),
+                { DO_COPY       , DS_BITMAP_RAM  , 0x6400, 1,  0  , 0, NULL, NULL, DF_NORMAL },
                 // GunPaint does not store the last 3 d021 values .. so set them to black
                 // XXX TODO: According to some, the last 4 should be same ..
-                { DO_SET_MEM    , DS_EXTRA_DATA  , 0     , 0,  3  , 20+177, NULL, NULL },
-                { DO_FUNC       , 0              , 0x2742, 0,  1  , 0, fmtTruePaintGetLaceType, NULL },
-                { DO_FUNC       , 0              , 0     , 0,  0  , 0, NULL, fmtEncodeGunPaint },
-                { DO_LAST       , 0              , 0     , 0,  0  , 0, NULL, NULL },
+                { DO_SET_MEM    , DS_EXTRA_DATA  , 0     , 0,  3  , 20+177, NULL, NULL, DF_NORMAL },
+                { DO_FUNC       , 0              , 0x2742, 0,  1  , 0, fmtTruePaintGetLaceType, NULL, DF_NORMAL },
+                { DO_FUNC       , 0              , 0     , 0,  0  , 0, NULL, fmtEncodeGunPaint, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0  , 0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2479,13 +2483,13 @@
             NULL, NULL,
             fmtGetPixelHCB,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x0400, 1,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x0800, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_SCREEN_RAM  , 0x0c00, 1,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_BITMAP_RAM  , 0x1000, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_EXTRA_DATA  , 0x2f40, 0,  D64_SCR_HEIGHT / 4,   0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x0400, 1,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x0800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x0c00, 1,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x1000, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_EXTRA_DATA  , 0x2f40, 0,  D64_SCR_HEIGHT / 4,   0, NULL, NULL, DF_NORMAL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2503,13 +2507,13 @@
             NULL, NULL,
             fmtGetPixelPentelPaint,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-                { DO_SET_OP     , DS_SCREEN_RAM  , 0x10  , 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x9580 - 0x4800, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_D022        , 0x9581 - 0x4800, 0,  0,   0, NULL, NULL }, // Sprite color
-                { DO_SET_MEM_LO , DS_COLOR_RAM   , 0x9582 - 0x4800, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_EXTRA_DATA  , 0x5ac0 - 0x4800, 0,  D64_SPR_SIZE * 235,   0, NULL, NULL }, // Sprite data
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000         , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_OP     , DS_SCREEN_RAM  , 0x10           , 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x9580 - 0x4800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_D022        , 0x9581 - 0x4800, 0,  0,   0, NULL, NULL, DF_NORMAL }, // Sprite color
+                { DO_SET_MEM_LO , DS_COLOR_RAM   , 0x9582 - 0x4800, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_EXTRA_DATA  , 0x5ac0 - 0x4800, 0,  D64_SPR_SIZE * 235,   0, NULL, NULL, DF_NORMAL }, // Sprite data
+                { DO_LAST       , 0              , 0              , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2527,9 +2531,9 @@
             NULL, NULL,
             fmtGetPixelCrestHIFLIorCDHM,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
-                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM, 0x2000, 0, 0x400, 0),
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0    ,  0, NULL, NULL, DF_NORMAL },
+                DEF_REPEAT_BLOCK_8(DS_SCREEN_RAM , 0x2000, 0,  0x400,  0, DF_NORMAL),
+                { DO_LAST       , 0              , 0     , 0,  0    ,  0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2575,16 +2579,16 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_SCREEN_RAM  , 0x60, 0, 0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x60 + 1000, 0, 0,   0, NULL, NULL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x60  , 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x60 + 1000, 0, 0,   0, NULL, NULL, DF_NORMAL },
 
                 // For offset values see petscii/m_c64.pde :: save_prg()
-                { DO_SET_MEM_LO , DS_D020        , 25 - 2, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 30 - 2, 0,  0,   0, NULL, NULL },
-                { DO_COPY       , DS_EXTRA_DATA  , 20 - 2, 0,  1,   0, NULL, NULL },
-                { DO_FUNC       , 0              , 0     , 0,  0,   0, fmtSetMarqPETSCIIData, NULL },
-
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_SET_MEM_LO , DS_D020        , 25 - 2, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 30 - 2, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_EXTRA_DATA  , 20 - 2, 0,  1,   0, NULL, NULL, DF_NORMAL },
+                { DO_FUNC       , 0              , 0     , 0,  0,   0, fmtSetMarqPETSCIIData, NULL, DF_NORMAL },
+
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2602,15 +2606,15 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_SCREEN_RAM  , 0x01ab, 0, 0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x01ab + 1000, 0, 0,   0, NULL, NULL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x01ab, 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x01ab + 1000, 0, 0,   0, NULL, NULL, DF_NORMAL },
 
                 // For offset values see petscii/m_c64.pde :: save_prg()
-                { DO_SET_MEM_LO , DS_D020        , 0x01a9, 0,  0,   0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x01aa, 0,  0,   0, NULL, NULL },
-                { DO_FUNC       , 0              , 0     , 0,  0,   0, fmtSetSPETSCIIData, NULL },
-
-                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
+                { DO_SET_MEM_LO , DS_D020        , 0x01a9, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x01aa, 0,  0,   0, NULL, NULL, DF_NORMAL },
+                { DO_FUNC       , 0              , 0     , 0,  0,   0, fmtSetSPETSCIIData, NULL, DF_NORMAL },
+
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
@@ -2628,14 +2632,14 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_SCREEN_RAM  , 0x2001 - 2, 0, 0,   0, NULL, NULL },
-                { DO_COPY       , DS_COLOR_RAM   , 0x23e9 - 2, 0, 0,   0, NULL, NULL },
-
-                { DO_COPY       , DS_EXTRA_DATA  , 0x0000    , 0, 0x0100, 0, NULL, NULL },
-                { DO_COPY       , DS_CHAR_DATA   , 0x1801 - 2, 0, 0x0800, 0, NULL, NULL },
-                { DO_FUNC       , 0              , 0         , 0, 0     , 0, fmtSetPetsciiKrisszHuData, NULL },
-
-                { DO_LAST       , 0              , 0         , 0, 0,   0, NULL, NULL },
+                { DO_COPY       , DS_SCREEN_RAM  , 0x2001 - 2, 0, 0,   0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x23e9 - 2, 0, 0,   0, NULL, NULL, DF_NORMAL },
+
+                { DO_COPY       , DS_EXTRA_DATA  , 0x0000    , 0, 0x0100, 0, NULL, NULL, DF_NORMAL },
+                { DO_COPY       , DS_CHAR_DATA   , 0x1801 - 2, 0, 0x0800, 0, NULL, NULL, DF_NORMAL },
+                { DO_FUNC       , 0              , 0         , 0, 0     , 0, fmtSetPetsciiKrisszHuData, NULL, DF_NORMAL },
+
+                { DO_LAST       , 0              , 0         , 0, 0,   0, NULL, NULL, DF_NORMAL },
             }
         },
         NULL
--- a/tools/lib64gfx.c	Thu Jun 13 22:02:04 2019 +0300
+++ b/tools/lib64gfx.c	Thu Jun 13 22:07:16 2019 +0300
@@ -836,6 +836,13 @@
 
 int dmC64SanityCheckEncDecOp(const int i, const DMC64EncDecOp *op, const DMC64Image *img)
 {
+    if (op->flags == 0)
+    {
+        return dmError(DMERR_INTERNAL,
+            "Invalid operation flags value %d in generic encode/decode operator %d @ #%d.\n",
+            op->flags, op->type, i);
+    }
+
     switch (op->type)
     {
         case DO_COPY:
@@ -1015,6 +1022,10 @@
         if ((res = dmC64SanityCheckEncDecOp(i, op, img)) != DMERR_OK)
             return res;
 
+        // Check flags
+        if ((op->flags & DF_DECODE) == 0)
+            continue;
+
         // Is the operation inside the bounds?
         size = dmC64GetOpSubjectSize(op, fmt->format);
         if (op->type == DO_COPY && op->offs + size > buf->len + 1)
@@ -1220,6 +1231,10 @@
         if ((res = dmC64SanityCheckEncDecOp(i, op, img)) != DMERR_OK)
             goto err;
 
+        // Check flags
+        if ((op->flags & DF_ENCODE) == 0)
+            continue;
+
         // Do we need to reallocate some more space?
         size = dmC64GetOpSubjectSize(op, fmt->format);
         chksize = buf->offs + op->offs + size;
--- a/tools/lib64gfx.h	Thu Jun 13 22:02:04 2019 +0300
+++ b/tools/lib64gfx.h	Thu Jun 13 22:07:16 2019 +0300
@@ -142,6 +142,15 @@
 };
 
 
+// Operation flags (op->flags)
+enum
+{
+    DF_NORMAL	= 0xffff,
+    DF_DECODE	= 0x0001,
+    DF_ENCODE	= 0x0002,
+};
+
+
 typedef struct
 {
     int dither;      // Dither mode (D64_DITH_*)
@@ -218,6 +227,8 @@
 
     int (*decFunction)(const struct _DMC64EncDecOp *op, DMC64Image *img, const DMGrowBuf *buf, const DMC64ImageCommonFormat *fmt);
     int (*encFunction)(const struct _DMC64EncDecOp *op, DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageCommonFormat *fmt);
+
+    int   flags;     // Operation flags (DF_*)
 } DMC64EncDecOp;