|
|
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: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.