アナログデバイセズ 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