changeset 1846:88cef7758303

Implement data block offset in certain DMC64EncDecOps. This allows us to combine and separate data from multiple sources/destinations into one data block.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 22 Jun 2018 22:31:52 +0300
parents a77451bb6614
children e3d1f16be4ee
files tools/lib64fmts.c tools/lib64gfx.c tools/lib64gfx.h
diffstat 3 files changed, 172 insertions(+), 160 deletions(-) [+]
line wrap: on
line diff
--- a/tools/lib64fmts.c	Fri Jun 22 21:47:31 2018 +0300
+++ b/tools/lib64fmts.c	Fri Jun 22 22:31:52 2018 +0300
@@ -995,7 +995,7 @@
 // Helper macros for defining screen memory layouts
 // common for several FLI type image formats
 //
-#define DEF_SCREEN_RAM(start, oindex, bindex, osize) { DO_COPY, DS_SCREEN_RAM, (start) + ((osize) * (oindex)), (bindex), 0, NULL, NULL }
+#define DEF_SCREEN_RAM(start, oindex, bindex, osize) { DO_COPY, DS_SCREEN_RAM, (start) + ((osize) * (oindex)), (bindex), 0, 0, NULL, NULL }
 #define DEF_SCREEN_RAMS_8(start, sindex, osize) \
     DEF_SCREEN_RAM((start), 0, (sindex + 0), (osize)), \
     DEF_SCREEN_RAM((start), 1, (sindex + 1), (osize)), \
@@ -1022,11 +1022,11 @@
         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_LO , DS_BGCOL       , 0x2710, 0,  0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0, 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 },
         }
     },
 
@@ -1037,11 +1037,11 @@
         NULL, NULL,
         fmtGetPixelBlackMailFLI,
         {
-            { DO_COPY       , DS_EXTRA_DATA  , 0x0000, 0,  200, NULL, NULL },
-            { DO_COPY       , DS_COLOR_RAM   , 0x0100, 0,  0, NULL, NULL },
+            { DO_COPY       , DS_EXTRA_DATA  , 0x0000, 0,  200,   0, NULL, NULL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x0100, 0,  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 },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x2500, 0,  0,   0, NULL, NULL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
         }
     },
 
@@ -1052,9 +1052,9 @@
         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 },
+            { 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 },
         }
     },
 
@@ -1066,14 +1066,14 @@
         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 },
-            { DO_COPY       , DS_COLOR_RAM   , 0x4000, 0,  0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x2000, 0,  0  , 0, NULL, NULL },
+            { DO_COPY       , DS_EXTRA_DATA  , 0x3f40, 0,  100, 0, NULL, NULL },
+            { DO_COPY       , DS_COLOR_RAM   , 0x4000, 0,  0  , 0, NULL, NULL },
             DEF_SCREEN_RAMS_8(0x43e8, 8, 0x400),
-            { DO_COPY       , DS_BITMAP_RAM  , 0x63e8, 1,  0, NULL, NULL },
-            { 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 },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x63e8, 1,  0  , 0, NULL, NULL },
+            { DO_COPY       , DS_EXTRA_DATA  , 0x8328, 1,  100, 0, NULL, NULL },
+            { DO_DEC_FUNC   , 0              , 0x2742, 0,  1  , 0, fmtTruePaintGetLaceType, NULL },
+            { DO_LAST       , 0              , 0     , 0,  0  , 0, NULL, NULL },
         }
     },
 
@@ -1084,11 +1084,11 @@
         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_LO , DS_BGCOL       , 0x2740, 0,  0, NULL, NULL },
-            { DO_LAST       , 0              , 0     , 0,  0, 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 },
         }
     },
 
@@ -1099,14 +1099,14 @@
         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_LO , DS_BGCOL       , 0x2740, 0,  0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x2800, 1,  0, NULL, NULL },
-            { 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 },
+            { 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_COPY       , DS_BITMAP_RAM  , 0x2800, 1,  0,   0, NULL, NULL },
+            { DO_DEC_FUNC   , 0              , 0x2742, 0,  1,   0, fmtDrazLaceGetLaceType, NULL },
+            { DO_ENC_FUNC   , 0              , 0x2742, 0,  1,   0, NULL, fmtDrazLaceSetLaceType },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
         }
     },
 
