Save MSX .SC2 files (without sprite)

This commit is contained in:
Thomas Bernard 2019-12-30 15:06:22 +01:00
parent 7d3cfba955
commit d1b49b5376
No known key found for this signature in database
GPG Key ID: 0FF11B67A5C0863C
3 changed files with 71 additions and 1 deletions

View File

@ -195,6 +195,7 @@ void Load_GRB(T_IO_Context *);
// -- MSX ------------------------------------------------------------------- // -- MSX -------------------------------------------------------------------
void Test_MSX(T_IO_Context *, FILE *); void Test_MSX(T_IO_Context *, FILE *);
void Load_MSX(T_IO_Context *); void Load_MSX(T_IO_Context *);
void Save_MSX(T_IO_Context *);
/// @} /// @}
#endif #endif

View File

@ -158,7 +158,7 @@ const T_Format File_formats[] = {
{FORMAT_INFO," info",Test_INFO,Load_INFO,NULL, 0, 0, 0, "info", "info"}, {FORMAT_INFO," info",Test_INFO,Load_INFO,NULL, 0, 0, 0, "info", "info"},
{FORMAT_FLI, " flc", Test_FLI, Load_FLI, NULL, 0, 0, 0, "flc", "flc;fli;dat"}, {FORMAT_FLI, " flc", Test_FLI, Load_FLI, NULL, 0, 0, 0, "flc", "flc;fli;dat"},
{FORMAT_MOTO," moto",Test_MOTO,Load_MOTO,Save_MOTO,0, 1, 0, "bin", "bin;map"}, {FORMAT_MOTO," moto",Test_MOTO,Load_MOTO,Save_MOTO,0, 1, 0, "bin", "bin;map"},
{FORMAT_MSX, " msx", Test_MSX, Load_MSX, NULL, 0, 0, 0, "sc2", "sc2"}, {FORMAT_MSX, " msx", Test_MSX, Load_MSX, Save_MSX, 0, 0, 0, "sc2", "sc2"},
{FORMAT_HGR, " hgr", Test_HGR, Load_HGR, Save_HGR, 0, 0, 1, "hgr", "hgr;dhgr;bin"}, {FORMAT_HGR, " hgr", Test_HGR, Load_HGR, Save_HGR, 0, 0, 1, "hgr", "hgr;dhgr;bin"},
#ifndef __no_tifflib__ #ifndef __no_tifflib__
{FORMAT_TIFF," tiff",Test_TIFF,Load_TIFF,Save_TIFF,0, 1, 1, "tif", "tif;tiff"}, {FORMAT_TIFF," tiff",Test_TIFF,Load_TIFF,Save_TIFF,0, 1, 1, "tif", "tif;tiff"},

View File

@ -190,4 +190,73 @@ void Load_MSX(T_IO_Context * context)
} }
} }
/**
* Save .SC2 file
*
* @todo save sprites
*/
void Save_MSX(T_IO_Context * context)
{
FILE * file;
byte vram[16*1024];
word addr;
int sprite;
int row, col;
File_error = 1;
memset(vram, 0, sizeof(vram));
// fill name table
for (addr = 0x1800; addr < 0x1b00; addr++)
vram[addr] = addr & 0xff;
// set sprite attributes
for (sprite = 0; sprite < 32; sprite++)
{
vram[0x1B00 + sprite * 4] = 208; // y_pos : 208=disable
//vram[0x1B00 + sprite * 4 + 1]; x_pos
//vram[0x1B00 + sprite * 4 + 2]; pattern
//vram[0x1B00 + sprite * 4 + 3]; color
}
// build pattern and color table
for (row = 0; row < 24; row++)
{
for (col = 0; col < 32; col++)
{
int x, y;
byte pattern = (row << 5) + col;
addr = ((row & 0x18) << 8) + (pattern << 3);
for (y = 0; y < 8; y++, addr++)
{
byte c0 = 0xff, c1 = 0xff;
byte bits = 0;
for (x = 0; x < 8; x++)
{
byte c = Get_pixel(context, (col << 3) + x, (row << 3) + y);
bits <<= 1;
if (c0 == 0xff)
c0 = c;
else if (c != c0)
{
if (c1 == 0xff)
c1 = c;
else if (c != c1)
{
GFX2_Log(GFX2_WARNING, "Color clash at (%d,%d) #%d (c0=#%d, c1=#%d)\n", (col << 3) + x, (row << 3) + y, c, c0, c1);
}
bits++;
}
}
vram[addr] = bits;
vram[0x2000 + addr] = (c0 & 0x0f) | (c1 << 4);
}
}
}
file = Open_file_write(context);
if (file == NULL)
return;
if (Write_byte(file, 0xfe) && Write_word_le(file, 0)
&& Write_word_le(file, 0x37FF) && Write_word_le(file, 0)
&& Write_bytes(file, vram, 0x3800))
File_error = 0;
fclose(file);
}
/* @} */ /* @} */