デグレファクトリー

未来の技術で高度なバグを埋め込むソフトウェア製作所

SPCCMD.EXE は起動中の SNES SPC700 Player からメモリの内容を読み取ったり、書き換えたりするための公式外部拡張ツールです。

SNES SPC700 Player はある程度のレジスタやメモリ状態を表示できますが、メモリマップ全体を表示したり、リアルタイムで書き換えることはできません。

このツールは SNES SPC700 Player で SPC ファイルや SNESAPU のデバッグで必要となる追加機能を提供します。

2023/10/15 更新 - v1.6.0

SPCCMD.EXE はコマンドラインツールですので、コマンドプロンプトより実行する必要があります。

SPCCMD.EXE を使用する前に、まずコマンドプロンプトを起動してください。

C:\>_

次に SNES SPC700 Player を起動し、任意の SPC ファイルを開いた状態にしてください (演奏中でも停止中でもかまいません)。

SPCCMD.EXE を置く場所はどこでもかまいません (SPCPLAY.EXE と異なる場所でも動作します)。

コマンドプロンプトで spccmd -? と入力して Enter キーを押すと、SPCCMD.EXE の構文ヘルプが表示されます。

C:\>spccmd -?
SNES SPC700 Player 外部拡張コマンドツール
v1.6.0 (build 5601)
サポートしている SPCPLAY.EXE のバージョン: v2.20.0 以降

<< 構文 >>
  spccmd.exe [オプション]

[オプション]
 == 基本オプション.
  -? -h         : 構文ヘルプを表示
  -v            : バージョン情報を表示
  -o        : ファイルを開く    = 読込ファイル
  -p            : 演奏開始・一時停止
  -r            : 最初から演奏
  -s            : 演奏停止
       :
       :

C:\>_

コマンドプロンプトで spccmd -v と入力して Enter キーを押すと、SPCCMD.EXE のバージョン情報が表示されます。

C:\>spccmd -v
SNES SPC700 Player 外部拡張コマンドツール
v1.6.0 (build 5184)
サポートしている SPCPLAY.EXE のバージョン: v2.19.4 以降

C:\>_

※ v1.6.0 以降で使用可能

コマンドプロンプトで spccmd -o [読み込みファイル] と入力して Enter キーを押すと、SNES SPC700 Player でファイルを開きます。

開いたファイルが SPC の場合、自動的に演奏を開始します。

C:\>spccmd -o sample.spc

C:\>_

【演奏開始の場合】

コマンドプロンプトで spccmd -p と入力して Enter キーを押すと、開いている SPC ファイルの演奏が開始されます。

C:\>spccmd -p

C:\>_

【一時停止の場合】

コマンドプロンプトで spccmd -p と入力して Enter キーを押すと、演奏が一時停止されます。

C:\>spccmd -p

C:\>_

【最初から演奏する場合】

コマンドプロンプトで spccmd -r と入力して Enter キーを押すと、演奏が最初から再開されます。

C:\>spccmd -r

C:\>_

【演奏停止の場合】

コマンドプロンプトで spccmd -s と入力して Enter キーを押すと、演奏が停止されます。

C:\>spccmd -s

C:\>_

【読み取りの場合】

コマンドプロンプトで spccmd -gd [アドレス] と入力して Enter キーを押すと、DSP レジスタの値が表示されます。

[アドレス] には読み取りたいメモリの場所を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には読み取った値が表示されます。

C:\>spccmd -gd $41
戻り値 = $000000FE (254)

C:\>_

【書き換えの場合】

コマンドプロンプトで spccmd -sd [アドレス] [設定値] と入力して Enter キーを押すと、DSP レジスタの値を書き換えます。

[アドレス] には読み取りたいメモリの場所、[設定値] には書き込む値を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には書き込む前に設定されていた値が表示されます。

C:\>spccmd -sd $41 $37
戻り値 = $000000FE (254)

C:\>_

【メモリマップ表示の場合】

コマンドプロンプトで spccmd -md と入力して Enter キーを押すと、DSP レジスタの値の一覧が表示されます。

C:\>spccmd -md
DSP レジスタメモリマップ

Addr  :  +0 +1 +2 +3 +4 +5 +6 +7  +8 +9 +A +B +C +D +E +F
0000  :  00 00 3A 00 00 00 21 00  00 00 6E 00 00 00 3C 00
0010  :  00 00 0E 00 00 00 08 00  00 00 7E 00 00 00 3C 00
0020  :  00 00 6A 00 00 00 1D 00  00 00 3F 00 00 00 17 00
0030  :  00 00 0C 00 00 00 0A 00  00 00 72 00 00 00 17 00
0040  :  00 00 12 00 00 00 07 00  00 00 7D 00 00 00 20 00
0050  :  00 00 12 00 00 00 07 00  00 00 7D 00 00 00 00 00
0060  :  00 00 01 00 00 00 0A 00  00 00 7F 00 00 00 00 00
0070  :  00 00 0A 00 00 00 0A 00  00 00 68 00 00 00 C8 00

