三流プログラマの戯言

プログラミング初心者が気になったことを書き綴るだけ。主にc#

響ちゃんスイッチのメニューデータの管理について

先日投稿した、響ちゃんスイッチですが、今日はそのメニューデータの管理方法について、自分のメモとして記事にしておきます。
わかりやすいようにとか、機能説明とか特にしないので、見る意味は皆無です。

また、後でメモリ管理に関しては仕様を変更する予定で、その前に旧仕様を忘れかけなので思い出すついでに書きます。
まず、メニューファイルのデータ構造に関して

データ名 データ型 データ長(byte長) 備考
FileType char[4] 4 "men2" Ver2なので末尾が2
Offset uint16_t 2 6 有効データまでのオフセット
MenuNum uint16_t 2 n メニューの数
DataPtrs uint32_t 4*n 50 Pathの長さ
個別データ 後述 n * x 個別のメニュー情報 | 

また、個別データは以下の形式

データ名 データ型 データ長(byte長) 備考
DataLength uint32_t 4 自身を含まない個別データの長さ
PathLength uint16_t 2 現在は50固定 メニュー先のファイルパスの長さ
Path char[PathLength] PathLength メニュー先のファイルパス
FontBitHeight uint8_t 1 ビット単位でのフォントの高さ
FontByteHeight uint8_t 1 バイト単位でのフォントの高さ
FontWidth uint16_t 2 フォント情報の幅
FontData byte[] フォントデータ

ここで、フォントデータは各文字の個別の情報ではなく、画面に表示するためのメニューの表記文字列を一まとめに持ってます(伝われ

このデータをメモリに配置するためのプログラムがこれ

        int offset = 6;
        _dataFile.seek(offset);
        _dataFile.read(_dataReadTempBuf, 2);
        uint32_t dataPtrDataOffset = _dataFile.position();
        uint16_t menuContextCount = *(uint16_t*)(_dataReadTempBuf);
        uint16_t dataPtrDataLength = menuContextCount * 4;
        byte* fontDataBuf = _dataReadTempBuf + dataPtrDataLength;

        uint16_t writePos = SramManageWrapperClass::GetNestDataLastAddless() + 2 * (menuContextCount + 1);

        _dataFile.read(_dataReadTempBuf, dataPtrDataLength);

        for (uint16_t i = 0; i < menuContextCount; i++)
        {
            _dataFile.read(fontDataBuf, 4);//個別データのデータ長の読み取り
            uint32_t dataLen =*(uint32_t*)(fontDataBuf + 0);
            _dataFile.read(fontDataBuf, dataLen);

            uint32_t fontPosInLocal = 2 + *(uint16_t*)(fontDataBuf) + 1 + 1;//フォントの幅とフォントデータのみを記録する;
            uint32_t writeLength = dataLen - fontPosInLocal;
            
            if (writePos + writeLength >= SRAM_ADDRESS_NUM) break;
            
            SramWriteBytes(writePos, fontDataBuf + fontPosInLocal, writeLength);
            SramWriteBytes(SramManageWrapperClass::GetNestDataLastAddless() + 2 * i, (uint8_t*)(&writePos), 2);

            writePos += writeLength;
        }
        SramWriteBytes(SramManageWrapperClass::GetNestDataLastAddless() + 2 * menuContextCount, (uint8_t*)(&writePos), 2);

        _dataFile.close();

ってわけで、内部メモリ的にはこう配置してるはず…はず…

データ名 データ型 データ長(byte長) 備考
MenuNum uint16_t 2 n メニューの数
FontDataPtr uint32_t 4*(n+1) フォントデータが入っているポインタ
*FontWidth uint8_t 1? フォントの幅
*FontData byte フォントデータ

これ以上は眠いのでここで終わり…