Beispiel #1
0
        static uint FindFontDataLat1(uint topaddress
                                     , uint moji, out uint prevaddr, ROM rom
                                     )
        {
            uint moji2 = (moji & 0xff);

            //リストの元になるポインタへ移動. -0x100 は英語版では不要.
            uint list;

            list     = topaddress + (moji2 << 2);
            prevaddr = list;

            if (!U.isSafetyOffset(list))
            {
                return(U.NOT_FOUND);
            }
            uint p = rom.p32(list);

            if (!U.isSafetyOffset(p, rom))
            {
                return(U.NOT_FOUND);
            }

            //英語版は 探索不要です.
            return(p);
        }
Beispiel #2
0
        static uint FindFontDataSJIS(uint topaddress
                                     , uint moji, out uint prevaddr, ROM rom
                                     )
        {
            uint moji1 = ((moji >> 8) & 0xff);
            uint moji2 = (moji & 0xff);
            uint list;

            if (moji1 == 0)
            {//拡張 半角アルファベットフォント
                moji1 = 0x40;
            }
            else if (moji1 < 0x1f)
            {
                prevaddr = U.NOT_FOUND;
                //moji1バイト目が 0x1F より小さい コントロールコードにはフォントは存在しません
                return(U.NOT_FOUND);
            }

            //リストの元になるポインタへ移動.
            list     = topaddress + (moji1 << 2) - 0x100;
            prevaddr = list;

            if (!U.isSafetyOffset(list))
            {
                return(U.NOT_FOUND);
            }
            uint p = rom.p32(list);

            if (!U.isSafetyOffset(p, rom))
            {
                return(U.NOT_FOUND);
            }

            //同一ハッシュキーがあるため、リストをたどりながら目的のフォントを探します.
            //日本語版
            //struct{
            //    void* next;
            //    byte  moji2
            //    byte  width
            //    byte  nazo1
            //    byte  nazo2
            //} //sizeof()==8
            while (p > 0)
            {
                uint next  = rom.p32(p);
                uint check = rom.u8(p + 4);

                //日本語版は、 moji1でハッシュして、 以下listをmoji2で探索します.
                if (check == moji2)
                {
                    //探していた文字コードである.
                    return(p);
                }

                //現在地の保存.
                prevaddr = p;

                if (next == 0)
                {//リスト終端.
                    break;
                }

                if (!U.isSafetyOffset(next, rom))
                {//リストが壊れている.
                    break;
                }

                //次のリストへ進む.
                p = next;
            }

            //探していたフォントは存在しない!
            return(U.NOT_FOUND);
        }
Beispiel #3
0
        static uint FindFontDataUTF8(uint topaddress
                                     , uint moji, out uint prevaddr, ROM rom
                                     )
        {
            uint moji1 = (moji & 0xff);

            //リストの元になるポインタへ移動.
            uint list = topaddress + (moji1 << 2);

            prevaddr = list;

            if (!U.isSafetyOffset(list))
            {
                return(U.NOT_FOUND);
            }
            uint p = rom.p32(list);

            if (!U.isSafetyOffset(p, rom))
            {
                return(U.NOT_FOUND);
            }

            //同一ハッシュキーがあるため、リストをたどりながら目的のフォントを探します.
            //日本語版
            //struct{
            //    void* next;
            //    byte  moji2
            //    byte  width
            //    byte  moji3
            //    byte  moji4
            //} //sizeof()==8
            uint moji2 = ((moji >> 8) & 0xff);
            uint moji3 = ((moji >> 16) & 0xff);
            uint moji4 = ((moji >> 24) & 0xff);

            while (p > 0)
            {
                uint next   = rom.p32(p);
                uint check2 = rom.u8(p + 4);
                uint check3 = rom.u8(p + 6);
                uint check4 = rom.u8(p + 7);

                //日本語版は、 moji1でハッシュして、 以下listをmoji2で探索します.
                if (check2 == moji2 &&
                    check3 == moji3 &&
                    check4 == moji4
                    )
                {
                    //探していた文字コードである.
                    return(p);
                }

                //現在地の保存.
                prevaddr = p;

                if (next == 0)
                {//リスト終端.
                    break;
                }

                if (!U.isSafetyOffset(next, rom))
                {//リストが壊れている.
                    break;
                }

                //次のリストへ進む.
                p = next;
            }

            //探していたフォントは存在しない!
            return(U.NOT_FOUND);
        }