# HG changeset patch # User Matti Hamalainen # Date 1528812768 -10800 # Node ID 4e4d54135baf649ca3bf822778378a6c7e015597 # Parent 88354355b8e18757110ccff36b56dea3aa2c50e9 Refactor the c64 bitmap format definitions handling to be more flexible. Again. diff -r 88354355b8e1 -r 4e4d54135baf tools/64vw.c --- a/tools/64vw.c Tue Jun 12 15:36:00 2018 +0300 +++ b/tools/64vw.c Tue Jun 12 17:12:48 2018 +0300 @@ -61,7 +61,7 @@ char buf[64]; printf("%-6s| %-15s | %s%s\n", fmt->fext, - dmC64GetImageTypeString(buf, sizeof(buf), fmt->type, FALSE), + dmC64GetImageTypeString(buf, sizeof(buf), fmt->format->type, FALSE), fmt->name, fmt->flags & DM_FMT_BROKEN ? " [BROKEN]" : ""); } @@ -221,8 +221,8 @@ bmap.constpal = TRUE; bmap.pal = dmDefaultC64Palette; - if (fmt->convertFrom != NULL) - ret = fmt->convertFrom(&bmap, cimage, fmt); + if (fmt->format->convertFrom != NULL) + ret = fmt->format->convertFrom(&bmap, cimage, fmt); else ret = dmC64ConvertGenericBMP2Image(&bmap, cimage, fmt); @@ -243,6 +243,7 @@ size_t currIndex, prevIndex; int ret; + dmC64InitializeFormats(); dmSetScaleFactor(2.0); dmInitProg("64vw", "Display some C64 bitmap graphics formats", "0.3", NULL, NULL); @@ -275,7 +276,7 @@ { forced = &dmC64ImageFormats[optForcedFormat]; dmMsg(0, "Forced %s format image, type %d, %s\n", - forced->name, forced->type, forced->fext); + forced->name, forced->format->type, forced->fext); } else forced = NULL; diff -r 88354355b8e1 -r 4e4d54135baf tools/gfxconv.c --- a/tools/gfxconv.c Tue Jun 12 15:36:00 2018 +0300 +++ b/tools/gfxconv.c Tue Jun 12 17:12:48 2018 +0300 @@ -176,7 +176,7 @@ fmt->fext, (fmt->flags & DM_FMT_RD) ? 'R' : ' ', (fmt->flags & DM_FMT_WR) ? 'W' : ' ', - dmC64GetImageTypeString(buf, sizeof(buf), fmt->type, FALSE), + dmC64GetImageTypeString(buf, sizeof(buf), fmt->format->type, FALSE), fmt->name, fmt->flags & DM_FMT_BROKEN ? " [BROKEN]" : ""); } @@ -1620,6 +1620,7 @@ optColors[i] = i; // Initialize list of additional conversion formats + dmC64InitializeFormats(); nconvFormatList = ndmImageFormatList + nbaseFormatList; convFormatList = dmCalloc(nconvFormatList, sizeof(DMConvFormat)); @@ -1707,7 +1708,7 @@ { forced = &dmC64ImageFormats[optForcedFormat]; dmMsg(0, "Forced %s format image, type %d, %s\n", - forced->name, forced->type, forced->fext); + forced->name, forced->format->type, forced->fext); } res = dmC64DecodeBMP(&inC64Image, @@ -1717,7 +1718,7 @@ if (forced == NULL && inC64Fmt != NULL && res == DMERR_OK) { dmMsg(1, "Probed '%s' format image, type %d, %s\n", - inC64Fmt->name, inC64Fmt->type, inC64Fmt->fext); + inC64Fmt->name, inC64Fmt->format->type, inC64Fmt->fext); optInFormat = FFMT_BITMAP; } diff -r 88354355b8e1 -r 4e4d54135baf tools/lib64fmts.c --- 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 }, diff -r 88354355b8e1 -r 4e4d54135baf tools/lib64gfx.c --- a/tools/lib64gfx.c Tue Jun 12 15:36:00 2018 +0300 +++ b/tools/lib64gfx.c Tue Jun 12 17:12:48 2018 +0300 @@ -52,7 +52,7 @@ { char typeStr[64], typeStr2[64]; - dmC64GetImageTypeString(typeStr, sizeof(typeStr), fmt->type, TRUE); + dmC64GetImageTypeString(typeStr, sizeof(typeStr), fmt->format->type, TRUE); if (fmt != NULL) { @@ -89,9 +89,9 @@ "Width x Height : %d x %d [%d x %d]\n" "CHwidth x CHheight : %d x %d [%d x %d]\n", img->width, img->height, - fmt->width, fmt->height, + fmt->format->width, fmt->format->height, img->chWidth, img->chHeight, - fmt->chWidth, fmt->chHeight); + fmt->format->chWidth, fmt->format->chHeight); } else { @@ -100,8 +100,8 @@ "Width x Height : %d x %d\n" "CHwidth x CHheight : %d x %d\n", typeStr, - fmt->width, fmt->height, - fmt->chWidth, fmt->chHeight); + fmt->format->width, fmt->format->height, + fmt->format->chWidth, fmt->format->chHeight); } } @@ -205,11 +205,11 @@ return NULL; // Initialize image information - img->type = fmt->type; - img->width = fmt->width; - img->height = fmt->height; - img->chWidth = fmt->chWidth; - img->chHeight = fmt->chHeight; + img->type = fmt->format->type; + img->width = fmt->format->width; + img->height = fmt->format->height; + img->chWidth = fmt->format->chWidth; + img->chHeight = fmt->format->chHeight; img->nbanks = dmC64ImageGetNumBanks(fmt); // Allocate banks @@ -734,11 +734,11 @@ { case DS_SCREEN_RAM: case DS_COLOR_RAM: - *size = fmt->chHeight * fmt->chWidth; + *size = fmt->format->chHeight * fmt->format->chWidth; break; case DS_BITMAP_RAM: - *size = fmt->chHeight * fmt->chWidth * 8; + *size = fmt->format->chHeight * fmt->format->chWidth * 8; break; case DS_CHAR_DATA: @@ -790,11 +790,11 @@ return DMERR_NULLPTR; // Clear the image structure, set basics - img->type = fmt->type; - img->width = fmt->width; - img->height = fmt->height; - img->chWidth = fmt->chWidth; - img->chHeight = fmt->chHeight; + img->type = fmt->format->type; + img->width = fmt->format->width; + img->height = fmt->format->height; + img->chWidth = fmt->format->chWidth; + img->chHeight = fmt->format->chHeight; img->nbanks = dmC64ImageGetNumBanks(fmt); // Perform decoding @@ -935,7 +935,7 @@ case D64_CHCFG_LINEAR: for (int bank = 0; bank < img->nbanks; bank++) { - for (int offs = 0; offs < fmt->chHeight * fmt->chWidth; offs++) + for (int offs = 0; offs < fmt->format->chHeight * fmt->format->chWidth; offs++) img->screen[bank].data[offs] = offs & 0xff; } break; @@ -968,7 +968,7 @@ } // Sanity check certain things .. - if ((fmt->type & D64_FMT_ILACE) && img->laceType == D64_ILACE_NONE) + if ((fmt->format->type & D64_FMT_ILACE) && img->laceType == D64_ILACE_NONE) { return dmError(DMERR_INTERNAL, "Format '%s' (%s) has interlace flag set, but interlace type is not set.\n", @@ -1178,10 +1178,10 @@ dmMemset(dst->data, 0, dst->size); // Check pixel getter function - if (fmt->getPixel != NULL) - getPixel = fmt->getPixel; + if (fmt->format->getPixel != NULL) + getPixel = fmt->format->getPixel; else - getPixel = (fmt->type & D64_FMT_MC) ? fmtGetGenericMCPixel : fmtGetGenericSCPixel; + getPixel = (fmt->format->type & D64_FMT_MC) ? fmtGetGenericMCPixel : fmtGetGenericSCPixel; // Resolution interlaced pics need to halve the source width int rwidth = src->width; @@ -1313,8 +1313,8 @@ dst->pal = dmDefaultC64Palette; // Convert - if (fmt->convertFrom != NULL) - res = fmt->convertFrom(dst, src, fmt); + if (fmt->format->convertFrom != NULL) + res = fmt->format->convertFrom(dst, src, fmt); else res = dmC64ConvertGenericBMP2Image(dst, src, fmt); @@ -1392,8 +1392,8 @@ return DMERR_MALLOC; // Convert - if (fmt->convertTo != NULL) - res = fmt->convertTo(dst, src, fmt); + if (fmt->format->convertTo != NULL) + res = fmt->format->convertTo(dst, src, fmt); else res = dmC64ConvertGenericImage2BMP(dst, src, fmt); @@ -1474,3 +1474,14 @@ else return DM_PROBE_SCORE_FALSE; } + + +void dmC64InitializeFormats(void) +{ + for (int i = 0; i < ndmC64ImageFormats; i++) + { + DMC64ImageFormat *fmt = &dmC64ImageFormats[i]; + if (fmt->format == NULL) + fmt->format = &fmt->formatDef; + } +} diff -r 88354355b8e1 -r 4e4d54135baf tools/lib64gfx.h --- a/tools/lib64gfx.h Tue Jun 12 15:36:00 2018 +0300 +++ b/tools/lib64gfx.h Tue Jun 12 17:12:48 2018 +0300 @@ -186,9 +186,23 @@ typedef DMC64EncDecOp DMC64EncDecOpList[D64_MAX_ENCDEC_OPS]; +typedef struct +{ + int type; // Type flags, see D64_FMT_* + int width, height; // Width and height in pixels + int chWidth, chHeight; // Width and height in charblocks + + int (*convertFrom)(DMImage *, const DMC64Image *, const DMC64ImageFormat *fmt); + int (*convertTo)(DMC64Image *, const DMImage *, const DMC64ImageFormat *fmt); + + DMC64GetPixelFunc getPixel; + + DMC64EncDecOpList encdecOps; +} DMC64ImageCommonFormat; + + typedef struct _DMC64ImageFormat { - int type; // Type flags, see D64_FMT_* char *fext; // Filename extension char *name; // Format description/name @@ -197,20 +211,12 @@ int flags; // DM_FMT_* flags, see libgfx.h - int width, height; // Width and height in pixels - int chWidth, chHeight; // Width and height in charblocks - - int (*probe)(const Uint8 *buf, const size_t len, const struct _DMC64ImageFormat *fmt); + int (*probe)(const Uint8 *buf, const size_t len, const DMC64ImageFormat *fmt); - int (*decode)(DMC64Image *img, const DMGrowBuf *buf, const struct _DMC64ImageFormat *fmt); - int (*encode)(DMGrowBuf *buf, const DMC64Image *img, const struct _DMC64ImageFormat *fmt); + int (*decode)(DMC64Image *img, const DMGrowBuf *buf, const DMC64ImageFormat *fmt); + int (*encode)(DMGrowBuf *buf, const DMC64Image *img, const DMC64ImageFormat *fmt); - int (*convertFrom)(DMImage *, const DMC64Image *, const struct _DMC64ImageFormat *fmt); - int (*convertTo)(DMC64Image *, const DMImage *, const struct _DMC64ImageFormat *fmt); - - DMC64GetPixelFunc getPixel; - - const DMC64EncDecOpList encdecOps, *encdecOpsRef; + DMC64ImageCommonFormat formatDef, *format; } DMC64ImageFormat; @@ -273,13 +279,14 @@ // Global variables // extern DMColor dmDefaultC64Palette[C64_NCOLORS]; -extern const DMC64ImageFormat dmC64ImageFormats[]; +extern DMC64ImageFormat dmC64ImageFormats[]; extern const int ndmC64ImageFormats; // // Miscellaneous functions // +void dmC64InitializeFormats(void); int dmC64ProbeBMP(const Uint8 *buf, const size_t len, const DMC64ImageFormat **fmt); char * dmC64GetImageTypeString(char *buf, const size_t len, const int type, const BOOL lng); @@ -323,6 +330,7 @@ void dmSetupRLEBuffers(DMGrowBuf *dst, DMGrowBuf *src, const DMCompParams *cfg); void dmFinishRLEBuffers(DMGrowBuf *dst, DMGrowBuf *src, const DMCompParams *cfg); + int dmGenericRLEOutputRun(DMGrowBuf *dst, const DMCompParams *cfg, const Uint8 data, const unsigned int count); int dmEncodeGenericRLESequence(DMGrowBuf *dst, const Uint8 data, const unsigned int count, const DMCompParams *cfg); @@ -384,8 +392,7 @@ static inline const DMC64EncDecOp * fmtGetEncDecOp(const DMC64ImageFormat *fmt, const int index) { - // Ooh .. look at that beaauuuutiful deref .. - return fmt->encdecOpsRef != NULL ? &(* (fmt->encdecOpsRef))[index] : &fmt->encdecOps[index]; + return &fmt->format->encdecOps[index]; }