C:\>_

【読み取りの場合】

コマンドプロンプトで spccmd -gp [アドレス] と入力して Enter キーを押すと、I/O ポートの値が表示されます。

[アドレス] には読み取りたいメモリの場所を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には読み取った値が表示されます。

C:\>spccmd -gp 2
戻り値 = $00000000 (0)

C:\>_

【書き換えの場合】

コマンドプロンプトで spccmd -sp [アドレス] [設定値] と入力して Enter キーを押すと、I/O ポートの値を書き換えます。

[アドレス] には読み取りたいメモリの場所、[設定値] には書き込む値を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には書き込む前に設定されていた値が表示されます。

C:\>spccmd -sp 2 $10
戻り値 = $00000000 (0)

C:\>_

【書き換え後すぐに元に戻す場合】

コマンドプロンプトで spccmd -tp [アドレス] [設定値] と入力して Enter キーを押すと、I/O ポートの値を書き換え、すぐに元の値に戻します。

効果音の再生等のために、ドライバにメッセージを送る際に便利です。

[アドレス] には読み取りたいメモリの場所、[設定値] には書き込む値を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には常に 0 が表示されます。

C:\>spccmd -tp 2 $10
戻り値 = $00000000 (0)

C:\>_

【読み取りの場合】

コマンドプロンプトで spccmd -gr [アドレス] と入力して Enter キーを押すと、64KB APU RAM の値が表示されます。

[アドレス] には読み取りたいメモリの場所を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には読み取った値が表示されます。

C:\>spccmd -gr $1732
戻り値 = $E8021003 (3892449283)

C:\>_

【書き換えの場合】

コマンドプロンプトで spccmd -sr [アドレス] [設定値] と入力して Enter キーを押すと、64KB APU RAM の値を書き換えます。

[アドレス] には読み取りたいメモリの場所、[設定値] には書き込む値を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には書き込む前に設定されていた値が表示されます。

C:\>spccmd -sr $1732 55410474
戻り値 = $E8021003 (3892449283)

C:\>_

【メモリマップ表示の場合】

コマンドプロンプトで spccmd -mr [開始アドレス] [表示サイズ] と入力して Enter キーを押すと、64KB APU RAM の値の一覧が表示されます。

[開始アドレス] は下 1 桁が切り捨てられます。 例えば $206 を指定すると $200 から始まります。

[表示サイズ] は 16 で切り上げされます。 例えば 33 を指定すると 48 バイト分表示されます。

C:\>spccmd -mr $200 256
64KB APU RAM メモリマップ

Addr  :  +0 +1 +2 +3 +4 +5 +6 +7  +8 +9 +A +B +C +D +E +F
0200  :  B8 02 00 5C 15 FF 00 00  00 00 00 00 00 00 00 00
0210  :  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
0220  :  00 00 00 00 01 00 BE 72  00 60 A0 80 00 00 00 00
0230  :  00 00 00 00 00 00 00 00  00 00 00 00 03 03 03 33
0240  :  0B 0B 33 33 00 00 00 00  00 00 00 00 1D 01 0E 90
0250  :  43 C6 46 EF 00 00 00 00  82 57 53 98 14 1E 15 17
0260  :  1B 1F 19 15 00 00 00 00  30 2C 28 28 A4 00 B4 F6
0270  :  B0 B0 F6 F6 00 00 00 00  00 00 00 00 04 15 02 0F
0280  :  16 10 0B 09 00 00 00 00  04 03 1A 0E 97 5C 56 D8
0290  :  1A 8F E0 6D 00 00 00 00  7D 68 E9 41 7D 00 00 00
02A0  :  00 F9 3C F8 00 00 00 00  23 0A 04 00 03 01 02 01
02B0  :  04 03 03 01 00 00 00 00  00 02 01 01 01 01 07 02
02C0  :  01 04 02 02 00 00 00 00  00 01 01 01 00 00 00 00
02D0  :  00 00 00 00 00 00 00 00  00 00 00 00 01 09 11 18
02E0  :  21 29 30 38 00 00 00 00  60 68 70 78 64 00 00 FF
02F0  :  FF 01 4C 02 81 FE 00 05  FF FF 64 C8 FF 00 1C FF

