/****************************************************************************** Title: Timpy - Remote - MakeRomImage Comment: Tiny MP3 Player [ Timpy ] Rev4.x リモート用ツール EEPROMバイナリイメージ生成 File Name: mkromimg.c Version: 1.0 ( Oct 30, 2005 イニシャルリリース) Last Update: Oct. 30, 2005 Copyright(C) Chiaki Nakajima ******************************************************************************/ /* Include File(s) ***********************************************************/ #include #include /* Declaration(s) ************************************************************/ #ifndef NULL #define NULL ((void *)0) #endif typedef struct { unsigned short Start; /* 領域の始まりの文字コード */ unsigned short End; /* 領域の終わりの文字コード */ } AREA_INFO; typedef struct { unsigned char Identifier[6]; /* "FONTX2"という文字列が入る */ unsigned char FontName[8]; /* Font名(8文字) */ unsigned char XSize; /* フォントの横幅 */ unsigned char YSize; /* フォントの高さ */ unsigned char CodeType; } HEADER_ASCII; typedef struct { unsigned char Identifier[6]; /* "FONTX2"という文字列が入る */ unsigned char FontName[8]; /* Font名(8文字) */ unsigned char XSize; /* フォントの横幅 */ unsigned char YSize; /* フォントの高さ */ unsigned char CodeType; unsigned char Tnum; /* AREA_INFOのエントリ数 */ AREA_INFO Area[1]; /* 本来はTnum個続く */ } HEADER_KANJI; typedef union { HEADER_ASCII Ascii; HEADER_KANJI Kanji; } FONTX_HEADER; const unsigned short EmptyCode = 0x81ac - 1; /* 下駄 */ const unsigned char PaddingCode = 0x00; /* Main **********************************************************************/ int main(int argc, char *argv[]) { unsigned short CharCtr, AreaCtr, OfsCtr, EmptyCodeIndex, BytePerChar; void *VoidPtr; long fSize, ImageByteCtr; FILE *fFont, *fImage; HEADER_ASCII *HeaderAscii; HEADER_KANJI *HeaderKanji; if (argc != 4) { fprintf(stderr, "Invalid arguments."); return EXIT_FAILURE; } ImageByteCtr = 0L; if ((fImage = fopen(argv[3], "wb")) == NULL) return EXIT_FAILURE; if ((fFont = fopen(argv[1], "rb")) == NULL) return EXIT_FAILURE; VoidPtr = malloc((size_t)sizeof(HEADER_ASCII)); fseek(fFont, 0L, SEEK_SET); fread(VoidPtr, sizeof(char), (size_t)sizeof(HEADER_ASCII), fFont); HeaderAscii = (HEADER_ASCII *)VoidPtr; if (HeaderAscii->CodeType != 0) return EXIT_FAILURE; else { BytePerChar = (((HeaderAscii->XSize - 1) / 8) + 1) * HeaderAscii->YSize; fSize = BytePerChar * 256L; VoidPtr = realloc(VoidPtr, (size_t)fSize); fread(VoidPtr, sizeof(char), (size_t)fSize, fFont); fclose(fFont); fprintf(stdout, "AsciiFontBmpTop = %#08x\n", ImageByteCtr); ImageByteCtr += fwrite(VoidPtr, sizeof(char), (size_t)fSize, fImage) * sizeof(char); } if ((fFont = fopen(argv[2], "rb")) == NULL) return EXIT_FAILURE; VoidPtr = realloc(VoidPtr, (size_t)sizeof(HEADER_KANJI)); fseek(fFont, 0L, SEEK_SET); fread(VoidPtr, sizeof(char), (size_t)sizeof(HEADER_KANJI), fFont); HeaderKanji = (HEADER_KANJI *)VoidPtr; if (HeaderKanji->CodeType != 1) return EXIT_FAILURE; else { fSize = sizeof(HEADER_KANJI) + (HeaderKanji->Tnum - 1) * sizeof(AREA_INFO); VoidPtr = realloc(VoidPtr, (size_t)fSize); fseek(fFont, 0L, SEEK_SET); fread(VoidPtr, sizeof(char), (size_t)fSize, fFont); HeaderKanji = (HEADER_KANJI *)VoidPtr; BytePerChar = (((HeaderKanji->XSize - 1) / 8) + 1) * HeaderKanji->YSize; OfsCtr = 0; EmptyCodeIndex = EmptyCode - HeaderKanji->Area[0].Start; fprintf(stdout, "KanjiFontCodeMin = %#04x\n", HeaderKanji->Area[0].Start); fprintf(stdout, "KanjiFontCodeMax = %#04x\n", HeaderKanji->Area[HeaderKanji->Tnum - 1].End); fprintf(stdout, "KanjiFontIndexTop = %#08x\n", ImageByteCtr); for (AreaCtr = 0; AreaCtr < HeaderKanji->Tnum; AreaCtr++) { for (CharCtr = HeaderKanji->Area[AreaCtr].Start; CharCtr <= HeaderKanji->Area[AreaCtr].End; CharCtr++) { ImageByteCtr += fwrite(&OfsCtr, sizeof(OfsCtr), 1, fImage) * sizeof(OfsCtr); OfsCtr++; } if (AreaCtr < HeaderKanji->Tnum - 1) { for (CharCtr = HeaderKanji->Area[AreaCtr].End + 1; CharCtr < HeaderKanji->Area[AreaCtr + 1].Start; CharCtr++) ImageByteCtr += fwrite(&EmptyCodeIndex, sizeof(EmptyCodeIndex), 1, fImage) * sizeof(EmptyCodeIndex); } } fSize = (long)OfsCtr * BytePerChar; VoidPtr = realloc(VoidPtr, (size_t)fSize); fread(VoidPtr, sizeof(char), (size_t)fSize, fFont); fprintf(stdout, "KanjiFontBmpTop = %#08x\n", ImageByteCtr); ImageByteCtr += fwrite(VoidPtr, sizeof(char), (size_t)fSize, fImage) * sizeof(char); fprintf(stdout, "KanjiFontBmpEnd = %#08x\n", ImageByteCtr - 1); } while (ImageByteCtr % 256 != 0) { ImageByteCtr += fwrite(&PaddingCode, sizeof(PaddingCode), 1, fImage) * sizeof(PaddingCode); } fprintf(stdout, "RomImageEnd = %#08x\n", ImageByteCtr - 1); free(VoidPtr); fclose(fFont); fclose(fImage); return EXIT_SUCCESS; } /* End ***********************************************************************/