@@ -1117,14 +1117,14 @@
         NULL, NULL,
         fmtGetPixelTruePaint,
         {
-            { DO_COPY       , DS_SCREEN_RAM  , 0x0000, 0,  0, NULL, NULL },
-            { DO_SET_MEM_LO , DS_BGCOL       , 0x03e8, 0,  0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0400, 0,  0, NULL, NULL },
-            { DO_COPY       , DS_BITMAP_RAM  , 0x2400, 1,  0, NULL, NULL },
-            { DO_COPY       , DS_SCREEN_RAM  , 0x4400, 1,  0, NULL, NULL },
-            { 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 },
+            { 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_DEC_FUNC   , 0              , 0x0000, 0,  0,   0, fmtTruePaintGetLaceType, NULL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
         }
     },
 
@@ -1135,25 +1135,25 @@
         fmtConvertECIBMP2Image, NULL,
         fmtGetPixelECI,
         {
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
             DEF_SCREEN_RAMS_8(0x2000, 0, 0x400),
-            { DO_COPY       , DS_BITMAP_RAM  , 0x4000, 1,  0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x4000, 1,  0,   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 },
+            { DO_DEC_FUNC   , 0              , 0     , 0,  0,   0, fmtECIGetLaceType, NULL },
+            { DO_LAST       , 0              , 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,
+        C64_SCR_WIDTH, 24*8, // Actually 296 x 192 (=24*8)
+        C64_SCR_CH_WIDTH, 24,
         NULL, NULL,
         fmtGetPixelCrestHIFLIorCDHM,
         {
-            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+            { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
             DEF_SCREEN_RAMS_8(0x2000, 0, 0x400),
-            { DO_LAST       , 0              , 0     , 0,  0, NULL, NULL },
+            { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
         }
     },
 
@@ -1164,10 +1164,10 @@
         NULL, NULL,
         fmtGetPixelFLIDesigner,
         {
-            { DO_COPY      , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
+            { DO_COPY      , DS_COLOR_RAM   , 0x0000, 0,  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 },
+            { DO_COPY      , DS_BITMAP_RAM  , 0x2400, 0,  0,   0, NULL, NULL },
+            { DO_LAST      , 0              , 0     , 0,  0,   0, NULL, NULL },
         }
     },
 
@@ -1178,9 +1178,9 @@
         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 },
+            { 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 },
         }
     },
 };
@@ -1237,11 +1237,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , 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 },
+                { 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 },
             },
         },
         NULL
@@ -1258,11 +1258,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0000, 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , 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 },
+                { 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 },
             },
         },
         NULL
@@ -1307,12 +1307,12 @@
             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_LO , DS_D020        , 0x2328, 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , 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 },
+                { 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 },
             },
         },
         NULL
@@ -1329,11 +1329,11 @@
             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_LO , 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 },
+                { 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 },
             }
         },
         NULL
@@ -1350,13 +1350,13 @@
             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 },
+                { 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 },
                 // 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 },
+                //{ DO_SET_MEM    , DS_BGCOL       , 0x23ff, 0,  0,   0, NULL, NULL },
+                { DO_SET_OP     , DS_BGCOL       , 0x01  , 0,  0,   0, NULL, NULL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
             }
         },
         NULL
@@ -1373,11 +1373,11 @@
             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_LO , DS_BGCOL       , 0x2710 + 0x111, 0,  0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0, 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 },
             }
         },
         NULL
@@ -1394,12 +1394,12 @@
             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 },
+                { 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 },
                 // 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 },
+                { DO_SET_OP     , DS_BGCOL       , 0x00  , 0,  0,   0, NULL, NULL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
             }
         },
         NULL
@@ -1416,11 +1416,11 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_SCREEN_RAM  , 0x7800 - 0x7800, 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , 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 },
+                { 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 },
             }
         },
         NULL
@@ -1437,13 +1437,13 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
                 // XXX TODO: Background color is wrong, this offset/addr is from codebase64 docs
