## 第10章　CodeScapeのスクリプトコマンド

#### 処理の自動化のためにスクリプトを書く

CodeScapeのスクリプトコマンドで、定型処理の自動化のためにMicrosoftのJScriptとVBScriptマクロのスクリプトを走らせることができます。

CodeScape用のスクリプトコマンドのサンプルとして、このドキュメント中にJScriptとVBScriptファイルを収録しました。2つのスクリプト言語のどちらでも、利用可能な関数に自分のコマンドを加えて使用してください。

JScriptとVBScriptの詳細は、「Microsoft Developer Network」のスクリプトエリアを参照してください（http://msdn.microsoft.com/scripting）。

#### CodeScapeのスクリプトコマンド

Write関数は同等の機能のWriteMessageと入れ替えらています。CodeScapeのWrite関数を保護するために、Writeが使用可能なスクリプトエンジンもあります。Writeの代わりにWriteMessageを使用してください。

内容 | 文法
特定のプログラムをロード。このコマンドはファイルのパスとファイル名をパラメータとして受け取り、ファイルをロードしたら1、それ以外は0を返す。 | LoadProgramFile(path and filename)
ターゲットプロセッサをハードリセット | HardReset()
ターゲットプロセッサをソフトリセット | SoftReset()
ターゲットプロセッサを実行 | Run()
[Script]ウィンドウにメッセージ文字列を書く | WriteMessage(string Message)
特定のレジスタに値をセット | WriteRegister(Register value,Numeric value)
特定のレジスタから値を取得 | ReadRegister(Register value)
特定の場所からバイナリファイルをロード | LoadBinaryFile(Path and filename, Numeric binary location)
特定のアドレスにブレークポイントをセット | SetBreakpoint(Numeric address)
すべてのブレークポイントを削除 | ClearAllBreakpoints()
特定のアドレスのブレークポイントを削除 | RemoveBreakpoint(Numeric address)
特定のメモリ範囲から1バイト読み込む | ReadByte(Numeric address)
特定のメモリ範囲から2バイト読み込む | ReadWord(Numeric address)
特定のメモリ範囲から4バイト読み込む | ReadLong(Numeric address)
特定のメモリ範囲に1バイト書き込む | WriteByte(Numeric address,Numeric value)
特定のメモリ範囲に2バイト書き込む | WriteWord(Numeric address,Numeric value)
特定のメモリ範囲に4バイト書き込む | WriteLong(Numeric address,Numeric value)
特定のパラメータを返す | GetParam(short param)
スクリプトを通過したパラメータの数を返す | GetParamCount()
実行中は1、そうでない場合は0を返す | IsRunning()
トレース履歴に記録するイベントを特定する

Events | Setting
例外処理を記録(割り込み、rte) | 8
サブルーチンを記録(bsr、bsrf、jsr、rts) | 4
分岐を記録(bf、bt、bf/s、bt/s、bra、braf、jmp) | 2

ConfigureTraceHistory(numeric Setting, boolean Enable)
現在の履歴を[Script]ウィンドウに次のように表示

Source | Destination
0x0c010356 | 0x0c0103aa rts
0x0c0101e6 | 0x0c010350 rts
0x0c0100e6 | 0x0c010128 bra $0c010128
0x0c01034c | 0x0c010028 bsr BigTest
0x0c0103a6 | 0x0c010334 bsr struct_test
0x0c010280 | 0x0c0103a0 rts
0x0c01039c | 0x0c010214 bsr BitFieldTest

DisplayTraceHistory()
スクリプト出力ウィンドウ内の削除 | ClearDisplay()
アドレスで与えられた型のブレークポイントを作成。成功すればブレークポイントの識別子を返し、そうでなければ0を返す。ブレークポイント識別子はブレークポイントの次の操作で使用

Breakpoint | Type
Code | 0
Watch | 1
Simulator Start | 2
Profiler start | 3
Profiler stop | 4

CreateBreakpoint(Type, Address)
ブレークポイントの有効と無効 enable: 1:有効　0:無効 identifier: ブレークポイントの識別子 | EnableBreakpoint(identifier, boolean enable)
特定のブレークポイントの動作の有効と無効 enable: 1:有効　0:無効 identifier: ブレークポイントの識別子

Action | Value
ヒットした時に停止する | 0
ヒットした後にブレークポイントを取り除く | 1
ヒットした時にメッセージボックスを表示する | 2
ヒットした時にビープ音を鳴らす | 3

