MSTAT ( Mode Status ) は名前とは裏腹にADSP-2191の動作モードを設定するレジスタです。通常はこのレジスタへの書き込みは行わず、ENA命令とDIS命令を使います。
高級言語からこのレジスタにアクセスすることはまずありません。
レジスタは7ビット長です。転送命令で16ビットレジスタに格納するときには右詰になります。リセット後の初期値は0です。
MSTATを変更するとADSP-2191の動作モードを変更できます。しかしながら、このレジスタは割り込み時に自動的にスタックに退避されます。したがって、RTI命令を実行すると割り込みハンドラの中で設定したモードはすべて解消されて割り込み前の状態に戻ります。
図1 レジスタの構造
以下に各ビットの概略を説明します。詳細については必ずHRを参照してください。
C/C++言語用に以下のインターフェースが用意されています。宣言はsysreg.hで行われています。
// #include <sysreg.h> sysreg_write(sysreg_MSTAT, 値) // 値をMSTATに代入します 変数 = sysreg_read(sysreg_MSTAT) // MSTATの値を取得します sysreg_bit_clr(sysreg_MSTAT, MASK) // MASKの"1"と対応するMSTATのビットを1にします。 sysreg_bit_set(sysreg_MSTAT, MASK) // MASKの"1"と対応するMSTATのビットを0にします。 sysreg_bit_tgl(sysreg_MSTAT, MASK) // MASKの"1"と対応するMSTATのビットを反転します。 mode_change( __MODE_ENA_AV_LATCH ) // AV_LATCH => 1 mode_change( __MODE_ENA_AR_SAT ) // AR_SAT => 1 mode_change( __MODE_ENA_M_MODE ) // M_MODE => 1 mode_change( __MODE_DIS_AV_LATCH ) // AV_LATCH => 0 mode_change( __MODE_DIS_AR_SAT ) // AR_SAT => 0 mode_change( __MODE_DIS_M_MODE ) // M_MODE => 0
ビットマスクはdef219x.hで定義されています。以下にその部分を引用します。
// #include <def219x.h> // Bit Positions #define MSTAT_SEC_REG_P 0 // Bit 0: Secondary data registers enable #define MSTAT_BIT_REV_P 1 // Bit 1: Bit-reversed address output enable #define MSTAT_AV_LATCH_P 2 // Bit 2: ALU overflow latch mode select #define MSTAT_AR_SAT_P 3 // Bit 3: ALU saturation mode select #define MSTAT_M_MODE_P 4 // Bit 4: MAC result mode select #define MSTAT_TIMER_P 5 // Bit 5: Timer enable #define MSTAT_SEC_DAG_P 6 // Bit 6: Secondary DAG registers enable // Bit Masks #define MSTAT_SEC_REG MK_BMSK_(MSTAT_SEC_REG_P ) // Secondary data registers enable #define MSTAT_BIT_REV MK_BMSK_(MSTAT_BIT_REV_P ) // Bit-reversed address output enable #define MSTAT_AV_LATCH MK_BMSK_(MSTAT_AV_LATCH_P) // ALU overflow latch mode select #define MSTAT_AR_SAT MK_BMSK_(MSTAT_AR_SAT_P ) // ALU saturation mode select #define MSTAT_M_MODE MK_BMSK_(MSTAT_M_MODE_P ) // MAC result mode select #define MSTAT_TIMER MK_BMSK_(MSTAT_TIMER_P ) // Timer enable #define MSTAT_SEC_DAG MK_BMSK_(MSTAT_SEC_DAG_P ) // Secondary DAG registers enable
MSTATのレイテンシは以下のとおりです。
命令 | MSTAT=value; | POP STS; | ENA, DIS | |
---|---|---|---|---|
レイテンシ | SEC_REG | 2 | 2 | 1 |
BIT_REV | 4 | 4 | 1 | |
AV_LATCH | 1 | 1 | 1 | |
AR_SAT | 2 | 2 | 1 | |
M_MODE | 2 | 2 | 1 | |
SEC_DAG | 4 | 4 | 1 |
レイテンシが1のとき、直後の命令からその値を使うことができます。レイテンシが2以上のとき、直後の命令でその値を参照しようとすると、古い値を参照します。なお、この表のレイテンシの数え方はHRとは異なっています。
このレジスタにはインターロック機構はついていません。
項目 | マニュアルのページ等 |
---|---|
ビット割り当て | HR A-10 |
レイテンシ | HR A-6 |
裏データレジスタ | HR 2-57 |
ビットリバースアドレッシング | HR 4-15 |
AVラッチモード | HR 2-10 |
ALU飽和モード | HR 2-11 |
裏DAGレジスタ | HR 4-4 |
"Enabling Interrupt" | ISR 8-14 |