C:\>_

【読み取りの場合】

コマンドプロンプトで spccmd -gw [アドレス] と入力して Enter キーを押すと、Script700 ワークエリアの値が表示されます。

[アドレス] には読み取りたいメモリの場所を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には読み取った値が表示されます。

C:\>spccmd -gw 7
戻り値 = $00007D41 (32065)

C:\>_

【書き換えの場合】

コマンドプロンプトで spccmd -sw [アドレス] [設定値] と入力して Enter キーを押すと、Script700 ワークエリアの値を書き換えます。

[アドレス] には読み取りたいメモリの場所、[設定値] には書き込む値を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には書き込む前に設定されていた値が表示されます。

C:\>spccmd -sw 7 $20
戻り値 = $00007D41 (32065)

C:\>_

【読み取りの場合】

コマンドプロンプトで spccmd -gc [アドレス] と入力して Enter キーを押すと、Script700 CmpParam の値が表示されます。

[アドレス] には読み取りたいメモリの場所を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には読み取った値が表示されます。

C:\>spccmd -gc 1
戻り値 = $3CF90000 (1022951424)

C:\>_

【書き換えの場合】

コマンドプロンプトで spccmd -sc [アドレス] [設定値] と入力して Enter キーを押すと、Script700 CmpParam の値を書き換えます。

[アドレス] には読み取りたいメモリの場所、[設定値] には書き込む値を指定します。 $ を最初に付けると 16 進数指定になります。

戻り値には書き込む前に設定されていた値が表示されます。

C:\>spccmd -sc 1 $3CFA0000
戻り値 = $3CF90000 (1022951424)

C:\>_

【読み取りの場合】

コマンドプロンプトで spccmd -gs [アドレス] と入力して Enter キーを押すと、Script700 レジスタの値が表示されます。

[アドレス] には以下の値を指定します。

0

PC レジスタ (16 ビット)

1

Y, A レジスタ (16 ビット, 上位 = Y, 下位 = A)

2

SP, X レジスタ (16 ビット, 上位 = SP, 下位 = X)

3

PSW レジスタ (8 ビット)

戻り値には読み取った値が表示されます。

C:\>spccmd -gs 0
戻り値 = $0002F74 (12148)

C:\>_

【書き換えの場合】

コマンドプロンプトで spccmd -ss [アドレス] [設定値] と入力して Enter キーを押すと、Script700 レジスタの値を書き換えます。

[アドレス] には以下の値、[設定値] には書き込む値を指定します。 $ を最初に付けると 16 進数指定になります。

0

PC レジスタ (16 ビット)

1

Y, A レジスタ (16 ビット, 上位 = Y, 下位 = A)

2

SP, X レジスタ (16 ビット, 上位 = SP, 下位 = X)

3

PSW レジスタ (8 ビット)

戻り値には書き込む前に設定されていた値が表示されます。

C:\>spccmd -ss 1 $00003100
戻り値 = $0002F74 (12148)

C:\>_

【SPC700・DSP の動作を切り替える場合】

コマンドプロンプトで spccmd -sh [フラグ値] と入力して Enter キーを押すと、SPC700, DSP の動作を指定できます。

[フラグ値] には以下の値を指定します。

1

SPC_RETURN (Timer 処理だけを行います)

2

SPC_HALT (SPC700 の動作を停止します)

4

DSP_HALT (DSP の動作を停止します)

6

SPC_HALT+DSP_HALT

8

SPC_NODSP (SPC700 から DSP への命令を停止します)

32

DSP_PAUSE (DSP のエンベロープ処理を停止します)

34

SPC_HALT+DSP_PAUSE

C:\>spccmd -sh 6

C:\>_

【ブレイクポイントを設定・解除する場合】

コマンドプロンプトで spccmd -bp [アドレス値] [フラグ値] と入力して Enter キーを押すと、SPC700 ブレイクポイント (任意のオペコードに到達時、実行前に SPC700 や DSP の処理を停止する機能) の動作を指定できます。

[アドレス] にはブレイクポイントを設定したいメモリの場所を指定します。 $ を最初に付けると 16 進数指定になります。

[フラグ値] には以下の値を指定します。

0

ブレイクポイントを解除します

1

SPC_HALT

(命令実行前に SPC700 の動作を停止します。 タイマーも停止しますが、DSP は停止しません)

2

NOP

(命令を実行せず NOP を実行します。 タイマー、DSP は停止しません)

3

SPC_HALT+DSP_PAUSE

(命令実行前に SPC700 の動作を停止して、DSP も一時停止状態にします)