SetBreakpointActions(identifier, numeric action, boolean enable)
ブレークポイント識別子によって特定されたブレークポイント用の記録をセット breakpoint identifier: ブレークポイント識別子 expression: 記録形式 logType: false:記録しない
true:条件が一致したときに記録する
SetBreakpointLog(breakpoint identifier, string expression, boolean logType)
ブレークポイントにスクリプトを付ける identifier: ブレークポイント識別子 script path: スクリプトのファイルパス script type: 0:JScript　1:VBScript script arguments: スクリプトの引数
prompt:

1:ブレークポイントがトリガした時に引数を受け取る
0:それ以外

SetBreakpointScript(identifer, string script path, numeric script type, string script arguments, boolean prompt)
ブレークポイントの条件付き表現のセット identifier: ブレークポイント識別子 expression: 状況を設定した文字列 expression type: 0:C言語　0以外:アセンブラ trigger count: ブレークポイントのアクションが作動するヒット数
incOnTrue:

false:トリガのカウント数を増やす
true:条件が一致したときにトリガのカウント数を増やす

breakWhen:

false:トリガが0になった時、または条件が一致したときにブレークする
true:トリガが0になり、条件が一致した時にブレークする

SetBreakpointCondition(identifier, string expression, numeric expression type, numeric trigger count, boolean incOnTrue, boolean breakWhen)
ブレークポイントウォッチのパラメータをセット identifier: ブレークポイント識別子 incDataCondition: データの状態を入れる dataCondition: データの状態を特定する表現 expressionType: 特定された表現の型
accessSize: アクセスするための大きさ(1バイト、2バイト、4バイトなど)
accessType: アクセス形式(読み込み、書き込み、読み書き)

Size | Value | Type | Value
すべての型 | 0 | 読み込み | 1
1バイト | 1 | 書き込み | 2
2バイト | 2 | 読み書き | 3
4バイト | 4
8バイト | 8

BOOL SetWatchBreakpointParameters(Identifier, Boolean incDataCondition, string dataCondition, numeric expressionType, numeric accessSize, numeric accessType )
ブレークポイントのマスク位置の選択

Mask | Value
マスクしない | 1
10ビット以下 | 2
12ビット以下 | 3
16ビット以下 | 4
20ビット以下 | 5
すべてのビット | 6

SetBreakpointLocationMask(breakID, maskSelect)
ブレークポイントウォッチのデータマスクのセット | SetBreakpointDataMask(identifier, mask)

数値とアドレスは次のように使用します。

- 数値(124または3.1415926)
- 文字列("124")
- 16進数文字列("0xabcdef")
- シンボル("main"または"main + 0xabc")

レジスタは文字列のみパスします("pc"、"fr0"、"r0")

現在、スクリプトはシングルターゲットプロセッサのみサポートします。したがって、スクリプトを実行すると、自動的にターゲットプロセッサを選びます。

スクリプト中に無限ループを含むと、CodeScapeが停止します。

#### VBScriptの例

