裏目小僧の部屋に
(戻る)
アナログデバイセズ ADSP-2185を使った時のメモ

ADSP-2185  RAM 16KWord data  16KWord-Program

<ALU>  命令 ---------------------------------------
 R=X+ Y         AZ AN AV AC
 R=X+     + C   
 R=X+定数 
 R=X+定数 + C 
 R=X+ Y   + C
  
 R=X  -Y        AZ AN AV AV
 R=X  -Y  +C-1 
 R=X      +C-1
 R=X-定数
 R=X-定数 +C-1

 R=Y-X
 R=Y-X+C-1
 R= -X+C-1
 R= -X+定数
 R= -X+定数+C-1

 R= X (AND/OR/XOR) (Y/定数)         AC=0 AV=0 AN AZ
 R= TSTBIT n OF X   ;AND 2^n と同じ AC=0 AV=0 AN AZ 
 R= SETBIT n OF X
 R= CLRBIT n OF X
 R= TGLBIT n OF X
 R=- (X/Y)                             AC:ゼロで1 AV:$8000で1 AN AZ
 R=NOT (X/Y)                            AC=0 AV=0 AN AZ 
 R=PASS X                               AC=0 AV=0 AN AZ
 R=PASS Y                               AC=0 AV=0 AN AZ
 R=PASS (0,1,2,3,4,5,7,8,9,15,16,17,,,) AC=0 AV=0 AN AZ
 R=ABS X     -->AS:入力が負 AC=0 AV=AN:Xが$8000 AC=0 AZ
 R:AF AR       X:AX0 AX1 AR MR0 MR1 MR2 SR0 SR1    Y:AY0 AY1 AF
         定数は 0,1,2,4,8,16,32,..,2^n -2,-3,-5,-9,-17,..,-2^n-1 ,-32768

 除算用
  DIVS (AY1,AF),X 符号付除算の1回目
  DIVQ          X 2回目以降

MAC: ---------------------------------------
ENA M_MODE;  {MSTAT-b4 MAC 小数モード    } 
DIS M_MODE;  {MSTAT-b4 MAC 1.15モード    }
MR2:8bit MR1:16bit MR0:16bit  

[MR/MF]=   X*Y( [SS/SU/US/UU/RND] )
[MR/MF]=   X*X( [SS/UU/RND] )
[MR/MF]=MR+X*X( [SS/UU/RND] )
[MR/MF]=MR+X*X( [SS/UU/RND] )
[MR/MF]=MR-X*X( [SS/UU/RND] )
[MR/MF]=MR-X*X( [SS/UU/RND] )
    MR =0  ;MR0=MR1=MR2=0 MV=0
    MF =0  ;              MV=0
[MR/MF]=MR            MVフラグの設定
[MR/MF]=MR(RND) 丸め付き
IF MV SAT MR ; MRの下位32ビットで飽和処理
   X:MX0 MX1 MR2 MR1 MR0 AR SR1 SR0 
   Y:MY0 MY1 MF
-- <SHIFT> シフタ ---------------------------------------
SR=       ASHIFT [SI/SR1/SR0/AR/MR2/MR1/MR0] ( [HI/LO] )  SEによりシフト
SR= SR OR ASHIFT [SI/SR1/SR0/AR/MR2/MR1/MR0] ( [HI/LO] )  SEによりシフト
SR=       LSHIFT [SI/SR1/SR0/AR/MR2/MR1/MR0] ( [HI/LO] )  SEによりシフト
SR= SR OR LSHIFT [SI/SR1/SR0/AR/MR2/MR1/MR0] ( [HI/LO] )  SEによりシフト

SR=       NORM [SI/SR1/SR0/AR/MR2/MR1/MR0] ( [HI/LO] )  SEによりシフト
SR= SR OR NORM [SI/SR1/SR0/AR/MR2/MR1/MR0] ( [HI/LO] )  SEによりシフト

SR=   EXP [SI/SR1/SR0/AR/MR2/MR1/MR0] ( [HI/LO/HIX] )  SEに結果
SR=   EXPADJ [SI/SR1/SR0/AR/MR2/MR1/MR0] 
SR=      LSHIFT MR1 BY n(HI)
SR=SR OR LSHIFT MR1 BY n(LO)

-- 転送 DAG(データ.アドレス.ジェネレータ)  --------------
        reg=reg;
        reg=定数;
        DM(lab)=reg;
    reg=DM(lab);
        DM(Im,Mn)=定数;

<ALU><MAC><SHIFT>と並列実行可能 
        DM(Im,Mn)=dreg;
   dreg=DM(Im,Mn);
   dreg=PM(Im,Mn);{m,nは4,5,6,7のみ}
   PM(Im,Mn)=dreg;{m,nは4,5,6,7のみ}

