デグレファクトリー
未来の技術で高度なバグを埋め込むソフトウェア製作所
未来の技術で高度なバグを埋め込むソフトウェア製作所
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:\>_
SNES SPC700 Player v2.20.0 に対応。