>     ' This script does not do anything useful other than demonstrate the
>     ' functions available
>     ClearDisplay
>     HardReset
>     SoftReset
>     DisplayParameters
>     LoadSomeBinary
>     LoadProgramFile( "d:\\projects\\maketest\\hello.elf" )
>     SetBreakpoint( "add_fn" )
>     ConfigureTraceHistory TH_LOGEXCEPT + TH_LOGSUB, true
>     Dim Running
>     Running = 1
>     Do
>     	Running = IsRunning
>     Loop Until Running = 0
>     DisplayTraceHistory
>     ReadSomeRegisters
>     WriteSomeRegisters
>     ReadSomeMemory
>     WriteSomeMemory
>     ReadSomeMemory
>     ClearAllBreakpoints
>     CreateCodeBP
>     ClearAllBreakpoints
>     CreateWatchBP
>     WriteMessage( "Script complete. Removing all breakpoints." )
>     ClearAllBreakpoints
>     '
>     '	Breakpoint types
>     '
>     BPTYPE_CODE = 0
>     BPTYPE_WATCH = 1
>     BPTYPE_SIMSTART = 2
>     BPTYPE_PROFSTART = 3
>     BPTYPE_PROFSTOP = 4
>     '
>     '	Breakpoint Actions
>     '
>     BPACTION_HALT = 0
>     BPACTION_ONESHOT = 1
>     BPACTION_PROMPT = 2
>     BPACTION_BEEP = 3
>     '
>     '	Breakpoint Script Types
>     '
>     BPSCRIPT_JSCRIPT = 0
>     BPSCRIPT_VBSCRIPT = 1
>     '
>     '	Breakpoint expression types
>     '
>     BPEXPR_C = 0
>     BPEXPR_ASSEMBLY = 1
>     '
>     '	Breakpoint address masks
>     '
>     BPLOCMASK_NONE = 1
>     BPLOCMASK_LOW10 = 2
>     BPLOCMASK_LOW12 = 3
>     BPLOCMASK_LOW16 = 4
>     BPLOCMASK_LOW20 = 5
>     BPLOCMASK_ALL = 6
>     '
>     '	Breakpoint access sizes
>     '
>     BPACCESSSIZE_ANY = 0
>     BPACCESSSIZE_BYTE = 1
>     BPACCESSSIZE_WORD = 2
>     BPACCESSSIZE_LONG = 4
>     BPACCESSSIZE_QUAD = 8
>     '
>     '	Breakpoint access types
>     '
>     BPACCESSTYPE_READ = 1
>     BPACCESSTYPE_WRITE = 2
>     BPACCESSTYPE_RW = 3
>     '
>     '	Trace history configuration options
>     '
>     TH_LOGEXCEPT = 8
>     TH_LOGSUB = 4
>     TH_LOGBRANCH = 2
>     '
>     '	Create a breakpoint on the 1K aligned block of memory that
>     '	the symbol main resides in.
>     '
>     Sub CreateCodeBP()

>     	Dim breakID

>     	breakID = CreateBreakpoint( BPTYPE_CODE, "main" )

>     	SetBreakpointAction breakID, BPACTION_HALT, true

>     	SetBreakpointAction breakID, BPACTION_ONESHOT, false

>     	SetBreakpointAction breakID, BPACTION_PROMPT, false
>     	SetBreakpointAction breakID, BPACTION_BEEP, true
>     	SetBreakpointScript breakID,
>     	 "e:\\projects\\codescape\\debugs\\testscript.js",
>     	 BPSCRIPT_JSCRIPT, "arg1 arg2 arg3", false
>     	SetBreakpointLog breakID, "Hello John", BPEXPR_C
>     	SetBreakpointLocationMask breakID, BPLOCMASK_LOW10
>     	setBreakpointCondition breakID, "index == 375", BPEXPR_C,
>     	 37, true, true
>     End Sub

>     Sub CreateWatchBP()
>     	breakID = CreateBreakpoint( BPTYPE_WATCH, "main" )
>     	SetWatchBreakpointParameters breakID, true, "14", BPEXPR_C,
>     	 BPACCESSSIZE_BYTE, BPACCESSTYPE_WRITE
>     End Sub

>     Sub WriteSomeRegisters()
>     	WriteRegister "fr0", 3.14159
>     	WriteRegister "r0", "0xabcdef"
>     	WriteRegister "pc", "main + 0x30"
>     End Sub

>     Sub ReadSomeRegisters()
>     	WriteMessage( "Value of pc = " & ReadRegister( "pc" ) )
>     	WriteMessage( "Value of r0 = " & ReadRegister( "r0" ) )
>     End Sub

>     Sub LoadSomeBinary()
>     	LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", "201392128"
>     	LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", 201392128
>     	LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", "0xc010000"
>     	LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", "main"
>     End Sub

>     Sub DisplayParameters()
>     	NumParams = GetParamCount
>     	WriteMessage( "Number of parameters = " & NumParams )
>     	For i = 1 To NumParams
>     		WriteMessage( "Parameter " & i & " = " & GetParam( i - 1 ) )
>     	Next
>     End Sub

>     Sub ReadSomeMemory()
>     	WriteMessage( "Byte at main = " & ReadByte( "main" ) )
>     	WriteMessage( "Word at main + 4 = " & ReadWord( "main + 4" ) )
>     	WriteMessage( "Long at main + 8 = " & ReadLong( "main + 8" ) )
>     End Sub

>     Sub WriteSomeMemory()
>     	WriteByte "main", 255
>     	WriteWord "main + 4", "0xabcd"
>     	WriteLong "main + 8", "0xfedcba"
>     End Sub