C:\>spccmd -bp $2C8 1

C:\>_

【ブレイクポイントで停止中に次の命令を実行する場合】

コマンドプロンプトで spccmd -bpn [フラグ値] と入力して Enter キーを押すと、ブレイクポイントで停止中の命令を実行し、次の動作を指定できます。

[フラグ値] には以下の値を指定します。

0

次のブレイクポイントまで処理を進めます

1

SPC_HALT

(現在の命令を実行し、次の命令で停止します。 タイマーも停止しますが、DSP は停止しません)

2

NOP

(現在の命令を実行し、次の命令で停止します。 タイマー、DSP は停止しません)

3

SPC_HALT+DSP_PAUSE

(現在の命令を実行し、次の命令で停止します。 タイマー、DSP も一時停止します)

C:\>spccmd -bpn 1

C:\>_

【ブレイクポイントをすべて解除する場合】

コマンドプロンプトで spccmd -bpc と入力して Enter キーを押すと、ブレイクポイントをすべて解除できます。

C:\>spccmd -bpc

C:\>_

【DSP チートを設定・解除する場合】

コマンドプロンプトで spccmd -dc [アドレス] [値] と入力して Enter キーを押すと、DSP チート (DSP レジスタ値の強制書き換え) の動作を指定できます。

[アドレス] には DSP レジスタの場所を指定します。 $ を最初に付けると 16 進数指定になります。

[値] に $FFFFFFFF を指定すると、DSP チートを解除できます。

C:\>spccmd -dc $10 $7F

C:\>_

【DSP チートをすべて解除する場合】

コマンドプロンプトで spccmd -dcc と入力して Enter キーを押すと、DSP チートをすべて解除できます。

C:\>spccmd -dcc

C:\>_

【エコーメモリ領域のゼロクリアを行う場合】

コマンドプロンプトで spccmd -zc [読み込みファイル] [書き込みファイル] と入力して Enter キーを押すと、エコーメモリ領域部分をゼロクリアします。

実機での演奏を行う際、冒頭のノイズを押さえたい場合に便利です。

C:\>spccmd -zc sample.spc zeroclear.spc
正常終了しました。

C:\>_

コマンドプロンプトで spccmd -pd [読み込みファイル] と入力して Enter キーを押すと、SNES SPC700 Player を使用して実機への転送コードを使い転送動作をエミュレーションします。

実機での演奏を行う際、正しく転送できるかどうか確認する場合に便利です。 コマンド実行中は、SNES SPC700 Player を操作しないでください。

C:\>spccmd -pd sample.spc
エコー領域をクリア中...
Boot Code の空き領域を探索中...
Boot Code のアドレス = FF26~FF72 (STEP 1)

┏ ──────────────────────────────── ┓
┫(!) SPC 転送を開始します。                                        ┃
┫    転送中は SNES SPC700 Player を操作しないでください。          ┃
┗ ──────────────────────────────── ┛

SPC700 のリセットを待機中...
転送プログラムを送信中...
DSP レジスタを送信中...
RAM を送信中.............................................
XRAM を送信中...
演奏開始準備中...
正常終了しました。

C:\>_

【取得の場合】 ※ v1.6.0 以降で使用可能

コマンドプロンプトで spccmd -gm と入力して Enter キーを押すと、現在ミュートされているチャンネルが表示されます。

戻り値には読み取った値が表示されます。

C:\>spccmd -gm
戻り値 = 1-3-----

C:\>_

【設定の場合】 ※ v1.6.0 以降で使用可能

コマンドプロンプトで spccmd -sm [チャンネル番号] と入力して Enter キーを押すと、チャンネルのミュート状態を設定します。

[チャンネル番号] にはミュートにしたいチャンネル番号 (1~8) を並べて指定します。 例えば 146 を指定すると、チャンネル 1, 4, 6 がミュートになり、それ以外はミュートが解除されます。 0 を指定すると、ミュートを全解除します。

戻り値には書き込む前に設定されていた値が表示されます。

C:\>spccmd -sm 147
戻り値 = 1-3-----

C:\>_

【WAVE ファイルに保存する場合】

コマンドプロンプトで spccmd -cw [読み込みファイル] [書き込みファイル] と入力して Enter キーを押すと、SNES SPC700 Player を使用して WAVE ファイルを保存します。

一度にたくさんのファイルを保存したい場合に便利です。 コマンド実行中は、SNES SPC700 Player を操作しないでください。

C:\>spccmd -cw sample.spc sample.wav
変換中...  sample.spc -> sample.wav
正常終了しました。

C:\>_