From d1b49b5376a0db3c6db6f9841a9c018d6e35c468 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Mon, 30 Dec 2019 15:06:22 +0100 Subject: [PATCH] Save MSX .SC2 files (without sprite) --- src/fileformats.h | 1 + src/loadsave.c | 2 +- src/msxformats.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/fileformats.h b/src/fileformats.h index 6f9f0e2a..05031a9a 100644 --- a/src/fileformats.h +++ b/src/fileformats.h @@ -195,6 +195,7 @@ void Load_GRB(T_IO_Context *); // -- MSX ------------------------------------------------------------------- void Test_MSX(T_IO_Context *, FILE *); void Load_MSX(T_IO_Context *); +void Save_MSX(T_IO_Context *); /// @} #endif diff --git a/src/loadsave.c b/src/loadsave.c index 6cfd772f..1c9a3ab1 100644 --- a/src/loadsave.c +++ b/src/loadsave.c @@ -158,7 +158,7 @@ const T_Format File_formats[] = { {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_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"}, #ifndef __no_tifflib__ {FORMAT_TIFF," tiff",Test_TIFF,Load_TIFF,Save_TIFF,0, 1, 1, "tif", "tif;tiff"}, diff --git a/src/msxformats.c b/src/msxformats.c index 8d0d6486..036daf3d 100644 --- a/src/msxformats.c +++ b/src/msxformats.c @@ -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); +} /* @} */