#### JScriptの例

>     ////	Note: this script does not do anything useful. It just demonstrates
>     ////	the current script commands and how they can be called.
>     ////
>     ////	Breakpoint types
>     ////
>     BPTYPE_CODE = 0;
>     BPTYPE_WATCH = 1;
>     BPTYPE_SIMSTART = 2;
>     BPTYPE_PROFSTART = 3;
>     BPTYPE_PROFSTOP = 4;
>     ////
>     ////	Breakpoint Actions
>     ////
>     BPACTION_HALT = 0;
>     BPACTION_ONESHOT = 1;
>     BPACTION_PROMPT = 2;
>     BPACTION_BEEP = 3;
>     ////
>     ////	Breakpoint Script Types
>     ////
>     BPSCRIPT_JSCRIPT = 0;
>     BPSCRIPT_VBSCRIPT = 1;
>     ////
>     ////	Breakpoint expression types
>     ////
>     BPEXPR_C = 0;
>     BPEXPR_ASSEMBLY = 1;
>     ////
>     ////	Breakpoint address masks
>     ////
>     BPLOCMASK_NONE = 1;
>     BPLOCMASK_LOW10 = 2;
>     BPLOCMASK_LOW12 = 3;
>     BPLOCMASK_LOW16 = 4;
>     BPLOCMASK_LOW20 = 5;
>     BPLOCMASK_ALL = 6;
>     ////
>     ////	Breakpoint access sizes
>     ////
>     BPACCESSSIZE_ANY = 0;
>     BPACCESSSIZE_BYTE = 1;
>     BPACCESSSIZE_WORD = 2;
>     BPACCESSSIZE_LONG = 4;
>     BPACCESSSIZE_QUAD = 8;
>     ////
>     ////	Breakpoint access types
>     ////
>     BPACCESSTYPE_READ = 1;
>     BPACCESSTYPE_WRITE = 2;
>     BPACCESSTYPE_RW = 3;
>     ////
>     ////	Trace history configuration options
>     ////
>     TH_LOGEXCEPT = 8;
>     TH_LOGSUB = 4;
>     TH_LOGBRANCH = 2;

>     ////
>     ////	Create breakpoint on the 1k aligned block of memory that the symbol
>     ////	main resides in
>     ////
>     function CreateCodeBP()
>     {
>     	breakID = CreateBreakpoint( BPTYPE_CODE, "main" );
>     	SetBreakpointAction( breakID, BPACTION_HALT, true );
>     	SetBreakpointAction( breakID, BPACTION_ONESHOT, false );
>     	SetBreakpointAction( breakID, BPACTION_PROMPT, false );
>     	SetBreakpointAction( breakID, BPACTION_BEEP, true );
>     	SetBreakpointScript( breakID,
>     	 "e:\\projects\\codescape\\debugs\\testscript.js",
>     	 BPSCRIPT_JSCRIPT, "arg1 arg2 arg3", false );
>     	SetBreakpointLog( breakID, "Hello John", BPEXPR_C );
>     	SetBreakpointLocationMask( breakID, BPLOCMASK_LOW10 );
>     	setBreakpointCondition( breakID, "index == 375", BPEXPR_C,
>     	 37, true, true );
>     }

>     function CreateWatchBP()
>     {
>     	breakID = CreateBreakpoint( BPTYPE_WATCH, "main" );
>     	SetWatchBreakpointParameters( breakID, true, "14", BPEXPR_C,
>     	 BPACCESSSIZE_BYTE, BPACCESSTYPE_WRITE );
>     }

>     function WriteSomeRegisters()
>     {
>     	WriteRegister( "fr0", 3.14159 );
>     	WriteRegister( "r0", "0xabcdef" );
>     	WriteRegister( "pc", "main + 0x30" );
>     }

>     function ReadSomeRegisters()
>     {
>     	WriteMessage( "Value of pc = " + ReadRegister( "pc" ) )
>     	WriteMessage( "Value of r0 = " + ReadRegister( "r0" ) )
>     }

>     function LoadSomeBinary()
>     {
>     	LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", "201392128" );
>     	LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", 201392128 );
>     	LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", "0xc010000" );
>     	LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", "main" );
>     }

