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

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2022 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: #pragma once
        !             8: 
        !             9: #include "mpu680x0.h"
        !            10: 
        !            11: // ビットフィールド命令
        !            12: class acc_bf
        !            13: {
        !            14:  public:
        !            15:        acc_bf(MPU680x0Device *);
        !            16:        // デストラクタは無し。
        !            17: 
        !            18:        void LoadReg(uint n);           // Dn から値を読み込む
        !            19:        void LoadMem(uint32 addr);      // メモリから値を読み込む
        !            20: 
        !            21:        // レジスタまたはメモリにストアする
        !            22:        void Store(uint n) {
        !            23:                if (n < 8) {
        !            24:                        StoreReg(n);
        !            25:                } else {
        !            26:                        StoreMem();
        !            27:                }
        !            28:        }
        !            29: 
        !            30:        uint32 data {};                         // 32bit 左詰めデータ
        !            31:        int32 offset {};                        // (第2ワードで指定された) オフセット
        !            32:        uint32 width {};                        // 幅
        !            33: 
        !            34:  private:
        !            35:        void StoreReg(uint n);          // 値を Dn に書き出す
        !            36:        void StoreMem();                        // 値をメモリに書き出す
        !            37: 
        !            38:        // 32ビットの val を count ビット左ローテートした値を返す。
        !            39:        // count は 0..31。
        !            40:        // 実際には count==0 の時 (val>>32) となりこれは未定義動作なのだが
        !            41:        // ぶっちゃけこの形式はローテート命令一発に変換されると知っているので
        !            42:        // とりあえず放置しておく。C++20 になったら std::rotl() を検討。
        !            43:        NO_SANITIZE("undefined")
        !            44:        uint32 ROL32(uint32 val, uint count) {
        !            45:                return (val << count) | (val >> (32 - count));
        !            46:        }
        !            47: 
        !            48:        // 32ビットの val を count ビット右ローテートした値を返す。
        !            49:        // count は 0..31。
        !            50:        // 実際には count==0 の時 (val>>32) となりこれは未定義動作なのだが
        !            51:        // ぶっちゃけこの形式はローテート命令一発に変換されると知っているので
        !            52:        // とりあえず放置しておく。C++20 になったら std::rotr() を検討。
        !            53:        NO_SANITIZE("undefined")
        !            54:        uint32 ROR32(uint32 val, uint count) {
        !            55:                return (val >> count) | (val << (32 - count));
        !            56:        }
        !            57: 
        !            58:        MPU680x0Device *cpu {};
        !            59: 
        !            60:        uint32 mask {};                 // 32ビット左詰めマスク
        !            61:        uint32 ea {};                   // オフセット計算後の EA
        !            62:        int32 local_offset {};  // 内部(32bit or 8bit 内)オフセット
        !            63:        int bytes {};                   // アクセスバイト数
        !            64:        uint64 buf {};                  // 40ビットのメモリバッファ
        !            65: };

unix.superglobalmegacorp.com

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