MSTAT

MSTAT ( Mode Status ) は名前とは裏腹にADSP-2191の動作モードを設定するレジスタです。通常はこのレジスタへの書き込みは行わず、ENA命令とDIS命令を使います。

高級言語からこのレジスタにアクセスすることはまずありません。

レジスタの構造

レジスタは7ビット長です。転送命令で16ビットレジスタに格納するときには右詰になります。リセット後の初期値は0です。

MSTATを変更するとADSP-2191の動作モードを変更できます。しかしながら、このレジスタは割り込み時に自動的にスタックに退避されます。したがって、RTI命令を実行すると割り込みハンドラの中で設定したモードはすべて解消されて割り込み前の状態に戻ります。

MSTATの構造

図1 レジスタの構造

以下に各ビットの概略を説明します。詳細については必ずHRを参照してください。

SEC_REG : Secondary Register
  • 1のとき、演算レジスタ群が裏レジスタです
  • 0のとき、表レジスタです
BIT_REV : Bit Reversal
  • 1のとき、DAG1レジスタの出力はビット逆順です
  • 0のとき、出力は正順です
AV_LATCH : ALU overflow staus latch mode.
  • 1のとき、ASTATのAVビットがラッチモードで動きます。ラッチモードの場合、一旦1になると明示的にクリアするまでは0に戻りません
  • 0のとき、非ラッチモードです
AR_SAT : AR register saturation mode
  • 1のとき、ARレジスタを飽和モードで動かします。
  • 0のとき、ラップアラウンドモードで動かします
M_MODE : Multiplier Mode
  • 1のとき、乗算器が整数モードで動きます。
  • 0のとき、固定小数点数モードです。
SEC_DAG : Secondary DAG
  • 1のとき、DAGレジスタ群は裏レジスタです
  • 0のとき、表レジスタです

API

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
2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |