|
|
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.