>     function DisplayParameters()
>     {
>     	NumParams = GetParamCount()
>     	WriteMessage( "Number of parameters = " + NumParams );
>     	for( i = 0; i < NumParams; i++ )
>     	{
>     		WriteMessage( "Parameter " + i + " = " + GetParam( i - 1 ) )
>     	}
>     }

>     function ReadSomeMemory()
>     {
>     	WriteMessage( "Byte at main = " + ReadByte( "main" ) );
>     	WriteMessage( "Word at main + 4 = " + ReadWord( "main + 4" ) );
>     	WriteMessage( "Long at main + 8 = " + ReadLong( "main + 8" ) );
>     }

>     function WriteSomeMemory()
>     {
>     	WriteByte( "main", 255 );
>     	WriteWord( "main + 4", "0xabcd" );
>     	WriteLong( "main + 8", "0xfedcba" );
>     }

>     ClearDisplay();
>     HardReset();
>     SoftReset();
>     DisplayParameters();
>     LoadSomeBinary();
>     LoadProgramFile( "d:\\projects\\maketest\\hello.elf" );
>     SetBreakpoint( "add_fn" );
>     ConfigureTraceHistory( TH_LOGEXCEPT + TH_LOGSUB, true );
>     Run();
>     while( IsRunning() != 0 )
>     {
>     	;
>     }
>     DisplayTraceHistory();
>     ReadSomeRegisters();
>     WriteSomeRegisters();
>     ReadSomeMemory();
>     WriteSomeMemory();
>     ReadSomeMemory();
>     ClearAllBreakpoints();
>     CreateCodeBP();
>     ClearAllBreakpoints();
>     CreateWatchBP();
>     WriteMessage( "Script complete. Removing all breakpoints." );
>     ClearAllBreakpoints();

#### スクリプトの使用

スクリプトを実行すると、[Input/Output]ウィンドウが自動的に表示され、現在のスクリプトによって生成されたメッセージとともに[Script]タブが表示されます。

スクリプトを実行せずに[Input/Output]ウィンドウを開くには、次のように操作してください。

- [View]メニューの[Toolbar]を選択し、[Input/Output]チェックボックスをオンにして、[OK]ボタンをクリックしてください。

[Input/Output]ウィンドウは、CodeScapeの上、下、またはフロート状態にすることができます。

#### スクリプトタブのショートカットメニュー

メニュー | 内容
Run Script | スクリプトの選択と実行
Clear | スクリプトタブの内容の削除
User Scripts | メニューにスクリプトを追加している時は、このオプションはグレーで表示されます。スクリプトを追加すると、メニューにスクリプトの名称が表示されます。
Allow Docking | ウィンドウのドッキングのオン/オフ
Hide | ウィンドウを隠す

#### メニューにスクリプトを追加する

スクリプトを追加すると、メニューバーとスクリプトタブのショートカットメニューにその名称が表示されます。メニューバーとショートカットメニューには、最大10のスクリプトファイルを追加することができます。

1. [Tools]メニューの[Customize]を選択し、[Scripts...]をクリックすると[Customize]ダイアログボックスが表示されます。
2. [Add]ボタンをクリックします。
3. [Menu Text]ボックスにスクリプトの名称を入力します(エントリを削除するには、[Menu Contents]ボックスのスクリプト名をクリックして、[Remove]ボタンをクリックします)。
4. [Script]ボックスにスクリプト名をフルパスで入力します。
5. [JScript]か[VBScript]のどちらかを選択します。
6. 次のどちらかを行います。

- [Arguments]テキストボックスにスクリプト実行時の引数を入力し、[OK]ボタンをクリック
- [Prompt for arguments]チェックボックスをオン

[Menu Contents]ボックスでコマンドを選択し、[Tools]メニューにセットされるように[Move Up]ボタンや[Move Down]ボタンをクリックしてください。

スクリプトにキーボードショートカットを割り当てるには、[Tools]メニューをクリックし、[Customize]を選んで[Keyboard...]をクリックしてください。

#### スクリプトの実行

- [Tools]メニューをクリックして[Scripts]を選び、一覧の中からスクリプトをクリックします。
- [Input/Output]ウィンドウでスクリプトタブを右クリックし、一覧の中からスクリプトをクリックします。

現在、スクリプトはシングルターゲットプロセッサのみサポートします。したがって、スクリプトを実行すると、自動的にターゲットプロセッサを選びます。

スクリプト中に無限ループを含むと、CodeScapeが停止します。

[←] | [INDEX]