-                { DO_SET_MEM_LO , DS_D020        , 0x1f7f, 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , 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 },
+                { 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 },
             }
         },
         NULL
@@ -1460,12 +1460,12 @@
             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_LO , DS_D020        , 0x5f40 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-                { DO_SET_MEM    , DS_COLOR_RAM   , 0x5f43 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x5f44 + 0x72 - 0x4000, 0,  0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0, 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    , 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 },
             }
         },
         NULL
@@ -1482,12 +1482,12 @@
             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_MEM_LO , DS_D020        , 0x27fe, 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x27ff, 0,  0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0, 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 },
             }
         },
         NULL
@@ -1553,10 +1553,10 @@
             NULL, NULL,
             NULL,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0, 0, NULL, NULL },
-                { DO_SET_OP     , DS_SCREEN_RAM  , 0xCF  , 0, 0, 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 },
                 // Default colors used by MM are --^^
-                { DO_LAST       , 0              , 0     , 0, 0, NULL, NULL },
+                { DO_LAST       , 0              , 0     , 0, 0,   0, NULL, NULL },
             }
         },
         NULL
@@ -1573,9 +1573,9 @@
             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 },
+                { 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 },
             }
         },
         NULL
@@ -1592,12 +1592,12 @@
             NULL, NULL,
             fmtGetPixelBFLI,
             {
-                { DO_COPY       , DS_COLOR_RAM   , 0x0001, 0,  0, NULL, NULL },
+                { DO_COPY       , DS_COLOR_RAM   , 0x0001, 0,  0,   0, NULL, NULL },
                 DEF_SCREEN_RAMS_8(0x0401, 0, 0x400),
-                { DO_COPY       , DS_BITMAP_RAM  , 0x2401, 0,  0x1fff, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x2401, 0,  0x1fff,   0, 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 },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x6401, 1,  0,   0, NULL, NULL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
             }
         },
         NULL
@@ -1656,11 +1656,11 @@
             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_LAST      , 0              , 0     , 0,  0, 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 },
             }
         },
         NULL
@@ -1677,11 +1677,11 @@
             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 },
+                { 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 },
             }
         },
         NULL
@@ -1713,15 +1713,15 @@
             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 },
+                { 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_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_ENC_FUNC   , 0              , fmtGunPaintMagicOffs, 0, fmtGunPaintMagicLen, NULL, fmtEncodeGunPaint },
-                { DO_LAST       , 0              , 0     , 0,  0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x6400, 1,  0  , 0, NULL, NULL },
+                { DO_COPY       , DS_EXTRA_DATA  , 0x47e8, 1,  20 , 0, NULL, NULL },
+                { DO_DEC_FUNC   , 0              , 0x2742, 0,  1  , 0, fmtTruePaintGetLaceType, NULL },
+                { DO_ENC_FUNC   , 0              , fmtGunPaintMagicOffs, 0, fmtGunPaintMagicLen, 0, NULL, fmtEncodeGunPaint },
+                { DO_LAST       , 0              , 0     , 0,  0  , 0, NULL, NULL },
             }
         },
         NULL
@@ -1738,10 +1738,10 @@
             NULL, NULL,
             fmtGetPixelPentelPaint,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
-                { DO_SET_OP     , DS_SCREEN_RAM  , 0x23  , 0,  0, NULL, NULL },
-                { DO_SET_MEM_LO , DS_BGCOL       , 0x9580 - 0x4800, 0,  0, NULL, NULL },
-                { DO_LAST       , 0              , 0     , 0,  0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
+                { DO_SET_OP     , DS_SCREEN_RAM  , 0x23  , 0,  0,   0, NULL, NULL },
+                { DO_SET_MEM_LO , DS_BGCOL       , 0x9580 - 0x4800, 0,  0,   0, NULL, NULL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
             }
         },
         NULL
@@ -1758,9 +1758,9 @@
             NULL, NULL,
             fmtGetPixelCrestHIFLIorCDHM,
             {
-                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0, NULL, NULL },
+                { DO_COPY       , DS_BITMAP_RAM  , 0x0000, 0,  0,   0, NULL, NULL },
                 DEF_SCREEN_RAMS_8(0x2000, 0, 0x400),
