S1130080B000000020C07A70B000000020E07AE0E8
S113009006463800BC720014D806000020C60004CE
S11300A006463800BC92FFF420C0000020E00000A7
S11300B0B0000000B9F46AB020A000002021FFFCC9
S11300C0D9E1000094100002B60F000820210004BA
S11300D02021FFFCD9E1000094110002B60F0008B2
S11300E020210004206F0000B60F000880000000EB
S11300F020610000B60F0008800000009410010089
S9030000FC
|
CMB-Bug>l7f00 ここで Enter を押し、
この状態にしてから、ターミナルソフトで、Sレコードファイルを送信します。全部送信すると以下のように表示します。
start loading address = 00007F80 ---> 最初に受信したSレコードデータをどこに書いたかを示します。
END. bytes loaded = 00000080 ---> 受信してメモリに書いた総バイト数を表示します。
CMB-Bug>
|
これで、0x80バイトのデータが、0x80+0x7F00 番地以降にロードされたはずなので、表示してみます。
CMB-Bug>d7f80
ADDR 0 1 2 3 4 5 6 7 8 9 A B C D E F ascii
00007F80 B000 0000 20C0 7A70 B000 0000 20E0 7AE0 *.... .zp.... .z.*
00007F90 0646 3800 BC72 0014 D806 0000 20C6 0004 *.F8..r...... ...*
00007FA0 0646 3800 BC92 FFF4 20C0 0000 20E0 0000 *.F8..... ... ...*
00007FB0 B000 0000 B9F4 6AB0 20A0 0000 2021 FFFC *......j. ... !..*
00007FC0 D9E1 0000 9410 0002 B60F 0008 2021 0004 *............ !..*
00007FD0 2021 FFFC D9E1 0000 9411 0002 B60F 0008 * !..............*
00007FE0 2021 0004 206F 0000 B60F 0008 8000 0000 * !.. o..........*
00007FF0 2061 0000 B60F 0008 8000 0000 9410 0100 * a..............*
CMB-Bug>
|
コマンドは、"g7f80" と、"g" に続いて実行したいアドレスを指示します。内部の処理としては、0x7F80 番地をサブルーチンとして呼び出してしています。命令は、brlid r15,0x7f80 などとなり、実行するプログラムがサブルーチン形式なら、return することも可能です。
CMB-Bug>g7f80 ここで Enter を押すと、0x7f80 番地からサブルーチンとして実行しまが、その前にプログラムを書きます。
|
実行したプログラムが return で戻れるように、以下のように、"sl7f80" コマンドで、マシン語で次のようにメモリに書いて、実行してみます。
CMB-Bug>sl7f80
00007F80=B0000000 20610000 addi r3, r1, 0 の命令、レジスタ r3 に r1( stack pointer ) をロードします
00007F84=20C07A70 b60f0008 rtsd r15, 8 return 命令。r15 には呼び出した命令のアドレスがコピーされています。
00007F88=B0000000 80000000 or r0, r0, r0 NOP 命令、これは、CMBの遅延スロットで、実行されます。
00410006=20E07AE0 ここで、コントロールCを押して、メモリの変更を中止します。
CMB-Bug>g7f80 0x7F80 番地を実行します。
ret= 00007E98 r3 を表示します。 r3 には、スタックポインタ、r1 がコピーされているので、現在のスタックポインタになります。
CMB-Bug>
|
割り込みで、LEDの点滅 "ixxxx","i0"
|
割り込みを発生させるインターバルタイマを設定して、有効にし、MSRレジスタの”IE”フラグを1にして、CMBを割り込み可能状態にします。モニタのソース、cmbiofint.c には、以下のような割り込みインタバルタイマの設定と、MSRレジスタの操作をする部分があります。例としてプリセットを、0x2FAE( 12207−1 )とすると、100MHzでカウントするので、約121μ秒に1回割り込みを発生させることができます。
// プリセットタイマーカウントの値を、1Mとして、この値になると、カウントを0とし、割り込みを発生する。
case 'i': // interrupt
comp++;
param[0].l32 = 0x100000;
if((i=argck(&comp,param,1))== -1)
{
paramer();
break;
}
if(param[0].l32 > 0x100)// タイマー割り込み許可
{
*((volatile long *)(INTCOUNT + 0)) = 0x00000;// タイマーカウントクリア
*((volatile long *)(INTCOUNT + 4)) = param[0].l32;// プリセットタイマーカウント
*((volatile long *)(INTCOUNT + 8)) = 0x00000;// 割り込みは、0−−>1の変化で有効
ENINTFLAG = 1;
_inten();// msrset r0,2 を実行するアセンブラプログラムをCALL startup.s
}
else// タイマー割り込み禁止
{
*((volatile long *)(INTCOUNT + 0)) = 0x00000;// タイマーカウントクリア
*((volatile long *)(INTCOUNT + 8)) = 0x00000;
ENINTFLAG = 0;
_intds();// msrclr r0,2 を実行するアセンブラプログラムをCALL startup.s
}
break;
|
割り込みを受け付けると、モニタのソースで、inttest を実行させ、割り込みでカウンタ( leddata )を+1して、leddata と、0x1000をアンドして0以外ならLEDを点灯、0なら消灯します。モニタのソース、cmbiofint.c には、以下のような割り込み処理関数を記述しています。inttest をCALLする部分は、アセンブラのソース、startup.s にあります。
int leddata;
// 割り込み処理
#define LEDPORT *((volatile char *)0xF000000F)
void inttest (void ) __attribute__ ((interrupt_handler));
void inttest()
{
*((volatile long *)(INTCOUNT + 8)) = 0x00000;
leddata++;
if(leddata & 0x1000)
LEDPORT = 1;
else
LEDPORT = 0;
}
|
実際に割り込みインターバルカウンタにプリセット値0x2FAEを設定し、割り込みを発生させ、LEDを点滅させ、ledtata の値の変化を見ると、以下のようになります。
CMB-Bug>i2fae ( enter ) でLEDが点滅開始します。
CMB-Bug>sl7a30( enter ) で、leddata の内容を表示します。leddata のアドレスは、cmbiofint.map 参照
00007A30=000088AA nのみキー入力。enter を押すと ledtata の内容が0になります
00007A34=00000000 rのみキー入力。以下、"n","r" を入力する間隔は約1秒
00007A30=0000C83F nのみキー入力
00007A34=00000000 rのみキー入力
00007A30=0000EB12 nのみキー入力
00007A34=00000000 rのみキー入力
00007A30=00010D5B nのみキー入力
00007A34=00000000 rのみキー入力
00007A30=00012F3F CTRL−Cのみキー入力
CMB-Bug>
|
LEDは、約0.5秒点灯、0.5秒消灯を繰り返しますが、プリセット値0x2FAEで、約122μ秒に1回の割り込みなので、leddata の値と、0x1000をアンドすると、4096カウントで0か否かになって、122x4096で、0.5秒でLEDの状態が変化します。
倍精度浮動小数点で、sin の値の計算 "F1,0,xx,yy","F0,0,xx,yy"
|
三角関数の sin 演算精度を、次のようにして、倍精度浮動小数点64ビット表現をそのままヘキサで表示させます。
CMB-Bug>F1,0,65,64 ( enter ) 角度0度から、1度単位に、100度までIEEE754表示
|
ここで、F1 は、IEEE754 の指定、0,65,64 は、0度から、101度手前まで、0.01度単位*100の意味。
結果。IEEE 754 形式の、符号部 1 + 指数部 11 + 仮数部 53( 52+1 )
CMB-Bug>F0,0,65,64 ( enter ) 角度0度から、1度単位に、100度まで表示。小数点以下は9桁まで。
|
戻る