diff --git a/src/loadsave.c b/src/loadsave.c index db255634..d63c2525 100644 --- a/src/loadsave.c +++ b/src/loadsave.c @@ -87,7 +87,7 @@ void Load_Recoil_Image(T_IO_Context *); // ENUM Name TestFunc LoadFunc SaveFunc PalOnly Comment Layers Ext Exts const T_Format File_formats[] = { - {FORMAT_ALL_IMAGES, "(all)", NULL, NULL, NULL, 0, 0, 0, "", "gif;png;bmp;2bp;pcx;pkm;iff;lbm;ilbm;sham;ham;ham6;ham8;acbm;pic;anim;img;sci;scq;scf;scn;sco;pi1;pc1;cel;neo;c64;p64;a64;koa;koala;fli;bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph;info;flc"}, + {FORMAT_ALL_IMAGES, "(all)", NULL, NULL, NULL, 0, 0, 0, "", "gif;png;bmp;2bp;pcx;pkm;iff;lbm;ilbm;sham;ham;ham6;ham8;acbm;pic;anim;img;sci;scq;scf;scn;sco;pi1;pc1;cel;neo;c64;p64;a64;pi;rp;koa;koala;fli;bml;cdu;prg;tga;pnm;xpm;xcf;jpg;jpeg;tif;tiff;ico;ic2;cur;cm5;pph;info;flc"}, {FORMAT_ALL_PALETTES, "(pal)", NULL, NULL, NULL, 1, 0, 0, "", "kcf;pal;gpl"}, {FORMAT_ALL_FILES, "(*.*)", NULL, NULL, NULL, 0, 0, 0, "", "*"}, {FORMAT_GIF, " gif", Test_GIF, Load_GIF, Save_GIF, 0, 1, 1, "gif", "gif"}, @@ -109,7 +109,7 @@ const T_Format File_formats[] = { {FORMAT_KCF, " kcf", Test_KCF, Load_KCF, Save_KCF, 1, 0, 0, "kcf", "kcf"}, {FORMAT_PAL, " pal", Test_PAL, Load_PAL, Save_PAL, 1, 0, 0, "pal", "pal"}, {FORMAT_GPL, " gpl", Test_GPL, Load_GPL, Save_GPL, 1, 0, 0, "gpl", "gpl"}, - {FORMAT_C64, " c64", Test_C64, Load_C64, Save_C64, 0, 1, 0, "c64", "c64;p64;a64;koa;koala;fli;bml;cdu;prg"}, + {FORMAT_C64, " c64", Test_C64, Load_C64, Save_C64, 0, 1, 0, "c64", "c64;p64;a64;pi;rp;koa;koala;fli;bml;cdu;prg"}, {FORMAT_SCR, " cpc", NULL, NULL, Save_SCR, 0, 0, 0, "cpc", "cpc;scr"}, {FORMAT_CM5, " cm5", Test_CM5, Load_CM5, Save_CM5, 0, 0, 1, "cm5", "cm5"}, {FORMAT_PPH, " pph", Test_PPH, Load_PPH, Save_PPH, 0, 0, 1, "pph", "pph"}, diff --git a/src/miscfileformats.c b/src/miscfileformats.c index a3217fac..163d8281 100644 --- a/src/miscfileformats.c +++ b/src/miscfileformats.c @@ -2258,9 +2258,19 @@ void Test_C64(T_IO_Context * context, FILE * file) // $6000 => Koala Painter case 10050: // $1800 => Picasso64 + File_error = 0; + break; case 10242: - // $4000 => Artist 64 - // ? $A000 => Blazing paddles ? + // $4000 => Artist 64 (.a64) + // $A000 => Blazing paddles (.pi) + // $5C00 => Rainbow Painter (.rp) + if (load_addr != 0x4000 && load_addr != 0xa000 && load_addr != 0x5c00) + { + File_error = 1; + return; + } + File_error = 0; + break; case 17409: // $3c00 => FLI-designer v1.1 // ? $3ff0 => FLI designer 2 ? @@ -2475,6 +2485,7 @@ void Load_C64(T_IO_Context * context) FILE* file; long file_size; byte hasLoadAddr=0; + word load_addr; int loadFormat=0; enum c64_format {F_hires,F_multi,F_bitmap,F_fli}; static const char *c64_format_names[]={"Hires","Multicolor","Bitmap","FLI"}; @@ -2549,6 +2560,9 @@ void Load_C64(T_IO_Context * context) } fclose(file); + // get load address (valid only if hasLoadAddr = 1) + load_addr = file_buffer[0] | (file_buffer[1] << 8); + memset(dummy_screen,1,1000); switch (file_size) @@ -2611,14 +2625,32 @@ void Load_C64(T_IO_Context * context) background=file_buffer+1024*2+2-1; // only 1 break; - case 10242: // Artist 64 multicolor + loadaddr + case 10242: // Artist 64/Blazing Paddles/Rainbow Painter multicolor + loadaddr hasLoadAddr=1; loadFormat=F_multi; context->Ratio = PIXEL_WIDE; - bitmap=file_buffer+2; // length: 8000 (+padding 192) - screen_ram=file_buffer+8192+2; // length: 1000 + (padding 24) - color_ram=file_buffer+1024+8192+2; // length: 1000 + (padding 24) - background=file_buffer+1024*2+8192+2-1; // only 1 + switch(load_addr) + { + default: + case 0x4000: // Artist 64 + bitmap=file_buffer+2; // length: 8000 (+padding 192) + screen_ram=file_buffer+8192+2; // length: 1000 + (padding 24) + color_ram=file_buffer+1024+8192+2; // length: 1000 + (padding 24) + background=file_buffer+1024*2+8192+2-1; // only 1 + break; + case 0xa000: // Blazing Paddles + bitmap=file_buffer+2; // length: 8000 (+padding 192) + screen_ram=file_buffer+8192+2; // length: 1000 + (padding 24) + color_ram=file_buffer+1024+8192+2; // length: 1000 + (padding 24) + background=file_buffer+8064+2; // only 1 + break; + case 0x5c00: // Rainbow Painter + screen_ram=file_buffer+2; // length: 1000 + (padding 24) + bitmap=file_buffer+1024+2; // length: 8000 (+padding 192) + color_ram=file_buffer+1024+8192+2; // length: 1000 + (padding 24) + background=file_buffer; // only 1 + break; + } break; case 10277: // multicolor CDU-Paint + loadaddr @@ -2674,9 +2706,6 @@ void Load_C64(T_IO_Context * context) // Write detailed format in comment if (hasLoadAddr) { - // get load address - word load_addr; - load_addr = file_buffer[0] | (file_buffer[1] << 8); snprintf(context->Comment,COMMENT_SIZE+1,"%s, load at $%4.4X",c64_format_names[loadFormat],load_addr); } else