Annotation of nono/m680x0/m68030bitfield.h, revision 1.1.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.