-                { DO_LAST       , 0              , 0     , 0,  0, NULL, NULL },
+                { DO_LAST       , 0              , 0     , 0,  0,   0, NULL, NULL },
             }
         },
         NULL
--- a/tools/lib64gfx.c	Fri Jun 22 21:47:31 2018 +0300
+++ b/tools/lib64gfx.c	Fri Jun 22 22:31:52 2018 +0300
@@ -174,6 +174,17 @@
 }
 
 
+int dmC64MemBlockReAlloc(DMC64MemBlock *blk, const size_t size)
+{
+    if ((blk->data = dmRealloc(blk->data, size)) == NULL)
+        return DMERR_MALLOC;
+
+    dmMemset(blk->data + blk->size, 0, size - blk->size);
+    blk->size = size;
+    return DMERR_OK;
+}
+
+
 int dmC64MemBlockCopy(DMC64MemBlock *dst, const DMC64MemBlock *src)
 {
     if (src->data != NULL && src->size > 0)
@@ -882,7 +893,7 @@
                     case DS_EXTRA_DATA:
                         // XXX BZZZT .. a nasty cast here --v
                         dmC64GetOpMemBlockAndName(img, op->subject, op->bank, (const DMC64MemBlock **) &blk, &blkname);
-                        if ((dmC64MemBlockAlloc(blk, size)) != DMERR_OK)
+                        if ((dmC64MemBlockReAlloc(blk, op->offs2 + size)) != DMERR_OK)
                         {
                             return dmError(DMERR_MALLOC,
                                 "Could not allocate '%s' block! "
@@ -892,15 +903,15 @@
                         switch (op->type)
                         {
                             case DO_COPY:
-                                memcpy(blk->data, src, size);
+                                memcpy(blk->data + op->offs2, src, size);
                                 break;
 
                             case DO_SET_MEM:
-                                dmMemset(blk->data, *src, size);
+                                dmMemset(blk->data + op->offs2, *src, size);
                                 break;
 
                             case DO_SET_OP:
-                                dmMemset(blk->data, op->offs, size);
+                                dmMemset(blk->data + op->offs2, op->offs, size);
                                 break;
 
                             default:
@@ -1094,15 +1105,15 @@
                                         blkname, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
                                     goto err;
                                 }
-                                if (size > blk->size)
+                                if (op->offs2 + size > blk->size)
                                 {
                                     res = dmError(DMERR_INTERNAL,
                                         "'%s' size mismatch %d <> %d in "
-                                        "op #%d, offs=%d ($%04x), bank=%d, size=%d ($%04x) @ %d ($%04x)\n",
-                                        blkname, i, op->offs, op->offs, op->bank, size, size, buf->len, buf->len);
+                                        "op #%d, offs=%d ($%04x), bank=%d, offs2=%d ($%02x), size=%d ($%04x)\n",
+                                        blkname, op->offs2 + size, blk->size, i, op->offs, op->offs, op->bank, op->offs2, op->offs2, size, size);
                                     goto err;
                                 }
-                                memcpy(dst, blk->data, size);
+                                memcpy(dst, blk->data + op->offs2, size);
                                 break;
 
                             case DO_SET_MEM:
--- a/tools/lib64gfx.h	Fri Jun 22 21:47:31 2018 +0300
+++ b/tools/lib64gfx.h	Fri Jun 22 22:31:52 2018 +0300
@@ -175,9 +175,10 @@
     int    type;     // Operation type (DO_*)
     int    subject;  // Operation "subject" (DS_*)
 
-    size_t offs;
-    int    bank;
-    size_t size;
+    size_t offs;     // Offset in "memory"
+    int    bank;     // Bank number or extradata index
+    size_t size;     // Size of data (0 for "default")
+    size_t offs2;    // Offset in data-block
 
     BOOL   (*decFunction)(DMC64Image *img, const struct _DMC64EncDecOp *op, const DMGrowBuf *buf, const DMC64ImageFormat *fmt);
     BOOL   (*encFunction)(const struct _DMC64EncDecOp *op, DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageFormat *fmt);