Load_C64(): support for DrazPaint, FacePaint & Image System
This commit is contained in:
parent
61b0056ec5
commit
77b915c074
@ -2241,17 +2241,22 @@ static const char *c64_format_names[] = {
|
|||||||
*
|
*
|
||||||
* Checks the file size and the load address
|
* Checks the file size and the load address
|
||||||
*
|
*
|
||||||
* http://unusedino.de/ec64/technical/formats/bitmap.html
|
* References :
|
||||||
* http://codebase64.org/doku.php?id=base:c64_grafix_files_specs_list_v0.03
|
* - http://unusedino.de/ec64/technical/formats/bitmap.html
|
||||||
* https://sourceforge.net/p/view64/code/HEAD/tree/trunk/libview64.c#l3737
|
* - http://codebase64.org/doku.php?id=base:c64_grafix_files_specs_list_v0.03
|
||||||
|
* - https://sourceforge.net/p/view64/code/HEAD/tree/trunk/libview64.c#l3737
|
||||||
*/
|
*/
|
||||||
void Test_C64(T_IO_Context * context, FILE * file)
|
void Test_C64(T_IO_Context * context, FILE * file)
|
||||||
{
|
{
|
||||||
long file_size;
|
long file_size;
|
||||||
word load_addr;
|
word load_addr;
|
||||||
|
byte header[14];
|
||||||
|
|
||||||
(void)context;
|
(void)context;
|
||||||
|
File_error = 1;
|
||||||
file_size = File_length_file(file);
|
file_size = File_length_file(file);
|
||||||
|
if (file_size < 16 || file_size > 48*1024)
|
||||||
|
return; // File too short or too long, exit now
|
||||||
// First test for formats without load address
|
// First test for formats without load address
|
||||||
switch (file_size)
|
switch (file_size)
|
||||||
{
|
{
|
||||||
@ -2264,12 +2269,17 @@ void Test_C64(T_IO_Context * context, FILE * file)
|
|||||||
return;
|
return;
|
||||||
default: // then we don't know for now.
|
default: // then we don't know for now.
|
||||||
if (!Read_word_le(file, &load_addr))
|
if (!Read_word_le(file, &load_addr))
|
||||||
{
|
|
||||||
File_error = 1;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
GFX2_Log(GFX2_DEBUG, "Test_C64() file_size=%ld LoadAddr=$%04X\n", file_size, load_addr);
|
GFX2_Log(GFX2_DEBUG, "Test_C64() file_size=%ld LoadAddr=$%04X\n", file_size, load_addr);
|
||||||
|
if (!Read_bytes(file, header, sizeof(header)))
|
||||||
|
return;
|
||||||
|
if (memcmp(header, "DRAZPAINT", 9) == 0)
|
||||||
|
{
|
||||||
|
GFX2_Log(GFX2_DEBUG, "Test_C64() header=%.13s RLE code = $%02X\n", header, header[13]);
|
||||||
|
File_error = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
switch (file_size)
|
switch (file_size)
|
||||||
{
|
{
|
||||||
// case 1002: // (screen or color) + loadaddr
|
// case 1002: // (screen or color) + loadaddr
|
||||||
@ -2284,10 +2294,14 @@ void Test_C64(T_IO_Context * context, FILE * file)
|
|||||||
case 10003: // multicolor + loadaddr
|
case 10003: // multicolor + loadaddr
|
||||||
// $4000 => InterPaint multicolor
|
// $4000 => InterPaint multicolor
|
||||||
// $6000 => Koala Painter
|
// $6000 => Koala Painter
|
||||||
|
case 10004:
|
||||||
|
// $4000 => Face Paint (.fpt)
|
||||||
case 10018:
|
case 10018:
|
||||||
// $2000 => Advanced Art Studio
|
// $2000 => Advanced Art Studio
|
||||||
case 10050:
|
case 10050:
|
||||||
// $1800 => Picasso64
|
// $1800 => Picasso64
|
||||||
|
case 10218:
|
||||||
|
// $3C00 => Image System (.ism)
|
||||||
File_error = 0;
|
File_error = 0;
|
||||||
break;
|
break;
|
||||||
case 10242:
|
case 10242:
|
||||||
@ -2506,6 +2520,67 @@ void Load_C64_fli(T_IO_Context *context, byte *bitmap, byte *screen_ram, byte *c
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unpack the DRAZPAINT RLE packing
|
||||||
|
*
|
||||||
|
* @param[in,out] file_buffer will contain the unpacked buffer on return
|
||||||
|
* @param[in] packed buffer size
|
||||||
|
* @return the unpacked data size or -1 in case of error
|
||||||
|
*
|
||||||
|
* Ref:
|
||||||
|
* - https://www.godot64.de/german/l_draz.htm
|
||||||
|
* - https://sourceforge.net/p/view64/code/HEAD/tree/trunk/libview64.c#l2805
|
||||||
|
*/
|
||||||
|
static long C64_unpack_draz(byte ** file_buffer, long file_size)
|
||||||
|
{
|
||||||
|
long unpacked_size = 0;
|
||||||
|
byte * unpacked_buffer;
|
||||||
|
byte * current, * end;
|
||||||
|
byte * unpacked;
|
||||||
|
byte RLE_code;
|
||||||
|
|
||||||
|
if (file_size <= 16 || file_buffer == NULL || *file_buffer == NULL)
|
||||||
|
return -1;
|
||||||
|
RLE_code = (*file_buffer)[15];
|
||||||
|
GFX2_Log(GFX2_DEBUG, "C64_unpack_draz() \"%.13s\" RLE code=$%02X RLE data length=%ld\n",
|
||||||
|
*file_buffer + 2, RLE_code, file_size - 16);
|
||||||
|
// First pass to know unpacked size
|
||||||
|
end = *file_buffer + file_size;
|
||||||
|
for (current = *file_buffer + 16; current < end; current++)
|
||||||
|
{
|
||||||
|
if (*current == RLE_code)
|
||||||
|
{
|
||||||
|
current++;
|
||||||
|
unpacked_size += *current++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
unpacked_size++;
|
||||||
|
}
|
||||||
|
GFX2_Log(GFX2_DEBUG, "C64_unpack_draz() unpacked_size=%ld\n", unpacked_size);
|
||||||
|
// 2nd pass to unpack
|
||||||
|
unpacked_buffer = malloc(unpacked_size);
|
||||||
|
if (unpacked_buffer == NULL)
|
||||||
|
return -1;
|
||||||
|
unpacked = unpacked_buffer;
|
||||||
|
|
||||||
|
for (current = *file_buffer + 16; current < end; current++)
|
||||||
|
{
|
||||||
|
if (*current == RLE_code)
|
||||||
|
{
|
||||||
|
byte count;
|
||||||
|
current++;
|
||||||
|
count = *current++;
|
||||||
|
while (count-- > 0)
|
||||||
|
*unpacked++ = *current;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*unpacked++ = *current;
|
||||||
|
}
|
||||||
|
free(*file_buffer);
|
||||||
|
*file_buffer = unpacked_buffer;
|
||||||
|
return unpacked_size;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load C64 pictures formats.
|
* Load C64 pictures formats.
|
||||||
*
|
*
|
||||||
@ -2556,32 +2631,6 @@ void Load_C64(T_IO_Context * context)
|
|||||||
File_error=0;
|
File_error=0;
|
||||||
file_size = File_length_file(file);
|
file_size = File_length_file(file);
|
||||||
|
|
||||||
// Check for known file sizes
|
|
||||||
switch (file_size)
|
|
||||||
{
|
|
||||||
case 8000: // raw bitmap
|
|
||||||
case 8002: // raw bitmap with loadaddr
|
|
||||||
case 9000: // bitmap + ScreenRAM
|
|
||||||
case 9002: // bitmap + ScreenRAM + loadaddr
|
|
||||||
case 9003: // bitmap + ScreenRAM + loadaddr (+border ?)
|
|
||||||
case 9009: // bitmap + ScreenRAM + loadaddr
|
|
||||||
case 9218: // Doodle
|
|
||||||
case 10001: // multicolor
|
|
||||||
case 10003: // multicolor + loadaddr
|
|
||||||
case 10018: // Advanced Art Studio + loadaddr
|
|
||||||
case 10050: // Picasso64 + loadaddr
|
|
||||||
case 10242: // Artist64 or blazing paddle + Loadaddr
|
|
||||||
case 10277: // multicolor CDU-Paint + loadaddr
|
|
||||||
case 17409: // FLI-designer v1.1
|
|
||||||
case 17472: // FLI (BlackMail)
|
|
||||||
case 17474: // FLI (BlackMail) + loadaddr
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
File_error = 1;
|
|
||||||
fclose(file);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Load entire file in memory
|
// Load entire file in memory
|
||||||
file_buffer=(byte *)malloc(file_size);
|
file_buffer=(byte *)malloc(file_size);
|
||||||
if (!file_buffer)
|
if (!file_buffer)
|
||||||
@ -2602,6 +2651,10 @@ void Load_C64(T_IO_Context * context)
|
|||||||
// get load address (valid only if hasLoadAddr = 1)
|
// get load address (valid only if hasLoadAddr = 1)
|
||||||
load_addr = file_buffer[0] | (file_buffer[1] << 8);
|
load_addr = file_buffer[0] | (file_buffer[1] << 8);
|
||||||
|
|
||||||
|
// Unpack if needed
|
||||||
|
if (memcmp(file_buffer + 2, "DRAZPAINT", 9) == 0)
|
||||||
|
file_size = C64_unpack_draz(&file_buffer, file_size);
|
||||||
|
|
||||||
switch (file_size)
|
switch (file_size)
|
||||||
{
|
{
|
||||||
case 8000: // raw bitmap
|
case 8000: // raw bitmap
|
||||||
@ -2657,6 +2710,7 @@ void Load_C64(T_IO_Context * context)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 10003: // multicolor + loadaddr
|
case 10003: // multicolor + loadaddr
|
||||||
|
case 10004: // extra byte is border color
|
||||||
hasLoadAddr=1;
|
hasLoadAddr=1;
|
||||||
loadFormat=F_multi;
|
loadFormat=F_multi;
|
||||||
bitmap=file_buffer+2; // length: 8000
|
bitmap=file_buffer+2; // length: 8000
|
||||||
@ -2675,6 +2729,15 @@ void Load_C64(T_IO_Context * context)
|
|||||||
background=file_buffer+9001+2; // only 1
|
background=file_buffer+9001+2; // only 1
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 10049: // unpacked DrazPaint
|
||||||
|
hasLoadAddr=1;
|
||||||
|
loadFormat=F_multi;
|
||||||
|
color_ram=file_buffer; // length: 1000 + (padding 24)
|
||||||
|
screen_ram=file_buffer+1024; // length: 1000 + (padding 24)
|
||||||
|
bitmap=file_buffer+1024*2; // length: 8000
|
||||||
|
background=file_buffer+8000+1024*2;
|
||||||
|
break;
|
||||||
|
|
||||||
case 10050: // Picasso64 multicolor + loadaddr
|
case 10050: // Picasso64 multicolor + loadaddr
|
||||||
hasLoadAddr=1;
|
hasLoadAddr=1;
|
||||||
loadFormat=F_multi;
|
loadFormat=F_multi;
|
||||||
@ -2684,6 +2747,15 @@ void Load_C64(T_IO_Context * context)
|
|||||||
background=file_buffer+1024*2+2-1; // only 1
|
background=file_buffer+1024*2+2-1; // only 1
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 10218: // Image System
|
||||||
|
hasLoadAddr=1;
|
||||||
|
loadFormat=F_multi;
|
||||||
|
color_ram=file_buffer+2; // Length: 1000 (+ padding 24)
|
||||||
|
bitmap=file_buffer+1024+2; // Length: 8000 (+padding 192)
|
||||||
|
screen_ram=file_buffer+8192+1024+2; // Length: 1000 (no padding)
|
||||||
|
background=file_buffer+8192+1024+2-1; // only 1
|
||||||
|
break;
|
||||||
|
|
||||||
case 10242: // Artist 64/Blazing Paddles/Rainbow Painter multicolor + loadaddr
|
case 10242: // Artist 64/Blazing Paddles/Rainbow Painter multicolor + loadaddr
|
||||||
hasLoadAddr=1;
|
hasLoadAddr=1;
|
||||||
loadFormat=F_multi;
|
loadFormat=F_multi;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user