並列実行
 <ALU>/<MAC>, AX0/AX1/MX0/MX1=DM(I0123,M0123), AY0/AY1/MY0/MY1=PM(I4567,M4567);
              AX0/AX1/MX0/MX1=DM(I0123,M0123), AY0/AY1/MY0/MY1=PM(I4567,M4567);
 DM(Im,Mn)=dreg,<ALU>/<MAC>/<SHIFT>  ; m,n=0,1,2,3,4,5,6,7
 <ALU>/<MAC>/<SHIFT>, dreg= DM(Im,Mn);
 <ALU>/<MAC>/<SHIFT>, dreg=dreg      ;

 dreg:AR AX0 AX1 AY0 AY1  MX0 MX1 MY0 MY1  MR0 MR1 MR2 SR0 SR1 SI SE

 MODIFY(Im,Mn)   Imを更新する 

-- 実行制御  ---------------------------------------
 NOP
 ENA INTS ;{割込み許可}
 DIS INTS ;{割込み禁止}
 JUMP lab;
 JUMP (In);         nは4,5,6,7のみ

 cntr=xxx;        xxxは14bitのループ回数の設定 4レベルスタック
 DO lab UNTIL CE  labを含む行を cntr指定回数だけ実行
 if NOT CE jump lab   1でなければ cntrを1減算して分岐
 if F0    jump/call lab
 if FL012 jump/call lab
 DO lab UNTIL flag  labを含む行を実行する直前の条件でループ
         RTS ;{サブルーチンから復帰}
         RTI ;{割込みからの復帰}
 if flag RTS/RTI ;{条件付復帰}
-- 条件  ---------------------------------------
EQ  AZ=1
NE  AZ=0
LT   AN/AV 0未満
GE   AN/AV 0以上
GT   AN/AV/AZ 
LE   AN/AV/AZ 以下
AC     符号無減算後 左が大きいか等しい
NOT AC 符号無減算後 負数になった
AV
NOT AV
NEG  AS=1 ABS命令でXが負だった
POS  AS=0
MV   MACのオーバ
NOT MV
CE  カウント終了 (jumpの場合は分岐しなければ減算)
-- スタック  ----------------------------
 PUSH STS;{ASTAT/MSTAT/IMASK}
 POP  STS;
PCスタック 16レベル 14bit 
 reg=TOPSTACK ;{PCスタックから pop 直後にNOPが必要}
 TOPSTACK=reg ;{PCスタックに push }

-- フラグ  ---------------------------------------
    SEC_REG  {MSTAT-b0 バンク切替
    BIT_REV  {MSTAT-b1 アドレスビット反転モード
    AV_LATCH {MSTAT-b2 1=ALUオーバフローを継続}
    AR_SAT   {MSTAT-b3 1=ALUレジスタ飽和 }
ENA M_MODE;  {MSTAT-b4 MAC 小数モード    } 
DIS M_MODE;  {MSTAT-b4 MAC 1.15モード    }
    TIMER    {MSTAT-b5 タイマ許可}
    G_MODE   {MSTAT-b6 GO モード}

------- M系列乱数 ---------------------------
{ M系列乱数  p=55 t=55-7=48   16x4word  }
             I5=^irand  ;  {irandには4wordの乱数が用意されている }
             L5= 4      ; 
             M4=-1;
 {ここから}
                                MR1=DM(I5,M5); {M5= 1}
                                MR0=DM(I5,M4); {M4=-1}
                SR=      LSHIFT MR1 BY 9(HI);
                SR=SR OR LSHIFT MR0 BY 9(LO);
                        AY1=MR0;
             AR=SR1 XOR AY1;                   {ARが16bit乱数}
   DM(I5,M5)=AR;
 {ここまでを繰り返す}


{ M系列乱数  p=127 t=127-63=64  特別に長周期が必要な場合 }
             I5=^irand  ;  {irand には8wordの乱数が用意されている }
             L5= 8      ; 
             M4=3;
             M5=1;
 {1回の乱数発生部分開始}
                              MR1=DM(I5,M5); {M5=1                  }
                              MR0=DM(I5,M4); {M4=3                  }
              SR=      LSHIFT MR1 BY 1(HI);  {                      }
              SR=SR OR LSHIFT MR0 BY 1(LO);  {                      }
                      AY1        =DM(I5,M5); {M5=1                  }
                              modify(I5,M4); {M4=3 Mが空いていれば..}
           AR=SR1 XOR AY1;  { ARが乱数の結果                        }
 DM(I5,M5)=AR;              
 {ここまでを繰り返す}

{32x16bitの掛算}
 正数の時   (a*$1000+b)xc= a*c*$1000+bxc;
 負数の時  $80000000 を加算すれば必ず正数となる
  ((a*$10000+b)+$80000000)*c-$8000000*c
  ((a*c*$10000+b*c)+$80000000)*c-$8000000*c