Annotation of nono/m680x0/m68040mmu.h, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2024 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: #pragma once
        !             8: 
        !             9: struct m68040MMU
        !            10: {
        !            11:        //    3                   2                   1                   0
        !            12:        //  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
        !            13:        // +-------------------------------------+-+-+-+---+-+---+-+-+-+---+
        !            14:        // |       Physical Address (4K/8K)      : | |G|U10|S|CM |M|U|W|PDT|
        !            15:        // +-------------------------------------+-+-+-+---+-+---+-+-+-+---+
        !            16:        //                                        ^ ^
        !            17:        //                                        | |
        !            18:        //                                        +-+-- UR (ユーザ用予約)
        !            19:        static const uint32 DESC_G                      = 0x00000400;
        !            20:        static const uint32 DESC_S                      = 0x00000080;
        !            21:        static const uint32 DESC_CM                     = 0x00000060;
        !            22:        static const uint32 DESC_M                      = 0x00000010;
        !            23:        static const uint32 DESC_U                      = 0x00000008;
        !            24:        static const uint32 DESC_W                      = 0x00000004;
        !            25:        static const uint32 DESC_DT                     = 0x00000003;
        !            26: 
        !            27:        // PDT は
        !            28:        // %00 無効
        !            29:        // %01 常駐
        !            30:        // %10 間接
        !            31:        // %11 常駐
        !            32:        static const uint32 PDT_INVALID         = 0;
        !            33:        static const uint32 PDT_INDIRECT        = 2;
        !            34: 
        !            35:        // UDT は
        !            36:        // %00 無効
        !            37:        // %01 無効
        !            38:        // %10 常駐
        !            39:        // %11 常駐
        !            40: };
        !            41: 
        !            42: class m68040RP
        !            43: {
        !            44:        // SRP, URP
        !            45:        //
        !            46:        //    3                   2                   1                   0
        !            47:        //  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
        !            48:        // +-------------------------------------------+-------------------+
        !            49:        // |                 Root Pointer              |         0         |
        !            50:        // +-------------------------------------------+-------------------+
        !            51: 
        !            52:  public:
        !            53:        static const uint32 ADDR_MASK   = 0xfffffc00;
        !            54: };
        !            55: 
        !            56: class m68040TT
        !            57: {
        !            58:        //    3                   2                   1                   0
        !            59:        //  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
        !            60:        // +---------------+---------------+-+-+-+-+-+-+---+-+-+-+-+-+-+-+-+
        !            61:        // |LogicalAddrBase|LogicalAddrMask|E| S |     | U | |CM |   |W|   |
        !            62:        // +---------------+---------------+-+-+-+-+-+-+---+-+-+-+-+-+-+-+-+
        !            63: 
        !            64:  public:
        !            65:        static const uint32 MASK                = 0xffffe364;
        !            66:        static const uint32 LBASE_MASK  = 0xff000000;
        !            67:        static const uint32 LMASK_MASK  = 0x00ff0000;
        !            68:        static const uint32 E                   = 0x00008000;
        !            69:        static const uint32 S_IGN               = 0x00004000;
        !            70:        static const uint32 S_FC2               = 0x00002000;
        !            71:        static const uint32 U_MASK              = 0x00000300;
        !            72:        static const uint32 U1                  = 0x00000200;
        !            73:        static const uint32 U0                  = 0x00000100;
        !            74:        static const uint32 CM                  = 0x00000060;
        !            75:        static const uint32 W                   = 0x00000004;
        !            76: 
        !            77:        m68040TT(const char *, uint32 *);
        !            78:        ~m68040TT();
        !            79: 
        !            80:        bool Match(busaddr addr) const;
        !            81:        const char *GetName() const     { return name; }
        !            82: 
        !            83:        uint32 base {};
        !            84:        uint32 mask {};
        !            85:        bool e {};
        !            86:        bool s_ign {};
        !            87:        bool s_fc2 {};
        !            88:        uint32 u {};
        !            89:        uint8 cm {};
        !            90:        bool w {};
        !            91: 
        !            92:        uint32 *reg {};                 // レジスタイメージ置き場 (&reg.*tt)
        !            93:  private:
        !            94:        const char *name {};    // 表示用のレジスタ名
        !            95: };
        !            96: 
        !            97: class m68040TC
        !            98: {
        !            99:        //            1                   0
        !           100:        //  5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
        !           101:        // +-+-+---------------------------+
        !           102:        // |E|P|         reserved          |
        !           103:        // +-+-+---------------------------+
        !           104: 
        !           105:  public:
        !           106:        static const uint16 MASK                = 0xc000;
        !           107:        static const uint16 E                   = 0x8000;       // 有効
        !           108:        static const uint16 P                   = 0x4000;       // ページサイズ(%1=8K)
        !           109: 
        !           110:        bool e {};
        !           111:        bool ps4k {};                           // ページサイズが 4K なら true (ビット定義と逆)
        !           112:        uint32 table_mask {};           // ページテーブルアドレスのマスク
        !           113:        uint32 tic_shift {};            // 論理アドレス TIC 部の右シフト量
        !           114:        uint32 tic_mask {};                     // 論理アドレス TIC 部のマスク
        !           115:        uint32 page_mask {};            // ページディスクリプタの物理アドレスマスク
        !           116: };
        !           117: 
        !           118: class m68040MMUSR
        !           119: {
        !           120:        //    3                   2                   1                   0
        !           121:        //  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
        !           122:        // +---------------------------------------+-+-+---+-+-+-+-+-+-+-+-+
        !           123:        // |           Physical Address            |B|G| U |S|CM |M| |W|T|R|
        !           124:        // +---------------------------------------+-+-+---+-+-+-+-+-+-+-+-+
        !           125: 
        !           126:  public:
        !           127:        static const uint32 ADDR_MASK   = 0xfffff000;   // 物理アドレス
        !           128:        static const uint32 B                   = 0x00000800;   // バスエラー
        !           129:        static const uint32 G           = 0x00000400;   // グローバル
        !           130:        static const uint32 U_MASK              = 0x00000300;   // ユーザ領域
        !           131:        static const uint32 U1                  = 0x00000200;
        !           132:        static const uint32 U0                  = 0x00000100;
        !           133:        static const uint32 S                   = 0x00000080;   // スーパーバイザ保護
        !           134:        static const uint32 CM                  = 0x00000060;   // キャッシュモード
        !           135:        static const uint32 M                   = 0x00000010;   // 修正済み
        !           136:        static const uint32 W                   = 0x00000004;   // 書き込み保護
        !           137:        static const uint32 T                   = 0x00000002;   // 透過変換がヒット
        !           138:        static const uint32 R                   = 0x00000001;   // 常駐
        !           139: };
        !           140: 
        !           141: // ATC エントリ
        !           142: class m68040ATCEntry
        !           143: {
        !           144:  public:
        !           145:        // タグは無効なら最下位ビットを立てる。これでマッチしなくなる。
        !           146:        //
        !           147:        //    3                   2                   1                    0
        !           148:        //  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1  0
        !           149:        // +-----+-+---------------------------------------+-------------+--+
        !           150:        // |  0  |S|       Logical Address (4K/8K)       : |      0      |~V|
        !           151:        // +-----+-+---------------------------------------+-------------+--+
        !           152:        static const uint32 SUPER               = 0x10000000;
        !           153:        static const uint32 INVALID             = 0x00000001;
        !           154:        uint32 tag {};
        !           155: 
        !           156:        bool IsValid() const                    { return (tag & INVALID) == 0; }
        !           157:        bool IsSuper() const                    { return (tag & SUPER) != 0; }
        !           158:        void Invalidate()                               { tag |= INVALID; }
        !           159: 
        !           160:        // desc はページディスクリプタをそのまま持っておく。
        !           161:        // ページディスクリプタなので PDT(下位2bit) は %01 か %11 なら Resident。
        !           162:        //
        !           163:        //    3                   2                   1                   0
        !           164:        //  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
        !           165:        // +-----------------------------------------+-+---+-+---+-+-+-+-+-+
        !           166:        // |                 (not used)              |G|U10|S|CM |M|U|W|-|R|
        !           167:        // +-----------------------------------------+-+---+-+---+-+-+-+-+-+
        !           168:        uint32 paddr {};
        !           169:        uint32 desc {};
        !           170: 
        !           171:        bool IsGlobal() const                   { return (desc & m68040MMU::DESC_G); }
        !           172:        bool IsSuperProtected() const   { return (desc & m68040MMU::DESC_S); }
        !           173:        bool IsWriteProtected() const   { return (desc & m68040MMU::DESC_W); }
        !           174:        bool IsResident() const                 { return (desc & 0x0001); }
        !           175: 
        !           176:        bool MatchStatus(busaddr laddr) const;
        !           177: };
        !           178: 
        !           179: // ATC セット
        !           180: class m68040ATCSet
        !           181: {
        !           182:  public:
        !           183:        std::array<m68040ATCEntry, 4> entry {};
        !           184:        uint LRU {};
        !           185: 
        !           186:        int GetEntry() const;
        !           187: };
        !           188: 
        !           189: // ATC
        !           190: class m68040ATC
        !           191: {
        !           192:  public:
        !           193:        std::array<m68040ATCSet, 16> sets {};
        !           194: 
        !           195:        // アドレス (busaddr >> 4) からタグを作る際のマスク。
        !           196:        // PS が 4K か 8K かで長さが違うため。
        !           197:        uint32 tag_mask {};
        !           198: 
        !           199:        void Flush(bool s, bool global);
        !           200:        void Flush(busaddr addr, bool global);
        !           201: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.